ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGEwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCWpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKwlqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKwlqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorCWpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKwlqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisJamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorCWpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisJanF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYyBcCisJam1lbS1hbmRyb2lkLmMKKworIyB0aGUgYXNzZW1ibGVyIGlzIG9ubHkgZm9yIHRoZSBBUk0gdmVyc2lvbiwgZG9uJ3QgYnJlYWsgdGhlIExpbnV4IHNpbQoraWZuZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKK0FORFJPSURfSlBFR19OT19BU1NFTUJMRVIgOj0gdHJ1ZQorZW5kaWYKKworIyB0ZW1wIGZpeCB1bnRpbCB3ZSB1bmRlcnN0YW5kIHdoeSB0aGlzIGJyb2tlIGNubi5jb20KKyNBTkRST0lEX0pQRUdfTk9fQVNTRU1CTEVSIDo9IHRydWUKKworaWZlcSAoJChzdHJpcCAkKEFORFJPSURfSlBFR19OT19BU1NFTUJMRVIpKSx0cnVlKQorTE9DQUxfU1JDX0ZJTEVTICs9IGppZGN0aW50LmMgamlkY3Rmc3QuYworZWxzZQorTE9DQUxfU1JDX0ZJTEVTICs9IGppZGN0aW50LmMgamlkY3Rmc3QuUworZW5kaWYKKworTE9DQUxfQ0ZMQUdTICs9IC1EQVZPSURfVEFCTEVTIAorTE9DQUxfQ0ZMQUdTICs9IC1PMyAtZnN0cmljdC1hbGlhc2luZyAtZnByZWZldGNoLWxvb3AtYXJyYXlzCisjTE9DQUxfQ0ZMQUdTICs9IC1tYXJjaD1hcm12NmoKKworTE9DQUxfTU9EVUxFOj0gbGlianBlZworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9NT0RVTEVfTElDRU5TRV9CU0RfTElLRSBiL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzYyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RJQ0UKQEAgLTAsMCArMSwzOCBAQAorVGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsCit3aXRoIHJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kIHlvdSwKK2l0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KKworVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitBbGwgUmlnaHRzIFJlc2VydmVkIGV4Y2VwdCBhcyBzcGVjaWZpZWQgYmVsb3cuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZXNlCitjb25kaXRpb25zOgorKDEpIElmIGFueSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGlzCitSRUFETUUgZmlsZSBtdXN0IGJlIGluY2x1ZGVkLCB3aXRoIHRoaXMgY29weXJpZ2h0IGFuZCBuby13YXJyYW50eSBub3RpY2UKK3VuYWx0ZXJlZDsgYW5kIGFueSBhZGRpdGlvbnMsIGRlbGV0aW9ucywgb3IgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZXMKK211c3QgYmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4gYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24uCisoMikgSWYgb25seSBleGVjdXRhYmxlIGNvZGUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhlIGFjY29tcGFueWluZworZG9jdW1lbnRhdGlvbiBtdXN0IHN0YXRlIHRoYXQgInRoaXMgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgd29yayBvZgordGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAiLgorKDMpIFBlcm1pc3Npb24gZm9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgb25seSBpZiB0aGUgdXNlciBhY2NlcHRzCitmdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzOyB0aGUgYXV0aG9ycyBhY2NlcHQKK05PIExJQUJJTElUWSBmb3IgZGFtYWdlcyBvZiBhbnkga2luZC4KKworVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcgY29kZSwKK25vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQgdG8KK2Fja25vd2xlZGdlIHVzLgorCitQZXJtaXNzaW9uIGlzIE5PVCBncmFudGVkIGZvciB0aGUgdXNlIG9mIGFueSBJSkcgYXV0aG9yJ3MgbmFtZSBvciBjb21wYW55IG5hbWUKK2luIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGlzIHNvZnR3YXJlIG9yIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQoraXQuICBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWZlcnJlZCB0byBvbmx5IGFzICJ0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzCitzb2Z0d2FyZSIuCisKK1dlIHNwZWNpZmljYWxseSBwZXJtaXQgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgYXMgdGhlIGJhc2lzIG9mCitjb21tZXJjaWFsIHByb2R1Y3RzLCBwcm92aWRlZCB0aGF0IGFsbCB3YXJyYW50eSBvciBsaWFiaWxpdHkgY2xhaW1zIGFyZQorYXNzdW1lZCBieSB0aGUgcHJvZHVjdCB2ZW5kb3IuCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjYzIwNgotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRQpAQCAtMCwwICsxLDM4NSBAQAorVGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUkVBRE1FIGZvciByZWxlYXNlIDZiIG9mIDI3LU1hci0xOTk4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkaXN0cmlidXRpb24gY29udGFpbnMgdGhlIHNpeHRoIHB1YmxpYyByZWxlYXNlIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHCitHcm91cCdzIGZyZWUgSlBFRyBzb2Z0d2FyZS4gIFlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKK3RvIHVzZSBpdCBmb3IgYW55IHB1cnBvc2UsIHN1YmplY3QgdG8gdGhlIGNvbmRpdGlvbnMgdW5kZXIgTEVHQUwgSVNTVUVTLCBiZWxvdy4KKworU2VyaW91cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIChwYXJ0aWN1bGFybHkgdGhvc2UgaW5jb3Jwb3JhdGluZyBpdCBpbnRvCitsYXJnZXIgcHJvZ3JhbXMpIHNob3VsZCBjb250YWN0IElKRyBhdCBqcGVnLWluZm9AdXVuZXQudXUubmV0IHRvIGJlIGFkZGVkIHRvCitvdXIgZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3QuICBNYWlsaW5nIGxpc3QgbWVtYmVycyBhcmUgbm90aWZpZWQgb2YgdXBkYXRlcworYW5kIGhhdmUgYSBjaGFuY2UgdG8gcGFydGljaXBhdGUgaW4gdGVjaG5pY2FsIGRpc2N1c3Npb25zLCBldGMuCisKK1RoaXMgc29mdHdhcmUgaXMgdGhlIHdvcmsgb2YgVG9tIExhbmUsIFBoaWxpcCBHbGFkc3RvbmUsIEppbSBCb3VjaGVyLAorTGVlIENyb2NrZXIsIEp1bGlhbiBNaW5ndWlsbG9uLCBMdWlzIE9ydGl6LCBHZW9yZ2UgUGhpbGxpcHMsIERhdmlkZSBSb3NzaSwKK0d1aWRvIFZvbGxiZWRpbmcsIEdlJyBXZWlqZXJzLCBhbmQgb3RoZXIgbWVtYmVycyBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRworR3JvdXAuCisKK0lKRyBpcyBub3QgYWZmaWxpYXRlZCB3aXRoIHRoZSBvZmZpY2lhbCBJU08gSlBFRyBzdGFuZGFyZHMgY29tbWl0dGVlLgorCisKK0RPQ1VNRU5UQVRJT04gUk9BRE1BUAorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgorCitPVkVSVklFVyAgICAgICAgICAgIEdlbmVyYWwgZGVzY3JpcHRpb24gb2YgSlBFRyBhbmQgdGhlIElKRyBzb2Z0d2FyZS4KK0xFR0FMIElTU1VFUyAgICAgICAgQ29weXJpZ2h0LCBsYWNrIG9mIHdhcnJhbnR5LCB0ZXJtcyBvZiBkaXN0cmlidXRpb24uCitSRUZFUkVOQ0VTICAgICAgICAgIFdoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgSlBFRy4KK0FSQ0hJVkUgTE9DQVRJT05TICAgV2hlcmUgdG8gZmluZCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlLgorUkVMQVRFRCBTT0ZUV0FSRSAgICBPdGhlciBzdHVmZiB5b3Ugc2hvdWxkIGdldC4KK0ZJTEUgRk9STUFUIFdBUlMgICAgU29mdHdhcmUgKm5vdCogdG8gZ2V0LgorVE8gRE8gICAgICAgICAgICAgICBQbGFucyBmb3IgZnV0dXJlIElKRyByZWxlYXNlcy4KKworT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZToKKworVXNlciBkb2N1bWVudGF0aW9uOgorICBpbnN0YWxsLmRvYyAgICAgICBIb3cgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUuCisgIHVzYWdlLmRvYyAgICAgICAgIFVzYWdlIGluc3RydWN0aW9ucyBmb3IgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwKKyAgICAgICAgICAgICAgICAgICAgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbS4KKyAgKi4xICAgICAgICAgICAgICAgVW5peC1zdHlsZSBtYW4gcGFnZXMgZm9yIHByb2dyYW1zIChzYW1lIGluZm8gYXMgdXNhZ2UuZG9jKS4KKyAgd2l6YXJkLmRvYyAgICAgICAgQWR2YW5jZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciBKUEVHIHdpemFyZHMgb25seS4KKyAgY2hhbmdlLmxvZyAgICAgICAgVmVyc2lvbi10by12ZXJzaW9uIGNoYW5nZSBoaWdobGlnaHRzLgorUHJvZ3JhbW1lciBhbmQgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbjoKKyAgbGlianBlZy5kb2MgICAgICAgSG93IHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW1zLgorICBleGFtcGxlLmMgICAgICAgICBTYW1wbGUgY29kZSBmb3IgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgorICBzdHJ1Y3R1cmUuZG9jICAgICBPdmVydmlldyBvZiB0aGUgSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgc3RydWN0dXJlLgorICBmaWxlbGlzdC5kb2MgICAgICBSb2FkIG1hcCBvZiBJSkcgZmlsZXMuCisgIGNvZGVydWxlcy5kb2MgICAgIENvZGluZyBzdHlsZSBydWxlcyAtLS0gcGxlYXNlIHJlYWQgaWYgeW91IGNvbnRyaWJ1dGUgY29kZS4KKworUGxlYXNlIHJlYWQgYXQgbGVhc3QgdGhlIGZpbGVzIGluc3RhbGwuZG9jIGFuZCB1c2FnZS5kb2MuICBVc2VmdWwgaW5mb3JtYXRpb24KK2NhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBKUEVHIEZBUSAoRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMpIGFydGljbGUuICBTZWUKK0FSQ0hJVkUgTE9DQVRJT05TIGJlbG93IHRvIGZpbmQgb3V0IHdoZXJlIHRvIG9idGFpbiB0aGUgRkFRIGFydGljbGUuCisKK0lmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBKUEVHIGNvZGUgd29ya3MsIHdlIHN1Z2dlc3QgcmVhZGluZyBvbmUgb3IKK21vcmUgb2YgdGhlIFJFRkVSRU5DRVMsIHRoZW4gbG9va2luZyBhdCB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcyAoaW4gcm91Z2hseQordGhlIG9yZGVyIGxpc3RlZCkgYmVmb3JlIGRpdmluZyBpbnRvIHRoZSBjb2RlLgorCisKK09WRVJWSUVXCis9PT09PT09PQorCitUaGlzIHBhY2thZ2UgY29udGFpbnMgQyBzb2Z0d2FyZSB0byBpbXBsZW1lbnQgSlBFRyBpbWFnZSBjb21wcmVzc2lvbiBhbmQKK2RlY29tcHJlc3Npb24uICBKUEVHIChwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24KK21ldGhvZCBmb3IgZnVsbC1jb2xvciBhbmQgZ3JheS1zY2FsZSBpbWFnZXMuICBKUEVHIGlzIGludGVuZGVkIGZvciBjb21wcmVzc2luZworInJlYWwtd29ybGQiIHNjZW5lczsgbGluZSBkcmF3aW5ncywgY2FydG9vbnMgYW5kIG90aGVyIG5vbi1yZWFsaXN0aWMgaW1hZ2VzCithcmUgbm90IGl0cyBzdHJvbmcgc3VpdC4gIEpQRUcgaXMgbG9zc3ksIG1lYW5pbmcgdGhhdCB0aGUgb3V0cHV0IGltYWdlIGlzIG5vdAorZXhhY3RseSBpZGVudGljYWwgdG8gdGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IG11c3Qgbm90IHVzZSBKUEVHIGlmIHlvdQoraGF2ZSB0byBoYXZlIGlkZW50aWNhbCBvdXRwdXQgYml0cy4gIEhvd2V2ZXIsIG9uIHR5cGljYWwgcGhvdG9ncmFwaGljIGltYWdlcywKK3ZlcnkgZ29vZCBjb21wcmVzc2lvbiBsZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZAorcmVtYXJrYWJseSBoaWdoIGNvbXByZXNzaW9uIGxldmVscyBhcmUgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhCitsb3ctcXVhbGl0eSBpbWFnZS4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVmZXJlbmNlcywgb3IganVzdCBleHBlcmltZW50Cit3aXRoIHZhcmlvdXMgY29tcHJlc3Npb24gc2V0dGluZ3MuCisKK1RoaXMgc29mdHdhcmUgaW1wbGVtZW50cyBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZC1zZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUKK2NvbXByZXNzaW9uIHByb2Nlc3Nlcy4gIFByb3Zpc2lvbiBpcyBtYWRlIGZvciBzdXBwb3J0aW5nIGFsbCB2YXJpYW50cyBvZiB0aGVzZQorcHJvY2Vzc2VzLCBhbHRob3VnaCBzb21lIHVuY29tbW9uIHBhcmFtZXRlciBzZXR0aW5ncyBhcmVuJ3QgaW1wbGVtZW50ZWQgeWV0LgorRm9yIGxlZ2FsIHJlYXNvbnMsIHdlIGFyZSBub3QgZGlzdHJpYnV0aW5nIGNvZGUgZm9yIHRoZSBhcml0aG1ldGljLWNvZGluZwordmFyaWFudHMgb2YgSlBFRzsgc2VlIExFR0FMIElTU1VFUy4gIFdlIGhhdmUgbWFkZSBubyBwcm92aXNpb24gZm9yIHN1cHBvcnRpbmcKK3RoZSBoaWVyYXJjaGljYWwgb3IgbG9zc2xlc3MgcHJvY2Vzc2VzIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLgorCitXZSBwcm92aWRlIGEgc2V0IG9mIGxpYnJhcnkgcm91dGluZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgSlBFRyBpbWFnZSBmaWxlcywKK3BsdXMgdHdvIHNhbXBsZSBhcHBsaWNhdGlvbnMgImNqcGVnIiBhbmQgImRqcGVnIiwgd2hpY2ggdXNlIHRoZSBsaWJyYXJ5IHRvCitwZXJmb3JtIGNvbnZlcnNpb24gYmV0d2VlbiBKUEVHIGFuZCBzb21lIG90aGVyIHBvcHVsYXIgaW1hZ2UgZmlsZSBmb3JtYXRzLgorVGhlIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgcmV1c2VkIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KKworSW4gb3JkZXIgdG8gc3VwcG9ydCBmaWxlIGNvbnZlcnNpb24gYW5kIHZpZXdpbmcgc29mdHdhcmUsIHdlIGhhdmUgaW5jbHVkZWQKK2NvbnNpZGVyYWJsZSBmdW5jdGlvbmFsaXR5IGJleW9uZCB0aGUgYmFyZSBKUEVHIGNvZGluZy9kZWNvZGluZyBjYXBhYmlsaXR5OworZm9yIGV4YW1wbGUsIHRoZSBjb2xvciBxdWFudGl6YXRpb24gbW9kdWxlcyBhcmUgbm90IHN0cmljdGx5IHBhcnQgb2YgSlBFRworZGVjb2RpbmcsIGJ1dCB0aGV5IGFyZSBlc3NlbnRpYWwgZm9yIG91dHB1dCB0byBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdHMgb3IKK2NvbG9ybWFwcGVkIGRpc3BsYXlzLiAgVGhlc2UgZXh0cmEgZnVuY3Rpb25zIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlCitsaWJyYXJ5IGlmIG5vdCByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiAgV2UgaGF2ZSBhbHNvIGluY2x1ZGVkCisianBlZ3RyYW4iLCBhIHV0aWxpdHkgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50IEpQRUcKK3Byb2Nlc3NlcywgYW5kICJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIsIHR3byBzaW1wbGUgYXBwbGljYXRpb25zIGZvcgoraW5zZXJ0aW5nIGFuZCBleHRyYWN0aW5nIHRleHR1YWwgY29tbWVudHMgaW4gSkZJRiBmaWxlcy4KKworVGhlIGVtcGhhc2lzIGluIGRlc2lnbmluZyB0aGlzIHNvZnR3YXJlIGhhcyBiZWVuIG9uIGFjaGlldmluZyBwb3J0YWJpbGl0eSBhbmQKK2ZsZXhpYmlsaXR5LCB3aGlsZSBhbHNvIG1ha2luZyBpdCBmYXN0IGVub3VnaCB0byBiZSB1c2VmdWwuICBJbiBwYXJ0aWN1bGFyLAordGhlIHNvZnR3YXJlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWFkIGFzIGEgdHV0b3JpYWwgb24gSlBFRy4gIChTZWUgdGhlCitSRUZFUkVOQ0VTIHNlY3Rpb24gZm9yIGludHJvZHVjdG9yeSBtYXRlcmlhbC4pICBSYXRoZXIsIGl0IGlzIGludGVuZGVkIHRvCitiZSByZWxpYWJsZSwgcG9ydGFibGUsIGluZHVzdHJpYWwtc3RyZW5ndGggY29kZS4gIFdlIGRvIG5vdCBjbGFpbSB0byBoYXZlCithY2hpZXZlZCB0aGF0IGdvYWwgaW4gZXZlcnkgYXNwZWN0IG9mIHRoZSBzb2Z0d2FyZSwgYnV0IHdlIHN0cml2ZSBmb3IgaXQuCisKK1dlIHdlbGNvbWUgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIGEgY29tcG9uZW50IG9mIGNvbW1lcmNpYWwgcHJvZHVjdHMuCitObyByb3lhbHR5IGlzIHJlcXVpcmVkLCBidXQgd2UgZG8gYXNrIGZvciBhbiBhY2tub3dsZWRnZW1lbnQgaW4gcHJvZHVjdAorZG9jdW1lbnRhdGlvbiwgYXMgZGVzY3JpYmVkIHVuZGVyIExFR0FMIElTU1VFUy4KKworCitMRUdBTCBJU1NVRVMKKz09PT09PT09PT09PQorCitJbiBwbGFpbiBFbmdsaXNoOgorCisxLiBXZSBkb24ndCBwcm9taXNlIHRoYXQgdGhpcyBzb2Z0d2FyZSB3b3Jrcy4gIChCdXQgaWYgeW91IGZpbmQgYW55IGJ1Z3MsCisgICBwbGVhc2UgbGV0IHVzIGtub3chKQorMi4gWW91IGNhbiB1c2UgdGhpcyBzb2Z0d2FyZSBmb3Igd2hhdGV2ZXIgeW91IHdhbnQuICBZb3UgZG9uJ3QgaGF2ZSB0byBwYXkgdXMuCiszLiBZb3UgbWF5IG5vdCBwcmV0ZW5kIHRoYXQgeW91IHdyb3RlIHRoaXMgc29mdHdhcmUuICBJZiB5b3UgdXNlIGl0IGluIGEKKyAgIHByb2dyYW0sIHlvdSBtdXN0IGFja25vd2xlZGdlIHNvbWV3aGVyZSBpbiB5b3VyIGRvY3VtZW50YXRpb24gdGhhdAorICAgeW91J3ZlIHVzZWQgdGhlIElKRyBjb2RlLgorCitJbiBsZWdhbGVzZToKKworVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKK3dpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQgeW91LAoraXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgorCitUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgdG8gdGhlc2UKK2NvbmRpdGlvbnM6CisoMSkgSWYgYW55IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoaXMKK1JFQURNRSBmaWxlIG11c3QgYmUgaW5jbHVkZWQsIHdpdGggdGhpcyBjb3B5cmlnaHQgYW5kIG5vLXdhcnJhbnR5IG5vdGljZQordW5hbHRlcmVkOyBhbmQgYW55IGFkZGl0aW9ucywgZGVsZXRpb25zLCBvciBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBmaWxlcworbXVzdCBiZSBjbGVhcmx5IGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbi4KKygyKSBJZiBvbmx5IGV4ZWN1dGFibGUgY29kZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGUgYWNjb21wYW55aW5nCitkb2N1bWVudGF0aW9uIG11c3Qgc3RhdGUgdGhhdCAidGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mCit0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCIuCisoMykgUGVybWlzc2lvbiBmb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBvbmx5IGlmIHRoZSB1c2VyIGFjY2VwdHMKK2Z1bGwgcmVzcG9uc2liaWxpdHkgZm9yIGFueSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXM7IHRoZSBhdXRob3JzIGFjY2VwdAorTk8gTElBQklMSVRZIGZvciBkYW1hZ2VzIG9mIGFueSBraW5kLgorCitUaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRyBjb2RlLAorbm90IGp1c3QgdG8gdGhlIHVubW9kaWZpZWQgbGlicmFyeS4gIElmIHlvdSB1c2Ugb3VyIHdvcmssIHlvdSBvdWdodCB0bworYWNrbm93bGVkZ2UgdXMuCisKK1Blcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkgbmFtZQoraW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCitpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MKK3NvZnR3YXJlIi4KKworV2Ugc3BlY2lmaWNhbGx5IHBlcm1pdCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyB0aGUgYmFzaXMgb2YKK2NvbW1lcmNpYWwgcHJvZHVjdHMsIHByb3ZpZGVkIHRoYXQgYWxsIHdhcnJhbnR5IG9yIGxpYWJpbGl0eSBjbGFpbXMgYXJlCithc3N1bWVkIGJ5IHRoZSBwcm9kdWN0IHZlbmRvci4KKworCithbnNpMmtuci5jIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGJ5IHBlcm1pc3Npb24gb2YgTC4gUGV0ZXIgRGV1dHNjaCwKK3NvbGUgcHJvcHJpZXRvciBvZiBpdHMgY29weXJpZ2h0IGhvbGRlciwgQWxhZGRpbiBFbnRlcnByaXNlcyBvZiBNZW5sbyBQYXJrLCBDQS4KK2Fuc2kya25yLmMgaXMgTk9UIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgY29uZGl0aW9ucywgYnV0IGluc3RlYWQKK2J5IHRoZSB1c3VhbCBkaXN0cmlidXRpb24gdGVybXMgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgcHJpbmNpcGFsbHksCit0aGF0IHlvdSBtdXN0IGluY2x1ZGUgc291cmNlIGNvZGUgaWYgeW91IHJlZGlzdHJpYnV0ZSBpdC4gIChTZWUgdGhlIGZpbGUKK2Fuc2kya25yLmMgZm9yIGZ1bGwgZGV0YWlscy4pICBIb3dldmVyLCBzaW5jZSBhbnNpMmtuci5jIGlzIG5vdCBuZWVkZWQgYXMgcGFydAorb2YgYW55IHByb2dyYW0gZ2VuZXJhdGVkIGZyb20gdGhlIElKRyBjb2RlLCB0aGlzIGRvZXMgbm90IGxpbWl0IHlvdSBtb3JlIHRoYW4KK3RoZSBmb3JlZ29pbmcgcGFyYWdyYXBocyBkby4KKworVGhlIFVuaXggY29uZmlndXJhdGlvbiBzY3JpcHQgImNvbmZpZ3VyZSIgd2FzIHByb2R1Y2VkIHdpdGggR05VIEF1dG9jb25mLgorSXQgaXMgY29weXJpZ2h0IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYnV0IGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLgorVGhlIHNhbWUgaG9sZHMgZm9yIGl0cyBzdXBwb3J0aW5nIHNjcmlwdHMgKGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwKK2x0Y29uZmlnLCBsdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0CitieSBNLkkuVC4gYnV0IGlzIGFsc28gZnJlZWx5IGRpc3RyaWJ1dGFibGUuCisKK0l0IGFwcGVhcnMgdGhhdCB0aGUgYXJpdGhtZXRpYyBjb2Rpbmcgb3B0aW9uIG9mIHRoZSBKUEVHIHNwZWMgaXMgY292ZXJlZCBieQorcGF0ZW50cyBvd25lZCBieSBJQk0sIEFUJlQsIGFuZCBNaXRzdWJpc2hpLiAgSGVuY2UgYXJpdGhtZXRpYyBjb2RpbmcgY2Fubm90CitsZWdhbGx5IGJlIHVzZWQgd2l0aG91dCBvYnRhaW5pbmcgb25lIG9yIG1vcmUgbGljZW5zZXMuICBGb3IgdGhpcyByZWFzb24sCitzdXBwb3J0IGZvciBhcml0aG1ldGljIGNvZGluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGZyZWUgSlBFRyBzb2Z0d2FyZS4KKyhTaW5jZSBhcml0aG1ldGljIGNvZGluZyBwcm92aWRlcyBvbmx5IGEgbWFyZ2luYWwgZ2FpbiBvdmVyIHRoZSB1bnBhdGVudGVkCitIdWZmbWFuIG1vZGUsIGl0IGlzIHVubGlrZWx5IHRoYXQgdmVyeSBtYW55IGltcGxlbWVudGF0aW9ucyB3aWxsIHN1cHBvcnQgaXQuKQorU28gZmFyIGFzIHdlIGFyZSBhd2FyZSwgdGhlcmUgYXJlIG5vIHBhdGVudCByZXN0cmljdGlvbnMgb24gdGhlIHJlbWFpbmluZworY29kZS4KKworVGhlIElKRyBkaXN0cmlidXRpb24gZm9ybWVybHkgaW5jbHVkZWQgY29kZSB0byByZWFkIGFuZCB3cml0ZSBHSUYgZmlsZXMuCitUbyBhdm9pZCBlbnRhbmdsZW1lbnQgd2l0aCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIEdJRiByZWFkaW5nIHN1cHBvcnQgaGFzCitiZWVuIHJlbW92ZWQgYWx0b2dldGhlciwgYW5kIHRoZSBHSUYgd3JpdGVyIGhhcyBiZWVuIHNpbXBsaWZpZWQgdG8gcHJvZHVjZQorInVuY29tcHJlc3NlZCBHSUZzIi4gIFRoaXMgdGVjaG5pcXVlIGRvZXMgbm90IHVzZSB0aGUgTFpXIGFsZ29yaXRobTsgdGhlCityZXN1bHRpbmcgR0lGIGZpbGVzIGFyZSBsYXJnZXIgdGhhbiB1c3VhbCwgYnV0IGFyZSByZWFkYWJsZSBieSBhbGwgc3RhbmRhcmQKK0dJRiBkZWNvZGVycy4KKworV2UgYXJlIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKKyAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuICBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgorCisKK1JFRkVSRU5DRVMKKz09PT09PT09PT0KKworV2UgaGlnaGx5IHJlY29tbWVuZCByZWFkaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlZmVyZW5jZXMgYmVmb3JlIHRyeWluZyB0bwordW5kZXJzdGFuZCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBzb2Z0d2FyZS4KKworVGhlIGJlc3Qgc2hvcnQgdGVjaG5pY2FsIGludHJvZHVjdGlvbiB0byB0aGUgSlBFRyBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMKKwlXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCisJQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCBuby4gNCksIHBwLiAzMC00NC4KKyhBZGphY2VudCBhcnRpY2xlcyBpbiB0aGF0IGlzc3VlIGRpc2N1c3MgTVBFRyBtb3Rpb24gcGljdHVyZSBjb21wcmVzc2lvbiwKK2FwcGxpY2F0aW9ucyBvZiBKUEVHLCBhbmQgcmVsYXRlZCB0b3BpY3MuKSAgSWYgeW91IGRvbid0IGhhdmUgdGhlIENBQ00gaXNzdWUKK2hhbmR5LCBhIFBvc3RTY3JpcHQgZmlsZSBjb250YWluaW5nIGEgcmV2aXNlZCB2ZXJzaW9uIG9mIFdhbGxhY2UncyBhcnRpY2xlIGlzCithdmFpbGFibGUgYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL3dhbGxhY2UucHMuZ3ouICBUaGUgZmlsZSAoYWN0dWFsbHkKK2EgcHJlcHJpbnQgZm9yIGFuIGFydGljbGUgdGhhdCBhcHBlYXJlZCBpbiBJRUVFIFRyYW5zLiBDb25zdW1lciBFbGVjdHJvbmljcykKK29taXRzIHRoZSBzYW1wbGUgaW1hZ2VzIHRoYXQgYXBwZWFyZWQgaW4gQ0FDTSwgYnV0IGl0IGluY2x1ZGVzIGNvcnJlY3Rpb25zCithbmQgc29tZSBhZGRlZCBtYXRlcmlhbC4gIE5vdGU6IHRoZSBXYWxsYWNlIGFydGljbGUgaXMgY29weXJpZ2h0IEFDTSBhbmQgSUVFRSwKK2FuZCBpdCBtYXkgbm90IGJlIHVzZWQgZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMuCisKK0Egc29tZXdoYXQgbGVzcyB0ZWNobmljYWwsIG1vcmUgbGVpc3VyZWx5IGludHJvZHVjdGlvbiB0byBKUEVHIGNhbiBiZSBmb3VuZCBpbgorIlRoZSBEYXRhIENvbXByZXNzaW9uIEJvb2siIGJ5IE1hcmsgTmVsc29uIGFuZCBKZWFuLWxvdXAgR2FpbGx5LCBwdWJsaXNoZWQgYnkKK00mVCBCb29rcyAoTmV3IFlvcmspLCAybmQgZWQuIDE5OTYsIElTQk4gMS01NTg1MS00MzQtMS4gIFRoaXMgYm9vayBwcm92aWRlcworZ29vZCBleHBsYW5hdGlvbnMgYW5kIGV4YW1wbGUgQyBjb2RlIGZvciBhIG11bHRpdHVkZSBvZiBjb21wcmVzc2lvbiBtZXRob2RzCitpbmNsdWRpbmcgSlBFRy4gIEl0IGlzIGFuIGV4Y2VsbGVudCBzb3VyY2UgaWYgeW91IGFyZSBjb21mb3J0YWJsZSByZWFkaW5nIEMKK2NvZGUgYnV0IGRvbid0IGtub3cgbXVjaCBhYm91dCBkYXRhIGNvbXByZXNzaW9uIGluIGdlbmVyYWwuICBUaGUgYm9vaydzIEpQRUcKK3NhbXBsZSBjb2RlIGlzIGZhciBmcm9tIGluZHVzdHJpYWwtc3RyZW5ndGgsIGJ1dCB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbG9vaworYXQgYSBmdWxsIGltcGxlbWVudGF0aW9uLCB5b3UndmUgZ290IG9uZSBoZXJlLi4uCisKK1RoZSBiZXN0IGZ1bGwgZGVzY3JpcHRpb24gb2YgSlBFRyBpcyB0aGUgdGV4dGJvb2sgIkpQRUcgU3RpbGwgSW1hZ2UgRGF0YQorQ29tcHJlc3Npb24gU3RhbmRhcmQiIGJ5IFdpbGxpYW0gQi4gUGVubmViYWtlciBhbmQgSm9hbiBMLiBNaXRjaGVsbCwgcHVibGlzaGVkCitieSBWYW4gTm9zdHJhbmQgUmVpbmhvbGQsIDE5OTMsIElTQk4gMC00NDItMDEyNzItMS4gIFByaWNlIFVTJDU5Ljk1LCA2MzggcHAuCitUaGUgYm9vayBpbmNsdWRlcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgSVNPIEpQRUcgc3RhbmRhcmRzIChESVMgMTA5MTgtMQorYW5kIGRyYWZ0IERJUyAxMDkxOC0yKS4gIFRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbXBsZXRlIGV4cG9zaXRpb24gb2YgSlBFRworaW4gZXhpc3RlbmNlLCBhbmQgd2UgaGlnaGx5IHJlY29tbWVuZCBpdC4KKworVGhlIEpQRUcgc3RhbmRhcmQgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUgZWxlY3Ryb25pY2FsbHk7IHlvdSBtdXN0IG9yZGVyIGEKK3BhcGVyIGNvcHkgdGhyb3VnaCBJU08gb3IgSVRVLiAgKFVubGVzcyB5b3UgZmVlbCBhIG5lZWQgdG8gb3duIGEgY2VydGlmaWVkCitvZmZpY2lhbCBjb3B5LCB3ZSByZWNvbW1lbmQgYnV5aW5nIHRoZSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbCBib29rIGluc3RlYWQ7CitpdCdzIG11Y2ggY2hlYXBlciBhbmQgaW5jbHVkZXMgYSBncmVhdCBkZWFsIG9mIHVzZWZ1bCBleHBsYW5hdG9yeSBtYXRlcmlhbC4pCitJbiB0aGUgVVNBLCBjb3BpZXMgb2YgdGhlIHN0YW5kYXJkIG1heSBiZSBvcmRlcmVkIGZyb20gQU5TSSBTYWxlcyBhdCAoMjEyKQorNjQyLTQ5MDAsIG9yIGZyb20gR2xvYmFsIEVuZ2luZWVyaW5nIERvY3VtZW50cyBhdCAoODAwKSA4NTQtNzE3OS4gIChBTlNJCitkb2Vzbid0IHRha2UgY3JlZGl0IGNhcmQgb3JkZXJzLCBidXQgR2xvYmFsIGRvZXMuKSAgSXQncyBub3QgY2hlYXA6IGFzIG9mCisxOTkyLCBBTlNJIHdhcyBjaGFyZ2luZyAkOTUgZm9yIFBhcnQgMSBhbmQgJDQ3IGZvciBQYXJ0IDIsIHBsdXMgNyUKK3NoaXBwaW5nL2hhbmRsaW5nLiAgVGhlIHN0YW5kYXJkIGlzIGRpdmlkZWQgaW50byB0d28gcGFydHMsIFBhcnQgMSBiZWluZyB0aGUKK2FjdHVhbCBzcGVjaWZpY2F0aW9uLCB3aGlsZSBQYXJ0IDIgY292ZXJzIGNvbXBsaWFuY2UgdGVzdGluZyBtZXRob2RzLiAgUGFydCAxCitpcyB0aXRsZWQgIkRpZ2l0YWwgQ29tcHJlc3Npb24gYW5kIENvZGluZyBvZiBDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLAorUGFydCAxOiBSZXF1aXJlbWVudHMgYW5kIGd1aWRlbGluZXMiIGFuZCBoYXMgZG9jdW1lbnQgbnVtYmVycyBJU08vSUVDIElTCisxMDkxOC0xLCBJVFUtVCBULjgxLiAgUGFydCAyIGlzIHRpdGxlZCAiRGlnaXRhbCBDb21wcmVzc2lvbiBhbmQgQ29kaW5nIG9mCitDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLCBQYXJ0IDI6IENvbXBsaWFuY2UgdGVzdGluZyIgYW5kIGhhcyBkb2N1bWVudAorbnVtYmVycyBJU08vSUVDIElTIDEwOTE4LTIsIElUVS1UIFQuODMuCisKK1NvbWUgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgSlBFRyBzdGFuZGFyZCBhcmUgZGVmaW5lZCBpbiBKUEVHIFBhcnQgMywKK2EgbmV3ZXIgSVNPIHN0YW5kYXJkIG51bWJlcmVkIElTTy9JRUMgSVMgMTA5MTgtMyBhbmQgSVRVLVQgVC44NC4gIElKRworY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgYW55IFBhcnQgMyBleHRlbnNpb25zLgorCitUaGUgSlBFRyBzdGFuZGFyZCBkb2VzIG5vdCBzcGVjaWZ5IGFsbCBkZXRhaWxzIG9mIGFuIGludGVyY2hhbmdlYWJsZSBmaWxlCitmb3JtYXQuICBGb3IgdGhlIG9taXR0ZWQgZGV0YWlscyB3ZSBmb2xsb3cgdGhlICJKRklGIiBjb252ZW50aW9ucywgcmV2aXNpb24KKzEuMDIuICBBIGNvcHkgb2YgdGhlIEpGSUYgc3BlYyBpcyBhdmFpbGFibGUgZnJvbToKKwlMaXRlcmF0dXJlIERlcGFydG1lbnQKKwlDLUN1YmUgTWljcm9zeXN0ZW1zLCBJbmMuCisJMTc3OCBNY0NhcnRoeSBCbHZkLgorCU1pbHBpdGFzLCBDQSA5NTAzNQorCXBob25lICg0MDgpIDk0NC02MzAwLCAgZmF4ICg0MDgpIDk0NC02MzE0CitBIFBvc3RTY3JpcHQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBieSBGVFAgYXQKK2Z0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy9qZmlmLnBzLmd6LiAgVGhlcmUgaXMgYWxzbyBhIHBsYWluIHRleHQKK3ZlcnNpb24gYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pmaWYudHh0Lmd6LCBidXQgaXQgaXMgbWlzc2luZwordGhlIGZpZ3VyZXMuCisKK1RoZSBUSUZGIDYuMCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBGVFAgZnJvbQorZnRwOi8vZnRwLnNnaS5jb20vZ3JhcGhpY3MvdGlmZi9USUZGNi5wcy5nei4gIFRoZSBKUEVHIGluY29ycG9yYXRpb24gc2NoZW1lCitmb3VuZCBpbiB0aGUgVElGRiA2LjAgc3BlYyBvZiAzLUp1bmUtOTIgaGFzIGEgbnVtYmVyIG9mIHNlcmlvdXMgcHJvYmxlbXMuCitJSkcgZG9lcyBub3QgcmVjb21tZW5kIHVzZSBvZiB0aGUgVElGRiA2LjAgZGVzaWduIChUSUZGIENvbXByZXNzaW9uIHRhZyA2KS4KK0luc3RlYWQsIHdlIHJlY29tbWVuZCB0aGUgSlBFRyBkZXNpZ24gcHJvcG9zZWQgYnkgVElGRiBUZWNobmljYWwgTm90ZSAjMgorKENvbXByZXNzaW9uIHRhZyA3KS4gIENvcGllcyBvZiB0aGlzIE5vdGUgY2FuIGJlIG9idGFpbmVkIGZyb20gZnRwLnNnaS5jb20gb3IKK2Zyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnLy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIG5leHQgcmV2aXNpb24KK29mIHRoZSBUSUZGIHNwZWMgd2lsbCByZXBsYWNlIHRoZSA2LjAgSlBFRyBkZXNpZ24gd2l0aCB0aGUgTm90ZSdzIGRlc2lnbi4KK0FsdGhvdWdoIElKRydzIG93biBjb2RlIGRvZXMgbm90IHN1cHBvcnQgVElGRi9KUEVHLCB0aGUgZnJlZSBsaWJ0aWZmIGxpYnJhcnkKK3VzZXMgb3VyIGxpYnJhcnkgdG8gaW1wbGVtZW50IFRJRkYvSlBFRyBwZXIgdGhlIE5vdGUuICBsaWJ0aWZmIGlzIGF2YWlsYWJsZQorZnJvbSBmdHA6Ly9mdHAuc2dpLmNvbS9ncmFwaGljcy90aWZmLy4KKworCitBUkNISVZFIExPQ0FUSU9OUworPT09PT09PT09PT09PT09PT0KKworVGhlICJvZmZpY2lhbCIgYXJjaGl2ZSBzaXRlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGZ0cC51dS5uZXQgKEludGVybmV0CithZGRyZXNzIDE5Mi40OC45Ni45KS4gIFRoZSBtb3N0IHJlY2VudCByZWxlYXNlZCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQKK3RoZXJlIGluIGRpcmVjdG9yeSBncmFwaGljcy9qcGVnLiAgVGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24gd2lsbCBiZSBhcmNoaXZlZAorYXMgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pwZWdzcmMudjZiLnRhci5nei4gIElmIHlvdSBkb24ndCBoYXZlCitkaXJlY3QgSW50ZXJuZXQgYWNjZXNzLCBVVU5FVCdzIGFyY2hpdmVzIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgVVVDUDsgY29udGFjdAoraGVscEB1dW5ldC51dS5uZXQgZm9yIGluZm9ybWF0aW9uIG9uIHJldHJpZXZpbmcgZmlsZXMgdGhhdCB3YXkuCisKK051bWVyb3VzIEludGVybmV0IHNpdGVzIG1haW50YWluIGNvcGllcyBvZiB0aGUgVVVORVQgZmlsZXMuICBIb3dldmVyLCBvbmx5CitmdHAudXUubmV0IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IG9mZmljaWFsIHZlcnNpb24uCisKK1lvdSBjYW4gYWxzbyBvYnRhaW4gdGhpcyBzb2Z0d2FyZSBpbiBET1MtY29tcGF0aWJsZSAiemlwIiBhcmNoaXZlIGZvcm1hdCBmcm9tCit0aGUgU2ltVGVsIGFyY2hpdmVzIChmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L21zZG9zL2dyYXBoaWNzLyksIG9yCitvbiBDb21wdVNlcnZlIGluIHRoZSBHcmFwaGljcyBTdXBwb3J0IGZvcnVtIChHTyBDSVM6R1JBUEhTVVApLCBsaWJyYXJ5IDEyCisiSlBFRyBUb29scyIuICBBZ2FpbiwgdGhlc2UgdmVyc2lvbnMgbWF5IHNvbWV0aW1lcyBsYWcgYmVoaW5kIHRoZSBmdHAudXUubmV0CityZWxlYXNlLgorCitUaGUgSlBFRyBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zKSBhcnRpY2xlIGlzIGEgdXNlZnVsIHNvdXJjZSBvZgorZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBKUEVHLiAgSXQgaXMgdXBkYXRlZCBjb25zdGFudGx5IGFuZCB0aGVyZWZvcmUgaXMKK25vdCBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBGQVEgaXMgcG9zdGVkIGV2ZXJ5IHR3byB3ZWVrcyB0bworVXNlbmV0IG5ld3Nncm91cHMgY29tcC5ncmFwaGljcy5taXNjLCBuZXdzLmFuc3dlcnMsIGFuZCBvdGhlciBncm91cHMuCitJdCBpcyBhdmFpbGFibGUgb24gdGhlIFdvcmxkIFdpZGUgV2ViIGF0IGh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy9qcGVnLWZhcS8KK2FuZCBvdGhlciBuZXdzLmFuc3dlcnMgYXJjaGl2ZSBzaXRlcywgaW5jbHVkaW5nIHRoZSBvZmZpY2lhbCBuZXdzLmFuc3dlcnMKK2FyY2hpdmUgYXQgcnRmbS5taXQuZWR1OiBmdHA6Ly9ydGZtLm1pdC5lZHUvcHViL3VzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvLgorSWYgeW91IGRvbid0IGhhdmUgV2ViIG9yIEZUUCBhY2Nlc3MsIHNlbmQgZS1tYWlsIHRvIG1haWwtc2VydmVyQHJ0Zm0ubWl0LmVkdQord2l0aCBib2R5CisJc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQxCisJc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQyCisKKworUkVMQVRFRCBTT0ZUV0FSRQorPT09PT09PT09PT09PT09PQorCitOdW1lcm91cyB2aWV3aW5nIGFuZCBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMgbm93IHN1cHBvcnQgSlBFRy4gIChRdWl0ZSBhCitmZXcgb2YgdGhlbSB1c2UgdGhpcyBsaWJyYXJ5IHRvIGRvIHNvLikgIFRoZSBKUEVHIEZBUSBkZXNjcmliZWQgYWJvdmUgbGlzdHMKK3NvbWUgb2YgdGhlIG1vcmUgcG9wdWxhciBmcmVlIGFuZCBzaGFyZXdhcmUgdmlld2VycywgYW5kIHRlbGxzIHdoZXJlIHRvCitvYnRhaW4gdGhlbSBvbiBJbnRlcm5ldC4KKworSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgd2UgaGlnaGx5IHJlY29tbWVuZCBKZWYgUG9za2FuemVyJ3MgZnJlZQorUEJNUExVUyBzb2Z0d2FyZSwgd2hpY2ggcHJvdmlkZXMgbWFueSB1c2VmdWwgb3BlcmF0aW9ucyBvbiBQUE0tZm9ybWF0IGltYWdlCitmaWxlcy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBjb252ZXJ0IFBQTSBpbWFnZXMgdG8gYW5kIGZyb20gYSB3aWRlIHJhbmdlIG9mCitvdGhlciBmb3JtYXRzLCB0aHVzIG1ha2luZyBjanBlZy9kanBlZyBjb25zaWRlcmFibHkgbW9yZSB1c2VmdWwuICBUaGUgbGF0ZXN0Cit2ZXJzaW9uIGlzIGRpc3RyaWJ1dGVkIGJ5IHRoZSBOZXRQQk0gZ3JvdXAsIGFuZCBpcyBhdmFpbGFibGUgZnJvbSBudW1lcm91cworc2l0ZXMsIG5vdGFibHkgZnRwOi8vd3VhcmNoaXZlLnd1c3RsLmVkdS9ncmFwaGljcy9ncmFwaGljcy9wYWNrYWdlcy9OZXRQQk0vLgorVW5mb3J0dW5hdGVseSBQQk1QTFVTL05FVFBCTSBpcyBub3QgbmVhcmx5IGFzIHBvcnRhYmxlIGFzIHRoZSBJSkcgc29mdHdhcmUgaXM7Cit5b3UgYXJlIGxpa2VseSB0byBoYXZlIGRpZmZpY3VsdHkgbWFraW5nIGl0IHdvcmsgb24gYW55IG5vbi1Vbml4IG1hY2hpbmUuCisKK0EgZGlmZmVyZW50IGZyZWUgSlBFRyBpbXBsZW1lbnRhdGlvbiwgd3JpdHRlbiBieSB0aGUgUFZSRyBncm91cCBhdCBTdGFuZm9yZCwKK2lzIGF2YWlsYWJsZSBmcm9tIGZ0cDovL2hhdmVmdW4uc3RhbmZvcmQuZWR1L3B1Yi9qcGVnLy4gIFRoaXMgcHJvZ3JhbQoraXMgZGVzaWduZWQgZm9yIHJlc2VhcmNoIGFuZCBleHBlcmltZW50YXRpb24gcmF0aGVyIHRoYW4gcHJvZHVjdGlvbiB1c2U7CitpdCBpcyBzbG93ZXIsIGhhcmRlciB0byB1c2UsIGFuZCBsZXNzIHBvcnRhYmxlIHRoYW4gdGhlIElKRyBjb2RlLCBidXQgaXQKK2lzIGVhc2llciB0byByZWFkIGFuZCBtb2RpZnkuICBBbHNvLCB0aGUgUFZSRyBjb2RlIHN1cHBvcnRzIGxvc3NsZXNzIEpQRUcsCit3aGljaCB3ZSBkbyBub3QuICAoT24gdGhlIG90aGVyIGhhbmQsIGl0IGRvZXNuJ3QgZG8gcHJvZ3Jlc3NpdmUgSlBFRy4pCisKKworRklMRSBGT1JNQVQgV0FSUworPT09PT09PT09PT09PT09PQorCitTb21lIEpQRUcgcHJvZ3JhbXMgcHJvZHVjZSBmaWxlcyB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG91ciBsaWJyYXJ5LgorVGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgSVNPIEpQRUcgY29tbWl0dGVlIGZhaWxlZCB0byBzcGVjaWZ5IGEKK2NvbmNyZXRlIGZpbGUgZm9ybWF0LiAgU29tZSB2ZW5kb3JzICJmaWxsZWQgaW4gdGhlIGJsYW5rcyIgb24gdGhlaXIgb3duLAorY3JlYXRpbmcgcHJvcHJpZXRhcnkgZm9ybWF0cyB0aGF0IG5vIG9uZSBlbHNlIGNvdWxkIHJlYWQuICAoRm9yIGV4YW1wbGUsIG5vbmUKK29mIHRoZSBlYXJseSBjb21tZXJjaWFsIEpQRUcgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgTWFjaW50b3NoIHdlcmUgYWJsZSB0bworZXhjaGFuZ2UgY29tcHJlc3NlZCBmaWxlcy4pCisKK1RoZSBmaWxlIGZvcm1hdCB3ZSBoYXZlIGFkb3B0ZWQgaXMgY2FsbGVkIEpGSUYgKHNlZSBSRUZFUkVOQ0VTKS4gIFRoaXMgZm9ybWF0CitoYXMgYmVlbiBhZ3JlZWQgdG8gYnkgYSBudW1iZXIgb2YgbWFqb3IgY29tbWVyY2lhbCBKUEVHIHZlbmRvcnMsIGFuZCBpdCBoYXMKK2JlY29tZSB0aGUgZGUgZmFjdG8gc3RhbmRhcmQuICBKRklGIGlzIGEgbWluaW1hbCBvciAibG93IGVuZCIgcmVwcmVzZW50YXRpb24uCitXZSByZWNvbW1lbmQgdGhlIHVzZSBvZiBUSUZGL0pQRUcgKFRJRkYgcmV2aXNpb24gNi4wIGFzIG1vZGlmaWVkIGJ5IFRJRkYKK1RlY2huaWNhbCBOb3RlICMyKSBmb3IgImhpZ2ggZW5kIiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIHJlY29yZCBhIGxvdCBvZgorYWRkaXRpb25hbCBkYXRhIGFib3V0IGFuIGltYWdlLiAgVElGRi9KUEVHIGlzIGZhaXJseSBuZXcgYW5kIG5vdCB5ZXQgd2lkZWx5CitzdXBwb3J0ZWQsIHVuZm9ydHVuYXRlbHkuCisKK1RoZSB1cGNvbWluZyBKUEVHIFBhcnQgMyBzdGFuZGFyZCBkZWZpbmVzIGEgZmlsZSBmb3JtYXQgY2FsbGVkIFNQSUZGLgorU1BJRkYgaXMgaW50ZXJvcGVyYWJsZSB3aXRoIEpGSUYsIGluIHRoZSBzZW5zZSB0aGF0IG1vc3QgSkZJRiBkZWNvZGVycyBzaG91bGQKK2JlIGFibGUgdG8gcmVhZCB0aGUgbW9zdCBjb21tb24gdmFyaWFudCBvZiBTUElGRi4gIFNQSUZGIGhhcyBzb21lIHRlY2huaWNhbAorYWR2YW50YWdlcyBvdmVyIEpGSUYsIGJ1dCBpdHMgbWFqb3IgY2xhaW0gdG8gZmFtZSBpcyBzaW1wbHkgdGhhdCBpdCBpcyBhbgorb2ZmaWNpYWwgc3RhbmRhcmQgcmF0aGVyIHRoYW4gYW4gaW5mb3JtYWwgb25lLiAgQXQgdGhpcyBwb2ludCBpdCBpcyB1bmNsZWFyCit3aGV0aGVyIFNQSUZGIHdpbGwgc3VwZXJzZWRlIEpGSUYgb3Igd2hldGhlciBKRklGIHdpbGwgcmVtYWluIHRoZSBkZS1mYWN0bworc3RhbmRhcmQuICBJSkcgaW50ZW5kcyB0byBzdXBwb3J0IFNQSUZGIG9uY2UgdGhlIHN0YW5kYXJkIGlzIGZyb3plbiwgYnV0IHdlCitoYXZlIG5vdCBkZWNpZGVkIHdoZXRoZXIgaXQgc2hvdWxkIGJlY29tZSBvdXIgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IG9yIG5vdC4KKyhJbiBhbnkgY2FzZSwgb3VyIGRlY29kZXIgd2lsbCByZW1haW4gY2FwYWJsZSBvZiByZWFkaW5nIEpGSUYgaW5kZWZpbml0ZWx5LikKKworVmFyaW91cyBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdHMgaW5jb3Jwb3JhdGluZyBKUEVHIGNvbXByZXNzaW9uIGFsc28gZXhpc3QuCitXZSBoYXZlIGxpdHRsZSBvciBubyBzeW1wYXRoeSBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGVzZSBmb3JtYXRzLiAgSW5kZWVkLAorb25lIG9mIHRoZSBvcmlnaW5hbCByZWFzb25zIGZvciBkZXZlbG9waW5nIHRoaXMgZnJlZSBzb2Z0d2FyZSB3YXMgdG8gaGVscAorZm9yY2UgY29udmVyZ2VuY2Ugb24gY29tbW9uLCBvcGVuIGZvcm1hdCBzdGFuZGFyZHMgZm9yIEpQRUcgZmlsZXMuICBEb24ndAordXNlIGEgcHJvcHJpZXRhcnkgZmlsZSBmb3JtYXQhCisKKworVE8gRE8KKz09PT09CisKK1RoZSBtYWpvciB0aHJ1c3QgZm9yIHY3IHdpbGwgcHJvYmFibHkgYmUgaW1wcm92ZW1lbnQgb2YgdmlzdWFsIHF1YWxpdHkuCitUaGUgY3VycmVudCBtZXRob2QgZm9yIHNjYWxpbmcgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgaXMga25vd24gbm90IHRvIGJlCit2ZXJ5IGdvb2QgYXQgbG93IFEgdmFsdWVzLiAgV2UgYWxzbyBpbnRlbmQgdG8gaW52ZXN0aWdhdGUgYmxvY2sgYm91bmRhcnkKK3Ntb290aGluZywgInBvb3IgbWFuJ3MgdmFyaWFibGUgcXVhbnRpemF0aW9uIiwgYW5kIG90aGVyIG1lYW5zIG9mIGltcHJvdmluZworcXVhbGl0eS12cy1maWxlLXNpemUgcGVyZm9ybWFuY2Ugd2l0aG91dCBzYWNyaWZpY2luZyBjb21wYXRpYmlsaXR5LgorCitJbiBmdXR1cmUgdmVyc2lvbnMsIHdlIGFyZSBjb25zaWRlcmluZyBzdXBwb3J0aW5nIHNvbWUgb2YgdGhlIHVwY29taW5nIEpQRUcKK1BhcnQgMyBleHRlbnNpb25zIC0tLSBwcmluY2lwYWxseSwgdmFyaWFibGUgcXVhbnRpemF0aW9uIGFuZCB0aGUgU1BJRkYgZmlsZQorZm9ybWF0LgorCitBcyBhbHdheXMsIHNwZWVkaW5nIHRoaW5ncyB1cCBpcyBvZiBncmVhdCBpbnRlcmVzdC4KKworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIG9mZmVycyBvZiBoZWxwLCBldGMuIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCmRpZmYgLS1naXQgYS9hbnNpMmtuci4xIGIvYW5zaTJrbnIuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWVlNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5zaTJrbnIuMQpAQCAtMCwwICsxLDM2IEBACisuVEggQU5TSTJLTlIgMSAiMTkgSmFuIDE5OTYiCisuU0ggTkFNRQorYW5zaTJrbnIgXC0gY29udmVydCBBTlNJIEMgdG8gS2VybmlnaGFuICYgUml0Y2hpZSBDCisuU0ggU1lOT1BTSVMKKy5JIGFuc2kya25yCitbLS12YXJhcmdzXSBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV0KKy5TSCBERVNDUklQVElPTgorSWYgbm8gb3V0cHV0X2ZpbGUgaXMgc3VwcGxpZWQsIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKy5icgorVGhlcmUgYXJlIG5vIGVycm9yIG1lc3NhZ2VzLgorLnNwCisuSSBhbnNpMmtucgorcmVjb2duaXplcyBmdW5jdGlvbiBkZWZpbml0aW9ucyBieSBzZWVpbmcgYSBub24ta2V5d29yZCBpZGVudGlmaWVyIGF0IHRoZSBsZWZ0CittYXJnaW4sIGZvbGxvd2VkIGJ5IGEgbGVmdCBwYXJlbnRoZXNpcywgd2l0aCBhIHJpZ2h0IHBhcmVudGhlc2lzIGFzIHRoZSBsYXN0CitjaGFyYWN0ZXIgb24gdGhlIGxpbmUsIGFuZCB3aXRoIGEgbGVmdCBicmFjZSBhcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlCitmb2xsb3dpbmcgbGluZSAoaWdub3JpbmcgcG9zc2libGUgaW50ZXJ2ZW5pbmcgY29tbWVudHMpLiAgSXQgd2lsbCByZWNvZ25pemUgYQorbXVsdGktbGluZSBoZWFkZXIgcHJvdmlkZWQgdGhhdCBubyBpbnRlcnZlbmluZyBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQKK2JyYWNlIG9yIGEgc2VtaWNvbG9uLiAgVGhlc2UgYWxnb3JpdGhtcyBpZ25vcmUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMsIGV4Y2VwdAordGhhdCB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGluZS4KKy5zcAorVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHdpbGwgY29uZnVzZSBpdDoKKy5icgorICAgICAtIEFueSBvdGhlciBjb25zdHJ1Y3QgdGhhdCBzdGFydHMgYXQgdGhlIGxlZnQgbWFyZ2luIGFuZCBmb2xsb3dzIHRoZQorYWJvdmUgc3ludGF4IChzdWNoIGFzIGEgbWFjcm8gb3IgZnVuY3Rpb24gY2FsbCkuCisuYnIKKyAgICAgLSBTb21lIG1hY3JvcyB0aGF0IHRpbmtlciB3aXRoIHRoZSBzeW50YXggb2YgdGhlIGZ1bmN0aW9uIGhlYWRlci4KKy5zcAorVGhlIC0tdmFyYXJncyBzd2l0Y2ggaXMgb2Jzb2xldGUsIGFuZCBpcyByZWNvZ25pemVkIG9ubHkgZm9yCitiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIFRoZSBwcmVzZW50IHZlcnNpb24gb2YKKy5JIGFuc2kya25yCit3aWxsIGFsd2F5cyBhdHRlbXB0IHRvIGNvbnZlcnQgYSAuLi4gYXJndW1lbnQgdG8gdmFfYWxpc3QgYW5kIHZhX2RjbC4KKy5TSCBBVVRIT1IKK0wuIFBldGVyIERldXRzY2ggPGdob3N0QGFsYWRkaW4uY29tPiB3cm90ZSB0aGUgb3JpZ2luYWwgYW5zaTJrbnIgYW5kCitjb250aW51ZXMgdG8gbWFpbnRhaW4gdGhlIGN1cnJlbnQgdmVyc2lvbjsgbW9zdCBvZiB0aGUgY29kZSBpbiB0aGUgY3VycmVudAordmVyc2lvbiBpcyBoaXMgd29yay4gIGFuc2kya25yIGFsc28gaW5jbHVkZXMgY29udHJpYnV0aW9ucyBieSBGcmFuY29pcworUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4gYW5kIEppbSBBdmVyYSA8amltYUBuZXRjb20uY29tPi4KZGlmZiAtLWdpdCBhL2Fuc2kya25yLmMgYi9hbnNpMmtuci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDVmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnNpMmtuci5jCkBAIC0wLDAgKzEsNjkzIEBACisvKiBhbnNpMmtuci5jICovCisvKiBDb252ZXJ0IEFOU0kgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBLJlIgKCJ0cmFkaXRpb25hbCBDIikgc3ludGF4ICovCisKKy8qCithbnNpMmtuciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yIGFjY2VwdHMgcmVzcG9uc2liaWxpdHkgdG8gYW55b25lIGZvciB0aGUKK2NvbnNlcXVlbmNlcyBvZiB1c2luZyBpdCBvciBmb3Igd2hldGhlciBpdCBzZXJ2ZXMgYW55IHBhcnRpY3VsYXIgcHVycG9zZSBvcgord29ya3MgYXQgYWxsLCB1bmxlc3MgaGUgc2F5cyBzbyBpbiB3cml0aW5nLiAgUmVmZXIgdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSAodGhlICJHUEwiKSBmb3IgZnVsbCBkZXRhaWxzLgorCitFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgYW5zaTJrbnIsCitidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlIEdQTC4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UKK2lzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCBhbnNpMmtuciBzbyB5b3UgY2FuIGtub3cKK3lvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlIGluIGEgZmlsZSBuYW1lZCBDT1BZTEVGVC4KK1tJbiB0aGUgSUpHIGRpc3RyaWJ1dGlvbiwgdGhlIEdQTCBhcHBlYXJzIGJlbG93LCBub3QgaW4gYSBzZXBhcmF0ZSBmaWxlLl0KK0Ftb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkCitvbiBhbGwgY29waWVzLgorCitXZSBleHBsaWNpdGx5IHN0YXRlIGhlcmUgd2hhdCB3ZSBiZWxpZXZlIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgR1BMOiBpZgordGhlIGFuc2kya25yIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgYXMgYSBzZXBhcmF0ZSBzZXQgb2Ygc291cmNlcyBhbmQgYQorc2VwYXJhdGUgZXhlY3V0YWJsZSBmaWxlIHdoaWNoIGFyZSBhZ2dyZWdhdGVkIG9uIGEgc3RvcmFnZSBtZWRpdW0gdG9nZXRoZXIKK3dpdGggYW5vdGhlciBwcm9ncmFtLCB0aGlzIGluIGl0c2VsZiBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgcHJvZ3JhbSB1bmRlcgordGhlIEdQTCwgbm9yIGRvZXMgdGhlIG1lcmUgZmFjdCB0aGF0IHN1Y2ggYSBwcm9ncmFtIG9yIHRoZSBwcm9jZWR1cmVzIGZvcgorY29uc3RydWN0aW5nIGl0IGludm9rZSB0aGUgYW5zaTJrbnIgZXhlY3V0YWJsZSBicmluZyBhbnkgb3RoZXIgcGFydCBvZiB0aGUKK3Byb2dyYW0gdW5kZXIgdGhlIEdQTC4KKyovCisKKy8qCistLS0tLS0tLS0tIEhlcmUgaXMgdGhlIEdOVSBHUEwgZmlsZSBDT1BZTEVGVCwgcmVmZXJyZWQgdG8gYWJvdmUgLS0tLS0tLS0tLQorLS0tLS0gVGhlc2UgdGVybXMgZG8gTk9UIGFwcGx5IHRvIHRoZSBKUEVHIHNvZnR3YXJlIGl0c2VsZjsgc2VlIFJFQURNRSAtLS0tLS0KKworCQkgICAgR0hPU1RTQ1JJUFQgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgKENsYXJpZmllZCAxMSBGZWIgMTk4OCkKKworIENvcHlyaWdodCAoQykgMTk4OCBSaWNoYXJkIE0uIFN0YWxsbWFuCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMKKyBsaWNlbnNlLCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgd29yZGluZworIHRvIG1ha2UgdGhlIHRlcm1zIGZvciBvdGhlciBwcm9ncmFtcy4KKworICBUaGUgbGljZW5zZSBhZ3JlZW1lbnRzIG9mIG1vc3Qgc29mdHdhcmUgY29tcGFuaWVzIGtlZXAgeW91IGF0IHRoZQorbWVyY3kgb2YgdGhvc2UgY29tcGFuaWVzLiAgQnkgY29udHJhc3QsIG91ciBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGlzCitpbnRlbmRlZCB0byBnaXZlIGV2ZXJ5b25lIHRoZSByaWdodCB0byBzaGFyZSBHaG9zdHNjcmlwdC4gIFRvIG1ha2Ugc3VyZQordGhhdCB5b3UgZ2V0IHRoZSByaWdodHMgd2Ugd2FudCB5b3UgdG8gaGF2ZSwgd2UgbmVlZCB0byBtYWtlCityZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91Cit0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIEhlbmNlIHRoaXMgbGljZW5zZSBhZ3JlZW1lbnQuCisKKyAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCithd2F5IGNvcGllcyBvZiBHaG9zdHNjcmlwdCwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBlbHNlIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIEdob3N0c2NyaXB0IG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBtYWtlIHN1cmUgdGhhdCBldmVyeW9uZSBoYXMgc3VjaCByaWdodHMsIHdlIGhhdmUgdG8gZm9yYmlkIHlvdSB0bworZGVwcml2ZSBhbnlvbmUgZWxzZSBvZiB0aGVzZSByaWdodHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUKK2NvcGllcyBvZiBHaG9zdHNjcmlwdCwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy4KKworICBBbHNvLCBmb3Igb3VyIG93biBwcm90ZWN0aW9uLCB3ZSBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGV2ZXJ5b25lIGZpbmRzCitvdXQgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgR2hvc3RzY3JpcHQuICBJZiBHaG9zdHNjcmlwdCBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3Qgd2hhdCB3ZSBkaXN0cmlidXRlZCwgc28gdGhhdCBhbnkgcHJvYmxlbXMKK2ludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gb3VyIHJlcHV0YXRpb24uCisKKyAgVGhlcmVmb3JlIHdlIChSaWNoYXJkIE0uIFN0YWxsbWFuIGFuZCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLikgbWFrZSB0aGUgZm9sbG93aW5nIHRlcm1zIHdoaWNoIHNheSB3aGF0IHlvdSBtdXN0IGRvIHRvIGJlIGFsbG93ZWQKK3RvIGRpc3RyaWJ1dGUgb3IgY2hhbmdlIEdob3N0c2NyaXB0LgorCisKKwkJCUNPUFlJTkcgUE9MSUNJRVMKKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIEdob3N0c2NyaXB0IHNvdXJjZQorY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseQorYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYSB2YWxpZCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UKK25vdGljZSAiQ29weXJpZ2h0IChDKSAxOTg5IEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorRGlzdHJpYnV0ZWQgYnkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIiAob3Igd2l0aCB3aGF0ZXZlciB5ZWFyIGlzCithcHByb3ByaWF0ZSk7IGtlZXAgaW50YWN0IHRoZSBub3RpY2VzIG9uIGFsbCBmaWxlcyB0aGF0IHJlZmVyIHRvIHRoaXMKK0xpY2Vuc2UgQWdyZWVtZW50IGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlcgorcmVjaXBpZW50cyBvZiB0aGUgR2hvc3RzY3JpcHQgcHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudAorYWxvbmcgd2l0aCB0aGUgcHJvZ3JhbS4gIFlvdSBtYXkgY2hhcmdlIGEgZGlzdHJpYnV0aW9uIGZlZSBmb3IgdGhlCitwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIEdob3N0c2NyaXB0IG9yIGFueSBwb3J0aW9uIG9mCitpdCwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBvZgorUGFyYWdyYXBoIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gdGhlIGZvbGxvd2luZzoKKworICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCisgICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2U7IGFuZAorCisgICAgYikgY2F1c2UgdGhlIHdob2xlIG9mIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwKKyAgICB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgYSBkZXJpdmF0aXZlIG9mIEdob3N0c2NyaXB0CisgICAgb3IgYW55IHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgb24gdGVybXMgaWRlbnRpY2FsIHRvIHRob3NlIGNvbnRhaW5lZCBpbiB0aGlzIExpY2Vuc2UKKyAgICBBZ3JlZW1lbnQgKGV4Y2VwdCB0aGF0IHlvdSBtYXkgY2hvb3NlIHRvIGdyYW50IG1vcmUgZXh0ZW5zaXZlCisgICAgd2FycmFudHkgcHJvdGVjdGlvbiB0byBzb21lIG9yIGFsbCB0aGlyZCBwYXJ0aWVzLCBhdCB5b3VyIG9wdGlvbikuCisKKyAgICBjKSBZb3UgbWF5IGNoYXJnZSBhIGRpc3RyaWJ1dGlvbiBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YKKyAgICB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eQorICAgIHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCitNZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgdW5yZWxhdGVkIHByb2dyYW0gd2l0aCB0aGlzIHByb2dyYW0gKG9yIGl0cworZGVyaXZhdGl2ZSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcKK3RoZSBvdGhlciBwcm9ncmFtIHVuZGVyIHRoZSBzY29wZSBvZiB0aGVzZSB0ZXJtcy4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgR2hvc3RzY3JpcHQgKG9yIGEgcG9ydGlvbiBvciBkZXJpdmF0aXZlCitvZiBpdCwgdW5kZXIgUGFyYWdyYXBoIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUKK3Rlcm1zIG9mIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUKK2ZvbGxvd2luZzoKKworICAgIGEpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLAorCisgICAgYikgYWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHkgZnJlZSAoZXhjZXB0IGZvciBhIG5vbWluYWwKKyAgICBzaGlwcGluZyBjaGFyZ2UpIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICAgIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZTsgb3IsCisKKyAgICBjKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHdoZXJlIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSBhbG9uZS4pCisKK0ZvciBhbiBleGVjdXRhYmxlIGZpbGUsIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yCithbGwgbW9kdWxlcyBpdCBjb250YWluczsgYnV0LCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpdCBuZWVkIG5vdCBpbmNsdWRlCitzb3VyY2UgY29kZSBmb3IgbW9kdWxlcyB3aGljaCBhcmUgc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgYWNjb21wYW55IHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBmaWxlIHJ1bnMuCisKKyAgNC4gWW91IG1heSBub3QgY29weSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2ZlciBHaG9zdHNjcmlwdAorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIEdob3N0c2NyaXB0IGlzCit2b2lkIGFuZCB5b3VyIHJpZ2h0cyB0byB1c2UgdGhlIHByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIGFncmVlbWVudAorc2hhbGwgYmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZAorY29tcHV0ZXIgc29mdHdhcmUgcHJvZ3JhbXMgZnJvbSB5b3Ugd2l0aCB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgbm90CitoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwKK2NvbXBsaWFuY2UuCisKKyAgNS4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgR2hvc3RzY3JpcHQgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiBhdCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzkuICBXZSBoYXZlIG5vdAoreWV0IHdvcmtlZCBvdXQgYSBzaW1wbGUgcnVsZSB0aGF0IGNhbiBiZSBzdGF0ZWQgaGVyZSwgYnV0IHdlIHdpbGwgb2Z0ZW4KK3Blcm1pdCB0aGlzLiAgV2Ugd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlCitzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlCitzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZS4KKworWW91ciBjb21tZW50cyBhbmQgc3VnZ2VzdGlvbnMgYWJvdXQgb3VyIGxpY2Vuc2luZyBwb2xpY2llcyBhbmQgb3VyCitzb2Z0d2FyZSBhcmUgd2VsY29tZSEgIFBsZWFzZSBjb250YWN0IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIG9yIGNhbGwgKDYxNykgODc2LTMyOTYuCisKKwkJICAgICAgIE5PIFdBUlJBTlRZCisKKyAgQkVDQVVTRSBHSE9TVFNDUklQVCBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgV0UgUFJPVklERSBBQlNPTFVURUxZCitOTyBXQVJSQU5UWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBTVEFURSBMQVcuICBFWENFUFQKK1dIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HLCBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQywgUklDSEFSRAorTS4gU1RBTExNQU4sIEFMQURESU4gRU5URVJQUklTRVMsIEwuIFBFVEVSIERFVVRTQ0gsIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIEdIT1NUU0NSSVBUICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSCitFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUKK0VOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBHSE9TVFNDUklQVCBJUyBXSVRICitZT1UuICBTSE9VTEQgR0hPU1RTQ1JJUFQgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAorTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIFdJTEwgUklDSEFSRCBNLgorU1RBTExNQU4sIFRIRSBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4sIEwuIFBFVEVSIERFVVRTQ0gsIEFMQURESU4KK0VOVEVSUFJJU0VTLCBBTkQvT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORCBSRURJU1RSSUJVVEUKK0dIT1NUU0NSSVBUIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HCitBTlkgTE9TVCBQUk9GSVRTLCBMT1NUIE1PTklFUywgT1IgT1RIRVIgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRQorKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQKK0lOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUKK1BST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUykgR0hPU1RTQ1JJUFQsIEVWRU4gSUYgWU9VCitIQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLCBPUiBGT1IgQU5ZIENMQUlNCitCWSBBTlkgT1RIRVIgUEFSVFkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvZiBmaWxlIENPUFlMRUZUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyAqIFVzYWdlOgorCWFuc2kya25yIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXQorICogSWYgbm8gb3V0cHV0X2ZpbGUgaXMgc3VwcGxpZWQsIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKyAqIFRoZXJlIGFyZSBubyBlcnJvciBtZXNzYWdlcy4KKyAqCisgKiBhbnNpMmtuciByZWNvZ25pemVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJ5IHNlZWluZyBhIG5vbi1rZXl3b3JkCisgKiBpZGVudGlmaWVyIGF0IHRoZSBsZWZ0IG1hcmdpbiwgZm9sbG93ZWQgYnkgYSBsZWZ0IHBhcmVudGhlc2lzLAorICogd2l0aCBhIHJpZ2h0IHBhcmVudGhlc2lzIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGluZSwKKyAqIGFuZCB3aXRoIGEgbGVmdCBicmFjZSBhcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlIGZvbGxvd2luZyBsaW5lCisgKiAoaWdub3JpbmcgcG9zc2libGUgaW50ZXJ2ZW5pbmcgY29tbWVudHMpLgorICogSXQgd2lsbCByZWNvZ25pemUgYSBtdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nCisgKiBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQgYnJhY2Ugb3IgYSBzZW1pY29sb24uCisgKiBUaGVzZSBhbGdvcml0aG1zIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgZXhjZXB0IHRoYXQKKyAqIHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLgorICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHdpbGwgY29uZnVzZSBpdDoKKyAqCS0gQW55IG90aGVyIGNvbnN0cnVjdCB0aGF0IHN0YXJ0cyBhdCB0aGUgbGVmdCBtYXJnaW4gYW5kCisgKgkgICAgZm9sbG93cyB0aGUgYWJvdmUgc3ludGF4IChzdWNoIGFzIGEgbWFjcm8gb3IgZnVuY3Rpb24gY2FsbCkuCisgKgktIFNvbWUgbWFjcm9zIHRoYXQgdGlua2VyIHdpdGggdGhlIHN5bnRheCBvZiB0aGUgZnVuY3Rpb24gaGVhZGVyLgorICovCisKKy8qCisgKiBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgYW5zaTJrbnIgaXMgTC4gUGV0ZXIgRGV1dHNjaAorICogPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQorICogdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCWxwZCA5Ni0wMS0yMSBhZGRlZCBjb2RlIHRvIGNvcGUgd2l0aCBub3QgSEFWRV9DT05GSUdfSCBhbmQgd2l0aAorCQljb21waWxlcnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIHZvaWQsIGFzIHN1Z2dlc3RlZCBieQorCQlUb20gTGFuZQorCWxwZCA5Ni0wMS0xNSBjaGFuZ2VkIHRvIHJlcXVpcmUgdGhhdCB0aGUgZmlyc3Qgbm9uLWNvbW1lbnQgdG9rZW4KKwkJb24gdGhlIGxpbmUgZm9sbG93aW5nIGEgZnVuY3Rpb24gaGVhZGVyIGJlIGEgbGVmdCBicmFjZSwKKwkJdG8gcmVkdWNlIHNlbnNpdGl2aXR5IHRvIG1hY3JvcywgYXMgc3VnZ2VzdGVkIGJ5IFRvbSBMYW5lCisJCTx0Z2xAc3NzLnBnaC5wYS51cz4KKwlscGQgOTUtMDYtMjIgcmVtb3ZlZCAjaWZuZGVmcyB3aG9zZSBzb2xlIHB1cnBvc2Ugd2FzIHRvIGRlZmluZQorCQl1bmRlZmluZWQgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYXMgMDsgY2hhbmdlZCBhbGwgI2lmZGVmcworCQlmb3IgY29uZmlndXJhdGlvbiBzeW1ib2xzIHRvICNpZnMKKwlscGQgOTUtMDQtMDUgY2hhbmdlZCBjb3B5cmlnaHQgbm90aWNlIHRvIG1ha2UgaXQgY2xlYXIgdGhhdAorCQlpbmNsdWRpbmcgYW5zaTJrbnIgaW4gYSBwcm9ncmFtIGRvZXMgbm90IGJyaW5nIHRoZSBlbnRpcmUKKwkJcHJvZ3JhbSB1bmRlciB0aGUgR1BMCisJbHBkIDk0LTEyLTE4IGFkZGVkIGNvbmRpdGlvbmFscyBmb3Igc3lzdGVtcyB3aGVyZSBjdHlwZSBtYWNyb3MKKwkJZG9uJ3QgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgcHJvcGVybHksIHN1Z2dlc3RlZCBieQorCQlGcmFuY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPjsKKwkJcmVtb3ZlZCAtLXZhcmFyZ3Mgc3dpdGNoICh0aGlzIGlzIG5vdyB0aGUgZGVmYXVsdCkKKwlscGQgOTQtMTAtMTAgcmVtb3ZlZCBDT05GSUdfQlJPS0VUUyBjb25kaXRpb25hbAorCWxwZCA5NC0wNy0xNiBhZGRlZCBzb21lIGNvbmRpdGlvbmFscyB0byBoZWxwIEdOVSBgY29uZmlndXJlJywKKwkJc3VnZ2VzdGVkIGJ5IEZyYW5jb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+OworCQlwcm9wZXJseSBlcmFzZSBwcm90b3R5cGUgYXJncyBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzLAorCQljb250cmlidXRlZCBieSBKaW0gQXZlcmEgPGppbWFAbmV0Y29tLmNvbT47CisJCWNvcnJlY3QgZXJyb3IgaW4gd3JpdGVibGFua3MgKGl0IHNob3VsZG4ndCBlcmFzZSBFT0xzKQorCWxwZCA4OS14eC14eCBvcmlnaW5hbCB2ZXJzaW9uCisgKi8KKworLyogTW9zdCBvZiB0aGUgY29uZGl0aW9uYWxzIGhlcmUgYXJlIHRvIG1ha2UgYW5zaTJrbnIgd29yayB3aXRoICovCisvKiBvciB3aXRob3V0IHRoZSBHTlUgY29uZmlndXJlIG1hY2hpbmVyeS4gKi8KKworI2lmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmIEhBVkVfQ09ORklHX0gKKworLyoKKyAgIEZvciBwcm9wZXJseSBhdXRvY29uZmlndXJpbmcgYW5zaTJrbnIsIHVzZSBBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oKS4KKyAgIFRoaXMgd2lsbCBkZWZpbmUgSEFWRV9DT05GSUdfSCBhbmQgc28sIGFjdGl2YXRlIHRoZSBmb2xsb3dpbmcgbGluZXMuCisgKi8KKworIyBpZiBTVERDX0hFQURFUlMgfHwgSEFWRV9TVFJJTkdfSAorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgZW5kaWYKKworI2Vsc2UgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KKworLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBoYXJkIHdheSAqLworCisjIGlmZGVmIEJTRAorIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgorIyBlbHNlCisjICBpZmRlZiBWTVMKKyAgICBleHRlcm4gaW50IHN0cmxlbigpLCBzdHJuY21wKCk7CisjICBlbHNlCisjICAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogbm90IEhBVkVfQ09ORklHX0ggKi8KKworI2lmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCisvKgorICAgbWFsbG9jIGFuZCBmcmVlIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBzdGRsaWIuaCwKKyAgIGJ1dCBpZiB5b3UndmUgZ290IGEgSyZSIGNvbXBpbGVyLCB0aGV5IHByb2JhYmx5IGFyZW4ndC4KKyAqLworIyBpZmRlZiBNU0RPUworIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjIGVsc2UKKyMgIGlmZGVmIFZNUworICAgICBleHRlcm4gY2hhciAqbWFsbG9jKCk7CisgICAgIGV4dGVybiB2b2lkIGZyZWUoKTsKKyMgIGVsc2UKKyAgICAgZXh0ZXJuIGNoYXIgKm1hbGxvYygpOworICAgICBleHRlcm4gaW50IGZyZWUoKTsKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZgorCisvKgorICogVGhlIGN0eXBlIG1hY3JvcyBkb24ndCBhbHdheXMgaGFuZGxlIDgtYml0IGNoYXJhY3RlcnMgY29ycmVjdGx5LgorICogQ29tcGVuc2F0ZSBmb3IgdGhpcyBoZXJlLgorICovCisjaWZkZWYgaXNhc2NpaQorIyAgdW5kZWYgSEFWRV9JU0FTQ0lJCQkvKiBqdXN0IGluIGNhc2UgKi8KKyMgIGRlZmluZSBIQVZFX0lTQVNDSUkgMQorI2Vsc2UKKyNlbmRpZgorI2lmIFNURENfSEVBREVSUyB8fCAhSEFWRV9JU0FTQ0lJCisjICBkZWZpbmUgaXNfYXNjaWkoYykgMQorI2Vsc2UKKyMgIGRlZmluZSBpc19hc2NpaShjKSBpc2FzY2lpKGMpCisjZW5kaWYKKworI2RlZmluZSBpc19zcGFjZShjKSAoaXNfYXNjaWkoYykgJiYgaXNzcGFjZShjKSkKKyNkZWZpbmUgaXNfYWxwaGEoYykgKGlzX2FzY2lpKGMpICYmIGlzYWxwaGEoYykpCisjZGVmaW5lIGlzX2FsbnVtKGMpIChpc19hc2NpaShjKSAmJiBpc2FsbnVtKGMpKQorCisvKiBTY2FubmluZyBtYWNyb3MgKi8KKyNkZWZpbmUgaXNpZGNoYXIoY2gpIChpc19hbG51bShjaCkgfHwgKGNoKSA9PSAnXycpCisjZGVmaW5lIGlzaWRmaXJzdGNoYXIoY2gpIChpc19hbHBoYShjaCkgfHwgKGNoKSA9PSAnXycpCisKKy8qIEZvcndhcmQgcmVmZXJlbmNlcyAqLworY2hhciAqc2tpcHNwYWNlKCk7CitpbnQgd3JpdGVibGFua3MoKTsKK2ludCB0ZXN0MSgpOworaW50IGNvbnZlcnQxKCk7CisKKy8qIFRoZSBtYWluIHByb2dyYW0gKi8KK2ludAorbWFpbihhcmdjLCBhcmd2KQorICAgIGludCBhcmdjOworICAgIGNoYXIgKmFyZ3ZbXTsKK3sJRklMRSAqaW4sICpvdXQ7CisjZGVmaW5lIGJ1ZnNpemUgNTAwMAkJCS8qIGFyYml0cmFyeSBzaXplICovCisJY2hhciAqYnVmOworCWNoYXIgKmxpbmU7CisJY2hhciAqbW9yZTsKKwkvKgorCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCBhbnNpMmtuciByZWNvZ25pemVkIGEgLS12YXJhcmdzIHN3aXRjaC4KKwkgKiBJZiB0aGlzIHN3aXRjaCB3YXMgc3VwcGxpZWQsIGFuc2kya25yIHdvdWxkIGF0dGVtcHQgdG8gY29udmVydAorCSAqIGEgLi4uIGFyZ3VtZW50IHRvIHZhX2FsaXN0IGFuZCB2YV9kY2w7IGlmIHRoaXMgc3dpdGNoIHdhcyBub3QKKwkgKiBzdXBwbGllZCwgYW5zaTJrbnIgd291bGQgc2ltcGx5IGRyb3AgYW55IHN1Y2ggYXJndW1lbnRzLgorCSAqIE5vdywgYW5zaTJrbnIgYWx3YXlzIGRvZXMgdGhpcyBjb252ZXJzaW9uLCBhbmQgd2Ugb25seQorCSAqIGNoZWNrIGZvciB0aGlzIHN3aXRjaCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlpbnQgY29udmVydF92YXJhcmdzID0gMTsKKworCWlmICggYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScgKQorCSAgewlpZiAoICFzdHJjbXAoYXJndlsxXSwgIi0tdmFyYXJncyIpICkKKwkJICB7CWNvbnZlcnRfdmFyYXJncyA9IDE7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCSAgfQorCQllbHNlCisJCSAgewlmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBzd2l0Y2g6ICVzXG4iLCBhcmd2WzFdKTsKKwkJCWV4aXQoMSk7CisJCSAgfQorCSAgfQorCXN3aXRjaCAoIGFyZ2MgKQorCSAgIHsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVzYWdlOiBhbnNpMmtuciBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV1cbiIpOworCQlleGl0KDApOworCWNhc2UgMjoKKwkJb3V0ID0gc3Rkb3V0OworCQlicmVhazsKKwljYXNlIDM6CisJCW91dCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7CisJCWlmICggb3V0ID09IE5VTEwgKQorCQkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOworCQkJZXhpdCgxKTsKKwkJICAgfQorCSAgIH0KKwlpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CisJaWYgKCBpbiA9PSBOVUxMICkKKwkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgYXJndlsxXSk7CisJCWV4aXQoMSk7CisJICAgfQorCWZwcmludGYob3V0LCAiI2xpbmUgMSBcIiVzXCJcbiIsIGFyZ3ZbMV0pOworCWJ1ZiA9IG1hbGxvYyhidWZzaXplKTsKKwlsaW5lID0gYnVmOworCXdoaWxlICggZmdldHMobGluZSwgKHVuc2lnbmVkKShidWYgKyBidWZzaXplIC0gbGluZSksIGluKSAhPSBOVUxMICkKKwkgICB7Cit0ZXN0OgkJbGluZSArPSBzdHJsZW4obGluZSk7CisJCXN3aXRjaCAoIHRlc3QxKGJ1ZikgKQorCQkgICB7CisJCWNhc2UgMjoJCQkvKiBhIGZ1bmN0aW9uIGhlYWRlciAqLworCQkJY29udmVydDEoYnVmLCBvdXQsIDEsIGNvbnZlcnRfdmFyYXJncyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgkJCS8qIGEgZnVuY3Rpb24gKi8KKwkJCS8qIENoZWNrIGZvciBhIHsgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUuICovCisJCQltb3JlID0gKytsaW5lOworZjoJCQlpZiAoIGxpbmUgPj0gYnVmICsgKGJ1ZnNpemUgLSAxKSApIC8qIG92ZXJmbG93IGNoZWNrICovCisJCQkgIGdvdG8gd2w7CisJCQlpZiAoIGZnZXRzKGxpbmUsICh1bnNpZ25lZCkoYnVmICsgYnVmc2l6ZSAtIGxpbmUpLCBpbikgPT0gTlVMTCApCisJCQkgIGdvdG8gd2w7CisJCQlzd2l0Y2ggKCAqc2tpcHNwYWNlKG1vcmUsIDEpICkKKwkJCSAgeworCQkJICBjYXNlICd7JzoKKwkJCSAgICAvKiBEZWZpbml0ZWx5IGEgZnVuY3Rpb24gaGVhZGVyLiAqLworCQkJICAgIGNvbnZlcnQxKGJ1Ziwgb3V0LCAwLCBjb252ZXJ0X3ZhcmFyZ3MpOworCQkJICAgIGZwdXRzKG1vcmUsIG91dCk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgMDoKKwkJCSAgICAvKiBUaGUgbmV4dCBsaW5lIHdhcyBibGFuayBvciBhIGNvbW1lbnQ6ICovCisJCQkgICAgLyoga2VlcCBzY2FubmluZyBmb3IgYSBub24tY29tbWVudC4gKi8KKwkJCSAgICBsaW5lICs9IHN0cmxlbihsaW5lKTsKKwkJCSAgICBnb3RvIGY7CisJCQkgIGRlZmF1bHQ6CisJCQkgICAgLyogYnVmIGlzbid0IGEgZnVuY3Rpb24gaGVhZGVyLCBidXQgKi8KKwkJCSAgICAvKiBtb3JlIG1pZ2h0IGJlLiAqLworCQkJICAgIGZwdXRzKGJ1Ziwgb3V0KTsKKwkJCSAgICBzdHJjcHkoYnVmLCBtb3JlKTsKKwkJCSAgICBsaW5lID0gYnVmOworCQkJICAgIGdvdG8gdGVzdDsKKwkJCSAgfQorCQkJYnJlYWs7CisJCWNhc2UgLTE6CQkvKiBtYXliZSB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiAqLworCQkJaWYgKCBsaW5lICE9IGJ1ZiArIChidWZzaXplIC0gMSkgKSAvKiBvdmVyZmxvdyBjaGVjayAqLworCQkJICBjb250aW51ZTsKKwkJCS8qIGZhbGxzIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoJCS8qIG5vdCBhIGZ1bmN0aW9uICovCit3bDoJCQlmcHV0cyhidWYsIG91dCk7CisJCQlicmVhazsKKwkJICAgfQorCQlsaW5lID0gYnVmOworCSAgIH0KKwlpZiAoIGxpbmUgIT0gYnVmICkKKwkgIGZwdXRzKGJ1Ziwgb3V0KTsKKwlmcmVlKGJ1Zik7CisJZmNsb3NlKG91dCk7CisJZmNsb3NlKGluKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2tpcCBvdmVyIHNwYWNlIGFuZCBjb21tZW50cywgaW4gZWl0aGVyIGRpcmVjdGlvbi4gKi8KK2NoYXIgKgorc2tpcHNwYWNlKHAsIGRpcikKKyAgICByZWdpc3RlciBjaGFyICpwOworICAgIHJlZ2lzdGVyIGludCBkaXI7CQkJLyogMSBmb3IgZm9yd2FyZCwgLTEgZm9yIGJhY2t3YXJkICovCit7CWZvciAoIDsgOyApCisJICAgewl3aGlsZSAoIGlzX3NwYWNlKCpwKSApCisJCSAgcCArPSBkaXI7CisJCWlmICggISgqcCA9PSAnLycgJiYgcFtkaXJdID09ICcqJykgKQorCQkgIGJyZWFrOworCQlwICs9IGRpcjsgIHAgKz0gZGlyOworCQl3aGlsZSAoICEoKnAgPT0gJyonICYmIHBbZGlyXSA9PSAnLycpICkKKwkJICAgewlpZiAoICpwID09IDAgKQorCQkJICByZXR1cm4gcDsJLyogbXVsdGktbGluZSBjb21tZW50Pz8gKi8KKwkJCXAgKz0gZGlyOworCQkgICB9CisJCXAgKz0gZGlyOyAgcCArPSBkaXI7CisJICAgfQorCXJldHVybiBwOworfQorCisvKgorICogV3JpdGUgYmxhbmtzIG92ZXIgcGFydCBvZiBhIHN0cmluZy4KKyAqIERvbid0IG92ZXJ3cml0ZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLgorICovCitpbnQKK3dyaXRlYmxhbmtzKHN0YXJ0LCBlbmQpCisgICAgY2hhciAqc3RhcnQ7CisgICAgY2hhciAqZW5kOworewljaGFyICpwOworCWZvciAoIHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrICkKKwkgIGlmICggKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nICkKKwkgICAgKnAgPSAnICc7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgdGhlIHN0cmluZyBpbiBidWYgaXMgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgorICogVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbmQvb3IgZW5kIHdpdGggYSBuZXdsaW5lLgorICogUmV0dXJuIGFzIGZvbGxvd3M6CisgKgkwIC0gZGVmaW5pdGVseSBub3QgYSBmdW5jdGlvbiBkZWZpbml0aW9uOworICoJMSAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBkZWZpbml0aW9uOworICoJMiAtIGRlZmluaXRlbHkgYSBmdW5jdGlvbiBwcm90b3R5cGUgKE5PVCBVU0VEKTsKKyAqCS0xIC0gbWF5IGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbiBkZWZpbml0aW9uLAorICoJCWFwcGVuZCBhbm90aGVyIGxpbmUgYW5kIGxvb2sgYWdhaW4uCisgKiBUaGUgcmVhc29uIHdlIGRvbid0IGF0dGVtcHQgdG8gY29udmVydCBmdW5jdGlvbiBwcm90b3R5cGVzIGlzIHRoYXQKKyAqIEdob3N0c2NyaXB0J3MgZGVjbGFyYXRpb24tZ2VuZXJhdGluZyBtYWNyb3MgbG9vayB0b28gbXVjaCBsaWtlCisgKiBwcm90b3R5cGVzLCBhbmQgY29uZnVzZSB0aGUgYWxnb3JpdGhtcy4KKyAqLworaW50Cit0ZXN0MShidWYpCisgICAgY2hhciAqYnVmOworewlyZWdpc3RlciBjaGFyICpwID0gYnVmOworCWNoYXIgKmJlbmQ7CisJY2hhciAqZW5kZm47CisJaW50IGNvbnRpbjsKKworCWlmICggIWlzaWRmaXJzdGNoYXIoKnApICkKKwkgIHJldHVybiAwOwkJLyogbm8gbmFtZSBhdCBsZWZ0IG1hcmdpbiAqLworCWJlbmQgPSBza2lwc3BhY2UoYnVmICsgc3RybGVuKGJ1ZikgLSAxLCAtMSk7CisJc3dpdGNoICggKmJlbmQgKQorCSAgIHsKKwkgICBjYXNlICc7JzogY29udGluID0gMCAvKjIqLzsgYnJlYWs7CisJICAgY2FzZSAnKSc6IGNvbnRpbiA9IDE7IGJyZWFrOworCSAgIGNhc2UgJ3snOiByZXR1cm4gMDsJCS8qIG5vdCBhIGZ1bmN0aW9uICovCisJICAgY2FzZSAnfSc6IHJldHVybiAwOwkJLyogbm90IGEgZnVuY3Rpb24gKi8KKwkgICBkZWZhdWx0OiBjb250aW4gPSAtMTsKKwkgICB9CisJd2hpbGUgKCBpc2lkY2hhcigqcCkgKQorCSAgcCsrOworCWVuZGZuID0gcDsKKwlwID0gc2tpcHNwYWNlKHAsIDEpOworCWlmICggKnArKyAhPSAnKCcgKQorCSAgcmV0dXJuIDA7CQkvKiBub3QgYSBmdW5jdGlvbiAqLworCXAgPSBza2lwc3BhY2UocCwgMSk7CisJaWYgKCAqcCA9PSAnKScgKQorCSAgcmV0dXJuIDA7CQkvKiBubyBwYXJhbWV0ZXJzICovCisJLyogQ2hlY2sgdGhhdCB0aGUgYXBwYXJlbnQgZnVuY3Rpb24gbmFtZSBpc24ndCBhIGtleXdvcmQuICovCisJLyogV2Ugb25seSBuZWVkIHRvIGNoZWNrIGZvciBrZXl3b3JkcyB0aGF0IGNvdWxkIGJlIGZvbGxvd2VkICovCisJLyogYnkgYSBsZWZ0IHBhcmVudGhlc2lzICh3aGljaCwgdW5mb3J0dW5hdGVseSwgaXMgbW9zdCBvZiB0aGVtKS4gKi8KKwkgICB7CXN0YXRpYyBjaGFyICp3b3Jkc1tdID0KKwkJICAgewkiYXNtIiwgImF1dG8iLCAiY2FzZSIsICJjaGFyIiwgImNvbnN0IiwgImRvdWJsZSIsCisJCQkiZXh0ZXJuIiwgImZsb2F0IiwgImZvciIsICJpZiIsICJpbnQiLCAibG9uZyIsCisJCQkicmVnaXN0ZXIiLCAicmV0dXJuIiwgInNob3J0IiwgInNpZ25lZCIsICJzaXplb2YiLAorCQkJInN0YXRpYyIsICJzd2l0Y2giLCAidHlwZWRlZiIsICJ1bnNpZ25lZCIsCisJCQkidm9pZCIsICJ2b2xhdGlsZSIsICJ3aGlsZSIsIDAKKwkJICAgfTsKKwkJY2hhciAqKmtleSA9IHdvcmRzOworCQljaGFyICprcDsKKwkJaW50IGxlbiA9IGVuZGZuIC0gYnVmOworCisJCXdoaWxlICggKGtwID0gKmtleSkgIT0gMCApCisJCSAgIHsJaWYgKCBzdHJsZW4oa3ApID09IGxlbiAmJiAhc3RybmNtcChrcCwgYnVmLCBsZW4pICkKKwkJCSAgcmV0dXJuIDA7CS8qIG5hbWUgaXMgYSBrZXl3b3JkICovCisJCQlrZXkrKzsKKwkJICAgfQorCSAgIH0KKwlyZXR1cm4gY29udGluOworfQorCisvKiBDb252ZXJ0IGEgcmVjb2duaXplZCBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGhlYWRlciB0byBLJlIgc3ludGF4LiAqLworaW50Citjb252ZXJ0MShidWYsIG91dCwgaGVhZGVyLCBjb252ZXJ0X3ZhcmFyZ3MpCisgICAgY2hhciAqYnVmOworICAgIEZJTEUgKm91dDsKKyAgICBpbnQgaGVhZGVyOwkJCS8qIEJvb2xlYW4gKi8KKyAgICBpbnQgY29udmVydF92YXJhcmdzOwkvKiBCb29sZWFuICovCit7CWNoYXIgKmVuZGZuOworCXJlZ2lzdGVyIGNoYXIgKnA7CisJY2hhciAqKmJyZWFrczsKKwl1bnNpZ25lZCBudW1fYnJlYWtzID0gMjsJLyogZm9yIHRlc3RpbmcgKi8KKwljaGFyICoqYnRvcDsKKwljaGFyICoqYnA7CisJY2hhciAqKmFwOworCWNoYXIgKnZhcmFyZyA9IDA7CisKKwkvKiBQcmUtQU5TSSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWdyZWUgb24gd2hldGhlciBzdHJjaHIgKi8KKwkvKiBpcyBjYWxsZWQgc3RyY2hyIG9yIGluZGV4LCBzbyB3ZSBvcGVuLWNvZGUgaXQgaGVyZS4gKi8KKwlmb3IgKCBlbmRmbiA9IGJ1ZjsgKihlbmRmbisrKSAhPSAnKCc7ICkKKwkgIDsKK3RvcDoJcCA9IGVuZGZuOworCWJyZWFrcyA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqIG51bV9icmVha3MgKiAyKTsKKwlpZiAoIGJyZWFrcyA9PSAwICkKKwkgICB7CS8qIENvdWxkbid0IGFsbG9jYXRlIGJyZWFrIHRhYmxlLCBnaXZlIHVwICovCisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJyZWFrIHRhYmxlIVxuIik7CisJCWZwdXRzKGJ1Ziwgb3V0KTsKKwkJcmV0dXJuIC0xOworCSAgIH0KKwlidG9wID0gYnJlYWtzICsgbnVtX2JyZWFrcyAqIDIgLSAyOworCWJwID0gYnJlYWtzOworCS8qIFBhcnNlIHRoZSBhcmd1bWVudCBsaXN0ICovCisJZG8KKwkgICB7CWludCBsZXZlbCA9IDA7CisJCWNoYXIgKmxwID0gTlVMTDsKKwkJY2hhciAqcnA7CisJCWNoYXIgKmVuZCA9IE5VTEw7CisKKwkJaWYgKCBicCA+PSBidG9wICkKKwkJICAgewkvKiBGaWxsZWQgdXAgYnJlYWsgdGFibGUuICovCisJCQkvKiBBbGxvY2F0ZSBhIGJpZ2dlciBvbmUgYW5kIHN0YXJ0IG92ZXIuICovCisJCQlmcmVlKChjaGFyICopYnJlYWtzKTsKKwkJCW51bV9icmVha3MgPDw9IDE7CisJCQlnb3RvIHRvcDsKKwkJICAgfQorCQkqYnArKyA9IHA7CisJCS8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgKi8KKwkJZm9yICggOyBlbmQgPT0gTlVMTDsgcCsrICkKKwkJICAgewlzd2l0Y2goKnApCisJCQkgICB7CisJCQkgICBjYXNlICcsJzoKKwkJCQlpZiAoICFsZXZlbCApIGVuZCA9IHA7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlICcoJzoKKwkJCQlpZiAoICFsZXZlbCApIGxwID0gcDsKKwkJCQlsZXZlbCsrOworCQkJCWJyZWFrOworCQkJICAgY2FzZSAnKSc6CisJCQkJaWYgKCAtLWxldmVsIDwgMCApIGVuZCA9IHA7CisJCQkJZWxzZSBycCA9IHA7CisJCQkJYnJlYWs7CisJCQkgICBjYXNlICcvJzoKKwkJCQlwID0gc2tpcHNwYWNlKHAsIDEpIC0gMTsKKwkJCQlicmVhazsKKwkJCSAgIGRlZmF1bHQ6CisJCQkJOworCQkJICAgfQorCQkgICB9CisJCS8qIEVyYXNlIGFueSBlbWJlZGRlZCBwcm90b3R5cGUgcGFyYW1ldGVycy4gKi8KKwkJaWYgKCBscCApCisJCSAgd3JpdGVibGFua3MobHAgKyAxLCBycCk7CisJCXAtLTsJCQkvKiBiYWNrIHVwIG92ZXIgdGVybWluYXRvciAqLworCQkvKiBGaW5kIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkLiAqLworCQkvKiBUaGlzIGlzIGNvbXBsaWNhdGVkIGJlY2F1c2Ugb2YgcHJvY2VkdXJlIGFuZCAqLworCQkvKiBhcnJheSBtb2RpZmllcnMuICovCisJCWZvciAoIDsgOyApCisJCSAgIHsJcCA9IHNraXBzcGFjZShwIC0gMSwgLTEpOworCQkJc3dpdGNoICggKnAgKQorCQkJICAgeworCQkJICAgY2FzZSAnXSc6CS8qIHNraXAgYXJyYXkgZGltZW5zaW9uKHMpICovCisJCQkgICBjYXNlICcpJzoJLyogc2tpcCBwcm9jZWR1cmUgYXJncyBPUiBuYW1lICovCisJCQkgICB7CWludCBsZXZlbCA9IDE7CisJCQkJd2hpbGUgKCBsZXZlbCApCisJCQkJIHN3aXRjaCAoICotLXAgKQorCQkJCSAgIHsKKwkJCQkgICBjYXNlICddJzogY2FzZSAnKSc6IGxldmVsKys7IGJyZWFrOworCQkJCSAgIGNhc2UgJ1snOiBjYXNlICcoJzogbGV2ZWwtLTsgYnJlYWs7CisJCQkJICAgY2FzZSAnLyc6IHAgPSBza2lwc3BhY2UocCwgLTEpICsgMTsgYnJlYWs7CisJCQkJICAgZGVmYXVsdDogOworCQkJCSAgIH0KKwkJCSAgIH0KKwkJCQlpZiAoICpwID09ICcoJyAmJiAqc2tpcHNwYWNlKHAgKyAxLCAxKSA9PSAnKicgKQorCQkJCSAgIHsJLyogV2UgZm91bmQgdGhlIG5hbWUgYmVpbmcgZGVjbGFyZWQgKi8KKwkJCQkJd2hpbGUgKCAhaXNpZGZpcnN0Y2hhcigqcCkgKQorCQkJCQkgIHAgPSBza2lwc3BhY2UocCwgMSkgKyAxOworCQkJCQlnb3RvIGZvdW5kOworCQkJCSAgIH0KKwkJCQlicmVhazsKKwkJCSAgIGRlZmF1bHQ6CisJCQkJZ290byBmb3VuZDsKKwkJCSAgIH0KKwkJICAgfQorZm91bmQ6CQlpZiAoICpwID09ICcuJyAmJiBwWy0xXSA9PSAnLicgJiYgcFstMl0gPT0gJy4nICkKKwkJICB7CWlmICggY29udmVydF92YXJhcmdzICkKKwkJCSAgewkqYnArKyA9ICJ2YV9hbGlzdCI7CisJCQkJdmFyYXJnID0gcC0yOworCQkJICB9CisJCQllbHNlCisJCQkgIHsJcCsrOworCQkJCWlmICggYnAgPT0gYnJlYWtzICsgMSApCS8qIHNvbGUgYXJndW1lbnQgKi8KKwkJCQkgIHdyaXRlYmxhbmtzKGJyZWFrc1swXSwgcCk7CisJCQkJZWxzZQorCQkJCSAgd3JpdGVibGFua3MoYnBbLTFdIC0gMSwgcCk7CisJCQkJYnAtLTsKKwkJCSAgfQorCQkgICB9CisJCWVsc2UKKwkJICAgewl3aGlsZSAoIGlzaWRjaGFyKCpwKSApIHAtLTsKKwkJCSpicCsrID0gcCsxOworCQkgICB9CisJCXAgPSBlbmQ7CisJICAgfQorCXdoaWxlICggKnArKyA9PSAnLCcgKTsKKwkqYnAgPSBwOworCS8qIE1ha2UgYSBzcGVjaWFsIGNoZWNrIGZvciAndm9pZCcgYXJnbGlzdCAqLworCWlmICggYnAgPT0gYnJlYWtzKzIgKQorCSAgIHsJcCA9IHNraXBzcGFjZShicmVha3NbMF0sIDEpOworCQlpZiAoICFzdHJuY21wKHAsICJ2b2lkIiwgNCkgKQorCQkgICB7CXAgPSBza2lwc3BhY2UocCs0LCAxKTsKKwkJCWlmICggcCA9PSBicmVha3NbMl0gLSAxICkKKwkJCSAgIHsJYnAgPSBicmVha3M7CS8qIHl1cCwgcHJldGVuZCBhcmdsaXN0IGlzIGVtcHR5ICovCisJCQkJd3JpdGVibGFua3MoYnJlYWtzWzBdLCBwICsgMSk7CisJCQkgICB9CisJCSAgIH0KKwkgICB9CisJLyogUHV0IG91dCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgbGVmdCBwYXJlbnRoZXNpcy4gKi8KKwlwID0gYnVmOworCXdoaWxlICggcCAhPSBlbmRmbiApIHB1dGMoKnAsIG91dCksIHArKzsKKwkvKiBQdXQgb3V0IHRoZSBkZWNsYXJhdGlvbi4gKi8KKwlpZiAoIGhlYWRlciApCisJICB7CWZwdXRzKCIpOyIsIG91dCk7CisJCWZvciAoIHAgPSBicmVha3NbMF07ICpwOyBwKysgKQorCQkgIGlmICggKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nICkKKwkJICAgIHB1dGMoKnAsIG91dCk7CisJICB9CisJZWxzZQorCSAgewlmb3IgKCBhcCA9IGJyZWFrcysxOyBhcCA8IGJwOyBhcCArPSAyICkKKwkJICB7CXAgPSAqYXA7CisJCQl3aGlsZSAoIGlzaWRjaGFyKCpwKSApCisJCQkgIHB1dGMoKnAsIG91dCksIHArKzsKKwkJCWlmICggYXAgPCBicCAtIDEgKQorCQkJICBmcHV0cygiLCAiLCBvdXQpOworCQkgIH0KKwkJZnB1dHMoIikgICIsIG91dCk7CisJCS8qIFB1dCBvdXQgdGhlIGFyZ3VtZW50IGRlY2xhcmF0aW9ucyAqLworCQlmb3IgKCBhcCA9IGJyZWFrcysyOyBhcCA8PSBicDsgYXAgKz0gMiApCisJCSAgKCphcClbLTFdID0gJzsnOworCQlpZiAoIHZhcmFyZyAhPSAwICkKKwkJICB7CSp2YXJhcmcgPSAwOworCQkJZnB1dHMoYnJlYWtzWzBdLCBvdXQpOwkJLyogYW55IHByaW9yIGFyZ3MgKi8KKwkJCWZwdXRzKCJ2YV9kY2wiLCBvdXQpOwkJLyogdGhlIGZpbmFsIGFyZyAqLworCQkJZnB1dHMoYnBbMF0sIG91dCk7CisJCSAgfQorCQllbHNlCisJCSAgZnB1dHMoYnJlYWtzWzBdLCBvdXQpOworCSAgfQorCWZyZWUoKGNoYXIgKilicmVha3MpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY2RlcnJvci5oIGIvY2RlcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDM1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jZGVycm9yLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBjZGVycm9yLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBlcnJvciBhbmQgbWVzc2FnZSBjb2RlcyBmb3IgdGhlIGNqcGVnL2RqcGVnCisgKiBhcHBsaWNhdGlvbnMuICBUaGVzZSBzdHJpbmdzIGFyZSBub3QgbmVlZGVkIGFzIHBhcnQgb2YgdGhlIEpQRUcgbGlicmFyeQorICogcHJvcGVyLgorICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KKyAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCisgKi8KKworLyoKKyAqIFRvIGRlZmluZSB0aGUgZW51bSBsaXN0IG9mIG1lc3NhZ2UgY29kZXMsIGluY2x1ZGUgdGhpcyBmaWxlIHdpdGhvdXQKKyAqIGRlZmluaW5nIG1hY3JvIEpNRVNTQUdFLiAgVG8gY3JlYXRlIGEgbWVzc2FnZSBzdHJpbmcgdGFibGUsIGluY2x1ZGUgaXQKKyAqIGFnYWluIHdpdGggYSBzdWl0YWJsZSBKTUVTU0FHRSBkZWZpbml0aW9uIChzZWUgamVycm9yLmMgZm9yIGFuIGV4YW1wbGUpLgorICovCisjaWZuZGVmIEpNRVNTQUdFCisjaWZuZGVmIENERVJST1JfSAorI2RlZmluZSBDREVSUk9SX0gKKy8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgZGVmaW5lIHRoZSBlbnVtIGxpc3QgKi8KKyNkZWZpbmUgSk1BS0VfRU5VTV9MSVNUCisjZWxzZQorLyogUmVwZWF0ZWQgaW5jbHVzaW9ucyBvZiB0aGlzIGZpbGUgYXJlIG5vLW9wcyB1bmxlc3MgSk1FU1NBR0UgaXMgZGVmaW5lZCAqLworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykKKyNlbmRpZiAvKiBDREVSUk9SX0ggKi8KKyNlbmRpZiAvKiBKTUVTU0FHRSAqLworCisjaWZkZWYgSk1BS0VfRU5VTV9MSVNUCisKK3R5cGVkZWYgZW51bSB7CisKKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCWNvZGUgLAorCisjZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCisKK0pNRVNTQUdFKEpNU0dfRklSU1RBRERPTkNPREU9MTAwMCwgTlVMTCkgLyogTXVzdCBiZSBmaXJzdCBlbnRyeSEgKi8KKworI2lmZGVmIEJNUF9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfQk1QX0JBRENNQVAsICJVbnN1cHBvcnRlZCBCTVAgY29sb3JtYXAgZm9ybWF0IikKK0pNRVNTQUdFKEpFUlJfQk1QX0JBRERFUFRILCAiT25seSA4LSBhbmQgMjQtYml0IEJNUCBmaWxlcyBhcmUgc3VwcG9ydGVkIikKK0pNRVNTQUdFKEpFUlJfQk1QX0JBREhFQURFUiwgIkludmFsaWQgQk1QIGZpbGU6IGJhZCBoZWFkZXIgbGVuZ3RoIikKK0pNRVNTQUdFKEpFUlJfQk1QX0JBRFBMQU5FUywgIkludmFsaWQgQk1QIGZpbGU6IGJpUGxhbmVzIG5vdCBlcXVhbCB0byAxIikKK0pNRVNTQUdFKEpFUlJfQk1QX0NPTE9SU1BBQ0UsICJCTVAgb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCitKTUVTU0FHRShKRVJSX0JNUF9DT01QUkVTU0VELCAiU29ycnksIGNvbXByZXNzZWQgQk1QcyBub3QgeWV0IHN1cHBvcnRlZCIpCitKTUVTU0FHRShKRVJSX0JNUF9OT1QsICJOb3QgYSBCTVAgZmlsZSAtIGRvZXMgbm90IHN0YXJ0IHdpdGggQk0iKQorSk1FU1NBR0UoSlRSQ19CTVAsICIldXgldSAyNC1iaXQgQk1QIGltYWdlIikKK0pNRVNTQUdFKEpUUkNfQk1QX01BUFBFRCwgIiV1eCV1IDgtYml0IGNvbG9ybWFwcGVkIEJNUCBpbWFnZSIpCitKTUVTU0FHRShKVFJDX0JNUF9PUzIsICIldXgldSAyNC1iaXQgT1MyIEJNUCBpbWFnZSIpCitKTUVTU0FHRShKVFJDX0JNUF9PUzJfTUFQUEVELCAiJXV4JXUgOC1iaXQgY29sb3JtYXBwZWQgT1MyIEJNUCBpbWFnZSIpCisjZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLworCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorSk1FU1NBR0UoSkVSUl9HSUZfQlVHLCAiR0lGIG91dHB1dCBnb3QgY29uZnVzZWQiKQorSk1FU1NBR0UoSkVSUl9HSUZfQ09ERVNJWkUsICJCb2d1cyBHSUYgY29kZXNpemUgJWQiKQorSk1FU1NBR0UoSkVSUl9HSUZfQ09MT1JTUEFDRSwgIkdJRiBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKK0pNRVNTQUdFKEpFUlJfR0lGX0lNQUdFTk9URk9VTkQsICJUb28gZmV3IGltYWdlcyBpbiBHSUYgZmlsZSIpCitKTUVTU0FHRShKRVJSX0dJRl9OT1QsICJOb3QgYSBHSUYgZmlsZSIpCitKTUVTU0FHRShKVFJDX0dJRiwgIiV1eCV1eCVkIEdJRiBpbWFnZSIpCitKTUVTU0FHRShKVFJDX0dJRl9CQURWRVJTSU9OLAorCSAiV2FybmluZzogdW5leHBlY3RlZCBHSUYgdmVyc2lvbiBudW1iZXIgJyVjJWMlYyciKQorSk1FU1NBR0UoSlRSQ19HSUZfRVhURU5TSU9OLCAiSWdub3JpbmcgR0lGIGV4dGVuc2lvbiBibG9jayBvZiB0eXBlIDB4JTAyeCIpCitKTUVTU0FHRShKVFJDX0dJRl9OT05TUVVBUkUsICJDYXV0aW9uOiBub25zcXVhcmUgcGl4ZWxzIGluIGlucHV0IikKK0pNRVNTQUdFKEpXUk5fR0lGX0JBRERBVEEsICJDb3JydXB0IGRhdGEgaW4gR0lGIGZpbGUiKQorSk1FU1NBR0UoSldSTl9HSUZfQ0hBUiwgIkJvZ3VzIGNoYXIgMHglMDJ4IGluIEdJRiBmaWxlLCBpZ25vcmluZyIpCitKTUVTU0FHRShKV1JOX0dJRl9FTkRDT0RFLCAiUHJlbWF0dXJlIGVuZCBvZiBHSUYgaW1hZ2UiKQorSk1FU1NBR0UoSldSTl9HSUZfTk9NT1JFREFUQSwgIlJhbiBvdXQgb2YgR0lGIGJpdHMiKQorI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBQTV9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfUFBNX0NPTE9SU1BBQ0UsICJQUE0gb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCitKTUVTU0FHRShKRVJSX1BQTV9OT05OVU1FUklDLCAiTm9ubnVtZXJpYyBkYXRhIGluIFBQTSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfUFBNX05PVCwgIk5vdCBhIFBQTS9QR00gZmlsZSIpCitKTUVTU0FHRShKVFJDX1BHTSwgIiV1eCV1IFBHTSBpbWFnZSIpCitKTUVTU0FHRShKVFJDX1BHTV9URVhULCAiJXV4JXUgdGV4dCBQR00gaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19QUE0sICIldXgldSBQUE0gaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19QUE1fVEVYVCwgIiV1eCV1IHRleHQgUFBNIGltYWdlIikKKyNlbmRpZiAvKiBQUE1fU1VQUE9SVEVEICovCisKKyNpZmRlZiBSTEVfU1VQUE9SVEVECitKTUVTU0FHRShKRVJSX1JMRV9CQURFUlJPUiwgIkJvZ3VzIGVycm9yIGNvZGUgZnJvbSBSTEUgbGlicmFyeSIpCitKTUVTU0FHRShKRVJSX1JMRV9DT0xPUlNQQUNFLCAiUkxFIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQorSk1FU1NBR0UoSkVSUl9STEVfRElNRU5TSU9OUywgIkltYWdlIGRpbWVuc2lvbnMgKCV1eCV1KSB0b28gbGFyZ2UgZm9yIFJMRSIpCitKTUVTU0FHRShKRVJSX1JMRV9FTVBUWSwgIkVtcHR5IFJMRSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfUkxFX0VPRiwgIlByZW1hdHVyZSBFT0YgaW4gUkxFIGhlYWRlciIpCitKTUVTU0FHRShKRVJSX1JMRV9NRU0sICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBSTEUgaGVhZGVyIikKK0pNRVNTQUdFKEpFUlJfUkxFX05PVCwgIk5vdCBhbiBSTEUgZmlsZSIpCitKTUVTU0FHRShKRVJSX1JMRV9UT09NQU5ZQ0hBTk5FTFMsICJDYW5ub3QgaGFuZGxlICVkIG91dHB1dCBjaGFubmVscyBmb3IgUkxFIikKK0pNRVNTQUdFKEpFUlJfUkxFX1VOU1VQUE9SVEVELCAiQ2Fubm90IGhhbmRsZSB0aGlzIFJMRSBzZXR1cCIpCitKTUVTU0FHRShKVFJDX1JMRSwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUiKQorSk1FU1NBR0UoSlRSQ19STEVfRlVMTE1BUCwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKK0pNRVNTQUdFKEpUUkNfUkxFX0dSQVksICIldXgldSBncmF5c2NhbGUgUkxFIGZpbGUiKQorSk1FU1NBR0UoSlRSQ19STEVfTUFQR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBSTEUgZmlsZSB3aXRoIG1hcCBvZiBsZW5ndGggJWQiKQorSk1FU1NBR0UoSlRSQ19STEVfTUFQUEVELCAiJXV4JXUgY29sb3JtYXBwZWQgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKKyNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCisKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfVEdBX0JBRENNQVAsICJVbnN1cHBvcnRlZCBUYXJnYSBjb2xvcm1hcCBmb3JtYXQiKQorSk1FU1NBR0UoSkVSUl9UR0FfQkFEUEFSTVMsICJJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIFRhcmdhIGZpbGUiKQorSk1FU1NBR0UoSkVSUl9UR0FfQ09MT1JTUEFDRSwgIlRhcmdhIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQorSk1FU1NBR0UoSlRSQ19UR0EsICIldXgldSBSR0IgVGFyZ2EgaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19UR0FfR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBUYXJnYSBpbWFnZSIpCitKTUVTU0FHRShKVFJDX1RHQV9NQVBQRUQsICIldXgldSBjb2xvcm1hcHBlZCBUYXJnYSBpbWFnZSIpCisjZWxzZQorSk1FU1NBR0UoSkVSUl9UR0FfTk9UQ09NUCwgIlRhcmdhIHN1cHBvcnQgd2FzIG5vdCBjb21waWxlZCIpCisjZW5kaWYgLyogVEFSR0FfU1VQUE9SVEVEICovCisKK0pNRVNTQUdFKEpFUlJfQkFEX0NNQVBfRklMRSwKKwkgIkNvbG9yIG1hcCBmaWxlIGlzIGludmFsaWQgb3Igb2YgdW5zdXBwb3J0ZWQgZm9ybWF0IikKK0pNRVNTQUdFKEpFUlJfVE9PX01BTllfQ09MT1JTLAorCSAiT3V0cHV0IGZpbGUgZm9ybWF0IGNhbm5vdCBoYW5kbGUgJWQgY29sb3JtYXAgZW50cmllcyIpCitKTUVTU0FHRShKRVJSX1VOR0VUQ19GQUlMRUQsICJ1bmdldGMgZmFpbGVkIikKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfVU5LTk9XTl9GT1JNQVQsCisJICJVbnJlY29nbml6ZWQgaW5wdXQgZmlsZSBmb3JtYXQgLS0tIHBlcmhhcHMgeW91IG5lZWQgLXRhcmdhIikKKyNlbHNlCitKTUVTU0FHRShKRVJSX1VOS05PV05fRk9STUFULCAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgZm9ybWF0IikKKyNlbmRpZgorSk1FU1NBR0UoSkVSUl9VTlNVUFBPUlRFRF9GT1JNQVQsICJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQiKQorCisjaWZkZWYgSk1BS0VfRU5VTV9MSVNUCisKKyAgSk1TR19MQVNUQURET05DT0RFCit9IEFERE9OX01FU1NBR0VfQ09ERTsKKworI3VuZGVmIEpNQUtFX0VOVU1fTElTVAorI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLworCisvKiBaYXAgSk1FU1NBR0UgbWFjcm8gc28gdGhhdCBmdXR1cmUgcmUtaW5jbHVzaW9ucyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQgKi8KKyN1bmRlZiBKTUVTU0FHRQpkaWZmIC0tZ2l0IGEvY2RqcGVnLmMgYi9jZGpwZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjI1MGZmCi0tLSAvZGV2L251bGwKKysrIGIvY2RqcGVnLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBjZGpwZWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBzdXBwb3J0IHJvdXRpbmVzIHVzZWQgYnkgdGhlIElKRyBhcHBsaWNhdGlvbgorICogcHJvZ3JhbXMgKGNqcGVnLCBkanBlZywganBlZ3RyYW4pLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXN1cHBlcigpLCB0b2xvd2VyKCkgKi8KKyNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjaW5jbHVkZSA8c2lnbmFsLmg+CQkvKiB0byBkZWNsYXJlIHNpZ25hbCgpICovCisjZW5kaWYKKyNpZmRlZiBVU0VfU0VUTU9ERQorI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSdzIHBhcmFtZXRlciBtYWNyb3MgKi8KKy8qIElmIHlvdSBoYXZlIHNldG1vZGUoKSBidXQgbm90IDxpby5oPiwganVzdCBkZWxldGUgdGhpcyBsaW5lOiAqLworI2luY2x1ZGUgPGlvLmg+CQkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkgKi8KKyNlbmRpZgorCisKKy8qCisgKiBTaWduYWwgY2F0Y2hlciB0byBlbnN1cmUgdGhhdCB0ZW1wb3JhcnkgZmlsZXMgYXJlIHJlbW92ZWQgYmVmb3JlIGFib3J0aW5nLgorICogTkI6IGZvciBBbWlnYSBNYW54IEMgdGhpcyBpcyBhY3R1YWxseSBhIGdsb2JhbCByb3V0aW5lIG5hbWVkIF9hYm9ydCgpOworICogd2UgcHV0ICIjZGVmaW5lIHNpZ25hbF9jYXRjaGVyIF9hYm9ydCIgaW4gamNvbmZpZy5oLiAgVGFsayBhYm91dCBib2d1cy4uLgorICovCisKKyNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisKK3N0YXRpYyBqX2NvbW1vbl9wdHIgc2lnX2NpbmZvOworCit2b2lkCQkJCS8qIG11c3QgYmUgZ2xvYmFsIGZvciBNYW54IEMgKi8KK3NpZ25hbF9jYXRjaGVyIChpbnQgc2lnbnVtKQoreworICBpZiAoc2lnX2NpbmZvICE9IE5VTEwpIHsKKyAgICBpZiAoc2lnX2NpbmZvLT5lcnIgIT0gTlVMTCkgLyogdHVybiBvZmYgdHJhY2Ugb3V0cHV0ICovCisgICAgICBzaWdfY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAwOworICAgIGpwZWdfZGVzdHJveShzaWdfY2luZm8pOwkvKiBjbGVhbiB1cCBtZW1vcnkgYWxsb2NhdGlvbiAmIHRlbXAgZmlsZXMgKi8KKyAgfQorICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworR0xPQkFMKHZvaWQpCitlbmFibGVfc2lnbmFsX2NhdGNoZXIgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgc2lnX2NpbmZvID0gY2luZm87CisjaWZkZWYgU0lHSU5UCQkJLyogbm90IGFsbCBzeXN0ZW1zIGhhdmUgU0lHSU5UICovCisgIHNpZ25hbChTSUdJTlQsIHNpZ25hbF9jYXRjaGVyKTsKKyNlbmRpZgorI2lmZGVmIFNJR1RFUk0JCQkvKiBub3QgYWxsIHN5c3RlbXMgaGF2ZSBTSUdURVJNICovCisgIHNpZ25hbChTSUdURVJNLCBzaWduYWxfY2F0Y2hlcik7CisjZW5kaWYKK30KKworI2VuZGlmCisKKworLyoKKyAqIE9wdGlvbmFsIHByb2dyZXNzIG1vbml0b3I6IGRpc3BsYXkgYSBwZXJjZW50LWRvbmUgZmlndXJlIG9uIHN0ZGVyci4KKyAqLworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisKK01FVEhPRERFRih2b2lkKQorcHJvZ3Jlc3NfbW9uaXRvciAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBjZF9wcm9ncmVzc19wdHIgcHJvZyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyAgaW50IHRvdGFsX3Bhc3NlcyA9IHByb2ctPnB1Yi50b3RhbF9wYXNzZXMgKyBwcm9nLT50b3RhbF9leHRyYV9wYXNzZXM7CisgIGludCBwZXJjZW50X2RvbmUgPSAoaW50KSAocHJvZy0+cHViLnBhc3NfY291bnRlcioxMDBML3Byb2ctPnB1Yi5wYXNzX2xpbWl0KTsKKworICBpZiAocGVyY2VudF9kb25lICE9IHByb2ctPnBlcmNlbnRfZG9uZSkgeworICAgIHByb2ctPnBlcmNlbnRfZG9uZSA9IHBlcmNlbnRfZG9uZTsKKyAgICBpZiAodG90YWxfcGFzc2VzID4gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJcclBhc3MgJWQvJWQ6ICUzZCUlICIsCisJICAgICAgcHJvZy0+cHViLmNvbXBsZXRlZF9wYXNzZXMgKyBwcm9nLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzICsgMSwKKwkgICAgICB0b3RhbF9wYXNzZXMsIHBlcmNlbnRfZG9uZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXHIgJTNkJSUgIiwgcGVyY2VudF9kb25lKTsKKyAgICB9CisgICAgZmZsdXNoKHN0ZGVycik7CisgIH0KK30KKworCitHTE9CQUwodm9pZCkKK3N0YXJ0X3Byb2dyZXNzX21vbml0b3IgKGpfY29tbW9uX3B0ciBjaW5mbywgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzKQoreworICAvKiBFbmFibGUgcHJvZ3Jlc3MgZGlzcGxheSwgdW5sZXNzIHRyYWNlIG91dHB1dCBpcyBvbiAqLworICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPT0gMCkgeworICAgIHByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvciA9IHByb2dyZXNzX21vbml0b3I7CisgICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMgPSAwOworICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMgPSAwOworICAgIHByb2dyZXNzLT5wZXJjZW50X2RvbmUgPSAtMTsKKyAgICBjaW5mby0+cHJvZ3Jlc3MgPSAmcHJvZ3Jlc3MtPnB1YjsKKyAgfQorfQorCisKK0dMT0JBTCh2b2lkKQorZW5kX3Byb2dyZXNzX21vbml0b3IgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogQ2xlYXIgYXdheSBwcm9ncmVzcyBkaXNwbGF5ICovCisgIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9PSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJcciAgICAgICAgICAgICAgICBcciIpOworICAgIGZmbHVzaChzdGRlcnIpOworICB9Cit9CisKKyNlbmRpZgorCisKKy8qCisgKiBDYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nIG9mIHBvc3NpYmx5LWFiYnJldmlhdGVkIGtleXdvcmQgc3dpdGNoZXMuCisgKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksCisgKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitrZXltYXRjaCAoY2hhciAqIGFyZywgY29uc3QgY2hhciAqIGtleXdvcmQsIGludCBtaW5jaGFycykKK3sKKyAgcmVnaXN0ZXIgaW50IGNhLCBjazsKKyAgcmVnaXN0ZXIgaW50IG5tYXRjaGVkID0gMDsKKworICB3aGlsZSAoKGNhID0gKmFyZysrKSAhPSAnXDAnKSB7CisgICAgaWYgKChjayA9ICprZXl3b3JkKyspID09ICdcMCcpCisgICAgICByZXR1cm4gRkFMU0U7CQkvKiBhcmcgbG9uZ2VyIHRoYW4ga2V5d29yZCwgbm8gZ29vZCAqLworICAgIGlmIChpc3VwcGVyKGNhKSkJCS8qIGZvcmNlIGFyZyB0byBsY2FzZSAoYXNzdW1lIGNrIGlzIGFscmVhZHkpICovCisgICAgICBjYSA9IHRvbG93ZXIoY2EpOworICAgIGlmIChjYSAhPSBjaykKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIG5vIGdvb2QgKi8KKyAgICBubWF0Y2hlZCsrOwkJCS8qIGNvdW50IG1hdGNoZWQgY2hhcmFjdGVycyAqLworICB9CisgIC8qIHJlYWNoZWQgZW5kIG9mIGFyZ3VtZW50OyBmYWlsIGlmIGl0J3MgdG9vIHNob3J0IGZvciB1bmlxdWUgYWJicmV2ICovCisgIGlmIChubWF0Y2hlZCA8IG1pbmNoYXJzKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7CQkJLyogQS1PSyAqLworfQorCisKKy8qCisgKiBSb3V0aW5lcyB0byBlc3RhYmxpc2ggYmluYXJ5IEkvTyBtb2RlIGZvciBzdGRpbiBhbmQgc3Rkb3V0LgorICogTm9uLVVuaXggc3lzdGVtcyBvZnRlbiByZXF1aXJlIHNvbWUgaGFja2luZyB0byBnZXQgb3V0IG9mIHRleHQgbW9kZS4KKyAqLworCitHTE9CQUwoRklMRSAqKQorcmVhZF9zdGRpbiAodm9pZCkKK3sKKyAgRklMRSAqIGlucHV0X2ZpbGUgPSBzdGRpbjsKKworI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLworICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KKyAgaWYgKChpbnB1dF9maWxlID0gZmRvcGVuKGZpbGVubyhzdGRpbiksIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlb3BlbiBzdGRpblxuIik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIGlucHV0X2ZpbGU7Cit9CisKKworR0xPQkFMKEZJTEUgKikKK3dyaXRlX3N0ZG91dCAodm9pZCkKK3sKKyAgRklMRSAqIG91dHB1dF9maWxlID0gc3Rkb3V0OworCisjaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCisgIHNldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KKyAgaWYgKChvdXRwdXRfZmlsZSA9IGZkb3BlbihmaWxlbm8oc3Rkb3V0KSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlb3BlbiBzdGRvdXRcbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBvdXRwdXRfZmlsZTsKK30KZGlmZiAtLWdpdCBhL2NkanBlZy5oIGIvY2RqcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzODdiNgotLS0gL2Rldi9udWxsCisrKyBiL2NkanBlZy5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogY2RqcGVnLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucworICogY2pwZWcgYW5kIGRqcGVnLiAgSXQgaXMgTk9UIHVzZWQgYnkgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LgorICovCisKKyNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiBkZWZpbmUgcHJvcGVyIG9wdGlvbnMgaW4gamNvbmZpZy5oICovCisjZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUwkvKiBjanBlZy5jLGRqcGVnLmMgbmVlZCB0byBzZWUgeHh4X1NVUFBPUlRFRCAqLworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImplcnJvci5oIgkJLyogZ2V0IGxpYnJhcnkgZXJyb3IgY29kZXMgdG9vICovCisjaW5jbHVkZSAiY2RlcnJvci5oIgkJLyogZ2V0IGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIGNvZGVzICovCisKKworLyoKKyAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGNqcGVnJ3Mgc291cmNlIGZpbGUgZGVjb2RpbmcgbW9kdWxlcworICovCisKK3R5cGVkZWYgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgKiBjanBlZ19zb3VyY2VfcHRyOworCitzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKKyAgSk1FVEhPRChKRElNRU5TSU9OLCBnZXRfcGl4ZWxfcm93cywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkgICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOworCisgIEZJTEUgKmlucHV0X2ZpbGU7CisKKyAgSlNBTVBBUlJBWSBidWZmZXI7CisgIEpESU1FTlNJT04gYnVmZmVyX2hlaWdodDsKK307CisKKworLyoKKyAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGRqcGVnJ3Mgb3V0cHV0IGZpbGUgZW5jb2RpbmcgbW9kdWxlcworICovCisKK3R5cGVkZWYgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0ICogZGpwZWdfZGVzdF9wdHI7CisKK3N0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCB7CisgIC8qIHN0YXJ0X291dHB1dCBpcyBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzIGZpbmlzaGVzLgorICAgKiBUaGUgY29sb3IgbWFwIHdpbGwgYmUgcmVhZHkgYXQgdGhpcyB0aW1lLCBpZiBvbmUgaXMgbmVlZGVkLgorICAgKi8KKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAgIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKSk7CisgIC8qIEVtaXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGl4ZWwgcm93cyBmcm9tIHRoZSBidWZmZXIuICovCisgIEpNRVRIT0Qodm9pZCwgcHV0X3BpeGVsX3Jvd3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKSk7CisgIC8qIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KKyAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfb3V0cHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQlkanBlZ19kZXN0X3B0ciBkaW5mbykpOworCisgIC8qIFRhcmdldCBmaWxlIHNwZWM7IGZpbGxlZCBpbiBieSBkanBlZy5jIGFmdGVyIG9iamVjdCBpcyBjcmVhdGVkLiAqLworICBGSUxFICogb3V0cHV0X2ZpbGU7CisKKyAgLyogT3V0cHV0IHBpeGVsLXJvdyBidWZmZXIuICBDcmVhdGVkIGJ5IG1vZHVsZSBpbml0IG9yIHN0YXJ0X291dHB1dC4KKyAgICogV2lkdGggaXMgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKKyAgICogaGVpZ2h0IGlzIGJ1ZmZlcl9oZWlnaHQuCisgICAqLworICBKU0FNUEFSUkFZIGJ1ZmZlcjsKKyAgSkRJTUVOU0lPTiBidWZmZXJfaGVpZ2h0OworfTsKKworCisvKgorICogY2pwZWcvZGpwZWcgbWF5IG5lZWQgdG8gcGVyZm9ybSBleHRyYSBwYXNzZXMgdG8gY29udmVydCB0byBvciBmcm9tCisgKiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGZpbGUgZm9ybWF0LiAgVGhlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCBrbm93CisgKiBhYm91dCB0aGVzZSBwYXNzZXMsIGJ1dCB3ZSdkIGxpa2UgdGhlbSB0byBiZSBjb3VudGVkIGJ5IHRoZSBwcm9ncmVzcworICogbW9uaXRvci4gIFdlIHVzZSBhbiBleHBhbmRlZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdCB0byBob2xkIHRoZQorICogYWRkaXRpb25hbCBwYXNzIGNvdW50LgorICovCisKK3N0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHsKKyAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHB1YjsJLyogZmllbGRzIGtub3duIHRvIEpQRUcgbGlicmFyeSAqLworICBpbnQgY29tcGxldGVkX2V4dHJhX3Bhc3NlczsJLyogZXh0cmEgcGFzc2VzIGNvbXBsZXRlZCAqLworICBpbnQgdG90YWxfZXh0cmFfcGFzc2VzOwkvKiB0b3RhbCBleHRyYSAqLworICAvKiBsYXN0IHByaW50ZWQgcGVyY2VudGFnZSBzdG9yZWQgaGVyZSB0byBhdm9pZCBtdWx0aXBsZSBwcmludG91dHMgKi8KKyAgaW50IHBlcmNlbnRfZG9uZTsKK307CisKK3R5cGVkZWYgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgKiBjZF9wcm9ncmVzc19wdHI7CisKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGppbml0X3JlYWRfYm1wCQlqSVJkQk1QCisjZGVmaW5lIGppbml0X3dyaXRlX2JtcAkJaklXckJNUAorI2RlZmluZSBqaW5pdF9yZWFkX2dpZgkJaklSZEdJRgorI2RlZmluZSBqaW5pdF93cml0ZV9naWYJCWpJV3JHSUYKKyNkZWZpbmUgamluaXRfcmVhZF9wcG0JCWpJUmRQUE0KKyNkZWZpbmUgamluaXRfd3JpdGVfcHBtCQlqSVdyUFBNCisjZGVmaW5lIGppbml0X3JlYWRfcmxlCQlqSVJkUkxFCisjZGVmaW5lIGppbml0X3dyaXRlX3JsZQkJaklXclJMRQorI2RlZmluZSBqaW5pdF9yZWFkX3RhcmdhCWpJUmRUYXJnYQorI2RlZmluZSBqaW5pdF93cml0ZV90YXJnYQlqSVdyVGFyZ2EKKyNkZWZpbmUgcmVhZF9xdWFudF90YWJsZXMJUmRRVGFibGVzCisjZGVmaW5lIHJlYWRfc2Nhbl9zY3JpcHQJUmRTY25TY3JpcHQKKyNkZWZpbmUgc2V0X3F1YW50X3Nsb3RzCQlTZXRRU2xvdHMKKyNkZWZpbmUgc2V0X3NhbXBsZV9mYWN0b3JzCVNldFNGYWN0cworI2RlZmluZSByZWFkX2NvbG9yX21hcAkJUmRDTWFwCisjZGVmaW5lIGVuYWJsZV9zaWduYWxfY2F0Y2hlcglFblNpZ0NhdGNoZXIKKyNkZWZpbmUgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcglTdFByb2dNb24KKyNkZWZpbmUgZW5kX3Byb2dyZXNzX21vbml0b3IJRW5Qcm9nTW9uCisjZGVmaW5lIHJlYWRfc3RkaW4JCVJkU3RkaW4KKyNkZWZpbmUgd3JpdGVfc3Rkb3V0CQlXclN0ZG91dAorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworLyogTW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lcyBmb3IgSS9PIG1vZHVsZXMuICovCisKK0VYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX2JtcCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX2JtcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBib29sZWFuIGlzX29zMikpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfZ2lmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfZ2lmIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcHBtIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcHBtIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcmxlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfdGFyZ2EgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV90YXJnYSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogY2pwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRzd2l0Y2guYykgKi8KKworRVhURVJOKGJvb2xlYW4pIHJlYWRfcXVhbnRfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKKwkJCQkgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOworRVhURVJOKGJvb2xlYW4pIHJlYWRfc2Nhbl9zY3JpcHQgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lKSk7CitFWFRFUk4oYm9vbGVhbikgc2V0X3F1YW50X3Nsb3RzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykpOworRVhURVJOKGJvb2xlYW4pIHNldF9zYW1wbGVfZmFjdG9ycyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpKTsKKworLyogZGpwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRjb2xtYXAuYykgKi8KKworRVhURVJOKHZvaWQpIHJlYWRfY29sb3JfbWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkpOworCisvKiBjb21tb24gc3VwcG9ydCByb3V0aW5lcyAoaW4gY2RqcGVnLmMpICovCisKK0VYVEVSTih2b2lkKSBlbmFibGVfc2lnbmFsX2NhdGNoZXIgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBzdGFydF9wcm9ncmVzc19tb25pdG9yIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzKSk7CitFWFRFUk4odm9pZCkgZW5kX3Byb2dyZXNzX21vbml0b3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBrZXltYXRjaCBKUFAoKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpKTsKK0VYVEVSTihGSUxFICopIHJlYWRfc3RkaW4gSlBQKCh2b2lkKSk7CitFWFRFUk4oRklMRSAqKSB3cml0ZV9zdGRvdXQgSlBQKCh2b2lkKSk7CisKKy8qIG1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLworCisjaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyIgorI2RlZmluZSBXUklURV9CSU5BUlkJInciCisjZWxzZQorI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgorI2RlZmluZSBXUklURV9CSU5BUlkJIndiIiwgImN0eD1zdG0iCisjZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKKyNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLworI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKKyNlbmRpZgorI2lmbmRlZiBFWElUX1NVQ0NFU1MKKyNpZmRlZiBWTVMKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2Vsc2UKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAwCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBFWElUX1dBUk5JTkcKKyNpZmRlZiBWTVMKKyNkZWZpbmUgRVhJVF9XQVJOSU5HICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2Vsc2UKKyNkZWZpbmUgRVhJVF9XQVJOSU5HICAyCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2hhbmdlLmxvZyBiL2NoYW5nZS5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMDJjMAotLS0gL2Rldi9udWxsCisrKyBiL2NoYW5nZS5sb2cKQEAgLTAsMCArMSwyMTcgQEAKK0NIQU5HRSBMT0cgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCisKKworVmVyc2lvbiA2YiAgMjctTWFyLTE5OTgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2pwZWd0cmFuIGhhcyBuZXcgZmVhdHVyZXMgZm9yIGxvc3NsZXNzIGltYWdlIHRyYW5zZm9ybWF0aW9ucyAocm90YXRpb24KK2FuZCBmbGlwcGluZykgYXMgd2VsbCBhcyAibG9zc2xlc3MiIHJlZHVjdGlvbiB0byBncmF5c2NhbGUuCisKK2pwZWd0cmFuIG5vdyBjb3BpZXMgY29tbWVudHMgYnkgZGVmYXVsdDsgaXQgaGFzIGEgLWNvcHkgc3dpdGNoIHRvIGVuYWJsZQorY29weWluZyBhbGwgQVBQbiBibG9ja3MgYXMgd2VsbCwgb3IgdG8gc3VwcHJlc3MgY29tbWVudHMuICAoRm9ybWVybHkgaXQKK2Fsd2F5cyBzdXBwcmVzc2VkIGNvbW1lbnRzIGFuZCBBUFBuIGJsb2Nrcy4pICBqcGVndHJhbiBub3cgYWxzbyBwcmVzZXJ2ZXMKK0pGSUYgdmVyc2lvbiBhbmQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbi4KKworTmV3IGRlY29tcHJlc3NvciBsaWJyYXJ5IGZlYXR1cmU6IENPTSBhbmQgQVBQbiBtYXJrZXJzIGZvdW5kIGluIHRoZSBpbnB1dAorZmlsZSBjYW4gYmUgc2F2ZWQgaW4gbWVtb3J5IGZvciBsYXRlciB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uLiAgKEJlZm9yZSwKK3lvdSBoYWQgdG8gY29kZSB0aGlzIHVwIHlvdXJzZWxmIHdpdGggYSBjdXN0b20gbWFya2VyIHByb2Nlc3Nvci4pCisKK1RoZXJlIGlzIGFuIHVudXNlZCBmaWVsZCAidm9pZCAqIGNsaWVudF9kYXRhIiBub3cgaW4gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MKK3BhcmFtZXRlciBzdHJ1Y3RzOyB0aGlzIG1heSBiZSB1c2VmdWwgaW4gc29tZSBhcHBsaWNhdGlvbnMuCisKK0pGSUYgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gaXMgbm93IHNhdmVkIGJ5IHRoZSBkZWNvZGVyIGFuZCBhY2NlcHRlZCBieQordGhlIGVuY29kZXIuICBqcGVndHJhbiB1c2VzIHRoaXMgdG8gY29weSB0aGUgc291cmNlIGZpbGUncyB2ZXJzaW9uIG51bWJlciwKK3RvIGVuc3VyZSAianBlZ3RyYW4gLWNvcHkgYWxsIiB3b24ndCBjcmVhdGUgYm9ndXMgZmlsZXMgdGhhdCBjb250YWluIEpGWFgKK2V4dGVuc2lvbnMgYnV0IGNsYWltIHRvIGJlIHZlcnNpb24gMS4wMS4gIEFwcGxpY2F0aW9ucyB0aGF0IGdlbmVyYXRlIHRoZWlyCitvd24gSkZYWCBleHRlbnNpb24gbWFya2VycyBhbHNvIChmaW5hbGx5KSBoYXZlIGEgc3VwcG9ydGVkIHdheSB0byBjYXVzZSB0aGUKK2VuY29kZXIgdG8gZW1pdCBKRklGIHZlcnNpb24gbnVtYmVyIDEuMDIuCisKK2RqcGVnJ3MgdHJhY2UgbW9kZSByZXBvcnRzIEpGSUYgMS4wMiB0aHVtYm5haWwgaW1hZ2VzIGFzIHN1Y2gsIHJhdGhlcgordGhhbiBhcyB1bmtub3duIEFQUDAgbWFya2Vycy4KKworSW4gLXZlcmJvc2UgbW9kZSwgZGpwZWcgYW5kIHJkanBnY29tIHdpbGwgdHJ5IHRvIHByaW50IHRoZSBjb250ZW50cyBvZgorQVBQMTIgbWFya2VycyBhcyB0ZXh0LiAgU29tZSBkaWdpdGFsIGNhbWVyYXMgc3RvcmUgdXNlZnVsIHRleHQgaW5mb3JtYXRpb24KK2luIEFQUDEyIG1hcmtlcnMuCisKK0hhbmRsaW5nIG9mIHRydW5jYXRlZCBkYXRhIHN0cmVhbXMgaXMgbW9yZSByb2J1c3Q6IGJsb2NrcyBiZXlvbmQgdGhlIG9uZSBpbgord2hpY2ggdGhlIGVycm9yIG9jY3VycyB3aWxsIGJlIG91dHB1dCBhcyB1bmlmb3JtIGdyYXksIG9yIGxlZnQgdW5jaGFuZ2VkCitpZiBkZWNvZGluZyBhIHByb2dyZXNzaXZlIEpQRUcuICBUaGUgYXBwZWFyYW5jZSBubyBsb25nZXIgZGVwZW5kcyBvbiB0aGUKK0h1ZmZtYW4gdGFibGVzIGJlaW5nIHVzZWQuCisKK0h1ZmZtYW4gdGFibGVzIGFyZSBjaGVja2VkIGZvciB2YWxpZGl0eSBtdWNoIG1vcmUgY2FyZWZ1bGx5IHRoYW4gYmVmb3JlLgorCitUbyBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIGRqcGVnJ3MgR0lGIG91dHB1dCBjYXBhYmlsaXR5IGhhcyBiZWVuCitjaGFuZ2VkIHRvIHByb2R1Y2UgInVuY29tcHJlc3NlZCBHSUZzIiwgYW5kIGNqcGVnJ3MgR0lGIGlucHV0IGNhcGFiaWxpdHkKK2hhcyBiZWVuIHJlbW92ZWQgYWx0b2dldGhlci4gIFdlJ3JlIG5vdCBoYXBweSBhYm91dCBpdCBlaXRoZXIsIGJ1dCB0aGVyZQorc2VlbXMgdG8gYmUgbm8gZ29vZCBhbHRlcm5hdGl2ZS4KKworVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHN1cHBvcnRzIGJ1aWxkaW5nIGxpYmpwZWcgYXMgYSBzaGFyZWQgbGlicmFyeQorb24gbWFueSBmbGF2b3JzIG9mIFVuaXggKGFsbCB0aGUgb25lcyB0aGF0IEdOVSBsaWJ0b29sIGtub3dzIGhvdyB0bworYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBmb3IpLiAgVXNlICIuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQiIHRvCit0cnkgdGhpcyBvdXQuCisKK05ldyBqY29uZmlnIGZpbGUgYW5kIG1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgYW5kIERldmVsb3BlciBTdHVkaW8uCitBbHNvLCBhIGpjb25maWcgZmlsZSBhbmQgYSBidWlsZCBzY3JpcHQgZm9yIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IKK29uIEFwcGxlIE1hY2ludG9zaC4gIG1ha2VmaWxlLmRqIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIERKR1BQIHYyLCBhbmQgdGhlcmUKK2FyZSBtaXNjZWxsYW5lb3VzIG90aGVyIG1pbm9yIGltcHJvdmVtZW50cyBpbiB0aGUgbWFrZWZpbGVzLgorCitqbWVtbWFjLmMgbm93IGtub3dzIGhvdyB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGZvbGxvd2luZyBNYWMgU3lzdGVtIDcKK2NvbnZlbnRpb25zLgorCitkanBlZydzIC1tYXAgc3dpdGNoIGlzIG5vdyBhYmxlIHRvIHJlYWQgcmF3LWZvcm1hdCBQUE0gZmlsZXMgcmVsaWFibHkuCisKK2NqcGVnIC1wcm9ncmVzc2l2ZSAtcmVzdGFydCBubyBsb25nZXIgZ2VuZXJhdGVzIGFueSB1bm5lY2Vzc2FyeSBEUkkgbWFya2Vycy4KKworTXVsdGlwbGUgY2FsbHMgdG8ganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gZm9yIGEgc2luZ2xlIEpQRUcgb2JqZWN0CitubyBsb25nZXIgbGVhayBtZW1vcnkuCisKKworVmVyc2lvbiA2YSAgNy1GZWItOTYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpYnJhcnkgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgbW9kaWZpZWQgdG8gZGV0ZWN0IHZlcnNpb24gbWlzbWF0Y2hlcworYW5kIHN0cnVjdCBmaWVsZCBwYWNraW5nIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsaW5nIGFwcGxpY2F0aW9uLgorVGhpcyBjaGFuZ2UgcmVxdWlyZXMgYXBwbGljYXRpb25zIHRvIGJlIHJlY29tcGlsZWQsIGJ1dCBkb2VzIG5vdCByZXF1aXJlCithbnkgYXBwbGljYXRpb24gc291cmNlIGNvZGUgY2hhbmdlLgorCitBbGwgcm91dGluZSBkZWNsYXJhdGlvbnMgY2hhbmdlZCB0byB0aGUgc3R5bGUgIkdMT0JBTCh0eXBlKSBuYW1lIC4uLiIsCit0aGF0IGlzLCBHTE9CQUwsIExPQ0FMLCBNRVRIT0RERUYsIEVYVEVSTiBhcmUgbm93IG1hY3JvcyB0YWtpbmcgdGhlCityb3V0aW5lJ3MgcmV0dXJuIHR5cGUgYXMgYW4gYXJndW1lbnQuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFkZAorTWljcm9zb2Z0LXN0eWxlIGxpbmthZ2Uga2V5d29yZHMgdG8gYWxsIHRoZSByb3V0aW5lcyBieSBjaGFuZ2luZyBqdXN0Cit0aGVzZSBtYWNyb3MuICBOb3RlIHRoYXQgYW55IGFwcGxpY2F0aW9uIGNvZGUgdGhhdCB3YXMgdXNpbmcgdGhlc2UgbWFjcm9zCit3aWxsIGhhdmUgdG8gYmUgY2hhbmdlZC4KKworRENUIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG5vdyBzdG9yZWQgaW4gbm9ybWFsIGFycmF5IG9yZGVyCityYXRoZXIgdGhhbiB6aWd6YWcgb3JkZXIuICBBcHBsaWNhdGlvbiBjb2RlIHRoYXQgY2FsbHMganBlZ19hZGRfcXVhbnRfdGFibGUsCitvciBvdGhlcndpc2UgbWFuaXB1bGF0ZXMgcXVhbnRpemF0aW9uIHRhYmxlcyBkaXJlY3RseSwgd2lsbCBuZWVkIHRvIGJlCitjaGFuZ2VkLiAgSWYgeW91IG5lZWQgdG8gbWFrZSBzdWNoIGNvZGUgd29yayB3aXRoIGVpdGhlciBvbGRlciBvciBuZXdlcgordmVyc2lvbnMgb2YgdGhlIGxpYnJhcnksIGEgdGVzdCBsaWtlICIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MSIgaXMKK3JlY29tbWVuZGVkLgorCitkanBlZydzIHRyYWNlIGNhcGFiaWxpdHkgbm93IGR1bXBzIERRVCB0YWJsZXMgaW4gbmF0dXJhbCBvcmRlciwgbm90IHppZ3phZworb3JkZXIuICBUaGlzIGFsbG93cyB0aGUgdHJhY2Ugb3V0cHV0IHRvIGJlIG1hZGUgaW50byBhICItcXRhYmxlcyIgZmlsZQorbW9yZSBlYXNpbHkuCisKK05ldyBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VyIG1vZHVsZSBmb3IgdXNlIG9uIEFwcGxlIE1hY2ludG9zaC4KKworRml4IGJ1ZyBpbiBjanBlZydzIC1zbW9vdGggb3B0aW9uOiBsYXN0IG9uZSBvciB0d28gc2NhbmxpbmVzIHdvdWxkIGJlCitkdXBsaWNhdGVzIG9mIHRoZSBwcmlvciBsaW5lIHVubGVzcyB0aGUgaW1hZ2UgaGVpZ2h0IG1vZCAxNiB3YXMgMSBvciAyLgorCitSZXBhaXIgbWlub3IgcHJvYmxlbXMgaW4gVk1TLCBCQ0MsIE1DNiBtYWtlZmlsZXMuCisKK05ldyBjb25maWd1cmUgc2NyaXB0IGJhc2VkIG9uIGxhdGVzdCBHTlUgQXV0b2NvbmYuCisKK0NvcnJlY3QgdGhlIGxpc3Qgb2YgaW5jbHVkZSBmaWxlcyBuZWVkZWQgYnkgTWV0cm9XZXJrcyBDIGZvciBjY29tbWFuZCgpLgorCitOdW1lcm91cyBzbWFsbCBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisKKworVmVyc2lvbiA2ICAyLUF1Zy05NQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQ6IGxpYnJhcnkgY2FuIHJlYWQgYW5kIHdyaXRlIGZ1bGwgcHJvZ3Jlc3NpdmUgSlBFRworZmlsZXMuICBBICJidWZmZXJlZCBpbWFnZSIgbW9kZSBzdXBwb3J0cyBpbmNyZW1lbnRhbCBkZWNvZGluZyBmb3Igb24tdGhlLWZseQorZGlzcGxheSBvZiBwcm9ncmVzc2l2ZSBpbWFnZXMuICBTaW1wbHkgcmVjb21waWxpbmcgYW4gZXhpc3RpbmcgSUpHLXY1LWJhc2VkCitkZWNvZGVyIHdpdGggdjYgc2hvdWxkIGFsbG93IGl0IHRvIHJlYWQgcHJvZ3Jlc3NpdmUgZmlsZXMsIHRob3VnaCBvZiBjb3Vyc2UKK3dpdGhvdXQgYW55IHNwZWNpYWwgcHJvZ3Jlc3NpdmUgZGlzcGxheS4KKworTmV3ICJqcGVndHJhbiIgYXBwbGljYXRpb24gcGVyZm9ybXMgbG9zc2xlc3MgdHJhbnNjb2RpbmcgYmV0d2VlbiBkaWZmZXJlbnQKK0pQRUcgZm9ybWF0czsgcHJpbWFyaWx5LCBpdCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGJhc2VsaW5lIHRvIHByb2dyZXNzaXZlCitKUEVHIGFuZCB2aWNlIHZlcnNhLiAgSW4gc3VwcG9ydCBvZiBqcGVndHJhbiwgdGhlIGxpYnJhcnkgbm93IGFsbG93cyBsb3NzbGVzcworcmVhZGluZyBhbmQgd3JpdGluZyBvZiBKUEVHIGZpbGVzIGFzIERDVCBjb2VmZmljaWVudCBhcnJheXMuICBUaGlzIGFiaWxpdHkKK21heSBiZSBvZiB1c2UgaW4gb3RoZXIgYXBwbGljYXRpb25zLgorCitOb3RlcyBmb3IgcHJvZ3JhbW1lcnM6CisqIFdlIGNoYW5nZWQganBlZ19zdGFydF9kZWNvbXByZXNzKCkgdG8gYmUgYWJsZSB0byBzdXNwZW5kOyB0aGlzIG1ha2VzIGFsbAorZGVjb2RpbmcgbW9kZXMgYXZhaWxhYmxlIHRvIHN1c3BlbmRpbmctaW5wdXQgYXBwbGljYXRpb25zLiAgSG93ZXZlciwKK2V4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBzdXNwZW5kaW5nIGlucHV0IHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkCit0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZyb20ganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBZb3UgZG9uJ3QgbmVlZCB0bworZG8gYW55dGhpbmcgaWYgeW91IGRvbid0IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCisqIFdlIGNoYW5nZWQgdGhlIGludGVyZmFjZSB0byB0aGUgdmlydHVhbCBhcnJheSByb3V0aW5lczogYWNjZXNzX3ZpcnRfYXJyYXkKK3JvdXRpbmVzIG5vdyB0YWtlIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiByb3dzIHRvIGFjY2VzcyB0aGlzIHRpbWUuICBUaGUKK2xhc3QgcGFyYW1ldGVyIHRvIHJlcXVlc3RfdmlydF9hcnJheSByb3V0aW5lcyBpcyBub3cgaW50ZXJwcmV0ZWQgYXMgdGhlCittYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgbWF5IGJlIGFjY2Vzc2VkIGF0IG9uY2UsIGJ1dCBub3QgbmVjZXNzYXJpbHkKK3RoZSBoZWlnaHQgb2YgZXZlcnkgYWNjZXNzLgorCisKK1ZlcnNpb24gNWIgIDE1LU1hci05NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvcnJlY3QgYnVncyB3aXRoIGdyYXlzY2FsZSBpbWFnZXMgaGF2aW5nIHZfc2FtcF9mYWN0b3IgPiAxLgorCitqcGVnX3dyaXRlX3Jhd19kYXRhKCkgbm93IHN1cHBvcnRzIG91dHB1dCBzdXNwZW5zaW9uLgorCitDb3JyZWN0IGJ1Z3MgaW4gImNvbmZpZ3VyZSIgc2NyaXB0IGZvciBjYXNlIG9mIGNvbXBpbGluZyBpbgorYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcy4KKworUmVwYWlyIGJ1ZyBpbiBqcXVhbnQxLmM6IHNvbWV0aW1lcyBkaWRuJ3QgdXNlIGFzIG1hbnkgY29sb3JzIGFzIGl0IGNvdWxkLgorCitCb3JsYW5kIEMgbWFrZWZpbGUgYW5kIGpjb25maWcgZmlsZSB3b3JrIHVuZGVyIGVpdGhlciBNUy1ET1Mgb3IgT1MvMi4KKworTWlzY2VsbGFuZW91cyBpbXByb3ZlbWVudHMgdG8gZG9jdW1lbnRhdGlvbi4KKworCitWZXJzaW9uIDVhICA3LURlYy05NAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2hhbmdlZCBjb2xvciBjb252ZXJzaW9uIHJvdW5kb2ZmIGJlaGF2aW9yIHNvIHRoYXQgZ3JheXNjYWxlIHZhbHVlcyBhcmUKK3JlcHJlc2VudGVkIGV4YWN0bHkuICAoVGhpcyBjYXVzZXMgdGVzdCBpbWFnZSBmaWxlcyB0byBjaGFuZ2UuKQorCitNYWtlIG9yZGVyZWQgZGl0aGVyIHVzZSAxNngxNiBpbnN0ZWFkIG9mIDR4NCBwYXR0ZXJuIGZvciBhIHNtYWxsIHF1YWxpdHkKK2ltcHJvdmVtZW50LgorCitOZXcgY29uZmlndXJlIHNjcmlwdCBiYXNlZCBvbiBsYXRlc3QgR05VIEF1dG9jb25mLgorRml4IGNvbmZpZ3VyZSBzY3JpcHQgdG8gaGFuZGxlIENGTEFHUyBjb3JyZWN0bHkuCitSZW5hbWUgKi5hdXRvIGZpbGVzIHRvICouY2ZnLCBzbyB0aGF0IGNvbmZpZ3VyZSBzY3JpcHQgc3RpbGwgd29ya3MgaWYKK2ZpbGUgbmFtZXMgaGF2ZSBiZWVuIHRydW5jYXRlZCBmb3IgRE9TLgorCitGaXggYnVnIGluIHJkYm1wLmM6IGRpZG4ndCBhbGxvdyBmb3IgZXh0cmEgZGF0YSBiZXR3ZWVuIGhlYWRlciBhbmQgaW1hZ2UuCisKK01vZGlmeSByZHBwbS5jL3dycHBtLmMgdG8gaGFuZGxlIDItYnl0ZSByYXcgUFBNL1BHTSBmb3JtYXRzIGZvciAxMi1iaXQgZGF0YS4KKworRml4IHNldmVyYWwgYnVncyBpbiByZHJsZS5jLgorCitORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTIG9wdGlvbiB3YXMgYnJva2VuLgorCitSZXZpc2UgamVycm9yLmgvamVycm9yLmMgZm9yIG1vcmUgZmxleGliaWxpdHkgaW4gbWVzc2FnZSB0YWJsZS4KKworUmVwYWlyIG92ZXJzaWdodCBpbiBqbWVtbmFtZS5jIE5PX01LVEVNUCBjYXNlOiBmaWxlIGNvdWxkIGJlIHRoZXJlCitidXQgdW5yZWFkYWJsZS4KKworCitWZXJzaW9uIDUgIDI0LVNlcC05NAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVmVyc2lvbiA1IHJlcHJlc2VudHMgYSBuZWFybHkgY29tcGxldGUgcmVkZXNpZ24gYW5kIHJld3JpdGUgb2YgdGhlIElKRworc29mdHdhcmUuICBNYWpvciB1c2VyLXZpc2libGUgY2hhbmdlcyBpbmNsdWRlOgorICAqIEF1dG9tYXRpYyBjb25maWd1cmF0aW9uIHNpbXBsaWZpZXMgaW5zdGFsbGF0aW9uIGZvciBtb3N0IFVuaXggc3lzdGVtcy4KKyAgKiBBIHJhbmdlIG9mIHNwZWVkIHZzLiBpbWFnZSBxdWFsaXR5IHRyYWRlb2ZmcyBhcmUgc3VwcG9ydGVkLgorICAgIFRoaXMgaW5jbHVkZXMgcmVzaXppbmcgb2YgYW4gaW1hZ2UgZHVyaW5nIGRlY29tcHJlc3Npb246IHNjYWxpbmcgZG93bgorICAgIGJ5IGEgZmFjdG9yIG9mIDEvMiwgMS80LCBvciAxLzggaXMgaGFuZGxlZCB2ZXJ5IGVmZmljaWVudGx5LgorICAqIE5ldyBwcm9ncmFtcyByZGpwZ2NvbSBhbmQgd3JqcGdjb20gYWxsb3cgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uCisgICAgb2YgdGV4dCBjb21tZW50cyBpbiBhIEpQRUcgZmlsZS4KKworVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIncyBpbnRlcmZhY2UgdG8gdGhlIGxpYnJhcnkgaGFzIGNoYW5nZWQgY29tcGxldGVseS4KK05vdGFibGUgaW1wcm92ZW1lbnRzIGluY2x1ZGU6CisgICogV2UgaGF2ZSBlbGltaW5hdGVkIHRoZSB1c2Ugb2YgY2FsbGJhY2sgcm91dGluZXMgZm9yIGhhbmRsaW5nIHRoZQorICAgIHVuY29tcHJlc3NlZCBpbWFnZSBkYXRhLiAgVGhlIGFwcGxpY2F0aW9uIG5vdyBzZWVzIHRoZSBsaWJyYXJ5IGFzIGEKKyAgICBzZXQgb2Ygcm91dGluZXMgdGhhdCBpdCBjYWxscyB0byByZWFkIG9yIHdyaXRlIGltYWdlIGRhdGEgb24gYQorICAgIHNjYW5saW5lLWJ5LXNjYW5saW5lIGJhc2lzLgorICAqIFRoZSBhcHBsaWNhdGlvbiBpbWFnZSBkYXRhIGlzIHJlcHJlc2VudGVkIGluIGEgY29udmVudGlvbmFsIGludGVybGVhdmVkLQorICAgIHBpeGVsIGZvcm1hdCwgcmF0aGVyIHRoYW4gYXMgYSBzZXBhcmF0ZSBhcnJheSBmb3IgZWFjaCBjb2xvciBjaGFubmVsLgorICAgIFRoaXMgY2FuIHNhdmUgYSBjb3B5aW5nIHN0ZXAgaW4gbWFueSBwcm9ncmFtcy4KKyAgKiBUaGUgaGFuZGxpbmcgb2YgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGNsZWFuZWQgdXA6IHRoZSBhcHBsaWNhdGlvbiBjYW4KKyAgICBzdXBwbHkgcm91dGluZXMgdG8gc291cmNlIG9yIHNpbmsgdGhlIGNvbXByZXNzZWQgZGF0YS4gIEl0IGlzIHBvc3NpYmxlIHRvCisgICAgc3VzcGVuZCBwcm9jZXNzaW5nIG9uIHNvdXJjZS9zaW5rIGJ1ZmZlciBvdmVycnVuLCBhbHRob3VnaCB0aGlzIGlzIG5vdAorICAgIHN1cHBvcnRlZCBpbiBhbGwgb3BlcmF0aW5nIG1vZGVzLgorICAqIEFsbCBzdGF0aWMgc3RhdGUgaGFzIGJlZW4gZWxpbWluYXRlZCBmcm9tIHRoZSBsaWJyYXJ5LCBzbyB0aGF0IG11bHRpcGxlCisgICAgaW5zdGFuY2VzIG9mIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY2FuIGJlIGFjdGl2ZSBjb25jdXJyZW50bHkuCisgICogSlBFRyBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgaWUsIHF1YW50aXphdGlvbiBhbmQKKyAgICBIdWZmbWFuIHRhYmxlcyBjYW4gYmUgc3RvcmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgaW1hZ2UgZGF0YS4KKyAgKiBBbmQgbm90IG9ubHkgdGhhdCwgYnV0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5IGhhcyBpbXByb3ZlZAorICAgIGNvbnNpZGVyYWJseSEKKworCitUaGUgbGFzdCB3aWRlbHkgdXNlZCByZWxlYXNlIGJlZm9yZSB0aGUgdmVyc2lvbiA1IHJld3JpdGUgd2FzIHZlcnNpb24gNEEgb2YKKzE4LUZlYi05My4gIENoYW5nZSBsb2dzIGJlZm9yZSB0aGF0IHBvaW50IGhhdmUgYmVlbiBkaXNjYXJkZWQsIHNpbmNlIHRoZXkKK2FyZSBub3Qgb2YgbXVjaCBpbnRlcmVzdCBhZnRlciB0aGUgcmV3cml0ZS4KZGlmZiAtLWdpdCBhL2NqcGVnLjEgYi9janBlZy4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzVhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9janBlZy4xCkBAIC0wLDAgKzEsMjkyIEBACisuVEggQ0pQRUcgMSAiMjAgTWFyY2ggMTk5OCIKKy5TSCBOQU1FCitjanBlZyBcLSBjb21wcmVzcyBhbiBpbWFnZSBmaWxlIHRvIGEgSlBFRyBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIGNqcGVnCitbCisuSSBvcHRpb25zCitdCitbCisuSSBmaWxlbmFtZQorXQorLkxQCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgY2pwZWcKK2NvbXByZXNzZXMgdGhlIG5hbWVkIGltYWdlIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzCituYW1lZCwgYW5kIHByb2R1Y2VzIGEgSlBFRy9KRklGIGZpbGUgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KK1RoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGlucHV0IGZpbGUgZm9ybWF0cyBhcmU6IFBQTSAoUEJNUExVUyBjb2xvcgorZm9ybWF0KSwgUEdNIChQQk1QTFVTIGdyYXktc2NhbGUgZm9ybWF0KSwgQk1QLCBUYXJnYSwgYW5kIFJMRSAoVXRhaCBSYXN0ZXIKK1Rvb2xraXQgZm9ybWF0KS4gIChSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCisuU0ggT1BUSU9OUworQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAorLkIgXC1ncmF5c2NhbGUKK21heSBiZSB3cml0dGVuCisuQiBcLWdyYXkKK29yCisuQlIgXC1nciAuCitNb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMgb25lIGxldHRlci4KK1VwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICh0aHVzCisuQiBcLUJNUAoraXMgdGhlIHNhbWUgYXMKKy5CUiBcLWJtcCApLgorQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sCisuQlIgXC1ncmV5c2NhbGUgKSwKK3Rob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KKy5QUAorVGhlIGJhc2ljIHN3aXRjaGVzIGFyZToKKy5UUAorLkJJIFwtcXVhbGl0eSAiIE4iCitTY2FsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGFkanVzdCBpbWFnZSBxdWFsaXR5LiAgUXVhbGl0eSBpcyAwICh3b3JzdCkgdG8KKzEwMCAoYmVzdCk7IGRlZmF1bHQgaXMgNzUuICAoU2VlIGJlbG93IGZvciBtb3JlIGluZm8uKQorLlRQCisuQiBcLWdyYXlzY2FsZQorQ3JlYXRlIG1vbm9jaHJvbWUgSlBFRyBmaWxlIGZyb20gY29sb3IgaW5wdXQuICBCZSBzdXJlIHRvIHVzZSB0aGlzIHN3aXRjaCB3aGVuCitjb21wcmVzc2luZyBhIGdyYXlzY2FsZSBCTVAgZmlsZSwgYmVjYXVzZQorLkIgY2pwZWcKK2lzbid0IGJyaWdodCBlbm91Z2ggdG8gbm90aWNlIHdoZXRoZXIgYSBCTVAgZmlsZSB1c2VzIG9ubHkgc2hhZGVzIG9mIGdyYXkuCitCeSBzYXlpbmcKKy5CUiBcLWdyYXlzY2FsZSAsCit5b3UnbGwgZ2V0IGEgc21hbGxlciBKUEVHIGZpbGUgdGhhdCB0YWtlcyBsZXNzIHRpbWUgdG8gcHJvY2Vzcy4KKy5UUAorLkIgXC1vcHRpbWl6ZQorUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLiAgV2l0aG91dCB0aGlzLCBkZWZhdWx0CitlbmNvZGluZyBwYXJhbWV0ZXJzIGFyZSB1c2VkLgorLkIgXC1vcHRpbWl6ZQordXN1YWxseSBtYWtlcyB0aGUgSlBFRyBmaWxlIGEgbGl0dGxlIHNtYWxsZXIsIGJ1dAorLkIgY2pwZWcKK3J1bnMgc29tZXdoYXQgc2xvd2VyIGFuZCBuZWVkcyBtdWNoIG1vcmUgbWVtb3J5LiAgSW1hZ2UgcXVhbGl0eSBhbmQgc3BlZWQgb2YKK2RlY29tcHJlc3Npb24gYXJlIHVuYWZmZWN0ZWQgYnkKKy5CUiBcLW9wdGltaXplIC4KKy5UUAorLkIgXC1wcm9ncmVzc2l2ZQorQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZSAoc2VlIGJlbG93KS4KKy5UUAorLkIgXC10YXJnYQorSW5wdXQgZmlsZSBpcyBUYXJnYSBmb3JtYXQuICBUYXJnYSBmaWxlcyB0aGF0IGNvbnRhaW4gYW4gImlkZW50aWZpY2F0aW9uIgorZmllbGQgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSByZWNvZ25pemVkIGJ5CisuQlIgY2pwZWcgOworZm9yIHN1Y2ggZmlsZXMgeW91IG11c3Qgc3BlY2lmeQorLkIgXC10YXJnYQordG8gbWFrZQorLkIgY2pwZWcKK3RyZWF0IHRoZSBpbnB1dCBhcyBUYXJnYSBmb3JtYXQuCitGb3IgbW9zdCBUYXJnYSBmaWxlcywgeW91IHdvbid0IG5lZWQgdGhpcyBzd2l0Y2guCisuUFAKK1RoZQorLkIgXC1xdWFsaXR5Citzd2l0Y2ggbGV0cyB5b3UgdHJhZGUgb2ZmIGNvbXByZXNzZWQgZmlsZSBzaXplIGFnYWluc3QgcXVhbGl0eSBvZiB0aGUKK3JlY29uc3RydWN0ZWQgaW1hZ2U6IHRoZSBoaWdoZXIgdGhlIHF1YWxpdHkgc2V0dGluZywgdGhlIGxhcmdlciB0aGUgSlBFRyBmaWxlLAorYW5kIHRoZSBjbG9zZXIgdGhlIG91dHB1dCBpbWFnZSB3aWxsIGJlIHRvIHRoZSBvcmlnaW5hbCBpbnB1dC4gIE5vcm1hbGx5IHlvdQord2FudCB0byB1c2UgdGhlIGxvd2VzdCBxdWFsaXR5IHNldHRpbmcgKHNtYWxsZXN0IGZpbGUpIHRoYXQgZGVjb21wcmVzc2VzIGludG8KK3NvbWV0aGluZyB2aXN1YWxseSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBvcmlnaW5hbCBpbWFnZS4gIEZvciB0aGlzCitwdXJwb3NlIHRoZSBxdWFsaXR5IHNldHRpbmcgc2hvdWxkIGJlIGJldHdlZW4gNTAgYW5kIDk1OyB0aGUgZGVmYXVsdCBvZiA3NSBpcworb2Z0ZW4gYWJvdXQgcmlnaHQuICBJZiB5b3Ugc2VlIGRlZmVjdHMgYXQKKy5CIFwtcXVhbGl0eQorNzUsIHRoZW4gZ28gdXAgNSBvciAxMCBjb3VudHMgYXQgYSB0aW1lIHVudGlsIHlvdSBhcmUgaGFwcHkgd2l0aCB0aGUgb3V0cHV0CitpbWFnZS4gIChUaGUgb3B0aW1hbCBzZXR0aW5nIHdpbGwgdmFyeSBmcm9tIG9uZSBpbWFnZSB0byBhbm90aGVyLikKKy5QUAorLkIgXC1xdWFsaXR5CisxMDAgd2lsbCBnZW5lcmF0ZSBhIHF1YW50aXphdGlvbiB0YWJsZSBvZiBhbGwgMSdzLCBtaW5pbWl6aW5nIGxvc3MgaW4gdGhlCitxdWFudGl6YXRpb24gc3RlcCAoYnV0IHRoZXJlIGlzIHN0aWxsIGluZm9ybWF0aW9uIGxvc3MgaW4gc3Vic2FtcGxpbmcsIGFzIHdlbGwKK2FzIHJvdW5kb2ZmIGVycm9yKS4gIFRoaXMgc2V0dGluZyBpcyBtYWlubHkgb2YgaW50ZXJlc3QgZm9yIGV4cGVyaW1lbnRhbAorcHVycG9zZXMuICBRdWFsaXR5IHZhbHVlcyBhYm92ZSBhYm91dCA5NSBhcmUKKy5CIG5vdAorcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB1c2U7IHRoZSBjb21wcmVzc2VkIGZpbGUgc2l6ZSBnb2VzIHVwIGRyYW1hdGljYWxseSBmb3IKK2hhcmRseSBhbnkgZ2FpbiBpbiBvdXRwdXQgaW1hZ2UgcXVhbGl0eS4KKy5QUAorSW4gdGhlIG90aGVyIGRpcmVjdGlvbiwgcXVhbGl0eSB2YWx1ZXMgYmVsb3cgNTAgd2lsbCBwcm9kdWNlIHZlcnkgc21hbGwgZmlsZXMKK29mIGxvdyBpbWFnZSBxdWFsaXR5LiAgU2V0dGluZ3MgYXJvdW5kIDUgdG8gMTAgbWlnaHQgYmUgdXNlZnVsIGluIHByZXBhcmluZyBhbgoraW5kZXggb2YgYSBsYXJnZSBpbWFnZSBsaWJyYXJ5LCBmb3IgZXhhbXBsZS4gIFRyeQorLkIgXC1xdWFsaXR5CisyIChvciBzbykgZm9yIHNvbWUgYW11c2luZyBDdWJpc3QgZWZmZWN0cy4gIChOb3RlOiBxdWFsaXR5Cit2YWx1ZXMgYmVsb3cgYWJvdXQgMjUgZ2VuZXJhdGUgMi1ieXRlIHF1YW50aXphdGlvbiB0YWJsZXMsIHdoaWNoIGFyZQorY29uc2lkZXJlZCBvcHRpb25hbCBpbiB0aGUgSlBFRyBzdGFuZGFyZC4KKy5CIGNqcGVnCitlbWl0cyBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHlvdSBnaXZlIHN1Y2ggYSBxdWFsaXR5IHZhbHVlLCBiZWNhdXNlIHNvbWUKK290aGVyIEpQRUcgcHJvZ3JhbXMgbWF5IGJlIHVuYWJsZSB0byBkZWNvZGUgdGhlIHJlc3VsdGluZyBmaWxlLiAgVXNlCisuQiBcLWJhc2VsaW5lCitpZiB5b3UgbmVlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhdCBsb3cgcXVhbGl0eSB2YWx1ZXMuKQorLlBQCitUaGUKKy5CIFwtcHJvZ3Jlc3NpdmUKK3N3aXRjaCBjcmVhdGVzIGEgInByb2dyZXNzaXZlIEpQRUciIGZpbGUuICBJbiB0aGlzIHR5cGUgb2YgSlBFRyBmaWxlLCB0aGUgZGF0YQoraXMgc3RvcmVkIGluIG11bHRpcGxlIHNjYW5zIG9mIGluY3JlYXNpbmcgcXVhbGl0eS4gIElmIHRoZSBmaWxlIGlzIGJlaW5nCit0cmFuc21pdHRlZCBvdmVyIGEgc2xvdyBjb21tdW5pY2F0aW9ucyBsaW5rLCB0aGUgZGVjb2RlciBjYW4gdXNlIHRoZSBmaXJzdAorc2NhbiB0byBkaXNwbGF5IGEgbG93LXF1YWxpdHkgaW1hZ2UgdmVyeSBxdWlja2x5LCBhbmQgY2FuIHRoZW4gaW1wcm92ZSB0aGUKK2Rpc3BsYXkgd2l0aCBlYWNoIHN1YnNlcXVlbnQgc2Nhbi4gIFRoZSBmaW5hbCBpbWFnZSBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gYQorc3RhbmRhcmQgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkgc2V0dGluZywgYW5kIHRoZSB0b3RhbCBmaWxlIHNpemUgaXMKK2Fib3V0IHRoZSBzYW1lIC0tLSBvZnRlbiBhIGxpdHRsZSBzbWFsbGVyLgorLkIgQ2F1dGlvbjoKK3Byb2dyZXNzaXZlIEpQRUcgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHNvIG1hbnkgZGVjb2RlcnMgd2lsbCBiZQordW5hYmxlIHRvIHZpZXcgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgYXQgYWxsLgorLlBQCitTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6CisuVFAKKy5CIFwtZGN0IGludAorVXNlIGludGVnZXIgRENUIG1ldGhvZCAoZGVmYXVsdCkuCisuVFAKKy5CIFwtZGN0IGZhc3QKK1VzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKS4KKy5UUAorLkIgXC1kY3QgZmxvYXQKK1VzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kLgorVGhlIGZsb2F0IG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgaW50IG1ldGhvZCwgYnV0IGlzCittdWNoIHNsb3dlciB1bmxlc3MgeW91ciBtYWNoaW5lIGhhcyB2ZXJ5IGZhc3QgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuICBBbHNvCitub3RlIHRoYXQgcmVzdWx0cyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSB2YXJ5IHNsaWdodGx5IGFjcm9zcworbWFjaGluZXMsIHdoaWxlIHRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLgorVGhlIGZhc3QgaW50ZWdlciBtZXRob2QgaXMgbXVjaCBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3by4KKy5UUAorLkJJIFwtcmVzdGFydCAiIE4iCitFbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeSBOIE1DVSBibG9ja3MgaWYgIkIiIGlzCithdHRhY2hlZCB0byB0aGUgbnVtYmVyLgorLkIgXC1yZXN0YXJ0IDAKKyh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gcmVzdGFydCBtYXJrZXJzLgorLlRQCisuQkkgXC1zbW9vdGggIiBOIgorU21vb3RoIHRoZSBpbnB1dCBpbWFnZSB0byBlbGltaW5hdGUgZGl0aGVyaW5nIG5vaXNlLiAgTiwgcmFuZ2luZyBmcm9tIDEgdG8KKzEwMCwgaW5kaWNhdGVzIHRoZSBzdHJlbmd0aCBvZiBzbW9vdGhpbmcuICAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gc21vb3RoaW5nLgorLlRQCisuQkkgXC1tYXhtZW1vcnkgIiBOIgorU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nIGxhcmdlIGltYWdlcy4gIFZhbHVlIGlzCitpbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yIG1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUKK251bWJlci4gIEZvciBleGFtcGxlLAorLkIgXC1tYXggNG0KK3NlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUgc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgorLlRQCisuQkkgXC1vdXRmaWxlICIgbmFtZSIKK1NlbmQgb3V0cHV0IGltYWdlIHRvIHRoZSBuYW1lZCBmaWxlLCBub3QgdG8gc3RhbmRhcmQgb3V0cHV0LgorLlRQCisuQiBcLXZlcmJvc2UKK0VuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUKKy5CUiBcLXYgJ3MKK2dpdmUgbW9yZSBvdXRwdXQuICBBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KKy5UUAorLkIgXC1kZWJ1ZworU2FtZSBhcworLkJSIFwtdmVyYm9zZSAuCisuUFAKK1RoZQorLkIgXC1yZXN0YXJ0CitvcHRpb24gaW5zZXJ0cyBleHRyYSBtYXJrZXJzIHRoYXQgYWxsb3cgYSBKUEVHIGRlY29kZXIgdG8gcmVzeW5jaHJvbml6ZSBhZnRlcgorYSB0cmFuc21pc3Npb24gZXJyb3IuICBXaXRob3V0IHJlc3RhcnQgbWFya2VycywgYW55IGRhbWFnZSB0byBhIGNvbXByZXNzZWQKK2ZpbGUgd2lsbCB1c3VhbGx5IHJ1aW4gdGhlIGltYWdlIGZyb20gdGhlIHBvaW50IG9mIHRoZSBlcnJvciB0byB0aGUgZW5kIG9mIHRoZQoraW1hZ2U7IHdpdGggcmVzdGFydCBtYXJrZXJzLCB0aGUgZGFtYWdlIGlzIHVzdWFsbHkgY29uZmluZWQgdG8gdGhlIHBvcnRpb24gb2YKK3RoZSBpbWFnZSB1cCB0byB0aGUgbmV4dCByZXN0YXJ0IG1hcmtlci4gIE9mIGNvdXJzZSwgdGhlIHJlc3RhcnQgbWFya2Vycworb2NjdXB5IGV4dHJhIHNwYWNlLiAgV2UgcmVjb21tZW5kCisuQiBcLXJlc3RhcnQgMQorZm9yIGltYWdlcyB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgYWNyb3NzIHVucmVsaWFibGUgbmV0d29ya3Mgc3VjaCBhcyBVc2VuZXQuCisuUFAKK1RoZQorLkIgXC1zbW9vdGgKK29wdGlvbiBmaWx0ZXJzIHRoZSBpbnB1dCB0byBlbGltaW5hdGUgZmluZS1zY2FsZSBub2lzZS4gIFRoaXMgaXMgb2Z0ZW4gdXNlZnVsCit3aGVuIGNvbnZlcnRpbmcgZGl0aGVyZWQgaW1hZ2VzIHRvIEpQRUc6IGEgbW9kZXJhdGUgc21vb3RoaW5nIGZhY3RvciBvZiAxMCB0bworNTAgZ2V0cyByaWQgb2YgZGl0aGVyaW5nIHBhdHRlcm5zIGluIHRoZSBpbnB1dCBmaWxlLCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyCitKUEVHIGZpbGUgYW5kIGEgYmV0dGVyLWxvb2tpbmcgaW1hZ2UuICBUb28gbGFyZ2UgYSBzbW9vdGhpbmcgZmFjdG9yIHdpbGwKK3Zpc2libHkgYmx1ciB0aGUgaW1hZ2UsIGhvd2V2ZXIuCisuUFAKK1N3aXRjaGVzIGZvciB3aXphcmRzOgorLlRQCisuQiBcLWJhc2VsaW5lCitGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkLiAgVGhpcyBjbGFtcHMKK3F1YW50aXphdGlvbiB2YWx1ZXMgdG8gOCBiaXRzIGV2ZW4gYXQgbG93IHF1YWxpdHkgc2V0dGluZ3MuICAoVGhpcyBzd2l0Y2ggaXMKK3Bvb3JseSBuYW1lZCwgc2luY2UgaXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyBhY3R1YWxseSBiYXNlbGluZQorSlBFRy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZQorLkIgXC1iYXNlbGluZQorYW5kCisuQiBcLXByb2dyZXNzaXZlCit0b2dldGhlci4pCisuVFAKKy5CSSBcLXF0YWJsZXMgIiBmaWxlIgorVXNlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgorLlRQCisuQkkgXC1xc2xvdHMgIiBOWywuLi5dIgorU2VsZWN0IHdoaWNoIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgorLlRQCisuQkkgXC1zYW1wbGUgIiBIeFZbLC4uLl0iCitTZXQgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudC4KKy5UUAorLkJJIFwtc2NhbnMgIiBmaWxlIgorVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KKy5QUAorVGhlICJ3aXphcmQiIHN3aXRjaGVzIGFyZSBpbnRlbmRlZCBmb3IgZXhwZXJpbWVudGF0aW9uIHdpdGggSlBFRy4gIElmIHlvdQorZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcsIFxmQmRvbid0IHVzZSB0aGVtXGZSLiAgVGhlc2Ugc3dpdGNoZXMgYXJlCitkb2N1bWVudGVkIGZ1cnRoZXIgaW4gdGhlIGZpbGUgd2l6YXJkLmRvYy4KKy5TSCBFWEFNUExFUworLkxQCitUaGlzIGV4YW1wbGUgY29tcHJlc3NlcyB0aGUgUFBNIGZpbGUgZm9vLnBwbSB3aXRoIGEgcXVhbGl0eSBmYWN0b3Igb2YKKzYwIGFuZCBzYXZlcyB0aGUgb3V0cHV0IGFzIGZvby5qcGc6CisuSVAKKy5CIGNqcGVnIFwtcXVhbGl0eQorLkkgNjAgZm9vLnBwbQorLkIgPgorLkkgZm9vLmpwZworLlNIIEhJTlRTCitDb2xvciBHSUYgZmlsZXMgYXJlIG5vdCB0aGUgaWRlYWwgaW5wdXQgZm9yIEpQRUc7IEpQRUcgaXMgcmVhbGx5IGludGVuZGVkIGZvcgorY29tcHJlc3NpbmcgZnVsbC1jb2xvciAoMjQtYml0KSBpbWFnZXMuICBJbiBwYXJ0aWN1bGFyLCBkb24ndCB0cnkgdG8gY29udmVydAorY2FydG9vbnMsIGxpbmUgZHJhd2luZ3MsIGFuZCBvdGhlciBpbWFnZXMgdGhhdCBoYXZlIG9ubHkgYSBmZXcgZGlzdGluY3QKK2NvbG9ycy4gIEdJRiB3b3JrcyBncmVhdCBvbiB0aGVzZSwgSlBFRyBkb2VzIG5vdC4gIElmIHlvdSB3YW50IHRvIGNvbnZlcnQgYQorR0lGIHRvIEpQRUcsIHlvdSBzaG91bGQgZXhwZXJpbWVudCB3aXRoCisuQlIgY2pwZWcgJ3MKKy5CIFwtcXVhbGl0eQorYW5kCisuQiBcLXNtb290aAorb3B0aW9ucyB0byBnZXQgYSBzYXRpc2ZhY3RvcnkgY29udmVyc2lvbi4KKy5CIFwtc21vb3RoIDEwCitvciBzbyBpcyBvZnRlbiBoZWxwZnVsLgorLlBQCitBdm9pZCBydW5uaW5nIGFuIGltYWdlIHRocm91Z2ggYSBzZXJpZXMgb2YgSlBFRyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uCitjeWNsZXMuICBJbWFnZSBxdWFsaXR5IGxvc3Mgd2lsbCBhY2N1bXVsYXRlOyBhZnRlciB0ZW4gb3Igc28gY3ljbGVzIHRoZSBpbWFnZQorbWF5IGJlIG5vdGljZWFibHkgd29yc2UgdGhhbiBpdCB3YXMgYWZ0ZXIgb25lIGN5Y2xlLiAgSXQncyBiZXN0IHRvIHVzZSBhCitsb3NzbGVzcyBmb3JtYXQgd2hpbGUgbWFuaXB1bGF0aW5nIGFuIGltYWdlLCB0aGVuIGNvbnZlcnQgdG8gSlBFRyBmb3JtYXQgd2hlbgoreW91IGFyZSByZWFkeSB0byBmaWxlIHRoZSBpbWFnZSBhd2F5LgorLlBQCitUaGUKKy5CIFwtb3B0aW1pemUKK29wdGlvbiB0bworLkIgY2pwZWcKK2lzIHdvcnRoIHVzaW5nIHdoZW4geW91IGFyZSBtYWtpbmcgYSAiZmluYWwiIHZlcnNpb24gZm9yIHBvc3Rpbmcgb3IgYXJjaGl2aW5nLgorSXQncyBhbHNvIGEgd2luIHdoZW4geW91IGFyZSB1c2luZyBsb3cgcXVhbGl0eSBzZXR0aW5ncyB0byBtYWtlIHZlcnkgc21hbGwKK0pQRUcgZmlsZXM7IHRoZSBwZXJjZW50YWdlIGltcHJvdmVtZW50IGlzIG9mdGVuIGEgbG90IG1vcmUgdGhhbiBpdCBpcyBvbgorbGFyZ2VyIGZpbGVzLiAgKEF0IHByZXNlbnQsCisuQiBcLW9wdGltaXplCittb2RlIGlzIGFsd2F5cyBzZWxlY3RlZCB3aGVuIGdlbmVyYXRpbmcgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcy4pCisuU0ggRU5WSVJPTk1FTlQKKy5UUAorLkIgSlBFR01FTQorSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0cyB2YWx1ZSBpcyB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuCitUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBmb3IgdGhlCisuQiBcLW1heG1lbW9yeQorc3dpdGNoLgorLkIgSlBFR01FTQorb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kCitpdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbiBleHBsaWNpdAorLkJSIFwtbWF4bWVtb3J5IC4KKy5TSCBTRUUgQUxTTworLkJSIGRqcGVnICgxKSwKKy5CUiBqcGVndHJhbiAoMSksCisuQlIgcmRqcGdjb20gKDEpLAorLkJSIHdyanBnY29tICgxKQorLmJyCisuQlIgcHBtICg1KSwKKy5CUiBwZ20gKDUpCisuYnIKK1dhbGxhY2UsIEdyZWdvcnkgSy4gICJUaGUgSlBFRyBTdGlsbCBQaWN0dXJlIENvbXByZXNzaW9uIFN0YW5kYXJkIiwKK0NvbW11bmljYXRpb25zIG9mIHRoZSBBQ00sIEFwcmlsIDE5OTEgKHZvbC4gMzQsIG5vLiA0KSwgcHAuIDMwLTQ0LgorLlNIIEFVVEhPUgorSW5kZXBlbmRlbnQgSlBFRyBHcm91cAorLlNIIEJVR1MKK0FyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuCisuUFAKK0dJRiBpbnB1dCBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LgorVXNlIGEgVW5pc3lzLWxpY2Vuc2VkIHByb2dyYW0gaWYgeW91IG5lZWQgdG8gcmVhZCBhIEdJRiBmaWxlLiAgKENvbnZlcnNpb24KK29mIEdJRiBmaWxlcyB0byBKUEVHIGlzIHVzdWFsbHkgYSBiYWQgaWRlYSBhbnl3YXkuKQorLlBQCitOb3QgYWxsIHZhcmlhbnRzIG9mIEJNUCBhbmQgVGFyZ2EgZmlsZSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCisuUFAKK1RoZQorLkIgXC10YXJnYQorc3dpdGNoIGlzIG5vdCBhIGJ1ZywgaXQncyBhIGZlYXR1cmUuICAoSXQgd291bGQgYmUgYSBidWcgaWYgdGhlIFRhcmdhIGZvcm1hdAorZGVzaWduZXJzIGhhZCBub3QgYmVlbiBjbHVlbGVzcy4pCisuUFAKK1N0aWxsIG5vdCBhcyBmYXN0IGFzIHdlJ2QgbGlrZS4KZGlmZiAtLWdpdCBhL2NqcGVnLmMgYi9janBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTkyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9janBlZy5jCkBAIC0wLDAgKzEsNjA2IEBACisvKgorICogY2pwZWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgorICogSXQgc2hvdWxkIHdvcmsgb24gYW55IHN5c3RlbSB3aXRoIFVuaXgtIG9yIE1TLURPUy1zdHlsZSBjb21tYW5kIGxpbmVzLgorICoKKyAqIFR3byBkaWZmZXJlbnQgY29tbWFuZCBsaW5lIHN0eWxlcyBhcmUgcGVybWl0dGVkLCBkZXBlbmRpbmcgb24gdGhlCisgKiBjb21waWxlLXRpbWUgc3dpdGNoIFRXT19GSUxFX0NPTU1BTkRMSU5FOgorICoJY2pwZWcgW29wdGlvbnNdICBpbnB1dGZpbGUgb3V0cHV0ZmlsZQorICoJY2pwZWcgW29wdGlvbnNdICBbaW5wdXRmaWxlXQorICogSW4gdGhlIHNlY29uZCBzdHlsZSwgb3V0cHV0IGlzIGFsd2F5cyB0byBzdGFuZGFyZCBvdXRwdXQsIHdoaWNoIHlvdSdkCisgKiBub3JtYWxseSByZWRpcmVjdCB0byBhIGZpbGUgb3IgcGlwZSB0byBzb21lIG90aGVyIHByb2dyYW0uICBJbnB1dCBpcworICogZWl0aGVyIGZyb20gYSBuYW1lZCBmaWxlIG9yIGZyb20gc3RhbmRhcmQgaW5wdXQgKHR5cGljYWxseSByZWRpcmVjdGVkKS4KKyAqIFRoZSBzZWNvbmQgc3R5bGUgaXMgY29udmVuaWVudCBvbiBVbml4IGJ1dCBpcyB1bmhlbHBmdWwgb24gc3lzdGVtcyB0aGF0CisgKiBkb24ndCBzdXBwb3J0IHBpcGVzLiAgQWxzbywgeW91IE1VU1QgdXNlIHRoZSBmaXJzdCBzdHlsZSBpZiB5b3VyIHN5c3RlbQorICogZG9lc24ndCBkbyBiaW5hcnkgSS9PIHRvIHN0ZGluL3N0ZG91dC4KKyAqIFRvIHNpbXBsaWZ5IHNjcmlwdCB3cml0aW5nLCB0aGUgIi1vdXRmaWxlIiBzd2l0Y2ggaXMgcHJvdmlkZWQuICBUaGUgc3ludGF4CisgKgljanBlZyBbb3B0aW9uc10gIC1vdXRmaWxlIG91dHB1dGZpbGUgIGlucHV0ZmlsZQorICogd29ya3MgcmVnYXJkbGVzcyBvZiB3aGljaCBjb21tYW5kIGxpbmUgc3R5bGUgaXMgdXNlZC4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBDcmVhdGUgdGhlIGFkZC1vbiBtZXNzYWdlIHN0cmluZyB0YWJsZS4gKi8KKworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGpwZWdfbWVzc2FnZV90YWJsZVtdID0geworI2luY2x1ZGUgImNkZXJyb3IuaCIKKyAgTlVMTAorfTsKKworCisvKgorICogVGhpcyByb3V0aW5lIGRldGVybWluZXMgd2hhdCBmb3JtYXQgdGhlIGlucHV0IGZpbGUgaXMsCisgKiBhbmQgc2VsZWN0cyB0aGUgYXBwcm9wcmlhdGUgaW5wdXQtcmVhZGluZyBtb2R1bGUuCisgKgorICogVG8gZGV0ZXJtaW5lIHdoaWNoIGZhbWlseSBvZiBpbnB1dCBmb3JtYXRzIHRoZSBmaWxlIGJlbG9uZ3MgdG8sCisgKiB3ZSBtYXkgbG9vayBvbmx5IGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlLCBzaW5jZSBDIGRvZXMgbm90CisgKiBndWFyYW50ZWUgdGhhdCBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBjYW4gYmUgcHVzaGVkIGJhY2sgd2l0aCB1bmdldGMuCisgKiBMb29raW5nIGF0IGFkZGl0aW9uYWwgYnl0ZXMgd291bGQgcmVxdWlyZSBvbmUgb2YgdGhlc2UgYXBwcm9hY2hlczoKKyAqICAgICAxKSBhc3N1bWUgd2UgY2FuIGZzZWVrKCkgdGhlIGlucHV0IGZpbGUgKGZhaWxzIGZvciBwaXBlZCBpbnB1dCk7CisgKiAgICAgMikgYXNzdW1lIHdlIGNhbiBwdXNoIGJhY2sgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgKHdvcmtzIGluCisgKiAgICAgICAgc29tZSBDIGltcGxlbWVudGF0aW9ucywgYnV0IHVucG9ydGFibGUpOworICogICAgIDMpIHByb3ZpZGUgb3VyIG93biBidWZmZXJpbmcgKGJyZWFrcyBpbnB1dCByZWFkZXJzIHRoYXQgd2FudCB0byB1c2UKKyAqICAgICAgICBzdGRpbyBkaXJlY3RseSwgc3VjaCBhcyB0aGUgUkxFIGxpYnJhcnkpOworICogb3IgIDQpIGRvbid0IHB1dCBiYWNrIHRoZSBkYXRhLCBhbmQgbW9kaWZ5IHRoZSBpbnB1dF9pbml0IG1ldGhvZHMgdG8gYXNzdW1lCisgKiAgICAgICAgdGhleSBzdGFydCByZWFkaW5nIGFmdGVyIHRoZSBzdGFydCBvZiBmaWxlIChhbHNvIGJyZWFrcyBSTEUgbGlicmFyeSkuCisgKiAjMSBpcyBhdHRyYWN0aXZlIGZvciBNUy1ET1MgYnV0IGlzIHVudGVuYWJsZSBvbiBVbml4LgorICoKKyAqIFRoZSBtb3N0IHBvcnRhYmxlIHNvbHV0aW9uIGZvciBmaWxlIHR5cGVzIHRoYXQgY2FuJ3QgYmUgaWRlbnRpZmllZCBieSB0aGVpcgorICogZmlyc3QgYnl0ZSBpcyB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgd2hhdCB0aGV5IGFyZS4gIFRoaXMgaXMgYWxzbyB0aGUKKyAqIG9ubHkgYXBwcm9hY2ggZm9yICJyYXciIGZpbGUgdHlwZXMgdGhhdCBjb250YWluIG9ubHkgYXJiaXRyYXJ5IHZhbHVlcy4KKyAqIFdlIHByZXNlbnRseSBhcHBseSB0aGlzIG1ldGhvZCBmb3IgVGFyZ2EgZmlsZXMuICBNb3N0IG9mIHRoZSB0aW1lIFRhcmdhCisgKiBmaWxlcyBzdGFydCB3aXRoIDB4MDAsIHNvIHdlIHJlY29nbml6ZSB0aGF0IGNhc2UuICBQb3RlbnRpYWxseSwgaG93ZXZlciwKKyAqIGEgVGFyZ2EgZmlsZSBjb3VsZCBzdGFydCB3aXRoIGFueSBieXRlIHZhbHVlIChieXRlIDAgaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHNlbGRvbS11c2VkIElEIGZpZWxkKSwgc28gd2UgcHJvdmlkZSBhIHN3aXRjaCB0byBmb3JjZSBUYXJnYSBpbnB1dCBtb2RlLgorICovCisKK3N0YXRpYyBib29sZWFuIGlzX3RhcmdhOwkvKiByZWNvcmRzIHVzZXIgLXRhcmdhIHN3aXRjaCAqLworCisKK0xPQ0FMKGNqcGVnX3NvdXJjZV9wdHIpCitzZWxlY3RfZmlsZV90eXBlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgaW50IGM7CisKKyAgaWYgKGlzX3RhcmdhKSB7CisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgICAgcmV0dXJuIGppbml0X3JlYWRfdGFyZ2EoY2luZm8pOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9OT1RDT01QKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FTVBUWSk7CisgIGlmICh1bmdldGMoYywgaW5maWxlKSA9PSBFT0YpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9VTkdFVENfRkFJTEVEKTsKKworICBzd2l0Y2ggKGMpIHsKKyNpZmRlZiBCTVBfU1VQUE9SVEVECisgIGNhc2UgJ0InOgorICAgIHJldHVybiBqaW5pdF9yZWFkX2JtcChjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBHSUZfU1VQUE9SVEVECisgIGNhc2UgJ0cnOgorICAgIHJldHVybiBqaW5pdF9yZWFkX2dpZihjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBQUE1fU1VQUE9SVEVECisgIGNhc2UgJ1AnOgorICAgIHJldHVybiBqaW5pdF9yZWFkX3BwbShjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisgIGNhc2UgJ1InOgorICAgIHJldHVybiBqaW5pdF9yZWFkX3JsZShjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKKyAgY2FzZSAweDAwOgorICAgIHJldHVybiBqaW5pdF9yZWFkX3RhcmdhKGNpbmZvKTsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVU5LTk9XTl9GT1JNQVQpOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIE5VTEw7CQkJLyogc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MgKi8KK30KKworCisvKgorICogQXJndW1lbnQtcGFyc2luZyBjb2RlLgorICogVGhlIHN3aXRjaCBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgdXNlZnVsIHdpdGggRE9TLXN0eWxlIGNvbW1hbmQgbGluZQorICogc3ludGF4LCBpZSwgaW50ZXJtaXhlZCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lcywgd2hlcmUgb25seSB0aGUgc3dpdGNoZXMKKyAqIHRvIHRoZSBsZWZ0IG9mIGEgZ2l2ZW4gZmlsZSBuYW1lIGFmZmVjdCBwcm9jZXNzaW5nIG9mIHRoYXQgZmlsZS4KKyAqIFRoZSBtYWluIHByb2dyYW0gaW4gdGhpcyBmaWxlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoaXMgY2FwYWJpbGl0eS4uLgorICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLworc3RhdGljIGNoYXIgKiBvdXRmaWxlbmFtZTsJLyogZm9yIC1vdXRmaWxlIHN3aXRjaCAqLworCisKK0xPQ0FMKHZvaWQpCit1c2FnZSAodm9pZCkKKy8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KK3sKKyAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7CisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7CisjZWxzZQorICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKKyNlbmRpZgorCisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1xdWFsaXR5IE4gICAgIENvbXByZXNzaW9uIHF1YWxpdHkgKDAuLjEwMDsgNS05NSBpcyB1c2VmdWwgcmFuZ2UpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIENyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZVxuIik7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtb3B0aW1pemUgICAgICBPcHRpbWl6ZSBIdWZmbWFuIHRhYmxlIChzbWFsbGVyIGZpbGUsIGJ1dCBzbG93IGNvbXByZXNzaW9uKVxuIik7CisjZW5kaWYKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXByb2dyZXNzaXZlICAgQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZVxuIik7CisjZW5kaWYKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC10YXJnYSAgICAgICAgIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0ICh1c3VhbGx5IG5vdCBuZWVkZWQpXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczpcbiIpOworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgaW50ICAgICAgIFVzZSBpbnRlZ2VyIERDVCBtZXRob2Qlc1xuIiwKKwkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JU0xPVyA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZhc3QgICAgICBVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSklc1xuIiwKKwkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JRkFTVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZsb2F0ICAgICBVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZCVzXG4iLAorCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0ZMT0FUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlc3RhcnQgTiAgICAgU2V0IHJlc3RhcnQgaW50ZXJ2YWwgaW4gcm93cywgb3IgaW4gYmxvY2tzIHdpdGggQlxuIik7CisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNtb290aCBOICAgICAgU21vb3RoIGRpdGhlcmVkIGlucHV0IChOPTEuLjEwMCBpcyBzdHJlbmd0aClcbiIpOworI2VuZGlmCisgIGZwcmludGYoc3RkZXJyLCAiICAtbWF4bWVtb3J5IE4gICBNYXhpbXVtIG1lbW9yeSB0byB1c2UgKGluIGtieXRlcylcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOworI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJhc2VsaW5lICAgICAgRm9yY2UgYmFzZWxpbmUgcXVhbnRpemF0aW9uIHRhYmxlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcXRhYmxlcyBmaWxlICBVc2UgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1xc2xvdHMgTlssLi4uXSAgICBTZXQgY29tcG9uZW50IHF1YW50aXphdGlvbiB0YWJsZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNhbXBsZSBIeFZbLC4uLl0gIFNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9yc1xuIik7CisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtc2NhbnMgZmlsZSAgICBDcmVhdGUgbXVsdGktc2NhbiBKUEVHIHBlciBzY3JpcHQgZmlsZVxuIik7CisjZW5kaWYKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKK0xPQ0FMKGludCkKK3BhcnNlX3N3aXRjaGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQorLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCisgKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCisgKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOworICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCisgKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKKyAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKKyAqIHByb2Nlc3NpbmcuCisgKi8KK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisgIGludCBxdWFsaXR5OwkJCS8qIC1xdWFsaXR5IHBhcmFtZXRlciAqLworICBpbnQgcV9zY2FsZV9mYWN0b3I7CQkvKiBzY2FsaW5nIHBlcmNlbnRhZ2UgZm9yIC1xdGFibGVzICovCisgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmU7CisgIGJvb2xlYW4gc2ltcGxlX3Byb2dyZXNzaXZlOworICBjaGFyICogcXRhYmxlZmlsZSA9IE5VTEw7CS8qIHNhdmVzIC1xdGFibGVzIGZpbGVuYW1lIGlmIGFueSAqLworICBjaGFyICogcXNsb3RzYXJnID0gTlVMTDsJLyogc2F2ZXMgLXFzbG90cyBwYXJtIGlmIGFueSAqLworICBjaGFyICogc2FtcGxlYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNhbXBsZSBwYXJtIGlmIGFueSAqLworICBjaGFyICogc2NhbnNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2NhbnMgcGFybSBpZiBhbnkgKi8KKworICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCisgIC8qIE5vdGUgdGhhdCBkZWZhdWx0IC1xdWFsaXR5IGxldmVsIG5lZWQgbm90LCBhbmQgZG9lcyBub3QsCisgICAqIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxpbmcgZm9yIGFuIGV4cGxpY2l0IC1xdGFibGVzIGFyZ3VtZW50LgorICAgKi8KKyAgcXVhbGl0eSA9IDc1OwkJCS8qIGRlZmF1bHQgLXF1YWxpdHkgdmFsdWUgKi8KKyAgcV9zY2FsZV9mYWN0b3IgPSAxMDA7CQkvKiBkZWZhdWx0IHRvIG5vIHNjYWxpbmcgZm9yIC1xdGFibGVzICovCisgIGZvcmNlX2Jhc2VsaW5lID0gRkFMU0U7CS8qIGJ5IGRlZmF1bHQsIGFsbG93IDE2LWJpdCBxdWFudGl6ZXJzICovCisgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IEZBTFNFOworICBpc190YXJnYSA9IEZBTFNFOworICBvdXRmaWxlbmFtZSA9IE5VTEw7CisgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLworCisgIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKKyAgICBhcmcgPSBhcmd2W2FyZ25dOworICAgIGlmICgqYXJnICE9ICctJykgeworICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCisgICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKKwlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLworCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLworICAgICAgfQorICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KKyAgICB9CisgICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCisKKyAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYXJpdGhtZXRpYyIsIDEpKSB7CisgICAgICAvKiBVc2UgYXJpdGhtZXRpYyBjb2RpbmcuICovCisjaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECisgICAgICBjaW5mby0+YXJpdGhfY29kZSA9IFRSVUU7CisjZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGFyaXRobWV0aWMgY29kaW5nIG5vdCBzdXBwb3J0ZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImJhc2VsaW5lIiwgMSkpIHsKKyAgICAgIC8qIEZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgb3V0cHV0ICg4LWJpdCBxdWFudGl6ZXIgdmFsdWVzKS4gKi8KKyAgICAgIGZvcmNlX2Jhc2VsaW5lID0gVFJVRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGN0IiwgMikpIHsKKyAgICAgIC8qIFNlbGVjdCBEQ1QgYWxnb3JpdGhtLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJpbnQiLCAxKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JU0xPVzsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZhc3QiLCAyKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZsb2F0IiwgMikpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkxPQVQ7CisgICAgICB9IGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgeworICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KKyAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCisgICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKKworICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7CisJZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgQ0pQRUcsIHZlcnNpb24gJXNcbiVzXG4iLAorCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7CisJcHJpbnRlZF92ZXJzaW9uID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsKys7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdyYXlzY2FsZSIsIDIpIHx8IGtleW1hdGNoKGFyZywgImdyZXlzY2FsZSIsMikpIHsKKyAgICAgIC8qIEZvcmNlIGEgbW9ub2Nocm9tZSBKUEVHIGZpbGUgdG8gYmUgZ2VuZXJhdGVkLiAqLworICAgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX0dSQVlTQ0FMRSk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7CisgICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLworICAgICAgbG9uZyBsdmFsOworICAgICAgY2hhciBjaCA9ICd4JzsKKworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCisJdXNhZ2UoKTsKKyAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQorCWx2YWwgKj0gMTAwMEw7CisgICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3B0aW1pemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJvcHRpbWlzZSIsIDEpKSB7CisgICAgICAvKiBFbmFibGUgZW50cm9weSBwYXJtIG9wdGltaXphdGlvbi4gKi8KKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBlbnRyb3B5IG9wdGltaXphdGlvbiB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvdXRmaWxlIiwgNCkpIHsKKyAgICAgIC8qIFNldCBvdXRwdXQgZmlsZSBuYW1lLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2FyZ25dOwkvKiBzYXZlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZSAqLworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJwcm9ncmVzc2l2ZSIsIDEpKSB7CisgICAgICAvKiBTZWxlY3Qgc2ltcGxlIHByb2dyZXNzaXZlIG1vZGUuICovCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IFRSVUU7CisgICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIGV4ZWN1dGlvbiB1bnRpbCBudW1fY29tcG9uZW50cyBpcyBrbm93bi4gKi8KKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgcHJvZ3Jlc3NpdmUgb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInF1YWxpdHkiLCAxKSkgeworICAgICAgLyogUXVhbGl0eSBmYWN0b3IgKHF1YW50aXphdGlvbiB0YWJsZSBzY2FsaW5nIGZhY3RvcikuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZxdWFsaXR5KSAhPSAxKQorCXVzYWdlKCk7CisgICAgICAvKiBDaGFuZ2Ugc2NhbGUgZmFjdG9yIGluIGNhc2UgLXF0YWJsZXMgaXMgcHJlc2VudC4gKi8KKyAgICAgIHFfc2NhbGVfZmFjdG9yID0ganBlZ19xdWFsaXR5X3NjYWxpbmcocXVhbGl0eSk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInFzbG90cyIsIDIpKSB7CisgICAgICAvKiBRdWFudGl6YXRpb24gdGFibGUgc2xvdCBudW1iZXJzLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgcXNsb3RzYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIE11c3QgZGVsYXkgc2V0dGluZyBxc2xvdHMgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBwcm9jZXNzZWQgYW55CisgICAgICAgKiBjb2xvcnNwYWNlLWRldGVybWluaW5nIHN3aXRjaGVzLCBzaW5jZSBqcGVnX3NldF9jb2xvcnNwYWNlIHNldHMKKyAgICAgICAqIGRlZmF1bHQgcXVhbnQgdGFibGUgbnVtYmVycy4KKyAgICAgICAqLworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJxdGFibGVzIiwgMikpIHsKKyAgICAgIC8qIFF1YW50aXphdGlvbiB0YWJsZXMgZmV0Y2hlZCBmcm9tIGZpbGUuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBxdGFibGVmaWxlID0gYXJndlthcmduXTsKKyAgICAgIC8qIFdlIHBvc3Rwb25lIGFjdHVhbGx5IHJlYWRpbmcgdGhlIGZpbGUgaW4gY2FzZSAtcXVhbGl0eSBjb21lcyBsYXRlci4gKi8KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmVzdGFydCIsIDEpKSB7CisgICAgICAvKiBSZXN0YXJ0IGludGVydmFsIGluIE1DVSByb3dzIChvciBpbiBNQ1VzIHdpdGggJ2InKS4gKi8KKyAgICAgIGxvbmcgbHZhbDsKKyAgICAgIGNoYXIgY2ggPSAneCc7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQorCXVzYWdlKCk7CisgICAgICBpZiAobHZhbCA8IDAgfHwgbHZhbCA+IDY1NTM1TCkKKwl1c2FnZSgpOworICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKKwljaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIGx2YWw7CisJY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7IC8qIGVsc2UgcHJpb3IgJy1yZXN0YXJ0IG4nIG92ZXJyaWRlcyBtZSAqLworICAgICAgfSBlbHNlIHsKKwljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gKGludCkgbHZhbDsKKwkvKiByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgY29tcHV0ZWQgZHVyaW5nIHN0YXJ0dXAgKi8KKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2FtcGxlIiwgMikpIHsKKyAgICAgIC8qIFNldCBzYW1wbGluZyBmYWN0b3JzLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgc2FtcGxlYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIE11c3QgZGVsYXkgc2V0dGluZyBzYW1wbGUgZmFjdG9ycyB1bnRpbCBhZnRlciB3ZSBoYXZlIHByb2Nlc3NlZCBhbnkKKyAgICAgICAqIGNvbG9yc3BhY2UtZGV0ZXJtaW5pbmcgc3dpdGNoZXMsIHNpbmNlIGpwZWdfc2V0X2NvbG9yc3BhY2Ugc2V0cworICAgICAgICogZGVmYXVsdCBzYW1wbGluZyBmYWN0b3JzLgorICAgICAgICovCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYW5zIiwgMikpIHsKKyAgICAgIC8qIFNldCBzY2FuIHNjcmlwdC4gKi8KKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIHNjYW5zYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1wcm9ncmVzc2l2ZSBhcHBlYXJzLiAqLworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBtdWx0aS1zY2FuIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzbW9vdGgiLCAyKSkgeworICAgICAgLyogU2V0IGlucHV0IHNtb290aGluZyBmYWN0b3IuICovCisgICAgICBpbnQgdmFsOworCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZ2YWwpICE9IDEpCisJdXNhZ2UoKTsKKyAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDEwMCkKKwl1c2FnZSgpOworICAgICAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSB2YWw7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRhcmdhIiwgMSkpIHsKKyAgICAgIC8qIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAqLworICAgICAgaXNfdGFyZ2EgPSBUUlVFOworCisgICAgfSBlbHNlIHsKKyAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCisgICAgfQorICB9CisKKyAgLyogUG9zdC1zd2l0Y2gtc2Nhbm5pbmcgY2xlYW51cCAqLworCisgIGlmIChmb3JfcmVhbCkgeworCisgICAgLyogU2V0IHF1YW50aXphdGlvbiB0YWJsZXMgZm9yIHNlbGVjdGVkIHF1YWxpdHkuICovCisgICAgLyogU29tZSBvciBhbGwgbWF5IGJlIG92ZXJyaWRkZW4gaWYgLXF0YWJsZXMgaXMgcHJlc2VudC4gKi8KKyAgICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCBxdWFsaXR5LCBmb3JjZV9iYXNlbGluZSk7CisKKyAgICBpZiAocXRhYmxlZmlsZSAhPSBOVUxMKQkvKiBwcm9jZXNzIC1xdGFibGVzIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISByZWFkX3F1YW50X3RhYmxlcyhjaW5mbywgcXRhYmxlZmlsZSwKKwkJCSAgICAgIHFfc2NhbGVfZmFjdG9yLCBmb3JjZV9iYXNlbGluZSkpCisJdXNhZ2UoKTsKKworICAgIGlmIChxc2xvdHNhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtcXNsb3RzIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISBzZXRfcXVhbnRfc2xvdHMoY2luZm8sIHFzbG90c2FyZykpCisJdXNhZ2UoKTsKKworICAgIGlmIChzYW1wbGVhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtc2FtcGxlIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISBzZXRfc2FtcGxlX2ZhY3RvcnMoY2luZm8sIHNhbXBsZWFyZykpCisJdXNhZ2UoKTsKKworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgaWYgKHNpbXBsZV9wcm9ncmVzc2l2ZSkJLyogcHJvY2VzcyAtcHJvZ3Jlc3NpdmU7IC1zY2FucyBjYW4gb3ZlcnJpZGUgKi8KKyAgICAgIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKGNpbmZvKTsKKyNlbmRpZgorCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgaWYgKHNjYW5zYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNjYW5zIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISByZWFkX3NjYW5fc2NyaXB0KGNpbmZvLCBzY2Fuc2FyZykpCisJdXNhZ2UoKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHByb2dyZXNzOworI2VuZGlmCisgIGludCBmaWxlX2luZGV4OworICBjanBlZ19zb3VyY2VfcHRyIHNyY19tZ3I7CisgIEZJTEUgKiBpbnB1dF9maWxlOworICBGSUxFICogb3V0cHV0X2ZpbGU7CisgIEpESU1FTlNJT04gbnVtX3NjYW5saW5lczsKKworICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLworI2lmZGVmIFVTRV9DQ09NTUFORAorICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOworI2VuZGlmCisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQorICAgIHByb2duYW1lID0gImNqcGVnIjsJCS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLworCisgIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KKyAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOworICAvKiBBZGQgc29tZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBtZXNzYWdlcyAoZnJvbSBjZGVycm9yLmgpICovCisgIGplcnIuYWRkb25fbWVzc2FnZV90YWJsZSA9IGNkanBlZ19tZXNzYWdlX3RhYmxlOworICBqZXJyLmZpcnN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0ZJUlNUQURET05DT0RFOworICBqZXJyLmxhc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfTEFTVEFERE9OQ09ERTsKKworICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuICovCisjaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorICBlbmFibGVfc2lnbmFsX2NhdGNoZXIoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKKyNlbmRpZgorCisgIC8qIEluaXRpYWxpemUgSlBFRyBwYXJhbWV0ZXJzLgorICAgKiBNdWNoIG9mIHRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIuCisgICAqIEluIHBhcnRpY3VsYXIsIHdlIGRvbid0IHlldCBrbm93IHRoZSBpbnB1dCBmaWxlJ3MgY29sb3Igc3BhY2UsCisgICAqIGJ1dCB3ZSBuZWVkIHRvIHByb3ZpZGUgc29tZSB2YWx1ZSBmb3IganBlZ19zZXRfZGVmYXVsdHMoKSB0byB3b3JrLgorICAgKi8KKworICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7IC8qIGFyYml0cmFyeSBndWVzcyAqLworICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOworCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4KKyAgICogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKKyAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyIG9wZW5pbmcKKyAgICogdGhlIGlucHV0IGZpbGUuCisgICAqLworCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmY2luZm8sIGFyZ2MsIGFyZ3YsIDAsIEZBTFNFKTsKKworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIC8qIE11c3QgaGF2ZSBlaXRoZXIgLW91dGZpbGUgc3dpdGNoIG9yIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KKyAgaWYgKG91dGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTIpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleCsxXTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKKyAgICB1c2FnZSgpOworICB9CisjZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KKworICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MpIHsKKyAgICBpZiAoKGlucHV0X2ZpbGUgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCisgICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKKyAgfQorCisgIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLworICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgeworICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KKyAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOworICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8sICZwcm9ncmVzcyk7CisjZW5kaWYKKworICAvKiBGaWd1cmUgb3V0IHRoZSBpbnB1dCBmaWxlIGZvcm1hdCwgYW5kIHNldCB1cCB0byByZWFkIGl0LiAqLworICBzcmNfbWdyID0gc2VsZWN0X2ZpbGVfdHlwZSgmY2luZm8sIGlucHV0X2ZpbGUpOworICBzcmNfbWdyLT5pbnB1dF9maWxlID0gaW5wdXRfZmlsZTsKKworICAvKiBSZWFkIHRoZSBpbnB1dCBmaWxlIGhlYWRlciB0byBvYnRhaW4gZmlsZSBzaXplICYgY29sb3JzcGFjZS4gKi8KKyAgKCpzcmNfbWdyLT5zdGFydF9pbnB1dCkgKCZjaW5mbywgc3JjX21ncik7CisKKyAgLyogTm93IHRoYXQgd2Uga25vdyBpbnB1dCBjb2xvcnNwYWNlLCBmaXggY29sb3JzcGFjZS1kZXBlbmRlbnQgZGVmYXVsdHMgKi8KKyAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoJmNpbmZvKTsKKworICAvKiBBZGp1c3QgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KKyAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7CisKKyAgLyogU3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIGZvciBjb21wcmVzc2lvbiAqLworICBqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRwdXRfZmlsZSk7CisKKyAgLyogU3RhcnQgY29tcHJlc3NvciAqLworICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisKKyAgLyogUHJvY2VzcyBkYXRhICovCisgIHdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7CisgICAgbnVtX3NjYW5saW5lcyA9ICgqc3JjX21nci0+Z2V0X3BpeGVsX3Jvd3MpICgmY2luZm8sIHNyY19tZ3IpOworICAgICh2b2lkKSBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHNyY19tZ3ItPmJ1ZmZlciwgbnVtX3NjYW5saW5lcyk7CisgIH0KKworICAvKiBGaW5pc2ggY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5ICovCisgICgqc3JjX21nci0+ZmluaXNoX2lucHV0KSAoJmNpbmZvLCBzcmNfbWdyKTsKKyAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKyAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCisgIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQorICAgIGZjbG9zZShpbnB1dF9maWxlKTsKKyAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKKyAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisjZW5kaWYKKworICAvKiBBbGwgZG9uZS4gKi8KKyAgZXhpdChqZXJyLm51bV93YXJuaW5ncyA/IEVYSVRfV0FSTklORyA6IEVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvY2tjb25maWcuYyBiL2NrY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiYWY3OQotLS0gL2Rldi9udWxsCisrKyBiL2NrY29uZmlnLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBja2NvbmZpZy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIHRvIGhlbHAgeW91IGRldGVybWluZSBob3cgdG8gY29uZmlndXJlIHRoZSBKUEVHCisgKiBzb2Z0d2FyZSBmb3IgaW5zdGFsbGF0aW9uIG9uIGEgcGFydGljdWxhciBzeXN0ZW0uICBUaGUgaWRlYSBpcyB0byB0cnkgdG8KKyAqIGNvbXBpbGUgYW5kIGV4ZWN1dGUgdGhpcyBwcm9ncmFtLiAgSWYgeW91ciBjb21waWxlciBmYWlscyB0byBjb21waWxlIHRoZQorICogcHJvZ3JhbSwgbWFrZSBjaGFuZ2VzIGFzIGluZGljYXRlZCBpbiB0aGUgY29tbWVudHMgYmVsb3cuICBPbmNlIHlvdSBjYW4KKyAqIGNvbXBpbGUgdGhlIHByb2dyYW0sIHJ1biBpdCwgYW5kIGl0IHdpbGwgcHJvZHVjZSBhICJqY29uZmlnLmgiIGZpbGUgZm9yCisgKiB5b3VyIHN5c3RlbS4KKyAqCisgKiBBcyBhIGdlbmVyYWwgcnVsZSwgZWFjaCB0aW1lIHlvdSB0cnkgdG8gY29tcGlsZSB0aGlzIHByb2dyYW0sCisgKiBwYXkgYXR0ZW50aW9uIG9ubHkgdG8gdGhlICpmaXJzdCogZXJyb3IgbWVzc2FnZSB5b3UgZ2V0IGZyb20gdGhlIGNvbXBpbGVyLgorICogTWFueSBDIGNvbXBpbGVycyB3aWxsIGlzc3VlIGxvdHMgb2Ygc3B1cmlvdXMgZXJyb3IgbWVzc2FnZXMgb25jZSB0aGV5CisgKiBoYXZlIGdvdHRlbiBjb25mdXNlZC4gIEdvIHRvIHRoZSBsaW5lIGluZGljYXRlZCBpbiB0aGUgZmlyc3QgZXJyb3IgbWVzc2FnZSwKKyAqIGFuZCByZWFkIHRoZSBjb21tZW50cyBwcmVjZWRpbmcgdGhhdCBsaW5lIHRvIHNlZSB3aGF0IHRvIGNoYW5nZS4KKyAqCisgKiBBbG1vc3QgYWxsIG9mIHRoZSBlZGl0cyB5b3UgbWF5IG5lZWQgdG8gbWFrZSB0byB0aGlzIHByb2dyYW0gY29uc2lzdCBvZgorICogY2hhbmdpbmcgYSBsaW5lIHRoYXQgcmVhZHMgIiNkZWZpbmUgU09NRV9TWU1CT0wiIHRvICIjdW5kZWYgU09NRV9TWU1CT0wiLAorICogb3IgdmljZSB2ZXJzYS4gIFRoaXMgaXMgY2FsbGVkIGRlZmluaW5nIG9yIHVuZGVmaW5pbmcgdGhhdCBzeW1ib2wuCisgKi8KKworCisvKiBGaXJzdCB3ZSBtdXN0IHNlZSBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIGluY2x1ZGUgZmlsZXMgd2UgbmVlZC4KKyAqIFdlIHN0YXJ0IG91dCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91ciBzeXN0ZW0gaGFzIGFsbCB0aGUgQU5TSS1zdGFuZGFyZAorICogaW5jbHVkZSBmaWxlcy4gIElmIHlvdSBnZXQgYW55IGVycm9yIHRyeWluZyB0byBpbmNsdWRlIG9uZSBvZiB0aGVzZSBmaWxlcywKKyAqIHVuZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIEhBVkVfeHh4IHN5bWJvbC4KKyAqLworCisjZGVmaW5lIEhBVkVfU1REREVGX0gJCS8qIHJlcGxhY2UgJ2RlZmluZScgYnkgJ3VuZGVmJyBpZiBlcnJvciBoZXJlICovCisjaWZkZWYgSEFWRV9TVERERUZfSAkJLyogbmV4dCBsaW5lIHdpbGwgYmUgc2tpcHBlZCBpZiB5b3UgdW5kZWYuLi4gKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisjZGVmaW5lIEhBVkVfU1RETElCX0gJCS8qIHNhbWUgdGhpbmcgZm9yIHN0ZGxpYi5oICovCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgkJLyogSWYgeW91IGFpbid0IGdvdCB0aGlzLCB5b3UgYWluJ3QgZ290IEMuICovCisKKy8qIFdlIGhhdmUgdG8gc2VlIGlmIHlvdXIgc3RyaW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBieQorICogc3RyaW5ncy5oIChvbGQgQlNEIGNvbnZlbnRpb24pIG9yIHN0cmluZy5oIChldmVyeWJvZHkgZWxzZSkuCisgKiBXZSB0cnkgdGhlIG5vbi1CU0QgY29udmVudGlvbiBmaXJzdDsgZGVmaW5lIE5FRURfQlNEX1NUUklOR1MKKyAqIGlmIHRoZSBjb21waWxlciBzYXlzIGl0IGNhbid0IGZpbmQgc3RyaW5nLmguCisgKi8KKworI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKworI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKy8qIE9uIHNvbWUgc3lzdGVtcyAoZXNwZWNpYWxseSBvbGRlciBVbml4IG1hY2hpbmVzKSwgdHlwZSBzaXplX3QgaXMKKyAqIGRlZmluZWQgb25seSBpbiB0aGUgaW5jbHVkZSBmaWxlIDxzeXMvdHlwZXMuaD4uICBJZiB5b3UgZ2V0IGEgZmFpbHVyZQorICogb24gdGhlIHNpemVfdCB0ZXN0IGJlbG93LCB0cnkgZGVmaW5pbmcgTkVFRF9TWVNfVFlQRVNfSC4KKyAqLworCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAkJLyogc3RhcnQgYnkgYXNzdW1pbmcgd2UgZG9uJ3QgbmVlZCBpdCAqLworI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisKKy8qIFVzdWFsbHkgdHlwZSBzaXplX3QgaXMgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGluY2x1ZGUgZmlsZXMgd2UndmUgaW5jbHVkZWQKKyAqIGFib3ZlLiAgSWYgbm90LCB5b3UnbGwgZ2V0IGFuIGVycm9yIG9uIHRoZSAidHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OyIgbGluZS4KKyAqIEluIHRoYXQgY2FzZSwgZmlyc3QgdHJ5IGRlZmluaW5nIE5FRURfU1lTX1RZUEVTX0gganVzdCBhYm92ZS4KKyAqIElmIHRoYXQgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBzZWFyY2ggdGhyb3VnaCB5b3VyIHN5c3RlbSBsaWJyYXJ5CisgKiB0byBmaWd1cmUgb3V0IHdoaWNoIGluY2x1ZGUgZmlsZSBkZWZpbmVzICJzaXplX3QiLiAgTG9vayBmb3IgYSBsaW5lIHRoYXQKKyAqIHNheXMgInR5cGVkZWYgc29tZXRoaW5nLW9yLW90aGVyIHNpemVfdDsiLiAgVGhlbiwgY2hhbmdlIHRoZSBsaW5lIGJlbG93CisgKiB0aGF0IHNheXMgIiNpbmNsdWRlIDxzb21laW5jbHVkZWZpbGUuaD4iIHRvIGluc3RlYWQgaW5jbHVkZSB0aGUgZmlsZQorICogeW91IGZvdW5kIHNpemVfdCBpbiwgYW5kIGRlZmluZSBORUVEX1NQRUNJQUxfSU5DTFVERS4gIElmIHlvdSBjYW4ndCBmaW5kCisgKiB0eXBlIHNpemVfdCBhbnl3aGVyZSwgdHJ5IHJlcGxhY2luZyAiI2luY2x1ZGUgPHNvbWVpbmNsdWRlZmlsZS5oPiIgd2l0aAorICogInR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsiLgorICovCisKKyN1bmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQkvKiBhc3N1bWUgd2UgRE9OJ1QgbmVlZCBpdCwgZm9yIHN0YXJ0ZXJzICovCisKKyNpZmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQorI2luY2x1ZGUgPHNvbWVpbmNsdWRlZmlsZS5oPgorI2VuZGlmCisKK3R5cGVkZWYgc2l6ZV90IG15X3NpemVfdDsJLyogVGhlIHBheW9mZjogZG8gd2UgaGF2ZSBzaXplX3Qgbm93PyAqLworCisKKy8qIFRoZSBuZXh0IHF1ZXN0aW9uIGlzIHdoZXRoZXIgeW91ciBjb21waWxlciBzdXBwb3J0cyBBTlNJLXN0eWxlIGZ1bmN0aW9uCisgKiBwcm90b3R5cGVzLiAgWW91IG5lZWQgdG8ga25vdyB0aGlzIGluIG9yZGVyIHRvIGNob29zZSBiZXR3ZWVuIHVzaW5nCisgKiBtYWtlZmlsZS5hbnNpIGFuZCB1c2luZyBtYWtlZmlsZS51bml4LgorICogVGhlICNkZWZpbmUgbGluZSBiZWxvdyBpcyBzZXQgdG8gYXNzdW1lIHlvdSBoYXZlIEFOU0kgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqIElmIHlvdSBnZXQgYW4gZXJyb3IgaW4gdGhpcyBncm91cCBvZiBsaW5lcywgdW5kZWZpbmUgSEFWRV9QUk9UT1RZUEVTLgorICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKTsgLyogY2hlY2sgcHJvdG90eXBlcyAqLworCitzdHJ1Y3QgbWV0aG9kc19zdHJ1Y3QgewkJLyogY2hlY2sgbWV0aG9kLXBvaW50ZXIgZGVjbGFyYXRpb25zICovCisgIGludCAoKmVycm9yX2V4aXQpIChjaGFyICptc2d0ZXh0KTsKKyAgaW50ICgqdHJhY2VfbWVzc2FnZSkgKGNoYXIgKm1zZ3RleHQpOworICBpbnQgKCphbm90aGVyX21ldGhvZCkgKHZvaWQpOworfTsKKworaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpIC8qIGNoZWNrIGRlZmluaXRpb25zICovCit7CisgIHJldHVybiBhcmcyW2FyZzFdOworfQorCitpbnQgdGVzdDJmdW5jdGlvbiAodm9pZCkJLyogY2hlY2sgdm9pZCBhcmcgbGlzdCAqLworeworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKy8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAidW5zaWduZWQgY2hhciIgbWVhbnMuCisgKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSAidW5zaWduZWQgY2hhciB1bl9jaGFyOyIgbGluZSwKKyAqIHRoZW4gdW5kZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSLgorICovCisKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKK3Vuc2lnbmVkIGNoYXIgdW5fY2hhcjsKKyNlbmRpZgorCisKKy8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAidW5zaWduZWQgc2hvcnQiIG1lYW5zLgorICogSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgInVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OyIgbGluZSwKKyAqIHRoZW4gdW5kZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVC4KKyAqLworCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKworI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKK3Vuc2lnbmVkIHNob3J0IHVuX3Nob3J0OworI2VuZGlmCisKKworLyogTm93IHdlIHdhbnQgdG8gZmluZCBvdXQgaWYgeW91ciBjb21waWxlciB1bmRlcnN0YW5kcyB0eXBlICJ2b2lkIi4KKyAqIElmIHlvdSBnZXQgYW4gZXJyb3IgYW55d2hlcmUgaW4gaGVyZSwgdW5kZWZpbmUgSEFWRV9WT0lELgorICovCisKKyNkZWZpbmUgSEFWRV9WT0lECisKKyNpZmRlZiBIQVZFX1ZPSUQKKy8qIENhdXRpb246IGEgQysrIGNvbXBpbGVyIHdpbGwgaW5zaXN0IG9uIGNvbXBsZXRlIHByb3RvdHlwZXMgKi8KK3R5cGVkZWYgdm9pZCAqIHZvaWRfcHRyOwkvKiBjaGVjayB2b2lkICogKi8KKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLwordHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoaW50IGEsIGludCBiKTsKKyNlbHNlCit0eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpICgpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHZvaWQgZnVuY3Rpb24gcmVzdWx0ICovCit2b2lkIHRlc3QzZnVuY3Rpb24gKHZvaWRfcHRyIGFyZzEsIHZvaWRfZnVuYyBhcmcyKQorI2Vsc2UKK3ZvaWQgdGVzdDNmdW5jdGlvbiAoYXJnMSwgYXJnMikKKyAgICAgdm9pZF9wdHIgYXJnMTsKKyAgICAgdm9pZF9mdW5jIGFyZzI7CisjZW5kaWYKK3sKKyAgY2hhciAqIGxvY3B0ciA9IChjaGFyICopIGFyZzE7IC8qIGNoZWNrIGNhc3RpbmcgdG8gYW5kIGZyb20gdm9pZCAqICovCisgIGFyZzEgPSAodm9pZCAqKSBsb2NwdHI7CisgICgqYXJnMikgKDEsIDIpOwkJLyogY2hlY2sgY2FsbCBvZiBmY24gcmV0dXJuaW5nIHZvaWQgKi8KK30KKyNlbmRpZgorCisKKy8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAiY29uc3QiIG1lYW5zLgorICogSWYgeW91IGdldCBhbiBlcnJvciBoZXJlLCB1bmRlZmluZSBIQVZFX0NPTlNULgorICovCisKKyNkZWZpbmUgSEFWRV9DT05TVAorCisjaWZkZWYgSEFWRV9DT05TVAorc3RhdGljIGNvbnN0IGludCBjYXJyYXlbM10gPSB7MSwgMiwgM307CisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCB0ZXN0NGZ1bmN0aW9uIChjb25zdCBpbnQgYXJnMSkKKyNlbHNlCitpbnQgdGVzdDRmdW5jdGlvbiAoYXJnMSkKKyAgICAgY29uc3QgaW50IGFyZzE7CisjZW5kaWYKK3sKKyAgcmV0dXJuIGNhcnJheVthcmcxXTsKK30KKyNlbmRpZgorCisKKy8qIElmIHlvdSBnZXQgYW4gZXJyb3Igb3Igd2FybmluZyBhYm91dCB0aGlzIHN0cnVjdHVyZSBkZWZpbml0aW9uLAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLgorICovCisKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCit0eXBlZGVmIHN0cnVjdCB1bmRlZmluZWRfc3RydWN0dXJlICogdW5kZWZfc3RydWN0X3B0cjsKKyNlbmRpZgorCisKKy8qIElmIHlvdSBnZXQgYW4gZXJyb3IgYWJvdXQgZHVwbGljYXRlIG5hbWVzLAorICogZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMuCisgKi8KKworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKworI2lmbmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKK2ludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBwb3NzaWJseV9kdXBsaV9mdW5jdGlvbiAoKQoreworICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgT0ssIHRoYXQncyBpdC4gIFlvdSBzaG91bGQgbm90IGhhdmUgdG8gY2hhbmdlIGFueXRoaW5nIGJleW9uZCB0aGlzCisgKiAgcG9pbnQgaW4gb3JkZXIgdG8gY29tcGlsZSBhbmQgZXhlY3V0ZSB0aGlzIHByb2dyYW0uICAoWW91IG1pZ2h0IGdldAorICogIHNvbWUgd2FybmluZ3MsIGJ1dCB5b3UgY2FuIGlnbm9yZSB0aGVtLikKKyAqICBXaGVuIHlvdSBydW4gdGhlIHByb2dyYW0sIGl0IHdpbGwgbWFrZSBhIGNvdXBsZSBtb3JlIHRlc3RzIHRoYXQgaXQKKyAqICBjYW4gZG8gYXV0b21hdGljYWxseSwgYW5kIHRoZW4gaXQgd2lsbCBjcmVhdGUgamNvbmZpZy5oIGFuZCBwcmludCBvdXQKKyAqICBhbnkgYWRkaXRpb25hbCBzdWdnZXN0aW9ucyBpdCBoYXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfY2hhcl9zaWduZWQgKGludCBhcmcpCisjZWxzZQoraW50IGlzX2NoYXJfc2lnbmVkIChhcmcpCisgICAgIGludCBhcmc7CisjZW5kaWYKK3sKKyAgaWYgKGFyZyA9PSAxODkpIHsJCS8qIGV4cGVjdGVkIHJlc3VsdCBmb3IgdW5zaWduZWQgY2hhciAqLworICAgIHJldHVybiAwOwkJCS8qIHR5cGUgY2hhciBpcyB1bnNpZ25lZCAqLworICB9CisgIGVsc2UgaWYgKGFyZyAhPSAtNjcpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgY2hhciAqLworICAgIHByaW50ZigiSG1tLCBpdCBzZWVtcyAnY2hhcicgaXMgbm90IGVpZ2h0IGJpdHMgd2lkZSBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKKyAgICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIH0KKyAgcmV0dXJuIDE7CQkJLyogYXNzdW1lIGNoYXIgaXMgc2lnbmVkIG90aGVyd2lzZSAqLworfQorCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGxvbmcgYXJnKQorI2Vsc2UKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGFyZykKKyAgICAgbG9uZyBhcmc7CisjZW5kaWYKKy8qIFNlZSB3aGV0aGVyIHJpZ2h0LXNoaWZ0IG9uIGEgbG9uZyBpcyBzaWduZWQgb3Igbm90LiAqLworeworICBsb25nIHJlcyA9IGFyZyA+PiA0OworCisgIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgc2hpZnQgKi8KKyAgICByZXR1cm4gMTsJCQkvKiByaWdodCBzaGlmdCBpcyBzaWduZWQgKi8KKyAgfQorICAvKiBzZWUgaWYgdW5zaWduZWQtc2hpZnQgaGFjayB3aWxsIGZpeCBpdC4gKi8KKyAgLyogd2UgY2FuJ3QganVzdCB0ZXN0IGV4YWN0IHZhbHVlIHNpbmNlIGl0IGRlcGVuZHMgb24gd2lkdGggb2YgbG9uZy4uLiAqLworICByZXMgfD0gKH4wTCkgPDwgKDMyLTQpOworICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBub3c/ICovCisgICAgcmV0dXJuIDA7CQkJLyogcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgKi8KKyAgfQorICBwcmludGYoIlJpZ2h0IHNoaWZ0IGlzbid0IGFjdGluZyBhcyBJIGV4cGVjdCBpdCB0by5cbiIpOworICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIHJldHVybiAwOwkJCS8qIHRyeSBpdCB3aXRoIHVuc2lnbmVkIGFueXdheSAqLworfQorCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKiBhcmd2KQorI2Vsc2UKK2ludCBtYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKiBhcmd2OworI2VuZGlmCit7CisgIGNoYXIgc2lnbmVkX2NoYXJfY2hlY2sgPSAoY2hhcikgKC02Nyk7CisgIEZJTEUgKm91dGZpbGU7CisKKyAgLyogQXR0ZW1wdCB0byB3cml0ZSBqY29uZmlnLmggKi8KKyAgaWYgKChvdXRmaWxlID0gZm9wZW4oImpjb25maWcuaCIsICJ3IikpID09IE5VTEwpIHsKKyAgICBwcmludGYoIkZhaWxlZCB0byB3cml0ZSBqY29uZmlnLmhcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogV3JpdGUgb3V0IGFsbCB0aGUgaW5mbyAqLworICBmcHJpbnRmKG91dGZpbGUsICIvKiBqY29uZmlnLmggLS0tIGdlbmVyYXRlZCBieSBja2NvbmZpZy5jICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi9cblxuIik7CisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1BST1RPVFlQRVNcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1VOU0lHTkVEX0NIQVJcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9VTlNJR05FRF9TSE9SVAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlRcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfVU5TSUdORURfU0hPUlRcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9WT0lECisgIGZwcmludGYob3V0ZmlsZSwgIi8qICNkZWZpbmUgdm9pZCBjaGFyICovXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgdm9pZCBjaGFyXG4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQ09OU1QKKyAgZnByaW50ZihvdXRmaWxlLCAiLyogI2RlZmluZSBjb25zdCAqL1xuIik7CisjZWxzZQorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIGNvbnN0XG4iKTsKKyNlbmRpZgorICBpZiAoaXNfY2hhcl9zaWduZWQoKGludCkgc2lnbmVkX2NoYXJfY2hlY2spKQorICAgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBDSEFSX0lTX1VOU0lHTkVEXG4iKTsKKyAgZWxzZQorICAgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgQ0hBUl9JU19VTlNJR05FRFxuIik7CisjaWZkZWYgSEFWRV9TVERERUZfSAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfU1REREVGX0hcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfU1REREVGX0hcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfU1RETElCX0hcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfU1RETElCX0hcbiIpOworI2VuZGlmCisjaWZkZWYgTkVFRF9CU0RfU1RSSU5HUworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfQlNEX1NUUklOR1NcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfQlNEX1NUUklOR1NcbiIpOworI2VuZGlmCisjaWZkZWYgTkVFRF9TWVNfVFlQRVNfSAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfU1lTX1RZUEVTX0hcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU1lTX1RZUEVTX0hcbiIpOworI2VuZGlmCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSU1xuIik7CisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNcbiIpOworI2VuZGlmCisjaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTlxuIik7CisjZWxzZQorICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU5cbiIpOworI2VuZGlmCisgIGZwcmludGYob3V0ZmlsZSwgIlxuI2lmZGVmIEpQRUdfSU5URVJOQUxTXG5cbiIpOworICBpZiAoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpCisgICAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEXG4iKTsKKyAgZWxzZQorICAgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORURcbiIpOworICBmcHJpbnRmKG91dGZpbGUsICJcbiNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIlxuI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUdcblxuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIFlvdSBtYXkgbmVlZCB0aGlzIG9uIG5vbi1Vbml4IHN5c3RlbXMgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1uYW1lLmMgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgRE9OVF9VU0VfQl9NT0RFXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiLyogI2RlZmluZSBQUk9HUkVTU19SRVBPUlQgKi8JLyogb3B0aW9uYWwgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICJcbiNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovXG4iKTsKKworICAvKiBDbG9zZSB0aGUgamNvbmZpZy5oIGZpbGUgKi8KKyAgZmNsb3NlKG91dGZpbGUpOworCisgIC8qIFVzZXIgcmVwb3J0ICovCisgIHByaW50ZigiQ29uZmlndXJhdGlvbiBjaGVjayBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlIGRvbmUuXG4iKTsKKyAgcHJpbnRmKCJcbkkgaGF2ZSB3cml0dGVuIHRoZSBqY29uZmlnLmggZmlsZSBmb3IgeW91LlxuXG4iKTsKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKKyAgcHJpbnRmKCJZb3Ugc2hvdWxkIHVzZSBtYWtlZmlsZS5hbnNpIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBNYWtlZmlsZS5cbiIpOworI2Vsc2UKKyAgcHJpbnRmKCJZb3Ugc2hvdWxkIHVzZSBtYWtlZmlsZS51bml4IGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBNYWtlZmlsZS5cbiIpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQorICBwcmludGYoIlxuWW91J2xsIG5lZWQgdG8gY2hhbmdlIGpjb25maWcuaCB0byBpbmNsdWRlIHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlXG4iKTsKKyAgcHJpbnRmKCJ0aGF0IHlvdSBmb3VuZCB0eXBlIHNpemVfdCBpbiwgb3IgYWRkIGEgZGlyZWN0IGRlZmluaXRpb24gb2YgdHlwZVxuIik7CisgIHByaW50Zigic2l6ZV90IGlmIHRoYXQncyB3aGF0IHlvdSB1c2VkLiAgSnVzdCBhZGQgaXQgdG8gdGhlIGVuZC5cbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb2RlcnVsZXMuZG9jIGIvY29kZXJ1bGVzLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI1ZDliCi0tLSAvZGV2L251bGwKKysrIGIvY29kZXJ1bGVzLmRvYwpAQCAtMCwwICsxLDExOCBAQAorSUpHIEpQRUcgTElCUkFSWTogIENPRElORyBSVUxFUworCitDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorCisKK1NpbmNlIG51bWVyb3VzIHBlb3BsZSB3aWxsIGJlIGNvbnRyaWJ1dGluZyBjb2RlIGFuZCBidWcgZml4ZXMsIGl0J3MgaW1wb3J0YW50Cit0byBlc3RhYmxpc2ggYSBjb21tb24gY29kaW5nIHN0eWxlLiAgVGhlIGdvYWwgb2YgdXNpbmcgc2ltaWxhciBjb2Rpbmcgc3R5bGVzCitpcyBtdWNoIG1vcmUgaW1wb3J0YW50IHRoYW4gdGhlIGRldGFpbHMgb2YganVzdCB3aGF0IHRoYXQgc3R5bGUgaXMuCisKK0luIGdlbmVyYWwgd2UgZm9sbG93IHRoZSByZWNvbW1lbmRhdGlvbnMgb2YgIlJlY29tbWVuZGVkIEMgU3R5bGUgYW5kIENvZGluZworU3RhbmRhcmRzIiByZXZpc2lvbiA2LjEgKENhbm5vbiBldCBhbC4gYXMgbW9kaWZpZWQgYnkgU3BlbmNlciwgS2VwcGVsIGFuZAorQnJhZGVyKS4gIFRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGluIHRoZSBJSkcgRlRQIGFyY2hpdmUgKHNlZQoranBlZy9kb2MvY3N0eWxlLm1zLnRibC5aLCBvciBjc3R5bGUudHh0LlogZm9yIHRob3NlIHdpdGhvdXQgbnJvZmYvdGJsKS4KKworQmxvY2sgY29tbWVudHMgc2hvdWxkIGJlIGxhaWQgb3V0IHRodXNseToKKworLyoKKyAqICBCbG9jayBjb21tZW50cyBpbiB0aGlzIHN0eWxlLgorICovCisKK1dlIGluZGVudCBzdGF0ZW1lbnRzIGluIEsmUiBzdHlsZSwgZS5nLiwKKwlpZiAodGVzdCkgeworCSAgdGhlbi1wYXJ0OworCX0gZWxzZSB7CisJICBlbHNlLXBhcnQ7CisJfQord2l0aCB0d28gc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbC4gIChUaGlzIGluZGVudGF0aW9uIGNvbnZlbnRpb24gaXMKK2hhbmRsZWQgYXV0b21hdGljYWxseSBieSBHTlUgRW1hY3MgYW5kIG1hbnkgb3RoZXIgdGV4dCBlZGl0b3JzLikKKworTXVsdGktd29yZCBuYW1lcyBzaG91bGQgYmUgd3JpdHRlbiBpbiBsb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMsIGUuZy4sCittdWx0aV93b3JkX25hbWUgKG5vdCBtdWx0aVdvcmROYW1lKS4gIFByZXByb2Nlc3NvciBzeW1ib2xzIGFuZCBlbnVtIGNvbnN0YW50cworYXJlIHNpbWlsYXIgYnV0IHVwcGVyIGNhc2UgKE1VTFRJX1dPUkRfTkFNRSkuICBOYW1lcyBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbgordGhlIGZpcnN0IGZpZnRlZW4gY2hhcmFjdGVycy4gIChPbiBzb21lIG9sZGVyIHN5c3RlbXMsIGdsb2JhbCBuYW1lcyBtdXN0IGJlCit1bmlxdWUgd2l0aGluIHNpeCBjaGFyYWN0ZXJzLiAgV2UgYWNjb21tb2RhdGUgdGhpcyB3aXRob3V0IGNsdXR0ZXJpbmcgdGhlCitzb3VyY2UgY29kZSBieSB1c2luZyBtYWNyb3MgdG8gc3Vic3RpdHV0ZSBzaG9ydGVyIG5hbWVzLikKKworV2UgdXNlIGZ1bmN0aW9uIHByb3RvdHlwZXMgZXZlcnl3aGVyZTsgd2UgcmVseSBvbiBhdXRvbWF0aWMgc291cmNlIGNvZGUKK3RyYW5zZm9ybWF0aW9uIHRvIGZlZWQgcHJvdG90eXBlLWxlc3MgQyBjb21waWxlcnMuICBUcmFuc2Zvcm1hdGlvbiBpcyBkb25lCitieSB0aGUgc2ltcGxlIGFuZCBwb3J0YWJsZSB0b29sICdhbnNpMmtuci5jJyAoY291cnRlc3kgb2YgR2hvc3RzY3JpcHQpLgorYW5zaTJrbnIgaXMgbm90IHZlcnkgYnJpZ2h0LCBzbyBpdCBpbXBvc2VzIGEgZm9ybWF0IHJlcXVpcmVtZW50IG9uIGZ1bmN0aW9uCitkZWNsYXJhdGlvbnM6IHRoZSBmdW5jdGlvbiBuYW1lIE1VU1QgQkVHSU4gSU4gQ09MVU1OIDEuICBUaHVzIGFsbCBmdW5jdGlvbnMKK3Nob3VsZCBiZSB3cml0dGVuIGluIHRoZSBmb2xsb3dpbmcgc3R5bGU6CisKK0xPQ0FMKGludCAqKQorZnVuY3Rpb25fbmFtZSAoaW50IGEsIGNoYXIgKmIpCit7CisgICAgY29kZS4uLgorfQorCitOb3RlIHRoYXQgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uIG11c3QgYmVnaW4gd2l0aCBHTE9CQUwodHlwZSksIExPQ0FMKHR5cGUpLAorb3IgTUVUSE9EREVGKHR5cGUpLiAgVGhlc2UgbWFjcm9zIGV4cGFuZCB0byAic3RhdGljIHR5cGUiIG9yIGp1c3QgInR5cGUiIGFzCithcHByb3ByaWF0ZS4gIFRoZXkgcHJvdmlkZSBhIHJlYWRhYmxlIGluZGljYXRpb24gb2YgdGhlIHJvdXRpbmUncyB1c2FnZSBhbmQKK2NhbiByZWFkaWx5IGJlIGNoYW5nZWQgZm9yIHNwZWNpYWwgbmVlZHMuICAoRm9yIGluc3RhbmNlLCBzcGVjaWFsIGxpbmthZ2UKK2tleXdvcmRzIGNhbiBiZSBpbnNlcnRlZCBmb3IgdXNlIGluIFdpbmRvd3MgRExMcy4pCisKK2Fuc2kya25yIGRvZXMgbm90IHRyYW5zZm9ybSBtZXRob2QgZGVjbGFyYXRpb25zIChmdW5jdGlvbiBwb2ludGVycyBpbgorc3RydWN0cykuICBXZSBoYW5kbGUgdGhlc2Ugd2l0aCBhIG1hY3JvIEpNRVRIT0QsIGRlZmluZWQgYXMKKwkjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisJI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpIGFyZ2xpc3QKKwkjZWxzZQorCSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSAoKQorCSNlbmRpZgord2hpY2ggaXMgdXNlZCBsaWtlIHRoaXM6CisJc3RydWN0IGZ1bmN0aW9uX3BvaW50ZXJzIHsKKwkgIEpNRVRIT0Qodm9pZCwgaW5pdF9lbnRyb3B5X2VuY29kZXIsIChpbnQgc29tZWFyZywganBhcm1zICpqcCkpOworCSAgSk1FVEhPRCh2b2lkLCB0ZXJtX2VudHJvcHlfZW5jb2RlciwgKHZvaWQpKTsKKwl9OworTm90ZSB0aGUgc2V0IG9mIHBhcmVudGhlc2VzIHN1cnJvdW5kaW5nIHRoZSBwYXJhbWV0ZXIgbGlzdC4KKworQSBzaW1pbGFyIHNvbHV0aW9uIGlzIHVzZWQgZm9yIGZvcndhcmQgYW5kIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworKHNlZSB0aGUgRVhURVJOIGFuZCBKUFAgbWFjcm9zKS4KKworSWYgdGhlIGNvZGUgaXMgdG8gd29yayBvbiBub24tQU5TSSBjb21waWxlcnMsIHdlIGNhbm5vdCByZWx5IG9uIGEgcHJvdG90eXBlCitkZWNsYXJhdGlvbiB0byBjb2VyY2UgYWN0dWFsIHBhcmFtZXRlcnMgaW50byB0aGUgcmlnaHQgdHlwZXMuICBUaGVyZWZvcmUsIHVzZQorZXhwbGljaXQgY2FzdHMgb24gYWN0dWFsIHBhcmFtZXRlcnMgd2hlbmV2ZXIgdGhlIGFjdHVhbCBwYXJhbWV0ZXIgdHlwZSBpcyBub3QKK2lkZW50aWNhbCB0byB0aGUgZm9ybWFsIHBhcmFtZXRlci4gIEJld2FyZSBvZiBpbXBsaWNpdCBjb252ZXJzaW9ucyB0byAiaW50Ii4KKworSXQgc2VlbXMgdGhlcmUgYXJlIHNvbWUgbm9uLUFOU0kgY29tcGlsZXJzIGluIHdoaWNoIHRoZSBzaXplb2YoKSBvcGVyYXRvcgoraXMgZGVmaW5lZCB0byByZXR1cm4gaW50LCB5ZXQgc2l6ZV90IGlzIGRlZmluZWQgYXMgbG9uZy4gIE5lZWRsZXNzIHRvIHNheSwKK3RoaXMgaXMgYnJhaW4tZGFtYWdlZC4gIEFsd2F5cyB1c2UgdGhlIFNJWkVPRigpIG1hY3JvIGluIHBsYWNlIG9mIHNpemVvZigpLAorc28gdGhhdCB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZSBzaXplX3QuCisKKworVGhlIEpQRUcgbGlicmFyeSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGhpbiBsYXJnZXIgcHJvZ3JhbXMuICBGdXJ0aGVybW9yZSwKK3dlIHdhbnQgaXQgdG8gYmUgcmVlbnRyYW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIHRoYXQgcHJvY2VzcworbXVsdGlwbGUgaW1hZ2VzIGNvbmN1cnJlbnRseS4gIFRoZSBmb2xsb3dpbmcgcnVsZXMgc3VwcG9ydCB0aGVzZSByZXF1aXJlbWVudHM6CisKKzEuIEF2b2lkIGRpcmVjdCB1c2Ugb2YgZmlsZSBJL08sICJtYWxsb2MiLCBlcnJvciByZXBvcnQgcHJpbnRvdXRzLCBldGM7CitwYXNzIHRoZXNlIHRocm91Z2ggdGhlIGNvbW1vbiByb3V0aW5lcyBwcm92aWRlZC4KKworMi4gTWluaW1pemUgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24uICBGdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIHN0YXRpYword2hlcmV2ZXIgcG9zc2libGUuICAoTm90ZSB0aGF0IG91ciBtZXRob2QtYmFzZWQgY2FsbGluZyBjb252ZW50aW9ucyBoZWxwIHRoaXMKK2EgbG90OiBpbiBtYW55IG1vZHVsZXMgb25seSB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gd2lsbCBldmVyIG5lZWQgdG8gYmUKK2NhbGxlZCBkaXJlY3RseSwgc28gb25seSB0aGF0IGZ1bmN0aW9uIG5lZWQgYmUgZXh0ZXJuYWxseSB2aXNpYmxlLikgIEFsbAorZ2xvYmFsIGZ1bmN0aW9uIG5hbWVzIHNob3VsZCBiZWdpbiB3aXRoICJqcGVnXyIsIGFuZCBzaG91bGQgaGF2ZSBhbgorYWJicmV2aWF0ZWQgbmFtZSAodW5pcXVlIGluIHRoZSBmaXJzdCBzaXggY2hhcmFjdGVycykgc3Vic3RpdHV0ZWQgYnkgbWFjcm8KK3doZW4gTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyBpcyBzZXQuCisKKzMuIERvbid0IHVzZSBnbG9iYWwgdmFyaWFibGVzOyBhbnl0aGluZyB0aGF0IG11c3QgYmUgdXNlZCBpbiBhbm90aGVyIG1vZHVsZQorc2hvdWxkIGJlIGluIHRoZSBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzLgorCis0LiBEb24ndCB1c2Ugc3RhdGljIHZhcmlhYmxlcyBleGNlcHQgZm9yIHJlYWQtb25seSBjb25zdGFudCB0YWJsZXMuICBWYXJpYWJsZXMKK3RoYXQgc2hvdWxkIGJlIHByaXZhdGUgdG8gYSBtb2R1bGUgY2FuIGJlIHBsYWNlZCBpbnRvIHByaXZhdGUgc3RydWN0dXJlcyAoc2VlCit0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBkb2N1bWVudCwgc3RydWN0dXJlLmRvYykuCisKKzUuIFNvdXJjZSBmaWxlIG5hbWVzIHNob3VsZCBiZWdpbiB3aXRoICJqIiBmb3IgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUKK2xpYnJhcnkgcHJvcGVyOyBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGxpYnJhcnksIHN1Y2ggYXMgY2pwZWcuYworYW5kIGRqcGVnLmMsIGRvIG5vdCBiZWdpbiB3aXRoICJqIi4gIEtlZXAgc291cmNlIGZpbGUgbmFtZXMgdG8gZWlnaHQKK2NoYXJhY3RlcnMgKHBsdXMgIi5jIiBvciAiLmgiLCBldGMpIHRvIG1ha2UgbGlmZSBlYXN5IGZvciBNUy1ET1NlcnMuICBLZWVwCitjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb2RlIGluIHNlcGFyYXRlIHNvdXJjZSBmaWxlcyAtLS0gc29tZQorYXBwbGljYXRpb25zIG1heSB3YW50IG9ubHkgb25lIGhhbGYgb2YgdGhlIGxpYnJhcnkuCisKK05vdGU6IHRoZXNlIHJ1bGVzIChwYXJ0aWN1bGFybHkgIzQpIGFyZSBub3QgZm9sbG93ZWQgcmVsaWdpb3VzbHkgaW4gdGhlCittb2R1bGVzIHRoYXQgYXJlIHVzZWQgaW4gY2pwZWcvZGpwZWcgYnV0IGFyZSBub3QgcGFydCBvZiB0aGUgSlBFRyBsaWJyYXJ5Citwcm9wZXIuICBUaG9zZSBtb2R1bGVzIGFyZSBub3QgcmVhbGx5IGludGVuZGVkIHRvIGJlIHVzZWQgaW4gb3RoZXIKK2FwcGxpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2NvbmZpZy5ndWVzcyBiL2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTNlZDQxCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsODgzIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCisjIFRoZSBtYXN0ZXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaXMgYXQgdGhlIEZTRiBpbiAvaG9tZS9nZC9nbnUvbGliLgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91CisjIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgc3lzdGVtIHR5cGUgKGhvc3QvdGFyZ2V0IG5hbWUpLgorIworIyBPbmx5IGEgZmV3IHN5c3RlbXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgbGlzdDsgcGxlYXNlIGFkZCBvdGhlcnMKKyMgKGJ1dCB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIGNsZWFuKS4KKyMKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSA4LzI0Lzk0LikKK2lmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICitmaQorCitVTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KK1VOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgorVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKK3RyYXAgJ3JtIC1mIGR1bW15LmMgZHVtbXkubyBkdW1teTsgZXhpdCAxJyAxIDIgMTUKKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgYWxwaGE6T1NGMToqOiopCisJaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCWZpCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwljYXQgPDxFT0YgPmR1bW15LnMKKwkuZ2xvYmwgbWFpbgorCS5lbnQgbWFpbgorbWFpbjoKKwkuZnJhbWUgXCQzMCwwLFwkMjYsMAorCS5wcm9sb2d1ZSAwCisJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKKwlsZGEgXCQyLDI1OQorCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQorCXNybCBcJDEsOCxcJDIKKwlzbGwgXCQyLDIsXCQyCisJc2xsIFwkMCwzLFwkMAorCWFkZGwgXCQxLFwkMCxcJDAKKwlhZGRsIFwkMixcJDAsXCQwCisJcmV0IFwkMzEsKFwkMjYpLDEKKwkuZW5kIG1haW4KK0VPRgorCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgorCQkuL2R1bW15CisJCWNhc2UgIiQ/IiBpbgorCQkJNykKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKKwkJCQk7OworCQkJMTUpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCisJCQkJOzsKKwkJCTE0KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKKwkJCQk7OworCQkJMTApCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKKwkJCQk7OworCQkJMTYpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCisJCQkJOzsKKwkJZXNhYworCWZpCisJcm0gLWYgZHVtbXkucyBkdW1teQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciBbW0EtWl1dIFtbYS16XV1gCisJZXhpdCAwIDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCAwIDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLWNibS1zeXN2NAorCWV4aXQgMDs7CisgICAgYW1pZ2E6TmV0QlNEOio6KikKKyAgICAgIGVjaG8gbTY4ay1jYm0tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorICAgICAgZXhpdCAwIDs7CisgICAgYW1pZ2E6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhcmM2NDpPcGVuQlNEOio6KikKKwllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhcmM6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGhrbWlwczpPcGVuQlNEOio6KikKKwllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBtYXg6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNnaTpPcGVuQlNEOio6KikKKwllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHdncmlzYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDA7OworICAgIGFybTMyOk5ldEJTRDoqOiopCisJZWNobyBhcm0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwlleGl0IDAgOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCAwOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KnxNSVMqOk9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBOSUxFOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgMCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoaGVhZCAtMSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXRhcmkqOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWF0YXJpLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhdGFyaSo6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4zKjpOZXRCU0Q6KjoqKQorCWVjaG8gbTY4ay1zdW4tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjNjhrOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWFwcGxlLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWM2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTg4azpPcGVuQlNEOio6KikKKwllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgMCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIDIwMjA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgeworCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IFwKKwkgICYmIC4vZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAorCSAgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwlybSAtZiBkdW1teS5jIGR1bW15CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDAgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgMCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisgICAgICAgIGlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgLW8gJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXSA7IHRoZW4KKwlpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBcCisJICAgICAtbyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0gOyB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZWxzZSBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZmkKKyAJZXhpdCAwIDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgMCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgMCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCAwIDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaT84NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+ZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCQlybSAtZiBkdW1teS5jIGR1bW15CisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCAwIDs7CisgICAgKjpBSVg6Kjo0KQorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVIbCBwcm9jMCB8IGdyZXAgUE9XRVIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCUlCTV9BUkNIPXJzNjAwMAorCWVsc2UKKwkJSUJNX0FSQ0g9cG93ZXJwYworCWZpCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPTQuJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgTmV0QlNEIGFuZAorCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KKwlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworICAgICo6Qk9TWDoqOiopCisJZWNobyByczYwMDAtYnVsbC1ib3N4CisJZXhpdCAwIDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgMCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCAwIDs7CisgICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKKwllY2hvIG02OGstaHAtYnNkNC40CisJZXhpdCAwIDs7CisgICAgOTAwMC9bMzQ3OF0/PzpIUC1VWDoqOiopCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC83Pz8gfCA5MDAwLzg/WzE2NzldICkgSFBfQVJDSD1ocHBhMS4xIDs7CisJICAgIDkwMDAvOD8/ICkgICAgICAgICAgICBIUF9BUkNIPWhwcGExLjAgOzsKKwllc2FjCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgMCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwlybSAtZiBkdW1teS5jIGR1bW15CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgMCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgMCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBpPzg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCAwIDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIENSQVkqWC1NUDoqOio6KikKKwllY2hvIHhtcC1jcmF5LXVuaWNvcworICAgICAgICBleGl0IDAgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBDUkFZLTI6KjoqOiopCisJZWNobyBjcmF5Mi1jcmF5LXVuaWNvcworICAgICAgICBleGl0IDAgOzsKKyAgICBGMzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciBbQS1aXSBbYS16XSB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiZjMwMC1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgMCA7OworICAgIEYzMDE6VU5JWF9TeXN0ZW1fVjoqOiopCisgICAgICAgZWNobyBmMzAxLWZ1aml0c3UtdXhwdmBlY2hvICRVTkFNRV9SRUxFQVNFIHwgc2VkICdzLyAuKi8vJ2AKKyAgICAgICBleGl0IDAgOzsKKyAgICBocDNbMC05XVswNV06TmV0QlNEOio6KikKKwllY2hvIG02OGstaHAtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGhwMzAwOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaT84NjpCU0QvMzg2Oio6KiB8ICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCAwIDs7CisgICAgKjpOZXRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCWV4aXQgMCA7OworICAgICo6T3BlbkJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCWV4aXQgMCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvIGkzODYtcGMtY3lnd2luMzIKKwlleGl0IDAgOzsKKyAgICBpKjpNSU5HVyo6KikKKwllY2hvIGkzODYtcGMtbWluZ3czMgorCWV4aXQgMCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbjMyCisJZXhpdCAwIDs7CisgICAgcHJlcCo6U3VuT1M6NS4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgICo6R05VOio6KikKKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDAgOzsKKyAgICAqOkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4KKwlsZF9oZWxwX3N0cmluZz1gbGQgLS1oZWxwIDI+JjFgCisJbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnM9YGVjaG8gJGxkX2hlbHBfc3RyaW5nIFwKKwkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgZW11bGF0aW9uczovIWQKKwkJCQkgICAgcy9bIAldWyAJXSovIC9nCisJCQkJICAgIHMvLipzdXBwb3J0ZWQgZW11bGF0aW9uczogKi8vCisJCQkJICAgIHMvIC4qLy8KKwkJCQkgICAgcCdgCisgICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucyIgaW4KKwkgIGk/ODZsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIgICAgICA7IGV4aXQgMCA7OworCSAgaT84NmNvZmYpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIiAgICAgIDsgZXhpdCAwIDs7CisJICBzcGFyY2xpbnV4KSBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKKwkgIG02OGtsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OworCSAgZWxmMzJwcGMpICAgZWNobyAicG93ZXJwYy11bmtub3duLWxpbnV4LWdudSIgICAgICAgICAgICAgIDsgZXhpdCAwIDs7CisJZXNhYworCisJaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAiYWxwaGEiIDsgdGhlbgorCQlzZWQgJ3MvXgkvLycgIDw8RU9GID5kdW1teS5zCisJCS5nbG9ibCBtYWluCisJCS5lbnQgbWFpbgorCW1haW46CisJCS5mcmFtZSBcJDMwLDAsXCQyNiwwCisJCS5wcm9sb2d1ZSAwCisJCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCisJCWxkYSBcJDIsMjU5CisJCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQorCQlzcmwgXCQxLDgsXCQyCisJCXNsbCBcJDIsMixcJDIKKwkJc2xsIFwkMCwzLFwkMAorCQlhZGRsIFwkMSxcJDAsXCQwCisJCWFkZGwgXCQyLFwkMCxcJDAKKwkJcmV0IFwkMzEsKFwkMjYpLDEKKwkJLmVuZCBtYWluCitFT0YKKwkJTElCQz0iIgorCQkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCisJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCQkuL2R1bW15CisJCQljYXNlICIkPyIgaW4KKwkJCTcpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCisJCQkJOzsKKwkJCTE1KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgorCQkJCTs7CisJCQkxNCkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCisJCQkJOzsKKwkJCTEwKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCisJCQkJOzsKKwkJCTE2KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgorCQkJCTs7CisJCQllc2FjCQorCisJCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIGR1bW15IHwgXAorCQkJICBncmVwIGxkLnNvLjEgPiAvZGV2L251bGwKKwkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCQkJTElCQz0ibGliYzEiCisJCQlmaQorCQlmaQkKKwkJcm0gLWYgZHVtbXkucyBkdW1teQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwCisJZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJtaXBzIiA7IHRoZW4KKwkgIGNhdCA+ZHVtbXkuYyA8PEVPRgorbWFpbihhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqYXJndltdOworeworI2lmZGVmIF9fTUlQU0VCX18KKyAgcHJpbnRmICgiJXMtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOworI2VuZGlmCisjaWZkZWYgX19NSVBTRUxfXworICBwcmludGYgKCIlc2VsLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KK0VPRgorCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCSAgcm0gLWYgZHVtbXkuYyBkdW1teQorCWVsc2UKKwkgICMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKQorCSAgIyBvciBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCisJICAjIEdDQyB3YW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGxpbnV4LWdudW9sZGxkIGFuZCBsaW51eC1nbnVhb3V0LgorCSAgIyBJZiBsZCBkb2VzIG5vdCBwcm92aWRlICphbnkqICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCisJICAjIHRoYXQgbWVhbnMgaXQgaXMgZ251b2xkbGQuCisJICBlY2hvICIkbGRfaGVscF9zdHJpbmciIHwgZ3JlcCA+L2Rldi9udWxsIDI+JjEgInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKKwkgIHRlc3QgJD8gIT0gMCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIiAmJiBleGl0IDAKKworCSAgY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgIGk/ODYpCisJICAgIFZFTkRPUj1wYzsKKwkgICAgOzsKKwkgICopCisJICAgIFZFTkRPUj11bmtub3duOworCSAgICA7OworCSAgZXNhYworCSAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwkgIGNhdCA+ZHVtbXkuYyA8PEVPRgorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CittYWluKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisjaWZkZWYgX19FTEZfXworIyBpZmRlZiBfX0dMSUJDX18KKyMgIGlmIF9fR0xJQkNfXyA+PSAyCisgICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudVxuIiwgYXJndlsxXSk7CisjICBlbHNlCisgICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7CisjIGVuZGlmCisjZWxzZQorICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251YW91dFxuIiwgYXJndlsxXSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CitFT0YKKwkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwkgIHJtIC1mIGR1bW15LmMgZHVtbXkKKwlmaSA7OworIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4gIGVhcmxpZXIgdmVyc2lvbnMKKyMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorICAgIGk/ODY6RFlOSVgvcHR4OjQqOiopCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBpPzg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDAgOzsKKyAgICBpPzg2Oio6NC4qOiogfCBpPzg2OlNZU1RFTV9WOjQuKjoqKQorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWV4aXQgMCA7OworICAgIGk/ODY6KjozLjI6KikKKwlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCisJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKKwllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgorCWZpCisJZXhpdCAwIDs7CisgICAgcGM6KjoqOiopCisgICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0CisgICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCisJZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCAwIDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgMCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDAgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCAwIDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDAgOzsKKyAgICBNNjgqOio6UjNWWzU2N10qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7CisgICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgMCA7OworICAgIGk/ODY6THlueE9TOjIuKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgMCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCAwIDs7CisgICAgUEVOVElVTTpDUHVuaXg6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgMCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG5ld3MqOk5FV1MtT1M6Kjo2KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCAwIDs7CisgICAgUjMwMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZXhpdCAwIDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitjYXQgPmR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKyAgICAgICAgICAiNCIKKyNlbHNlCisJICAiIgorI2VuZGlmCisgICAgICAgICApOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQorICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjaWYgIWRlZmluZWQgKHVsdHJpeCkKKyAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCitybSAtZiBkdW1teS5jIGR1bW15CisKKyMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KKwordGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCAwIDs7CisgICAgYzM0KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGVzYWMKK2ZpCisKKyNlY2hvICcoVW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlKScgMT4mMgorCitleGl0IDEKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxM2E2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcuc3ViCkBAIC0wLDAgKzEsOTU0IEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdCwgdmVyc2lvbiAxLjEuCisjICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworaWYgWyB4JDEgPSB4IF0KK3RoZW4KKwllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCisJZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKKwllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKKwllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKKwlleGl0IDEKK2ZpCisKKyMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorY2FzZSAkMSBpbgorCSpsb2NhbCopCisJCWVjaG8gJDEKKwkJZXhpdCAwCisJCTs7CisJKikKKwk7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBsaW51eC1nbnUqKQorICAgIG9zPS0kbWF5YmVfb3MKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNSkKKwkJb3M9c2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCXRhaG9lIHwgaTg2MCB8IG0zMnIgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJjIHwgYXJtIFwKKwkJfCBhcm1lW2xiXSB8IHB5cmFtaWQgfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJCXwgdHJvbiB8IGEyOWsgfCA1ODAgfCBpOTYwIHwgaDgzMDAgfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgXAorCQl8IGFscGhhIHwgYWxwaGFldjUgfCBhbHBoYWV2NTYgfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciBcCisJCXwgaTM3MCB8IHNoIHwgcG93ZXJwYyB8IHBvd2VycGNsZSB8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIFwKKwkJfCBtaXBzNjQgfCBtaXBzZWwgfCBtaXBzNjRlbCB8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHY4NTApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWlbMzQ1Nl04NikKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJdmF4LSogfCB0YWhvZS0qIHwgaVszNDU2XTg2LSogfCBpODYwLSogfCBtMzJyLSogfCBtNjhrLSogfCBtNjgwMDAtKiBcCisJICAgICAgfCBtODhrLSogfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFyYy0qIHwgYXJtLSogfCBjWzEyM10qIFwKKwkgICAgICB8IG1pcHMtKiB8IHB5cmFtaWQtKiB8IHRyb24tKiB8IGEyOWstKiB8IHJvbXAtKiB8IHJzNjAwMC0qIFwKKwkgICAgICB8IHBvd2VyLSogfCBub25lLSogfCA1ODAtKiB8IGNyYXkyLSogfCBoODMwMC0qIHwgaTk2MC0qIFwKKwkgICAgICB8IHhtcC0qIHwgeW1wLSogfCBocHBhLSogfCBocHBhMS4wLSogfCBocHBhMS4xLSogXAorCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXY1LSogfCBhbHBoYWV2NTYtKiB8IHdlMzJrLSogfCBjeWRyYS0qIFwKKwkgICAgICB8IG5zMTZrLSogfCBwbi0qIHwgbnAxLSogfCB4cHMxMDAtKiB8IGNsaXBwZXItKiB8IG9yaW9uLSogXAorCSAgICAgIHwgc3BhcmNsaXRlLSogfCBwZHAxMS0qIHwgc2gtKiB8IHBvd2VycGMtKiB8IHBvd2VycGNsZS0qIFwKKwkgICAgICB8IHNwYXJjNjQtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAorCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogIFwKKwkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCSAgICAgIHwgZjMwMS0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstY2JtCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmF5MikKKwkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlbY3RqXTkwLWNyYXkpCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs3WzAtOV1bMC05XSB8IGhwN1swLTldWzAtOV0gfCBocDlrOFswLTldNyB8IGhwOFswLTldNykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisjIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KKwlpWzM0NTZdODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaVszNDU2XTg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaVszNDU2XTg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaVszNDU2XTg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWlyaXMgfCBpcmlzNGQpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1pcml4KikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LWlyaXg0CisJCQk7OworCQllc2FjCisJCTs7CisJaXNpNjggfCBpc2kpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKKwkJb3M9LXN5c3YKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwltaXBzZWwqLWxpbnV4KikKKwkJYmFzaWNfbWFjaGluZT1taXBzZWwtdW5rbm93bgorCQlvcz0tbGludXgtZ251CisJCTs7CisJbWlwcyotbGludXgqKQorCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgorCQlvcz0tbGludXgtZ251CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbmNyMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgorCQlvcz0tc3lzdjQKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYmQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCisJCTs7CisJcGJiKQorCQliYXNpY19tYWNoaW5lPW02OGstdHRpCisJCTs7CisgICAgICAgIHBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBlbnRpdW0gfCBwNSkKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWludGVsCisJCTs7CisJcGVudGl1bXBybyB8IHA2KQorCQliYXNpY19tYWNoaW5lPWk2ODYtaW50ZWwKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlrNSkKKwkJIyBXZSBkb24ndCBoYXZlIHNwZWNpZmljIHN1cHBvcnQgZm9yIEFNRCdzIEs1IHlldCwgc28ganVzdCBjYWxsIGl0IGEgUGVudGl1bQorCQliYXNpY19tYWNoaW5lPWk1ODYtYW1kCisJCTs7CisJbmV4ZW4pCisJCSMgV2UgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBOZXhnZW4geWV0LCBzbyBqdXN0IGNhbGwgaXQgYSBQZW50aXVtCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1uZXhnZW4KKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJICAgICAgICA7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCSAgICAgICAgOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2YXh2KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwl2bXMpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tdm1zCisJCTs7CisJdnBwKnx2eHx2eC0qKQorICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKyAgICAgICAgICAgICAgIDs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl4bXApCisJCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworICAgICAgICB4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwltaXBzKQorCQlpZiBbIHgkb3MgPSB4LWxpbnV4LWdudSBdOyB0aGVuCisJCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgorCQllbHNlCisJCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlmaQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc3BhcmMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisgICAgICAgIGN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKKwkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY3lnd2luMzIqIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5zMiApCisJICAgICAgICBvcz0tbmV4dHN0ZXAyCisJCTs7CisJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgorCS1zaW5peDUuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKKwkJOzsKKwktc2luaXgqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworICAgICAgICAqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworICAgICAgICAqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisgICAgICAgICotc2dpKQorCQlvcz0taXJpeAorCQk7OworICAgICAgICAqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzAxLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNWM5ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlndXJlCkBAIC0wLDAgKzEsMjAxMSBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNoYXJlZCAgICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5IHVzaW5nIEdOVSBsaWJ0b29sIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc3RhdGljICAgICAgICAgYnVpbGQgc3RhdGljIGxpYnJhcnkgdXNpbmcgR05VIGxpYnRvb2wiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1tYXhtZW1bPU5dICAgICBlbmFibGUgdXNlIG9mIHRlbXAgZmlsZXMsIHNldCBtYXggbWVtIHVzYWdlIHRvIE4gTUIiCithY19oZWxwPSIkYWNfaGVscAorIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKj0qKQorICAgIHZhcm5hbWU9YGVjaG8gIiRhY19vcHRpb24ifHNlZCAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJHZhcm5hbWV8IHNlZCAncy9bYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHZhcm5hbWU6IGludmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICB2YWw9ImBlY2hvICIkYWNfb3B0aW9uInxzZWQgJ3MvW149XSo9Ly8nYCIKKyAgICB0ZXN0IC1uICIkdmVyYm9zZSIgJiYgZWNobyAiCXNldHRpbmcgc2hlbGwgdmFyaWFibGUgJHZhcm5hbWUgdG8gJHZhbCIKKyAgICBldmFsICIkdmFybmFtZT0nJHZhbCciCisgICAgZXZhbCAiZXhwb3J0ICR2YXJuYW1lIiA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1qY21hc3Rlci5jCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxNTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjI1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYyOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY0OTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY1NDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjYzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCisgIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLU8yIgorZWxzZQorICBHQ0M9CisgIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLU8iCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjgxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY5NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcxMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc0MjogY2hlY2tpbmcgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2lqZ19jdl9oYXZlX3Byb3RvdHlwZXMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMik7IC8qIGNoZWNrIHByb3RvdHlwZXMgKi8KK3N0cnVjdCBtZXRob2RzX3N0cnVjdCB7CQkvKiBjaGVjayBtZXRob2QtcG9pbnRlciBkZWNsYXJhdGlvbnMgKi8KKyAgaW50ICgqZXJyb3JfZXhpdCkgKGNoYXIgKm1zZ3RleHQpOworICBpbnQgKCp0cmFjZV9tZXNzYWdlKSAoY2hhciAqbXNndGV4dCk7CisgIGludCAoKmFub3RoZXJfbWV0aG9kKSAodm9pZCk7Cit9OworaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpIC8qIGNoZWNrIGRlZmluaXRpb25zICovCit7IHJldHVybiBhcmcyW2FyZzFdOyB9CitpbnQgdGVzdDJmdW5jdGlvbiAodm9pZCkJLyogY2hlY2sgdm9pZCBhcmcgbGlzdCAqLworeyByZXR1cm4gMDsgfQorCitpbnQgbWFpbigpIHsKKyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaGF2ZV9wcm90b3R5cGVzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaGF2ZV9wcm90b3R5cGVzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMiIDE+JjYKK2lmIHRlc3QgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUyAKK0VPRgorCitlbHNlCisgIGVjaG8gWW91ciBjb21waWxlciBkb2VzIG5vdCBzZWVtIHRvIGtub3cgYWJvdXQgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAgZWNobyBQZXJoYXBzIGl0IG5lZWRzIGEgc3BlY2lhbCBzd2l0Y2ggdG8gZW5hYmxlIEFOU0kgQyBtb2RlLgorICBlY2hvIElmIHNvLCB3ZSByZWNvbW1lbmQgcnVubmluZyBjb25maWd1cmUgbGlrZSB0aGlzOgorICBlY2hvICIgICAuL2NvbmZpZ3VyZSAgQ0M9J2NjIC1zd2l0Y2gnIgorICBlY2hvIHdoZXJlIC1zd2l0Y2ggaXMgdGhlIHByb3BlciBzd2l0Y2guCitmaQorYWNfc2FmZT1gZWNobyAic3RkZGVmLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0ZGRlZi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3OTI6IGNoZWNraW5nIGZvciBzdGRkZWYuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRkZWYuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVERERUZfSCAKK0VPRgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworYWNfc2FmZT1gZWNobyAic3RkbGliLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0ZGxpYi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4Mjg6IGNoZWNraW5nIGZvciBzdGRsaWIuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODMzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODM4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAKK0VPRgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworYWNfc2FmZT1gZWNobyAic3RyaW5nLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cmluZy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NjQ6IGNoZWNraW5nIGZvciBzdHJpbmcuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICA6CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfQlNEX1NUUklOR1MgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTAwOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkwMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX1NURERFRl9ICisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCit0eXBlZGVmIHNpemVfdCBteV9zaXplX3Q7CisKK2ludCBtYWluKCkgeworIG15X3NpemVfdCBmb292YXI7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjkyMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19zaXplX3Rfb2s9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19zaXplX3Rfb2s9Im5vdCBBTlNJLCBwZXJoYXBzIGl0IGlzIGluIHN5cy90eXBlcy5oIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAiJGFjX3QiIiRpamdfc2l6ZV90X29rIiAxPiY2CitpZiB0ZXN0ICIkaWpnX3NpemVfdF9vayIgIT0geWVzOyB0aGVuCithY19zYWZlPWBlY2hvICJzeXMvdHlwZXMuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3R5cGVzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkzNzogY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5NDIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX1NZU19UWVBFU19IIAorRU9GCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk2OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNpemVfdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX3NpemVfdF9vaz0ic2l6ZV90IGlzIGluIHN5cy90eXBlcy5oIgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19zaXplX3Rfb2s9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2lqZ19zaXplX3Rfb2s9bm8KK2ZpCisKK2VjaG8gIiRhY190IiIkaWpnX3NpemVfdF9vayIgMT4mNgoraWYgdGVzdCAiJGlqZ19zaXplX3Rfb2siID0gbm87IHRoZW4KKyAgZWNobyBUeXBlIHNpemVfdCBpcyBub3QgZGVmaW5lZCBpbiBhbnkgb2YgdGhlIHVzdWFsIHBsYWNlcy4KKyAgZWNobyBUcnkgcHV0dGluZyAnInR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsiJyBpbiBqY29uZmlnLmguCitmaQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIGNoYXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk5NDogY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgY2hhciIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5OTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKyB1bnNpZ25lZCBjaGFyIHVuX2NoYXI7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSIAorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBzaG9ydCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAxODogY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgc2hvcnQiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTAyMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworIHVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDI3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQgCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB0eXBlIHZvaWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNDI6IGNoZWNraW5nIGZvciB0eXBlIHZvaWQiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIENhdXRpb246IGEgQysrIGNvbXBpbGVyIHdpbGwgaW5zaXN0IG9uIHZhbGlkIHByb3RvdHlwZXMgKi8KK3R5cGVkZWYgdm9pZCAqIHZvaWRfcHRyOwkvKiBjaGVjayB2b2lkICogKi8KKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLwordHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoaW50IGEsIGludCBiKTsKKyNlbHNlCit0eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpICgpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHZvaWQgZnVuY3Rpb24gcmVzdWx0ICovCit2b2lkIHRlc3QzZnVuY3Rpb24gKHZvaWRfcHRyIGFyZzEsIHZvaWRfZnVuYyBhcmcyKQorI2Vsc2UKK3ZvaWQgdGVzdDNmdW5jdGlvbiAoYXJnMSwgYXJnMikKKyAgICAgdm9pZF9wdHIgYXJnMTsKKyAgICAgdm9pZF9mdW5jIGFyZzI7CisjZW5kaWYKK3sKKyAgY2hhciAqIGxvY3B0ciA9IChjaGFyICopIGFyZzE7IC8qIGNoZWNrIGNhc3RpbmcgdG8gYW5kIGZyb20gdm9pZCAqICovCisgIGFyZzEgPSAodm9pZCAqKSBsb2NwdHI7CisgICgqYXJnMikgKDEsIDIpOwkJLyogY2hlY2sgY2FsbCBvZiBmY24gcmV0dXJuaW5nIHZvaWQgKi8KK30KKworaW50IG1haW4oKSB7CisgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA3MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgdm9pZCBjaGFyCitFT0YKKworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA4ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDkzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE2MzogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpamdfY3ZfaW5saW5lPSIiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9IF9faW5saW5lX18gaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK2ludCBiYXIoKSB7IHJldHVybiBmb28oKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX2N2X2lubGluZT0iX19pbmxpbmVfXyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSBfX2lubGluZSBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQoraW50IGJhcigpIHsgcmV0dXJuIGZvbygpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExOTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaW5saW5lPSJfX2lubGluZSIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE5OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSBpbmxpbmUgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK2ludCBiYXIoKSB7IHJldHVybiBmb28oKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX2N2X2lubGluZT0iaW5saW5lIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gIiRhY190IiIkaWpnX2N2X2lubGluZSIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgSU5MSU5FICRpamdfY3ZfaW5saW5lCitFT0YKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJyb2tlbiBpbmNvbXBsZXRlIHR5cGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjI0OiBjaGVja2luZyBmb3IgYnJva2VuIGluY29tcGxldGUgdHlwZXMiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisgdHlwZWRlZiBzdHJ1Y3QgdW5kZWZpbmVkX3N0cnVjdHVyZSAqIHVuZGVmX3N0cnVjdF9wdHI7IAoraW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjMzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm9rIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJicm9rZW4iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAKK0VPRgorCitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hvcnQgZXh0ZXJuYWwgbmFtZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNDg6IGNoZWNraW5nIGZvciBzaG9ydCBleHRlcm5hbCBuYW1lcyIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjUwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IHBvc3NpYmx5X2R1cGxpY2F0ZV9mdW5jdGlvbiAoKSB7IHJldHVybiAwOyB9CitpbnQgcG9zc2libHlfZHVwbGlfZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfQorCitpbnQgbWFpbigpIHsKKyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIib2siIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInNob3J0IiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAKK0VPRgorCitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICRhY19uICJjaGVja2luZyB0byBzZWUgaWYgY2hhciBpcyBzaWduZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzU6IGNoZWNraW5nIHRvIHNlZSBpZiBjaGFyIGlzIHNpZ25lZCIgPiY1CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBlY2hvIEFzc3VtaW5nIHRoYXQgY2hhciBpcyBzaWduZWQgb24gdGFyZ2V0IG1hY2hpbmUuCitlY2hvIElmIGl0IGlzIHVuc2lnbmVkLCB0aGlzIHdpbGwgYmUgYSBsaXR0bGUgYml0IGluZWZmaWNpZW50LgorCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyODIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfY2hhcl9zaWduZWQgKGludCBhcmcpCisjZWxzZQoraW50IGlzX2NoYXJfc2lnbmVkIChhcmcpCisgICAgIGludCBhcmc7CisjZW5kaWYKK3sKKyAgaWYgKGFyZyA9PSAxODkpIHsJCS8qIGV4cGVjdGVkIHJlc3VsdCBmb3IgdW5zaWduZWQgY2hhciAqLworICAgIHJldHVybiAwOwkJCS8qIHR5cGUgY2hhciBpcyB1bnNpZ25lZCAqLworICB9CisgIGVsc2UgaWYgKGFyZyAhPSAtNjcpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgY2hhciAqLworICAgIHByaW50ZigiSG1tLCBpdCBzZWVtcyAnY2hhcicgaXMgbm90IGVpZ2h0IGJpdHMgd2lkZSBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKKyAgICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIH0KKyAgcmV0dXJuIDE7CQkJLyogYXNzdW1lIGNoYXIgaXMgc2lnbmVkIG90aGVyd2lzZSAqLworfQorY2hhciBzaWduZWRfY2hhcl9jaGVjayA9IChjaGFyKSAoLTY3KTsKK21haW4oKSB7CisgIGV4aXQoaXNfY2hhcl9zaWduZWQoKGludCkgc2lnbmVkX2NoYXJfY2hlY2spKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENIQVJfSVNfVU5TSUdORUQgCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyMzogY2hlY2tpbmcgdG8gc2VlIGlmIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCIgPiY1CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBlY2hvICIkYWNfdCIiQXNzdW1pbmcgdGhhdCByaWdodCBzaGlmdCBpcyBzaWduZWQgb24gdGFyZ2V0IG1hY2hpbmUuIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChsb25nIGFyZykKKyNlbHNlCitpbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChhcmcpCisgICAgIGxvbmcgYXJnOworI2VuZGlmCisvKiBTZWUgd2hldGhlciByaWdodC1zaGlmdCBvbiBhIGxvbmcgaXMgc2lnbmVkIG9yIG5vdC4gKi8KK3sKKyAgbG9uZyByZXMgPSBhcmcgPj4gNDsKKworICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIHNoaWZ0ICovCisgICAgcmV0dXJuIDE7CQkJLyogcmlnaHQgc2hpZnQgaXMgc2lnbmVkICovCisgIH0KKyAgLyogc2VlIGlmIHVuc2lnbmVkLXNoaWZ0IGhhY2sgd2lsbCBmaXggaXQuICovCisgIC8qIHdlIGNhbid0IGp1c3QgdGVzdCBleGFjdCB2YWx1ZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHdpZHRoIG9mIGxvbmcuLi4gKi8KKyAgcmVzIHw9ICh+MEwpIDw8ICgzMi00KTsKKyAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgbm93PyAqLworICAgIHJldHVybiAwOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkICovCisgIH0KKyAgcHJpbnRmKCJSaWdodCBzaGlmdCBpc24ndCBhY3RpbmcgYXMgSSBleHBlY3QgaXQgdG8uXG4iKTsKKyAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOworICByZXR1cm4gMDsJCQkvKiB0cnkgaXQgd2l0aCB1bnNpZ25lZCBhbnl3YXkgKi8KK30KK21haW4oKSB7CisgIGV4aXQoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQgCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIGZvcGVuIGFjY2VwdHMgYiBzcGVjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzc1OiBjaGVja2luZyB0byBzZWUgaWYgZm9wZW4gYWNjZXB0cyBiIHNwZWMiID4mNQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFjX3QiIkFzc3VtaW5nIHRoYXQgaXQgZG9lcy4iIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM4MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorbWFpbigpIHsKKyAgaWYgKGZvcGVuKCJjb25mdGVzdGRhdGEiLCAid2IiKSAhPSBOVUxMKQorICAgIGV4aXQoMCk7CisgIGV4aXQoMSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIERPTlRfVVNFX0JfTU9ERSAKK0VPRgorCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MzY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgaW5zdGFsbGJzZCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgIyBPU0YvMSBpbnN0YWxsYnNkIGFsc28gdXNlcyBkc3Btc2csIGJ1dCBpcyB1c2FibGUuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDg4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisjIERlY2lkZSB3aGV0aGVyIHRvIHVzZSBsaWJ0b29sLAorIyBhbmQgaWYgc28gd2hldGhlciB0byBidWlsZCBzaGFyZWQsIHN0YXRpYywgb3IgYm90aCBmbGF2b3JzIG9mIGxpYnJhcnkuCitMVFNIQVJFRD0ibm8iCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCisgIExUU0hBUkVEPSIkZW5hYmxldmFsIgorZmkKKworTFRTVEFUSUM9Im5vIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorICBMVFNUQVRJQz0iJGVuYWJsZXZhbCIKK2ZpCisKK2lmIHRlc3QgIngkTFRTSEFSRUQiICE9IHhubyAgLW8gICJ4JExUU1RBVElDIiAhPSB4bm87IHRoZW4KKyAgVVNFTElCVE9PTD0ieWVzIgorICBMSUJUT09MPSIuL2xpYnRvb2wiCisgIE89ImxvIgorICBBPSJsYSIKKyAgTE49JyQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQyknCisgIElOU1RBTExfTElCPSckKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICR7SU5TVEFMTH0nCisgIElOU1RBTExfUFJPR1JBTT0iXCQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJElOU1RBTExfUFJPR1JBTSIKK2Vsc2UKKyAgVVNFTElCVE9PTD0ibm8iCisgIExJQlRPT0w9IiIKKyAgTz0ibyIKKyAgQT0iYSIKKyAgTE49JyQoQ0MpJworICBJTlNUQUxMX0xJQj0iJElOU1RBTExfREFUQSIKK2ZpCisKKworCisKKworCisjIENvbmZpZ3VyZSBsaWJ0b29sIGlmIG5lZWRlZC4KK2lmIHRlc3QgJFVTRUxJQlRPT0wgPSB5ZXM7IHRoZW4KKyAgZGlzYWJsZV9zaGFyZWQ9CisgIGRpc2FibGVfc3RhdGljPQorICBpZiB0ZXN0ICJ4JExUU0hBUkVEIiA9IHhubzsgdGhlbgorICAgIGRpc2FibGVfc2hhcmVkPSItLWRpc2FibGUtc2hhcmVkIgorICBmaQorICBpZiB0ZXN0ICJ4JExUU1RBVElDIiA9IHhubzsgdGhlbgorICAgIGRpc2FibGVfc3RhdGljPSItLWRpc2FibGUtc3RhdGljIgorICBmaQorICAkc3JjZGlyL2x0Y29uZmlnICRkaXNhYmxlX3NoYXJlZCAkZGlzYWJsZV9zdGF0aWMgJHNyY2Rpci9sdG1haW4uc2gKK2ZpCisKKyMgU2VsZWN0IG1lbW9yeSBtYW5hZ2VyIGRlcGVuZGluZyBvbiB1c2VyIGlucHV0LgorIyBJZiBubyAiLWVuYWJsZS1tYXhtZW0iLCB1c2Ugam1lbW5vYnMKK01FTU9SWU1HUj0nam1lbW5vYnMuJChPKScKK01BWE1FTT0ibm8iCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWF4bWVtIG9yIC0tZGlzYWJsZS1tYXhtZW0gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWF4bWVtK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYXhtZW0iCisgIE1BWE1FTT0iJGVuYWJsZXZhbCIKK2ZpCisKKyMgc3VwcG9ydCAtLXdpdGgtbWF4bWVtIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIElKRyBWNS4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbWF4bWVtIG9yIC0td2l0aG91dC1tYXhtZW0gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX21heG1lbStzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9tYXhtZW0iCisgIE1BWE1FTT0iJHdpdGh2YWwiCitmaQorCitpZiB0ZXN0ICJ4JE1BWE1FTSIgPSB4eWVzOyB0aGVuCisgIE1BWE1FTT0xCitmaQoraWYgdGVzdCAieCRNQVhNRU0iICE9IHhubzsgdGhlbgorICBpZiB0ZXN0IC1uICJgZWNobyAkTUFYTUVNIHwgc2VkICdzL1swLTldLy9nJ2AiOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBub24tbnVtZXJpYyBhcmd1bWVudCB0byAtLWVuYWJsZS1tYXhtZW0iIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBERUZBVUxUTUFYTUVNPWBleHByICRNQVhNRU0gXCogMTA0ODU3NmAKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIERFRkFVTFRfTUFYX01FTSAke0RFRkFVTFRNQVhNRU19CitFT0YKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICd0bXBmaWxlKCknIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTk2OiBjaGVja2luZyBmb3IgJ3RtcGZpbGUoKSciID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTU5OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBtYWluKCkgeworIEZJTEUgKiB0ZmlsZSA9IHRtcGZpbGUoKTsgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorTUVNT1JZTUdSPSdqbWVtYW5zaS4kKE8pJworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK01FTU9SWU1HUj0nam1lbW5hbWUuJChPKScKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSIAorRU9GCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAnbWt0ZW1wKCknIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjIwOiBjaGVja2luZyBmb3IgJ21rdGVtcCgpJyIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNjIyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisgY2hhciBmbmFtZVs4MF07IG1rdGVtcChmbmFtZSk7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2Mjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTk9fTUtURU1QIAorRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKworIyBFeHRyYWN0IHRoZSBsaWJyYXJ5IHZlcnNpb24gSUQgZnJvbSBqcGVnbGliLmguCitlY2hvICRhY19uICJjaGVja2luZyBsaWJqcGVnIHZlcnNpb24gbnVtYmVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjUwOiBjaGVja2luZyBsaWJqcGVnIHZlcnNpb24gbnVtYmVyIiA+JjUKK0pQRUdfTElCX1ZFUlNJT049YHNlZCAtZSAnL14jZGVmaW5lIEpQRUdfTElCX1ZFUlNJT04vIWQnIC1lICdzL15bXjAtOV0qXChbMC05XVswLTldKlwpLiokL1wxLycgJHNyY2Rpci9qcGVnbGliLmhgCitlY2hvICIkYWNfdCIiJEpQRUdfTElCX1ZFUlNJT04iIDE+JjYKKworCisjIFByZXBhcmUgdG8gbWFzc2FnZSBtYWtlZmlsZS5jZmcgY29ycmVjdGx5LgoraWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgorICBBMktfREVQUz0iIgorICBDT01fQTJLPSIjICIKK2Vsc2UKKyAgQTJLX0RFUFM9ImFuc2kya25yIgorICBDT01fQTJLPSIiCitmaQorCisKKyMgYW5zaTJrbnIgbmVlZHMgLURCU0QgaWYgc3RyaW5nLmggaXMgbWlzc2luZworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0cmluZ19oID0gbm87IHRoZW4KKyAgQU5TSTJLTlJGTEFHUz0iLURCU0QiCitlbHNlCisgIEFOU0kyS05SRkxBR1M9IiIKK2ZpCisKKyMgU3Vic3RpdHV0aW9ucyB0byBlbmFibGUgb3IgZGlzYWJsZSBsaWJ0b29sLXJlbGF0ZWQgc3R1ZmYKK2lmIHRlc3QgJFVTRUxJQlRPT0wgPSB5ZXMgLWEgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KKyAgQ09NX0xUPSIiCitlbHNlCisgIENPTV9MVD0iIyAiCitmaQorCitpZiB0ZXN0ICJ4JExUU0hBUkVEIiAhPSB4bm87IHRoZW4KKyAgRk9SQ0VfSU5TVEFMTF9MSUI9Imluc3RhbGwtbGliIgorZWxzZQorICBGT1JDRV9JTlNUQUxMX0xJQj0iIgorZmkKKworIyBTZXQgdXAgLUkgZGlyZWN0aXZlcworaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgSU5DTFVERUZMQUdTPSctSSQoc3JjZGlyKScKK2Vsc2UKKyAgSU5DTFVERUZMQUdTPSctSS4gLUkkKHNyY2RpciknCitmaQorCit0cmFwICcnIDEgMiAxNQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZTptYWtlZmlsZS5jZmcgamNvbmZpZy5oOmpjb25maWcuY2ZnIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQENQUEAlJENQUCVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBMSUJUT09MQCUkTElCVE9PTCVnCitzJUBPQCUkTyVnCitzJUBBQCUkQSVnCitzJUBMTkAlJExOJWcKK3MlQElOU1RBTExfTElCQCUkSU5TVEFMTF9MSUIlZworcyVATUVNT1JZTUdSQCUkTUVNT1JZTUdSJWcKK3MlQEpQRUdfTElCX1ZFUlNJT05AJSRKUEVHX0xJQl9WRVJTSU9OJWcKK3MlQEEyS19ERVBTQCUkQTJLX0RFUFMlZworcyVAQ09NX0EyS0AlJENPTV9BMkslZworcyVAQU5TSTJLTlJGTEFHU0AlJEFOU0kyS05SRkxBR1MlZworcyVAQ09NX0xUQCUkQ09NX0xUJWcKK3MlQEZPUkNFX0lOU1RBTExfTElCQCUkRk9SQ0VfSU5TVEFMTF9MSUIlZworcyVASU5DTFVERUZMQUdTQCUkSU5DTFVERUZMQUdTJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlOm1ha2VmaWxlLmNmZyJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iamNvbmZpZy5oOmpjb25maWcuY2ZnIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL2RqcGVnLjEgYi9kanBlZy4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmViNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kanBlZy4xCkBAIC0wLDAgKzEsMjUzIEBACisuVEggREpQRUcgMSAiMjIgQXVndXN0IDE5OTciCisuU0ggTkFNRQorZGpwZWcgXC0gZGVjb21wcmVzcyBhIEpQRUcgZmlsZSB0byBhbiBpbWFnZSBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIGRqcGVnCitbCisuSSBvcHRpb25zCitdCitbCisuSSBmaWxlbmFtZQorXQorLkxQCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgZGpwZWcKK2RlY29tcHJlc3NlcyB0aGUgbmFtZWQgSlBFRyBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKK2FuZCBwcm9kdWNlcyBhbiBpbWFnZSBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBQQk1QTFVTIChQUE0vUEdNKSwgQk1QLAorR0lGLCBUYXJnYSwgb3IgUkxFIChVdGFoIFJhc3RlciBUb29sa2l0KSBvdXRwdXQgZm9ybWF0IGNhbiBiZSBzZWxlY3RlZC4KKyhSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCisuU0ggT1BUSU9OUworQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAorLkIgXC1ncmF5c2NhbGUKK21heSBiZSB3cml0dGVuCisuQiBcLWdyYXkKK29yCisuQlIgXC1nciAuCitNb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMgb25lIGxldHRlci4KK1VwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICh0aHVzCisuQiBcLUJNUAoraXMgdGhlIHNhbWUgYXMKKy5CUiBcLWJtcCApLgorQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sCisuQlIgXC1ncmV5c2NhbGUgKSwKK3Rob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KKy5QUAorVGhlIGJhc2ljIHN3aXRjaGVzIGFyZToKKy5UUAorLkJJIFwtY29sb3JzICIgTiIKK1JlZHVjZSBpbWFnZSB0byBhdCBtb3N0IE4gY29sb3JzLiAgVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29sb3JzIHVzZWQgaW4KK3RoZSBvdXRwdXQgaW1hZ2UsIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBvbiBhIGNvbG9ybWFwcGVkIGRpc3BsYXkgb3IKK3N0b3JlZCBpbiBhIGNvbG9ybWFwcGVkIGZpbGUgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGFuIDgtYml0CitkaXNwbGF5LCB5b3UnZCBuZWVkIHRvIHJlZHVjZSB0byAyNTYgb3IgZmV3ZXIgY29sb3JzLgorLlRQCisuQkkgXC1xdWFudGl6ZSAiIE4iCitTYW1lIGFzCisuQlIgXC1jb2xvcnMgLgorLkIgXC1jb2xvcnMKK2lzIHRoZSByZWNvbW1lbmRlZCBuYW1lLAorLkIgXC1xdWFudGl6ZQoraXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisuVFAKKy5CIFwtZmFzdAorU2VsZWN0IHJlY29tbWVuZGVkIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgZmFzdCwgbG93IHF1YWxpdHkgb3V0cHV0LiAgKFRoZQorZGVmYXVsdCBvcHRpb25zIGFyZSBjaG9zZW4gZm9yIGhpZ2hlc3QgcXVhbGl0eSBvdXRwdXQuKSAgQ3VycmVudGx5LCB0aGlzIGlzCitlcXVpdmFsZW50IHRvIFxmQlwtZGN0IGZhc3QgXC1ub3Ntb290aCBcLW9uZXBhc3MgXC1kaXRoZXIgb3JkZXJlZFxmUi4KKy5UUAorLkIgXC1ncmF5c2NhbGUKK0ZvcmNlIGdyYXktc2NhbGUgb3V0cHV0IGV2ZW4gaWYgSlBFRyBmaWxlIGlzIGNvbG9yLiAgVXNlZnVsIGZvciB2aWV3aW5nIG9uCittb25vY2hyb21lIGRpc3BsYXlzOyBhbHNvLAorLkIgZGpwZWcKK3J1bnMgbm90aWNlYWJseSBmYXN0ZXIgaW4gdGhpcyBtb2RlLgorLlRQCisuQkkgXC1zY2FsZSAiIE0vTiIKK1NjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5IHRoZSBzY2FsZSBmYWN0b3IgbXVzdCBiZQorMS8xLCAxLzIsIDEvNCwgb3IgMS84LiAgU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91cgorc2NyZWVuOyBhbHNvLAorLkIgZGpwZWcKK3J1bnMgbXVjaCBmYXN0ZXIgd2hlbiBzY2FsaW5nIGRvd24gdGhlIG91dHB1dC4KKy5UUAorLkIgXC1ibXAKK1NlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoV2luZG93cyBmbGF2b3IpLiAgOC1iaXQgY29sb3JtYXBwZWQgZm9ybWF0IGlzCitlbWl0dGVkIGlmCisuQiBcLWNvbG9ycworb3IKKy5CIFwtZ3JheXNjYWxlCitpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsgb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvcgorZm9ybWF0IGlzIGVtaXR0ZWQuCisuVFAKKy5CIFwtZ2lmCitTZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQuICBTaW5jZSBHSUYgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMjU2IGNvbG9ycywKKy5CIFwtY29sb3JzIDI1NgoraXMgYXNzdW1lZCAodW5sZXNzIHlvdSBzcGVjaWZ5IGEgc21hbGxlciBudW1iZXIgb2YgY29sb3JzKS4KKy5UUAorLkIgXC1vczIKK1NlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiAxLnggZmxhdm9yKS4gIDgtYml0IGNvbG9ybWFwcGVkIGZvcm1hdCBpcworZW1pdHRlZCBpZgorLkIgXC1jb2xvcnMKK29yCisuQiBcLWdyYXlzY2FsZQoraXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IKK2Zvcm1hdCBpcyBlbWl0dGVkLgorLlRQCisuQiBcLXBubQorU2VsZWN0IFBCTVBMVVMgKFBQTS9QR00pIG91dHB1dCBmb3JtYXQgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0KS4KK1BHTSBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZSBvciBpZgorLkIgXC1ncmF5c2NhbGUKK2lzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIFBQTSBpcyBlbWl0dGVkLgorLlRQCisuQiBcLXJsZQorU2VsZWN0IFJMRSBvdXRwdXQgZm9ybWF0LiAgKFJlcXVpcmVzIFVSVCBsaWJyYXJ5LikKKy5UUAorLkIgXC10YXJnYQorU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQuICBHcmF5LXNjYWxlIGZvcm1hdCBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMKK2dyYXktc2NhbGUgb3IgaWYKKy5CIFwtZ3JheXNjYWxlCitpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYKKy5CIFwtY29sb3JzCitpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCisuUFAKK1N3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKKy5UUAorLkIgXC1kY3QgaW50CitVc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KKy5UUAorLkIgXC1kY3QgZmFzdAorVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgorLlRQCisuQiBcLWRjdCBmbG9hdAorVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCitUaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBpbnQgbWV0aG9kLCBidXQgaXMKK211Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUgaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28KK25vdGUgdGhhdCByZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzCittYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuCitUaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZCBpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgorLlRQCisuQiBcLWRpdGhlciBmcworVXNlIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorLlRQCisuQiBcLWRpdGhlciBvcmRlcmVkCitVc2Ugb3JkZXJlZCBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorLlRQCisuQiBcLWRpdGhlciBub25lCitEbyBub3QgdXNlIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCitCeSBkZWZhdWx0LCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGlzIGFwcGxpZWQgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsgdGhpcworaXMgc2xvdyBidXQgdXN1YWxseSBwcm9kdWNlcyB0aGUgYmVzdCByZXN1bHRzLiAgT3JkZXJlZCBkaXRoZXIgaXMgYSBjb21wcm9taXNlCitiZXR3ZWVuIHNwZWVkIGFuZCBxdWFsaXR5OyBubyBkaXRoZXJpbmcgaXMgZmFzdCBidXQgdXN1YWxseSBsb29rcyBhd2Z1bC4gIE5vdGUKK3RoYXQgdGhlc2Ugc3dpdGNoZXMgaGF2ZSBubyBlZmZlY3QgdW5sZXNzIGNvbG9yIHF1YW50aXphdGlvbiBpcyBiZWluZyBkb25lLgorT3JkZXJlZCBkaXRoZXIgaXMgb25seSBhdmFpbGFibGUgaW4KKy5CIFwtb25lcGFzcworbW9kZS4KKy5UUAorLkJJIFwtbWFwICIgZmlsZSIKK1F1YW50aXplIHRvIHRoZSBjb2xvcnMgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGltYWdlIGZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3IKK3Byb2R1Y2luZyBtdWx0aXBsZSBmaWxlcyB3aXRoIGlkZW50aWNhbCBjb2xvciBtYXBzLCBvciBmb3IgZm9yY2luZyBhCitwcmVkZWZpbmVkIHNldCBvZiBjb2xvcnMgdG8gYmUgdXNlZC4gIFRoZQorLkkgZmlsZQorbXVzdCBiZSBhIEdJRiBvciBQUE0gZmlsZS4gVGhpcyBvcHRpb24gb3ZlcnJpZGVzCisuQiBcLWNvbG9ycworYW5kCisuQlIgXC1vbmVwYXNzIC4KKy5UUAorLkIgXC1ub3Ntb290aAorVXNlIGEgZmFzdGVyLCBsb3dlci1xdWFsaXR5IHVwc2FtcGxpbmcgcm91dGluZS4KKy5UUAorLkIgXC1vbmVwYXNzCitVc2Ugb25lLXBhc3MgaW5zdGVhZCBvZiB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24uICBUaGUgb25lLXBhc3MgbWV0aG9kIGlzCitmYXN0ZXIgYW5kIG5lZWRzIGxlc3MgbWVtb3J5LCBidXQgaXQgcHJvZHVjZXMgYSBsb3dlci1xdWFsaXR5IGltYWdlLgorLkIgXC1vbmVwYXNzCitpcyBpZ25vcmVkIHVubGVzcyB5b3UgYWxzbyBzYXkKKy5CIFwtY29sb3JzCisuSVIgTiAuCitBbHNvLCB0aGUgb25lLXBhc3MgbWV0aG9kIGlzIGFsd2F5cyB1c2VkIGZvciBncmF5LXNjYWxlIG91dHB1dCAodGhlIHR3by1wYXNzCittZXRob2QgaXMgbm8gaW1wcm92ZW1lbnQgdGhlbikuCisuVFAKKy5CSSBcLW1heG1lbW9yeSAiIE4iCitTZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKK2luIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQorbnVtYmVyLiAgRm9yIGV4YW1wbGUsCisuQiBcLW1heCA0bQorc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCisuVFAKKy5CSSBcLW91dGZpbGUgIiBuYW1lIgorU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCisuVFAKKy5CIFwtdmVyYm9zZQorRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQorLkJSIFwtdiAncworZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgorLlRQCisuQiBcLWRlYnVnCitTYW1lIGFzCisuQlIgXC12ZXJib3NlIC4KKy5TSCBFWEFNUExFUworLkxQCitUaGlzIGV4YW1wbGUgZGVjb21wcmVzc2VzIHRoZSBKUEVHIGZpbGUgZm9vLmpwZywgcXVhbnRpemVzIGl0IHRvCisyNTYgY29sb3JzLCBhbmQgc2F2ZXMgdGhlIG91dHB1dCBpbiA4LWJpdCBCTVAgZm9ybWF0IGluIGZvby5ibXA6CisuSVAKKy5CIGRqcGVnIFwtY29sb3JzIDI1NiBcLWJtcAorLkkgZm9vLmpwZworLkIgPgorLkkgZm9vLmJtcAorLlNIIEhJTlRTCitUbyBnZXQgYSBxdWljayBwcmV2aWV3IG9mIGFuIGltYWdlLCB1c2UgdGhlCisuQiBcLWdyYXlzY2FsZQorYW5kL29yCisuQiBcLXNjYWxlCitzd2l0Y2hlcy4KKy5CIFwtZ3JheXNjYWxlIFwtc2NhbGUgMS84CitpcyB0aGUgZmFzdGVzdCBjYXNlLgorLlBQCitTZXZlcmFsIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB0aGF0IHRyYWRlIG9mZiBpbWFnZSBxdWFsaXR5IHRvIGdhaW4gc3BlZWQuCisuQiBcLWZhc3QKK3R1cm5zIG9uIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5ncy4KKy5QUAorLkIgXC1kY3QgZmFzdAorYW5kL29yCisuQiBcLW5vc21vb3RoCitnYWluIHNwZWVkIGF0IGEgc21hbGwgc2FjcmlmaWNlIGluIHF1YWxpdHkuCitXaGVuIHByb2R1Y2luZyBhIGNvbG9yLXF1YW50aXplZCBpbWFnZSwKKy5CIFwtb25lcGFzcyBcLWRpdGhlciBvcmRlcmVkCitpcyBmYXN0IGJ1dCBtdWNoIGxvd2VyIHF1YWxpdHkgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvci4KKy5CIFwtZGl0aGVyIG5vbmUKK21heSBnaXZlIGFjY2VwdGFibGUgcmVzdWx0cyBpbiB0d28tcGFzcyBtb2RlLCBidXQgaXMgc2VsZG9tIHRvbGVyYWJsZSBpbgorb25lLXBhc3MgbW9kZS4KKy5QUAorSWYgeW91IGFyZSBmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgdmVyeSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLAorXGZCXC1kY3QgZmxvYXRcZlIgbWF5IGJlIGV2ZW4gZmFzdGVyIHRoYW4gXGZCXC1kY3QgZmFzdFxmUi4gIEJ1dCBvbiBtb3N0CittYWNoaW5lcyBcZkJcLWRjdCBmbG9hdFxmUiBpcyBzbG93ZXIgdGhhbiBcZkJcLWRjdCBpbnRcZlI7IGluIHRoaXMgY2FzZSBpdCBpcworbm90IHdvcnRoIHVzaW5nLCBiZWNhdXNlIGl0cyB0aGVvcmV0aWNhbCBhY2N1cmFjeSBhZHZhbnRhZ2UgaXMgdG9vIHNtYWxsIHRvIGJlCitzaWduaWZpY2FudCBpbiBwcmFjdGljZS4KKy5TSCBFTlZJUk9OTUVOVAorLlRQCisuQiBKUEVHTUVNCitJZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4KK1RoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGZvciB0aGUKKy5CIFwtbWF4bWVtb3J5Citzd2l0Y2guCisuQiBKUEVHTUVNCitvdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQKK2l0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0CisuQlIgXC1tYXhtZW1vcnkgLgorLlNIIFNFRSBBTFNPCisuQlIgY2pwZWcgKDEpLAorLkJSIGpwZWd0cmFuICgxKSwKKy5CUiByZGpwZ2NvbSAoMSksCisuQlIgd3JqcGdjb20gKDEpCisuYnIKKy5CUiBwcG0gKDUpLAorLkJSIHBnbSAoNSkKKy5icgorV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAorQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCisuU0ggQVVUSE9SCitJbmRlcGVuZGVudCBKUEVHIEdyb3VwCisuU0ggQlVHUworQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KKy5QUAorVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LAorLkIgZGpwZWcKK3Byb2R1Y2VzIHVuY29tcHJlc3NlZCBHSUYgZmlsZXMuICBUaGVzZSBhcmUgbGFyZ2VyIHRoYW4gdGhleSBzaG91bGQgYmUsIGJ1dAorYXJlIHJlYWRhYmxlIGJ5IHN0YW5kYXJkIEdJRiBkZWNvZGVycy4KKy5QUAorU3RpbGwgbm90IGFzIGZhc3QgYXMgd2UnZCBsaWtlLgpkaWZmIC0tZ2l0IGEvZGpwZWcuYyBiL2RqcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5OWU5MAotLS0gL2Rldi9udWxsCisrKyBiL2RqcGVnLmMKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiBkanBlZy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBjb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqIEl0IHNob3VsZCB3b3JrIG9uIGFueSBzeXN0ZW0gd2l0aCBVbml4LSBvciBNUy1ET1Mtc3R5bGUgY29tbWFuZCBsaW5lcy4KKyAqCisgKiBUd28gZGlmZmVyZW50IGNvbW1hbmQgbGluZSBzdHlsZXMgYXJlIHBlcm1pdHRlZCwgZGVwZW5kaW5nIG9uIHRoZQorICogY29tcGlsZS10aW1lIHN3aXRjaCBUV09fRklMRV9DT01NQU5ETElORToKKyAqCWRqcGVnIFtvcHRpb25zXSAgaW5wdXRmaWxlIG91dHB1dGZpbGUKKyAqCWRqcGVnIFtvcHRpb25zXSAgW2lucHV0ZmlsZV0KKyAqIEluIHRoZSBzZWNvbmQgc3R5bGUsIG91dHB1dCBpcyBhbHdheXMgdG8gc3RhbmRhcmQgb3V0cHV0LCB3aGljaCB5b3UnZAorICogbm9ybWFsbHkgcmVkaXJlY3QgdG8gYSBmaWxlIG9yIHBpcGUgdG8gc29tZSBvdGhlciBwcm9ncmFtLiAgSW5wdXQgaXMKKyAqIGVpdGhlciBmcm9tIGEgbmFtZWQgZmlsZSBvciBmcm9tIHN0YW5kYXJkIGlucHV0ICh0eXBpY2FsbHkgcmVkaXJlY3RlZCkuCisgKiBUaGUgc2Vjb25kIHN0eWxlIGlzIGNvbnZlbmllbnQgb24gVW5peCBidXQgaXMgdW5oZWxwZnVsIG9uIHN5c3RlbXMgdGhhdAorICogZG9uJ3Qgc3VwcG9ydCBwaXBlcy4gIEFsc28sIHlvdSBNVVNUIHVzZSB0aGUgZmlyc3Qgc3R5bGUgaWYgeW91ciBzeXN0ZW0KKyAqIGRvZXNuJ3QgZG8gYmluYXJ5IEkvTyB0byBzdGRpbi9zdGRvdXQuCisgKiBUbyBzaW1wbGlmeSBzY3JpcHQgd3JpdGluZywgdGhlICItb3V0ZmlsZSIgc3dpdGNoIGlzIHByb3ZpZGVkLiAgVGhlIHN5bnRheAorICoJZGpwZWcgW29wdGlvbnNdICAtb3V0ZmlsZSBvdXRwdXRmaWxlICBpbnB1dGZpbGUKKyAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY29tbWFuZCBsaW5lIHN0eWxlIGlzIHVzZWQuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKyNpbmNsdWRlICJqdmVyc2lvbi5oIgkJLyogZm9yIHZlcnNpb24gbWVzc2FnZSAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXNwcmludCgpICovCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBDcmVhdGUgdGhlIGFkZC1vbiBtZXNzYWdlIHN0cmluZyB0YWJsZS4gKi8KKworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGpwZWdfbWVzc2FnZV90YWJsZVtdID0geworI2luY2x1ZGUgImNkZXJyb3IuaCIKKyAgTlVMTAorfTsKKworCisvKgorICogVGhpcyBsaXN0IGRlZmluZXMgdGhlIGtub3duIG91dHB1dCBpbWFnZSBmb3JtYXRzCisgKiAobm90IGFsbCBvZiB3aGljaCBuZWVkIGJlIHN1cHBvcnRlZCBieSBhIGdpdmVuIHZlcnNpb24pLgorICogWW91IGNhbiBjaGFuZ2UgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBieSBkZWZpbmluZyBERUZBVUxUX0ZNVDsKKyAqIGluZGVlZCwgeW91IGhhZCBiZXR0ZXIgZG8gc28gaWYgeW91IHVuZGVmaW5lIFBQTV9TVVBQT1JURUQuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlGTVRfQk1QLAkJLyogQk1QIGZvcm1hdCAoV2luZG93cyBmbGF2b3IpICovCisJRk1UX0dJRiwJCS8qIEdJRiBmb3JtYXQgKi8KKwlGTVRfT1MyLAkJLyogQk1QIGZvcm1hdCAoT1MvMiBmbGF2b3IpICovCisJRk1UX1BQTSwJCS8qIFBQTS9QR00gKFBCTVBMVVMgZm9ybWF0cykgKi8KKwlGTVRfUkxFLAkJLyogUkxFIGZvcm1hdCAqLworCUZNVF9UQVJHQSwJCS8qIFRhcmdhIGZvcm1hdCAqLworCUZNVF9USUZGCQkvKiBUSUZGIGZvcm1hdCAqLworfSBJTUFHRV9GT1JNQVRTOworCisjaWZuZGVmIERFRkFVTFRfRk1UCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBDRkxBR1MgaW4gTWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9GTVQJRk1UX1BQTQorI2VuZGlmCisKK3N0YXRpYyBJTUFHRV9GT1JNQVRTIHJlcXVlc3RlZF9mbXQ7CisKKworLyoKKyAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KKyAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKKyAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCisgKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCisgKiBUaGUgbWFpbiBwcm9ncmFtIGluIHRoaXMgZmlsZSBkb2Vzbid0IGFjdHVhbGx5IHVzZSB0aGlzIGNhcGFiaWxpdHkuLi4KKyAqLworCisKK3N0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KK3N0YXRpYyBjaGFyICogb3V0ZmlsZW5hbWU7CS8qIGZvciAtb3V0ZmlsZSBzd2l0Y2ggKi8KKworCitMT0NBTCh2b2lkKQordXNhZ2UgKHZvaWQpCisvKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCit7CisgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOworI2Vsc2UKKyAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7CisjZW5kaWYKKworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtY29sb3JzIE4gICAgICBSZWR1Y2UgaW1hZ2UgdG8gbm8gbW9yZSB0aGFuIE4gY29sb3JzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1mYXN0ICAgICAgICAgIEZhc3QsIGxvdy1xdWFsaXR5IHByb2Nlc3NpbmdcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgRm9yY2UgZ3JheXNjYWxlIG91dHB1dFxuIik7CisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNjYWxlIE0vTiAgICAgU2NhbGUgb3V0cHV0IGltYWdlIGJ5IGZyYWN0aW9uIE0vTiwgZWcsIDEvOFxuIik7CisjZW5kaWYKKyNpZmRlZiBCTVBfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtYm1wICAgICAgICAgICBTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKFdpbmRvd3Mgc3R5bGUpJXNcbiIsCisJICAoREVGQVVMVF9GTVQgPT0gRk1UX0JNUCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBHSUZfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZ2lmICAgICAgICAgICBTZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQlc1xuIiwKKwkgIChERUZBVUxUX0ZNVCA9PSBGTVRfR0lGID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorI2lmZGVmIEJNUF9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vczIgICAgICAgICAgIFNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiBzdHlsZSklc1xuIiwKKwkgIChERUZBVUxUX0ZNVCA9PSBGTVRfT1MyID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorI2lmZGVmIFBQTV9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1wbm0gICAgICAgICAgIFNlbGVjdCBQQk1QTFVTIChQUE0vUEdNKSBvdXRwdXQgZm9ybWF0JXNcbiIsCisJICAoREVGQVVMVF9GTVQgPT0gRk1UX1BQTSA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtcmxlICAgICAgICAgICBTZWxlY3QgVXRhaCBSTEUgb3V0cHV0IGZvcm1hdCVzXG4iLAorCSAgKERFRkFVTFRfRk1UID09IEZNVF9STEUgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtdGFyZ2EgICAgICAgICBTZWxlY3QgVGFyZ2Egb3V0cHV0IGZvcm1hdCVzXG4iLAorCSAgKERFRkFVTFRfRk1UID09IEZNVF9UQVJHQSA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6XG4iKTsKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGludCAgICAgICBVc2UgaW50ZWdlciBEQ1QgbWV0aG9kJXNcbiIsCisJICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSVNMT1cgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmYXN0ICAgICAgVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpJXNcbiIsCisJICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSUZBU1QgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmbG9hdCAgICAgVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2Qlc1xuIiwKKwkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9GTE9BVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kaXRoZXIgZnMgICAgIFVzZSBGLVMgZGl0aGVyaW5nIChkZWZhdWx0KVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIG5vbmUgICBEb24ndCB1c2UgZGl0aGVyaW5nIGluIHF1YW50aXphdGlvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIG9yZGVyZWQgIFVzZSBvcmRlcmVkIGRpdGhlciAobWVkaXVtIHNwZWVkLCBxdWFsaXR5KVxuIik7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtbWFwIEZJTEUgICAgICBNYXAgdG8gY29sb3JzIHVzZWQgaW4gbmFtZWQgaW1hZ2UgZmlsZVxuIik7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ub3Ntb290aCAgICAgIERvbid0IHVzZSBoaWdoLXF1YWxpdHkgdXBzYW1wbGluZ1xuIik7CisjaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtb25lcGFzcyAgICAgICBVc2UgMS1wYXNzIHF1YW50aXphdGlvbiAoZmFzdCwgbG93IHF1YWxpdHkpXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1heG1lbW9yeSBOICAgTWF4aW11bSBtZW1vcnkgdG8gdXNlIChpbiBrYnl0ZXMpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vdXRmaWxlIG5hbWUgIFNwZWNpZnkgbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgIG9yICAtZGVidWcgICBFbWl0IGRlYnVnIG91dHB1dFxuIik7CisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCitMT0NBTChpbnQpCitwYXJzZV9zd2l0Y2hlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQorLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCisgKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCisgKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOworICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCisgKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKKyAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKKyAqIHByb2Nlc3NpbmcuCisgKi8KK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisKKyAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLworICByZXF1ZXN0ZWRfZm10ID0gREVGQVVMVF9GTVQ7CS8qIHNldCBkZWZhdWx0IG91dHB1dCBmaWxlIGZvcm1hdCAqLworICBvdXRmaWxlbmFtZSA9IE5VTEw7CisgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLworCisgIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKKyAgICBhcmcgPSBhcmd2W2FyZ25dOworICAgIGlmICgqYXJnICE9ICctJykgeworICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCisgICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKKwlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLworCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLworICAgICAgfQorICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KKyAgICB9CisgICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCisKKyAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYm1wIiwgMSkpIHsKKyAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0LiAqLworICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9CTVA7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvbG9ycyIsIDEpIHx8IGtleW1hdGNoKGFyZywgImNvbG91cnMiLCAxKSB8fAorCSAgICAgICBrZXltYXRjaChhcmcsICJxdWFudGl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgInF1YW50aXNlIiwgMSkpIHsKKyAgICAgIC8qIERvIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KKyAgICAgIGludCB2YWw7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnZhbCkgIT0gMSkKKwl1c2FnZSgpOworICAgICAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IHZhbDsKKyAgICAgIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkY3QiLCAyKSkgeworICAgICAgLyogU2VsZWN0IElEQ1QgYWxnb3JpdGhtLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJpbnQiLCAxKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JU0xPVzsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZhc3QiLCAyKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZsb2F0IiwgMikpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkxPQVQ7CisgICAgICB9IGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkaXRoZXIiLCAyKSkgeworICAgICAgLyogU2VsZWN0IGRpdGhlcmluZyBhbGdvcml0aG0uICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZzIiwgMikpIHsKKwljaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOworICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAibm9uZSIsIDIpKSB7CisJY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9OT05FOworICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAib3JkZXJlZCIsIDIpKSB7CisJY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9PUkRFUkVEOworICAgICAgfSBlbHNlCisJdXNhZ2UoKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGVidWciLCAxKSB8fCBrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKKyAgICAgIC8qIEVuYWJsZSBkZWJ1ZyBwcmludG91dHMuICovCisgICAgICAvKiBPbiBmaXJzdCAtZCwgcHJpbnQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiAqLworICAgICAgc3RhdGljIGJvb2xlYW4gcHJpbnRlZF92ZXJzaW9uID0gRkFMU0U7CisKKyAgICAgIGlmICghIHByaW50ZWRfdmVyc2lvbikgeworCWZwcmludGYoc3RkZXJyLCAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIERKUEVHLCB2ZXJzaW9uICVzXG4lc1xuIiwKKwkJSlZFUlNJT04sIEpDT1BZUklHSFQpOworCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7CisgICAgICB9CisgICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJmYXN0IiwgMSkpIHsKKyAgICAgIC8qIFNlbGVjdCByZWNvbW1lbmRlZCBwcm9jZXNzaW5nIG9wdGlvbnMgZm9yIHF1aWNrLWFuZC1kaXJ0eSBvdXRwdXQuICovCisgICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKKyAgICAgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfT1JERVJFRDsKKyAgICAgIGlmICghIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIC8qIGRvbid0IG92ZXJyaWRlIGFuIGVhcmxpZXIgLWNvbG9ycyAqLworCWNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSAyMTY7CisgICAgICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkFTVEVTVDsKKyAgICAgIGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0U7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdpZiIsIDEpKSB7CisgICAgICAvKiBHSUYgb3V0cHV0IGZvcm1hdC4gKi8KKyAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfR0lGOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAyKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDIpKSB7CisgICAgICAvKiBGb3JjZSBtb25vY2hyb21lIG91dHB1dC4gKi8KKyAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXAiLCAzKSkgeworICAgICAgLyogUXVhbnRpemUgdG8gYSBjb2xvciBtYXAgdGFrZW4gZnJvbSBhbiBpbnB1dCBmaWxlLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGZvcl9yZWFsKSB7CQkvKiB0b28gZXhwZW5zaXZlIHRvIGRvIHR3aWNlISAqLworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkvKiBvdGhlcndpc2UgY2FuJ3QgcXVhbnRpemUgdG8gc3VwcGxpZWQgbWFwICovCisJRklMRSAqIG1hcGZpbGU7CisKKwlpZiAoKG1hcGZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKwkgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKKwkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJcmVhZF9jb2xvcl9tYXAoY2luZm8sIG1hcGZpbGUpOworCWZjbG9zZShtYXBmaWxlKTsKKwljaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKKyNlbHNlCisJRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7CisgICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLworICAgICAgbG9uZyBsdmFsOworICAgICAgY2hhciBjaCA9ICd4JzsKKworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCisJdXNhZ2UoKTsKKyAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQorCWx2YWwgKj0gMTAwMEw7CisgICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zbW9vdGgiLCAzKSkgeworICAgICAgLyogU3VwcHJlc3MgZmFuY3kgdXBzYW1wbGluZyAqLworICAgICAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib25lcGFzcyIsIDMpKSB7CisgICAgICAvKiBVc2UgZmFzdCBvbmUtcGFzcyBxdWFudGl6YXRpb24uICovCisgICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3MyIiwgMykpIHsKKyAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0IChPUy8yIGZsYXZvcikuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX09TMjsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3V0ZmlsZSIsIDQpKSB7CisgICAgICAvKiBTZXQgb3V0cHV0IGZpbGUgbmFtZS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicG5tIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAicHBtIiwgMSkpIHsKKyAgICAgIC8qIFBQTS9QR00gb3V0cHV0IGZvcm1hdC4gKi8KKyAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfUFBNOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJybGUiLCAxKSkgeworICAgICAgLyogUkxFIG91dHB1dCBmb3JtYXQuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1JMRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbGUiLCAxKSkgeworICAgICAgLyogU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZyYWN0aW9uIE0vTi4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkLyVkIiwKKwkJICZjaW5mby0+c2NhbGVfbnVtLCAmY2luZm8tPnNjYWxlX2Rlbm9tKSAhPSAyKQorCXVzYWdlKCk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRhcmdhIiwgMSkpIHsKKyAgICAgIC8qIFRhcmdhIG91dHB1dCBmb3JtYXQuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1RBUkdBOworCisgICAgfSBlbHNlIHsKKyAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCisgICAgfQorICB9CisKKyAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCit9CisKKworLyoKKyAqIE1hcmtlciBwcm9jZXNzb3IgZm9yIENPTSBhbmQgaW50ZXJlc3RpbmcgQVBQbiBtYXJrZXJzLgorICogVGhpcyByZXBsYWNlcyB0aGUgbGlicmFyeSdzIGJ1aWx0LWluIHByb2Nlc3Nvciwgd2hpY2gganVzdCBza2lwcyB0aGUgbWFya2VyLgorICogV2Ugd2FudCB0byBwcmludCBvdXQgdGhlIG1hcmtlciBhcyB0ZXh0LCB0byB0aGUgZXh0ZW50IHBvc3NpYmxlLgorICogTm90ZSB0aGlzIGNvZGUgcmVsaWVzIG9uIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCisgKi8KKworTE9DQUwodW5zaWduZWQgaW50KQoranBlZ19nZXRjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVhZCBuZXh0IGJ5dGUgKi8KK3sKKyAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIGRhdGFzcmMgPSBjaW5mby0+c3JjOworCisgIGlmIChkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgPT0gMCkgeworICAgIGlmICghICgqZGF0YXNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIH0KKyAgZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyLS07CisgIHJldHVybiBHRVRKT0NURVQoKmRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSsrKTsKK30KKworCitNRVRIT0RERUYoYm9vbGVhbikKK3ByaW50X3RleHRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBib29sZWFuIHRyYWNlaXQgPSAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPj0gMSk7CisgIElOVDMyIGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IGNoOworICB1bnNpZ25lZCBpbnQgbGFzdGNoID0gMDsKKworICBsZW5ndGggPSBqcGVnX2dldGMoY2luZm8pIDw8IDg7CisgIGxlbmd0aCArPSBqcGVnX2dldGMoY2luZm8pOworICBsZW5ndGggLT0gMjsJCQkvKiBkaXNjb3VudCB0aGUgbGVuZ3RoIHdvcmQgaXRzZWxmICovCisKKyAgaWYgKHRyYWNlaXQpIHsKKyAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gSlBFR19DT00pCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbW1lbnQsIGxlbmd0aCAlbGQ6XG4iLCAobG9uZykgbGVuZ3RoKTsKKyAgICBlbHNlCQkJLyogYXNzdW1lIGl0IGlzIGFuIEFQUG4gb3RoZXJ3aXNlICovCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFQUCVkLCBsZW5ndGggJWxkOlxuIiwKKwkgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciAtIEpQRUdfQVBQMCwgKGxvbmcpIGxlbmd0aCk7CisgIH0KKworICB3aGlsZSAoLS1sZW5ndGggPj0gMCkgeworICAgIGNoID0ganBlZ19nZXRjKGNpbmZvKTsKKyAgICBpZiAodHJhY2VpdCkgeworICAgICAgLyogRW1pdCB0aGUgY2hhcmFjdGVyIGluIGEgcmVhZGFibGUgZm9ybS4KKyAgICAgICAqIE5vbnByaW50YWJsZXMgYXJlIGNvbnZlcnRlZCB0byBcbm5uIGZvcm0sCisgICAgICAgKiB3aGlsZSBcIGlzIGNvbnZlcnRlZCB0byBcXC4KKyAgICAgICAqIE5ld2xpbmVzIGluIENSLCBDUi9MRiwgb3IgTEYgZm9ybSB3aWxsIGJlIHByaW50ZWQgYXMgb25lIG5ld2xpbmUuCisgICAgICAgKi8KKyAgICAgIGlmIChjaCA9PSAnXHInKSB7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXG4nKSB7CisJaWYgKGxhc3RjaCAhPSAnXHInKQorCSAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7CisJZnByaW50ZihzdGRlcnIsICJcXFxcIik7CisgICAgICB9IGVsc2UgaWYgKGlzcHJpbnQoY2gpKSB7CisJcHV0YyhjaCwgc3RkZXJyKTsKKyAgICAgIH0gZWxzZSB7CisJZnByaW50ZihzdGRlcnIsICJcXCUwM28iLCBjaCk7CisgICAgICB9CisgICAgICBsYXN0Y2ggPSBjaDsKKyAgICB9CisgIH0KKworICBpZiAodHJhY2VpdCkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7CisjZW5kaWYKKyAgaW50IGZpbGVfaW5kZXg7CisgIGRqcGVnX2Rlc3RfcHRyIGRlc3RfbWdyID0gTlVMTDsKKyAgRklMRSAqIGlucHV0X2ZpbGU7CisgIEZJTEUgKiBvdXRwdXRfZmlsZTsKKyAgSkRJTUVOU0lPTiBudW1fc2NhbmxpbmVzOworCisgIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCisjaWZkZWYgVVNFX0NDT01NQU5ECisgIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7CisjZW5kaWYKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisgIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCisgICAgcHJvZ25hbWUgPSAiZGpwZWciOwkJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCisgIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOworICAvKiBBZGQgc29tZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBtZXNzYWdlcyAoZnJvbSBjZGVycm9yLmgpICovCisgIGplcnIuYWRkb25fbWVzc2FnZV90YWJsZSA9IGNkanBlZ19tZXNzYWdlX3RhYmxlOworICBqZXJyLmZpcnN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0ZJUlNUQURET05DT0RFOworICBqZXJyLmxhc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfTEFTVEFERE9OQ09ERTsKKworICAvKiBJbnNlcnQgY3VzdG9tIG1hcmtlciBwcm9jZXNzb3IgZm9yIENPTSBhbmQgQVBQMTIuCisgICAqIEFQUDEyIGlzIHVzZWQgYnkgc29tZSBkaWdpdGFsIGNhbWVyYSBtYWtlcnMgZm9yIHRleHR1YWwgaW5mbywKKyAgICogc28gd2UgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBkaXNwbGF5IGl0IGFzIHRleHQuCisgICAqIElmIHlvdSBsaWtlLCBhZGRpdGlvbmFsIEFQUG4gbWFya2VyIHR5cGVzIGNhbiBiZSBzZWxlY3RlZCBmb3IgZGlzcGxheSwKKyAgICogYnV0IGRvbid0IHRyeSB0byBvdmVycmlkZSBBUFAwIG9yIEFQUDE0IHRoaXMgd2F5IChzZWUgbGlianBlZy5kb2MpLgorICAgKi8KKyAganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigmY2luZm8sIEpQRUdfQ09NLCBwcmludF90ZXh0X21hcmtlcik7CisgIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoJmNpbmZvLCBKUEVHX0FQUDArMTIsIHByaW50X3RleHRfbWFya2VyKTsKKworICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuICovCisjaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorICBlbmFibGVfc2lnbmFsX2NhdGNoZXIoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKKyNlbmRpZgorCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4gKi8KKyAgLyogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKKyAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyIG9wZW5pbmcKKyAgICogdGhlIGlucHV0IGZpbGUuCisgICAqIChFeGNlcHRpb246IHRyYWNpbmcgbGV2ZWwgc2V0IGhlcmUgY29udHJvbHMgdmVyYm9zaXR5IGZvciBDT00gbWFya2VycworICAgKiBmb3VuZCBkdXJpbmcganBlZ19yZWFkX2hlYWRlci4uLikKKyAgICovCisKKyAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOworCisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLworICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOworICB9IGVsc2UgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICB9CisjZWxzZQorICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLworCisgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYykgeworICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KKyAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOworICB9CisKKyAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCisgIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7CisgICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLworICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7CisgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbywgJnByb2dyZXNzKTsKKyNlbmRpZgorCisgIC8qIFNwZWNpZnkgZGF0YSBzb3VyY2UgZm9yIGRlY29tcHJlc3Npb24gKi8KKyAganBlZ19zdGRpb19zcmMoJmNpbmZvLCBpbnB1dF9maWxlKTsKKworICAvKiBSZWFkIGZpbGUgaGVhZGVyLCBzZXQgZGVmYXVsdCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKi8KKyAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKworICAvKiBBZGp1c3QgZGVmYXVsdCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLworICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmNpbmZvLCBhcmdjLCBhcmd2LCAwLCBUUlVFKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBvdXRwdXQgbW9kdWxlIG5vdyB0byBsZXQgaXQgb3ZlcnJpZGUgYW55IGNydWNpYWwKKyAgICogb3B0aW9uIHNldHRpbmdzIChmb3IgaW5zdGFuY2UsIEdJRiB3YW50cyB0byBmb3JjZSBjb2xvciBxdWFudGl6YXRpb24pLgorICAgKi8KKyAgc3dpdGNoIChyZXF1ZXN0ZWRfZm10KSB7CisjaWZkZWYgQk1QX1NVUFBPUlRFRAorICBjYXNlIEZNVF9CTVA6CisgICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9ibXAoJmNpbmZvLCBGQUxTRSk7CisgICAgYnJlYWs7CisgIGNhc2UgRk1UX09TMjoKKyAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX2JtcCgmY2luZm8sIFRSVUUpOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorICBjYXNlIEZNVF9HSUY6CisgICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9naWYoJmNpbmZvKTsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFBQTV9TVVBQT1JURUQKKyAgY2FzZSBGTVRfUFBNOgorICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfcHBtKCZjaW5mbyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisgIGNhc2UgRk1UX1JMRToKKyAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX3JsZSgmY2luZm8pOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgIGNhc2UgRk1UX1RBUkdBOgorICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfdGFyZ2EoJmNpbmZvKTsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoJmNpbmZvLCBKRVJSX1VOU1VQUE9SVEVEX0ZPUk1BVCk7CisgICAgYnJlYWs7CisgIH0KKyAgZGVzdF9tZ3ItPm91dHB1dF9maWxlID0gb3V0cHV0X2ZpbGU7CisKKyAgLyogU3RhcnQgZGVjb21wcmVzc29yICovCisgICh2b2lkKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKTsKKworICAvKiBXcml0ZSBvdXRwdXQgZmlsZSBoZWFkZXIgKi8KKyAgKCpkZXN0X21nci0+c3RhcnRfb3V0cHV0KSAoJmNpbmZvLCBkZXN0X21ncik7CisKKyAgLyogUHJvY2VzcyBkYXRhICovCisgIHdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7CisgICAgbnVtX3NjYW5saW5lcyA9IGpwZWdfcmVhZF9zY2FubGluZXMoJmNpbmZvLCBkZXN0X21nci0+YnVmZmVyLAorCQkJCQlkZXN0X21nci0+YnVmZmVyX2hlaWdodCk7CisgICAgKCpkZXN0X21nci0+cHV0X3BpeGVsX3Jvd3MpICgmY2luZm8sIGRlc3RfbWdyLCBudW1fc2NhbmxpbmVzKTsKKyAgfQorCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIC8qIEhhY2s6IGNvdW50IGZpbmFsIHBhc3MgYXMgZG9uZSBpbiBjYXNlIGZpbmlzaF9vdXRwdXQgZG9lcyBhbiBleHRyYSBwYXNzLgorICAgKiBUaGUgbGlicmFyeSB3b24ndCBoYXZlIHVwZGF0ZWQgY29tcGxldGVkX3Bhc3Nlcy4KKyAgICovCisgIHByb2dyZXNzLnB1Yi5jb21wbGV0ZWRfcGFzc2VzID0gcHJvZ3Jlc3MucHViLnRvdGFsX3Bhc3NlczsKKyNlbmRpZgorCisgIC8qIEZpbmlzaCBkZWNvbXByZXNzaW9uIGFuZCByZWxlYXNlIG1lbW9yeS4KKyAgICogSSBtdXN0IGRvIGl0IGluIHRoaXMgb3JkZXIgYmVjYXVzZSBvdXRwdXQgbW9kdWxlIGhhcyBhbGxvY2F0ZWQgbWVtb3J5CisgICAqIG9mIGxpZmVzcGFuIEpQT09MX0lNQUdFOyBpdCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHJlbGVhc2luZyBtZW1vcnkuCisgICAqLworICAoKmRlc3RfbWdyLT5maW5pc2hfb3V0cHV0KSAoJmNpbmZvLCBkZXN0X21ncik7CisgICh2b2lkKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZjaW5mbyk7CisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCisgIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQorICAgIGZjbG9zZShpbnB1dF9maWxlKTsKKyAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKKyAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisjZW5kaWYKKworICAvKiBBbGwgZG9uZS4gKi8KKyAgZXhpdChqZXJyLm51bV93YXJuaW5ncyA/IEVYSVRfV0FSTklORyA6IEVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZS5jIGIvZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzM1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBleGFtcGxlLmMKKyAqCisgKiBUaGlzIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgSUpHIGNvZGUgYXMgYSBzdWJyb3V0aW5lIGxpYnJhcnkKKyAqIHRvIHJlYWQgb3Igd3JpdGUgSlBFRyBpbWFnZSBmaWxlcy4gIFlvdSBzaG91bGQgbG9vayBhdCB0aGlzIGNvZGUgaW4KKyAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRvY3VtZW50YXRpb24gZmlsZSBsaWJqcGVnLmRvYy4KKyAqCisgKiBUaGlzIGNvZGUgd2lsbCBub3QgZG8gYW55dGhpbmcgdXNlZnVsIGFzLWlzLCBidXQgaXQgbWF5IGJlIGhlbHBmdWwgYXMgYQorICogc2tlbGV0b24gZm9yIGNvbnN0cnVjdGluZyByb3V0aW5lcyB0aGF0IGNhbGwgdGhlIEpQRUcgbGlicmFyeS4gIAorICoKKyAqIFdlIHByZXNlbnQgdGhlc2Ugcm91dGluZXMgaW4gdGhlIHNhbWUgY29kaW5nIHN0eWxlIHVzZWQgaW4gdGhlIEpQRUcgY29kZQorICogKEFOU0kgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV0Yyk7IGJ1dCB5b3UgYXJlIG9mIGNvdXJzZSBmcmVlIHRvIGNvZGUgeW91cgorICogcm91dGluZXMgaW4gYSBkaWZmZXJlbnQgc3R5bGUgaWYgeW91IHByZWZlci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIEluY2x1ZGUgZmlsZSBmb3IgdXNlcnMgb2YgSlBFRyBsaWJyYXJ5LgorICogWW91IHdpbGwgbmVlZCB0byBoYXZlIGluY2x1ZGVkIHN5c3RlbSBoZWFkZXJzIHRoYXQgZGVmaW5lIGF0IGxlYXN0CisgKiB0aGUgdHlwZWRlZnMgRklMRSBhbmQgc2l6ZV90IGJlZm9yZSB5b3UgY2FuIGluY2x1ZGUganBlZ2xpYi5oLgorICogKHN0ZGlvLmggaXMgc3VmZmljaWVudCBvbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtcy4pCisgKiBZb3UgbWF5IGFsc28gd2lzaCB0byBpbmNsdWRlICJqZXJyb3IuaCIuCisgKi8KKworI2luY2x1ZGUgImpwZWdsaWIuaCIKKworLyoKKyAqIDxzZXRqbXAuaD4gaXMgdXNlZCBmb3IgdGhlIG9wdGlvbmFsIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBzaG93biBpbgorICogdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBleGFtcGxlLgorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKiBKUEVHIENPTVBSRVNTSU9OIFNBTVBMRSBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBoYWxmIG9mIHRoZSBleGFtcGxlIHNob3dzIGhvdyB0byBmZWVkIGRhdGEgaW50byB0aGUgSlBFRyBjb21wcmVzc29yLgorICogV2UgcHJlc2VudCBhIG1pbmltYWwgdmVyc2lvbiB0aGF0IGRvZXMgbm90IHdvcnJ5IGFib3V0IHJlZmluZW1lbnRzIHN1Y2gKKyAqIGFzIGVycm9yIHJlY292ZXJ5ICh0aGUgSlBFRyBjb2RlIHdpbGwganVzdCBleGl0KCkgaWYgaXQgZ2V0cyBhbiBlcnJvcikuCisgKi8KKworCisvKgorICogSU1BR0UgREFUQSBGT1JNQVRTOgorICoKKyAqIFRoZSBzdGFuZGFyZCBpbnB1dCBpbWFnZSBmb3JtYXQgaXMgYSByZWN0YW5ndWxhciBhcnJheSBvZiBwaXhlbHMsIHdpdGgKKyAqIGVhY2ggcGl4ZWwgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiAiY29tcG9uZW50IiB2YWx1ZXMgKGNvbG9yIGNoYW5uZWxzKS4KKyAqIEVhY2ggcGl4ZWwgcm93IGlzIGFuIGFycmF5IG9mIEpTQU1QTEVzICh3aGljaCB0eXBpY2FsbHkgYXJlIHVuc2lnbmVkIGNoYXJzKS4KKyAqIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbG9yIGRhdGEsIHRoZW4gdGhlIGNvbG9yIHZhbHVlcyBmb3IgZWFjaCBwaXhlbAorICogbXVzdCBiZSBhZGphY2VudCBpbiB0aGUgcm93OyBmb3IgZXhhbXBsZSwgUixHLEIsUixHLEIsUixHLEIsLi4uIGZvciAyNC1iaXQKKyAqIFJHQiBjb2xvci4KKyAqCisgKiBGb3IgdGhpcyBleGFtcGxlLCB3ZSdsbCBhc3N1bWUgdGhhdCB0aGlzIGRhdGEgc3RydWN0dXJlIG1hdGNoZXMgdGhlIHdheQorICogb3VyIGFwcGxpY2F0aW9uIGhhcyBzdG9yZWQgdGhlIGltYWdlIGluIG1lbW9yeSwgc28gd2UgY2FuIGp1c3QgcGFzcyBhCisgKiBwb2ludGVyIHRvIG91ciBpbWFnZSBidWZmZXIuICBJbiBwYXJ0aWN1bGFyLCBsZXQncyBzYXkgdGhhdCB0aGUgaW1hZ2UgaXMKKyAqIFJHQiBjb2xvciBhbmQgaXMgZGVzY3JpYmVkIGJ5OgorICovCisKK2V4dGVybiBKU0FNUExFICogaW1hZ2VfYnVmZmVyOwkvKiBQb2ludHMgdG8gbGFyZ2UgYXJyYXkgb2YgUixHLEItb3JkZXIgZGF0YSAqLworZXh0ZXJuIGludCBpbWFnZV9oZWlnaHQ7CS8qIE51bWJlciBvZiByb3dzIGluIGltYWdlICovCitleHRlcm4gaW50IGltYWdlX3dpZHRoOwkJLyogTnVtYmVyIG9mIGNvbHVtbnMgaW4gaW1hZ2UgKi8KKworCisvKgorICogU2FtcGxlIHJvdXRpbmUgZm9yIEpQRUcgY29tcHJlc3Npb24uICBXZSBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGZpbGUgbmFtZQorICogYW5kIGEgY29tcHJlc3Npb24gcXVhbGl0eSBmYWN0b3IgYXJlIHBhc3NlZCBpbi4KKyAqLworCitHTE9CQUwodm9pZCkKK3dyaXRlX0pQRUdfZmlsZSAoY2hhciAqIGZpbGVuYW1lLCBpbnQgcXVhbGl0eSkKK3sKKyAgLyogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIEpQRUcgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgcG9pbnRlcnMgdG8KKyAgICogd29ya2luZyBzcGFjZSAod2hpY2ggaXMgYWxsb2NhdGVkIGFzIG5lZWRlZCBieSB0aGUgSlBFRyBsaWJyYXJ5KS4KKyAgICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBzZXZlcmFsIHN1Y2ggc3RydWN0dXJlcywgcmVwcmVzZW50aW5nIG11bHRpcGxlCisgICAqIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gcHJvY2Vzc2VzLCBpbiBleGlzdGVuY2UgYXQgb25jZS4gIFdlIHJlZmVyCisgICAqIHRvIGFueSBvbmUgc3RydWN0IChhbmQgaXRzIGFzc29jaWF0ZWQgd29ya2luZyBkYXRhKSBhcyBhICJKUEVHIG9iamVjdCIuCisgICAqLworICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIC8qIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgYSBKUEVHIGVycm9yIGhhbmRsZXIuICBJdCBpcyBkZWNsYXJlZCBzZXBhcmF0ZWx5CisgICAqIGJlY2F1c2UgYXBwbGljYXRpb25zIG9mdGVuIHdhbnQgdG8gc3VwcGx5IGEgc3BlY2lhbGl6ZWQgZXJyb3IgaGFuZGxlcgorICAgKiAoc2VlIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGlzIGZpbGUgZm9yIGFuIGV4YW1wbGUpLiAgQnV0IGhlcmUgd2UganVzdAorICAgKiB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYW5kIHVzZSB0aGUgc3RhbmRhcmQgZXJyb3IgaGFuZGxlciwgd2hpY2ggd2lsbAorICAgKiBwcmludCBhIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBjYWxsIGV4aXQoKSBpZiBjb21wcmVzc2lvbiBmYWlscy4KKyAgICogTm90ZSB0aGF0IHRoaXMgc3RydWN0IG11c3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBtYWluIEpQRUcgcGFyYW1ldGVyCisgICAqIHN0cnVjdCwgdG8gYXZvaWQgZGFuZ2xpbmctcG9pbnRlciBwcm9ibGVtcy4KKyAgICovCisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworICAvKiBNb3JlIHN0dWZmICovCisgIEZJTEUgKiBvdXRmaWxlOwkJLyogdGFyZ2V0IGZpbGUgKi8KKyAgSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CS8qIHBvaW50ZXIgdG8gSlNBTVBMRSByb3dbc10gKi8KKyAgaW50IHJvd19zdHJpZGU7CQkvKiBwaHlzaWNhbCByb3cgd2lkdGggaW4gaW1hZ2UgYnVmZmVyICovCisKKyAgLyogU3RlcCAxOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCAqLworCisgIC8qIFdlIGhhdmUgdG8gc2V0IHVwIHRoZSBlcnJvciBoYW5kbGVyIGZpcnN0LCBpbiBjYXNlIHRoZSBpbml0aWFsaXphdGlvbgorICAgKiBzdGVwIGZhaWxzLiAgKFVubGlrZWx5LCBidXQgaXQgY291bGQgaGFwcGVuIGlmIHlvdSBhcmUgb3V0IG9mIG1lbW9yeS4pCisgICAqIFRoaXMgcm91dGluZSBmaWxscyBpbiB0aGUgY29udGVudHMgb2Ygc3RydWN0IGplcnIsIGFuZCByZXR1cm5zIGplcnIncworICAgKiBhZGRyZXNzIHdoaWNoIHdlIHBsYWNlIGludG8gdGhlIGxpbmsgZmllbGQgaW4gY2luZm8uCisgICAqLworICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisgIC8qIE5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuICovCisgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogU3RlcCAyOiBzcGVjaWZ5IGRhdGEgZGVzdGluYXRpb24gKGVnLCBhIGZpbGUpICovCisgIC8qIE5vdGU6IHN0ZXBzIDIgYW5kIDMgY2FuIGJlIGRvbmUgaW4gZWl0aGVyIG9yZGVyLiAqLworCisgIC8qIEhlcmUgd2UgdXNlIHRoZSBsaWJyYXJ5LXN1cHBsaWVkIGNvZGUgdG8gc2VuZCBjb21wcmVzc2VkIGRhdGEgdG8gYQorICAgKiBzdGRpbyBzdHJlYW0uICBZb3UgY2FuIGFsc28gd3JpdGUgeW91ciBvd24gY29kZSB0byBkbyBzb21ldGhpbmcgZWxzZS4KKyAgICogVkVSWSBJTVBPUlRBTlQ6IHVzZSAiYiIgb3B0aW9uIHRvIGZvcGVuKCkgaWYgeW91IGFyZSBvbiBhIG1hY2hpbmUgdGhhdAorICAgKiByZXF1aXJlcyBpdCBpbiBvcmRlciB0byB3cml0ZSBiaW5hcnkgZmlsZXMuCisgICAqLworICBpZiAoKG91dGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIikpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBleGl0KDEpOworICB9CisgIGpwZWdfc3RkaW9fZGVzdCgmY2luZm8sIG91dGZpbGUpOworCisgIC8qIFN0ZXAgMzogc2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uICovCisKKyAgLyogRmlyc3Qgd2Ugc3VwcGx5IGEgZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IGltYWdlLgorICAgKiBGb3VyIGZpZWxkcyBvZiB0aGUgY2luZm8gc3RydWN0IG11c3QgYmUgZmlsbGVkIGluOgorICAgKi8KKyAgY2luZm8uaW1hZ2Vfd2lkdGggPSBpbWFnZV93aWR0aDsgCS8qIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQsIGluIHBpeGVscyAqLworICBjaW5mby5pbWFnZV9oZWlnaHQgPSBpbWFnZV9oZWlnaHQ7CisgIGNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHBlciBwaXhlbCAqLworICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7IAkvKiBjb2xvcnNwYWNlIG9mIGlucHV0IGltYWdlICovCisgIC8qIE5vdyB1c2UgdGhlIGxpYnJhcnkncyByb3V0aW5lIHRvIHNldCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCisgICAqIChZb3UgbXVzdCBzZXQgYXQgbGVhc3QgY2luZm8uaW5fY29sb3Jfc3BhY2UgYmVmb3JlIGNhbGxpbmcgdGhpcywKKyAgICogc2luY2UgdGhlIGRlZmF1bHRzIGRlcGVuZCBvbiB0aGUgc291cmNlIGNvbG9yIHNwYWNlLikKKyAgICovCisgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisgIC8qIE5vdyB5b3UgY2FuIHNldCBhbnkgbm9uLWRlZmF1bHQgcGFyYW1ldGVycyB5b3Ugd2lzaCB0by4KKyAgICogSGVyZSB3ZSBqdXN0IGlsbHVzdHJhdGUgdGhlIHVzZSBvZiBxdWFsaXR5IChxdWFudGl6YXRpb24gdGFibGUpIHNjYWxpbmc6CisgICAqLworICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywgcXVhbGl0eSwgVFJVRSAvKiBsaW1pdCB0byBiYXNlbGluZS1KUEVHIHZhbHVlcyAqLyk7CisKKyAgLyogU3RlcCA0OiBTdGFydCBjb21wcmVzc29yICovCisKKyAgLyogVFJVRSBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3cml0ZSBhIGNvbXBsZXRlIGludGVyY2hhbmdlLUpQRUcgZmlsZS4KKyAgICogUGFzcyBUUlVFIHVubGVzcyB5b3UgYXJlIHZlcnkgc3VyZSBvZiB3aGF0IHlvdSdyZSBkb2luZy4KKyAgICovCisgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKworICAvKiBTdGVwIDU6IHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSB3cml0dGVuKSAqLworICAvKiAgICAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoLi4uKTsgKi8KKworICAvKiBIZXJlIHdlIHVzZSB0aGUgbGlicmFyeSdzIHN0YXRlIHZhcmlhYmxlIGNpbmZvLm5leHRfc2NhbmxpbmUgYXMgdGhlCisgICAqIGxvb3AgY291bnRlciwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgdHJhY2sgb3Vyc2VsdmVzLgorICAgKiBUbyBrZWVwIHRoaW5ncyBzaW1wbGUsIHdlIHBhc3Mgb25lIHNjYW5saW5lIHBlciBjYWxsOyB5b3UgY2FuIHBhc3MKKyAgICogbW9yZSBpZiB5b3Ugd2lzaCwgdGhvdWdoLgorICAgKi8KKyAgcm93X3N0cmlkZSA9IGltYWdlX3dpZHRoICogMzsJLyogSlNBTVBMRXMgcGVyIHJvdyBpbiBpbWFnZV9idWZmZXIgKi8KKworICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgeworICAgIC8qIGpwZWdfd3JpdGVfc2NhbmxpbmVzIGV4cGVjdHMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2NhbmxpbmVzLgorICAgICAqIEhlcmUgdGhlIGFycmF5IGlzIG9ubHkgb25lIGVsZW1lbnQgbG9uZywgYnV0IHlvdSBjb3VsZCBwYXNzCisgICAgICogbW9yZSB0aGFuIG9uZSBzY2FubGluZSBhdCBhIHRpbWUgaWYgdGhhdCdzIG1vcmUgY29udmVuaWVudC4KKyAgICAgKi8KKyAgICByb3dfcG9pbnRlclswXSA9ICYgaW1hZ2VfYnVmZmVyW2NpbmZvLm5leHRfc2NhbmxpbmUgKiByb3dfc3RyaWRlXTsKKyAgICAodm9pZCkganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCByb3dfcG9pbnRlciwgMSk7CisgIH0KKworICAvKiBTdGVwIDY6IEZpbmlzaCBjb21wcmVzc2lvbiAqLworCisgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisgIC8qIEFmdGVyIGZpbmlzaF9jb21wcmVzcywgd2UgY2FuIGNsb3NlIHRoZSBvdXRwdXQgZmlsZS4gKi8KKyAgZmNsb3NlKG91dGZpbGUpOworCisgIC8qIFN0ZXAgNzogcmVsZWFzZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCAqLworCisgIC8qIFRoaXMgaXMgYW4gaW1wb3J0YW50IHN0ZXAgc2luY2UgaXQgd2lsbCByZWxlYXNlIGEgZ29vZCBkZWFsIG9mIG1lbW9yeS4gKi8KKyAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogQW5kIHdlJ3JlIGRvbmUhICovCit9CisKKworLyoKKyAqIFNPTUUgRklORSBQT0lOVFM6CisgKgorICogSW4gdGhlIGFib3ZlIGxvb3AsIHdlIGlnbm9yZWQgdGhlIHJldHVybiB2YWx1ZSBvZiBqcGVnX3dyaXRlX3NjYW5saW5lcywKKyAqIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHdyaXR0ZW4uICBXZSBjb3VsZCBnZXQgYXdheQorICogd2l0aCB0aGlzIGJlY2F1c2Ugd2Ugd2VyZSBvbmx5IHJlbHlpbmcgb24gdGhlIHZhbHVlIG9mIGNpbmZvLm5leHRfc2NhbmxpbmUsCisgKiB3aGljaCB3aWxsIGJlIGluY3JlbWVudGVkIGNvcnJlY3RseS4gIElmIHlvdSBtYWludGFpbiBhZGRpdGlvbmFsIGxvb3AKKyAqIHZhcmlhYmxlcyB0aGVuIHlvdSBzaG91bGQgYmUgY2FyZWZ1bCB0byBpbmNyZW1lbnQgdGhlbSBwcm9wZXJseS4KKyAqIEFjdHVhbGx5LCBmb3Igb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtIHlvdSBuZWVkbid0IHdvcnJ5LCBiZWNhdXNlCisgKiB0aGVuIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdpbGwgd3JpdGUgYWxsIHRoZSBsaW5lcyBwYXNzZWQgKG9yIGVsc2UgZXhpdAorICogd2l0aCBhIGZhdGFsIGVycm9yKS4gIFBhcnRpYWwgd3JpdGVzIGNhbiBvbmx5IG9jY3VyIGlmIHlvdSB1c2UgYSBkYXRhCisgKiBkZXN0aW5hdGlvbiBtb2R1bGUgdGhhdCBjYW4gZGVtYW5kIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IuCisgKiAoSWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGF0J3MgZm9yLCB5b3UgZG9uJ3QgbmVlZCBpdC4pCisgKgorICogSWYgdGhlIGNvbXByZXNzb3IgcmVxdWlyZXMgZnVsbC1pbWFnZSBidWZmZXJzIChmb3IgZW50cm9weS1jb2RpbmcKKyAqIG9wdGltaXphdGlvbiBvciBhIG11bHRpLXNjYW4gSlBFRyBmaWxlKSwgaXQgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5CisgKiBmaWxlcyBmb3IgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGZpdCB3aXRoaW4gdGhlIG1heGltdW0tbWVtb3J5IHNldHRpbmcuCisgKiAoTm90ZSB0aGF0IHRlbXAgZmlsZXMgYXJlIE5PVCBuZWVkZWQgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLikKKyAqIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQKKyAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLmRvYy4KKyAqCisgKiBTY2FubGluZXMgTVVTVCBiZSBzdXBwbGllZCBpbiB0b3AtdG8tYm90dG9tIG9yZGVyIGlmIHlvdSB3YW50IHlvdXIgSlBFRworICogZmlsZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV2ZXJ5b25lIGVsc2Uncy4gIElmIHlvdSBjYW5ub3QgcmVhZGlseSByZWFkCisgKiB5b3VyIGRhdGEgaW4gdGhhdCBvcmRlciwgeW91J2xsIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGFycmF5IHRvIGhvbGQgdGhlCisgKiBpbWFnZS4gIFNlZSByZHRhcmdhLmMgb3IgcmRibXAuYyBmb3IgZXhhbXBsZXMgb2YgaGFuZGxpbmcgYm90dG9tLXRvLXRvcAorICogc291cmNlIGRhdGEgdXNpbmcgdGhlIEpQRUcgY29kZSdzIGludGVybmFsIHZpcnR1YWwtYXJyYXkgbWVjaGFuaXNtcy4KKyAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqIEpQRUcgREVDT01QUkVTU0lPTiBTQU1QTEUgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaGFsZiBvZiB0aGUgZXhhbXBsZSBzaG93cyBob3cgdG8gcmVhZCBkYXRhIGZyb20gdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICogSXQncyBhIGJpdCBtb3JlIHJlZmluZWQgdGhhbiB0aGUgYWJvdmUsIGluIHRoYXQgd2Ugc2hvdzoKKyAqICAgKGEpIGhvdyB0byBtb2RpZnkgdGhlIEpQRUcgbGlicmFyeSdzIHN0YW5kYXJkIGVycm9yLXJlcG9ydGluZyBiZWhhdmlvcjsKKyAqICAgKGIpIGhvdyB0byBhbGxvY2F0ZSB3b3Jrc3BhY2UgdXNpbmcgdGhlIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlci4KKyAqCisgKiBKdXN0IHRvIG1ha2UgdGhpcyBleGFtcGxlIGEgbGl0dGxlIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIHdlJ2xsCisgKiBhc3N1bWUgdGhhdCB3ZSBkbyBub3QgaW50ZW5kIHRvIHB1dCB0aGUgd2hvbGUgaW1hZ2UgaW50byBhbiBpbi1tZW1vcnkKKyAqIGJ1ZmZlciwgYnV0IHRvIHNlbmQgaXQgbGluZS1ieS1saW5lIHNvbWVwbGFjZSBlbHNlLiAgV2UgbmVlZCBhIG9uZS0KKyAqIHNjYW5saW5lLWhpZ2ggSlNBTVBMRSBhcnJheSBhcyBhIHdvcmsgYnVmZmVyLCBhbmQgd2Ugd2lsbCBsZXQgdGhlIEpQRUcKKyAqIG1lbW9yeSBtYW5hZ2VyIGFsbG9jYXRlIGl0IGZvciB1cy4gIFRoaXMgYXBwcm9hY2ggaXMgYWN0dWFsbHkgcXVpdGUgdXNlZnVsCisgKiBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8gcmVtZW1iZXIgdG8gZGVhbGxvY2F0ZSB0aGUgYnVmZmVyIHNlcGFyYXRlbHk6IGl0CisgKiB3aWxsIGdvIGF3YXkgYXV0b21hdGljYWxseSB3aGVuIHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwLgorICovCisKKworLyoKKyAqIEVSUk9SIEhBTkRMSU5HOgorICoKKyAqIFRoZSBKUEVHIGxpYnJhcnkncyBzdGFuZGFyZCBlcnJvciBoYW5kbGVyIChqZXJyb3IuYykgaXMgZGl2aWRlZCBpbnRvCisgKiBzZXZlcmFsICJtZXRob2RzIiB3aGljaCB5b3UgY2FuIG92ZXJyaWRlIGluZGl2aWR1YWxseS4gIFRoaXMgbGV0cyB5b3UKKyAqIGFkanVzdCB0aGUgYmVoYXZpb3Igd2l0aG91dCBkdXBsaWNhdGluZyBhIGxvdCBvZiBjb2RlLCB3aGljaCB5b3UgbWlnaHQKKyAqIGhhdmUgdG8gdXBkYXRlIHdpdGggZWFjaCBmdXR1cmUgcmVsZWFzZS4KKyAqCisgKiBPdXIgZXhhbXBsZSBoZXJlIHNob3dzIGhvdyB0byBvdmVycmlkZSB0aGUgImVycm9yX2V4aXQiIG1ldGhvZCBzbyB0aGF0CisgKiBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSBsaWJyYXJ5J3MgY2FsbGVyIHdoZW4gYSBmYXRhbCBlcnJvciBvY2N1cnMsCisgKiByYXRoZXIgdGhhbiBjYWxsaW5nIGV4aXQoKSBhcyB0aGUgc3RhbmRhcmQgZXJyb3JfZXhpdCBtZXRob2QgZG9lcy4KKyAqCisgKiBXZSB1c2UgQydzIHNldGptcC9sb25nam1wIGZhY2lsaXR5IHRvIHJldHVybiBjb250cm9sLiAgVGhpcyBtZWFucyB0aGF0IHRoZQorICogcm91dGluZSB3aGljaCBjYWxscyB0aGUgSlBFRyBsaWJyYXJ5IG11c3QgZmlyc3QgZXhlY3V0ZSBhIHNldGptcCgpIGNhbGwgdG8KKyAqIGVzdGFibGlzaCB0aGUgcmV0dXJuIHBvaW50LiAgV2Ugd2FudCB0aGUgcmVwbGFjZW1lbnQgZXJyb3JfZXhpdCB0byBkbyBhCisgKiBsb25nam1wKCkuICBCdXQgd2UgbmVlZCB0byBtYWtlIHRoZSBzZXRqbXAgYnVmZmVyIGFjY2Vzc2libGUgdG8gdGhlCisgKiBlcnJvcl9leGl0IHJvdXRpbmUuICBUbyBkbyB0aGlzLCB3ZSBtYWtlIGEgcHJpdmF0ZSBleHRlbnNpb24gb2YgdGhlCisgKiBzdGFuZGFyZCBKUEVHIGVycm9yIGhhbmRsZXIgb2JqZWN0LiAgKElmIHdlIHdlcmUgdXNpbmcgQysrLCB3ZSdkIHNheSB3ZQorICogd2VyZSBtYWtpbmcgYSBzdWJjbGFzcyBvZiB0aGUgcmVndWxhciBlcnJvciBoYW5kbGVyLikKKyAqCisgKiBIZXJlJ3MgdGhlIGV4dGVuZGVkIGVycm9yIGhhbmRsZXIgc3RydWN0OgorICovCisKK3N0cnVjdCBteV9lcnJvcl9tZ3IgeworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgcHViOwkvKiAicHVibGljIiBmaWVsZHMgKi8KKworICBqbXBfYnVmIHNldGptcF9idWZmZXI7CS8qIGZvciByZXR1cm4gdG8gY2FsbGVyICovCit9OworCit0eXBlZGVmIHN0cnVjdCBteV9lcnJvcl9tZ3IgKiBteV9lcnJvcl9wdHI7CisKKy8qCisgKiBIZXJlJ3MgdGhlIHJvdXRpbmUgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHN0YW5kYXJkIGVycm9yX2V4aXQgbWV0aG9kOgorICovCisKK01FVEhPRERFRih2b2lkKQorbXlfZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBjaW5mby0+ZXJyIHJlYWxseSBwb2ludHMgdG8gYSBteV9lcnJvcl9tZ3Igc3RydWN0LCBzbyBjb2VyY2UgcG9pbnRlciAqLworICBteV9lcnJvcl9wdHIgbXllcnIgPSAobXlfZXJyb3JfcHRyKSBjaW5mby0+ZXJyOworCisgIC8qIEFsd2F5cyBkaXNwbGF5IHRoZSBtZXNzYWdlLiAqLworICAvKiBXZSBjb3VsZCBwb3N0cG9uZSB0aGlzIHVudGlsIGFmdGVyIHJldHVybmluZywgaWYgd2UgY2hvc2UuICovCisgICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisKKyAgLyogUmV0dXJuIGNvbnRyb2wgdG8gdGhlIHNldGptcCBwb2ludCAqLworICBsb25nam1wKG15ZXJyLT5zZXRqbXBfYnVmZmVyLCAxKTsKK30KKworCisvKgorICogU2FtcGxlIHJvdXRpbmUgZm9yIEpQRUcgZGVjb21wcmVzc2lvbi4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgZmlsZSBuYW1lCisgKiBpcyBwYXNzZWQgaW4uICBXZSB3YW50IHRvIHJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IuCisgKi8KKworCitHTE9CQUwoaW50KQorcmVhZF9KUEVHX2ZpbGUgKGNoYXIgKiBmaWxlbmFtZSkKK3sKKyAgLyogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCBwb2ludGVycyB0bworICAgKiB3b3JraW5nIHNwYWNlICh3aGljaCBpcyBhbGxvY2F0ZWQgYXMgbmVlZGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkpLgorICAgKi8KKyAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIC8qIFdlIHVzZSBvdXIgcHJpdmF0ZSBleHRlbnNpb24gSlBFRyBlcnJvciBoYW5kbGVyLgorICAgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3QgbXVzdCBsaXZlIGFzIGxvbmcgYXMgdGhlIG1haW4gSlBFRyBwYXJhbWV0ZXIKKyAgICogc3RydWN0LCB0byBhdm9pZCBkYW5nbGluZy1wb2ludGVyIHByb2JsZW1zLgorICAgKi8KKyAgc3RydWN0IG15X2Vycm9yX21nciBqZXJyOworICAvKiBNb3JlIHN0dWZmICovCisgIEZJTEUgKiBpbmZpbGU7CQkvKiBzb3VyY2UgZmlsZSAqLworICBKU0FNUEFSUkFZIGJ1ZmZlcjsJCS8qIE91dHB1dCByb3cgYnVmZmVyICovCisgIGludCByb3dfc3RyaWRlOwkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIG91dHB1dCBidWZmZXIgKi8KKworICAvKiBJbiB0aGlzIGV4YW1wbGUgd2Ugd2FudCB0byBvcGVuIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLAorICAgKiBzbyB0aGF0IHRoZSBzZXRqbXAoKSBlcnJvciByZWNvdmVyeSBiZWxvdyBjYW4gYXNzdW1lIHRoZSBmaWxlIGlzIG9wZW4uCisgICAqIFZFUlkgSU1QT1JUQU5UOiB1c2UgImIiIG9wdGlvbiB0byBmb3BlbigpIGlmIHlvdSBhcmUgb24gYSBtYWNoaW5lIHRoYXQKKyAgICogcmVxdWlyZXMgaXQgaW4gb3JkZXIgdG8gcmVhZCBiaW5hcnkgZmlsZXMuCisgICAqLworCisgIGlmICgoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBTdGVwIDE6IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgKi8KKworICAvKiBXZSBzZXQgdXAgdGhlIG5vcm1hbCBKUEVHIGVycm9yIHJvdXRpbmVzLCB0aGVuIG92ZXJyaWRlIGVycm9yX2V4aXQuICovCisgIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyLnB1Yik7CisgIGplcnIucHViLmVycm9yX2V4aXQgPSBteV9lcnJvcl9leGl0OworICAvKiBFc3RhYmxpc2ggdGhlIHNldGptcCByZXR1cm4gY29udGV4dCBmb3IgbXlfZXJyb3JfZXhpdCB0byB1c2UuICovCisgIGlmIChzZXRqbXAoamVyci5zZXRqbXBfYnVmZmVyKSkgeworICAgIC8qIElmIHdlIGdldCBoZXJlLCB0aGUgSlBFRyBjb2RlIGhhcyBzaWduYWxlZCBhbiBlcnJvci4KKyAgICAgKiBXZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCwgY2xvc2UgdGhlIGlucHV0IGZpbGUsIGFuZCByZXR1cm4uCisgICAgICovCisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICBmY2xvc2UoaW5maWxlKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiBOb3cgd2UgY2FuIGluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuICovCisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKKworICAvKiBTdGVwIDI6IHNwZWNpZnkgZGF0YSBzb3VyY2UgKGVnLCBhIGZpbGUpICovCisKKyAganBlZ19zdGRpb19zcmMoJmNpbmZvLCBpbmZpbGUpOworCisgIC8qIFN0ZXAgMzogcmVhZCBmaWxlIHBhcmFtZXRlcnMgd2l0aCBqcGVnX3JlYWRfaGVhZGVyKCkgKi8KKworICAodm9pZCkganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBqcGVnX3JlYWRfaGVhZGVyIHNpbmNlCisgICAqICAgKGEpIHN1c3BlbnNpb24gaXMgbm90IHBvc3NpYmxlIHdpdGggdGhlIHN0ZGlvIGRhdGEgc291cmNlLCBhbmQKKyAgICogICAoYikgd2UgcGFzc2VkIFRSVUUgdG8gcmVqZWN0IGEgdGFibGVzLW9ubHkgSlBFRyBmaWxlIGFzIGFuIGVycm9yLgorICAgKiBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgaW5mby4KKyAgICovCisKKyAgLyogU3RlcCA0OiBzZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbiAqLworCisgIC8qIEluIHRoaXMgZXhhbXBsZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55IG9mIHRoZSBkZWZhdWx0cyBzZXQgYnkKKyAgICoganBlZ19yZWFkX2hlYWRlcigpLCBzbyB3ZSBkbyBub3RoaW5nIGhlcmUuCisgICAqLworCisgIC8qIFN0ZXAgNTogU3RhcnQgZGVjb21wcmVzc29yICovCisKKyAgKHZvaWQpIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOworICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugc3VzcGVuc2lvbiBpcyBub3QgcG9zc2libGUKKyAgICogd2l0aCB0aGUgc3RkaW8gZGF0YSBzb3VyY2UuCisgICAqLworCisgIC8qIFdlIG1heSBuZWVkIHRvIGRvIHNvbWUgc2V0dXAgb2Ygb3VyIG93biBhdCB0aGlzIHBvaW50IGJlZm9yZSByZWFkaW5nCisgICAqIHRoZSBkYXRhLiAgQWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCkgd2UgaGF2ZSB0aGUgY29ycmVjdCBzY2FsZWQKKyAgICogb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgY29sb3JtYXAKKyAgICogaWYgd2UgYXNrZWQgZm9yIGNvbG9yIHF1YW50aXphdGlvbi4KKyAgICogSW4gdGhpcyBleGFtcGxlLCB3ZSBuZWVkIHRvIG1ha2UgYW4gb3V0cHV0IHdvcmsgYnVmZmVyIG9mIHRoZSByaWdodCBzaXplLgorICAgKi8gCisgIC8qIEpTQU1QTEVzIHBlciByb3cgaW4gb3V0cHV0IGJ1ZmZlciAqLworICByb3dfc3RyaWRlID0gY2luZm8ub3V0cHV0X3dpZHRoICogY2luZm8ub3V0cHV0X2NvbXBvbmVudHM7CisgIC8qIE1ha2UgYSBvbmUtcm93LWhpZ2ggc2FtcGxlIGFycmF5IHRoYXQgd2lsbCBnbyBhd2F5IHdoZW4gZG9uZSB3aXRoIGltYWdlICovCisgIGJ1ZmZlciA9ICgqY2luZm8ubWVtLT5hbGxvY19zYXJyYXkpCisJCSgoal9jb21tb25fcHRyKSAmY2luZm8sIEpQT09MX0lNQUdFLCByb3dfc3RyaWRlLCAxKTsKKworICAvKiBTdGVwIDY6IHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKSAqLworICAvKiAgICAgICAgICAganBlZ19yZWFkX3NjYW5saW5lcyguLi4pOyAqLworCisgIC8qIEhlcmUgd2UgdXNlIHRoZSBsaWJyYXJ5J3Mgc3RhdGUgdmFyaWFibGUgY2luZm8ub3V0cHV0X3NjYW5saW5lIGFzIHRoZQorICAgKiBsb29wIGNvdW50ZXIsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHRyYWNrIG91cnNlbHZlcy4KKyAgICovCisgIHdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7CisgICAgLyoganBlZ19yZWFkX3NjYW5saW5lcyBleHBlY3RzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcy4KKyAgICAgKiBIZXJlIHRoZSBhcnJheSBpcyBvbmx5IG9uZSBlbGVtZW50IGxvbmcsIGJ1dCB5b3UgY291bGQgYXNrIGZvcgorICAgICAqIG1vcmUgdGhhbiBvbmUgc2NhbmxpbmUgYXQgYSB0aW1lIGlmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuCisgICAgICovCisgICAgKHZvaWQpIGpwZWdfcmVhZF9zY2FubGluZXMoJmNpbmZvLCBidWZmZXIsIDEpOworICAgIC8qIEFzc3VtZSBwdXRfc2NhbmxpbmVfc29tZXBsYWNlIHdhbnRzIGEgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50LiAqLworICAgIHB1dF9zY2FubGluZV9zb21lcGxhY2UoYnVmZmVyWzBdLCByb3dfc3RyaWRlKTsKKyAgfQorCisgIC8qIFN0ZXAgNzogRmluaXNoIGRlY29tcHJlc3Npb24gKi8KKworICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOworICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugc3VzcGVuc2lvbiBpcyBub3QgcG9zc2libGUKKyAgICogd2l0aCB0aGUgc3RkaW8gZGF0YSBzb3VyY2UuCisgICAqLworCisgIC8qIFN0ZXAgODogUmVsZWFzZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0ICovCisKKyAgLyogVGhpcyBpcyBhbiBpbXBvcnRhbnQgc3RlcCBzaW5jZSBpdCB3aWxsIHJlbGVhc2UgYSBnb29kIGRlYWwgb2YgbWVtb3J5LiAqLworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworCisgIC8qIEFmdGVyIGZpbmlzaF9kZWNvbXByZXNzLCB3ZSBjYW4gY2xvc2UgdGhlIGlucHV0IGZpbGUuCisgICAqIEhlcmUgd2UgcG9zdHBvbmUgaXQgdW50aWwgYWZ0ZXIgbm8gbW9yZSBKUEVHIGVycm9ycyBhcmUgcG9zc2libGUsCisgICAqIHNvIGFzIHRvIHNpbXBsaWZ5IHRoZSBzZXRqbXAgZXJyb3IgbG9naWMgYWJvdmUuICAoQWN0dWFsbHksIEkgZG9uJ3QKKyAgICogdGhpbmsgdGhhdCBqcGVnX2Rlc3Ryb3kgY2FuIGRvIGFuIGVycm9yIGV4aXQsIGJ1dCB3aHkgYXNzdW1lIGFueXRoaW5nLi4uKQorICAgKi8KKyAgZmNsb3NlKGluZmlsZSk7CisKKyAgLyogQXQgdGhpcyBwb2ludCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgYW55IGNvcnJ1cHQtZGF0YQorICAgKiB3YXJuaW5ncyBvY2N1cnJlZCAodGVzdCB3aGV0aGVyIGplcnIucHViLm51bV93YXJuaW5ncyBpcyBub256ZXJvKS4KKyAgICovCisKKyAgLyogQW5kIHdlJ3JlIGRvbmUhICovCisgIHJldHVybiAxOworfQorCisKKy8qCisgKiBTT01FIEZJTkUgUE9JTlRTOgorICoKKyAqIEluIHRoZSBhYm92ZSBjb2RlLCB3ZSBpZ25vcmVkIHRoZSByZXR1cm4gdmFsdWUgb2YganBlZ19yZWFkX3NjYW5saW5lcywKKyAqIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHJlYWQuICBXZSBjb3VsZCBnZXQgYXdheSB3aXRoCisgKiB0aGlzIGJlY2F1c2Ugd2UgYXNrZWQgZm9yIG9ubHkgb25lIGxpbmUgYXQgYSB0aW1lIGFuZCB3ZSB3ZXJlbid0IHVzaW5nCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuICBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBXZSBjaGVhdGVkIGEgYml0IGJ5IGNhbGxpbmcgYWxsb2Nfc2FycmF5KCkgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCk7CisgKiB3ZSBzaG91bGQgaGF2ZSBkb25lIGl0IGJlZm9yZWhhbmQgdG8gZW5zdXJlIHRoYXQgdGhlIHNwYWNlIHdvdWxkIGJlCisgKiBjb3VudGVkIGFnYWluc3QgdGhlIEpQRUcgbWF4X21lbW9yeSBzZXR0aW5nLiAgSW4gc29tZSBzeXN0ZW1zIHRoZSBhYm92ZQorICogY29kZSB3b3VsZCByaXNrIGFuIG91dC1vZi1tZW1vcnkgZXJyb3IuICBIb3dldmVyLCBpbiBnZW5lcmFsIHdlIGRvbid0CisgKiBrbm93IHRoZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBiZWZvcmUganBlZ19zdGFydF9kZWNvbXByZXNzKCksIHVubGVzcyB3ZQorICogY2FsbCBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKS4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBhYm91dCB0aGlzLgorICoKKyAqIFNjYW5saW5lcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcHBlYXIgaW4gdGhlIEpQRUcgZmlsZSwKKyAqIHdoaWNoIGlzIHN0YW5kYXJkbHkgdG9wLXRvLWJvdHRvbS4gIElmIHlvdSBtdXN0IGVtaXQgZGF0YSBib3R0b20tdG8tdG9wLAorICogeW91IGNhbiB1c2Ugb25lIG9mIHRoZSB2aXJ0dWFsIGFycmF5cyBwcm92aWRlZCBieSB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlcgorICogdG8gaW52ZXJ0IHRoZSBkYXRhLiAgU2VlIHdyYm1wLmMgZm9yIGFuIGV4YW1wbGUuCisgKgorICogQXMgd2l0aCBjb21wcmVzc2lvbiwgc29tZSBvcGVyYXRpbmcgbW9kZXMgbWF5IHJlcXVpcmUgdGVtcG9yYXJ5IGZpbGVzLgorICogT24gc29tZSBzeXN0ZW1zIHlvdSBtYXkgbmVlZCB0byBzZXQgdXAgYSBzaWduYWwgaGFuZGxlciB0byBlbnN1cmUgdGhhdAorICogdGVtcG9yYXJ5IGZpbGVzIGFyZSBkZWxldGVkIGlmIHRoZSBwcm9ncmFtIGlzIGludGVycnVwdGVkLiAgU2VlIGxpYmpwZWcuZG9jLgorICovCmRpZmYgLS1naXQgYS9maWxlbGlzdC5kb2MgYi9maWxlbGlzdC5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0OTgyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVsaXN0LmRvYwpAQCAtMCwwICsxLDIxMCBAQAorSUpHIEpQRUcgTElCUkFSWTogIEZJTEUgTElTVAorCitDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorCisKK0hlcmUgaXMgYSByb2FkIG1hcCB0byB0aGUgZmlsZXMgaW4gdGhlIElKRyBKUEVHIGRpc3RyaWJ1dGlvbi4gIFRoZQorZGlzdHJpYnV0aW9uIGluY2x1ZGVzIHRoZSBKUEVHIGxpYnJhcnkgcHJvcGVyLCBwbHVzIHR3byBhcHBsaWNhdGlvbgorcHJvZ3JhbXMgKCJjanBlZyIgYW5kICJkanBlZyIpIHdoaWNoIHVzZSB0aGUgbGlicmFyeSB0byBjb252ZXJ0IEpQRUcKK2ZpbGVzIHRvIGFuZCBmcm9tIHNvbWUgb3RoZXIgcG9wdWxhciBpbWFnZSBmb3JtYXRzLiAgQSB0aGlyZCBhcHBsaWNhdGlvbgorImpwZWd0cmFuIiB1c2VzIHRoZSBsaWJyYXJ5IHRvIGRvIGxvc3NsZXNzIGNvbnZlcnNpb24gYmV0d2VlbiBkaWZmZXJlbnQKK3ZhcmlhbnRzIG9mIEpQRUcuICBUaGVyZSBhcmUgYWxzbyB0d28gc3RhbmQtYWxvbmUgYXBwbGljYXRpb25zLAorInJkanBnY29tIiBhbmQgIndyanBnY29tIi4KKworCitUSEUgSlBFRyBMSUJSQVJZCis9PT09PT09PT09PT09PT09CisKK0luY2x1ZGUgZmlsZXM6CisKK2pwZWdsaWIuaAlKUEVHIGxpYnJhcnkncyBleHBvcnRlZCBkYXRhIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCitqY29uZmlnLmgJQ29uZmlndXJhdGlvbiBkZWNsYXJhdGlvbnMuICBOb3RlOiB0aGlzIGZpbGUgaXMgbm90IHByZXNlbnQKKwkJaW4gdGhlIGRpc3RyaWJ1dGlvbjsgaXQgaXMgZ2VuZXJhdGVkIGR1cmluZyBpbnN0YWxsYXRpb24uCitqbW9yZWNmZy5oCUFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBkZWNsYXJhdGlvbnM7IG5lZWQgbm90IGJlIGNoYW5nZWQKKwkJZm9yIGEgc3RhbmRhcmQgaW5zdGFsbGF0aW9uLgoramVycm9yLmgJRGVjbGFyZXMgSlBFRyBsaWJyYXJ5J3MgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2UgY29kZXMuCitqaW5jbHVkZS5oCUNlbnRyYWwgaW5jbHVkZSBmaWxlIHVzZWQgYnkgYWxsIElKRyAuYyBmaWxlcyB0byByZWZlcmVuY2UKKwkJc3lzdGVtIGluY2x1ZGUgZmlsZXMuCitqcGVnaW50LmgJSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgoramNodWZmLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZW5jb2RlciBtb2R1bGVzLgoramRodWZmLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZGVjb2RlciBtb2R1bGVzLgoramRjdC5oCQlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgZm9yd2FyZCAmIHJldmVyc2UgRENUIHN1YnN5c3RlbXMuCitqbWVtc3lzLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4KK2p2ZXJzaW9uLmgJVmVyc2lvbiBpbmZvcm1hdGlvbi4KKworQXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZCBpbmNsdWRlIGpwZWdsaWIuaCAod2hpY2ggaW4gdHVybgoraW5jbHVkZXMgamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oKS4gIE9wdGlvbmFsbHksIGplcnJvci5oIG1heSBiZSBpbmNsdWRlZAoraWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlZmVyZW5jZSBpbmRpdmlkdWFsIEpQRUcgZXJyb3IgY29kZXMuICBUaGUKK290aGVyIGluY2x1ZGUgZmlsZXMgYXJlIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2UgYW5kIHdvdWxkIG5vdCBub3JtYWxseQorYmUgaW5jbHVkZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbS4gIChjanBlZy9kanBlZy9ldGMgZG8gdXNlIGppbmNsdWRlLmgsCitzaW5jZSBpdHMgZnVuY3Rpb24gaXMgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eSBvZiB0aGUgd2hvbGUgSUpHIGRpc3RyaWJ1dGlvbi4KK01vc3Qgb3RoZXIgYXBwbGljYXRpb25zIHdpbGwgZGlyZWN0bHkgaW5jbHVkZSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMgdGhleQord2FudCwgYW5kIGhlbmNlIHdvbid0IG5lZWQgamluY2x1ZGUuaC4pCisKKworQyBzb3VyY2UgY29kZSBmaWxlczoKKworVGhlc2UgZmlsZXMgY29udGFpbiBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5CithbiBhcHBsaWNhdGlvbiBwcm9ncmFtOgorCitqY2FwaW1pbi5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBjb3JlIHJvdXRpbmVzIGZvciBjb21wcmVzc2lvbi4KK2pjYXBpc3RkLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IHN0YW5kYXJkIGNvbXByZXNzaW9uLgoramRhcGltaW4uYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZTogY29yZSByb3V0aW5lcyBmb3IgZGVjb21wcmVzc2lvbi4KK2pkYXBpc3RkLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IHN0YW5kYXJkIGRlY29tcHJlc3Npb24uCitqY29tYXBpLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2Ugcm91dGluZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uCisJCWFuZCBkZWNvbXByZXNzaW9uLgoramNwYXJhbS5jCUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZXR0aW5nIGhlbHBlciByb3V0aW5lcy4KK2pjdHJhbnMuYwlBUEkgYW5kIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLgoramR0cmFucy5jCUFQSSBhbmQgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgZGVjb21wcmVzc2lvbi4KKworQ29tcHJlc3Npb24gc2lkZSBvZiB0aGUgbGlicmFyeToKKworamNpbml0LmMJSW5pdGlhbGl6YXRpb246IGRldGVybWluZXMgd2hpY2ggb3RoZXIgbW9kdWxlcyB0byB1c2UuCitqY21hc3Rlci5jCU1hc3RlciBjb250cm9sOiBzZXR1cCBhbmQgaW50ZXItcGFzcyBzZXF1ZW5jaW5nIGxvZ2ljLgoramNtYWluY3QuYwlNYWluIGJ1ZmZlciBjb250cm9sbGVyIChwcmVwcm9jZXNzb3IgPT4gSlBFRyBjb21wcmVzc29yKS4KK2pjcHJlcGN0LmMJUHJlcHJvY2Vzc29yIGJ1ZmZlciBjb250cm9sbGVyLgoramNjb2VmY3QuYwlCdWZmZXIgY29udHJvbGxlciBmb3IgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4KK2pjY29sb3IuYwlDb2xvciBzcGFjZSBjb252ZXJzaW9uLgoramNzYW1wbGUuYwlEb3duc2FtcGxpbmcuCitqY2RjdG1nci5jCURDVCBtYW5hZ2VyIChEQ1QgaW1wbGVtZW50YXRpb24gc2VsZWN0aW9uICYgY29udHJvbCkuCitqZmRjdGludC5jCUZvcndhcmQgRENUIHVzaW5nIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgoramZkY3Rmc3QuYwlGb3J3YXJkIERDVCB1c2luZyBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCitqZmRjdGZsdC5jCUZvcndhcmQgRENUIHVzaW5nIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCitqY2h1ZmYuYwlIdWZmbWFuIGVudHJvcHkgY29kaW5nIGZvciBzZXF1ZW50aWFsIEpQRUcuCitqY3BodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGNvZGluZyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KK2pjbWFya2VyLmMJSlBFRyBtYXJrZXIgd3JpdGluZy4KK2pkYXRhZHN0LmMJRGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIGZvciBzdGRpbyBvdXRwdXQuCisKK0RlY29tcHJlc3Npb24gc2lkZSBvZiB0aGUgbGlicmFyeToKKworamRtYXN0ZXIuYwlNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB3aGljaCBvdGhlciBtb2R1bGVzIHRvIHVzZS4KK2pkaW5wdXQuYwlJbnB1dCBjb250cm9sbGVyOiBjb250cm9scyBpbnB1dCBwcm9jZXNzaW5nIG1vZHVsZXMuCitqZG1haW5jdC5jCU1haW4gYnVmZmVyIGNvbnRyb2xsZXIgKEpQRUcgZGVjb21wcmVzc29yID0+IHBvc3Rwcm9jZXNzb3IpLgoramRjb2VmY3QuYwlCdWZmZXIgY29udHJvbGxlciBmb3IgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4KK2pkcG9zdGN0LmMJUG9zdHByb2Nlc3NvciBidWZmZXIgY29udHJvbGxlci4KK2pkbWFya2VyLmMJSlBFRyBtYXJrZXIgcmVhZGluZy4KK2pkaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyBmb3Igc2VxdWVudGlhbCBKUEVHLgoramRwaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KK2pkZGN0bWdyLmMJSURDVCBtYW5hZ2VyIChJRENUIGltcGxlbWVudGF0aW9uIHNlbGVjdGlvbiAmIGNvbnRyb2wpLgoramlkY3RpbnQuYwlJbnZlcnNlIERDVCB1c2luZyBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KK2ppZGN0ZnN0LmMJSW52ZXJzZSBEQ1QgdXNpbmcgZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgoramlkY3RmbHQuYwlJbnZlcnNlIERDVCB1c2luZyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgoramlkY3RyZWQuYwlJbnZlcnNlIERDVHMgd2l0aCByZWR1Y2VkLXNpemUgb3V0cHV0cy4KK2pkc2FtcGxlLmMJVXBzYW1wbGluZy4KK2pkY29sb3IuYwlDb2xvciBzcGFjZSBjb252ZXJzaW9uLgoramRtZXJnZS5jCU1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24gKGZhc3RlciwgbG93ZXIgcXVhbGl0eSkuCitqcXVhbnQxLmMJT25lLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIHVzaW5nIGEgZml4ZWQtc3BhY2luZyBjb2xvcm1hcC4KK2pxdWFudDIuYwlUd28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgYSBjdXN0b20tZ2VuZXJhdGVkIGNvbG9ybWFwLgorCQlBbHNvIGhhbmRsZXMgb25lLXBhc3MgcXVhbnRpemF0aW9uIHRvIGFuIGV4dGVybmFsbHkgZ2l2ZW4gbWFwLgoramRhdGFzcmMuYwlEYXRhIHNvdXJjZSBtYW5hZ2VyIGZvciBzdGRpbyBpbnB1dC4KKworU3VwcG9ydCBmaWxlcyBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbjoKKworamVycm9yLmMJU3RhbmRhcmQgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgKGFwcGxpY2F0aW9uIHJlcGxhY2VhYmxlKS4KK2ptZW1tZ3IuYwlTeXN0ZW0taW5kZXBlbmRlbnQgKG1vcmUgb3IgbGVzcykgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4KK2p1dGlscy5jCU1pc2NlbGxhbmVvdXMgdXRpbGl0eSByb3V0aW5lcy4KKworam1lbW1nci5jIHJlbGllcyBvbiBhIHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZW1lbnQgbW9kdWxlLiAgVGhlIElKRworZGlzdHJpYnV0aW9uIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzeXN0ZW0tZGVwZW5kZW50Cittb2R1bGU6CisKK2ptZW1ub2JzLmMJIk5vIGJhY2tpbmcgc3RvcmUiOiBhc3N1bWVzIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5IGV4aXN0cy4KK2ptZW1hbnNpLmMJTWFrZXMgdGVtcG9yYXJ5IGZpbGVzIHdpdGggQU5TSS1zdGFuZGFyZCByb3V0aW5lIHRtcGZpbGUoKS4KK2ptZW1uYW1lLmMJTWFrZXMgdGVtcG9yYXJ5IGZpbGVzIHdpdGggcHJvZ3JhbS1nZW5lcmF0ZWQgZmlsZSBuYW1lcy4KK2ptZW1kb3MuYwlDdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIE1TLURPUyAoMTYtYml0IGVudmlyb25tZW50IG9ubHkpOgorCQljYW4gdXNlIGV4dGVuZGVkIGFuZCBleHBhbmRlZCBtZW1vcnkgYXMgd2VsbCBhcyB0ZW1wIGZpbGVzLgoram1lbW1hYy5jCUN1c3RvbSBpbXBsZW1lbnRhdGlvbiBmb3IgQXBwbGUgTWFjaW50b3NoLgorCitFeGFjdGx5IG9uZSBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudCBtb2R1bGVzIHNob3VsZCBiZSBjb25maWd1cmVkIGludG8gYW4KK2luc3RhbGxlZCBKUEVHIGxpYnJhcnkgKHNlZSBpbnN0YWxsLmRvYyBmb3IgaGludHMgYWJvdXQgd2hpY2ggb25lIHRvIHVzZSkuCitPbiB1bnVzdWFsIHN5c3RlbXMgeW91IG1heSBmaW5kIGl0IHdvcnRod2hpbGUgdG8gbWFrZSBhIHNwZWNpYWwKK3N5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZXIuCisKKworTm9uLUMgc291cmNlIGNvZGUgZmlsZXM6CisKK2ptZW1kb3NhLmFzbQk4MHg4NiBhc3NlbWJseSBjb2RlIHN1cHBvcnQgZm9yIGptZW1kb3MuYzsgdXNlZCBvbmx5IGluCisJCU1TLURPUy1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBvZiB0aGUgSlBFRyBsaWJyYXJ5LgorCisKK0NKUEVHL0RKUEVHL0pQRUdUUkFOCis9PT09PT09PT09PT09PT09PT09PQorCitJbmNsdWRlIGZpbGVzOgorCitjZGpwZWcuaAlEZWNsYXJhdGlvbnMgc2hhcmVkIGJ5IGNqcGVnL2RqcGVnL2pwZWd0cmFuIG1vZHVsZXMuCitjZGVycm9yLmgJQWRkaXRpb25hbCBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZSBjb2RlcyBmb3IgY2pwZWcgZXQgYWwuCit0cmFuc3VwcC5oCURlY2xhcmF0aW9ucyBmb3IganBlZ3RyYW4gc3VwcG9ydCByb3V0aW5lcyBpbiB0cmFuc3VwcC5jLgorCitDIHNvdXJjZSBjb2RlIGZpbGVzOgorCitjanBlZy5jCQlNYWluIHByb2dyYW0gZm9yIGNqcGVnLgorZGpwZWcuYwkJTWFpbiBwcm9ncmFtIGZvciBkanBlZy4KK2pwZWd0cmFuLmMJTWFpbiBwcm9ncmFtIGZvciBqcGVndHJhbi4KK2NkanBlZy5jCVV0aWxpdHkgcm91dGluZXMgdXNlZCBieSBhbGwgdGhyZWUgcHJvZ3JhbXMuCityZGNvbG1hcC5jCUNvZGUgdG8gcmVhZCBhIGNvbG9ybWFwIGZpbGUgZm9yIGRqcGVnJ3MgIi1tYXAiIHN3aXRjaC4KK3Jkc3dpdGNoLmMJQ29kZSB0byBwcm9jZXNzIHNvbWUgb2YgY2pwZWcncyBtb3JlIGNvbXBsZXggc3dpdGNoZXMuCisJCUFsc28gdXNlZCBieSBqcGVndHJhbi4KK3RyYW5zdXBwLmMJU3VwcG9ydCBjb2RlIGZvciBqcGVndHJhbjogbG9zc2xlc3MgaW1hZ2UgbWFuaXB1bGF0aW9ucy4KKworSW1hZ2UgZmlsZSByZWFkZXIgbW9kdWxlcyBmb3IgY2pwZWc6CisKK3JkYm1wLmMJCUJNUCBmaWxlIGlucHV0LgorcmRnaWYuYwkJR0lGIGZpbGUgaW5wdXQgKG5vdyBqdXN0IGEgc3R1YikuCityZHBwbS5jCQlQUE0vUEdNIGZpbGUgaW5wdXQuCityZHJsZS5jCQlVdGFoIFJMRSBmaWxlIGlucHV0LgorcmR0YXJnYS5jCVRhcmdhIGZpbGUgaW5wdXQuCisKK0ltYWdlIGZpbGUgd3JpdGVyIG1vZHVsZXMgZm9yIGRqcGVnOgorCit3cmJtcC5jCQlCTVAgZmlsZSBvdXRwdXQuCit3cmdpZi5jCQlHSUYgZmlsZSBvdXRwdXQgKGEgbWVyZSBzaGFkb3cgb2YgaXRzIGZvcm1lciBzZWxmKS4KK3dycHBtLmMJCVBQTS9QR00gZmlsZSBvdXRwdXQuCit3cnJsZS5jCQlVdGFoIFJMRSBmaWxlIG91dHB1dC4KK3dydGFyZ2EuYwlUYXJnYSBmaWxlIG91dHB1dC4KKworCitSREpQR0NPTS9XUkpQR0NPTQorPT09PT09PT09PT09PT09PT0KKworQyBzb3VyY2UgY29kZSBmaWxlczoKKworcmRqcGdjb20uYwlTdGFuZC1hbG9uZSByZGpwZ2NvbSBhcHBsaWNhdGlvbi4KK3dyanBnY29tLmMJU3RhbmQtYWxvbmUgd3JqcGdjb20gYXBwbGljYXRpb24uCisKK1RoZXNlIHByb2dyYW1zIGRvIG5vdCBkZXBlbmQgb24gdGhlIElKRyBsaWJyYXJ5LiAgVGhleSBkbyB1c2UKK2pjb25maWcuaCBhbmQgamluY2x1ZGUuaCwgb25seSB0byBpbXByb3ZlIHBvcnRhYmlsaXR5LgorCisKK0FERElUSU9OQUwgRklMRVMKKz09PT09PT09PT09PT09PT0KKworRG9jdW1lbnRhdGlvbiAoc2VlIFJFQURNRSBmb3IgYSBndWlkZSB0byB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcyk6CisKK1JFQURNRQkJTWFzdGVyIGRvY3VtZW50YXRpb24gZmlsZS4KKyouZG9jCQlPdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzLgorKi4xCQlEb2N1bWVudGF0aW9uIGluIFVuaXggbWFuIHBhZ2UgZm9ybWF0LgorY2hhbmdlLmxvZwlWZXJzaW9uLXRvLXZlcnNpb24gY2hhbmdlIGhpZ2hsaWdodHMuCitleGFtcGxlLmMJU2FtcGxlIGNvZGUgZm9yIGNhbGxpbmcgSlBFRyBsaWJyYXJ5LgorCitDb25maWd1cmF0aW9uL2luc3RhbGxhdGlvbiBmaWxlcyBhbmQgcHJvZ3JhbXMgKHNlZSBpbnN0YWxsLmRvYyBmb3IgbW9yZSBpbmZvKToKKworY29uZmlndXJlCVVuaXggc2hlbGwgc2NyaXB0IHRvIHBlcmZvcm0gYXV0b21hdGljIGNvbmZpZ3VyYXRpb24uCitsdGNvbmZpZwlTdXBwb3J0IHNjcmlwdHMgZm9yIGNvbmZpZ3VyZSAoZnJvbSBHTlUgbGlidG9vbCkuCitsdG1haW4uc2gKK2NvbmZpZy5ndWVzcworY29uZmlnLnN1YgoraW5zdGFsbC1zaAlJbnN0YWxsIHNoZWxsIHNjcmlwdCBmb3IgdGhvc2UgVW5peCBzeXN0ZW1zIGxhY2tpbmcgb25lLgorY2tjb25maWcuYwlQcm9ncmFtIHRvIGdlbmVyYXRlIGpjb25maWcuaCBvbiBub24tVW5peCBzeXN0ZW1zLgoramNvbmZpZy5kb2MJVGVtcGxhdGUgZm9yIG1ha2luZyBqY29uZmlnLmggYnkgaGFuZC4KK21ha2VmaWxlLioJU2FtcGxlIG1ha2VmaWxlcyBmb3IgcGFydGljdWxhciBzeXN0ZW1zLgoramNvbmZpZy4qCVNhbXBsZSBqY29uZmlnLmggZm9yIHBhcnRpY3VsYXIgc3lzdGVtcy4KK2Fuc2kya25yLmMJRGUtQU5TSWZpZXIgZm9yIHByZS1BTlNJIEMgY29tcGlsZXJzIChjb3VydGVzeSBvZgorCQlMLiBQZXRlciBEZXV0c2NoIGFuZCBBbGFkZGluIEVudGVycHJpc2VzKS4KKworVGVzdCBmaWxlcyAoc2VlIGluc3RhbGwuZG9jIGZvciB0ZXN0IHByb2NlZHVyZSk6CisKK3Rlc3QqLioJCVNvdXJjZSBhbmQgY29tcGFyaXNvbiBmaWxlcyBmb3IgY29uZmlkZW5jZSB0ZXN0LgorCQlUaGVzZSBhcmUgYmluYXJ5IGltYWdlIGZpbGVzLCBOT1QgdGV4dCBmaWxlcy4KZGlmZiAtLWdpdCBhL2luc3RhbGwtc2ggYi9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4NDM2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMjUwIEBACisjIS9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKyMKKyMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisjIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisjIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisjIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisjIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCit0cmFuc2Zvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2luc3RhbGwuZG9jIGIvaW5zdGFsbC5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwMmI5OAotLS0gL2Rldi9udWxsCisrKyBiL2luc3RhbGwuZG9jCkBAIC0wLDAgKzEsMTA2MyBAQAorSU5TVEFMTEFUSU9OIElOU1RSVUNUSU9OUyBmb3IgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCisKK0NvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCitGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisKKworVGhpcyBmaWxlIGV4cGxhaW5zIGhvdyB0byBjb25maWd1cmUgYW5kIGluc3RhbGwgdGhlIElKRyBzb2Z0d2FyZS4gIFdlIGhhdmUKK3RyaWVkIHRvIG1ha2UgdGhpcyBzb2Z0d2FyZSBleHRyZW1lbHkgcG9ydGFibGUgYW5kIGZsZXhpYmxlLCBzbyB0aGF0IGl0IGNhbiBiZQorYWRhcHRlZCB0byBhbG1vc3QgYW55IGVudmlyb25tZW50LiAgVGhlIGRvd25zaWRlIG9mIHRoaXMgZGVjaXNpb24gaXMgdGhhdCB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzIGlzIGNvbXBsaWNhdGVkLiAgV2UgaGF2ZSBwcm92aWRlZCBzaG9ydGN1dHMgdG8gc2ltcGxpZnkKK3RoZSB0YXNrIG9uIGNvbW1vbiBzeXN0ZW1zLiAgQnV0IGluIGFueSBjYXNlLCB5b3Ugd2lsbCBuZWVkIGF0IGxlYXN0IGEgbGl0dGxlCitmYW1pbGlhcml0eSB3aXRoIEMgcHJvZ3JhbW1pbmcgYW5kIHByb2dyYW0gYnVpbGQgcHJvY2VkdXJlcyBmb3IgeW91ciBzeXN0ZW0uCisKK0lmIHlvdSBhcmUgb25seSB1c2luZyB0aGlzIHNvZnR3YXJlIGFzIHBhcnQgb2YgYSBsYXJnZXIgcHJvZ3JhbSwgdGhlIGxhcmdlcgorcHJvZ3JhbSdzIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgbWF5IHRha2UgY2FyZSBvZiBjb25maWd1cmluZyB0aGUgSUpHIGNvZGUuCitGb3IgZXhhbXBsZSwgR2hvc3RzY3JpcHQncyBpbnN0YWxsYXRpb24gc2NyaXB0IHdpbGwgY29uZmlndXJlIHRoZSBJSkcgY29kZS4KK1lvdSBkb24ndCBuZWVkIHRvIHJlYWQgdGhpcyBmaWxlIGlmIHlvdSBqdXN0IHdhbnQgdG8gY29tcGlsZSBHaG9zdHNjcmlwdC4KKworSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgeW91IG1heSBub3QgbmVlZCB0byByZWFkIHRoaXMgZmlsZSBhdCBhbGwuCitUcnkgZG9pbmcKKwkuL2NvbmZpZ3VyZQorCW1ha2UKKwltYWtlIHRlc3QKK0lmIHRoYXQgZG9lc24ndCBjb21wbGFpbiwgZG8KKwltYWtlIGluc3RhbGwKKyhiZXR0ZXIgZG8gIm1ha2UgLW4gaW5zdGFsbCIgZmlyc3QgdG8gc2VlIGlmIHRoZSBtYWtlZmlsZSB3aWxsIHB1dCB0aGUgZmlsZXMKK3doZXJlIHlvdSB3YW50IHRoZW0pLiAgUmVhZCBmdXJ0aGVyIGlmIHlvdSBydW4gaW50byBzbmFncyBvciB3YW50IHRvIGN1c3RvbWl6ZQordGhlIGNvZGUgZm9yIHlvdXIgc3lzdGVtLgorCisKK1RBQkxFIE9GIENPTlRFTlRTCistLS0tLS0tLS0tLS0tLS0tLQorCitCZWZvcmUgeW91IHN0YXJ0CitDb25maWd1cmluZyB0aGUgc29mdHdhcmU6CisJdXNpbmcgdGhlIGF1dG9tYXRpYyAiY29uZmlndXJlIiBzY3JpcHQKKwl1c2luZyBvbmUgb2YgdGhlIHN1cHBsaWVkIGpjb25maWcgYW5kIG1ha2VmaWxlIGZpbGVzCisJYnkgaGFuZAorQnVpbGRpbmcgdGhlIHNvZnR3YXJlCitUZXN0aW5nIHRoZSBzb2Z0d2FyZQorSW5zdGFsbGluZyB0aGUgc29mdHdhcmUKK09wdGlvbmFsIHN0dWZmCitPcHRpbWl6YXRpb24KK0hpbnRzIGZvciBzcGVjaWZpYyBzeXN0ZW1zCisKKworQkVGT1JFIFlPVSBTVEFSVAorPT09PT09PT09PT09PT09PQorCitCZWZvcmUgaW5zdGFsbGluZyB0aGUgc29mdHdhcmUgeW91IG11c3QgdW5wYWNrIHRoZSBkaXN0cmlidXRlZCBzb3VyY2UgY29kZS4KK1NpbmNlIHlvdSBhcmUgcmVhZGluZyB0aGlzIGZpbGUsIHlvdSBoYXZlIHByb2JhYmx5IGFscmVhZHkgc3VjY2VlZGVkIGluIHRoaXMKK3Rhc2suICBIb3dldmVyLCB0aGVyZSBpcyBhIHBvdGVudGlhbCBmb3IgZXJyb3IgaWYgeW91IG5lZWRlZCB0byBjb252ZXJ0IHRoZQorZmlsZXMgdG8gdGhlIGxvY2FsIHN0YW5kYXJkIHRleHQgZmlsZSBmb3JtYXQgKGZvciBleGFtcGxlLCBpZiB5b3UgYXJlIG9uCitNUy1ET1MgeW91IG1heSBoYXZlIGNvbnZlcnRlZCBMRiBlbmQtb2YtbGluZSB0byBDUi9MRikuICBZb3UgbXVzdCBhcHBseQorc3VjaCBjb252ZXJzaW9uIHRvIGFsbCB0aGUgZmlsZXMgRVhDRVBUIHRob3NlIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggInRlc3QiLgorVGhlIHRlc3QgZmlsZXMgY29udGFpbiBiaW5hcnkgZGF0YTsgaWYgeW91IGNoYW5nZSB0aGVtIGluIGFueSB3YXkgdGhlbiB0aGUKK3NlbGYtdGVzdCB3aWxsIGdpdmUgYmFkIHJlc3VsdHMuCisKK1BsZWFzZSBjaGVjayB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoaXMgZmlsZSB0byBzZWUgaWYgdGhlcmUgYXJlIGhpbnRzIGZvciB0aGUKK3NwZWNpZmljIG1hY2hpbmUgb3IgY29tcGlsZXIgeW91IGFyZSB1c2luZy4KKworCitDT05GSUdVUklORyBUSEUgU09GVFdBUkUKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitUbyBjb25maWd1cmUgdGhlIElKRyBjb2RlIGZvciB5b3VyIHN5c3RlbSwgeW91IG5lZWQgdG8gY3JlYXRlIHR3byBmaWxlczoKKyAgKiBqY29uZmlnLmg6IGNvbnRhaW5zIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCAjZGVmaW5lIHN5bWJvbHMuCisgICogTWFrZWZpbGU6IGNvbnRyb2xzIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzLgorKE9uIGEgbm9uLVVuaXggbWFjaGluZSwgeW91IG1heSBjcmVhdGUgInByb2plY3QgZmlsZXMiIG9yIHNvbWUgb3RoZXIKK3N1YnN0aXR1dGUgZm9yIGEgTWFrZWZpbGUuICBqY29uZmlnLmggaXMgbmVlZGVkIGluIGFueSBlbnZpcm9ubWVudC4pCisKK1dlIHByb3ZpZGUgdGhyZWUgZGlmZmVyZW50IHdheXMgdG8gZ2VuZXJhdGUgdGhlc2UgZmlsZXM6CisgICogT24gYSBVbml4IHN5c3RlbSwgeW91IGNhbiBqdXN0IHJ1biB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LgorICAqIFdlIHByb3ZpZGUgc2FtcGxlIGpjb25maWcgZmlsZXMgYW5kIG1ha2VmaWxlcyBmb3IgcG9wdWxhciBtYWNoaW5lczsKKyAgICBpZiB5b3VyIG1hY2hpbmUgbWF0Y2hlcyBvbmUgb2YgdGhlIHNhbXBsZXMsIGp1c3QgY29weSB0aGUgcmlnaHQgc2FtcGxlCisgICAgZmlsZXMgdG8gamNvbmZpZy5oIGFuZCBNYWtlZmlsZS4KKyAgKiBJZiBhbGwgZWxzZSBmYWlscywgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93IGFuZCBtYWtlIHlvdXIgb3duIGZpbGVzLgorCisKK0NvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZSB1c2luZyB0aGUgYXV0b21hdGljICJjb25maWd1cmUiIHNjcmlwdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBhcmUgb24gYSBVbml4IG1hY2hpbmUsIHlvdSBjYW4ganVzdCB0eXBlCisJLi9jb25maWd1cmUKK2FuZCBsZXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY29uc3RydWN0IGFwcHJvcHJpYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCitJZiB5b3UncmUgdXNpbmcgImNzaCIgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKwlzaCBjb25maWd1cmUKK2luc3RlYWQgdG8gcHJldmVudCBjc2ggZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZSBjb25maWd1cmUgaXRzZWxmLgorRXhwZWN0IGNvbmZpZ3VyZSB0byBydW4gZm9yIGEgZmV3IG1pbnV0ZXMsIHBhcnRpY3VsYXJseSBvbiBzbG93ZXIgbWFjaGluZXM7CitpdCB3b3JrcyBieSBjb21waWxpbmcgYSBzZXJpZXMgb2YgdGVzdCBwcm9ncmFtcy4KKworQ29uZmlndXJlIHdhcyBjcmVhdGVkIHdpdGggR05VIEF1dG9jb25mIGFuZCBpdCBmb2xsb3dzIHRoZSB1c3VhbCBjb252ZW50aW9ucworZm9yIEdOVSBjb25maWd1cmUgc2NyaXB0cy4gIEl0IG1ha2VzIGEgZmV3IGFzc3VtcHRpb25zIHRoYXQgeW91IG1heSB3YW50IHRvCitvdmVycmlkZS4gIFlvdSBjYW4gZG8gdGhpcyBieSBwcm92aWRpbmcgb3B0aW9uYWwgc3dpdGNoZXMgdG8gY29uZmlndXJlOgorCisqIElmIHlvdSB3YW50IHRvIGJ1aWxkIGxpYmpwZWcgYXMgYSBzaGFyZWQgbGlicmFyeSwgc2F5CisJLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkCitUbyBnZXQgYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJpZXMsIHNheQorCS4vY29uZmlndXJlIC0tZW5hYmxlLXNoYXJlZCAtLWVuYWJsZS1zdGF0aWMKK05vdGUgdGhhdCB0aGVzZSBzd2l0Y2hlcyBpbnZva2UgR05VIGxpYnRvb2wgdG8gdGFrZSBjYXJlIG9mIHN5c3RlbS1kZXBlbmRlbnQKK3NoYXJlZCBsaWJyYXJ5IGJ1aWxkaW5nIG1ldGhvZHMuICBJZiB0aGluZ3MgZG9uJ3Qgd29yayB0aGlzIHdheSwgcGxlYXNlIHRyeQorcnVubmluZyBjb25maWd1cmUgd2l0aG91dCBlaXRoZXIgc3dpdGNoOyB0aGF0IHNob3VsZCBidWlsZCBhIHN0YXRpYyBsaWJyYXJ5Cit3aXRob3V0IHVzaW5nIGxpYnRvb2wuICBJZiB0aGF0IHdvcmtzLCB5b3VyIHByb2JsZW0gaXMgcHJvYmFibHkgd2l0aCBsaWJ0b29sCitub3Qgd2l0aCB0aGUgSUpHIGNvZGUuICBsaWJ0b29sIGlzIGZhaXJseSBuZXcgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgZmxhdm9ycworb2YgVW5peCB5ZXQuICAoWW91IG1pZ2h0IGJlIGFibGUgdG8gZmluZCBhIG5ld2VyIHZlcnNpb24gb2YgbGlidG9vbCB0aGFuIHRoZQorb25lIGluY2x1ZGVkIHdpdGggbGlianBlZzsgc2VlIGZ0cC5nbnUub3JnLiAgUmVwb3J0IGxpYnRvb2wgcHJvYmxlbXMgdG8KK2J1Zy1saWJ0b29sQGdudS5vcmcuKQorCisqIENvbmZpZ3VyZSB3aWxsIHVzZSBnY2MgKEdOVSBDIGNvbXBpbGVyKSBpZiBpdCdzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGNjLgorVG8gZm9yY2UgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyIHRvIGJlIHNlbGVjdGVkLCB1c2UgdGhlIENDIG9wdGlvbiwgZm9yIGV4YW1wbGUKKwkuL2NvbmZpZ3VyZSBDQz0nY2MnCitUaGUgc2FtZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBhbnkgdW51c3VhbCBjb21waWxlciBzd2l0Y2hlcy4KK0ZvciBleGFtcGxlLCBvbiBIUC1VWCB5b3UgcHJvYmFibHkgd2FudCB0byBzYXkKKwkuL2NvbmZpZ3VyZSBDQz0nY2MgLUFhJwordG8gZ2V0IEhQJ3MgY29tcGlsZXIgdG8gcnVuIGluIEFOU0kgbW9kZS4KKworKiBUaGUgZGVmYXVsdCBDRkxBR1Mgc2V0dGluZyBpcyAiLU8iIGZvciBub24tZ2NjIGNvbXBpbGVycywgIi1PMiIgZm9yIGdjYy4KK1lvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSBzYXlpbmcsIGZvciBleGFtcGxlLAorCS4vY29uZmlndXJlIENGTEFHUz0nLWcnCitpZiB5b3Ugd2FudCB0byBjb21waWxlIHdpdGggZGVidWdnaW5nIHN1cHBvcnQuCisKKyogQ29uZmlndXJlIHdpbGwgc2V0IHVwIHRoZSBtYWtlZmlsZSBzbyB0aGF0ICJtYWtlIGluc3RhbGwiIHdpbGwgaW5zdGFsbCBmaWxlcworaW50byAvdXNyL2xvY2FsL2JpbiwgL3Vzci9sb2NhbC9tYW4sIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeSBhbiBpbnN0YWxsYXRpb24KK3ByZWZpeCBvdGhlciB0aGFuICIvdXNyL2xvY2FsIiBieSBnaXZpbmcgY29uZmlndXJlIHRoZSBvcHRpb24gIi0tcHJlZml4PVBBVEgiLgorCisqIElmIHlvdSBkb24ndCBoYXZlIGEgbG90IG9mIHN3YXAgc3BhY2UsIHlvdSBtYXkgbmVlZCB0byBlbmFibGUgdGhlIElKRworc29mdHdhcmUncyBpbnRlcm5hbCB2aXJ0dWFsIG1lbW9yeSBtZWNoYW5pc20uICBUbyBkbyB0aGlzLCBnaXZlIHRoZSBvcHRpb24KKyItLWVuYWJsZS1tYXhtZW09TiIgd2hlcmUgTiBpcyB0aGUgZGVmYXVsdCBtYXhtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzLgorVGhpcyBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwgdW5kZXIgIlNlbGVjdGluZyBhIG1lbW9yeSBtYW5hZ2VyIiwgYmVsb3cuCitZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIG9uIHJlYXNvbmFibHktc2l6ZWQgVW5peCBtYWNoaW5lcywKK3VubGVzcyB5b3UgcGxhbiB0byBwcm9jZXNzIHZlcnkgbGFyZ2UgaW1hZ2VzLgorCitDb25maWd1cmUgaGFzIHNvbWUgb3RoZXIgZmVhdHVyZXMgdGhhdCBhcmUgdXNlZnVsIGlmIHlvdSBhcmUgY3Jvc3MtY29tcGlsaW5nCitvciB3b3JraW5nIGluIGEgbmV0d29yayBvZiBtdWx0aXBsZSBtYWNoaW5lIHR5cGVzOyBidXQgaWYgeW91IG5lZWQgdGhvc2UKK2ZlYXR1cmVzLCB5b3UgcHJvYmFibHkgYWxyZWFkeSBrbm93IGhvdyB0byB1c2UgdGhlbS4KKworCitDb25maWd1cmluZyB0aGUgc29mdHdhcmUgdXNpbmcgb25lIG9mIHRoZSBzdXBwbGllZCBqY29uZmlnIGFuZCBtYWtlZmlsZSBmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIHN5c3RlbXMsIHlvdSBjYW4ganVzdCB1c2UgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24KK2ZpbGVzOgorCitNYWtlZmlsZQlqY29uZmlnIGZpbGUJU3lzdGVtIGFuZC9vciBjb21waWxlcgorCittYWtlZmlsZS5tYW54CWpjb25maWcubWFueAlBbWlnYSwgTWFueCBBenRlYyBDCittYWtlZmlsZS5zYXMJamNvbmZpZy5zYXMJQW1pZ2EsIFNBUyBDCittYWtlcHJvai5tYWMJamNvbmZpZy5tYWMJQXBwbGUgTWFjaW50b3NoLCBNZXRyb3dlcmtzIENvZGVXYXJyaW9yCittYWsqanBlZy5zdAlqY29uZmlnLnN0CUF0YXJpIFNUL1NURS9UVCwgUHVyZSBDIG9yIFR1cmJvIEMKK21ha2VmaWxlLmJjYwlqY29uZmlnLmJjYwlNUy1ET1Mgb3IgT1MvMiwgQm9ybGFuZCBDCittYWtlZmlsZS5kaglqY29uZmlnLmRqCU1TLURPUywgREpHUFAgKERlbG9yaWUncyBwb3J0IG9mIEdOVSBDKQorbWFrZWZpbGUubWM2CWpjb25maWcubWM2CU1TLURPUywgTWljcm9zb2Z0IEMgKDE2LWJpdCBvbmx5KQorbWFrZWZpbGUud2F0CWpjb25maWcud2F0CU1TLURPUywgT1MvMiwgb3IgV2luZG93cyBOVCwgV2F0Y29tIEMKK21ha2VmaWxlLnZjCWpjb25maWcudmMJV2luZG93cyBOVC85NSwgTVMgVmlzdWFsIEMrKworbWFrZSouZHMJamNvbmZpZy52YwlXaW5kb3dzIE5ULzk1LCBNUyBEZXZlbG9wZXIgU3R1ZGlvCittYWtlZmlsZS5tbXMJamNvbmZpZy52bXMJRGlnaXRhbCBWTVMsIHdpdGggTU1TIHNvZnR3YXJlCittYWtlZmlsZS52bXMJamNvbmZpZy52bXMJRGlnaXRhbCBWTVMsIHdpdGhvdXQgTU1TIHNvZnR3YXJlCisKK0NvcHkgdGhlIHByb3BlciBqY29uZmlnIGZpbGUgdG8gamNvbmZpZy5oIGFuZCB0aGUgbWFrZWZpbGUgdG8gTWFrZWZpbGUgKG9yCit3aGF0ZXZlciB5b3VyIHN5c3RlbSB1c2VzIGFzIHRoZSBzdGFuZGFyZCBtYWtlZmlsZSBuYW1lKS4gIEZvciBtb3JlIGluZm8gc2VlCit0aGUgYXBwcm9wcmlhdGUgc3lzdGVtLXNwZWNpZmljIGhpbnRzIHNlY3Rpb24gbmVhciB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKworCitDb25maWd1cmluZyB0aGUgc29mdHdhcmUgYnkgaGFuZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmlyc3QsIGdlbmVyYXRlIGEgamNvbmZpZy5oIGZpbGUuICBJZiB5b3UgYXJlIG1vZGVyYXRlbHkgZmFtaWxpYXIgd2l0aCBDLAordGhlIGNvbW1lbnRzIGluIGpjb25maWcuZG9jIHNob3VsZCBiZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZG8gdGhpczsganVzdAorY29weSBqY29uZmlnLmRvYyB0byBqY29uZmlnLmggYW5kIGVkaXQgaXQgYXBwcm9wcmlhdGVseS4gIE90aGVyd2lzZSwgeW91IG1heQorcHJlZmVyIHRvIHVzZSB0aGUgY2tjb25maWcuYyBwcm9ncmFtLiAgWW91IHdpbGwgbmVlZCB0byBjb21waWxlIGFuZCBleGVjdXRlCitja2NvbmZpZy5jIGJ5IGhhbmQgLS0tIHdlIGhvcGUgeW91IGtub3cgYXQgbGVhc3QgZW5vdWdoIHRvIGRvIHRoYXQuCitja2NvbmZpZy5jIG1heSBub3QgY29tcGlsZSB0aGUgZmlyc3QgdHJ5IChpbiBmYWN0LCB0aGUgd2hvbGUgaWRlYSBpcyBmb3IgaXQKK3RvIGZhaWwgaWYgYW55dGhpbmcgaXMgZ29pbmcgdG8pLiAgSWYgeW91IGdldCBjb21waWxlIGVycm9ycywgZml4IHRoZW0gYnkKK2VkaXRpbmcgY2tjb25maWcuYyBhY2NvcmRpbmcgdG8gdGhlIGRpcmVjdGlvbnMgZ2l2ZW4gaW4gY2tjb25maWcuYy4gIE9uY2UKK3lvdSBnZXQgaXQgdG8gcnVuLCBpdCB3aWxsIHdyaXRlIGEgc3VpdGFibGUgamNvbmZpZy5oIGZpbGUsIGFuZCB3aWxsIGFsc28KK3ByaW50IG91dCBzb21lIGFkdmljZSBhYm91dCB3aGljaCBtYWtlZmlsZSB0byB1c2UuCisKK1lvdSBtYXkgYWxzbyB3YW50IHRvIGxvb2sgYXQgdGhlIGNhbm5lZCBqY29uZmlnIGZpbGVzLCBpZiB0aGVyZSBpcyBvbmUgZm9yIGEKK3N5c3RlbSBzaW1pbGFyIHRvIHlvdXJzLgorCitTZWNvbmQsIHNlbGVjdCBhIG1ha2VmaWxlIGFuZCBjb3B5IGl0IHRvIE1ha2VmaWxlIChvciB3aGF0ZXZlciB5b3VyIHN5c3RlbQordXNlcyBhcyB0aGUgc3RhbmRhcmQgbWFrZWZpbGUgbmFtZSkuICBUaGUgbW9zdCBnZW5lcmljIG1ha2VmaWxlcyB3ZSBwcm92aWRlCithcmUKKwltYWtlZmlsZS5hbnNpOglpZiB5b3VyIEMgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlcworCW1ha2VmaWxlLnVuaXg6CWlmIG5vdC4KKyhZb3UgaGF2ZSBmdW5jdGlvbiBwcm90b3R5cGVzIGlmIGNrY29uZmlnLmMgcHV0ICIjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUyIKK2luIGpjb25maWcuaC4pICBZb3UgbWF5IHdhbnQgdG8gc3RhcnQgZnJvbSBvbmUgb2YgdGhlIG90aGVyIG1ha2VmaWxlcyBpZgordGhlcmUgaXMgb25lIGZvciBhIHN5c3RlbSBzaW1pbGFyIHRvIHlvdXJzLgorCitMb29rIG92ZXIgdGhlIHNlbGVjdGVkIE1ha2VmaWxlIGFuZCBhZGp1c3Qgb3B0aW9ucyBhcyBuZWVkZWQuICBJbiBwYXJ0aWN1bGFyCit5b3UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoZSBDQyBhbmQgQ0ZMQUdTIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UKK2FyZSB1c2luZyBHQ0MsIHNldCBDQz1nY2MuICBJZiB5b3UgaGFkIHRvIHVzZSBhbnkgY29tcGlsZXIgc3dpdGNoZXMgdG8gZ2V0Citja2NvbmZpZy5jIHRvIHdvcmssIG1ha2Ugc3VyZSB0aGUgc2FtZSBzd2l0Y2hlcyBhcmUgaW4gQ0ZMQUdTLgorCitJZiB5b3UgYXJlIG9uIGEgc3lzdGVtIHRoYXQgZG9lc24ndCB1c2UgbWFrZWZpbGVzLCB5b3UnbGwgbmVlZCB0byBzZXQgdXAKK3Byb2plY3QgZmlsZXMgKG9yIHdoYXRldmVyIHlvdSBkbyB1c2UpIHRvIGNvbXBpbGUgYWxsIHRoZSBzb3VyY2UgZmlsZXMgYW5kCitsaW5rIHRoZW0gaW50byBleGVjdXRhYmxlIGZpbGVzIGNqcGVnLCBkanBlZywganBlZ3RyYW4sIHJkanBnY29tLCBhbmQgd3JqcGdjb20uCitTZWUgdGhlIGZpbGUgbGlzdHMgaW4gYW55IG9mIHRoZSBtYWtlZmlsZXMgdG8gZmluZCBvdXQgd2hpY2ggZmlsZXMgZ28gaW50bworZWFjaCBwcm9ncmFtLiAgTm90ZSB0aGF0IHRoZSBwcm92aWRlZCBtYWtlZmlsZXMgYWxsIG1ha2UgYSAibGlicmFyeSIgZmlsZQorbGlianBlZyBmaXJzdCwgYnV0IHlvdSBkb24ndCBoYXZlIHRvIGRvIHRoYXQgaWYgeW91IGRvbid0IHdhbnQgdG87IHRoZSBmaWxlCitsaXN0cyBpZGVudGlmeSB3aGljaCBzb3VyY2UgZmlsZXMgYXJlIGFjdHVhbGx5IG5lZWRlZCBmb3IgY29tcHJlc3Npb24sCitkZWNvbXByZXNzaW9uLCBvciBib3RoLiAgQXMgYSBsYXN0IHJlc29ydCwgeW91IGNhbiBtYWtlIGEgYmF0Y2ggc2NyaXB0IHRoYXQKK2p1c3QgY29tcGlsZXMgZXZlcnl0aGluZyBhbmQgbGlua3MgaXQgYWxsIHRvZ2V0aGVyOyBtYWtlZmlsZS52bXMgaXMgYW4gZXhhbXBsZQorb2YgdGhpcyAoaXQncyBmb3IgVk1TIHN5c3RlbXMgdGhhdCBoYXZlIG5vIG1ha2UtbGlrZSB1dGlsaXR5KS4KKworSGVyZSBhcmUgY29tbWVudHMgYWJvdXQgc29tZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRlY2lzaW9ucyB5b3UnbGwKK25lZWQgdG8gbWFrZToKKworQ29tbWFuZCBsaW5lIHN0eWxlCistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlc2UgcHJvZ3JhbXMgY2FuIHVzZSBhIFVuaXgtbGlrZSBjb21tYW5kIGxpbmUgc3R5bGUgd2hpY2ggc3VwcG9ydHMKK3JlZGlyZWN0aW9uIGFuZCBwaXBpbmcsIGxpa2UgdGhpczoKKwljanBlZyBpbnB1dGZpbGUgPm91dHB1dGZpbGUKKwljanBlZyA8aW5wdXRmaWxlID5vdXRwdXRmaWxlCisJc291cmNlIHByb2dyYW0gfCBjanBlZyA+b3V0cHV0ZmlsZQorVGhlIHNpbXBsZXIgInR3byBmaWxlIiBjb21tYW5kIGxpbmUgc3R5bGUgaXMganVzdAorCWNqcGVnIGlucHV0ZmlsZSBvdXRwdXRmaWxlCitZb3UgbWF5IHByZWZlciB0aGUgdHdvLWZpbGUgc3R5bGUsIHBhcnRpY3VsYXJseSBpZiB5b3UgZG9uJ3QgaGF2ZSBwaXBlcy4KKworWW91IE1VU1QgdXNlIHR3by1maWxlIHN0eWxlIG9uIGFueSBzeXN0ZW0gdGhhdCBkb2Vzbid0IGNvcGUgd2VsbCB3aXRoIGJpbmFyeQorZGF0YSBmZWQgdGhyb3VnaCBzdGRpbi9zdGRvdXQ7IHRoaXMgaXMgdHJ1ZSBmb3Igc29tZSBNUy1ET1MgY29tcGlsZXJzLCBmb3IKK2V4YW1wbGUuICBJZiB5b3UncmUgbm90IG9uIGEgVW5peCBzeXN0ZW0sIGl0J3Mgc2FmZXN0IHRvIGFzc3VtZSB5b3UgbmVlZAordHdvLWZpbGUgc3R5bGUuICAoQnV0IGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgZWl0aGVyIHRoZSBQb3NpeC1zdGFuZGFyZAorZmRvcGVuKCkgbGlicmFyeSByb3V0aW5lIG9yIGEgTWljcm9zb2Z0LWNvbXBhdGlibGUgc2V0bW9kZSgpIHJvdXRpbmUsIHlvdQorY2FuIHNhZmVseSB1c2UgdGhlIFVuaXggY29tbWFuZCBsaW5lIHN0eWxlLCBieSBkZWZpbmluZyBVU0VfRkRPUEVOIG9yCitVU0VfU0VUTU9ERSByZXNwZWN0aXZlbHkuKQorCitUbyB1c2UgdGhlIHR3by1maWxlIHN0eWxlLCBtYWtlIGpjb25maWcuaCBzYXkgIiNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUiLgorCitTZWxlY3RpbmcgYSBtZW1vcnkgbWFuYWdlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIElKRyBjb2RlIGlzIGNhcGFibGUgb2Ygd29ya2luZyBvbiBpbWFnZXMgdGhhdCBhcmUgdG9vIGJpZyB0byBmaXQgaW4gbWFpbgorbWVtb3J5OyBkYXRhIGlzIHN3YXBwZWQgb3V0IHRvIHRlbXBvcmFyeSBmaWxlcyBhcyBuZWNlc3NhcnkuICBIb3dldmVyLCB0aGUKK2NvZGUgdG8gZG8gdGhpcyBpcyByYXRoZXIgc3lzdGVtLWRlcGVuZGVudC4gIFdlIHByb3ZpZGUgZml2ZSBkaWZmZXJlbnQKK21lbW9yeSBtYW5hZ2VyczoKKworKiBqbWVtYW5zaS5jCVRoaXMgdmVyc2lvbiB1c2VzIHRoZSBBTlNJLXN0YW5kYXJkIGxpYnJhcnkgcm91dGluZSB0bXBmaWxlKCksCisJCXdoaWNoIG5vdCBhbGwgbm9uLUFOU0kgc3lzdGVtcyBoYXZlLiAgT24gc29tZSBzeXN0ZW1zCisJCXRtcGZpbGUoKSBtYXkgcHV0IHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiBhIG5vbi1vcHRpbWFsCisJCWxvY2F0aW9uOyBpZiB5b3UgZG9uJ3QgbGlrZSB3aGF0IGl0IGRvZXMsIHVzZSBqbWVtbmFtZS5jLgorCisqIGptZW1uYW1lLmMJVGhpcyB2ZXJzaW9uIGNyZWF0ZXMgbmFtZWQgdGVtcG9yYXJ5IGZpbGVzLiAgRm9yIGFueXRoaW5nCisJCWV4Y2VwdCBhIFVuaXggbWFjaGluZSwgeW91J2xsIG5lZWQgdG8gY29uZmlndXJlIHRoZQorCQlzZWxlY3RfZmlsZV9uYW1lKCkgcm91dGluZSBhcHByb3ByaWF0ZWx5OyBzZWUgdGhlIGNvbW1lbnRzCisJCW5lYXIgdGhlIGhlYWQgb2Ygam1lbW5hbWUuYy4gIElmIHlvdSB1c2UgdGhpcyB2ZXJzaW9uLCBkZWZpbmUKKwkJTkVFRF9TSUdOQUxfQ0FUQ0hFUiBpbiBqY29uZmlnLmggdG8gbWFrZSBzdXJlIHRoZSB0ZW1wIGZpbGVzCisJCWFyZSByZW1vdmVkIGlmIHRoZSBwcm9ncmFtIGlzIGFib3J0ZWQuCisKKyogam1lbW5vYnMuYwkoVGhhdCBzdGFuZHMgZm9yIE5vIEJhY2tpbmcgU3RvcmUgOi0pLikgIFRoaXMgd2lsbCBjb21waWxlIG9uCisJCWFsbW9zdCBhbnkgc3lzdGVtLCBidXQgaXQgYXNzdW1lcyB5b3UgaGF2ZSBlbm91Z2ggbWFpbiBtZW1vcnkKKwkJb3IgdmlydHVhbCBtZW1vcnkgdG8gaG9sZCB0aGUgYmlnZ2VzdCBpbWFnZXMgeW91IHdvcmsgd2l0aC4KKworKiBqbWVtZG9zLmMJVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIG1vc3QgMTYtYml0IE1TLURPUyBjb21waWxlcnMuCisJCVNlZSB0aGUgc3lzdGVtLXNwZWNpZmljIG5vdGVzIGFib3V0IE1TLURPUyBmb3IgbW9yZSBpbmZvLgorCQlJTVBPUlRBTlQ6IGlmIHlvdSB1c2UgdGhpcywgZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgaW4KKwkJamNvbmZpZy5oLCBhbmQgaW5jbHVkZSB0aGUgYXNzZW1ibHkgZmlsZSBqbWVtZG9zYS5hc20gaW4gdGhlCisJCXByb2dyYW1zLiAgVGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBhbmQgamNvbmZpZyBmaWxlcyBmb3IKKwkJMTYtYml0IE1TLURPUyBjb21waWxlcnMgYWxyZWFkeSBkbyBib3RoLgorCisqIGptZW1tYWMuYwlDdXN0b20gdmVyc2lvbiBmb3IgQXBwbGUgTWFjaW50b3NoOyBzZWUgdGhlIHN5c3RlbS1zcGVjaWZpYworCQlub3RlcyBmb3IgTWFjaW50b3NoIGZvciBtb3JlIGluZm8uCisKK1RvIHVzZSBhIHBhcnRpY3VsYXIgbWVtb3J5IG1hbmFnZXIsIGNoYW5nZSB0aGUgU1lTREVQTUVNIHZhcmlhYmxlIGluIHlvdXIKK21ha2VmaWxlIHRvIGVxdWFsIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCBmaWxlIG5hbWUgKGZvciBleGFtcGxlLCBqbWVtYW5zaS5vCitvciBqbWVtYW5zaS5vYmogZm9yIGptZW1hbnNpLmMpLgorCitJZiB5b3UgaGF2ZSBwbGVudHkgb2YgKHJlYWwgb3IgdmlydHVhbCkgbWFpbiBtZW1vcnksIGp1c3QgdXNlIGptZW1ub2JzLmMuCisiUGxlbnR5IiBtZWFucyBhYm91dCB0ZW4gYnl0ZXMgZm9yIGV2ZXJ5IHBpeGVsIGluIHRoZSBsYXJnZXN0IGltYWdlcworeW91IHBsYW4gdG8gcHJvY2Vzcywgc28gYSBsb3Qgb2Ygc3lzdGVtcyBkb24ndCBtZWV0IHRoaXMgY3JpdGVyaW9uLgorSWYgeW91cnMgZG9lc24ndCwgdHJ5IGptZW1hbnNpLmMgZmlyc3QuICBJZiB0aGF0IGRvZXNuJ3QgY29tcGlsZSwgeW91J2xsIGhhdmUKK3RvIHVzZSBqbWVtbmFtZS5jOyBiZSBzdXJlIHRvIGFkanVzdCBzZWxlY3RfZmlsZV9uYW1lKCkgZm9yIGxvY2FsIGNvbmRpdGlvbnMuCitZb3UgbWF5IGFsc28gbmVlZCB0byBjaGFuZ2UgdW5saW5rKCkgdG8gcmVtb3ZlKCkgaW4gY2xvc2VfYmFja2luZ19zdG9yZSgpLgorCitFeGNlcHQgd2l0aCBqbWVtbm9icy5jIG9yIGptZW1tYWMuYywgeW91IG5lZWQgdG8gYWRqdXN0IHRoZSBERUZBVUxUX01BWF9NRU0KK3NldHRpbmcgdG8gYSByZWFzb25hYmxlIHZhbHVlIGZvciB5b3VyIHN5c3RlbSAoZWl0aGVyIGJ5IGFkZGluZyBhICNkZWZpbmUgZm9yCitERUZBVUxUX01BWF9NRU0gdG8gamNvbmZpZy5oLCBvciBieSBhZGRpbmcgYSAtRCBzd2l0Y2ggdG8gdGhlIE1ha2VmaWxlKS4KK1RoaXMgdmFsdWUgbGltaXRzIHRoZSBhbW91bnQgb2YgZGF0YSBzcGFjZSB0aGUgcHJvZ3JhbSB3aWxsIGF0dGVtcHQgdG8KK2FsbG9jYXRlLiAgQ29kZSBhbmQgc3RhdGljIGRhdGEgc3BhY2UgaXNuJ3QgY291bnRlZCwgc28gdGhlIGFjdHVhbCBtZW1vcnkKK25lZWRzIGZvciBjanBlZyBvciBkanBlZyBhcmUgdHlwaWNhbGx5IDEwMCB0byAxNTBLYiBtb3JlIHRoYW4gdGhlIG1heC1tZW1vcnkKK3NldHRpbmcuICBMYXJnZXIgbWF4LW1lbW9yeSBzZXR0aW5ncyByZWR1Y2UgdGhlIGFtb3VudCBvZiBJL08gbmVlZGVkIHRvCitwcm9jZXNzIGEgbGFyZ2UgaW1hZ2UsIGJ1dCB0b28gbGFyZ2UgYSB2YWx1ZSBjYW4gcmVzdWx0IGluICJpbnN1ZmZpY2llbnQKK21lbW9yeSIgZmFpbHVyZXMuICBPbiBtb3N0IFVuaXggbWFjaGluZXMgKGFuZCBvdGhlciBzeXN0ZW1zIHdpdGggdmlydHVhbAorbWVtb3J5KSwganVzdCBzZXQgREVGQVVMVF9NQVhfTUVNIHRvIHNldmVyYWwgbWlsbGlvbiBhbmQgZm9yZ2V0IGl0LiAgQXQgdGhlCitvdGhlciBlbmQgb2YgdGhlIHNwZWN0cnVtLCBmb3IgTVMtRE9TIG1hY2hpbmVzIHlvdSBwcm9iYWJseSBjYW4ndCBnbyBtdWNoCithYm92ZSAzMDBLIHRvIDQwMEsuICAoT24gTVMtRE9TIHRoZSB2YWx1ZSByZWZlcnMgdG8gY29udmVudGlvbmFsIG1lbW9yeSBvbmx5LgorRXh0ZW5kZWQvZXhwYW5kZWQgbWVtb3J5IGlzIGhhbmRsZWQgc2VwYXJhdGVseSBieSBqbWVtZG9zLmMuKQorCisKK0JVSUxESU5HIFRIRSBTT0ZUV0FSRQorPT09PT09PT09PT09PT09PT09PT09CisKK05vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gY29tcGlsZSB0aGUgc29mdHdhcmUuICBKdXN0IHNheSAibWFrZSIgKG9yCit3aGF0ZXZlcidzIG5lY2Vzc2FyeSB0byBzdGFydCB0aGUgY29tcGlsYXRpb24pLiAgSGF2ZSBhIGN1cCBvZiBjb2ZmZWUuCisKK0hlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgY291bGQgZ28gd3Jvbmc6CisKK0lmIHlvdXIgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0IHVuZGVmaW5lZCBzdHJ1Y3R1cmVzLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8KK3NodXQgaXQgdXAgYnkgcHV0dGluZyAiI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiIgaW4gamNvbmZpZy5oLgorCitJZiB5b3UgaGF2ZSB0cm91YmxlIHdpdGggbWlzc2luZyBzeXN0ZW0gaW5jbHVkZSBmaWxlcyBvciBpbmNsdXNpb24gb2YgdGhlCit3cm9uZyBvbmVzLCByZWFkIGppbmNsdWRlLmguICBUaGlzIHNob3VsZG4ndCBoYXBwZW4gaWYgeW91IHVzZWQgY29uZmlndXJlCitvciBja2NvbmZpZy5jIHRvIHNldCB1cCBqY29uZmlnLmguCisKK1RoZXJlIGFyZSBhIGZhaXIgbnVtYmVyIG9mIHJvdXRpbmVzIHRoYXQgZG8gbm90IHVzZSBhbGwgb2YgdGhlaXIgcGFyYW1ldGVyczsKK3NvbWUgY29tcGlsZXJzIHdpbGwgaXNzdWUgd2FybmluZ3MgYWJvdXQgdGhpcywgd2hpY2ggeW91IGNhbiBpZ25vcmUuICBUaGVyZQorYXJlIGFsc28gYSBmZXcgY29uZmlndXJhdGlvbiBjaGVja3MgdGhhdCBtYXkgZ2l2ZSAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZ3MuCitBbnkgb3RoZXIgd2FybmluZyBkZXNlcnZlcyBpbnZlc3RpZ2F0aW9uLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBhIGdldGVudigpIGxpYnJhcnkgcm91dGluZSwgZGVmaW5lIE5PX0dFVEVOVi4KKworQWxzbyBzZWUgdGhlIHN5c3RlbS1zcGVjaWZpYyBoaW50cywgYmVsb3cuCisKKworVEVTVElORyBUSEUgU09GVFdBUkUKKz09PT09PT09PT09PT09PT09PT09CisKK0FzIGEgcXVpY2sgdGVzdCBvZiBmdW5jdGlvbmFsaXR5IHdlJ3ZlIGluY2x1ZGVkIGEgc21hbGwgc2FtcGxlIGltYWdlIGluCitzZXZlcmFsIGZvcm1zOgorCXRlc3RvcmlnLmpwZwlTdGFydGluZyBwb2ludCBmb3IgdGhlIGRqcGVnIHRlc3RzLgorCXRlc3RpbWcucHBtCVRoZSBvdXRwdXQgb2YgZGpwZWcgdGVzdG9yaWcuanBnCisJdGVzdGltZy5ibXAJVGhlIG91dHB1dCBvZiBkanBlZyAtYm1wIC1jb2xvcnMgMjU2IHRlc3RvcmlnLmpwZworCXRlc3RpbWcuanBnCVRoZSBvdXRwdXQgb2YgY2pwZWcgdGVzdGltZy5wcG0KKwl0ZXN0cHJvZy5qcGcJUHJvZ3Jlc3NpdmUtbW9kZSBlcXVpdmFsZW50IG9mIHRlc3RvcmlnLmpwZy4KKwl0ZXN0aW1ncC5qcGcJVGhlIG91dHB1dCBvZiBjanBlZyAtcHJvZ3Jlc3NpdmUgLW9wdGltaXplIHRlc3RpbWcucHBtCisoVGhlIGZpcnN0LSBhbmQgc2Vjb25kLWdlbmVyYXRpb24gLmpwZyBmaWxlcyBhcmVuJ3QgaWRlbnRpY2FsIHNpbmNlIEpQRUcgaXMKK2xvc3N5LikgIElmIHlvdSBjYW4gZ2VuZXJhdGUgZHVwbGljYXRlcyBvZiB0aGUgdGVzdGltZyogZmlsZXMgdGhlbiB5b3UKK3Byb2JhYmx5IGhhdmUgd29ya2luZyBwcm9ncmFtcy4KKworV2l0aCBtb3N0IG9mIHRoZSBtYWtlZmlsZXMsICJtYWtlIHRlc3QiIHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5Citjb21wYXJpc29ucy4KKworSWYgeW91J3JlIHVzaW5nIGEgbWFrZWZpbGUgdGhhdCBkb2Vzbid0IHByb3ZpZGUgdGhlIHRlc3Qgb3B0aW9uLCBydW4gZGpwZWcKK2FuZCBjanBlZyBieSBoYW5kIGFuZCBjb21wYXJlIHRoZSBvdXRwdXQgZmlsZXMgdG8gdGVzdGltZyogd2l0aCB3aGF0ZXZlcgorYmluYXJ5IGZpbGUgY29tcGFyaXNvbiB0b29sIHlvdSBoYXZlLiAgVGhlIGZpbGVzIHNob3VsZCBiZSBiaXQtZm9yLWJpdAoraWRlbnRpY2FsLgorCitJZiB0aGUgcHJvZ3JhbXMgY29tcGxhaW4gIk1BWF9BTExPQ19DSFVOSyBpcyB3cm9uZywgcGxlYXNlIGZpeCIsIHRoZW4geW91CituZWVkIHRvIHJlZHVjZSBNQVhfQUxMT0NfQ0hVTksgdG8gYSB2YWx1ZSB0aGF0IGZpdHMgaW4gdHlwZSBzaXplX3QuCitUcnkgYWRkaW5nICIjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwiIHRvIGpjb25maWcuaC4gIEEgbGVzcyBsaWtlbHkKK2NvbmZpZ3VyYXRpb24gZXJyb3IgaXMgIkFMSUdOX1RZUEUgaXMgd3JvbmcsIHBsZWFzZSBmaXgiOiBkZWZpbmluZyBBTElHTl9UWVBFCithcyBsb25nIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhhdCBvbmUuCisKK0lmIHRoZSBjanBlZyB0ZXN0IHJ1biBmYWlscyB3aXRoICJNaXNzaW5nIEh1ZmZtYW4gY29kZSB0YWJsZSBlbnRyeSIsIGl0J3MgYQorZ29vZCBiZXQgdGhhdCB5b3UgbmVlZGVkIHRvIGRlZmluZSBSSUdIVF9TSElGVF9JU19VTlNJR05FRC4gIEdvIGJhY2sgdG8gdGhlCitjb25maWd1cmF0aW9uIHN0ZXAgYW5kIHJ1biBja2NvbmZpZy5jLiAgKFRoaXMgaXMgYSBnb29kIHBsYW4gZm9yIGFueSBvdGhlcgordGVzdCBmYWlsdXJlLCB0b28uKQorCitJZiB5b3UgYXJlIHVzaW5nIFVuaXggKG9uZS1maWxlKSBjb21tYW5kIGxpbmUgc3R5bGUgb24gYSBub24tVW5peCBzeXN0ZW0sCitpdCdzIGEgZ29vZCBpZGVhIHRvIGNoZWNrIHRoYXQgYmluYXJ5IEkvTyB0aHJvdWdoIHN0ZGluL3N0ZG91dCBhY3R1YWxseQord29ya3MuICBZb3Ugc2hvdWxkIGdldCB0aGUgc2FtZSByZXN1bHRzIGZyb20gImRqcGVnIDx0ZXN0b3JpZy5qcGcgPm91dC5wcG0iCithcyBmcm9tICJkanBlZyAtb3V0ZmlsZSBvdXQucHBtIHRlc3RvcmlnLmpwZyIuICBOb3RlIHRoYXQgdGhlIG1ha2VmaWxlcyBhbGwKK3VzZSB0aGUgbGF0dGVyIHN0eWxlIGFuZCB0aGVyZWZvcmUgZG8gbm90IGV4ZXJjaXNlIHN0ZGluL3N0ZG91dCEgIElmIHRoaXMKK2NoZWNrIGZhaWxzLCB0cnkgcmVjb21waWxpbmcgd2l0aCBVU0VfU0VUTU9ERSBvciBVU0VfRkRPUEVOIGRlZmluZWQuCitJZiBpdCBzdGlsbCBkb2Vzbid0IHdvcmssIGJldHRlciB1c2UgdHdvLWZpbGUgc3R5bGUuCisKK0lmIHlvdSBjaG9zZSBhIG1lbW9yeSBtYW5hZ2VyIG90aGVyIHRoYW4gam1lbW5vYnMuYywgeW91IHNob3VsZCB0ZXN0IHRoYXQKK3RlbXBvcmFyeS1maWxlIHVzYWdlIHdvcmtzLiAgVHJ5ICJkanBlZyAtYm1wIC1jb2xvcnMgMjU2IC1tYXggMCB0ZXN0b3JpZy5qcGciCithbmQgbWFrZSBzdXJlIGl0cyBvdXRwdXQgbWF0Y2hlcyB0ZXN0aW1nLmJtcC4gIElmIHlvdSBoYXZlIGFueSByZWFsbHkgbGFyZ2UKK2ltYWdlcyBoYW5keSwgdHJ5IGNvbXByZXNzaW5nIHRoZW0gd2l0aCAtb3B0aW1pemUgYW5kL29yIGRlY29tcHJlc3Npbmcgd2l0aAorLWNvbG9ycyAyNTYgdG8gbWFrZSBzdXJlIHlvdXIgREVGQVVMVF9NQVhfTUVNIHNldHRpbmcgaXMgbm90IHRvbyBsYXJnZS4KKworTk9URTogdGhpcyBpcyBmYXIgZnJvbSBhbiBleGhhdXN0aXZlIHRlc3Qgb2YgdGhlIEpQRUcgc29mdHdhcmU7IHNvbWUgbW9kdWxlcywKK3N1Y2ggYXMgMS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiwgYXJlIG5vdCBleGVyY2lzZWQgYXQgYWxsLiAgSXQncyBqdXN0IGEKK3F1aWNrIHRlc3QgdG8gZ2l2ZSB5b3Ugc29tZSBjb25maWRlbmNlIHRoYXQgeW91IGhhdmVuJ3QgbWlzc2VkIHNvbWV0aGluZworbWFqb3IuCisKKworSU5TVEFMTElORyBUSEUgU09GVFdBUkUKKz09PT09PT09PT09PT09PT09PT09PT09CisKK09uY2UgeW91J3JlIGRvbmUgd2l0aCB0aGUgYWJvdmUgc3RlcHMsIHlvdSBjYW4gaW5zdGFsbCB0aGUgc29mdHdhcmUgYnkKK2NvcHlpbmcgdGhlIGV4ZWN1dGFibGUgZmlsZXMgKGNqcGVnLCBkanBlZywganBlZ3RyYW4sIHJkanBnY29tLCBhbmQgd3JqcGdjb20pCit0byB3aGVyZXZlciB5b3Ugbm9ybWFsbHkgaW5zdGFsbCBwcm9ncmFtcy4gIE9uIFVuaXggc3lzdGVtcywgeW91J2xsIGFsc28gd2FudAordG8gcHV0IHRoZSBtYW4gcGFnZXMgKGNqcGVnLjEsIGRqcGVnLjEsIGpwZWd0cmFuLjEsIHJkanBnY29tLjEsIHdyanBnY29tLjEpCitpbiB0aGUgbWFuLXBhZ2UgZGlyZWN0b3J5LiAgVGhlIHByZS1mYWIgbWFrZWZpbGVzIGRvbid0IHN1cHBvcnQgdGhpcyBzdGVwCitzaW5jZSB0aGVyZSdzIHN1Y2ggYSB3aWRlIHZhcmlldHkgb2YgaW5zdGFsbGF0aW9uIHByb2NlZHVyZXMgb24gZGlmZmVyZW50CitzeXN0ZW1zLgorCitJZiB5b3UgZ2VuZXJhdGVkIGEgTWFrZWZpbGUgd2l0aCB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LCB5b3UgY2FuIGp1c3Qgc2F5CisJbWFrZSBpbnN0YWxsCit0byBpbnN0YWxsIHRoZSBwcm9ncmFtcyBhbmQgdGhlaXIgbWFuIHBhZ2VzIGludG8gdGhlIHN0YW5kYXJkIHBsYWNlcy4KKyhZb3UnbGwgcHJvYmFibHkgbmVlZCB0byBiZSByb290IHRvIGRvIHRoaXMuKSAgV2UgcmVjb21tZW5kIGZpcnN0IHNheWluZworCW1ha2UgLW4gaW5zdGFsbAordG8gc2VlIHdoZXJlIGNvbmZpZ3VyZSB0aG91Z2h0IHRoZSBmaWxlcyBzaG91bGQgZ28uICBZb3UgbWF5IG5lZWQgdG8gZWRpdAordGhlIE1ha2VmaWxlLCBwYXJ0aWN1bGFybHkgaWYgeW91ciBzeXN0ZW0ncyBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2UKK2ZpbGVuYW1lcyBkb24ndCBtYXRjaCB3aGF0IGNvbmZpZ3VyZSBleHBlY3RzLgorCitJZiB5b3Ugd2FudCB0byBpbnN0YWxsIHRoZSBJSkcgbGlicmFyeSBpdHNlbGYsIGZvciB1c2UgaW4gY29tcGlsaW5nIG90aGVyCitwcm9ncmFtcyBiZXNpZGVzIG91cnMsIHRoZW4geW91IG5lZWQgdG8gcHV0IHRoZSBmb3VyIGluY2x1ZGUgZmlsZXMKKwlqcGVnbGliLmggamVycm9yLmggamNvbmZpZy5oIGptb3JlY2ZnLmgKK2ludG8geW91ciBpbmNsdWRlLWZpbGUgZGlyZWN0b3J5LCBhbmQgcHV0IHRoZSBsaWJyYXJ5IGZpbGUgbGlianBlZy5hCisoZXh0ZW5zaW9uIG1heSB2YXJ5IGRlcGVuZGluZyBvbiBzeXN0ZW0pIHdoZXJldmVyIGxpYnJhcnkgZmlsZXMgZ28uCitJZiB5b3UgZ2VuZXJhdGVkIGEgTWFrZWZpbGUgd2l0aCAiY29uZmlndXJlIiwgaXQgd2lsbCBkbyB3aGF0IGl0IHRoaW5rcworaXMgdGhlIHJpZ2h0IHRoaW5nIGlmIHlvdSBzYXkKKwltYWtlIGluc3RhbGwtbGliCisKKworT1BUSU9OQUwgU1RVRkYKKz09PT09PT09PT09PT09CisKK1Byb2dyZXNzIG1vbml0b3I6CisKK0lmIHlvdSBsaWtlLCB5b3UgY2FuICNkZWZpbmUgUFJPR1JFU1NfUkVQT1JUIChpbiBqY29uZmlnLmgpIHRvIGVuYWJsZSBkaXNwbGF5CitvZiBwZXJjZW50LWRvbmUgcHJvZ3Jlc3MgcmVwb3J0cy4gIFRoZSByb3V0aW5lIHByb3ZpZGVkIGluIGNkanBlZy5jIG1lcmVseQorcHJpbnRzIHBlcmNlbnRhZ2VzIHRvIHN0ZGVyciwgYnV0IHlvdSBjYW4gY3VzdG9taXplIGl0IHRvIGRvIHNvbWV0aGluZworZmFuY2llci4KKworVXRhaCBSTEUgZmlsZSBmb3JtYXQgc3VwcG9ydDoKKworV2UgZGlzdHJpYnV0ZSB0aGUgc29mdHdhcmUgd2l0aCBzdXBwb3J0IGZvciBSTEUgaW1hZ2UgZmlsZXMgKFV0YWggUmFzdGVyCitUb29sa2l0IGZvcm1hdCkgZGlzYWJsZWQsIGJlY2F1c2UgdGhlIFJMRSBzdXBwb3J0IHdvbid0IGNvbXBpbGUgd2l0aG91dCB0aGUKK1V0YWggbGlicmFyeS4gIElmIHlvdSBoYXZlIFVSVCB2ZXJzaW9uIDMuMSBvciBsYXRlciwgeW91IGNhbiBlbmFibGUgUkxFCitzdXBwb3J0IGFzIGZvbGxvd3M6CisJMS4gICNkZWZpbmUgUkxFX1NVUFBPUlRFRCBpbiBqY29uZmlnLmguCisJMi4gIEFkZCBhIC1JIG9wdGlvbiB0byBDRkxBR1MgaW4gdGhlIE1ha2VmaWxlIGZvciB0aGUgZGlyZWN0b3J5CisJICAgIGNvbnRhaW5pbmcgdGhlIFVSVCAuaCBmaWxlcyAodHlwaWNhbGx5IHRoZSAiaW5jbHVkZSIKKwkgICAgc3ViZGlyZWN0b3J5IG9mIHRoZSBVUlQgZGlzdHJpYnV0aW9uKS4KKwkzLiAgQWRkIC1MLi4uIC1scmxlIHRvIExETElCUyBpbiB0aGUgTWFrZWZpbGUsIHdoZXJlIC4uLiBzcGVjaWZpZXMKKwkgICAgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBVUlQgImxpYnJsZS5hIiBmaWxlICh0eXBpY2FsbHkgdGhlCisJICAgICJsaWIiIHN1YmRpcmVjdG9yeSBvZiB0aGUgVVJUIGRpc3RyaWJ1dGlvbikuCisKK1N1cHBvcnQgZm9yIDEyLWJpdC1kZWVwIHBpeGVsIGRhdGE6CisKK1RoZSBKUEVHIHN0YW5kYXJkIGFsbG93cyBlaXRoZXIgOC1iaXQgb3IgMTItYml0IGRhdGEgcHJlY2lzaW9uLiAgKEZvciBjb2xvciwKK3RoaXMgbWVhbnMgOCBvciAxMiBiaXRzIHBlciBjaGFubmVsLCBvZiBjb3Vyc2UuKSAgSWYgeW91IG5lZWQgdG8gd29yayB3aXRoCitkZWVwZXIgdGhhbiA4LWJpdCBkYXRhLCB5b3UgY2FuIGNvbXBpbGUgdGhlIElKRyBjb2RlIGZvciAxMi1iaXQgb3BlcmF0aW9uLgorVG8gZG8gc286CisgIDEuIEluIGptb3JlY2ZnLmgsIGRlZmluZSBCSVRTX0lOX0pTQU1QTEUgYXMgMTIgcmF0aGVyIHRoYW4gOC4KKyAgMi4gSW4gamNvbmZpZy5oLCB1bmRlZmluZSBCTVBfU1VQUE9SVEVELCBSTEVfU1VQUE9SVEVELCBhbmQgVEFSR0FfU1VQUE9SVEVELAorICAgICBiZWNhdXNlIHRoZSBjb2RlIGZvciB0aG9zZSBmb3JtYXRzIGRvZXNuJ3QgaGFuZGxlIDEyLWJpdCBkYXRhIGFuZCB3b24ndAorICAgICBldmVuIGNvbXBpbGUuICAoVGhlIFBQTSBjb2RlIGRvZXMgd29yaywgYXMgZXhwbGFpbmVkIGJlbG93LiAgVGhlIEdJRgorICAgICBjb2RlIHdvcmtzIHRvbzsgaXQgc2NhbGVzIDgtYml0IEdJRiBkYXRhIHRvIGFuZCBmcm9tIDEyLWJpdCBkZXB0aAorICAgICBhdXRvbWF0aWNhbGx5LikKKyAgMy4gQ29tcGlsZS4gIERvbid0IGV4cGVjdCAibWFrZSB0ZXN0IiB0byBwYXNzLCBzaW5jZSB0aGUgc3VwcGxpZWQgdGVzdAorICAgICBmaWxlcyBhcmUgZm9yIDgtYml0IGRhdGEuCisKK0N1cnJlbnRseSwgMTItYml0IHN1cHBvcnQgZG9lcyBub3Qgd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgorCitOb3RlIHRoYXQgYSAxMi1iaXQgdmVyc2lvbiB3aWxsIG5vdCByZWFkIDgtYml0IEpQRUcgZmlsZXMsIG5vciB2aWNlIHZlcnNhOworc28geW91J2xsIHdhbnQgdG8ga2VlcCBhcm91bmQgYSByZWd1bGFyIDgtYml0IGNvbXBpbGF0aW9uIGFzIHdlbGwuCisoUnVuLXRpbWUgc2VsZWN0aW9uIG9mIGRhdGEgZGVwdGgsIHRvIGFsbG93IGEgc2luZ2xlIGNvcHkgdGhhdCBkb2VzIGJvdGgsCitpcyBwb3NzaWJsZSBidXQgd291bGQgcHJvYmFibHkgc2xvdyB0aGluZ3MgZG93biBjb25zaWRlcmFibHk7IGl0J3MgdmVyeSBsb3cKK29uIG91ciB0by1kbyBsaXN0LikKKworVGhlIFBQTSByZWFkZXIgKHJkcHBtLmMpIGNhbiByZWFkIDEyLWJpdCBkYXRhIGZyb20gZWl0aGVyIHRleHQtZm9ybWF0IG9yCitiaW5hcnktZm9ybWF0IFBQTSBhbmQgUEdNIGZpbGVzLiAgQmluYXJ5LWZvcm1hdCBQUE0vUEdNIGZpbGVzIHdoaWNoIGhhdmUgYQorbWF4dmFsIGdyZWF0ZXIgdGhhbiAyNTUgYXJlIGFzc3VtZWQgdG8gdXNlIDIgYnl0ZXMgcGVyIHNhbXBsZSwgTFNCIGZpcnN0CisobGl0dGxlLWVuZGlhbiBvcmRlcikuICBBcyBvZiBlYXJseSAxOTk1LCAyLWJ5dGUgYmluYXJ5IGZvcm1hdCBpcyBub3QKK29mZmljaWFsbHkgc3VwcG9ydGVkIGJ5IHRoZSBQQk1QTFVTIGxpYnJhcnksIGJ1dCBpdCBpcyBleHBlY3RlZCB0aGF0IGEKK2Z1dHVyZSByZWxlYXNlIG9mIFBCTVBMVVMgd2lsbCBzdXBwb3J0IGl0LiAgTm90ZSB0aGF0IHRoZSBQUE0gcmVhZGVyIHdpbGwKK3JlYWQgZmlsZXMgb2YgYW55IG1heHZhbCByZWdhcmRsZXNzIG9mIHRoZSBCSVRTX0lOX0pTQU1QTEUgc2V0dGluZzsgaW5jb21pbmcKK2RhdGEgaXMgYXV0b21hdGljYWxseSByZXNjYWxlZCB0byBlaXRoZXIgbWF4dmFsPTI1NSBvciBtYXh2YWw9NDA5NSBhcworYXBwcm9wcmlhdGUgZm9yIHRoZSBjanBlZyBiaXQgZGVwdGguCisKK1RoZSBQUE0gd3JpdGVyICh3cnBwbS5jKSB3aWxsIG5vcm1hbGx5IHdyaXRlIDItYnl0ZSBiaW5hcnkgUFBNIG9yIFBHTQorZm9ybWF0LCBtYXh2YWwgNDA5NSwgd2hlbiBjb21waWxlZCB3aXRoIEJJVFNfSU5fSlNBTVBMRT0xMi4gIFNpbmNlIHRoaXMKK2Zvcm1hdCBpcyBub3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQsIHlvdSBjYW4gZGlzYWJsZSBpdCBieSBjb21waWxpbmcgd3JwcG0uYword2l0aCBQUE1fTk9SQVdXT1JEIGRlZmluZWQ7IHRoZW4gdGhlIGRhdGEgaXMgc2NhbGVkIGRvd24gdG8gOCBiaXRzIHRvIG1ha2UgYQorc3RhbmRhcmQgMS1ieXRlL3NhbXBsZSBQUE0gb3IgUEdNIGZpbGUuICAoWWVzLCB0aGlzIG1lYW5zIHN0aWxsIGFub3RoZXIgY29weQorb2YgZGpwZWcgdG8ga2VlcCBhcm91bmQuICBCdXQgaG9wZWZ1bGx5IHlvdSB3b24ndCBuZWVkIGl0IGZvciB2ZXJ5IGxvbmcuCitQb3NrYW56ZXIncyBzdXBwb3NlZCB0byBnZXQgdGhhdCBuZXcgUEJNUExVUyByZWxlYXNlIG91dCBSZWFsIFNvb24gTm93LikKKworT2YgY291cnNlLCBpZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCAxMi1iaXQgZGF0YSwgeW91IHByb2JhYmx5IGhhdmUgaXQgc3RvcmVkCitpbiBzb21lIG90aGVyLCBub25zdGFuZGFyZCBmb3JtYXQuICBJbiB0aGF0IGNhc2UgeW91J2xsIHByb2JhYmx5IHdhbnQgdG8KK3dyaXRlIHlvdXIgb3duIEkvTyBtb2R1bGVzIHRvIHJlYWQgYW5kIHdyaXRlIHlvdXIgZm9ybWF0LgorCitOb3RlIHRoYXQgYSAxMi1iaXQgdmVyc2lvbiBvZiBjanBlZyBhbHdheXMgcnVucyBpbiAiLW9wdGltaXplIiBtb2RlLCBpbgorb3JkZXIgdG8gZ2VuZXJhdGUgdmFsaWQgSHVmZm1hbiB0YWJsZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG91cgorZGVmYXVsdCBIdWZmbWFuIHRhYmxlcyBvbmx5IGNvdmVyIDgtYml0IGRhdGEuCisKK1JlbW92aW5nIGNvZGU6CisKK0lmIHlvdSBuZWVkIHRvIG1ha2UgYSBzbWFsbGVyIHZlcnNpb24gb2YgdGhlIEpQRUcgc29mdHdhcmUsIHNvbWUgb3B0aW9uYWwKK2Z1bmN0aW9ucyBjYW4gYmUgcmVtb3ZlZCBhdCBjb21waWxlIHRpbWUuICBTZWUgdGhlIHh4eF9TVVBQT1JURUQgI2RlZmluZXMgaW4KK2pjb25maWcuaCBhbmQgam1vcmVjZmcuaC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGxlYXZlIGluCitkZWNvZGVyIHN1cHBvcnQgZm9yIGFsbCB2YWxpZCBKUEVHIGZpbGVzLCB0byBlbnN1cmUgdGhhdCB5b3UgY2FuIHJlYWQgYW55b25lJ3MKK291dHB1dC4gIFRha2luZyBvdXQgc3VwcG9ydCBmb3IgaW1hZ2UgZmlsZSBmb3JtYXRzIHRoYXQgeW91IGRvbid0IHVzZSBpcyB0aGUKK21vc3QgcGFpbmxlc3Mgd2F5IHRvIG1ha2UgdGhlIHByb2dyYW1zIHNtYWxsZXIuICBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvCityZW1vdmUgc29tZSBvZiB0aGUgRENUIG1ldGhvZHM6IGluIHBhcnRpY3VsYXIsIHRoZSAiSUZBU1QiIG1ldGhvZCBtYXkgbm90IGJlCitlbm91Z2ggZmFzdGVyIHRoYW4gdGhlIG90aGVycyB0byBiZSB3b3J0aCBrZWVwaW5nIG9uIHlvdXIgbWFjaGluZS4gIChJZiB5b3UKK2RvIHJlbW92ZSBJU0xPVyBvciBJRkFTVCwgYmUgc3VyZSB0byByZWRlZmluZSBKRENUX0RFRkFVTFQgb3IgSkRDVF9GQVNURVNUCit0byBhIHN1cHBvcnRlZCBtZXRob2QsIGJ5IGFkZGluZyBhICNkZWZpbmUgaW4gamNvbmZpZy5oLikKKworCitPUFRJTUlaQVRJT04KKz09PT09PT09PT09PQorCitVbmxlc3MgeW91IG93biBhIENyYXksIHlvdSdsbCBwcm9iYWJseSBiZSBpbnRlcmVzdGVkIGluIG1ha2luZyB0aGUgSlBFRworc29mdHdhcmUgZ28gYXMgZmFzdCBhcyBwb3NzaWJsZS4gIFRoaXMgc2VjdGlvbiBjb3ZlcnMgc29tZSBtYWNoaW5lLWRlcGVuZGVudAorb3B0aW1pemF0aW9ucyB5b3UgbWF5IHdhbnQgdG8gdHJ5LiAgV2Ugc3VnZ2VzdCB0aGF0IGJlZm9yZSB0cnlpbmcgYW55IG9mCit0aGlzLCB5b3UgZmlyc3QgZ2V0IHRoZSBiYXNpYyBpbnN0YWxsYXRpb24gdG8gcGFzcyB0aGUgc2VsZi10ZXN0IHN0ZXAuCitSZXBlYXQgdGhlIHNlbGYtdGVzdCBhZnRlciBhbnkgb3B0aW1pemF0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlbid0Citicm9rZW4gYW55dGhpbmcuCisKK1RoZSBpbnRlZ2VyIERDVCByb3V0aW5lcyBwZXJmb3JtIGEgbG90IG9mIG11bHRpcGxpY2F0aW9ucy4gIFRoZXNlCittdWx0aXBsaWNhdGlvbnMgbXVzdCB5aWVsZCAzMi1iaXQgcmVzdWx0cywgYnV0IG5vbmUgb2YgdGhlaXIgaW5wdXQgdmFsdWVzCithcmUgbW9yZSB0aGFuIDE2IGJpdHMgd2lkZS4gIE9uIG1hbnkgbWFjaGluZXMsIG5vdGFibHkgdGhlIDY4MHgwIGFuZCA4MHg4NgorQ1BVcywgYSAxNngxNj0+MzIgYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGlzIGZhc3RlciB0aGFuIGEgZnVsbCAzMngzMj0+MzIKK2JpdCBtdWx0aXBseS4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gcG9ydGFibGUgd2F5IHRvIHNwZWNpZnkgc3VjaCBhCittdWx0aXBsaWNhdGlvbiBpbiBDLCBidXQgc29tZSBjb21waWxlcnMgY2FuIGdlbmVyYXRlIG9uZSB3aGVuIHlvdSB1c2UgdGhlCityaWdodCBjb21iaW5hdGlvbiBvZiBjYXN0cy4gIFNlZSB0aGUgTVVMVElQTFl4eHggbWFjcm8gZGVmaW5pdGlvbnMgaW4KK2pkY3QuaC4gIElmIHlvdXIgY29tcGlsZXIgbWFrZXMgImludCIgYmUgMzIgYml0cyBhbmQgInNob3J0IiBiZSAxNiBiaXRzLAorZGVmaW5pbmcgU0hPUlR4U0hPUlRfMzIgaXMgZmFpcmx5IGxpa2VseSB0byB3b3JrLiAgV2hlbiBleHBlcmltZW50aW5nIHdpdGgKK2FsdGVybmF0ZSBkZWZpbml0aW9ucywgYmUgc3VyZSB0byB0ZXN0IG5vdCBvbmx5IHdoZXRoZXIgdGhlIGNvZGUgc3RpbGwgd29ya3MKKyh1c2UgdGhlIHNlbGYtdGVzdCksIGJ1dCBhbHNvIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgZmFzdGVyIC0tLSBvbiBzb21lCitjb21waWxlcnMsIGFsdGVybmF0ZSBkZWZpbml0aW9ucyBtYXkgY29tcHV0ZSB0aGUgcmlnaHQgYW5zd2VyLCB5ZXQgYmUgc2xvd2VyCit0aGFuIHRoZSBkZWZhdWx0LiAgVGltaW5nIGNqcGVnIG9uIGEgbGFyZ2UgUEdNIChncmF5c2NhbGUpIGlucHV0IGZpbGUgaXMgdGhlCitiZXN0IHdheSB0byBjaGVjayB0aGlzLCBhcyB0aGUgRENUIHdpbGwgYmUgdGhlIGxhcmdlc3QgZnJhY3Rpb24gb2YgdGhlIHJ1bnRpbWUKK2luIHRoYXQgbW9kZS4gIChOb3RlOiBzb21lIG9mIHRoZSBkaXN0cmlidXRlZCBjb21waWxlci1zcGVjaWZpYyBqY29uZmlnIGZpbGVzCithbHJlYWR5IGNvbnRhaW4gI2RlZmluZSBzd2l0Y2hlcyB0byBzZWxlY3QgYXBwcm9wcmlhdGUgTVVMVElQTFl4eHgKK2RlZmluaXRpb25zLikKKworSWYgeW91ciBtYWNoaW5lIGhhcyBzdWZmaWNpZW50bHkgZmFzdCBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSwgeW91IG1heSBmaW5kCit0aGF0IHRoZSBmbG9hdCBEQ1QgbWV0aG9kIGlzIGZhc3RlciB0aGFuIHRoZSBpbnRlZ2VyIERDVCBtZXRob2RzLCBldmVuCithZnRlciB0d2Vha2luZyB0aGUgaW50ZWdlciBtdWx0aXBseSBtYWNyb3MuICBJbiB0aGF0IGNhc2UgeW91IG1heSB3YW50IHRvCittYWtlIHRoZSBmbG9hdCBEQ1QgYmUgdGhlIGRlZmF1bHQgbWV0aG9kLiAgKFRoZSBvbmx5IG9iamVjdGlvbiB0byB0aGlzIGlzCit0aGF0IGZsb2F0IERDVCByZXN1bHRzIG1heSB2YXJ5IHNsaWdodGx5IGFjcm9zcyBtYWNoaW5lcy4pICBUbyBkbyB0aGF0LCBhZGQKKyIjZGVmaW5lIEpEQ1RfREVGQVVMVCBKRENUX0ZMT0FUIiB0byBqY29uZmlnLmguICBFdmVuIGlmIHlvdSBkb24ndCBjaGFuZ2UKK3RoZSBkZWZhdWx0LCB5b3Ugc2hvdWxkIHJlZGVmaW5lIEpEQ1RfRkFTVEVTVCwgd2hpY2ggaXMgdGhlIG1ldGhvZCBzZWxlY3RlZAorYnkgZGpwZWcncyAtZmFzdCBzd2l0Y2guICBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHRoZSBkb2N1bWVudGF0aW9uIGZpbGVzCisodXNhZ2UuZG9jIGFuZC9vciBjanBlZy4xLCBkanBlZy4xKSB0byBhZ3JlZSB3aXRoIHdoYXQgeW91J3ZlIGRvbmUuCisKK0lmIGFjY2VzcyB0byAic2hvcnQiIGFycmF5cyBpcyBzbG93IG9uIHlvdXIgbWFjaGluZSwgaXQgbWF5IGJlIGEgd2luIHRvCitkZWZpbmUgdHlwZSBKQ09FRiBhcyBpbnQgcmF0aGVyIHRoYW4gc2hvcnQuICBUaGlzIHdpbGwgY29zdCBhIGdvb2QgZGVhbCBvZgorbWVtb3J5IHRob3VnaCwgcGFydGljdWxhcmx5IGluIHNvbWUgbXVsdGktcGFzcyBtb2Rlcywgc28gZG9uJ3QgZG8gaXQgdW5sZXNzCit5b3UgaGF2ZSBtZW1vcnkgdG8gYnVybiBhbmQgc2hvcnQgaXMgUkVBTExZIHNsb3cuCisKK0lmIHlvdXIgY29tcGlsZXIgY2FuIGNvbXBpbGUgZnVuY3Rpb24gY2FsbHMgaW4tbGluZSwgbWFrZSBzdXJlIHRoZSBJTkxJTkUKK21hY3JvIGluIGptb3JlY2ZnLmggaXMgZGVmaW5lZCBhcyB0aGUga2V5d29yZCB0aGF0IG1hcmtzIGEgZnVuY3Rpb24KK2lubGluZS1hYmxlLiAgU29tZSBjb21waWxlcnMgaGF2ZSBhIHN3aXRjaCB0aGF0IHRlbGxzIHRoZSBjb21waWxlciB0byBpbmxpbmUKK2FueSBmdW5jdGlvbiBpdCB0aGlua3MgaXMgcHJvZml0YWJsZSAoZS5nLiwgLWZpbmxpbmUtZnVuY3Rpb25zIGZvciBnY2MpLgorRW5hYmxpbmcgc3VjaCBhIHN3aXRjaCBpcyBsaWtlbHkgdG8gbWFrZSB0aGUgY29tcGlsZWQgY29kZSBiaWdnZXIgYnV0IGZhc3Rlci4KKworSW4gZ2VuZXJhbCwgaXQncyB3b3J0aCB0cnlpbmcgdGhlIG1heGltdW0gb3B0aW1pemF0aW9uIGxldmVsIG9mIHlvdXIgY29tcGlsZXIsCithbmQgZXhwZXJpbWVudGluZyB3aXRoIGFueSBvcHRpb25hbCBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgbG9vcCB1bnJvbGxpbmcuCisoVW5mb3J0dW5hdGVseSwgZmFyIHRvbyBtYW55IGNvbXBpbGVycyBoYXZlIG9wdGltaXplciBidWdzIC4uLiBiZSBwcmVwYXJlZCB0bworYmFjayBvZmYgaWYgdGhlIGNvZGUgZmFpbHMgc2VsZi10ZXN0LikgIElmIHlvdSBkbyBhbnkgZXhwZXJpbWVudGF0aW9uIGFsb25nCit0aGVzZSBsaW5lcywgcGxlYXNlIHJlcG9ydCB0aGUgb3B0aW1hbCBzZXR0aW5ncyB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0IHNvCit3ZSBjYW4gbWVudGlvbiB0aGVtIGluIGZ1dHVyZSByZWxlYXNlcy4gIEJlIHN1cmUgdG8gc3BlY2lmeSB5b3VyIG1hY2hpbmUgYW5kCitjb21waWxlciB2ZXJzaW9uLgorCisKK0hJTlRTIEZPUiBTUEVDSUZJQyBTWVNURU1TCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZSB3ZWxjb21lIHJlcG9ydHMgb24gY2hhbmdlcyBuZWVkZWQgZm9yIHN5c3RlbXMgbm90IG1lbnRpb25lZCBoZXJlLiAgU3VibWl0CisnZW0gdG8ganBlZy1pbmZvQHV1bmV0LnV1Lm5ldC4gIEFsc28sIGlmIGNvbmZpZ3VyZSBvciBja2NvbmZpZy5jIGlzIHdyb25nCithYm91dCBob3cgdG8gY29uZmlndXJlIHRoZSBKUEVHIHNvZnR3YXJlIGZvciB5b3VyIHN5c3RlbSwgcGxlYXNlIGxldCB1cyBrbm93LgorCisKK0Fjb3JuIFJJU0MgT1M6CisKKyhUaGFua3MgdG8gU2ltb24gTWlkZGxldG9uIGZvciB0aGVzZSBoaW50cyBvbiBjb21waWxpbmcgd2l0aCBEZXNrdG9wIEMuKQorQWZ0ZXIgcmVuYW1pbmcgdGhlIGZpbGVzIGFjY29yZGluZyB0byBBY29ybiBjb252ZW50aW9ucywgdGFrZSBhIGNvcHkgb2YKK21ha2VmaWxlLmFuc2ksIGNoYW5nZSBhbGwgb2NjdXJyZW5jZXMgb2YgJ2xpYmpwZWcuYScgdG8gJ2xpYmpwZWcubycgYW5kCitjaGFuZ2UgdGhlc2UgZGVmaW5pdGlvbnMgYXMgaW5kaWNhdGVkOgorCitDRkxBR1M9IC10aHJvd2JhY2sgLUlDOiAtV24KK0xETElCUz1DOm8uU3R1YnMKK1NZU0RFUE1FTT1qbWVtYW5zaS5vCitMTj1MaW5rCitBUj1MaWJGaWxlIC1jIC1vCisKK0Fsc28gYWRkIGEgbmV3IGxpbmUgJy5jLm86OyAkKGNjKSAkPCAkKGNmbGFncykgLWMgLW8gJEAnLiAgUmVtb3ZlIHRoZQorbGluZXMgJyQoUk0pIGxpYmpwZWcubycgYW5kICckKEFSMikgbGlianBlZy5vJyBhbmQgdGhlICdqY29uZmlnLmgnCitkZXBlbmRlbmN5IHNlY3Rpb24uCisKK0NvcHkgamNvbmZpZy5kb2MgdG8gamNvbmZpZy5oLiAgRWRpdCBqY29uZmlnLmggdG8gZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCithbmQgQ0hBUl9JU19VTlNJR05FRC4KKworUnVuIHRoZSBtYWtlZmlsZSB1c2luZyAhQU1VIG5vdCAhTWFrZS4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgJ2NsZWFuJyBhbmQKKyd0ZXN0JyBtYWtlZmlsZSBlbnRyaWVzIHRoZW4geW91IHdpbGwgaGF2ZSB0byBmaWRkbGUgd2l0aCB0aGUgc3ludGF4IGEgYml0CithbmQgcmVuYW1lIHRoZSB0ZXN0IGZpbGVzLgorCisKK0FtaWdhOgorCitTQVMgQyA2LjUwIHJlcG9ydGVkbHkgaXMgdG9vIGJ1Z2d5IHRvIGNvbXBpbGUgdGhlIElKRyBjb2RlIHByb3Blcmx5LgorQSBwYXRjaCB0byB1cGRhdGUgdG8gNi41MSBpcyBhdmFpbGFibGUgZnJvbSBTQVMgb3IgQW1pTmV0IEZUUCBzaXRlcy4KKworVGhlIHN1cHBsaWVkIGNvbmZpZyBmaWxlcyBhcmUgc2V0IHVwIHRvIHVzZSBqbWVtbmFtZS5jIGFzIHRoZSBtZW1vcnkKK21hbmFnZXIsIHdpdGggdGVtcG9yYXJ5IGZpbGVzIGJlaW5nIGNyZWF0ZWQgb24gdGhlIGRldmljZSBuYW1lZCBieQorIkpQRUdUTVA6Ii4KKworCitBdGFyaSBTVC9TVEUvVFQ6CisgCitDb3B5IHRoZSBwcm9qZWN0IGZpbGVzIG1ha2NqcGVnLnN0LCBtYWtkanBlZy5zdCwgbWFrdGpwZWcuc3QsIGFuZCBtYWtsanBlZy5zdAordG8gY2pwZWcucHJqLCBkanBlZy5wcmosIGpwZWd0cmFuLnByaiwgYW5kIGxpYmpwZWcucHJqIHJlc3BlY3RpdmVseS4gIFRoZQorcHJvamVjdCBmaWxlcyBzaG91bGQgd29yayBhcy1pcyB3aXRoIFB1cmUgQy4gIEZvciBUdXJibyBDLCBjaGFuZ2UgbGlicmFyeQorZmlsZW5hbWVzICJwYy4uLiIgdG8gInRjLi4uIiBpbiBlYWNoIHByb2plY3QgZmlsZS4gIE5vdGUgdGhhdCBsaWJqcGVnLnByagorc2VsZWN0cyBqbWVtYW5zaS5jIGFzIHRoZSByZWNvbW1lbmRlZCBtZW1vcnkgbWFuYWdlci4gIFlvdSdsbCBwcm9iYWJseSB3YW50IHRvCithZGp1c3QgdGhlIERFRkFVTFRfTUFYX01FTSBzZXR0aW5nIC0tLSB5b3Ugd2FudCBpdCB0byBiZSBhIGNvdXBsZSBodW5kcmVkIEsKK2xlc3MgdGhhbiB5b3VyIG5vcm1hbCBmcmVlIG1lbW9yeS4gIFB1dCAiI2RlZmluZSBERUZBVUxUX01BWF9NRU0gbm5ubiIgaW50bworamNvbmZpZy5oIHRvIGRvIHRoaXMuCisKK1RvIHVzZSB0aGUgNjg4ODEvNjg4ODIgY29wcm9jZXNzb3IgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBEQ1QsIGFkZCB0aGUKK2NvbXBpbGVyIG9wdGlvbiAiLTgiIHRvIHRoZSBwcm9qZWN0IGZpbGVzIGFuZCByZXBsYWNlIHBjZmx0bGliLmxpYiB3aXRoCitwYzg4MWxpYi5saWIgaW4gY2pwZWcucHJqIGFuZCBkanBlZy5wcmouICBPciBpZiB5b3UgZG9uJ3QgaGF2ZSBhCitjb3Byb2Nlc3NvciwgeW91IG1heSBwcmVmZXIgdG8gcmVtb3ZlIHRoZSBmbG9hdCBEQ1QgY29kZSBieSB1bmRlZmluaW5nCitEQ1RfRkxPQVRfU1VQUE9SVEVEIGluIGptb3JlY2ZnLmggKHNpbmNlIHdpdGhvdXQgYSBjb3Byb2Nlc3NvciwgdGhlIGZsb2F0Citjb2RlIHdpbGwgYmUgdG9vIHNsb3cgdG8gYmUgdXNlZnVsKS4gIEluIHRoYXQgY2FzZSwgeW91IGNhbiBkZWxldGUKK3BjZmx0bGliLmxpYiBmcm9tIHRoZSBwcm9qZWN0IGZpbGVzLgorCitOb3RlIHRoYXQgeW91IG11c3QgbWFrZSBsaWJqcGVnLmxpYiBiZWZvcmUgbWFraW5nIGNqcGVnLnR0cCwgZGpwZWcudHRwLAorb3IganBlZ3RyYW4udHRwLiAgWW91J2xsIGhhdmUgdG8gcGVyZm9ybSB0aGUgc2VsZi10ZXN0IGJ5IGhhbmQuCisKK1dlIGhhdmVuJ3QgYm90aGVyZWQgdG8gaW5jbHVkZSBwcm9qZWN0IGZpbGVzIGZvciByZGpwZ2NvbSBhbmQgd3JqcGdjb20uCitUaG9zZSBzb3VyY2UgZmlsZXMgc2hvdWxkIGp1c3QgYmUgY29tcGlsZWQgYnkgdGhlbXNlbHZlczsgdGhleSBkb24ndAorZGVwZW5kIG9uIHRoZSBKUEVHIGxpYnJhcnkuCisKK1RoZXJlIGlzIGEgYnVnIGluIHNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFR1cmJvIEMgbGlicmFyeSB3aGljaCBjYXVzZXMgdGhlCitzcGFjZSB1c2VkIGJ5IHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIHdpdGggInRtcGZpbGUoKSIgbm90IHRvIGJlIGZyZWVkIGFmdGVyCithbiBhYm5vcm1hbCBwcm9ncmFtIGV4aXQuICBJZiB5b3UgY2hlY2sgeW91ciBkaXNrIGFmdGVyd2FyZHMsIHlvdSB3aWxsIGZpbmQKK2NsdXN0ZXIgY2hhaW5zIHRoYXQgYXJlIGFsbG9jYXRlZCBidXQgbm90IHVzZWQgYnkgYSBmaWxlLiAgVGhpcyBzaG91bGQgbm90CitoYXBwZW4gaW4gY2pwZWcvZGpwZWcvanBlZ3RyYW4sIHNpbmNlIHdlIGVuYWJsZSBhIHNpZ25hbCBjYXRjaGVyIHRvIGV4cGxpY2l0bHkKK2Nsb3NlIHRlbXAgZmlsZXMgYmVmb3JlIGV4aXRpbmcuICBCdXQgaWYgeW91IHVzZSB0aGUgSlBFRyBsaWJyYXJ5IHdpdGggeW91cgorb3duIGNvZGUsIGJlIHN1cmUgdG8gc3VwcGx5IGEgc2lnbmFsIGNhdGNoZXIsIG9yIGVsc2UgdXNlIGEgZGlmZmVyZW50CitzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VyLgorCisKK0NyYXk6CisKK1Nob3VsZCB5b3UgYmUgc28gZm9ydHVuYXRlIGFzIHRvIGJlIHJ1bm5pbmcgSlBFRyBvbiBhIENyYXkgWU1QLCB0aGVyZSBpcyBhCitjb21waWxlciBidWcgaW4gb2xkIHZlcnNpb25zIG9mIENyYXkncyBTdGFuZGFyZCBDIChwcmlvciB0byAzLjEpLiAgSWYgeW91CitzdGlsbCBoYXZlIGFuIG9sZCBjb21waWxlciwgeW91J2xsIG5lZWQgdG8gaW5zZXJ0IGEgbGluZSByZWFkaW5nCisiI3ByYWdtYSBub3ZlY3RvciIganVzdCBiZWZvcmUgdGhlIGxvb3AJCisgICAgZm9yIChpID0gMTsgaSA8PSAoaW50KSBodGJsLT5iaXRzW2xdOyBpKyspCisgICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7CitpbiBmaXhfaHVmZl90YmwgKGluIFY1YmV0YTEsIGxpbmUgMjA0IG9mIGpjaHVmZi5jIGFuZCBsaW5lIDE3NiBvZiBqZGh1ZmYuYykuCitbVGhpcyBidWcgbWF5IG9yIG1heSBub3Qgc3RpbGwgb2NjdXIgd2l0aCB0aGUgY3VycmVudCBJSkcgY29kZSwgYnV0IGl0J3MKK3Byb2JhYmx5IGEgZGVhZCBpc3N1ZSBhbnl3YXkuLi5dCisKKworSFAtVVg6CisKK0lmIHlvdSBoYXZlIEhQLVVYIDcuMDUgb3IgbGF0ZXIgd2l0aCB0aGUgInNvZnR3YXJlIGRldmVsb3BtZW50IiBDIGNvbXBpbGVyLAoreW91IHNob3VsZCBydW4gdGhlIGNvbXBpbGVyIGluIEFOU0kgbW9kZS4gIElmIHVzaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0LAorc2F5CisJLi9jb25maWd1cmUgQ0M9J2NjIC1BYScKKyhvciAtQWUgaWYgeW91IHByZWZlcikuICBJZiBjb25maWd1cmluZyBieSBoYW5kLCB1c2UgbWFrZWZpbGUuYW5zaSBhbmQgYWRkCisiLUFhIiB0byB0aGUgQ0ZMQUdTIGxpbmUgaW4gdGhlIG1ha2VmaWxlLgorCitJZiB5b3UgaGF2ZSBhIHByZS03LjA1IHN5c3RlbSwgb3IgaWYgeW91IGFyZSB1c2luZyB0aGUgbm9uLUFOU0kgQyBjb21waWxlcgorZGVsaXZlcmVkIHdpdGggYSBtaW5pbXVtIEhQLVVYIHN5c3RlbSwgdGhlbiB5b3UgbXVzdCB1c2UgbWFrZWZpbGUudW5peAorKGFuZCBkbyBOT1QgYWRkIC1BYSk7IG9yIGp1c3QgcnVuIGNvbmZpZ3VyZSB3aXRob3V0IHRoZSBDQyBvcHRpb24uCisKK09uIEhQIDkwMDAgc2VyaWVzIDgwMCBtYWNoaW5lcywgdGhlIEhQIEMgY29tcGlsZXIgaXMgYnVnZ3kgaW4gcmV2aXNpb25zIHByaW9yCit0byBBLjA4LjA3LiAgSWYgeW91IGdldCBjb21wbGFpbnRzIGFib3V0ICJub3QgYSB0eXBlZGVmIG5hbWUiLCB5b3UnbGwgaGF2ZSB0bwordXNlIG1ha2VmaWxlLnVuaXgsIG9yIHJ1biBjb25maWd1cmUgd2l0aG91dCB0aGUgQ0Mgb3B0aW9uLgorCisKK01hY2ludG9zaCwgZ2VuZXJpYyBjb21tZW50czoKKworVGhlIHN1cHBsaWVkIHVzZXItaW50ZXJmYWNlIGZpbGVzIChjanBlZy5jLCBkanBlZy5jLCBldGMpIGFyZSBzZXQgdXAgdG8KK3Byb3ZpZGUgYSBVbml4LXN0eWxlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuICBZb3UgY2FuIHVzZSB0aGlzIGludGVyZmFjZSBvbgordGhlIE1hYyBieSBtZWFucyBvZiB0aGUgY2NvbW1hbmQoKSBsaWJyYXJ5IHJvdXRpbmUgcHJvdmlkZWQgYnkgTWV0cm93ZXJrcworQ29kZVdhcnJpb3Igb3IgVGhpbmsgQy4gIFRoaXMgaXMgb25seSBhcHByb3ByaWF0ZSBmb3IgdGVzdGluZyB0aGUgbGlicmFyeSwKK2hvd2V2ZXI7IHRvIG1ha2UgYSB1c2VyLWZyaWVuZGx5IGVxdWl2YWxlbnQgb2YgY2pwZWcvZGpwZWcgeW91J2QgcmVhbGx5IHdhbnQKK3RvIGRldmVsb3AgYSBNYWMtc3R5bGUgdXNlciBpbnRlcmZhY2UuICBUaGVyZSBpc24ndCBhIGNvbXBsZXRlIGV4YW1wbGUKK2F2YWlsYWJsZSBhdCB0aGUgbW9tZW50LCBidXQgdGhlcmUgYXJlIHNvbWUgaGVscGZ1bCBzdGFydGluZyBwb2ludHM6CisxLiBTYW0gQnVzaGVsbCdzIGZyZWUgIlRvIEpQRUciIGFwcGxldCBwcm92aWRlcyBkcmFnLWFuZC1kcm9wIGNvbnZlcnNpb24gdG8KK0pQRUcgdW5kZXIgU3lzdGVtIDcgYW5kIGxhdGVyLiAgVGhpcyBvbmx5IGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgdGhlCitjb21wcmVzc2lvbiBoYWxmIG9mIHRoZSBsaWJyYXJ5LCBidXQgaXQgZG9lcyBhIHZlcnkgbmljZSBqb2Igb2YgdGhhdCBwYXJ0LgorVGhlIENvZGVXYXJyaW9yIHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cucG9ib3guY29tL35qc2FtLgorMi4gSmltIEJydW5uZXIgcHJlcGFyZWQgYSBNYWMtc3R5bGUgdXNlciBpbnRlcmZhY2UgZm9yIGJvdGggY29tcHJlc3Npb24gYW5kCitkZWNvbXByZXNzaW9uLiAgVW5mb3J0dW5hdGVseSwgaXQgaGFzbid0IGJlZW4gdXBkYXRlZCBzaW5jZSBJSkcgdjQsIGFuZAordGhlIGxpYnJhcnkncyBBUEkgaGFzIGNoYW5nZWQgY29uc2lkZXJhYmx5IHNpbmNlIHRoZW4uICBTdGlsbCBpdCBtYXkgYmUgb2YKK3NvbWUgaGVscCwgcGFydGljdWxhcmx5IGFzIGEgZ3VpZGUgdG8gY29tcGlsaW5nIHRoZSBJSkcgY29kZSB1bmRlciBUaGluayBDLgorSmltJ3MgY29kZSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgSW5mby1NYWMgYXJjaGl2ZXMsIGF0IHN1bWV4LWFpbS5zdGFuZm9yZC5lZHUKK29yIG1pcnJvcnMgdGhlcmVvZjsgc2VlIGZpbGUgL2luZm8tbWFjL2Rldi9zcmMvanBlZy1jb252ZXJ0LWMuaHF4LgorCitqbWVtbWFjLmMgaXMgdGhlIHJlY29tbWVuZGVkIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kIGZvciBNYWNpbnRvc2guICBJdCB1c2VzCitOZXdQdHIvRGlzcG9zZVB0ciBpbnN0ZWFkIG9mIG1hbGxvYy9mcmVlLCBhbmQgaGFzIGEgTWFjLXNwZWNpZmljCitpbXBsZW1lbnRhdGlvbiBvZiBqcGVnX21lbV9hdmFpbGFibGUoKS4gIEl0IGFsc28gY3JlYXRlcyB0ZW1wb3JhcnkgZmlsZXMgdGhhdAorZm9sbG93IE1hYyBjb252ZW50aW9ucy4gIChUaGF0IHBhcnQgb2YgdGhlIGNvZGUgcmVsaWVzIG9uIFN5c3RlbS03LW9yLWxhdGVyIE9TCitmdW5jdGlvbnMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGptZW1tYWMuYyBpZiB5b3UgbmVlZCB0byBydW4gaXQgb24gU3lzdGVtIDYuKQorTk9URSB0aGF0IFVTRV9NQUNfTUVNTUdSIG11c3QgYmUgZGVmaW5lZCBpbiBqY29uZmlnLmggdG8gdXNlIGptZW1tYWMuYy4KKworWW91IGNhbiBhbHNvIHVzZSBqbWVtbm9icy5jLCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBoYW5kbGluZyBpbWFnZXMgbGFyZ2VyCit0aGFuIGF2YWlsYWJsZSBtZW1vcnkuICBJZiB5b3UgdXNlIGFueSBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCBvdGhlciB0aGFuCitqbWVtbWFjLmMsIHdlIHJlY29tbWVuZCByZXBsYWNpbmcgIm1hbGxvYyIgYW5kICJmcmVlIiBieSAiTmV3UHRyIiBhbmQKKyJEaXNwb3NlUHRyIiwgYmVjYXVzZSBNYWMgQyBsaWJyYXJpZXMgb2Z0ZW4gaGF2ZSBwZWN1bGlhciBpbXBsZW1lbnRhdGlvbnMgb2YKK21hbGxvYy9mcmVlLiAgKEZvciBpbnN0YW5jZSwgZnJlZSgpIG1heSBub3QgcmV0dXJuIHRoZSBmcmVlZCBzcGFjZSB0byB0aGUKK01hYyBNZW1vcnkgTWFuYWdlci4gIFRoaXMgaXMgdW5kZXNpcmFibGUgZm9yIHRoZSBJSkcgY29kZSBiZWNhdXNlIGptZW1tZ3IuYworYWxyZWFkeSBjbHVtcHMgc3BhY2UgcmVxdWVzdHMuKQorCisKK01hY2ludG9zaCwgTWV0cm93ZXJrcyBDb2RlV2FycmlvcjoKKworVGhlIFVuaXgtY29tbWFuZC1saW5lLXN0eWxlIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBkZWZpbmluZyBVU0VfQ0NPTU1BTkQuCitZb3UnbGwgYWxzbyBuZWVkIHRvIGRlZmluZSBUV09fRklMRV9DT01NQU5ETElORSB0byBhdm9pZCBzdGRpbi9zdGRvdXQuCitUaGlzIG1lYW5zIHRoYXQgd2hlbiB1c2luZyB0aGUgY2pwZWcvZGpwZWcgcHJvZ3JhbXMsIHlvdSdsbCBoYXZlIHRvIHR5cGUgdGhlCitpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbmFtZXMgaW4gdGhlICJBcmd1bWVudHMiIHRleHQtZWRpdCBib3gsIHJhdGhlciB0aGFuCit1c2luZyB0aGUgZmlsZSByYWRpbyBidXR0b25zLiAgKFBlcmhhcHMgVVNFX0ZET1BFTiBvciBVU0VfU0VUTU9ERSB3b3VsZAorZWxpbWluYXRlIHRoZSBwcm9ibGVtLCBidXQgSSBoYXZlbid0IGhlYXJkIGZyb20gYW55b25lIHdobydzIHRyaWVkIGl0LikKKworT24gNjgweDAgTWFjcywgTWV0cm93ZXJrcyBkZWZpbmVzIHR5cGUgImRvdWJsZSIgYXMgYSAxMC1ieXRlIElFRUUgZXh0ZW5kZWQKK2Zsb2F0LiAgam1lbW1nci5jIHdvbid0IGxpa2UgdGhpczogaXQgd2FudHMgc2l6ZW9mKEFMSUdOX1RZUEUpIHRvIGJlIGEgcG93ZXIKK29mIDIuICBBZGQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiB0byBqY29uZmlnLmggdG8gZWxpbWluYXRlIHRoZSBjb21wbGFpbnQuCisKK1RoZSBzdXBwbGllZCBjb25maWd1cmF0aW9uIGZpbGUgamNvbmZpZy5tYWMgY2FuIGJlIHVzZWQgZm9yIHlvdXIgamNvbmZpZy5oOworaXQgaW5jbHVkZXMgYWxsIHRoZSByZWNvbW1lbmRlZCBzeW1ib2wgZGVmaW5pdGlvbnMuICBJZiB5b3UgaGF2ZSBBcHBsZVNjcmlwdAoraW5zdGFsbGVkLCB5b3UgY2FuIHJ1biB0aGUgc3VwcGxpZWQgc2NyaXB0IG1ha2Vwcm9qLm1hYyB0byBjcmVhdGUgQ29kZVdhcnJpb3IKK3Byb2plY3QgZmlsZXMgZm9yIHRoZSBsaWJyYXJ5IGFuZCB0aGUgdGVzdGJlZCBhcHBsaWNhdGlvbnMsIHRoZW4gYnVpbGQgdGhlCitsaWJyYXJ5IGFuZCBhcHBsaWNhdGlvbnMuICAoVGhhbmtzIHRvIERhbiBTZWFycyBhbmQgRG9uIEFncm8gZm9yIHRoaXMgbmlmdHkKK2hhY2ssIHdoaWNoIHNhdmVzIHVzIGZyb20gdHJ5aW5nIHRvIG1haW50YWluIENvZGVXYXJyaW9yIHByb2plY3QgZmlsZXMgYXMgcGFydAorb2YgdGhlIElKRyBkaXN0cmlidXRpb24uLi4pCisKKworTWFjaW50b3NoLCBUaGluayBDOgorCitUaGUgZG9jdW1lbnRhdGlvbiBpbiBKaW0gQnJ1bm5lcidzICJKUEVHIENvbnZlcnQiIHNvdXJjZSBjb2RlIChzZWUgYWJvdmUpCitpbmNsdWRlcyBkZXRhaWxlZCBidWlsZCBpbnN0cnVjdGlvbnMgZm9yIFRoaW5rIEM7IGl0J3MgcHJvYmFibHkgc29tZXdoYXQKK291dCBvZiBkYXRlIGZvciB0aGUgY3VycmVudCByZWxlYXNlLCBidXQgbWF5IGJlIGhlbHBmdWwuCisKK0lmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZSBtaW5pbWFsIGNvbW1hbmQgbGluZSB2ZXJzaW9uLCBwcm9jZWVkIGFzIGZvbGxvd3MuCitZb3UnbGwgaGF2ZSB0byBwcmVwYXJlIHByb2plY3QgZmlsZXMgZm9yIHRoZSBwcm9ncmFtczsgd2UgZG9uJ3QgaW5jbHVkZSBhbnkKK2luIHRoZSBkaXN0cmlidXRpb24gc2luY2UgdGhleSBhcmUgbm90IHRleHQgZmlsZXMuICBVc2UgdGhlIGZpbGUgbGlzdHMgaW4KK2FueSBvZiB0aGUgc3VwcGxpZWQgbWFrZWZpbGVzIGFzIGEgZ3VpZGUuICBBbHNvIGFkZCB0aGUgQU5TSSBhbmQgVW5peCBDCitsaWJyYXJpZXMgaW4gYSBzZXBhcmF0ZSBzZWdtZW50LiAgWW91IG1heSBuZWVkIHRvIGRpdmlkZSB0aGUgSlBFRyBmaWxlcyBpbnRvCittb3JlIHRoYW4gb25lIHNlZ21lbnQ7IHdlIHJlY29tbWVuZCBkaXZpZGluZyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorbW9kdWxlcy4gIERlZmluZSBVU0VfQ0NPTU1BTkQgaW4gamNvbmZpZy5oIHNvIHRoYXQgdGhlIGNjb21tYW5kKCkgcm91dGluZSBpcworY2FsbGVkLiAgWW91IG11c3QgYWxzbyBkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUgYmVjYXVzZSBzdGRpbi9zdGRvdXQKK2Rvbid0IGhhbmRsZSBiaW5hcnkgZGF0YSBjb3JyZWN0bHkuCisKK09uIDY4MHgwIE1hY3MsIFRoaW5rIEMgZGVmaW5lcyB0eXBlICJkb3VibGUiIGFzIGEgMTItYnl0ZSBJRUVFIGV4dGVuZGVkIGZsb2F0Lgoram1lbW1nci5jIHdvbid0IGxpa2UgdGhpczogaXQgd2FudHMgc2l6ZW9mKEFMSUdOX1RZUEUpIHRvIGJlIGEgcG93ZXIgb2YgMi4KK0FkZCAiI2RlZmluZSBBTElHTl9UWVBFIGxvbmciIHRvIGpjb25maWcuaCB0byBlbGltaW5hdGUgdGhlIGNvbXBsYWludC4KKworamNvbmZpZy5tYWMgc2hvdWxkIHdvcmsgYXMgYSBqY29uZmlnLmggY29uZmlndXJhdGlvbiBmaWxlIGZvciBUaGluayBDLAorYnV0IHRoZSBtYWtlcHJvai5tYWMgQXBwbGVTY3JpcHQgc2NyaXB0IGlzIHNwZWNpZmljIHRvIENvZGVXYXJyaW9yLiAgU29ycnkuCisKKworTUlQUyBSMzAwMDoKKworTUlQUydzIGNjIHZlcnNpb24gMS4zMSBoYXMgYSByYXRoZXIgbmFzdHkgb3B0aW1pemF0aW9uIGJ1Zy4gIERvbid0IHVzZSAtTworaWYgeW91IGhhdmUgdGhhdCBjb21waWxlciB2ZXJzaW9uLiAgKFVzZSAiY2MgLVYiIHRvIGNoZWNrIHRoZSB2ZXJzaW9uLikKK05vdGUgdGhhdCB0aGUgUjMwMDAgY2hpcCBpcyBmb3VuZCBpbiB3b3Jrc3RhdGlvbnMgZnJvbSBERUMgYW5kIG90aGVycy4KKworCitNUy1ET1MsIGdlbmVyaWMgY29tbWVudHMgZm9yIDE2LWJpdCBjb21waWxlcnM6CisKK1RoZSBJSkcgY29kZSBpcyBkZXNpZ25lZCB0byB3b3JrIHdlbGwgaW4gODB4ODYgInNtYWxsIiBvciAibWVkaXVtIiBtZW1vcnkKK21vZGVscyAoaS5lLiwgZGF0YSBwb2ludGVycyBhcmUgMTYgYml0cyB1bmxlc3MgZXhwbGljaXRseSBkZWNsYXJlZCAiZmFyIjsKK2NvZGUgcG9pbnRlcnMgY2FuIGJlIGVpdGhlciBzaXplKS4gIFlvdSBtYXkgYmUgYWJsZSB0byB1c2Ugc21hbGwgbW9kZWwgdG8KK2NvbXBpbGUgY2pwZWcgb3IgZGpwZWcgYnkgaXRzZWxmLCBidXQgeW91IHdpbGwgcHJvYmFibHkgaGF2ZSB0byB1c2UgbWVkaXVtCittb2RlbCBmb3IgYW55IGxhcmdlciBhcHBsaWNhdGlvbi4gIFRoaXMgd29uJ3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UgaW4KK3BlcmZvcm1hbmNlLiAgWW91ICp3aWxsKiB0YWtlIGEgbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBoaXQgaWYgeW91IHVzZSBhCitsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCwgYW5kIHlvdSBzaG91bGQgYXZvaWQgImh1Z2UiIG1vZGVsIGlmIGF0IGFsbAorcG9zc2libGUuICBCZSBzdXJlIHRoYXQgTkVFRF9GQVJfUE9JTlRFUlMgaXMgZGVmaW5lZCBpbiBqY29uZmlnLmggaWYgeW91IHVzZQorYSBzbWFsbC1kYXRhIG1lbW9yeSBtb2RlbDsgYmUgc3VyZSBpdCBpcyBOT1QgZGVmaW5lZCBpZiB5b3UgdXNlIGEgbGFyZ2UtZGF0YQorbW9kZWwuICAoVGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBhbmQgamNvbmZpZyBmaWxlcyBmb3IgQm9ybGFuZCBhbmQgTWljcm9zb2Z0IEMKK2NvbXBpbGUgaW4gbWVkaXVtIG1vZGVsIGFuZCBkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMuKQorCitUaGUgRE9TLXNwZWNpZmljIG1lbW9yeSBtYW5hZ2VyLCBqbWVtZG9zLmMsIHNob3VsZCBiZSB1c2VkIGlmIHBvc3NpYmxlLgorSXQgbmVlZHMgc29tZSBhc3NlbWJseS1jb2RlIHJvdXRpbmVzIHdoaWNoIGFyZSBpbiBqbWVtZG9zYS5hc207IG1ha2Ugc3VyZQoreW91ciBtYWtlZmlsZSBhc3NlbWJsZXMgdGhhdCBmaWxlIGFuZCBpbmNsdWRlcyBpdCBpbiB0aGUgbGlicmFyeS4gIElmIHlvdQorZG9uJ3QgaGF2ZSBhIHN1aXRhYmxlIGFzc2VtYmxlciwgeW91IGNhbiBnZXQgcHJlLWFzc2VtYmxlZCBvYmplY3QgZmlsZXMgZm9yCitqbWVtZG9zYSBieSBGVFAgZnJvbSBmdHAudXUubmV0Oi9ncmFwaGljcy9qcGVnL2pkb3Nhb2JqLnppcC4gIChET1Mtb3JpZW50ZWQKK2Rpc3RyaWJ1dGlvbnMgb2YgdGhlIElKRyBzb3VyY2UgY29kZSBvZnRlbiBpbmNsdWRlIHRoZXNlIG9iamVjdCBmaWxlcy4pCisKK1doZW4gdXNpbmcgam1lbWRvcy5jLCBqY29uZmlnLmggbXVzdCBkZWZpbmUgVVNFX01TRE9TX01FTU1HUiBhbmQgbXVzdCBzZXQKK01BWF9BTExPQ19DSFVOSyB0byBsZXNzIHRoYW4gNjRLICg2NTUyMEwgaXMgYSB0eXBpY2FsIHZhbHVlKS4gIElmIHlvdXIKK0MgbGlicmFyeSdzIGZhci1oZWFwIG1hbGxvYygpIGNhbid0IGFsbG9jYXRlIGJsb2NrcyB0aGF0IGxhcmdlLCByZWR1Y2UKK01BWF9BTExPQ19DSFVOSyB0byB3aGF0ZXZlciBpdCBjYW4gaGFuZGxlLgorCitJZiB5b3UgY2FuJ3QgdXNlIGptZW1kb3MuYyBmb3Igc29tZSByZWFzb24gLS0tIGZvciBleGFtcGxlLCBiZWNhdXNlIHlvdQorZG9uJ3QgaGF2ZSBhbiBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgam1lbWRvc2EuYXNtIC0tLSB5b3UnbGwgaGF2ZSB0byBmYWxsCitiYWNrIHRvIGptZW1hbnNpLmMgb3Igam1lbW5hbWUuYy4gIFlvdSdsbCBwcm9iYWJseSBzdGlsbCBuZWVkIHRvIHNldAorTUFYX0FMTE9DX0NIVU5LIGluIGpjb25maWcuaCwgYmVjYXVzZSBtb3N0IERPUyBDIGxpYnJhcmllcyB3b24ndCBtYWxsb2MoKQorbW9yZSB0aGFuIDY0SyBhdCBhIHRpbWUuICBJTVBPUlRBTlQ6IGlmIHlvdSB1c2Ugam1lbWFuc2kuYyBvciBqbWVtbmFtZS5jLAoreW91IHdpbGwgaGF2ZSB0byBjb21waWxlIGluIGEgbGFyZ2UtZGF0YSBtZW1vcnkgbW9kZWwgaW4gb3JkZXIgdG8gZ2V0IHRoZQorcmlnaHQgc3RkaW8gbGlicmFyeS4gIFRvbyBiYWQuCisKK3dyanBnY29tIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluIGxhcmdlIG1vZGVsLCBiZWNhdXNlIGl0IG1hbGxvYygpcyBhIDY0S0IKK3dvcmsgYXJlYSB0byBob2xkIHRoZSBjb21tZW50IHRleHQuICBJZiB5b3VyIEMgbGlicmFyeSdzIG1hbGxvYyBjYW4ndAoraGFuZGxlIHRoYXQsIHJlZHVjZSBNQVhfQ09NX0xFTkdUSCBhcyBuZWNlc3NhcnkgaW4gd3JqcGdjb20uYy4KKworTW9zdCBNUy1ET1MgY29tcGlsZXJzIHRyZWF0IHN0ZGluL3N0ZG91dCBhcyB0ZXh0IGZpbGVzLCBzbyB5b3UgbXVzdCB1c2UKK3R3by1maWxlIGNvbW1hbmQgbGluZSBzdHlsZS4gIEJ1dCBpZiB5b3VyIGNvbXBpbGVyIGhhcyBlaXRoZXIgZmRvcGVuKCkgb3IKK3NldG1vZGUoKSwgeW91IGNhbiB1c2Ugb25lLWZpbGUgc3R5bGUgaWYgeW91IGxpa2UuICBUbyBkbyB0aGlzLCBkZWZpbmUKK1VTRV9TRVRNT0RFIG9yIFVTRV9GRE9QRU4gc28gdGhhdCBzdGRpbi9zdGRvdXQgd2lsbCBiZSBzZXQgdG8gYmluYXJ5IG1vZGUuCisoVVNFX1NFVE1PREUgc2VlbXMgdG8gd29yayB3aXRoIG1vcmUgRE9TIGNvbXBpbGVycyB0aGFuIFVTRV9GRE9QRU4uKSAgWW91CitzaG91bGQgdGVzdCB0aGF0IEkvTyB0aHJvdWdoIHN0ZGluL3N0ZG91dCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHRzIGFzIEkvTwordG8gZXhwbGljaXRseSBuYW1lZCBmaWxlcy4uLiB0aGUgIm1ha2UgdGVzdCIgcHJvY2VkdXJlcyBpbiB0aGUgc3VwcGxpZWQKK21ha2VmaWxlcyBkbyBOT1QgdXNlIHN0ZGluL3N0ZG91dC4KKworCitNUy1ET1MsIGdlbmVyaWMgY29tbWVudHMgZm9yIDMyLWJpdCBjb21waWxlcnM6CisKK05vbmUgb2YgdGhlIGFib3ZlIGNvbW1lbnRzIGFib3V0IG1lbW9yeSBtb2RlbHMgYXBwbHkgaWYgeW91IGFyZSB1c2luZyBhCiszMi1iaXQgZmxhdC1tZW1vcnktc3BhY2UgZW52aXJvbm1lbnQsIHN1Y2ggYXMgREpHUFAgb3IgV2F0Y29tIEMuICAoQW5kIHlvdQorc2hvdWxkIHVzZSBvbmUgaWYgeW91IGhhdmUgaXQsIGFzIHBlcmZvcm1hbmNlIHdpbGwgYmUgbXVjaCBiZXR0ZXIgdGhhbgorODA4Ni1jb21wYXRpYmxlIGNvZGUhKSAgRm9yIGZsYXQtbWVtb3J5LXNwYWNlIGNvbXBpbGVycywgZG8gTk9UIGRlZmluZQorTkVFRF9GQVJfUE9JTlRFUlMsIGFuZCBkbyBOT1QgdXNlIGptZW1kb3MuYy4gIFVzZSBqbWVtbm9icy5jIGlmIHRoZQorZW52aXJvbm1lbnQgc3VwcGxpZXMgYWRlcXVhdGUgdmlydHVhbCBtZW1vcnksIG90aGVyd2lzZSB1c2Ugam1lbWFuc2kuYyBvcgoram1lbW5hbWUuYy4KKworWW91J2xsIHN0aWxsIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCBiaW5hcnkgSS9PIHRocm91Z2ggc3RkaW4vc3Rkb3V0LgorU2VlIHRoZSBsYXN0IHBhcmFncmFwaCBvZiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KKworCitNUy1ET1MsIEJvcmxhbmQgQzoKKworQmUgc3VyZSB0byBjb252ZXJ0IGFsbCB0aGUgc291cmNlIGZpbGVzIHRvIERPUyB0ZXh0IGZvcm1hdCAoQ1IvTEYgbmV3bGluZXMpLgorQWx0aG91Z2ggQm9ybGFuZCBDIHdpbGwgb2Z0ZW4gd29yayBPSyB3aXRoIHVubW9kaWZpZWQgVW5peCAoTEYgbmV3bGluZXMpCitzb3VyY2UgZmlsZXMsIHNvbWV0aW1lcyBpdCB3aWxsIGdpdmUgYm9ndXMgY29tcGlsZSBlcnJvcnMuCisiSWxsZWdhbCBjaGFyYWN0ZXIgJyMnIiBpcyB0aGUgbW9zdCBjb21tb24gc3VjaCBlcnJvci4gIChUaGlzIGlzIHRydWUgd2l0aAorQm9ybGFuZCBDIDMuMSwgYnV0IHBlcmhhcHMgaXMgZml4ZWQgaW4gbmV3ZXIgcmVsZWFzZXMuKQorCitJZiB5b3Ugd2FudCBvbmUtZmlsZSBjb21tYW5kIGxpbmUgc3R5bGUsIGp1c3QgdW5kZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUuCitqY29uZmlnLmJjYyBhbHJlYWR5IGluY2x1ZGVzICNkZWZpbmUgVVNFX1NFVE1PREUgdG8gbWFrZSB0aGlzIHdvcmsuCisoZmRvcGVuIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5LikKKworCitNUy1ET1MsIE1pY3Jvc29mdCBDOgorCittYWtlZmlsZS5tYzYgd29ya3Mgd2l0aCBNaWNyb3NvZnQgQywgRE9TIFZpc3VhbCBDKyssIGV0Yy4gIEl0IHNob3VsZCBvbmx5CitiZSB1c2VkIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgMTYtYml0IChzbWFsbCBvciBtZWRpdW0gbWVtb3J5IG1vZGVsKSBwcm9ncmFtLgorCitJZiB5b3Ugd2FudCBvbmUtZmlsZSBjb21tYW5kIGxpbmUgc3R5bGUsIGp1c3QgdW5kZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUuCitqY29uZmlnLm1jNiBhbHJlYWR5IGluY2x1ZGVzICNkZWZpbmUgVVNFX1NFVE1PREUgdG8gbWFrZSB0aGlzIHdvcmsuCisoZmRvcGVuIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5LikKKworTm90ZSB0aGF0IHRoaXMgbWFrZWZpbGUgYXNzdW1lcyB0aGF0IHRoZSB3b3JraW5nIGNvcHkgb2YgaXRzZWxmIGlzIGNhbGxlZAorIm1ha2VmaWxlIi4gIElmIHlvdSB3YW50IHRvIGNhbGwgaXQgc29tZXRoaW5nIGVsc2UsIHNheSAibWFrZWZpbGUubWFrIiwKK2JlIHN1cmUgdG8gYWRqdXN0IHRoZSBkZXBlbmRlbmN5IGxpbmUgdGhhdCByZWFkcyAiJChSRklMRSkgOiBtYWtlZmlsZSIuCitPdGhlcndpc2UgdGhlIG1ha2Ugd2lsbCBmYWlsIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBjcmVhdGUgIm1ha2VmaWxlIi4KK1dvcnNlLCBzb21lIHJlbGVhc2VzIG9mIE1pY3Jvc29mdCdzIG1ha2UgdXRpbGl0aWVzIGdpdmUgYW4gaW5jb3JyZWN0IGVycm9yCittZXNzYWdlIGluIHRoaXMgc2l0dWF0aW9uLgorCitPbGQgdmVyc2lvbnMgb2YgTVMgQyBmYWlsIHdpdGggYW4gIm91dCBvZiBtYWNybyBleHBhbnNpb24gc3BhY2UiIGVycm9yCitiZWNhdXNlIHRoZXkgY2FuJ3QgY29wZSB3aXRoIHRoZSBtYWNybyBUUkFDRU1TOCAoZGVmaW5lZCBpbiBqZXJyb3IuaCkuCitJZiB0aGlzIGhhcHBlbnMgdG8geW91LCB0aGUgZWFzaWVzdCBzb2x1dGlvbiBpcyB0byBjaGFuZ2UgVFJBQ0VNUzggdG8KK2V4cGFuZCB0byBub3RoaW5nLiAgWW91J2xsIGxvc2UgdGhlIGFiaWxpdHkgdG8gZHVtcCBvdXQgSlBFRyBjb2VmZmljaWVudAordGFibGVzIHdpdGggZGpwZWcgLWRlYnVnIC1kZWJ1ZywgYnV0IGF0IGxlYXN0IHlvdSBjYW4gY29tcGlsZS4KKworT3JpZ2luYWwgTVMgQyA2LjAgaXMgdmVyeSBidWdneTsgaXQgY29tcGlsZXMgaW5jb3JyZWN0IGNvZGUgdW5sZXNzIHlvdSB0dXJuCitvZmYgb3B0aW1pemF0aW9uIGVudGlyZWx5IChyZW1vdmUgLU8gZnJvbSBDRkxBR1MpLiAgNi4wMEEgaXMgYmV0dGVyLCBidXQgaXQKK3N0aWxsIGdlbmVyYXRlcyBiYWQgY29kZSBpZiB5b3UgZW5hYmxlIGxvb3Agb3B0aW1pemF0aW9ucyAoLU9sIG9yIC1PeCkuCisKK01TIEMgOC4wIGNyYXNoZXMgd2hlbiBjb21waWxpbmcganF1YW50MS5jIHdpdGggb3B0aW1pemF0aW9uIHN3aXRjaCAvT28gLi4uCit3aGljaCBpcyBvbiBieSBkZWZhdWx0LiAgVG8gd29yayBhcm91bmQgdGhpcyBidWcsIGNvbXBpbGUgdGhhdCBvbmUgZmlsZQord2l0aCAvT28tLgorCisKK01pY3Jvc29mdCBXaW5kb3dzIChhbGwgdmVyc2lvbnMpLCBnZW5lcmljIGNvbW1lbnRzOgorCitTb21lIFdpbmRvd3Mgc3lzdGVtIGluY2x1ZGUgZmlsZXMgZGVmaW5lIHR5cGVkZWYgYm9vbGVhbiBhcyAidW5zaWduZWQgY2hhciIuCitUaGUgSUpHIGNvZGUgYWxzbyBkZWZpbmVzIHR5cGVkZWYgYm9vbGVhbiwgYnV0IHdlIG1ha2UgaXQgImludCIgYnkgZGVmYXVsdC4KK1RoaXMgZG9lc24ndCBhZmZlY3QgdGhlIElKRyBwcm9ncmFtcyBiZWNhdXNlIHdlIGRvbid0IGltcG9ydCB0aG9zZSBXaW5kb3dzCitpbmNsdWRlIGZpbGVzLiAgQnV0IGlmIHlvdSB1c2UgdGhlIEpQRUcgbGlicmFyeSBpbiB5b3VyIG93biBwcm9ncmFtLCBhbmQgc29tZQorb2YgeW91ciBwcm9ncmFtJ3MgZmlsZXMgaW1wb3J0IG9uZSBkZWZpbml0aW9uIG9mIGJvb2xlYW4gd2hpbGUgc29tZSBpbXBvcnQgdGhlCitvdGhlciwgeW91IGNhbiBnZXQgYWxsIHNvcnRzIG9mIG15c3RlcmlvdXMgcHJvYmxlbXMuICBBIGdvb2QgcHJldmVudGl2ZSBzdGVwCitpcyB0byBtYWtlIHRoZSBJSkcgbGlicmFyeSB1c2UgInVuc2lnbmVkIGNoYXIiIGZvciBib29sZWFuLiAgVG8gZG8gdGhhdCwKK2FkZCBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHlvdXIgamNvbmZpZy5oIGZpbGU6CisJLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KKwkjaWZuZGVmIF9fUlBDTkRSX0hfXwkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KKwl0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKKwkjZW5kaWYKKwkjZGVmaW5lIEhBVkVfQk9PTEVBTgkvKiBwcmV2ZW50IGptb3JlY2ZnLmggZnJvbSByZWRlZmluaW5nIGl0ICovCisoVGhpcyBpcyBhbHJlYWR5IGluIGpjb25maWcudmMsIGJ5IHRoZSB3YXkuKQorCit3aW5kZWYuaCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zCisJI2RlZmluZSBmYXIKKwkjZGVmaW5lIEZBUiBmYXIKK1NpbmNlIGptb3JlY2ZnLmggdHJpZXMgdG8gZGVmaW5lIEZBUiBhcyBlbXB0eSwgeW91IG1heSBnZXQgYSBjb21waWxlcgord2FybmluZyBpZiB5b3UgaW5jbHVkZSBib3RoIGpwZWdsaWIuaCBhbmQgd2luZGVmLmggKHdoaWNoIHdpbmRvd3MuaAoraW5jbHVkZXMpLiAgVG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcsIHlvdSBjYW4gcHV0ICIjaWZuZGVmIEZBUiIvIiNlbmRpZiIKK2Fyb3VuZCB0aGUgbGluZSAiI2RlZmluZSBGQVIiIGluIGptb3JlY2ZnLmguCisKK1doZW4gdXNpbmcgdGhlIGxpYnJhcnkgaW4gYSBXaW5kb3dzIGFwcGxpY2F0aW9uLCB5b3Ugd2lsbCBhbG1vc3QgY2VydGFpbmx5Cit3YW50IHRvIG1vZGlmeSBvciByZXBsYWNlIHRoZSBlcnJvciBoYW5kbGVyIG1vZHVsZSBqZXJyb3IuYywgc2luY2Ugb3VyCitkZWZhdWx0IGVycm9yIGhhbmRsZXIgZG9lcyBhIGNvdXBsZSBvZiBpbmFwcHJvcHJpYXRlIHRoaW5nczoKKyAgMS4gaXQgdHJpZXMgdG8gd3JpdGUgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgb24gc3RkZXJyOworICAyLiBpbiBldmVudCBvZiBhIGZhdGFsIGVycm9yLCBpdCBleGl0cyBieSBjYWxsaW5nIGV4aXQoKS4KKworQSBzaW1wbGUgc3RvcGdhcCBzb2x1dGlvbiBmb3IgcHJvYmxlbSAxIGlzIHRvIHJlcGxhY2UgdGhlIGxpbmUKKwlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBidWZmZXIpOworKGluIG91dHB1dF9tZXNzYWdlIGluIGplcnJvci5jKSB3aXRoCisJTWVzc2FnZUJveChHZXRBY3RpdmVXaW5kb3coKSxidWZmZXIsIkpQRUcgRXJyb3IiLE1CX09LfE1CX0lDT05FUlJPUik7CitJdCdzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhdCBsZWFzdCBkbyB0aGF0IG11Y2gsIHNpbmNlIG90aGVyd2lzZQorZXJyb3IgbWVzc2FnZXMgd2lsbCBkaXNhcHBlYXIgaW50byBub3doZXJlLiAgKEJlZ2lubmluZyB3aXRoIElKRyB2NmIsIHRoaXMKK2NvZGUgaXMgYWxyZWFkeSBwcmVzZW50IGluIGplcnJvci5jOyBqdXN0IGRlZmluZSBVU0VfV0lORE9XU19NRVNTQUdFQk9YIGluCitqY29uZmlnLmggdG8gZW5hYmxlIGl0LikKKworVGhlIHByb3BlciBzb2x1dGlvbiBmb3IgcHJvYmxlbSAyIGlzIHRvIHJldHVybiBjb250cm9sIHRvIHlvdXIgY2FsbGluZworYXBwbGljYXRpb24gYWZ0ZXIgYSBsaWJyYXJ5IGVycm9yLiAgVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzZXRqbXAvbG9uZ2ptcAordGVjaG5pcXVlIGRpc2N1c3NlZCBpbiBsaWJqcGVnLmRvYyBhbmQgaWxsdXN0cmF0ZWQgaW4gZXhhbXBsZS5jLiAgKE5PVEU6Citzb21lIG9sZGVyIFdpbmRvd3MgQyBjb21waWxlcnMgcHJvdmlkZSB2ZXJzaW9ucyBvZiBzZXRqbXAvbG9uZ2ptcCB0aGF0Citkb24ndCBhY3R1YWxseSB3b3JrIHVuZGVyIFdpbmRvd3MuICBZb3UgbWF5IG5lZWQgdG8gdXNlIHRoZSBXaW5kb3dzIHN5c3RlbQorZnVuY3Rpb25zIENhdGNoIGFuZCBUaHJvdyBpbnN0ZWFkLikKKworVGhlIHJlY29tbWVuZGVkIG1lbW9yeSBtYW5hZ2VyIHVuZGVyIFdpbmRvd3MgaXMgam1lbW5vYnMuYzsgaW4gb3RoZXIgd29yZHMsCitsZXQgV2luZG93cyBkbyBhbnkgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCBuZWVkZWQuICBZb3Ugc2hvdWxkIE5PVCB1c2UKK2ptZW1kb3MuYyBub3Igam1lbWRvc2EuYXNtIHVuZGVyIFdpbmRvd3MuCisKK0ZvciBXaW5kb3dzIDMuMSwgd2UgcmVjb21tZW5kIGNvbXBpbGluZyBpbiBtZWRpdW0gb3IgbGFyZ2UgbWVtb3J5IG1vZGVsOworZm9yIG5ld2VyIFdpbmRvd3MgdmVyc2lvbnMsIHVzZSBhIDMyLWJpdCBmbGF0IG1lbW9yeSBtb2RlbC4gIChTZWUgdGhlIE1TLURPUworc2VjdGlvbnMgYWJvdmUgZm9yIG1vcmUgaW5mbyBhYm91dCBtZW1vcnkgbW9kZWxzLikgIEluIHRoZSAxNi1iaXQgbWVtb3J5Cittb2RlbHMgb25seSwgeW91J2xsIG5lZWQgdG8gcHV0CisJI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMCS8qIE1heGltdW0gcmVxdWVzdCB0byBtYWxsb2MoKSAqLworaW50byBqY29uZmlnLmggdG8gbGltaXQgYWxsb2NhdGlvbiBjaHVua3MgdG8gNjRLYi4gIChXaXRob3V0IHRoYXQsIHlvdSdkCitoYXZlIHRvIHVzZSBodWdlIG1lbW9yeSBtb2RlbCwgd2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gdW5uZWNlc3NhcmlseS4pCitqbWVtbm9icy5jIHdvcmtzIHdpdGhvdXQgbW9kaWZpY2F0aW9uIGluIGxhcmdlIG9yIGZsYXQgbWVtb3J5IG1vZGVscywgYnV0IHRvCit1c2UgbWVkaXVtIG1vZGVsLCB5b3UgbmVlZCB0byBtb2RpZnkgaXRzIGpwZWdfZ2V0X2xhcmdlIGFuZCBqcGVnX2ZyZWVfbGFyZ2UKK3JvdXRpbmVzIHRvIGFsbG9jYXRlIGZhciBtZW1vcnkuICBJbiBhbnkgY2FzZSwgeW91IG1pZ2h0IGxpa2UgdG8gcmVwbGFjZQoraXRzIGNhbGxzIHRvIG1hbGxvYyBhbmQgZnJlZSB3aXRoIGRpcmVjdCBjYWxscyBvbiBXaW5kb3dzIG1lbW9yeSBhbGxvY2F0aW9uCitmdW5jdGlvbnMuCisKK1lvdSBtYXkgYWxzbyB3YW50IHRvIG1vZGlmeSBqZGF0YXNyYy5jIGFuZCBqZGF0YWRzdC5jIHRvIHVzZSBXaW5kb3dzIGZpbGUKK29wZXJhdGlvbnMgcmF0aGVyIHRoYW4gZnJlYWQvZndyaXRlLiAgVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3VyIEMKK2NvbXBpbGVyIGRvZXNuJ3QgcHJvdmlkZSBhIGNvbXBldGVudCBpbXBsZW1lbnRhdGlvbiBvZiBDIHN0ZGlvIGZ1bmN0aW9ucy4KKworWW91IG1pZ2h0IHdhbnQgdG8gdHdlYWsgdGhlIFJHQl94eHggbWFjcm9zIGluIGptb3JlY2ZnLmggc28gdGhhdCB0aGUgbGlicmFyeQord2lsbCBhY2NlcHQgb3IgZGVsaXZlciBjb2xvciBwaXhlbHMgaW4gQkdSIHNhbXBsZSBvcmRlciwgbm90IFJHQjsgQkdSIG9yZGVyCitpcyB1c3VhbGx5IG1vcmUgY29udmVuaWVudCB1bmRlciBXaW5kb3dzLiAgTm90ZSB0aGF0IHRoaXMgY2hhbmdlIHdpbGwgYnJlYWsKK3RoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnLCBidXQgdGhlIGxpYnJhcnkgaXRzZWxmIHdvcmtzIGZpbmUuCisKKworTWFueSBwZW9wbGUgd2FudCB0byBjb252ZXJ0IHRoZSBJSkcgbGlicmFyeSBpbnRvIGEgRExMLiAgVGhpcyBpcyByZWFzb25hYmx5CitzdHJhaWdodGZvcndhcmQsIGJ1dCB3YXRjaCBvdXQgZm9yIHRoZSBmb2xsb3dpbmc6CisKKyAgMS4gRG9uJ3QgdHJ5IHRvIGNvbXBpbGUgYXMgYSBETEwgaW4gc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbDsgdXNlCitsYXJnZSBtb2RlbCwgb3IgZXZlbiBiZXR0ZXIsIDMyLWJpdCBmbGF0IG1vZGVsLiAgTWFueSBwbGFjZXMgaW4gdGhlIElKRyBjb2RlCithc3N1bWUgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhbCB2YXJpYWJsZSBpcyBhbiBvcmRpbmFyeSAobm90IEZBUikgcG9pbnRlcjsKK3RoYXQgaXNuJ3QgdHJ1ZSBpbiBhIG1lZGl1bS1tb2RlbCBETEwuCisKKyAgMi4gTWljcm9zb2Z0IEMgY2Fubm90IHBhc3MgZmlsZSBwb2ludGVycyBiZXR3ZWVuIGFwcGxpY2F0aW9ucyBhbmQgRExMcy4KKyhTZWUgTWljcm9zb2Z0IEtub3dsZWRnZSBCYXNlLCBQU1MgSUQgTnVtYmVyIFE1MDMzNi4pICBTbyBqZGF0YXNyYy5jIGFuZAoramRhdGFkc3QuYyBkb24ndCB3b3JrIGlmIHlvdSBvcGVuIGEgZmlsZSBpbiB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGVuIHBhc3MKK3RoZSBwb2ludGVyIHRvIHRoZSBETEwuICBPbmUgd29ya2Fyb3VuZCBpcyB0byBtYWtlIGpkYXRhc3JjLmMvamRhdGFkc3QuYworcGFydCBvZiB5b3VyIG1haW4gYXBwbGljYXRpb24gcmF0aGVyIHRoYW4gcGFydCBvZiB0aGUgRExMLgorCisgIDMuIFlvdSdsbCBwcm9iYWJseSBuZWVkIHRvIG1vZGlmeSB0aGUgbWFjcm9zIEdMT0JBTCgpIGFuZCBFWFRFUk4oKSB0bworYXR0YWNoIHN1aXRhYmxlIGxpbmthZ2Uga2V5d29yZHMgdG8gdGhlIGV4cG9ydGVkIHJvdXRpbmUgbmFtZXMuICBTaW1pbGFybHksCit5b3UnbGwgd2FudCB0byBtb2RpZnkgTUVUSE9EREVGKCkgYW5kIEpNRVRIT0QoKSB0byBlbnN1cmUgZnVuY3Rpb24gcG9pbnRlcnMKK2FyZSBkZWNsYXJlZCBpbiBhIHdheSB0aGF0IGxldHMgYXBwbGljYXRpb24gcm91dGluZXMgYmUgY2FsbGVkIGJhY2sgdGhyb3VnaAordGhlIGZ1bmN0aW9uIHBvaW50ZXJzLiAgVGhlc2UgbWFjcm9zIGFyZSBpbiBqbW9yZWNmZy5oLiAgVHlwaWNhbCBkZWZpbml0aW9ucworZm9yIGEgMTYtYml0IERMTCBhcmU6CisJI2RlZmluZSBHTE9CQUwodHlwZSkJCXR5cGUgX2ZhciBfcGFzY2FsIF9sb2FkZHMgX2V4cG9ydAorCSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gdHlwZSBfZmFyIF9wYXNjYWwgX2xvYWRkcworCSNkZWZpbmUgTUVUSE9EREVGKHR5cGUpCQlzdGF0aWMgdHlwZSBfZmFyIF9wYXNjYWwKKwkjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICBcCisJCXR5cGUgKF9mYXIgX3Bhc2NhbCAqbWV0aG9kbmFtZSkgYXJnbGlzdAorRm9yIGEgMzItYml0IERMTCB5b3UgbWF5IHdhbnQgc29tZXRoaW5nIGxpa2UKKwkjZGVmaW5lIEdMT0JBTCh0eXBlKQkJX19kZWNsc3BlYyhkbGxleHBvcnQpIHR5cGUKKwkjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlCitBbHRob3VnaCBub3QgYWxsIHRoZSBHTE9CQUwgcm91dGluZXMgYXJlIGFjdHVhbGx5IGludGVuZGVkIHRvIGJlIGNhbGxlZCBieQordGhlIGFwcGxpY2F0aW9uLCB0aGUgcGVyZm9ybWFuY2UgY29zdCBvZiBtYWtpbmcgdGhlbSBhbGwgRExMIGVudHJ5IHBvaW50cyBpcworbmVnbGlnaWJsZS4KKworVGhlIHVubW9kaWZpZWQgSUpHIGxpYnJhcnkgcHJlc2VudHMgYSB2ZXJ5IEMtc3BlY2lmaWMgYXBwbGljYXRpb24gaW50ZXJmYWNlLAorc28gdGhlIHJlc3VsdGluZyBETEwgaXMgb25seSB1c2FibGUgZnJvbSBDIG9yIEMrKyBhcHBsaWNhdGlvbnMuICBUaGVyZSBoYXMKK2JlZW4gc29tZSB0YWxrIG9mIHdyaXRpbmcgd3JhcHBlciBjb2RlIHRoYXQgd291bGQgcHJlc2VudCBhIHNpbXBsZXIgaW50ZXJmYWNlCit1c2FibGUgZnJvbSBvdGhlciBsYW5ndWFnZXMsIHN1Y2ggYXMgVmlzdWFsIEJhc2ljLiAgVGhpcyBpcyBvbiBvdXIgdG8tZG8gbGlzdAorYnV0IGhhc24ndCBiZWVuIHZlcnkgaGlnaCBwcmlvcml0eSAtLS0gYW55IHZvbHVudGVlcnMgb3V0IHRoZXJlPworCisKK01pY3Jvc29mdCBXaW5kb3dzLCBCb3JsYW5kIEM6CisKK1RoZSBwcm92aWRlZCBqY29uZmlnLmJjYyBzaG91bGQgd29yayBPSyBpbiBhIDMyLWJpdCBXaW5kb3dzIGVudmlyb25tZW50LAorYnV0IHlvdSdsbCBuZWVkIHRvIHR3ZWFrIGl0IGluIGEgMTYtYml0IGVudmlyb25tZW50ICh5b3UnZCBuZWVkIHRvIGRlZmluZQorTkVFRF9GQVJfUE9JTlRFUlMgYW5kIE1BWF9BTExPQ19DSFVOSykuICBCZXdhcmUgdGhhdCBtYWtlZmlsZS5iY2Mgd2lsbCBuZWVkCithbHRlcmF0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBpdCBmb3IgV2luZG93cyAtLS0gaW4gcGFydGljdWxhciwgeW91IHNob3VsZAordXNlIGptZW1ub2JzLmMgbm90IGptZW1kb3MuYyB1bmRlciBXaW5kb3dzLgorCitCb3JsYW5kIEMrKyA0LjUgZmFpbHMgd2l0aCBhbiBpbnRlcm5hbCBjb21waWxlciBlcnJvciB3aGVuIHRyeWluZyB0byBjb21waWxlCitqZG1lcmdlLmMgaW4gMzItYml0IG1vZGUuICBJZiBlbm91Z2ggcGVvcGxlIGNvbXBsYWluLCBwZXJoYXBzIEJvcmxhbmQgd2lsbCBmaXgKK2l0LiAgSW4gdGhlIG1lYW50aW1lLCB0aGUgc2ltcGxlc3Qga25vd24gd29ya2Fyb3VuZCBpcyB0byBhZGQgYSByZWR1bmRhbnQKK2RlZmluaXRpb24gb2YgdGhlIHZhcmlhYmxlIHJhbmdlX2xpbWl0IGluIGgydjFfbWVyZ2VkX3Vwc2FtcGxlKCksIGF0IHRoZSBoZWFkCitvZiB0aGUgYmxvY2sgdGhhdCBoYW5kbGVzIG9kZCBpbWFnZSB3aWR0aCAoYWJvdXQgbGluZSAyNjggaW4gdjYgamRtZXJnZS5jKToKKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsgLyogQUREIFRISVMgKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CitQcmV0dHkgYml6YXJyZSwgZXNwZWNpYWxseSBzaW5jZSB0aGUgdmVyeSBzaW1pbGFyIHJvdXRpbmUgaDJ2Ml9tZXJnZWRfdXBzYW1wbGUKK2RvZXNuJ3QgdHJpZ2dlciB0aGUgYnVnLgorUmVjZW50IHJlcG9ydHMgc3VnZ2VzdCB0aGF0IHRoaXMgYnVnIGRvZXMgbm90IG9jY3VyIHdpdGggImJjYzMyYSIgKHRoZQorUGVudGl1bS1vcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIpLgorCitBbm90aGVyIHJlcG9ydCBmcm9tIGEgdXNlciBvZiBCb3JsYW5kIEMgNC41IHdhcyB0aGF0IGluY29ycmVjdCBjb2RlIChsZWFkaW5nCit0byBhIGNvbG9yIHNoaWZ0IGluIHByb2Nlc3NlZCBpbWFnZXMpIHdhcyBwcm9kdWNlZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZworb3B0aW1pemF0aW9uIHN3aXRjaCBjb21iaW5hdGlvbnMgd2VyZSB1c2VkOiAKKwktT3QgLU9nCisJLU90IC1PcAorCS1PdCAtT20KK1NvIHRyeSBiYWNraW5nIG9mZiBvbiBvcHRpbWl6YXRpb24gaWYgeW91IHNlZSBzdWNoIGEgcHJvYmxlbS4gIChBcmUgdGhlcmUKK3NldmVyYWwgZGlmZmVyZW50IHJlbGVhc2VzIGFsbCBudW1iZXJlZCAiNC41Ij8/KQorCisKK01pY3Jvc29mdCBXaW5kb3dzLCBNaWNyb3NvZnQgVmlzdWFsIEMrKzoKKworamNvbmZpZy52YyBzaG91bGQgd29yayBPSyB3aXRoIGFueSBNaWNyb3NvZnQgY29tcGlsZXIgZm9yIGEgMzItYml0IG1lbW9yeQorbW9kZWwuICBtYWtlZmlsZS52YyBpcyBpbnRlbmRlZCBmb3IgY29tbWFuZC1saW5lIHVzZS4gIChJZiB5b3UgYXJlIHVzaW5nCit0aGUgRGV2ZWxvcGVyIFN0dWRpbyBlbnZpcm9ubWVudCwgeW91IG1heSBwcmVmZXIgdGhlIERldlN0dWRpbyBwcm9qZWN0CitmaWxlczsgc2VlIGJlbG93LikKKworU29tZSB1c2VycyBmZWVsIHRoYXQgaXQncyBlYXNpZXIgdG8gY2FsbCB0aGUgbGlicmFyeSBmcm9tIEMrKyBjb2RlIGlmIHlvdQorZm9yY2UgVkMrKyB0byB0cmVhdCB0aGUgbGlicmFyeSBhcyBDKysgY29kZSwgd2hpY2ggeW91IGNhbiBkbyBieSByZW5hbWluZworYWxsIHRoZSAqLmMgZmlsZXMgdG8gKi5jcHAgKGFuZCBhZGp1c3RpbmcgdGhlIG1ha2VmaWxlIHRvIG1hdGNoKS4gIFRoaXMKK2F2b2lkcyB0aGUgbmVlZCB0byBwdXQgZXh0ZXJuICJDIiB7IC4uLiB9IGFyb3VuZCAjaW5jbHVkZSAianBlZ2xpYi5oIiBpbgoreW91ciBDKysgYXBwbGljYXRpb24uCisKKworTWljcm9zb2Z0IFdpbmRvd3MsIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvOgorCitXZSBpbmNsdWRlIG1ha2VmaWxlcyB0aGF0IHNob3VsZCB3b3JrIGFzIHByb2plY3QgZmlsZXMgaW4gRGV2U3R1ZGlvIDQuMiBvcgorbGF0ZXIuICBUaGVyZSBpcyBhIGxpYnJhcnkgbWFrZWZpbGUgdGhhdCBidWlsZHMgdGhlIElKRyBsaWJyYXJ5IGFzIGEgc3RhdGljCitXaW4zMiBsaWJyYXJ5LCBhbmQgYW4gYXBwbGljYXRpb24gbWFrZWZpbGUgdGhhdCBidWlsZHMgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMKK2FzIFdpbjMyIGNvbnNvbGUgYXBwbGljYXRpb25zLiAgKEV2ZW4gaWYgeW91IG9ubHkgd2FudCB0aGUgbGlicmFyeSwgd2UKK3JlY29tbWVuZCBidWlsZGluZyB0aGUgYXBwbGljYXRpb25zIHNvIHRoYXQgeW91IGNhbiBydW4gdGhlIHNlbGYtdGVzdC4pCisKK1RvIHVzZToKKzEuIENvcHkgamNvbmZpZy52YyB0byBqY29uZmlnLmgsIG1ha2VsaWIuZHMgdG8ganBlZy5tYWssIGFuZAorICAgbWFrZWFwcHMuZHMgdG8gYXBwcy5tYWsuICAoTm90ZSB0aGF0IHRoZSByZW5hbWluZyBpcyBjcml0aWNhbCEpCisyLiBDbGljayBvbiB0aGUgLm1hayBmaWxlcyB0byBjb25zdHJ1Y3QgcHJvamVjdCB3b3Jrc3BhY2VzLgorICAgKElmIHlvdSBhcmUgdXNpbmcgRGV2U3R1ZGlvIG1vcmUgcmVjZW50IHRoYW4gNC4yLCB5b3UnbGwgcHJvYmFibHkKKyAgIGdldCBhIG1lc3NhZ2Ugc2F5aW5nIHRoYXQgdGhlIG1ha2VmaWxlcyBhcmUgYmVpbmcgdXBkYXRlZC4pCiszLiBCdWlsZCB0aGUgbGlicmFyeSBwcm9qZWN0LCB0aGVuIHRoZSBhcHBsaWNhdGlvbnMgcHJvamVjdC4KKzQuIE1vdmUgdGhlIGFwcGxpY2F0aW9uIC5leGUgZmlsZXMgZnJvbSBgYXBwYFxSZWxlYXNlIHRvIGFuCisgICBhcHByb3ByaWF0ZSBsb2NhdGlvbiBvbiB5b3VyIHBhdGguCis1LiBUbyBwZXJmb3JtIHRoZSBzZWxmLXRlc3QsIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZQorCU5NQUtFIC9mIG1ha2VmaWxlLnZjICB0ZXN0CisKKworT1MvMiwgQm9ybGFuZCBDKys6CisKK1dhdGNoIG91dCBmb3Igb3B0aW1pemF0aW9uIGJ1Z3MgaW4gb2xkZXIgQm9ybGFuZCBjb21waWxlcnM7IHlvdSBtYXkgbmVlZAordG8gYmFjayBvZmYgdGhlIG9wdGltaXphdGlvbiBzd2l0Y2ggc2V0dGluZ3MuICBTZWUgdGhlIGNvbW1lbnRzIGluCittYWtlZmlsZS5iY2MuCisKKworU0dJOgorCitPbiBzb21lIFNHSSBzeXN0ZW1zLCB5b3UgbWF5IG5lZWQgdG8gc2V0ICJBUjI9IGFyIC10cyIgaW4gdGhlIE1ha2VmaWxlLgorSWYgeW91IGFyZSB1c2luZyBjb25maWd1cmUsIHlvdSBjYW4gZG8gdGhpcyBieSBzYXlpbmcKKwkuL2NvbmZpZ3VyZSBSQU5MSUI9J2FyIC10cycKK1RoaXMgY2hhbmdlIGlzIG5vdCBuZWVkZWQgb24gYWxsIFNHSXMuICBVc2UgaXQgb25seSBpZiB0aGUgbWFrZSBmYWlscyBhdCB0aGUKK3N0YWdlIG9mIGxpbmtpbmcgdGhlIGNvbXBsZXRlZCBwcm9ncmFtcy4KKworT24gdGhlIE1JUFMgUjQwMDAgYXJjaGl0ZWN0dXJlIChJbmR5LCBldGMuKSwgdGhlIGNvbXBpbGVyIG9wdGlvbiAiLW1pcHMyIgorcmVwb3J0ZWRseSBzcGVlZHMgdXAgdGhlIGZsb2F0IERDVCBtZXRob2Qgc3Vic3RhbnRpYWxseSwgZW5vdWdoIHRvIG1ha2UgaXQKK2Zhc3RlciB0aGFuIHRoZSBkZWZhdWx0IGludCBtZXRob2QgKGJ1dCBzdGlsbCBzbG93ZXIgdGhhbiB0aGUgZmFzdCBpbnQKK21ldGhvZCkuICBJZiB5b3UgdXNlIC1taXBzMiwgeW91IG1heSB3YW50IHRvIGFsdGVyIHRoZSBkZWZhdWx0IERDVCBtZXRob2QgdG8KK2JlIGZsb2F0LiAgVG8gZG8gdGhpcywgcHV0ICIjZGVmaW5lIEpEQ1RfREVGQVVMVCBKRENUX0ZMT0FUIiBpbiBqY29uZmlnLmguCisKKworVk1TOgorCitPbiBhbiBBbHBoYS9WTVMgc3lzdGVtIHdpdGggTU1TLCBiZSBzdXJlIHRvIHVzZSB0aGUgIi9NYXJjbz1BbHBoYT0xIgorcXVhbGlmaWVyIHdpdGggTU1TIHdoZW4gYnVpbGRpbmcgdGhlIEpQRUcgcGFja2FnZS4KKworVkFYL1ZNUyB2NS41LTEgbWF5IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdCBzdGVwIG9mIHRoZSBidWlsZCBwcm9jZWR1cmUKK3JlcG9ydGluZyBkaWZmZXJlbmNlcyB3aGVuIGl0IGNvbXBhcmVzIHRoZSBvcmlnaW5hbCBhbmQgdGVzdCBpbWFnZXMuICBJZiB0aGUKK2Vycm9yIHBvaW50cyB0byB0aGUgbGFzdCBibG9jayBvZiB0aGUgZmlsZXMsIGl0IGlzIG1vc3QgbGlrZWx5IGJvZ3VzIGFuZCBtYXkKK2JlIHNhZmVseSBpZ25vcmVkLiAgSXQgc2VlbXMgdG8gYmUgYmVjYXVzZSB0aGUgZmlsZXMgYXJlIFN0cmVhbV9MRiBhbmQKK0JhY2t1cC9Db21wYXJlIGhhcyBkaWZmaWN1bHR5IHdpdGggdGhlIChwcmVzdW1hYmx5KSBudWxsIHBhZGRlZCBmaWxlcy4KK1RoaXMgcHJvYmxlbSB3YXMgbm90IG9ic2VydmVkIG9uIFZBWC9WTVMgdjYuMSBvciBBWFAvVk1TIHY2LjEuCmRpZmYgLS1naXQgYS9qY2FwaW1pbi5jIGIvamNhcGltaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZiOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvamNhcGltaW4uYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIGpjYXBpbWluLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKKyAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJtaW5pbXVtIiBBUEkgcm91dGluZXMgdGhhdCBtYXkgYmUKKyAqIG5lZWRlZCBpbiBlaXRoZXIgdGhlIG5vcm1hbCBmdWxsLWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlIHRyYW5zY29kaW5nLW9ubHkKKyAqIGNhc2UuCisgKgorICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpjYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNwYXJhbS5jIGZvcgorICogcGFyYW1ldGVyLXNldHVwIGhlbHBlciByb3V0aW5lcywgamNvbWFwaS5jIGZvciByb3V0aW5lcyBzaGFyZWQgYnkKKyAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamN0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcgY2FzZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIEluaXRpYWxpemF0aW9uIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCisgKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfQ3JlYXRlQ29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpCit7CisgIGludCBpOworCisgIC8qIEd1YXJkIGFnYWluc3QgdmVyc2lvbiBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGVyLiAqLworICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIHNvIGpwZWdfZGVzdHJveSBrbm93cyBtZW0gbWdyIG5vdCBjYWxsZWQgKi8KKyAgaWYgKHZlcnNpb24gIT0gSlBFR19MSUJfVkVSU0lPTikKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfTElCX1ZFUlNJT04sIEpQRUdfTElCX1ZFUlNJT04sIHZlcnNpb24pOworICBpZiAoc3RydWN0c2l6ZSAhPSBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAorCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCksIChpbnQpIHN0cnVjdHNpemUpOworCisgIC8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlIHplcm8gdGhlIHdob2xlIG1hc3RlciBzdHJ1Y3R1cmUuCisgICAqIEJ1dCB0aGUgYXBwbGljYXRpb24gaGFzIGFscmVhZHkgc2V0IHRoZSBlcnIgcG9pbnRlciwgYW5kIG1heSBoYXZlIHNldAorICAgKiBjbGllbnRfZGF0YSwgc28gd2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHRob3NlIGZpZWxkcy4KKyAgICogTm90ZTogaWYgYXBwbGljYXRpb24gaGFzbid0IHNldCBjbGllbnRfZGF0YSwgdG9vbHMgbGlrZSBQdXJpZnkgbWF5CisgICAqIGNvbXBsYWluIGhlcmUuCisgICAqLworICB7CisgICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKKyAgICB2b2lkICogY2xpZW50X2RhdGEgPSBjaW5mby0+Y2xpZW50X2RhdGE7IC8qIGlnbm9yZSBQdXJpZnkgY29tcGxhaW50IGhlcmUgKi8KKyAgICBNRU1aRVJPKGNpbmZvLCBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSk7CisgICAgY2luZm8tPmVyciA9IGVycjsKKyAgICBjaW5mby0+Y2xpZW50X2RhdGEgPSBjbGllbnRfZGF0YTsKKyAgfQorICBjaW5mby0+aXNfZGVjb21wcmVzc29yID0gRkFMU0U7CisKKyAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLworICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KKyAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKKyAgY2luZm8tPmRlc3QgPSBOVUxMOworCisgIGNpbmZvLT5jb21wX2luZm8gPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQorICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7CisgIH0KKworICBjaW5mby0+c2NyaXB0X3NwYWNlID0gTlVMTDsKKworICBjaW5mby0+aW5wdXRfZ2FtbWEgPSAxLjA7CS8qIGluIGNhc2UgYXBwbGljYXRpb24gZm9yZ2V0cyAqLworCisgIC8qIE9LLCBJJ20gcmVhZHkgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9TVEFSVDsKK30KKworCisvKgorICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19kZXN0cm95X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9wZXJhdGlvbiwKKyAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19hYm9ydF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KK30KKworCisvKgorICogRm9yY2libHkgc3VwcHJlc3Mgb3IgdW4tc3VwcHJlc3MgYWxsIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCisgKiBNYXJrcyBhbGwgY3VycmVudGx5IGRlZmluZWQgdGFibGVzIGFzIGFscmVhZHkgd3JpdHRlbiAoaWYgc3VwcHJlc3MpCisgKiBvciBub3Qgd3JpdHRlbiAoaWYgIXN1cHByZXNzKS4gIFRoaXMgd2lsbCBjb250cm9sIHdoZXRoZXIgdGhleSBnZXQgZW1pdHRlZAorICogYnkgYSBzdWJzZXF1ZW50IGpwZWdfc3RhcnRfY29tcHJlc3MgY2FsbC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZXhwb3J0ZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHByb2R1Y2UKKyAqIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuICBJdCBsb2dpY2FsbHkgYmVsb25ncyBpbiBqY3BhcmFtLmMsIGJ1dAorICogc2luY2UgaXQgaXMgY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MsIHdlIHB1dCBpdCBoZXJlIC0tLSBvdGhlcndpc2UKKyAqIGpjcGFyYW0ubyB3b3VsZCBiZSBsaW5rZWQgd2hldGhlciB0aGUgYXBwbGljYXRpb24gdXNlZCBpdCBvciBub3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N1cHByZXNzX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gc3VwcHJlc3MpCit7CisgIGludCBpOworICBKUVVBTlRfVEJMICogcXRibDsKKyAgSkhVRkZfVEJMICogaHRibDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgeworICAgIGlmICgocXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSkgIT0gTlVMTCkKKyAgICAgIHF0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICBpZiAoKGh0YmwgPSBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKKyAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKKyAgICBpZiAoKGh0YmwgPSBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKKyAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggSlBFRyBjb21wcmVzc2lvbi4KKyAqCisgKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgbWF5IGRvIGEgZ3JlYXQgZGVhbCBvZgorICogd29yayBpbmNsdWRpbmcgbW9zdCBvZiB0aGUgYWN0dWFsIG91dHB1dC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmluaXNoX2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgSkRJTUVOU0lPTiBpTUNVX3JvdzsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBDU1RBVEVfU0NBTk5JTkcgfHwKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gQ1NUQVRFX1JBV19PSykgeworICAgIC8qIFRlcm1pbmF0ZSBmaXJzdCBwYXNzICovCisgICAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lIDwgY2luZm8tPmltYWdlX2hlaWdodCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVE9PX0xJVFRMRV9EQVRBKTsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9wYXNzKSAoY2luZm8pOworICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgLyogUGVyZm9ybSBhbnkgcmVtYWluaW5nIHBhc3NlcyAqLworICB3aGlsZSAoISBjaW5mby0+bWFzdGVyLT5pc19sYXN0X3Bhc3MpIHsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX3Bhc3MpIChjaW5mbyk7CisgICAgZm9yIChpTUNVX3JvdyA9IDA7IGlNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsgaU1DVV9yb3crKykgeworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgaU1DVV9yb3c7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7CisJKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisgICAgICAvKiBXZSBieXBhc3MgdGhlIG1haW4gY29udHJvbGxlciBhbmQgaW52b2tlIGNvZWYgY29udHJvbGxlciBkaXJlY3RseTsKKyAgICAgICAqIGFsbCB3b3JrIGlzIGJlaW5nIGRvbmUgZnJvbSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLgorICAgICAgICovCisgICAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIChKU0FNUElNQUdFKSBOVUxMKSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgICAgfQorICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7CisgIH0KKyAgLyogV3JpdGUgRU9JLCBkbyBmaW5hbCBjbGVhbnVwICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV90cmFpbGVyKSAoY2luZm8pOworICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOworICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKK30KKworCisvKgorICogV3JpdGUgYSBzcGVjaWFsIG1hcmtlci4KKyAqIFRoaXMgaXMgb25seSByZWNvbW1lbmRlZCBmb3Igd3JpdGluZyBDT00gb3IgQVBQbiBtYXJrZXJzLgorICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBiZWZvcmUKKyAqIGZpcnN0IGNhbGwgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKSBvciBqcGVnX3dyaXRlX3Jhd19kYXRhKCkuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCisJCSAgIGNvbnN0IEpPQ1RFVCAqZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2J5dGUsIChqX2NvbXByZXNzX3B0ciBpbmZvLCBpbnQgdmFsKSk7CisKKyAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lICE9IDAgfHwKKyAgICAgIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORyAmJgorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSyAmJgorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfaGVhZGVyKSAoY2luZm8sIG1hcmtlciwgZGF0YWxlbik7CisgIHdyaXRlX21hcmtlcl9ieXRlID0gY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2J5dGU7CS8qIGNvcHkgZm9yIHNwZWVkICovCisgIHdoaWxlIChkYXRhbGVuLS0pIHsKKyAgICAoKndyaXRlX21hcmtlcl9ieXRlKSAoY2luZm8sICpkYXRhcHRyKTsKKyAgICBkYXRhcHRyKys7CisgIH0KK30KKworLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX21faGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSAhPSAwIHx8CisgICAgICAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU0NBTk5JTkcgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0sgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2hlYWRlcikgKGNpbmZvLCBtYXJrZXIsIGRhdGFsZW4pOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfd3JpdGVfbV9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKK3sKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfYnl0ZSkgKGNpbmZvLCB2YWwpOworfQorCisKKy8qCisgKiBBbHRlcm5hdGUgY29tcHJlc3Npb24gZnVuY3Rpb246IGp1c3Qgd3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUgZmlsZS4KKyAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCisgKgorICogVG8gcHJvZHVjZSBhIHBhaXIgb2YgZmlsZXMgY29udGFpbmluZyBhYmJyZXZpYXRlZCB0YWJsZXMgYW5kIGFiYnJldmlhdGVkCisgKiBpbWFnZSBkYXRhLCBvbmUgd291bGQgcHJvY2VlZCBhcyBmb2xsb3dzOgorICoKKyAqCQlpbml0aWFsaXplIEpQRUcgb2JqZWN0CisgKgkJc2V0IEpQRUcgcGFyYW1ldGVycworICoJCXNldCBkZXN0aW5hdGlvbiB0byB0YWJsZSBmaWxlCisgKgkJanBlZ193cml0ZV90YWJsZXMoY2luZm8pOworICoJCXNldCBkZXN0aW5hdGlvbiB0byBpbWFnZSBmaWxlCisgKgkJanBlZ19zdGFydF9jb21wcmVzcyhjaW5mbywgRkFMU0UpOworICoJCXdyaXRlIGRhdGEuLi4KKyAqCQlqcGVnX2ZpbmlzaF9jb21wcmVzcyhjaW5mbyk7CisgKgorICoganBlZ193cml0ZV90YWJsZXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBtYXJraW5nIGFsbCB0YWJsZXMgd3JpdHRlbgorICogKHNhbWUgYXMganBlZ19zdXBwcmVzc190YWJsZXMoLi4uLCBUUlVFKSkuICBUaHVzIGEgc3Vic2VxdWVudCBzdGFydF9jb21wcmVzcworICogd2lsbCBub3QgcmUtZW1pdCB0aGUgdGFibGVzIHVubGVzcyBpdCBpcyBwYXNzZWQgd3JpdGVfYWxsX3RhYmxlcz1UUlVFLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ193cml0ZV90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KKyAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7CisgIC8qIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgLi4uIGJpdCBvZiBhIGNyb2NrIHRvIGRvIGl0IGhlcmUuICovCisgIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOworICAvKiBXcml0ZSB0aGVtIHRhYmxlcyEgKi8KKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV90YWJsZXNfb25seSkgKGNpbmZvKTsKKyAgLyogQW5kIGNsZWFuIHVwLiAqLworICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOworICAvKgorICAgKiBJbiBsaWJyYXJ5IHJlbGVhc2VzIHVwIHRocm91Z2ggdjZhLCB3ZSBjYWxsZWQganBlZ19hYm9ydCgpIGhlcmUgdG8gZnJlZQorICAgKiBhbnkgd29ya2luZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIGFuZCBtYXJrZXIKKyAgICogd3JpdGVyLiAgU29tZSBhcHBsaWNhdGlvbnMgaGFkIGEgcHJvYmxlbSB3aXRoIHRoYXQ6IHRoZXkgYWxsb2NhdGVkIHNwYWNlCisgICAqIG9mIHRoZWlyIG93biBmcm9tIHRoZSBsaWJyYXJ5IG1lbW9yeSBtYW5hZ2VyLCBhbmQgZGlkbid0IHdhbnQgaXQgdG8gZ28KKyAgICogYXdheSBkdXJpbmcgd3JpdGVfdGFibGVzLiAgU28gbm93IHdlIGRvIG5vdGhpbmcuICBUaGlzIHdpbGwgY2F1c2UgYQorICAgKiBtZW1vcnkgbGVhayBpZiBhbiBhcHAgY2FsbHMgd3JpdGVfdGFibGVzIHJlcGVhdGVkbHkgd2l0aG91dCBkb2luZyBhIGZ1bGwKKyAgICogY29tcHJlc3Npb24gY3ljbGUgb3Igb3RoZXJ3aXNlIHJlc2V0dGluZyB0aGUgSlBFRyBvYmplY3QuICBIb3dldmVyLCB0aGF0CisgICAqIHNlZW1zIGxlc3MgYmFkIHRoYW4gdW5leHBlY3RlZGx5IGZyZWVpbmcgbWVtb3J5IGluIHRoZSBub3JtYWwgY2FzZS4KKyAgICogQW4gYXBwIHRoYXQgcHJlZmVycyB0aGUgb2xkIGJlaGF2aW9yIGNhbiBjYWxsIGpwZWdfYWJvcnQgZm9yIGl0c2VsZiBhZnRlcgorICAgKiBlYWNoIGNhbGwgdG8ganBlZ193cml0ZV90YWJsZXMoKS4KKyAgICovCit9CmRpZmYgLS1naXQgYS9qY2FwaXN0ZC5jIGIvamNhcGlzdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMyMGIxCi0tLSAvZGV2L251bGwKKysrIGIvamNhcGlzdGQuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIGpjYXBpc3RkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKKyAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJzdGFuZGFyZCIgQVBJIHJvdXRpbmVzIHRoYXQgYXJlCisgKiB1c2VkIGluIHRoZSBub3JtYWwgZnVsbC1jb21wcmVzc2lvbiBjYXNlLiAgVGhleSBhcmUgbm90IHVzZWQgYnkgYQorICogdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCBpZiBhbiBhcHBsaWNhdGlvbiBsaW5rcyBpbgorICoganBlZ19zdGFydF9jb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGNvbXByZXNzb3IuCisgKiBXZSB0aHVzIG11c3Qgc2VwYXJhdGUgdGhpcyBmaWxlIGZyb20gamNhcGltaW4uYyB0byBhdm9pZCBsaW5raW5nIHRoZQorICogd2hvbGUgY29tcHJlc3Npb24gbGlicmFyeSBpbnRvIGEgdHJhbnNjb2Rlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIENvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgorICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KKyAqCisgKiBXZSByZXF1aXJlIGEgd3JpdGVfYWxsX3RhYmxlcyBwYXJhbWV0ZXIgYXMgYSBmYWlsc2FmZSBjaGVjayB3aGVuIHdyaXRpbmcKKyAqIG11bHRpcGxlIGRhdGFzdHJlYW1zIGZyb20gdGhlIHNhbWUgY29tcHJlc3Npb24gb2JqZWN0LiAgU2luY2UgcHJpb3IgcnVucworICogd2lsbCBoYXZlIGxlZnQgYWxsIHRoZSB0YWJsZXMgbWFya2VkIHNlbnRfdGFibGU9VFJVRSwgYSBzdWJzZXF1ZW50IHJ1bgorICogd291bGQgZW1pdCBhbiBhYmJyZXZpYXRlZCBzdHJlYW0gKG5vIHRhYmxlcykgYnkgZGVmYXVsdC4gIFRoaXMgbWF5IGJlIHdoYXQKKyAqIGlzIHdhbnRlZCwgYnV0IGZvciBzYWZldHkncyBzYWtlIGl0IHNob3VsZCBub3QgYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3I6CisgKiBwcm9ncmFtbWVycyBzaG91bGQgaGF2ZSB0byBtYWtlIGEgZGVsaWJlcmF0ZSBjaG9pY2UgdG8gZW1pdCBhYmJyZXZpYXRlZAorICogaW1hZ2VzLiAgVGhlcmVmb3JlIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyBzaG91bGQgZW5jb3VyYWdlIHBlb3BsZQorICogdG8gcGFzcyB3cml0ZV9hbGxfdGFibGVzPVRSVUU7IHRoZW4gaXQgd2lsbCB0YWtlIGFjdGl2ZSB0aG91Z2h0IHRvIGRvIHRoZQorICogd3JvbmcgdGhpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0YXJ0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICBpZiAod3JpdGVfYWxsX3RhYmxlcykKKyAgICBqcGVnX3N1cHByZXNzX3RhYmxlcyhjaW5mbywgRkFMU0UpOwkvKiBtYXJrIGFsbCB0YWJsZXMgdG8gYmUgd3JpdHRlbiAqLworCisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCisgIGppbml0X2NvbXByZXNzX21hc3RlcihjaW5mbyk7CisgIC8qIFNldCB1cCBmb3IgdGhlIGZpcnN0IHBhc3MgKi8KKyAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9wYXNzKSAoY2luZm8pOworICAvKiBSZWFkeSBmb3IgYXBwbGljYXRpb24gdG8gZHJpdmUgZmlyc3QgcGFzcyB0aHJvdWdoIGpwZWdfd3JpdGVfc2NhbmxpbmVzCisgICAqIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEuCisgICAqLworICBjaW5mby0+bmV4dF9zY2FubGluZSA9IDA7CisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAoY2luZm8tPnJhd19kYXRhX2luID8gQ1NUQVRFX1JBV19PSyA6IENTVEFURV9TQ0FOTklORyk7Cit9CisKKworLyoKKyAqIFdyaXRlIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgdG8gdGhlIEpQRUcgY29tcHJlc3Nvci4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG51bWJlciBvZiBsaW5lcyBhY3R1YWxseSB3cml0dGVuLgorICogVGhpcyBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBzdXBwbGllZCBudW1fbGluZXMgb25seSBpbiBjYXNlIHRoYXQKKyAqIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSBoYXMgcmVxdWVzdGVkIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IsCisgKiBvciBpZiBtb3JlIHRoYW4gaW1hZ2VfaGVpZ2h0IHNjYW5saW5lcyBhcmUgcGFzc2VkIGluLgorICoKKyAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgc2luY2UKKyAqIHRoaXMgbGlrZWx5IHNpZ25hbHMgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lciBlcnJvci4gIEhvd2V2ZXIsCisgKiBleGNlc3Mgc2NhbmxpbmVzIHBhc3NlZCBpbiB0aGUgbGFzdCB2YWxpZCBjYWxsIGFyZSAqc2lsZW50bHkqIGlnbm9yZWQsCisgKiBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBuZWVkIG5vdCBhZGp1c3QgbnVtX2xpbmVzIGZvciBlbmQtb2YtaW1hZ2UKKyAqIHdoZW4gdXNpbmcgYSBtdWx0aXBsZS1zY2FubGluZSBidWZmZXIuCisgKi8KKworR0xPQkFMKEpESU1FTlNJT04pCitqcGVnX3dyaXRlX3NjYW5saW5lcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAorCQkgICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKK3sKKyAgSkRJTUVOU0lPTiByb3dfY3RyLCByb3dzX2xlZnQ7CisKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA+PSBjaW5mby0+aW1hZ2VfaGVpZ2h0KQorICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCisgICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzLiAgVGhpcyBsZXRzIG91dHB1dCBvZiB0aGUgZnJhbWUvc2NhbiBoZWFkZXJzIGJlCisgICAqIGRlbGF5ZWQgc28gdGhhdCBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgQ09NLCBldGMsIG1hcmtlcnMgYmV0d2VlbgorICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCBqcGVnX3dyaXRlX3NjYW5saW5lcy4KKyAgICovCisgIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKKworICAvKiBJZ25vcmUgYW55IGV4dHJhIHNjYW5saW5lcyBhdCBib3R0b20gb2YgaW1hZ2UuICovCisgIHJvd3NfbGVmdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgLSBjaW5mby0+bmV4dF9zY2FubGluZTsKKyAgaWYgKG51bV9saW5lcyA+IHJvd3NfbGVmdCkKKyAgICBudW1fbGluZXMgPSByb3dzX2xlZnQ7CisKKyAgcm93X2N0ciA9IDA7CisgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBudW1fbGluZXMpOworICBjaW5mby0+bmV4dF9zY2FubGluZSArPSByb3dfY3RyOworICByZXR1cm4gcm93X2N0cjsKK30KKworCisvKgorICogQWx0ZXJuYXRlIGVudHJ5IHBvaW50IHRvIHdyaXRlIHJhdyBkYXRhLgorICogUHJvY2Vzc2VzIGV4YWN0bHkgb25lIGlNQ1Ugcm93IHBlciBjYWxsLCB1bmxlc3Mgc3VzcGVuZGVkLgorICovCisKK0dMT0JBTChKRElNRU5TSU9OKQoranBlZ193cml0ZV9yYXdfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgZGF0YSwKKwkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKK3sKKyAgSkRJTUVOU0lPTiBsaW5lc19wZXJfaU1DVV9yb3c7CisKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkgeworICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm5leHRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIH0KKworICAvKiBHaXZlIG1hc3RlciBjb250cm9sIG1vZHVsZSBhbm90aGVyIGNoYW5jZSBpZiB0aGlzIGlzIGZpcnN0IGNhbGwgdG8KKyAgICoganBlZ193cml0ZV9yYXdfZGF0YS4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQorICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KKyAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9yYXdfZGF0YS4KKyAgICovCisgIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKKworICAvKiBWZXJpZnkgdGhhdCBhdCBsZWFzdCBvbmUgaU1DVSByb3cgaGFzIGJlZW4gcGFzc2VkLiAqLworICBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworICBpZiAobnVtX2xpbmVzIDwgbGluZXNfcGVyX2lNQ1Vfcm93KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQlVGRkVSX1NJWkUpOworCisgIC8qIERpcmVjdGx5IGNvbXByZXNzIHRoZSByb3cuICovCisgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgZGF0YSkpIHsKKyAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCBzdXNwZW5kIHByb2Nlc3NpbmcuICovCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBPSywgd2UgcHJvY2Vzc2VkIG9uZSBpTUNVIHJvdy4gKi8KKyAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gbGluZXNfcGVyX2lNQ1Vfcm93OworICByZXR1cm4gbGluZXNfcGVyX2lNQ1Vfcm93OworfQpkaWZmIC0tZ2l0IGEvamNjb2VmY3QuYyBiL2pjY29lZmN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2M2RkYgotLS0gL2Rldi9udWxsCisrKyBiL2pjY29lZmN0LmMKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBqY2NvZWZjdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyIGZvciBjb21wcmVzc2lvbi4KKyAqIFRoaXMgY29udHJvbGxlciBpcyB0aGUgdG9wIGxldmVsIG9mIHRoZSBKUEVHIGNvbXByZXNzb3IgcHJvcGVyLgorICogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBsaWVzIGJldHdlZW4gZm9yd2FyZC1EQ1QgYW5kIGVudHJvcHkgZW5jb2Rpbmcgc3RlcHMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFdlIHVzZSBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyIHdoZW4gZG9pbmcgSHVmZm1hbiBvcHRpbWl6YXRpb24sCisgKiBhbmQgYWxzbyBmb3Igd3JpdGluZyBtdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXMuICBJbiBhbGwgY2FzZXMsIHRoZSBEQ1QKKyAqIHN0ZXAgaXMgcnVuIGR1cmluZyB0aGUgZmlyc3QgcGFzcywgYW5kIHN1YnNlcXVlbnQgcGFzc2VzIG5lZWQgb25seSByZWFkCisgKiB0aGUgYnVmZmVyZWQgY29lZmZpY2llbnRzLgorICovCisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisjZGVmaW5lIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisjZWxzZQorI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorI2RlZmluZSBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorI2VuZGlmCisjZW5kaWYKKworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLworICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBGb3Igc2luZ2xlLXBhc3MgY29tcHJlc3Npb24sIGl0J3Mgc3VmZmljaWVudCB0byBidWZmZXIganVzdCBvbmUgTUNVCisgICAqIChhbHRob3VnaCB0aGlzIG1heSBwcm92ZSBhIGJpdCBzbG93IGluIHByYWN0aWNlKS4gIFdlIGFsbG9jYXRlIGEKKyAgICogd29ya3NwYWNlIG9mIENfTUFYX0JMT0NLU19JTl9NQ1UgY29lZmZpY2llbnQgYmxvY2tzLCBhbmQgcmV1c2UgaXQgZm9yIGVhY2gKKyAgICogTUNVIGNvbnN0cnVjdGVkIGFuZCBzZW50LiAgKE9uIDgweDg2LCB0aGUgd29ya3NwYWNlIGlzIEZBUiBldmVuIHRob3VnaAorICAgKiBpdCdzIG5vdCByZWFsbHkgdmVyeSBiaWc7IHRoaXMgaXMgdG8ga2VlcCB0aGUgbW9kdWxlIGludGVyZmFjZXMgdW5jaGFuZ2VkCisgICAqIHdoZW4gYSBsYXJnZSBjb2VmZmljaWVudCBidWZmZXIgaXMgbmVjZXNzYXJ5LikKKyAgICogSW4gbXVsdGktcGFzcyBtb2RlcywgdGhpcyBhcnJheSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgTUNVJ3MgYmxvY2tzCisgICAqIHdpdGhpbiB0aGUgdmlydHVhbCBhcnJheXMuCisgICAqLworICBKQkxPQ0tST1cgTUNVX2J1ZmZlcltDX01BWF9CTE9DS1NfSU5fTUNVXTsKKworICAvKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB3ZSBuZWVkIGEgdmlydHVhbCBibG9jayBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQuICovCisgIGp2aXJ0X2JhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOworfSBteV9jb2VmX2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfY29lZl9jb250cm9sbGVyICogbXlfY29lZl9wdHI7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19kYXRhCisgICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKKyNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX2ZpcnN0X3Bhc3MKKyAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOworTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX291dHB1dAorICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7CisjZW5kaWYKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+bWN1X2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIGNvZWYtPmlNQ1Vfcm93X251bSA9IDA7CisgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKworICBzd2l0Y2ggKHBhc3NfbW9kZSkgeworICBjYXNlIEpCVUZfUEFTU19USFJVOgorICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSAhPSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3NfZGF0YTsKKyAgICBicmVhazsKKyNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKKyAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX2ZpcnN0X3Bhc3M7CisgICAgYnJlYWs7CisgIGNhc2UgSkJVRl9DUkFOS19ERVNUOgorICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3Nfb3V0cHV0OworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBzaW5nbGUtcGFzcyBjYXNlLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgaW1hZ2UuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UsCisgKiB3aGljaCB3ZSBpbmRleCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIFNPRiBwb3NpdGlvbi4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2NvbXByZXNzX2RhdGEgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIGludCBibGtuLCBiaSwgY2ksIHlpbmRleCwgeW9mZnNldCwgYmxvY2tjbnQ7CisgIEpESU1FTlNJT04geXBvcywgeHBvczsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBMb29wIHRvIHdyaXRlIGFzIG11Y2ggYXMgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPD0gbGFzdF9NQ1VfY29sOworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBjb21lcyBmcm9tIGluIGlucHV0X2J1ZiBhbmQgZG8gdGhlIERDVCB0aGluZy4KKyAgICAgICAqIEVhY2ggY2FsbCBvbiBmb3J3YXJkX0RDVCBwcm9jZXNzZXMgYSBob3Jpem9udGFsIHJvdyBvZiBEQ1QgYmxvY2tzCisgICAgICAgKiBhcyB3aWRlIGFzIGFuIE1DVTsgd2UgcmVseSBvbiBoYXZpbmcgYWxsb2NhdGVkIHRoZSBNQ1VfYnVmZmVyW10gYmxvY2tzCisgICAgICAgKiBzZXF1ZW50aWFsbHkuICBEdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlIGFyZSBmaWxsZWQgaW4KKyAgICAgICAqIHNwZWNpYWxseS4gIFRoZSBkYXRhIGluIHRoZW0gZG9lcyBub3QgbWF0dGVyIGZvciBpbWFnZSByZWNvbnN0cnVjdGlvbiwKKyAgICAgICAqIHNvIHdlIGZpbGwgdGhlbSB3aXRoIHZhbHVlcyB0aGF0IHdpbGwgZW5jb2RlIHRvIHRoZSBzbWFsbGVzdCBhbW91bnQgb2YKKyAgICAgICAqIGRhdGEsIHZpejogYWxsIHplcm9lcyBpbiB0aGUgQUMgZW50cmllcywgREMgZW50cmllcyBlcXVhbCB0byBwcmV2aW91cworICAgICAgICogYmxvY2sncyBEQyB2YWx1ZS4gIChUaGFua3MgdG8gVGhvbWFzIEtpbnNtYW4gZm9yIHRoaXMgaWRlYS4pCisgICAgICAgKi8KKyAgICAgIGJsa24gPSAwOworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwl4cG9zID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOworCXlwb3MgPSB5b2Zmc2V0ICogRENUU0laRTsgLyogeXBvcyA9PSAoeW9mZnNldCt5aW5kZXgpICogRENUU0laRSAqLworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCBsYXN0X2lNQ1Vfcm93IHx8CisJICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKKwkgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKKwkJCQkJIGlucHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAorCQkJCQkgY29lZi0+TUNVX2J1ZmZlcltibGtuXSwKKwkJCQkJIHlwb3MsIHhwb3MsIChKRElNRU5TSU9OKSBibG9ja2NudCk7CisJICAgIGlmIChibG9ja2NudCA8IGNvbXBwdHItPk1DVV93aWR0aCkgeworCSAgICAgIC8qIENyZWF0ZSBzb21lIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW1hZ2UuICovCisJICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24gKyBibG9ja2NudF0sCisJCQkoY29tcHB0ci0+TUNVX3dpZHRoIC0gYmxvY2tjbnQpICogU0laRU9GKEpCTE9DSykpOworCSAgICAgIGZvciAoYmkgPSBibG9ja2NudDsgYmkgPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IGJpKyspIHsKKwkJY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpXVswXVswXSA9IGNvZWYtPk1DVV9idWZmZXJbYmxrbitiaS0xXVswXVswXTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIC8qIENyZWF0ZSBhIHJvdyBvZiBkdW1teSBibG9ja3MgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCisJICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuXSwKKwkJICAgICAgY29tcHB0ci0+TUNVX3dpZHRoICogU0laRU9GKEpCTE9DSykpOworCSAgICBmb3IgKGJpID0gMDsgYmkgPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IGJpKyspIHsKKwkgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmldWzBdWzBdID0gY29lZi0+TUNVX2J1ZmZlcltibGtuLTFdWzBdWzBdOworCSAgICB9CisJICB9CisJICBibGtuICs9IGNvbXBwdHItPk1DVV93aWR0aDsKKwkgIHlwb3MgKz0gRENUU0laRTsKKwl9CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gd3JpdGUgdGhlIE1DVS4gIEluIGV2ZW50IG9mIGEgc3VzcGVuc2lvbiBmYWlsdXJlLCB3ZSB3aWxsCisgICAgICAgKiByZS1EQ1QgdGhlIE1DVSBvbiByZXN0YXJ0IChhIGJpdCBpbmVmZmljaWVudCwgY291bGQgYmUgZml4ZWQuLi4pCisgICAgICAgKi8KKyAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmVuY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKKwkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKKwljb2VmLT5tY3VfY3RyID0gTUNVX2NvbF9udW07CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+bWN1X2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgY29lZi0+aU1DVV9yb3dfbnVtKys7CisgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgZmlyc3QgcGFzcyBvZiBhIG11bHRpLXBhc3MgY2FzZS4KKyAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCisgKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGltYWdlLgorICogVGhpcyBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGZyb20gdGhlIHNvdXJjZSBidWZmZXIsIERDVCdkIGFuZCBxdWFudGl6ZWQsCisgKiBhbmQgc2F2ZWQgaW50byB0aGUgdmlydHVhbCBhcnJheXMuICBXZSBhbHNvIGdlbmVyYXRlIHN1aXRhYmxlIGR1bW15IGJsb2NrcworICogYXMgbmVlZGVkIGF0IHRoZSByaWdodCBhbmQgbG93ZXIgZWRnZXMuICAoVGhlIGR1bW15IGJsb2NrcyBhcmUgY29uc3RydWN0ZWQKKyAqIGluIHRoZSB2aXJ0dWFsIGFycmF5cywgd2hpY2ggaGF2ZSBiZWVuIHBhZGRlZCBhcHByb3ByaWF0ZWx5LikgIFRoaXMgbWFrZXMKKyAqIGl0IHBvc3NpYmxlIGZvciBzdWJzZXF1ZW50IHBhc3NlcyBub3QgdG8gd29ycnkgYWJvdXQgcmVhbCB2cy4gZHVtbXkgYmxvY2tzLgorICoKKyAqIFdlIG11c3QgYWxzbyBlbWl0IHRoZSBkYXRhIHRvIHRoZSBlbnRyb3B5IGVuY29kZXIuICBUaGlzIGlzIGNvbnZlbmllbnRseQorICogZG9uZSBieSBjYWxsaW5nIGNvbXByZXNzX291dHB1dCgpIGFmdGVyIHdlJ3ZlIGxvYWRlZCB0aGUgY3VycmVudCBzdHJpcAorICogb2YgdGhlIHZpcnR1YWwgYXJyYXlzLgorICoKKyAqIE5COiBpbnB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UuICBBbGwKKyAqIGNvbXBvbmVudHMgYXJlIERDVCdkIGFuZCBsb2FkZWQgaW50byB0aGUgdmlydHVhbCBhcnJheXMgaW4gdGhpcyBwYXNzLgorICogSG93ZXZlciwgaXQgbWF5IGJlIHRoYXQgb25seSBhIHN1YnNldCBvZiB0aGUgY29tcG9uZW50cyBhcmUgZW1pdHRlZCB0bworICogdGhlIGVudHJvcHkgZW5jb2RlciBkdXJpbmcgdGhpcyBmaXJzdCBwYXNzOyBiZSBjYXJlZnVsIGFib3V0IGxvb2tpbmcKKyAqIGF0IHRoZSBzY2FuLWRlcGVuZGVudCB2YXJpYWJsZXMgKE1DVSBkaW1lbnNpb25zLCBldGMpLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3NfZmlyc3RfcGFzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIEpESU1FTlNJT04gYmxvY2tzX2Fjcm9zcywgTUNVc19hY3Jvc3MsIE1DVWluZGV4OworICBpbnQgYmksIGNpLCBoX3NhbXBfZmFjdG9yLCBibG9ja19yb3csIGJsb2NrX3Jvd3MsIG5kdW1teTsKKyAgSkNPRUYgbGFzdERDOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyB0aGlzYmxvY2tyb3csIGxhc3RibG9ja3JvdzsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuICovCisgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdykKKyAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGVsc2UgeworICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZSwgc2luY2UgbWF5IG5vdCBiZSBzZXQhICovCisgICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICBibG9ja3NfYWNyb3NzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworICAgIGhfc2FtcF9mYWN0b3IgPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIC8qIENvdW50IG51bWJlciBvZiBkdW1teSBibG9ja3MgdG8gYmUgYWRkZWQgYXQgdGhlIHJpZ2h0IG1hcmdpbi4gKi8KKyAgICBuZHVtbXkgPSAoaW50KSAoYmxvY2tzX2Fjcm9zcyAlIGhfc2FtcF9mYWN0b3IpOworICAgIGlmIChuZHVtbXkgPiAwKQorICAgICAgbmR1bW15ID0gaF9zYW1wX2ZhY3RvciAtIG5kdW1teTsKKyAgICAvKiBQZXJmb3JtIERDVCBmb3IgYWxsIG5vbi1kdW1teSBibG9ja3MgaW4gdGhpcyBpTUNVIHJvdy4gIEVhY2ggY2FsbAorICAgICAqIG9uIGZvcndhcmRfRENUIHByb2Nlc3NlcyBhIGNvbXBsZXRlIGhvcml6b250YWwgcm93IG9mIERDVCBibG9ja3MuCisgICAgICovCisgICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgeworICAgICAgdGhpc2Jsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvd107CisgICAgICAoKmNpbmZvLT5mZGN0LT5mb3J3YXJkX0RDVCkgKGNpbmZvLCBjb21wcHRyLAorCQkJCSAgIGlucHV0X2J1ZltjaV0sIHRoaXNibG9ja3JvdywKKwkJCQkgICAoSkRJTUVOU0lPTikgKGJsb2NrX3JvdyAqIERDVFNJWkUpLAorCQkJCSAgIChKRElNRU5TSU9OKSAwLCBibG9ja3NfYWNyb3NzKTsKKyAgICAgIGlmIChuZHVtbXkgPiAwKSB7CisJLyogQ3JlYXRlIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW1hZ2UuICovCisJdGhpc2Jsb2Nrcm93ICs9IGJsb2Nrc19hY3Jvc3M7IC8qID0+IGZpcnN0IGR1bW15IGJsb2NrICovCisJanplcm9fZmFyKCh2b2lkIEZBUiAqKSB0aGlzYmxvY2tyb3csIG5kdW1teSAqIFNJWkVPRihKQkxPQ0spKTsKKwlsYXN0REMgPSB0aGlzYmxvY2tyb3dbLTFdWzBdOworCWZvciAoYmkgPSAwOyBiaSA8IG5kdW1teTsgYmkrKykgeworCSAgdGhpc2Jsb2Nrcm93W2JpXVswXSA9IGxhc3REQzsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIElmIGF0IGVuZCBvZiBpbWFnZSwgY3JlYXRlIGR1bW15IGJsb2NrIHJvd3MgYXMgbmVlZGVkLgorICAgICAqIFRoZSB0cmlja3kgcGFydCBoZXJlIGlzIHRoYXQgd2l0aGluIGVhY2ggTUNVLCB3ZSB3YW50IHRoZSBEQyB2YWx1ZXMKKyAgICAgKiBvZiB0aGUgZHVtbXkgYmxvY2tzIHRvIG1hdGNoIHRoZSBsYXN0IHJlYWwgYmxvY2sncyBEQyB2YWx1ZS4KKyAgICAgKiBUaGlzIHNxdWVlemVzIGEgZmV3IG1vcmUgYnl0ZXMgb3V0IG9mIHRoZSByZXN1bHRpbmcgZmlsZS4uLgorICAgICAqLworICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPT0gbGFzdF9pTUNVX3JvdykgeworICAgICAgYmxvY2tzX2Fjcm9zcyArPSBuZHVtbXk7CS8qIGluY2x1ZGUgbG93ZXIgcmlnaHQgY29ybmVyICovCisgICAgICBNQ1VzX2Fjcm9zcyA9IGJsb2Nrc19hY3Jvc3MgLyBoX3NhbXBfZmFjdG9yOworICAgICAgZm9yIChibG9ja19yb3cgPSBibG9ja19yb3dzOyBibG9ja19yb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworCSAgIGJsb2NrX3JvdysrKSB7CisJdGhpc2Jsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvd107CisJbGFzdGJsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvdy0xXTsKKwlqemVyb19mYXIoKHZvaWQgRkFSICopIHRoaXNibG9ja3JvdywKKwkJICAoc2l6ZV90KSAoYmxvY2tzX2Fjcm9zcyAqIFNJWkVPRihKQkxPQ0spKSk7CisJZm9yIChNQ1VpbmRleCA9IDA7IE1DVWluZGV4IDwgTUNVc19hY3Jvc3M7IE1DVWluZGV4KyspIHsKKwkgIGxhc3REQyA9IGxhc3RibG9ja3Jvd1toX3NhbXBfZmFjdG9yLTFdWzBdOworCSAgZm9yIChiaSA9IDA7IGJpIDwgaF9zYW1wX2ZhY3RvcjsgYmkrKykgeworCSAgICB0aGlzYmxvY2tyb3dbYmldWzBdID0gbGFzdERDOworCSAgfQorCSAgdGhpc2Jsb2Nrcm93ICs9IGhfc2FtcF9mYWN0b3I7IC8qIGFkdmFuY2UgdG8gbmV4dCBNQ1UgaW4gcm93ICovCisJICBsYXN0YmxvY2tyb3cgKz0gaF9zYW1wX2ZhY3RvcjsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIE5COiBjb21wcmVzc19vdXRwdXQgd2lsbCBpbmNyZW1lbnQgaU1DVV9yb3dfbnVtIGlmIHN1Y2Nlc3NmdWwuCisgICAqIEEgc3VzcGVuc2lvbiByZXR1cm4gd2lsbCByZXN1bHQgaW4gcmVkb2luZyBhbGwgdGhlIHdvcmsgYWJvdmUgbmV4dCB0aW1lLgorICAgKi8KKworICAvKiBFbWl0IGRhdGEgdG8gdGhlIGVudHJvcHkgZW5jb2Rlciwgc2hhcmluZyBjb2RlIHdpdGggc3Vic2VxdWVudCBwYXNzZXMgKi8KKyAgcmV0dXJuIGNvbXByZXNzX291dHB1dChjaW5mbywgaW5wdXRfYnVmKTsKK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gc3Vic2VxdWVudCBwYXNzZXMgb2YgYSBtdWx0aS1wYXNzIGNhc2UuCisgKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQorICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBzY2FuLgorICogVGhlIGRhdGEgaXMgb2J0YWluZWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheXMgYW5kIGZlZCB0byB0aGUgZW50cm9weSBjb2Rlci4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgaU1DVSByb3cgaXMgY29tcGxldGVkLCBGQUxTRSBpZiBzdXNwZW5kZWQuCisgKgorICogTkI6IGlucHV0X2J1ZiBpcyBpZ25vcmVkOyBpdCBpcyBsaWtlbHkgdG8gYmUgYSBOVUxMIHBvaW50ZXIuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitjb21wcmVzc19vdXRwdXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgZm9yIHRoZSBjb21wb25lbnRzIHVzZWQgaW4gdGhpcyBzY2FuLgorICAgKiBOQjogZHVyaW5nIGZpcnN0IHBhc3MsIHRoaXMgaXMgc2FmZSBvbmx5IGJlY2F1c2UgdGhlIGJ1ZmZlcnMgd2lsbAorICAgKiBhbHJlYWR5IGJlIGFsaWduZWQgcHJvcGVybHksIHNvIGptZW1tZ3IuYyB3b24ndCBuZWVkIHRvIGRvIGFueSBJL08uCisgICAqLworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgYnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAorICAgICAgIGNvZWYtPmlNQ1Vfcm93X251bSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKyAgfQorCisgIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5tY3VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCisgICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7CisJZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgeworCSAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gd3JpdGUgdGhlIE1DVS4gKi8KKyAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmVuY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKKwkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKKwljb2VmLT5tY3VfY3RyID0gTUNVX2NvbF9udW07CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+bWN1X2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgY29lZi0+aU1DVV9yb3dfbnVtKys7CisgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisKKyAgY29lZiA9IChteV9jb2VmX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jb2VmX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmNvZWYgPSAoc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgKikgY29lZjsKKyAgY29lZi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2NvZWY7CisKKyAgLyogQ3JlYXRlIHRoZSBjb2VmZmljaWVudCBidWZmZXIuICovCisgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7CisjaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKyAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQsICovCisgICAgLyogcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2Ygc2FtcF9mYWN0b3IgRENUIGJsb2NrcyBpbiBlYWNoIGRpcmVjdGlvbi4gKi8KKyAgICBpbnQgY2k7CisgICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgY29lZi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIH0KKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgLyogV2Ugb25seSBuZWVkIGEgc2luZ2xlLU1DVSBidWZmZXIuICovCisgICAgSkJMT0NLUk9XIGJ1ZmZlcjsKKyAgICBpbnQgaTsKKworICAgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ19NQVhfQkxPQ0tTX0lOX01DVTsgaSsrKSB7CisgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2ldID0gYnVmZmVyICsgaTsKKyAgICB9CisgICAgY29lZi0+d2hvbGVfaW1hZ2VbMF0gPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICB9Cit9CmRpZmYgLS1naXQgYS9qY2NvbG9yLmMgYi9qY2NvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhNzZjMwotLS0gL2Rldi9udWxsCisrKyBiL2pjY29sb3IuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIGpjY29sb3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbiByb3V0aW5lcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKy8vIHRoaXMgZW5hYmxlcyB1bnJvbGxpbmcgbnVsbF9jb252ZXJ0J3MgbG9vcCwgYW5kIHJlYWRpbmcvd3JpdGUgaW50cyBmb3Igc3BlZWQKKyNkZWZpbmUgRU5BQkxFX0FORFJPSURfTlVMTF9DT05WRVJUCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFByaXZhdGUgc3RhdGUgZm9yIFJHQi0+WUNDIGNvbnZlcnNpb24gKi8KKyAgSU5UMzIgKiByZ2JfeWNjX3RhYjsJCS8qID0+IHRhYmxlIGZvciBSR0IgdG8gWUNiQ3IgY29udmVyc2lvbiAqLworfSBteV9jb2xvcl9jb252ZXJ0ZXI7CisKK3R5cGVkZWYgbXlfY29sb3JfY29udmVydGVyICogbXlfY2NvbnZlcnRfcHRyOworCisKKy8qKioqKioqKioqKioqKioqIFJHQiAtPiBZQ2JDciBjb252ZXJzaW9uOiBtb3N0IGNvbW1vbiBjYXNlICoqKioqKioqKioqKioqLworCisvKgorICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQorICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KKyAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCisgKglZICA9ICAwLjI5OTAwICogUiArIDAuNTg3MDAgKiBHICsgMC4xMTQwMCAqIEIKKyAqCUNiID0gLTAuMTY4NzQgKiBSIC0gMC4zMzEyNiAqIEcgKyAwLjUwMDAwICogQiAgKyBDRU5URVJKU0FNUExFCisgKglDciA9ICAwLjUwMDAwICogUiAtIDAuNDE4NjkgKiBHIC0gMC4wODEzMSAqIEIgICsgQ0VOVEVSSlNBTVBMRQorICogKFRoZXNlIG51bWJlcnMgYXJlIGRlcml2ZWQgZnJvbSBUSUZGIDYuMCBzZWN0aW9uIDIxLCBkYXRlZCAzLUp1bmUtOTIuKQorICogTm90ZTogb2xkZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlIHVzZWQgYSB6ZXJvIG9mZnNldCBvZiBNQVhKU0FNUExFLzIsCisgKiByYXRoZXIgdGhhbiBDRU5URVJKU0FNUExFLCBmb3IgQ2IgYW5kIENyLiAgVGhpcyBnYXZlIGVxdWFsIHBvc2l0aXZlIGFuZAorICogbmVnYXRpdmUgc3dpbmdzIGZvciBDYi9DciwgYnV0IG1lYW50IHRoYXQgZ3JheXNjYWxlIHZhbHVlcyAoQ2I9Q3I9MCkKKyAqIHdlcmUgbm90IHJlcHJlc2VudGVkIGV4YWN0bHkuICBOb3cgd2Ugc2FjcmlmaWNlIGV4YWN0IHJlcHJlc2VudGF0aW9uIG9mCisgKiBtYXhpbXVtIHJlZCBhbmQgbWF4aW11bSBibHVlIGluIG9yZGVyIHRvIGdldCBleGFjdCBncmF5c2NhbGVzLgorICoKKyAqIFRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHdlIHJlcHJlc2VudCB0aGUgZnJhY3Rpb25hbCBjb25zdGFudHMKKyAqIGFzIGludGVnZXJzIHNjYWxlZCB1cCBieSAyXjE2IChhYm91dCA0IGRpZ2l0cyBwcmVjaXNpb24pOyB3ZSBoYXZlIHRvIGRpdmlkZQorICogdGhlIHByb2R1Y3RzIGJ5IDJeMTYsIHdpdGggYXBwcm9wcmlhdGUgcm91bmRpbmcsIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIuCisgKgorICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAorICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBSLEcsQiBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcyB0aGlzIGlzIHZlcnkgcmVhc29uYWJsZSAob25seSAyNTYgZW50cmllcyBwZXIgdGFibGUpOworICogZm9yIDEyLWJpdCBzYW1wbGVzIGl0IGlzIHN0aWxsIGFjY2VwdGFibGUuICBJdCdzIG5vdCB2ZXJ5IHJlYXNvbmFibGUgZm9yCisgKiAxNi1iaXQgc2FtcGxlcywgYnV0IGlmIHlvdSB3YW50IGxvc3NsZXNzIHN0b3JhZ2UgeW91IHNob3VsZG4ndCBiZSBjaGFuZ2luZworICogY29sb3JzcGFjZSBhbnl3YXkuCisgKiBUaGUgQ0VOVEVSSlNBTVBMRSBvZmZzZXRzIGFuZCB0aGUgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNSBhcmUgaW5jbHVkZWQKKyAqIGluIHRoZSB0YWJsZXMgdG8gc2F2ZSBhZGRpbmcgdGhlbSBzZXBhcmF0ZWx5IGluIHRoZSBpbm5lciBsb29wLgorICovCisKKyNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCisjZGVmaW5lIENCQ1JfT0ZGU0VUCSgoSU5UMzIpIENFTlRFUkpTQU1QTEUgPDwgU0NBTEVCSVRTKQorI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKy8qIFdlIGFsbG9jYXRlIG9uZSBiaWcgdGFibGUgYW5kIGRpdmlkZSBpdCB1cCBpbnRvIGVpZ2h0IHBhcnRzLCBpbnN0ZWFkIG9mCisgKiBkb2luZyBlaWdodCBhbGxvY19zbWFsbCByZXF1ZXN0cy4gIFRoaXMgbGV0cyB1cyB1c2UgYSBzaW5nbGUgdGFibGUgYmFzZQorICogYWRkcmVzcywgd2hpY2ggY2FuIGJlIGhlbGQgaW4gYSByZWdpc3RlciBpbiB0aGUgaW5uZXIgbG9vcHMgb24gbWFueQorICogbWFjaGluZXMgKG1vcmUgdGhhbiBjYW4gaG9sZCBhbGwgZWlnaHQgYWRkcmVzc2VzLCBhbnl3YXkpLgorICovCisKKyNkZWZpbmUgUl9ZX09GRgkJMAkJCS8qIG9mZnNldCB0byBSID0+IFkgc2VjdGlvbiAqLworI2RlZmluZSBHX1lfT0ZGCQkoMSooTUFYSlNBTVBMRSsxKSkJLyogb2Zmc2V0IHRvIEcgPT4gWSBzZWN0aW9uICovCisjZGVmaW5lIEJfWV9PRkYJCSgyKihNQVhKU0FNUExFKzEpKQkvKiBldGMuICovCisjZGVmaW5lIFJfQ0JfT0ZGCSgzKihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBHX0NCX09GRgkoNCooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgQl9DQl9PRkYJKDUqKE1BWEpTQU1QTEUrMSkpCisjZGVmaW5lIFJfQ1JfT0ZGCUJfQ0JfT0ZGCQkvKiBCPT5DYiwgUj0+Q3IgYXJlIHRoZSBzYW1lICovCisjZGVmaW5lIEdfQ1JfT0ZGCSg2KihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBCX0NSX09GRgkoNyooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgVEFCTEVfU0laRQkoOCooTUFYSlNBTVBMRSsxKSkKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgUkdCLT5ZQ0MgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX3ljY19zdGFydCAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgSU5UMzIgKiByZ2JfeWNjX3RhYjsKKyAgSU5UMzIgaTsKKworICAvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiB0aGUgY29udmVyc2lvbiB0YWJsZXMuICovCisgIGNjb252ZXJ0LT5yZ2JfeWNjX3RhYiA9IHJnYl95Y2NfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoVEFCTEVfU0laRSAqIFNJWkVPRihJTlQzMikpKTsKKworICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykgeworICAgIHJnYl95Y2NfdGFiW2krUl9ZX09GRl0gPSBGSVgoMC4yOTkwMCkgKiBpOworICAgIHJnYl95Y2NfdGFiW2krR19ZX09GRl0gPSBGSVgoMC41ODcwMCkgKiBpOworICAgIHJnYl95Y2NfdGFiW2krQl9ZX09GRl0gPSBGSVgoMC4xMTQwMCkgKiBpICAgICArIE9ORV9IQUxGOworICAgIHJnYl95Y2NfdGFiW2krUl9DQl9PRkZdID0gKC1GSVgoMC4xNjg3NCkpICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0dfQ0JfT0ZGXSA9ICgtRklYKDAuMzMxMjYpKSAqIGk7CisgICAgLyogV2UgdXNlIGEgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNS1lcHNpbG9uIGZvciBDYiBhbmQgQ3IuCisgICAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1heGltdW0gb3V0cHV0IHdpbGwgcm91bmQgdG8gTUFYSlNBTVBMRQorICAgICAqIG5vdCBNQVhKU0FNUExFKzEsIGFuZCB0aHVzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByYW5nZS1saW1pdC4KKyAgICAgKi8KKyAgICByZ2JfeWNjX3RhYltpK0JfQ0JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7CisvKiAgQj0+Q2IgYW5kIFI9PkNyIHRhYmxlcyBhcmUgdGhlIHNhbWUKKyAgICByZ2JfeWNjX3RhYltpK1JfQ1JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7CisqLworICAgIHJnYl95Y2NfdGFiW2krR19DUl9PRkZdID0gKC1GSVgoMC40MTg2OSkpICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0JfQ1JfT0ZGXSA9ICgtRklYKDAuMDgxMzEpKSAqIGk7CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQKKyAqIHRvIG91ciBpbnRlcm5hbCBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0LgorICogVGhlIGlucHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMgYXMgd2lkZSBhcyB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiBBIHN0YXJ0aW5nIHJvdyBvZmZzZXQgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlIG91dHB1dCBidWZmZXIuICBUaGUgY2FsbGVyCisgKiBjYW4gZWFzaWx5IGFkanVzdCB0aGUgcGFzc2VkIGlucHV0X2J1ZiB2YWx1ZSB0byBhY2NvbW1vZGF0ZSBhbnkgcm93CisgKiBvZmZzZXQgcmVxdWlyZWQgb24gdGhhdCBzaWRlLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX3ljY19jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJCSBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgciwgZywgYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOworICAgIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgciA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX1JFRF0pOworICAgICAgZyA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0dSRUVOXSk7CisgICAgICBiID0gR0VUSlNBTVBMRShpbnB0cltSR0JfQkxVRV0pOworICAgICAgaW5wdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICAgIC8qIElmIHRoZSBpbnB1dHMgYXJlIDAuLk1BWEpTQU1QTEUsIHRoZSBvdXRwdXRzIG9mIHRoZXNlIGVxdWF0aW9ucworICAgICAgICogbXVzdCBiZSB0b287IHdlIGRvIG5vdCBuZWVkIGFuIGV4cGxpY2l0IHJhbmdlLWxpbWl0aW5nIG9wZXJhdGlvbi4KKyAgICAgICAqIEhlbmNlIHRoZSB2YWx1ZSBiZWluZyBzaGlmdGVkIGlzIG5ldmVyIG5lZ2F0aXZlLCBhbmQgd2UgZG9uJ3QKKyAgICAgICAqIG5lZWQgdGhlIGdlbmVyYWwgUklHSFRfU0hJRlQgbWFjcm8uCisgICAgICAgKi8KKyAgICAgIC8qIFkgKi8KKyAgICAgIG91dHB0cjBbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDYiAqLworICAgICAgb3V0cHRyMVtjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ0JfT0ZGXSArIGN0YWJbZytHX0NCX09GRl0gKyBjdGFiW2IrQl9DQl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICAgIC8qIENyICovCisgICAgICBvdXRwdHIyW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9DUl9PRkZdICsgY3RhYltnK0dfQ1JfT0ZGXSArIGN0YWJbYitCX0NSX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gUkdCIC0+IFlDYkNyICoqKioqKioqKioqKioqLworCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBSR0ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCB3aGljaCBpcyB0aGUgc2FtZQorICogYXMgdGhlIFJHQi0+WSBwb3J0aW9uIG9mIFJHQi0+WUNiQ3IuCisgKiBXZSBhc3N1bWUgcmdiX3ljY19zdGFydCBoYXMgYmVlbiBjYWxsZWQgKHdlIG9ubHkgdXNlIHRoZSBZIHRhYmxlcykuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZ2JfZ3JheV9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCByLCBnLCBiOworICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgciA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX1JFRF0pOworICAgICAgZyA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0dSRUVOXSk7CisgICAgICBiID0gR0VUSlNBTVBMRShpbnB0cltSR0JfQkxVRV0pOworICAgICAgaW5wdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICAgIC8qIFkgKi8KKyAgICAgIG91dHB0cltjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgQWRvYmUtc3R5bGUgQ01ZSy0+WUNDSyBjb252ZXJzaW9uLAorICogd2hlcmUgd2UgY29udmVydCBSPTEtQywgRz0xLU0sIGFuZCBCPTEtWSB0byBZQ2JDciB1c2luZyB0aGUgc2FtZQorICogY29udmVyc2lvbiBhcyBhYm92ZSwgd2hpbGUgcGFzc2luZyBLIChibGFjaykgdW5jaGFuZ2VkLgorICogV2UgYXNzdW1lIHJnYl95Y2Nfc3RhcnQgaGFzIGJlZW4gY2FsbGVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorY215a195Y2NrX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgciwgZywgYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMiwgb3V0cHRyMzsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOworICAgIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOworICAgIG91dHB0cjMgPSBvdXRwdXRfYnVmWzNdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgciA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzBdKTsKKyAgICAgIGcgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clsxXSk7CisgICAgICBiID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMl0pOworICAgICAgLyogSyBwYXNzZXMgdGhyb3VnaCBhcy1pcyAqLworICAgICAgb3V0cHRyM1tjb2xdID0gaW5wdHJbM107CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCisgICAgICBpbnB0ciArPSA0OworICAgICAgLyogSWYgdGhlIGlucHV0cyBhcmUgMC4uTUFYSlNBTVBMRSwgdGhlIG91dHB1dHMgb2YgdGhlc2UgZXF1YXRpb25zCisgICAgICAgKiBtdXN0IGJlIHRvbzsgd2UgZG8gbm90IG5lZWQgYW4gZXhwbGljaXQgcmFuZ2UtbGltaXRpbmcgb3BlcmF0aW9uLgorICAgICAgICogSGVuY2UgdGhlIHZhbHVlIGJlaW5nIHNoaWZ0ZWQgaXMgbmV2ZXIgbmVnYXRpdmUsIGFuZCB3ZSBkb24ndAorICAgICAgICogbmVlZCB0aGUgZ2VuZXJhbCBSSUdIVF9TSElGVCBtYWNyby4KKyAgICAgICAqLworICAgICAgLyogWSAqLworICAgICAgb3V0cHRyMFtjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICAgIC8qIENiICovCisgICAgICBvdXRwdHIxW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9DQl9PRkZdICsgY3RhYltnK0dfQ0JfT0ZGXSArIGN0YWJbYitCX0NCX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgICAgLyogQ3IgKi8KKyAgICAgIG91dHB0cjJbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX0NSX09GRl0gKyBjdGFiW2crR19DUl9PRkZdICsgY3RhYltiK0JfQ1JfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGdyYXlzY2FsZSBvdXRwdXQgd2l0aCBubyBjb252ZXJzaW9uLgorICogVGhlIHNvdXJjZSBjYW4gYmUgZWl0aGVyIHBsYWluIGdyYXlzY2FsZSBvciBZQ2JDciAoc2luY2UgWSA9PSBncmF5KS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2dyYXlzY2FsZV9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworICBpbnQgaW5zdHJpZGUgPSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIG91dHB0cltjb2xdID0gaW5wdHJbMF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGlucHRyICs9IGluc3RyaWRlOworICAgIH0KKyAgfQorfQorCisjaWZkZWYgRU5BQkxFX0FORFJPSURfTlVMTF9DT05WRVJUCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVSU5UMzI7CisKKyNkZWZpbmUgQjAobikgICAoKG4pICYgMHhGRikKKyNkZWZpbmUgQjEobikgICAoKChuKSA+PiA4KSAmIDB4RkYpCisjZGVmaW5lIEIyKG4pICAgKCgobikgPj4gMTYpICYgMHhGRikKKyNkZWZpbmUgQjMobikgICAoKG4pID4+IDI0KQorCisjZGVmaW5lIFBBQ0soYSwgYiwgYywgZCkgICAgKChhKSB8ICgoYikgPDwgOCkgfCAoKGMpIDw8IDE2KSB8ICgoZCkgPDwgMjQpKQorCitzdGF0aWMgaW50IHB0cl9pc19xdWFkKGNvbnN0IHZvaWQqIHApCit7CisgICAgcmV0dXJuICgoKGNvbnN0IGNoYXIqKXAgLSAoY29uc3QgY2hhciopMCkgJiAzKSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBjb3B5cXVhZHMoY29uc3QgVUlOVDMyIGluW10sIFVJTlQzMiBvdXQwW10sIFVJTlQzMiBvdXQxW10sIFVJTlQzMiBvdXQyW10sIGludCBjb2w0KQoreworICAgIGRvIHsKKyAgICAgICAgVUlOVDMyIHNyYzAgPSAqaW4rKzsKKyAgICAgICAgVUlOVDMyIHNyYzEgPSAqaW4rKzsKKyAgICAgICAgVUlOVDMyIHNyYzIgPSAqaW4rKzsKKyAgICAgICAgLy8gTEVuZGlhbgorICAgICAgICAqb3V0MCsrID0gUEFDSyhCMChzcmMwKSwgQjMoc3JjMCksIEIyKHNyYzEpLCBCMShzcmMyKSk7CisgICAgICAgICpvdXQxKysgPSBQQUNLKEIxKHNyYzApLCBCMChzcmMxKSwgQjMoc3JjMSksIEIyKHNyYzIpKTsKKyAgICAgICAgKm91dDIrKyA9IFBBQ0soQjIoc3JjMCksIEIxKHNyYzEpLCBCMChzcmMyKSwgQjMoc3JjMikpOworICAgIH0gd2hpbGUgKC0tY29sNCAhPSAwKTsKK30KKworI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBtdWx0aS1jb21wb25lbnQgY29sb3JzcGFjZXMgd2l0aG91dCBjb252ZXJzaW9uLgorICogV2UgYXNzdW1lIGlucHV0X2NvbXBvbmVudHMgPT0gbnVtX2NvbXBvbmVudHMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitudWxsX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJICAgICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICByZWdpc3RlciBpbnQgY2k7CisgIGludCBuYyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKworI2lmZGVmIEVOQUJMRV9BTkRST0lEX05VTExfQ09OVkVSVAorICAgIGlmICgxID09IG51bV9yb3dzICYmIDMgPT0gbmMgJiYgbnVtX2NvbHMgPiAwKSB7CisgICAgICAgIEpTQU1QUk9XIGlucHRyID0gKmlucHV0X2J1ZjsKKyAgICAgICAgSlNBTVBST1cgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107CisgICAgICAgIEpTQU1QUk9XIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOworICAgICAgICBKU0FNUFJPVyBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICAgICAgCisgICAgICAgIGludCBjb2wgPSBudW1fY29sczsKKyAgICAgICAgaW50IGNvbDQgPSBjb2wgPj4gMjsKKyAgICAgICAgaWYgKGNvbDQgPiAwICYmIHB0cl9pc19xdWFkKGlucHRyKSAmJiBwdHJfaXNfcXVhZChvdXRwdHIwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2lzX3F1YWQob3V0cHRyMSkgJiYgcHRyX2lzX3F1YWQob3V0cHRyMikpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgVUlOVDMyKiBpbiA9IChjb25zdCBVSU5UMzIqKWlucHRyOworICAgICAgICAgICAgVUlOVDMyKiBvdXQwID0gKFVJTlQzMiopb3V0cHRyMDsKKyAgICAgICAgICAgIFVJTlQzMiogb3V0MSA9IChVSU5UMzIqKW91dHB0cjE7CisgICAgICAgICAgICBVSU5UMzIqIG91dDIgPSAoVUlOVDMyKilvdXRwdHIyOworICAgICAgICAgICAgY29weXF1YWRzKGluLCBvdXQwLCBvdXQxLCBvdXQyLCBjb2w0KTsKKyAgICAgICAgICAgIGNvbCAmPSAzOworICAgICAgICAgICAgaWYgKDAgPT0gY29sKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNvbDQgPDw9IDI7CisgICAgICAgICAgICBpbnB0ciArPSBjb2w0ICogMzsgIC8qIHdlIHJlYWQgdGhpcyAzIHRpbWVzIHBlciBpbiBjb3B5cXVhZHMgKi8KKyAgICAgICAgICAgIG91dHB0cjAgKz0gY29sNDsKKyAgICAgICAgICAgIG91dHB0cjEgKz0gY29sNDsKKyAgICAgICAgICAgIG91dHB0cjIgKz0gY29sNDsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byB3aGlsZS1sb29wICovCisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgICAgKm91dHB0cjArKyA9ICppbnB0cisrOworICAgICAgICAgICAgKm91dHB0cjErKyA9ICppbnB0cisrOworICAgICAgICAgICAgKm91dHB0cjIrKyA9ICppbnB0cisrOworICAgICAgICB9IHdoaWxlICgtLWNvbCAhPSAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK1NMT1c6CisjZW5kaWYKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIC8qIEl0IHNlZW1zIGZhc3Rlc3QgdG8gbWFrZSBhIHNlcGFyYXRlIHBhc3MgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7CisgICAgICBpbnB0ciA9ICppbnB1dF9idWY7CisgICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2NpXVtvdXRwdXRfcm93XTsKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisJb3V0cHRyW2NvbF0gPSBpbnB0cltjaV07IC8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKwlpbnB0ciArPSBuYzsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfYnVmKys7CisgICAgb3V0cHV0X3JvdysrOworICB9Cit9CisKKworLyoKKyAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK251bGxfbWV0aG9kIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBuZWVkZWQgKi8KK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NvbG9yX2NvbnZlcnRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKKworICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29sb3JfY29udmVydGVyKSk7CisgIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKikgY2NvbnZlcnQ7CisgIC8qIHNldCBzdGFydF9wYXNzIHRvIG51bGwgbWV0aG9kIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCisgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IG51bGxfbWV0aG9kOworCisgIC8qIE1ha2Ugc3VyZSBpbnB1dF9jb21wb25lbnRzIGFncmVlcyB3aXRoIGluX2NvbG9yX3NwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyNpZiBSR0JfUElYRUxTSVpFICE9IDMKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCisKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICBjYXNlIEpDU19ZQ0NLOgorICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBKQ1NfVU5LTk9XTiBjYW4gYmUgYW55dGhpbmcgKi8KKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPCAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBDaGVjayBudW1fY29tcG9uZW50cywgc2V0IGNvbnZlcnNpb24gbWV0aG9kIGJhc2VkIG9uIHJlcXVlc3RlZCBzcGFjZSAqLworICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OworICAgIGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX2dyYXlfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCICYmIFJHQl9QSVhFTFNJWkUgPT0gMykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfeWNjX2NvbnZlcnQ7CisgICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBjbXlrX3ljY2tfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBhbGxvdyBudWxsIGNvbnZlcnNpb24gb2YgSkNTX1VOS05PV04gKi8KKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gY2luZm8tPmluX2NvbG9yX3NwYWNlIHx8CisJY2luZm8tPm51bV9jb21wb25lbnRzICE9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamNkY3RtZ3IuYyBiL2pjZGN0bWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmYTc5YgotLS0gL2Rldi9udWxsCisrKyBiL2pjZGN0bWdyLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBqY2RjdG1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvcndhcmQtRENUIG1hbmFnZW1lbnQgbG9naWMuCisgKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCisgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzIGluY2x1ZGluZyBjb2VmZmljaWVudAorICogcXVhbnRpemF0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gdGhlIERDVCByb3V0aW5lIGFjdHVhbGx5IGluIHVzZSAqLworICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdDsKKworICAvKiBUaGUgYWN0dWFsIHBvc3QtRENUIGRpdmlzb3JzIC0tLSBub3QgaWRlbnRpY2FsIHRvIHRoZSBxdWFudCB0YWJsZQorICAgKiBlbnRyaWVzLCBiZWNhdXNlIG9mIHNjYWxpbmcgKGVzcGVjaWFsbHkgZm9yIGFuIHVubm9ybWFsaXplZCBEQ1QpLgorICAgKiBFYWNoIHRhYmxlIGlzIGdpdmVuIGluIG5vcm1hbCBhcnJheSBvcmRlci4KKyAgICovCisgIERDVEVMRU0gKiBkaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIC8qIFNhbWUgYXMgYWJvdmUgZm9yIHRoZSBmbG9hdGluZy1wb2ludCBjYXNlLiAqLworICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19mbG9hdF9kY3Q7CisgIEZBU1RfRkxPQVQgKiBmbG9hdF9kaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisjZW5kaWYKK30gbXlfZmRjdF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2ZkY3RfY29udHJvbGxlciAqIG15X2ZkY3RfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqIFZlcmlmeSB0aGF0IGFsbCByZWZlcmVuY2VkIFEtdGFibGVzIGFyZSBwcmVzZW50LCBhbmQgc2V0IHVwCisgKiB0aGUgZGl2aXNvciB0YWJsZSBmb3IgZWFjaCBvbmUuCisgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgRENUIG9mIGFsbCBjb21wb25lbnRzIGlzIGRvbmUgZHVyaW5nCisgKiB0aGUgZmlyc3QgcGFzcywgZXZlbiBpZiBvbmx5IHNvbWUgY29tcG9uZW50cyB3aWxsIGJlIG91dHB1dCBpbiB0aGUKKyAqIGZpcnN0IHNjYW4uICBIZW5jZSBhbGwgY29tcG9uZW50cyBzaG91bGQgYmUgZXhhbWluZWQgaGVyZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfZmRjdG1nciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OworICBpbnQgY2ksIHF0YmxubywgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisgIERDVEVMRU0gKiBkdGJsOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOworICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KKyAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7CisgICAgcXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dOworICAgIC8qIENvbXB1dGUgZGl2aXNvcnMgZm9yIHRoaXMgcXVhbnQgdGFibGUgKi8KKyAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3Igc2FtZSB0YWJsZSwgYnV0IGl0J3Mgbm90IGEgYmlnIGRlYWwgKi8KKyAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JU0xPVzoKKyAgICAgIC8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgorICAgICAgICogY29lZmZpY2llbnRzIG11bHRpcGxpZWQgYnkgOCAodG8gY291bnRlcmFjdCBzY2FsaW5nKS4KKyAgICAgICAqLworICAgICAgaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCWZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7CisgICAgICB9CisgICAgICBkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJZHRibFtpXSA9ICgoRENURUxFTSkgcXRibC0+cXVhbnR2YWxbaV0pIDw8IDM7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfSUZBU1Q6CisgICAgICB7CisJLyogRm9yIEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCisJICovCisjZGVmaW5lIENPTlNUX0JJVFMgMTQKKwlzdGF0aWMgY29uc3QgSU5UMTYgYWFuc2NhbGVzW0RDVFNJWkUyXSA9IHsKKwkgIC8qIHByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTQgYml0cyAqLworCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAorCSAgMjE0MDcsIDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsICA1OTA2LAorCSAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAorCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMTI4NzMsIDE3ODU1LCAxNjgxOSwgMTUxMzcsIDEyODczLCAxMDExNCwgIDY5NjcsICAzNTUyLAorCSAgIDg4NjcsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAorCSAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3CisJfTsKKwlTSElGVF9URU1QUworCisJaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCSAgZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCisJICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJCURDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKKwl9CisJZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107CisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGR0YmxbaV0gPSAoRENURUxFTSkKKwkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCisJCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCisJCSAgICBDT05TVF9CSVRTLTMpOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9GTE9BVDoKKyAgICAgIHsKKwkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KKwkgKiBXaGF0J3MgYWN0dWFsbHkgc3RvcmVkIGlzIDEvZGl2aXNvciBzbyB0aGF0IHRoZSBpbm5lciBsb29wIGNhbgorCSAqIHVzZSBhIG11bHRpcGxpY2F0aW9uIHJhdGhlciB0aGFuIGEgZGl2aXNpb24uCisJICovCisJRkFTVF9GTE9BVCAqIGZkdGJsOworCWludCByb3csIGNvbDsKKwlzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yW0RDVFNJWkVdID0geworCSAgMS4wLCAxLjM4NzAzOTg0NSwgMS4zMDY1NjI5NjUsIDEuMTc1ODc1NjAyLAorCSAgMS4wLCAwLjc4NTY5NDk1OCwgMC41NDExOTYxMDAsIDAuMjc1ODk5Mzc5CisJfTsKKworCWlmIChmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKKwkgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPSAoRkFTVF9GTE9BVCAqKQorCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihGQVNUX0ZMT0FUKSk7CisJfQorCWZkdGJsID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXTsKKwlpID0gMDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7CisJICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7CisJICAgIGZkdGJsW2ldID0gKEZBU1RfRkxPQVQpCisJICAgICAgKDEuMCAvICgoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgorCQkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0gKiA4LjApKSk7CisJICAgIGkrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBmb3J3YXJkIERDVCBvbiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgYSBjb21wb25lbnQuCisgKgorICogVGhlIGlucHV0IHNhbXBsZXMgYXJlIHRha2VuIGZyb20gdGhlIHNhbXBsZV9kYXRhW10gYXJyYXkgc3RhcnRpbmcgYXQKKyAqIHBvc2l0aW9uIHN0YXJ0X3Jvdy9zdGFydF9jb2wsIGFuZCBtb3ZpbmcgdG8gdGhlIHJpZ2h0IGZvciBhbnkgYWRkaXRpb25hbAorICogYmxvY2tzLiBUaGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gY29lZl9ibG9ja3NbXS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZvcndhcmRfRENUIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCisJICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCisvKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgaW50ZWdlciBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19kY3Q7CisgIERDVEVMRU0gKiBkaXZpc29ycyA9IGZkY3QtPmRpdmlzb3JzW2NvbXBwdHItPnF1YW50X3RibF9ub107CisgIERDVEVMRU0gd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogd29yayBhcmVhIGZvciBGRENUIHN1YnJvdXRpbmUgKi8KKyAgSkRJTUVOU0lPTiBiaTsKKworICBzYW1wbGVfZGF0YSArPSBzdGFydF9yb3c7CS8qIGZvbGQgaW4gdGhlIHZlcnRpY2FsIG9mZnNldCBvbmNlICovCisKKyAgZm9yIChiaSA9IDA7IGJpIDwgbnVtX2Jsb2NrczsgYmkrKywgc3RhcnRfY29sICs9IERDVFNJWkUpIHsKKyAgICAvKiBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UsIGFwcGx5aW5nIHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSAqd29ya3NwYWNlcHRyOworICAgICAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKKyAgICAgIHJlZ2lzdGVyIGludCBlbGVtcjsKKworICAgICAgd29ya3NwYWNlcHRyID0gd29ya3NwYWNlOworICAgICAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgeworCWVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7CisjaWYgRENUU0laRSA9PSA4CQkvKiB1bnJvbGwgdGhlIGlubmVyIGxvb3AgKi8KKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKyNlbHNlCisJeyByZWdpc3RlciBpbnQgZWxlbWM7CisJICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7CisJICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSAgfQorCX0KKyNlbmRpZgorICAgICAgfQorICAgIH0KKworICAgIC8qIFBlcmZvcm0gdGhlIERDVCAqLworICAgICgqZG9fZGN0KSAod29ya3NwYWNlKTsKKworICAgIC8qIFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9ja3NbXSAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSB0ZW1wLCBxdmFsOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICByZWdpc3RlciBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9ja3NbYmldOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCXF2YWwgPSBkaXZpc29yc1tpXTsKKwl0ZW1wID0gd29ya3NwYWNlW2ldOworCS8qIERpdmlkZSB0aGUgY29lZmZpY2llbnQgdmFsdWUgYnkgcXZhbCwgZW5zdXJpbmcgcHJvcGVyIHJvdW5kaW5nLgorCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQorCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgorCSAqCisJICogSW4gbW9zdCBmaWxlcywgYXQgbGVhc3QgaGFsZiBvZiB0aGUgb3V0cHV0IHZhbHVlcyB3aWxsIGJlIHplcm8KKwkgKiAoYXQgZGVmYXVsdCBxdWFudGl6YXRpb24gc2V0dGluZ3MsIG1vcmUgbGlrZSB0aHJlZS1xdWFydGVycy4uLikKKwkgKiBzbyB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhpcyBjYXNlIGlzIGZhc3QuICBPbiBtYW55IG1hY2hpbmVzLAorCSAqIGEgY29tcGFyaXNvbiBpcyBlbm91Z2ggY2hlYXBlciB0aGFuIGEgZGl2aWRlIHRvIG1ha2UgYSBzcGVjaWFsIHRlc3QKKwkgKiBhIHdpbi4gIFNpbmNlIGJvdGggaW5wdXRzIHdpbGwgYmUgbm9ubmVnYXRpdmUsIHdlIG5lZWQgb25seSB0ZXN0CisJICogZm9yIGEgPCBiIHRvIGRpc2NvdmVyIHdoZXRoZXIgYS9iIGlzIDAuCisJICogSWYgeW91ciBtYWNoaW5lJ3MgZGl2aXNpb24gaXMgZmFzdCBlbm91Z2gsIGRlZmluZSBGQVNUX0RJVklERS4KKwkgKi8KKyNpZmRlZiBGQVNUX0RJVklERQorI2RlZmluZSBESVZJREVfQlkoYSxiKQlhIC89IGIKKyNlbHNlCisjZGVmaW5lIERJVklERV9CWShhLGIpCWlmIChhID49IGIpIGEgLz0gYjsgZWxzZSBhID0gMAorI2VuZGlmCisJaWYgKHRlbXAgPCAwKSB7CisJICB0ZW1wID0gLXRlbXA7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCSAgdGVtcCA9IC10ZW1wOworCX0gZWxzZSB7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCX0KKwlvdXRwdXRfcHRyW2ldID0gKEpDT0VGKSB0ZW1wOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisKK01FVEhPRERFRih2b2lkKQorZm9yd2FyZF9EQ1RfZmxvYXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAorCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJCSAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykKKy8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciBmbG9hdGluZy1wb2ludCBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZmxvYXRfZGN0OworICBGQVNUX0ZMT0FUICogZGl2aXNvcnMgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOworICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCisgIEpESU1FTlNJT04gYmk7CisKKyAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLworCisgIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7CisgICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgKndvcmtzcGFjZXB0cjsKKyAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7CisgICAgICByZWdpc3RlciBpbnQgZWxlbXI7CisKKyAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKKyAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKKwllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOworI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworI2Vsc2UKKwl7IHJlZ2lzdGVyIGludCBlbGVtYzsKKwkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKKwkgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpCisJICAgICAgKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkgIH0KKwl9CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KKyAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7CisKKyAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgdGVtcDsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkvKiBBcHBseSB0aGUgcXVhbnRpemF0aW9uIGFuZCBzY2FsaW5nIGZhY3RvciAqLworCXRlbXAgPSB3b3Jrc3BhY2VbaV0gKiBkaXZpc29yc1tpXTsKKwkvKiBSb3VuZCB0byBuZWFyZXN0IGludGVnZXIuCisJICogU2luY2UgQyBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2Ygcm91bmRpbmcgZm9yIG5lZ2F0aXZlCisJICogcXVvdGllbnRzLCB3ZSBoYXZlIHRvIGZvcmNlIHRoZSBkaXZpZGVuZCBwb3NpdGl2ZSBmb3IgcG9ydGFiaWxpdHkuCisJICogVGhlIG1heGltdW0gY29lZmZpY2llbnQgc2l6ZSBpcyArLTE2SyAoZm9yIDEyLWJpdCBkYXRhKSwgc28gdGhpcworCSAqIGNvZGUgc2hvdWxkIHdvcmsgZm9yIGVpdGhlciAxNi1iaXQgb3IgMzItYml0IGludHMuCisJICovCisJb3V0cHV0X3B0cltpXSA9IChKQ09FRikgKChpbnQpICh0ZW1wICsgKEZBU1RfRkxPQVQpIDE2Mzg0LjUpIC0gMTYzODQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIEZEQ1QgbWFuYWdlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2ZvcndhcmRfZGN0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZmRjdF9wdHIgZmRjdDsKKyAgaW50IGk7CisKKyAgZmRjdCA9IChteV9mZGN0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9mZGN0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmZkY3QgPSAoc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKikgZmRjdDsKKyAgZmRjdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2ZkY3RtZ3I7CisKKyAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgeworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lTTE9XOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pc2xvdzsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lGQVNUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pZmFzdDsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0ZMT0FUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUX2Zsb2F0OworICAgIGZkY3QtPmRvX2Zsb2F0X2RjdCA9IGpwZWdfZmRjdF9mbG9hdDsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIE1hcmsgZGl2aXNvciB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBmZGN0LT5kaXZpc29yc1tpXSA9IE5VTEw7CisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW2ldID0gTlVMTDsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS9qY2h1ZmYuYyBiL2pjaHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMzUyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qY2h1ZmYuYwpAQCAtMCwwICsxLDkwOSBAQAorLyoKKyAqIGpjaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIG91dHB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCisgKiBiYWNrIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlCisgKiB2YXJpYWJsZXMgaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZQorICogcGVybWFuZW50IEpQRUcgb2JqZWN0cyBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamNodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamNwaHVmZi5jICovCisKKworLyogRXhwYW5kZWQgZW50cm9weSBlbmNvZGVyIG9iamVjdCBmb3IgSHVmZm1hbiBlbmNvZGluZy4KKyAqCisgKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCisgKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UMzIgcHV0X2J1ZmZlcjsJCS8qIGN1cnJlbnQgYml0LWFjY3VtdWxhdGlvbiBidWZmZXIgKi8KKyAgaW50IHB1dF9iaXRzOwkJCS8qICMgb2YgYml0cyBub3cgaW4gaXQgKi8KKyAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLworfSBzYXZhYmxlX3N0YXRlOworCisvKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCisgKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KKyAqLworCisjaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQorI2Vsc2UKKyNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0CisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKKwkoKGRlc3QpLnB1dF9idWZmZXIgPSAoc3JjKS5wdXRfYnVmZmVyLCBcCisJIChkZXN0KS5wdXRfYml0cyA9IChzcmMpLnB1dF9iaXRzLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQorI2VuZGlmCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogQml0IGJ1ZmZlciAmIERDIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLworICBjX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworICBjX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECS8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb24gKi8KKyAgbG9uZyAqIGRjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107CisgIGxvbmcgKiBhY19jb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworI2VuZGlmCit9IGh1ZmZfZW50cm9weV9lbmNvZGVyOworCit0eXBlZGVmIGh1ZmZfZW50cm9weV9lbmNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKKworLyogV29ya2luZyBzdGF0ZSB3aGlsZSB3cml0aW5nIGFuIE1DVS4KKyAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGFsbCB0aGUgZmllbGRzIHRoYXQgYXJlIG5lZWRlZCBieSBzdWJyb3V0aW5lcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KKyAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKyAgc2F2YWJsZV9zdGF0ZSBjdXI7CQkvKiBDdXJyZW50IGJpdCBidWZmZXIgJiBEQyBzdGF0ZSAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGR1bXBfYnVmZmVyIG5lZWRzIGFjY2VzcyB0byB0aGlzICovCit9IHdvcmtpbmdfc3RhdGU7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2dhdGhlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqIElmIGdhdGhlcl9zdGF0aXN0aWNzIGlzIFRSVUUsIHdlIGRvIG5vdCBvdXRwdXQgYW55dGhpbmcgZHVyaW5nIHRoZSBzY2FuLAorICoganVzdCBjb3VudCB0aGUgSHVmZm1hbiBzeW1ib2xzIHVzZWQgYW5kIGdlbmVyYXRlIEh1ZmZtYW4gY29kZSB0YWJsZXMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaSwgZGN0YmwsIGFjdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfZ2F0aGVyOworICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2dhdGhlcjsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2h1ZmY7CisgICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfaHVmZjsKKyAgfQorCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIHRhYmxlIGluZGV4ZXMgKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKGRjdGJsIDwgMCB8fCBkY3RibCA+PSBOVU1fSFVGRl9UQkxTKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGRjdGJsKTsKKyAgICAgIGlmIChhY3RibCA8IDAgfHwgYWN0YmwgPj0gTlVNX0hVRkZfVEJMUykKKwlFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBhY3RibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9PSBOVUxMKQorCWVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID0gKGxvbmcgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKKyAgICAgIE1FTVpFUk8oZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgICBpZiAoZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9IChsb25nICopCisJICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgICBNRU1aRVJPKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCisgICAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLworICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKKyAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgYWN0YmwsCisJCQkgICAgICAmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOworICAgIH0KKyAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnNhdmVkLnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5zYXZlZC5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qCisgKiBDb21wdXRlIHRoZSBkZXJpdmVkIHZhbHVlcyBmb3IgYSBIdWZmbWFuIHRhYmxlLgorICogVGhpcyByb3V0aW5lIGFsc28gcGVyZm9ybXMgc29tZSB2YWxpZGF0aW9uIGNoZWNrcyBvbiB0aGUgdGFibGUuCisgKgorICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX21ha2VfY19kZXJpdmVkX3RibCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCQkJIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpCit7CisgIEpIVUZGX1RCTCAqaHRibDsKKyAgY19kZXJpdmVkX3RibCAqZHRibDsKKyAgaW50IHAsIGksIGwsIGxhc3RwLCBzaSwgbWF4c3ltYm9sOworICBjaGFyIGh1ZmZzaXplWzI1N107CisgIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOworICB1bnNpZ25lZCBpbnQgY29kZTsKKworICAvKiBOb3RlIHRoYXQgaHVmZnNpemVbXSBhbmQgaHVmZmNvZGVbXSBhcmUgZmlsbGVkIGluIGNvZGUtbGVuZ3RoIG9yZGVyLAorICAgKiBwYXJhbGxlbGluZyB0aGUgb3JkZXIgb2YgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpbiBodGJsLT5odWZmdmFsW10uCisgICAqLworCisgIC8qIEZpbmQgdGhlIGlucHV0IEh1ZmZtYW4gdGFibGUgKi8KKyAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fSFVGRl9UQkxTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKyAgaHRibCA9CisgICAgaXNEQyA/IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibG5vXSA6IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibG5vXTsKKyAgaWYgKGh0YmwgPT0gTlVMTCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7CisKKyAgLyogQWxsb2NhdGUgYSB3b3Jrc3BhY2UgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uICovCisgIGlmICgqcGR0YmwgPT0gTlVMTCkKKyAgICAqcGR0YmwgPSAoY19kZXJpdmVkX3RibCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihjX2Rlcml2ZWRfdGJsKSk7CisgIGR0YmwgPSAqcGR0Ymw7CisgIAorICAvKiBGaWd1cmUgQy4xOiBtYWtlIHRhYmxlIG9mIEh1ZmZtYW4gY29kZSBsZW5ndGggZm9yIGVhY2ggc3ltYm9sICovCisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgeworICAgIGkgPSAoaW50KSBodGJsLT5iaXRzW2xdOworICAgIGlmIChpIDwgMCB8fCBwICsgaSA+IDI1NikJLyogcHJvdGVjdCBhZ2FpbnN0IHRhYmxlIG92ZXJydW4gKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIHdoaWxlIChpLS0pCisgICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7CisgIH0KKyAgaHVmZnNpemVbcF0gPSAwOworICBsYXN0cCA9IHA7CisgIAorICAvKiBGaWd1cmUgQy4yOiBnZW5lcmF0ZSB0aGUgY29kZXMgdGhlbXNlbHZlcyAqLworICAvKiBXZSBhbHNvIHZhbGlkYXRlIHRoYXQgdGhlIGNvdW50cyByZXByZXNlbnQgYSBsZWdhbCBIdWZmbWFuIGNvZGUgdHJlZS4gKi8KKworICBjb2RlID0gMDsKKyAgc2kgPSBodWZmc2l6ZVswXTsKKyAgcCA9IDA7CisgIHdoaWxlIChodWZmc2l6ZVtwXSkgeworICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IHNpKSB7CisgICAgICBodWZmY29kZVtwKytdID0gY29kZTsKKyAgICAgIGNvZGUrKzsKKyAgICB9CisgICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKKyAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBzaSkpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBjb2RlIDw8PSAxOworICAgIHNpKys7CisgIH0KKyAgCisgIC8qIEZpZ3VyZSBDLjM6IGdlbmVyYXRlIGVuY29kaW5nIHRhYmxlcyAqLworICAvKiBUaGVzZSBhcmUgY29kZSBhbmQgc2l6ZSBpbmRleGVkIGJ5IHN5bWJvbCB2YWx1ZSAqLworCisgIC8qIFNldCBhbGwgY29kZWxlc3Mgc3ltYm9scyB0byBoYXZlIGNvZGUgbGVuZ3RoIDA7CisgICAqIHRoaXMgbGV0cyB1cyBkZXRlY3QgZHVwbGljYXRlIFZBTCBlbnRyaWVzIGhlcmUsIGFuZCBsYXRlcgorICAgKiBhbGxvd3MgZW1pdF9iaXRzIHRvIGRldGVjdCBhbnkgYXR0ZW1wdCB0byBlbWl0IHN1Y2ggc3ltYm9scy4KKyAgICovCisgIE1FTVpFUk8oZHRibC0+ZWh1ZnNpLCBTSVpFT0YoZHRibC0+ZWh1ZnNpKSk7CisKKyAgLyogVGhpcyBpcyBhbHNvIGEgY29udmVuaWVudCBwbGFjZSB0byBjaGVjayBmb3Igb3V0LW9mLXJhbmdlCisgICAqIGFuZCBkdXBsaWNhdGVkIFZBTCBlbnRyaWVzLiAgV2UgYWxsb3cgMC4uMjU1IGZvciBBQyBzeW1ib2xzCisgICAqIGJ1dCBvbmx5IDAuLjE1IGZvciBEQy4gIChXZSBjb3VsZCBjb25zdHJhaW4gdGhlbSBmdXJ0aGVyCisgICAqIGJhc2VkIG9uIGRhdGEgZGVwdGggYW5kIG1vZGUsIGJ1dCB0aGlzIHNlZW1zIGVub3VnaC4pCisgICAqLworICBtYXhzeW1ib2wgPSBpc0RDID8gMTUgOiAyNTU7CisKKyAgZm9yIChwID0gMDsgcCA8IGxhc3RwOyBwKyspIHsKKyAgICBpID0gaHRibC0+aHVmZnZhbFtwXTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+IG1heHN5bWJvbCB8fCBkdGJsLT5laHVmc2lbaV0pCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBkdGJsLT5laHVmY29baV0gPSBodWZmY29kZVtwXTsKKyAgICBkdGJsLT5laHVmc2lbaV0gPSBodWZmc2l6ZVtwXTsKKyAgfQorfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUgKi8KKworLyogRW1pdCBhIGJ5dGUsIHRha2luZyAnYWN0aW9uJyBpZiBtdXN0IHN1c3BlbmQuICovCisjZGVmaW5lIGVtaXRfYnl0ZShzdGF0ZSx2YWwsYWN0aW9uKSAgXAorCXsgKihzdGF0ZSktPm5leHRfb3V0cHV0X2J5dGUrKyA9IChKT0NURVQpICh2YWwpOyAgXAorCSAgaWYgKC0tKHN0YXRlKS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgaWYgKCEgZHVtcF9idWZmZXIoc3RhdGUpKSAgXAorCSAgICAgIHsgYWN0aW9uOyB9IH0KKworCitMT0NBTChib29sZWFuKQorZHVtcF9idWZmZXIgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKKy8qIEVtcHR5IHRoZSBvdXRwdXQgYnVmZmVyOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IHN0YXRlLT5jaW5mby0+ZGVzdDsKKworICBpZiAoISAoKmRlc3QtPmVtcHR5X291dHB1dF9idWZmZXIpIChzdGF0ZS0+Y2luZm8pKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogQWZ0ZXIgYSBzdWNjZXNzZnVsIGJ1ZmZlciBkdW1wLCBtdXN0IHJlc2V0IGJ1ZmZlciBwb2ludGVycyAqLworICBzdGF0ZS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIHN0YXRlLT5mcmVlX2luX2J1ZmZlciA9IGRlc3QtPmZyZWVfaW5fYnVmZmVyOworICByZXR1cm4gVFJVRTsKK30KKworCisvKiBPdXRwdXR0aW5nIGJpdHMgdG8gdGhlIGZpbGUgKi8KKworLyogT25seSB0aGUgcmlnaHQgMjQgYml0cyBvZiBwdXRfYnVmZmVyIGFyZSB1c2VkOyB0aGUgdmFsaWQgYml0cyBhcmUKKyAqIGxlZnQtanVzdGlmaWVkIGluIHRoaXMgcGFydC4gIEF0IG1vc3QgMTYgYml0cyBjYW4gYmUgcGFzc2VkIHRvIGVtaXRfYml0cworICogaW4gb25lIGNhbGwsIGFuZCB3ZSBuZXZlciByZXRhaW4gbW9yZSB0aGFuIDcgYml0cyBpbiBwdXRfYnVmZmVyCisgKiBiZXR3ZWVuIGNhbGxzLCBzbyAyNCBiaXRzIGFyZSBzdWZmaWNpZW50LgorICovCisKK0lOTElORQorTE9DQUwoYm9vbGVhbikKK2VtaXRfYml0cyAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHNpemUpCisvKiBFbWl0IHNvbWUgYml0czsgcmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgbXVzdCBzdXNwZW5kICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IHN0YXRlLT5jdXIucHV0X2JpdHM7CisKKyAgLyogaWYgc2l6ZSBpcyAwLCBjYWxsZXIgdXNlZCBhbiBpbnZhbGlkIEh1ZmZtYW4gdGFibGUgZW50cnkgKi8KKyAgaWYgKHNpemUgPT0gMCkKKyAgICBFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgcHV0X2J1ZmZlciAmPSAoKChJTlQzMikgMSk8PHNpemUpIC0gMTsgLyogbWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gY29kZSAqLworICAKKyAgcHV0X2JpdHMgKz0gc2l6ZTsJCS8qIG5ldyBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KKyAgCisgIHB1dF9idWZmZXIgPDw9IDI0IC0gcHV0X2JpdHM7IC8qIGFsaWduIGluY29taW5nIGJpdHMgKi8KKworICBwdXRfYnVmZmVyIHw9IHN0YXRlLT5jdXIucHV0X2J1ZmZlcjsgLyogYW5kIG1lcmdlIHdpdGggb2xkIGJ1ZmZlciBjb250ZW50cyAqLworICAKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoc3RhdGUsIGMsIHJldHVybiBGQUxTRSk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShzdGF0ZSwgMCwgcmV0dXJuIEZBTFNFKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gcHV0X2J1ZmZlcjsgLyogdXBkYXRlIHN0YXRlIHZhcmlhYmxlcyAqLworICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gcHV0X2JpdHM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2ZsdXNoX2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKK3sKKyAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAweDdGLCA3KSkgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLworICAgIHJldHVybiBGQUxTRTsKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gMDsJLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgc3RhdGUtPmN1ci5wdXRfYml0cyA9IDA7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qIEVuY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCitMT0NBTChib29sZWFuKQorZW5jb2RlX29uZV9ibG9jayAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCBKQ09FRlBUUiBibG9jaywgaW50IGxhc3RfZGNfdmFsLAorCQkgIGNfZGVyaXZlZF90YmwgKmRjdGJsLCBjX2Rlcml2ZWRfdGJsICphY3RibCkKK3sKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCBrLCByLCBpOworICAKKyAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEYuMS4yLjEgKi8KKyAgCisgIHRlbXAgPSB0ZW1wMiA9IGJsb2NrWzBdIC0gbGFzdF9kY192YWw7CisKKyAgaWYgKHRlbXAgPCAwKSB7CisgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KKyAgICAvKiBGb3IgYSBuZWdhdGl2ZSBpbnB1dCwgd2FudCB0ZW1wMiA9IGJpdHdpc2UgY29tcGxlbWVudCBvZiBhYnMoaW5wdXQpICovCisgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgdGVtcDItLTsKKyAgfQorICAKKyAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICBuYml0cyA9IDA7CisgIHdoaWxlICh0ZW1wKSB7CisgICAgbmJpdHMrKzsKKyAgICB0ZW1wID4+PSAxOworICB9CisgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgorICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgorICAgKi8KKyAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQorICAgIEVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgIAorICAvKiBFbWl0IHRoZSBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmb3IgdGhlIG51bWJlciBvZiBiaXRzICovCisgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgZGN0YmwtPmVodWZjb1tuYml0c10sIGRjdGJsLT5laHVmc2lbbmJpdHNdKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCisgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICBpZiAobmJpdHMpCQkJLyogZW1pdF9iaXRzIHJlamVjdHMgY2FsbHMgd2l0aCBzaXplIDAgKi8KKyAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzB4RjBdLCBhY3RibC0+ZWh1ZnNpWzB4RjBdKSkKKwkgIHJldHVybiBGQUxTRTsKKwlyIC09IDE2OworICAgICAgfQorCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgICBpZiAodGVtcCA8IDApIHsKKwl0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworCS8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLworCXRlbXAyLS07CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgICAgIG5iaXRzID0gMTsJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCisgICAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorCW5iaXRzKys7CisgICAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLworICAgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKwlFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOworICAgICAgCisgICAgICAvKiBFbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KKyAgICAgIGkgPSAociA8PCA0KSArIG5iaXRzOworICAgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvW2ldLCBhY3RibC0+ZWh1ZnNpW2ldKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCisgICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisJcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICByID0gMDsKKyAgICB9CisgIH0KKworICAvKiBJZiB0aGUgbGFzdCBjb2VmKHMpIHdlcmUgemVybywgZW1pdCBhbiBlbmQtb2YtYmxvY2sgY29kZSAqLworICBpZiAociA+IDApCisgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzBdLCBhY3RibC0+ZWh1ZnNpWzBdKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTChib29sZWFuKQorZW1pdF9yZXN0YXJ0ICh3b3JraW5nX3N0YXRlICogc3RhdGUsIGludCByZXN0YXJ0X251bSkKK3sKKyAgaW50IGNpOworCisgIGlmICghIGZsdXNoX2JpdHMoc3RhdGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBlbWl0X2J5dGUoc3RhdGUsIDB4RkYsIHJldHVybiBGQUxTRSk7CisgIGVtaXRfYnl0ZShzdGF0ZSwgSlBFR19SU1QwICsgcmVzdGFydF9udW0sIHJldHVybiBGQUxTRSk7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IHN0YXRlLT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICBzdGF0ZS0+Y3VyLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisKKyAgLyogVGhlIHJlc3RhcnQgY291bnRlciBpcyBub3QgdXBkYXRlZCB1bnRpbCB3ZSBzdWNjZXNzZnVsbHkgd3JpdGUgdGhlIE1DVS4gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW5jb2RlIGFuZCBvdXRwdXQgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitlbmNvZGVfbWN1X2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIGVtaXRfcmVzdGFydCgmc3RhdGUsIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoISBlbmNvZGVfb25lX2Jsb2NrKCZzdGF0ZSwKKwkJCSAgIE1DVV9kYXRhW2Jsa25dWzBdLCBzdGF0ZS5jdXIubGFzdF9kY192YWxbY2ldLAorCQkJICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub10sCisJCQkgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbY29tcHB0ci0+YWNfdGJsX25vXSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogVXBkYXRlIGxhc3RfZGNfdmFsICovCisgICAgc3RhdGUuY3VyLmxhc3RfZGNfdmFsW2NpXSA9IE1DVV9kYXRhW2Jsa25dWzBdWzBdOworICB9CisKKyAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gc3RhdGUubmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gc3RhdGUuZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlIC4uLiBmbHVzaF9iaXRzIG5lZWRzIGl0ICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBGbHVzaCBvdXQgdGhlIGxhc3QgZGF0YSAqLworICBpZiAoISBmbHVzaF9iaXRzKCZzdGF0ZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworCisgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IHN0YXRlLm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IHN0YXRlLmZyZWVfaW5fYnVmZmVyOworICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlLmN1cik7Cit9CisKKworLyoKKyAqIEh1ZmZtYW4gY29kaW5nIG9wdGltaXphdGlvbi4KKyAqCisgKiBXZSBmaXJzdCBzY2FuIHRoZSBzdXBwbGllZCBkYXRhIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgZWFjaCBzeW1ib2wKKyAqIHRoYXQgaXMgdG8gYmUgSHVmZm1hbi1jb2RlZC4gKFRoaXMgcHJvY2VzcyBNVVNUIGFncmVlIHdpdGggdGhlIGNvZGUgYWJvdmUuKQorICogVGhlbiB3ZSBidWlsZCBhIEh1ZmZtYW4gY29kaW5nIHRyZWUgZm9yIHRoZSBvYnNlcnZlZCBjb3VudHMuCisgKiBTeW1ib2xzIHdoaWNoIGFyZSBub3QgbmVlZGVkIGF0IGFsbCBmb3IgdGhlIHBhcnRpY3VsYXIgaW1hZ2UgYXJlIG5vdAorICogYXNzaWduZWQgYW55IGNvZGUsIHdoaWNoIHNhdmVzIHNwYWNlIGluIHRoZSBESFQgbWFya2VyIGFzIHdlbGwgYXMgaW4KKyAqIHRoZSBjb21wcmVzc2VkIGRhdGEuCisgKi8KKworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorCisKKy8qIFByb2Nlc3MgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KKworTE9DQUwodm9pZCkKK2h0ZXN0X29uZV9ibG9jayAoal9jb21wcmVzc19wdHIgY2luZm8sIEpDT0VGUFRSIGJsb2NrLCBpbnQgbGFzdF9kY192YWwsCisJCSBsb25nIGRjX2NvdW50c1tdLCBsb25nIGFjX2NvdW50c1tdKQoreworICByZWdpc3RlciBpbnQgdGVtcDsKKyAgcmVnaXN0ZXIgaW50IG5iaXRzOworICByZWdpc3RlciBpbnQgaywgcjsKKyAgCisgIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBGLjEuMi4xICovCisgIAorICB0ZW1wID0gYmxvY2tbMF0gLSBsYXN0X2RjX3ZhbDsKKyAgaWYgKHRlbXAgPCAwKQorICAgIHRlbXAgPSAtdGVtcDsKKyAgCisgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgbmJpdHMgPSAwOworICB3aGlsZSAodGVtcCkgeworICAgIG5iaXRzKys7CisgICAgdGVtcCA+Pj0gMTsKKyAgfQorICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcy4KKyAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICovCisgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMrMSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisKKyAgLyogQ291bnQgdGhlIEh1ZmZtYW4gc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KKyAgZGNfY291bnRzW25iaXRzXSsrOworICAKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJYWNfY291bnRzWzB4RjBdKys7CisJciAtPSAxNjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgaWYgKHRlbXAgPCAwKQorCXRlbXAgPSAtdGVtcDsKKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KKyAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisJbmJpdHMrKzsKKyAgICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKyAgICAgIAorICAgICAgLyogQ291bnQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgICAgYWNfY291bnRzWyhyIDw8IDQpICsgbmJpdHNdKys7CisgICAgICAKKyAgICAgIHIgPSAwOworICAgIH0KKyAgfQorCisgIC8qIElmIHRoZSBsYXN0IGNvZWYocykgd2VyZSB6ZXJvLCBlbWl0IGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChyID4gMCkKKyAgICBhY19jb3VudHNbMF0rKzsKK30KKworCisvKgorICogVHJpYWwtZW5jb2RlIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogTm8gZGF0YSBpcyBhY3R1YWxseSBvdXRwdXQsIHNvIG5vIHN1c3BlbnNpb24gcmV0dXJuIGlzIHBvc3NpYmxlLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogVGFrZSBjYXJlIG9mIHJlc3RhcnQgaW50ZXJ2YWxzIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKwllbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICAgICAgLyogVXBkYXRlIHJlc3RhcnQgc3RhdGUgKi8KKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgaHRlc3Rfb25lX2Jsb2NrKGNpbmZvLCBNQ1VfZGF0YVtibGtuXVswXSwgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldLAorCQkgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tjb21wcHRyLT5kY190Ymxfbm9dLAorCQkgICAgZW50cm9weS0+YWNfY291bnRfcHRyc1tjb21wcHRyLT5hY190Ymxfbm9dKTsKKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSBNQ1VfZGF0YVtibGtuXVswXVswXTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBHZW5lcmF0ZSB0aGUgYmVzdCBIdWZmbWFuIGNvZGUgdGFibGUgZm9yIHRoZSBnaXZlbiBjb3VudHMsIGZpbGwgaHRibC4KKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamNwaHVmZi5jLgorICoKKyAqIFRoZSBKUEVHIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgbm8gc3ltYm9sIGJlIGFzc2lnbmVkIGEgY29kZXdvcmQgb2YgYWxsCisgKiBvbmUgYml0cyAoc28gdGhhdCBwYWRkaW5nIGJpdHMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgc2VnbWVudAorICogY2FuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY29kZSkuICBCZWNhdXNlIG9mIHRoZSBjYW5vbmljYWwgb3JkZXJpbmcgb2YKKyAqIGNvZGV3b3JkcywgdGhpcyBqdXN0IG1lYW5zIHRoYXQgdGhlcmUgbXVzdCBiZSBhbiB1bnVzZWQgc2xvdCBpbiB0aGUKKyAqIGxvbmdlc3QgY29kZXdvcmQgbGVuZ3RoIGNhdGVnb3J5LiAgU2VjdGlvbiBLLjIgb2YgdGhlIEpQRUcgc3BlYyBzdWdnZXN0cworICogcmVzZXJ2aW5nIHN1Y2ggYSBzbG90IGJ5IHByZXRlbmRpbmcgdGhhdCBzeW1ib2wgMjU2IGlzIGEgdmFsaWQgc3ltYm9sCisgKiB3aXRoIGNvdW50IDEuICBJbiB0aGVvcnkgdGhhdCdzIG5vdCBvcHRpbWFsOyBnaXZpbmcgaXQgY291bnQgemVybyBidXQKKyAqIGluY2x1ZGluZyBpdCBpbiB0aGUgc3ltYm9sIHNldCBhbnl3YXkgc2hvdWxkIGdpdmUgYSBiZXR0ZXIgSHVmZm1hbiBjb2RlLgorICogQnV0IHRoZSB0aGVvcmV0aWNhbGx5IGJldHRlciBjb2RlIGFjdHVhbGx5IHNlZW1zIHRvIGNvbWUgb3V0IHdvcnNlIGluCisgKiBwcmFjdGljZSwgYmVjYXVzZSBpdCBwcm9kdWNlcyBtb3JlIGFsbC1vbmVzIGJ5dGVzICh3aGljaCBpbmN1ciBzdHVmZmVkCisgKiB6ZXJvIGJ5dGVzIGluIHRoZSBmaW5hbCBmaWxlKS4gIEluIGFueSBjYXNlIHRoZSBkaWZmZXJlbmNlIGlzIHRpbnkuCisgKgorICogVGhlIEpQRUcgc3RhbmRhcmQgcmVxdWlyZXMgSHVmZm1hbiBjb2RlcyB0byBiZSBubyBtb3JlIHRoYW4gMTYgYml0cyBsb25nLgorICogSWYgc29tZSBzeW1ib2xzIGhhdmUgYSB2ZXJ5IHNtYWxsIGJ1dCBub256ZXJvIHByb2JhYmlsaXR5LCB0aGUgSHVmZm1hbiB0cmVlCisgKiBtdXN0IGJlIGFkanVzdGVkIHRvIG1lZXQgdGhlIGNvZGUgbGVuZ3RoIHJlc3RyaWN0aW9uLiAgV2UgY3VycmVudGx5IHVzZQorICogdGhlIGFkanVzdG1lbnQgbWV0aG9kIHN1Z2dlc3RlZCBpbiBKUEVHIHNlY3Rpb24gSy4yLiAgVGhpcyBtZXRob2QgaXMgKm5vdCoKKyAqIG9wdGltYWw7IGl0IG1heSBub3QgY2hvb3NlIHRoZSBiZXN0IHBvc3NpYmxlIGxpbWl0ZWQtbGVuZ3RoIGNvZGUuICBCdXQKKyAqIHR5cGljYWxseSBvbmx5IHZlcnktbG93LWZyZXF1ZW5jeSBzeW1ib2xzIHdpbGwgYmUgZ2l2ZW4gbGVzcy10aGFuLW9wdGltYWwKKyAqIGxlbmd0aHMsIHNvIHRoZSBjb2RlIGlzIGFsbW9zdCBvcHRpbWFsLiAgRXhwZXJpbWVudGFsIGNvbXBhcmlzb25zIGFnYWluc3QKKyAqIGFuIG9wdGltYWwgbGltaXRlZC1sZW5ndGgtY29kZSBhbGdvcml0aG0gaW5kaWNhdGUgdGhhdCB0aGUgZGlmZmVyZW5jZSBpcworICogbWljcm9zY29waWMgLS0tIHVzdWFsbHkgbGVzcyB0aGFuIGEgaHVuZHJlZHRoIG9mIGEgcGVyY2VudCBvZiB0b3RhbCBzaXplLgorICogU28gdGhlIGV4dHJhIGNvbXBsZXhpdHkgb2YgYW4gb3B0aW1hbCBhbGdvcml0aG0gZG9lc24ndCBzZWVtIHdvcnRod2hpbGUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkhVRkZfVEJMICogaHRibCwgbG9uZyBmcmVxW10pCit7CisjZGVmaW5lIE1BWF9DTEVOIDMyCQkvKiBhc3N1bWVkIG1heGltdW0gaW5pdGlhbCBjb2RlIGxlbmd0aCAqLworICBVSU5UOCBiaXRzW01BWF9DTEVOKzFdOwkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZSBsZW5ndGggayAqLworICBpbnQgY29kZXNpemVbMjU3XTsJCS8qIGNvZGVzaXplW2tdID0gY29kZSBsZW5ndGggb2Ygc3ltYm9sIGsgKi8KKyAgaW50IG90aGVyc1syNTddOwkJLyogbmV4dCBzeW1ib2wgaW4gY3VycmVudCBicmFuY2ggb2YgdHJlZSAqLworICBpbnQgYzEsIGMyOworICBpbnQgcCwgaSwgajsKKyAgbG9uZyB2OworCisgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIEsuMiBvZiB0aGUgSlBFRyBzdGFuZGFyZCAqLworCisgIE1FTVpFUk8oYml0cywgU0laRU9GKGJpdHMpKTsKKyAgTUVNWkVSTyhjb2Rlc2l6ZSwgU0laRU9GKGNvZGVzaXplKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTc7IGkrKykKKyAgICBvdGhlcnNbaV0gPSAtMTsJCS8qIGluaXQgbGlua3MgdG8gZW1wdHkgKi8KKyAgCisgIGZyZXFbMjU2XSA9IDE7CQkvKiBtYWtlIHN1cmUgMjU2IGhhcyBhIG5vbnplcm8gY291bnQgKi8KKyAgLyogSW5jbHVkaW5nIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBpbiB0aGUgSHVmZm1hbiBwcm9jZWR1cmUgZ3VhcmFudGVlcworICAgKiB0aGF0IG5vIHJlYWwgc3ltYm9sIGlzIGdpdmVuIGNvZGUtdmFsdWUgb2YgYWxsIG9uZXMsIGJlY2F1c2UgMjU2CisgICAqIHdpbGwgYmUgcGxhY2VkIGxhc3QgaW4gdGhlIGxhcmdlc3QgY29kZXdvcmQgY2F0ZWdvcnkuCisgICAqLworCisgIC8qIEh1ZmZtYW4ncyBiYXNpYyBhbGdvcml0aG0gdG8gYXNzaWduIG9wdGltYWwgY29kZSBsZW5ndGhzIHRvIHN5bWJvbHMgKi8KKworICBmb3IgKDs7KSB7CisgICAgLyogRmluZCB0aGUgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMSA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzEgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2KSB7CisJdiA9IGZyZXFbaV07CisJYzEgPSBpOworICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmQgdGhlIG5leHQgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMiA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzIgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2ICYmIGkgIT0gYzEpIHsKKwl2ID0gZnJlcVtpXTsKKwljMiA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgLyogRG9uZSBpZiB3ZSd2ZSBtZXJnZWQgZXZlcnl0aGluZyBpbnRvIG9uZSBmcmVxdWVuY3kgKi8KKyAgICBpZiAoYzIgPCAwKQorICAgICAgYnJlYWs7CisgICAgCisgICAgLyogRWxzZSBtZXJnZSB0aGUgdHdvIGNvdW50cy90cmVlcyAqLworICAgIGZyZXFbYzFdICs9IGZyZXFbYzJdOworICAgIGZyZXFbYzJdID0gMDsKKworICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMSdzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzFdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMV0gPj0gMCkgeworICAgICAgYzEgPSBvdGhlcnNbYzFdOworICAgICAgY29kZXNpemVbYzFdKys7CisgICAgfQorICAgIAorICAgIG90aGVyc1tjMV0gPSBjMjsJCS8qIGNoYWluIGMyIG9udG8gYzEncyB0cmVlIGJyYW5jaCAqLworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMidzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzJdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMl0gPj0gMCkgeworICAgICAgYzIgPSBvdGhlcnNbYzJdOworICAgICAgY29kZXNpemVbYzJdKys7CisgICAgfQorICB9CisKKyAgLyogTm93IGNvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZiBlYWNoIGNvZGUgbGVuZ3RoICovCisgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKKyAgICBpZiAoY29kZXNpemVbaV0pIHsKKyAgICAgIC8qIFRoZSBKUEVHIHN0YW5kYXJkIHNlZW1zIHRvIHRoaW5rIHRoYXQgdGhpcyBjYW4ndCBoYXBwZW4sICovCisgICAgICAvKiBidXQgSSdtIHBhcmFub2lkLi4uICovCisgICAgICBpZiAoY29kZXNpemVbaV0gPiBNQVhfQ0xFTikKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0hVRkZfQ0xFTl9PVkVSRkxPVyk7CisKKyAgICAgIGJpdHNbY29kZXNpemVbaV1dKys7CisgICAgfQorICB9CisKKyAgLyogSlBFRyBkb2Vzbid0IGFsbG93IHN5bWJvbHMgd2l0aCBjb2RlIGxlbmd0aHMgb3ZlciAxNiBiaXRzLCBzbyBpZiB0aGUgcHVyZQorICAgKiBIdWZmbWFuIHByb2NlZHVyZSBhc3NpZ25lZCBhbnkgc3VjaCBsZW5ndGhzLCB3ZSBtdXN0IGFkanVzdCB0aGUgY29kaW5nLgorICAgKiBIZXJlIGlzIHdoYXQgdGhlIEpQRUcgc3BlYyBzYXlzIGFib3V0IGhvdyB0aGlzIG5leHQgYml0IHdvcmtzOgorICAgKiBTaW5jZSBzeW1ib2xzIGFyZSBwYWlyZWQgZm9yIHRoZSBsb25nZXN0IEh1ZmZtYW4gY29kZSwgdGhlIHN5bWJvbHMgYXJlCisgICAqIHJlbW92ZWQgZnJvbSB0aGlzIGxlbmd0aCBjYXRlZ29yeSB0d28gYXQgYSB0aW1lLiAgVGhlIHByZWZpeCBmb3IgdGhlIHBhaXIKKyAgICogKHdoaWNoIGlzIG9uZSBiaXQgc2hvcnRlcikgaXMgYWxsb2NhdGVkIHRvIG9uZSBvZiB0aGUgcGFpcjsgdGhlbiwKKyAgICogc2tpcHBpbmcgdGhlIEJJVFMgZW50cnkgZm9yIHRoYXQgcHJlZml4IGxlbmd0aCwgYSBjb2RlIHdvcmQgZnJvbSB0aGUgbmV4dAorICAgKiBzaG9ydGVzdCBub256ZXJvIEJJVFMgZW50cnkgaXMgY29udmVydGVkIGludG8gYSBwcmVmaXggZm9yIHR3byBjb2RlIHdvcmRzCisgICAqIG9uZSBiaXQgbG9uZ2VyLgorICAgKi8KKyAgCisgIGZvciAoaSA9IE1BWF9DTEVOOyBpID4gMTY7IGktLSkgeworICAgIHdoaWxlIChiaXRzW2ldID4gMCkgeworICAgICAgaiA9IGkgLSAyOwkJLyogZmluZCBsZW5ndGggb2YgbmV3IHByZWZpeCB0byBiZSB1c2VkICovCisgICAgICB3aGlsZSAoYml0c1tqXSA9PSAwKQorCWotLTsKKyAgICAgIAorICAgICAgYml0c1tpXSAtPSAyOwkJLyogcmVtb3ZlIHR3byBzeW1ib2xzICovCisgICAgICBiaXRzW2ktMV0rKzsJCS8qIG9uZSBnb2VzIGluIHRoaXMgbGVuZ3RoICovCisgICAgICBiaXRzW2orMV0gKz0gMjsJCS8qIHR3byBuZXcgc3ltYm9scyBpbiB0aGlzIGxlbmd0aCAqLworICAgICAgYml0c1tqXS0tOwkJLyogc3ltYm9sIG9mIHRoaXMgbGVuZ3RoIGlzIG5vdyBhIHByZWZpeCAqLworICAgIH0KKyAgfQorCisgIC8qIFJlbW92ZSB0aGUgY291bnQgZm9yIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBmcm9tIHRoZSBsYXJnZXN0IGNvZGVsZW5ndGggKi8KKyAgd2hpbGUgKGJpdHNbaV0gPT0gMCkJCS8qIGZpbmQgbGFyZ2VzdCBjb2RlbGVuZ3RoIHN0aWxsIGluIHVzZSAqLworICAgIGktLTsKKyAgYml0c1tpXS0tOworICAKKyAgLyogUmV0dXJuIGZpbmFsIHN5bWJvbCBjb3VudHMgKG9ubHkgZm9yIGxlbmd0aHMgMC4uMTYpICovCisgIE1FTUNPUFkoaHRibC0+Yml0cywgYml0cywgU0laRU9GKGh0YmwtPmJpdHMpKTsKKyAgCisgIC8qIFJldHVybiBhIGxpc3Qgb2YgdGhlIHN5bWJvbHMgc29ydGVkIGJ5IGNvZGUgbGVuZ3RoICovCisgIC8qIEl0J3Mgbm90IHJlYWwgY2xlYXIgdG8gbWUgd2h5IHdlIGRvbid0IG5lZWQgdG8gY29uc2lkZXIgdGhlIGNvZGVsZW5ndGgKKyAgICogY2hhbmdlcyBtYWRlIGFib3ZlLCBidXQgdGhlIEpQRUcgc3BlYyBzZWVtcyB0byB0aGluayB0aGlzIHdvcmtzLgorICAgKi8KKyAgcCA9IDA7CisgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0NMRU47IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspIHsKKyAgICAgIGlmIChjb2Rlc2l6ZVtqXSA9PSBpKSB7CisJaHRibC0+aHVmZnZhbFtwXSA9IChVSU5UOCkgajsKKwlwKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU2V0IHNlbnRfdGFibGUgRkFMU0Ugc28gdXBkYXRlZCB0YWJsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gSlBFRyBmaWxlLiAqLworICBodGJsLT5zZW50X3RhYmxlID0gRkFMU0U7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHBhc3MgYW5kIGNyZWF0ZSB0aGUgbmV3IEh1ZmZtYW4gdGFibGVzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfZ2F0aGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2ksIGRjdGJsLCBhY3RibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpIVUZGX1RCTCAqKmh0YmxwdHI7CisgIGJvb2xlYW4gZGlkX2RjW05VTV9IVUZGX1RCTFNdOworICBib29sZWFuIGRpZF9hY1tOVU1fSFVGRl9UQkxTXTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZF9kYywgU0laRU9GKGRpZF9kYykpOworICBNRU1aRVJPKGRpZF9hYywgU0laRU9GKGRpZF9hYykpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoISBkaWRfZGNbZGN0YmxdKSB7CisgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tkY3RibF07CisgICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKwkqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0pOworICAgICAgZGlkX2RjW2RjdGJsXSA9IFRSVUU7CisgICAgfQorICAgIGlmICghIGRpZF9hY1thY3RibF0pIHsKKyAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2FjdGJsXTsKKyAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSk7CisgICAgICBkaWRfYWNbYWN0YmxdID0gVFJVRTsKKyAgICB9CisgIH0KK30KKworCisjZW5kaWYgLyogRU5UUk9QWV9PUFRfU1VQUE9SVEVEICovCisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2RpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9odWZmX2VuY29kZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZW5jb2RlcikpOworICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKikgZW50cm9weTsKKyAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tpXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tpXSA9IGVudHJvcHktPmFjX2NvdW50X3B0cnNbaV0gPSBOVUxMOworI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL2pjaHVmZi5oIGIvamNodWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1OTlmYwotLS0gL2Rldi9udWxsCisrKyBiL2pjaHVmZi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBqY2h1ZmYuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzCisgKiB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgc2VxdWVudGlhbCBlbmNvZGVyIChqY2h1ZmYuYykgYW5kIHRoZQorICogcHJvZ3Jlc3NpdmUgZW5jb2RlciAoamNwaHVmZi5jKS4gIE5vIG90aGVyIG1vZHVsZXMgbmVlZCB0byBzZWUgdGhlc2UuCisgKi8KKworLyogVGhlIGxlZ2FsIHJhbmdlIG9mIGEgRENUIGNvZWZmaWNpZW50IGlzCisgKiAgLTEwMjQgLi4gKzEwMjMgIGZvciA4LWJpdCBkYXRhOworICogLTE2Mzg0IC4uICsxNjM4MyBmb3IgMTItYml0IGRhdGEuCisgKiBIZW5jZSB0aGUgbWFnbml0dWRlIHNob3VsZCBhbHdheXMgZml0IGluIDEwIG9yIDE0IGJpdHMgcmVzcGVjdGl2ZWx5LgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDEwCisjZWxzZQorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDE0CisjZW5kaWYKKworLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZWh1ZmNvWzI1Nl07CS8qIGNvZGUgZm9yIGVhY2ggc3ltYm9sICovCisgIGNoYXIgZWh1ZnNpWzI1Nl07CQkvKiBsZW5ndGggb2YgY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KKyAgLyogSWYgbm8gY29kZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIGEgc3ltYm9sIFMsIGVodWZzaVtTXSBjb250YWlucyAwICovCit9IGNfZGVyaXZlZF90Ymw7CisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX21ha2VfY19kZXJpdmVkX3RibAlqTWtDRGVyaXZlZAorI2RlZmluZSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlCWpHZW5PcHRUYmwKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKy8qIEV4cGFuZCBhIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXJpdmVkIGZvcm1hdCAqLworRVhURVJOKHZvaWQpIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCisJICAgICBjX2Rlcml2ZWRfdGJsICoqIHBkdGJsKSk7CisKKy8qIEdlbmVyYXRlIGFuIG9wdGltYWwgdGFibGUgZGVmaW5pdGlvbiBnaXZlbiB0aGUgc3BlY2lmaWVkIGNvdW50cyAqLworRVhURVJOKHZvaWQpIGpwZWdfZ2VuX29wdGltYWxfdGFibGUKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkpOwpkaWZmIC0tZ2l0IGEvamNpbml0LmMgYi9qY2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZmZmUzCi0tLSAvZGV2L251bGwKKysrIGIvamNpbml0LmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGpjaW5pdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBUaGlzIHJvdXRpbmUgaXMgaW4gY2hhcmdlIG9mIHNlbGVjdGluZyB0aGUgbW9kdWxlcyB0byBiZSBleGVjdXRlZCBhbmQKKyAqIG1ha2luZyBhbiBpbml0aWFsaXphdGlvbiBjYWxsIHRvIGVhY2ggb25lLgorICoKKyAqIExvZ2ljYWxseSwgdGhpcyBjb2RlIGJlbG9uZ3MgaW4gamNtYXN0ZXIuYy4gIEl0J3Mgc3BsaXQgb3V0IGJlY2F1c2UKKyAqIGxpbmtpbmcgdGhpcyByb3V0aW5lIGltcGxpZXMgbGlua2luZyB0aGUgZW50aXJlIGNvbXByZXNzaW9uIGxpYnJhcnkuCisgKiBGb3IgYSB0cmFuc2NvZGluZy1vbmx5IGFwcGxpY2F0aW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIGpjbWFzdGVyLmMKKyAqIHdpdGhvdXQgbGlua2luZyBpbiB0aGUgd2hvbGUgbGlicmFyeS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcy4KKyAqIFRoaXMgaXMgZG9uZSBvbmNlIGF0IHRoZSBzdGFydCBvZiBwcm9jZXNzaW5nIGFuIGltYWdlLiAgV2UgZGV0ZXJtaW5lCisgKiB3aGljaCBtb2R1bGVzIHdpbGwgYmUgdXNlZCBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uIGNhbGxzLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY29tcHJlc3NfbWFzdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogSW5pdGlhbGl6ZSBtYXN0ZXIgY29udHJvbCAoaW5jbHVkZXMgcGFyYW1ldGVyIGNoZWNraW5nL3Byb2Nlc3NpbmcpICovCisgIGppbml0X2NfbWFzdGVyX2NvbnRyb2woY2luZm8sIEZBTFNFIC8qIGZ1bGwgY29tcHJlc3Npb24gKi8pOworCisgIC8qIFByZXByb2Nlc3NpbmcgKi8KKyAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7CisgICAgamluaXRfY29sb3JfY29udmVydGVyKGNpbmZvKTsKKyAgICBqaW5pdF9kb3duc2FtcGxlcihjaW5mbyk7CisgICAgamluaXRfY19wcmVwX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisgIH0KKyAgLyogRm9yd2FyZCBEQ1QgKi8KKyAgamluaXRfZm9yd2FyZF9kY3QoY2luZm8pOworICAvKiBFbnRyb3B5IGVuY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgamluaXRfcGh1ZmZfZW5jb2RlcihjaW5mbyk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfSBlbHNlCisgICAgICBqaW5pdF9odWZmX2VuY29kZXIoY2luZm8pOworICB9CisKKyAgLyogTmVlZCBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyIGluIGFueSBtdWx0aS1wYXNzIG1vZGUuICovCisgIGppbml0X2NfY29lZl9jb250cm9sbGVyKGNpbmZvLAorCQkoYm9vbGVhbikgKGNpbmZvLT5udW1fc2NhbnMgPiAxIHx8IGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpKTsKKyAgamluaXRfY19tYWluX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisKKyAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7CisKKyAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIFdyaXRlIHRoZSBkYXRhc3RyZWFtIGhlYWRlciAoU09JKSBpbW1lZGlhdGVseS4KKyAgICogRnJhbWUgYW5kIHNjYW4gaGVhZGVycyBhcmUgcG9zdHBvbmVkIHRpbGwgbGF0ZXIuCisgICAqIFRoaXMgbGV0cyBhcHBsaWNhdGlvbiBpbnNlcnQgc3BlY2lhbCBtYXJrZXJzIGFmdGVyIHRoZSBTT0kuCisgICAqLworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZpbGVfaGVhZGVyKSAoY2luZm8pOworfQpkaWZmIC0tZ2l0IGEvamNtYWluY3QuYyBiL2pjbWFpbmN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNzlhNwotLS0gL2Rldi9udWxsCisrKyBiL2pjbWFpbmN0LmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBqY21haW5jdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGNvbXByZXNzaW9uLgorICogVGhlIG1haW4gYnVmZmVyIGxpZXMgYmV0d2VlbiB0aGUgcHJlLXByb2Nlc3NvciBhbmQgdGhlIEpQRUcKKyAqIGNvbXByZXNzb3IgcHJvcGVyOyBpdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhIGluIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIE5vdGU6IGN1cnJlbnRseSwgdGhlcmUgaXMgbm8gb3BlcmF0aW5nIG1vZGUgaW4gd2hpY2ggYSBmdWxsLWltYWdlIGJ1ZmZlcgorICogaXMgbmVlZGVkIGF0IHRoaXMgc3RlcC4gIElmIHRoZXJlIHdlcmUsIHRoYXQgbW9kZSBjb3VsZCBub3QgYmUgdXNlZCB3aXRoCisgKiAicmF3IGRhdGEiIGlucHV0LCBzaW5jZSB0aGlzIG1vZHVsZSBpcyBieXBhc3NlZCBpbiB0aGF0IGNhc2UuICBIb3dldmVyLAorICogd2UndmUgbGVmdCB0aGUgY29kZSBoZXJlIGZvciBwb3NzaWJsZSB1c2UgaW4gc3BlY2lhbCBhcHBsaWNhdGlvbnMuCisgKi8KKyN1bmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgSkRJTUVOU0lPTiBjdXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBjdXJyZW50IGlNQ1Ugcm93ICovCisgIEpESU1FTlNJT04gcm93Z3JvdXBfY3RyOwkvKiBjb3VudHMgcm93IGdyb3VwcyByZWNlaXZlZCBpbiBpTUNVIHJvdyAqLworICBib29sZWFuIHN1c3BlbmRlZDsJCS8qIHJlbWVtYmVyIGlmIHdlIHN1c3BlbmRlZCBvdXRwdXQgKi8KKyAgSl9CVUZfTU9ERSBwYXNzX21vZGU7CQkvKiBjdXJyZW50IG9wZXJhdGluZyBtb2RlICovCisKKyAgLyogSWYgdXNpbmcganVzdCBhIHN0cmlwIGJ1ZmZlciwgdGhpcyBwb2ludHMgdG8gdGhlIGVudGlyZSBzZXQgb2YgYnVmZmVycworICAgKiAod2UgYWxsb2NhdGUgb25lIGZvciBlYWNoIGNvbXBvbmVudCkuICBJbiB0aGUgZnVsbC1pbWFnZSBjYXNlLCB0aGlzCisgICAqIHBvaW50cyB0byB0aGUgY3VycmVudGx5IGFjY2Vzc2libGUgc3RyaXBzIG9mIHRoZSB2aXJ0dWFsIGFycmF5cy4KKyAgICovCisgIEpTQU1QQVJSQVkgYnVmZmVyW01BWF9DT01QT05FTlRTXTsKKworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgIC8qIElmIHVzaW5nIGZ1bGwtaW1hZ2Ugc3RvcmFnZSwgdGhpcyBhcnJheSBob2xkcyBwb2ludGVycyB0byB2aXJ0dWFsLWFycmF5CisgICAqIGNvbnRyb2wgYmxvY2tzIGZvciBlYWNoIGNvbXBvbmVudC4gIFVudXNlZCBpZiBub3QgZnVsbC1pbWFnZSBzdG9yYWdlLgorICAgKi8KKyAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107CisjZW5kaWYKK30gbXlfbWFpbl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X21haW5fY29udHJvbGxlciAqIG15X21haW5fcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLCBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgLyogRG8gbm90aGluZyBpbiByYXctZGF0YSBtb2RlLiAqLworICBpZiAoY2luZm8tPnJhd19kYXRhX2luKQorICAgIHJldHVybjsKKworICBtYWluLT5jdXJfaU1DVV9yb3cgPSAwOwkvKiBpbml0aWFsaXplIGNvdW50ZXJzICovCisgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgIG1haW4tPnN1c3BlbmRlZCA9IEZBTFNFOworICBtYWluLT5wYXNzX21vZGUgPSBwYXNzX21vZGU7CS8qIHNhdmUgbW9kZSBmb3IgdXNlIGJ5IHByb2Nlc3NfZGF0YSAqLworCisgIHN3aXRjaCAocGFzc19tb2RlKSB7CisgIGNhc2UgSkJVRl9QQVNTX1RIUlU6CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgICBpZiAobWFpbi0+d2hvbGVfaW1hZ2VbMF0gIT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW47CisgICAgYnJlYWs7CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfU09VUkNFOgorICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgaWYgKG1haW4tPndob2xlX2ltYWdlWzBdID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbjsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIFRoaXMgcm91dGluZSBoYW5kbGVzIHRoZSBzaW1wbGUgcGFzcy10aHJvdWdoIG1vZGUsCisgKiB3aGVyZSB3ZSBoYXZlIG9ubHkgYSBzdHJpcCBidWZmZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICB3aGlsZSAobWFpbi0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IERDVFNJWkUpCisgICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCisJCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKKwkJCQkJbWFpbi0+YnVmZmVyLCAmbWFpbi0+cm93Z3JvdXBfY3RyLAorCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7CisKKyAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgZnVsbCBpTUNVIHJvdyBidWZmZXJlZCwgcmV0dXJuIHRvIGFwcGxpY2F0aW9uIGZvcgorICAgICAqIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCBwcmVwcm9jZXNzb3Igd2lsbCBhbHdheXMgcGFkIHRvIGZpbGwgdGhlIGlNQ1Ugcm93CisgICAgICogYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuCisgICAgICovCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciAhPSBEQ1RTSVpFKQorICAgICAgcmV0dXJuOworCisgICAgLyogU2VuZCB0aGUgY29tcGxldGVkIHJvdyB0byB0aGUgY29tcHJlc3NvciAqLworICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkgeworICAgICAgLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgdGhlbiB3ZSBtdXN0IG5lZWQgdG8KKyAgICAgICAqIHN1c3BlbmQgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEluIHRoaXMgc2l0dWF0aW9uCisgICAgICAgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKKyAgICAgICAqIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW1hZ2UsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAorICAgICAgICogdGhpbmsgd2Ugd2VyZSBkb25lLgorICAgICAgICovCisgICAgICBpZiAoISBtYWluLT5zdXNwZW5kZWQpIHsKKwkoKmluX3Jvd19jdHIpLS07CisJbWFpbi0+c3VzcGVuZGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogV2UgZGlkIGZpbmlzaCB0aGUgcm93LiAgVW5kbyBvdXIgbGl0dGxlIHN1c3BlbnNpb24gaGFjayBpZiBhIHByZXZpb3VzCisgICAgICogY2FsbCBzdXNwZW5kZWQ7IHRoZW4gbWFyayB0aGUgbWFpbiBidWZmZXIgZW1wdHkuCisgICAgICovCisgICAgaWYgKG1haW4tPnN1c3BlbmRlZCkgeworICAgICAgKCppbl9yb3dfY3RyKSsrOworICAgICAgbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7CisgICAgfQorICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgICAgbWFpbi0+Y3VyX2lNQ1Vfcm93Kys7CisgIH0KK30KKworCisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgYWxsIG9mIHRoZSBtb2RlcyB0aGF0IHVzZSBhIGZ1bGwtc2l6ZSBidWZmZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfYnVmZmVyX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBib29sZWFuIHdyaXRpbmcgPSAobWFpbi0+cGFzc19tb2RlICE9IEpCVUZfQ1JBTktfREVTVCk7CisKKyAgd2hpbGUgKG1haW4tPmN1cl9pTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKKyAgICAvKiBSZWFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgaWYgYXQgdGhlIHN0YXJ0IG9mIGFuIGlNQ1Ugcm93LiAqLworICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPT0gMCkgeworICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgICBjaSsrLCBjb21wcHRyKyspIHsKKwltYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisJICAoKGpfY29tbW9uX3B0cikgY2luZm8sIG1haW4tPndob2xlX2ltYWdlW2NpXSwKKwkgICBtYWluLT5jdXJfaU1DVV9yb3cgKiAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLAorCSAgIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLCB3cml0aW5nKTsKKyAgICAgIH0KKyAgICAgIC8qIEluIGEgcmVhZCBwYXNzLCBwcmV0ZW5kIHdlIGp1c3QgcmVhZCBzb21lIHNvdXJjZSBkYXRhLiAqLworICAgICAgaWYgKCEgd3JpdGluZykgeworCSppbl9yb3dfY3RyICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7CisJbWFpbi0+cm93Z3JvdXBfY3RyID0gRENUU0laRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiBhIHdyaXRlIHBhc3MsIHJlYWQgaW5wdXQgZGF0YSB1bnRpbCB0aGUgY3VycmVudCBpTUNVIHJvdyBpcyBmdWxsLiAqLworICAgIC8qIE5vdGU6IHByZXByb2Nlc3NvciB3aWxsIHBhZCBpZiBuZWNlc3NhcnkgdG8gZmlsbCB0aGUgbGFzdCBpTUNVIHJvdy4gKi8KKyAgICBpZiAod3JpdGluZykgeworICAgICAgKCpjaW5mby0+cHJlcC0+cHJlX3Byb2Nlc3NfZGF0YSkgKGNpbmZvLAorCQkJCQlpbnB1dF9idWYsIGluX3Jvd19jdHIsIGluX3Jvd3NfYXZhaWwsCisJCQkJCW1haW4tPmJ1ZmZlciwgJm1haW4tPnJvd2dyb3VwX2N0ciwKKwkJCQkJKEpESU1FTlNJT04pIERDVFNJWkUpOworICAgICAgLyogUmV0dXJuIHRvIGFwcGxpY2F0aW9uIGlmIHdlIG5lZWQgbW9yZSBkYXRhIHRvIGZpbGwgdGhlIGlNQ1Ugcm93LiAqLworICAgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IERDVFNJWkUpCisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEVtaXQgZGF0YSwgdW5sZXNzIHRoaXMgaXMgYSBzaW5rLW9ubHkgcGFzcy4gKi8KKyAgICBpZiAobWFpbi0+cGFzc19tb2RlICE9IEpCVUZfU0FWRV9TT1VSQ0UpIHsKKyAgICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkgeworCS8qIElmIGNvbXByZXNzb3IgZGlkIG5vdCBjb25zdW1lIHRoZSB3aG9sZSByb3csIHRoZW4gd2UgbXVzdCBuZWVkIHRvCisJICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KKwkgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKKwkgKiBpdCBoYXBwZW5lZCB0byBiZSB0aGUgbGFzdCByb3cgb2YgdGhlIGltYWdlLCB0aGUgYXBwbGljYXRpb24gd291bGQKKwkgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCisJICovCisJaWYgKCEgbWFpbi0+c3VzcGVuZGVkKSB7CisJICAoKmluX3Jvd19jdHIpLS07CisJICBtYWluLT5zdXNwZW5kZWQgPSBUUlVFOworCX0KKwlyZXR1cm47CisgICAgICB9CisgICAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKKyAgICAgICAqIGNhbGwgc3VzcGVuZGVkOyB0aGVuIG1hcmsgdGhlIG1haW4gYnVmZmVyIGVtcHR5LgorICAgICAgICovCisgICAgICBpZiAobWFpbi0+c3VzcGVuZGVkKSB7CisJKCppbl9yb3dfY3RyKSsrOworCW1haW4tPnN1c3BlbmRlZCA9IEZBTFNFOworICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGdldCBoZXJlLCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgaU1DVSByb3cuICBNYXJrIGJ1ZmZlciBlbXB0eS4gKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICAgIG1haW4tPmN1cl9pTUNVX3JvdysrOworICB9Cit9CisKKyNlbmRpZiAvKiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9jX21haW5fY29udHJvbGxlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbjsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIG1haW4gPSAobXlfbWFpbl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfbWFpbl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5tYWluID0gKHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyICopIG1haW47CisgIG1haW4tPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tYWluOworCisgIC8qIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgYnVmZmVyIGluIHJhdy1kYXRhIG1vZGUuICovCisgIGlmIChjaW5mby0+cmF3X2RhdGFfaW4pCisgICAgcmV0dXJuOworCisgIC8qIENyZWF0ZSB0aGUgYnVmZmVyLiAgSXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSwgc28gZWFjaCBjb21wb25lbnQKKyAgICogbWF5IGJlIG9mIGEgZGlmZmVyZW50IHNpemUuCisgICAqLworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgLyogTm90ZSB3ZSBwYWQgdGhlIGJvdHRvbSB0byBhIG11bHRpcGxlIG9mIHRoZSBpTUNVIGhlaWdodCAqLworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgbWFpbi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSAqIERDVFNJWkUsCisJIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICB9CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICB9IGVsc2UgeworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgICAgbWFpbi0+d2hvbGVfaW1hZ2VbMF0gPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworI2VuZGlmCisgICAgLyogQWxsb2NhdGUgYSBzdHJpcCBidWZmZXIgZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBtYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSwKKwkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvamNtYXJrZXIuYyBiL2pjbWFya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxZTZjNgotLS0gL2Rldi9udWxsCisrKyBiL2pjbWFya2VyLmMKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisgKiBqY21hcmtlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKK3R5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KKyAgTV9TT0YwICA9IDB4YzAsCisgIE1fU09GMSAgPSAweGMxLAorICBNX1NPRjIgID0gMHhjMiwKKyAgTV9TT0YzICA9IDB4YzMsCisgIAorICBNX1NPRjUgID0gMHhjNSwKKyAgTV9TT0Y2ICA9IDB4YzYsCisgIE1fU09GNyAgPSAweGM3LAorICAKKyAgTV9KUEcgICA9IDB4YzgsCisgIE1fU09GOSAgPSAweGM5LAorICBNX1NPRjEwID0gMHhjYSwKKyAgTV9TT0YxMSA9IDB4Y2IsCisgIAorICBNX1NPRjEzID0gMHhjZCwKKyAgTV9TT0YxNCA9IDB4Y2UsCisgIE1fU09GMTUgPSAweGNmLAorICAKKyAgTV9ESFQgICA9IDB4YzQsCisgIAorICBNX0RBQyAgID0gMHhjYywKKyAgCisgIE1fUlNUMCAgPSAweGQwLAorICBNX1JTVDEgID0gMHhkMSwKKyAgTV9SU1QyICA9IDB4ZDIsCisgIE1fUlNUMyAgPSAweGQzLAorICBNX1JTVDQgID0gMHhkNCwKKyAgTV9SU1Q1ICA9IDB4ZDUsCisgIE1fUlNUNiAgPSAweGQ2LAorICBNX1JTVDcgID0gMHhkNywKKyAgCisgIE1fU09JICAgPSAweGQ4LAorICBNX0VPSSAgID0gMHhkOSwKKyAgTV9TT1MgICA9IDB4ZGEsCisgIE1fRFFUICAgPSAweGRiLAorICBNX0ROTCAgID0gMHhkYywKKyAgTV9EUkkgICA9IDB4ZGQsCisgIE1fREhQICAgPSAweGRlLAorICBNX0VYUCAgID0gMHhkZiwKKyAgCisgIE1fQVBQMCAgPSAweGUwLAorICBNX0FQUDEgID0gMHhlMSwKKyAgTV9BUFAyICA9IDB4ZTIsCisgIE1fQVBQMyAgPSAweGUzLAorICBNX0FQUDQgID0gMHhlNCwKKyAgTV9BUFA1ICA9IDB4ZTUsCisgIE1fQVBQNiAgPSAweGU2LAorICBNX0FQUDcgID0gMHhlNywKKyAgTV9BUFA4ICA9IDB4ZTgsCisgIE1fQVBQOSAgPSAweGU5LAorICBNX0FQUDEwID0gMHhlYSwKKyAgTV9BUFAxMSA9IDB4ZWIsCisgIE1fQVBQMTIgPSAweGVjLAorICBNX0FQUDEzID0gMHhlZCwKKyAgTV9BUFAxNCA9IDB4ZWUsCisgIE1fQVBQMTUgPSAweGVmLAorICAKKyAgTV9KUEcwICA9IDB4ZjAsCisgIE1fSlBHMTMgPSAweGZkLAorICBNX0NPTSAgID0gMHhmZSwKKyAgCisgIE1fVEVNICAgPSAweDAxLAorICAKKyAgTV9FUlJPUiA9IDB4MTAwCit9IEpQRUdfTUFSS0VSOworCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIHVuc2lnbmVkIGludCBsYXN0X3Jlc3RhcnRfaW50ZXJ2YWw7IC8qIGxhc3QgRFJJIHZhbHVlIGVtaXR0ZWQ7IDAgYWZ0ZXIgU09JICovCit9IG15X21hcmtlcl93cml0ZXI7CisKK3R5cGVkZWYgbXlfbWFya2VyX3dyaXRlciAqIG15X21hcmtlcl9wdHI7CisKKworLyoKKyAqIEJhc2ljIG91dHB1dCByb3V0aW5lcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiB3aGlsZSB3cml0aW5nIGEgbWFya2VyLgorICogVGhlcmVmb3JlLCBhbiBhcHBsaWNhdGlvbiB1c2luZyBzdXNwZW5zaW9uIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMKKyAqIGVub3VnaCBidWZmZXIgc3BhY2UgZm9yIHRoZSBpbml0aWFsIG1hcmtlcnMgKHR5cC4gNjAwLTcwMCBieXRlcykgYmVmb3JlCisgKiBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MsIGFuZCBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHRyYWlsaW5nIEVPSQorICogKGEgZmV3IGJ5dGVzKSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcy4gIE11bHRpcGFzcyBjb21wcmVzc2lvbgorICogbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIHdpdGggc3VzcGVuc2lvbiwgc28gdGhvc2UgdHdvIGFyZSB0aGUgb25seQorICogcG9pbnRzIHdoZXJlIG1hcmtlcnMgd2lsbCBiZSB3cml0dGVuLgorICovCisKK0xPQ0FMKHZvaWQpCitlbWl0X2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQorLyogRW1pdCBhIGJ5dGUgKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGNpbmZvLT5kZXN0OworCisgICooZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSkrKyA9IChKT0NURVQpIHZhbDsKKyAgaWYgKC0tZGVzdC0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgeworICAgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGNpbmZvKSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIG1hcmspCisvKiBFbWl0IGEgbWFya2VyIGNvZGUgKi8KK3sKKyAgZW1pdF9ieXRlKGNpbmZvLCAweEZGKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSBtYXJrKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF8yYnl0ZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsdWUpCisvKiBFbWl0IGEgMi1ieXRlIGludGVnZXI7IHRoZXNlIGFyZSBhbHdheXMgTVNCIGZpcnN0IGluIEpQRUcgZmlsZXMgKi8KK3sKKyAgZW1pdF9ieXRlKGNpbmZvLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCB2YWx1ZSAmIDB4RkYpOworfQorCisKKy8qCisgKiBSb3V0aW5lcyB0byB3cml0ZSBzcGVjaWZpYyBtYXJrZXIgdHlwZXMuCisgKi8KKworTE9DQUwoaW50KQorZW1pdF9kcXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgpCisvKiBFbWl0IGEgRFFUIG1hcmtlciAqLworLyogUmV0dXJucyB0aGUgcHJlY2lzaW9uIHVzZWQgKDAgPSA4Yml0cywgMSA9IDE2Yml0cykgZm9yIGJhc2VsaW5lIGNoZWNraW5nICovCit7CisgIEpRVUFOVF9UQkwgKiBxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2luZGV4XTsKKyAgaW50IHByZWM7CisgIGludCBpOworCisgIGlmIChxdGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIGluZGV4KTsKKworICBwcmVjID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICBpZiAocXRibC0+cXVhbnR2YWxbaV0gPiAyNTUpCisgICAgICBwcmVjID0gMTsKKyAgfQorCisgIGlmICghIHF0YmwtPnNlbnRfdGFibGUpIHsKKyAgICBlbWl0X21hcmtlcihjaW5mbywgTV9EUVQpOworCisgICAgZW1pdF8yYnl0ZXMoY2luZm8sIHByZWMgPyBEQ1RTSVpFMioyICsgMSArIDIgOiBEQ1RTSVpFMiArIDEgKyAyKTsKKworICAgIGVtaXRfYnl0ZShjaW5mbywgaW5kZXggKyAocHJlYzw8NCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICAgIC8qIFRoZSB0YWJsZSBlbnRyaWVzIG11c3QgYmUgZW1pdHRlZCBpbiB6aWd6YWcgb3JkZXIuICovCisgICAgICB1bnNpZ25lZCBpbnQgcXZhbCA9IHF0YmwtPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV07CisgICAgICBpZiAocHJlYykKKwllbWl0X2J5dGUoY2luZm8sIChpbnQpIChxdmFsID4+IDgpKTsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgJiAweEZGKSk7CisgICAgfQorCisgICAgcXRibC0+c2VudF90YWJsZSA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcHJlYzsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9kaHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNfYWMpCisvKiBFbWl0IGEgREhUIG1hcmtlciAqLworeworICBKSFVGRl9UQkwgKiBodGJsOworICBpbnQgbGVuZ3RoLCBpOworICAKKyAgaWYgKGlzX2FjKSB7CisgICAgaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgICBpbmRleCArPSAweDEwOwkJLyogb3V0cHV0IGluZGV4IGhhcyBBQyBiaXQgc2V0ICovCisgIH0gZWxzZSB7CisgICAgaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgfQorCisgIGlmIChodGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgaW5kZXgpOworICAKKyAgaWYgKCEgaHRibC0+c2VudF90YWJsZSkgeworICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RIVCk7CisgICAgCisgICAgbGVuZ3RoID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCisgICAgICBsZW5ndGggKz0gaHRibC0+Yml0c1tpXTsKKyAgICAKKyAgICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoICsgMiArIDEgKyAxNik7CisgICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCk7CisgICAgCisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKQorICAgICAgZW1pdF9ieXRlKGNpbmZvLCBodGJsLT5iaXRzW2ldKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmh1ZmZ2YWxbaV0pOworICAgIAorICAgIGh0YmwtPnNlbnRfdGFibGUgPSBUUlVFOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfZGFjIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBEQUMgbWFya2VyICovCisvKiBTaW5jZSB0aGUgdXNlZnVsIGluZm8gaXMgc28gc21hbGwsIHdlIHdhbnQgdG8gZW1pdCBhbGwgdGhlIHRhYmxlcyBpbiAqLworLyogb25lIERBQyBtYXJrZXIuICBUaGVyZWZvcmUgdGhpcyByb3V0aW5lIGRvZXMgaXRzIG93biBzY2FuIG9mIHRoZSB0YWJsZS4gKi8KK3sKKyNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKyAgY2hhciBkY19pbl91c2VbTlVNX0FSSVRIX1RCTFNdOworICBjaGFyIGFjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107CisgIGludCBsZW5ndGgsIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKKyAgICBkY19pbl91c2VbaV0gPSBhY19pbl91c2VbaV0gPSAwOworICAKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07CisgICAgZGNfaW5fdXNlW2NvbXBwdHItPmRjX3RibF9ub10gPSAxOworICAgIGFjX2luX3VzZVtjb21wcHRyLT5hY190Ymxfbm9dID0gMTsKKyAgfQorICAKKyAgbGVuZ3RoID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspCisgICAgbGVuZ3RoICs9IGRjX2luX3VzZVtpXSArIGFjX2luX3VzZVtpXTsKKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RBQyk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoKjIgKyAyKTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgaWYgKGRjX2luX3VzZVtpXSkgeworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpKTsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2RjX0xbaV0gKyAoY2luZm8tPmFyaXRoX2RjX1VbaV08PDQpKTsKKyAgICB9CisgICAgaWYgKGFjX2luX3VzZVtpXSkgeworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpICsgMHgxMCk7CisgICAgICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5hcml0aF9hY19LW2ldKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9kcmkgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIERSSSBtYXJrZXIgKi8KK3sKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRFJJKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCA0KTsJLyogZml4ZWQgbGVuZ3RoICovCisKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9zb2YgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKUEVHX01BUktFUiBjb2RlKQorLyogRW1pdCBhIFNPRiBtYXJrZXIgKi8KK3sKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgZW1pdF9tYXJrZXIoY2luZm8sIGNvZGUpOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHMgKyAyICsgNSArIDEpOyAvKiBsZW5ndGggKi8KKworICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gU09GIGZpZWxkIGNhbiBoYW5kbGUgKi8KKyAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gNjU1MzVMIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gNjU1MzVMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIDY1NTM1KTsKKworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCk7CisKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOworICAgIGVtaXRfYnl0ZShjaW5mbywgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPDwgNCkgKyBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubyk7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9zb3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIFNPUyBtYXJrZXIgKi8KK3sKKyAgaW50IGksIHRkLCB0YTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPUyk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMiAqIGNpbmZvLT5jb21wc19pbl9zY2FuICsgMiArIDEgKyAzKTsgLyogbGVuZ3RoICovCisgIAorICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5jb21wc19pbl9zY2FuKTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOworICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkKTsKKyAgICB0ZCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICB0YSA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyAgICAgIC8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW47CisgICAgICAgKiBmdXJ0aGVybW9yZSwgSHVmZm1hbiBjb2Rpbmcgb2YgREMgcmVmaW5lbWVudCB1c2VzIG5vIHRhYmxlIGF0IGFsbC4KKyAgICAgICAqIFdlIGVtaXQgMCBmb3IgdW51c2VkIGZpZWxkKHMpOyB0aGlzIGlzIHJlY29tbWVuZGVkIGJ5IHRoZSBQJk0gdGV4dAorICAgICAgICogYnV0IGRvZXMgbm90IHNlZW0gdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZC4KKyAgICAgICAqLworICAgICAgaWYgKGNpbmZvLT5TcyA9PSAwKSB7CisJdGEgPSAwOwkJCS8qIERDIHNjYW4gKi8KKwlpZiAoY2luZm8tPkFoICE9IDAgJiYgIWNpbmZvLT5hcml0aF9jb2RlKQorCSAgdGQgPSAwOwkJLyogbm8gREMgdGFibGUgZWl0aGVyICovCisgICAgICB9IGVsc2UgeworCXRkID0gMDsJCQkvKiBBQyBzY2FuICovCisgICAgICB9CisgICAgfQorICAgIGVtaXRfYnl0ZShjaW5mbywgKHRkIDw8IDQpICsgdGEpOworICB9CisKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+U3MpOworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5TZSk7CisgIGVtaXRfYnl0ZShjaW5mbywgKGNpbmZvLT5BaCA8PCA0KSArIGNpbmZvLT5BbCk7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfamZpZl9hcHAwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBKRklGLWNvbXBsaWFudCBBUFAwIG1hcmtlciAqLworeworICAvKgorICAgKiBMZW5ndGggb2YgQVBQMCBibG9jawkoMiBieXRlcykKKyAgICogQmxvY2sgSUQJCQkoNCBieXRlcyAtIEFTQ0lJICJKRklGIikKKyAgICogWmVybyBieXRlCQkJKDEgYnl0ZSB0byB0ZXJtaW5hdGUgdGhlIElEIHN0cmluZykKKyAgICogVmVyc2lvbiBNYWpvciwgTWlub3IJKDIgYnl0ZXMgLSBtYWpvciBmaXJzdCkKKyAgICogVW5pdHMJCQkoMSBieXRlIC0gMHgwMCA9IG5vbmUsIDB4MDEgPSBpbmNoLCAweDAyID0gY20pCisgICAqIFhkcHUJCQkoMiBieXRlcyAtIGRvdHMgcGVyIHVuaXQgaG9yaXpvbnRhbCkKKyAgICogWWRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCB2ZXJ0aWNhbCkKKyAgICogVGh1bWJuYWlsIFggc2l6ZQkJKDEgYnl0ZSkKKyAgICogVGh1bWJuYWlsIFkgc2l6ZQkJKDEgYnl0ZSkKKyAgICovCisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAwKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNCArIDEgKyAyICsgMSArIDIgKyAyICsgMSArIDEpOyAvKiBsZW5ndGggKi8KKworICBlbWl0X2J5dGUoY2luZm8sIDB4NEEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiSkZJRiIgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ5KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAwKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uKTsgLyogVmVyc2lvbiBmaWVsZHMgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+ZGVuc2l0eV91bml0KTsgLyogUGl4ZWwgc2l6ZSBpbmZvcm1hdGlvbiAqLworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPlhfZGVuc2l0eSk7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WV9kZW5zaXR5KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJCS8qIE5vIHRodW1ibmFpbCBpbWFnZSAqLworICBlbWl0X2J5dGUoY2luZm8sIDApOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2Fkb2JlX2FwcDE0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYW4gQWRvYmUgQVBQMTQgbWFya2VyICovCit7CisgIC8qCisgICAqIExlbmd0aCBvZiBBUFAxNCBibG9jawkoMiBieXRlcykKKyAgICogQmxvY2sgSUQJCQkoNSBieXRlcyAtIEFTQ0lJICJBZG9iZSIpCisgICAqIFZlcnNpb24gTnVtYmVyCQkoMiBieXRlcyAtIGN1cnJlbnRseSAxMDApCisgICAqIEZsYWdzMAkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCisgICAqIEZsYWdzMQkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCisgICAqIENvbG9yIHRyYW5zZm9ybQkJKDEgYnl0ZSkKKyAgICoKKyAgICogQWx0aG91Z2ggQWRvYmUgVE4gNTExNiBtZW50aW9ucyBWZXJzaW9uID0gMTAxLCBhbGwgdGhlIEFkb2JlIGZpbGVzCisgICAqIG5vdyBpbiBjaXJjdWxhdGlvbiBzZWVtIHRvIHVzZSBWZXJzaW9uID0gMTAwLCBzbyB0aGF0J3Mgd2hhdCB3ZSB3cml0ZS4KKyAgICoKKyAgICogV2Ugd3JpdGUgdGhlIGNvbG9yIHRyYW5zZm9ybSBieXRlIGFzIDEgaWYgdGhlIEpQRUcgY29sb3Igc3BhY2UgaXMKKyAgICogWUNiQ3IsIDIgaWYgaXQncyBZQ0NLLCAwIG90aGVyd2lzZS4gIEFkb2JlJ3MgZGVmaW5pdGlvbiBoYXMgdG8gZG8gd2l0aAorICAgKiB3aGV0aGVyIHRoZSBlbmNvZGVyIHBlcmZvcm1lZCBhIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcyBwcmV0dHkgdXNlbGVzcy4KKyAgICovCisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAxNCk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMiArIDUgKyAyICsgMiArIDIgKyAxKTsgLyogbGVuZ3RoICovCisKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQxKTsJLyogSWRlbnRpZmllcjogQVNDSUkgIkFkb2JlIiAqLworICBlbWl0X2J5dGUoY2luZm8sIDB4NjQpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NkYpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NjIpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NjUpOworICBlbWl0XzJieXRlcyhjaW5mbywgMTAwKTsJLyogVmVyc2lvbiAqLworICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMCAqLworICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMSAqLworICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX1lDYkNyOgorICAgIGVtaXRfYnl0ZShjaW5mbywgMSk7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDEgKi8KKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBlbWl0X2J5dGUoY2luZm8sIDIpOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAyICovCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMCAqLworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIGFsbG93IHdyaXRpbmcgYW4gYXJiaXRyYXJ5IG1hcmtlciB3aXRoIHBhcmFtZXRlcnMuCisgKiBUaGUgb25seSBpbnRlbmRlZCB1c2UgaXMgdG8gZW1pdCBDT00gb3IgQVBQbiBtYXJrZXJzIGFmdGVyIGNhbGxpbmcKKyAqIHdyaXRlX2ZpbGVfaGVhZGVyIGFuZCBiZWZvcmUgY2FsbGluZyB3cml0ZV9mcmFtZV9oZWFkZXIuCisgKiBPdGhlciB1c2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGRlc2lyYWJsZSByZXN1bHRzLgorICogQ291bnRpbmcgdGhlIHBhcmFtZXRlciBieXRlcyBwcm9wZXJseSBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9tYXJrZXJfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCisvKiBFbWl0IGFuIGFyYml0cmFyeSBtYXJrZXIgaGVhZGVyICovCit7CisgIGlmIChkYXRhbGVuID4gKHVuc2lnbmVkIGludCkgNjU1MzMpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCAoSlBFR19NQVJLRVIpIG1hcmtlcik7CisKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIChkYXRhbGVuICsgMikpOwkvKiB0b3RhbCBsZW5ndGggKi8KK30KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9tYXJrZXJfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCisvKiBFbWl0IG9uZSBieXRlIG9mIG1hcmtlciBwYXJhbWV0ZXJzIGZvbGxvd2luZyB3cml0ZV9tYXJrZXJfaGVhZGVyICovCit7CisgIGVtaXRfYnl0ZShjaW5mbywgdmFsKTsKK30KKworCisvKgorICogV3JpdGUgZGF0YXN0cmVhbSBoZWFkZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIGFuIFNPSSBhbmQgb3B0aW9uYWwgQVBQbiBtYXJrZXJzLgorICogV2UgcmVjb21tZW5kIHVzZSBvZiB0aGUgSkZJRiBtYXJrZXIsIGJ1dCBub3QgdGhlIEFkb2JlIG1hcmtlciwKKyAqIHdoZW4gdXNpbmcgWUNiQ3Igb3IgZ3JheXNjYWxlIGRhdGEuICBUaGUgSkZJRiBtYXJrZXIgc2hvdWxkIE5PVAorICogYmUgdXNlZCBmb3IgYW55IG90aGVyIEpQRUcgY29sb3JzcGFjZS4gIFRoZSBBZG9iZSBtYXJrZXIgaXMgaGVscGZ1bAorICogdG8gZGlzdGluZ3Vpc2ggUkdCLCBDTVlLLCBhbmQgWUNDSyBjb2xvcnNwYWNlcy4KKyAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgYWRkaXRpb25hbCBoZWFkZXIgbWFya2VycyBhZnRlcgorICoganBlZ19zdGFydF9jb21wcmVzcyByZXR1cm5zLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CS8qIGZpcnN0IHRoZSBTT0kgKi8KKworICAvKiBTT0kgaXMgZGVmaW5lZCB0byByZXNldCByZXN0YXJ0IGludGVydmFsIHRvIDAgKi8KKyAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOworCisgIGlmIChjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIpCS8qIG5leHQgYW4gb3B0aW9uYWwgSkZJRiBBUFAwICovCisgICAgZW1pdF9qZmlmX2FwcDAoY2luZm8pOworICBpZiAoY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlcikgLyogbmV4dCBhbiBvcHRpb25hbCBBZG9iZSBBUFAxNCAqLworICAgIGVtaXRfYWRvYmVfYXBwMTQoY2luZm8pOworfQorCisKKy8qCisgKiBXcml0ZSBmcmFtZSBoZWFkZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIERRVCBhbmQgU09GbiBtYXJrZXJzLgorICogTm90ZSB0aGF0IHdlIGRvIG5vdCBlbWl0IHRoZSBTT0YgdW50aWwgd2UgaGF2ZSBlbWl0dGVkIHRoZSBEUVQocykuCisgKiBUaGlzIGF2b2lkcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdpdGggaW5jb3JyZWN0IGltcGxlbWVudGF0aW9ucyB0aGF0CisgKiB0cnkgdG8gZXJyb3ItY2hlY2sgdGhlIHF1YW50IHRhYmxlIG51bWJlcnMgYXMgc29vbiBhcyB0aGV5IHNlZSB0aGUgU09GLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZnJhbWVfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGNpLCBwcmVjOworICBib29sZWFuIGlzX2Jhc2VsaW5lOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgLyogRW1pdCBEUVQgZm9yIGVhY2ggcXVhbnRpemF0aW9uIHRhYmxlLgorICAgKiBOb3RlIHRoYXQgZW1pdF9kcXQoKSBzdXBwcmVzc2VzIGFueSBkdXBsaWNhdGUgdGFibGVzLgorICAgKi8KKyAgcHJlYyA9IDA7CisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcHJlYyArPSBlbWl0X2RxdChjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKKyAgfQorICAvKiBub3cgcHJlYyBpcyBub256ZXJvIGlmZiB0aGVyZSBhcmUgYW55IDE2LWJpdCBxdWFudCB0YWJsZXMuICovCisKKyAgLyogQ2hlY2sgZm9yIGEgbm9uLWJhc2VsaW5lIHNwZWNpZmljYXRpb24uCisgICAqIE5vdGUgd2UgYXNzdW1lIHRoYXQgSHVmZm1hbiB0YWJsZSBudW1iZXJzIHdvbid0IGJlIGNoYW5nZWQgbGF0ZXIuCisgICAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUgfHwgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwKKyAgICAgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSA4KSB7CisgICAgaXNfYmFzZWxpbmUgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBpc19iYXNlbGluZSA9IFRSVUU7CisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBpZiAoY29tcHB0ci0+ZGNfdGJsX25vID4gMSB8fCBjb21wcHRyLT5hY190Ymxfbm8gPiAxKQorCWlzX2Jhc2VsaW5lID0gRkFMU0U7CisgICAgfQorICAgIGlmIChwcmVjICYmIGlzX2Jhc2VsaW5lKSB7CisgICAgICBpc19iYXNlbGluZSA9IEZBTFNFOworICAgICAgLyogSWYgaXQncyBiYXNlbGluZSBleGNlcHQgZm9yIHF1YW50aXplciBzaXplLCB3YXJuIHRoZSB1c2VyICovCisgICAgICBUUkFDRU1TKGNpbmZvLCAwLCBKVFJDXzE2QklUX1RBQkxFUyk7CisgICAgfQorICB9CisKKyAgLyogRW1pdCB0aGUgcHJvcGVyIFNPRiBtYXJrZXIgKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GOSk7CS8qIFNPRiBjb2RlIGZvciBhcml0aG1ldGljIGNvZGluZyAqLworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKyAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjIpOwkvKiBTT0YgY29kZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiAqLworICAgIGVsc2UgaWYgKGlzX2Jhc2VsaW5lKQorICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMCk7CS8qIFNPRiBjb2RlIGZvciBiYXNlbGluZSBpbXBsZW1lbnRhdGlvbiAqLworICAgIGVsc2UKKyAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjEpOwkvKiBTT0YgY29kZSBmb3Igbm9uLWJhc2VsaW5lIEh1ZmZtYW4gZmlsZSAqLworICB9Cit9CisKKworLyoKKyAqIFdyaXRlIHNjYW4gaGVhZGVyLgorICogVGhpcyBjb25zaXN0cyBvZiBESFQgb3IgREFDIG1hcmtlcnMsIG9wdGlvbmFsIERSSSwgYW5kIFNPUy4KKyAqIENvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gZm9sbG93aW5nIHRoZSBTT1MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9zY2FuX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisgIGludCBpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIC8qIEVtaXQgYXJpdGggY29uZGl0aW9uaW5nIGluZm8uICBXZSBtYXkgaGF2ZSBzb21lIGR1cGxpY2F0aW9uCisgICAgICogaWYgdGhlIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zLCBidXQgaXQncyBzbyBzbWFsbCBpdCdzIGhhcmRseQorICAgICAqIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgorICAgICAqLworICAgIGVtaXRfZGFjKGNpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBFbWl0IEh1ZmZtYW4gdGFibGVzLgorICAgICAqIE5vdGUgdGhhdCBlbWl0X2RodCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworCS8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW4gKi8KKwlpZiAoY2luZm8tPlNzID09IDApIHsKKwkgIGlmIChjaW5mby0+QWggPT0gMCkJLyogREMgbmVlZHMgbm8gdGFibGUgZm9yIHJlZmluZW1lbnQgc2NhbiAqLworCSAgICBlbWl0X2RodChjaW5mbywgY29tcHB0ci0+ZGNfdGJsX25vLCBGQUxTRSk7CisJfSBlbHNlIHsKKwkgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOworCX0KKyAgICAgIH0gZWxzZSB7CisJLyogU2VxdWVudGlhbCBtb2RlOiBuZWVkIGJvdGggREMgYW5kIEFDIHRhYmxlcyAqLworCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKKwllbWl0X2RodChjaW5mbywgY29tcHB0ci0+YWNfdGJsX25vLCBUUlVFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBFbWl0IERSSSBpZiByZXF1aXJlZCAtLS0gbm90ZSB0aGF0IERSSSB2YWx1ZSBjb3VsZCBjaGFuZ2UgZm9yIGVhY2ggc2Nhbi4KKyAgICogV2UgYXZvaWQgd2FzdGluZyBzcGFjZSB3aXRoIHVubmVjZXNzYXJ5IERSSXMsIGhvd2V2ZXIuCisgICAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgIT0gbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBlbWl0X2RyaShjaW5mbyk7CisgICAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgfQorCisgIGVtaXRfc29zKGNpbmZvKTsKK30KKworCisvKgorICogV3JpdGUgZGF0YXN0cmVhbSB0cmFpbGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV90cmFpbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKK30KKworCisvKgorICogV3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUtc3BlY2lmaWNhdGlvbiBkYXRhc3RyZWFtLgorICogVGhpcyBjb25zaXN0cyBvZiBTT0ksIERRVCBhbmQgREhUIHRhYmxlcywgYW5kIEVPSS4KKyAqIEFueSB0YWJsZSB0aGF0IGlzIGRlZmluZWQgYW5kIG5vdCBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgd2lsbCBiZQorICogZW1pdHRlZC4gIE5vdGUgdGhhdCBhbGwgdGFibGVzIHdpbGwgYmUgbWFya2VkIHNlbnRfdGFibGUgPSBUUlVFIGF0IGV4aXQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV90YWJsZXNfb25seSAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW2ldICE9IE5VTEwpCisgICAgICAodm9pZCkgZW1pdF9kcXQoY2luZm8sIGkpOworICB9CisKKyAgaWYgKCEgY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgICBpZiAoY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKKwllbWl0X2RodChjaW5mbywgaSwgRkFMU0UpOworICAgICAgaWYgKGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldICE9IE5VTEwpCisJZW1pdF9kaHQoY2luZm8sIGksIFRSVUUpOworICAgIH0KKyAgfQorCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0VPSSk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgbW9kdWxlLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWFya2VyX3dyaXRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyOworCisgIC8qIENyZWF0ZSB0aGUgc3Vib2JqZWN0ICovCisgIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X21hcmtlcl93cml0ZXIpKTsKKyAgY2luZm8tPm1hcmtlciA9IChzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICopIG1hcmtlcjsKKyAgLyogSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMgKi8KKyAgbWFya2VyLT5wdWIud3JpdGVfZmlsZV9oZWFkZXIgPSB3cml0ZV9maWxlX2hlYWRlcjsKKyAgbWFya2VyLT5wdWIud3JpdGVfZnJhbWVfaGVhZGVyID0gd3JpdGVfZnJhbWVfaGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9zY2FuX2hlYWRlciA9IHdyaXRlX3NjYW5faGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX3RyYWlsZXIgPSB3cml0ZV9maWxlX3RyYWlsZXI7CisgIG1hcmtlci0+cHViLndyaXRlX3RhYmxlc19vbmx5ID0gd3JpdGVfdGFibGVzX29ubHk7CisgIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9oZWFkZXIgPSB3cml0ZV9tYXJrZXJfaGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9tYXJrZXJfYnl0ZSA9IHdyaXRlX21hcmtlcl9ieXRlOworICAvKiBJbml0aWFsaXplIHByaXZhdGUgc3RhdGUgKi8KKyAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOworfQpkaWZmIC0tZ2l0IGEvamNtYXN0ZXIuYyBiL2pjbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiNDAyMAotLS0gL2Rldi9udWxsCisrKyBiL2pjbWFzdGVyLmMKQEAgLTAsMCArMSw1OTAgQEAKKy8qCisgKiBqY21hc3Rlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggcGFyYW1ldGVyIHZhbGlkYXRpb24sIGluaXRpYWwgc2V0dXAsCisgKiBhbmQgaW50ZXItcGFzcyBjb250cm9sIChkZXRlcm1pbmluZyB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbmQgdGhlIHdvcmsgCisgKiB0byBiZSBkb25lIGluIGVhY2ggcGFzcykuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBlbnVtIHsKKwltYWluX3Bhc3MsCQkvKiBpbnB1dCBkYXRhLCBhbHNvIGRvIGZpcnN0IG91dHB1dCBzdGVwICovCisJaHVmZl9vcHRfcGFzcywJCS8qIEh1ZmZtYW4gY29kZSBvcHRpbWl6YXRpb24gcGFzcyAqLworCW91dHB1dF9wYXNzCQkvKiBkYXRhIG91dHB1dCBwYXNzICovCit9IGNfcGFzc190eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIGNfcGFzc190eXBlIHBhc3NfdHlwZTsJLyogdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgcGFzcyAqLworCisgIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLworICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgIyBvZiBwYXNzZXMgbmVlZGVkICovCisKKyAgaW50IHNjYW5fbnVtYmVyOwkJLyogY3VycmVudCBpbmRleCBpbiBzY2FuX2luZm9bXSAqLworfSBteV9jb21wX21hc3RlcjsKKwordHlwZWRlZiBteV9jb21wX21hc3RlciAqIG15X21hc3Rlcl9wdHI7CisKKworLyoKKyAqIFN1cHBvcnQgcm91dGluZXMgdGhhdCBkbyB2YXJpb3VzIGVzc2VudGlhbCBjYWxjdWxhdGlvbnMuCisgKi8KKworTE9DQUwodm9pZCkKK2luaXRpYWxfc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgbWFzdGVyIHNlbGVjdGlvbiBwaGFzZSAqLworeworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGxvbmcgc2FtcGxlc3BlcnJvdzsKKyAgSkRJTUVOU0lPTiBqZF9zYW1wbGVzcGVycm93OworCisgIC8qIFNhbml0eSBjaGVjayBvbiBpbWFnZSBkaW1lbnNpb25zICovCisgIGlmIChjaW5mby0+aW1hZ2VfaGVpZ2h0IDw9IDAgfHwgY2luZm8tPmltYWdlX3dpZHRoIDw9IDAKKyAgICAgIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA8PSAwIHx8IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzIDw9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9FTVBUWV9JTUFHRSk7CisKKyAgLyogTWFrZSBzdXJlIGltYWdlIGlzbid0IGJpZ2dlciB0aGFuIEkgY2FuIGhhbmRsZSAqLworICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSBKUEVHX01BWF9ESU1FTlNJT04pOworCisgIC8qIFdpZHRoIG9mIGFuIGlucHV0IHNjYW5saW5lIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBKRElNRU5TSU9OLiAqLworICBzYW1wbGVzcGVycm93ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKKyAgamRfc2FtcGxlc3BlcnJvdyA9IChKRElNRU5TSU9OKSBzYW1wbGVzcGVycm93OworICBpZiAoKGxvbmcpIGpkX3NhbXBsZXNwZXJyb3cgIT0gc2FtcGxlc3BlcnJvdykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKworICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLworICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOworCisgIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCisgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgIE1BWF9DT01QT05FTlRTKTsKKworICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCisgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7CisgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7CisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKKwljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOworICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCisJCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7CisgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKwkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgfQorCisgIC8qIENvbXB1dGUgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogRmlsbCBpbiB0aGUgY29ycmVjdCBjb21wb25lbnRfaW5kZXggdmFsdWU7IGRvbid0IHJlbHkgb24gYXBwbGljYXRpb24gKi8KKyAgICBjb21wcHRyLT5jb21wb25lbnRfaW5kZXggPSBjaTsKKyAgICAvKiBGb3IgY29tcHJlc3Npb24sIHdlIG5ldmVyIGRvIERDVCBzY2FsaW5nLiAqLworICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisgICAgLyogU2l6ZSBpbiBEQ1QgYmxvY2tzICovCisgICAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkICh0aGlzIGZsYWcgaXNuJ3QgYWN0dWFsbHkgdXNlZCBmb3IgY29tcHJlc3Npb24pICovCisgICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7CisgIH0KKworICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cyAobnVtYmVyIG9mIHRpbWVzIHRoYXQKKyAgICogbWFpbiBjb250cm9sbGVyIHdpbGwgY2FsbCBjb2VmZmljaWVudCBjb250cm9sbGVyKS4KKyAgICovCisgIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgPSAoSkRJTUVOU0lPTikKKyAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKK30KKworCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKK0xPQ0FMKHZvaWQpCit2YWxpZGF0ZV9zY3JpcHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogVmVyaWZ5IHRoYXQgdGhlIHNjYW4gc2NyaXB0IGluIGNpbmZvLT5zY2FuX2luZm9bXSBpcyB2YWxpZDsgYWxzbworICogZGV0ZXJtaW5lIHdoZXRoZXIgaXQgdXNlcyBwcm9ncmVzc2l2ZSBKUEVHLCBhbmQgc2V0IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlLgorICovCit7CisgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKyAgaW50IHNjYW5ubywgbmNvbXBzLCBjaSwgY29lZmksIHRoaXNpOworICBpbnQgU3MsIFNlLCBBaCwgQWw7CisgIGJvb2xlYW4gY29tcG9uZW50X3NlbnRbTUFYX0NPTVBPTkVOVFNdOworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgIGludCAqIGxhc3RfYml0cG9zX3B0cjsKKyAgaW50IGxhc3RfYml0cG9zW01BWF9DT01QT05FTlRTXVtEQ1RTSVpFMl07CisgIC8qIC0xIHVudGlsIHRoYXQgY29lZmZpY2llbnQgaGFzIGJlZW4gc2VlbjsgdGhlbiBsYXN0IEFsIGZvciBpdCAqLworI2VuZGlmCisKKyAgaWYgKGNpbmZvLT5udW1fc2NhbnMgPD0gMCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIDApOworCisgIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBzY2FucyBtdXN0IGhhdmUgU3M9MCwgU2U9RENUU0laRTItMTsKKyAgICogZm9yIHByb2dyZXNzaXZlIEpQRUcsIG5vIHNjYW4gY2FuIGhhdmUgdGhpcy4KKyAgICovCisgIHNjYW5wdHIgPSBjaW5mby0+c2Nhbl9pbmZvOworICBpZiAoc2NhbnB0ci0+U3MgIT0gMCB8fCBzY2FucHRyLT5TZSAhPSBEQ1RTSVpFMi0xKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IFRSVUU7CisgICAgbGFzdF9iaXRwb3NfcHRyID0gJiBsYXN0X2JpdHBvc1swXVswXTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAorICAgICAgZm9yIChjb2VmaSA9IDA7IGNvZWZpIDwgRENUU0laRTI7IGNvZWZpKyspCisJKmxhc3RfYml0cG9zX3B0cisrID0gLTE7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gRkFMU0U7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKKyAgICAgIGNvbXBvbmVudF9zZW50W2NpXSA9IEZBTFNFOworICB9CisKKyAgZm9yIChzY2Fubm8gPSAxOyBzY2Fubm8gPD0gY2luZm8tPm51bV9zY2Fuczsgc2NhbnB0cisrLCBzY2Fubm8rKykgeworICAgIC8qIFZhbGlkYXRlIGNvbXBvbmVudCBpbmRleGVzICovCisgICAgbmNvbXBzID0gc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsKKyAgICBpZiAobmNvbXBzIDw9IDAgfHwgbmNvbXBzID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIG5jb21wcywgTUFYX0NPTVBTX0lOX1NDQU4pOworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgeworICAgICAgdGhpc2kgPSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldOworICAgICAgaWYgKHRoaXNpIDwgMCB8fCB0aGlzaSA+PSBjaW5mby0+bnVtX2NvbXBvbmVudHMpCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworICAgICAgLyogQ29tcG9uZW50cyBtdXN0IGFwcGVhciBpbiBTT0Ygb3JkZXIgd2l0aGluIGVhY2ggc2NhbiAqLworICAgICAgaWYgKGNpID4gMCAmJiB0aGlzaSA8PSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ktMV0pCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworICAgIH0KKyAgICAvKiBWYWxpZGF0ZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzICovCisgICAgU3MgPSBzY2FucHRyLT5TczsKKyAgICBTZSA9IHNjYW5wdHItPlNlOworICAgIEFoID0gc2NhbnB0ci0+QWg7CisgICAgQWwgPSBzY2FucHRyLT5BbDsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgLyogVGhlIEpQRUcgc3BlYyBzaW1wbHkgZ2l2ZXMgdGhlIHJhbmdlcyAwLi4xMyBmb3IgQWggYW5kIEFsLCBidXQgdGhhdAorICAgICAgICogc2VlbXMgd3Jvbmc6IHRoZSB1cHBlciBib3VuZCBvdWdodCB0byBkZXBlbmQgb24gZGF0YSBwcmVjaXNpb24uCisgICAgICAgKiBQZXJoYXBzIHRoZXkgcmVhbGx5IG1lYW50IDAuLk4rMSBmb3IgTi1iaXQgcHJlY2lzaW9uLgorICAgICAgICogSGVyZSB3ZSBhbGxvdyAwLi4xMCBmb3IgOC1iaXQgZGF0YTsgQWwgbGFyZ2VyIHRoYW4gMTAgcmVzdWx0cyBpbgorICAgICAgICogb3V0LW9mLXJhbmdlIHJlY29uc3RydWN0ZWQgREMgdmFsdWVzIGR1cmluZyB0aGUgZmlyc3QgREMgc2NhbiwKKyAgICAgICAqIHdoaWNoIG1pZ2h0IGNhdXNlIHByb2JsZW1zIGZvciBzb21lIGRlY29kZXJzLgorICAgICAgICovCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTUFYX0FIX0FMIDEwCisjZWxzZQorI2RlZmluZSBNQVhfQUhfQUwgMTMKKyNlbmRpZgorICAgICAgaWYgKFNzIDwgMCB8fCBTcyA+PSBEQ1RTSVpFMiB8fCBTZSA8IFNzIHx8IFNlID49IERDVFNJWkUyIHx8CisJICBBaCA8IDAgfHwgQWggPiBNQVhfQUhfQUwgfHwgQWwgPCAwIHx8IEFsID4gTUFYX0FIX0FMKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKyAgICAgIGlmIChTcyA9PSAwKSB7CisJaWYgKFNlICE9IDApCQkvKiBEQyBhbmQgQUMgdG9nZXRoZXIgbm90IE9LICovCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICB9IGVsc2UgeworCWlmIChuY29tcHMgIT0gMSkJLyogQUMgc2NhbnMgbXVzdCBiZSBmb3Igb25seSBvbmUgY29tcG9uZW50ICovCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICB9CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKKwlsYXN0X2JpdHBvc19wdHIgPSAmIGxhc3RfYml0cG9zW3NjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV1dWzBdOworCWlmIChTcyAhPSAwICYmIGxhc3RfYml0cG9zX3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLworCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworCWZvciAoY29lZmkgPSBTczsgY29lZmkgPD0gU2U7IGNvZWZpKyspIHsKKwkgIGlmIChsYXN0X2JpdHBvc19wdHJbY29lZmldIDwgMCkgeworCSAgICAvKiBmaXJzdCBzY2FuIG9mIHRoaXMgY29lZmZpY2llbnQgKi8KKwkgICAgaWYgKEFoICE9IDApCisJICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworCSAgfSBlbHNlIHsKKwkgICAgLyogbm90IGZpcnN0IHNjYW4gKi8KKwkgICAgaWYgKEFoICE9IGxhc3RfYml0cG9zX3B0cltjb2VmaV0gfHwgQWwgIT0gQWgtMSkKKwkgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisJICB9CisJICBsYXN0X2JpdHBvc19wdHJbY29lZmldID0gQWw7CisJfQorICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIG11c3QgYmUgdGhlc2U6ICovCisgICAgICBpZiAoU3MgIT0gMCB8fCBTZSAhPSBEQ1RTSVpFMi0xIHx8IEFoICE9IDAgfHwgQWwgIT0gMCkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICAvKiBNYWtlIHN1cmUgY29tcG9uZW50cyBhcmUgbm90IHNlbnQgdHdpY2UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgeworCXRoaXNpID0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXTsKKwlpZiAoY29tcG9uZW50X3NlbnRbdGhpc2ldKQorCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworCWNvbXBvbmVudF9zZW50W3RoaXNpXSA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogTm93IHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgZ290IHNlbnQuICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgLyogRm9yIHByb2dyZXNzaXZlIG1vZGUsIHdlIG9ubHkgY2hlY2sgdGhhdCBhdCBsZWFzdCBzb21lIERDIGRhdGEKKyAgICAgKiBnb3Qgc2VudCBmb3IgZWFjaCBjb21wb25lbnQ7IHRoZSBzcGVjIGRvZXMgbm90IHJlcXVpcmUgdGhhdCBhbGwgYml0cworICAgICAqIG9mIGFsbCBjb2VmZmljaWVudHMgYmUgdHJhbnNtaXR0ZWQuICBXb3VsZCBpdCBiZSB3aXNlciB0byBlbmZvcmNlCisgICAgICogdHJhbnNtaXNzaW9uIG9mIGFsbCBjb2VmZmljaWVudCBiaXRzPz8KKyAgICAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlmIChsYXN0X2JpdHBvc1tjaV1bMF0gPCAwKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfTUlTU0lOR19EQVRBKTsKKyAgICB9CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlmICghIGNvbXBvbmVudF9zZW50W2NpXSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX01JU1NJTkdfREFUQSk7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X3NjYW5fcGFyYW1ldGVycyAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBTZXQgdXAgdGhlIHNjYW4gcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnQgc2NhbiAqLworeworICBpbnQgY2k7CisKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgaWYgKGNpbmZvLT5zY2FuX2luZm8gIT0gTlVMTCkgeworICAgIC8qIFByZXBhcmUgZm9yIGN1cnJlbnQgc2NhbiAtLS0gdGhlIHNjcmlwdCBpcyBhbHJlYWR5IHZhbGlkYXRlZCAqLworICAgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisgICAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FucHRyID0gY2luZm8tPnNjYW5faW5mbyArIG1hc3Rlci0+c2Nhbl9udW1iZXI7CisKKyAgICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IHNjYW5wdHItPmNvbXBzX2luX3NjYW47CisgICAgZm9yIChjaSA9IDA7IGNpIDwgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgICAgY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID0KKwkmY2luZm8tPmNvbXBfaW5mb1tzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldXTsKKyAgICB9CisgICAgY2luZm8tPlNzID0gc2NhbnB0ci0+U3M7CisgICAgY2luZm8tPlNlID0gc2NhbnB0ci0+U2U7CisgICAgY2luZm8tPkFoID0gc2NhbnB0ci0+QWg7CisgICAgY2luZm8tPkFsID0gc2NhbnB0ci0+QWw7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsKKyAgICAvKiBQcmVwYXJlIGZvciBzaW5nbGUgc2VxdWVudGlhbC1KUEVHIHNjYW4gY29udGFpbmluZyBhbGwgY29tcG9uZW50cyAqLworICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKKyAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPSAmY2luZm8tPmNvbXBfaW5mb1tjaV07CisgICAgfQorICAgIGNpbmZvLT5TcyA9IDA7CisgICAgY2luZm8tPlNlID0gRENUU0laRTItMTsKKyAgICBjaW5mby0+QWggPSAwOworICAgIGNpbmZvLT5BbCA9IDA7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorcGVyX3NjYW5fc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLworLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gYXJlIGFscmVhZHkgc2V0ICovCit7CisgIGludCBjaSwgbWN1YmxrcywgdG1wOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKKyAgICAKKyAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKKyAgICAKKyAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLworICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworICAgIAorICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KKyAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOworICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOworICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOworICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBEQ1RTSVpFOworICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gMTsKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbnMsIGl0IGlzIGNvbnZlbmllbnQgdG8gZGVmaW5lIGxhc3Rfcm93X2hlaWdodAorICAgICAqIGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgcm93cyBwcmVzZW50IGluIHRoZSBsYXN0IGlNQ1Ugcm93LgorICAgICAqLworICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKKyAgICAKKyAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAxOworICAgIGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFswXSA9IDA7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgICAgLyogSW50ZXJsZWF2ZWQgKG11bHRpLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8PSAwIHx8IGNpbmZvLT5jb21wc19pbl9zY2FuID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5jb21wc19pbl9zY2FuLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOworICAgIAorICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgLyogU2FtcGxpbmcgZmFjdG9ycyBnaXZlICMgb2YgYmxvY2tzIG9mIGNvbXBvbmVudCBpbiBlYWNoIE1DVSAqLworICAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+TUNVX3dpZHRoICogRENUU0laRTsKKyAgICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygbm9uLWR1bW15IGJsb2NrcyBpbiBsYXN0IE1DVSBjb2x1bW4gJiByb3cgKi8KKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX2hlaWdodCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgICBtY3VibGtzID0gY29tcHB0ci0+TUNVX2Jsb2NrczsKKyAgICAgIGlmIChjaW5mby0+YmxvY2tzX2luX01DVSArIG1jdWJsa3MgPiBDX01BWF9CTE9DS1NfSU5fTUNVKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX01DVV9TSVpFKTsKKyAgICAgIHdoaWxlIChtY3VibGtzLS0gPiAwKSB7CisJY2luZm8tPk1DVV9tZW1iZXJzaGlwW2NpbmZvLT5ibG9ja3NfaW5fTUNVKytdID0gY2k7CisgICAgICB9CisgICAgfQorICAgIAorICB9CisKKyAgLyogQ29udmVydCByZXN0YXJ0IHNwZWNpZmllZCBpbiByb3dzIHRvIGFjdHVhbCBNQ1UgY291bnQuICovCisgIC8qIE5vdGUgdGhhdCBjb3VudCBtdXN0IGZpdCBpbiAxNiBiaXRzLCBzbyB3ZSBwcm92aWRlIGxpbWl0aW5nLiAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW5fcm93cyA+IDApIHsKKyAgICBsb25nIG5vbWluYWwgPSAobG9uZykgY2luZm8tPnJlc3RhcnRfaW5fcm93cyAqIChsb25nKSBjaW5mby0+TUNVc19wZXJfcm93OworICAgIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gKHVuc2lnbmVkIGludCkgTUlOKG5vbWluYWwsIDY1NTM1TCk7CisgIH0KK30KKworCisvKgorICogUGVyLXBhc3Mgc2V0dXAuCisgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4gIFdlIGRldGVybWluZSB3aGljaCBtb2R1bGVzCisgKiB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgc3RhcnRfcGFzcyBjYWxscy4KKyAqIFdlIGFsc28gc2V0IGlzX2xhc3RfcGFzcyB0byBpbmRpY2F0ZSB3aGV0aGVyIGFueSBtb3JlIHBhc3NlcyB3aWxsIGJlCisgKiByZXF1aXJlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ByZXBhcmVfZm9yX3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIHN3aXRjaCAobWFzdGVyLT5wYXNzX3R5cGUpIHsKKyAgY2FzZSBtYWluX3Bhc3M6CisgICAgLyogSW5pdGlhbCBwYXNzOiB3aWxsIGNvbGxlY3QgaW5wdXQgZGF0YSwgYW5kIGRvIGVpdGhlciBIdWZmbWFuCisgICAgICogb3B0aW1pemF0aW9uIG9yIGRhdGEgb3V0cHV0IGZvciB0aGUgZmlyc3Qgc2Nhbi4KKyAgICAgKi8KKyAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKKyAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgICAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAgICgqY2luZm8tPmRvd25zYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICAoKmNpbmZvLT5wcmVwLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKKyAgICB9CisgICAgKCpjaW5mby0+ZmRjdC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpOworICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywKKwkJCQkobWFzdGVyLT50b3RhbF9wYXNzZXMgPiAxID8KKwkJCQkgSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKKyAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKKyAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykgeworICAgICAgLyogTm8gaW1tZWRpYXRlIGRhdGEgb3V0cHV0OyBwb3N0cG9uZSB3cml0aW5nIGZyYW1lL3NjYW4gaGVhZGVycyAqLworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgLyogV2lsbCB3cml0ZSBmcmFtZS9zY2FuIGhlYWRlcnMgYXQgZmlyc3QganBlZ193cml0ZV9zY2FubGluZXMgY2FsbCAqLworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBUUlVFOworICAgIH0KKyAgICBicmVhazsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgY2FzZSBodWZmX29wdF9wYXNzOgorICAgIC8qIERvIEh1ZmZtYW4gb3B0aW1pemF0aW9uIGZvciBhIHNjYW4gYWZ0ZXIgdGhlIGZpcnN0IG9uZS4gKi8KKyAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKKyAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgICAgaWYgKGNpbmZvLT5TcyAhPSAwIHx8IGNpbmZvLT5BaCA9PSAwIHx8IGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIFRSVUUpOworICAgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBTcGVjaWFsIGNhc2U6IEh1ZmZtYW4gREMgcmVmaW5lbWVudCBzY2FucyBuZWVkIG5vIEh1ZmZtYW4gdGFibGUKKyAgICAgKiBhbmQgdGhlcmVmb3JlIHdlIGNhbiBza2lwIHRoZSBvcHRpbWl6YXRpb24gcGFzcyBmb3IgdGhlbS4KKyAgICAgKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKKyAgICAvKkZBTExUSFJPVUdIKi8KKyNlbmRpZgorICBjYXNlIG91dHB1dF9wYXNzOgorICAgIC8qIERvIGEgZGF0YS1vdXRwdXQgcGFzcy4gKi8KKyAgICAvKiBXZSBuZWVkIG5vdCByZXBlYXQgcGVyLXNjYW4gc2V0dXAgaWYgcHJpb3Igb3B0aW1pemF0aW9uIHBhc3MgZGlkIGl0LiAqLworICAgIGlmICghIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpIHsKKyAgICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOworICAgICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOworICAgIH0KKyAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIEZBTFNFKTsKKyAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7CisgICAgLyogV2UgZW1pdCBmcmFtZS9zY2FuIGhlYWRlcnMgbm93ICovCisgICAgaWYgKG1hc3Rlci0+c2Nhbl9udW1iZXIgPT0gMCkKKyAgICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZnJhbWVfaGVhZGVyKSAoY2luZm8pOworICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7CisgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgIH0KKworICBtYXN0ZXItPnB1Yi5pc19sYXN0X3Bhc3MgPSAobWFzdGVyLT5wYXNzX251bWJlciA9PSBtYXN0ZXItPnRvdGFsX3Bhc3Nlcy0xKTsKKworICAvKiBTZXQgdXAgcHJvZ3Jlc3MgbW9uaXRvcidzIHBhc3MgaW5mbyBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXI7CisgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSBtYXN0ZXItPnRvdGFsX3Bhc3NlczsKKyAgfQorfQorCisKKy8qCisgKiBTcGVjaWFsIHN0YXJ0LW9mLXBhc3MgaG9vay4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfd3JpdGVfc2NhbmxpbmVzIGlmIGNhbGxfcGFzc19zdGFydHVwIGlzIFRSVUUuCisgKiBJbiBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nLCB3ZSBuZWVkIHRoaXMgaG9vayBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KKyAqIHdyaXRlIGZyYW1lL3NjYW4gaGVhZGVycyBkdXJpbmcganBlZ19zdGFydF9jb21wcmVzczsgd2Ugd2FudCB0byBsZXQgdGhlCisgKiBhcHBsaWNhdGlvbiB3cml0ZSBDT00gbWFya2VycyBldGMuIGJldHdlZW4ganBlZ19zdGFydF9jb21wcmVzcyBhbmQgdGhlCisgKiBqcGVnX3dyaXRlX3NjYW5saW5lcyBsb29wLgorICogSW4gbXVsdGktcGFzcyBwcm9jZXNzaW5nLCB0aGlzIHJvdXRpbmUgaXMgbm90IHVzZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwYXNzX3N0YXJ0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOyAvKiByZXNldCBmbGFnIHNvIGNhbGwgb25seSBvbmNlICovCisKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9mcmFtZV9oZWFkZXIpIChjaW5mbyk7CisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCBlbmQgb2YgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX21hc3RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgLyogVGhlIGVudHJvcHkgY29kZXIgYWx3YXlzIG5lZWRzIGFuIGVuZC1vZi1wYXNzIGNhbGwsCisgICAqIGVpdGhlciB0byBhbmFseXplIHN0YXRpc3RpY3Mgb3IgdG8gZmx1c2ggaXRzIG91dHB1dCBidWZmZXIuCisgICAqLworICAoKmNpbmZvLT5lbnRyb3B5LT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKworICAvKiBVcGRhdGUgc3RhdGUgZm9yIG5leHQgcGFzcyAqLworICBzd2l0Y2ggKG1hc3Rlci0+cGFzc190eXBlKSB7CisgIGNhc2UgbWFpbl9wYXNzOgorICAgIC8qIG5leHQgcGFzcyBpcyBlaXRoZXIgb3V0cHV0IG9mIHNjYW4gMCAoYWZ0ZXIgb3B0aW1pemF0aW9uKQorICAgICAqIG9yIG91dHB1dCBvZiBzY2FuIDEgKGlmIG5vIG9wdGltaXphdGlvbikuCisgICAgICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgICBpZiAoISBjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgICAgbWFzdGVyLT5zY2FuX251bWJlcisrOworICAgIGJyZWFrOworICBjYXNlIGh1ZmZfb3B0X3Bhc3M6CisgICAgLyogbmV4dCBwYXNzIGlzIGFsd2F5cyBvdXRwdXQgb2YgY3VycmVudCBzY2FuICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBvdXRwdXRfcGFzczoKKyAgICAvKiBuZXh0IHBhc3MgaXMgZWl0aGVyIG9wdGltaXphdGlvbiBvciBvdXRwdXQgb2YgbmV4dCBzY2FuICovCisgICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCisgICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IGh1ZmZfb3B0X3Bhc3M7CisgICAgbWFzdGVyLT5zY2FuX251bWJlcisrOworICAgIGJyZWFrOworICB9CisKKyAgbWFzdGVyLT5wYXNzX251bWJlcisrOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIG1hc3RlciBjb21wcmVzc2lvbiBjb250cm9sLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19tYXN0ZXJfY29udHJvbCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gdHJhbnNjb2RlX29ubHkpCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyOworCisgIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihteV9jb21wX21hc3RlcikpOworICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyICopIG1hc3RlcjsKKyAgbWFzdGVyLT5wdWIucHJlcGFyZV9mb3JfcGFzcyA9IHByZXBhcmVfZm9yX3Bhc3M7CisgIG1hc3Rlci0+cHViLnBhc3Nfc3RhcnR1cCA9IHBhc3Nfc3RhcnR1cDsKKyAgbWFzdGVyLT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19tYXN0ZXI7CisgIG1hc3Rlci0+cHViLmlzX2xhc3RfcGFzcyA9IEZBTFNFOworCisgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMsIGRldGVybWluZSBkZXJpdmVkIHZhbHVlcyAqLworICBpbml0aWFsX3NldHVwKGNpbmZvKTsKKworICBpZiAoY2luZm8tPnNjYW5faW5mbyAhPSBOVUxMKSB7CisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgdmFsaWRhdGVfc2NyaXB0KGNpbmZvKTsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBGQUxTRTsKKyAgICBjaW5mby0+bnVtX3NjYW5zID0gMTsKKyAgfQorCisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkJLyogIFRFTVBPUkFSWSBIQUNLID8/PyAqLworICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOyAvKiBhc3N1bWUgZGVmYXVsdCB0YWJsZXMgbm8gZ29vZCBmb3IgcHJvZ3Jlc3NpdmUgbW9kZSAqLworCisgIC8qIEluaXRpYWxpemUgbXkgcHJpdmF0ZSBzdGF0ZSAqLworICBpZiAodHJhbnNjb2RlX29ubHkpIHsKKyAgICAvKiBubyBtYWluIHBhc3MgaW4gdHJhbnNjb2RpbmcgKi8KKyAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKKyAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gaHVmZl9vcHRfcGFzczsKKyAgICBlbHNlCisgICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICB9IGVsc2UgeworICAgIC8qIGZvciBub3JtYWwgY29tcHJlc3Npb24sIGZpcnN0IHBhc3MgaXMgYWx3YXlzIHRoaXMgdHlwZTogKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG1haW5fcGFzczsKKyAgfQorICBtYXN0ZXItPnNjYW5fbnVtYmVyID0gMDsKKyAgbWFzdGVyLT5wYXNzX251bWJlciA9IDA7CisgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgIG1hc3Rlci0+dG90YWxfcGFzc2VzID0gY2luZm8tPm51bV9zY2FucyAqIDI7CisgIGVsc2UKKyAgICBtYXN0ZXItPnRvdGFsX3Bhc3NlcyA9IGNpbmZvLT5udW1fc2NhbnM7Cit9CmRpZmYgLS1naXQgYS9qY29tYXBpLmMgYi9qY29tYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxZmE3NQotLS0gL2Rldi9udWxsCisrKyBiL2pjb21hcGkuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIGpjb21hcGkuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSByb3V0aW5lcyB0aGF0IGFyZSB1c2VkIGZvciBib3RoCisgKiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLAorICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCisgKgorICogRm9yIHRoaXMsIHdlIG1lcmVseSBjbGVhbiB1cCBhbGwgdGhlIG5vbnBlcm1hbmVudCBtZW1vcnkgcG9vbHMuCisgKiBOb3RlIHRoYXQgdGVtcCBmaWxlcyAodmlydHVhbCBhcnJheXMpIGFyZSBub3QgYWxsb3dlZCB0byBiZWxvbmcgdG8KKyAqIHRoZSBwZXJtYW5lbnQgcG9vbCwgc28gd2Ugd2lsbCBiZSBhYmxlIHRvIGNsb3NlIGFsbCB0ZW1wIGZpbGVzIGhlcmUuCisgKiBDbG9zaW5nIGEgZGF0YSBzb3VyY2Ugb3IgZGVzdGluYXRpb24sIGlmIG5lY2Vzc2FyeSwgaXMgdGhlIGFwcGxpY2F0aW9uJ3MKKyAqIHJlc3BvbnNpYmlsaXR5LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19hYm9ydCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBpbnQgcG9vbDsKKworICAvKiBEbyBub3RoaW5nIGlmIGNhbGxlZCBvbiBhIG5vdC1pbml0aWFsaXplZCBvciBkZXN0cm95ZWQgSlBFRyBvYmplY3QuICovCisgIGlmIChjaW5mby0+bWVtID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIFJlbGVhc2luZyBwb29scyBpbiByZXZlcnNlIG9yZGVyIG1pZ2h0IGhlbHAgYXZvaWQgZnJhZ21lbnRhdGlvbgorICAgKiB3aXRoIHNvbWUgKGJyYWluLWRhbWFnZWQpIG1hbGxvYyBsaWJyYXJpZXMuCisgICAqLworICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID4gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKKyAgICAoKmNpbmZvLT5tZW0tPmZyZWVfcG9vbCkgKGNpbmZvLCBwb29sKTsKKyAgfQorCisgIC8qIFJlc2V0IG92ZXJhbGwgc3RhdGUgZm9yIHBvc3NpYmxlIHJldXNlIG9mIG9iamVjdCAqLworICBpZiAoY2luZm8tPmlzX2RlY29tcHJlc3NvcikgeworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7CisgICAgLyogVHJ5IHRvIGtlZXAgYXBwbGljYXRpb24gZnJvbSBhY2Nlc3Npbmcgbm93LWRlbGV0ZWQgbWFya2VyIGxpc3QuCisgICAgICogQSBiaXQga2x1ZGd5IHRvIGRvIGl0IGhlcmUsIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IGNlbnRyYWwgcGxhY2UuCisgICAgICovCisgICAgKChqX2RlY29tcHJlc3NfcHRyKSBjaW5mbyktPm1hcmtlcl9saXN0ID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gQ1NUQVRFX1NUQVJUOworICB9Cit9CisKKworLyoKKyAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBvYmplY3QuCisgKgorICogRXZlcnl0aGluZyBnZXRzIGRlYWxsb2NhdGVkIGV4Y2VwdCB0aGUgbWFzdGVyIGpwZWdfY29tcHJlc3Nfc3RydWN0IGl0c2VsZgorICogYW5kIHRoZSBlcnJvciBtYW5hZ2VyIHN0cnVjdC4gIEJvdGggb2YgdGhlc2UgYXJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbgorICogYW5kIG11c3QgYmUgZnJlZWQsIGlmIG5lY2Vzc2FyeSwgYnkgdGhlIGFwcGxpY2F0aW9uLiAgKE9mdGVuIHRoZXkgYXJlIG9uCisgKiB0aGUgc3RhY2sgYW5kIHNvIGRvbid0IG5lZWQgdG8gYmUgZnJlZWQgYW55d2F5LikKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiwgaWYgbmVjZXNzYXJ5LCBpcyB0aGUgYXBwbGljYXRpb24ncworICogcmVzcG9uc2liaWxpdHkuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3kgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogV2UgbmVlZCBvbmx5IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIHJlbGVhc2UgZXZlcnl0aGluZy4gKi8KKyAgLyogTkI6IG1lbSBwb2ludGVyIGlzIE5VTEwgaWYgbWVtb3J5IG1nciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKi8KKyAgaWYgKGNpbmZvLT5tZW0gIT0gTlVMTCkKKyAgICAoKmNpbmZvLT5tZW0tPnNlbGZfZGVzdHJ1Y3QpIChjaW5mbyk7CisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogYmUgc2FmZSBpZiBqcGVnX2Rlc3Ryb3kgaXMgY2FsbGVkIHR3aWNlICovCisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAwOwkvKiBtYXJrIGl0IGRlc3Ryb3llZCAqLworfQorCisKKy8qCisgKiBDb252ZW5pZW5jZSByb3V0aW5lcyBmb3IgYWxsb2NhdGluZyBxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzLgorICogKFdvdWxkIGp1dGlscy5jIGJlIGEgbW9yZSByZWFzb25hYmxlIHBsYWNlIHRvIHB1dCB0aGVzZT8pCisgKi8KKworR0xPQkFMKEpRVUFOVF9UQkwgKikKK2pwZWdfYWxsb2NfcXVhbnRfdGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqdGJsOworCisgIHRibCA9IChKUVVBTlRfVEJMICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsIFNJWkVPRihKUVVBTlRfVEJMKSk7CisgIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCisgIHJldHVybiB0Ymw7Cit9CisKKworR0xPQkFMKEpIVUZGX1RCTCAqKQoranBlZ19hbGxvY19odWZmX3RhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIEpIVUZGX1RCTCAqdGJsOworCisgIHRibCA9IChKSFVGRl9UQkwgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgU0laRU9GKEpIVUZGX1RCTCkpOworICB0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsJLyogbWFrZSBzdXJlIHRoaXMgaXMgZmFsc2UgaW4gYW55IG5ldyB0YWJsZSAqLworICByZXR1cm4gdGJsOworfQpkaWZmIC0tZ2l0IGEvamNvbmZpZy5iY2MgYi9qY29uZmlnLmJjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmM1M2ZmCi0tLSAvZGV2L251bGwKKysrIGIvamNvbmZpZy5iY2MKQEAgLTAsMCArMSw0OCBAQAorLyogamNvbmZpZy5iY2MgLS0tIGpjb25maWcuaCBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSBvbiBNUy1ET1Mgb3IgT1MvMi4gKi8KKy8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworLyogI2RlZmluZSBjb25zdCAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMJLyogZm9yIHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWwgKi8KKyNlbmRpZgorI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgkvKiB0aGlzIGFzc3VtZXMgeW91IGhhdmUgLXctc3R1IGluIENGTEFHUyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMCS8qIE1heGltdW0gcmVxdWVzdCB0byBtYWxsb2MoKSAqLworI2RlZmluZSBVU0VfRk1FTQkJLyogQm9ybGFuZCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCisjZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBCb3JsYW5kIGhhcyBzZXRtb2RlKCkgKi8KKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworI2VuZGlmCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNvbmZpZy5jZmcgYi9qY29uZmlnLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmEwNGZhCi0tLSAvZGV2L251bGwKKysrIGIvamNvbmZpZy5jZmcKQEAgLTAsMCArMSw0NCBAQAorLyogamNvbmZpZy5jZmcgLS0tIHNvdXJjZSBmaWxlIGVkaXRlZCBieSBjb25maWd1cmUgc2NyaXB0ICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjdW5kZWYgSEFWRV9QUk9UT1RZUEVTCisjdW5kZWYgSEFWRV9VTlNJR05FRF9DSEFSCisjdW5kZWYgSEFWRV9VTlNJR05FRF9TSE9SVAorI3VuZGVmIHZvaWQKKyN1bmRlZiBjb25zdAorI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyN1bmRlZiBIQVZFX1NURERFRl9ICisjdW5kZWYgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgZ2V0IHdhcm5pbmdzIGFib3V0IHVuZGVmaW5lZCBzdHJ1Y3R1cmVzLiAqLworI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKyN1bmRlZiBJTkxJTkUKKy8qIFRoZXNlIGFyZSBmb3IgY29uZmlndXJpbmcgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICovCisjdW5kZWYgREVGQVVMVF9NQVhfTUVNCisjdW5kZWYgTk9fTUtURU1QCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuICovCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCisKKyNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9qY29uZmlnLmRqIGIvamNvbmZpZy5kagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzU5YTlkCi0tLSAvZGV2L251bGwKKysrIGIvamNvbmZpZy5kagpAQCAtMCwwICsxLDM4IEBACisvKiBqY29uZmlnLmRqIC0tLSBqY29uZmlnLmggZm9yIERKR1BQIChEZWxvcmllJ3MgR05VIEMgcG9ydCkgb24gTVMtRE9TLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIERKR1BQIHVzZXMgZmxhdCAzMi1iaXQgYWRkcmVzc2luZyAqLworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE5lZWRlZCB0byBtYWtlIG9uZS1maWxlIHN0eWxlIHdvcmsgaW4gREpHUFAgKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLworI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pjb25maWcuZG9jIGIvamNvbmZpZy5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4ZDFjMAotLS0gL2Rldi9udWxsCisrKyBiL2pjb25maWcuZG9jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogamNvbmZpZy5kb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bworICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgorICoKKyAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKKyAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKKyAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgorICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KKyAqCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCisgKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCisgKi8KKworCisvKgorICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCisgKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCisgKi8KKworLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCisgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKy8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPworICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPworICovCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KKyAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAorICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgorICovCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworCisvKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgorICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisKKy8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgorICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KKyAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCisgKi8KKyNkZWZpbmUgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KKyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCisgKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgorICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKKyAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCisgKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisKKy8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAorICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgorICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KKyAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAorICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCisgKi8KKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKKyAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCisgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bworICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCisgKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQorICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKKyAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgorICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworCisvKgorICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKKyAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKKyAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCisgKi8KKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKKyAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCisgKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KKyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisvKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAorICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgorICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0CisgKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KKyAqLworI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgorICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcworICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgorICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCisvKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAorICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCisgKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgorICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCisgKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNvbmZpZy5oIGIvamNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTk4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9qY29uZmlnLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIGFuZHJvaWQgamNvbmZpZy5oICovCisvKgorICogamNvbmZpZy5kb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bworICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgorICoKKyAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKKyAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKKyAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgorICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KKyAqCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCisgKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCisgKi8KKworCisvKgorICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCisgKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCisgKi8KKworLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCisgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKy8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPworICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPworICovCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KKyAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAorICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgorICovCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworCisvKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgorICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisKKy8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgorICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KKyAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCisgKi8KKyNkZWZpbmUgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KKyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCisgKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgorICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKKyAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCisgKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisKKy8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAorICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgorICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KKyAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAorICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCisgKi8KKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKKyAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCisgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bworICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCisgKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQorICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKKyAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgorICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworCisvKgorICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKKyAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKKyAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCisgKi8KKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKKyAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCisgKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KKyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisvKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAorICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgorICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0CisgKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KKyAqLworI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgorICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcworICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgorICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCisvKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAorICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCisgKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgorICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCisgKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNvbmZpZy5tYWMgYi9qY29uZmlnLm1hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGUzZWZlCi0tLSAvZGV2L251bGwKKysrIGIvamNvbmZpZy5tYWMKQEAgLTAsMCArMSw0MyBAQAorLyogamNvbmZpZy5tYWMgLS0tIGpjb25maWcuaCBmb3IgQ29kZVdhcnJpb3Igb24gQXBwbGUgTWFjaW50b3NoICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFVTRV9NQUNfTUVNTUdSCQkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1tYWMuYyAqLworCisjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZwkJLyogTmVlZGVkIGZvciA2ODB4MCBNYWNzICovCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFVTRV9DQ09NTUFORAkJLyogQ29tbWFuZCBsaW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIEJpbmFyeSBJL08gdGhydSBzdGRpbi9zdGRvdXQgZG9lc24ndCB3b3JrICovCisKKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNvbmZpZy5tYW54IGIvamNvbmZpZy5tYW54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDBkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9qY29uZmlnLm1hbngKQEAgLTAsMCArMSw0MyBAQAorLyogamNvbmZpZy5tYW54IC0tLSBqY29uZmlnLmggZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgTWFueCBBenRlYyBDIHZlciA1LnguICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KKworI2RlZmluZSBTSE9SVHhTSE9SVF8zMgkJLyogcHJvZHVjZXMgYmV0dGVyIERDVCBjb2RlIHdpdGggQXp0ZWMgQyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZGVmaW5lIHNpZ25hbF9jYXRjaGVyIF9hYm9ydAkvKiBoYWNrIGZvciBBenRlYyBDIG5hbWluZyByZXF1aXJlbWVudHMgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pjb25maWcubWM2IGIvamNvbmZpZy5tYzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1MDgyZAotLS0gL2Rldi9udWxsCisrKyBiL2pjb25maWcubWM2CkBAIC0wLDAgKzEsNTIgQEAKKy8qIGpjb25maWcubWM2IC0tLSBqY29uZmlnLmggZm9yIE1pY3Jvc29mdCBDIG9uIE1TLURPUywgdmVyc2lvbiA2LjAwQSAmIHVwLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI2RlZmluZSBORUVEX0ZBUl9QT0lOVEVSUwkvKiBmb3Igc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCAqLworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworCisjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCisKKyNkZWZpbmUgVVNFX0ZNRU0JCS8qIE1pY3Jvc29mdCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLworCisjZGVmaW5lIE5FRURfRkhFQVBNSU4JCS8qIGZhciBoZWFwIG1hbmFnZW1lbnQgcm91dGluZXMgYXJlIGJyb2tlbiAqLworCisjZGVmaW5lIFNIT1JUeExDT05TVF8zMgkJLyogZW5hYmxlIGNvbXBpbGVyLXNwZWNpZmljIERDVCBvcHRpbWl6YXRpb24gKi8KKy8qIE5vdGU6IHRoZSBhYm92ZSBkZWZpbmUgaXMga25vd24gdG8gaW1wcm92ZSB0aGUgY29kZSB3aXRoIE1pY3Jvc29mdCBDIDYuMDBBLgorICogSSBkbyBub3Qga25vdyB3aGV0aGVyIGl0IGlzIGdvb2QgZm9yIGxhdGVyIGNvbXBpbGVyIHZlcnNpb25zLgorICogUGxlYXNlIHJlcG9ydCBhbnkgaW5mbyBvbiB0aGlzIHBvaW50IHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCisgKi8KKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCisjZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtZG9zLmMgKi8KKyN1bmRlZiBET05UX1VTRV9CX01PREUKKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCisKKyNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9qY29uZmlnLnNhcyBiL2pjb25maWcuc2FzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGFjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9qY29uZmlnLnNhcwpAQCAtMCwwICsxLDQzIEBACisvKiBqY29uZmlnLnNhcyAtLS0gamNvbmZpZy5oIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIFNBUyBDIDYuMCBhbmQgdXAuICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KKworI2RlZmluZSBOT19NS1RFTVAJCS8qIFNBUyBDIGRvZXNuJ3QgaGF2ZSBta3RlbXAoKSAqLworCisjZGVmaW5lIFNIT1JUeFNIT1JUXzMyCQkvKiBwcm9kdWNlcyBiZXR0ZXIgRENUIGNvZGUgd2l0aCBTQVMgQyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNvbmZpZy5zdCBiL2pjb25maWcuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyMWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2pjb25maWcuc3QKQEAgLTAsMCArMSw0MiBAQAorLyogamNvbmZpZy5zdCAtLS0gamNvbmZpZy5oIGZvciBBdGFyaSBTVC9TVEUvVFQgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCS8qIHN1cHByZXNzIHVuZGVmaW5lZC1zdHJ1Y3R1cmUgd2FybmluZ3MgKi8KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIEFMSUdOX1RZUEUgIGxvbmcJLyogYXBwYXJlbnRseSBkb3VibGUgaXMgYSB3ZWlyZCBzaXplPyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAtLSB1bmRlZiBpZiB5b3UgbGlrZSBVbml4IHN0eWxlICovCisvKiBOb3RlOiBpZiB5b3UgdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUsIHlvdSBtYXkgbmVlZCB0byBkZWZpbmUKKyAqIFVTRV9TRVRNT0RFLiAgU29tZSBBdGFyaSBjb21waWxlcnMgcmVxdWlyZSBpdCwgc29tZSBkbyBub3QuCisgKi8KKyNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBuZWVkZWQgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNvbmZpZy52YyBiL2pjb25maWcudmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyOTFjNwotLS0gL2Rldi9udWxsCisrKyBiL2pjb25maWcudmMKQEAgLTAsMCArMSw0NSBAQAorLyogamNvbmZpZy52YyAtLS0gamNvbmZpZy5oIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIDk1IG9yIE5ULiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIHdlIHByZXN1bWUgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KKyNpZm5kZWYgX19SUENORFJfSF9fCQkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOworI2VuZGlmCisjZGVmaW5lIEhBVkVfQk9PTEVBTgkJLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLworCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pjb25maWcudm1zIGIvamNvbmZpZy52bXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhNmZmYgotLS0gL2Rldi9udWxsCisrKyBiL2pjb25maWcudm1zCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGpjb25maWcudm1zIC0tLSBqY29uZmlnLmggZm9yIHVzZSBvbiBEaWdpdGFsIFZNUy4gKi8KKy8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworLyogI2RlZmluZSBjb25zdCAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIE5lZWRlZCBvbiBWTVMgKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvamNvbmZpZy53YXQgYi9qY29uZmlnLndhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M1NDViCi0tLSAvZGV2L251bGwKKysrIGIvamNvbmZpZy53YXQKQEAgLTAsMCArMSwzOCBAQAorLyogamNvbmZpZy53YXQgLS0tIGpjb25maWcuaCBmb3IgV2F0Y29tIEMvQysrIG9uIE1TLURPUyBvciBPUy8yLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjZGVmaW5lIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBXYXRjb20gdXNlcyBmbGF0IDMyLWJpdCBhZGRyZXNzaW5nICovCisjdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAqLworI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTmVlZGVkIHRvIG1ha2Ugb25lLWZpbGUgc3R5bGUgd29yayBpbiBXYXRjb20gKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLworI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2pjcGFyYW0uYyBiL2pjcGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmM0OGY1Ci0tLSAvZGV2L251bGwKKysrIGIvamNwYXJhbS5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogamNwYXJhbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgb3B0aW9uYWwgZGVmYXVsdC1zZXR0aW5nIGNvZGUgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBBcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZmlsZSwgYnV0IHRob3NlIHRoYXQgZG9uJ3QgdXNlIGl0CisgKiBtdXN0IGtub3cgYSBsb3QgbW9yZSBhYm91dCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBjb2RlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogUXVhbnRpemF0aW9uIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisvKiBEZWZpbmUgYSBxdWFudGl6YXRpb24gdGFibGUgZXF1YWwgdG8gdGhlIGJhc2ljX3RhYmxlIHRpbWVzCisgKiBhIHNjYWxlIGZhY3RvciAoZ2l2ZW4gYXMgYSBwZXJjZW50YWdlKS4KKyAqIElmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUsIHRoZSBjb21wdXRlZCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcworICogYXJlIGxpbWl0ZWQgdG8gMS4uMjU1IGZvciBKUEVHIGJhc2VsaW5lIGNvbXBhdGliaWxpdHkuCisgKi8KK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBpbnQgaTsKKyAgbG9uZyB0ZW1wOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIGlmICh3aGljaF90YmwgPCAwIHx8IHdoaWNoX3RibCA+PSBOVU1fUVVBTlRfVEJMUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIHdoaWNoX3RibCk7CisKKyAgcXRibHB0ciA9ICYgY2luZm8tPnF1YW50X3RibF9wdHJzW3doaWNoX3RibF07CisKKyAgaWYgKCpxdGJscHRyID09IE5VTEwpCisgICAgKnF0YmxwdHIgPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIHRlbXAgPSAoKGxvbmcpIGJhc2ljX3RhYmxlW2ldICogc2NhbGVfZmFjdG9yICsgNTBMKSAvIDEwMEw7CisgICAgLyogbGltaXQgdGhlIHZhbHVlcyB0byB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICBpZiAodGVtcCA8PSAwTCkgdGVtcCA9IDFMOworICAgIGlmICh0ZW1wID4gMzI3NjdMKSB0ZW1wID0gMzI3NjdMOyAvKiBtYXggcXVhbnRpemVyIG5lZWRlZCBmb3IgMTIgYml0cyAqLworICAgIGlmIChmb3JjZV9iYXNlbGluZSAmJiB0ZW1wID4gMjU1TCkKKyAgICAgIHRlbXAgPSAyNTVMOwkJLyogbGltaXQgdG8gYmFzZWxpbmUgcmFuZ2UgaWYgcmVxdWVzdGVkICovCisgICAgKCpxdGJscHRyKS0+cXVhbnR2YWxbaV0gPSAoVUlOVDE2KSB0ZW1wOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCisgICgqcXRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKK30KKworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKKwkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzCisgKiBhbmQgYSBzdHJhaWdodCBwZXJjZW50YWdlLXNjYWxpbmcgcXVhbGl0eSBzY2FsZS4gIEluIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIKKyAqIHRvIHVzZSBqcGVnX3NldF9xdWFsaXR5IChiZWxvdyk7IHRoaXMgZW50cnkgcG9pbnQgaXMgcHJvdmlkZWQgZm9yCisgKiBhcHBsaWNhdGlvbnMgdGhhdCBpbnNpc3Qgb24gYSBsaW5lYXIgcGVyY2VudGFnZSBzY2FsaW5nLgorICovCit7CisgIC8qIFRoZXNlIGFyZSB0aGUgc2FtcGxlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjIHNlY3Rpb24gSy4xLgorICAgKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBwcm9kdWNlICJnb29kIiBxdWFsaXR5LCBhbmQKKyAgICogd2hlbiBkaXZpZGVkIGJ5IDIsICJ2ZXJ5IGdvb2QiIHF1YWxpdHkuCisgICAqLworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAorICAgIDEyLCAgMTIsICAxNCwgIDE5LCAgMjYsICA1OCwgIDYwLCAgNTUsCisgICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKKyAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAorICAgIDE4LCAgMjIsICAzNywgIDU2LCAgNjgsIDEwOSwgMTAzLCAgNzcsCisgICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgMTA0LCAxMTMsICA5MiwKKyAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICAgIDcyLCAgOTIsICA5NSwgIDk4LCAxMTIsIDEwMCwgMTAzLCAgOTkKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKKyAgfTsKKworICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2FsaW5nICovCisgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAwLCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMSwgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKK0dMT0JBTChpbnQpCitqcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCisvKiBDb252ZXJ0IGEgdXNlci1zcGVjaWZpZWQgcXVhbGl0eSByYXRpbmcgdG8gYSBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCisgKiBmb3IgYW4gdW5kZXJseWluZyBxdWFudGl6YXRpb24gdGFibGUsIHVzaW5nIG91ciByZWNvbW1lbmRlZCBzY2FsaW5nIGN1cnZlLgorICogVGhlIGlucHV0ICdxdWFsaXR5JyBmYWN0b3Igc2hvdWxkIGJlIDAgKHRlcnJpYmxlKSB0byAxMDAgKHZlcnkgZ29vZCkuCisgKi8KK3sKKyAgLyogU2FmZXR5IGxpbWl0IG9uIHF1YWxpdHkgZmFjdG9yLiAgQ29udmVydCAwIHRvIDEgdG8gYXZvaWQgemVybyBkaXZpZGUuICovCisgIGlmIChxdWFsaXR5IDw9IDApIHF1YWxpdHkgPSAxOworICBpZiAocXVhbGl0eSA+IDEwMCkgcXVhbGl0eSA9IDEwMDsKKworICAvKiBUaGUgYmFzaWMgdGFibGUgaXMgdXNlZCBhcy1pcyAoc2NhbGluZyAxMDApIGZvciBhIHF1YWxpdHkgb2YgNTAuCisgICAqIFF1YWxpdGllcyA1MC4uMTAwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDIwMCAtIDIqUTsKKyAgICogbm90ZSB0aGF0IGF0IFE9MTAwIHRoZSBzY2FsaW5nIGlzIDAsIHdoaWNoIHdpbGwgY2F1c2UganBlZ19hZGRfcXVhbnRfdGFibGUKKyAgICogdG8gbWFrZSBhbGwgdGhlIHRhYmxlIGVudHJpZXMgMSAoaGVuY2UsIG1pbmltdW0gcXVhbnRpemF0aW9uIGxvc3MpLgorICAgKiBRdWFsaXRpZXMgMS4uNTAgYXJlIGNvbnZlcnRlZCB0byBzY2FsaW5nIHBlcmNlbnRhZ2UgNTAwMC9RLgorICAgKi8KKyAgaWYgKHF1YWxpdHkgPCA1MCkKKyAgICBxdWFsaXR5ID0gNTAwMCAvIHF1YWxpdHk7CisgIGVsc2UKKyAgICBxdWFsaXR5ID0gMjAwIC0gcXVhbGl0eSoyOworCisgIHJldHVybiBxdWFsaXR5OworfQorCisKK0dMT0JBTCh2b2lkKQoranBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzLgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcXVhbGl0eS1hZGp1c3RpbmcgZW50cnkgcG9pbnQgZm9yIHR5cGljYWwgdXNlcgorICogaW50ZXJmYWNlczsgb25seSB0aG9zZSB3aG8gd2FudCBkZXRhaWxlZCBjb250cm9sIG92ZXIgcXVhbnRpemF0aW9uIHRhYmxlcworICogd291bGQgdXNlIHRoZSBwcmVjZWRpbmcgdGhyZWUgcm91dGluZXMgZGlyZWN0bHkuCisgKi8KK3sKKyAgLyogQ29udmVydCB1c2VyIDAtMTAwIHJhdGluZyB0byBwZXJjZW50YWdlIHNjYWxpbmcgKi8KKyAgcXVhbGl0eSA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOworCisgIC8qIFNldCB1cCBzdGFuZGFyZCBxdWFsaXR5IHRhYmxlcyAqLworICBqcGVnX3NldF9saW5lYXJfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKKy8qCisgKiBIdWZmbWFuIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworTE9DQUwodm9pZCkKK2FkZF9odWZmX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJSkhVRkZfVEJMICoqaHRibHB0ciwgY29uc3QgVUlOVDggKmJpdHMsIGNvbnN0IFVJTlQ4ICp2YWwpCisvKiBEZWZpbmUgYSBIdWZmbWFuIHRhYmxlICovCit7CisgIGludCBuc3ltYm9scywgbGVuOworCisgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBDb3B5IHRoZSBudW1iZXItb2Ytc3ltYm9scy1vZi1lYWNoLWNvZGUtbGVuZ3RoIGNvdW50cyAqLworICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7CisKKyAgLyogVmFsaWRhdGUgdGhlIGNvdW50cy4gIFdlIGRvIHRoaXMgaGVyZSBtYWlubHkgc28gd2UgY2FuIGNvcHkgdGhlIHJpZ2h0CisgICAqIG51bWJlciBvZiBzeW1ib2xzIGZyb20gdGhlIHZhbFtdIGFycmF5LCB3aXRob3V0IHJpc2tpbmcgbWFyY2hpbmcgb2ZmCisgICAqIHRoZSBlbmQgb2YgbWVtb3J5LiAgamNodWZmLmMgd2lsbCBkbyBhIG1vcmUgdGhvcm91Z2ggdGVzdCBsYXRlci4KKyAgICovCisgIG5zeW1ib2xzID0gMDsKKyAgZm9yIChsZW4gPSAxOyBsZW4gPD0gMTY7IGxlbisrKQorICAgIG5zeW1ib2xzICs9IGJpdHNbbGVuXTsKKyAgaWYgKG5zeW1ib2xzIDwgMSB8fCBuc3ltYm9scyA+IDI1NikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIHZhbCwgbnN5bWJvbHMgKiBTSVpFT0YoVUlOVDgpKTsKKworICAvKiBJbml0aWFsaXplIHNlbnRfdGFibGUgRkFMU0Ugc28gdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KKyAgKCpodGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCisKK0xPQ0FMKHZvaWQpCitzdGRfaHVmZl90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCisvKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbiEgKi8KK3sKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfbHVtaW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9OworICAKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KKyAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfY2hyb21pbmFuY2VbXSA9CisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2x1bWluYW5jZVsxN10gPQorICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N2QgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19sdW1pbmFuY2VbXSA9CisgICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgICAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKKyAgICAgIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4MDgsCisgICAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKKyAgICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKKyAgICAgIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCisgICAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgICAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgICAgIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCisgICAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgICAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCisgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgICAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCisgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgICAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgICAgIDB4ZjksIDB4ZmEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NyB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2FjX2Nocm9taW5hbmNlW10gPQorICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKKyAgICAgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgICAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKKyAgICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCisgICAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgICAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgICAgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAgICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKKyAgICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCisgICAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKKyAgICAgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgICAweGY5LCAweGZhIH07CisgIAorICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19kY19sdW1pbmFuY2UsIHZhbF9kY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzFdLAorCQkgYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlKTsKKyAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1sxXSwKKwkJIGJpdHNfYWNfY2hyb21pbmFuY2UsIHZhbF9hY19jaHJvbWluYW5jZSk7Cit9CisKKworLyoKKyAqIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbi4KKyAqCisgKiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjaG9vc2UgdG8gdXNlIHRoaXMgcm91dGluZSBtdXN0IGRvIHRoZWlyCisgKiBvd24gc2V0dXAgb2YgYWxsIHRoZXNlIHBhcmFtZXRlcnMuICBBbHRlcm5hdGVseSwgeW91IGNhbiBjYWxsIHRoaXMKKyAqIHRvIGVzdGFibGlzaCBkZWZhdWx0cyBhbmQgdGhlbiBhbHRlciBwYXJhbWV0ZXJzIHNlbGVjdGl2ZWx5LiAgVGhpcworICogaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIHNpbmNlLCBpZiB3ZSBhZGQgYW55IG5ldyBwYXJhbWV0ZXJzLAorICogeW91ciBjb2RlIHdpbGwgc3RpbGwgd29yayAodGhleSdsbCBiZSBzZXQgdG8gcmVhc29uYWJsZSBkZWZhdWx0cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEFsbG9jYXRlIGNvbXBfaW5mbyBhcnJheSBsYXJnZSBlbm91Z2ggZm9yIG1heGltdW0gY29tcG9uZW50IGNvdW50LgorICAgKiBBcnJheSBpcyBtYWRlIHBlcm1hbmVudCBpbiBjYXNlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNvbXByZXNzCisgICAqIG11bHRpcGxlIGltYWdlcyBhdCBzYW1lIHBhcmFtIHNldHRpbmdzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkKKyAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCSAgTUFYX0NPTVBPTkVOVFMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOworCisgIC8qIEluaXRpYWxpemUgZXZlcnl0aGluZyBub3QgZGVwZW5kZW50IG9uIHRoZSBjb2xvciBzcGFjZSAqLworCisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsKKyAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIGRlZmF1bHQgcXVhbGl0eSBvZiA3NSAqLworICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCA3NSwgVFJVRSk7CisgIC8qIFNldCB1cCB0d28gSHVmZm1hbiB0YWJsZXMgKi8KKyAgc3RkX2h1ZmZfdGFibGVzKGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGRlZmF1bHQgYXJpdGhtZXRpYyBjb2RpbmcgY29uZGl0aW9uaW5nICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOworICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKKyAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7CisgIH0KKworICAvKiBEZWZhdWx0IGlzIG5vIG11bHRpcGxlLXNjYW4gb3V0cHV0ICovCisgIGNpbmZvLT5zY2FuX2luZm8gPSBOVUxMOworICBjaW5mby0+bnVtX3NjYW5zID0gMDsKKworICAvKiBFeHBlY3Qgbm9ybWFsIHNvdXJjZSBpbWFnZSwgbm90IHJhdyBkb3duc2FtcGxlZCBkYXRhICovCisgIGNpbmZvLT5yYXdfZGF0YV9pbiA9IEZBTFNFOworCisgIC8qIFVzZSBIdWZmbWFuIGNvZGluZywgbm90IGFyaXRobWV0aWMgY29kaW5nLCBieSBkZWZhdWx0ICovCisgIGNpbmZvLT5hcml0aF9jb2RlID0gRkFMU0U7CisKKyAgLyogQnkgZGVmYXVsdCwgZG9uJ3QgZG8gZXh0cmEgcGFzc2VzIHRvIG9wdGltaXplIGVudHJvcHkgY29kaW5nICovCisgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBGQUxTRTsKKyAgLyogVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbi4KKyAgICogSWYgdGhlIHByZWNpc2lvbiBpcyBoaWdoZXIsIGZvcmNlIG9wdGltaXphdGlvbiBvbiBzbyB0aGF0IHVzYWJsZQorICAgKiB0YWJsZXMgd2lsbCBiZSBjb21wdXRlZC4gIFRoaXMgdGVzdCBjYW4gYmUgcmVtb3ZlZCBpZiBkZWZhdWx0IHRhYmxlcworICAgKiBhcmUgc3VwcGxpZWQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KKyAgICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KQorICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworCisgIC8qIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2ltcGxlciBub24tY29zaXRlZCBzYW1wbGluZyBhbGlnbm1lbnQgKi8KKyAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsKKworICAvKiBObyBpbnB1dCBzbW9vdGhpbmcgKi8KKyAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSAwOworCisgIC8qIERDVCBhbGdvcml0aG0gcHJlZmVyZW5jZSAqLworICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKKworICAvKiBObyByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworICBjaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsKKworICAvKiBGaWxsIGluIGRlZmF1bHQgSkZJRiBtYXJrZXIgcGFyYW1ldGVycy4gIE5vdGUgdGhhdCB3aGV0aGVyIHRoZSBtYXJrZXIKKyAgICogd2lsbCBhY3R1YWxseSBiZSB3cml0dGVuIGlzIGRldGVybWluZWQgYnkganBlZ19zZXRfY29sb3JzcGFjZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgZW1pdHMgSkZJRiB2ZXJzaW9uIGNvZGUgMS4wMS4KKyAgICogQW4gYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBlbWl0IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBzaG91bGQgc2V0CisgICAqIEpGSUZfbWlub3JfdmVyc2lvbiB0byAyLiAgV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcKKyAgICogdG8gMS4wMiwgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBzb21lIGRlY29kZXJzIGluIHVzZSB0aGF0IHdpbGwgY29tcGxhaW4KKyAgICogYWJvdXQgdGhhdDsgc2F5aW5nIDEuMDEgc2hvdWxkIG1pbmltaXplIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCisgICAqLworICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogRGVmYXVsdCBKRklGIHZlcnNpb24gPSAxLjAxICovCisgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOworICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsJLyogUGl4ZWwgc2l6ZSBpcyB1bmtub3duIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPlhfZGVuc2l0eSA9IDE7CQkvKiBQaXhlbCBhc3BlY3QgcmF0aW8gaXMgc3F1YXJlIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPllfZGVuc2l0eSA9IDE7CisKKyAgLyogQ2hvb3NlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBpbnB1dCBzcGFjZSwgc2V0IGRlZmF1bHRzIGFjY29yZGluZ2x5ICovCisKKyAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoY2luZm8pOworfQorCisKKy8qCisgKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGZvciBpbl9jb2xvcl9zcGFjZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfQ01ZSyk7IC8qIEJ5IGRlZmF1bHQsIG5vIHRyYW5zbGF0aW9uICovCisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1lDQ0s6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDQ0spOworICAgIGJyZWFrOworICBjYXNlIEpDU19VTktOT1dOOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19VTktOT1dOKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgfQorfQorCisKKy8qCisgKiBTZXQgdGhlIEpQRUcgY29sb3JzcGFjZSwgYW5kIGNob29zZSBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0IHZhbHVlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCit7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBpbnQgY2k7CisKKyNkZWZpbmUgU0VUX0NPTVAoaW5kZXgsaWQsaHNhbXAsdnNhbXAscXVhbnQsZGN0YmwsYWN0YmwpICBcCisgIChjb21wcHRyID0gJmNpbmZvLT5jb21wX2luZm9baW5kZXhdLCBcCisgICBjb21wcHRyLT5jb21wb25lbnRfaWQgPSAoaWQpLCBcCisgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGhzYW1wKSwgXAorICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9ICh2c2FtcCksIFwKKyAgIGNvbXBwdHItPnF1YW50X3RibF9ubyA9IChxdWFudCksIFwKKyAgIGNvbXBwdHItPmRjX3RibF9ubyA9IChkY3RibCksIFwKKyAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChhY3RibCkgKQorCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEZvciBhbGwgY29sb3JzcGFjZXMsIHdlIHVzZSBRIGFuZCBIdWZmIHRhYmxlcyAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cywKKyAgICogdGFibGVzIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisgICAqLworCisgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gY29sb3JzcGFjZTsKKworICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBGQUxTRTsgLyogTm8gbWFya2VyIGZvciBub24tSkZJRiBjb2xvcnNwYWNlcyAqLworICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gRkFMU0U7IC8qIHdyaXRlIG5vIEFkb2JlIG1hcmtlciBieSBkZWZhdWx0ICovCisKKyAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMTsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSUQgMSAqLworICAgIFNFVF9DT01QKDAsIDEsIDEsMSwgMCwgMCwwKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBSR0IgKi8KKyAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAzOworICAgIFNFVF9DT01QKDAsIDB4NTIgLyogJ1InICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMHg0NyAvKiAnRycgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgyLCAweDQyIC8qICdCJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSURzIDEsMiwzICovCisgICAgLyogV2UgZGVmYXVsdCB0byAyeDIgc3Vic2FtcGxlcyBvZiBjaHJvbWluYW5jZSAqLworICAgIFNFVF9DT01QKDAsIDEsIDIsMiwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgxLCAyLCAxLDEsIDEsIDEsMSk7CisgICAgU0VUX0NPTVAoMiwgMywgMSwxLCAxLCAxLDEpOworICAgIGJyZWFrOworICBjYXNlIEpDU19DTVlLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBDTVlLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAweDQzIC8qICdDJyAqLywgMSwxLCAwLCAwLDApOworICAgIFNFVF9DT01QKDEsIDB4NEQgLyogJ00nICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMiwgMHg1OSAvKiAnWScgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgzLCAweDRCIC8qICdLJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ0NLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBZQ0NLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOworICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKKyAgICBTRVRfQ09NUCgzLCA0LCAyLDIsIDAsIDAsMCk7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1VOS05PV046CisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEgfHwgY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgICAgTUFYX0NPTVBPTkVOVFMpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgU0VUX0NPTVAoY2ksIGNpLCAxLDEsIDAsIDAsMCk7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgIH0KK30KKworCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKworTE9DQUwoanBlZ19zY2FuX2luZm8gKikKK2ZpbGxfYV9zY2FuIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBjaSwKKwkgICAgIGludCBTcywgaW50IFNlLCBpbnQgQWgsIGludCBBbCkKKy8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgb25lIHNjYW4gZm9yIHNwZWNpZmllZCBjb21wb25lbnQgKi8KK3sKKyAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOworICBzY2FucHRyLT5TcyA9IFNzOworICBzY2FucHRyLT5TZSA9IFNlOworICBzY2FucHRyLT5BaCA9IEFoOworICBzY2FucHRyLT5BbCA9IEFsOworICBzY2FucHRyKys7CisgIHJldHVybiBzY2FucHRyOworfQorCitMT0NBTChqcGVnX3NjYW5faW5mbyAqKQorZmlsbF9zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLAorCSAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCisvKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBlYWNoIGNvbXBvbmVudCAqLworeworICBpbnQgY2k7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisgICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gY2k7CisgICAgc2NhbnB0ci0+U3MgPSBTczsKKyAgICBzY2FucHRyLT5TZSA9IFNlOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKK0xPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCitmaWxsX2RjX3NjYW5zIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBuY29tcHMsIGludCBBaCwgaW50IEFsKQorLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBpbnRlcmxlYXZlZCBEQyBzY2FuIGlmIHBvc3NpYmxlLCBlbHNlIE4gc2NhbnMgKi8KK3sKKyAgaW50IGNpOworCisgIGlmIChuY29tcHMgPD0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKKyAgICAvKiBTaW5nbGUgaW50ZXJsZWF2ZWQgREMgc2NhbiAqLworICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKQorICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXSA9IGNpOworICAgIHNjYW5wdHItPlNzID0gc2NhbnB0ci0+U2UgPSAwOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0gZWxzZSB7CisgICAgLyogTm9uaW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDAsIEFoLCBBbCk7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKKworLyoKKyAqIENyZWF0ZSBhIHJlY29tbWVuZGVkIHByb2dyZXNzaXZlLUpQRUcgc2NyaXB0LgorICogY2luZm8tPm51bV9jb21wb25lbnRzIGFuZCBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSBtdXN0IGJlIGNvcnJlY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBuY29tcHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgIGludCBuc2NhbnM7CisgIGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKworICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAvKiBGaWd1cmUgc3BhY2UgbmVlZGVkIGZvciBzY3JpcHQuICBDYWxjdWxhdGlvbiBtdXN0IG1hdGNoIGNvZGUgYmVsb3chICovCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgbnNjYW5zID0gMTA7CisgIH0gZWxzZSB7CisgICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCisgICAgaWYgKG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgbnNjYW5zID0gNiAqIG5jb21wczsJLyogMiBEQyArIDQgQUMgc2NhbnMgcGVyIGNvbXBvbmVudCAqLworICAgIGVsc2UKKyAgICAgIG5zY2FucyA9IDIgKyA0ICogbmNvbXBzOwkvKiAyIERDIHNjYW5zOyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KKyAgfQorCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBzY3JpcHQuCisgICAqIFdlIG5lZWQgdG8gcHV0IGl0IGluIHRoZSBwZXJtYW5lbnQgcG9vbCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBwZXJmb3JtcworICAgKiBtdWx0aXBsZSBjb21wcmVzc2lvbnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuICBUbyBhdm9pZCBhIG1lbW9yeQorICAgKiBsZWFrIGlmIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5IGZvciB0aGUgc2FtZSBKUEVHCisgICAqIG9iamVjdCwgd2UgdHJ5IHRvIHJlLXVzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGFjZSwgYW5kIHdlIGFsbG9jYXRlCisgICAqIGVub3VnaCBzcGFjZSB0byBoYW5kbGUgWUNiQ3IgZXZlbiBpZiBpbml0aWFsbHkgYXNrZWQgZm9yIGdyYXlzY2FsZS4KKyAgICovCisgIGlmIChjaW5mby0+c2NyaXB0X3NwYWNlID09IE5VTEwgfHwgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplIDwgbnNjYW5zKSB7CisgICAgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplID0gTUFYKG5zY2FucywgMTApOworICAgIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSAoanBlZ19zY2FuX2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7CisgIH0KKyAgc2NhbnB0ciA9IGNpbmZvLT5zY3JpcHRfc3BhY2U7CisgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOworICBjaW5mby0+bnVtX3NjYW5zID0gbnNjYW5zOworCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgLyogSW5pdGlhbCBEQyBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAxKTsKKyAgICAvKiBJbml0aWFsIEFDIHNjYW46IGdldCBzb21lIGx1bWEgZGF0YSBvdXQgaW4gYSBodXJyeSAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA1LCAwLCAyKTsKKyAgICAvKiBDaHJvbWEgZGF0YSBpcyB0b28gc21hbGwgdG8gYmUgd29ydGggZXhwZW5kaW5nIG1hbnkgc2NhbnMgb24gKi8KKyAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDAsIDEpOworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMCwgMSk7CisgICAgLyogQ29tcGxldGUgc3BlY3RyYWwgc2VsZWN0aW9uIGZvciBsdW1hIEFDICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBSZWZpbmUgbmV4dCBiaXQgb2YgbHVtYSBBQyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMiwgMSk7CisgICAgLyogRmluaXNoIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgLyogRmluaXNoIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAyLCAxLCA2MywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDEsIDEsIDYzLCAxLCAwKTsKKyAgICAvKiBMdW1hIGJvdHRvbSBiaXQgY29tZXMgbGFzdCBzaW5jZSBpdCdzIHVzdWFsbHkgbGFyZ2VzdCBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDYzLCAxLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBBbGwtcHVycG9zZSBzY3JpcHQgZm9yIG90aGVyIGNvbG9yIHNwYWNlcy4gKi8KKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmlyc3QgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA1LCAwLCAyKTsKKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gc2Vjb25kIHBhc3MgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDYzLCAyLCAxKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmluYWwgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMSwgMCk7CisgIH0KK30KKworI2VuZGlmIC8qIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qY3BodWZmLmMgYi9qY3BodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmOTE3OAotLS0gL2Rldi9udWxsCisrKyBiL2pjcGh1ZmYuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqIGpjcGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KKyAqCisgKiBXZSBkbyBub3Qgc3VwcG9ydCBvdXRwdXQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIGxpYnJhcnkKKyAqIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZS1zY2FuIGZpbGVzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvdXRwdXQKKyAqIHN1c3BlbnNpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjaHVmZi5jICovCisKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorCisvKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVuY29kaW5nLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBNb2RlIGZsYWc6IFRSVUUgZm9yIG9wdGltaXphdGlvbiwgRkFMU0UgZm9yIGFjdHVhbCBkYXRhIG91dHB1dCAqLworICBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzOworCisgIC8qIEJpdC1sZXZlbCBjb2Rpbmcgc3RhdHVzLgorICAgKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgorICAgKi8KKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLworICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgREMgY29tcG9uZW50cyAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLworICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCisgIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KKyAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KKyAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLworCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKS4KKyAgICogU2luY2UgYW55IG9uZSBzY2FuIGNvZGVzIG9ubHkgREMgb3Igb25seSBBQywgd2Ugb25seSBuZWVkIG9uZSBzZXQKKyAgICogb2YgdGFibGVzLCBub3Qgb25lIGZvciBEQyBhbmQgb25lIGZvciBBQy4KKyAgICovCisgIGNfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbjsgYWdhaW4sIG9uZSBzZXQgaXMgZW5vdWdoICovCisgIGxvbmcgKiBjb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworfSBwaHVmZl9lbnRyb3B5X2VuY29kZXI7CisKK3R5cGVkZWYgcGh1ZmZfZW50cm9weV9lbmNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7CisKKy8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0CisgKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAorICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCisgKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KKyAqLworCisjZGVmaW5lIE1BWF9DT1JSX0JJVFMgIDEwMDAJLyogTWF4ICMgb2YgY29ycmVjdGlvbiBiaXRzIEkgY2FuIGJ1ZmZlciAqLworCisvKiBJUklHSFRfU0hJRlQgaXMgbGlrZSBSSUdIVF9TSElGVCwgYnV0IHdvcmtzIG9uIGludCByYXRoZXIgdGhhbiBJTlQzMi4KKyAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcywKKyAqIHdoaWNoIHNob3VsZCBiZSBzYWZlLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJaW50IGlzaGlmdF90ZW1wOworI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorCSgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKwkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4wKSA8PCAoMTYtKHNoZnQpKSkgOiBcCisJIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2NhbiB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCit7ICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGJvb2xlYW4gaXNfRENfYmFuZDsKKyAgaW50IGNpLCB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIGVudHJvcHktPmNpbmZvID0gY2luZm87CisgIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID0gZ2F0aGVyX3N0YXRpc3RpY3M7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KKworICAvKiBTZWxlY3QgZXhlY3V0aW9uIHJvdXRpbmVzICovCisgIGlmIChjaW5mby0+QWggPT0gMCkgeworICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX2ZpcnN0OworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19maXJzdDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19yZWZpbmU7CisgICAgZWxzZSB7CisgICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfcmVmaW5lOworICAgICAgLyogQUMgcmVmaW5lbWVudCBuZWVkcyBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciAqLworICAgICAgaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKKwllbnRyb3B5LT5iaXRfYnVmZmVyID0gKGNoYXIgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgTUFYX0NPUlJfQklUUyAqIFNJWkVPRihjaGFyKSk7CisgICAgfQorICB9CisgIGlmIChnYXRoZXJfc3RhdGlzdGljcykKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmY7CisgIGVsc2UKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19waHVmZjsKKworICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQorICAgKiBmb3IgQUMgY29lZmZpY2llbnRzLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgLyogR2V0IHRhYmxlIGluZGV4ICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLworCWNvbnRpbnVlOworICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgfQorICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgeworICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXggKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKHRibCA8IDAgfHwgdGJsID49IE5VTV9IVUZGX1RCTFMpCisgICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPSAobG9uZyAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgTUVNWkVSTyhlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGUgKi8KKyAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgaXNfRENfYmFuZCwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLworICBlbnRyb3B5LT5FT0JSVU4gPSAwOworICBlbnRyb3B5LT5CRSA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUuCisgKiBOQjogdGhlc2UgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGFjdHVhbGx5IG91dHB1dHRpbmcsCisgKiB0aGF0IGlzLCBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9PSBGQUxTRS4KKyAqLworCisvKiBFbWl0IGEgYnl0ZSAqLworI2RlZmluZSBlbWl0X2J5dGUoZW50cm9weSx2YWwpICBcCisJeyAqKGVudHJvcHkpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKKwkgIGlmICgtLShlbnRyb3B5KS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgZHVtcF9idWZmZXIoZW50cm9weSk7IH0KKworCitMT0NBTCh2b2lkKQorZHVtcF9idWZmZXIgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCisvKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZS4gKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGVudHJvcHktPmNpbmZvLT5kZXN0OworCisgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGVudHJvcHktPmNpbmZvKSkKKyAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Cit9CisKKworLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCisKKy8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCisgKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKKyAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgorICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KKyAqLworCitJTkxJTkUKK0xPQ0FMKHZvaWQpCitlbWl0X2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKKy8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IGVudHJvcHktPnB1dF9iaXRzOworCisgIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCisgIGlmIChzaXplID09IDApCisgICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQorICAgIHJldHVybjsJCQkvKiBkbyBub3RoaW5nIGlmIHdlJ3JlIG9ubHkgZ2V0dGluZyBzdGF0cyAqLworCisgIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KKyAgCisgIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCisgIAorICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCisKKyAgcHV0X2J1ZmZlciB8PSBlbnRyb3B5LT5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCisKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoZW50cm9weSwgYyk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAwKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgZW50cm9weS0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSBwdXRfYml0czsKK30KKworCitMT0NBTCh2b2lkKQorZmx1c2hfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKK3sKKyAgZW1pdF9iaXRzKGVudHJvcHksIDB4N0YsIDcpOyAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOyAgICAgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSAwOworfQorCisKKy8qCisgKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgorICovCisKK0lOTElORQorTE9DQUwodm9pZCkKK2VtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQoreworICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCisgICAgZW50cm9weS0+Y291bnRfcHRyc1t0Ymxfbm9dW3N5bWJvbF0rKzsKKyAgZWxzZSB7CisgICAgY19kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0Ymxfbm9dOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCB0YmwtPmVodWZjb1tzeW1ib2xdLCB0YmwtPmVodWZzaVtzeW1ib2xdKTsKKyAgfQorfQorCisKKy8qCisgKiBFbWl0IGJpdHMgZnJvbSBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlci4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9idWZmZXJlZF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKKyAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCisKKyAgd2hpbGUgKG5iaXRzID4gMCkgeworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAoKmJ1ZnN0YXJ0KSwgMSk7CisgICAgYnVmc3RhcnQrKzsKKyAgICBuYml0cy0tOworICB9Cit9CisKKworLyoKKyAqIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIHN5bWJvbC4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9lb2JydW4gKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCit7CisgIHJlZ2lzdGVyIGludCB0ZW1wLCBuYml0czsKKworICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkgewkvKiBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBFT0JSVU4gKi8KKyAgICB0ZW1wID0gZW50cm9weS0+RU9CUlVOOworICAgIG5iaXRzID0gMDsKKyAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorICAgICAgbmJpdHMrKzsKKyAgICAvKiBzYWZldHkgY2hlY2s6IHNob3VsZG4ndCBoYXBwZW4gZ2l2ZW4gbGltaXRlZCBjb3JyZWN0aW9uLWJpdCBidWZmZXIgKi8KKyAgICBpZiAobmJpdHMgPiAxNCkKKyAgICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOworCisgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCBuYml0cyA8PCA0KTsKKyAgICBpZiAobmJpdHMpCisgICAgICBlbWl0X2JpdHMoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7CisKKyAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOworCisgICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCisgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKKyAgICBlbnRyb3B5LT5CRSA9IDA7CisgIH0KK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9yZXN0YXJ0IChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCit7CisgIGludCBjaTsKKworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgeworICAgIGZsdXNoX2JpdHMoZW50cm9weSk7CisgICAgZW1pdF9ieXRlKGVudHJvcHksIDB4RkYpOworICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7CisgIH0KKworICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKKyAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLworICAgIGVudHJvcHktPkVPQlJVTiA9IDA7CisgICAgZW50cm9weS0+QkUgPSAwOworICB9Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7CisgIHJlZ2lzdGVyIGludCBuYml0czsKKyAgaW50IGJsa24sIGNpOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElTSElGVF9URU1QUworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCisgICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KKyAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgICAqLworICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKKworICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCisgICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+bGFzdF9kY192YWxbY2ldOworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOworCisgICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KKyAgICB0ZW1wMiA9IHRlbXA7CisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLworICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgICB0ZW1wMi0tOworICAgIH0KKyAgICAKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgbmJpdHMgPSAwOworICAgIHdoaWxlICh0ZW1wKSB7CisgICAgICBuYml0cysrOworICAgICAgdGVtcCA+Pj0gMTsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCisgICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICAgKi8KKyAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgICAgCisgICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOworICAgIAorICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLworICAgICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKKyAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfQUNfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgSkJMT0NLUk9XIGJsb2NrOworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KKyAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKworICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4yLCBmaWcuIEcuMyAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgIAorICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIGlmICgodGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKKyAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQorICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWU7IHNvIHRoZSBjb2RlIGlzCisgICAgICogaW50ZXJ3b3ZlbiB3aXRoIGZpbmRpbmcgdGhlIGFicyB2YWx1ZSAodGVtcCkgYW5kIG91dHB1dCBiaXRzICh0ZW1wMikuCisgICAgICovCisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBjb2VmLCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhjb2VmKSAqLworICAgICAgdGVtcDIgPSB+dGVtcDsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgfQorICAgIC8qIFdhdGNoIG91dCBmb3IgY2FzZSB0aGF0IG5vbnplcm8gY29lZiBpcyB6ZXJvIGFmdGVyIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGlmICh0ZW1wID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOICovCisgICAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApCisgICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgd2hpbGUgKHIgPiAxNSkgeworICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKKyAgICAgIHIgLT0gMTY7CisgICAgfQorCisgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgIG5iaXRzID0gMTsJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLworICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisgICAgICBuYml0cysrOworICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyBuYml0cyk7CisKKyAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KKyAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKKworICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLworICB9CisKKyAgaWYgKHIgPiAwKSB7CQkJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CS8qIGZvcmNlIGl0IG91dCB0byBhdm9pZCBvdmVyZmxvdyAqLworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKKyAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfRENfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICBpbnQgYmxrbjsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICBKQkxPQ0tST1cgYmxvY2s7CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworCisgICAgLyogV2Ugc2ltcGx5IGVtaXQgdGhlIEFsJ3RoIGJpdCBvZiB0aGUgREMgY29lZmZpY2llbnQgdmFsdWUuICovCisgICAgdGVtcCA9ICgqYmxvY2spWzBdOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgRU9COworICBjaGFyICpCUl9idWZmZXI7CisgIHVuc2lnbmVkIGludCBCUjsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAgaW50IGFic3ZhbHVlc1tEQ1RTSVpFMl07CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLworICBibG9jayA9IE1DVV9kYXRhWzBdOworCisgIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKKyAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCisgICAqLworICBFT0IgPSAwOworICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOworICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcworICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5CisgICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAodGVtcCA8IDApCisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KKyAgICBpZiAodGVtcCA9PSAxKQorICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLworICB9CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KKyAgCisgIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCisgIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCisgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCisKKyAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCisgICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgeworICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgICAgLyogRW1pdCBaUkwgKi8KKyAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7CisgICAgICByIC09IDE2OworICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KKyAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCisgICAgICBCUiA9IDA7CisgICAgfQorCisgICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgorICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKKyAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCisgICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCisgICAgICovCisgICAgaWYgKHRlbXAgPiAxKSB7CisgICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKKworICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCisgICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcCwgMSk7CisKKyAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLworICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLworICAgIEJSID0gMDsKKyAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KKyAgfQorCisgIGlmIChyID4gMCB8fCBCUiA+IDApIHsJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGVudHJvcHktPkJFICs9IEJSOwkJLyogY29uY2F0IG15IGNvcnJlY3Rpb24gYml0cyB0byBvbGRlciBvbmVzICovCisgICAgLyogV2UgZm9yY2Ugb3V0IHRoZSBFT0IgaWYgd2UgcmlzayBlaXRoZXI6CisgICAgICogMS4gb3ZlcmZsb3cgb2YgdGhlIEVPQiBjb3VudGVyOworICAgICAqIDIuIG92ZXJmbG93IG9mIHRoZSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgZHVyaW5nIHRoZSBuZXh0IE1DVS4KKyAgICAgKi8KKyAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRiB8fCBlbnRyb3B5LT5CRSA+IChNQVhfQ09SUl9CSVRTLURDVFNJWkUyKzEpKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBwcm9ncmVzc2l2ZSBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgZmx1c2hfYml0cyhlbnRyb3B5KTsKKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQ7CisgIGludCBjaSwgdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSkhVRkZfVEJMICoqaHRibHB0cjsKKyAgYm9vbGVhbiBkaWRbTlVNX0hVRkZfVEJMU107CisKKyAgLyogRmx1c2ggb3V0IGJ1ZmZlcmVkIGRhdGEgKGFsbCB3ZSBjYXJlIGFib3V0IGlzIGNvdW50aW5nIHRoZSBFT0Igc3ltYm9sKSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoaXNfRENfYmFuZCkgeworICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJY29udGludWU7CisgICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICB9CisgICAgaWYgKCEgZGlkW3RibF0pIHsKKyAgICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgZWxzZQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0pOworICAgICAgZGlkW3RibF0gPSBUUlVFOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfcGh1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7CisgIH0KKyAgZW50cm9weS0+Yml0X2J1ZmZlciA9IE5VTEw7CS8qIG5lZWRlZCBvbmx5IGluIEFDIHJlZmluZW1lbnQgc2NhbiAqLworfQorCisjZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pjcHJlcGN0LmMgYi9qY3ByZXBjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTMzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9qY3ByZXBjdC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogamNwcmVwY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgY29sb3IgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nLAorICogYW5kIGVkZ2UgZXhwYW5zaW9uIHN0ZXBzLgorICoKKyAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyaW5nIGlucHV0IHJvd3MKKyAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBkb3duc2FtcGxlci4gIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGhlYWQgb2YKKyAqIGpjc2FtcGxlLmMgZm9yIHRoZSBkb3duc2FtcGxlcidzIG5lZWRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBBdCBwcmVzZW50LCBqY3NhbXBsZS5jIGNhbiByZXF1ZXN0IGNvbnRleHQgcm93cyBvbmx5IGZvciBzbW9vdGhpbmcuCisgKiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhbHNvIG5lZWQgY29udGV4dCByb3dzIGZvciBDQ0lSNjAxIHNhbXBsaW5nCisgKiBvciBvdGhlciBtb3JlLWNvbXBsZXggZG93bnNhbXBsaW5nIHByb2NlZHVyZXMuICBUaGUgY29kZSB0byBzdXBwb3J0CisgKiBjb250ZXh0IHJvd3Mgc2hvdWxkIGJlIGNvbXBpbGVkIG9ubHkgaWYgbmVlZGVkLgorICovCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorI2RlZmluZSBDT05URVhUX1JPV1NfU1VQUE9SVEVECisjZW5kaWYKKworCisvKgorICogRm9yIHRoZSBzaW1wbGUgKG5vLWNvbnRleHQtcm93KSBjYXNlLCB3ZSBqdXN0IG5lZWQgdG8gYnVmZmVyIG9uZQorICogcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGZvciB0aGUgZG93bnNhbXBsaW5nIHN0ZXAuICBBdCB0aGUgYm90dG9tIG9mCisgKiB0aGUgaW1hZ2UsIHdlIHBhZCB0byBhIGZ1bGwgcm93IGdyb3VwIGJ5IHJlcGxpY2F0aW5nIHRoZSBsYXN0IHBpeGVsIHJvdy4KKyAqIFRoZSBkb3duc2FtcGxlcidzIGxhc3Qgb3V0cHV0IHJvdyBpcyB0aGVuIHJlcGxpY2F0ZWQgaWYgbmVlZGVkIHRvIHBhZAorICogb3V0IHRvIGEgZnVsbCBpTUNVIHJvdy4KKyAqCisgKiBXaGVuIHByb3ZpZGluZyBjb250ZXh0IHJvd3MsIHdlIG11c3QgYnVmZmVyIHRocmVlIHJvdyBncm91cHMnIHdvcnRoIG9mCisgKiBwaXhlbHMuICBUaHJlZSByb3cgZ3JvdXBzIGFyZSBwaHlzaWNhbGx5IGFsbG9jYXRlZCwgYnV0IHRoZSByb3cgcG9pbnRlcgorICogYXJyYXlzIGFyZSBtYWRlIGZpdmUgcm93IGdyb3VwcyBoaWdoLCB3aXRoIHRoZSBleHRyYSBwb2ludGVycyBhYm92ZSBhbmQKKyAqIGJlbG93ICJ3cmFwcGluZyBhcm91bmQiIHRvIHBvaW50IHRvIHRoZSBsYXN0IGFuZCBmaXJzdCByZWFsIHJvdyBncm91cHMuCisgKiBUaGlzIGFsbG93cyB0aGUgZG93bnNhbXBsZXIgdG8gYWNjZXNzIHRoZSBwcm9wZXIgY29udGV4dCByb3dzLgorICogQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgY3JlYXRlIGR1bW15IGNvbnRleHQgcm93cyBieQorICogY29weWluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4gIFRoaXMgY29weWluZyBjb3VsZCBiZSBhdm9pZGVkCisgKiBieSBwb2ludGVyIGhhY2tpbmcgYXMgaXMgZG9uZSBpbiBqZG1haW5jdC5jLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZQorICogdHJvdWJsZSBvbiB0aGUgY29tcHJlc3Npb24gc2lkZS4KKyAqLworCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGhvbGRzIGNvbG9yLWNvbnZlcnRlZCBkYXRhCisgICAqIHVudGlsIHdlIGhhdmUgZW5vdWdoIHRvIGRvIGEgZG93bnNhbXBsZSBzdGVwLgorICAgKi8KKyAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOworCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIHNvdXJjZSBpbWFnZSAqLworICBpbnQgbmV4dF9idWZfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gc3RvcmUgaW4gY29sb3JfYnVmICovCisKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECS8qIG9ubHkgbmVlZGVkIGZvciBjb250ZXh0IGNhc2UgKi8KKyAgaW50IHRoaXNfcm93X2dyb3VwOwkJLyogc3RhcnRpbmcgcm93IGluZGV4IG9mIGdyb3VwIHRvIHByb2Nlc3MgKi8KKyAgaW50IG5leHRfYnVmX3N0b3A7CQkvKiBkb3duc2FtcGxlIHdoZW4gd2UgcmVhY2ggdGhpcyBpbmRleCAqLworI2VuZGlmCit9IG15X3ByZXBfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wcmVwX2NvbnRyb2xsZXIgKiBteV9wcmVwX3B0cjsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3ByZXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7CisKKyAgaWYgKHBhc3NfbW9kZSAhPSBKQlVGX1BBU1NfVEhSVSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICBwcmVwLT5yb3dzX3RvX2dvID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgIC8qIFByZXNldCBhZGRpdGlvbmFsIHN0YXRlIHZhcmlhYmxlcyBmb3IgY29udGV4dCBtb2RlLgorICAgKiBUaGVzZSBhcmVuJ3QgdXNlZCBpbiBub24tY29udGV4dCBtb2RlLCBzbyB3ZSBuZWVkbid0IHRlc3Qgd2hpY2ggbW9kZS4KKyAgICovCisgIHByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgLyogU2V0IG5leHRfYnVmX3N0b3AgdG8gc3RvcCBhZnRlciB0d28gcm93IGdyb3VwcyBoYXZlIGJlZW4gcmVhZCBpbi4gKi8KKyAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IDIgKiBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisjZW5kaWYKK30KKworCisvKgorICogRXhwYW5kIGFuIGltYWdlIHZlcnRpY2FsbHkgZnJvbSBoZWlnaHQgaW5wdXRfcm93cyB0byBoZWlnaHQgb3V0cHV0X3Jvd3MsCisgKiBieSBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHJvdy4KKyAqLworCitMT0NBTCh2b2lkKQorZXhwYW5kX2JvdHRvbV9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIEpESU1FTlNJT04gbnVtX2NvbHMsCisJCSAgICBpbnQgaW5wdXRfcm93cywgaW50IG91dHB1dF9yb3dzKQoreworICByZWdpc3RlciBpbnQgcm93OworCisgIGZvciAocm93ID0gaW5wdXRfcm93czsgcm93IDwgb3V0cHV0X3Jvd3M7IHJvdysrKSB7CisgICAgamNvcHlfc2FtcGxlX3Jvd3MoaW1hZ2VfZGF0YSwgaW5wdXRfcm93cy0xLCBpbWFnZV9kYXRhLCByb3csCisJCSAgICAgIDEsIG51bV9jb2xzKTsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2ltcGxlIG5vLWNvbnRleHQgY2FzZS4KKyAqCisgKiBQcmVwcm9jZXNzb3Igb3V0cHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAorICogaXMgZGVmaW5lZCB0byBiZSB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LgorICogRG93bnNhbXBsaW5nIHdpbGwgcHJvZHVjZSB0aGlzIG11Y2ggZGF0YSBmcm9tIGVhY2ggbWF4X3Zfc2FtcF9mYWN0b3IKKyAqIGlucHV0IHJvd3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBKRElNRU5TSU9OIGlucm93czsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgd2hpbGUgKCppbl9yb3dfY3RyIDwgaW5fcm93c19hdmFpbCAmJgorCSAqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOworICAgIG51bXJvd3MgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7CisgICAgbnVtcm93cyA9IChpbnQpIE1JTigoSkRJTUVOU0lPTikgbnVtcm93cywgaW5yb3dzKTsKKyAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkgICAgICAgcHJlcC0+Y29sb3JfYnVmLAorCQkJCSAgICAgICAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAorCQkJCSAgICAgICBudW1yb3dzKTsKKyAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOworICAgIHByZXAtPm5leHRfYnVmX3JvdyArPSBudW1yb3dzOworICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICBpZiAocHJlcC0+cm93c190b19nbyA9PSAwICYmCisJcHJlcC0+bmV4dF9idWZfcm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKwlleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgcHJlcC0+bmV4dF9idWZfcm93LCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgICAgfQorICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBlbXB0eSBpdC4gKi8KKyAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAorCQkJCQlwcmVwLT5jb2xvcl9idWYsIChKRElNRU5TSU9OKSAwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7CisgICAgfQorICAgIC8qIElmIGF0IGJvdHRvbSBvZiBpbWFnZSwgcGFkIHRoZSBvdXRwdXQgdG8gYSBmdWxsIGlNQ1UgaGVpZ2h0LgorICAgICAqIE5vdGUgd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIGEgb25lLWlNQ1UtaGVpZ2h0IG91dHB1dCBidWZmZXIhCisgICAgICovCisgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgorCSpvdXRfcm93X2dyb3VwX2N0ciA8IG91dF9yb3dfZ3JvdXBzX2F2YWlsKSB7CisgICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSAgIGNpKyssIGNvbXBwdHIrKykgeworCWV4cGFuZF9ib3R0b21fZWRnZShvdXRwdXRfYnVmW2NpXSwKKwkJCSAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJCQkgICAoaW50KSAoKm91dF9yb3dfZ3JvdXBfY3RyICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJCQkgICAoaW50KSAob3V0X3Jvd19ncm91cHNfYXZhaWwgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSk7CisgICAgICB9CisgICAgICAqb3V0X3Jvd19ncm91cF9jdHIgPSBvdXRfcm93X2dyb3Vwc19hdmFpbDsKKyAgICAgIGJyZWFrOwkJCS8qIGNhbiBleGl0IG91dGVyIGxvb3Agd2l0aG91dCB0ZXN0ICovCisgICAgfQorICB9Cit9CisKKworI2lmZGVmIENPTlRFWFRfUk9XU19TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBjb250ZXh0IGNhc2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19jb250ZXh0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBpbnQgYnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIDM7CisgIEpESU1FTlNJT04gaW5yb3dzOworCisgIHdoaWxlICgqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIGlmICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwpIHsKKyAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgICBpbnJvd3MgPSBpbl9yb3dzX2F2YWlsIC0gKmluX3Jvd19jdHI7CisgICAgICBudW1yb3dzID0gcHJlcC0+bmV4dF9idWZfc3RvcCAtIHByZXAtPm5leHRfYnVmX3JvdzsKKyAgICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkJIHByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJIChKRElNRU5TSU9OKSBwcmVwLT5uZXh0X2J1Zl9yb3csCisJCQkJCSBudW1yb3dzKTsKKyAgICAgIC8qIFBhZCBhdCB0b3Agb2YgaW1hZ2UsIGlmIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gY2luZm8tPmltYWdlX2hlaWdodCkgeworCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworCSAgaW50IHJvdzsKKwkgIGZvciAocm93ID0gMTsgcm93IDw9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcjsgcm93KyspIHsKKwkgICAgamNvcHlfc2FtcGxlX3Jvd3MocHJlcC0+Y29sb3JfYnVmW2NpXSwgMCwKKwkJCSAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0sIC1yb3csCisJCQkgICAgICAxLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgICppbl9yb3dfY3RyICs9IG51bXJvd3M7CisgICAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKKyAgICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICB9IGVsc2UgeworICAgICAgLyogUmV0dXJuIGZvciBtb3JlIGRhdGEsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCisgICAgICBpZiAocHJlcC0+cm93c190b19nbyAhPSAwKQorCWJyZWFrOworICAgICAgLyogV2hlbiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPCBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisJZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisJICBleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgICBwcmVwLT5uZXh0X2J1Zl9yb3csIHByZXAtPm5leHRfYnVmX3N0b3ApOworCX0KKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSBwcmVwLT5uZXh0X2J1Zl9zdG9wOworICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gZW5vdWdoIGRhdGEsIGRvd25zYW1wbGUgYSByb3cgZ3JvdXAuICovCisgICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisgICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5kb3duc2FtcGxlKSAoY2luZm8sCisJCQkJCXByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJKEpESU1FTlNJT04pIHByZXAtPnRoaXNfcm93X2dyb3VwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgKCpvdXRfcm93X2dyb3VwX2N0cikrKzsKKyAgICAgIC8qIEFkdmFuY2UgcG9pbnRlcnMgd2l0aCB3cmFwYXJvdW5kIGFzIG5lY2Vzc2FyeS4gKi8KKyAgICAgIHByZXAtPnRoaXNfcm93X2dyb3VwICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICAgIGlmIChwcmVwLT50aGlzX3Jvd19ncm91cCA+PSBidWZfaGVpZ2h0KQorCXByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPj0gYnVmX2hlaWdodCkKKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSAwOworICAgICAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IHByZXAtPm5leHRfYnVmX3JvdyArIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ3JlYXRlIHRoZSB3cmFwcGVkLWFyb3VuZCBkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIG5lZWRlZCBmb3IgY29udGV4dCBtb2RlLgorICovCisKK0xPQ0FMKHZvaWQpCitjcmVhdGVfY29udGV4dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IHJncm91cF9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisgIGludCBjaSwgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpTQU1QQVJSQVkgdHJ1ZV9idWZmZXIsIGZha2VfYnVmZmVyOworCisgIC8qIEdyYWIgZW5vdWdoIHNwYWNlIGZvciBmYWtlIHJvdyBwb2ludGVycyBmb3IgYWxsIHRoZSBjb21wb25lbnRzOworICAgKiB3ZSBuZWVkIGZpdmUgcm93IGdyb3Vwcycgd29ydGggb2YgcG9pbnRlcnMgZm9yIGVhY2ggY29tcG9uZW50LgorICAgKi8KKyAgZmFrZV9idWZmZXIgPSAoSlNBTVBBUlJBWSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShjaW5mby0+bnVtX2NvbXBvbmVudHMgKiA1ICogcmdyb3VwX2hlaWdodCkgKgorCQkJCVNJWkVPRihKU0FNUFJPVykpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgc3BhY2UgKDMgcm93IGdyb3VwcykgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqIFdlIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBhbGxvdyB0aGUgZG93bnNhbXBsZXIgdG8gZWRnZS1leHBhbmQKKyAgICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCisgICAgICovCisgICAgdHJ1ZV9idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgorCQkgICAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisgICAgICAgKEpESU1FTlNJT04pICgzICogcmdyb3VwX2hlaWdodCkpOworICAgIC8qIENvcHkgdHJ1ZSBidWZmZXIgcm93IHBvaW50ZXJzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgZmFrZSByb3cgYXJyYXkgKi8KKyAgICBNRU1DT1BZKGZha2VfYnVmZmVyICsgcmdyb3VwX2hlaWdodCwgdHJ1ZV9idWZmZXIsCisJICAgIDMgKiByZ3JvdXBfaGVpZ2h0ICogU0laRU9GKEpTQU1QUk9XKSk7CisgICAgLyogRmlsbCBpbiB0aGUgYWJvdmUgYW5kIGJlbG93IHdyYXBhcm91bmQgcG9pbnRlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwX2hlaWdodDsgaSsrKSB7CisgICAgICBmYWtlX2J1ZmZlcltpXSA9IHRydWVfYnVmZmVyWzIgKiByZ3JvdXBfaGVpZ2h0ICsgaV07CisgICAgICBmYWtlX2J1ZmZlcls0ICogcmdyb3VwX2hlaWdodCArIGldID0gdHJ1ZV9idWZmZXJbaV07CisgICAgfQorICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSBmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQ7CisgICAgZmFrZV9idWZmZXIgKz0gNSAqIHJncm91cF9oZWlnaHQ7IC8qIHBvaW50IHRvIHNwYWNlIGZvciBuZXh0IGNvbXBvbmVudCAqLworICB9Cit9CisKKyNlbmRpZiAvKiBDT05URVhUX1JPV1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19wcmVwX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X3ByZXBfcHRyIHByZXA7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgcHJlcCA9IChteV9wcmVwX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9wcmVwX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPnByZXAgPSAoc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKikgcHJlcDsKKyAgcHJlcC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3ByZXA7CisKKyAgLyogQWxsb2NhdGUgdGhlIGNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLgorICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCisgICAqIGhvcml6b250YWxseSB3aXRoaW4gdGhlIGJ1ZmZlciwgaWYgaXQgc28gY2hvb3Nlcy4KKyAgICovCisgIGlmIChjaW5mby0+ZG93bnNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKKyAgICAvKiBTZXQgdXAgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgKi8KKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgICAgcHJlcC0+cHViLnByZV9wcm9jZXNzX2RhdGEgPSBwcmVfcHJvY2Vzc19jb250ZXh0OworICAgIGNyZWF0ZV9jb250ZXh0X2J1ZmZlcihjaW5mbyk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIE5vIGNvbnRleHQsIGp1c3QgbWFrZSBpdCB0YWxsIGVub3VnaCBmb3Igb25lIHJvdyBncm91cCAqLworICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfZGF0YTsKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSAoSkRJTUVOU0lPTikgKCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSAqCisJCQljaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvamNzYW1wbGUuYyBiL2pjc2FtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyZWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2pjc2FtcGxlLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBqY3NhbXBsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZG93bnNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIERvd25zYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBvZiBlYWNoIGNvbXBvbmVudCwKKyAqIGZyb20gd2hpY2ggdGhlIGRvd25zYW1wbGVyIHByb2R1Y2VzIHZfc2FtcF9mYWN0b3Igc2FtcGxlIHJvd3MuCisgKiBBIHNpbmdsZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIGluIGVhY2ggY2FsbCB0byB0aGUgZG93bnNhbXBsZXIgbW9kdWxlLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWRnZS1leHBhbnNpb24gb2YgaXRzIG91dHB1dCBkYXRhCisgKiB0byBmaWxsIGFuIGludGVncmFsIG51bWJlciBvZiBEQ1QgYmxvY2tzIGhvcml6b250YWxseS4gIFRoZSBzb3VyY2UgYnVmZmVyCisgKiBtYXkgYmUgbW9kaWZpZWQgaWYgaXQgaXMgaGVscGZ1bCBmb3IgdGhpcyBwdXJwb3NlICh0aGUgc291cmNlIGJ1ZmZlciBpcworICogYWxsb2NhdGVkIHdpZGUgZW5vdWdoIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IHdpZHRoKS4KKyAqIFRoZSBjYWxsZXIgKHRoZSBwcmVwIGNvbnRyb2xsZXIpIGlzIHJlc3BvbnNpYmxlIGZvciB2ZXJ0aWNhbCBwYWRkaW5nLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBtYXkgcmVxdWVzdCAiY29udGV4dCByb3dzIiBieSBzZXR0aW5nIG5lZWRfY29udGV4dF9yb3dzCisgKiBkdXJpbmcgc3RhcnR1cC4gIEluIHRoaXMgY2FzZSwgdGhlIGlucHV0IGFycmF5cyB3aWxsIGNvbnRhaW4gYXQgbGVhc3QKKyAqIG9uZSByb3cgZ3JvdXAncyB3b3J0aCBvZiBwaXhlbHMgYWJvdmUgYW5kIGJlbG93IHRoZSBwYXNzZWQtaW4gZGF0YTsKKyAqIHRoZSBjYWxsZXIgd2lsbCBjcmVhdGUgZHVtbXkgcm93cyBhdCBpbWFnZSB0b3AgYW5kIGJvdHRvbSBieSByZXBsaWNhdGluZworICogdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuCisgKgorICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBmb3IgaW1hZ2UgcmVzYW1wbGluZyBpcworICogICBEaWdpdGFsIEltYWdlIFdhcnBpbmcsIEdlb3JnZSBXb2xiZXJnLCAxOTkwLgorICogICBQdWIuIGJ5IElFRUUgQ29tcHV0ZXIgU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQS4gSVNCTiAwLTgxODYtODk0NC03LgorICoKKyAqIFRoZSBkb3duc2FtcGxpbmcgYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBhIHNpbXBsZSBhdmVyYWdlIG9mIHRoZSBzb3VyY2UKKyAqIHBpeGVscyBjb3ZlcmVkIGJ5IHRoZSBvdXRwdXQgcGl4ZWwuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlCisgKiByZWZlcnMgdG8gdGhpcyBhcyBhICJib3ggZmlsdGVyIi4gIEluIGdlbmVyYWwgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIGJveAorICogZmlsdGVyIGFyZSBub3QgdmVyeSBnb29kLCBidXQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlcyB3ZSBub3JtYWxseSB1c2UgKDE6MQorICogYW5kIDI6MSByYXRpb3MpIHRoZSBib3ggaXMgZXF1aXZhbGVudCB0byBhICJ0cmlhbmdsZSBmaWx0ZXIiIHdoaWNoIGlzIG5vdAorICogbmVhcmx5IHNvIGJhZC4gIElmIHlvdSBpbnRlbmQgdG8gdXNlIG90aGVyIHNhbXBsaW5nIHJhdGlvcywgeW91J2QgYmUgd2VsbAorICogYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqCisgKiBBIHNpbXBsZSBpbnB1dC1zbW9vdGhpbmcgY2FwYWJpbGl0eSBpcyBwcm92aWRlZC4gIFRoaXMgaXMgbWFpbmx5IGludGVuZGVkCisgKiBmb3IgY2xlYW5pbmcgdXAgY29sb3ItZGl0aGVyZWQgR0lGIGlucHV0IGZpbGVzIChpZiB5b3UgZmluZCBpdCBpbmFkZXF1YXRlLAorICogd2Ugc3VnZ2VzdCB1c2luZyBhbiBleHRlcm5hbCBmaWx0ZXJpbmcgcHJvZ3JhbSBzdWNoIGFzIHBubWNvbnZvbCkuICBXaGVuCisgKiBlbmFibGVkLCBlYWNoIGlucHV0IHBpeGVsIFAgaXMgcmVwbGFjZWQgYnkgYSB3ZWlnaHRlZCBzdW0gb2YgaXRzZWxmIGFuZCBpdHMKKyAqIGVpZ2h0IG5laWdoYm9ycy4gIFAncyB3ZWlnaHQgaXMgMS04KlNGIGFuZCBlYWNoIG5laWdoYm9yJ3Mgd2VpZ2h0IGlzIFNGLAorICogd2hlcmUgU0YgPSAoc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQpLgorICogQ3VycmVudGx5LCBzbW9vdGhpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIDJoMnYgc2FtcGxpbmcgZmFjdG9ycy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvd25zYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZTFfcHRyLAorCQkoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7CisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIG1ldGhvZCBwb2ludGVycywgb25lIHBlciBjb21wb25lbnQgKi8KKyAgZG93bnNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworfSBteV9kb3duc2FtcGxlcjsKKwordHlwZWRlZiBteV9kb3duc2FtcGxlciAqIG15X2Rvd25zYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIGRvd25zYW1wbGluZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBmb3Igbm93ICovCit9CisKKworLyoKKyAqIEV4cGFuZCBhIGNvbXBvbmVudCBob3Jpem9udGFsbHkgZnJvbSB3aWR0aCBpbnB1dF9jb2xzIHRvIHdpZHRoIG91dHB1dF9jb2xzLAorICogYnkgZHVwbGljYXRpbmcgdGhlIHJpZ2h0bW9zdCBzYW1wbGVzLgorICovCisKK0xPQ0FMKHZvaWQpCitleHBhbmRfcmlnaHRfZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBpbnQgbnVtX3Jvd3MsCisJCSAgIEpESU1FTlNJT04gaW5wdXRfY29scywgSkRJTUVOU0lPTiBvdXRwdXRfY29scykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUExFIHBpeHZhbDsKKyAgcmVnaXN0ZXIgaW50IGNvdW50OworICBpbnQgcm93OworICBpbnQgbnVtY29scyA9IChpbnQpIChvdXRwdXRfY29scyAtIGlucHV0X2NvbHMpOworCisgIGlmIChudW1jb2xzID4gMCkgeworICAgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgICBwdHIgPSBpbWFnZV9kYXRhW3Jvd10gKyBpbnB1dF9jb2xzOworICAgICAgcGl4dmFsID0gcHRyWy0xXTsJCS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoY291bnQgPSBudW1jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCisJKnB0cisrID0gcGl4dmFsOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEbyBkb3duc2FtcGxpbmcgZm9yIGEgd2hvbGUgcm93IGdyb3VwIChhbGwgY29tcG9uZW50cykuCisgKgorICogSW4gdGhpcyB2ZXJzaW9uIHdlIHNpbXBseSBkb3duc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKKwkJSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpCit7CisgIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpIGNpbmZvLT5kb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKU0FNUEFSUkFZIGluX3B0ciwgb3V0X3B0cjsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGluX3B0ciA9IGlucHV0X2J1ZltjaV0gKyBpbl9yb3dfaW5kZXg7CisgICAgb3V0X3B0ciA9IG91dHB1dF9idWZbY2ldICsgKG91dF9yb3dfZ3JvdXBfaW5kZXggKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAoKmRvd25zYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsIGluX3B0ciwgb3V0X3B0cik7CisgIH0KK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBhcmJpdHJhcnkgaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zLCB3aXRob3V0IHNtb290aGluZy4KKyAqIE5vdGUgdGhhdCB0aGlzIHZlcnNpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGN1c3RvbWFyeSBzYW1wbGluZyByYXRpb3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbnRfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93LCBoX2V4cGFuZCwgdl9leHBhbmQsIG51bXBpeCwgbnVtcGl4MiwgaCwgdjsKKyAgSkRJTUVOU0lPTiBvdXRjb2wsIG91dGNvbF9oOwkvKiBvdXRjb2xfaCA9PSBvdXRjb2wqaF9leHBhbmQgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIElOVDMyIG91dHZhbHVlOworCisgIGhfZXhwYW5kID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgdl9leHBhbmQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICBudW1waXggPSBoX2V4cGFuZCAqIHZfZXhwYW5kOworICBudW1waXgyID0gbnVtcGl4LzI7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogaF9leHBhbmQpOworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgZm9yIChvdXRjb2wgPSAwLCBvdXRjb2xfaCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOworCSBvdXRjb2wrKywgb3V0Y29sX2ggKz0gaF9leHBhbmQpIHsKKyAgICAgIG91dHZhbHVlID0gMDsKKyAgICAgIGZvciAodiA9IDA7IHYgPCB2X2V4cGFuZDsgdisrKSB7CisJaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93K3ZdICsgb3V0Y29sX2g7CisJZm9yIChoID0gMDsgaCA8IGhfZXhwYW5kOyBoKyspIHsKKwkgIG91dHZhbHVlICs9IChJTlQzMikgR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisJfQorICAgICAgfQorICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgob3V0dmFsdWUgKyBudW1waXgyKSAvIG51bXBpeCk7CisgICAgfQorICAgIGlucm93ICs9IHZfZXhwYW5kOworICB9Cit9CisKKworLyoKKyAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBmdWxsLXNpemUgY29tcG9uZW50LAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQoreworICAvKiBDb3B5IHRoZSBkYXRhICovCisgIGpjb3B5X3NhbXBsZV9yb3dzKGlucHV0X2RhdGEsIDAsIG91dHB1dF9kYXRhLCAwLAorCQkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworICAvKiBFZGdlLWV4cGFuZCAqLworICBleHBhbmRfcmlnaHRfZWRnZShvdXRwdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFKTsKK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwsCisgKiB3aXRob3V0IHNtb290aGluZy4KKyAqCisgKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KKyAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KKyAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCisgKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKKyAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYmlhcyA9IDA7CQkJLyogYmlhcyA9IDAsMSwwLDEsLi4uIGZvciBzdWNjZXNzaXZlIHNhbXBsZXMgKi8KKyAgICBmb3IgKG91dGNvbCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOyBvdXRjb2wrKykgeworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoR0VUSlNBTVBMRSgqaW5wdHIpICsgR0VUSlNBTVBMRShpbnB0clsxXSkKKwkJCSAgICAgICsgYmlhcykgPj4gMSk7CisgICAgICBiaWFzIF49IDE7CQkvKiAwPT4xLCAxPT4wICovCisgICAgICBpbnB0ciArPSAyOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IGlucm93LCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgaW5yb3cgPSAwOworICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKKyAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOworICAgIGJpYXMgPSAxOwkJCS8qIGJpYXMgPSAxLDIsMSwyLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCisgICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQkJICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKQorCQkJICAgICAgKyBiaWFzKSA+PiAyKTsKKyAgICAgIGJpYXMgXj0gMzsJCS8qIDE9PjIsIDI9PjEgKi8KKyAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsKKyAgICB9CisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aCBzbW9vdGhpbmcuICBPbmUgcm93IG9mIGNvbnRleHQgaXMgcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX3Ntb290aF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93OworICBKRElNRU5TSU9OIGNvbGN0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBhYm92ZV9wdHIsIGJlbG93X3B0ciwgb3V0cHRyOworICBJTlQzMiBtZW1iZXJzdW0sIG5laWdoc3VtLCBtZW1iZXJzY2FsZSwgbmVpZ2hzY2FsZTsKKworICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCisgICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCisgICAqIGVmZmljaWVudC4KKyAgICovCisgIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEgLSAxLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKyAyLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOworCisgIC8qIFdlIGRvbid0IGJvdGhlciB0byBmb3JtIHRoZSBpbmRpdmlkdWFsICJzbW9vdGhlZCIgaW5wdXQgcGl4ZWwgdmFsdWVzOworICAgKiB3ZSBjYW4gZGlyZWN0bHkgY29tcHV0ZSB0aGUgb3V0cHV0IHdoaWNoIGlzIHRoZSBhdmVyYWdlIG9mIHRoZSBmb3VyCisgICAqIHNtb290aGVkIHZhbHVlcy4gIEVhY2ggb2YgdGhlIGZvdXIgbWVtYmVyIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uCisgICAqICgxLTgqU0YpIHRvIGl0cyBvd24gc21vb3RoZWQgaW1hZ2UgYW5kIGEgZnJhY3Rpb24gU0YgdG8gZWFjaCBvZiB0aGUgdGhyZWUKKyAgICogb3RoZXIgc21vb3RoZWQgcGl4ZWxzLCB0aGVyZWZvcmUgYSB0b3RhbCBmcmFjdGlvbiAoMS01KlNGKS80IHRvIHRoZSBmaW5hbAorICAgKiBvdXRwdXQuICBUaGUgZm91ciBjb3JuZXItYWRqYWNlbnQgbmVpZ2hib3IgcGl4ZWxzIGNvbnRyaWJ1dGUgYSBmcmFjdGlvbgorICAgKiBTRiB0byBqdXN0IG9uZSBzbW9vdGhlZCBwaXhlbCwgb3IgU0YvNCB0byB0aGUgZmluYWwgb3V0cHV0OyB3aGlsZSB0aGUKKyAgICogZWlnaHQgZWRnZS1hZGphY2VudCBuZWlnaGJvcnMgY29udHJpYnV0ZSBTRiB0byBlYWNoIG9mIHR3byBzbW9vdGhlZAorICAgKiBwaXhlbHMsIG9yIFNGLzIgb3ZlcmFsbC4gIEluIG9yZGVyIHRvIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXNlCisgICAqIGZhY3RvcnMgYXJlIHNjYWxlZCBieSAyXjE2ID0gNjU1MzYuCisgICAqIEFsc28gcmVjYWxsIHRoYXQgU0YgPSBzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNC4KKyAgICovCisKKyAgbWVtYmVyc2NhbGUgPSAxNjM4NCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogODA7IC8qIHNjYWxlZCAoMS01KlNGKS80ICovCisgIG5laWdoc2NhbGUgPSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDE2OyAvKiBzY2FsZWQgU0YvNCAqLworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbaW5yb3crMl07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbjogcHJldGVuZCBjb2x1bW4gLTEgaXMgc2FtZSBhcyBjb2x1bW4gMCAqLworICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQlHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzJdKTsKKyAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMl0pICsKKwkJR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsgYWJvdmVfcHRyICs9IDI7IGJlbG93X3B0ciArPSAyOworCisgICAgZm9yIChjb2xjdHIgPSBvdXRwdXRfY29scyAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7CisgICAgICAvKiBzdW0gb2YgcGl4ZWxzIGRpcmVjdGx5IG1hcHBlZCB0byB0aGlzIG91dHB1dCBlbGVtZW50ICovCisgICAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKKwkJICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgICAgLyogc3VtIG9mIGVkZ2UtbmVpZ2hib3IgcGl4ZWxzICovCisgICAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQkgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJCSBHRVRKU0FNUExFKGlucHRyMFstMV0pICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkJIEdFVEpTQU1QTEUoaW5wdHIxWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMVsyXSk7CisgICAgICAvKiBUaGUgZWRnZS1uZWlnaGJvcnMgY291bnQgdHdpY2UgYXMgbXVjaCBhcyBjb3JuZXItbmVpZ2hib3JzICovCisgICAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICAgIC8qIEFkZCBpbiB0aGUgY29ybmVyLW5laWdoYm9ycyAqLworICAgICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRShhYm92ZV9wdHJbLTFdKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzJdKSArCisJCSAgR0VUSlNBTVBMRShiZWxvd19wdHJbLTFdKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICAgIC8qIGZvcm0gZmluYWwgb3V0cHV0IHNjYWxlZCB1cCBieSAyXjE2ICovCisgICAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAgIC8qIHJvdW5kLCBkZXNjYWxlIGFuZCBvdXRwdXQgaXQgKi8KKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7CisgICAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7IGFib3ZlX3B0ciArPSAyOyBiZWxvd19wdHIgKz0gMjsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCisJCUdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7CisgICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoaW5wdHIwWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKGlucHRyMVstMV0pICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtICs9IG5laWdoc3VtOworICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoYWJvdmVfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQlHRVRKU0FNUExFKGJlbG93X3B0clstMV0pICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgZnVsbC1zaXplIGNvbXBvbmVudCwKKyAqIHdpdGggc21vb3RoaW5nLiAgT25lIHJvdyBvZiBjb250ZXh0IGlzIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyLAorCQkJICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IG91dHJvdzsKKyAgSkRJTUVOU0lPTiBjb2xjdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKKyAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7CisgIGludCBjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhIC0gMSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICsgMiwKKwkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMpOworCisgIC8qIEVhY2ggb2YgdGhlIGVpZ2h0IG5laWdoYm9yIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uIFNGIHRvIHRoZQorICAgKiBzbW9vdGhlZCBwaXhlbCwgd2hpbGUgdGhlIG1haW4gcGl4ZWwgY29udHJpYnV0ZXMgKDEtOCpTRikuICBJbiBvcmRlcgorICAgKiB0byB1c2UgaW50ZWdlciBhcml0aG1ldGljLCB0aGVzZSBmYWN0b3JzIGFyZSBtdWx0aXBsaWVkIGJ5IDJeMTYgPSA2NTUzNi4KKyAgICogQWxzbyByZWNhbGwgdGhhdCBTRiA9IHNtb290aGluZ19mYWN0b3IgLyAxMDI0LgorICAgKi8KKworICBtZW1iZXJzY2FsZSA9IDY1NTM2TCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNTEyTDsgLyogc2NhbGVkIDEtOCpTRiAqLworICBuZWlnaHNjYWxlID0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA2NDsgLyogc2NhbGVkIFNGICovCisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYWJvdmVfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3ctMV07CisgICAgYmVsb3dfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3crMV07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLworICAgIGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cisrKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cisrKSArCisJICAgICBHRVRKU0FNUExFKCppbnB0cik7CisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJIEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICBuZWlnaHN1bSA9IGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgbmV4dGNvbHN1bTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGxhc3Rjb2xzdW0gPSBjb2xzdW07IGNvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICBmb3IgKGNvbGN0ciA9IG91dHB1dF9jb2xzIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICAgYWJvdmVfcHRyKys7IGJlbG93X3B0cisrOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJICAgR0VUSlNBTVBMRSgqaW5wdHIpOworICAgICAgbmVpZ2hzdW0gPSBsYXN0Y29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBuZXh0Y29sc3VtOworICAgICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgICAgbGFzdGNvbHN1bSA9IGNvbHN1bTsgY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIpOworICAgIG5laWdoc3VtID0gbGFzdGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgY29sc3VtOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgIH0KK30KKworI2VuZGlmIC8qIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgKi8KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGRvd25zYW1wbGluZy4KKyAqIE5vdGUgdGhhdCB3ZSBtdXN0IHNlbGVjdCBhIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50LgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZG93bnNhbXBsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9kb3duc2FtcGxlX3B0ciBkb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBib29sZWFuIHNtb290aG9rID0gVFJVRTsKKworICBkb3duc2FtcGxlID0gKG15X2Rvd25zYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2Rvd25zYW1wbGVyKSk7CisgIGNpbmZvLT5kb3duc2FtcGxlID0gKHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICopIGRvd25zYW1wbGU7CisgIGRvd25zYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIuZG93bnNhbXBsZSA9IHNlcF9kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKKworICBpZiAoY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQ0lSNjAxX05PVElNUEwpOworCisgIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBhbmQgc2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7CisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV9zbW9vdGhfZG93bnNhbXBsZTsKKwlkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOworICAgICAgfSBlbHNlCisjZW5kaWYKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKKwkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAgIHNtb290aG9rID0gRkFMU0U7CisgICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZG93bnNhbXBsZTsKKyAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisgICAgICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IpIHsKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfc21vb3RoX2Rvd25zYW1wbGU7CisJZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKKyAgICAgIH0gZWxzZQorI2VuZGlmCisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmICgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICUgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgPT0gMCAmJgorCSAgICAgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgPT0gMCkgeworICAgICAgc21vb3Rob2sgPSBGQUxTRTsKKyAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X2Rvd25zYW1wbGU7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgfQorCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IgJiYgIXNtb290aG9rKQorICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfU01PT1RIX05PVElNUEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9qY3RyYW5zLmMgYi9qY3RyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZDcwNwotLS0gL2Rldi9udWxsCisrKyBiL2pjdHJhbnMuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGpjdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLAorICogdGhhdCBpcywgd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyB0byBhbiBvdXRwdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpjYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7CitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKKworCisvKgorICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24gZm9yIHdyaXRpbmcgcmF3LWNvZWZmaWNpZW50IGRhdGEuCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICogQ2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBkYXRhLgorICoKKyAqIFRoZSBudW1iZXIgb2YgcGFzc2VkIHZpcnR1YWwgYXJyYXlzIG11c3QgbWF0Y2ggY2luZm8tPm51bV9jb21wb25lbnRzLgorICogTm90ZSB0aGF0IHRoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG5vdCBiZSBmaWxsZWQgb3IgZXZlbiByZWFsaXplZCBhdAorICogdGhlIHRpbWUgd3JpdGVfY29lZmZpY2llbnRzIGlzIGNhbGxlZDsgaW5kZWVkLCBpZiB0aGUgdmlydHVhbCBhcnJheXMKKyAqIHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlciwgdGhleQorICogdHlwaWNhbGx5IHdpbGwgYmUgcmVhbGl6ZWQgZHVyaW5nIHRoaXMgcm91dGluZSBhbmQgZmlsbGVkIGFmdGVyd2FyZHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIE1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCisgIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7CisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCisgIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8sIGNvZWZfYXJyYXlzKTsKKyAgLyogV2FpdCBmb3IganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYWxsICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsJLyogc28ganBlZ193cml0ZV9tYXJrZXIgd29ya3MgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9XUkNPRUZTOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMsCisgKiB0aGVuIGNvcHkgZnJvbSB0aGUgc291cmNlIG9iamVjdCBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGxvc3NsZXNzCisgKiB0cmFuc2NvZGluZy4gIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdmFyaWVkIHdpdGhvdXQgbG9zcyAoc3VjaCBhcworICogc2NhbiBzY3JpcHQgYW5kIEh1ZmZtYW4gb3B0aW1pemF0aW9uKSBhcmUgbGVmdCBpbiB0aGVpciBkZWZhdWx0IHN0YXRlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkgICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICppbmNvbXAsICpvdXRjb21wOworICBKUVVBTlRfVEJMICpjX3F1YW50LCAqc2xvdF9xdWFudDsKKyAgaW50IHRibG5vLCBjaSwgY29lZmk7CisKKyAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KKyAgaWYgKGRzdGluZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9CQURfU1RBVEUsIGRzdGluZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIENvcHkgZnVuZGFtZW50YWwgaW1hZ2UgZGltZW5zaW9ucyAqLworICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOworICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIGRzdGluZm8tPmlucHV0X2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgZHN0aW5mby0+aW5fY29sb3Jfc3BhY2UgPSBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlOworICAvKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIGpwZWdfc2V0X2RlZmF1bHRzKGRzdGluZm8pOworICAvKiBqcGVnX3NldF9kZWZhdWx0cyBtYXkgY2hvb3NlIHdyb25nIGNvbG9yc3BhY2UsIGVnIFlDYkNyIGlmIGlucHV0IGlzIFJHQi4KKyAgICogRml4IGl0IHRvIGdldCB0aGUgcmlnaHQgaGVhZGVyIG1hcmtlcnMgZm9yIHRoZSBpbWFnZSBjb2xvcnNwYWNlLgorICAgKi8KKyAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKTsKKyAgZHN0aW5mby0+ZGF0YV9wcmVjaXNpb24gPSBzcmNpbmZvLT5kYXRhX3ByZWNpc2lvbjsKKyAgZHN0aW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IHNyY2luZm8tPkNDSVI2MDFfc2FtcGxpbmc7CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZXMuICovCisgIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7CisgICAgaWYgKHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSAhPSBOVUxMKSB7CisgICAgICBxdGJscHRyID0gJiBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107CisgICAgICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKKwkqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgZHN0aW5mbyk7CisgICAgICBNRU1DT1BZKCgqcXRibHB0ciktPnF1YW50dmFsLAorCSAgICAgIHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXS0+cXVhbnR2YWwsCisJICAgICAgU0laRU9GKCgqcXRibHB0ciktPnF1YW50dmFsKSk7CisgICAgICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7CisgICAgfQorICB9CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHBlci1jb21wb25lbnQgaW5mby4KKyAgICogTm90ZSB3ZSBhc3N1bWUganBlZ19zZXRfZGVmYXVsdHMgaGFzIGFsbG9jYXRlZCB0aGUgZGVzdCBjb21wX2luZm8gYXJyYXkuCisgICAqLworICBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOworICBpZiAoZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGRzdGluZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoZHN0aW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGRzdGluZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworICBmb3IgKGNpID0gMCwgaW5jb21wID0gc3JjaW5mby0+Y29tcF9pbmZvLCBvdXRjb21wID0gZHN0aW5mby0+Y29tcF9pbmZvOworICAgICAgIGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyssIGluY29tcCsrLCBvdXRjb21wKyspIHsKKyAgICBvdXRjb21wLT5jb21wb25lbnRfaWQgPSBpbmNvbXAtPmNvbXBvbmVudF9pZDsKKyAgICBvdXRjb21wLT5oX3NhbXBfZmFjdG9yID0gaW5jb21wLT5oX3NhbXBfZmFjdG9yOworICAgIG91dGNvbXAtPnZfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPnZfc2FtcF9mYWN0b3I7CisgICAgb3V0Y29tcC0+cXVhbnRfdGJsX25vID0gaW5jb21wLT5xdWFudF90Ymxfbm87CisgICAgLyogTWFrZSBzdXJlIHNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50IG1hdGNoZXMgdGhlIHF0YWJsZQorICAgICAqIHNsb3QuICBJZiBub3QsIHRoZSBpbnB1dCBmaWxlIHJlLXVzZWQgdGhpcyBxdGFibGUgc2xvdC4KKyAgICAgKiBJSkcgZW5jb2RlciBjdXJyZW50bHkgY2Fubm90IGR1cGxpY2F0ZSB0aGlzLgorICAgICAqLworICAgIHRibG5vID0gb3V0Y29tcC0+cXVhbnRfdGJsX25vOworICAgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwlzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICBzbG90X3F1YW50ID0gc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOworICAgIGNfcXVhbnQgPSBpbmNvbXAtPnF1YW50X3RhYmxlOworICAgIGlmIChjX3F1YW50ICE9IE5VTEwpIHsKKyAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKSB7CisJaWYgKGNfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSAhPSBzbG90X3F1YW50LT5xdWFudHZhbFtjb2VmaV0pCisJICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogTm90ZTogd2UgZG8gbm90IGNvcHkgdGhlIHNvdXJjZSdzIEh1ZmZtYW4gdGFibGUgYXNzaWdubWVudHM7CisgICAgICogaW5zdGVhZCB3ZSByZWx5IG9uIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gaGF2ZSBtYWRlIGEgc3VpdGFibGUgY2hvaWNlLgorICAgICAqLworICB9CisgIC8qIEFsc28gY29weSBKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KKyAgICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCAiY3JpdGljYWwiIGluZm8sIGJ1dCBpdCdzIG5lYXJseQorICAgKiBhbHdheXMgYXBwcm9wcmlhdGUgdG8gY29weSBpdCBpZiBhdmFpbGFibGUuICBJbiBwYXJ0aWN1bGFyLAorICAgKiBpZiB0aGUgYXBwbGljYXRpb24gY2hvb3NlcyB0byBjb3B5IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBmcm9tCisgICAqIHRoZSBzb3VyY2UgZmlsZSwgd2UgbmVlZCB0byBjb3B5IHRoZSB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAorICAgKiBlbWl0IGEgZmlsZSB0aGF0IGhhcyAxLjAyIGV4dGVuc2lvbnMgYnV0IGEgY2xhaW1lZCB2ZXJzaW9uIG9mIDEuMDEuCisgICAqIFdlIHdpbGwgKm5vdCosIGhvd2V2ZXIsIGNvcHkgdmVyc2lvbiBpbmZvIGZyb20gbWlzbGFiZWxlZCAiMi4wMSIgZmlsZXMuCisgICAqLworICBpZiAoc3JjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7CisgICAgaWYgKHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9PSAxKSB7CisgICAgICBkc3RpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb247CisgICAgICBkc3RpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb247CisgICAgfQorICAgIGRzdGluZm8tPmRlbnNpdHlfdW5pdCA9IHNyY2luZm8tPmRlbnNpdHlfdW5pdDsKKyAgICBkc3RpbmZvLT5YX2RlbnNpdHkgPSBzcmNpbmZvLT5YX2RlbnNpdHk7CisgICAgZHN0aW5mby0+WV9kZW5zaXR5ID0gc3JjaW5mby0+WV9kZW5zaXR5OworICB9Cit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqY2luaXQuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGNvbXByZXNzb3IuCisgKi8KKworTE9DQUwodm9pZCkKK3RyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQoreworICAvKiBBbHRob3VnaCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgaW5wdXRfY29tcG9uZW50cyBmb3IgdHJhbnNjb2RpbmcsCisgICAqIGpjbWFzdGVyLmMncyBpbml0aWFsX3NldHVwIHdpbGwgY29tcGxhaW4gaWYgaW5wdXRfY29tcG9uZW50cyBpcyAwLgorICAgKi8KKyAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KKyAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgVFJVRSAvKiB0cmFuc2NvZGUgb25seSAqLyk7CisKKyAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLworICB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIGNvZWZfYXJyYXlzKTsKKworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0ksIEpGSUYpIGltbWVkaWF0ZWx5LgorICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KKyAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KKyAgICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBhIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50CisgKiBidWZmZXIgY29udHJvbGxlci4gIFRoaXMgaXMgc2ltaWxhciB0byBqY2NvZWZjdC5jLCBidXQgaXQgaGFuZGxlcyBvbmx5CisgKiBvdXRwdXQgZnJvbSBwcmVzdXBwbGllZCB2aXJ0dWFsIGFycmF5cy4gIEZ1cnRoZXJtb3JlLCB3ZSBnZW5lcmF0ZSBhbnkKKyAqIGR1bW15IHBhZGRpbmcgYmxvY2tzIG9uLXRoZS1mbHkgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoZW0gdG8gYmUgcHJlc2VudAorICogaW4gdGhlIGFycmF5cy4KKyAqLworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLworICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBWaXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciAqIHdob2xlX2ltYWdlOworCisgIC8qIFdvcmtzcGFjZSBmb3IgY29uc3RydWN0aW5nIGR1bW15IGJsb2NrcyBhdCByaWdodC9ib3R0b20gZWRnZXMuICovCisgIEpCTE9DS1JPVyBkdW1teV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Cit9IG15X2NvZWZfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+bWN1X2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIGlmIChwYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKworICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlpbmRleCt5b2Zmc2V0IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgIC8qIEZpbGwgaW4gcG9pbnRlcnMgdG8gcmVhbCBibG9ja3MgaW4gdGhpcyByb3cgKi8KKwkgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGJsb2NrY250OyB4aW5kZXgrKykKKwkgICAgICBNQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9IGVsc2UgeworCSAgICAvKiBBdCBib3R0b20gb2YgaW1hZ2UsIG5lZWQgYSB3aG9sZSByb3cgb2YgZHVtbXkgYmxvY2tzICovCisJICAgIHhpbmRleCA9IDA7CisJICB9CisJICAvKiBGaWxsIGluIGFueSBkdW1teSBibG9ja3MgbmVlZGVkIGluIHRoaXMgcm93LgorCSAgICogRHVtbXkgYmxvY2tzIGFyZSBmaWxsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGpjY29lZmN0LmM6CisJICAgKiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCisJICAgKiBibG9jaydzIERDIHZhbHVlLiAgVGhlIGluaXQgcm91dGluZSBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlCisJICAgKiBBQyBlbnRyaWVzLCBzbyB3ZSBuZWVkIG9ubHkgc2V0IHRoZSBEQyBlbnRyaWVzIGNvcnJlY3RseS4KKwkgICAqLworCSAgZm9yICg7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKKwkgICAgTUNVX2J1ZmZlcltibGtuXSA9IGNvZWYtPmR1bW15X2J1ZmZlcltibGtuXTsKKwkgICAgTUNVX2J1ZmZlcltibGtuXVswXVswXSA9IE1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKKwkgICAgYmxrbisrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBNQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KKyAgICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLworICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqCisgKiBFYWNoIHBhc3NlZCBjb2VmZmljaWVudCBhcnJheSBtdXN0IGJlIHRoZSByaWdodCBzaXplIGZvciB0aGF0CisgKiBjb2VmZmljaWVudDogd2lkdGhfaW5fYmxvY2tzIHdpZGUgYW5kIGhlaWdodF9pbl9ibG9ja3MgaGlnaCwKKyAqIHdpdGggdW5pdGhlaWdodCBhdCBsZWFzdCB2X3NhbXBfZmFjdG9yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisgIEpCTE9DS1JPVyBidWZmZXI7CisgIGludCBpOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOworICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKKworICAvKiBTYXZlIHBvaW50ZXIgdG8gdmlydHVhbCBhcnJheXMgKi8KKyAgY29lZi0+d2hvbGVfaW1hZ2UgPSBjb2VmX2FycmF5czsKKworICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gc3BhY2UgZm9yIGR1bW15IERDVCBibG9ja3MuICovCisgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICBqemVyb19mYXIoKHZvaWQgRkFSICopIGJ1ZmZlciwgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKKyAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgIGNvZWYtPmR1bW15X2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pkYXBpbWluLmMgYi9qZGFwaW1pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGI1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qZGFwaW1pbi5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogamRhcGltaW4uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGVjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCisgKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlCisgKiB0cmFuc2NvZGluZy1vbmx5IGNhc2UuCisgKgorICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpkYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNvbWFwaS5jIGZvciByb3V0aW5lcworICogc2hhcmVkIGJ5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamR0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcKKyAqIGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCisgKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfQ3JlYXRlRGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQoreworICBpbnQgaTsKKworICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCisgIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKKyAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAorCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7CisKKyAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KKyAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0CisgICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgorICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKKyAgICogY29tcGxhaW4gaGVyZS4KKyAgICovCisgIHsKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLworICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpOworICAgIGNpbmZvLT5lcnIgPSBlcnI7CisgICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisgIH0KKyAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IFRSVUU7CisKKyAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLworICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KKyAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKKyAgY2luZm8tPnNyYyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCisgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOworICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgbWFya2VyIHByb2Nlc3NvciBzbyBhcHBsaWNhdGlvbiBjYW4gb3ZlcnJpZGUgbWV0aG9kcworICAgKiBmb3IgQ09NLCBBUFBuIG1hcmtlcnMgYmVmb3JlIGNhbGxpbmcganBlZ19yZWFkX2hlYWRlci4KKyAgICovCisgIGNpbmZvLT5tYXJrZXJfbGlzdCA9IE5VTEw7CisgIGppbml0X21hcmtlcl9yZWFkZXIoY2luZm8pOworCisgIC8qIEFuZCBpbml0aWFsaXplIHRoZSBvdmVyYWxsIGlucHV0IGNvbnRyb2xsZXIuICovCisgIGppbml0X2lucHV0X2NvbnRyb2xsZXIoY2luZm8pOworCisgIC8qIE9LLCBJJ20gcmVhZHkgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKK30KKworCisvKgorICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0CisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLAorICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Fib3J0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KK30KKworCisvKgorICogU2V0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorICovCisKK0xPQ0FMKHZvaWQpCitkZWZhdWx0X2RlY29tcHJlc3NfcGFybXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIEd1ZXNzIHRoZSBpbnB1dCBjb2xvcnNwYWNlLCBhbmQgc2V0IG91dHB1dCBjb2xvcnNwYWNlIGFjY29yZGluZ2x5LiAqLworICAvKiAoV2lzaCBKUEVHIGNvbW1pdHRlZSBoYWQgcHJvdmlkZWQgYSByZWFsIHdheSB0byBzcGVjaWZ5IHRoaXMuLi4pICovCisgIC8qIE5vdGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIG91ciBndWVzc2VzLiAqLworICBzd2l0Y2ggKGNpbmZvLT5udW1fY29tcG9uZW50cykgeworICBjYXNlIDE6CisgICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIGJyZWFrOworICAgIAorICBjYXNlIDM6CisgICAgaWYgKGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIpIHsKKyAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBKRklGIGltcGxpZXMgWUNiQ3IgKi8KKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKKyAgICAgIGNhc2UgMDoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisJYnJlYWs7CisgICAgICBjYXNlIDE6CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLworCWJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBTYXcgbm8gc3BlY2lhbCBtYXJrZXJzLCB0cnkgdG8gZ3Vlc3MgZnJvbSB0aGUgY29tcG9uZW50IElEcyAqLworICAgICAgaW50IGNpZDAgPSBjaW5mby0+Y29tcF9pbmZvWzBdLmNvbXBvbmVudF9pZDsKKyAgICAgIGludCBjaWQxID0gY2luZm8tPmNvbXBfaW5mb1sxXS5jb21wb25lbnRfaWQ7CisgICAgICBpbnQgY2lkMiA9IGNpbmZvLT5jb21wX2luZm9bMl0uY29tcG9uZW50X2lkOworCisgICAgICBpZiAoY2lkMCA9PSAxICYmIGNpZDEgPT0gMiAmJiBjaWQyID09IDMpCisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBKRklGIHcvb3V0IG1hcmtlciAqLworICAgICAgZWxzZSBpZiAoY2lkMCA9PSA4MiAmJiBjaWQxID09IDcxICYmIGNpZDIgPT0gNjYpCisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBBU0NJSSAnUicsICdHJywgJ0InICovCisgICAgICBlbHNlIHsKKwlUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19VTktOT1dOX0lEUywgY2lkMCwgY2lkMSwgY2lkMik7CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBpdCdzIFlDYkNyICovCisgICAgICB9CisgICAgfQorICAgIC8qIEFsd2F5cyBndWVzcyBSR0IgaXMgcHJvcGVyIG91dHB1dCBjb2xvcnNwYWNlLiAqLworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICAgIGJyZWFrOworICAgIAorICBjYXNlIDQ6CisgICAgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKKyAgICAgIGNhc2UgMDoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOworCWJyZWFrOworICAgICAgY2FzZSAyOgorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7IC8qIGFzc3VtZSBpdCdzIFlDQ0sgKi8KKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogTm8gc3BlY2lhbCBtYXJrZXJzLCBhc3N1bWUgc3RyYWlnaHQgQ01ZSy4gKi8KKyAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7CisgICAgfQorICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKyAgICBicmVhazsKKyAgICAKKyAgZGVmYXVsdDoKKyAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFNldCBkZWZhdWx0cyBmb3Igb3RoZXIgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAqLworICBjaW5mby0+c2NhbGVfbnVtID0gMTsJCS8qIDE6MSBzY2FsaW5nICovCisgIGNpbmZvLT5zY2FsZV9kZW5vbSA9IDE7CisgIGNpbmZvLT5vdXRwdXRfZ2FtbWEgPSAxLjA7CisgIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IEZBTFNFOworICBjaW5mby0+cmF3X2RhdGFfb3V0ID0gRkFMU0U7CisgIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9ERUZBVUxUOworICBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA9IFRSVUU7CisgIGNpbmZvLT5kb19ibG9ja19zbW9vdGhpbmcgPSBUUlVFOworICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gRkFMU0U7CisgIC8qIFdlIHNldCB0aGVzZSBpbiBjYXNlIGFwcGxpY2F0aW9uIG9ubHkgc2V0cyBxdWFudGl6ZV9jb2xvcnMuICovCisgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfRlM7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgIGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSA9IFRSVUU7CisjZWxzZQorICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKKyNlbmRpZgorICBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gMjU2OworICBjaW5mby0+Y29sb3JtYXAgPSBOVUxMOworICAvKiBJbml0aWFsaXplIGZvciBubyBtb2RlIGNoYW5nZSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLworICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gRkFMU0U7CisgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKKyAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOworfQorCisKKy8qCisgKiBEZWNvbXByZXNzaW9uIHN0YXJ0dXA6IHJlYWQgc3RhcnQgb2YgSlBFRyBkYXRhc3RyZWFtIHRvIHNlZSB3aGF0J3MgdGhlcmUuCisgKiBOZWVkIG9ubHkgaW5pdGlhbGl6ZSBKUEVHIG9iamVjdCBhbmQgc3VwcGx5IGEgZGF0YSBzb3VyY2UgYmVmb3JlIGNhbGxpbmcuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgcmVhZCBhcyBmYXIgYXMgdGhlIGZpcnN0IFNPUyBtYXJrZXIgKGllLCBhY3R1YWwgc3RhcnQgb2YKKyAqIGNvbXByZXNzZWQgZGF0YSksIGFuZCB3aWxsIHNhdmUgYWxsIHRhYmxlcyBhbmQgcGFyYW1ldGVycyBpbiB0aGUgSlBFRworICogb2JqZWN0LiAgSXQgd2lsbCBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBkZWZhdWx0CisgKiB2YWx1ZXMsIGFuZCBmaW5hbGx5IHJldHVybiBKUEVHX0hFQURFUl9PSy4gIE9uIHJldHVybiwgdGhlIGFwcGxpY2F0aW9uIG1heQorICogYWRqdXN0IHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHRoZW4gY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MuCisgKiAoT3IsIGlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHdhbnRlZCB0byBkZXRlcm1pbmUgdGhlIGltYWdlIHBhcmFtZXRlcnMsCisgKiB0aGUgZGF0YSBuZWVkIG5vdCBiZSBkZWNvbXByZXNzZWQuICBJbiB0aGF0IGNhc2UsIGNhbGwganBlZ19hYm9ydCBvcgorICoganBlZ19kZXN0cm95IHRvIHJlbGVhc2UgYW55IHRlbXBvcmFyeSBzcGFjZS4pCisgKiBJZiBhbiBhYmJyZXZpYXRlZCAodGFibGVzIG9ubHkpIGRhdGFzdHJlYW0gaXMgcHJlc2VudGVkLCB0aGUgcm91dGluZSB3aWxsCisgKiByZXR1cm4gSlBFR19IRUFERVJfVEFCTEVTX09OTFkgdXBvbiByZWFjaGluZyBFT0kuICBUaGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAqIHJlLXVzZSB0aGUgSlBFRyBvYmplY3QgdG8gcmVhZCB0aGUgYWJicmV2aWF0ZWQgaW1hZ2UgZGF0YXN0cmVhbShzKS4KKyAqIEl0IGlzIHVubmVjZXNzYXJ5IChidXQgT0spIHRvIGNhbGwganBlZ19hYm9ydCBpbiB0aGlzIGNhc2UuCisgKiBUaGUgSlBFR19TVVNQRU5ERUQgcmV0dXJuIGNvZGUgb25seSBvY2N1cnMgaWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZQorICogcmVxdWVzdHMgc3VzcGVuc2lvbiBvZiB0aGUgZGVjb21wcmVzc29yLiAgSW4gdGhpcyBjYXNlIHRoZSBhcHBsaWNhdGlvbgorICogc2hvdWxkIGxvYWQgbW9yZSBzb3VyY2UgZGF0YSBhbmQgdGhlbiByZS1jYWxsIGpwZWdfcmVhZF9oZWFkZXIgdG8gcmVzdW1lCisgKiBwcm9jZXNzaW5nLgorICogSWYgYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkIGFuZCByZXF1aXJlX2ltYWdlIGlzIFRSVUUsIHRoZW4gdGhlCisgKiByZXR1cm4gY29kZSBuZWVkIG5vdCBiZSBpbnNwZWN0ZWQgc2luY2Ugb25seSBKUEVHX0hFQURFUl9PSyBpcyBwb3NzaWJsZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgbm93IGp1c3QgYSBmcm9udCBlbmQgdG8ganBlZ19jb25zdW1lX2lucHV0LCB3aXRoIHNvbWUKKyAqIGV4dHJhIGVycm9yIGNoZWNraW5nLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX3JlYWRfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHJlcXVpcmVfaW1hZ2UpCit7CisgIGludCByZXRjb2RlOworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TVEFSVCAmJgorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfSU5IRUFERVIpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICByZXRjb2RlID0ganBlZ19jb25zdW1lX2lucHV0KGNpbmZvKTsKKworICBzd2l0Y2ggKHJldGNvZGUpIHsKKyAgY2FzZSBKUEVHX1JFQUNIRURfU09TOgorICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9PSzsKKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1JFQUNIRURfRU9JOgorICAgIGlmIChyZXF1aXJlX2ltYWdlKQkJLyogQ29tcGxhaW4gaWYgYXBwbGljYXRpb24gd2FudGVkIGFuIGltYWdlICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0lNQUdFKTsKKyAgICAvKiBSZXNldCB0byBzdGFydCBzdGF0ZTsgaXQgd291bGQgYmUgc2FmZXIgdG8gcmVxdWlyZSB0aGUgYXBwbGljYXRpb24gdG8KKyAgICAgKiBjYWxsIGpwZWdfYWJvcnQsIGJ1dCB3ZSBjYW4ndCBjaGFuZ2UgaXQgbm93IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgICAgICogQSBzaWRlIGVmZmVjdCBpcyB0byBmcmVlIGFueSB0ZW1wb3JhcnkgbWVtb3J5ICh0aGVyZSBzaG91bGRuJ3QgYmUgYW55KS4KKyAgICAgKi8KKyAgICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogc2V0cyBzdGF0ZSA9IERTVEFURV9TVEFSVCAqLworICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWTsKKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKKyAgICAvKiBubyB3b3JrICovCisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0Y29kZTsKK30KKworCisvKgorICogQ29uc3VtZSBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCB0aGUgZGVjb21wcmVzc29yIHJlcXVpcmVzLgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIG9uY2UgdGhlIGRlY29tcHJlc3NvciBvYmplY3QgaGFzCisgKiBiZWVuIGNyZWF0ZWQgYW5kIGEgZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHVwLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBlc3NlbnRpYWxseSBhIHN0YXRlIG1hY2hpbmUgdGhhdCBoYW5kbGVzIGEgY291cGxlCisgKiBvZiBjcml0aWNhbCBzdGF0ZS10cmFuc2l0aW9uIGFjdGlvbnMsIG5hbWVseSBpbml0aWFsIHNldHVwIGFuZAorICogdHJhbnNpdGlvbiBmcm9tIGhlYWRlciBzY2FubmluZyB0byByZWFkeS1mb3Itc3RhcnRfZGVjb21wcmVzcy4KKyAqIEFsbCB0aGUgYWN0dWFsIGlucHV0IGlzIGRvbmUgdmlhIHRoZSBpbnB1dCBjb250cm9sbGVyJ3MgY29uc3VtZV9pbnB1dAorICogbWV0aG9kLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX2NvbnN1bWVfaW5wdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCByZXRjb2RlID0gSlBFR19TVVNQRU5ERUQ7CisKKyAgLyogTkI6IGV2ZXJ5IHBvc3NpYmxlIERTVEFURSB2YWx1ZSBzaG91bGQgYmUgbGlzdGVkIGluIHRoaXMgc3dpdGNoICovCisgIHN3aXRjaCAoY2luZm8tPmdsb2JhbF9zdGF0ZSkgeworICBjYXNlIERTVEFURV9TVEFSVDoKKyAgICAvKiBTdGFydC1vZi1kYXRhc3RyZWFtIGFjdGlvbnM6IHJlc2V0IGFwcHJvcHJpYXRlIG1vZHVsZXMgKi8KKyAgICAoKmNpbmZvLT5pbnB1dGN0bC0+cmVzZXRfaW5wdXRfY29udHJvbGxlcikgKGNpbmZvKTsKKyAgICAvKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uJ3MgZGF0YSBzb3VyY2UgbW9kdWxlICovCisgICAgKCpjaW5mby0+c3JjLT5pbml0X3NvdXJjZSkgKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0lOSEVBREVSOworICAgIC8qRkFMTFRIUk9VR0gqLworICBjYXNlIERTVEFURV9JTkhFQURFUjoKKyAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7CisgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykgeyAvKiBGb3VuZCBTT1MsIHByZXBhcmUgdG8gZGVjb21wcmVzcyAqLworICAgICAgLyogU2V0IHVwIGRlZmF1bHQgcGFyYW1ldGVycyBiYXNlZCBvbiBoZWFkZXIgZGF0YSAqLworICAgICAgZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zKGNpbmZvKTsKKyAgICAgIC8qIFNldCBnbG9iYWwgc3RhdGU6IHJlYWR5IGZvciBzdGFydF9kZWNvbXByZXNzICovCisgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JFQURZOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBEU1RBVEVfUkVBRFk6CisgICAgLyogQ2FuJ3QgYWR2YW5jZSBwYXN0IGZpcnN0IFNPUyB1bnRpbCBzdGFydF9kZWNvbXByZXNzIGlzIGNhbGxlZCAqLworICAgIHJldGNvZGUgPSBKUEVHX1JFQUNIRURfU09TOworICAgIGJyZWFrOworICBjYXNlIERTVEFURV9QUkVMT0FEOgorICBjYXNlIERTVEFURV9QUkVTQ0FOOgorICBjYXNlIERTVEFURV9TQ0FOTklORzoKKyAgY2FzZSBEU1RBVEVfUkFXX09LOgorICBjYXNlIERTVEFURV9CVUZJTUFHRToKKyAgY2FzZSBEU1RBVEVfQlVGUE9TVDoKKyAgY2FzZSBEU1RBVEVfU1RPUFBJTkc6CisgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIH0KKyAgcmV0dXJuIHJldGNvZGU7Cit9CisKKworLyoKKyAqIEhhdmUgd2UgZmluaXNoZWQgcmVhZGluZyB0aGUgaW5wdXQgZmlsZT8KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfaW5wdXRfY29tcGxldGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIENoZWNrIGZvciB2YWxpZCBqcGVnIG9iamVjdCAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA8IERTVEFURV9TVEFSVCB8fAorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA+IERTVEFURV9TVE9QUElORykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICByZXR1cm4gY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZDsKK30KKworCisvKgorICogSXMgdGhlcmUgbW9yZSB0aGFuIG9uZSBzY2FuPworICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIE9ubHkgdmFsaWQgYWZ0ZXIganBlZ19yZWFkX2hlYWRlciBjb21wbGV0ZXMgKi8KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfUkVBRFkgfHwKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zOworfQorCisKKy8qCisgKiBGaW5pc2ggSlBFRyBkZWNvbXByZXNzaW9uLgorICoKKyAqIFRoaXMgd2lsbCBub3JtYWxseSBqdXN0IHZlcmlmeSB0aGUgZmlsZSB0cmFpbGVyIGFuZCByZWxlYXNlIHRlbXAgc3RvcmFnZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NDQU5OSU5HIHx8CisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkFXX09LKSAmJiAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIC8qIFRlcm1pbmF0ZSBmaW5hbCBwYXNzIG9mIG5vbi1idWZmZXJlZCBtb2RlICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVE9PX0xJVFRMRV9EQVRBKTsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSB7CisgICAgLyogRmluaXNoaW5nIGFmdGVyIGEgYnVmZmVyZWQtaW1hZ2Ugb3BlcmF0aW9uICovCisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TVE9QUElORykgeworICAgIC8qIFNUT1BQSU5HID0gcmVwZWF0IGNhbGwgYWZ0ZXIgYSBzdXNwZW5zaW9uLCBhbnl0aGluZyBlbHNlIGlzIGVycm9yICovCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgfQorICAvKiBSZWFkIHVudGlsIEVPSSAqLworICB3aGlsZSAoISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7CisgICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEZBTFNFOwkJLyogU3VzcGVuZCwgY29tZSBiYWNrIGxhdGVyICovCisgIH0KKyAgLyogRG8gZmluYWwgY2xlYW51cCAqLworICAoKmNpbmZvLT5zcmMtPnRlcm1fc291cmNlKSAoY2luZm8pOworICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9qZGFwaXN0ZC5jIGIvamRhcGlzdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUzZmEwCi0tLSAvZGV2L251bGwKKysrIGIvamRhcGlzdGQuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIGpkYXBpc3RkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgorICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgInN0YW5kYXJkIiBBUEkgcm91dGluZXMgdGhhdCBhcmUKKyAqIHVzZWQgaW4gdGhlIG5vcm1hbCBmdWxsLWRlY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKKyAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KKyAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGRlY29tcHJlc3Nvci4KKyAqIFdlIHRodXMgbXVzdCBzZXBhcmF0ZSB0aGlzIGZpbGUgZnJvbSBqZGFwaW1pbi5jIHRvIGF2b2lkIGxpbmtpbmcgdGhlCisgKiB3aG9sZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTChib29sZWFuKSBvdXRwdXRfcGFzc19zZXR1cCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogRGVjb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgd2lsbCBkbyBhbGwgYnV0IHRoZQorICogbGFzdCBwYXNzLCBhbmQgdGh1cyBtYXkgdGFrZSBhIGdyZWF0IGRlYWwgb2YgdGltZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgeworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLworICAgIGppbml0X21hc3Rlcl9kZWNvbXByZXNzKGNpbmZvKTsKKyAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgICAvKiBObyBtb3JlIHdvcmsgaGVyZTsgZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0IG5leHQgKi8KKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7CisgICAgLyogSWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGFic29yYiB0aGVtIGFsbCBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLworICAgIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgICAgZm9yICg7OykgeworCWludCByZXRjb2RlOworCS8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisJICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKwkvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisJcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworCWlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorCSAgcmV0dXJuIEZBTFNFOworCWlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisJICBicmVhazsKKwkvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKKwkgICAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKwkgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgeworCSAgICAvKiBqZG1hc3RlciB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KKwkgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworCSAgfQorCX0KKyAgICAgIH0KKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisgICAgfQorICAgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgZmluYWwgcGFzcyAqLworICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOworfQorCisKKy8qCisgKiBTZXQgdXAgZm9yIGFuIG91dHB1dCBwYXNzLCBhbmQgcGVyZm9ybSBhbnkgZHVtbXkgcGFzcyhlcykgbmVlZGVkLgorICogQ29tbW9uIHN1YnJvdXRpbmUgZm9yIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBhbmQganBlZ19zdGFydF9vdXRwdXQuCisgKiBFbnRyeTogZ2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU4gb25seSBpZiBwcmV2aW91c2x5IHN1c3BlbmRlZC4KKyAqIEV4aXQ6IElmIGRvbmUsIHJldHVybnMgVFJVRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgZm9yIHByb3BlciBvdXRwdXQgbW9kZS4KKyAqICAgICAgIElmIHN1c3BlbmRlZCwgcmV0dXJucyBGQUxTRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTi4KKyAqLworCitMT0NBTChib29sZWFuKQorb3V0cHV0X3Bhc3Nfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKSB7CisgICAgLyogRmlyc3QgY2FsbDogZG8gcGFzcyBzZXR1cCAqLworICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IDA7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOOworICB9CisgIC8qIExvb3Agb3ZlciBhbnkgcmVxdWlyZWQgZHVtbXkgcGFzc2VzICovCisgIHdoaWxlIChjaW5mby0+bWFzdGVyLT5pc19kdW1teV9wYXNzKSB7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgLyogQ3JhbmsgdGhyb3VnaCB0aGUgZHVtbXkgcGFzcyAqLworICAgIHdoaWxlIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICAgIEpESU1FTlNJT04gbGFzdF9zY2FubGluZTsKKyAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworCSgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorICAgICAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KKyAgICAgIGxhc3Rfc2NhbmxpbmUgPSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOworICAgICAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIChKU0FNUEFSUkFZKSBOVUxMLAorCQkJCSAgICAmY2luZm8tPm91dHB1dF9zY2FubGluZSwgKEpESU1FTlNJT04pIDApOworICAgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPT0gbGFzdF9zY2FubGluZSkKKwlyZXR1cm4gRkFMU0U7CQkvKiBObyBwcm9ncmVzcyBtYWRlLCBtdXN0IHN1c3BlbmQgKi8KKyAgICB9CisgICAgLyogRmluaXNoIHVwIGR1bW15IHBhc3MsIGFuZCBzZXQgdXAgZm9yIGFub3RoZXIgb25lICovCisgICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICB9CisgIC8qIFJlYWR5IGZvciBhcHBsaWNhdGlvbiB0byBkcml2ZSBvdXRwdXQgcGFzcyB0aHJvdWdoCisgICAqIGpwZWdfcmVhZF9zY2FubGluZXMgb3IganBlZ19yZWFkX3Jhd19kYXRhLgorICAgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IGNpbmZvLT5yYXdfZGF0YV9vdXQgPyBEU1RBVEVfUkFXX09LIDogRFNUQVRFX1NDQU5OSU5HOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUmVhZCBzb21lIHNjYW5saW5lcyBvZiBkYXRhIGZyb20gdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGxpbmVzIGFjdHVhbGx5IHJlYWQuCisgKiBUaGlzIG1heSBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQgaW4gc2V2ZXJhbCBjYXNlcywKKyAqIGluY2x1ZGluZyBib3R0b20gb2YgaW1hZ2UsIGRhdGEgc291cmNlIHN1c3BlbnNpb24sIGFuZCBvcGVyYXRpbmcKKyAqIG1vZGVzIHRoYXQgZW1pdCBtdWx0aXBsZSBzY2FubGluZXMgYXQgYSB0aW1lLgorICoKKyAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBzaW5jZQorICogdGhpcyBsaWtlbHkgc2lnbmFscyBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIGVycm9yLiAgSG93ZXZlciwKKyAqIGFuIG92ZXJzaXplIGJ1ZmZlciAobWF4X2xpbmVzID4gc2NhbmxpbmVzIHJlbWFpbmluZykgaXMgbm90IGFuIGVycm9yLgorICovCisKK0dMT0JBTChKRElNRU5TSU9OKQoranBlZ19yZWFkX3NjYW5saW5lcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCSAgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCit7CisgIEpESU1FTlNJT04gcm93X2N0cjsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU0NBTk5JTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KKyAgcm93X2N0ciA9IDA7CisgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBtYXhfbGluZXMpOworICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IHJvd19jdHI7CisgIHJldHVybiByb3dfY3RyOworfQorCisKKy8qCisgKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQgdG8gcmVhZCByYXcgZGF0YS4KKyAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfcmVhZF9yYXdfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBkYXRhLAorCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCit7CisgIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SQVdfT0spCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGNhbiBiZSByZXR1cm5lZC4gKi8KKyAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGlmIChtYXhfbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7CisKKyAgLyogRGVjb21wcmVzcyBkaXJlY3RseSBpbnRvIHVzZXIncyBidWZmZXIuICovCisgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBkYXRhKSkKKyAgICByZXR1cm4gMDsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLworCisgIC8qIE9LLCB3ZSBwcm9jZXNzZWQgb25lIGlNQ1Ugcm93LiAqLworICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKK30KKworCisvKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfc3RhcnRfb3V0cHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2Nhbl9udW1iZXIpCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSAmJgorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBMaW1pdCBzY2FuIG51bWJlciB0byB2YWxpZCByYW5nZSAqLworICBpZiAoc2Nhbl9udW1iZXIgPD0gMCkKKyAgICBzY2FuX251bWJlciA9IDE7CisgIGlmIChjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkICYmCisgICAgICBzY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKKyAgICBzY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKKyAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IHNjYW5fbnVtYmVyOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgcmVhbCBwYXNzICovCisgIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhZnRlciBhbiBvdXRwdXQgcGFzcyBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLgorICoKKyAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuZGVkLiAgVGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlIGluc3BlY3RlZCBvbmx5IGlmCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfZmluaXNoX291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgLyogVGVybWluYXRlIHRoaXMgcGFzcy4gKi8KKyAgICAvKiBXZSBkbyBub3QgcmVxdWlyZSB0aGUgd2hvbGUgcGFzcyB0byBoYXZlIGJlZW4gY29tcGxldGVkLiAqLworICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGUE9TVDsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZQT1NUKSB7CisgICAgLyogQlVGUE9TVCA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIH0KKyAgLyogUmVhZCBtYXJrZXJzIGxvb2tpbmcgZm9yIFNPUyBvciBFT0kgKi8KKyAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCisJICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLworICB9CisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qZGF0YWRzdC5jIGIvamRhdGFkc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY2ZmIwCi0tLSAvZGV2L251bGwKKysrIGIvamRhdGFkc3QuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIGpkYXRhZHN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21wcmVzc2lvbiBkYXRhIGRlc3RpbmF0aW9uIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogZW1pdHRpbmcgSlBFRyBkYXRhIHRvIGEgZmlsZSAob3IgYW55IHN0ZGlvIHN0cmVhbSkuICBXaGlsZSB0aGVzZSByb3V0aW5lcworICogYXJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgYXBwbGljYXRpb25zLCBzb21lIHdpbGwgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQKKyAqIGRlc3RpbmF0aW9uIG1hbmFnZXIuCisgKiBJTVBPUlRBTlQ6IHdlIGFzc3VtZSB0aGF0IGZ3cml0ZSgpIHdpbGwgY29ycmVjdGx5IHRyYW5zY3JpYmUgYW4gYXJyYXkgb2YKKyAqIEpPQ1RFVHMgaW50byA4LWJpdC13aWRlIGVsZW1lbnRzIG9uIGV4dGVybmFsIHN0b3JhZ2UuICBJZiBjaGFyIGlzIHdpZGVyCisgKiB0aGFuIDggYml0cyBvbiB5b3VyIG1hY2hpbmUsIHlvdSBtYXkgbmVlZCB0byBkbyBzb21lIHR3ZWFraW5nLgorICovCisKKy8qIHRoaXMgaXMgbm90IGEgY29yZSBsaWJyYXJ5IG1vZHVsZSwgc28gaXQgZG9lc24ndCBkZWZpbmUgSlBFR19JTlRFUk5BTFMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIKKworCisvKiBFeHBhbmRlZCBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3Igc3RkaW8gb3V0cHV0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEZJTEUgKiBvdXRmaWxlOwkJLyogdGFyZ2V0IHN0cmVhbSAqLworICBKT0NURVQgKiBidWZmZXI7CQkvKiBzdGFydCBvZiBidWZmZXIgKi8KK30gbXlfZGVzdGluYXRpb25fbWdyOworCit0eXBlZGVmIG15X2Rlc3RpbmF0aW9uX21nciAqIG15X2Rlc3RfcHRyOworCisjZGVmaW5lIE9VVFBVVF9CVUZfU0laRSAgNDA5NgkvKiBjaG9vc2UgYW4gZWZmaWNpZW50bHkgZndyaXRlJ2FibGUgc2l6ZSAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcworICogYmVmb3JlIGFueSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbml0X2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdCA9IChteV9kZXN0X3B0cikgY2luZm8tPmRlc3Q7CisKKyAgLyogQWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIgLS0tIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiBkb25lIHdpdGggaW1hZ2UgKi8KKyAgZGVzdC0+YnVmZmVyID0gKEpPQ1RFVCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIE9VVFBVVF9CVUZfU0laRSAqIFNJWkVPRihKT0NURVQpKTsKKworICBkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPmJ1ZmZlcjsKKyAgZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyID0gT1VUUFVUX0JVRl9TSVpFOworfQorCisKKy8qCisgKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBmaWxscyB1cC4KKyAqCisgKiBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgdGhpcyBzaG91bGQgd3JpdGUgdGhlIGVudGlyZSBvdXRwdXQgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9vdXRwdXRfYnl0ZSAmIGZyZWVfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZHVtcGVkLgorICoKKyAqIEluIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYWJsZSB0byBzdXNwZW5kIGNvbXByZXNzaW9uIGR1ZSB0byBvdXRwdXQKKyAqIG92ZXJydW4sIGEgRkFMU0UgcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgY2Fubm90IGJlIGVtcHRpZWQgbm93LgorICogSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjb21wcmVzc29yIHdpbGwgcmV0dXJuIHRvIGl0cyBjYWxsZXIgKHBvc3NpYmx5IHdpdGgKKyAqIGFuIGluZGljYXRpb24gdGhhdCBpdCBoYXMgbm90IGFjY2VwdGVkIGFsbCB0aGUgc3VwcGxpZWQgc2NhbmxpbmVzKS4gIFRoZQorICogYXBwbGljYXRpb24gc2hvdWxkIHJlc3VtZSBjb21wcmVzc2lvbiBhZnRlciBpdCBoYXMgbWFkZSBtb3JlIHJvb20gaW4gdGhlCisgKiBvdXRwdXQgYnVmZmVyLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzdWJzdGFudGlhbCByZXN0cmljdGlvbnMgb24gdGhlIHVzZSBvZgorICogc3VzcGVuc2lvbiAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorICoKKyAqIFdoZW4gc3VzcGVuZGluZywgdGhlIGNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X291dHB1dF9ieXRlICYgZnJlZV9pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGFmdGVyIHJlc3VtcHRpb24sIHNvIGRvIG5vdAorICogd3JpdGUgaXQgb3V0IHdoZW4gZW1wdHlpbmcgdGhlIGJ1ZmZlciBleHRlcm5hbGx5LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW1wdHlfb3V0cHV0X2J1ZmZlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworCisgIGlmIChKRldSSVRFKGRlc3QtPm91dGZpbGUsIGRlc3QtPmJ1ZmZlciwgT1VUUFVUX0JVRl9TSVpFKSAhPQorICAgICAgKHNpemVfdCkgT1VUUFVUX0JVRl9TSVpFKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisKKyAgZGVzdC0+cHViLm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5idWZmZXI7CisgIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlciA9IE9VVFBVVF9CVUZfU0laRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogVGVybWluYXRlIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfY29tcHJlc3MKKyAqIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uICBVc3VhbGx5IG5lZWRzIHRvIGZsdXNoIGJ1ZmZlci4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworICBzaXplX3QgZGF0YWNvdW50ID0gT1VUUFVUX0JVRl9TSVpFIC0gZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFdyaXRlIGFueSBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyICovCisgIGlmIChkYXRhY291bnQgPiAwKSB7CisgICAgaWYgKEpGV1JJVEUoZGVzdC0+b3V0ZmlsZSwgZGVzdC0+YnVmZmVyLCBkYXRhY291bnQpICE9IGRhdGFjb3VudCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisgIH0KKyAgZmZsdXNoKGRlc3QtPm91dGZpbGUpOworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGlmIChmZXJyb3IoZGVzdC0+b3V0ZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtLgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBvcGVuZWQgdGhlIHN0cmVhbSwgYW5kIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgY2xvc2luZyBpdCBhZnRlciBmaW5pc2hpbmcgY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX2Rlc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogb3V0ZmlsZSkKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdDsKKworICAvKiBUaGUgZGVzdGluYXRpb24gb2JqZWN0IGlzIG1hZGUgcGVybWFuZW50IHNvIHRoYXQgbXVsdGlwbGUgSlBFRyBpbWFnZXMKKyAgICogY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgZmlsZSB3aXRob3V0IHJlLWV4ZWN1dGluZyBqcGVnX3N0ZGlvX2Rlc3QuCisgICAqIFRoaXMgbWFrZXMgaXQgZGFuZ2Vyb3VzIHRvIHVzZSB0aGlzIG1hbmFnZXIgYW5kIGEgZGlmZmVyZW50IGRlc3RpbmF0aW9uCisgICAqIG1hbmFnZXIgc2VyaWFsbHkgd2l0aCB0aGUgc2FtZSBKUEVHIG9iamVjdCwgYmVjYXVzZSB0aGVpciBwcml2YXRlIG9iamVjdAorICAgKiBzaXplcyBtYXkgYmUgZGlmZmVyZW50LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPmRlc3QgPT0gTlVMTCkgewkvKiBmaXJzdCB0aW1lIGZvciB0aGlzIEpQRUcgb2JqZWN0PyAqLworICAgIGNpbmZvLT5kZXN0ID0gKHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCisJCQkJICBTSVpFT0YobXlfZGVzdGluYXRpb25fbWdyKSk7CisgIH0KKworICBkZXN0ID0gKG15X2Rlc3RfcHRyKSBjaW5mby0+ZGVzdDsKKyAgZGVzdC0+cHViLmluaXRfZGVzdGluYXRpb24gPSBpbml0X2Rlc3RpbmF0aW9uOworICBkZXN0LT5wdWIuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IGVtcHR5X291dHB1dF9idWZmZXI7CisgIGRlc3QtPnB1Yi50ZXJtX2Rlc3RpbmF0aW9uID0gdGVybV9kZXN0aW5hdGlvbjsKKyAgZGVzdC0+b3V0ZmlsZSA9IG91dGZpbGU7Cit9CmRpZmYgLS1naXQgYS9qZGF0YXNyYy5jIGIvamRhdGFzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM3NTJiCi0tLSAvZGV2L251bGwKKysrIGIvamRhdGFzcmMuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIGpkYXRhc3JjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNvbXByZXNzaW9uIGRhdGEgc291cmNlIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogcmVhZGluZyBKUEVHIGRhdGEgZnJvbSBhIGZpbGUgKG9yIGFueSBzdGRpbyBzdHJlYW0pLiAgV2hpbGUgdGhlc2Ugcm91dGluZXMKKyAqIGFyZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgc29tZSB3aWxsIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50CisgKiBzb3VyY2UgbWFuYWdlci4KKyAqIElNUE9SVEFOVDogd2UgYXNzdW1lIHRoYXQgZnJlYWQoKSB3aWxsIGNvcnJlY3RseSB0cmFuc2NyaWJlIGFuIGFycmF5IG9mCisgKiBKT0NURVRzIGZyb20gOC1iaXQtd2lkZSBlbGVtZW50cyBvbiBleHRlcm5hbCBzdG9yYWdlLiAgSWYgY2hhciBpcyB3aWRlcgorICogdGhhbiA4IGJpdHMgb24geW91ciBtYWNoaW5lLCB5b3UgbWF5IG5lZWQgdG8gZG8gc29tZSB0d2Vha2luZy4KKyAqLworCisvKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamVycm9yLmgiCisKKworLyogRXhwYW5kZWQgZGF0YSBzb3VyY2Ugb2JqZWN0IGZvciBzdGRpbyBpbnB1dCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgRklMRSAqIGluZmlsZTsJCS8qIHNvdXJjZSBzdHJlYW0gKi8KKyAgSk9DVEVUICogYnVmZmVyOwkJLyogc3RhcnQgb2YgYnVmZmVyICovCisgIGJvb2xlYW4gc3RhcnRfb2ZfZmlsZTsJLyogaGF2ZSB3ZSBnb3R0ZW4gYW55IGRhdGEgeWV0PyAqLworfSBteV9zb3VyY2VfbWdyOworCit0eXBlZGVmIG15X3NvdXJjZV9tZ3IgKiBteV9zcmNfcHRyOworCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICA0MDk2CS8qIGNob29zZSBhbiBlZmZpY2llbnRseSBmcmVhZCdhYmxlIHNpemUgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyCisgKiBiZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgcmVhZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2luaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9zcmNfcHRyIHNyYyA9IChteV9zcmNfcHRyKSBjaW5mby0+c3JjOworCisgIC8qIFdlIHJlc2V0IHRoZSBlbXB0eS1pbnB1dC1maWxlIGZsYWcgZm9yIGVhY2ggaW1hZ2UsCisgICAqIGJ1dCB3ZSBkb24ndCBjbGVhciB0aGUgaW5wdXQgYnVmZmVyLgorICAgKiBUaGlzIGlzIGNvcnJlY3QgYmVoYXZpb3IgZm9yIHJlYWRpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gb25lIHNvdXJjZS4KKyAgICovCisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IFRSVUU7Cit9CisKKworLyoKKyAqIEZpbGwgdGhlIGlucHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBpcyBlbXB0aWVkLgorICoKKyAqIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCB0aGlzIHNob3VsZCByZWFkIGZyZXNoIGRhdGEgaW50byB0aGUgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9pbnB1dF9ieXRlICYgYnl0ZXNfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcmVsb2FkZWQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvCisgKiBmaWxsIHRoZSBidWZmZXIgZW50aXJlbHksIG9ubHkgdG8gb2J0YWluIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUuCisgKgorICogVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBFT0YgcmV0dXJuLiAgSWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbgorICogcmVhY2hlZCwgdGhlIHJvdXRpbmUgaGFzIGEgY2hvaWNlIG9mIEVSUkVYSVQoKSBvciBpbnNlcnRpbmcgZmFrZSBkYXRhIGludG8KKyAqIHRoZSBidWZmZXIuICBJbiBtb3N0IGNhc2VzLCBnZW5lcmF0aW5nIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpbnNlcnRpbmcgYQorICogZmFrZSBFT0kgbWFya2VyIGlzIHRoZSBiZXN0IGNvdXJzZSBvZiBhY3Rpb24gLS0tIHRoaXMgd2lsbCBhbGxvdyB0aGUKKyAqIGRlY29tcHJlc3NvciB0byBvdXRwdXQgaG93ZXZlciBtdWNoIG9mIHRoZSBpbWFnZSBpcyB0aGVyZS4gIEhvd2V2ZXIsCisgKiB0aGUgcmVzdWx0aW5nIGVycm9yIG1lc3NhZ2UgaXMgbWlzbGVhZGluZyBpZiB0aGUgcmVhbCBwcm9ibGVtIGlzIGFuIGVtcHR5CisgKiBpbnB1dCBmaWxlLCBzbyB3ZSBoYW5kbGUgdGhhdCBjYXNlIHNwZWNpYWxseS4KKyAqCisgKiBJbiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFibGUgdG8gc3VzcGVuZCBjb21wcmVzc2lvbiBkdWUgdG8gaW5wdXQKKyAqIG5vdCBiZWluZyBhdmFpbGFibGUgeWV0LCBhIEZBTFNFIHJldHVybiBpbmRpY2F0ZXMgdGhhdCBubyBtb3JlIGRhdGEgY2FuIGJlCisgKiBvYnRhaW5lZCByaWdodCBub3csIGJ1dCBtb3JlIG1heSBiZSBmb3J0aGNvbWluZyBsYXRlci4gIEluIHRoaXMgc2l0dWF0aW9uLAorICogdGhlIGRlY29tcHJlc3NvciB3aWxsIHJldHVybiB0byBpdHMgY2FsbGVyICh3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlCisgKiBudW1iZXIgb2Ygc2NhbmxpbmVzIGl0IGhhcyByZWFkLCBpZiBhbnkpLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXN1bWUKKyAqIGRlY29tcHJlc3Npb24gYWZ0ZXIgaXQgaGFzIGxvYWRlZCBtb3JlIGRhdGEgaW50byB0aGUgaW5wdXQgYnVmZmVyLiAgTm90ZQorICogdGhhdCB0aGVyZSBhcmUgc3Vic3RhbnRpYWwgcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ugb2Ygc3VzcGVuc2lvbiAtLS0gc2VlCisgKiB0aGUgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBXaGVuIHN1c3BlbmRpbmcsIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X2lucHV0X2J5dGUgJiBieXRlc19pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCBtdXN0IGJlIHJlc2Nhbm5lZCBhZnRlciByZXN1bXB0aW9uLCBzbyBtb3ZlIGl0IHRvCisgKiB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlciByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGl0LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNpemVfdCBuYnl0ZXM7CisKKyAgbmJ5dGVzID0gSkZSRUFEKHNyYy0+aW5maWxlLCBzcmMtPmJ1ZmZlciwgSU5QVVRfQlVGX1NJWkUpOworCisgIGlmIChuYnl0ZXMgPD0gMCkgeworICAgIGlmIChzcmMtPnN0YXJ0X29mX2ZpbGUpCS8qIFRyZWF0IGVtcHR5IGlucHV0IGZpbGUgYXMgZmF0YWwgZXJyb3IgKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOworICAgIFdBUk5NUyhjaW5mbywgSldSTl9KUEVHX0VPRik7CisgICAgLyogSW5zZXJ0IGEgZmFrZSBFT0kgbWFya2VyICovCisgICAgc3JjLT5idWZmZXJbMF0gPSAoSk9DVEVUKSAweEZGOworICAgIHNyYy0+YnVmZmVyWzFdID0gKEpPQ1RFVCkgSlBFR19FT0k7CisgICAgbmJ5dGVzID0gMjsKKyAgfQorCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IHNyYy0+YnVmZmVyOworICBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXIgPSBuYnl0ZXM7CisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBTa2lwIGRhdGEgLS0tIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCisgKiB1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLgorICoKKyAqIFdyaXRlcnMgb2Ygc3VzcGVuZGFibGUtaW5wdXQgYXBwbGljYXRpb25zIG11c3Qgbm90ZSB0aGF0IHNraXBfaW5wdXRfZGF0YQorICogaXMgbm90IGdyYW50ZWQgdGhlIHJpZ2h0IHRvIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybi4gIElmIHRoZSBza2lwIGV4dGVuZHMKKyAqIGJleW9uZCB0aGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciwgdGhlIGJ1ZmZlciBjYW4gYmUgbWFya2VkIGVtcHR5IHNvCisgKiB0aGF0IHRoZSBuZXh0IHJlYWQgd2lsbCBjYXVzZSBhIGZpbGxfaW5wdXRfYnVmZmVyIGNhbGwgdGhhdCBjYW4gc3VzcGVuZC4KKyAqIEFycmFuZ2luZyBmb3IgYWRkaXRpb25hbCBieXRlcyB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIHJlbG9hZGluZyB0aGUgaW5wdXQKKyAqIGJ1ZmZlciBpcyB0aGUgYXBwbGljYXRpb24gd3JpdGVyJ3MgcHJvYmxlbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3NraXBfaW5wdXRfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisKKyAgLyogSnVzdCBhIGR1bWIgaW1wbGVtZW50YXRpb24gZm9yIG5vdy4gIENvdWxkIHVzZSBmc2VlaygpIGV4Y2VwdAorICAgKiBpdCBkb2Vzbid0IHdvcmsgb24gcGlwZXMuICBOb3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aAorICAgKiBhbnkgdHJvdWJsZSBhbnl3YXkgLS0tIGxhcmdlIHNraXBzIGFyZSBpbmZyZXF1ZW50LgorICAgKi8KKyAgaWYgKG51bV9ieXRlcyA+IDApIHsKKyAgICB3aGlsZSAobnVtX2J5dGVzID4gKGxvbmcpIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlcikgeworICAgICAgbnVtX2J5dGVzIC09IChsb25nKSBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXI7CisgICAgICAodm9pZCkgZmlsbF9pbnB1dF9idWZmZXIoY2luZm8pOworICAgICAgLyogbm90ZSB3ZSBhc3N1bWUgdGhhdCBmaWxsX2lucHV0X2J1ZmZlciB3aWxsIG5ldmVyIHJldHVybiBGQUxTRSwKKyAgICAgICAqIHNvIHN1c3BlbnNpb24gbmVlZCBub3QgYmUgaGFuZGxlZC4KKyAgICAgICAqLworICAgIH0KKyAgICBzcmMtPnB1Yi5uZXh0X2lucHV0X2J5dGUgKz0gKHNpemVfdCkgbnVtX2J5dGVzOworICAgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciAtPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisgIH0KK30KKworCisvKgorICogQW4gYWRkaXRpb25hbCBtZXRob2QgdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyBpcyB0aGUKKyAqIHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gdGhlIHByZXNlbmNlIG9mIFJTVCBtYXJrZXJzLgorICogRm9yIHRoZSBtb21lbnQsIHRoaXMgc291cmNlIG1vZHVsZSBqdXN0IHVzZXMgdGhlIGRlZmF1bHQgcmVzeW5jIG1ldGhvZAorICogcHJvdmlkZWQgYnkgdGhlIEpQRUcgbGlicmFyeS4gIFRoYXQgbWV0aG9kIGFzc3VtZXMgdGhhdCBubyBiYWNrdHJhY2tpbmcKKyAqIGlzIHBvc3NpYmxlLgorICovCisKKworLyoKKyAqIFRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCisgKiBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgbmVjZXNzYXJ5IGhlcmUgKi8KK30KKworCisvKgorICogUHJlcGFyZSBmb3IgaW5wdXQgZnJvbSBhIHN0ZGlvIHN0cmVhbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBzdHJlYW0sIGFuZCBpcyByZXNwb25zaWJsZQorICogZm9yIGNsb3NpbmcgaXQgYWZ0ZXIgZmluaXNoaW5nIGRlY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX3NyYyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgbXlfc3JjX3B0ciBzcmM7CisKKyAgLyogVGhlIHNvdXJjZSBvYmplY3QgYW5kIGlucHV0IGJ1ZmZlciBhcmUgbWFkZSBwZXJtYW5lbnQgc28gdGhhdCBhIHNlcmllcworICAgKiBvZiBKUEVHIGltYWdlcyBjYW4gYmUgcmVhZCBmcm9tIHRoZSBzYW1lIGZpbGUgYnkgY2FsbGluZyBqcGVnX3N0ZGlvX3NyYworICAgKiBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgb25lLiAgKElmIHdlIGRpc2NhcmRlZCB0aGUgYnVmZmVyIGF0IHRoZSBlbmQgb2YKKyAgICogb25lIGltYWdlLCB3ZSdkIGxpa2VseSBsb3NlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBvbmUuKQorICAgKiBUaGlzIG1ha2VzIGl0IHVuc2FmZSB0byB1c2UgdGhpcyBtYW5hZ2VyIGFuZCBhIGRpZmZlcmVudCBzb3VyY2UKKyAgICogbWFuYWdlciBzZXJpYWxseSB3aXRoIHRoZSBzYW1lIEpQRUcgb2JqZWN0LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPnNyYyA9PSBOVUxMKSB7CS8qIGZpcnN0IHRpbWUgZm9yIHRoaXMgSlBFRyBvYmplY3Q/ICovCisgICAgY2luZm8tPnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIFNJWkVPRihteV9zb3VyY2VfbWdyKSk7CisgICAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgICAgc3JjLT5idWZmZXIgPSAoSk9DVEVUICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIElOUFVUX0JVRl9TSVpFICogU0laRU9GKEpPQ1RFVCkpOworICB9CisKKyAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNyYy0+cHViLmluaXRfc291cmNlID0gaW5pdF9zb3VyY2U7CisgIHNyYy0+cHViLmZpbGxfaW5wdXRfYnVmZmVyID0gZmlsbF9pbnB1dF9idWZmZXI7CisgIHNyYy0+cHViLnNraXBfaW5wdXRfZGF0YSA9IHNraXBfaW5wdXRfZGF0YTsKKyAgc3JjLT5wdWIucmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OyAvKiB1c2UgZGVmYXVsdCBtZXRob2QgKi8KKyAgc3JjLT5wdWIudGVybV9zb3VyY2UgPSB0ZXJtX3NvdXJjZTsKKyAgc3JjLT5pbmZpbGUgPSBpbmZpbGU7CisgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IDA7IC8qIGZvcmNlcyBmaWxsX2lucHV0X2J1ZmZlciBvbiBmaXJzdCByZWFkICovCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7IC8qIHVudGlsIGJ1ZmZlciBsb2FkZWQgKi8KK30KZGlmZiAtLWdpdCBhL2pkY29lZmN0LmMgYi9qZGNvZWZjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MzhkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGNvZWZjdC5jCkBAIC0wLDAgKzEsNzM2IEBACisvKgorICogamRjb2VmY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlciBmb3IgZGVjb21wcmVzc2lvbi4KKyAqIFRoaXMgY29udHJvbGxlciBpcyB0aGUgdG9wIGxldmVsIG9mIHRoZSBKUEVHIGRlY29tcHJlc3NvciBwcm9wZXIuCisgKiBUaGUgY29lZmZpY2llbnQgYnVmZmVyIGxpZXMgYmV0d2VlbiBlbnRyb3B5IGRlY29kaW5nIGFuZCBpbnZlcnNlLURDVCBzdGVwcy4KKyAqCisgKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGlzIGNvbnRyb2xsZXIgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuCisgKiBpbnB1dC1vcmllbnRlZCBwcm9jZXNzaW5nIGFuZCBvdXRwdXQtb3JpZW50ZWQgcHJvY2Vzc2luZy4KKyAqIEFsc28sIHRoZSBpbnB1dCBzaWRlIChvbmx5KSBpcyB1c2VkIHdoZW4gcmVhZGluZyBhIGZpbGUgZm9yIHRyYW5zY29kaW5nLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworLyogQmxvY2sgc21vb3RoaW5nIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRywgc286ICovCisjaWZuZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisjdW5kZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorI2VuZGlmCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVGhlc2UgdmFyaWFibGVzIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIGlucHV0IHNpZGUuICovCisgIC8qIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyBpcyBhbHNvIHVzZWQgZm9yIHRoaXMuICovCisgIEpESU1FTlNJT04gTUNVX2N0cjsJCS8qIGNvdW50cyBNQ1VzIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdyAqLworICBpbnQgTUNVX3ZlcnRfb2Zmc2V0OwkJLyogY291bnRzIE1DVSByb3dzIHdpdGhpbiBpTUNVIHJvdyAqLworICBpbnQgTUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2Ygc3VjaCByb3dzIG5lZWRlZCAqLworCisgIC8qIFRoZSBvdXRwdXQgc2lkZSdzIGxvY2F0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cuICovCisKKyAgLyogSW4gc2luZ2xlLXBhc3MgbW9kZXMsIGl0J3Mgc3VmZmljaWVudCB0byBidWZmZXIganVzdCBvbmUgTUNVLgorICAgKiBXZSBhbGxvY2F0ZSBhIHdvcmtzcGFjZSBvZiBEX01BWF9CTE9DS1NfSU5fTUNVIGNvZWZmaWNpZW50IGJsb2NrcywKKyAgICogYW5kIGxldCB0aGUgZW50cm9weSBkZWNvZGVyIHdyaXRlIGludG8gdGhhdCB3b3Jrc3BhY2UgZWFjaCB0aW1lLgorICAgKiAoT24gODB4ODYsIHRoZSB3b3Jrc3BhY2UgaXMgRkFSIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IHJlYWxseSB2ZXJ5IGJpZzsKKyAgICogdGhpcyBpcyB0byBrZWVwIHRoZSBtb2R1bGUgaW50ZXJmYWNlcyB1bmNoYW5nZWQgd2hlbiBhIGxhcmdlIGNvZWZmaWNpZW50CisgICAqIGJ1ZmZlciBpcyBuZWNlc3NhcnkuKQorICAgKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB0aGlzIGFycmF5IHBvaW50cyB0byB0aGUgY3VycmVudCBNQ1UncyBibG9ja3MKKyAgICogd2l0aGluIHRoZSB2aXJ0dWFsIGFycmF5czsgaXQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBpbnB1dCBzaWRlLgorICAgKi8KKyAgSkJMT0NLUk9XIE1DVV9idWZmZXJbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgLyogSW4gbXVsdGktcGFzcyBtb2Rlcywgd2UgbmVlZCBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICBqdmlydF9iYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKKyNlbmRpZgorCisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICAvKiBXaGVuIGRvaW5nIGJsb2NrIHNtb290aGluZywgd2UgbGF0Y2ggY29lZmZpY2llbnQgQWwgdmFsdWVzIGhlcmUgKi8KKyAgaW50ICogY29lZl9iaXRzX2xhdGNoOworI2RlZmluZSBTQVZFRF9DT0VGUyAgNgkJLyogd2Ugc2F2ZSBjb2VmX2JpdHNbMC4uNV0gKi8KKyNlbmRpZgorfSBteV9jb2VmX2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfY29lZl9jb250cm9sbGVyICogbXlfY29lZl9wdHI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX29uZXBhc3MKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19kYXRhCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKKyNlbmRpZgorI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKK0xPQ0FMKGJvb2xlYW4pIHNtb290aGluZ19vayBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK01FVEhPRERFRihpbnQpIGRlY29tcHJlc3Nfc21vb3RoX2RhdGEKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOworI2VuZGlmCisKKworTE9DQUwodm9pZCkKK3N0YXJ0X2lNQ1Vfcm93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKGlucHV0IHNpZGUpICovCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCisgICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCisgICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgeworICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7CisgICAgZWxzZQorICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKKyAgfQorCisgIGNvZWYtPk1DVV9jdHIgPSAwOworICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiBpbnB1dCBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGFuIG91dHB1dCBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIC8qIElmIG11bHRpcGFzcywgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdG8gdXNlIGJsb2NrIHNtb290aGluZyBvbiB0aGlzIHBhc3MgKi8KKyAgaWYgKGNvZWYtPnB1Yi5jb2VmX2FycmF5cyAhPSBOVUxMKSB7CisgICAgaWYgKGNpbmZvLT5kb19ibG9ja19zbW9vdGhpbmcgJiYgc21vb3RoaW5nX29rKGNpbmZvKSkKKyAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX3Ntb290aF9kYXRhOworICAgIGVsc2UKKyAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX2RhdGE7CisgIH0KKyNlbmRpZgorICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID0gMDsKK30KKworCisvKgorICogRGVjb21wcmVzcyBhbmQgcmV0dXJuIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KKyAqIEFsd2F5cyBhdHRlbXB0cyB0byBlbWl0IG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KS4KKyAqIElucHV0IGFuZCBvdXRwdXQgbXVzdCBydW4gaW4gbG9ja3N0ZXAgc2luY2Ugd2UgaGF2ZSBvbmx5IGEgb25lLU1DVSBidWZmZXIuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqCisgKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZSwKKyAqIHdoaWNoIHdlIGluZGV4IGFjY29yZGluZyB0byB0aGUgY29tcG9uZW50J3MgU09GIHBvc2l0aW9uLgorICovCisKK01FVEhPRERFRihpbnQpCitkZWNvbXByZXNzX29uZXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQsIHVzZWZ1bF93aWR0aDsKKyAgSlNBTVBBUlJBWSBvdXRwdXRfcHRyOworICBKRElNRU5TSU9OIHN0YXJ0X2NvbCwgb3V0cHV0X2NvbDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKKworICAvKiBMb29wIHRvIHByb2Nlc3MgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIFRyeSB0byBmZXRjaCBhbiBNQ1UuICBFbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLiAqLworICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyWzBdLAorCQkoc2l6ZV90KSAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSkpOworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICB9CisgICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCisgICAgICAgKiBXZSBza2lwIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyAoYnV0IGJsa24gZ2V0cworICAgICAgICogaW5jcmVtZW50ZWQgcGFzdCB0aGVtISkuICBOb3RlIHRoZSBpbm5lciBsb29wIHJlbGllcyBvbiBoYXZpbmcKKyAgICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCisgICAgICAgKi8KKyAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwkvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKwlpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisJICBibGtuICs9IGNvbXBwdHItPk1DVV9ibG9ja3M7CisJICBjb250aW51ZTsKKwl9CisJaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKwl1c2VmdWxfd2lkdGggPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCisJCQkJCQkgICAgOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdICsKKwkgIHlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93IHx8CisJICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKKwkgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2NvbDsKKwkgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCB1c2VmdWxfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgICAgKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLAorCQkJICAgICAgKEpDT0VGUFRSKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24reGluZGV4XSwKKwkJCSAgICAgIG91dHB1dF9wdHIsIG91dHB1dF9jb2wpOworCSAgICAgIG91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworCSAgICB9CisJICB9CisJICBibGtuICs9IGNvbXBwdHItPk1DVV93aWR0aDsKKwkgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPk1DVV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3crKzsKKyAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKworLyoKKyAqIER1bW15IGNvbnN1bWUtaW5wdXQgcm91dGluZSBmb3Igc2luZ2xlLXBhc3Mgb3BlcmF0aW9uLgorICovCisKK01FVEhPRERFRihpbnQpCitkdW1teV9jb25zdW1lX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsJLyogQWx3YXlzIGluZGljYXRlIG5vdGhpbmcgd2FzIGRvbmUgKi8KK30KKworCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKKy8qCisgKiBDb25zdW1lIGlucHV0IGRhdGEgYW5kIHN0b3JlIGl0IGluIHRoZSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlci4KKyAqIFdlIHJlYWQgYXMgbXVjaCBhcyBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykgcGVyIGNhbGwsCisgKiBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgorICovCisKK01FVEhPRERFRihpbnQpCitjb25zdW1lX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7CisgIEpESU1FTlNJT04gc3RhcnRfY29sOworICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAvKiBOb3RlOiBlbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLAorICAgICAqIGJ1dCB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGUgbWVtb3J5IG1hbmFnZXIKKyAgICAgKiBiZWNhdXNlIHdlIHJlcXVlc3RlZCBhIHByZS16ZXJvZWQgYXJyYXkuCisgICAgICovCisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+TUNVX2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKKwkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgeworCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9CisJfQorICAgICAgfQorICAgICAgLyogVHJ5IHRvIGZldGNoIHRoZSBNQ1UuICovCisgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisJY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOworCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPk1DVV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGlmICgrKyhjaW5mby0+aW5wdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgc2NhbiAqLworICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7CisgIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOworfQorCisKKy8qCisgKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBtdWx0aS1wYXNzIGNhc2UuCisgKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqCisgKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgSkRJTUVOU0lPTiBibG9ja19udW07CisgIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKKworICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLworICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDwgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciB8fAorCSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKKwkgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8PSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICB9CisKKyAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQorICAgICAgY29udGludWU7CisgICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KKyAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorICAgICAgIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KQorICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZWxzZSB7CisgICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlOyBpdCBpcyBpbnB1dC1zaWRlLWRlcGVuZGVudCEgKi8KKyAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgfQorICAgIGludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NpXTsKKyAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZltjaV07CisgICAgLyogTG9vcCBvdmVyIGFsbCBEQ1QgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZC4gKi8KKyAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7CisgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2Jsb2NrX3Jvd107CisgICAgICBvdXRwdXRfY29sID0gMDsKKyAgICAgIGZvciAoYmxvY2tfbnVtID0gMDsgYmxvY2tfbnVtIDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBibG9ja19udW0rKykgeworCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSBidWZmZXJfcHRyLAorCQkJb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7CisJYnVmZmVyX3B0cisrOworCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgfQorICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgfQorICB9CisKKyAgaWYgKCsrKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKKyAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOworICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKK30KKworI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLworCisKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisKKy8qCisgKiBUaGlzIGNvZGUgYXBwbGllcyBpbnRlcmJsb2NrIHNtb290aGluZyBhcyBkZXNjcmliZWQgYnkgc2VjdGlvbiBLLjgKKyAqIG9mIHRoZSBKUEVHIHN0YW5kYXJkOiB0aGUgZmlyc3QgNSBBQyBjb2VmZmljaWVudHMgYXJlIGVzdGltYXRlZCBmcm9tCisgKiB0aGUgREMgdmFsdWVzIG9mIGEgRENUIGJsb2NrIGFuZCBpdHMgOCBuZWlnaGJvcmluZyBibG9ja3MuCisgKiBXZSBhcHBseSBzbW9vdGhpbmcgb25seSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRyBkZWNvZGluZywgYW5kIG9ubHkgaWYKKyAqIHRoZSBjb2VmZmljaWVudHMgaXQgY2FuIGVzdGltYXRlIGFyZSBub3QgeWV0IGtub3duIHRvIGZ1bGwgcHJlY2lzaW9uLgorICovCisKKy8qIE5hdHVyYWwtb3JkZXIgYXJyYXkgcG9zaXRpb25zIG9mIHRoZSBmaXJzdCA1IHppZ3phZy1vcmRlciBjb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgUTAxX1BPUyAgMQorI2RlZmluZSBRMTBfUE9TICA4CisjZGVmaW5lIFEyMF9QT1MgIDE2CisjZGVmaW5lIFExMV9QT1MgIDkKKyNkZWZpbmUgUTAyX1BPUyAgMgorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpY2FibGUgYW5kIHNhZmUuCisgKiBXZSBhbHNvIGxhdGNoIHRoZSBjdXJyZW50IHN0YXRlcyBvZiB0aGUgY29lZl9iaXRzW10gZW50cmllcyBmb3IgdGhlCisgKiBBQyBjb2VmZmljaWVudHM7IG90aGVyd2lzZSwgaWYgdGhlIGlucHV0IHNpZGUgb2YgdGhlIGRlY29tcHJlc3NvcgorICogYWR2YW5jZXMgaW50byBhIG5ldyBzY2FuLCB3ZSBtaWdodCB0aGluayB0aGUgY29lZmZpY2llbnRzIGFyZSBrbm93bgorICogbW9yZSBhY2N1cmF0ZWx5IHRoYW4gdGhleSByZWFsbHkgYXJlLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCitzbW9vdGhpbmdfb2sgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBib29sZWFuIHNtb290aGluZ191c2VmdWwgPSBGQUxTRTsKKyAgaW50IGNpLCBjb2VmaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0YWJsZTsKKyAgaW50ICogY29lZl9iaXRzOworICBpbnQgKiBjb2VmX2JpdHNfbGF0Y2g7CisKKyAgaWYgKCEgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwgY2luZm8tPmNvZWZfYml0cyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBBbGxvY2F0ZSBsYXRjaCBhcmVhIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKyAgaWYgKGNvZWYtPmNvZWZfYml0c19sYXRjaCA9PSBOVUxMKQorICAgIGNvZWYtPmNvZWZfYml0c19sYXRjaCA9IChpbnQgKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBjaW5mby0+bnVtX2NvbXBvbmVudHMgKgorCQkJCSAgKFNBVkVEX0NPRUZTICogU0laRU9GKGludCkpKTsKKyAgY29lZl9iaXRzX2xhdGNoID0gY29lZi0+Y29lZl9iaXRzX2xhdGNoOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsIGNvbXBvbmVudHMnIHF1YW50aXphdGlvbiB2YWx1ZXMgbXVzdCBhbHJlYWR5IGJlIGxhdGNoZWQuICovCisgICAgaWYgKChxdGFibGUgPSBjb21wcHRyLT5xdWFudF90YWJsZSkgPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBWZXJpZnkgREMgJiBmaXJzdCA1IEFDIHF1YW50aXplcnMgYXJlIG5vbnplcm8gdG8gYXZvaWQgemVyby1kaXZpZGUuICovCisgICAgaWYgKHF0YWJsZS0+cXVhbnR2YWxbMF0gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTAxX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTEwX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTIwX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTExX1BPU10gPT0gMCB8fAorCXF0YWJsZS0+cXVhbnR2YWxbUTAyX1BPU10gPT0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBEQyB2YWx1ZXMgbXVzdCBiZSBhdCBsZWFzdCBwYXJ0bHkga25vd24gZm9yIGFsbCBjb21wb25lbnRzLiAqLworICAgIGNvZWZfYml0cyA9IGNpbmZvLT5jb2VmX2JpdHNbY2ldOworICAgIGlmIChjb2VmX2JpdHNbMF0gPCAwKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIC8qIEJsb2NrIHNtb290aGluZyBpcyBoZWxwZnVsIGlmIHNvbWUgQUMgY29lZmZpY2llbnRzIHJlbWFpbiBpbmFjY3VyYXRlLiAqLworICAgIGZvciAoY29lZmkgPSAxOyBjb2VmaSA8PSA1OyBjb2VmaSsrKSB7CisgICAgICBjb2VmX2JpdHNfbGF0Y2hbY29lZmldID0gY29lZl9iaXRzW2NvZWZpXTsKKyAgICAgIGlmIChjb2VmX2JpdHNbY29lZmldICE9IDApCisJc21vb3RoaW5nX3VzZWZ1bCA9IFRSVUU7CisgICAgfQorICAgIGNvZWZfYml0c19sYXRjaCArPSBTQVZFRF9DT0VGUzsKKyAgfQorCisgIHJldHVybiBzbW9vdGhpbmdfdXNlZnVsOworfQorCisKKy8qCisgKiBWYXJpYW50IG9mIGRlY29tcHJlc3NfZGF0YSBmb3IgdXNlIHdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLgorICovCisKK01FVEhPRERFRihpbnQpCitkZWNvbXByZXNzX3Ntb290aF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgSkRJTUVOU0lPTiBibG9ja19udW0sIGxhc3RfYmxvY2tfY29sdW1uOworICBpbnQgY2ksIGJsb2NrX3JvdywgYmxvY2tfcm93cywgYWNjZXNzX3Jvd3M7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHIsIHByZXZfYmxvY2tfcm93LCBuZXh0X2Jsb2NrX3JvdzsKKyAgSlNBTVBBUlJBWSBvdXRwdXRfcHRyOworICBKRElNRU5TSU9OIG91dHB1dF9jb2w7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7CisgIGJvb2xlYW4gZmlyc3Rfcm93LCBsYXN0X3JvdzsKKyAgSkJMT0NLIHdvcmtzcGFjZTsKKyAgaW50ICpjb2VmX2JpdHM7CisgIEpRVUFOVF9UQkwgKnF1YW50dGJsOworICBJTlQzMiBRMDAsUTAxLFEwMixRMTAsUTExLFEyMCwgbnVtOworICBpbnQgREMxLERDMixEQzMsREM0LERDNSxEQzYsREM3LERDOCxEQzk7CisgIGludCBBbCwgcHJlZDsKKworICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLworICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDw9IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKKwkgISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7CisgICAgaWYgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyKSB7CisgICAgICAvKiBJZiBpbnB1dCBpcyB3b3JraW5nIG9uIGN1cnJlbnQgc2Nhbiwgd2Ugb3JkaW5hcmlseSB3YW50IGl0IHRvCisgICAgICAgKiBoYXZlIGNvbXBsZXRlZCB0aGUgY3VycmVudCByb3cuICBCdXQgaWYgaW5wdXQgc2NhbiBpcyBEQywKKyAgICAgICAqIHdlIHdhbnQgaXQgdG8ga2VlcCBvbmUgcm93IGFoZWFkIHNvIHRoYXQgbmV4dCBibG9jayByb3cncyBEQworICAgICAgICogdmFsdWVzIGFyZSB1cCB0byBkYXRlLgorICAgICAgICovCisgICAgICBKRElNRU5TSU9OIGRlbHRhID0gKGNpbmZvLT5TcyA9PSAwKSA/IDEgOiAwOworICAgICAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA+IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3crZGVsdGEpCisJYnJlYWs7CisgICAgfQorICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICB9CisKKyAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQorICAgICAgY29udGludWU7CisgICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KSB7CisgICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93cyAqIDI7IC8qIHRoaXMgYW5kIG5leHQgaU1DVSByb3cgKi8KKyAgICAgIGxhc3Rfcm93ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmU7IGl0IGlzIGlucHV0LXNpZGUtZGVwZW5kZW50ISAqLworICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93czsgLyogdGhpcyBpTUNVIHJvdyBvbmx5ICovCisgICAgICBsYXN0X3JvdyA9IFRSVUU7CisgICAgfQorICAgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPiAwKSB7CisgICAgICBhY2Nlc3Nfcm93cyArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyAvKiBwcmlvciBpTUNVIHJvdyB0b28gKi8KKyAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorCSAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyAtIDEpICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7CisgICAgICBidWZmZXIgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsJLyogcG9pbnQgdG8gY3VycmVudCBpTUNVIHJvdyAqLworICAgICAgZmlyc3Rfcm93ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorCSAoSkRJTUVOU0lPTikgMCwgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7CisgICAgICBmaXJzdF9yb3cgPSBUUlVFOworICAgIH0KKyAgICAvKiBGZXRjaCBjb21wb25lbnQtZGVwZW5kZW50IGluZm8gKi8KKyAgICBjb2VmX2JpdHMgPSBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggKyAoY2kgKiBTQVZFRF9DT0VGUyk7CisgICAgcXVhbnR0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKKyAgICBRMDAgPSBxdWFudHRibC0+cXVhbnR2YWxbMF07CisgICAgUTAxID0gcXVhbnR0YmwtPnF1YW50dmFsW1EwMV9QT1NdOworICAgIFExMCA9IHF1YW50dGJsLT5xdWFudHZhbFtRMTBfUE9TXTsKKyAgICBRMjAgPSBxdWFudHRibC0+cXVhbnR2YWxbUTIwX1BPU107CisgICAgUTExID0gcXVhbnR0YmwtPnF1YW50dmFsW1ExMV9QT1NdOworICAgIFEwMiA9IHF1YW50dGJsLT5xdWFudHZhbFtRMDJfUE9TXTsKKyAgICBpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjaV07CisgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY2ldOworICAgIC8qIExvb3Agb3ZlciBhbGwgRENUIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQuICovCisgICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgeworICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltibG9ja19yb3ddOworICAgICAgaWYgKGZpcnN0X3JvdyAmJiBibG9ja19yb3cgPT0gMCkKKwlwcmV2X2Jsb2NrX3JvdyA9IGJ1ZmZlcl9wdHI7CisgICAgICBlbHNlCisJcHJldl9ibG9ja19yb3cgPSBidWZmZXJbYmxvY2tfcm93LTFdOworICAgICAgaWYgKGxhc3Rfcm93ICYmIGJsb2NrX3JvdyA9PSBibG9ja19yb3dzLTEpCisJbmV4dF9ibG9ja19yb3cgPSBidWZmZXJfcHRyOworICAgICAgZWxzZQorCW5leHRfYmxvY2tfcm93ID0gYnVmZmVyW2Jsb2NrX3JvdysxXTsKKyAgICAgIC8qIFdlIGZldGNoIHRoZSBzdXJyb3VuZGluZyBEQyB2YWx1ZXMgdXNpbmcgYSBzbGlkaW5nLXJlZ2lzdGVyIGFwcHJvYWNoLgorICAgICAgICogSW5pdGlhbGl6ZSBhbGwgbmluZSBoZXJlIHNvIGFzIHRvIGRvIHRoZSByaWdodCB0aGluZyBvbiBuYXJyb3cgcGljcy4KKyAgICAgICAqLworICAgICAgREMxID0gREMyID0gREMzID0gKGludCkgcHJldl9ibG9ja19yb3dbMF1bMF07CisgICAgICBEQzQgPSBEQzUgPSBEQzYgPSAoaW50KSBidWZmZXJfcHRyWzBdWzBdOworICAgICAgREM3ID0gREM4ID0gREM5ID0gKGludCkgbmV4dF9ibG9ja19yb3dbMF1bMF07CisgICAgICBvdXRwdXRfY29sID0gMDsKKyAgICAgIGxhc3RfYmxvY2tfY29sdW1uID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzIC0gMTsKKyAgICAgIGZvciAoYmxvY2tfbnVtID0gMDsgYmxvY2tfbnVtIDw9IGxhc3RfYmxvY2tfY29sdW1uOyBibG9ja19udW0rKykgeworCS8qIEZldGNoIGN1cnJlbnQgRENUIGJsb2NrIGludG8gd29ya3NwYWNlIHNvIHdlIGNhbiBtb2RpZnkgaXQuICovCisJamNvcHlfYmxvY2tfcm93KGJ1ZmZlcl9wdHIsIChKQkxPQ0tST1cpIHdvcmtzcGFjZSwgKEpESU1FTlNJT04pIDEpOworCS8qIFVwZGF0ZSBEQyB2YWx1ZXMgKi8KKwlpZiAoYmxvY2tfbnVtIDwgbGFzdF9ibG9ja19jb2x1bW4pIHsKKwkgIERDMyA9IChpbnQpIHByZXZfYmxvY2tfcm93WzFdWzBdOworCSAgREM2ID0gKGludCkgYnVmZmVyX3B0clsxXVswXTsKKwkgIERDOSA9IChpbnQpIG5leHRfYmxvY2tfcm93WzFdWzBdOworCX0KKwkvKiBDb21wdXRlIGNvZWZmaWNpZW50IGVzdGltYXRlcyBwZXIgSy44LgorCSAqIEFuIGVzdGltYXRlIGlzIGFwcGxpZWQgb25seSBpZiBjb2VmZmljaWVudCBpcyBzdGlsbCB6ZXJvLAorCSAqIGFuZCBpcyBub3Qga25vd24gdG8gYmUgZnVsbHkgYWNjdXJhdGUuCisJICovCisJLyogQUMwMSAqLworCWlmICgoQWw9Y29lZl9iaXRzWzFdKSAhPSAwICYmIHdvcmtzcGFjZVsxXSA9PSAwKSB7CisJICBudW0gPSAzNiAqIFEwMCAqIChEQzQgLSBEQzYpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpICsgbnVtKSAvIChRMDE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpIC0gbnVtKSAvIChRMDE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzFdID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBBQzEwICovCisJaWYgKChBbD1jb2VmX2JpdHNbMl0pICE9IDAgJiYgd29ya3NwYWNlWzhdID09IDApIHsKKwkgIG51bSA9IDM2ICogUTAwICogKERDMiAtIERDOCk7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgKyBudW0pIC8gKFExMDw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgLSBudW0pIC8gKFExMDw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbOF0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIEFDMjAgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1szXSkgIT0gMCAmJiB3b3Jrc3BhY2VbMTZdID09IDApIHsKKwkgIG51bSA9IDkgKiBRMDAgKiAoREMyICsgREM4IC0gMipEQzUpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpICsgbnVtKSAvIChRMjA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpIC0gbnVtKSAvIChRMjA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzE2XSA9IChKQ09FRikgcHJlZDsKKwl9CisJLyogQUMxMSAqLworCWlmICgoQWw9Y29lZl9iaXRzWzRdKSAhPSAwICYmIHdvcmtzcGFjZVs5XSA9PSAwKSB7CisJICBudW0gPSA1ICogUTAwICogKERDMSAtIERDMyAtIERDNyArIERDOSk7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgKyBudW0pIC8gKFExMTw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgLSBudW0pIC8gKFExMTw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbOV0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIEFDMDIgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1s1XSkgIT0gMCAmJiB3b3Jrc3BhY2VbMl0gPT0gMCkgeworCSAgbnVtID0gOSAqIFEwMCAqIChEQzQgKyBEQzYgLSAyKkRDNSk7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgKyBudW0pIC8gKFEwMjw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgLSBudW0pIC8gKFEwMjw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbMl0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIE9LLCBkbyB0aGUgSURDVCAqLworCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSB3b3Jrc3BhY2UsCisJCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKKwkvKiBBZHZhbmNlIGZvciBuZXh0IGNvbHVtbiAqLworCURDMSA9IERDMjsgREMyID0gREMzOworCURDNCA9IERDNTsgREM1ID0gREM2OworCURDNyA9IERDODsgREM4ID0gREM5OworCWJ1ZmZlcl9wdHIrKywgcHJldl9ibG9ja19yb3crKywgbmV4dF9ibG9ja19yb3crKzsKKwlvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIH0KKyAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIH0KKyAgfQorCisgIGlmICgrKyhjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCisgICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKyNlbmRpZiAvKiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9kX2NvZWZfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9jb2VmX3B0ciBjb2VmOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKKyAgY29lZi0+cHViLnN0YXJ0X291dHB1dF9wYXNzID0gc3RhcnRfb3V0cHV0X3Bhc3M7CisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPSBOVUxMOworI2VuZGlmCisKKyAgLyogQ3JlYXRlIHRoZSBjb2VmZmljaWVudCBidWZmZXIuICovCisgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7CisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLworICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCisgICAgLyogTm90ZSB3ZSBhc2sgZm9yIGEgcHJlLXplcm9lZCBhcnJheS4gKi8KKyAgICBpbnQgY2ksIGFjY2Vzc19yb3dzOworICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIGFjY2Vzc19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisgICAgICAvKiBJZiBibG9jayBzbW9vdGhpbmcgY291bGQgYmUgdXNlZCwgbmVlZCBhIGJpZ2dlciB3aW5kb3cgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKwlhY2Nlc3Nfcm93cyAqPSAzOworI2VuZGlmCisgICAgICBjb2VmLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgVFJVRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cyk7CisgICAgfQorICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBjb25zdW1lX2RhdGE7CisgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3NfZGF0YTsKKyAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBjb2VmLT53aG9sZV9pbWFnZTsgLyogbGluayB0byB2aXJ0dWFsIGFycmF5cyAqLworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvKiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUtTUNVIGJ1ZmZlci4gKi8KKyAgICBKQkxPQ0tST1cgYnVmZmVyOworICAgIGludCBpOworCisgICAgYnVmZmVyID0gKEpCTE9DS1JPVykKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBEX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICAgIGZvciAoaSA9IDA7IGkgPCBEX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKKyAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOworICAgIH0KKyAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gZHVtbXlfY29uc3VtZV9kYXRhOworICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX29uZXBhc3M7CisgICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KKyAgfQorfQpkaWZmIC0tZ2l0IGEvamRjb2xvci5jIGIvamRjb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMjM2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGNvbG9yLmMKQEAgLTAsMCArMSw4ODEgQEAKKy8qCisgKiBqZGNvbG9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCisgIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLworICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLworICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLworfSBteV9jb2xvcl9kZWNvbnZlcnRlcjsKKwordHlwZWRlZiBteV9jb2xvcl9kZWNvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKKworCisjaWZkZWYgQU5EUk9JRF9SR0IKKworLyogRGVjbGFyYXRpb25zIGZvciBvcmRlcmVkIGRpdGhlcmluZy4KKyAqIAorICogV2UgdXNlIDR4NCBvcmRlcmVkIGRpdGhlciBhcnJheSBwYWNrZWQgaW50byAzMiBiaXRzLiBUaGlzIGFycmF5IGlzCisgKiBzdWZmaWNlbnQgZm9yIGRpdGhlcmluZyBSR0JfODg4IHRvIFJHQl81NjUuCisgKi8KKworI2RlZmluZSBESVRIRVJfTUFTSyAgICAgICAgIDB4MworI2RlZmluZSBESVRIRVJfUk9UQVRFKHgpICAgICgoKHgpPDwyNCkgfCAoKCh4KT4+OCkmMHgwMEZGRkZGRikpCitzdGF0aWMgY29uc3QgSU5UMzIgZGl0aGVyX21hdHJpeFs0XSA9IHsKKyAgMHgwMDA4MDIwQSwKKyAgMHgwQzA0MEUwNiwKKyAgMHgwMzBCMDEwOSwKKyAgMHgwRjA3MEQwNQorfTsKKworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKiogWUNiQ3IgLT4gUkdCIGNvbnZlcnNpb246IG1vc3QgY29tbW9uIGNhc2UgKioqKioqKioqKioqKiovCisKKy8qCisgKiBZQ2JDciBpcyBkZWZpbmVkIHBlciBDQ0lSIDYwMS0xLCBleGNlcHQgdGhhdCBDYiBhbmQgQ3IgYXJlCisgKiBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFIHJhdGhlciB0aGFuIC0wLjUgLi4gMC41LgorICogVGhlIGNvbnZlcnNpb24gZXF1YXRpb25zIHRvIGJlIGltcGxlbWVudGVkIGFyZSB0aGVyZWZvcmUKKyAqCVIgPSBZICAgICAgICAgICAgICAgICsgMS40MDIwMCAqIENyCisgKglHID0gWSAtIDAuMzQ0MTQgKiBDYiAtIDAuNzE0MTQgKiBDcgorICoJQiA9IFkgKyAxLjc3MjAwICogQ2IKKyAqIHdoZXJlIENiIGFuZCBDciByZXByZXNlbnQgdGhlIGluY29taW5nIHZhbHVlcyBsZXNzIENFTlRFUkpTQU1QTEUuCisgKiAoVGhlc2UgbnVtYmVycyBhcmUgZGVyaXZlZCBmcm9tIFRJRkYgNi4wIHNlY3Rpb24gMjEsIGRhdGVkIDMtSnVuZS05Mi4pCisgKgorICogVG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgd2UgcmVwcmVzZW50IHRoZSBmcmFjdGlvbmFsIGNvbnN0YW50cworICogYXMgaW50ZWdlcnMgc2NhbGVkIHVwIGJ5IDJeMTYgKGFib3V0IDQgZGlnaXRzIHByZWNpc2lvbik7IHdlIGhhdmUgdG8gZGl2aWRlCisgKiB0aGUgcHJvZHVjdHMgYnkgMl4xNiwgd2l0aCBhcHByb3ByaWF0ZSByb3VuZGluZywgdG8gZ2V0IHRoZSBjb3JyZWN0IGFuc3dlci4KKyAqIE5vdGljZSB0aGF0IFksIGJlaW5nIGFuIGludGVncmFsIGlucHV0LCBkb2VzIG5vdCBjb250cmlidXRlIGFueSBmcmFjdGlvbgorICogc28gaXQgbmVlZCBub3QgcGFydGljaXBhdGUgaW4gdGhlIHJvdW5kaW5nLgorICoKKyAqIEZvciBldmVuIG1vcmUgc3BlZWQsIHdlIGF2b2lkIGRvaW5nIGFueSBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIGlubmVyIGxvb3AKKyAqIGJ5IHByZWNhbGN1bGF0aW5nIHRoZSBjb25zdGFudHMgdGltZXMgQ2IgYW5kIENyIGZvciBhbGwgcG9zc2libGUgdmFsdWVzLgorICogRm9yIDgtYml0IEpTQU1QTEVzIHRoaXMgaXMgdmVyeSByZWFzb25hYmxlIChvbmx5IDI1NiBlbnRyaWVzIHBlciB0YWJsZSk7CisgKiBmb3IgMTItYml0IHNhbXBsZXMgaXQgaXMgc3RpbGwgYWNjZXB0YWJsZS4gIEl0J3Mgbm90IHZlcnkgcmVhc29uYWJsZSBmb3IKKyAqIDE2LWJpdCBzYW1wbGVzLCBidXQgaWYgeW91IHdhbnQgbG9zc2xlc3Mgc3RvcmFnZSB5b3Ugc2hvdWxkbid0IGJlIGNoYW5naW5nCisgKiBjb2xvcnNwYWNlIGFueXdheS4KKyAqIFRoZSBDcj0+UiBhbmQgQ2I9PkIgdmFsdWVzIGNhbiBiZSByb3VuZGVkIHRvIGludGVnZXJzIGluIGFkdmFuY2U7IHRoZQorICogdmFsdWVzIGZvciB0aGUgRyBjYWxjdWxhdGlvbiBhcmUgbGVmdCBzY2FsZWQgdXAsIHNpbmNlIHdlIG11c3QgYWRkIHRoZW0KKyAqIHRvZ2V0aGVyIGJlZm9yZSByb3VuZGluZy4KKyAqLworCisjZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLworI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKworLyoKKyAqIEluaXRpYWxpemUgdGFibGVzIGZvciBZQ0MtPlJHQiBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCisgKi8KKworTE9DQUwodm9pZCkKK2J1aWxkX3ljY19yZ2JfdGFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgaW50IGk7CisgIElOVDMyIHg7CisgIFNISUZUX1RFTVBTCisKKyAgY2NvbnZlcnQtPkNyX3JfdGFiID0gKGludCAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOworICBjY29udmVydC0+Q2JfYl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7CisgIGNjb252ZXJ0LT5Dcl9nX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7CisgIGNjb252ZXJ0LT5DYl9nX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7CisKKyAgZm9yIChpID0gMCwgeCA9IC1DRU5URVJKU0FNUExFOyBpIDw9IE1BWEpTQU1QTEU7IGkrKywgeCsrKSB7CisgICAgLyogaSBpcyB0aGUgYWN0dWFsIGlucHV0IHBpeGVsIHZhbHVlLCBpbiB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSAqLworICAgIC8qIFRoZSBDYiBvciBDciB2YWx1ZSB3ZSBhcmUgdGhpbmtpbmcgb2YgaXMgeCA9IGkgLSBDRU5URVJKU0FNUExFICovCisgICAgLyogQ3I9PlIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS40MDIwMCAqIHggKi8KKyAgICBjY29udmVydC0+Q3Jfcl90YWJbaV0gPSAoaW50KQorICAgICAgICAgICAgICAgICAgICBSSUdIVF9TSElGVChGSVgoMS40MDIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7CisgICAgLyogQ2I9PkIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS43NzIwMCAqIHggKi8KKyAgICBjY29udmVydC0+Q2JfYl90YWJbaV0gPSAoaW50KQorICAgICAgICAgICAgICAgICAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7CisgICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLworICAgIGNjb252ZXJ0LT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OworICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KKyAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KKyAgICBjY29udmVydC0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOworICB9Cit9CisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgY29sb3JzcGFjZS4KKyAqCisgKiBOb3RlIHRoYXQgd2UgY2hhbmdlIGZyb20gbm9uaW50ZXJsZWF2ZWQsIG9uZS1wbGFuZS1wZXItY29tcG9uZW50IGZvcm1hdAorICogdG8gaW50ZXJsZWF2ZWQtcGl4ZWwgZm9ybWF0LiAgVGhlIG91dHB1dCBidWZmZXIgaXMgdGhlcmVmb3JlIHRocmVlIHRpbWVzCisgKiBhcyB3aWRlIGFzIHRoZSBpbnB1dCBidWZmZXIuCisgKiBBIHN0YXJ0aW5nIHJvdyBvZmZzZXQgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlIGlucHV0IGJ1ZmZlci4gIFRoZSBjYWxsZXIKKyAqIGNhbiBlYXNpbHkgYWRqdXN0IHRoZSBwYXNzZWQgb3V0cHV0X2J1ZiB2YWx1ZSB0byBhY2NvbW1vZGF0ZSBhbnkgcm93CisgKiBvZmZzZXQgcmVxdWlyZWQgb24gdGhhdCBzaWRlLgorICovCisKK01FVEhPRERFRih2b2lkKQoreWNjX3JnYl9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOworICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgeSAgPSBHRVRKU0FNUExFKGlucHRyMFtjb2xdKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRShpbnB0cjFbY29sXSk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoaW5wdHIyW2NvbF0pOworICAgICAgLyogUmFuZ2UtbGltaXRpbmcgaXMgZXNzZW50aWFsIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IERDVCBsb3NzZXMuICovCisgICAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKKyAgICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVCSVRTKSldOworICAgICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB9CisgIH0KK30KKworI2lmZGVmIEFORFJPSURfUkdCCitNRVRIT0RERUYodm9pZCkKK3ljY19yZ2JhXzg4ODhfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKKyAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOworICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKKyAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLworICAgICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07CisgICAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFQklUUykpXTsKKyAgICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIENiYnRhYltjYl1dOworICAgICAgb3V0cHRyW1JHQl9BTFBIQV0gPSAgMHhGRjsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgfQorfQorCitNRVRIT0RERUYodm9pZCkKK3ljY19yZ2JfNTY1X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7CisgIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBJTlQzMiByZ2I7CisgICAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICAKKyAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7CisgICAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICAgIHIgPSByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07CisgICAgICAgIGcgPSByYW5nZV9saW1pdFt5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKV07CisgICAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgICAgICBvdXRwdHIgKz0gMjsKKyAgICAgICAgbnVtX2NvbHMtLTsKKyAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgeworICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKKyAgICAgIGcgPSByYW5nZV9saW1pdFt5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKV07CisgICAgICBiID0gcmFuZ2VfbGltaXRbeSArIENiYnRhYltjYl1dOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworCisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOworICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKKyAgICAgIGcgPSByYW5nZV9saW1pdFt5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKV07CisgICAgICBiID0gcmFuZ2VfbGltaXRbeSArIENiYnRhYltjYl1dOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorCitNRVRIT0RERUYodm9pZCkKK3ljY19yZ2JfNTY1RF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOworICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKKyAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIElOVDMyIHJnYjsKKyAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgQ3JydGFiW2NyXSwgZDApXTsKKyAgICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKKyAgICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgQ2JidGFiW2NiXSwgZDApXTsKKyAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgICAgIG91dHB0ciArPSAyOworICAgICAgICBudW1fY29scy0tOworICAgIH0KKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIENiYnRhYltjYl0sIGQwKV07CisgICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgQ3JydGFiW2NyXSwgZDApXTsKKyAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSksIGQwKV07CisgICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBDYmJ0YWJbY2JdLCBkMCldOworICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICAgIGlmIChudW1fY29scyYxKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIENiYnRhYltjYl0sIGQwKV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgfQorICB9Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKiBDYXNlcyBvdGhlciB0aGFuIFlDYkNyIC0+IFJHQihBKSAqKioqKioqKioqKioqKi8KKworI2lmZGVmIEFORFJPSURfUkdCCitNRVRIT0RERUYodm9pZCkKK3JnYl9yZ2JhXzg4ODhfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgKm91dHB0cisrID0gKmlucHRyMCsrOworICAgICAgKm91dHB0cisrID0gKmlucHRyMSsrOworICAgICAgKm91dHB0cisrID0gKmlucHRyMisrOworICAgICAgKm91dHB0cisrID0gMHhGRjsKKyAgICB9CisgIH0KK30KKworTUVUSE9EREVGKHZvaWQpCityZ2JfcmdiXzU2NV9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBJTlQzMiByZ2I7CisgICAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7CisgICAgICAgIHIgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgICAgIGcgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgICAgICBvdXRwdHIgKz0gMjsKKyAgICAgICAgbnVtX2NvbHMtLTsKKyAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgeworICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGcgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBiID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGcgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBiID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7CisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgICAgaWYgKG51bV9jb2xzJjEpIHsKKyAgICAgIHIgPSBHRVRKU0FNUExFKCppbnB0cjApOworICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgICBiID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICB9CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3JnYl9yZ2JfNTY1RF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgSU5UMzIgcmdiOworICAgIHVuc2lnbmVkIGludCByLCBnLCBiOworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgaWYgKFBBQ0tfTkVFRF9BTElHTk1FTlQob3V0cHRyKSkgeworICAgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKEdFVEpTQU1QTEUoKmlucHRyMCsrKSwgZDApXTsKKyAgICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjErKyksIGQwKV07CisgICAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoR0VUSlNBTVBMRSgqaW5wdHIyKyspLCBkMCldOworICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICAgICAgb3V0cHRyICs9IDI7CisgICAgICAgIG51bV9jb2xzLS07CisgICAgfQorICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKyspLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjErKyksIGQwKV07CisgICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKEdFVEpTQU1QTEUoKmlucHRyMisrKSwgZDApXTsKKyAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKEdFVEpTQU1QTEUoKmlucHRyMCsrKSwgZDApXTsKKyAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coR0VUSlNBTVBMRSgqaW5wdHIxKyspLCBkMCldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQihHRVRKU0FNUExFKCppbnB0cjIrKyksIGQwKV07CisgICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7CisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgICAgaWYgKG51bV9jb2xzJjEpIHsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKSwgZDApXTsKKyAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coR0VUSlNBTVBMRSgqaW5wdHIxKSwgZDApXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoR0VUSlNBTVBMRSgqaW5wdHIyKSwgZDApXTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICB9CisgIH0KK30KKworI2VuZGlmCisKKy8qCisgKiBDb2xvciBjb252ZXJzaW9uIGZvciBubyBjb2xvcnNwYWNlIGNoYW5nZToganVzdCBjb3B5IHRoZSBkYXRhLAorICogY29udmVydGluZyBmcm9tIHNlcGFyYXRlLXBsYW5lcyB0byBpbnRlcmxlYXZlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK251bGxfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7CisgIHJlZ2lzdGVyIGludCBudW1fY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIGludCBjaTsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlucHRyID0gaW5wdXRfYnVmW2NpXVtpbnB1dF9yb3ddOworICAgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXSArIGNpOworICAgICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKwkqb3V0cHRyID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KKwlvdXRwdHIgKz0gbnVtX2NvbXBvbmVudHM7CisgICAgICB9CisgICAgfQorICAgIGlucHV0X3JvdysrOworICAgIG91dHB1dF9idWYrKzsKKyAgfQorfQorCisKKy8qCisgKiBDb2xvciBjb252ZXJzaW9uIGZvciBncmF5c2NhbGU6IGp1c3QgY29weSB0aGUgZGF0YS4KKyAqIFRoaXMgYWxzbyB3b3JrcyBmb3IgWUNiQ3IgLT4gZ3JheXNjYWxlIGNvbnZlcnNpb24sIGluIHdoaWNoCisgKiB3ZSBqdXN0IGNvcHkgdGhlIFkgKGx1bWluYW5jZSkgY29tcG9uZW50IGFuZCBpZ25vcmUgY2hyb21pbmFuY2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitncmF5c2NhbGVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfYnVmWzBdLCAoaW50KSBpbnB1dF9yb3csIG91dHB1dF9idWYsIDAsCisJCSAgICBudW1fcm93cywgY2luZm8tPm91dHB1dF93aWR0aCk7Cit9CisKKworLyoKKyAqIENvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQjoganVzdCBkdXBsaWNhdGUgdGhlIGdyYXlsZXZlbCB0aHJlZSB0aW1lcy4KKyAqIFRoaXMgaXMgcHJvdmlkZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvIGNvcGUKKyAqIHdpdGggZ3JheXNjYWxlIGFzIGEgc2VwYXJhdGUgY2FzZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2dyYXlfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICAvKiBXZSBjYW4gZGlzcGVuc2Ugd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgb3V0cHRyW1JHQl9SRURdID0gb3V0cHRyW1JHQl9HUkVFTl0gPSBvdXRwdHJbUkdCX0JMVUVdID0gaW5wdHJbY29sXTsKKyAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICAgIH0KKyAgfQorfQorCisjaWZkZWYgQU5EUk9JRF9SR0IKK01FVEhPRERFRih2b2lkKQorZ3JheV9yZ2JhXzg4ODhfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93KytdOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIC8qIFdlIGNhbiBkaXNwZW5zZSB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICBvdXRwdHJbUkdCX1JFRF0gPSBvdXRwdHJbUkdCX0dSRUVOXSA9IG91dHB0cltSR0JfQkxVRV0gPSBpbnB0cltjb2xdOworICAgICAgb3V0cHRyW1JHQl9BTFBIQV0gPSAweGZmOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICB9Cit9CisKK01FVEhPRERFRih2b2lkKQorZ3JheV9yZ2JfNTY1X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIElOVDMyIHJnYjsKKyAgICB1bnNpZ25lZCBpbnQgZzsKKyAgICBpbnB0ciA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3crK107CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7CisgICAgICAgIGcgPSAqaW5wdHIrKzsKKyAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7CisgICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICAgICAgb3V0cHRyICs9IDI7CisgICAgICAgIG51bV9jb2xzLS07CisgICAgfQorICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKKyAgICAgIGcgPSAqaW5wdHIrKzsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOworICAgICAgZyA9ICppbnB0cisrOworICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUoZywgZywgZykpOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgZyA9ICppbnB0cjsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorCitNRVRIT0RERUYodm9pZCkKK2dyYXlfcmdiXzU2NURfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIElOVDMyIHJnYjsKKyAgICB1bnNpZ25lZCBpbnQgZzsKKyAgICBpbnB0ciA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3crK107CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7CisgICAgICAgIGcgPSAqaW5wdHIrKzsKKyAgICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihnLCBkMCldOworICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKKyAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgICAgICBvdXRwdHIgKz0gMjsKKyAgICAgICAgbnVtX2NvbHMtLTsKKyAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgeworICAgICAgZyA9ICppbnB0cisrOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihnLCBkMCldOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7CisgICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgICAgZyA9ICppbnB0cisrOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihnLCBkMCldOworICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUoZywgZywgZykpOworICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7CisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgICAgaWYgKG51bV9jb2xzJjEpIHsKKyAgICAgIGcgPSAqaW5wdHI7CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKKyAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKgorICogQWRvYmUtc3R5bGUgWUNDSy0+Q01ZSyBjb252ZXJzaW9uLgorICogV2UgY29udmVydCBZQ2JDciB0byBSPTEtQywgRz0xLU0sIGFuZCBCPTEtWSB1c2luZyB0aGUgc2FtZQorICogY29udmVyc2lvbiBhcyBhYm92ZSwgd2hpbGUgcGFzc2luZyBLIChibGFjaykgdW5jaGFuZ2VkLgorICogV2UgYXNzdW1lIGJ1aWxkX3ljY19yZ2JfdGFibGUgaGFzIGJlZW4gY2FsbGVkLgorICovCisKK01FVEhPRERFRih2b2lkKQoreWNja19jbXlrX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKwkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyLCBpbnB0cjM7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7CisgIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB0cjMgPSBpbnB1dF9idWZbM11baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOworICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7CisgICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KKyAgICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArIENycnRhYltjcl0pXTsgICAvKiByZWQgKi8KKyAgICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArICAgICAgICAgICAgICAgICAvKiBncmVlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFQklUUykpKV07CisgICAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFtNQVhKU0FNUExFIC0gKHkgKyBDYmJ0YWJbY2JdKV07ICAgLyogYmx1ZSAqLworICAgICAgLyogSyBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQgKi8KKyAgICAgIG91dHB0clszXSA9IGlucHRyM1tjb2xdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUgaGVyZSAqLworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfZGNvbG9yIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrIG5lZWRlZCAqLworfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3Igb3V0cHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NvbG9yX2RlY29udmVydGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQ7CisgIGludCBjaTsKKworICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29sb3JfZGVjb252ZXJ0ZXIpKTsKKyAgY2luZm8tPmNjb252ZXJ0ID0gKHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyICopIGNjb252ZXJ0OworICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2Rjb2xvcjsKKworICAvKiBNYWtlIHN1cmUgbnVtX2NvbXBvbmVudHMgYWdyZWVzIHdpdGgganBlZ19jb2xvcl9zcGFjZSAqLworICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICBjYXNlIEpDU19ZQ0NLOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBKQ1NfVU5LTk9XTiBjYW4gYmUgYW55dGhpbmcgKi8KKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzIDwgMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBTZXQgb3V0X2NvbG9yX2NvbXBvbmVudHMgYW5kIGNvbnZlcnNpb24gbWV0aG9kIGJhc2VkIG9uIHJlcXVlc3RlZCBzcGFjZS4KKyAgICogQWxzbyBjbGVhciB0aGUgY29tcG9uZW50X25lZWRlZCBmbGFncyBmb3IgYW55IHVudXNlZCBjb21wb25lbnRzLAorICAgKiBzbyB0aGF0IGVhcmxpZXIgcGlwZWxpbmUgc3RhZ2VzIGNhbiBhdm9pZCB1c2VsZXNzIGNvbXB1dGF0aW9uLgorICAgKi8KKworICBzd2l0Y2ggKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDE7CisgICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUgfHwKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OworICAgICAgLyogRm9yIGNvbG9yLT5ncmF5c2NhbGUgY29udmVyc2lvbiwgb25seSB0aGUgWSAoMCkgY29tcG9uZW50IGlzIG5lZWRlZCAqLworICAgICAgZm9yIChjaSA9IDE7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKQorCWNpbmZvLT5jb21wX2luZm9bY2ldLmNvbXBvbmVudF9uZWVkZWQgPSBGQUxTRTsKKyAgICB9IGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19SR0I6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gUkdCX1BJWEVMU0laRTsKKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiX2NvbnZlcnQ7CisgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiX2NvbnZlcnQ7CisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCICYmIFJHQl9QSVhFTFNJWkUgPT0gMykgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIH0gZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgY2FzZSBKQ1NfUkdCQV84ODg4OgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7CisgICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYmFfODg4OF9jb252ZXJ0OworICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5X3JnYmFfODg4OF9jb252ZXJ0OworICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX3JnYmFfODg4OF9jb252ZXJ0OworICAgIH0gZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQl81NjU6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gUkdCX1BJWEVMU0laRTsKKyAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfTk9ORSkgeworICAgICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiXzU2NV9jb252ZXJ0OworICAgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5X3JnYl81NjVfY29udmVydDsKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiXzU2NV9jb252ZXJ0OworICAgICAgfSBlbHNlCisgICAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogb25seSBvcmRlcmVkIGRpdGhlciBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl81NjVEX2NvbnZlcnQ7CisgICAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiXzU2NURfY29udmVydDsKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiXzU2NURfY29udmVydDsKKyAgICAgIH0gZWxzZQorICAgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgfQorICAgIGJyZWFrOworI2VuZGlmCisgICAgCisgIGNhc2UgSkNTX0NNWUs6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDQ0spIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY2tfY215a19jb252ZXJ0OworICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIH0gZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogUGVybWl0IG51bGwgY29udmVyc2lvbiB0byBzYW1lIG91dHB1dCBzcGFjZSAqLworICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgfSBlbHNlCQkJLyogdW5zdXBwb3J0ZWQgbm9uLW51bGwgY29udmVyc2lvbiAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gMTsgLyogc2luZ2xlIGNvbG9ybWFwcGVkIG91dHB1dCBjb21wb25lbnQgKi8KKyAgZWxzZQorICAgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKK30KZGlmZiAtLWdpdCBhL2pkY3QuaCBiL2pkY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDE5MmEyCi0tLSAvZGV2L251bGwKKysrIGIvamRjdC5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogamRjdC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGluY2x1ZGUgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgZm9yd2FyZCBhbmQKKyAqIGludmVyc2UgRENUIG1vZHVsZXMuICBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIHByaXZhdGUgdG8gdGhlIERDVCBtYW5hZ2VycworICogKGpjZGN0bWdyLmMsIGpkZGN0bWdyLmMpIGFuZCB0aGUgaW5kaXZpZHVhbCBEQ1QgYWxnb3JpdGhtcy4KKyAqIFRoZSBpbmRpdmlkdWFsIERDVCBhbGdvcml0aG1zIGFyZSBrZXB0IGluIHNlcGFyYXRlIGZpbGVzIHRvIGVhc2UgCisgKiBtYWNoaW5lLWRlcGVuZGVudCB0dW5pbmcgKGUuZy4sIGFzc2VtYmx5IGNvZGluZykuCisgKi8KKworCisvKgorICogQSBmb3J3YXJkIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byBhIHdvcmsgYXJlYSBvZiB0eXBlIERDVEVMRU1bXTsKKyAqIHRoZSBEQ1QgaXMgdG8gYmUgcGVyZm9ybWVkIGluLXBsYWNlIGluIHRoYXQgYnVmZmVyLiAgVHlwZSBEQ1RFTEVNIGlzIGludAorICogZm9yIDgtYml0IHNhbXBsZXMsIElOVDMyIGZvciAxMi1iaXQgc2FtcGxlcy4gIChOT1RFOiBGbG9hdGluZy1wb2ludCBEQ1QKKyAqIGltcGxlbWVudGF0aW9ucyB1c2UgYW4gYXJyYXkgb2YgdHlwZSBGQVNUX0ZMT0FULCBpbnN0ZWFkLikKKyAqIFRoZSBEQ1QgaW5wdXRzIGFyZSBleHBlY3RlZCB0byBiZSBzaWduZWQgKHJhbmdlICstQ0VOVEVSSlNBTVBMRSkuCisgKiBUaGUgRENUIG91dHB1dHMgYXJlIHJldHVybmVkIHNjYWxlZCB1cCBieSBhIGZhY3RvciBvZiA4OyB0aGV5IHRoZXJlZm9yZQorICogaGF2ZSBhIHJhbmdlIG9mICstOEsgZm9yIDgtYml0IGRhdGEsICstMTI4SyBmb3IgMTItYml0IGRhdGEuICBUaGlzCisgKiBjb252ZW50aW9uIGltcHJvdmVzIGFjY3VyYWN5IGluIGludGVnZXIgaW1wbGVtZW50YXRpb25zIGFuZCBzYXZlcyBzb21lCisgKiB3b3JrIGluIGZsb2F0aW5nLXBvaW50IG9uZXMuCisgKiBRdWFudGl6YXRpb24gb2YgdGhlIG91dHB1dCBjb2VmZmljaWVudHMgaXMgZG9uZSBieSBqY2RjdG1nci5jLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAordHlwZWRlZiBpbnQgRENURUxFTTsJCS8qIDE2IG9yIDMyIGJpdHMgaXMgZmluZSAqLworI2Vsc2UKK3R5cGVkZWYgSU5UMzIgRENURUxFTTsJCS8qIG11c3QgaGF2ZSAzMiBiaXRzICovCisjZW5kaWYKKwordHlwZWRlZiBKTUVUSE9EKHZvaWQsIGZvcndhcmRfRENUX21ldGhvZF9wdHIsIChEQ1RFTEVNICogZGF0YSkpOwordHlwZWRlZiBKTUVUSE9EKHZvaWQsIGZsb2F0X0RDVF9tZXRob2RfcHRyLCAoRkFTVF9GTE9BVCAqIGRhdGEpKTsKKworCisvKgorICogQW4gaW52ZXJzZSBEQ1Qgcm91dGluZSBpcyBnaXZlbiBhIHBvaW50ZXIgdG8gdGhlIGlucHV0IEpCTE9DSyBhbmQgYSBwb2ludGVyCisgKiB0byBhbiBvdXRwdXQgc2FtcGxlIGFycmF5LiAgVGhlIHJvdXRpbmUgbXVzdCBkZXF1YW50aXplIHRoZSBpbnB1dCBkYXRhIGFzCisgKiB3ZWxsIGFzIHBlcmZvcm0gdGhlIElEQ1Q7IGZvciBkZXF1YW50aXphdGlvbiwgaXQgdXNlcyB0aGUgbXVsdGlwbGllciB0YWJsZQorICogcG9pbnRlZCB0byBieSBjb21wcHRyLT5kY3RfdGFibGUuICBUaGUgb3V0cHV0IGRhdGEgaXMgdG8gYmUgcGxhY2VkIGludG8gdGhlCisgKiBzYW1wbGUgYXJyYXkgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgY29sdW1uLiAgKEFueSByb3cgb2Zmc2V0IG5lZWRlZCB3aWxsCisgKiBiZSBhcHBsaWVkIHRvIHRoZSBhcnJheSBwb2ludGVyIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gdGhlIElEQ1QgY29kZS4pCisgKiBOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIGVtaXR0ZWQgYnkgdGhlIElEQ1Qgcm91dGluZSBpcworICogRENUX3NjYWxlZF9zaXplICogRENUX3NjYWxlZF9zaXplLgorICovCisKKy8qIHR5cGVkZWYgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpcyBkZWNsYXJlZCBpbiBqcGVnaW50LmggKi8KKworLyoKKyAqIEVhY2ggSURDVCByb3V0aW5lIGhhcyBpdHMgb3duIGlkZWFzIGFib3V0IHRoZSBiZXN0IGRjdF90YWJsZSBlbGVtZW50IHR5cGUuCisgKi8KKwordHlwZWRlZiBNVUxUSVBMSUVSIElTTE9XX01VTFRfVFlQRTsgLyogc2hvcnQgb3IgaW50LCB3aGljaGV2ZXIgaXMgZmFzdGVyICovCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKK3R5cGVkZWYgTVVMVElQTElFUiBJRkFTVF9NVUxUX1RZUEU7IC8qIDE2IGJpdHMgaXMgT0ssIHVzZSBzaG9ydCBpZiBmYXN0ZXIgKi8KKyNkZWZpbmUgSUZBU1RfU0NBTEVfQklUUyAgMgkvKiBmcmFjdGlvbmFsIGJpdHMgaW4gc2NhbGUgZmFjdG9ycyAqLworI2Vsc2UKK3R5cGVkZWYgSU5UMzIgSUZBU1RfTVVMVF9UWVBFOwkvKiBuZWVkIDMyIGJpdHMgZm9yIHNjYWxlZCBxdWFudGl6ZXJzICovCisjZGVmaW5lIElGQVNUX1NDQUxFX0JJVFMgIDEzCS8qIGZyYWN0aW9uYWwgYml0cyBpbiBzY2FsZSBmYWN0b3JzICovCisjZW5kaWYKK3R5cGVkZWYgRkFTVF9GTE9BVCBGTE9BVF9NVUxUX1RZUEU7IC8qIHByZWZlcnJlZCBmbG9hdGluZyB0eXBlICovCisKKworLyoKKyAqIEVhY2ggSURDVCByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciByYW5nZS1saW1pdGluZyBpdHMgcmVzdWx0cyBhbmQKKyAqIGNvbnZlcnRpbmcgdGhlbSB0byB1bnNpZ25lZCBmb3JtICgwLi5NQVhKU0FNUExFKS4gIFRoZSByYXcgb3V0cHV0cyBjb3VsZAorICogYmUgcXVpdGUgZmFyIG91dCBvZiByYW5nZSBpZiB0aGUgaW5wdXQgZGF0YSBpcyBjb3JydXB0LCBzbyBhIGJ1bGxldHByb29mCisgKiByYW5nZS1saW1pdGluZyBzdGVwIGlzIHJlcXVpcmVkLiAgV2UgdXNlIGEgbWFzay1hbmQtdGFibGUtbG9va3VwIG1ldGhvZAorICogdG8gZG8gdGhlIGNvbWJpbmVkIG9wZXJhdGlvbnMgcXVpY2tseS4gIFNlZSB0aGUgY29tbWVudHMgd2l0aAorICogcHJlcGFyZV9yYW5nZV9saW1pdF90YWJsZSAoaW4gamRtYXN0ZXIuYykgZm9yIG1vcmUgaW5mby4KKyAqLworCisjZGVmaW5lIElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pICAoKGNpbmZvKS0+c2FtcGxlX3JhbmdlX2xpbWl0ICsgQ0VOVEVSSlNBTVBMRSkKKworI2RlZmluZSBSQU5HRV9NQVNLICAoTUFYSlNBTVBMRSAqIDQgKyAzKSAvKiAyIGJpdHMgd2lkZXIgdGhhbiBsZWdhbCBzYW1wbGVzICovCisKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfZmRjdF9pc2xvdwkJakZEaXNsb3cKKyNkZWZpbmUganBlZ19mZGN0X2lmYXN0CQlqRkRpZmFzdAorI2RlZmluZSBqcGVnX2ZkY3RfZmxvYXQJCWpGRGZsb2F0CisjZGVmaW5lIGpwZWdfaWRjdF9pc2xvdwkJalJEaXNsb3cKKyNkZWZpbmUganBlZ19pZGN0X2lmYXN0CQlqUkRpZmFzdAorI2RlZmluZSBqcGVnX2lkY3RfZmxvYXQJCWpSRGZsb2F0CisjZGVmaW5lIGpwZWdfaWRjdF80eDQJCWpSRDR4NAorI2RlZmluZSBqcGVnX2lkY3RfMngyCQlqUkQyeDIKKyNkZWZpbmUganBlZ19pZGN0XzF4MQkJalJEMXgxCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisvKiBFeHRlcm4gZGVjbGFyYXRpb25zIGZvciB0aGUgZm9yd2FyZCBhbmQgaW52ZXJzZSBEQ1Qgcm91dGluZXMuICovCisKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfaXNsb3cgSlBQKChEQ1RFTEVNICogZGF0YSkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9pZmFzdCBKUFAoKERDVEVMRU0gKiBkYXRhKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0X2Zsb2F0IEpQUCgoRkFTVF9GTE9BVCAqIGRhdGEpKTsKKworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF9pc2xvdworICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0X2lmYXN0CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfZmxvYXQKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF80eDQKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8yeDIKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8xeDEKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworCisKKy8qCisgKiBNYWNyb3MgZm9yIGhhbmRsaW5nIGZpeGVkLXBvaW50IGFyaXRobWV0aWM7IHRoZXNlIGFyZSB1c2VkIGJ5IG1hbnkKKyAqIGJ1dCBub3QgYWxsIG9mIHRoZSBEQ1QvSURDVCBtb2R1bGVzLgorICoKKyAqIEFsbCB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGUgSU5UMzIuCisgKiBGcmFjdGlvbmFsIGNvbnN0YW50cyBhcmUgc2NhbGVkIGxlZnQgYnkgQ09OU1RfQklUUyBiaXRzLgorICogQ09OU1RfQklUUyBpcyBkZWZpbmVkIHdpdGhpbiBlYWNoIG1vZHVsZSB1c2luZyB0aGVzZSBtYWNyb3MsCisgKiBhbmQgbWF5IGRpZmZlciBmcm9tIG9uZSBtb2R1bGUgdG8gdGhlIG5leHQuCisgKi8KKworI2RlZmluZSBPTkUJKChJTlQzMikgMSkKKyNkZWZpbmUgQ09OU1RfU0NBTEUgKE9ORSA8PCBDT05TVF9CSVRTKQorCisvKiBDb252ZXJ0IGEgcG9zaXRpdmUgcmVhbCBjb25zdGFudCB0byBhbiBpbnRlZ2VyIHNjYWxlZCBieSBDT05TVF9TQ0FMRS4KKyAqIENhdXRpb246IHNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwKKyAqIHRodXMgY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKi8KKworI2RlZmluZSBGSVgoeCkJKChJTlQzMikgKCh4KSAqIENPTlNUX1NDQUxFICsgMC41KSkKKworLyogRGVzY2FsZSBhbmQgY29ycmVjdGx5IHJvdW5kIGFuIElOVDMyIHZhbHVlIHRoYXQncyBzY2FsZWQgYnkgTiBiaXRzLgorICogV2UgYXNzdW1lIFJJR0hUX1NISUZUIHJvdW5kcyB0b3dhcmRzIG1pbnVzIGluZmluaXR5LCBzbyBhZGRpbmcKKyAqIHRoZSBmdWRnZSBmYWN0b3IgaXMgY29ycmVjdCBmb3IgZWl0aGVyIHNpZ24gb2YgWC4KKyAqLworCisjZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoKHgpICsgKE9ORSA8PCAoKG4pLTEpKSwgbikKKworLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgorICogVGhpcyBtYWNybyBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgdHdvIGlucHV0cyB3aWxsIGFjdHVhbGx5IGJlIG5vIG1vcmUgdGhhbgorICogMTYgYml0cyB3aWRlLCBzbyB0aGF0IGEgMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEKKyAqIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuICBUaGlzIHByb3ZpZGVzIGEgdXNlZnVsIHNwZWVkdXAgb24gbWFueSBtYWNoaW5lcy4KKyAqIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgYSAxNngxNi0+MzIgbXVsdGlwbHkgcG9ydGFibHkKKyAqIGluIEMsIGJ1dCBzb21lIEMgY29tcGlsZXJzIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIHlvdSBwcm92aWRlIHRoZQorICogY29ycmVjdCBjb21iaW5hdGlvbiBvZiBjYXN0cy4KKyAqLworCisjaWZkZWYgU0hPUlR4U0hPUlRfMzIJCS8qIG1heSB3b3JrIGlmICdpbnQnIGlzIDMyIGJpdHMgKi8KKyNkZWZpbmUgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpICAoKChJTlQxNikgKHZhcikpICogKChJTlQxNikgKGNvbnN0KSkpCisjZW5kaWYKKyNpZmRlZiBTSE9SVHhMQ09OU1RfMzIJCS8qIGtub3duIHRvIHdvcmsgd2l0aCBNaWNyb3NvZnQgQyA2LjAgKi8KKyNkZWZpbmUgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpICAoKChJTlQxNikgKHZhcikpICogKChJTlQzMikgKGNvbnN0KSkpCisjZW5kaWYKKworI2lmbmRlZiBNVUxUSVBMWTE2QzE2CQkvKiBkZWZhdWx0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKy8qIFNhbWUgZXhjZXB0IGJvdGggaW5wdXRzIGFyZSB2YXJpYWJsZXMuICovCisKKyNpZmRlZiBTSE9SVHhTSE9SVF8zMgkJLyogbWF5IHdvcmsgaWYgJ2ludCcgaXMgMzIgYml0cyAqLworI2RlZmluZSBNVUxUSVBMWTE2VjE2KHZhcjEsdmFyMikgICgoKElOVDE2KSAodmFyMSkpICogKChJTlQxNikgKHZhcjIpKSkKKyNlbmRpZgorCisjaWZuZGVmIE1VTFRJUExZMTZWMTYJCS8qIGRlZmF1bHQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBNVUxUSVBMWTE2VjE2KHZhcjEsdmFyMikgICgodmFyMSkgKiAodmFyMikpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2pkZGN0bWdyLmMgYi9qZGRjdG1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjhkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGRjdG1nci5jCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogamRkY3RtZ3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbnZlcnNlLURDVCBtYW5hZ2VtZW50IGxvZ2ljLgorICogVGhpcyBjb2RlIHNlbGVjdHMgYSBwYXJ0aWN1bGFyIElEQ1QgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCwKKyAqIGFuZCBpdCBwZXJmb3JtcyByZWxhdGVkIGhvdXNla2VlcGluZyBjaG9yZXMuICBObyBjb2RlIGluIHRoaXMgZmlsZQorICogaXMgZXhlY3V0ZWQgcGVyIElEQ1Qgc3RlcCwgb25seSBkdXJpbmcgb3V0cHV0IHBhc3Mgc2V0dXAuCisgKgorICogTm90ZSB0aGF0IHRoZSBJRENUIHJvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyBjb2VmZmljaWVudAorICogZGVxdWFudGl6YXRpb24gYXMgd2VsbCBhcyB0aGUgSURDVCBwcm9wZXIuICBUaGlzIG1vZHVsZSBzZXRzIHVwIHRoZQorICogZGVxdWFudGl6YXRpb24gbXVsdGlwbGllciB0YWJsZSBuZWVkZWQgYnkgdGhlIElEQ1Qgcm91dGluZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworCisvKgorICogVGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIChqZGlucHV0LmMpIHNhdmVzIGF3YXkgdGhlIGFwcHJvcHJpYXRlCisgKiBxdWFudGl6YXRpb24gdGFibGUgZm9yIGVhY2ggY29tcG9uZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbgorICogaW52b2x2aW5nIHRoYXQgY29tcG9uZW50LiAgKFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGNvcnJlY3RseQorICogZGVjb2RlIGZpbGVzIHRoYXQgcmV1c2UgUS10YWJsZSBzbG90cy4pCisgKiBXaGVuIHdlIGFyZSByZWFkeSB0byBtYWtlIGFuIG91dHB1dCBwYXNzLCB0aGUgc2F2ZWQgUS10YWJsZSBpcyBjb252ZXJ0ZWQKKyAqIHRvIGEgbXVsdGlwbGllciB0YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBieSB0aGUgSURDVCByb3V0aW5lLgorICogVGhlIG11bHRpcGxpZXIgdGFibGUgY29udGVudHMgYXJlIElEQ1QtbWV0aG9kLWRlcGVuZGVudC4gIFRvIHN1cHBvcnQKKyAqIGFwcGxpY2F0aW9uIGNoYW5nZXMgaW4gSURDVCBtZXRob2QgYmV0d2VlbiBzY2Fucywgd2UgY2FuIHJlbWFrZSB0aGUKKyAqIG11bHRpcGxpZXIgdGFibGVzIGlmIG5lY2Vzc2FyeS4KKyAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBmaXJzdCBvdXRwdXQgcGFzcyBtYXkgb2NjdXIgYmVmb3JlIGFueSBkYXRhCisgKiBoYXMgYmVlbiBzZWVuIGZvciBzb21lIGNvbXBvbmVudHMsIGFuZCB0aHVzIGJlZm9yZSB0aGVpciBRLXRhYmxlcyBoYXZlCisgKiBiZWVuIHNhdmVkIGF3YXkuICBUbyBoYW5kbGUgdGhpcyBjYXNlLCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcHJlc2V0CisgKiB0byB6ZXJvZXM7IHRoZSByZXN1bHQgb2YgdGhlIElEQ1Qgd2lsbCBiZSBhIG5ldXRyYWwgZ3JheSBsZXZlbC4KKyAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIElEQ1QgbWV0aG9kIGNvZGUgdGhhdCBlYWNoIG11bHRpcGxpZXIgdGFibGUKKyAgICogaXMgY3VycmVudGx5IHNldCB1cCBmb3IsIG9yIC0xIGlmIGl0J3Mgbm90IHlldCBzZXQgdXAuCisgICAqIFRoZSBhY3R1YWwgbXVsdGlwbGllciB0YWJsZXMgYXJlIHBvaW50ZWQgdG8gYnkgZGN0X3RhYmxlIGluIHRoZQorICAgKiBwZXItY29tcG9uZW50IGNvbXBfaW5mbyBzdHJ1Y3R1cmVzLgorICAgKi8KKyAgaW50IGN1cl9tZXRob2RbTUFYX0NPTVBPTkVOVFNdOworfSBteV9pZGN0X2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfaWRjdF9jb250cm9sbGVyICogbXlfaWRjdF9wdHI7CisKKworLyogQWxsb2NhdGVkIG11bHRpcGxpZXIgdGFibGVzOiBiaWcgZW5vdWdoIGZvciBhbnkgc3VwcG9ydGVkIHZhcmlhbnQgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgIElTTE9XX01VTFRfVFlQRSBpc2xvd19hcnJheVtEQ1RTSVpFMl07CisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICBJRkFTVF9NVUxUX1RZUEUgaWZhc3RfYXJyYXlbRENUU0laRTJdOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICBGTE9BVF9NVUxUX1RZUEUgZmxvYXRfYXJyYXlbRENUU0laRTJdOworI2VuZGlmCit9IG11bHRpcGxpZXJfdGFibGU7CisKKworLyogVGhlIGN1cnJlbnQgc2NhbGVkLUlEQ1Qgcm91dGluZXMgcmVxdWlyZSBJU0xPVy1zdHlsZSBtdWx0aXBsaWVyIHRhYmxlcywKKyAqIHNvIGJlIHN1cmUgdG8gY29tcGlsZSB0aGF0IGNvZGUgaWYgZWl0aGVyIElTTE9XIG9yIFNDQUxJTkcgaXMgcmVxdWVzdGVkLgorICovCisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorI2RlZmluZSBQUk9WSURFX0lTTE9XX1RBQkxFUworI2Vsc2UKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisjZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBQcmVwYXJlIGZvciBhbiBvdXRwdXQgcGFzcy4KKyAqIEhlcmUgd2Ugc2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciBlYWNoIGNvbXBvbmVudCBhbmQgYnVpbGQKKyAqIGEgbWF0Y2hpbmcgbXVsdGlwbGllciB0YWJsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lkY3RfcHRyIGlkY3QgPSAobXlfaWRjdF9wdHIpIGNpbmZvLT5pZGN0OworICBpbnQgY2ksIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludCBtZXRob2QgPSAwOworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIG1ldGhvZF9wdHIgPSBOVUxMOworICBKUVVBTlRfVEJMICogcXRibDsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIFNlbGVjdCB0aGUgcHJvcGVyIElEQ1Qgcm91dGluZSBmb3IgdGhpcyBjb21wb25lbnQncyBzY2FsaW5nICovCisgICAgc3dpdGNoIChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIHsKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisgICAgY2FzZSAxOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xeDE7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzJ4MjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIERDVFNJWkU6CisgICAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICAgICAgY2FzZSBKRENUX0lTTE9XOgorCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaXNsb3c7CisJbWV0aG9kID0gSkRDVF9JU0xPVzsKKwlicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgICAgIGNhc2UgSkRDVF9JRkFTVDoKKwltZXRob2RfcHRyID0ganBlZ19pZGN0X2lmYXN0OworCW1ldGhvZCA9IEpEQ1RfSUZBU1Q7CisJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgICAgICBjYXNlIEpEQ1RfRkxPQVQ6CisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9mbG9hdDsKKwltZXRob2QgPSBKRENUX0ZMT0FUOworCWJyZWFrOworI2VuZGlmCisgICAgICBkZWZhdWx0OgorCUVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfRENUU0laRSwgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZGN0LT5wdWIuaW52ZXJzZV9EQ1RbY2ldID0gbWV0aG9kX3B0cjsKKyAgICAvKiBDcmVhdGUgbXVsdGlwbGllciB0YWJsZSBmcm9tIHF1YW50IHRhYmxlLgorICAgICAqIEhvd2V2ZXIsIHdlIGNhbiBza2lwIHRoaXMgaWYgdGhlIGNvbXBvbmVudCBpcyB1bmludGVyZXN0aW5nCisgICAgICogb3IgaWYgd2UgYWxyZWFkeSBidWlsdCB0aGUgdGFibGUuICBBbHNvLCBpZiBubyBxdWFudCB0YWJsZQorICAgICAqIGhhcyB5ZXQgYmVlbiBzYXZlZCBmb3IgdGhlIGNvbXBvbmVudCwgd2UgbGVhdmUgdGhlCisgICAgICogbXVsdGlwbGllciB0YWJsZSBhbGwtemVybzsgd2UnbGwgYmUgcmVhZGluZyB6ZXJvZXMgZnJvbSB0aGUKKyAgICAgKiBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgYnVmZmVyIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkIHx8IGlkY3QtPmN1cl9tZXRob2RbY2ldID09IG1ldGhvZCkKKyAgICAgIGNvbnRpbnVlOworICAgIHF0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKKyAgICBpZiAocXRibCA9PSBOVUxMKQkJLyogaGFwcGVucyBpZiBubyBkYXRhIHlldCBmb3IgY29tcG9uZW50ICovCisgICAgICBjb250aW51ZTsKKyAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IG1ldGhvZDsKKyAgICBzd2l0Y2ggKG1ldGhvZCkgeworI2lmZGVmIFBST1ZJREVfSVNMT1dfVEFCTEVTCisgICAgY2FzZSBKRENUX0lTTE9XOgorICAgICAgeworCS8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cywgYnV0IGFyZSBzdG9yZWQgYXMgaW50cyB0byBlbnN1cmUgYWNjZXNzIGVmZmljaWVuY3kuCisJICovCisJSVNMT1dfTVVMVF9UWVBFICogaXNtdGJsID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGlzbXRibFtpXSA9IChJU0xPV19NVUxUX1RZUEUpIHF0YmwtPnF1YW50dmFsW2ldOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JRkFTVDoKKyAgICAgIHsKKwkvKiBGb3IgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIEZvciBpbnRlZ2VyIG9wZXJhdGlvbiwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMgdG8gYmUgc2NhbGVkIGJ5CisJICogSUZBU1RfU0NBTEVfQklUUy4KKwkgKi8KKwlJRkFTVF9NVUxUX1RZUEUgKiBpZm10YmwgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyNkZWZpbmUgQ09OU1RfQklUUyAxNAorCXN0YXRpYyBjb25zdCBJTlQxNiBhYW5zY2FsZXNbRENUU0laRTJdID0geworCSAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsIDE3ODU1LCAxMjI5OSwgIDYyNzAsCisJICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCisJICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCisJICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCisJICAgNDUyMCwgIDYyNzAsICA1OTA2LCAgNTMxNSwgIDQ1MjAsICAzNTUyLCAgMjQ0NiwgIDEyNDcKKwl9OworCVNISUZUX1RFTVBTCisKKwlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCSAgaWZtdGJsW2ldID0gKElGQVNUX01VTFRfVFlQRSkKKwkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCisJCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCisJCSAgICBDT05TVF9CSVRTLUlGQVNUX1NDQUxFX0JJVFMpOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9GTE9BVDoKKyAgICAgIHsKKwkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqLworCUZMT0FUX01VTFRfVFlQRSAqIGZtdGJsID0gKEZMT0FUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisJaW50IHJvdywgY29sOworCXN0YXRpYyBjb25zdCBkb3VibGUgYWFuc2NhbGVmYWN0b3JbRENUU0laRV0gPSB7CisJICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCisJICAxLjAsIDAuNzg1Njk0OTU4LCAwLjU0MTE5NjEwMCwgMC4yNzU4OTkzNzkKKwl9OworCisJaSA9IDA7CisJZm9yIChyb3cgPSAwOyByb3cgPCBEQ1RTSVpFOyByb3crKykgeworCSAgZm9yIChjb2wgPSAwOyBjb2wgPCBEQ1RTSVpFOyBjb2wrKykgeworCSAgICBmbXRibFtpXSA9IChGTE9BVF9NVUxUX1RZUEUpCisJICAgICAgKChkb3VibGUpIHF0YmwtPnF1YW50dmFsW2ldICoKKwkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0pOworCSAgICBpKys7CisJICB9CisJfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgSURDVCBtYW5hZ2VyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfaW52ZXJzZV9kY3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lkY3RfcHRyIGlkY3Q7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBpZGN0ID0gKG15X2lkY3RfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2lkY3RfY29udHJvbGxlcikpOworICBjaW5mby0+aWRjdCA9IChzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqKSBpZGN0OworICBpZGN0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3M7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gYSBtdWx0aXBsaWVyIHRhYmxlIGZvciBlYWNoIGNvbXBvbmVudCAqLworICAgIGNvbXBwdHItPmRjdF90YWJsZSA9CisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKKyAgICBNRU1aRVJPKGNvbXBwdHItPmRjdF90YWJsZSwgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKKyAgICAvKiBNYXJrIG11bHRpcGxpZXIgdGFibGUgbm90IHlldCBzZXQgdXAgZm9yIGFueSBtZXRob2QgKi8KKyAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IC0xOworICB9Cit9CmRpZmYgLS1naXQgYS9qZGh1ZmYuYyBiL2pkaHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmEzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9qZGh1ZmYuYwpAQCAtMCwwICsxLDY1MSBAQAorLyoKKyAqIGpkaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCisgKiBJZiB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGJhY2sKKyAqIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlIHZhcmlhYmxlcworICogaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZSBwZXJtYW5lbnQKKyAqIHN0b3JhZ2Ugb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpkcGh1ZmYuYyAqLworCisKKy8qCisgKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBIdWZmbWFuIGRlY29kaW5nLgorICoKKyAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKKyAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCit9IHNhdmFibGVfc3RhdGU7CisKKy8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KKyAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQorICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgorICovCisKKyNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCisjZWxzZQorI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAorCSgoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKKyNlbmRpZgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBsb2FkZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgZWFjaCBNQ1UuCisgICAqIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgd2UgZXhpdCBXSVRIT1VUIHVwZGF0aW5nIHRoZW0uCisgICAqLworICBiaXRyZWFkX3Blcm1fc3RhdGUgYml0c3RhdGU7CS8qIEJpdCBidWZmZXIgYXQgc3RhcnQgb2YgTUNVICovCisgIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBPdGhlciBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLworICBkX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisgIC8qIFByZWNhbGN1bGF0ZWQgaW5mbyBzZXQgdXAgYnkgc3RhcnRfcGFzcyBmb3IgdXNlIGluIGRlY29kZV9tY3U6ICovCisKKyAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgdG8gYmUgdXNlZCBmb3IgZWFjaCBibG9jayB3aXRoaW4gYW4gTUNVICovCisgIGRfZGVyaXZlZF90YmwgKiBkY19jdXJfdGJsc1tEX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgZF9kZXJpdmVkX3RibCAqIGFjX2N1cl90YmxzW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworICAvKiBXaGV0aGVyIHdlIGNhcmUgYWJvdXQgdGhlIERDIGFuZCBBQyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIGVhY2ggYmxvY2sgKi8KKyAgYm9vbGVhbiBkY19uZWVkZWRbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisgIGJvb2xlYW4gYWNfbmVlZGVkW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworfSBodWZmX2VudHJvcHlfZGVjb2RlcjsKKwordHlwZWRlZiBodWZmX2VudHJvcHlfZGVjb2RlciAqIGh1ZmZfZW50cm9weV9wdHI7CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2h1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2ksIGJsa24sIGRjdGJsLCBhY3RibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgc2NhbiBwYXJhbWV0ZXJzIFNzLCBTZSwgQWgvQWwgYXJlIE9LIGZvciBzZXF1ZW50aWFsIEpQRUcuCisgICAqIFRoaXMgb3VnaHQgdG8gYmUgYW4gZXJyb3IgY29uZGl0aW9uLCBidXQgd2UgbWFrZSBpdCBhIHdhcm5pbmcgYmVjYXVzZQorICAgKiB0aGVyZSBhcmUgc29tZSBiYXNlbGluZSBmaWxlcyBvdXQgdGhlcmUgd2l0aCBhbGwgemVyb2VzIGluIHRoZXNlIGJ5dGVzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5TcyAhPSAwIHx8IGNpbmZvLT5TZSAhPSBEQ1RTSVpFMi0xIHx8CisgICAgICBjaW5mby0+QWggIT0gMCB8fCBjaW5mby0+QWwgIT0gMCkKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fTk9UX1NFUVVFTlRJQUwpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICAvKiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGZvciBIdWZmbWFuIHRhYmxlcyAqLworICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAorCQkJICAgICYgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2RjdGJsXSk7CisgICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBhY3RibCwKKwkJCSAgICAmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOworICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0KKworICAvKiBQcmVjYWxjdWxhdGUgZGVjb2RpbmcgaW5mbyBmb3IgZWFjaCBibG9jayBpbiBhbiBNQ1Ugb2YgdGhpcyBzY2FuICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAvKiBQcmVjYWxjdWxhdGUgd2hpY2ggdGFibGUgdG8gdXNlIGZvciBlYWNoIGJsb2NrICovCisgICAgZW50cm9weS0+ZGNfY3VyX3RibHNbYmxrbl0gPSBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXTsKKyAgICBlbnRyb3B5LT5hY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5hY190Ymxfbm9dOworICAgIC8qIERlY2lkZSB3aGV0aGVyIHdlIHJlYWxseSBjYXJlIGFib3V0IHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KKyAgICBpZiAoY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCkgeworICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gVFJVRTsKKyAgICAgIC8qIHdlIGRvbid0IG5lZWQgdGhlIEFDcyBpZiBwcm9kdWNpbmcgYSAxLzh0aC1zaXplIGltYWdlICovCisgICAgICBlbnRyb3B5LT5hY19uZWVkZWRbYmxrbl0gPSAoY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID4gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVudHJvcHktPmRjX25lZWRlZFtibGtuXSA9IGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgYml0cmVhZCBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKyAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IDA7IC8qIHVubmVjZXNzYXJ5LCBidXQga2VlcHMgUHVyaWZ5IHF1aWV0ICovCisgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Cit9CisKKworLyoKKyAqIENvbXB1dGUgdGhlIGRlcml2ZWQgdmFsdWVzIGZvciBhIEh1ZmZtYW4gdGFibGUuCisgKiBUaGlzIHJvdXRpbmUgYWxzbyBwZXJmb3JtcyBzb21lIHZhbGlkYXRpb24gY2hlY2tzIG9uIHRoZSB0YWJsZS4KKyAqCisgKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpkcGh1ZmYuYy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKKwkJCSBkX2Rlcml2ZWRfdGJsICoqIHBkdGJsKQoreworICBKSFVGRl9UQkwgKmh0Ymw7CisgIGRfZGVyaXZlZF90YmwgKmR0Ymw7CisgIGludCBwLCBpLCBsLCBzaSwgbnVtc3ltYm9sczsKKyAgaW50IGxvb2tiaXRzLCBjdHI7CisgIGNoYXIgaHVmZnNpemVbMjU3XTsKKyAgdW5zaWduZWQgaW50IGh1ZmZjb2RlWzI1N107CisgIHVuc2lnbmVkIGludCBjb2RlOworCisgIC8qIE5vdGUgdGhhdCBodWZmc2l6ZVtdIGFuZCBodWZmY29kZVtdIGFyZSBmaWxsZWQgaW4gY29kZS1sZW5ndGggb3JkZXIsCisgICAqIHBhcmFsbGVsaW5nIHRoZSBvcmRlciBvZiB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGluIGh0YmwtPmh1ZmZ2YWxbXS4KKyAgICovCisKKyAgLyogRmluZCB0aGUgaW5wdXQgSHVmZm1hbiB0YWJsZSAqLworICBpZiAodGJsbm8gPCAwIHx8IHRibG5vID49IE5VTV9IVUZGX1RCTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOworICBodGJsID0KKyAgICBpc0RDID8gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dIDogY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dOworICBpZiAoaHRibCA9PSBOVUxMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKworICAvKiBBbGxvY2F0ZSBhIHdvcmtzcGFjZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4gKi8KKyAgaWYgKCpwZHRibCA9PSBOVUxMKQorICAgICpwZHRibCA9IChkX2Rlcml2ZWRfdGJsICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKGRfZGVyaXZlZF90YmwpKTsKKyAgZHRibCA9ICpwZHRibDsKKyAgZHRibC0+cHViID0gaHRibDsJCS8qIGZpbGwgaW4gYmFjayBsaW5rICovCisgIAorICAvKiBGaWd1cmUgQy4xOiBtYWtlIHRhYmxlIG9mIEh1ZmZtYW4gY29kZSBsZW5ndGggZm9yIGVhY2ggc3ltYm9sICovCisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgeworICAgIGkgPSAoaW50KSBodGJsLT5iaXRzW2xdOworICAgIGlmIChpIDwgMCB8fCBwICsgaSA+IDI1NikJLyogcHJvdGVjdCBhZ2FpbnN0IHRhYmxlIG92ZXJydW4gKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIHdoaWxlIChpLS0pCisgICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7CisgIH0KKyAgaHVmZnNpemVbcF0gPSAwOworICBudW1zeW1ib2xzID0gcDsKKyAgCisgIC8qIEZpZ3VyZSBDLjI6IGdlbmVyYXRlIHRoZSBjb2RlcyB0aGVtc2VsdmVzICovCisgIC8qIFdlIGFsc28gdmFsaWRhdGUgdGhhdCB0aGUgY291bnRzIHJlcHJlc2VudCBhIGxlZ2FsIEh1ZmZtYW4gY29kZSB0cmVlLiAqLworICAKKyAgY29kZSA9IDA7CisgIHNpID0gaHVmZnNpemVbMF07CisgIHAgPSAwOworICB3aGlsZSAoaHVmZnNpemVbcF0pIHsKKyAgICB3aGlsZSAoKChpbnQpIGh1ZmZzaXplW3BdKSA9PSBzaSkgeworICAgICAgaHVmZmNvZGVbcCsrXSA9IGNvZGU7CisgICAgICBjb2RlKys7CisgICAgfQorICAgIC8qIGNvZGUgaXMgbm93IDEgbW9yZSB0aGFuIHRoZSBsYXN0IGNvZGUgdXNlZCBmb3IgY29kZWxlbmd0aCBzaTsgYnV0CisgICAgICogaXQgbXVzdCBzdGlsbCBmaXQgaW4gc2kgYml0cywgc2luY2Ugbm8gY29kZSBpcyBhbGxvd2VkIHRvIGJlIGFsbCBvbmVzLgorICAgICAqLworICAgIGlmICgoKElOVDMyKSBjb2RlKSA+PSAoKChJTlQzMikgMSkgPDwgc2kpKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgY29kZSA8PD0gMTsKKyAgICBzaSsrOworICB9CisKKyAgLyogRmlndXJlIEYuMTU6IGdlbmVyYXRlIGRlY29kaW5nIHRhYmxlcyBmb3IgYml0LXNlcXVlbnRpYWwgZGVjb2RpbmcgKi8KKworICBwID0gMDsKKyAgZm9yIChsID0gMTsgbCA8PSAxNjsgbCsrKSB7CisgICAgaWYgKGh0YmwtPmJpdHNbbF0pIHsKKyAgICAgIC8qIHZhbG9mZnNldFtsXSA9IGh1ZmZ2YWxbXSBpbmRleCBvZiAxc3Qgc3ltYm9sIG9mIGNvZGUgbGVuZ3RoIGwsCisgICAgICAgKiBtaW51cyB0aGUgbWluaW11bSBjb2RlIG9mIGxlbmd0aCBsCisgICAgICAgKi8KKyAgICAgIGR0YmwtPnZhbG9mZnNldFtsXSA9IChJTlQzMikgcCAtIChJTlQzMikgaHVmZmNvZGVbcF07CisgICAgICBwICs9IGh0YmwtPmJpdHNbbF07CisgICAgICBkdGJsLT5tYXhjb2RlW2xdID0gaHVmZmNvZGVbcC0xXTsgLyogbWF4aW11bSBjb2RlIG9mIGxlbmd0aCBsICovCisgICAgfSBlbHNlIHsKKyAgICAgIGR0YmwtPm1heGNvZGVbbF0gPSAtMTsJLyogLTEgaWYgbm8gY29kZXMgb2YgdGhpcyBsZW5ndGggKi8KKyAgICB9CisgIH0KKyAgZHRibC0+bWF4Y29kZVsxN10gPSAweEZGRkZGTDsgLyogZW5zdXJlcyBqcGVnX2h1ZmZfZGVjb2RlIHRlcm1pbmF0ZXMgKi8KKworICAvKiBDb21wdXRlIGxvb2thaGVhZCB0YWJsZXMgdG8gc3BlZWQgdXAgZGVjb2RpbmcuCisgICAqIEZpcnN0IHdlIHNldCBhbGwgdGhlIHRhYmxlIGVudHJpZXMgdG8gMCwgaW5kaWNhdGluZyAidG9vIGxvbmciOworICAgKiB0aGVuIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgSHVmZm1hbiBjb2RlcyB0aGF0IGFyZSBzaG9ydCBlbm91Z2ggYW5kCisgICAqIGZpbGwgaW4gYWxsIHRoZSBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZCB0byBiaXQgc2VxdWVuY2VzIHN0YXJ0aW5nCisgICAqIHdpdGggdGhhdCBjb2RlLgorICAgKi8KKworICBNRU1aRVJPKGR0YmwtPmxvb2tfbmJpdHMsIFNJWkVPRihkdGJsLT5sb29rX25iaXRzKSk7CisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gSFVGRl9MT09LQUhFQUQ7IGwrKykgeworICAgIGZvciAoaSA9IDE7IGkgPD0gKGludCkgaHRibC0+Yml0c1tsXTsgaSsrLCBwKyspIHsKKyAgICAgIC8qIGwgPSBjdXJyZW50IGNvZGUncyBsZW5ndGgsIHAgPSBpdHMgaW5kZXggaW4gaHVmZmNvZGVbXSAmIGh1ZmZ2YWxbXS4gKi8KKyAgICAgIC8qIEdlbmVyYXRlIGxlZnQtanVzdGlmaWVkIGNvZGUgZm9sbG93ZWQgYnkgYWxsIHBvc3NpYmxlIGJpdCBzZXF1ZW5jZXMgKi8KKyAgICAgIGxvb2tiaXRzID0gaHVmZmNvZGVbcF0gPDwgKEhVRkZfTE9PS0FIRUFELWwpOworICAgICAgZm9yIChjdHIgPSAxIDw8IChIVUZGX0xPT0tBSEVBRC1sKTsgY3RyID4gMDsgY3RyLS0pIHsKKwlkdGJsLT5sb29rX25iaXRzW2xvb2tiaXRzXSA9IGw7CisJZHRibC0+bG9va19zeW1bbG9va2JpdHNdID0gaHRibC0+aHVmZnZhbFtwXTsKKwlsb29rYml0cysrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFZhbGlkYXRlIHN5bWJvbHMgYXMgYmVpbmcgcmVhc29uYWJsZS4KKyAgICogRm9yIEFDIHRhYmxlcywgd2UgbWFrZSBubyBjaGVjaywgYnV0IGFjY2VwdCBhbGwgYnl0ZSB2YWx1ZXMgMC4uMjU1LgorICAgKiBGb3IgREMgdGFibGVzLCB3ZSByZXF1aXJlIHRoZSBzeW1ib2xzIHRvIGJlIGluIHJhbmdlIDAuLjE1LgorICAgKiAoVGlnaHRlciBib3VuZHMgY291bGQgYmUgYXBwbGllZCBkZXBlbmRpbmcgb24gdGhlIGRhdGEgZGVwdGggYW5kIG1vZGUsCisgICAqIGJ1dCB0aGlzIGlzIHN1ZmZpY2llbnQgdG8gZW5zdXJlIHNhZmUgZGVjb2RpbmcuKQorICAgKi8KKyAgaWYgKGlzREMpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtc3ltYm9sczsgaSsrKSB7CisgICAgICBpbnQgc3ltID0gaHRibC0+aHVmZnZhbFtpXTsKKyAgICAgIGlmIChzeW0gPCAwIHx8IHN5bSA+IDE1KQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBPdXQtb2YtbGluZSBjb2RlIGZvciBiaXQgZmV0Y2hpbmcgKHNoYXJlZCB3aXRoIGpkcGh1ZmYuYykuCisgKiBTZWUgamRodWZmLmggZm9yIGluZm8gYWJvdXQgdXNhZ2UuCisgKiBOb3RlOiBjdXJyZW50IHZhbHVlcyBvZiBnZXRfYnVmZmVyIGFuZCBiaXRzX2xlZnQgYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzLAorICogYnV0IGFyZSByZXR1cm5lZCBpbiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgb2YgdGhlIHN0YXRlIHN0cnVjdC4KKyAqCisgKiBPbiBtb3N0IG1hY2hpbmVzIE1JTl9HRVRfQklUUyBzaG91bGQgYmUgMjUgdG8gYWxsb3cgdGhlIGZ1bGwgMzItYml0IHdpZHRoCisgKiBvZiBnZXRfYnVmZmVyIHRvIGJlIHVzZWQuICAoT24gbWFjaGluZXMgd2l0aCB3aWRlciB3b3JkcywgYW4gZXZlbiBsYXJnZXIKKyAqIGJ1ZmZlciBjb3VsZCBiZSB1c2VkLikgIEhvd2V2ZXIsIG9uIHNvbWUgbWFjaGluZXMgMzItYml0IHNoaWZ0cyBhcmUKKyAqIHF1aXRlIHNsb3cgYW5kIHRha2UgdGltZSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBwbGFjZXMgc2hpZnRlZC4KKyAqIChUaGlzIGlzIHRydWUgd2l0aCBtb3N0IFBDIGNvbXBpbGVycywgZm9yIGluc3RhbmNlLikgIEluIHRoaXMgY2FzZSBpdCBtYXkKKyAqIGJlIGEgd2luIHRvIHNldCBNSU5fR0VUX0JJVFMgdG8gdGhlIG1pbmltdW0gdmFsdWUgb2YgMTUuICBUaGlzIHJlZHVjZXMgdGhlCisgKiBhdmVyYWdlIHNoaWZ0IGRpc3RhbmNlIGF0IHRoZSBjb3N0IG9mIG1vcmUgY2FsbHMgdG8ganBlZ19maWxsX2JpdF9idWZmZXIuCisgKi8KKworI2lmZGVmIFNMT1dfU0hJRlRfMzIKKyNkZWZpbmUgTUlOX0dFVF9CSVRTICAxNQkvKiBtaW5pbXVtIGFsbG93YWJsZSB2YWx1ZSAqLworI2Vsc2UKKyNkZWZpbmUgTUlOX0dFVF9CSVRTICAoQklUX0JVRl9TSVpFLTcpCisjZW5kaWYKKworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfZmlsbF9iaXRfYnVmZmVyIChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwKKwkJICAgICAgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsCisJCSAgICAgIGludCBuYml0cykKKy8qIExvYWQgdXAgdGhlIGJpdCBidWZmZXIgdG8gYSBkZXB0aCBvZiBhdCBsZWFzdCBuYml0cyAqLworeworICAvKiBDb3B5IGhlYXZpbHkgdXNlZCBzdGF0ZSBmaWVsZHMgaW50byBsb2NhbHMgKGhvcGVmdWxseSByZWdpc3RlcnMpICovCisgIHJlZ2lzdGVyIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZSA9IHN0YXRlLT5uZXh0X2lucHV0X2J5dGU7CisgIHJlZ2lzdGVyIHNpemVfdCBieXRlc19pbl9idWZmZXIgPSBzdGF0ZS0+Ynl0ZXNfaW5fYnVmZmVyOworICBqX2RlY29tcHJlc3NfcHRyIGNpbmZvID0gc3RhdGUtPmNpbmZvOworCisgIC8qIEF0dGVtcHQgdG8gbG9hZCBhdCBsZWFzdCBNSU5fR0VUX0JJVFMgYml0cyBpbnRvIGdldF9idWZmZXIuICovCisgIC8qIChJdCBpcyBhc3N1bWVkIHRoYXQgbm8gcmVxdWVzdCB3aWxsIGJlIGZvciBtb3JlIHRoYW4gdGhhdCBtYW55IGJpdHMuKSAqLworICAvKiBXZSBmYWlsIHRvIGRvIHNvIG9ubHkgaWYgd2UgaGl0IGEgbWFya2VyIG9yIGFyZSBmb3JjZWQgdG8gc3VzcGVuZC4gKi8KKworICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgewkvKiBjYW5ub3QgYWR2YW5jZSBwYXN0IGEgbWFya2VyICovCisgICAgd2hpbGUgKGJpdHNfbGVmdCA8IE1JTl9HRVRfQklUUykgeworICAgICAgcmVnaXN0ZXIgaW50IGM7CisKKyAgICAgIC8qIEF0dGVtcHQgdG8gcmVhZCBhIGJ5dGUgKi8KKyAgICAgIGlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgeworCWlmICghICgqY2luZm8tPnNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCisJICByZXR1cm4gRkFMU0U7CisJbmV4dF9pbnB1dF9ieXRlID0gY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlOworCWJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKKyAgICAgIH0KKyAgICAgIGJ5dGVzX2luX2J1ZmZlci0tOworICAgICAgYyA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOworCisgICAgICAvKiBJZiBpdCdzIDB4RkYsIGNoZWNrIGFuZCBkaXNjYXJkIHN0dWZmZWQgemVybyBieXRlICovCisgICAgICBpZiAoYyA9PSAweEZGKSB7CisJLyogTG9vcCBoZXJlIHRvIGRpc2NhcmQgYW55IHBhZGRpbmcgRkYncyBvbiB0ZXJtaW5hdGluZyBtYXJrZXIsCisJICogc28gdGhhdCB3ZSBjYW4gc2F2ZSBhIHZhbGlkIHVucmVhZF9tYXJrZXIgdmFsdWUuICBOT1RFOiB3ZSB3aWxsCisJICogYWNjZXB0IG11bHRpcGxlIEZGJ3MgZm9sbG93ZWQgYnkgYSAwIGFzIG1lYW5pbmcgYSBzaW5nbGUgRkYgZGF0YQorCSAqIGJ5dGUuICBUaGlzIGRhdGEgcGF0dGVybiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZC4KKwkgKi8KKwlkbyB7CisJICBpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsKKwkgICAgaWYgKCEgKCpjaW5mby0+c3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICAgIG5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKKwkgICAgYnl0ZXNfaW5fYnVmZmVyID0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOworCSAgfQorCSAgYnl0ZXNfaW5fYnVmZmVyLS07CisJICBjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7CisJfSB3aGlsZSAoYyA9PSAweEZGKTsKKworCWlmIChjID09IDApIHsKKwkgIC8qIEZvdW5kIEZGLzAwLCB3aGljaCByZXByZXNlbnRzIGFuIEZGIGRhdGEgYnl0ZSAqLworCSAgYyA9IDB4RkY7CisJfSBlbHNlIHsKKwkgIC8qIE9vcHMsIGl0J3MgYWN0dWFsbHkgYSBtYXJrZXIgaW5kaWNhdGluZyBlbmQgb2YgY29tcHJlc3NlZCBkYXRhLgorCSAgICogU2F2ZSB0aGUgbWFya2VyIGNvZGUgZm9yIGxhdGVyIHVzZS4KKwkgICAqIEZpbmUgcG9pbnQ6IGl0IG1pZ2h0IGFwcGVhciB0aGF0IHdlIHNob3VsZCBzYXZlIHRoZSBtYXJrZXIgaW50bworCSAgICogYml0cmVhZCB3b3JraW5nIHN0YXRlLCBub3Qgc3RyYWlnaHQgaW50byBwZXJtYW5lbnQgc3RhdGUuICBCdXQKKwkgICAqIG9uY2Ugd2UgaGF2ZSBoaXQgYSBtYXJrZXIsIHdlIGNhbm5vdCBuZWVkIHRvIHN1c3BlbmQgd2l0aGluIHRoZQorCSAgICogY3VycmVudCBNQ1UsIGJlY2F1c2Ugd2Ugd2lsbCByZWFkIG5vIG1vcmUgYnl0ZXMgZnJvbSB0aGUgZGF0YQorCSAgICogc291cmNlLiAgU28gaXQgaXMgT0sgdG8gdXBkYXRlIHBlcm1hbmVudCBzdGF0ZSByaWdodCBhd2F5LgorCSAgICovCisJICBjaW5mby0+dW5yZWFkX21hcmtlciA9IGM7CisJICAvKiBTZWUgaWYgd2UgbmVlZCB0byBpbnNlcnQgc29tZSBmYWtlIHplcm8gYml0cy4gKi8KKwkgIGdvdG8gbm9fbW9yZV9ieXRlczsKKwl9CisgICAgICB9CisKKyAgICAgIC8qIE9LLCBsb2FkIGMgaW50byBnZXRfYnVmZmVyICovCisgICAgICBnZXRfYnVmZmVyID0gKGdldF9idWZmZXIgPDwgOCkgfCBjOworICAgICAgYml0c19sZWZ0ICs9IDg7CisgICAgfSAvKiBlbmQgd2hpbGUgKi8KKyAgfSBlbHNlIHsKKyAgbm9fbW9yZV9ieXRlczoKKyAgICAvKiBXZSBnZXQgaGVyZSBpZiB3ZSd2ZSByZWFkIHRoZSBtYXJrZXIgdGhhdCB0ZXJtaW5hdGVzIHRoZSBjb21wcmVzc2VkCisgICAgICogZGF0YSBzZWdtZW50LiAgVGhlcmUgc2hvdWxkIGJlIGVub3VnaCBiaXRzIGluIHRoZSBidWZmZXIgcmVnaXN0ZXIKKyAgICAgKiB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0OyBpZiBzbywgbm8gcHJvYmxlbS4KKyAgICAgKi8KKyAgICBpZiAobmJpdHMgPiBiaXRzX2xlZnQpIHsKKyAgICAgIC8qIFVoLW9oLiAgUmVwb3J0IGNvcnJ1cHRlZCBkYXRhIHRvIHVzZXIgYW5kIHN0dWZmIHplcm9lcyBpbnRvCisgICAgICAgKiB0aGUgZGF0YSBzdHJlYW0sIHNvIHRoYXQgd2UgY2FuIHByb2R1Y2Ugc29tZSBraW5kIG9mIGltYWdlLgorICAgICAgICogV2UgdXNlIGEgbm9udm9sYXRpbGUgZmxhZyB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSB3YXJuaW5nIG1lc3NhZ2UKKyAgICAgICAqIGFwcGVhcnMgcGVyIGRhdGEgc2VnbWVudC4KKyAgICAgICAqLworICAgICAgaWYgKCEgY2luZm8tPmVudHJvcHktPmluc3VmZmljaWVudF9kYXRhKSB7CisJV0FSTk1TKGNpbmZvLCBKV1JOX0hJVF9NQVJLRVIpOworCWNpbmZvLT5lbnRyb3B5LT5pbnN1ZmZpY2llbnRfZGF0YSA9IFRSVUU7CisgICAgICB9CisgICAgICAvKiBGaWxsIHRoZSBidWZmZXIgd2l0aCB6ZXJvIGJpdHMgKi8KKyAgICAgIGdldF9idWZmZXIgPDw9IE1JTl9HRVRfQklUUyAtIGJpdHNfbGVmdDsKKyAgICAgIGJpdHNfbGVmdCA9IE1JTl9HRVRfQklUUzsKKyAgICB9CisgIH0KKworICAvKiBVbmxvYWQgdGhlIGxvY2FsIHJlZ2lzdGVycyAqLworICBzdGF0ZS0+bmV4dF9pbnB1dF9ieXRlID0gbmV4dF9pbnB1dF9ieXRlOworICBzdGF0ZS0+Ynl0ZXNfaW5fYnVmZmVyID0gYnl0ZXNfaW5fYnVmZmVyOworICBzdGF0ZS0+Z2V0X2J1ZmZlciA9IGdldF9idWZmZXI7CisgIHN0YXRlLT5iaXRzX2xlZnQgPSBiaXRzX2xlZnQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE91dC1vZi1saW5lIGNvZGUgZm9yIEh1ZmZtYW4gY29kZSBkZWNvZGluZy4KKyAqIFNlZSBqZGh1ZmYuaCBmb3IgaW5mbyBhYm91dCB1c2FnZS4KKyAqLworCitHTE9CQUwoaW50KQoranBlZ19odWZmX2RlY29kZSAoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsCisJCSAgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsCisJCSAgZF9kZXJpdmVkX3RibCAqIGh0YmwsIGludCBtaW5fYml0cykKK3sKKyAgcmVnaXN0ZXIgaW50IGwgPSBtaW5fYml0czsKKyAgcmVnaXN0ZXIgSU5UMzIgY29kZTsKKworICAvKiBIVUZGX0RFQ09ERSBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBjb2RlIGlzIGF0IGxlYXN0IG1pbl9iaXRzICovCisgIC8qIGJpdHMgbG9uZywgc28gZmV0Y2ggdGhhdCBtYW55IGJpdHMgaW4gb25lIHN3b29wLiAqLworCisgIENIRUNLX0JJVF9CVUZGRVIoKnN0YXRlLCBsLCByZXR1cm4gLTEpOworICBjb2RlID0gR0VUX0JJVFMobCk7CisKKyAgLyogQ29sbGVjdCB0aGUgcmVzdCBvZiB0aGUgSHVmZm1hbiBjb2RlIG9uZSBiaXQgYXQgYSB0aW1lLiAqLworICAvKiBUaGlzIGlzIHBlciBGaWd1cmUgRi4xNiBpbiB0aGUgSlBFRyBzcGVjLiAqLworCisgIHdoaWxlIChjb2RlID4gaHRibC0+bWF4Y29kZVtsXSkgeworICAgIGNvZGUgPDw9IDE7CisgICAgQ0hFQ0tfQklUX0JVRkZFUigqc3RhdGUsIDEsIHJldHVybiAtMSk7CisgICAgY29kZSB8PSBHRVRfQklUUygxKTsKKyAgICBsKys7CisgIH0KKworICAvKiBVbmxvYWQgdGhlIGxvY2FsIHJlZ2lzdGVycyAqLworICBzdGF0ZS0+Z2V0X2J1ZmZlciA9IGdldF9idWZmZXI7CisgIHN0YXRlLT5iaXRzX2xlZnQgPSBiaXRzX2xlZnQ7CisKKyAgLyogV2l0aCBnYXJiYWdlIGlucHV0IHdlIG1heSByZWFjaCB0aGUgc2VudGluZWwgdmFsdWUgbCA9IDE3LiAqLworCisgIGlmIChsID4gMTYpIHsKKyAgICBXQVJOTVMoc3RhdGUtPmNpbmZvLCBKV1JOX0hVRkZfQkFEX0NPREUpOworICAgIHJldHVybiAwOwkJCS8qIGZha2UgYSB6ZXJvIGFzIHRoZSBzYWZlc3QgcmVzdWx0ICovCisgIH0KKworICByZXR1cm4gaHRibC0+cHViLT5odWZmdmFsWyAoaW50KSAoY29kZSArIGh0YmwtPnZhbG9mZnNldFtsXSkgXTsKK30KKworCisvKgorICogRmlndXJlIEYuMTI6IGV4dGVuZCBzaWduIGJpdC4KKyAqIE9uIHNvbWUgbWFjaGluZXMsIGEgc2hpZnQgYW5kIGFkZCB3aWxsIGJlIGZhc3RlciB0aGFuIGEgdGFibGUgbG9va3VwLgorICovCisKKyNpZmRlZiBBVk9JRF9UQUJMRVMKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgKDE8PCgocyktMSkpID8gKHgpICsgKCgoLTEpPDwocykpICsgMSkgOiAoeCkpCisKKyNlbHNlCisKKyNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8IGV4dGVuZF90ZXN0W3NdID8gKHgpICsgZXh0ZW5kX29mZnNldFtzXSA6ICh4KSkKKworc3RhdGljIGNvbnN0IGludCBleHRlbmRfdGVzdFsxNl0gPSAgIC8qIGVudHJ5IG4gaXMgMioqKG4tMSkgKi8KKyAgeyAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKKyAgICAweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAgfTsKKworc3RhdGljIGNvbnN0IGludCBleHRlbmRfb2Zmc2V0WzE2XSA9IC8qIGVudHJ5IG4gaXMgKC0xIDw8IG4pICsgMSAqLworICB7IDAsICgoLTEpPDwxKSArIDEsICgoLTEpPDwyKSArIDEsICgoLTEpPDwzKSArIDEsICgoLTEpPDw0KSArIDEsCisgICAgKCgtMSk8PDUpICsgMSwgKCgtMSk8PDYpICsgMSwgKCgtMSk8PDcpICsgMSwgKCgtMSk8PDgpICsgMSwKKyAgICAoKC0xKTw8OSkgKyAxLCAoKC0xKTw8MTApICsgMSwgKCgtMSk8PDExKSArIDEsICgoLTEpPDwxMikgKyAxLAorICAgICgoLTEpPDwxMykgKyAxLCAoKC0xKTw8MTQpICsgMSwgKCgtMSk8PDE1KSArIDEgfTsKKworI2VuZGlmIC8qIEFWT0lEX1RBQkxFUyAqLworCisKKy8qCisgKiBDaGVjayBmb3IgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgZGVjb2Rlci4KKyAqIFJldHVybnMgRkFMU0UgaWYgbXVzdCBzdXNwZW5kLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCitwcm9jZXNzX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGNpOworCisgIC8qIFRocm93IGF3YXkgYW55IHVudXNlZCBiaXRzIHJlbWFpbmluZyBpbiBiaXQgYnVmZmVyOyAqLworICAvKiBpbmNsdWRlIGFueSBmdWxsIGJ5dGVzIGluIG5leHRfbWFya2VyJ3MgY291bnQgb2YgZGlzY2FyZGVkIGJ5dGVzICovCisgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgLyA4OworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOworCisgIC8qIEFkdmFuY2UgcGFzdCB0aGUgUlNUbiBtYXJrZXIgKi8KKyAgaWYgKCEgKCpjaW5mby0+bWFya2VyLT5yZWFkX3Jlc3RhcnRfbWFya2VyKSAoY2luZm8pKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKworICAvKiBSZXNldCByZXN0YXJ0IGNvdW50ZXIgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKworICAvKiBSZXNldCBvdXQtb2YtZGF0YSBmbGFnLCB1bmxlc3MgcmVhZF9yZXN0YXJ0X21hcmtlciBsZWZ0IHVzIHNtYWNrIHVwCisgICAqIGFnYWluc3QgYSBtYXJrZXIuICBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBlbmQgdXAgdHJlYXRpbmcgdGhlIG5leHQgZGF0YQorICAgKiBzZWdtZW50IGFzIGVtcHR5LCBhbmQgd2UgY2FuIGF2b2lkIHByb2R1Y2luZyBib2d1cyBvdXRwdXQgcGl4ZWxzIGJ5CisgICAqIGxlYXZpbmcgdGhlIGZsYWcgc2V0LgorICAgKi8KKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApCisgICAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIERlY29kZSBhbmQgcmV0dXJuIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKKyAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgorICoKKyAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKKyAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBIQVMgQkVFTiBaRVJPRUQgQlkgVEhFIENBTExFUi4KKyAqIChXaG9sZXNhbGUgemVyb2luZyBpcyB1c3VhbGx5IGEgbGl0dGxlIGZhc3RlciB0aGFuIHJldGFpbC4uLikKKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCisgKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0CisgKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKKyAqIHRoaXMgbW9kdWxlLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuKQorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgYmxrbjsKKyAgQklUUkVBRF9TVEFURV9WQVJTOworICBzYXZhYmxlX3N0YXRlIHN0YXRlOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworCisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKKworICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KKworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBKQkxPQ0tST1cgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICAgIGRfZGVyaXZlZF90YmwgKiBkY3RibCA9IGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dOworICAgICAgZF9kZXJpdmVkX3RibCAqIGFjdGJsID0gZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl07CisgICAgICByZWdpc3RlciBpbnQgcywgaywgcjsKKworICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCisKKyAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCisgICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgZGN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKKyAgICAgIGlmIChzKSB7CisJQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwlyID0gR0VUX0JJVFMocyk7CisJcyA9IEhVRkZfRVhURU5EKHIsIHMpOworICAgICAgfQorCisgICAgICBpZiAoZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dKSB7CisJLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCisJaW50IGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworCXMgKz0gc3RhdGUubGFzdF9kY192YWxbY2ldOworCXN0YXRlLmxhc3RfZGNfdmFsW2NpXSA9IHM7CisJLyogT3V0cHV0IHRoZSBEQyBjb2VmZmljaWVudCAoYXNzdW1lcyBqcGVnX25hdHVyYWxfb3JkZXJbMF0gPSAwKSAqLworCSgqYmxvY2spWzBdID0gKEpDT0VGKSBzOworICAgICAgfQorCisgICAgICBpZiAoZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dKSB7CisKKwkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCisJLyogU2luY2UgemVyb2VzIGFyZSBza2lwcGVkLCBvdXRwdXQgYXJlYSBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlaGFuZCAqLworCWZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisJICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgYWN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKKyAgICAgIAorCSAgciA9IHMgPj4gNDsKKwkgIHMgJj0gMTU7CisgICAgICAKKwkgIGlmIChzKSB7CisJICAgIGsgKz0gcjsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwkgICAgciA9IEdFVF9CSVRTKHMpOworCSAgICBzID0gSFVGRl9FWFRFTkQociwgcyk7CisJICAgIC8qIE91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIuCisJICAgICAqIE5vdGU6IHRoZSBleHRyYSBlbnRyaWVzIGluIGpwZWdfbmF0dXJhbF9vcmRlcltdIHdpbGwgc2F2ZSB1cworCSAgICAgKiBpZiBrID49IERDVFNJWkUyLCB3aGljaCBjb3VsZCBoYXBwZW4gaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkLgorCSAgICAgKi8KKwkgICAgKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA9IChKQ09FRikgczsKKwkgIH0gZWxzZSB7CisJICAgIGlmIChyICE9IDE1KQorCSAgICAgIGJyZWFrOworCSAgICBrICs9IDE1OworCSAgfQorCX0KKworICAgICAgfSBlbHNlIHsKKworCS8qIFNlY3Rpb24gRi4yLjIuMjogZGVjb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgKi8KKwkvKiBJbiB0aGlzIHBhdGggd2UganVzdCBkaXNjYXJkIHRoZSB2YWx1ZXMgKi8KKwlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgeworCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMyk7CisgICAgICAKKwkgIHIgPSBzID4+IDQ7CisJICBzICY9IDE1OworICAgICAgCisJICBpZiAocykgeworCSAgICBrICs9IHI7CisJICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJICAgIERST1BfQklUUyhzKTsKKwkgIH0gZWxzZSB7CisJICAgIGlmIChyICE9IDE1KQorCSAgICAgIGJyZWFrOworCSAgICBrICs9IDE1OworCSAgfQorCX0KKworICAgICAgfQorICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7CisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9odWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKKyAgaW50IGk7CisKKyAgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKGh1ZmZfZW50cm9weV9kZWNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyOworICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3U7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tpXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pkaHVmZi5oIGIvamRodWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxOWI2YwotLS0gL2Rldi9udWxsCisrKyBiL2pkaHVmZi5oCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogamRodWZmLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcworICogdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIHNlcXVlbnRpYWwgZGVjb2RlciAoamRodWZmLmMpIGFuZCB0aGUKKyAqIHByb2dyZXNzaXZlIGRlY29kZXIgKGpkcGh1ZmYuYykuICBObyBvdGhlciBtb2R1bGVzIG5lZWQgdG8gc2VlIHRoZXNlLgorICovCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX21ha2VfZF9kZXJpdmVkX3RibAlqTWtERGVyaXZlZAorI2RlZmluZSBqcGVnX2ZpbGxfYml0X2J1ZmZlcglqRmlsQml0QnVmCisjZGVmaW5lIGpwZWdfaHVmZl9kZWNvZGUJakh1ZkRlY29kZQorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLworCisjZGVmaW5lIEhVRkZfTE9PS0FIRUFECTgJLyogIyBvZiBiaXRzIG9mIGxvb2thaGVhZCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIEJhc2ljIHRhYmxlczogKGVsZW1lbnQgWzBdIG9mIGVhY2ggYXJyYXkgaXMgdW51c2VkKSAqLworICBJTlQzMiBtYXhjb2RlWzE4XTsJCS8qIGxhcmdlc3QgY29kZSBvZiBsZW5ndGggayAoLTEgaWYgbm9uZSkgKi8KKyAgLyogKG1heGNvZGVbMTddIGlzIGEgc2VudGluZWwgdG8gZW5zdXJlIGpwZWdfaHVmZl9kZWNvZGUgdGVybWluYXRlcykgKi8KKyAgSU5UMzIgdmFsb2Zmc2V0WzE3XTsJCS8qIGh1ZmZ2YWxbXSBvZmZzZXQgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCisgIC8qIHZhbG9mZnNldFtrXSA9IGh1ZmZ2YWxbXSBpbmRleCBvZiAxc3Qgc3ltYm9sIG9mIGNvZGUgbGVuZ3RoIGssIGxlc3MKKyAgICogdGhlIHNtYWxsZXN0IGNvZGUgb2YgbGVuZ3RoIGs7IHNvIGdpdmVuIGEgY29kZSBvZiBsZW5ndGggaywgdGhlCisgICAqIGNvcnJlc3BvbmRpbmcgc3ltYm9sIGlzIGh1ZmZ2YWxbY29kZSArIHZhbG9mZnNldFtrXV0KKyAgICovCisKKyAgLyogTGluayB0byBwdWJsaWMgSHVmZm1hbiB0YWJsZSAobmVlZGVkIG9ubHkgaW4ganBlZ19odWZmX2RlY29kZSkgKi8KKyAgSkhVRkZfVEJMICpwdWI7CisKKyAgLyogTG9va2FoZWFkIHRhYmxlczogaW5kZXhlZCBieSB0aGUgbmV4dCBIVUZGX0xPT0tBSEVBRCBiaXRzIG9mCisgICAqIHRoZSBpbnB1dCBkYXRhIHN0cmVhbS4gIElmIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBpcyBubyBtb3JlCisgICAqIHRoYW4gSFVGRl9MT09LQUhFQUQgYml0cyBsb25nLCB3ZSBjYW4gb2J0YWluIGl0cyBsZW5ndGggYW5kCisgICAqIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCBkaXJlY3RseSBmcm9tIHRoZXNlIHRhYmxlcy4KKyAgICovCisgIGludCBsb29rX25iaXRzWzE8PEhVRkZfTE9PS0FIRUFEXTsgLyogIyBiaXRzLCBvciAwIGlmIHRvbyBsb25nICovCisgIFVJTlQ4IGxvb2tfc3ltWzE8PEhVRkZfTE9PS0FIRUFEXTsgLyogc3ltYm9sLCBvciB1bnVzZWQgKi8KK30gZF9kZXJpdmVkX3RibDsKKworLyogRXhwYW5kIGEgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIGludG8gdGhlIGRlcml2ZWQgZm9ybWF0ICovCitFWFRFUk4odm9pZCkganBlZ19tYWtlX2RfZGVyaXZlZF90YmwKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCSAgICAgZF9kZXJpdmVkX3RibCAqKiBwZHRibCkpOworCisKKy8qCisgKiBGZXRjaGluZyB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGlzIGEgdGltZS1jcml0aWNhbCBvcGVyYXRpb24KKyAqIGZvciB0aGUgSHVmZm1hbiBkZWNvZGVycy4gIFdlIGltcGxlbWVudCBpdCB3aXRoIGEgY29tYmluYXRpb24gb2YgaW5saW5lCisgKiBtYWNyb3MgYW5kIG91dC1vZi1saW5lIHN1YnJvdXRpbmVzLiAgTm90ZSB0aGF0IE4gKHRoZSBudW1iZXIgb2YgYml0cworICogZGVtYW5kZWQgYXQgb25lIHRpbWUpIG5ldmVyIGV4Y2VlZHMgMTUgZm9yIEpQRUcgdXNlLgorICoKKyAqIFdlIHJlYWQgc291cmNlIGJ5dGVzIGludG8gZ2V0X2J1ZmZlciBhbmQgZG9sZSBvdXQgYml0cyBhcyBuZWVkZWQuCisgKiBJZiBnZXRfYnVmZmVyIGFscmVhZHkgY29udGFpbnMgZW5vdWdoIGJpdHMsIHRoZXkgYXJlIGZldGNoZWQgaW4tbGluZQorICogYnkgdGhlIG1hY3JvcyBDSEVDS19CSVRfQlVGRkVSIGFuZCBHRVRfQklUUy4gIFdoZW4gdGhlcmUgYXJlbid0IGVub3VnaAorICogYml0cywganBlZ19maWxsX2JpdF9idWZmZXIgaXMgY2FsbGVkOyBpdCB3aWxsIGF0dGVtcHQgdG8gZmlsbCBnZXRfYnVmZmVyCisgKiBhcyBmdWxsIGFzIHBvc3NpYmxlIChub3QganVzdCB0byB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkOyB0aGlzCisgKiBwcmVmZXRjaGluZyByZWR1Y2VzIHRoZSBvdmVyaGVhZCBjb3N0IG9mIGNhbGxpbmcganBlZ19maWxsX2JpdF9idWZmZXIpLgorICogTm90ZSB0aGF0IGpwZWdfZmlsbF9iaXRfYnVmZmVyIG1heSByZXR1cm4gRkFMU0UgdG8gaW5kaWNhdGUgc3VzcGVuc2lvbi4KKyAqIE9uIFRSVUUgcmV0dXJuLCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBndWFyYW50ZWVzIHRoYXQgZ2V0X2J1ZmZlciBjb250YWlucworICogYXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYml0cyAtLS0gZHVtbXkgemVyb2VzIGFyZSBpbnNlcnRlZCBpZgorICogbmVjZXNzYXJ5LgorICovCisKK3R5cGVkZWYgSU5UMzIgYml0X2J1Zl90eXBlOwkvKiB0eXBlIG9mIGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLworI2RlZmluZSBCSVRfQlVGX1NJWkUgIDMyCS8qIHNpemUgb2YgYnVmZmVyIGluIGJpdHMgKi8KKworLyogSWYgbG9uZyBpcyA+IDMyIGJpdHMgb24geW91ciBtYWNoaW5lLCBhbmQgc2hpZnRpbmcvbWFza2luZyBsb25ncyBpcworICogcmVhc29uYWJseSBmYXN0LCBtYWtpbmcgYml0X2J1Zl90eXBlIGJlIGxvbmcgYW5kIHNldHRpbmcgQklUX0JVRl9TSVpFCisgKiBhcHByb3ByaWF0ZWx5IHNob3VsZCBiZSBhIHdpbi4gIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgZGVmaW5lIHRoZSBzaXplCisgKiB3aXRoIHNvbWV0aGluZyBsaWtlICAjZGVmaW5lIEJJVF9CVUZfU0laRSAoc2l6ZW9mKGJpdF9idWZfdHlwZSkqOCkKKyAqIGJlY2F1c2Ugbm90IGFsbCBtYWNoaW5lcyBtZWFzdXJlIHNpemVvZiBpbiA4LWJpdCBieXRlcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBCaXRyZWFkaW5nIHN0YXRlIHNhdmVkIGFjcm9zcyBNQ1VzICovCisgIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOwkvKiBjdXJyZW50IGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLworICBpbnQgYml0c19sZWZ0OwkJLyogIyBvZiB1bnVzZWQgYml0cyBpbiBpdCAqLworfSBiaXRyZWFkX3Blcm1fc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsJCS8qIEJpdHJlYWRpbmcgd29ya2luZyBzdGF0ZSB3aXRoaW4gYW4gTUNVICovCisgIC8qIEN1cnJlbnQgZGF0YSBzb3VyY2UgbG9jYXRpb24gKi8KKyAgLyogV2UgbmVlZCBhIGNvcHksIHJhdGhlciB0aGFuIG11bmdpbmcgdGhlIG9yaWdpbmFsLCBpbiBjYXNlIG9mIHN1c3BlbnNpb24gKi8KKyAgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIHNvdXJjZSAqLworICBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBzb3VyY2UgYnVmZmVyICovCisgIC8qIEJpdCBpbnB1dCBidWZmZXIgLS0tIG5vdGUgdGhlc2UgdmFsdWVzIGFyZSBrZXB0IGluIHJlZ2lzdGVyIHZhcmlhYmxlcywKKyAgICogbm90IGluIHRoaXMgc3RydWN0LCBpbnNpZGUgdGhlIGlubmVyIGxvb3BzLgorICAgKi8KKyAgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7CS8qIGN1cnJlbnQgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCisgIGludCBiaXRzX2xlZnQ7CQkvKiAjIG9mIHVudXNlZCBiaXRzIGluIGl0ICovCisgIC8qIFBvaW50ZXIgbmVlZGVkIGJ5IGpwZWdfZmlsbF9iaXRfYnVmZmVyLiAqLworICBqX2RlY29tcHJlc3NfcHRyIGNpbmZvOwkvKiBiYWNrIGxpbmsgdG8gZGVjb21wcmVzcyBtYXN0ZXIgcmVjb3JkICovCit9IGJpdHJlYWRfd29ya2luZ19zdGF0ZTsKKworLyogTWFjcm9zIHRvIGRlY2xhcmUgYW5kIGxvYWQvc2F2ZSBiaXRyZWFkIGxvY2FsIHZhcmlhYmxlcy4gKi8KKyNkZWZpbmUgQklUUkVBRF9TVEFURV9WQVJTICBcCisJcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7ICBcCisJcmVnaXN0ZXIgaW50IGJpdHNfbGVmdDsgIFwKKwliaXRyZWFkX3dvcmtpbmdfc3RhdGUgYnJfc3RhdGUKKworI2RlZmluZSBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm9wLHBlcm1zdGF0ZSkgIFwKKwlicl9zdGF0ZS5jaW5mbyA9IGNpbmZvcDsgXAorCWJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvcC0+c3JjLT5uZXh0X2lucHV0X2J5dGU7IFwKKwlicl9zdGF0ZS5ieXRlc19pbl9idWZmZXIgPSBjaW5mb3AtPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOyBcCisJZ2V0X2J1ZmZlciA9IHBlcm1zdGF0ZS5nZXRfYnVmZmVyOyBcCisJYml0c19sZWZ0ID0gcGVybXN0YXRlLmJpdHNfbGVmdDsKKworI2RlZmluZSBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm9wLHBlcm1zdGF0ZSkgIFwKKwljaW5mb3AtPnNyYy0+bmV4dF9pbnB1dF9ieXRlID0gYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlOyBcCisJY2luZm9wLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA9IGJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlcjsgXAorCXBlcm1zdGF0ZS5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsgXAorCXBlcm1zdGF0ZS5iaXRzX2xlZnQgPSBiaXRzX2xlZnQKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBwcm92aWRlIHRoZSBpbi1saW5lIHBvcnRpb24gb2YgYml0IGZldGNoaW5nLgorICogVXNlIENIRUNLX0JJVF9CVUZGRVIgdG8gZW5zdXJlIHRoZXJlIGFyZSBOIGJpdHMgaW4gZ2V0X2J1ZmZlcgorICogYmVmb3JlIHVzaW5nIEdFVF9CSVRTLCBQRUVLX0JJVFMsIG9yIERST1BfQklUUy4KKyAqIFRoZSB2YXJpYWJsZXMgZ2V0X2J1ZmZlciBhbmQgYml0c19sZWZ0IGFyZSBhc3N1bWVkIHRvIGJlIGxvY2FscywKKyAqIGJ1dCB0aGUgc3RhdGUgc3RydWN0IG1pZ2h0IG5vdCBiZSAoanBlZ19odWZmX2RlY29kZSBuZWVkcyB0aGlzKS4KKyAqCUNIRUNLX0JJVF9CVUZGRVIoc3RhdGUsbixhY3Rpb24pOworICoJCUVuc3VyZSB0aGVyZSBhcmUgTiBiaXRzIGluIGdldF9idWZmZXI7IGlmIHN1c3BlbmQsIHRha2UgYWN0aW9uLgorICogICAgICB2YWwgPSBHRVRfQklUUyhuKTsKKyAqCQlGZXRjaCBuZXh0IE4gYml0cy4KKyAqICAgICAgdmFsID0gUEVFS19CSVRTKG4pOworICoJCUZldGNoIG5leHQgTiBiaXRzIHdpdGhvdXQgcmVtb3ZpbmcgdGhlbSBmcm9tIHRoZSBidWZmZXIuCisgKglEUk9QX0JJVFMobik7CisgKgkJRGlzY2FyZCBuZXh0IE4gYml0cy4KKyAqIFRoZSB2YWx1ZSBOIHNob3VsZCBiZSBhIHNpbXBsZSB2YXJpYWJsZSwgbm90IGFuIGV4cHJlc3Npb24sIGJlY2F1c2UgaXQKKyAqIGlzIGV2YWx1YXRlZCBtdWx0aXBsZSB0aW1lcy4KKyAqLworCisjZGVmaW5lIENIRUNLX0JJVF9CVUZGRVIoc3RhdGUsbmJpdHMsYWN0aW9uKSBcCisJeyBpZiAoYml0c19sZWZ0IDwgKG5iaXRzKSkgeyAgXAorCSAgICBpZiAoISBqcGVnX2ZpbGxfYml0X2J1ZmZlcigmKHN0YXRlKSxnZXRfYnVmZmVyLGJpdHNfbGVmdCxuYml0cykpICBcCisJICAgICAgeyBhY3Rpb247IH0gIFwKKwkgICAgZ2V0X2J1ZmZlciA9IChzdGF0ZSkuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gKHN0YXRlKS5iaXRzX2xlZnQ7IH0gfQorCisjZGVmaW5lIEdFVF9CSVRTKG5iaXRzKSBcCisJKCgoaW50KSAoZ2V0X2J1ZmZlciA+PiAoYml0c19sZWZ0IC09IChuYml0cykpKSkgJiAoKDE8PChuYml0cykpLTEpKQorCisjZGVmaW5lIFBFRUtfQklUUyhuYml0cykgXAorCSgoKGludCkgKGdldF9idWZmZXIgPj4gKGJpdHNfbGVmdCAtICAobmJpdHMpKSkpICYgKCgxPDwobmJpdHMpKS0xKSkKKworI2RlZmluZSBEUk9QX0JJVFMobmJpdHMpIFwKKwkoYml0c19sZWZ0IC09IChuYml0cykpCisKKy8qIExvYWQgdXAgdGhlIGJpdCBidWZmZXIgdG8gYSBkZXB0aCBvZiBhdCBsZWFzdCBuYml0cyAqLworRVhURVJOKGJvb2xlYW4pIGpwZWdfZmlsbF9iaXRfYnVmZmVyCisJSlBQKChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsCisJICAgICByZWdpc3RlciBpbnQgYml0c19sZWZ0LCBpbnQgbmJpdHMpKTsKKworCisvKgorICogQ29kZSBmb3IgZXh0cmFjdGluZyBuZXh0IEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZyb20gaW5wdXQgYml0IHN0cmVhbS4KKyAqIEFnYWluLCB0aGlzIGlzIHRpbWUtY3JpdGljYWwgYW5kIHdlIG1ha2UgdGhlIG1haW4gcGF0aHMgYmUgbWFjcm9zLgorICoKKyAqIFdlIHVzZSBhIGxvb2thaGVhZCB0YWJsZSB0byBwcm9jZXNzIGNvZGVzIG9mIHVwIHRvIEhVRkZfTE9PS0FIRUFEIGJpdHMKKyAqIHdpdGhvdXQgbG9vcGluZy4gIFVzdWFsbHksIG1vcmUgdGhhbiA5NSUgb2YgdGhlIEh1ZmZtYW4gY29kZXMgd2lsbCBiZSA4CisgKiBvciBmZXdlciBiaXRzIGxvbmcuICBUaGUgZmV3IG92ZXJsZW5ndGggY29kZXMgYXJlIGhhbmRsZWQgd2l0aCBhIGxvb3AsCisgKiB3aGljaCBuZWVkIG5vdCBiZSBpbmxpbmUgY29kZS4KKyAqCisgKiBOb3RlcyBhYm91dCB0aGUgSFVGRl9ERUNPREUgbWFjcm86CisgKiAxLiBOZWFyIHRoZSBlbmQgb2YgdGhlIGRhdGEgc2VnbWVudCwgd2UgbWF5IGZhaWwgdG8gZ2V0IGVub3VnaCBiaXRzCisgKiAgICBmb3IgYSBsb29rYWhlYWQuICBJbiB0aGF0IGNhc2UsIHdlIGRvIGl0IHRoZSBoYXJkIHdheS4KKyAqIDIuIElmIHRoZSBsb29rYWhlYWQgdGFibGUgY29udGFpbnMgbm8gZW50cnksIHRoZSBuZXh0IGNvZGUgbXVzdCBiZQorICogICAgbW9yZSB0aGFuIEhVRkZfTE9PS0FIRUFEIGJpdHMgbG9uZy4KKyAqIDMuIGpwZWdfaHVmZl9kZWNvZGUgcmV0dXJucyAtMSBpZiBmb3JjZWQgdG8gc3VzcGVuZC4KKyAqLworCisjZGVmaW5lIEhVRkZfREVDT0RFKHJlc3VsdCxzdGF0ZSxodGJsLGZhaWxhY3Rpb24sc2xvd2xhYmVsKSBcCit7IHJlZ2lzdGVyIGludCBuYiwgbG9vazsgXAorICBpZiAoYml0c19sZWZ0IDwgSFVGRl9MT09LQUhFQUQpIHsgXAorICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCZzdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCwgMCkpIHtmYWlsYWN0aW9uO30gXAorICAgIGdldF9idWZmZXIgPSBzdGF0ZS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSBzdGF0ZS5iaXRzX2xlZnQ7IFwKKyAgICBpZiAoYml0c19sZWZ0IDwgSFVGRl9MT09LQUhFQUQpIHsgXAorICAgICAgbmIgPSAxOyBnb3RvIHNsb3dsYWJlbDsgXAorICAgIH0gXAorICB9IFwKKyAgbG9vayA9IFBFRUtfQklUUyhIVUZGX0xPT0tBSEVBRCk7IFwKKyAgaWYgKChuYiA9IGh0YmwtPmxvb2tfbmJpdHNbbG9va10pICE9IDApIHsgXAorICAgIERST1BfQklUUyhuYik7IFwKKyAgICByZXN1bHQgPSBodGJsLT5sb29rX3N5bVtsb29rXTsgXAorICB9IGVsc2UgeyBcCisgICAgbmIgPSBIVUZGX0xPT0tBSEVBRCsxOyBcCitzbG93bGFiZWw6IFwKKyAgICBpZiAoKHJlc3VsdD1qcGVnX2h1ZmZfZGVjb2RlKCZzdGF0ZSxnZXRfYnVmZmVyLGJpdHNfbGVmdCxodGJsLG5iKSkgPCAwKSBcCisJeyBmYWlsYWN0aW9uOyB9IFwKKyAgICBnZXRfYnVmZmVyID0gc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gc3RhdGUuYml0c19sZWZ0OyBcCisgIH0gXAorfQorCisvKiBPdXQtb2YtbGluZSBjYXNlIGZvciBIdWZmbWFuIGNvZGUgZmV0Y2hpbmcgKi8KK0VYVEVSTihpbnQpIGpwZWdfaHVmZl9kZWNvZGUKKwlKUFAoKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLCByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwKKwkgICAgIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsIGRfZGVyaXZlZF90YmwgKiBodGJsLCBpbnQgbWluX2JpdHMpKTsKZGlmZiAtLWdpdCBhL2pkaW5wdXQuYyBiL2pkaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJhYzhmCi0tLSAvZGV2L251bGwKKysrIGIvamRpbnB1dC5jCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogamRpbnB1dC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW5wdXQgY29udHJvbCBsb2dpYyBmb3IgdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIGNvbnRyb2xsaW5nIHRoZSBkZWNvbXByZXNzb3IncyBpbnB1dAorICogcHJvY2Vzc2luZyAobWFya2VyIHJlYWRpbmcgYW5kIGNvZWZmaWNpZW50IGRlY29kaW5nKS4gIFRoZSBhY3R1YWwgaW5wdXQKKyAqIHJlYWRpbmcgaXMgZG9uZSBpbiBqZG1hcmtlci5jLCBqZGh1ZmYuYywgYW5kIGpkcGh1ZmYuYy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUHJpdmF0ZSBzdGF0ZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgYm9vbGVhbiBpbmhlYWRlcnM7CQkvKiBUUlVFIHVudGlsIGZpcnN0IFNPUyBpcyByZWFjaGVkICovCit9IG15X2lucHV0X2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfaW5wdXRfY29udHJvbGxlciAqIG15X2lucHV0Y3RsX3B0cjsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKGludCkgY29uc3VtZV9tYXJrZXJzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisKKy8qCisgKiBSb3V0aW5lcyB0byBjYWxjdWxhdGUgdmFyaW91cyBxdWFudGl0aWVzIHJlbGF0ZWQgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlLgorICovCisKK0xPQ0FMKHZvaWQpCitpbml0aWFsX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQ2FsbGVkIG9uY2UsIHdoZW4gZmlyc3QgU09TIG1hcmtlciBpcyByZWFjaGVkICovCit7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gSSBjYW4gaGFuZGxlICovCisgIGlmICgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04gfHwKKyAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIEpQRUdfTUFYX0RJTUVOU0lPTik7CisKKyAgLyogRm9yIG5vdywgcHJlY2lzaW9uIG11c3QgbWF0Y2ggY29tcGlsZWQtaW4gdmFsdWUuLi4gKi8KKyAgaWYgKGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSBCSVRTX0lOX0pTQU1QTEUpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BSRUNJU0lPTiwgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKKworICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBjb21wb25lbnRzIHdvbid0IGV4Y2VlZCBpbnRlcm5hbCBhcnJheSBzaXplcyAqLworICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCisJICAgICBNQVhfQ09NUE9ORU5UUyk7CisKKyAgLyogQ29tcHV0ZSBtYXhpbXVtIHNhbXBsaW5nIGZhY3RvcnM7IGNoZWNrIGZhY3RvciB2YWxpZGl0eSAqLworICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSAxOworICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSAxOworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SIHx8CisJY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT52X3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1NBTVBMSU5HKTsKKyAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yLAorCQkJCSAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOworICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCQkJICAgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgIH0KKworICAvKiBXZSBpbml0aWFsaXplIERDVF9zY2FsZWRfc2l6ZSBhbmQgbWluX0RDVF9zY2FsZWRfc2l6ZSB0byBEQ1RTSVpFLgorICAgKiBJbiB0aGUgZnVsbCBkZWNvbXByZXNzb3IsIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGpkbWFzdGVyLmM7CisgICAqIGJ1dCBpbiB0aGUgdHJhbnNjb2RlciwgamRtYXN0ZXIuYyBpcyBub3QgdXNlZCwgc28gd2UgbXVzdCBkbyBpdCBoZXJlLgorICAgKi8KKyAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworCisgIC8qIENvbXB1dGUgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgICAvKiBTaXplIGluIERDVCBibG9ja3MgKi8KKyAgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgLyogZG93bnNhbXBsZWRfd2lkdGggYW5kIGRvd25zYW1wbGVkX2hlaWdodCB3aWxsIGFsc28gYmUgb3ZlcnJpZGRlbiBieQorICAgICAqIGpkbWFzdGVyLmMgaWYgd2UgYXJlIGRvaW5nIGZ1bGwgZGVjb21wcmVzc2lvbi4gIFRoZSB0cmFuc2NvZGVyIGxpYnJhcnkKKyAgICAgKiBkb2Vzbid0IHVzZSB0aGVzZSB2YWx1ZXMsIGJ1dCB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBtaWdodC4KKyAgICAgKi8KKyAgICAvKiBTaXplIGluIHNhbXBsZXMgKi8KKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKTsKKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIC8qIE1hcmsgY29tcG9uZW50IG5lZWRlZCwgdW50aWwgY29sb3IgY29udmVyc2lvbiBzYXlzIG90aGVyd2lzZSAqLworICAgIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgPSBUUlVFOworICAgIC8qIE1hcmsgbm8gcXVhbnRpemF0aW9uIHRhYmxlIHlldCBzYXZlZCBmb3IgY29tcG9uZW50ICovCisgICAgY29tcHB0ci0+cXVhbnRfdGFibGUgPSBOVUxMOworICB9CisKKyAgLyogQ29tcHV0ZSBudW1iZXIgb2YgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvd3MuICovCisgIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgPSAoSkRJTUVOU0lPTikKKyAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKKworICAvKiBEZWNpZGUgd2hldGhlciBmaWxlIGNvbnRhaW5zIG11bHRpcGxlIHNjYW5zICovCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8IGNpbmZvLT5udW1fY29tcG9uZW50cyB8fCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKyAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyA9IFRSVUU7CisgIGVsc2UKKyAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOworfQorCisKK0xPQ0FMKHZvaWQpCitwZXJfc2Nhbl9zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBKUEVHIHNjYW4gKi8KKy8qIGNpbmZvLT5jb21wc19pbl9zY2FuIGFuZCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tdIHdlcmUgc2V0IGZyb20gU09TIG1hcmtlciAqLworeworICBpbnQgY2ksIG1jdWJsa3MsIHRtcDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA9PSAxKSB7CisgICAgCisgICAgLyogTm9uaW50ZXJsZWF2ZWQgKHNpbmdsZS1jb21wb25lbnQpIHNjYW4gKi8KKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF07CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKyAgICAKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYWx3YXlzIG9uZSBibG9jayBwZXIgTUNVICovCisgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gMTsKKyAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gMTsKKyAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gMTsKKyAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gMTsKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbnMsIGl0IGlzIGNvbnZlbmllbnQgdG8gZGVmaW5lIGxhc3Rfcm93X2hlaWdodAorICAgICAqIGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgcm93cyBwcmVzZW50IGluIHRoZSBsYXN0IGlNQ1Ugcm93LgorICAgICAqLworICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKKyAgICAKKyAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAxOworICAgIGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFswXSA9IDA7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgICAgLyogSW50ZXJsZWF2ZWQgKG11bHRpLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8PSAwIHx8IGNpbmZvLT5jb21wc19pbl9zY2FuID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5jb21wc19pbl9zY2FuLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOworICAgIAorICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgLyogU2FtcGxpbmcgZmFjdG9ycyBnaXZlICMgb2YgYmxvY2tzIG9mIGNvbXBvbmVudCBpbiBlYWNoIE1DVSAqLworICAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgLyogRmlndXJlIG51bWJlciBvZiBub24tZHVtbXkgYmxvY2tzIGluIGxhc3QgTUNVIGNvbHVtbiAmIHJvdyAqLworICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV93aWR0aCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV93aWR0aDsKKyAgICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gdG1wOworICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1VfaGVpZ2h0KTsKKyAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX2hlaWdodDsKKyAgICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKKyAgICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KKyAgICAgIG1jdWJsa3MgPSBjb21wcHRyLT5NQ1VfYmxvY2tzOworICAgICAgaWYgKGNpbmZvLT5ibG9ja3NfaW5fTUNVICsgbWN1YmxrcyA+IERfTUFYX0JMT0NLU19JTl9NQ1UpCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTUNVX1NJWkUpOworICAgICAgd2hpbGUgKG1jdWJsa3MtLSA+IDApIHsKKwljaW5mby0+TUNVX21lbWJlcnNoaXBbY2luZm8tPmJsb2Nrc19pbl9NQ1UrK10gPSBjaTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgIH0KK30KKworCisvKgorICogU2F2ZSBhd2F5IGEgY29weSBvZiB0aGUgUS10YWJsZSByZWZlcmVuY2VkIGJ5IGVhY2ggY29tcG9uZW50IHByZXNlbnQKKyAqIGluIHRoZSBjdXJyZW50IHNjYW4sIHVubGVzcyBhbHJlYWR5IHNhdmVkIGR1cmluZyBhIHByaW9yIHNjYW4uCisgKgorICogSW4gYSBtdWx0aXBsZS1zY2FuIEpQRUcgZmlsZSwgdGhlIGVuY29kZXIgY291bGQgYXNzaWduIGRpZmZlcmVudCBjb21wb25lbnRzCisgKiB0aGUgc2FtZSBRLXRhYmxlIHNsb3QgbnVtYmVyLCBidXQgY2hhbmdlIHRhYmxlIGRlZmluaXRpb25zIGJldHdlZW4gc2NhbnMKKyAqIHNvIHRoYXQgZWFjaCBjb21wb25lbnQgdXNlcyBhIGRpZmZlcmVudCBRLXRhYmxlLiAgKFRoZSBJSkcgZW5jb2RlciBpcyBub3QKKyAqIGN1cnJlbnRseSBjYXBhYmxlIG9mIGRvaW5nIHRoaXMsIGJ1dCBvdGhlciBlbmNvZGVycyBtaWdodC4pICBTaW5jZSB3ZSB3YW50CisgKiB0byBiZSBhYmxlIHRvIGRlcXVhbnRpemUgYWxsIHRoZSBjb21wb25lbnRzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRoaXMKKyAqIG1lYW5zIHRoYXQgd2UgaGF2ZSB0byBzYXZlIGF3YXkgdGhlIHRhYmxlIGFjdHVhbGx5IHVzZWQgZm9yIGVhY2ggY29tcG9uZW50LgorICogV2UgZG8gdGhpcyBieSBjb3B5aW5nIHRoZSB0YWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHNjYW4gY29udGFpbmluZworICogdGhlIGNvbXBvbmVudC4KKyAqIFRoZSBKUEVHIHNwZWMgcHJvaGliaXRzIHRoZSBlbmNvZGVyIGZyb20gY2hhbmdpbmcgdGhlIGNvbnRlbnRzIG9mIGEgUS10YWJsZQorICogc2xvdCBiZXR3ZWVuIHNjYW5zIG9mIGEgY29tcG9uZW50IHVzaW5nIHRoYXQgc2xvdC4gIElmIHRoZSBlbmNvZGVyIGRvZXMgc28KKyAqIGFueXdheSwgdGhpcyBkZWNvZGVyIHdpbGwgc2ltcGx5IHVzZSB0aGUgUS10YWJsZSB2YWx1ZXMgdGhhdCB3ZXJlIGN1cnJlbnQKKyAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbiBmb3IgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIGxvb2tzIG9ubHkgYXQgdGhlIHNhdmVkIHF1YW50IHRhYmxlcywKKyAqIG5vdCBhdCB0aGUgY3VycmVudCBRLXRhYmxlIHNsb3RzLgorICovCisKK0xPQ0FMKHZvaWQpCitsYXRjaF9xdWFudF90YWJsZXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBjaSwgcXRibG5vOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKUVVBTlRfVEJMICogcXRibDsKKworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgLyogTm8gd29yayBpZiB3ZSBhbHJlYWR5IHNhdmVkIFEtdGFibGUgZm9yIHRoaXMgY29tcG9uZW50ICovCisgICAgaWYgKGNvbXBwdHItPnF1YW50X3RhYmxlICE9IE5VTEwpCisgICAgICBjb250aW51ZTsKKyAgICAvKiBNYWtlIHN1cmUgc3BlY2lmaWVkIHF1YW50aXphdGlvbiB0YWJsZSBpcyBwcmVzZW50ICovCisgICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOworICAgIGlmIChxdGJsbm8gPCAwIHx8IHF0YmxubyA+PSBOVU1fUVVBTlRfVEJMUyB8fAorCWNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dID09IE5VTEwpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19RVUFOVF9UQUJMRSwgcXRibG5vKTsKKyAgICAvKiBPSywgc2F2ZSBhd2F5IHRoZSBxdWFudGl6YXRpb24gdGFibGUgKi8KKyAgICBxdGJsID0gKEpRVUFOVF9UQkwgKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YoSlFVQU5UX1RCTCkpOworICAgIE1FTUNPUFkocXRibCwgY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10sIFNJWkVPRihKUVVBTlRfVEJMKSk7CisgICAgY29tcHB0ci0+cXVhbnRfdGFibGUgPSBxdGJsOworICB9Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGlucHV0IG1vZHVsZXMgdG8gcmVhZCBhIHNjYW4gb2YgY29tcHJlc3NlZCBkYXRhLgorICogVGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBpcyBkb25lIGJ5IGpkbWFzdGVyLmMgYWZ0ZXIgaW5pdGlhbGl6aW5nCisgKiB0aGUgZW50aXJlIGRlY29tcHJlc3NvciAoZHVyaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcykuCisgKiBTdWJzZXF1ZW50IGNhbGxzIGNvbWUgZnJvbSBjb25zdW1lX21hcmtlcnMsIGJlbG93LgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfaW5wdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOworICBsYXRjaF9xdWFudF90YWJsZXMoY2luZm8pOworICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8pOworICAoKmNpbmZvLT5jb2VmLT5zdGFydF9pbnB1dF9wYXNzKSAoY2luZm8pOworICBjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQgPSBjaW5mby0+Y29lZi0+Y29uc3VtZV9kYXRhOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYWZ0ZXIgaW5wdXR0aW5nIGEgY29tcHJlc3NlZC1kYXRhIHNjYW4uCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBhZnRlciBpdCdzIHJlYWQgYWxsCisgKiB0aGUgZXhwZWN0ZWQgZGF0YSBvZiB0aGUgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7Cit9CisKKworLyoKKyAqIFJlYWQgSlBFRyBtYXJrZXJzIGJlZm9yZSwgYmV0d2Vlbiwgb3IgYWZ0ZXIgY29tcHJlc3NlZC1kYXRhIHNjYW5zLgorICogQ2hhbmdlIHN0YXRlIGFzIG5lY2Vzc2FyeSB3aGVuIGEgbmV3IHNjYW4gaXMgcmVhY2hlZC4KKyAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1NVU1BFTkRFRCwgSlBFR19SRUFDSEVEX1NPUywgb3IgSlBFR19SRUFDSEVEX0VPSS4KKyAqCisgKiBUaGUgY29uc3VtZV9pbnB1dCBtZXRob2QgcG9pbnRlciBwb2ludHMgZWl0aGVyIGhlcmUgb3IgdG8gdGhlCisgKiBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgY29uc3VtZV9kYXRhIHJvdXRpbmUsIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgKiB3ZSBhcmUgcmVhZGluZyBhIGNvbXByZXNzZWQgZGF0YSBzZWdtZW50IG9yIGludGVyLXNlZ21lbnQgbWFya2Vycy4KKyAqLworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGwgPSAobXlfaW5wdXRjdGxfcHRyKSBjaW5mby0+aW5wdXRjdGw7CisgIGludCB2YWw7CisKKyAgaWYgKGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQpIC8qIEFmdGVyIGhpdHRpbmcgRU9JLCByZWFkIG5vIGZ1cnRoZXIgKi8KKyAgICByZXR1cm4gSlBFR19SRUFDSEVEX0VPSTsKKworICB2YWwgPSAoKmNpbmZvLT5tYXJrZXItPnJlYWRfbWFya2VycykgKGNpbmZvKTsKKworICBzd2l0Y2ggKHZhbCkgeworICBjYXNlIEpQRUdfUkVBQ0hFRF9TT1M6CS8qIEZvdW5kIFNPUyAqLworICAgIGlmIChpbnB1dGN0bC0+aW5oZWFkZXJzKSB7CS8qIDFzdCBTT1MgKi8KKyAgICAgIGluaXRpYWxfc2V0dXAoY2luZm8pOworICAgICAgaW5wdXRjdGwtPmluaGVhZGVycyA9IEZBTFNFOworICAgICAgLyogTm90ZTogc3RhcnRfaW5wdXRfcGFzcyBtdXN0IGJlIGNhbGxlZCBieSBqZG1hc3Rlci5jCisgICAgICAgKiBiZWZvcmUgYW55IG1vcmUgaW5wdXQgY2FuIGJlIGNvbnN1bWVkLiAgamRhcGltaW4uYyBpcworICAgICAgICogcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyB0aGlzIHNlcXVlbmNpbmcuCisgICAgICAgKi8KKyAgICB9IGVsc2UgewkJCS8qIDJuZCBvciBsYXRlciBTT1MgbWFya2VyICovCisgICAgICBpZiAoISBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucykKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0VPSV9FWFBFQ1RFRCk7IC8qIE9vcHMsIEkgd2Fzbid0IGV4cGVjdGluZyB0aGlzISAqLworICAgICAgc3RhcnRfaW5wdXRfcGFzcyhjaW5mbyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEpQRUdfUkVBQ0hFRF9FT0k6CS8qIEZvdW5kIEVPSSAqLworICAgIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBUUlVFOworICAgIGlmIChpbnB1dGN0bC0+aW5oZWFkZXJzKSB7CS8qIFRhYmxlcy1vbmx5IGRhdGFzdHJlYW0sIGFwcGFyZW50bHkgKi8KKyAgICAgIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09GKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfU09GX05PX1NPUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjb2VmIGN0bHIncyBkZWNvbXByZXNzX2RhdGEgcm91dGluZQorICAgICAgICogaWYgdXNlciBzZXQgb3V0cHV0X3NjYW5fbnVtYmVyIGxhcmdlciB0aGFuIG51bWJlciBvZiBzY2Fucy4KKyAgICAgICAqLworICAgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPiBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIpCisJY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSlBFR19TVVNQRU5ERUQ6CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdmFsOworfQorCisKKy8qCisgKiBSZXNldCBzdGF0ZSB0byBiZWdpbiBhIGZyZXNoIGRhdGFzdHJlYW0uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZXNldF9pbnB1dF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGwgPSAobXlfaW5wdXRjdGxfcHRyKSBjaW5mby0+aW5wdXRjdGw7CisKKyAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX2lucHV0ID0gY29uc3VtZV9tYXJrZXJzOworICBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOyAvKiAidW5rbm93biIgd291bGQgYmUgYmV0dGVyICovCisgIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBGQUxTRTsKKyAgaW5wdXRjdGwtPmluaGVhZGVycyA9IFRSVUU7CisgIC8qIFJlc2V0IG90aGVyIG1vZHVsZXMgKi8KKyAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICgqY2luZm8tPm1hcmtlci0+cmVzZXRfbWFya2VyX3JlYWRlcikgKGNpbmZvKTsKKyAgLyogUmVzZXQgcHJvZ3Jlc3Npb24gc3RhdGUgLS0gd291bGQgYmUgY2xlYW5lciBpZiBlbnRyb3B5IGRlY29kZXIgZGlkIHRoaXMgKi8KKyAgY2luZm8tPmNvZWZfYml0cyA9IE5VTEw7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGlucHV0IGNvbnRyb2xsZXIgbW9kdWxlLgorICogVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlLCB3aGVuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBpcyBjcmVhdGVkLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfaW5wdXRfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsOworCisgIC8qIENyZWF0ZSBzdWJvYmplY3QgaW4gcGVybWFuZW50IHBvb2wgKi8KKyAgaW5wdXRjdGwgPSAobXlfaW5wdXRjdGxfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCVNJWkVPRihteV9pbnB1dF9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5pbnB1dGN0bCA9IChzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyICopIGlucHV0Y3RsOworICAvKiBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycyAqLworICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7CisgIGlucHV0Y3RsLT5wdWIucmVzZXRfaW5wdXRfY29udHJvbGxlciA9IHJlc2V0X2lucHV0X2NvbnRyb2xsZXI7CisgIGlucHV0Y3RsLT5wdWIuc3RhcnRfaW5wdXRfcGFzcyA9IHN0YXJ0X2lucHV0X3Bhc3M7CisgIGlucHV0Y3RsLT5wdWIuZmluaXNoX2lucHV0X3Bhc3MgPSBmaW5pc2hfaW5wdXRfcGFzczsKKyAgLyogSW5pdGlhbGl6ZSBzdGF0ZTogY2FuJ3QgdXNlIHJlc2V0X2lucHV0X2NvbnRyb2xsZXIgc2luY2Ugd2UgZG9uJ3QKKyAgICogd2FudCB0byB0cnkgdG8gcmVzZXQgb3RoZXIgbW9kdWxlcyB5ZXQuCisgICAqLworICBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOyAvKiAidW5rbm93biIgd291bGQgYmUgYmV0dGVyICovCisgIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBGQUxTRTsKKyAgaW5wdXRjdGwtPmluaGVhZGVycyA9IFRSVUU7Cit9CmRpZmYgLS1naXQgYS9qZG1haW5jdC5jIGIvamRtYWluY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M5NTZmCi0tLSAvZGV2L251bGwKKysrIGIvamRtYWluY3QuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqIGpkbWFpbmN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgZGVjb21wcmVzc2lvbi4KKyAqIFRoZSBtYWluIGJ1ZmZlciBsaWVzIGJldHdlZW4gdGhlIEpQRUcgZGVjb21wcmVzc29yIHByb3BlciBhbmQgdGhlCisgKiBwb3N0LXByb2Nlc3NvcjsgaXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSBpbiB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgYnlwYXNzZWQgaW4gcmF3LWRhdGEgbW9kZSwgc2luY2UgdGhlIGFwcGxpY2F0aW9uCisgKiBzdXBwbGllcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgbWFpbiBidWZmZXIgaW4gdGhhdCBjYXNlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogSW4gdGhlIGN1cnJlbnQgc3lzdGVtIGRlc2lnbiwgdGhlIG1haW4gYnVmZmVyIG5lZWQgbmV2ZXIgYmUgYSBmdWxsLWltYWdlCisgKiBidWZmZXI7IGFueSBmdWxsLWhlaWdodCBidWZmZXJzIHdpbGwgYmUgZm91bmQgaW5zaWRlIHRoZSBjb2VmZmljaWVudCBvcgorICogcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlcnMuICBOb25ldGhlbGVzcywgdGhlIG1haW4gY29udHJvbGxlciBpcyBub3QKKyAqIHRyaXZpYWwuICBJdHMgcmVzcG9uc2liaWxpdHkgaXMgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgZm9yIHVwc2FtcGxpbmcvCisgKiByZXNjYWxpbmcsIGFuZCBkb2luZyB0aGlzIGluIGFuIGVmZmljaWVudCBmYXNoaW9uIGlzIGEgYml0IHRyaWNreS4KKyAqCisgKiBQb3N0cHJvY2Vzc29yIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAorICogaXMgZGVmaW5lZCB0byBiZSAodl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUpCisgKiBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIChXZSByZXF1aXJlIERDVF9zY2FsZWRfc2l6ZSB2YWx1ZXMgdG8gYmUKKyAqIGNob3NlbiBzdWNoIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgaW50ZWdlcnMuICBJbiBwcmFjdGljZSBEQ1Rfc2NhbGVkX3NpemUKKyAqIHZhbHVlcyB3aWxsIGxpa2VseSBiZSBwb3dlcnMgb2YgdHdvLCBzbyB3ZSBhY3R1YWxseSBoYXZlIHRoZSBzdHJvbmdlcgorICogY29uZGl0aW9uIHRoYXQgRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyBhbiBpbnRlZ2VyLikKKyAqIFVwc2FtcGxpbmcgd2lsbCB0eXBpY2FsbHkgcHJvZHVjZSBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIGZyb20gZWFjaAorICogcm93IGdyb3VwICh0aW1lcyBhbnkgYWRkaXRpb25hbCBzY2FsZSBmYWN0b3IgdGhhdCB0aGUgdXBzYW1wbGVyIGlzCisgKiBhcHBseWluZykuCisgKgorICogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgd2lsbCBkZWxpdmVyIGRhdGEgdG8gdXMgb25lIGlNQ1Ugcm93IGF0IGEgdGltZTsKKyAqIGVhY2ggaU1DVSByb3cgY29udGFpbnMgdl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cywgb3IKKyAqIGV4YWN0bHkgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzLiAgKFRoaXMgYW1vdW50IG9mIGRhdGEgY29ycmVzcG9uZHMKKyAqIHRvIG9uZSByb3cgb2YgTUNVcyB3aGVuIHRoZSBpbWFnZSBpcyBmdWxseSBpbnRlcmxlYXZlZC4pICBOb3RlIHRoYXQgdGhlCisgKiBudW1iZXIgb2Ygc2FtcGxlIHJvd3MgdmFyaWVzIGFjcm9zcyBjb21wb25lbnRzLCBidXQgdGhlIG51bWJlciBvZiByb3cKKyAqIGdyb3VwcyBkb2VzIG5vdC4gIFNvbWUgZ2FyYmFnZSBzYW1wbGUgcm93cyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGxhc3QgaU1DVQorICogcm93IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLgorICoKKyAqIERlcGVuZGluZyBvbiB0aGUgdmVydGljYWwgc2NhbGluZyBhbGdvcml0aG0gdXNlZCwgdGhlIHVwc2FtcGxlciBtYXkgbmVlZAorICogYWNjZXNzIHRvIHRoZSBzYW1wbGUgcm93KHMpIGFib3ZlIGFuZCBiZWxvdyBpdHMgY3VycmVudCBpbnB1dCByb3cgZ3JvdXAuCisgKiBUaGUgdXBzYW1wbGVyIGlzIHJlcXVpcmVkIHRvIHNldCBuZWVkX2NvbnRleHRfcm93cyBUUlVFIGF0IGdsb2JhbCBzZWxlY3Rpb24KKyAqIHRpbWUgaWYgc28uICBXaGVuIG5lZWRfY29udGV4dF9yb3dzIGlzIEZBTFNFLCB0aGlzIGNvbnRyb2xsZXIgY2FuIHNpbXBseQorICogb2J0YWluIG9uZSBpTUNVIHJvdyBhdCBhIHRpbWUgZnJvbSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBhbmQgZG9sZSBpdAorICogb3V0IGFzIHJvdyBncm91cHMgdG8gdGhlIHBvc3Rwcm9jZXNzb3IuCisgKgorICogV2hlbiBuZWVkX2NvbnRleHRfcm93cyBpcyBUUlVFLCB0aGlzIGNvbnRyb2xsZXIgZ3VhcmFudGVlcyB0aGF0IHRoZSBidWZmZXIKKyAqIHBhc3NlZCB0byBwb3N0cHJvY2Vzc2luZyBjb250YWlucyBhdCBsZWFzdCBvbmUgcm93IGdyb3VwJ3Mgd29ydGggb2Ygc2FtcGxlcworICogYWJvdmUgYW5kIGJlbG93IHRoZSByb3cgZ3JvdXAocykgYmVpbmcgcHJvY2Vzc2VkLiAgTm90ZSB0aGF0IHRoZSBjb250ZXh0CisgKiByb3dzICJhYm92ZSIgdGhlIGZpcnN0IHBhc3NlZCByb3cgZ3JvdXAgYXBwZWFyIGF0IG5lZ2F0aXZlIHJvdyBvZmZzZXRzIGluCisgKiB0aGUgcGFzc2VkIGJ1ZmZlci4gIEF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHRoZSByZXF1aXJlZAorICogY29udGV4dCByb3dzIGFyZSBtYW51ZmFjdHVyZWQgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBzYW1wbGUKKyAqIHJvdzsgdGhpcyBhdm9pZHMgaGF2aW5nIHNwZWNpYWwgY2FzZXMgaW4gdGhlIHVwc2FtcGxpbmcgaW5uZXIgbG9vcHMuCisgKgorICogVGhlIGFtb3VudCBvZiBjb250ZXh0IGlzIGZpeGVkIGF0IG9uZSByb3cgZ3JvdXAganVzdCBiZWNhdXNlIHRoYXQncyBhCisgKiBjb252ZW5pZW50IG51bWJlciBmb3IgdGhpcyBjb250cm9sbGVyIHRvIHdvcmsgd2l0aC4gIFRoZSBleGlzdGluZworICogdXBzYW1wbGVycyByZWFsbHkgb25seSBuZWVkIG9uZSBzYW1wbGUgcm93IG9mIGNvbnRleHQuICBBbiB1cHNhbXBsZXIKKyAqIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IG91dHB1dCByZXNjYWxpbmcgbWlnaHQgd2lzaCBmb3IgbW9yZSB0aGFuIG9uZSByb3cKKyAqIGdyb3VwIG9mIGNvbnRleHQgd2hlbiBzaHJpbmtpbmcgdGhlIGltYWdlOyB0b3VnaCwgd2UgZG9uJ3QgaGFuZGxlIHRoYXQuCisgKiAoVGhpcyBpcyBqdXN0aWZpZWQgYnkgdGhlIGFzc3VtcHRpb24gdGhhdCBkb3duc2l6aW5nIHdpbGwgYmUgaGFuZGxlZCBtb3N0bHkKKyAqIGJ5IGFkanVzdGluZyB0aGUgRENUX3NjYWxlZF9zaXplIHZhbHVlcywgc28gdGhhdCB0aGUgYWN0dWFsIHNjYWxlIGZhY3RvciBhdAorICogdGhlIHVwc2FtcGxlIHN0ZXAgbmVlZG4ndCBiZSBtdWNoIGxlc3MgdGhhbiBvbmUuKQorICoKKyAqIFRvIHByb3ZpZGUgdGhlIGRlc2lyZWQgY29udGV4dCwgd2UgaGF2ZSB0byByZXRhaW4gdGhlIGxhc3QgdHdvIHJvdyBncm91cHMKKyAqIG9mIG9uZSBpTUNVIHJvdyB3aGlsZSByZWFkaW5nIGluIHRoZSBuZXh0IGlNQ1Ugcm93LiAgKFRoZSBsYXN0IHJvdyBncm91cAorICogY2FuJ3QgYmUgcHJvY2Vzc2VkIHVudGlsIHdlIGhhdmUgYW5vdGhlciByb3cgZ3JvdXAgZm9yIGl0cyBiZWxvdy1jb250ZXh0LAorICogYW5kIHNvIHdlIGhhdmUgdG8gc2F2ZSB0aGUgbmV4dC10by1sYXN0IGdyb3VwIHRvbyBmb3IgaXRzIGFib3ZlLWNvbnRleHQuKQorICogV2UgY291bGQgZG8gdGhpcyBtb3N0IHNpbXBseSBieSBjb3B5aW5nIGRhdGEgYXJvdW5kIGluIG91ciBidWZmZXIsIGJ1dAorICogdGhhdCdkIGJlIHZlcnkgc2xvdy4gIFdlIGNhbiBhdm9pZCBjb3B5aW5nIGFueSBkYXRhIGJ5IGNyZWF0aW5nIGEgcmF0aGVyCisgKiBzdHJhbmdlIHBvaW50ZXIgc3RydWN0dXJlLiAgSGVyZSdzIGhvdyBpdCB3b3Jrcy4gIFdlIGFsbG9jYXRlIGEgd29ya3NwYWNlCisgKiBjb25zaXN0aW5nIG9mIE0rMiByb3cgZ3JvdXBzICh3aGVyZSBNID0gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyB0aGUgbnVtYmVyCisgKiBvZiByb3cgZ3JvdXBzIHBlciBpTUNVIHJvdykuICBXZSBjcmVhdGUgdHdvIHNldHMgb2YgcmVkdW5kYW50IHBvaW50ZXJzIHRvCisgKiB0aGUgd29ya3NwYWNlLiAgTGFiZWxpbmcgdGhlIHBoeXNpY2FsIHJvdyBncm91cHMgMCB0byBNKzEsIHRoZSBzeW50aGVzaXplZAorICogcG9pbnRlciBsaXN0cyBsb29rIGxpa2UgdGhpczoKKyAqICAgICAgICAgICAgICAgICAgIE0rMSAgICAgICAgICAgICAgICAgICAgICAgICAgTS0xCisgKiBtYXN0ZXIgcG9pbnRlciAtLT4gMCAgICAgICAgIG1hc3RlciBwb2ludGVyIC0tPiAwCisgKiAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgKiAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICogICAgICAgICAgICAgICAgICAgTS0zICAgICAgICAgICAgICAgICAgICAgICAgICBNLTMKKyAqICAgICAgICAgICAgICAgICAgIE0tMiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0KKyAqICAgICAgICAgICAgICAgICAgIE0tMSAgICAgICAgICAgICAgICAgICAgICAgICAgTSsxCisgKiAgICAgICAgICAgICAgICAgICAgTSAgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMgorICogICAgICAgICAgICAgICAgICAgTSsxICAgICAgICAgICAgICAgICAgICAgICAgICBNLTEKKyAqICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAqIFdlIHJlYWQgYWx0ZXJuYXRlIGlNQ1Ugcm93cyB1c2luZyBlYWNoIG1hc3RlciBwb2ludGVyOyB0aHVzIHRoZSBsYXN0IHR3bworICogcm93IGdyb3VwcyBvZiB0aGUgcHJldmlvdXMgaU1DVSByb3cgcmVtYWluIHVuLW92ZXJ3cml0dGVuIGluIHRoZSB3b3Jrc3BhY2UuCisgKiBUaGUgcG9pbnRlciBsaXN0cyBhcmUgc2V0IHVwIHNvIHRoYXQgdGhlIHJlcXVpcmVkIGNvbnRleHQgcm93cyBhcHBlYXIgdG8KKyAqIGJlIGFkamFjZW50IHRvIHRoZSBwcm9wZXIgcGxhY2VzIHdoZW4gd2UgcGFzcyB0aGUgcG9pbnRlciBsaXN0cyB0byB0aGUKKyAqIHVwc2FtcGxlci4KKyAqCisgKiBUaGUgYWJvdmUgcGljdHVyZXMgZGVzY3JpYmUgdGhlIG5vcm1hbCBzdGF0ZSBvZiB0aGUgcG9pbnRlciBsaXN0cy4KKyAqIEF0IHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgZGlkZGxlIHRoZSBwb2ludGVyIGxpc3RzIHRvIGR1cGxpY2F0ZQorICogdGhlIGZpcnN0IG9yIGxhc3Qgc2FtcGxlIHJvdyBhcyBuZWNlc3NhcnkgKHRoaXMgaXMgY2hlYXBlciB0aGFuIGNvcHlpbmcKKyAqIHNhbXBsZSByb3dzIGFyb3VuZCkuCisgKgorICogVGhpcyBzY2hlbWUgYnJlYWtzIGRvd24gaWYgTSA8IDIsIGllLCBtaW5fRENUX3NjYWxlZF9zaXplIGlzIDEuICBJbiB0aGF0CisgKiBzaXR1YXRpb24gZWFjaCBpTUNVIHJvdyBwcm92aWRlcyBvbmx5IG9uZSByb3cgZ3JvdXAgc28gdGhlIGJ1ZmZlcmluZyBsb2dpYworICogbXVzdCBiZSBkaWZmZXJlbnQgKGVnLCB3ZSBtdXN0IHJlYWQgdHdvIGlNQ1Ugcm93cyBiZWZvcmUgd2UgY2FuIGVtaXQgdGhlCisgKiBmaXJzdCByb3cgZ3JvdXApLiAgRm9yIG5vdywgd2Ugc2ltcGx5IGRvIG5vdCBzdXBwb3J0IHByb3ZpZGluZyBjb250ZXh0CisgKiByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyAxLiAgVGhhdCBjb21iaW5hdGlvbiBzZWVtcyB1bmxpa2VseSB0bworICogYmUgd29ydGggcHJvdmlkaW5nIC0tLSBpZiBzb21lb25lIHdhbnRzIGEgMS84dGgtc2l6ZSBwcmV2aWV3LCB0aGV5IHByb2JhYmx5CisgKiB3YW50IGl0IHF1aWNrIGFuZCBkaXJ0eSwgc28gYSBjb250ZXh0LWZyZWUgdXBzYW1wbGVyIGlzIHN1ZmZpY2llbnQuCisgKi8KKworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gYWxsb2NhdGVkIHdvcmtzcGFjZSAoTSBvciBNKzIgcm93IGdyb3VwcykuICovCisgIEpTQU1QQVJSQVkgYnVmZmVyW01BWF9DT01QT05FTlRTXTsKKworICBib29sZWFuIGJ1ZmZlcl9mdWxsOwkJLyogSGF2ZSB3ZSBnb3R0ZW4gYW4gaU1DVSByb3cgZnJvbSBkZWNvZGVyPyAqLworICBKRElNRU5TSU9OIHJvd2dyb3VwX2N0cjsJLyogY291bnRzIHJvdyBncm91cHMgb3V0cHV0IHRvIHBvc3Rwcm9jZXNzb3IgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgY2FzZS4gKi8KKworICAvKiBUaGVzZSBhcmUgdGhlIG1hc3RlciBwb2ludGVycyB0byB0aGUgZnVubnktb3JkZXIgcG9pbnRlciBsaXN0cy4gKi8KKyAgSlNBTVBJTUFHRSB4YnVmZmVyWzJdOwkvKiBwb2ludGVycyB0byB3ZWlyZCBwb2ludGVyIGxpc3RzICovCisKKyAgaW50IHdoaWNocHRyOwkJCS8qIGluZGljYXRlcyB3aGljaCBwb2ludGVyIHNldCBpcyBub3cgaW4gdXNlICovCisgIGludCBjb250ZXh0X3N0YXRlOwkJLyogcHJvY2Vzc19kYXRhIHN0YXRlIG1hY2hpbmUgc3RhdHVzICovCisgIEpESU1FTlNJT04gcm93Z3JvdXBzX2F2YWlsOwkvKiByb3cgZ3JvdXBzIGF2YWlsYWJsZSB0byBwb3N0cHJvY2Vzc29yICovCisgIEpESU1FTlNJT04gaU1DVV9yb3dfY3RyOwkvKiBjb3VudHMgaU1DVSByb3dzIHRvIGRldGVjdCBpbWFnZSB0b3AvYm90ICovCit9IG15X21haW5fY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9tYWluX2NvbnRyb2xsZXIgKiBteV9tYWluX3B0cjsKKworLyogY29udGV4dF9zdGF0ZSB2YWx1ZXM6ICovCisjZGVmaW5lIENUWF9QUkVQQVJFX0ZPUl9JTUNVCTAJLyogbmVlZCB0byBwcmVwYXJlIGZvciBNQ1Ugcm93ICovCisjZGVmaW5lIENUWF9QUk9DRVNTX0lNQ1UJMQkvKiBmZWVkaW5nIGlNQ1UgdG8gcG9zdHByb2Nlc3NvciAqLworI2RlZmluZSBDVFhfUE9TVFBPTkVEX1JPVwkyCS8qIGZlZWRpbmcgcG9zdHBvbmVkIHJvdyBncm91cCAqLworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9jb250ZXh0X21haW4KKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKwkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKwkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCitMT0NBTCh2b2lkKQorYWxsb2NfZnVubnlfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGZ1bm55IHBvaW50ZXIgbGlzdHMuCisgKiBUaGlzIGlzIGRvbmUgb25seSBvbmNlLCBub3Qgb25jZSBwZXIgcGFzcy4KKyAqLworeworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpLCByZ3JvdXA7CisgIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpTQU1QQVJSQVkgeGJ1ZjsKKworICAvKiBHZXQgdG9wLWxldmVsIHNwYWNlIGZvciBjb21wb25lbnQgYXJyYXkgcG9pbnRlcnMuCisgICAqIFdlIGFsbG9jIGJvdGggYXJyYXlzIHdpdGggb25lIGNhbGwgdG8gc2F2ZSBhIGZldyBjeWNsZXMuCisgICAqLworICBtYWluLT54YnVmZmVyWzBdID0gKEpTQU1QSU1BR0UpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMgKiAyICogU0laRU9GKEpTQU1QQVJSQVkpKTsKKyAgbWFpbi0+eGJ1ZmZlclsxXSA9IG1haW4tPnhidWZmZXJbMF0gKyBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KKyAgICAvKiBHZXQgc3BhY2UgZm9yIHBvaW50ZXIgbGlzdHMgLS0tIE0rNCByb3cgZ3JvdXBzIGluIGVhY2ggbGlzdC4KKyAgICAgKiBXZSBhbGxvYyBib3RoIHBvaW50ZXIgbGlzdHMgd2l0aCBvbmUgY2FsbCB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KKyAgICAgKi8KKyAgICB4YnVmID0gKEpTQU1QQVJSQVkpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgMiAqIChyZ3JvdXAgKiAoTSArIDQpKSAqIFNJWkVPRihKU0FNUFJPVykpOworICAgIHhidWYgKz0gcmdyb3VwOwkJLyogd2FudCBvbmUgcm93IGdyb3VwIGF0IG5lZ2F0aXZlIG9mZnNldHMgKi8KKyAgICBtYWluLT54YnVmZmVyWzBdW2NpXSA9IHhidWY7CisgICAgeGJ1ZiArPSByZ3JvdXAgKiAoTSArIDQpOworICAgIG1haW4tPnhidWZmZXJbMV1bY2ldID0geGJ1ZjsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCittYWtlX2Z1bm55X3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQ3JlYXRlIHRoZSBmdW5ueSBwb2ludGVyIGxpc3RzIGRpc2N1c3NlZCBpbiB0aGUgY29tbWVudHMgYWJvdmUuCisgKiBUaGUgYWN0dWFsIHdvcmtzcGFjZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCAoaW4gbWFpbi0+YnVmZmVyKSwKKyAqIGFuZCB0aGUgc3BhY2UgZm9yIHRoZSBwb2ludGVyIGxpc3RzIGlzIGFsbG9jYXRlZCB0b28uCisgKiBUaGlzIHJvdXRpbmUganVzdCBmaWxscyBpbiB0aGUgY3VyaW91c2x5IG9yZGVyZWQgbGlzdHMuCisgKiBUaGlzIHdpbGwgYmUgcmVwZWF0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgaSwgcmdyb3VwOworICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIGJ1ZiwgeGJ1ZjAsIHhidWYxOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgeGJ1ZjAgPSBtYWluLT54YnVmZmVyWzBdW2NpXTsKKyAgICB4YnVmMSA9IG1haW4tPnhidWZmZXJbMV1bY2ldOworICAgIC8qIEZpcnN0IGNvcHkgdGhlIHdvcmtzcGFjZSBwb2ludGVycyBhcy1pcyAqLworICAgIGJ1ZiA9IG1haW4tPmJ1ZmZlcltjaV07CisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIChNICsgMik7IGkrKykgeworICAgICAgeGJ1ZjBbaV0gPSB4YnVmMVtpXSA9IGJ1ZltpXTsKKyAgICB9CisgICAgLyogSW4gdGhlIHNlY29uZCBsaXN0LCBwdXQgdGhlIGxhc3QgZm91ciByb3cgZ3JvdXBzIGluIHN3YXBwZWQgb3JkZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogMjsgaSsrKSB7CisgICAgICB4YnVmMVtyZ3JvdXAqKE0tMikgKyBpXSA9IGJ1ZltyZ3JvdXAqTSArIGldOworICAgICAgeGJ1ZjFbcmdyb3VwKk0gKyBpXSA9IGJ1ZltyZ3JvdXAqKE0tMikgKyBpXTsKKyAgICB9CisgICAgLyogVGhlIHdyYXBhcm91bmQgcG9pbnRlcnMgYXQgdG9wIGFuZCBib3R0b20gd2lsbCBiZSBmaWxsZWQgbGF0ZXIKKyAgICAgKiAoc2VlIHNldF93cmFwYXJvdW5kX3BvaW50ZXJzLCBiZWxvdykuICBJbml0aWFsbHkgd2Ugd2FudCB0aGUgImFib3ZlIgorICAgICAqIHBvaW50ZXJzIHRvIGR1cGxpY2F0ZSB0aGUgZmlyc3QgYWN0dWFsIGRhdGEgbGluZS4gIFRoaXMgb25seSBuZWVkcworICAgICAqIHRvIGhhcHBlbiBpbiB4YnVmZmVyWzBdLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXA7IGkrKykgeworICAgICAgeGJ1ZjBbaSAtIHJncm91cF0gPSB4YnVmMFswXTsKKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBTZXQgdXAgdGhlICJ3cmFwYXJvdW5kIiBwb2ludGVycyBhdCB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgcG9pbnRlciBsaXN0cy4KKyAqIFRoaXMgY2hhbmdlcyB0aGUgcG9pbnRlciBsaXN0IHN0YXRlIGZyb20gdG9wLW9mLWltYWdlIHRvIHRoZSBub3JtYWwgc3RhdGUuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgaSwgcmdyb3VwOworICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIHhidWYwLCB4YnVmMTsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIHhidWYwID0gbWFpbi0+eGJ1ZmZlclswXVtjaV07CisgICAgeGJ1ZjEgPSBtYWluLT54YnVmZmVyWzFdW2NpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwOyBpKyspIHsKKyAgICAgIHhidWYwW2kgLSByZ3JvdXBdID0geGJ1ZjBbcmdyb3VwKihNKzEpICsgaV07CisgICAgICB4YnVmMVtpIC0gcmdyb3VwXSA9IHhidWYxW3Jncm91cCooTSsxKSArIGldOworICAgICAgeGJ1ZjBbcmdyb3VwKihNKzIpICsgaV0gPSB4YnVmMFtpXTsKKyAgICAgIHhidWYxW3Jncm91cCooTSsyKSArIGldID0geGJ1ZjFbaV07CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK3NldF9ib3R0b21fcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBDaGFuZ2UgdGhlIHBvaW50ZXIgbGlzdHMgdG8gZHVwbGljYXRlIHRoZSBsYXN0IHNhbXBsZSByb3cgYXQgdGhlIGJvdHRvbQorICogb2YgdGhlIGltYWdlLiAgd2hpY2hwdHIgaW5kaWNhdGVzIHdoaWNoIHhidWZmZXIgaG9sZHMgdGhlIGZpbmFsIGlNQ1Ugcm93LgorICogQWxzbyBzZXRzIHJvd2dyb3Vwc19hdmFpbCB0byBpbmRpY2F0ZSBudW1iZXIgb2Ygbm9uZHVtbXkgcm93IGdyb3VwcyBpbiByb3cuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgaSwgcmdyb3VwLCBpTUNVaGVpZ2h0LCByb3dzX2xlZnQ7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpTQU1QQVJSQVkgeGJ1ZjsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIENvdW50IHNhbXBsZSByb3dzIGluIG9uZSBpTUNVIHJvdyBhbmQgaW4gb25lIHJvdyBncm91cCAqLworICAgIGlNQ1VoZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIHJncm91cCA9IGlNQ1VoZWlnaHQgLyBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICAvKiBDb3VudCBub25kdW1teSBzYW1wbGUgcm93cyByZW1haW5pbmcgZm9yIHRoaXMgY29tcG9uZW50ICovCisgICAgcm93c19sZWZ0ID0gKGludCkgKGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCAlIChKRElNRU5TSU9OKSBpTUNVaGVpZ2h0KTsKKyAgICBpZiAocm93c19sZWZ0ID09IDApIHJvd3NfbGVmdCA9IGlNQ1VoZWlnaHQ7CisgICAgLyogQ291bnQgbm9uZHVtbXkgcm93IGdyb3Vwcy4gIFNob3VsZCBnZXQgc2FtZSBhbnN3ZXIgZm9yIGVhY2ggY29tcG9uZW50LAorICAgICAqIHNvIHdlIG5lZWQgb25seSBkbyBpdCBvbmNlLgorICAgICAqLworICAgIGlmIChjaSA9PSAwKSB7CisgICAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKChyb3dzX2xlZnQtMSkgLyByZ3JvdXAgKyAxKTsKKyAgICB9CisgICAgLyogRHVwbGljYXRlIHRoZSBsYXN0IHJlYWwgc2FtcGxlIHJvdyByZ3JvdXAqMiB0aW1lczsgdGhpcyBwYWRzIG91dCB0aGUKKyAgICAgKiBsYXN0IHBhcnRpYWwgcm93Z3JvdXAgYW5kIGVuc3VyZXMgYXQgbGVhc3Qgb25lIGZ1bGwgcm93Z3JvdXAgb2YgY29udGV4dC4KKyAgICAgKi8KKyAgICB4YnVmID0gbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl1bY2ldOworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAyOyBpKyspIHsKKyAgICAgIHhidWZbcm93c19sZWZ0ICsgaV0gPSB4YnVmW3Jvd3NfbGVmdC0xXTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICBzd2l0Y2ggKHBhc3NfbW9kZSkgeworICBjYXNlIEpCVUZfUEFTU19USFJVOgorICAgIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7CisgICAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbjsKKyAgICAgIG1ha2VfZnVubnlfcG9pbnRlcnMoY2luZm8pOyAvKiBDcmVhdGUgdGhlIHhidWZmZXJbXSBsaXN0cyAqLworICAgICAgbWFpbi0+d2hpY2hwdHIgPSAwOwkvKiBSZWFkIGZpcnN0IGlNQ1Ugcm93IGludG8geGJ1ZmZlclswXSAqLworICAgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUkVQQVJFX0ZPUl9JTUNVOworICAgICAgbWFpbi0+aU1DVV9yb3dfY3RyID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLyogU2ltcGxlIGNhc2Ugd2l0aCBubyBjb250ZXh0IG5lZWRlZCAqLworICAgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKKyAgICB9CisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsJLyogTWFyayBidWZmZXIgZW1wdHkgKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICAgIGJyZWFrOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKKyAgICAvKiBGb3IgbGFzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24sIGp1c3QgY3JhbmsgdGhlIHBvc3Rwcm9jZXNzb3IgKi8KKyAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3Q7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEuCisgKiBUaGlzIGhhbmRsZXMgdGhlIHNpbXBsZSBjYXNlIHdoZXJlIG5vIGNvbnRleHQgaXMgcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBKRElNRU5TSU9OIHJvd2dyb3Vwc19hdmFpbDsKKworICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLworICBpZiAoISBtYWluLT5idWZmZXJfZnVsbCkgeworICAgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKQorICAgICAgcmV0dXJuOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBUUlVFOwkvKiBPSywgd2UgaGF2ZSBhbiBpTUNVIHJvdyB0byB3b3JrIHdpdGggKi8KKyAgfQorCisgIC8qIFRoZXJlIGFyZSBhbHdheXMgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzIGluIGFuIGlNQ1Ugcm93LiAqLworICByb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIC8qIE5vdGU6IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCB3ZSBtYXkgcGFzcyBleHRyYSBnYXJiYWdlIHJvdyBncm91cHMKKyAgICogdG8gdGhlIHBvc3Rwcm9jZXNzb3IuICBUaGUgcG9zdHByb2Nlc3NvciBoYXMgdG8gY2hlY2sgZm9yIGJvdHRvbQorICAgKiBvZiBpbWFnZSBhbnl3YXkgKGF0IHJvdyByZXNvbHV0aW9uKSwgc28gbm8gcG9pbnQgaW4gdXMgZG9pbmcgaXQgdG9vLgorICAgKi8KKworICAvKiBGZWVkIHRoZSBwb3N0cHJvY2Vzc29yICovCisgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPmJ1ZmZlciwKKwkJCQkgICAgICZtYWluLT5yb3dncm91cF9jdHIsIHJvd2dyb3Vwc19hdmFpbCwKKwkJCQkgICAgIG91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7CisKKyAgLyogSGFzIHBvc3Rwcm9jZXNzb3IgY29uc3VtZWQgYWxsIHRoZSBkYXRhIHlldD8gSWYgc28sIG1hcmsgYnVmZmVyIGVtcHR5ICovCisgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPj0gcm93Z3JvdXBzX2F2YWlsKSB7CisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsKKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvbnRleHQgcm93cyBtdXN0IGJlIHByb3ZpZGVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLworICBpZiAoISBtYWluLT5idWZmZXJfZnVsbCkgeworICAgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLAorCQkJCQkgICBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXSkpCisgICAgICByZXR1cm47CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KKyAgICBtYWluLT5idWZmZXJfZnVsbCA9IFRSVUU7CS8qIE9LLCB3ZSBoYXZlIGFuIGlNQ1Ugcm93IHRvIHdvcmsgd2l0aCAqLworICAgIG1haW4tPmlNQ1Vfcm93X2N0cisrOwkvKiBjb3VudCByb3dzIHJlY2VpdmVkICovCisgIH0KKworICAvKiBQb3N0cHJvY2Vzc29yIHR5cGljYWxseSB3aWxsIG5vdCBzd2FsbG93IGFsbCB0aGUgaW5wdXQgZGF0YSBpdCBpcyBoYW5kZWQKKyAgICogaW4gb25lIGNhbGwgKGR1ZSB0byBmaWxsaW5nIHRoZSBvdXRwdXQgYnVmZmVyIGZpcnN0KS4gIE11c3QgYmUgcHJlcGFyZWQKKyAgICogdG8gZXhpdCBhbmQgcmVzdGFydC4gIFRoaXMgc3dpdGNoIGxldHMgdXMga2VlcCB0cmFjayBvZiBob3cgZmFyIHdlIGdvdC4KKyAgICogTm90ZSB0aGF0IGVhY2ggY2FzZSBmYWxscyB0aHJvdWdoIHRvIHRoZSBuZXh0IG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KKyAgICovCisgIHN3aXRjaCAobWFpbi0+Y29udGV4dF9zdGF0ZSkgeworICBjYXNlIENUWF9QT1NUUE9ORURfUk9XOgorICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyBmb3IgcG9zdHBvbmVkIHJvdyAqLworICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdLAorCQkJJm1haW4tPnJvd2dyb3VwX2N0ciwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsLAorCQkJb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsKQorICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLworICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJFUEFSRV9GT1JfSU1DVTsKKyAgICBpZiAoKm91dF9yb3dfY3RyID49IG91dF9yb3dzX2F2YWlsKQorICAgICAgcmV0dXJuOwkJCS8qIFBvc3Rwcm9jZXNzb3IgZXhhY3RseSBmaWxsZWQgb3V0cHV0IGJ1ZiAqLworICAgIC8qRkFMTFRIUk9VR0gqLworICBjYXNlIENUWF9QUkVQQVJFX0ZPUl9JTUNVOgorICAgIC8qIFByZXBhcmUgdG8gcHJvY2VzcyBmaXJzdCBNLTEgcm93IGdyb3VwcyBvZiB0aGlzIGlNQ1Ugcm93ICovCisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIC0gMSk7CisgICAgLyogQ2hlY2sgZm9yIGJvdHRvbSBvZiBpbWFnZTogaWYgc28sIHR3ZWFrIHBvaW50ZXJzIHRvICJkdXBsaWNhdGUiCisgICAgICogdGhlIGxhc3Qgc2FtcGxlIHJvdywgYW5kIGFkanVzdCByb3dncm91cHNfYXZhaWwgdG8gaWdub3JlIHBhZGRpbmcgcm93cy4KKyAgICAgKi8KKyAgICBpZiAobWFpbi0+aU1DVV9yb3dfY3RyID09IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCisgICAgICBzZXRfYm90dG9tX3BvaW50ZXJzKGNpbmZvKTsKKyAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BST0NFU1NfSU1DVTsKKyAgICAvKkZBTExUSFJPVUdIKi8KKyAgY2FzZSBDVFhfUFJPQ0VTU19JTUNVOgorICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyAqLworICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdLAorCQkJJm1haW4tPnJvd2dyb3VwX2N0ciwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsLAorCQkJb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsKQorICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLworICAgIC8qIEFmdGVyIHRoZSBmaXJzdCBpTUNVLCBjaGFuZ2Ugd3JhcGFyb3VuZCBwb2ludGVycyB0byBub3JtYWwgc3RhdGUgKi8KKyAgICBpZiAobWFpbi0+aU1DVV9yb3dfY3RyID09IDEpCisgICAgICBzZXRfd3JhcGFyb3VuZF9wb2ludGVycyhjaW5mbyk7CisgICAgLyogUHJlcGFyZSB0byBsb2FkIG5ldyBpTUNVIHJvdyB1c2luZyBvdGhlciB4YnVmZmVyIGxpc3QgKi8KKyAgICBtYWluLT53aGljaHB0ciBePSAxOwkvKiAwPT4xIG9yIDE9PjAgKi8KKyAgICBtYWluLT5idWZmZXJfZnVsbCA9IEZBTFNFOworICAgIC8qIFN0aWxsIG5lZWQgdG8gcHJvY2VzcyBsYXN0IHJvdyBncm91cCBvZiB0aGlzIGlNQ1Ugcm93LCAqLworICAgIC8qIHdoaWNoIGlzIHNhdmVkIGF0IGluZGV4IE0rMSBvZiB0aGUgb3RoZXIgeGJ1ZmZlciAqLworICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAxKTsKKyAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMik7CisgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QT1NUUE9ORURfUk9XOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogRmluYWwgcGFzcyBvZiB0d28tcGFzcyBxdWFudGl6YXRpb246IGp1c3QgY2FsbCB0aGUgcG9zdHByb2Nlc3Nvci4KKyAqIFNvdXJjZSBkYXRhIHdpbGwgYmUgdGhlIHBvc3Rwcm9jZXNzb3IgY29udHJvbGxlcidzIGludGVybmFsIGJ1ZmZlci4KKyAqLworCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCSBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCAoSlNBTVBJTUFHRSkgTlVMTCwKKwkJCQkgICAgIChKRElNRU5TSU9OICopIE5VTEwsIChKRElNRU5TSU9OKSAwLAorCQkJCSAgICAgb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKK30KKworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9kX21haW5fY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9tYWluX3B0ciBtYWluOworICBpbnQgY2ksIHJncm91cCwgbmdyb3VwczsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBtYWluID0gKG15X21haW5fcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X21haW5fY29udHJvbGxlcikpOworICBjaW5mby0+bWFpbiA9IChzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciAqKSBtYWluOworICBtYWluLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWFpbjsKKworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHdvcmtzcGFjZS4KKyAgICogbmdyb3VwcyBpcyB0aGUgbnVtYmVyIG9mIHJvdyBncm91cHMgd2UgbmVlZC4KKyAgICovCisgIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7CisgICAgaWYgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIDwgMikgLyogdW5zdXBwb3J0ZWQsIHNlZSBjb21tZW50cyBhYm92ZSAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKKyAgICBhbGxvY19mdW5ueV9wb2ludGVycyhjaW5mbyk7IC8qIEFsbG9jIHNwYWNlIGZvciB4YnVmZmVyW10gbGlzdHMgKi8KKyAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyOworICB9IGVsc2UgeworICAgIG5ncm91cHMgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgfQorCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgbWFpbi0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUsCisJCQkgKEpESU1FTlNJT04pIChyZ3JvdXAgKiBuZ3JvdXBzKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pkbWFya2VyLmMgYi9qZG1hcmtlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2NhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9qZG1hcmtlci5jCkBAIC0wLDAgKzEsMTM2MCBAQAorLyoKKyAqIGpkbWFya2VyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byBkZWNvZGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCisgKiBNb3N0IG9mIHRoZSBjb21wbGV4aXR5IGFyaXNlcyBmcm9tIG91ciBkZXNpcmUgdG8gc3VwcG9ydCBpbnB1dAorICogc3VzcGVuc2lvbjogaWYgbm90IGFsbCBvZiB0aGUgZGF0YSBmb3IgYSBtYXJrZXIgaXMgYXZhaWxhYmxlLAorICogd2UgbXVzdCBleGl0IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uLiAgT24gcmVzdW1wdGlvbiwgd2UgcmVwcm9jZXNzCisgKiB0aGUgbWFya2VyLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCit0eXBlZGVmIGVudW0gewkJCS8qIEpQRUcgbWFya2VyIGNvZGVzICovCisgIE1fU09GMCAgPSAweGMwLAorICBNX1NPRjEgID0gMHhjMSwKKyAgTV9TT0YyICA9IDB4YzIsCisgIE1fU09GMyAgPSAweGMzLAorICAKKyAgTV9TT0Y1ICA9IDB4YzUsCisgIE1fU09GNiAgPSAweGM2LAorICBNX1NPRjcgID0gMHhjNywKKyAgCisgIE1fSlBHICAgPSAweGM4LAorICBNX1NPRjkgID0gMHhjOSwKKyAgTV9TT0YxMCA9IDB4Y2EsCisgIE1fU09GMTEgPSAweGNiLAorICAKKyAgTV9TT0YxMyA9IDB4Y2QsCisgIE1fU09GMTQgPSAweGNlLAorICBNX1NPRjE1ID0gMHhjZiwKKyAgCisgIE1fREhUICAgPSAweGM0LAorICAKKyAgTV9EQUMgICA9IDB4Y2MsCisgIAorICBNX1JTVDAgID0gMHhkMCwKKyAgTV9SU1QxICA9IDB4ZDEsCisgIE1fUlNUMiAgPSAweGQyLAorICBNX1JTVDMgID0gMHhkMywKKyAgTV9SU1Q0ICA9IDB4ZDQsCisgIE1fUlNUNSAgPSAweGQ1LAorICBNX1JTVDYgID0gMHhkNiwKKyAgTV9SU1Q3ICA9IDB4ZDcsCisgIAorICBNX1NPSSAgID0gMHhkOCwKKyAgTV9FT0kgICA9IDB4ZDksCisgIE1fU09TICAgPSAweGRhLAorICBNX0RRVCAgID0gMHhkYiwKKyAgTV9ETkwgICA9IDB4ZGMsCisgIE1fRFJJICAgPSAweGRkLAorICBNX0RIUCAgID0gMHhkZSwKKyAgTV9FWFAgICA9IDB4ZGYsCisgIAorICBNX0FQUDAgID0gMHhlMCwKKyAgTV9BUFAxICA9IDB4ZTEsCisgIE1fQVBQMiAgPSAweGUyLAorICBNX0FQUDMgID0gMHhlMywKKyAgTV9BUFA0ICA9IDB4ZTQsCisgIE1fQVBQNSAgPSAweGU1LAorICBNX0FQUDYgID0gMHhlNiwKKyAgTV9BUFA3ICA9IDB4ZTcsCisgIE1fQVBQOCAgPSAweGU4LAorICBNX0FQUDkgID0gMHhlOSwKKyAgTV9BUFAxMCA9IDB4ZWEsCisgIE1fQVBQMTEgPSAweGViLAorICBNX0FQUDEyID0gMHhlYywKKyAgTV9BUFAxMyA9IDB4ZWQsCisgIE1fQVBQMTQgPSAweGVlLAorICBNX0FQUDE1ID0gMHhlZiwKKyAgCisgIE1fSlBHMCAgPSAweGYwLAorICBNX0pQRzEzID0gMHhmZCwKKyAgTV9DT00gICA9IDB4ZmUsCisgIAorICBNX1RFTSAgID0gMHgwMSwKKyAgCisgIE1fRVJST1IgPSAweDEwMAorfSBKUEVHX01BUktFUjsKKworCisvKiBQcml2YXRlIHN0YXRlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBBcHBsaWNhdGlvbi1vdmVycmlkYWJsZSBtYXJrZXIgcHJvY2Vzc2luZyBtZXRob2RzICovCisgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc19DT007CisgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc19BUFBuWzE2XTsKKworICAvKiBMaW1pdCBvbiBtYXJrZXIgZGF0YSBsZW5ndGggdG8gc2F2ZSBmb3IgZWFjaCBtYXJrZXIgdHlwZSAqLworICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0X0NPTTsKKyAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdF9BUFBuWzE2XTsKKworICAvKiBTdGF0dXMgb2YgQ09NL0FQUG4gbWFya2VyIHNhdmluZyAqLworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgY3VyX21hcmtlcjsJLyogTlVMTCBpZiBub3QgcHJvY2Vzc2luZyBhIG1hcmtlciAqLworICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZDsJCS8qIGRhdGEgYnl0ZXMgcmVhZCBzbyBmYXIgaW4gbWFya2VyICovCisgIC8qIE5vdGU6IGN1cl9tYXJrZXIgaXMgbm90IGxpbmtlZCBpbnRvIG1hcmtlcl9saXN0IHVudGlsIGl0J3MgYWxsIHJlYWQuICovCit9IG15X21hcmtlcl9yZWFkZXI7CisKK3R5cGVkZWYgbXlfbWFya2VyX3JlYWRlciAqIG15X21hcmtlcl9wdHI7CisKKworLyoKKyAqIE1hY3JvcyBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUuCisgKgorICogQXQgYWxsIHRpbWVzLCBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGUgYW5kIC0+Ynl0ZXNfaW5fYnVmZmVyIHJlZmxlY3QKKyAqIHRoZSBjdXJyZW50IHJlc3RhcnQgcG9pbnQ7IHdlIHVwZGF0ZSB0aGVtIG9ubHkgd2hlbiB3ZSBoYXZlIHJlYWNoZWQgYQorICogc3VpdGFibGUgcGxhY2UgdG8gcmVzdGFydCBpZiBhIHN1c3BlbnNpb24gb2NjdXJzLgorICovCisKKy8qIERlY2xhcmUgYW5kIGluaXRpYWxpemUgbG9jYWwgY29waWVzIG9mIGlucHV0IHBvaW50ZXIvY291bnQgKi8KKyNkZWZpbmUgSU5QVVRfVkFSUyhjaW5mbykgIFwKKwlzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICogZGF0YXNyYyA9IChjaW5mbyktPnNyYzsgIFwKKwljb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGU7ICBcCisJc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlcgorCisvKiBVbmxvYWQgdGhlIGxvY2FsIGNvcGllcyAtLS0gZG8gdGhpcyBvbmx5IGF0IGEgcmVzdGFydCBib3VuZGFyeSAqLworI2RlZmluZSBJTlBVVF9TWU5DKGNpbmZvKSAgXAorCSggZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlID0gbmV4dF9pbnB1dF9ieXRlLCAgXAorCSAgZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gYnl0ZXNfaW5fYnVmZmVyICkKKworLyogUmVsb2FkIHRoZSBsb2NhbCBjb3BpZXMgLS0tIHVzZWQgb25seSBpbiBNQUtFX0JZVEVfQVZBSUwgKi8KKyNkZWZpbmUgSU5QVVRfUkVMT0FEKGNpbmZvKSAgXAorCSggbmV4dF9pbnB1dF9ieXRlID0gZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlLCAgXAorCSAgYnl0ZXNfaW5fYnVmZmVyID0gZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyICkKKworLyogSW50ZXJuYWwgbWFjcm8gZm9yIElOUFVUX0JZVEUgYW5kIElOUFVUXzJCWVRFUzogbWFrZSBhIGJ5dGUgYXZhaWxhYmxlLgorICogTm90ZSB3ZSBkbyAqbm90KiBkbyBJTlBVVF9TWU5DIGJlZm9yZSBjYWxsaW5nIGZpbGxfaW5wdXRfYnVmZmVyLAorICogYnV0IHdlIG11c3QgcmVsb2FkIHRoZSBsb2NhbCBjb3BpZXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGwuCisgKi8KKyNkZWZpbmUgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbikgIFwKKwlpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsgIFwKKwkgIGlmICghICgqZGF0YXNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpICBcCisJICAgIHsgYWN0aW9uOyB9ICBcCisJICBJTlBVVF9SRUxPQUQoY2luZm8pOyAgXAorCX0KKworLyogUmVhZCBhIGJ5dGUgaW50byB2YXJpYWJsZSBWLgorICogSWYgbXVzdCBzdXNwZW5kLCB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uICh0eXBpY2FsbHkgInJldHVybiBGQUxTRSIpLgorICovCisjZGVmaW5lIElOUFVUX0JZVEUoY2luZm8sVixhY3Rpb24pICBcCisJTUFLRVNUTVQoIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCisJCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKKwkJICBWID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7ICkKKworLyogQXMgYWJvdmUsIGJ1dCByZWFkIHR3byBieXRlcyBpbnRlcnByZXRlZCBhcyBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4KKyAqIFYgc2hvdWxkIGJlIGRlY2xhcmVkIHVuc2lnbmVkIGludCBvciBwZXJoYXBzIElOVDMyLgorICovCisjZGVmaW5lIElOUFVUXzJCWVRFUyhjaW5mbyxWLGFjdGlvbikgIFwKKwlNQUtFU1RNVCggTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKKwkJICBieXRlc19pbl9idWZmZXItLTsgXAorCQkgIFYgPSAoKHVuc2lnbmVkIGludCkgR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKykpIDw8IDg7IFwKKwkJICBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAorCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCisJCSAgViArPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsgKQorCisKKy8qCisgKiBSb3V0aW5lcyB0byBwcm9jZXNzIEpQRUcgbWFya2Vycy4KKyAqCisgKiBFbnRyeSBjb25kaXRpb246IEpQRUcgbWFya2VyIGl0c2VsZiBoYXMgYmVlbiByZWFkIGFuZCBpdHMgY29kZSBzYXZlZAorICogICBpbiBjaW5mby0+dW5yZWFkX21hcmtlcjsgaW5wdXQgcmVzdGFydCBwb2ludCBpcyBqdXN0IGFmdGVyIHRoZSBtYXJrZXIuCisgKgorICogRXhpdDogaWYgcmV0dXJuIFRSVUUsIGhhdmUgcmVhZCBhbmQgcHJvY2Vzc2VkIGFueSBwYXJhbWV0ZXJzLCBhbmQgaGF2ZQorICogICB1cGRhdGVkIHRoZSByZXN0YXJ0IHBvaW50IHRvIHBvaW50IGFmdGVyIHRoZSBwYXJhbWV0ZXJzLgorICogICBJZiByZXR1cm4gRkFMU0UsIHdhcyBmb3JjZWQgdG8gc3VzcGVuZCBiZWZvcmUgcmVhY2hpbmcgZW5kIG9mCisgKiAgIG1hcmtlciBwYXJhbWV0ZXJzOyByZXN0YXJ0IHBvaW50IGhhcyBub3QgYmVlbiBtb3ZlZC4gIFNhbWUgcm91dGluZQorICogICB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBhcHBsaWNhdGlvbiBzdXBwbGllcyBtb3JlIGlucHV0IGRhdGEuCisgKgorICogVGhpcyBhcHByb2FjaCB0byBzdXNwZW5zaW9uIGFzc3VtZXMgdGhhdCBhbGwgb2YgYSBtYXJrZXIncyBwYXJhbWV0ZXJzCisgKiBjYW4gZml0IGludG8gYSBzaW5nbGUgaW5wdXQgYnVmZmVybG9hZC4gIFRoaXMgc2hvdWxkIGhvbGQgZm9yICJub3JtYWwiCisgKiBtYXJrZXJzLiAgU29tZSBDT00vQVBQbiBtYXJrZXJzIG1pZ2h0IGhhdmUgbGFyZ2UgcGFyYW1ldGVyIHNlZ21lbnRzCisgKiB0aGF0IG1pZ2h0IG5vdCBmaXQuICBJZiB3ZSBhcmUgc2ltcGx5IGRyb3BwaW5nIHN1Y2ggYSBtYXJrZXIsIHdlIHVzZQorICogc2tpcF9pbnB1dF9kYXRhIHRvIGdldCBwYXN0IGl0LCBhbmQgdGhlcmVieSBwdXQgdGhlIHByb2JsZW0gb24gdGhlCisgKiBzb3VyY2UgbWFuYWdlcidzIHNob3VsZGVycy4gIElmIHdlIGFyZSBzYXZpbmcgdGhlIG1hcmtlcidzIGNvbnRlbnRzCisgKiBpbnRvIG1lbW9yeSwgd2UgdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNvbnZlbnRpb246IHdoZW4gZm9yY2VkIHRvCisgKiBzdXNwZW5kLCB0aGUgbWFya2VyIHByb2Nlc3NvciB1cGRhdGVzIHRoZSByZXN0YXJ0IHBvaW50IHRvIHRoZSBlbmQgb2YKKyAqIHdoYXQgaXQncyBjb25zdW1lZCAoaWUsIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcikgYmVmb3JlIHJldHVybmluZyBGQUxTRS4KKyAqIE9uIHJlc3VtcHRpb24sIGNpbmZvLT51bnJlYWRfbWFya2VyIHN0aWxsIGNvbnRhaW5zIHRoZSBtYXJrZXIgY29kZSwKKyAqIGJ1dCB0aGUgZGF0YSBzb3VyY2Ugd2lsbCBwb2ludCB0byB0aGUgbmV4dCBjaHVuayBvZiBtYXJrZXIgZGF0YS4KKyAqIFRoZSBtYXJrZXIgcHJvY2Vzc29yIG11c3QgcmV0YWluIGludGVybmFsIHN0YXRlIHRvIGRlYWwgd2l0aCB0aGlzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gYXZvaWQgZHVwbGljYXRlIHRyYWNlIG1lc3NhZ2VzIGlmIGEKKyAqIHN1c3BlbnNpb24gb2NjdXJzIHdpdGhpbiBtYXJrZXIgcGFyYW1ldGVycy4gIE90aGVyIHNpZGUgZWZmZWN0cworICogcmVxdWlyZSBtb3JlIGNhcmUuCisgKi8KKworCitMT0NBTChib29sZWFuKQorZ2V0X3NvaSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYW4gU09JIG1hcmtlciAqLworeworICBpbnQgaTsKKyAgCisgIFRSQUNFTVMoY2luZm8sIDEsIEpUUkNfU09JKTsKKworICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPSSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPSV9EVVBMSUNBVEUpOworCisgIC8qIFJlc2V0IGFsbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGRlZmluZWQgdG8gYmUgcmVzZXQgYnkgU09JICovCisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspIHsKKyAgICBjaW5mby0+YXJpdGhfZGNfTFtpXSA9IDA7CisgICAgY2luZm8tPmFyaXRoX2RjX1VbaV0gPSAxOworICAgIGNpbmZvLT5hcml0aF9hY19LW2ldID0gNTsKKyAgfQorICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9IDA7CisKKyAgLyogU2V0IGluaXRpYWwgYXNzdW1wdGlvbnMgZm9yIGNvbG9yc3BhY2UgZXRjICovCisKKyAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKyAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsgLyogQXNzdW1lIG5vbi1DQ0lSIHNhbXBsaW5nPz8/ICovCisKKyAgY2luZm8tPnNhd19KRklGX21hcmtlciA9IEZBTFNFOworICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogc2V0IGRlZmF1bHQgSkZJRiBBUFAwIHZhbHVlcyAqLworICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gMTsKKyAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IDA7CisgIGNpbmZvLT5YX2RlbnNpdHkgPSAxOworICBjaW5mby0+WV9kZW5zaXR5ID0gMTsKKyAgY2luZm8tPnNhd19BZG9iZV9tYXJrZXIgPSBGQUxTRTsKKyAgY2luZm8tPkFkb2JlX3RyYW5zZm9ybSA9IDA7CisKKyAgY2luZm8tPm1hcmtlci0+c2F3X1NPSSA9IFRSVUU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2dldF9zb2YgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJvZywgYm9vbGVhbiBpc19hcml0aCkKKy8qIFByb2Nlc3MgYSBTT0ZuIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIGludCBjLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gaXNfcHJvZzsKKyAgY2luZm8tPmFyaXRoX2NvZGUgPSBpc19hcml0aDsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKworICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24sIHJldHVybiBGQUxTRSk7CisgIElOUFVUXzJCWVRFUyhjaW5mbywgY2luZm8tPmltYWdlX2hlaWdodCwgcmV0dXJuIEZBTFNFKTsKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBjaW5mby0+aW1hZ2Vfd2lkdGgsIHJldHVybiBGQUxTRSk7CisgIElOUFVUX0JZVEUoY2luZm8sIGNpbmZvLT5udW1fY29tcG9uZW50cywgcmV0dXJuIEZBTFNFKTsKKworICBsZW5ndGggLT0gODsKKworICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT0YsIGNpbmZvLT51bnJlYWRfbWFya2VyLAorCSAgIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCwgKGludCkgY2luZm8tPmltYWdlX2hlaWdodCwKKwkgICBjaW5mby0+bnVtX2NvbXBvbmVudHMpOworCisgIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09GKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09GX0RVUExJQ0FURSk7CisKKyAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBmaWxlcyBpbiB3aGljaCB0aGUgaW1hZ2UgaGVpZ2h0IGlzIGluaXRpYWxseSBzcGVjaWZpZWQgKi8KKyAgLyogYXMgMCBhbmQgaXMgbGF0ZXIgcmVkZWZpbmVkIGJ5IEROTC4gIEFzIGxvbmcgYXMgd2UgaGF2ZSB0byBjaGVjayB0aGF0LCAgKi8KKyAgLyogbWlnaHQgYXMgd2VsbCBoYXZlIGEgZ2VuZXJhbCBzYW5pdHkgY2hlY2suICovCisgIGlmIChjaW5mby0+aW1hZ2VfaGVpZ2h0IDw9IDAgfHwgY2luZm8tPmltYWdlX3dpZHRoIDw9IDAKKyAgICAgIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA8PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1QVFlfSU1BR0UpOworCisgIGlmIChsZW5ndGggIT0gKGNpbmZvLT5udW1fY29tcG9uZW50cyAqIDMpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkJLyogZG8gb25seSBvbmNlLCBldmVuIGlmIHN1c3BlbmQgKi8KKyAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKwkJCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkgY2luZm8tPm51bV9jb21wb25lbnRzICogU0laRU9GKGpwZWdfY29tcG9uZW50X2luZm8pKTsKKyAgCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgY29tcHB0ci0+Y29tcG9uZW50X2luZGV4ID0gY2k7CisgICAgSU5QVVRfQllURShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkLCByZXR1cm4gRkFMU0UpOworICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IChjID4+IDQpICYgMTU7CisgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9IChjICAgICApICYgMTU7CisgICAgSU5QVVRfQllURShjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vLCByZXR1cm4gRkFMU0UpOworCisgICAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09GX0NPTVBPTkVOVCwKKwkgICAgIGNvbXBwdHItPmNvbXBvbmVudF9pZCwgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIGNvbXBwdHItPnF1YW50X3RibF9ubyk7CisgIH0KKworICBjaW5mby0+bWFya2VyLT5zYXdfU09GID0gVFJVRTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2dldF9zb3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgU09TIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIGludCBpLCBjaSwgbiwgYywgY2M7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBpZiAoISBjaW5mby0+bWFya2VyLT5zYXdfU09GKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09TX05PX1NPRik7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisKKyAgSU5QVVRfQllURShjaW5mbywgbiwgcmV0dXJuIEZBTFNFKTsgLyogTnVtYmVyIG9mIGNvbXBvbmVudHMgKi8KKworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19TT1MsIG4pOworCisgIGlmIChsZW5ndGggIT0gKG4gKiAyICsgNikgfHwgbiA8IDEgfHwgbiA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBuOworCisgIC8qIENvbGxlY3QgdGhlIGNvbXBvbmVudC1zcGVjIHBhcmFtZXRlcnMgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgSU5QVVRfQllURShjaW5mbywgY2MsIHJldHVybiBGQUxTRSk7CisgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICAKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIGlmIChjYyA9PSBjb21wcHRyLT5jb21wb25lbnRfaWQpCisJZ290byBpZF9mb3VuZDsKKyAgICB9CisKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfQ09NUE9ORU5UX0lELCBjYyk7CisKKyAgaWRfZm91bmQ6CisKKyAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXSA9IGNvbXBwdHI7CisgICAgY29tcHB0ci0+ZGNfdGJsX25vID0gKGMgPj4gNCkgJiAxNTsKKyAgICBjb21wcHRyLT5hY190Ymxfbm8gPSAoYyAgICAgKSAmIDE1OworICAgIAorICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1NPU19DT01QT05FTlQsIGNjLAorCSAgICAgY29tcHB0ci0+ZGNfdGJsX25vLCBjb21wcHRyLT5hY190Ymxfbm8pOworICB9CisKKyAgLyogQ29sbGVjdCB0aGUgYWRkaXRpb25hbCBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbC4gKi8KKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPlNzID0gYzsKKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPlNlID0gYzsKKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPkFoID0gKGMgPj4gNCkgJiAxNTsKKyAgY2luZm8tPkFsID0gKGMgICAgICkgJiAxNTsKKworICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT1NfUEFSQU1TLCBjaW5mby0+U3MsIGNpbmZvLT5TZSwKKwkgICBjaW5mby0+QWgsIGNpbmZvLT5BbCk7CisKKyAgLyogUHJlcGFyZSB0byBzY2FuIGRhdGEgJiByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IDA7CisKKyAgLyogQ291bnQgYW5vdGhlciBTT1MgbWFya2VyICovCisgIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcisrOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisjaWZkZWYgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVECisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZGFjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERBQyBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgaW5kZXgsIHZhbDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworICAKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBpbmRleCwgcmV0dXJuIEZBTFNFKTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCB2YWwsIHJldHVybiBGQUxTRSk7CisKKyAgICBsZW5ndGggLT0gMjsKKworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0RBQywgaW5kZXgsIHZhbCk7CisKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49ICgyKk5VTV9BUklUSF9UQkxTKSkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RBQ19JTkRFWCwgaW5kZXgpOworCisgICAgaWYgKGluZGV4ID49IE5VTV9BUklUSF9UQkxTKSB7IC8qIGRlZmluZSBBQyB0YWJsZSAqLworICAgICAgY2luZm8tPmFyaXRoX2FjX0tbaW5kZXgtTlVNX0FSSVRIX1RCTFNdID0gKFVJTlQ4KSB2YWw7CisgICAgfSBlbHNlIHsJCQkvKiBkZWZpbmUgREMgdGFibGUgKi8KKyAgICAgIGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA9IChVSU5UOCkgKHZhbCAmIDB4MEYpOworICAgICAgY2luZm8tPmFyaXRoX2RjX1VbaW5kZXhdID0gKFVJTlQ4KSAodmFsID4+IDQpOworICAgICAgaWYgKGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA+IGNpbmZvLT5hcml0aF9kY19VW2luZGV4XSkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9EQUNfVkFMVUUsIHZhbCk7CisgICAgfQorICB9CisKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisjZWxzZSAvKiAhIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLworCisjZGVmaW5lIGdldF9kYWMoY2luZm8pICBza2lwX3ZhcmlhYmxlKGNpbmZvKQorCisjZW5kaWYgLyogRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCisKKworTE9DQUwoYm9vbGVhbikKK2dldF9kaHQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgREhUIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIFVJTlQ4IGJpdHNbMTddOworICBVSU5UOCBodWZmdmFsWzI1Nl07CisgIGludCBpLCBpbmRleCwgY291bnQ7CisgIEpIVUZGX1RCTCAqKmh0YmxwdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKyAgCisgIHdoaWxlIChsZW5ndGggPiAxNikgeworICAgIElOUFVUX0JZVEUoY2luZm8sIGluZGV4LCByZXR1cm4gRkFMU0UpOworCisgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfREhULCBpbmRleCk7CisgICAgICAKKyAgICBiaXRzWzBdID0gMDsKKyAgICBjb3VudCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKSB7CisgICAgICBJTlBVVF9CWVRFKGNpbmZvLCBiaXRzW2ldLCByZXR1cm4gRkFMU0UpOworICAgICAgY291bnQgKz0gYml0c1tpXTsKKyAgICB9CisKKyAgICBsZW5ndGggLT0gMSArIDE2OworCisgICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCisJICAgICBiaXRzWzFdLCBiaXRzWzJdLCBiaXRzWzNdLCBiaXRzWzRdLAorCSAgICAgYml0c1s1XSwgYml0c1s2XSwgYml0c1s3XSwgYml0c1s4XSk7CisgICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCisJICAgICBiaXRzWzldLCBiaXRzWzEwXSwgYml0c1sxMV0sIGJpdHNbMTJdLAorCSAgICAgYml0c1sxM10sIGJpdHNbMTRdLCBiaXRzWzE1XSwgYml0c1sxNl0pOworCisgICAgLyogSGVyZSB3ZSBqdXN0IGRvIG1pbmltYWwgdmFsaWRhdGlvbiBvZiB0aGUgY291bnRzIHRvIGF2b2lkIHdhbGtpbmcKKyAgICAgKiBvZmYgdGhlIGVuZCBvZiBvdXIgdGFibGUgc3BhY2UuICBqZGh1ZmYuYyB3aWxsIGNoZWNrIG1vcmUgY2FyZWZ1bGx5LgorICAgICAqLworICAgIGlmIChjb3VudCA+IDI1NiB8fCAoKElOVDMyKSBjb3VudCkgPiBsZW5ndGgpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgSU5QVVRfQllURShjaW5mbywgaHVmZnZhbFtpXSwgcmV0dXJuIEZBTFNFKTsKKworICAgIGxlbmd0aCAtPSBjb3VudDsKKworICAgIGlmIChpbmRleCAmIDB4MTApIHsJCS8qIEFDIHRhYmxlIGRlZmluaXRpb24gKi8KKyAgICAgIGluZGV4IC09IDB4MTA7CisgICAgICBodGJscHRyID0gJmNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgICB9IGVsc2UgewkJCS8qIERDIHRhYmxlIGRlZmluaXRpb24gKi8KKyAgICAgIGh0YmxwdHIgPSAmY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOworICAgIH0KKworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTlVNX0hVRkZfVEJMUykKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RIVF9JTkRFWCwgaW5kZXgpOworCisgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIAorICAgIE1FTUNPUFkoKCpodGJscHRyKS0+Yml0cywgYml0cywgU0laRU9GKCgqaHRibHB0ciktPmJpdHMpKTsKKyAgICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIGh1ZmZ2YWwsIFNJWkVPRigoKmh0YmxwdHIpLT5odWZmdmFsKSk7CisgIH0KKworICBpZiAobGVuZ3RoICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2dldF9kcXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgRFFUIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIGludCBuLCBpLCBwcmVjOworICB1bnNpZ25lZCBpbnQgdG1wOworICBKUVVBTlRfVEJMICpxdWFudF9wdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgIElOUFVUX0JZVEUoY2luZm8sIG4sIHJldHVybiBGQUxTRSk7CisgICAgcHJlYyA9IG4gPj4gNDsKKyAgICBuICY9IDB4MEY7CisKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19EUVQsIG4sIHByZWMpOworCisgICAgaWYgKG4gPj0gTlVNX1FVQU5UX1RCTFMpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIG4pOworICAgICAgCisgICAgaWYgKGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXSA9PSBOVUxMKQorICAgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW25dID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgcXVhbnRfcHRyID0gY2luZm8tPnF1YW50X3RibF9wdHJzW25dOworCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICAgIGlmIChwcmVjKQorCUlOUFVUXzJCWVRFUyhjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOworICAgICAgZWxzZQorCUlOUFVUX0JZVEUoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKKyAgICAgIC8qIFdlIGNvbnZlcnQgdGhlIHppZ3phZy1vcmRlciB0YWJsZSB0byBuYXR1cmFsIGFycmF5IG9yZGVyLiAqLworICAgICAgcXVhbnRfcHRyLT5xdWFudHZhbFtqcGVnX25hdHVyYWxfb3JkZXJbaV1dID0gKFVJTlQxNikgdG1wOworICAgIH0KKworICAgIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA+PSAyKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkgKz0gOCkgeworCVRSQUNFTVM4KGNpbmZvLCAyLCBKVFJDX1FVQU5UVkFMUywKKwkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaV0sICAgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzFdLAorCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzJdLCBxdWFudF9wdHItPnF1YW50dmFsW2krM10sCisJCSBxdWFudF9wdHItPnF1YW50dmFsW2krNF0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs1XSwKKwkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs2XSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzddKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBsZW5ndGggLT0gRENUU0laRTIrMTsKKyAgICBpZiAocHJlYykgbGVuZ3RoIC09IERDVFNJWkUyOworICB9CisKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZHJpIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERSSSBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICB1bnNpZ25lZCBpbnQgdG1wOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgCisgIGlmIChsZW5ndGggIT0gNCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOworCisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0RSSSwgdG1wKTsKKworICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9IHRtcDsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFJvdXRpbmVzIGZvciBwcm9jZXNzaW5nIEFQUG4gYW5kIENPTSBtYXJrZXJzLgorICogVGhlc2UgYXJlIGVpdGhlciBzYXZlZCBpbiBtZW1vcnkgb3IgZGlzY2FyZGVkLCBwZXIgYXBwbGljYXRpb24gcmVxdWVzdC4KKyAqIEFQUDAgYW5kIEFQUDE0IGFyZSBzcGVjaWFsbHkgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBhcmUKKyAqIEpGSUYgYW5kIEFkb2JlIG1hcmtlcnMsIHJlc3BlY3RpdmVseS4KKyAqLworCisjZGVmaW5lIEFQUDBfREFUQV9MRU4JMTQJLyogTGVuZ3RoIG9mIGludGVyZXN0aW5nIGRhdGEgaW4gQVBQMCAqLworI2RlZmluZSBBUFAxNF9EQVRBX0xFTgkxMgkvKiBMZW5ndGggb2YgaW50ZXJlc3RpbmcgZGF0YSBpbiBBUFAxNCAqLworI2RlZmluZSBBUFBOX0RBVEFfTEVOCTE0CS8qIE11c3QgYmUgdGhlIGxhcmdlc3Qgb2YgdGhlIGFib3ZlISEgKi8KKworCitMT0NBTCh2b2lkKQorZXhhbWluZV9hcHAwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKT0NURVQgRkFSICogZGF0YSwKKwkgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbiwgSU5UMzIgcmVtYWluaW5nKQorLyogRXhhbWluZSBmaXJzdCBmZXcgYnl0ZXMgZnJvbSBhbiBBUFAwLgorICogVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgaXQgaXMgYSBKRklGIG1hcmtlci4KKyAqIGRhdGFsZW4gaXMgIyBvZiBieXRlcyBhdCBkYXRhW10sIHJlbWFpbmluZyBpcyBsZW5ndGggb2YgcmVzdCBvZiBtYXJrZXIgZGF0YS4KKyAqLworeworICBJTlQzMiB0b3RhbGxlbiA9IChJTlQzMikgZGF0YWxlbiArIHJlbWFpbmluZzsKKworICBpZiAoZGF0YWxlbiA+PSBBUFAwX0RBVEFfTEVOICYmCisgICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0QSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDQ5ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg0NiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDApIHsKKyAgICAvKiBGb3VuZCBKRklGIEFQUDAgbWFya2VyOiBzYXZlIGluZm8gKi8KKyAgICBjaW5mby0+c2F3X0pGSUZfbWFya2VyID0gVFJVRTsKKyAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gR0VUSk9DVEVUKGRhdGFbNV0pOworICAgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBHRVRKT0NURVQoZGF0YVs2XSk7CisgICAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IEdFVEpPQ1RFVChkYXRhWzddKTsKKyAgICBjaW5mby0+WF9kZW5zaXR5ID0gKEdFVEpPQ1RFVChkYXRhWzhdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzldKTsKKyAgICBjaW5mby0+WV9kZW5zaXR5ID0gKEdFVEpPQ1RFVChkYXRhWzEwXSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVsxMV0pOworICAgIC8qIENoZWNrIHZlcnNpb24uCisgICAgICogTWFqb3IgdmVyc2lvbiBtdXN0IGJlIDEsIGFueXRoaW5nIGVsc2Ugc2lnbmFscyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLgorICAgICAqIChXZSB1c2VkIHRvIHRyZWF0IHRoaXMgYXMgYW4gZXJyb3IsIGJ1dCBub3cgaXQncyBhIG5vbmZhdGFsIHdhcm5pbmcsCisgICAgICogYmVjYXVzZSBzb21lIGJvem8gYXQgSGlqYWFrIGNvdWxkbid0IHJlYWQgdGhlIHNwZWMuKQorICAgICAqIE1pbm9yIHZlcnNpb24gc2hvdWxkIGJlIDAuLjIsIGJ1dCBwcm9jZXNzIGFueXdheSBpZiBuZXdlci4KKyAgICAgKi8KKyAgICBpZiAoY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiAhPSAxKQorICAgICAgV0FSTk1TMihjaW5mbywgSldSTl9KRklGX01BSk9SLAorCSAgICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24pOworICAgIC8qIEdlbmVyYXRlIHRyYWNlIG1lc3NhZ2VzICovCisgICAgVFJBQ0VNUzUoY2luZm8sIDEsIEpUUkNfSkZJRiwKKwkgICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24sCisJICAgICBjaW5mby0+WF9kZW5zaXR5LCBjaW5mby0+WV9kZW5zaXR5LCBjaW5mby0+ZGVuc2l0eV91bml0KTsKKyAgICAvKiBWYWxpZGF0ZSB0aHVtYm5haWwgZGltZW5zaW9ucyBhbmQgaXNzdWUgYXBwcm9wcmlhdGUgbWVzc2FnZXMgKi8KKyAgICBpZiAoR0VUSk9DVEVUKGRhdGFbMTJdKSB8IEdFVEpPQ1RFVChkYXRhWzEzXSkpCisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19KRklGX1RIVU1CTkFJTCwKKwkgICAgICAgR0VUSk9DVEVUKGRhdGFbMTJdKSwgR0VUSk9DVEVUKGRhdGFbMTNdKSk7CisgICAgdG90YWxsZW4gLT0gQVBQMF9EQVRBX0xFTjsKKyAgICBpZiAodG90YWxsZW4gIT0KKwkoKElOVDMyKUdFVEpPQ1RFVChkYXRhWzEyXSkgKiAoSU5UMzIpR0VUSk9DVEVUKGRhdGFbMTNdKSAqIChJTlQzMikgMykpCisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19KRklGX0JBRFRIVU1CTkFJTFNJWkUsIChpbnQpIHRvdGFsbGVuKTsKKyAgfSBlbHNlIGlmIChkYXRhbGVuID49IDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDRBICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg0NiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NTggJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDU4ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMCkgeworICAgIC8qIEZvdW5kIEpGSUYgIkpGWFgiIGV4dGVuc2lvbiBBUFAwIG1hcmtlciAqLworICAgIC8qIFRoZSBsaWJyYXJ5IGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgd2l0aCB0aGVzZSwKKyAgICAgKiBidXQgd2UgdHJ5IHRvIHByb2R1Y2UgYSBoZWxwZnVsIHRyYWNlIG1lc3NhZ2UuCisgICAgICovCisgICAgc3dpdGNoIChHRVRKT0NURVQoZGF0YVs1XSkpIHsKKyAgICBjYXNlIDB4MTA6CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9KUEVHLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTE6CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9QQUxFVFRFLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTM6CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9SR0IsIChpbnQpIHRvdGFsbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19KRklGX0VYVEVOU0lPTiwKKwkgICAgICAgR0VUSk9DVEVUKGRhdGFbNV0pLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogU3RhcnQgb2YgQVBQMCBkb2VzIG5vdCBtYXRjaCAiSkZJRiIgb3IgIkpGWFgiLCBvciB0b28gc2hvcnQgKi8KKyAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19BUFAwLCAoaW50KSB0b3RhbGxlbik7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZXhhbWluZV9hcHAxNCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSk9DVEVUIEZBUiAqIGRhdGEsCisJICAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuLCBJTlQzMiByZW1haW5pbmcpCisvKiBFeGFtaW5lIGZpcnN0IGZldyBieXRlcyBmcm9tIGFuIEFQUDE0LgorICogVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgaXQgaXMgYW4gQWRvYmUgbWFya2VyLgorICogZGF0YWxlbiBpcyAjIG9mIGJ5dGVzIGF0IGRhdGFbXSwgcmVtYWluaW5nIGlzIGxlbmd0aCBvZiByZXN0IG9mIG1hcmtlciBkYXRhLgorICovCit7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uLCBmbGFnczAsIGZsYWdzMSwgdHJhbnNmb3JtOworCisgIGlmIChkYXRhbGVuID49IEFQUDE0X0RBVEFfTEVOICYmCisgICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0MSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NjQgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDZGICYmCisgICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg2MiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDB4NjUpIHsKKyAgICAvKiBGb3VuZCBBZG9iZSBBUFAxNCBtYXJrZXIgKi8KKyAgICB2ZXJzaW9uID0gKEdFVEpPQ1RFVChkYXRhWzVdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzZdKTsKKyAgICBmbGFnczAgPSAoR0VUSk9DVEVUKGRhdGFbN10pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbOF0pOworICAgIGZsYWdzMSA9IChHRVRKT0NURVQoZGF0YVs5XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVsxMF0pOworICAgIHRyYW5zZm9ybSA9IEdFVEpPQ1RFVChkYXRhWzExXSk7CisgICAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfQURPQkUsIHZlcnNpb24sIGZsYWdzMCwgZmxhZ3MxLCB0cmFuc2Zvcm0pOworICAgIGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyID0gVFJVRTsKKyAgICBjaW5mby0+QWRvYmVfdHJhbnNmb3JtID0gKFVJTlQ4KSB0cmFuc2Zvcm07CisgIH0gZWxzZSB7CisgICAgLyogU3RhcnQgb2YgQVBQMTQgZG9lcyBub3QgbWF0Y2ggIkFkb2JlIiwgb3IgdG9vIHNob3J0ICovCisgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfQVBQMTQsIChpbnQpIChkYXRhbGVuICsgcmVtYWluaW5nKSk7CisgIH0KK30KKworCitNRVRIT0RERUYoYm9vbGVhbikKK2dldF9pbnRlcmVzdGluZ19hcHBuIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhbiBBUFAwIG9yIEFQUDE0IG1hcmtlciB3aXRob3V0IHNhdmluZyBpdCAqLworeworICBJTlQzMiBsZW5ndGg7CisgIEpPQ1RFVCBiW0FQUE5fREFUQV9MRU5dOworICB1bnNpZ25lZCBpbnQgaSwgbnVtdG9yZWFkOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisKKyAgLyogZ2V0IHRoZSBpbnRlcmVzdGluZyBwYXJ0IG9mIHRoZSBtYXJrZXIgZGF0YSAqLworICBpZiAobGVuZ3RoID49IEFQUE5fREFUQV9MRU4pCisgICAgbnVtdG9yZWFkID0gQVBQTl9EQVRBX0xFTjsKKyAgZWxzZSBpZiAobGVuZ3RoID4gMCkKKyAgICBudW10b3JlYWQgPSAodW5zaWduZWQgaW50KSBsZW5ndGg7CisgIGVsc2UKKyAgICBudW10b3JlYWQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbnVtdG9yZWFkOyBpKyspCisgICAgSU5QVVRfQllURShjaW5mbywgYltpXSwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IG51bXRvcmVhZDsKKworICAvKiBwcm9jZXNzIGl0ICovCisgIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKKyAgY2FzZSBNX0FQUDA6CisgICAgZXhhbWluZV9hcHAwKGNpbmZvLCAoSk9DVEVUIEZBUiAqKSBiLCBudW10b3JlYWQsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgTV9BUFAxNDoKKyAgICBleGFtaW5lX2FwcDE0KGNpbmZvLCAoSk9DVEVUIEZBUiAqKSBiLCBudW10b3JlYWQsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLyogY2FuJ3QgZ2V0IGhlcmUgdW5sZXNzIGpwZWdfc2F2ZV9tYXJrZXJzIGNob29zZXMgd3JvbmcgcHJvY2Vzc29yICovCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIHNraXAgYW55IHJlbWFpbmluZyBkYXRhIC0tIGNvdWxkIGJlIGxvdHMgKi8KKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIGlmIChsZW5ndGggPiAwKQorICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOworCisgIHJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBTQVZFX01BUktFUlNfU1VQUE9SVEVECisKK01FVEhPRERFRihib29sZWFuKQorc2F2ZV9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBTYXZlIGFuIEFQUG4gb3IgQ09NIG1hcmtlciBpbnRvIHRoZSBtYXJrZXIgbGlzdCAqLworeworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgY3VyX21hcmtlciA9IG1hcmtlci0+Y3VyX21hcmtlcjsKKyAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQsIGRhdGFfbGVuZ3RoOworICBKT0NURVQgRkFSICogZGF0YTsKKyAgSU5UMzIgbGVuZ3RoID0gMDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgaWYgKGN1cl9tYXJrZXIgPT0gTlVMTCkgeworICAgIC8qIGJlZ2luIHJlYWRpbmcgYSBtYXJrZXIgKi8KKyAgICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgICBsZW5ndGggLT0gMjsKKyAgICBpZiAobGVuZ3RoID49IDApIHsJCS8qIHdhdGNoIG91dCBmb3IgYm9ndXMgbGVuZ3RoIHdvcmQgKi8KKyAgICAgIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2Ugd2FudCB0byBzYXZlICovCisgICAgICB1bnNpZ25lZCBpbnQgbGltaXQ7CisgICAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gKGludCkgTV9DT00pCisJbGltaXQgPSBtYXJrZXItPmxlbmd0aF9saW1pdF9DT007CisgICAgICBlbHNlCisJbGltaXQgPSBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW2NpbmZvLT51bnJlYWRfbWFya2VyIC0gKGludCkgTV9BUFAwXTsKKyAgICAgIGlmICgodW5zaWduZWQgaW50KSBsZW5ndGggPCBsaW1pdCkKKwlsaW1pdCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKKyAgICAgIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBtYXJrZXIgaXRlbSAqLworICAgICAgY3VyX21hcmtlciA9IChqcGVnX3NhdmVkX21hcmtlcl9wdHIpCisJKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgU0laRU9GKHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QpICsgbGltaXQpOworICAgICAgY3VyX21hcmtlci0+bmV4dCA9IE5VTEw7CisgICAgICBjdXJfbWFya2VyLT5tYXJrZXIgPSAoVUlOVDgpIGNpbmZvLT51bnJlYWRfbWFya2VyOworICAgICAgY3VyX21hcmtlci0+b3JpZ2luYWxfbGVuZ3RoID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOworICAgICAgY3VyX21hcmtlci0+ZGF0YV9sZW5ndGggPSBsaW1pdDsKKyAgICAgIC8qIGRhdGEgYXJlYSBpcyBqdXN0IGJleW9uZCB0aGUganBlZ19tYXJrZXJfc3RydWN0ICovCisgICAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YSA9IChKT0NURVQgRkFSICopIChjdXJfbWFya2VyICsgMSk7CisgICAgICBtYXJrZXItPmN1cl9tYXJrZXIgPSBjdXJfbWFya2VyOworICAgICAgbWFya2VyLT5ieXRlc19yZWFkID0gMDsKKyAgICAgIGJ5dGVzX3JlYWQgPSAwOworICAgICAgZGF0YV9sZW5ndGggPSBsaW1pdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogZGVhbCB3aXRoIGJvZ3VzIGxlbmd0aCB3b3JkICovCisgICAgICBieXRlc19yZWFkID0gZGF0YV9sZW5ndGggPSAwOworICAgICAgZGF0YSA9IE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHJlc3VtZSByZWFkaW5nIGEgbWFya2VyICovCisgICAgYnl0ZXNfcmVhZCA9IG1hcmtlci0+Ynl0ZXNfcmVhZDsKKyAgICBkYXRhX2xlbmd0aCA9IGN1cl9tYXJrZXItPmRhdGFfbGVuZ3RoOworICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhICsgYnl0ZXNfcmVhZDsKKyAgfQorCisgIHdoaWxlIChieXRlc19yZWFkIDwgZGF0YV9sZW5ndGgpIHsKKyAgICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIG1vdmUgdGhlIHJlc3RhcnQgcG9pbnQgdG8gaGVyZSAqLworICAgIG1hcmtlci0+Ynl0ZXNfcmVhZCA9IGJ5dGVzX3JlYWQ7CisgICAgLyogSWYgdGhlcmUncyBub3QgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gYnVmZmVyLCBzdXNwZW5kICovCisgICAgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLCByZXR1cm4gRkFMU0UpOworICAgIC8qIENvcHkgYnl0ZXMgd2l0aCByZWFzb25hYmxlIHJhcGlkaXR5ICovCisgICAgd2hpbGUgKGJ5dGVzX3JlYWQgPCBkYXRhX2xlbmd0aCAmJiBieXRlc19pbl9idWZmZXIgPiAwKSB7CisgICAgICAqZGF0YSsrID0gKm5leHRfaW5wdXRfYnl0ZSsrOworICAgICAgYnl0ZXNfaW5fYnVmZmVyLS07CisgICAgICBieXRlc19yZWFkKys7CisgICAgfQorICB9CisKKyAgLyogRG9uZSByZWFkaW5nIHdoYXQgd2Ugd2FudCB0byByZWFkICovCisgIGlmIChjdXJfbWFya2VyICE9IE5VTEwpIHsJLyogd2lsbCBiZSBOVUxMIGlmIGJvZ3VzIGxlbmd0aCB3b3JkICovCisgICAgLyogQWRkIG5ldyBtYXJrZXIgdG8gZW5kIG9mIGxpc3QgKi8KKyAgICBpZiAoY2luZm8tPm1hcmtlcl9saXN0ID09IE5VTEwpIHsKKyAgICAgIGNpbmZvLT5tYXJrZXJfbGlzdCA9IGN1cl9tYXJrZXI7CisgICAgfSBlbHNlIHsKKyAgICAgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBwcmV2ID0gY2luZm8tPm1hcmtlcl9saXN0OworICAgICAgd2hpbGUgKHByZXYtPm5leHQgIT0gTlVMTCkKKwlwcmV2ID0gcHJldi0+bmV4dDsKKyAgICAgIHByZXYtPm5leHQgPSBjdXJfbWFya2VyOworICAgIH0KKyAgICAvKiBSZXNldCBwb2ludGVyICYgY2FsYyByZW1haW5pbmcgZGF0YSBsZW5ndGggKi8KKyAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YTsKKyAgICBsZW5ndGggPSBjdXJfbWFya2VyLT5vcmlnaW5hbF9sZW5ndGggLSBkYXRhX2xlbmd0aDsKKyAgfQorICAvKiBSZXNldCB0byBpbml0aWFsIHN0YXRlIGZvciBuZXh0IG1hcmtlciAqLworICBtYXJrZXItPmN1cl9tYXJrZXIgPSBOVUxMOworCisgIC8qIFByb2Nlc3MgdGhlIG1hcmtlciBpZiBpbnRlcmVzdGluZzsgZWxzZSBqdXN0IG1ha2UgYSBnZW5lcmljIHRyYWNlIG1zZyAqLworICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7CisgIGNhc2UgTV9BUFAwOgorICAgIGV4YW1pbmVfYXBwMChjaW5mbywgZGF0YSwgZGF0YV9sZW5ndGgsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgTV9BUFAxNDoKKyAgICBleGFtaW5lX2FwcDE0KGNpbmZvLCBkYXRhLCBkYXRhX2xlbmd0aCwgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19NSVNDX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIsCisJICAgICAoaW50KSAoZGF0YV9sZW5ndGggKyBsZW5ndGgpKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIHNraXAgYW55IHJlbWFpbmluZyBkYXRhIC0tIGNvdWxkIGJlIGxvdHMgKi8KKyAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBkbyBiZWZvcmUgc2tpcF9pbnB1dF9kYXRhICovCisgIGlmIChsZW5ndGggPiAwKQorICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogU0FWRV9NQVJLRVJTX1NVUFBPUlRFRCAqLworCisKK01FVEhPRERFRihib29sZWFuKQorc2tpcF92YXJpYWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKyAgCisgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX01JU0NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlciwgKGludCkgbGVuZ3RoKTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIGRvIGJlZm9yZSBza2lwX2lucHV0X2RhdGEgKi8KKyAgaWYgKGxlbmd0aCA+IDApCisgICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIEZpbmQgdGhlIG5leHQgSlBFRyBtYXJrZXIsIHNhdmUgaXQgaW4gY2luZm8tPnVucmVhZF9tYXJrZXIuCisgKiBSZXR1cm5zIEZBTFNFIGlmIGhhZCB0byBzdXNwZW5kIGJlZm9yZSByZWFjaGluZyBhIG1hcmtlcjsKKyAqIGluIHRoYXQgY2FzZSBjaW5mby0+dW5yZWFkX21hcmtlciBpcyB1bmNoYW5nZWQuCisgKgorICogTm90ZSB0aGF0IHRoZSByZXN1bHQgbWlnaHQgbm90IGJlIGEgdmFsaWQgbWFya2VyIGNvZGUsCisgKiBidXQgaXQgd2lsbCBuZXZlciBiZSAwIG9yIEZGLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCituZXh0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGM7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGZvciAoOzspIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIC8qIFNraXAgYW55IG5vbi1GRiBieXRlcy4KKyAgICAgKiBUaGlzIG1heSBsb29rIGEgYml0IGluZWZmaWNpZW50LCBidXQgaXQgd2lsbCBub3Qgb2NjdXIgaW4gYSB2YWxpZCBmaWxlLgorICAgICAqIFdlIHN5bmMgYWZ0ZXIgZWFjaCBkaXNjYXJkZWQgYnl0ZSBzbyB0aGF0IGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZQorICAgICAqIGNhbiBkaXNjYXJkIHRoZSBieXRlIGZyb20gaXRzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB3aGlsZSAoYyAhPSAweEZGKSB7CisgICAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMrKzsKKyAgICAgIElOUFVUX1NZTkMoY2luZm8pOworICAgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICB9CisgICAgLyogVGhpcyBsb29wIHN3YWxsb3dzIGFueSBkdXBsaWNhdGUgRkYgYnl0ZXMuICBFeHRyYSBGRnMgYXJlIGxlZ2FsIGFzCisgICAgICogcGFkIGJ5dGVzLCBzbyBkb24ndCBjb3VudCB0aGVtIGluIGRpc2NhcmRlZF9ieXRlcy4gIFdlIGFzc3VtZSB0aGVyZQorICAgICAqIHdpbGwgbm90IGJlIHNvIG1hbnkgY29uc2VjdXRpdmUgRkYgYnl0ZXMgYXMgdG8gb3ZlcmZsb3cgYSBzdXNwZW5kaW5nCisgICAgICogZGF0YSBzb3VyY2UncyBpbnB1dCBidWZmZXIuCisgICAgICovCisgICAgZG8geworICAgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICB9IHdoaWxlIChjID09IDB4RkYpOworICAgIGlmIChjICE9IDApCisgICAgICBicmVhazsJCQkvKiBmb3VuZCBhIHZhbGlkIG1hcmtlciwgZXhpdCBsb29wICovCisgICAgLyogUmVhY2ggaGVyZSBpZiB3ZSBmb3VuZCBhIHN0dWZmZWQtemVybyBkYXRhIHNlcXVlbmNlIChGRi8wMCkuCisgICAgICogRGlzY2FyZCBpdCBhbmQgbG9vcCBiYWNrIHRvIHRyeSBhZ2Fpbi4KKyAgICAgKi8KKyAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gMjsKKyAgICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgfQorCisgIGlmIChjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgIT0gMCkgeworICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fRVhUUkFORU9VU19EQVRBLCBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMsIGMpOworICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyA9IDA7CisgIH0KKworICBjaW5mby0+dW5yZWFkX21hcmtlciA9IGM7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitmaXJzdF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBMaWtlIG5leHRfbWFya2VyLCBidXQgdXNlZCB0byBvYnRhaW4gdGhlIGluaXRpYWwgU09JIG1hcmtlci4gKi8KKy8qIEZvciB0aGlzIG1hcmtlciwgd2UgZG8gbm90IGFsbG93IHByZWNlZGluZyBnYXJiYWdlIG9yIGZpbGw7IG90aGVyd2lzZSwKKyAqIHdlIG1pZ2h0IHdlbGwgc2NhbiBhbiBlbnRpcmUgaW5wdXQgZmlsZSBiZWZvcmUgcmVhbGl6aW5nIGl0IGFpbid0IEpQRUcuCisgKiBJZiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBwcm9jZXNzIG5vbi1KRklGIGZpbGVzLCBpdCBtdXN0IHNlZWsgdG8gdGhlCisgKiBTT0kgYmVmb3JlIGNhbGxpbmcgdGhlIEpQRUcgbGlicmFyeS4KKyAqLworeworICBpbnQgYywgYzI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgIElOUFVUX0JZVEUoY2luZm8sIGMyLCByZXR1cm4gRkFMU0UpOworICBpZiAoYyAhPSAweEZGIHx8IGMyICE9IChpbnQpIE1fU09JKQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX05PX1NPSSwgYywgYzIpOworCisgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzI7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBSZWFkIG1hcmtlcnMgdW50aWwgU09TIG9yIEVPSS4KKyAqCisgKiBSZXR1cm5zIHNhbWUgY29kZXMgYXMgYXJlIGRlZmluZWQgZm9yIGpwZWdfY29uc3VtZV9pbnB1dDoKKyAqIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgorICovCisKK01FVEhPRERFRihpbnQpCityZWFkX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIE91dGVyIGxvb3AgcmVwZWF0cyBvbmNlIGZvciBlYWNoIG1hcmtlci4gKi8KKyAgZm9yICg7OykgeworICAgIC8qIENvbGxlY3QgdGhlIG1hcmtlciBwcm9wZXIsIHVubGVzcyB3ZSBhbHJlYWR5IGRpZC4gKi8KKyAgICAvKiBOQjogZmlyc3RfbWFya2VyKCkgZW5mb3JjZXMgdGhlIHJlcXVpcmVtZW50IHRoYXQgU09JIGFwcGVhciBmaXJzdC4gKi8KKyAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgeworICAgICAgaWYgKCEgY2luZm8tPm1hcmtlci0+c2F3X1NPSSkgeworCWlmICghIGZpcnN0X21hcmtlcihjaW5mbykpCisJICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICB9IGVsc2UgeworCWlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKKwkgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQXQgdGhpcyBwb2ludCBjaW5mby0+dW5yZWFkX21hcmtlciBjb250YWlucyB0aGUgbWFya2VyIGNvZGUgYW5kIHRoZQorICAgICAqIGlucHV0IHBvaW50IGlzIGp1c3QgcGFzdCB0aGUgbWFya2VyIHByb3BlciwgYnV0IGJlZm9yZSBhbnkgcGFyYW1ldGVycy4KKyAgICAgKiBBIHN1c3BlbnNpb24gd2lsbCBjYXVzZSB1cyB0byByZXR1cm4gd2l0aCB0aGlzIHN0YXRlIHN0aWxsIHRydWUuCisgICAgICovCisgICAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgeworICAgIGNhc2UgTV9TT0k6CisgICAgICBpZiAoISBnZXRfc29pKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KKyAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KKyAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIEZBTFNFLCBGQUxTRSkpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBUUlVFLCBGQUxTRSkpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09GOToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIEZBTFNFLCBUUlVFKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT0YxMDoJCS8qIFByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBUUlVFLCBUUlVFKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIC8qIEN1cnJlbnRseSB1bnN1cHBvcnRlZCBTT0ZuIHR5cGVzICovCisgICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCisgICAgY2FzZSBNX0pQRzoJCQkvKiBSZXNlcnZlZCBmb3IgSlBFRyBleHRlbnNpb25zICovCisgICAgY2FzZSBNX1NPRjExOgkJLyogTG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTM6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNDoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNToJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLworICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfU09GX1VOU1VQUE9SVEVELCBjaW5mby0+dW5yZWFkX21hcmtlcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT1M6CisgICAgICBpZiAoISBnZXRfc29zKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CS8qIHByb2Nlc3NlZCB0aGUgbWFya2VyICovCisgICAgICByZXR1cm4gSlBFR19SRUFDSEVEX1NPUzsKKyAgICAKKyAgICBjYXNlIE1fRU9JOgorICAgICAgVFJBQ0VNUyhjaW5mbywgMSwgSlRSQ19FT0kpOworICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkvKiBwcm9jZXNzZWQgdGhlIG1hcmtlciAqLworICAgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0k7CisgICAgICAKKyAgICBjYXNlIE1fREFDOgorICAgICAgaWYgKCEgZ2V0X2RhYyhjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fREhUOgorICAgICAgaWYgKCEgZ2V0X2RodChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fRFFUOgorICAgICAgaWYgKCEgZ2V0X2RxdChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fRFJJOgorICAgICAgaWYgKCEgZ2V0X2RyaShjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fQVBQMDoKKyAgICBjYXNlIE1fQVBQMToKKyAgICBjYXNlIE1fQVBQMjoKKyAgICBjYXNlIE1fQVBQMzoKKyAgICBjYXNlIE1fQVBQNDoKKyAgICBjYXNlIE1fQVBQNToKKyAgICBjYXNlIE1fQVBQNjoKKyAgICBjYXNlIE1fQVBQNzoKKyAgICBjYXNlIE1fQVBQODoKKyAgICBjYXNlIE1fQVBQOToKKyAgICBjYXNlIE1fQVBQMTA6CisgICAgY2FzZSBNX0FQUDExOgorICAgIGNhc2UgTV9BUFAxMjoKKyAgICBjYXNlIE1fQVBQMTM6CisgICAgY2FzZSBNX0FQUDE0OgorICAgIGNhc2UgTV9BUFAxNToKKyAgICAgIGlmICghICgqKChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyKS0+cHJvY2Vzc19BUFBuWworCQljaW5mby0+dW5yZWFkX21hcmtlciAtIChpbnQpIE1fQVBQMF0pIChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fQ09NOgorICAgICAgaWYgKCEgKCooKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXIpLT5wcm9jZXNzX0NPTSkgKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9SU1QwOgkJLyogdGhlc2UgYXJlIGFsbCBwYXJhbWV0ZXJsZXNzICovCisgICAgY2FzZSBNX1JTVDE6CisgICAgY2FzZSBNX1JTVDI6CisgICAgY2FzZSBNX1JTVDM6CisgICAgY2FzZSBNX1JTVDQ6CisgICAgY2FzZSBNX1JTVDU6CisgICAgY2FzZSBNX1JTVDY6CisgICAgY2FzZSBNX1JTVDc6CisgICAgY2FzZSBNX1RFTToKKyAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1BBUk1MRVNTX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fRE5MOgkJCS8qIElnbm9yZSBETkwgLi4uIHBlcmhhcHMgdGhlIHdyb25nIHRoaW5nICovCisgICAgICBpZiAoISBza2lwX3ZhcmlhYmxlKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CQkJLyogbXVzdCBiZSBESFAsIEVYUCwgSlBHbiwgb3IgUkVTbiAqLworICAgICAgLyogRm9yIG5vdywgd2UgdHJlYXQgdGhlIHJlc2VydmVkIG1hcmtlcnMgYXMgZmF0YWwgZXJyb3JzIHNpbmNlIHRoZXkgYXJlCisgICAgICAgKiBsaWtlbHkgdG8gYmUgdXNlZCB0byBzaWduYWwgaW5jb21wYXRpYmxlIEpQRUcgUGFydCAzIGV4dGVuc2lvbnMuCisgICAgICAgKiBPbmNlIHRoZSBKUEVHIDMgdmVyc2lvbi1udW1iZXIgbWFya2VyIGlzIHdlbGwgZGVmaW5lZCwgdGhpcyBjb2RlCisgICAgICAgKiBvdWdodCB0byBjaGFuZ2UhCisgICAgICAgKi8KKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBtYXJrZXIsIHNvIHJlc2V0IHN0YXRlIHZhcmlhYmxlICovCisgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICB9IC8qIGVuZCBsb29wICovCit9CisKKworLyoKKyAqIFJlYWQgYSByZXN0YXJ0IG1hcmtlciwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYXBwZWFyIG5leHQgaW4gdGhlIGRhdGFzdHJlYW07CisgKiBpZiB0aGUgbWFya2VyIGlzIG5vdCB0aGVyZSwgdGFrZSBhcHByb3ByaWF0ZSByZWNvdmVyeSBhY3Rpb24uCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbnNpb24gaXMgcmVxdWlyZWQuCisgKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGVudHJvcHkgZGVjb2RlciBhZnRlciBpdCBoYXMgcmVhZCBhbiBhcHByb3ByaWF0ZQorICogbnVtYmVyIG9mIE1DVXMuICBjaW5mby0+dW5yZWFkX21hcmtlciBtYXkgYmUgbm9uemVybyBpZiB0aGUgZW50cm9weSBkZWNvZGVyCisgKiBoYXMgYWxyZWFkeSByZWFkIGEgbWFya2VyIGZyb20gdGhlIGRhdGEgc291cmNlLiAgVW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKyAqIGNpbmZvLT51bnJlYWRfbWFya2VyIHdpbGwgYmUgcmVzZXQgdG8gMCBiZWZvcmUgcmV0dXJuaW5nOyBpZiBub3QgcmVzZXQsCisgKiBpdCBob2xkcyBhIG1hcmtlciB3aGljaCB0aGUgZGVjb2RlciB3aWxsIGJlIHVuYWJsZSB0byByZWFkIHBhc3QuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCityZWFkX3Jlc3RhcnRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBPYnRhaW4gYSBtYXJrZXIgdW5sZXNzIHdlIGFscmVhZHkgZGlkLiAqLworICAvKiBOb3RlIHRoYXQgbmV4dF9tYXJrZXIgd2lsbCBjb21wbGFpbiBpZiBpdCBza2lwcyBhbnkgZGF0YS4gKi8KKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKKyAgICBpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0KKyAgICAgICgoaW50KSBNX1JTVDAgKyBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKSkgeworICAgIC8qIE5vcm1hbCBjYXNlIC0tLSBzd2FsbG93IHRoZSBtYXJrZXIgYW5kIGxldCBlbnRyb3B5IGRlY29kZXIgY29udGludWUgKi8KKyAgICBUUkFDRU1TMShjaW5mbywgMywgSlRSQ19SU1QsIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pOworICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvKiBVaC1vaCwgdGhlIHJlc3RhcnQgbWFya2VycyBoYXZlIGJlZW4gbWVzc2VkIHVwLiAqLworICAgIC8qIExldCB0aGUgZGF0YSBzb3VyY2UgbWFuYWdlciBkZXRlcm1pbmUgaG93IHRvIHJlc3luYy4gKi8KKyAgICBpZiAoISAoKmNpbmZvLT5zcmMtPnJlc3luY190b19yZXN0YXJ0KSAoY2luZm8sCisJCQkJCSAgICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIFVwZGF0ZSBuZXh0LXJlc3RhcnQgc3RhdGUgKi8KKyAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IChjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtICsgMSkgJiA3OworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZGF0YSBzb3VyY2UgbWFuYWdlcnMKKyAqIHRvIHVzZSBpZiB0aGV5IGRvbid0IGhhdmUgYW55IGJldHRlciBhcHByb2FjaC4gIFNvbWUgZGF0YSBzb3VyY2UgbWFuYWdlcnMKKyAqIG1heSBiZSBhYmxlIHRvIGJhY2sgdXAsIG9yIG1heSBoYXZlIGFkZGl0aW9uYWwga25vd2xlZGdlIGFib3V0IHRoZSBkYXRhCisgKiB3aGljaCBwZXJtaXRzIGEgbW9yZSBpbnRlbGxpZ2VudCByZWNvdmVyeSBzdHJhdGVneTsgc3VjaCBtYW5hZ2VycyB3b3VsZAorICogcHJlc3VtYWJseSBzdXBwbHkgdGhlaXIgb3duIHJlc3luYyBtZXRob2QuCisgKgorICogcmVhZF9yZXN0YXJ0X21hcmtlciBjYWxscyByZXN5bmNfdG9fcmVzdGFydCBpZiBpdCBmaW5kcyBhIG1hcmtlciBvdGhlciB0aGFuCisgKiB0aGUgcmVzdGFydCBtYXJrZXIgaXQgd2FzIGV4cGVjdGluZy4gIChUaGlzIGNvZGUgaXMgKm5vdCogdXNlZCB1bmxlc3MKKyAqIGEgbm9uemVybyByZXN0YXJ0IGludGVydmFsIGhhcyBiZWVuIGRlY2xhcmVkLikgIGNpbmZvLT51bnJlYWRfbWFya2VyIGlzCisgKiB0aGUgbWFya2VyIGNvZGUgYWN0dWFsbHkgZm91bmQgKG1pZ2h0IGJlIGFueXRoaW5nLCBleGNlcHQgMCBvciBGRikuCisgKiBUaGUgZGVzaXJlZCByZXN0YXJ0IG1hcmtlciBudW1iZXIgKDAuLjcpIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlci4KKyAqIFRoaXMgcm91dGluZSBpcyBzdXBwb3NlZCB0byBhcHBseSB3aGF0ZXZlciBlcnJvciByZWNvdmVyeSBzdHJhdGVneSBzZWVtcworICogYXBwcm9wcmlhdGUgaW4gb3JkZXIgdG8gcG9zaXRpb24gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgbmV4dCBkYXRhIHNlZ21lbnQuCisgKiBOb3RlIHRoYXQgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMgdHJlYXRlZCBhcyBhIG1hcmtlciBhcHBlYXJpbmcgYmVmb3JlCisgKiB0aGUgY3VycmVudCBkYXRhLXNvdXJjZSBpbnB1dCBwb2ludDsgdXN1YWxseSBpdCBzaG91bGQgYmUgcmVzZXQgdG8gemVybworICogYmVmb3JlIHJldHVybmluZy4KKyAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuc2lvbiBpcyByZXF1aXJlZC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHN1YnN0YW50aWFsbHkgY29uc3RyYWluZWQgYnkgd2FudGluZyB0byB0cmVhdCB0aGUKKyAqIGlucHV0IGFzIGEgZGF0YSBzdHJlYW07IHRoaXMgbWVhbnMgd2UgY2FuJ3QgYmFjayB1cC4gIFRoZXJlZm9yZSwgd2UgaGF2ZQorICogb25seSB0aGUgZm9sbG93aW5nIGFjdGlvbnMgdG8gd29yayB3aXRoOgorICogICAxLiBTaW1wbHkgZGlzY2FyZCB0aGUgbWFya2VyIGFuZCBsZXQgdGhlIGVudHJvcHkgZGVjb2RlciByZXN1bWUgYXQgbmV4dAorICogICAgICBieXRlIG9mIGZpbGUuCisgKiAgIDIuIFJlYWQgZm9yd2FyZCB1bnRpbCB3ZSBmaW5kIGFub3RoZXIgbWFya2VyLCBkaXNjYXJkaW5nIGludGVydmVuaW5nCisgKiAgICAgIGRhdGEuICAoSW4gdGhlb3J5IHdlIGNvdWxkIGxvb2sgYWhlYWQgd2l0aGluIHRoZSBjdXJyZW50IGJ1ZmZlcmxvYWQsCisgKiAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGRpc2NhcmQgZGF0YSBpZiB3ZSBkb24ndCBmaW5kIHRoZSBkZXNpcmVkIG1hcmtlci4KKyAqICAgICAgVGhpcyBpZGVhIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlLCBpbiBwYXJ0IGJlY2F1c2UgaXQgbWFrZXMgYmVoYXZpb3IKKyAqICAgICAgZGVwZW5kZW50IG9uIGJ1ZmZlciBzaXplIGFuZCBjaGFuY2UgYnVmZmVyLWJvdW5kYXJ5IHBvc2l0aW9ucy4pCisgKiAgIDMuIExlYXZlIHRoZSBtYXJrZXIgdW5yZWFkIChieSBmYWlsaW5nIHRvIHplcm8gY2luZm8tPnVucmVhZF9tYXJrZXIpLgorICogICAgICBUaGlzIHdpbGwgY2F1c2UgdGhlIGVudHJvcHkgZGVjb2RlciB0byBwcm9jZXNzIGFuIGVtcHR5IGRhdGEgc2VnbWVudCwKKyAqICAgICAgaW5zZXJ0aW5nIGR1bW15IHplcm9lcywgYW5kIHRoZW4gd2Ugd2lsbCByZXByb2Nlc3MgdGhlIG1hcmtlci4KKyAqCisgKiAjMiBpcyBhcHByb3ByaWF0ZSBpZiB3ZSB0aGluayB0aGUgZGVzaXJlZCBtYXJrZXIgbGllcyBhaGVhZCwgd2hpbGUgIzMgaXMKKyAqIGFwcHJvcHJpYXRlIGlmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSBmdXR1cmUgcmVzdGFydCBtYXJrZXIgKGluZGljYXRpbmcKKyAqIHRoYXQgd2UgaGF2ZSBtaXNzZWQgdGhlIGRlc2lyZWQgcmVzdGFydCBtYXJrZXIsIHByb2JhYmx5IGJlY2F1c2UgaXQgZ290CisgKiBjb3JydXB0ZWQpLgorICogV2UgYXBwbHkgIzIgb3IgIzMgaWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIHJlc3RhcnQgbWFya2VyIG5vIG1vcmUgdGhhbgorICogdHdvIGNvdW50cyBiZWhpbmQgb3IgYWhlYWQgb2YgdGhlIGV4cGVjdGVkIG9uZS4gIFdlIGFsc28gYXBwbHkgIzIgaWYgdGhlCisgKiBmb3VuZCBtYXJrZXIgaXMgbm90IGEgbGVnYWwgSlBFRyBtYXJrZXIgY29kZSAoaXQncyBjZXJ0YWlubHkgYm9ndXMgZGF0YSkuCisgKiBJZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgcmVzdGFydCBtYXJrZXIgbW9yZSB0aGFuIDIgY291bnRzIGF3YXksIHdlIGRvICMxCisgKiAodG9vIG11Y2ggcmlzayB0aGF0IHRoZSBtYXJrZXIgaXMgZXJyb25lb3VzOyB3aXRoIGx1Y2sgd2Ugd2lsbCBiZSBhYmxlIHRvCisgKiByZXN5bmMgYXQgc29tZSBmdXR1cmUgcG9pbnQpLgorICogRm9yIGFueSB2YWxpZCBub24tcmVzdGFydCBKUEVHIG1hcmtlciwgd2UgYXBwbHkgIzMuICBUaGlzIGtlZXBzIHVzIGZyb20KKyAqIG92ZXJydW5uaW5nIHRoZSBlbmQgb2YgYSBzY2FuLiAgQW4gaW1wbGVtZW50YXRpb24gbGltaXRlZCB0byBzaW5nbGUtc2NhbgorICogZmlsZXMgbWlnaHQgZmluZCBpdCBiZXR0ZXIgdG8gYXBwbHkgIzIgZm9yIG1hcmtlcnMgb3RoZXIgdGhhbiBFT0ksIHNpbmNlCisgKiBhbnkgb3RoZXIgbWFya2VyIHdvdWxkIGhhdmUgdG8gYmUgYm9ndXMgZGF0YSBpbiB0aGF0IGNhc2UuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3Jlc3luY190b19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkKK3sKKyAgaW50IG1hcmtlciA9IGNpbmZvLT51bnJlYWRfbWFya2VyOworICBpbnQgYWN0aW9uID0gMTsKKyAgCisgIC8qIEFsd2F5cyBwdXQgdXAgYSB3YXJuaW5nLiAqLworICBXQVJOTVMyKGNpbmZvLCBKV1JOX01VU1RfUkVTWU5DLCBtYXJrZXIsIGRlc2lyZWQpOworICAKKyAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIHJlcGVhdGVkIGRlY2lzaW9uIGFmdGVyIHNjYW5uaW5nIGZvcndhcmQuICovCisgIGZvciAoOzspIHsKKyAgICBpZiAobWFya2VyIDwgKGludCkgTV9TT0YwKQorICAgICAgYWN0aW9uID0gMjsJCS8qIGludmFsaWQgbWFya2VyICovCisgICAgZWxzZSBpZiAobWFya2VyIDwgKGludCkgTV9SU1QwIHx8IG1hcmtlciA+IChpbnQpIE1fUlNUNykKKyAgICAgIGFjdGlvbiA9IDM7CQkvKiB2YWxpZCBub24tcmVzdGFydCBtYXJrZXIgKi8KKyAgICBlbHNlIHsKKyAgICAgIGlmIChtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZCsxKSAmIDcpKSB8fAorCSAgbWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQrMikgJiA3KSkpCisJYWN0aW9uID0gMzsJCS8qIG9uZSBvZiB0aGUgbmV4dCB0d28gZXhwZWN0ZWQgcmVzdGFydHMgKi8KKyAgICAgIGVsc2UgaWYgKG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkLTEpICYgNykpIHx8CisJICAgICAgIG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkLTIpICYgNykpKQorCWFjdGlvbiA9IDI7CQkvKiBhIHByaW9yIHJlc3RhcnQsIHNvIGFkdmFuY2UgKi8KKyAgICAgIGVsc2UKKwlhY3Rpb24gPSAxOwkJLyogZGVzaXJlZCByZXN0YXJ0IG9yIHRvbyBmYXIgYXdheSAqLworICAgIH0KKyAgICBUUkFDRU1TMihjaW5mbywgNCwgSlRSQ19SRUNPVkVSWV9BQ1RJT04sIG1hcmtlciwgYWN0aW9uKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgMToKKyAgICAgIC8qIERpc2NhcmQgbWFya2VyIGFuZCBsZXQgZW50cm9weSBkZWNvZGVyIHJlc3VtZSBwcm9jZXNzaW5nLiAqLworICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSAyOgorICAgICAgLyogU2NhbiB0byB0aGUgbmV4dCBtYXJrZXIsIGFuZCByZXBlYXQgdGhlIGRlY2lzaW9uIGxvb3AuICovCisgICAgICBpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICAgICAgbWFya2VyID0gY2luZm8tPnVucmVhZF9tYXJrZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAvKiBSZXR1cm4gd2l0aG91dCBhZHZhbmNpbmcgcGFzdCB0aGlzIG1hcmtlci4gKi8KKyAgICAgIC8qIEVudHJvcHkgZGVjb2RlciB3aWxsIGJlIGZvcmNlZCB0byBwcm9jZXNzIGFuIGVtcHR5IHNlZ21lbnQuICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0gLyogZW5kIGxvb3AgKi8KK30KKworCisvKgorICogUmVzZXQgbWFya2VyIHByb2Nlc3Npbmcgc3RhdGUgdG8gYmVnaW4gYSBmcmVzaCBkYXRhc3RyZWFtLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmVzZXRfbWFya2VyX3JlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKworICBjaW5mby0+Y29tcF9pbmZvID0gTlVMTDsJCS8qIHVudGlsIGFsbG9jYXRlZCBieSBnZXRfc29mICovCisgIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9IDA7CQkvKiBubyBTT1Mgc2VlbiB5ZXQgKi8KKyAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkJLyogbm8gcGVuZGluZyBtYXJrZXIgKi8KKyAgbWFya2VyLT5wdWIuc2F3X1NPSSA9IEZBTFNFOwkJLyogc2V0IGludGVybmFsIHN0YXRlIHRvbyAqLworICBtYXJrZXItPnB1Yi5zYXdfU09GID0gRkFMU0U7CisgIG1hcmtlci0+cHViLmRpc2NhcmRlZF9ieXRlcyA9IDA7CisgIG1hcmtlci0+Y3VyX21hcmtlciA9IE5VTEw7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIG1hcmtlciByZWFkZXIgbW9kdWxlLgorICogVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlLCB3aGVuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBpcyBjcmVhdGVkLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWFya2VyX3JlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXI7CisgIGludCBpOworCisgIC8qIENyZWF0ZSBzdWJvYmplY3QgaW4gcGVybWFuZW50IHBvb2wgKi8KKyAgbWFya2VyID0gKG15X21hcmtlcl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCisJCQkJU0laRU9GKG15X21hcmtlcl9yZWFkZXIpKTsKKyAgY2luZm8tPm1hcmtlciA9IChzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyICopIG1hcmtlcjsKKyAgLyogSW5pdGlhbGl6ZSBwdWJsaWMgbWV0aG9kIHBvaW50ZXJzICovCisgIG1hcmtlci0+cHViLnJlc2V0X21hcmtlcl9yZWFkZXIgPSByZXNldF9tYXJrZXJfcmVhZGVyOworICBtYXJrZXItPnB1Yi5yZWFkX21hcmtlcnMgPSByZWFkX21hcmtlcnM7CisgIG1hcmtlci0+cHViLnJlYWRfcmVzdGFydF9tYXJrZXIgPSByZWFkX3Jlc3RhcnRfbWFya2VyOworICAvKiBJbml0aWFsaXplIENPTS9BUFBuIHByb2Nlc3NpbmcuCisgICAqIEJ5IGRlZmF1bHQsIHdlIGV4YW1pbmUgYW5kIHRoZW4gZGlzY2FyZCBBUFAwIGFuZCBBUFAxNCwKKyAgICogYnV0IHNpbXBseSBkaXNjYXJkIENPTSBhbmQgYWxsIG90aGVyIEFQUG4uCisgICAqLworICBtYXJrZXItPnByb2Nlc3NfQ09NID0gc2tpcF92YXJpYWJsZTsKKyAgbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBtYXJrZXItPnByb2Nlc3NfQVBQbltpXSA9IHNraXBfdmFyaWFibGU7CisgICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQbltpXSA9IDA7CisgIH0KKyAgbWFya2VyLT5wcm9jZXNzX0FQUG5bMF0gPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKKyAgbWFya2VyLT5wcm9jZXNzX0FQUG5bMTRdID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47CisgIC8qIFJlc2V0IG1hcmtlciBwcm9jZXNzaW5nIHN0YXRlICovCisgIHJlc2V0X21hcmtlcl9yZWFkZXIoY2luZm8pOworfQorCisKKy8qCisgKiBDb250cm9sIHNhdmluZyBvZiBDT00gYW5kIEFQUG4gbWFya2VycyBpbnRvIG1hcmtlcl9saXN0LgorICovCisKKyNpZmRlZiBTQVZFX01BUktFUlNfU1VQUE9SVEVECisKK0dMT0JBTCh2b2lkKQoranBlZ19zYXZlX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKKwkJICAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdCkKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKyAgbG9uZyBtYXhsZW5ndGg7CisgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc29yOworCisgIC8qIExlbmd0aCBsaW1pdCBtdXN0bid0IGJlIGxhcmdlciB0aGFuIHdoYXQgd2UgY2FuIGFsbG9jYXRlCisgICAqIChzaG91bGQgb25seSBiZSBhIGNvbmNlcm4gaW4gYSAxNi1iaXQgZW52aXJvbm1lbnQpLgorICAgKi8KKyAgbWF4bGVuZ3RoID0gY2luZm8tPm1lbS0+bWF4X2FsbG9jX2NodW5rIC0gU0laRU9GKHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QpOworICBpZiAoKChsb25nKSBsZW5ndGhfbGltaXQpID4gbWF4bGVuZ3RoKQorICAgIGxlbmd0aF9saW1pdCA9ICh1bnNpZ25lZCBpbnQpIG1heGxlbmd0aDsKKworICAvKiBDaG9vc2UgcHJvY2Vzc29yIHJvdXRpbmUgdG8gdXNlLgorICAgKiBBUFAwL0FQUDE0IGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMuCisgICAqLworICBpZiAobGVuZ3RoX2xpbWl0KSB7CisgICAgcHJvY2Vzc29yID0gc2F2ZV9tYXJrZXI7CisgICAgLyogSWYgc2F2aW5nIEFQUDAvQVBQMTQsIHNhdmUgYXQgbGVhc3QgZW5vdWdoIGZvciBvdXIgaW50ZXJuYWwgdXNlLiAqLworICAgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDAgJiYgbGVuZ3RoX2xpbWl0IDwgQVBQMF9EQVRBX0xFTikKKyAgICAgIGxlbmd0aF9saW1pdCA9IEFQUDBfREFUQV9MRU47CisgICAgZWxzZSBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAxNCAmJiBsZW5ndGhfbGltaXQgPCBBUFAxNF9EQVRBX0xFTikKKyAgICAgIGxlbmd0aF9saW1pdCA9IEFQUDE0X0RBVEFfTEVOOworICB9IGVsc2UgeworICAgIHByb2Nlc3NvciA9IHNraXBfdmFyaWFibGU7CisgICAgLyogSWYgZGlzY2FyZGluZyBBUFAwL0FQUDE0LCB1c2Ugb3VyIHJlZ3VsYXIgb24tdGhlLWZseSBwcm9jZXNzb3IuICovCisgICAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMCB8fCBtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDE0KQorICAgICAgcHJvY2Vzc29yID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47CisgIH0KKworICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9DT00pIHsKKyAgICBtYXJrZXItPnByb2Nlc3NfQ09NID0gcHJvY2Vzc29yOworICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTSA9IGxlbmd0aF9saW1pdDsKKyAgfSBlbHNlIGlmIChtYXJrZXJfY29kZSA+PSAoaW50KSBNX0FQUDAgJiYgbWFya2VyX2NvZGUgPD0gKGludCkgTV9BUFAxNSkgeworICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW21hcmtlcl9jb2RlIC0gKGludCkgTV9BUFAwXSA9IHByb2Nlc3NvcjsKKyAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW21hcmtlcl9jb2RlIC0gKGludCkgTV9BUFAwXSA9IGxlbmd0aF9saW1pdDsKKyAgfSBlbHNlCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIG1hcmtlcl9jb2RlKTsKK30KKworI2VuZGlmIC8qIFNBVkVfTUFSS0VSU19TVVBQT1JURUQgKi8KKworCisvKgorICogSW5zdGFsbCBhIHNwZWNpYWwgcHJvY2Vzc2luZyBtZXRob2QgZm9yIENPTSBvciBBUFBuIG1hcmtlcnMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCisJCQkgICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJvdXRpbmUpCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisKKyAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQ09NKQorICAgIG1hcmtlci0+cHJvY2Vzc19DT00gPSByb3V0aW5lOworICBlbHNlIGlmIChtYXJrZXJfY29kZSA+PSAoaW50KSBNX0FQUDAgJiYgbWFya2VyX2NvZGUgPD0gKGludCkgTV9BUFAxNSkKKyAgICBtYXJrZXItPnByb2Nlc3NfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSByb3V0aW5lOworICBlbHNlCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIG1hcmtlcl9jb2RlKTsKK30KZGlmZiAtLWdpdCBhL2pkbWFzdGVyLmMgYi9qZG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjUwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9qZG1hc3Rlci5jCkBAIC0wLDAgKzEsNTc2IEBACisvKgorICogamRtYXN0ZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hc3RlciBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggc2VsZWN0aW5nIHRoZSBtb2R1bGVzIHRvIGJlIGV4ZWN1dGVkCisgKiBhbmQgd2l0aCBkZXRlcm1pbmluZyB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbmQgdGhlIHdvcmsgdG8gYmUgZG9uZSBpbiBlYWNoCisgKiBwYXNzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBQcml2YXRlIHN0YXRlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBpbnQgcGFzc19udW1iZXI7CQkvKiAjIG9mIHBhc3NlcyBjb21wbGV0ZWQgKi8KKworICBib29sZWFuIHVzaW5nX21lcmdlZF91cHNhbXBsZTsgLyogVFJVRSBpZiB1c2luZyBtZXJnZWQgdXBzYW1wbGUvY2NvbnZlcnQgKi8KKworICAvKiBTYXZlZCByZWZlcmVuY2VzIHRvIGluaXRpYWxpemVkIHF1YW50aXplciBtb2R1bGVzLAorICAgKiBpbiBjYXNlIHdlIG5lZWQgdG8gc3dpdGNoIG1vZGVzLgorICAgKi8KKyAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICogcXVhbnRpemVyXzFwYXNzOworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBxdWFudGl6ZXJfMnBhc3M7Cit9IG15X2RlY29tcF9tYXN0ZXI7CisKK3R5cGVkZWYgbXlfZGVjb21wX21hc3RlciAqIG15X21hc3Rlcl9wdHI7CisKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIG1lcmdlZCB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIHNob3VsZCBiZSB1c2VkLgorICogQ1JVQ0lBTDogdGhpcyBtdXN0IG1hdGNoIHRoZSBhY3R1YWwgY2FwYWJpbGl0aWVzIG9mIGpkbWVyZ2UuYyEKKyAqLworCitMT0NBTChib29sZWFuKQordXNlX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAorICAvKiBNZXJnaW5nIGlzIHRoZSBlcXVpdmFsZW50IG9mIHBsYWluIGJveC1maWx0ZXIgdXBzYW1wbGluZyAqLworICBpZiAoY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgfHwgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCisgICAgcmV0dXJuIEZBTFNFOworCisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgLyogamRtZXJnZS5jIG9ubHkgc3VwcG9ydHMgWUNDPT5SR0I1NjUgYW5kIFlDQz0+UkdCIGNvbG9yIGNvbnZlcnNpb24gKi8KKyAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciB8fCAKKyAgICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzIHx8CisgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gMyB8fAorICAgICAgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQl81NjUgJiYgCisgICAgICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZWxzZQorICAvKiBqZG1lcmdlLmMgb25seSBzdXBwb3J0cyBZQ0M9PlJHQiBjb2xvciBjb252ZXJzaW9uICovCisgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSAhPSBKQ1NfWUNiQ3IgfHwgY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMgfHwKKyAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQiB8fAorICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IFJHQl9QSVhFTFNJWkUpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgLyogYW5kIGl0IG9ubHkgaGFuZGxlcyAyaDF2IG9yIDJoMnYgc2FtcGxpbmcgcmF0aW9zICovCisgIGlmIChjaW5mby0+Y29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgIT0gMiB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciAhPSAxIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPiAgMiB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yICE9IDEgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciAhPSAxKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogZnVydGhlcm1vcmUsIGl0IGRvZXNuJ3Qgd29yayBpZiB3ZSd2ZSBzY2FsZWQgdGhlIElEQ1RzIGRpZmZlcmVudGx5ICovCisgIGlmIChjaW5mby0+Y29tcF9pbmZvWzBdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1sxXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogPz8/IGFsc28gbmVlZCB0byB0ZXN0IGZvciB1cHNhbXBsZS10aW1lIHJlc2NhbGluZywgd2hlbiAmIGlmIHN1cHBvcnRlZCAqLworICByZXR1cm4gVFJVRTsJCQkvKiBieSBnb2xseSwgaXQnbGwgd29yay4uLiAqLworI2Vsc2UKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKworLyoKKyAqIENvbXB1dGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYW5kIHJlbGF0ZWQgdmFsdWVzLgorICogTk9URTogdGhpcyBpcyBleHBvcnRlZCBmb3IgcG9zc2libGUgdXNlIGJ5IGFwcGxpY2F0aW9uLgorICogSGVuY2UgaXQgbXVzdG4ndCBkbyBhbnl0aGluZyB0aGF0IGNhbid0IGJlIGRvbmUgdHdpY2UuCisgKiBBbHNvIG5vdGUgdGhhdCBpdCBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbWFzdGVyIG1vZHVsZSBpcyBpbml0aWFsaXplZCEKKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIG1hc3RlciBzZWxlY3Rpb24gcGhhc2UgKi8KK3sKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyNlbmRpZgorCisgIC8qIFByZXZlbnQgYXBwbGljYXRpb24gZnJvbSBjYWxsaW5nIG1lIGF0IHdyb25nIHRpbWVzICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SRUFEWSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorCisgIC8qIENvbXB1dGUgYWN0dWFsIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFuZCBEQ1Qgc2NhbGluZyBjaG9pY2VzLiAqLworICBpZiAoY2luZm8tPnNjYWxlX251bSAqIDggPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CisgICAgLyogUHJvdmlkZSAxLzggc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgOEwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCA4TCk7CisgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSAxOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA0IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgeworICAgIC8qIFByb3ZpZGUgMS80IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDRMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgNEwpOworICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gMjsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogMiA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKKyAgICAvKiBQcm92aWRlIDEvMiBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCAyTCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDJMKTsKKyAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDQ7CisgIH0gZWxzZSB7CisgICAgLyogUHJvdmlkZSAxLzEgc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgfQorICAvKiBJbiBzZWxlY3RpbmcgdGhlIGFjdHVhbCBEQ1Qgc2NhbGluZyBmb3IgZWFjaCBjb21wb25lbnQsIHdlIHRyeSB0bworICAgKiBzY2FsZSB1cCB0aGUgY2hyb21hIGNvbXBvbmVudHMgdmlhIElEQ1Qgc2NhbGluZyByYXRoZXIgdGhhbiB1cHNhbXBsaW5nLgorICAgKiBUaGlzIHNhdmVzIHRpbWUgaWYgdGhlIHVwc2FtcGxlciBnZXRzIHRvIHVzZSAxOjEgc2NhbGluZy4KKyAgICogTm90ZSB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBzdXBwb3J0ZWQgRENUIHNjYWxpbmdzIGFyZSBwb3dlcnMgb2YgMi4KKyAgICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgaW50IHNzaXplID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgd2hpbGUgKHNzaXplIDwgRENUU0laRSAmJgorCSAgIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogc3NpemUgKiAyIDw9CisJICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplKSAmJgorCSAgIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogc3NpemUgKiAyIDw9CisJICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplKSkgeworICAgICAgc3NpemUgPSBzc2l6ZSAqIDI7CisgICAgfQorICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IHNzaXplOworICB9CisKKyAgLyogUmVjb21wdXRlIGRvd25zYW1wbGVkIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50czsKKyAgICogYXBwbGljYXRpb24gbmVlZHMgdG8ga25vdyB0aGVzZSBpZiB1c2luZyByYXcgZG93bnNhbXBsZWQgZGF0YS4KKyAgICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogU2l6ZSBpbiBzYW1wbGVzLCBhZnRlciBJRENUIHNjYWxpbmcgKi8KKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICoKKwkJICAgIChsb25nKSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKgorCQkgICAgKGxvbmcpIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICB9CisKKyNlbHNlIC8qICFJRENUX1NDQUxJTkdfU1VQUE9SVEVEICovCisKKyAgLyogSGFyZHdpcmUgaXQgdG8gIm5vIHNjYWxpbmciICovCisgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgLyogamRpbnB1dC5jIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkIERDVF9zY2FsZWRfc2l6ZSB0byBEQ1RTSVpFLAorICAgKiBhbmQgaGFzIGNvbXB1dGVkIHVuc2NhbGVkIGRvd25zYW1wbGVkX3dpZHRoIGFuZCBkb3duc2FtcGxlZF9oZWlnaHQuCisgICAqLworCisjZW5kaWYgLyogSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLworCisgIC8qIFJlcG9ydCBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBzZWxlY3RlZCBjb2xvcnNwYWNlLiAqLworICAvKiBQcm9iYWJseSB0aGlzIHNob3VsZCBiZSBpbiB0aGUgY29sb3IgY29udmVyc2lvbiBtb2R1bGUuLi4gKi8KKyAgc3dpdGNoIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSAxOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisjaWYgUkdCX1BJWEVMU0laRSAhPSAzCisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gUkdCX1BJWEVMU0laRTsKKyAgICBicmVhazsKKyNlbmRpZiAvKiBlbHNlIHNoYXJlIGNvZGUgd2l0aCBZQ2JDciAqLworI2lmZGVmIEFORFJPSURfUkdCCisgIGNhc2UgSkNTX1JHQl81NjU6CisjZW5kaWYKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMzsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgY2FzZSBKQ1NfWUNDSzoKKyNpZmRlZiBBTkRST0lEX1JHQgorICBjYXNlIEpDU19SR0JBXzg4ODg6CisjZW5kaWYKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OworICAgIGJyZWFrOworICBkZWZhdWx0OgkJCS8qIGVsc2UgbXVzdCBiZSBzYW1lIGNvbG9yc3BhY2UgYXMgaW4gZmlsZSAqLworICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICBicmVhazsKKyAgfQorICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAoY2luZm8tPnF1YW50aXplX2NvbG9ycyA/IDEgOgorCQkJICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzKTsKKworICAvKiBTZWUgaWYgdXBzYW1wbGVyIHdpbGwgd2FudCB0byBlbWl0IG1vcmUgdGhhbiBvbmUgcm93IGF0IGEgdGltZSAqLworICBpZiAodXNlX21lcmdlZF91cHNhbXBsZShjaW5mbykpCisgICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICBlbHNlCisgICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gMTsKK30KKworCisvKgorICogU2V2ZXJhbCBkZWNvbXByZXNzaW9uIHByb2Nlc3NlcyBuZWVkIHRvIHJhbmdlLWxpbWl0IHZhbHVlcyB0byB0aGUgcmFuZ2UKKyAqIDAuLk1BWEpTQU1QTEU7IHRoZSBpbnB1dCB2YWx1ZSBtYXkgZmFsbCBzb21ld2hhdCBvdXRzaWRlIHRoaXMgcmFuZ2UKKyAqIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IHF1YW50aXphdGlvbiwgcm91bmRvZmYgZXJyb3IsIGV0Yy4gIFRoZXNlCisgKiBwcm9jZXNzZXMgYXJlIGlubmVyIGxvb3BzIGFuZCBuZWVkIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuICBPbiBtb3N0CisgKiBtYWNoaW5lcywgcGFydGljdWxhcmx5IENQVXMgd2l0aCBwaXBlbGluZXMgb3IgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2gsCisgKiBhIChzdWJzY3JpcHQtY2hlY2stbGVzcykgQyB0YWJsZSBsb29rdXAKKyAqCQl4ID0gc2FtcGxlX3JhbmdlX2xpbWl0W3hdOworICogaXMgZmFzdGVyIHRoYW4gZXhwbGljaXQgdGVzdHMKKyAqCQlpZiAoeCA8IDApICB4ID0gMDsKKyAqCQllbHNlIGlmICh4ID4gTUFYSlNBTVBMRSkgIHggPSBNQVhKU0FNUExFOworICogVGhlc2UgcHJvY2Vzc2VzIGFsbCB1c2UgYSBjb21tb24gdGFibGUgcHJlcGFyZWQgYnkgdGhlIHJvdXRpbmUgYmVsb3cuCisgKgorICogRm9yIG1vc3Qgc3RlcHMgd2UgY2FuIG1hdGhlbWF0aWNhbGx5IGd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWFsIHZhbHVlCisgKiBvZiB4IGlzIHdpdGhpbiBNQVhKU0FNUExFKzEgb2YgdGhlIGxlZ2FsIHJhbmdlLCBzbyBhIHRhYmxlIHJ1bm5pbmcgZnJvbQorICogLShNQVhKU0FNUExFKzEpIHRvIDIqTUFYSlNBTVBMRSsxIGlzIHN1ZmZpY2llbnQuICBCdXQgZm9yIHRoZSBpbml0aWFsCisgKiBsaW1pdGluZyBzdGVwIChqdXN0IGFmdGVyIHRoZSBJRENUKSwgYSB3aWxkbHkgb3V0LW9mLXJhbmdlIHZhbHVlIGlzCisgKiBwb3NzaWJsZSBpZiB0aGUgaW5wdXQgZGF0YSBpcyBjb3JydXB0LiAgVG8gYXZvaWQgYW55IGNoYW5jZSBvZiBpbmRleGluZworICogb2ZmIHRoZSBlbmQgb2YgbWVtb3J5IGFuZCBnZXR0aW5nIGEgYmFkLXBvaW50ZXIgdHJhcCwgd2UgcGVyZm9ybSB0aGUKKyAqIHBvc3QtSURDVCBsaW1pdGluZyB0aHVzOgorICoJCXggPSByYW5nZV9saW1pdFt4ICYgTUFTS107CisgKiB3aGVyZSBNQVNLIGlzIDIgYml0cyB3aWRlciB0aGFuIGxlZ2FsIHNhbXBsZSBkYXRhLCBpZSAxMCBiaXRzIGZvciA4LWJpdAorICogc2FtcGxlcy4gIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzIHRoaXMgaXMgbW9yZSB0aGFuIGVub3VnaCByYW5nZSBhbmQKKyAqIGEgY29ycmVjdCBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQ7IHdpdGggYm9ndXMgaW5wdXQgZGF0YSB0aGUgbWFzayB3aWxsCisgKiBjYXVzZSB3cmFwYXJvdW5kLCBhbmQgd2Ugd2lsbCBzYWZlbHkgZ2VuZXJhdGUgYSBib2d1cy1idXQtaW4tcmFuZ2Ugb3V0cHV0LgorICogRm9yIHRoZSBwb3N0LUlEQ1Qgc3RlcCwgd2Ugd2FudCB0byBjb252ZXJ0IHRoZSBkYXRhIGZyb20gc2lnbmVkIHRvIHVuc2lnbmVkCisgKiByZXByZXNlbnRhdGlvbiBieSBhZGRpbmcgQ0VOVEVSSlNBTVBMRSBhdCB0aGUgc2FtZSB0aW1lIHRoYXQgd2UgbGltaXQgaXQuCisgKiBTbyB0aGUgcG9zdC1JRENUIGxpbWl0aW5nIHRhYmxlIGVuZHMgdXAgbG9va2luZyBsaWtlIHRoaXM6CisgKiAgIENFTlRFUkpTQU1QTEUsQ0VOVEVSSlNBTVBMRSsxLC4uLixNQVhKU0FNUExFLAorICogICBNQVhKU0FNUExFIChyZXBlYXQgMiooTUFYSlNBTVBMRSsxKS1DRU5URVJKU0FNUExFIHRpbWVzKSwKKyAqICAgMCAgICAgICAgICAocmVwZWF0IDIqKE1BWEpTQU1QTEUrMSktQ0VOVEVSSlNBTVBMRSB0aW1lcyksCisgKiAgIDAsMSwuLi4sQ0VOVEVSSlNBTVBMRS0xCisgKiBOZWdhdGl2ZSBpbnB1dHMgc2VsZWN0IHZhbHVlcyBmcm9tIHRoZSB1cHBlciBoYWxmIG9mIHRoZSB0YWJsZSBhZnRlcgorICogbWFza2luZy4KKyAqCisgKiBXZSBjYW4gc2F2ZSBzb21lIHNwYWNlIGJ5IG92ZXJsYXBwaW5nIHRoZSBzdGFydCBvZiB0aGUgcG9zdC1JRENUIHRhYmxlCisgKiB3aXRoIHRoZSBzaW1wbGVyIHJhbmdlIGxpbWl0aW5nIHRhYmxlLiAgVGhlIHBvc3QtSURDVCB0YWJsZSBiZWdpbnMgYXQKKyAqIHNhbXBsZV9yYW5nZV9saW1pdCArIENFTlRFUkpTQU1QTEUuCisgKgorICogTm90ZSB0aGF0IHRoZSB0YWJsZSBpcyBhbGxvY2F0ZWQgaW4gbmVhciBkYXRhIHNwYWNlIG9uIFBDczsgaXQncyBzbWFsbAorICogZW5vdWdoIGFuZCB1c2VkIG9mdGVuIGVub3VnaCB0byBqdXN0aWZ5IHRoaXMuCisgKi8KKworTE9DQUwodm9pZCkKK3ByZXBhcmVfcmFuZ2VfbGltaXRfdGFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiB0aGUgc2FtcGxlX3JhbmdlX2xpbWl0IHRhYmxlICovCit7CisgIEpTQU1QTEUgKiB0YWJsZTsKKyAgaW50IGk7CisKKyAgdGFibGUgPSAoSlNBTVBMRSAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCSg1ICogKE1BWEpTQU1QTEUrMSkgKyBDRU5URVJKU0FNUExFKSAqIFNJWkVPRihKU0FNUExFKSk7CisgIHRhYmxlICs9IChNQVhKU0FNUExFKzEpOwkvKiBhbGxvdyBuZWdhdGl2ZSBzdWJzY3JpcHRzIG9mIHNpbXBsZSB0YWJsZSAqLworICBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0ID0gdGFibGU7CisgIC8qIEZpcnN0IHNlZ21lbnQgb2YgInNpbXBsZSIgdGFibGU6IGxpbWl0W3hdID0gMCBmb3IgeCA8IDAgKi8KKyAgTUVNWkVSTyh0YWJsZSAtIChNQVhKU0FNUExFKzEpLCAoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihKU0FNUExFKSk7CisgIC8qIE1haW4gcGFydCBvZiAic2ltcGxlIiB0YWJsZTogbGltaXRbeF0gPSB4ICovCisgIGZvciAoaSA9IDA7IGkgPD0gTUFYSlNBTVBMRTsgaSsrKQorICAgIHRhYmxlW2ldID0gKEpTQU1QTEUpIGk7CisgIHRhYmxlICs9IENFTlRFUkpTQU1QTEU7CS8qIFBvaW50IHRvIHdoZXJlIHBvc3QtSURDVCB0YWJsZSBzdGFydHMgKi8KKyAgLyogRW5kIG9mIHNpbXBsZSB0YWJsZSwgcmVzdCBvZiBmaXJzdCBoYWxmIG9mIHBvc3QtSURDVCB0YWJsZSAqLworICBmb3IgKGkgPSBDRU5URVJKU0FNUExFOyBpIDwgMiooTUFYSlNBTVBMRSsxKTsgaSsrKQorICAgIHRhYmxlW2ldID0gTUFYSlNBTVBMRTsKKyAgLyogU2Vjb25kIGhhbGYgb2YgcG9zdC1JRENUIHRhYmxlICovCisgIE1FTVpFUk8odGFibGUgKyAoMiAqIChNQVhKU0FNUExFKzEpKSwKKwkgICgyICogKE1BWEpTQU1QTEUrMSkgLSBDRU5URVJKU0FNUExFKSAqIFNJWkVPRihKU0FNUExFKSk7CisgIE1FTUNPUFkodGFibGUgKyAoNCAqIChNQVhKU0FNUExFKzEpIC0gQ0VOVEVSSlNBTVBMRSksCisJICBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0LCBDRU5URVJKU0FNUExFICogU0laRU9GKEpTQU1QTEUpKTsKK30KKworCisvKgorICogTWFzdGVyIHNlbGVjdGlvbiBvZiBkZWNvbXByZXNzaW9uIG1vZHVsZXMuCisgKiBUaGlzIGlzIGRvbmUgb25jZSBhdCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgdGltZS4gIFdlIGRldGVybWluZQorICogd2hpY2ggbW9kdWxlcyB3aWxsIGJlIHVzZWQgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZSBpbml0aWFsaXphdGlvbiBjYWxscy4KKyAqIFdlIGFsc28gaW5pdGlhbGl6ZSB0aGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUgdG8gYmVnaW4gY29uc3VtaW5nIGRhdGEuCisgKgorICogU2luY2UganBlZ19yZWFkX2hlYWRlciBoYXMgZmluaXNoZWQsIHdlIGtub3cgd2hhdCBpcyBpbiB0aGUgU09GCisgKiBhbmQgKGZpcnN0KSBTT1MgbWFya2Vycy4gIFdlIGFsc28gaGF2ZSBhbGwgdGhlIGFwcGxpY2F0aW9uIHBhcmFtZXRlcgorICogc2V0dGluZ3MuCisgKi8KKworTE9DQUwodm9pZCkKK21hc3Rlcl9zZWxlY3Rpb24gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisgIGJvb2xlYW4gdXNlX2NfYnVmZmVyOworICBsb25nIHNhbXBsZXNwZXJyb3c7CisgIEpESU1FTlNJT04gamRfc2FtcGxlc3BlcnJvdzsKKworICAvKiBJbml0aWFsaXplIGRpbWVuc2lvbnMgYW5kIG90aGVyIHN0dWZmICovCisgIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7CisgIHByZXBhcmVfcmFuZ2VfbGltaXRfdGFibGUoY2luZm8pOworCisgIC8qIFdpZHRoIG9mIGFuIG91dHB1dCBzY2FubGluZSBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgSkRJTUVOU0lPTi4gKi8KKyAgc2FtcGxlc3BlcnJvdyA9IChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoICogKGxvbmcpIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgamRfc2FtcGxlc3BlcnJvdyA9IChKRElNRU5TSU9OKSBzYW1wbGVzcGVycm93OworICBpZiAoKGxvbmcpIGpkX3NhbXBsZXNwZXJyb3cgIT0gc2FtcGxlc3BlcnJvdykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKworICAvKiBJbml0aWFsaXplIG15IHByaXZhdGUgc3RhdGUgKi8KKyAgbWFzdGVyLT5wYXNzX251bWJlciA9IDA7CisgIG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlID0gdXNlX21lcmdlZF91cHNhbXBsZShjaW5mbyk7CisKKyAgLyogQ29sb3IgcXVhbnRpemVyIHNlbGVjdGlvbiAqLworICBtYXN0ZXItPnF1YW50aXplcl8xcGFzcyA9IE5VTEw7CisgIG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzID0gTlVMTDsKKyAgLyogTm8gbW9kZSBjaGFuZ2VzIGlmIG5vdCB1c2luZyBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLworICBpZiAoISBjaW5mby0+cXVhbnRpemVfY29sb3JzIHx8ICEgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IEZBTFNFOworICAgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKKyAgICBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID0gRkFMU0U7CisgIH0KKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICBpZiAoY2luZm8tPnJhd19kYXRhX291dCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9USU1QTCk7CisgICAgLyogMi1wYXNzIHF1YW50aXplciBvbmx5IHdvcmtzIGluIDMtY29tcG9uZW50IGNvbG9yIHNwYWNlLiAqLworICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gMykgeworICAgICAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IFRSVUU7CisgICAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7CisgICAgICBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID0gRkFMU0U7CisgICAgICBjaW5mby0+Y29sb3JtYXAgPSBOVUxMOworICAgIH0gZWxzZSBpZiAoY2luZm8tPmNvbG9ybWFwICE9IE5VTEwpIHsKKyAgICAgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoY2luZm8tPnR3b19wYXNzX3F1YW50aXplKSB7CisgICAgICBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IFRSVUU7CisgICAgfQorCisgICAgaWYgKGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQpIHsKKyNpZmRlZiBRVUFOVF8xUEFTU19TVVBQT1JURUQKKyAgICAgIGppbml0XzFwYXNzX3F1YW50aXplcihjaW5mbyk7CisgICAgICBtYXN0ZXItPnF1YW50aXplcl8xcGFzcyA9IGNpbmZvLT5jcXVhbnRpemU7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfQorCisgICAgLyogV2UgdXNlIHRoZSAyLXBhc3MgY29kZSB0byBtYXAgdG8gZXh0ZXJuYWwgY29sb3JtYXBzLiAqLworICAgIGlmIChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50IHx8IGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQpIHsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgICAgIGppbml0XzJwYXNzX3F1YW50aXplcihjaW5mbyk7CisgICAgICBtYXN0ZXItPnF1YW50aXplcl8ycGFzcyA9IGNpbmZvLT5jcXVhbnRpemU7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfQorICAgIC8qIElmIGJvdGggcXVhbnRpemVycyBhcmUgaW5pdGlhbGl6ZWQsIHRoZSAyLXBhc3Mgb25lIGlzIGxlZnQgYWN0aXZlOworICAgICAqIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzdGFydGluZyB3aXRoIHF1YW50aXphdGlvbiB0byBhbiBleHRlcm5hbCBtYXAuCisgICAgICovCisgIH0KKworICAvKiBQb3N0LXByb2Nlc3Npbmc6IGluIHBhcnRpY3VsYXIsIGNvbG9yIGNvbnZlcnNpb24gZmlyc3QgKi8KKyAgaWYgKCEgY2luZm8tPnJhd19kYXRhX291dCkgeworICAgIGlmIChtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSkgeworI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECisgICAgICBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyKGNpbmZvKTsgLyogZG9lcyBjb2xvciBjb252ZXJzaW9uIHRvbyAqLworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlcihjaW5mbyk7CisgICAgICBqaW5pdF91cHNhbXBsZXIoY2luZm8pOworICAgIH0KKyAgICBqaW5pdF9kX3Bvc3RfY29udHJvbGxlcihjaW5mbywgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCk7CisgIH0KKyAgLyogSW52ZXJzZSBEQ1QgKi8KKyAgamluaXRfaW52ZXJzZV9kY3QoY2luZm8pOworICAvKiBFbnRyb3B5IGRlY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfSBlbHNlCisgICAgICBqaW5pdF9odWZmX2RlY29kZXIoY2luZm8pOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBwcmluY2lwYWwgYnVmZmVyIGNvbnRyb2xsZXJzLiAqLworICB1c2VfY19idWZmZXIgPSBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyB8fCBjaW5mby0+YnVmZmVyZWRfaW1hZ2U7CisgIGppbml0X2RfY29lZl9jb250cm9sbGVyKGNpbmZvLCB1c2VfY19idWZmZXIpOworCisgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpCisgICAgamluaXRfZF9tYWluX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisKKyAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIEluaXRpYWxpemUgaW5wdXQgc2lkZSBvZiBkZWNvbXByZXNzb3IgdG8gY29uc3VtZSBmaXJzdCBzY2FuLiAqLworICAoKmNpbmZvLT5pbnB1dGN0bC0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAvKiBJZiBqcGVnX3N0YXJ0X2RlY29tcHJlc3Mgd2lsbCByZWFkIHRoZSB3aG9sZSBmaWxlLCBpbml0aWFsaXplCisgICAqIHByb2dyZXNzIG1vbml0b3JpbmcgYXBwcm9wcmlhdGVseS4gIFRoZSBpbnB1dCBzdGVwIGlzIGNvdW50ZWQKKyAgICogYXMgb25lIHBhc3MuCisgICAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgJiYKKyAgICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zKSB7CisgICAgaW50IG5zY2FuczsKKyAgICAvKiBFc3RpbWF0ZSBudW1iZXIgb2Ygc2NhbnMgdG8gc2V0IHBhc3NfbGltaXQuICovCisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBBcmJpdHJhcmlseSBlc3RpbWF0ZSAyIGludGVybGVhdmVkIERDIHNjYW5zICsgMyBBQyBzY2Fucy9jb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSAyICsgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9IGVsc2UgeworICAgICAgLyogRm9yIGEgbm9ucHJvZ3Jlc3NpdmUgbXVsdGlzY2FuIGZpbGUsIGVzdGltYXRlIDEgc2NhbiBwZXIgY29tcG9uZW50LiAqLworICAgICAgbnNjYW5zID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIH0KKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IDBMOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogbnNjYW5zOworICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IDA7CisgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA/IDMgOiAyKTsKKyAgICAvKiBDb3VudCB0aGUgaW5wdXQgcGFzcyBhcyBkb25lICovCisgICAgbWFzdGVyLT5wYXNzX251bWJlcisrOworICB9CisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCit9CisKKworLyoKKyAqIFBlci1wYXNzIHNldHVwLgorICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIG91dHB1dCBwYXNzLiAgV2UgZGV0ZXJtaW5lIHdoaWNoCisgKiBtb2R1bGVzIHdpbGwgYmUgYWN0aXZlIGR1cmluZyB0aGlzIHBhc3MgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZQorICogc3RhcnRfcGFzcyBjYWxscy4gIFdlIGFsc28gc2V0IGlzX2R1bW15X3Bhc3MgdG8gaW5kaWNhdGUgd2hldGhlciB0aGlzCisgKiBpcyBhICJyZWFsIiBvdXRwdXQgcGFzcyBvciBhIGR1bW15IHBhc3MgZm9yIGNvbG9yIHF1YW50aXphdGlvbi4KKyAqIChJbiB0aGUgbGF0dGVyIGNhc2UsIGpkYXBpc3RkLmMgd2lsbCBjcmFuayB0aGUgcGFzcyB0byBjb21wbGV0aW9uLikKKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ByZXBhcmVfZm9yX291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIGlmIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzKSB7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgLyogRmluYWwgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCisgICAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOworICAgICgqY2luZm8tPmNxdWFudGl6ZS0+c3RhcnRfcGFzcykgKGNpbmZvLCBGQUxTRSk7CisgICAgKCpjaW5mby0+cG9zdC0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOworICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzICYmIGNpbmZvLT5jb2xvcm1hcCA9PSBOVUxMKSB7CisgICAgICAvKiBTZWxlY3QgbmV3IHF1YW50aXphdGlvbiBtZXRob2QgKi8KKyAgICAgIGlmIChjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgJiYgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCkgeworCWNpbmZvLT5jcXVhbnRpemUgPSBtYXN0ZXItPnF1YW50aXplcl8ycGFzczsKKwltYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCkgeworCWNpbmZvLT5jcXVhbnRpemUgPSBtYXN0ZXItPnF1YW50aXplcl8xcGFzczsKKyAgICAgIH0gZWxzZSB7CisJRVJSRVhJVChjaW5mbywgSkVSUl9NT0RFX0NIQU5HRSk7CisgICAgICB9CisgICAgfQorICAgICgqY2luZm8tPmlkY3QtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgaWYgKCEgY2luZm8tPnJhd19kYXRhX291dCkgeworICAgICAgaWYgKCEgbWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUpCisJKCpjaW5mby0+Y2NvbnZlcnQtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICAoKmNpbmZvLT51cHNhbXBsZS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorCSgqY2luZm8tPmNxdWFudGl6ZS0+c3RhcnRfcGFzcykgKGNpbmZvLCBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzKTsKKyAgICAgICgqY2luZm8tPnBvc3QtPnN0YXJ0X3Bhc3MpIChjaW5mbywKKwkgICAgKG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPyBKQlVGX1NBVkVfQU5EX1BBU1MgOiBKQlVGX1BBU1NfVEhSVSkpOworICAgICAgKCpjaW5mby0+bWFpbi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7CisgICAgfQorICB9CisKKyAgLyogU2V0IHVwIHByb2dyZXNzIG1vbml0b3IncyBwYXNzIGluZm8gaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSBtYXN0ZXItPnBhc3NfbnVtYmVyOworICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlciArCisJCQkJICAgIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID8gMiA6IDEpOworICAgIC8qIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHdlIGFzc3VtZSBvbmUgbW9yZSBvdXRwdXQgcGFzcyBpZiBFT0kgbm90CisgICAgICogeWV0IHJlYWNoZWQsIGJ1dCBubyBtb3JlIHBhc3NlcyBpZiBFT0kgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKi8KKyAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlICYmICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgKz0gKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPyAyIDogMSk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCBlbmQgb2YgYW4gb3V0cHV0IHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfb3V0cHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgKCpjaW5mby0+Y3F1YW50aXplLT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKyAgbWFzdGVyLT5wYXNzX251bWJlcisrOworfQorCisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX25ld19jb2xvcm1hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKworICAvKiBQcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gY2FsbGluZyBtZSBhdCB3cm9uZyB0aW1lcyAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfQlVGSU1BR0UpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyAmJiBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ICYmCisgICAgICBjaW5mby0+Y29sb3JtYXAgIT0gTlVMTCkgeworICAgIC8qIFNlbGVjdCAyLXBhc3MgcXVhbnRpemVyIGZvciBleHRlcm5hbCBjb2xvcm1hcCB1c2UgKi8KKyAgICBjaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3M7CisgICAgLyogTm90aWZ5IHF1YW50aXplciBvZiBjb2xvcm1hcCBjaGFuZ2UgKi8KKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPm5ld19jb2xvcl9tYXApIChjaW5mbyk7CisgICAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOyAvKiBqdXN0IGluIGNhc2UgKi8KKyAgfSBlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9NT0RFX0NIQU5HRSk7Cit9CisKKyNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBtYXN0ZXIgZGVjb21wcmVzc2lvbiBjb250cm9sIGFuZCBzZWxlY3QgYWN0aXZlIG1vZHVsZXMuCisgKiBUaGlzIGlzIHBlcmZvcm1lZCBhdCB0aGUgc3RhcnQgb2YganBlZ19zdGFydF9kZWNvbXByZXNzLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWFzdGVyX2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyOworCisgIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihteV9kZWNvbXBfbWFzdGVyKSk7CisgIGNpbmZvLT5tYXN0ZXIgPSAoc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciAqKSBtYXN0ZXI7CisgIG1hc3Rlci0+cHViLnByZXBhcmVfZm9yX291dHB1dF9wYXNzID0gcHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3M7CisgIG1hc3Rlci0+cHViLmZpbmlzaF9vdXRwdXRfcGFzcyA9IGZpbmlzaF9vdXRwdXRfcGFzczsKKworICBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gRkFMU0U7CisKKyAgbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7Cit9CmRpZmYgLS1naXQgYS9qZG1lcmdlLmMgYi9qZG1lcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMzMwOAotLS0gL2Rldi9udWxsCisrKyBiL2pkbWVyZ2UuYwpAQCAtMCwwICsxLDc1NyBAQAorLyoKKyAqIGpkbWVyZ2UuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIG1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGNvbWJpbmVzIGZ1bmN0aW9ucyBmcm9tIGpkc2FtcGxlLmMgYW5kIGpkY29sb3IuYzsKKyAqIHJlYWQgdGhvc2UgZmlsZXMgZmlyc3QgdG8gdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24uCisgKgorICogV2hlbiB0aGUgY2hyb21hIGNvbXBvbmVudHMgYXJlIHRvIGJlIHVwc2FtcGxlZCBieSBzaW1wbGUgcmVwbGljYXRpb24KKyAqIChpZSwgYm94IGZpbHRlcmluZyksIHdlIGNhbiBzYXZlIHNvbWUgd29yayBpbiBjb2xvciBjb252ZXJzaW9uIGJ5CisgKiBjYWxjdWxhdGluZyBhbGwgdGhlIG91dHB1dCBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBhIHBhaXIgb2YgY2hyb21hCisgKiBzYW1wbGVzIGF0IG9uZSB0aW1lLiAgSW4gdGhlIGNvbnZlcnNpb24gZXF1YXRpb25zCisgKglSID0gWSAgICAgICAgICAgKyBLMSAqIENyCisgKglHID0gWSArIEsyICogQ2IgKyBLMyAqIENyCisgKglCID0gWSArIEs0ICogQ2IKKyAqIG9ubHkgdGhlIFkgdGVybSB2YXJpZXMgYW1vbmcgdGhlIGdyb3VwIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIGEgcGFpcgorICogb2YgY2hyb21hIHNhbXBsZXMsIHNvIHRoZSByZXN0IG9mIHRoZSB0ZXJtcyBjYW4gYmUgY2FsY3VsYXRlZCBqdXN0IG9uY2UuCisgKiBBdCB0eXBpY2FsIHNhbXBsaW5nIHJhdGlvcywgdGhpcyBlbGltaW5hdGVzIGhhbGYgb3IgdGhyZWUtcXVhcnRlcnMgb2YgdGhlCisgKiBtdWx0aXBsaWNhdGlvbnMgbmVlZGVkIGZvciBjb2xvciBjb252ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBjdXJyZW50bHkgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOgorICoJWUNiQ3IgPT4gUkdCIGNvbG9yIGNvbnZlcnNpb24gb25seS4KKyAqCVNhbXBsaW5nIHJhdGlvcyBvZiAyaDF2IG9yIDJoMnYuCisgKglObyBzY2FsaW5nIG5lZWRlZCBhdCB1cHNhbXBsZSB0aW1lLgorICoJQ29ybmVyLWFsaWduZWQgKG5vbi1DQ0lSNjAxKSBzYW1wbGluZyBhbGlnbm1lbnQuCisgKiBPdGhlciBzcGVjaWFsIGNhc2VzIGNvdWxkIGJlIGFkZGVkLCBidXQgaW4gbW9zdCBhcHBsaWNhdGlvbnMgdGhlc2UgYXJlCisgKiB0aGUgb25seSBjb21tb24gY2FzZXMuICAoRm9yIHVuY29tbW9uIGNhc2VzIHdlIGZhbGwgYmFjayBvbiB0aGUgbW9yZQorICogZ2VuZXJhbCBjb2RlIGluIGpkc2FtcGxlLmMgYW5kIGpkY29sb3IuYy4pCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisjaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKKworI2lmZGVmIEFORFJPSURfUkdCCisKKy8qIERlY2xhcmF0aW9ucyBmb3Igb3JkZXJlZCBkaXRoZXJpbmcuCisgKiAKKyAqIFdlIHVzZSA0eDQgb3JkZXJlZCBkaXRoZXIgYXJyYXkgcGFja2VkIGludG8gMzIgYml0cy4gVGhpcyBhcnJheSBpcworICogc3VmZmljZW50IGZvciBkaXRoZXJpbmcgUkdCXzg4OCB0byBSR0JfNTY1LgorICovCisKKyNkZWZpbmUgRElUSEVSX01BU0sgICAgICAgICAweDMKKyNkZWZpbmUgRElUSEVSX1JPVEFURSh4KSAgICAoKCh4KTw8MjQpIHwgKCgoeCk+PjgpJjB4MDBGRkZGRkYpKQorc3RhdGljIGNvbnN0IElOVDMyIGRpdGhlcl9tYXRyaXhbNF0gPSB7CisgIDB4MDAwODAyMEEsCisgIDB4MEMwNDBFMDYsCisgIDB4MDMwQjAxMDksCisgIDB4MEYwNzBEMDUKK307CisKKyNlbmRpZgorCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZG8gYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbiBvZiBvbmUgcm93IGdyb3VwICovCisgIEpNRVRIT0Qodm9pZCwgdXBtZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKwkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOworCisgIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCisgIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLworICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLworICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLworCisgIC8qIEZvciAyOjEgdmVydGljYWwgc2FtcGxpbmcsIHdlIHByb2R1Y2UgdHdvIG91dHB1dCByb3dzIGF0IGEgdGltZS4KKyAgICogV2UgbmVlZCBhICJzcGFyZSIgcm93IGJ1ZmZlciB0byBob2xkIHRoZSBzZWNvbmQgb3V0cHV0IHJvdyBpZiB0aGUKKyAgICogYXBwbGljYXRpb24gcHJvdmlkZXMganVzdCBhIG9uZS1yb3cgYnVmZmVyOyB3ZSBhbHNvIHVzZSB0aGUgc3BhcmUKKyAgICogdG8gZGlzY2FyZCB0aGUgZHVtbXkgbGFzdCByb3cgaWYgdGhlIGltYWdlIGhlaWdodCBpcyBvZGQuCisgICAqLworICBKU0FNUFJPVyBzcGFyZV9yb3c7CisgIGJvb2xlYW4gc3BhcmVfZnVsbDsJCS8qIFQgaWYgc3BhcmUgYnVmZmVyIGlzIG9jY3VwaWVkICovCisKKyAgSkRJTUVOU0lPTiBvdXRfcm93X3dpZHRoOwkvKiBzYW1wbGVzIHBlciBvdXRwdXQgcm93ICovCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCit9IG15X3Vwc2FtcGxlcjsKKwordHlwZWRlZiBteV91cHNhbXBsZXIgKiBteV91cHNhbXBsZV9wdHI7CisKKyNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCisjZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworCisvKgorICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqIFRoaXMgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSBqZGNvbG9yLmM7IHNlZSB0aGF0IGZpbGUgZm9yIG1vcmUgaW5mby4KKyAqLworCitMT0NBTCh2b2lkKQorYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICBpbnQgaTsKKyAgSU5UMzIgeDsKKyAgU0hJRlRfVEVNUFMKKworICB1cHNhbXBsZS0+Q3Jfcl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKKyAgdXBzYW1wbGUtPkNiX2JfdGFiID0gKGludCAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7CisgIHVwc2FtcGxlLT5Dcl9nX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKyAgdXBzYW1wbGUtPkNiX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOworCisgIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgeworICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KKyAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLworICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCisgICAgdXBzYW1wbGUtPkNyX3JfdGFiW2ldID0gKGludCkKKwkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLworICAgIHVwc2FtcGxlLT5DYl9iX3RhYltpXSA9IChpbnQpCisJCSAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7CisgICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLworICAgIHVwc2FtcGxlLT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OworICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KKyAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KKyAgICB1cHNhbXBsZS0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOworICB9Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGFuIHVwc2FtcGxpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisKKyAgLyogTWFyayB0aGUgc3BhcmUgYnVmZmVyIGVtcHR5ICovCisgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gRkFMU0U7CisgIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KKyAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKK30KKworCisvKgorICogQ29udHJvbCByb3V0aW5lIHRvIGRvIHVwc2FtcGxpbmcgKGFuZCBjb2xvciBjb252ZXJzaW9uKS4KKyAqCisgKiBUaGUgY29udHJvbCByb3V0aW5lIGp1c3QgaGFuZGxlcyB0aGUgcm93IGJ1ZmZlcmluZyBjb25zaWRlcmF0aW9ucy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK21lcmdlZF8ydl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCisvKiAyOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbWF5IG5lZWQgYSBzcGFyZSByb3cuICovCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgSlNBTVBST1cgd29ya19wdHJzWzJdOworICBKRElNRU5TSU9OIG51bV9yb3dzOwkJLyogbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgdG8gY2FsbGVyICovCisKKyAgaWYgKHVwc2FtcGxlLT5zcGFyZV9mdWxsKSB7CisgICAgLyogSWYgd2UgaGF2ZSBhIHNwYXJlIHJvdyBzYXZlZCBmcm9tIGEgcHJldmlvdXMgY3ljbGUsIGp1c3QgcmV0dXJuIGl0LiAqLworICAgICAgSkRJTUVOU0lPTiBzaXplID0gdXBzYW1wbGUtPm91dF9yb3dfd2lkdGg7CisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCXzU2NSkKKyAgICAgIHNpemUgPSBjaW5mby0+b3V0cHV0X3dpZHRoKjI7CisjZW5kaWYKKyAgICBqY29weV9zYW1wbGVfcm93cygmIHVwc2FtcGxlLT5zcGFyZV9yb3csIDAsIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsIDAsCisJCSAgICAgIDEsIHNpemUpOworCisgICAgbnVtX3Jvd3MgPSAxOworICAgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgLyogRmlndXJlIG51bWJlciBvZiByb3dzIHRvIHJldHVybiB0byBjYWxsZXIuICovCisgICAgbnVtX3Jvd3MgPSAyOworICAgIC8qIE5vdCBtb3JlIHRoYW4gdGhlIGRpc3RhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAqLworICAgIGlmIChudW1fcm93cyA+IHVwc2FtcGxlLT5yb3dzX3RvX2dvKQorICAgICAgbnVtX3Jvd3MgPSB1cHNhbXBsZS0+cm93c190b19nbzsKKyAgICAvKiBBbmQgbm90IG1vcmUgdGhhbiB3aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdDogKi8KKyAgICBvdXRfcm93c19hdmFpbCAtPSAqb3V0X3Jvd19jdHI7CisgICAgaWYgKG51bV9yb3dzID4gb3V0X3Jvd3NfYXZhaWwpCisgICAgICBudW1fcm93cyA9IG91dF9yb3dzX2F2YWlsOworICAgIC8qIENyZWF0ZSBvdXRwdXQgcG9pbnRlciBhcnJheSBmb3IgdXBzYW1wbGVyLiAqLworICAgIHdvcmtfcHRyc1swXSA9IG91dHB1dF9idWZbKm91dF9yb3dfY3RyXTsKKyAgICBpZiAobnVtX3Jvd3MgPiAxKSB7CisgICAgICB3b3JrX3B0cnNbMV0gPSBvdXRwdXRfYnVmWypvdXRfcm93X2N0ciArIDFdOworICAgIH0gZWxzZSB7CisgICAgICB3b3JrX3B0cnNbMV0gPSB1cHNhbXBsZS0+c3BhcmVfcm93OworICAgICAgdXBzYW1wbGUtPnNwYXJlX2Z1bGwgPSBUUlVFOworICAgIH0KKyAgICAvKiBOb3cgZG8gdGhlIHVwc2FtcGxpbmcuICovCisgICAgKCp1cHNhbXBsZS0+dXBtZXRob2QpIChjaW5mbywgaW5wdXRfYnVmLCAqaW5fcm93X2dyb3VwX2N0ciwgd29ya19wdHJzKTsKKyAgfQorCisgIC8qIEFkanVzdCBjb3VudHMgKi8KKyAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOworICB1cHNhbXBsZS0+cm93c190b19nbyAtPSBudW1fcm93czsKKyAgLyogV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHRpZWQsIGRlY2xhcmUgdGhpcyBpbnB1dCByb3cgZ3JvdXAgY29uc3VtZWQgKi8KKyAgaWYgKCEgdXBzYW1wbGUtPnNwYXJlX2Z1bGwpCisgICAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOworfQorCisKK01FVEhPRERFRih2b2lkKQorbWVyZ2VkXzF2X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKKy8qIDE6MSB2ZXJ0aWNhbCBzYW1wbGluZyBjYXNlOiBtdWNoIGVhc2llciwgbmV2ZXIgbmVlZCBhIHNwYXJlIHJvdy4gKi8KK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworCisgIC8qIEp1c3QgZG8gdGhlIHVwc2FtcGxpbmcuICovCisgICgqdXBzYW1wbGUtPnVwbWV0aG9kKSAoY2luZm8sIGlucHV0X2J1ZiwgKmluX3Jvd19ncm91cF9jdHIsCisJCQkgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0cik7CisgIC8qIEFkanVzdCBjb3VudHMgKi8KKyAgKCpvdXRfcm93X2N0cikrKzsKKyAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHJvdXRpbmVzIGludm9rZWQgYnkgdGhlIGNvbnRyb2wgcm91dGluZXMgdG8gZG8KKyAqIHRoZSBhY3R1YWwgdXBzYW1wbGluZy9jb252ZXJzaW9uLiAgT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKgorICogTm90ZTogc2luY2Ugd2UgbWF5IGJlIHdyaXRpbmcgZGlyZWN0bHkgaW50byBhcHBsaWNhdGlvbi1zdXBwbGllZCBidWZmZXJzLAorICogd2UgaGF2ZSB0byBiZSBob25lc3QgYWJvdXQgdGhlIG91dHB1dCB3aWR0aDsgd2UgY2FuJ3QgYXNzdW1lIHRoZSBidWZmZXIKKyAqIGhhcyBiZWVuIHJvdW5kZWQgdXAgdG8gYW4gZXZlbiB3aWR0aC4KKyAqLworCisKKy8qCisgKiBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjFfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdOworICAvKiBMb29wIGZvciBlYWNoIHBhaXIgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDIgWSB2YWx1ZXMgYW5kIGVtaXQgMiBwaXhlbHMgKi8KKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICBvdXRwdHJbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHJbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICBvdXRwdHJbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHJbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgfQorICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgb3V0cHRyW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgIH0KK30KKworCisjaWZkZWYgQU5EUk9JRF9SR0IKK01FVEhPRERFRih2b2lkKQoraDJ2MV9tZXJnZWRfdXBzYW1wbGVfNTY1IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgIElOVDMyIHJnYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdOworICAvKiBMb29wIGZvciBlYWNoIHBhaXIgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDIgWSB2YWx1ZXMgYW5kIGVtaXQgMiBwaXhlbHMgKi8KKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICBXUklURV9UV09fUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICBvdXRwdHIgKz0gNDsKKyAgfQorICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgfQorfQorCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9tZXJnZWRfdXBzYW1wbGVfNTY1RCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKyAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOworICBpbnQgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIEpESU1FTlNJT04gY29sOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKKyAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOworICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKKyAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7CisgIEpESU1FTlNJT04gY29sX2luZGV4ID0gMDsKKyAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107CisgIHVuc2lnbmVkIGludCByLCBnLCBiOworICBJTlQzMiByZ2I7CisgIFNISUZUX1RFTVBTCisKKyAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKKyAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07CisgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07CisgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyLCByZ2IpOworICAgIG91dHB0ciArPSA0OworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICB9Cit9CisKKworI2VuZGlmCisKKy8qCisgKiBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjJfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjE7CisgIEpTQU1QUk9XIGlucHRyMDAsIGlucHRyMDEsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIGlucHRyMDAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyXTsKKyAgaW5wdHIwMSA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjIgKyAxXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdOworICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXTsKKyAgLyogTG9vcCBmb3IgZWFjaCBncm91cCBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggNCBZIHZhbHVlcyBhbmQgZW1pdCA0IHBpeGVscyAqLworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICBvdXRwdHIwW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjBbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIwICs9IFJHQl9QSVhFTFNJWkU7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOworICAgIG91dHB0cjBbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0cjAgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgb3V0cHRyMVtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIxW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyMSArPSBSR0JfUElYRUxTSVpFOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKKyAgICBvdXRwdHIxW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjFbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIxICs9IFJHQl9QSVhFTFNJWkU7CisgIH0KKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKTsKKyAgICBvdXRwdHIwW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjBbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOworICAgIG91dHB0cjFbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMVtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICB9Cit9CisKKworI2lmZGVmIEFORFJPSURfUkdCCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml9tZXJnZWRfdXBzYW1wbGVfNTY1IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjE7CisgIEpTQU1QUk9XIGlucHRyMDAsIGlucHRyMDEsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgSU5UMzIgcmdiOworICBTSElGVF9URU1QUworCisgIGlucHRyMDAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyXTsKKyAgaW5wdHIwMSA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjIgKyAxXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdOworICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXTsKKyAgLyogTG9vcCBmb3IgZWFjaCBncm91cCBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggNCBZIHZhbHVlcyBhbmQgZW1pdCA0IHBpeGVscyAqLworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIwLCByZ2IpOworICAgIG91dHB0cjAgKz0gNDsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyMSwgcmdiKTsKKyAgICBvdXRwdHIxICs9IDQ7CisgIH0KKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgKihJTlQxNiopb3V0cHRyMCA9IHJnYjsKKyAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSk7CisgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAqKElOVDE2KilvdXRwdHIxID0gcmdiOworICB9Cit9CisKKworCitNRVRIT0RERUYodm9pZCkKK2gydjJfbWVyZ2VkX3Vwc2FtcGxlXzU2NUQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKKyAgaW50IGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKKyAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7CisgIEpESU1FTlNJT04gY29sOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKKyAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOworICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKKyAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7CisgIEpESU1FTlNJT04gY29sX2luZGV4ID0gMDsKKyAgSU5UMzIgZDAgPSBkaXRoZXJfbWF0cml4W2NpbmZvLT5vdXRwdXRfc2NhbmxpbmUgJiBESVRIRVJfTUFTS107CisgIElOVDMyIGQxID0gZGl0aGVyX21hdHJpeFsoY2luZm8tPm91dHB1dF9zY2FubGluZSsxKSAmIERJVEhFUl9NQVNLXTsKKyAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgIElOVDMyIHJnYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07CisgIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKKyAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07CisgIC8qIExvb3AgZm9yIGVhY2ggZ3JvdXAgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDQgWSB2YWx1ZXMgYW5kIGVtaXQgNCBwaXhlbHMgKi8gICAgCisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOworICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMSldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDEpXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDEpXTsKKyAgICBkMSA9IERJVEhFUl9ST1RBVEUoZDEpOworICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIwLCByZ2IpOworICAgIG91dHB0cjAgKz0gNDsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07CisgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQxKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMSldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMSldOworICAgIGQxID0gRElUSEVSX1JPVEFURShkMSk7CisgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICBXUklURV9UV09fUElYRUxTKG91dHB0cjEsIHJnYik7CisgICAgb3V0cHRyMSArPSA0OworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICooSU5UMTYqKW91dHB0cjAgPSByZ2I7CisgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOworICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDEpXTsKKyAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDEpXTsKKyAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMSldOworICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgKihJTlQxNiopb3V0cHRyMSA9IHJnYjsKKyAgfQorfQorCisjZW5kaWYKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgorICoKKyAqIE5COiB0aGlzIGlzIGNhbGxlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXRlcm1pbmVkIGJ5IHVzZV9tZXJnZWRfdXBzYW1wbGUoKQorICogaW4gamRtYXN0ZXIuYy4gIFRoYXQgcm91dGluZSBNVVNUIGNvcnJlc3BvbmQgdG8gdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMKKyAqIG9mIHRoaXMgbW9kdWxlOyBubyBzYWZldHkgY2hlY2tzIGFyZSBtYWRlIGhlcmUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9tZXJnZWRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGU7CisKKyAgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X3Vwc2FtcGxlcikpOworICBjaW5mby0+dXBzYW1wbGUgPSAoc3RydWN0IGpwZWdfdXBzYW1wbGVyICopIHVwc2FtcGxlOworICB1cHNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21lcmdlZF91cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOworCisgIHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgCisgIGlmIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPT0gMikgeworICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMnZfdXBzYW1wbGU7CisgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGU7CisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCXzU2NSkgeworICAgICAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfTk9ORSkgeworICAgICAgICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfNTY1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGVfNTY1RDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIEFsbG9jYXRlIGEgc3BhcmUgcm93IGJ1ZmZlciAqLworICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSAoSlNBTVBST1cpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkoc2l6ZV90KSAodXBzYW1wbGUtPm91dF9yb3dfd2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgfSBlbHNlIHsKKyAgICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gbWVyZ2VkXzF2X3Vwc2FtcGxlOworICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjFfbWVyZ2VkX3Vwc2FtcGxlOworI2lmZGVmIEFORFJPSURfUkdCCisgICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQl81NjUpIHsKKyAgICAgICAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX05PTkUpIHsKKyAgICAgICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NUQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBObyBzcGFyZSByb3cgbmVlZGVkICovCisgICAgdXBzYW1wbGUtPnNwYXJlX3JvdyA9IE5VTEw7CisgIH0KKworICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKK30KKworI2VuZGlmIC8qIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qZHBodWZmLmMgYi9qZHBodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2NzgwOQotLS0gL2Rldi9udWxsCisrKyBiL2pkcGh1ZmYuYwpAQCAtMCwwICsxLDY2OCBAQAorLyoKKyAqIGpkcGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KKyAqCisgKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBpbnB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBiYWNrCisgKiB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZSB2YXJpYWJsZXMKKyAqIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUgcGVybWFuZW50CisgKiBzdG9yYWdlIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGh1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqZGh1ZmYuYyAqLworCisKKyNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorCisvKgorICogRXhwYW5kZWQgZW50cm9weSBkZWNvZGVyIG9iamVjdCBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBkZWNvZGluZy4KKyAqCisgKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCisgKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IEVPQlJVTjsJCQkvKiByZW1haW5pbmcgRU9CcyBpbiBFT0JSVU4gKi8KKyAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsJLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLworfSBzYXZhYmxlX3N0YXRlOworCisvKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCisgKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KKyAqLworCisjaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQorI2Vsc2UKKyNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0CisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKKwkoKGRlc3QpLkVPQlJVTiA9IChzcmMpLkVPQlJVTiwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKKyNlbmRpZgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBsb2FkZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgZWFjaCBNQ1UuCisgICAqIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgd2UgZXhpdCBXSVRIT1VUIHVwZGF0aW5nIHRoZW0uCisgICAqLworICBiaXRyZWFkX3Blcm1fc3RhdGUgYml0c3RhdGU7CS8qIEJpdCBidWZmZXIgYXQgc3RhcnQgb2YgTUNVICovCisgIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBPdGhlciBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLworICBkX2Rlcml2ZWRfdGJsICogZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisgIGRfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibDsgLyogYWN0aXZlIHRhYmxlIGR1cmluZyBhbiBBQyBzY2FuICovCit9IHBodWZmX2VudHJvcHlfZGVjb2RlcjsKKwordHlwZWRlZiBwaHVmZl9lbnRyb3B5X2RlY29kZXIgKiBwaHVmZl9lbnRyb3B5X3B0cjsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0RDX2ZpcnN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0FDX2ZpcnN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfQUNfcmVmaW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3BodWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQsIGJhZDsKKyAgaW50IGNpLCBjb2VmaSwgdGJsOworICBpbnQgKmNvZWZfYml0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogVmFsaWRhdGUgc2NhbiBwYXJhbWV0ZXJzICovCisgIGJhZCA9IEZBTFNFOworICBpZiAoaXNfRENfYmFuZCkgeworICAgIGlmIChjaW5mby0+U2UgIT0gMCkKKyAgICAgIGJhZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgLyogbmVlZCBub3QgY2hlY2sgU3MvU2UgPCAwIHNpbmNlIHRoZXkgY2FtZSBmcm9tIHVuc2lnbmVkIGJ5dGVzICovCisgICAgaWYgKGNpbmZvLT5TcyA+IGNpbmZvLT5TZSB8fCBjaW5mby0+U2UgPj0gRENUU0laRTIpCisgICAgICBiYWQgPSBUUlVFOworICAgIC8qIEFDIHNjYW5zIG1heSBoYXZlIG9ubHkgb25lIGNvbXBvbmVudCAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiAhPSAxKQorICAgICAgYmFkID0gVFJVRTsKKyAgfQorICBpZiAoY2luZm8tPkFoICE9IDApIHsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuOiBtdXN0IGhhdmUgQWwgPSBBaC0xLiAqLworICAgIGlmIChjaW5mby0+QWwgIT0gY2luZm8tPkFoLTEpCisgICAgICBiYWQgPSBUUlVFOworICB9CisgIGlmIChjaW5mby0+QWwgPiAxMykJCS8qIG5lZWQgbm90IGNoZWNrIGZvciA8IDAgKi8KKyAgICBiYWQgPSBUUlVFOworICAvKiBBcmd1YWJseSB0aGUgbWF4aW11bSBBbCB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEzIGZvciA4LWJpdCBwcmVjaXNpb24sCisgICAqIGJ1dCB0aGUgc3BlYyBkb2Vzbid0IHNheSBzbywgYW5kIHdlIHRyeSB0byBiZSBsaWJlcmFsIGFib3V0IHdoYXQgd2UKKyAgICogYWNjZXB0LiAgTm90ZTogbGFyZ2UgQWwgdmFsdWVzIGNvdWxkIHJlc3VsdCBpbiBvdXQtb2YtcmFuZ2UgREMKKyAgICogY29lZmZpY2llbnRzIGR1cmluZyBlYXJseSBzY2FucywgbGVhZGluZyB0byBiaXphcnJlIGRpc3BsYXlzIGR1ZSB0bworICAgKiBvdmVyZmxvd3MgaW4gdGhlIElEQ1QgbWF0aC4gIEJ1dCB3ZSB3b24ndCBjcmFzaC4KKyAgICovCisgIGlmIChiYWQpCisgICAgRVJSRVhJVDQoY2luZm8sIEpFUlJfQkFEX1BST0dSRVNTSU9OLAorCSAgICAgY2luZm8tPlNzLCBjaW5mby0+U2UsIGNpbmZvLT5BaCwgY2luZm8tPkFsKTsKKyAgLyogVXBkYXRlIHByb2dyZXNzaW9uIHN0YXR1cywgYW5kIHZlcmlmeSB0aGF0IHNjYW4gb3JkZXIgaXMgbGVnYWwuCisgICAqIE5vdGUgdGhhdCBpbnRlci1zY2FuIGluY29uc2lzdGVuY2llcyBhcmUgdHJlYXRlZCBhcyB3YXJuaW5ncworICAgKiBub3QgZmF0YWwgZXJyb3JzIC4uLiBub3QgY2xlYXIgaWYgdGhpcyBpcyByaWdodCB3YXkgdG8gYmVoYXZlLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBpbnQgY2luZGV4ID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldLT5jb21wb25lbnRfaW5kZXg7CisgICAgY29lZl9iaXRfcHRyID0gJiBjaW5mby0+Y29lZl9iaXRzW2NpbmRleF1bMF07CisgICAgaWYgKCFpc19EQ19iYW5kICYmIGNvZWZfYml0X3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLworICAgICAgV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCAwKTsKKyAgICBmb3IgKGNvZWZpID0gY2luZm8tPlNzOyBjb2VmaSA8PSBjaW5mby0+U2U7IGNvZWZpKyspIHsKKyAgICAgIGludCBleHBlY3RlZCA9IChjb2VmX2JpdF9wdHJbY29lZmldIDwgMCkgPyAwIDogY29lZl9iaXRfcHRyW2NvZWZpXTsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gZXhwZWN0ZWQpCisJV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCBjb2VmaSk7CisgICAgICBjb2VmX2JpdF9wdHJbY29lZmldID0gY2luZm8tPkFsOworICAgIH0KKyAgfQorCisgIC8qIFNlbGVjdCBNQ1UgZGVjb2Rpbmcgcm91dGluZSAqLworICBpZiAoY2luZm8tPkFoID09IDApIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19maXJzdDsKKyAgICBlbHNlCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfQUNfZmlyc3Q7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX0RDX2JhbmQpCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfRENfcmVmaW5lOworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19yZWZpbmU7CisgIH0KKworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgLyogTWFrZSBzdXJlIHJlcXVlc3RlZCB0YWJsZXMgYXJlIHByZXNlbnQsIGFuZCBjb21wdXRlIGRlcml2ZWQgdGFibGVzLgorICAgICAqIFdlIG1heSBidWlsZCBzYW1lIGRlcml2ZWQgdGFibGUgbW9yZSB0aGFuIG9uY2UsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUuCisgICAgICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggPT0gMCkgewkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworCWpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCB0YmwsCisJCQkJJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICAvKiByZW1lbWJlciB0aGUgc2luZ2xlIGFjdGl2ZSB0YWJsZSAqLworICAgICAgZW50cm9weS0+YWNfZGVyaXZlZF90YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgYml0cmVhZCBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKyAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IDA7IC8qIHVubmVjZXNzYXJ5LCBidXQga2VlcHMgUHVyaWZ5IHF1aWV0ICovCisgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKKworICAvKiBJbml0aWFsaXplIHJlc3RhcnQgY291bnRlciAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworfQorCisKKy8qCisgKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgorICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCisgKi8KKworI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLworICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCisgIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKKyAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAorICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCisgICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OworCisjZW5kaWYgLyogQVZPSURfVEFCTEVTICovCisKKworLyoKKyAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgorICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3Byb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaTsKKworICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KKyAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLworICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKworICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCisgIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIC8qIFJlLWluaXQgRU9CIHJ1biBjb3VudCwgdG9vICovCisgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IDA7CisKKyAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisKKyAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAorICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKKyAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQorICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KKyAgICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQorICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBIdWZmbWFuIE1DVSBkZWNvZGluZy4KKyAqIEVhY2ggb2YgdGhlc2Ugcm91dGluZXMgZGVjb2RlcyBhbmQgcmV0dXJucyBvbmUgTUNVJ3Mgd29ydGggb2YKKyAqIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuIAorICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKKyAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgorICoKKyAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKKyAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBJUyBJTklUSUFMTFkgWkVST0VEIEJZIFRIRSBDQUxMRVIuCisgKgorICogV2UgcmV0dXJuIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCisgKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0CisgKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKKyAqIHNwZWN0cmFsIHNlbGVjdGlvbiwgc2luY2Ugd2UnbGwganVzdCByZS1hc3NpZ24gdGhlbSBvbiB0aGUgbmV4dCBjYWxsLgorICogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIEFDIHJlZmluZW1lbnQgaGFzIHRvIGJlIG1vcmUgY2FyZWZ1bCwgaG93ZXZlci4pCisgKi8KKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgcmVnaXN0ZXIgaW50IHMsIHI7CisgIGludCBibGtuLCBjaTsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIHNhdmFibGVfc3RhdGUgc3RhdGU7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworCisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKKworICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KKworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworICAgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub107CisKKyAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOworICAgICAgaWYgKHMpIHsKKwlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCXIgPSBHRVRfQklUUyhzKTsKKwlzID0gSFVGRl9FWFRFTkQociwgcyk7CisgICAgICB9CisKKyAgICAgIC8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworICAgICAgcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07CisgICAgICBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworICAgICAgLyogU2NhbGUgYW5kIG91dHB1dCB0aGUgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdPTApICovCisgICAgICAoKmJsb2NrKVswXSA9IChKQ09FRikgKHMgPDwgQWwpOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7CisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9BQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBTZSA9IGNpbmZvLT5TZTsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICByZWdpc3RlciBpbnQgcywgaywgcjsKKyAgdW5zaWduZWQgaW50IEVPQlJVTjsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCisgICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUuCisgICAgICogV2UgY2FuIGF2b2lkIGxvYWRpbmcvc2F2aW5nIGJpdHJlYWQgc3RhdGUgaWYgaW4gYW4gRU9CIHJ1bi4KKyAgICAgKi8KKyAgICBFT0JSVU4gPSBlbnRyb3B5LT5zYXZlZC5FT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCisKKyAgICAvKiBUaGVyZSBpcyBhbHdheXMgb25seSBvbmUgYmxvY2sgcGVyIE1DVSAqLworCisgICAgaWYgKEVPQlJVTiA+IDApCQkvKiBpZiBpdCdzIGEgYmFuZCBvZiB6ZXJvZXMuLi4gKi8KKyAgICAgIEVPQlJVTi0tOwkJCS8qIC4uLnByb2Nlc3MgaXQgbm93ICh3ZSBkbyBub3RoaW5nKSAqLworICAgIGVsc2UgeworICAgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICAgIGJsb2NrID0gTUNVX2RhdGFbMF07CisgICAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgICAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7CisJciA9IHMgPj4gNDsKKwlzICY9IDE1OworCWlmIChzKSB7CisJICBrICs9IHI7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgciA9IEdFVF9CSVRTKHMpOworCSAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOworCSAgLyogU2NhbGUgYW5kIG91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIgKi8KKwkgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIChzIDw8IEFsKTsKKwl9IGVsc2UgeworCSAgaWYgKHIgPT0gMTUpIHsJLyogWlJMICovCisJICAgIGsgKz0gMTU7CQkvKiBza2lwIDE1IHplcm9lcyBpbiBiYW5kICovCisJICB9IGVsc2UgewkJLyogRU9CciwgcnVuIGxlbmd0aCBpcyAyXnIgKyBhcHBlbmRlZCBiaXRzICovCisJICAgIEVPQlJVTiA9IDEgPDwgcjsKKwkgICAgaWYgKHIpIHsJCS8qIEVPQnIsIHIgPiAwICovCisJICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgciwgcmV0dXJuIEZBTFNFKTsKKwkgICAgICByID0gR0VUX0JJVFMocik7CisJICAgICAgRU9CUlVOICs9IHI7CisJICAgIH0KKwkgICAgRU9CUlVOLS07CQkvKiB0aGlzIGJhbmQgaXMgcHJvY2Vzc2VkIGF0IHRoaXMgbW9tZW50ICovCisJICAgIGJyZWFrOwkJLyogZm9yY2UgZW5kLW9mLWJhbmQgKi8KKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOwkvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZGVjb2RpbmcgZm9yIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCisgKiBOb3RlOiB3ZSBhc3N1bWUgc3VjaCBzY2FucyBjYW4gYmUgbXVsdGktY29tcG9uZW50LCBhbHRob3VnaCB0aGUgc3BlYworICogaXMgbm90IHZlcnkgY2xlYXIgb24gdGhlIHBvaW50LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7ICAgCisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBibGtuOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKworICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogTm90IHdvcnRoIHRoZSBjeWNsZXMgdG8gY2hlY2sgaW5zdWZmaWNpZW50X2RhdGEgaGVyZSwKKyAgICogc2luY2Ugd2Ugd2lsbCBub3QgY2hhbmdlIHRoZSBkYXRhIGFueXdheSBpZiB3ZSByZWFkIHplcm9lcy4KKyAgICovCisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisKKyAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLworCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKworICAgIC8qIEVuY29kZWQgZGF0YSBpcyBzaW1wbHkgdGhlIG5leHQgYml0IG9mIHRoZSB0d28ncy1jb21wbGVtZW50IERDIHZhbHVlICovCisgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgcmV0dXJuIEZBTFNFKTsKKyAgICBpZiAoR0VUX0JJVFMoMSkpCisgICAgICAoKmJsb2NrKVswXSB8PSBwMTsKKyAgICAvKiBOb3RlOiBzaW5jZSB3ZSB1c2UgfD0sIHJlcGVhdGluZyB0aGUgYXNzaWdubWVudCBsYXRlciBpcyBzYWZlICovCisgIH0KKworICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2RlY29kZV9tY3VfQUNfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBtMSA9ICgtMSkgPDwgY2luZm8tPkFsOwkvKiAtMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIHJlZ2lzdGVyIGludCBzLCBrLCByOworICB1bnNpZ25lZCBpbnQgRU9CUlVOOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEpDT0VGUFRSIHRoaXNjb2VmOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGludCBudW1fbmV3bno7CisgIGludCBuZXduel9wb3NbRENUU0laRTJdOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGRvbid0IG1vZGlmeSB0aGUgTUNVLgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsgLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KKworICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCisgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKyAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgIC8qIElmIHdlIGFyZSBmb3JjZWQgdG8gc3VzcGVuZCwgd2UgbXVzdCB1bmRvIHRoZSBhc3NpZ25tZW50cyB0byBhbnkgbmV3bHkKKyAgICAgKiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2ssIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlJ2QgZ2V0IGNvbmZ1c2VkCisgICAgICogbmV4dCB0aW1lIGFib3V0IHdoaWNoIGNvZWZmaWNpZW50cyB3ZXJlIGFscmVhZHkgbm9uemVyby4KKyAgICAgKiBCdXQgd2UgbmVlZCBub3QgdW5kbyBhZGRpdGlvbiBvZiBiaXRzIHRvIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudHM7CisgICAgICogaW5zdGVhZCwgd2UgY2FuIHRlc3QgdGhlIGN1cnJlbnQgYml0IHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGRpZCBpdC4KKyAgICAgKi8KKyAgICBudW1fbmV3bnogPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBjb2VmZmljaWVudCBsb29wIGNvdW50ZXIgdG8gc3RhcnQgb2YgYmFuZCAqLworICAgIGsgPSBjaW5mby0+U3M7CisKKyAgICBpZiAoRU9CUlVOID09IDApIHsKKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCBnb3RvIHVuZG9pdCwgbGFiZWwzKTsKKwlyID0gcyA+PiA0OworCXMgJj0gMTU7CisJaWYgKHMpIHsKKwkgIGlmIChzICE9IDEpCQkvKiBzaXplIG9mIG5ldyBjb2VmIHNob3VsZCBhbHdheXMgYmUgMSAqLworCSAgICBXQVJOTVMoY2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7CisJICBpZiAoR0VUX0JJVFMoMSkpCisJICAgIHMgPSBwMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBwb3NpdGl2ZSAqLworCSAgZWxzZQorCSAgICBzID0gbTE7CQkvKiBuZXdseSBub256ZXJvIGNvZWYgaXMgbmVnYXRpdmUgKi8KKwl9IGVsc2UgeworCSAgaWYgKHIgIT0gMTUpIHsKKwkgICAgRU9CUlVOID0gMSA8PCByOwkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KKwkgICAgaWYgKHIpIHsKKwkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCBnb3RvIHVuZG9pdCk7CisJICAgICAgciA9IEdFVF9CSVRTKHIpOworCSAgICAgIEVPQlJVTiArPSByOworCSAgICB9CisJICAgIGJyZWFrOwkJLyogcmVzdCBvZiBibG9jayBpcyBoYW5kbGVkIGJ5IEVPQiBsb2dpYyAqLworCSAgfQorCSAgLyogbm90ZSBzID0gMCBmb3IgcHJvY2Vzc2luZyBaUkwgKi8KKwl9CisJLyogQWR2YW5jZSBvdmVyIGFscmVhZHktbm9uemVybyBjb2VmcyBhbmQgciBzdGlsbC16ZXJvIGNvZWZzLAorCSAqIGFwcGVuZGluZyBjb3JyZWN0aW9uIGJpdHMgdG8gdGhlIG5vbnplcm9lcy4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQorCSAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisJICovCisJZG8geworCSAgdGhpc2NvZWYgPSAqYmxvY2sgKyBqcGVnX25hdHVyYWxfb3JkZXJba107CisJICBpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOworCSAgICBpZiAoR0VUX0JJVFMoMSkpIHsKKwkgICAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBzZXQgaXQgKi8KKwkJaWYgKCp0aGlzY29lZiA+PSAwKQorCQkgICp0aGlzY29lZiArPSBwMTsKKwkJZWxzZQorCQkgICp0aGlzY29lZiArPSBtMTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIGlmICgtLXIgPCAwKQorCSAgICAgIGJyZWFrOwkJLyogcmVhY2hlZCB0YXJnZXQgemVybyBjb2VmZmljaWVudCAqLworCSAgfQorCSAgaysrOworCX0gd2hpbGUgKGsgPD0gU2UpOworCWlmIChzKSB7CisJICBpbnQgcG9zID0ganBlZ19uYXR1cmFsX29yZGVyW2tdOworCSAgLyogT3V0cHV0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQgKi8KKwkgICgqYmxvY2spW3Bvc10gPSAoSkNPRUYpIHM7CisJICAvKiBSZW1lbWJlciBpdHMgcG9zaXRpb24gaW4gY2FzZSB3ZSBoYXZlIHRvIHN1c3BlbmQgKi8KKwkgIG5ld256X3Bvc1tudW1fbmV3bnorK10gPSBwb3M7CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChFT0JSVU4gPiAwKSB7CisgICAgICAvKiBTY2FuIGFueSByZW1haW5pbmcgY29lZmZpY2llbnQgcG9zaXRpb25zIGFmdGVyIHRoZSBlbmQtb2YtYmFuZAorICAgICAgICogKHRoZSBsYXN0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQsIGlmIGFueSkuICBBcHBlbmQgYSBjb3JyZWN0aW9uCisgICAgICAgKiBiaXQgdG8gZWFjaCBhbHJlYWR5LW5vbnplcm8gY29lZmZpY2llbnQuICBBIGNvcnJlY3Rpb24gYml0IGlzIDEKKyAgICAgICAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisgICAgICAgKi8KKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwl0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKKwlpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKKwkgIGlmIChHRVRfQklUUygxKSkgeworCSAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBjaGFuZ2VkIGl0ICovCisJICAgICAgaWYgKCp0aGlzY29lZiA+PSAwKQorCQkqdGhpc2NvZWYgKz0gcDE7CisJICAgICAgZWxzZQorCQkqdGhpc2NvZWYgKz0gbTE7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBDb3VudCBvbmUgYmxvY2sgY29tcGxldGVkIGluIEVPQiBydW4gKi8KKyAgICAgIEVPQlJVTi0tOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworCit1bmRvaXQ6CisgIC8qIFJlLXplcm8gYW55IG91dHB1dCBjb2VmZmljaWVudHMgdGhhdCB3ZSBtYWRlIG5ld2x5IG5vbnplcm8gKi8KKyAgd2hpbGUgKG51bV9uZXdueiA+IDApCisgICAgKCpibG9jaylbbmV3bnpfcG9zWy0tbnVtX25ld256XV0gPSAwOworCisgIHJldHVybiBGQUxTRTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X3BodWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCAqY29lZl9iaXRfcHRyOworICBpbnQgY2ksIGk7CisKKyAgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihwaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKKyAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7CisgIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19waHVmZl9kZWNvZGVyOworCisgIC8qIE1hcmsgZGVyaXZlZCB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgIH0KKworICAvKiBDcmVhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzIHRhYmxlICovCisgIGNpbmZvLT5jb2VmX2JpdHMgPSAoaW50ICgqKVtEQ1RTSVpFMl0pCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMqRENUU0laRTIqU0laRU9GKGludCkpOworICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbMF1bMF07CisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCisgICAgICAqY29lZl9iaXRfcHRyKysgPSAtMTsKK30KKworI2VuZGlmIC8qIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qZHBvc3RjdC5jIGIvamRwb3N0Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzE1NjNkCi0tLSAvZGV2L251bGwKKysrIGIvamRwb3N0Y3QuYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIGpkcG9zdGN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyLgorICogVGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIHVwc2FtcGxpbmcsIGNvbG9yIGNvbnZlcnNpb24sIGFuZCBjb2xvcgorICogcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBzdGVwczsgc3BlY2lmaWNhbGx5LCBpdCBjb250cm9scyB0aGUgYnVmZmVyaW5nCisgKiBiZXR3ZWVuIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gYW5kIGNvbG9yIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24uCisgKgorICogSWYgbm8gY29sb3IgcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBpcyByZXF1aXJlZCwgdGhlbiB0aGlzIG1vZHVsZSBoYXMgbm8KKyAqIHdvcmsgdG8gZG8sIGFuZCBpdCBqdXN0IGhhbmRzIG9mZiB0byB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBjb2RlLgorICogQW4gaW50ZWdyYXRlZCB1cHNhbXBsZS9jb252ZXJ0L3F1YW50aXplIHByb2Nlc3Mgd291bGQgcmVwbGFjZSB0aGlzIG1vZHVsZQorICogZW50aXJlbHkuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQ29sb3IgcXVhbnRpemF0aW9uIHNvdXJjZSBidWZmZXI6IHRoaXMgaG9sZHMgb3V0cHV0IGRhdGEgZnJvbQorICAgKiB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBzdGVwIHRvIGJlIHBhc3NlZCB0byB0aGUgcXVhbnRpemVyLgorICAgKiBGb3IgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCB3ZSBuZWVkIGEgZnVsbC1pbWFnZSBidWZmZXI7CisgICAqIGZvciBvbmUtcGFzcyBvcGVyYXRpb24sIGEgc3RyaXAgYnVmZmVyIGlzIHN1ZmZpY2llbnQuCisgICAqLworICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiB2aXJ0dWFsIGFycmF5LCBvciBOVUxMIGlmIG9uZS1wYXNzICovCisgIEpTQU1QQVJSQVkgYnVmZmVyOwkJLyogc3RyaXAgYnVmZmVyLCBvciBjdXJyZW50IHN0cmlwIG9mIHZpcnR1YWwgKi8KKyAgSkRJTUVOU0lPTiBzdHJpcF9oZWlnaHQ7CS8qIGJ1ZmZlciBzaXplIGluIHJvd3MgKi8KKyAgLyogZm9yIHR3by1wYXNzIG1vZGUgb25seTogKi8KKyAgSkRJTUVOU0lPTiBzdGFydGluZ19yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHJvdyBpbiBjdXJyZW50IHN0cmlwICovCisgIEpESU1FTlNJT04gbmV4dF9yb3c7CQkvKiBpbmRleCBvZiBuZXh0IHJvdyB0byBmaWxsL2VtcHR5IGluIHN0cmlwICovCit9IG15X3Bvc3RfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wb3N0X2NvbnRyb2xsZXIgKiBteV9wb3N0X3B0cjsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc18xcGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKK01FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfcHJlcGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKK01FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfMnBhc3MKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2Rwb3N0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7CisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgICAgLyogU2luZ2xlLXBhc3MgcHJvY2Vzc2luZyB3aXRoIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KKyAgICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc18xcGFzczsKKyAgICAgIC8qIFdlIGNvdWxkIGJlIGRvaW5nIGJ1ZmZlcmVkLWltYWdlIG91dHB1dCBiZWZvcmUgc3RhcnRpbmcgYSAyLXBhc3MKKyAgICAgICAqIGNvbG9yIHF1YW50aXphdGlvbjsgaW4gdGhhdCBjYXNlLCBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBkaWQgbm90CisgICAgICAgKiBhbGxvY2F0ZSBhIHN0cmlwIGJ1ZmZlci4gIFVzZSB0aGUgdmlydHVhbC1hcnJheSBidWZmZXIgYXMgd29ya3NwYWNlLgorICAgICAgICovCisgICAgICBpZiAocG9zdC0+YnVmZmVyID09IE5VTEwpIHsKKwlwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCisJICAgKEpESU1FTlNJT04pIDAsIHBvc3QtPnN0cmlwX2hlaWdodCwgVFJVRSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nIHdpdGhvdXQgY29sb3IgcXVhbnRpemF0aW9uLAorICAgICAgICogSSBoYXZlIG5vIHdvcmsgdG8gZG87IGp1c3QgY2FsbCB0aGUgdXBzYW1wbGVyIGRpcmVjdGx5LgorICAgICAgICovCisgICAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlOworICAgIH0KKyAgICBicmVhazsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgLyogRmlyc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCisgICAgaWYgKHBvc3QtPndob2xlX2ltYWdlID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzX3ByZXBhc3M7CisgICAgYnJlYWs7CisgIGNhc2UgSkJVRl9DUkFOS19ERVNUOgorICAgIC8qIFNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KKyAgICBpZiAocG9zdC0+d2hvbGVfaW1hZ2UgPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfMnBhc3M7CisgICAgYnJlYWs7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9CisgIHBvc3QtPnN0YXJ0aW5nX3JvdyA9IHBvc3QtPm5leHRfcm93ID0gMDsKK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIG9uZS1wYXNzIChzdHJpcCBidWZmZXIpIGNhc2UuCisgKiBUaGlzIGlzIHVzZWQgZm9yIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gYXMgd2VsbCBhcyBvbmUtcGFzcyBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwb3N0X3Byb2Nlc3NfMXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7CisKKyAgLyogRmlsbCB0aGUgYnVmZmVyLCBidXQgbm90IG1vcmUgdGhhbiB3aGF0IHdlIGNhbiBkdW1wIG91dCBpbiBvbmUgZ28uICovCisgIC8qIE5vdGUgd2UgcmVseSBvbiB0aGUgdXBzYW1wbGVyIHRvIGRldGVjdCBib3R0b20gb2YgaW1hZ2UuICovCisgIG1heF9yb3dzID0gb3V0X3Jvd3NfYXZhaWwgLSAqb3V0X3Jvd19jdHI7CisgIGlmIChtYXhfcm93cyA+IHBvc3QtPnN0cmlwX2hlaWdodCkKKyAgICBtYXhfcm93cyA9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgbnVtX3Jvd3MgPSAwOworICAoKmNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGUpIChjaW5mbywKKwkJaW5wdXRfYnVmLCBpbl9yb3dfZ3JvdXBfY3RyLCBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQlwb3N0LT5idWZmZXIsICZudW1fcm93cywgbWF4X3Jvd3MpOworICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLworICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCisJCXBvc3QtPmJ1ZmZlciwgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwgKGludCkgbnVtX3Jvd3MpOworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Cit9CisKKworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bvc3RfcHJvY2Vzc19wcmVwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBvbGRfbmV4dF9yb3csIG51bV9yb3dzOworCisgIC8qIFJlcG9zaXRpb24gdmlydHVhbCBidWZmZXIgaWYgYXQgc3RhcnQgb2Ygc3RyaXAuICovCisgIGlmIChwb3N0LT5uZXh0X3JvdyA9PSAwKSB7CisgICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKKwkgcG9zdC0+c3RhcnRpbmdfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQsIFRSVUUpOworICB9CisKKyAgLyogVXBzYW1wbGUgc29tZSBkYXRhICh1cCB0byBhIHN0cmlwIGhlaWdodCdzIHdvcnRoKS4gKi8KKyAgb2xkX25leHRfcm93ID0gcG9zdC0+bmV4dF9yb3c7CisgICgqY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZSkgKGNpbmZvLAorCQlpbnB1dF9idWYsIGluX3Jvd19ncm91cF9jdHIsIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCXBvc3QtPmJ1ZmZlciwgJnBvc3QtPm5leHRfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQpOworCisgIC8qIEFsbG93IHF1YW50aXplciB0byBzY2FuIG5ldyBkYXRhLiAgTm8gZGF0YSBpcyBlbWl0dGVkLCAqLworICAvKiBidXQgd2UgYWR2YW5jZSBvdXRfcm93X2N0ciBzbyBvdXRlciBsb29wIGNhbiB0ZWxsIHdoZW4gd2UncmUgZG9uZS4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID4gb2xkX25leHRfcm93KSB7CisgICAgbnVtX3Jvd3MgPSBwb3N0LT5uZXh0X3JvdyAtIG9sZF9uZXh0X3JvdzsKKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sIHBvc3QtPmJ1ZmZlciArIG9sZF9uZXh0X3JvdywKKwkJCQkJIChKU0FNUEFSUkFZKSBOVUxMLCAoaW50KSBudW1fcm93cyk7CisgICAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOworICB9CisKKyAgLyogQWR2YW5jZSBpZiB3ZSBmaWxsZWQgdGhlIHN0cmlwLiAqLworICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7CisgICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgICBwb3N0LT5uZXh0X3JvdyA9IDA7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwb3N0X3Byb2Nlc3NfMnBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7CisKKyAgLyogUmVwb3NpdGlvbiB2aXJ0dWFsIGJ1ZmZlciBpZiBhdCBzdGFydCBvZiBzdHJpcC4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID09IDApIHsKKyAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAorCSBwb3N0LT5zdGFydGluZ19yb3csIHBvc3QtPnN0cmlwX2hlaWdodCwgRkFMU0UpOworICB9CisKKyAgLyogRGV0ZXJtaW5lIG51bWJlciBvZiByb3dzIHRvIGVtaXQuICovCisgIG51bV9yb3dzID0gcG9zdC0+c3RyaXBfaGVpZ2h0IC0gcG9zdC0+bmV4dF9yb3c7IC8qIGF2YWlsYWJsZSBpbiBzdHJpcCAqLworICBtYXhfcm93cyA9IG91dF9yb3dzX2F2YWlsIC0gKm91dF9yb3dfY3RyOyAvKiBhdmFpbGFibGUgaW4gb3V0cHV0IGFyZWEgKi8KKyAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCisgICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKKyAgLyogV2UgaGF2ZSB0byBjaGVjayBib3R0b20gb2YgaW1hZ2UgaGVyZSwgY2FuJ3QgZGVwZW5kIG9uIHVwc2FtcGxlci4gKi8KKyAgbWF4X3Jvd3MgPSBjaW5mby0+b3V0cHV0X2hlaWdodCAtIHBvc3QtPnN0YXJ0aW5nX3JvdzsKKyAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCisgICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKKworICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLworICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCisJCXBvc3QtPmJ1ZmZlciArIHBvc3QtPm5leHRfcm93LCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLAorCQkoaW50KSBudW1fcm93cyk7CisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKKworICAvKiBBZHZhbmNlIGlmIHdlIGZpbGxlZCB0aGUgc3RyaXAuICovCisgIHBvc3QtPm5leHRfcm93ICs9IG51bV9yb3dzOworICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7CisgICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgICBwb3N0LT5uZXh0X3JvdyA9IDA7CisgIH0KK30KKworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9kX3Bvc3RfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9wb3N0X3B0ciBwb3N0OworCisgIHBvc3QgPSAobXlfcG9zdF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfcG9zdF9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5wb3N0ID0gKHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICopIHBvc3Q7CisgIHBvc3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kcG9zdDsKKyAgcG9zdC0+d2hvbGVfaW1hZ2UgPSBOVUxMOwkvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICBwb3N0LT5idWZmZXIgPSBOVUxMOwkJLyogZmxhZyBmb3Igbm8gc3RyaXAgYnVmZmVyICovCisKKyAgLyogQ3JlYXRlIHRoZSBxdWFudGl6YXRpb24gYnVmZmVyLCBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICAvKiBUaGUgYnVmZmVyIHN0cmlwIGhlaWdodCBpcyBtYXhfdl9zYW1wX2ZhY3Rvciwgd2hpY2ggaXMgdHlwaWNhbGx5CisgICAgICogYW4gZWZmaWNpZW50IG51bWJlciBvZiByb3dzIGZvciB1cHNhbXBsaW5nIHRvIHJldHVybi4KKyAgICAgKiAoSW4gdGhlIHByZXNlbmNlIG9mIG91dHB1dCByZXNjYWxpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gYmUgc21hcnRlcj8pCisgICAgICovCisgICAgcG9zdC0+c3RyaXBfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworICAgICAgLyogVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uOiBuZWVkIGZ1bGwtaW1hZ2Ugc3RvcmFnZS4gKi8KKyAgICAgIC8qIFdlIHJvdW5kIHVwIHRoZSBudW1iZXIgb2Ygcm93cyB0byBhIG11bHRpcGxlIG9mIHRoZSBzdHJpcCBoZWlnaHQuICovCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgICBwb3N0LT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cywKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCisJCQkJKGxvbmcpIHBvc3QtPnN0cmlwX2hlaWdodCksCisJIHBvc3QtPnN0cmlwX2hlaWdodCk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiBPbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb246IGp1c3QgbWFrZSBhIHN0cmlwIGJ1ZmZlci4gKi8KKyAgICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMsCisJIHBvc3QtPnN0cmlwX2hlaWdodCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9qZHNhbXBsZS5jIGIvamRzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZmZWZiCi0tLSAvZGV2L251bGwKKysrIGIvamRzYW1wbGUuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAqIGpkc2FtcGxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB1cHNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIFVwc2FtcGxpbmcgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCisgKiBpcyBkZWZpbmVkIHRvIGJlICh2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSkKKyAqIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVXBzYW1wbGluZyB3aWxsIG5vcm1hbGx5IHByb2R1Y2UKKyAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3MgZnJvbSBlYWNoIHJvdyBncm91cCAoYnV0IHRoaXMgY291bGQgdmFyeQorICogaWYgdGhlIHVwc2FtcGxlciBpcyBhcHBseWluZyBhIHNjYWxlIGZhY3RvciBvZiBpdHMgb3duKS4KKyAqCisgKiBBbiBleGNlbGxlbnQgcmVmZXJlbmNlIGZvciBpbWFnZSByZXNhbXBsaW5nIGlzCisgKiAgIERpZ2l0YWwgSW1hZ2UgV2FycGluZywgR2VvcmdlIFdvbGJlcmcsIDE5OTAuCisgKiAgIFB1Yi4gYnkgSUVFRSBDb21wdXRlciBTb2NpZXR5IFByZXNzLCBMb3MgQWxhbWl0b3MsIENBLiBJU0JOIDAtODE4Ni04OTQ0LTcuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFBvaW50ZXIgdG8gcm91dGluZSB0byB1cHNhbXBsZSBhIHNpbmdsZSBjb21wb25lbnQgKi8KK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCB1cHNhbXBsZTFfcHRyLAorCQkoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQ29sb3IgY29udmVyc2lvbiBidWZmZXIuICBXaGVuIHVzaW5nIHNlcGFyYXRlIHVwc2FtcGxpbmcgYW5kIGNvbG9yCisgICAqIGNvbnZlcnNpb24gc3RlcHMsIHRoaXMgYnVmZmVyIGhvbGRzIG9uZSB1cHNhbXBsZWQgcm93IGdyb3VwIHVudGlsIGl0CisgICAqIGhhcyBiZWVuIGNvbG9yIGNvbnZlcnRlZCBhbmQgb3V0cHV0LgorICAgKiBOb3RlOiB3ZSBkbyBub3QgYWxsb2NhdGUgYW55IHN0b3JhZ2UgZm9yIGNvbXBvbmVudChzKSB3aGljaCBhcmUgZnVsbC1zaXplLAorICAgKiBpZSBkbyBub3QgbmVlZCByZXNjYWxpbmcuICBUaGUgY29ycmVzcG9uZGluZyBlbnRyeSBvZiBjb2xvcl9idWZbXSBpcworICAgKiBzaW1wbHkgc2V0IHRvIHBvaW50IHRvIHRoZSBpbnB1dCBkYXRhIGFycmF5LCB0aGVyZWJ5IGF2b2lkaW5nIGNvcHlpbmcuCisgICAqLworICBKU0FNUEFSUkFZIGNvbG9yX2J1ZltNQVhfQ09NUE9ORU5UU107CisKKyAgLyogUGVyLWNvbXBvbmVudCB1cHNhbXBsaW5nIG1ldGhvZCBwb2ludGVycyAqLworICB1cHNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworCisgIGludCBuZXh0X3Jvd19vdXQ7CQkvKiBjb3VudHMgcm93cyBlbWl0dGVkIGZyb20gY29sb3JfYnVmICovCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCisKKyAgLyogSGVpZ2h0IG9mIGFuIGlucHV0IHJvdyBncm91cCBmb3IgZWFjaCBjb21wb25lbnQuICovCisgIGludCByb3dncm91cF9oZWlnaHRbTUFYX0NPTVBPTkVOVFNdOworCisgIC8qIFRoZXNlIGFycmF5cyBzYXZlIHBpeGVsIGV4cGFuc2lvbiBmYWN0b3JzIHNvIHRoYXQgaW50X2V4cGFuZCBuZWVkIG5vdAorICAgKiByZWNvbXB1dGUgdGhlbSBlYWNoIHRpbWUuICBUaGV5IGFyZSB1bnVzZWQgZm9yIG90aGVyIHVwc2FtcGxpbmcgbWV0aG9kcy4KKyAgICovCisgIFVJTlQ4IGhfZXhwYW5kW01BWF9DT01QT05FTlRTXTsKKyAgVUlOVDggdl9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOworfSBteV91cHNhbXBsZXI7CisKK3R5cGVkZWYgbXlfdXBzYW1wbGVyICogbXlfdXBzYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiB1cHNhbXBsaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgdXBzYW1wbGUtPm5leHRfcm93X291dCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICB1cHNhbXBsZS0+cm93c190b19nbyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworfQorCisKKy8qCisgKiBDb250cm9sIHJvdXRpbmUgdG8gZG8gdXBzYW1wbGluZyAoYW5kIGNvbG9yIGNvbnZlcnNpb24pLgorICoKKyAqIEluIHRoaXMgdmVyc2lvbiB3ZSB1cHNhbXBsZSBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LgorICogV2UgdXBzYW1wbGUgb25lIHJvdyBncm91cCBpbnRvIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgdGhlbiBhcHBseQorICogY29sb3IgY29udmVyc2lvbiBhIHJvdyBhdCBhIHRpbWUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKRElNRU5TSU9OIG51bV9yb3dzOworCisgIC8qIEZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBpZiBpdCdzIGVtcHR5ICovCisgIGlmICh1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID49IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgLyogSW52b2tlIHBlci1jb21wb25lbnQgdXBzYW1wbGUgbWV0aG9kLiAgTm90aWNlIHdlIHBhc3MgYSBQT0lOVEVSCisgICAgICAgKiB0byBjb2xvcl9idWZbY2ldLCBzbyB0aGF0IGZ1bGxzaXplX3Vwc2FtcGxlIGNhbiBjaGFuZ2UgaXQuCisgICAgICAgKi8KKyAgICAgICgqdXBzYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsCisJaW5wdXRfYnVmW2NpXSArICgqaW5fcm93X2dyb3VwX2N0ciAqIHVwc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldKSwKKwl1cHNhbXBsZS0+Y29sb3JfYnVmICsgY2kpOworICAgIH0KKyAgICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID0gMDsKKyAgfQorCisgIC8qIENvbG9yLWNvbnZlcnQgYW5kIGVtaXQgcm93cyAqLworCisgIC8qIEhvdyBtYW55IHdlIGhhdmUgaW4gdGhlIGJ1ZmZlcjogKi8KKyAgbnVtX3Jvd3MgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAtIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQpOworICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gIE5lZWQgdGhpcyB0ZXN0CisgICAqIGluIGNhc2UgdGhlIGltYWdlIGhlaWdodCBpcyBub3QgYSBtdWx0aXBsZSBvZiBtYXhfdl9zYW1wX2ZhY3RvcjoKKyAgICovCisgIGlmIChudW1fcm93cyA+IHVwc2FtcGxlLT5yb3dzX3RvX2dvKSAKKyAgICBudW1fcm93cyA9IHVwc2FtcGxlLT5yb3dzX3RvX2dvOworICAvKiBBbmQgbm90IG1vcmUgdGhhbiB3aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdDogKi8KKyAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOworICBpZiAobnVtX3Jvd3MgPiBvdXRfcm93c19hdmFpbCkKKyAgICBudW1fcm93cyA9IG91dF9yb3dzX2F2YWlsOworCisgICgqY2luZm8tPmNjb252ZXJ0LT5jb2xvcl9jb252ZXJ0KSAoY2luZm8sIHVwc2FtcGxlLT5jb2xvcl9idWYsCisJCQkJICAgICAoSkRJTUVOU0lPTikgdXBzYW1wbGUtPm5leHRfcm93X291dCwKKwkJCQkgICAgIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsCisJCQkJICAgICAoaW50KSBudW1fcm93cyk7CisKKyAgLyogQWRqdXN0IGNvdW50cyAqLworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7CisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvIC09IG51bV9yb3dzOworICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ICs9IG51bV9yb3dzOworICAvKiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdGllZCwgZGVjbGFyZSB0aGlzIGlucHV0IHJvdyBncm91cCBjb25zdW1lZCAqLworICBpZiAodXBzYW1wbGUtPm5leHRfcm93X291dCA+PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpCisgICAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHJvdXRpbmVzIGludm9rZWQgYnkgc2VwX3Vwc2FtcGxlIHRvIHVwc2FtcGxlIHBpeGVsIHZhbHVlcworICogb2YgYSBzaW5nbGUgY29tcG9uZW50LiAgT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKi8KKworCisvKgorICogRm9yIGZ1bGwtc2l6ZSBjb21wb25lbnRzLCB3ZSBqdXN0IG1ha2UgY29sb3JfYnVmW2NpXSBwb2ludCBhdCB0aGUKKyAqIGlucHV0IGJ1ZmZlciwgYW5kIHRodXMgYXZvaWQgY29weWluZyBhbnkgZGF0YS4gIE5vdGUgdGhhdCB0aGlzIGlzCisgKiBzYWZlIG9ubHkgYmVjYXVzZSBzZXBfdXBzYW1wbGUgZG9lc24ndCBkZWNsYXJlIHRoZSBpbnB1dCByb3cgZ3JvdXAKKyAqICJjb25zdW1lZCIgdW50aWwgd2UgYXJlIGRvbmUgY29sb3IgY29udmVydGluZyBhbmQgZW1pdHRpbmcgaXQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgKm91dHB1dF9kYXRhX3B0ciA9IGlucHV0X2RhdGE7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgYSBuby1vcCB2ZXJzaW9uIHVzZWQgZm9yICJ1bmludGVyZXN0aW5nIiBjb21wb25lbnRzLgorICogVGhlc2UgY29tcG9uZW50cyB3aWxsIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNvbG9yIGNvbnZlcnNpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitub29wX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICAqb3V0cHV0X2RhdGFfcHRyID0gTlVMTDsJLyogc2FmZXR5IGNoZWNrICovCit9CisKKworLyoKKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGFueSBpbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MuCisgKiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0eXBpY2FsIEpQRUcgZmlsZXMsIHNvIGl0IG5lZWQgbm90IGJlIGZhc3QuCisgKiBOb3IsIGZvciB0aGF0IG1hdHRlciwgaXMgaXQgcGFydGljdWxhcmx5IGFjY3VyYXRlOiB0aGUgYWxnb3JpdGhtIGlzCisgKiBzaW1wbGUgcmVwbGljYXRpb24gb2YgdGhlIGlucHV0IHBpeGVsIG9udG8gdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0CisgKiBwaXhlbHMuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlIHJlZmVycyB0byB0aGlzIGFzIGEKKyAqICJib3ggZmlsdGVyIi4gIEEgYm94IGZpbHRlciB0ZW5kcyB0byBpbnRyb2R1Y2UgdmlzaWJsZSBhcnRpZmFjdHMsCisgKiBzbyBpZiB5b3UgYXJlIGFjdHVhbGx5IGdvaW5nIHRvIHVzZSAzOjEgb3IgNDoxIHNhbXBsaW5nIHJhdGlvcworICogeW91IHdvdWxkIGJlIHdlbGwgYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ludF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIHJlZ2lzdGVyIGludCBoOworICBKU0FNUFJPVyBvdXRlbmQ7CisgIGludCBoX2V4cGFuZCwgdl9leHBhbmQ7CisgIGludCBpbnJvdywgb3V0cm93OworCisgIGhfZXhwYW5kID0gdXBzYW1wbGUtPmhfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisgIHZfZXhwYW5kID0gdXBzYW1wbGUtPnZfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgLyogR2VuZXJhdGUgb25lIG91dHB1dCByb3cgd2l0aCBwcm9wZXIgaG9yaXpvbnRhbCBleHBhbnNpb24gKi8KKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKKyAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7CisgICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoaCA9IGhfZXhwYW5kOyBoID4gMDsgaC0tKSB7CisJKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogR2VuZXJhdGUgYW55IGFkZGl0aW9uYWwgb3V0cHV0IHJvd3MgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9uZSAqLworICAgIGlmICh2X2V4cGFuZCA+IDEpIHsKKyAgICAgIGpjb3B5X3NhbXBsZV9yb3dzKG91dHB1dF9kYXRhLCBvdXRyb3csIG91dHB1dF9kYXRhLCBvdXRyb3crMSwKKwkJCXZfZXhwYW5kLTEsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOworICAgIH0KKyAgICBpbnJvdysrOworICAgIG91dHJvdyArPSB2X2V4cGFuZDsKKyAgfQorfQorCisKKy8qCisgKiBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICogSXQncyBzdGlsbCBhIGJveCBmaWx0ZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYxX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOworICBKU0FNUFJPVyBvdXRlbmQ7CisgIGludCBpbnJvdzsKKworICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOworICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKKyAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCisgKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjJfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIEpTQU1QUk9XIG91dGVuZDsKKyAgaW50IGlucm93LCBvdXRyb3c7CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOworICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgeworICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICB9CisgICAgamNvcHlfc2FtcGxlX3Jvd3Mob3V0cHV0X2RhdGEsIG91dHJvdywgb3V0cHV0X2RhdGEsIG91dHJvdysxLAorCQkgICAgICAxLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKKyAgICBpbnJvdysrOworICAgIG91dHJvdyArPSAyOworICB9Cit9CisKKworLyoKKyAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICoKKyAqIFRoZSB1cHNhbXBsaW5nIGFsZ29yaXRobSBpcyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHBpeGVsIGNlbnRlcnMsCisgKiBhbHNvIGtub3duIGFzIGEgInRyaWFuZ2xlIGZpbHRlciIuICBUaGlzIGlzIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4KKyAqIHNwZWVkIGFuZCB2aXN1YWwgcXVhbGl0eS4gIFRoZSBjZW50ZXJzIG9mIHRoZSBvdXRwdXQgcGl4ZWxzIGFyZSAxLzQgYW5kIDMvNAorICogb2YgdGhlIHdheSBiZXR3ZWVuIGlucHV0IHBpeGVsIGNlbnRlcnMuCisgKgorICogQSBub3RlIGFib3V0IHRoZSAiYmlhcyIgY2FsY3VsYXRpb25zOiB3aGVuIHJvdW5kaW5nIGZyYWN0aW9uYWwgdmFsdWVzIHRvCisgKiBpbnRlZ2VyLCB3ZSBkbyBub3Qgd2FudCB0byBhbHdheXMgcm91bmQgMC41IHVwIHRvIHRoZSBuZXh0IGludGVnZXIuCisgKiBJZiB3ZSBkaWQgdGhhdCwgd2UnZCBpbnRyb2R1Y2UgYSBub3RpY2VhYmxlIGJpYXMgdG93YXJkcyBsYXJnZXIgdmFsdWVzLgorICogSW5zdGVhZCwgdGhpcyBjb2RlIGlzIGFycmFuZ2VkIHNvIHRoYXQgMC41IHdpbGwgYmUgcm91bmRlZCB1cCBvciBkb3duIGF0CisgKiBhbHRlcm5hdGUgcGl4ZWwgbG9jYXRpb25zIChhIHNpbXBsZSBvcmRlcmVkIGRpdGhlciBwYXR0ZXJuKS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjFfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIGludCBpbnZhbHVlOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKKyAgaW50IGlucm93OworCisgIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgeworICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCisgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIpICsgMikgPj4gMik7CisKKyAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIC8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCAqLworICAgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspICogMzsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKGlucHRyWy0yXSkgKyAxKSA+PiAyKTsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKCppbnB0cikgKyAyKSA+PiAyKTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICogMyArIEdFVEpTQU1QTEUoaW5wdHJbLTFdKSArIDEpID4+IDIpOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOworICB9Cit9CisKKworLyoKKyAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgorICogQWdhaW4gYSB0cmlhbmdsZSBmaWx0ZXI7IHNlZSBjb21tZW50cyBmb3IgaDJ2MSBjYXNlLCBhYm92ZS4KKyAqCisgKiBJdCBpcyBPSyBmb3IgdXMgdG8gcmVmZXJlbmNlIHRoZSBhZGphY2VudCBpbnB1dCByb3dzIGJlY2F1c2Ugd2UgZGVtYW5kZWQKKyAqIGNvbnRleHQgZnJvbSB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciAoc2VlIGluaXRpYWxpemF0aW9uIGNvZGUpLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorICByZWdpc3RlciBpbnQgdGhpc2NvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKKyNlbHNlCisgIHJlZ2lzdGVyIElOVDMyIHRoaXNjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisjZW5kaWYKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2xjdHI7CisgIGludCBpbnJvdywgb3V0cm93LCB2OworCisgIGlucm93ID0gb3V0cm93ID0gMDsKKyAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgIGZvciAodiA9IDA7IHYgPCAyOyB2KyspIHsKKyAgICAgIC8qIGlucHRyMCBwb2ludHMgdG8gbmVhcmVzdCBpbnB1dCByb3csIGlucHRyMSBwb2ludHMgdG8gbmV4dCBuZWFyZXN0ICovCisgICAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICAgIGlmICh2ID09IDApCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGFib3ZlICovCisJaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdy0xXTsKKyAgICAgIGVsc2UJCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGJlbG93ICovCisJaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvdysrXTsKKworICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KKyAgICAgIHRoaXNjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDgpID4+IDQpOworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBuZXh0Y29sc3VtICsgNykgPj4gNCk7CisgICAgICBsYXN0Y29sc3VtID0gdGhpc2NvbHN1bTsgdGhpc2NvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICAgIGZvciAoY29sY3RyID0gY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgeworCS8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCBpbiBlYWNoICovCisJLyogZGltZW5zaW9uLCB0aHVzIDkvMTYsIDMvMTYsIDMvMTYsIDEvMTYgb3ZlcmFsbCAqLworCW5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOworCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbGFzdGNvbHN1bSArIDgpID4+IDQpOworCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbmV4dGNvbHN1bSArIDcpID4+IDQpOworCWxhc3Rjb2xzdW0gPSB0aGlzY29sc3VtOyB0aGlzY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICAgIH0KKworICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBsYXN0Y29sc3VtICsgOCkgPj4gNCk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDcpID4+IDQpOworICAgIH0KKyAgICBpbnJvdysrOworICB9Cit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciB1cHNhbXBsaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGU7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIGJvb2xlYW4gbmVlZF9idWZmZXIsIGRvX2ZhbmN5OworICBpbnQgaF9pbl9ncm91cCwgdl9pbl9ncm91cCwgaF9vdXRfZ3JvdXAsIHZfb3V0X2dyb3VwOworCisgIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV91cHNhbXBsZXIpKTsKKyAgY2luZm8tPnVwc2FtcGxlID0gKHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqKSB1cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc191cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IHNlcF91cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOyAvKiB1bnRpbCB3ZSBmaW5kIG91dCBkaWZmZXJlbnRseSAqLworCisgIGlmIChjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykJLyogdGhpcyBpc24ndCBzdXBwb3J0ZWQgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NDSVI2MDFfTk9USU1QTCk7CisKKyAgLyogamRtYWluY3QuYyBkb2Vzbid0IHN1cHBvcnQgY29udGV4dCByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSA9IDEsCisgICAqIHNvIGRvbid0IGFzayBmb3IgaXQuCisgICAqLworICBkb19mYW5jeSA9IGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nICYmIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID4gMTsKKworICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgc2VsZWN0IHBlci1jb21wb25lbnQgbWV0aG9kcywKKyAgICogYW5kIGNyZWF0ZSBzdG9yYWdlIGFzIG5lZWRlZC4KKyAgICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQ29tcHV0ZSBzaXplIG9mIGFuICJpbnB1dCBncm91cCIgYWZ0ZXIgSURDVCBzY2FsaW5nLiAgVGhpcyBtYW55IHNhbXBsZXMKKyAgICAgKiBhcmUgdG8gYmUgY29udmVydGVkIHRvIG1heF9oX3NhbXBfZmFjdG9yICogbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWxzLgorICAgICAqLworICAgIGhfaW5fZ3JvdXAgPSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworCQkgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgdl9pbl9ncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisJCSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICBoX291dF9ncm91cCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcjsKKyAgICB2X291dF9ncm91cCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB1cHNhbXBsZS0+cm93Z3JvdXBfaGVpZ2h0W2NpXSA9IHZfaW5fZ3JvdXA7IC8qIHNhdmUgZm9yIHVzZSBsYXRlciAqLworICAgIG5lZWRfYnVmZmVyID0gVFJVRTsKKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisgICAgICAvKiBEb24ndCBib3RoZXIgdG8gdXBzYW1wbGUgYW4gdW5pbnRlcmVzdGluZyBjb21wb25lbnQuICovCisgICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBub29wX3Vwc2FtcGxlOworICAgICAgbmVlZF9idWZmZXIgPSBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgPT0gaF9vdXRfZ3JvdXAgJiYgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgeworICAgICAgLyogRnVsbHNpemUgY29tcG9uZW50cyBjYW4gYmUgcHJvY2Vzc2VkIHdpdGhvdXQgYW55IHdvcmsuICovCisgICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV91cHNhbXBsZTsKKyAgICAgIG5lZWRfYnVmZmVyID0gRkFMU0U7CisgICAgfSBlbHNlIGlmIChoX2luX2dyb3VwICogMiA9PSBoX291dF9ncm91cCAmJgorCSAgICAgICB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7CisgICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDF2IHVwc2FtcGxpbmcgKi8KKyAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpCisJdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9mYW5jeV91cHNhbXBsZTsKKyAgICAgIGVsc2UKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX3Vwc2FtcGxlOworICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKKwkgICAgICAgdl9pbl9ncm91cCAqIDIgPT0gdl9vdXRfZ3JvdXApIHsKKyAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMnYgdXBzYW1wbGluZyAqLworICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikgeworCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZmFuY3lfdXBzYW1wbGU7CisJdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7CisgICAgICB9IGVsc2UKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Vwc2FtcGxlOworICAgIH0gZWxzZSBpZiAoKGhfb3V0X2dyb3VwICUgaF9pbl9ncm91cCkgPT0gMCAmJgorCSAgICAgICAodl9vdXRfZ3JvdXAgJSB2X2luX2dyb3VwKSA9PSAwKSB7CisgICAgICAvKiBHZW5lcmljIGludGVncmFsLWZhY3RvcnMgdXBzYW1wbGluZyBtZXRob2QgKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGludF91cHNhbXBsZTsKKyAgICAgIHVwc2FtcGxlLT5oX2V4cGFuZFtjaV0gPSAoVUlOVDgpIChoX291dF9ncm91cCAvIGhfaW5fZ3JvdXApOworICAgICAgdXBzYW1wbGUtPnZfZXhwYW5kW2NpXSA9IChVSU5UOCkgKHZfb3V0X2dyb3VwIC8gdl9pbl9ncm91cCk7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgICBpZiAobmVlZF9idWZmZXIpIHsKKyAgICAgIHVwc2FtcGxlLT5jb2xvcl9idWZbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwKKwkJCQkobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9qZHRyYW5zLmMgYi9qZHRyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwYWI3MQotLS0gL2Rldi9udWxsCisrKyBiL2pkdHJhbnMuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIGpkdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGRlY29tcHJlc3Npb24sCisgKiB0aGF0IGlzLCByZWFkaW5nIHJhdyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzIGZyb20gYW4gaW5wdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpkYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisKKy8qCisgKiBSZWFkIHRoZSBjb2VmZmljaWVudCBhcnJheXMgZnJvbSBhIEpQRUcgZmlsZS4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBUaGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW50byBhIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cywKKyAqIG9uZSBwZXIgY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mCisgKiB2aXJ0dWFsLWFycmF5IGRlc2NyaXB0b3JzLiAgVGhlc2UgY2FuIGJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5IHZpYSB0aGUKKyAqIEpQRUcgbWVtb3J5IG1hbmFnZXIsIG9yIGhhbmRlZCBvZmYgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKyAqIFRvIHJlbGVhc2UgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgdmlydHVhbCBhcnJheXMsIGNhbGwKKyAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB3aGVuIGRvbmUgd2l0aCB0aGUgZGF0YS4KKyAqCisgKiBBbiBhbHRlcm5hdGl2ZSB1c2FnZSBpcyB0byBzaW1wbHkgb2J0YWluIGFjY2VzcyB0byB0aGUgY29lZmZpY2llbnQgYXJyYXlzCisgKiBkdXJpbmcgYSBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgVGhpcyBpcyBhbGxvd2VkCisgKiBhZnRlciBhbnkganBlZ19maW5pc2hfb3V0cHV0KCkgY2FsbC4gIFRoZSBhcnJheXMgY2FuIGJlIGFjY2Vzc2VkIHVudGlsCisgKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgaXMgY2FsbGVkLiAgKE5vdGUgdGhhdCBhbnkgY2FsbCB0byB0aGUgbGlicmFyeQorICogbWF5IHJlcG9zaXRpb24gdGhlIGFycmF5cywgc28gZG9uJ3QgcmVseSBvbiBhY2Nlc3NfdmlydF9iYXJyYXkoKSByZXN1bHRzCisgKiB0byBzdGF5IHZhbGlkIGFjcm9zcyBsaWJyYXJ5IGNhbGxzLikKKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgc3VzcGVuZGVkLiAgVGhpcyBjYXNlIG5lZWQgYmUgY2hlY2tlZCBvbmx5IGlmCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KKyAqLworCitHTE9CQUwoanZpcnRfYmFycmF5X3B0ciAqKQoranBlZ19yZWFkX2NvZWZmaWNpZW50cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7CisgICAgLyogRmlyc3QgY2FsbDogaW5pdGlhbGl6ZSBhY3RpdmUgbW9kdWxlcyAqLworICAgIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUkRDT0VGUzsKKyAgfQorICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkRDT0VGUykgeworICAgIC8qIEFic29yYiB3aG9sZSBmaWxlIGludG8gdGhlIGNvZWYgYnVmZmVyICovCisgICAgZm9yICg7OykgeworICAgICAgaW50IHJldGNvZGU7CisgICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisJKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICAvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisJYnJlYWs7CisgICAgICAvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgorCSAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKwlpZiAoKytjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA+PSBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQpIHsKKwkgIC8qIHN0YXJ0dXAgdW5kZXJlc3RpbWF0ZWQgbnVtYmVyIG9mIHNjYW5zOyByYXRjaGV0IHVwIG9uZSBzY2FuICovCisJICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgKz0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBTZXQgc3RhdGUgc28gdGhhdCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nICovCisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKKyAgfQorICAvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBiZSBpbiBzdGF0ZSBEU1RBVEVfU1RPUFBJTkcgaWYgYmVpbmcgdXNlZAorICAgKiBzdGFuZGFsb25lLCBvciBpbiBzdGF0ZSBEU1RBVEVfQlVGSU1BR0UgaWYgYmVpbmcgaW52b2tlZCB0byBnZXQgYWNjZXNzCisgICAqIHRvIHRoZSBjb2VmZmljaWVudHMgZHVyaW5nIGEgZnVsbCBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24uCisgICAqLworICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NUT1BQSU5HIHx8CisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpICYmIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIHJldHVybiBjaW5mby0+Y29lZi0+Y29lZl9hcnJheXM7CisgIH0KKyAgLyogT29wcywgaW1wcm9wZXIgdXNhZ2UgKi8KKyAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIE5VTEw7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLworfQorCisKKy8qCisgKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGRlY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqZG1hc3Rlci5jJ3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZ1bGwgZGVjb21wcmVzc29yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgYnVmZmVyZWQtaW1hZ2Ugb3BlcmF0aW9uLiAqLworICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBUUlVFOworCisgIC8qIEVudHJvcHkgZGVjb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgICBqaW5pdF9waHVmZl9kZWNvZGVyKGNpbmZvKTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgIGppbml0X2h1ZmZfZGVjb2RlcihjaW5mbyk7CisgIH0KKworICAvKiBBbHdheXMgZ2V0IGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIuICovCisgIGppbml0X2RfY29lZl9jb250cm9sbGVyKGNpbmZvLCBUUlVFKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogSW5pdGlhbGl6ZSBpbnB1dCBzaWRlIG9mIGRlY29tcHJlc3NvciB0byBjb25zdW1lIGZpcnN0IHNjYW4uICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5zdGFydF9pbnB1dF9wYXNzKSAoY2luZm8pOworCisgIC8qIEluaXRpYWxpemUgcHJvZ3Jlc3MgbW9uaXRvcmluZy4gKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgaW50IG5zY2FuczsKKyAgICAvKiBFc3RpbWF0ZSBudW1iZXIgb2Ygc2NhbnMgdG8gc2V0IHBhc3NfbGltaXQuICovCisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBBcmJpdHJhcmlseSBlc3RpbWF0ZSAyIGludGVybGVhdmVkIERDIHNjYW5zICsgMyBBQyBzY2Fucy9jb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSAyICsgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zKSB7CisgICAgICAvKiBGb3IgYSBub25wcm9ncmVzc2l2ZSBtdWx0aXNjYW4gZmlsZSwgZXN0aW1hdGUgMSBzY2FuIHBlciBjb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgfSBlbHNlIHsKKyAgICAgIG5zY2FucyA9IDE7CisgICAgfQorICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gMEw7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBuc2NhbnM7CisgICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gMDsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IDE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2plcnJvci5jIGIvamVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhN2JlOAotLS0gL2Rldi9udWxsCisrKyBiL2plcnJvci5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogamVycm9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgZXJyb3ItcmVwb3J0aW5nIGFuZCB0cmFjZS1tZXNzYWdlIHJvdXRpbmVzLgorICogVGhlc2UgYXJlIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyBhbmQgb3RoZXJzIHdoZXJlIHdyaXRpbmcgdG8KKyAqIHN0ZGVyciBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIHdhbnQgdG8gcmVwbGFjZQorICogc29tZSBvciBhbGwgb2YgdGhlc2Ugcm91dGluZXMuCisgKgorICogSWYgeW91IGRlZmluZSBVU0VfV0lORE9XU19NRVNTQUdFQk9YIGluIGpjb25maWcuaCBvciBpbiB0aGUgbWFrZWZpbGUsCisgKiB5b3UgZ2V0IGEgV2luZG93cy1zcGVjaWZpYyBoYWNrIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMgaW4gYSBkaWFsb2cgYm94LgorICogSXQgYWluJ3QgbXVjaCwgYnV0IGl0IGJlYXRzIGRyb3BwaW5nIGVycm9yIG1lc3NhZ2VzIGludG8gdGhlIGJpdCBidWNrZXQsCisgKiB3aGljaCBpcyB3aGF0IGhhcHBlbnMgdG8gb3V0cHV0IHRvIHN0ZGVyciB1bmRlciBtb3N0IFdpbmRvd3MgQyBjb21waWxlcnMuCisgKgorICogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgYm90aCB0aGUgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZS4KKyAqLworCisvKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAianZlcnNpb24uaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIKKworI2lmZGVmIFVTRV9XSU5ET1dTX01FU1NBR0VCT1gKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCisjZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQorI2VuZGlmCisKKworLyoKKyAqIENyZWF0ZSB0aGUgbWVzc2FnZSBzdHJpbmcgdGFibGUuCisgKiBXZSBkbyB0aGlzIGZyb20gdGhlIG1hc3RlciBtZXNzYWdlIGxpc3QgaW4gamVycm9yLmggYnkgcmUtcmVhZGluZworICogamVycm9yLmggd2l0aCBhIHN1aXRhYmxlIGRlZmluaXRpb24gZm9yIG1hY3JvIEpNRVNTQUdFLgorICogVGhlIG1lc3NhZ2UgdGFibGUgaXMgbWFkZSBhbiBleHRlcm5hbCBzeW1ib2wganVzdCBpbiBjYXNlIGFueSBhcHBsaWNhdGlvbnMKKyAqIHdhbnQgdG8gcmVmZXIgdG8gaXQgZGlyZWN0bHkuCisgKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19zdGRfbWVzc2FnZV90YWJsZQlqTXNnVGFibGUKKyNlbmRpZgorCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQlzdHJpbmcgLAorCitjb25zdCBjaGFyICogY29uc3QganBlZ19zdGRfbWVzc2FnZV90YWJsZVtdID0geworI2luY2x1ZGUgImplcnJvci5oIgorICBOVUxMCit9OworCisKKy8qCisgKiBFcnJvciBleGl0IGhhbmRsZXI6IG11c3Qgbm90IHJldHVybiB0byBjYWxsZXIuCisgKgorICogQXBwbGljYXRpb25zIG1heSBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2FudCB0byBnZXQgY29udHJvbCBiYWNrIGFmdGVyCisgKiBhbiBlcnJvci4gIFR5cGljYWxseSBvbmUgd291bGQgbG9uZ2ptcCBzb21ld2hlcmUgaW5zdGVhZCBvZiBleGl0aW5nLgorICogVGhlIHNldGptcCBidWZmZXIgY2FuIGJlIG1hZGUgYSBwcml2YXRlIGZpZWxkIHdpdGhpbiBhbiBleHBhbmRlZCBlcnJvcgorICogaGFuZGxlciBvYmplY3QuICBOb3RlIHRoYXQgdGhlIGluZm8gbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UKKyAqIGlzIHN0b3JlZCBpbiB0aGUgZXJyb3Igb2JqZWN0LCBzbyB5b3UgY2FuIGdlbmVyYXRlIHRoZSBtZXNzYWdlIG5vdyBvcgorICogbGF0ZXIsIGF0IHlvdXIgY29udmVuaWVuY2UuCisgKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwICh3aXRoIGpwZWdfYWJvcnQKKyAqIG9yIGpwZWdfZGVzdHJveSkgYXQgc29tZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2Vycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogQWx3YXlzIGRpc3BsYXkgdGhlIG1lc3NhZ2UgKi8KKyAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKKworICAvKiBMZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllICovCisgIGpwZWdfZGVzdHJveShjaW5mbyk7CisKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKKy8qCisgKiBBY3R1YWwgb3V0cHV0IG9mIGFuIGVycm9yIG9yIHRyYWNlIG1lc3NhZ2UuCisgKiBBcHBsaWNhdGlvbnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHNlbmQgSlBFRyBtZXNzYWdlcyBzb21ld2hlcmUKKyAqIG90aGVyIHRoYW4gc3RkZXJyLgorICoKKyAqIE9uIFdpbmRvd3MsIHByaW50aW5nIHRvIHN0ZGVyciBpcyBnZW5lcmFsbHkgY29tcGxldGVseSB1c2VsZXNzLAorICogc28gd2UgcHJvdmlkZSBvcHRpb25hbCBjb2RlIHRvIHByb2R1Y2UgYW4gZXJyb3ItZGlhbG9nIHBvcHVwLgorICogTW9zdCBXaW5kb3dzIGFwcGxpY2F0aW9ucyB3aWxsIHN0aWxsIHByZWZlciB0byBvdmVycmlkZSB0aGlzIHJvdXRpbmUsCisgKiBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgZG8gc29tZXRoaW5nIGF0IGxlYXN0IG1hcmdpbmFsbHkgdXNlZnVsLgorICoKKyAqIE5PVEU6IHRvIHVzZSB0aGUgbGlicmFyeSBpbiBhbiBlbnZpcm9ubWVudCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKKyAqIEMgc3RkaW8gbGlicmFyeSwgeW91IG1heSBoYXZlIHRvIGRlbGV0ZSB0aGUgY2FsbCB0byBmcHJpbnRmKCkgZW50aXJlbHksCisgKiBub3QganVzdCBub3QgdXNlIHRoaXMgcm91dGluZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK291dHB1dF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIGNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKyAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCisgICgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpIChjaW5mbywgYnVmZmVyKTsKKworI2lmZGVmIFVTRV9XSU5ET1dTX01FU1NBR0VCT1gKKyAgLyogRGlzcGxheSBpdCBpbiBhIG1lc3NhZ2UgZGlhbG9nIGJveCAqLworICBNZXNzYWdlQm94KEdldEFjdGl2ZVdpbmRvdygpLCBidWZmZXIsICJKUEVHIExpYnJhcnkgRXJyb3IiLAorCSAgICAgTUJfT0sgfCBNQl9JQ09ORVJST1IpOworI2Vsc2UKKyAgLyogU2VuZCBpdCB0byBzdGRlcnIsIGFkZGluZyBhIG5ld2xpbmUgKi8KKyAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVmZmVyKTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBEZWNpZGUgd2hldGhlciB0byBlbWl0IGEgdHJhY2Ugb3Igd2FybmluZyBtZXNzYWdlLgorICogbXNnX2xldmVsIGlzIG9uZSBvZjoKKyAqICAgLTE6IHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSB3YXJuaW5nLCBtYXkgd2FudCB0byBhYm9ydC4KKyAqICAgIDA6IGltcG9ydGFudCBhZHZpc29yeSBtZXNzYWdlcyAoYWx3YXlzIGRpc3BsYXkgdG8gdXNlcikuCisgKiAgICAxOiBmaXJzdCBsZXZlbCBvZiB0cmFjaW5nIGRldGFpbC4KKyAqICAgIDIsMywuLi46IHN1Y2Nlc3NpdmVseSBtb3JlIGRldGFpbGVkIHRyYWNpbmcgbWVzc2FnZXMuCisgKiBBbiBhcHBsaWNhdGlvbiBtaWdodCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBpdCB3YW50ZWQgdG8gYWJvcnQgb24gd2FybmluZ3MKKyAqIG9yIGNoYW5nZSB0aGUgcG9saWN5IGFib3V0IHdoaWNoIG1lc3NhZ2VzIHRvIGRpc3BsYXkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitlbWl0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkKK3sKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKKworICBpZiAobXNnX2xldmVsIDwgMCkgeworICAgIC8qIEl0J3MgYSB3YXJuaW5nIG1lc3NhZ2UuICBTaW5jZSBjb3JydXB0IGZpbGVzIG1heSBnZW5lcmF0ZSBtYW55IHdhcm5pbmdzLAorICAgICAqIHRoZSBwb2xpY3kgaW1wbGVtZW50ZWQgaGVyZSBpcyB0byBzaG93IG9ubHkgdGhlIGZpcnN0IHdhcm5pbmcsCisgICAgICogdW5sZXNzIHRyYWNlX2xldmVsID49IDMuCisgICAgICovCisgICAgaWYgKGVyci0+bnVtX3dhcm5pbmdzID09IDAgfHwgZXJyLT50cmFjZV9sZXZlbCA+PSAzKQorICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOworICAgIC8qIEFsd2F5cyBjb3VudCB3YXJuaW5ncyBpbiBudW1fd2FybmluZ3MuICovCisgICAgZXJyLT5udW1fd2FybmluZ3MrKzsKKyAgfSBlbHNlIHsKKyAgICAvKiBJdCdzIGEgdHJhY2UgbWVzc2FnZS4gIFNob3cgaXQgaWYgdHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsLiAqLworICAgIGlmIChlcnItPnRyYWNlX2xldmVsID49IG1zZ19sZXZlbCkKKyAgICAgICgqZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKKyAgfQorfQorCisKKy8qCisgKiBGb3JtYXQgYSBtZXNzYWdlIHN0cmluZyBmb3IgdGhlIG1vc3QgcmVjZW50IEpQRUcgZXJyb3Igb3IgbWVzc2FnZS4KKyAqIFRoZSBtZXNzYWdlIGlzIHN0b3JlZCBpbnRvIGJ1ZmZlciwgd2hpY2ggc2hvdWxkIGJlIGF0IGxlYXN0IEpNU0dfTEVOR1RIX01BWAorICogY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBubyAnXG4nIGNoYXJhY3RlciBpcyBhZGRlZCB0byB0aGUgc3RyaW5nLgorICogRmV3IGFwcGxpY2F0aW9ucyBzaG91bGQgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2Zvcm1hdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpCit7CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVyciA9IGNpbmZvLT5lcnI7CisgIGludCBtc2dfY29kZSA9IGVyci0+bXNnX2NvZGU7CisgIGNvbnN0IGNoYXIgKiBtc2d0ZXh0ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqIG1zZ3B0cjsKKyAgY2hhciBjaDsKKyAgYm9vbGVhbiBpc3N0cmluZzsKKworICAvKiBMb29rIHVwIG1lc3NhZ2Ugc3RyaW5nIGluIHByb3BlciB0YWJsZSAqLworICBpZiAobXNnX2NvZGUgPiAwICYmIG1zZ19jb2RlIDw9IGVyci0+bGFzdF9qcGVnX21lc3NhZ2UpIHsKKyAgICBtc2d0ZXh0ID0gZXJyLT5qcGVnX21lc3NhZ2VfdGFibGVbbXNnX2NvZGVdOworICB9IGVsc2UgaWYgKGVyci0+YWRkb25fbWVzc2FnZV90YWJsZSAhPSBOVUxMICYmCisJICAgICBtc2dfY29kZSA+PSBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgJiYKKwkgICAgIG1zZ19jb2RlIDw9IGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlKSB7CisgICAgbXNndGV4dCA9IGVyci0+YWRkb25fbWVzc2FnZV90YWJsZVttc2dfY29kZSAtIGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZV07CisgIH0KKworICAvKiBEZWZlbmQgYWdhaW5zdCBib2d1cyBtZXNzYWdlIG51bWJlciAqLworICBpZiAobXNndGV4dCA9PSBOVUxMKSB7CisgICAgZXJyLT5tc2dfcGFybS5pWzBdID0gbXNnX2NvZGU7CisgICAgbXNndGV4dCA9IGVyci0+anBlZ19tZXNzYWdlX3RhYmxlWzBdOworICB9CisKKyAgLyogQ2hlY2sgZm9yIHN0cmluZyBwYXJhbWV0ZXIsIGFzIGluZGljYXRlZCBieSAlcyBpbiB0aGUgbWVzc2FnZSB0ZXh0ICovCisgIGlzc3RyaW5nID0gRkFMU0U7CisgIG1zZ3B0ciA9IG1zZ3RleHQ7CisgIHdoaWxlICgoY2ggPSAqbXNncHRyKyspICE9ICdcMCcpIHsKKyAgICBpZiAoY2ggPT0gJyUnKSB7CisgICAgICBpZiAoKm1zZ3B0ciA9PSAncycpIGlzc3RyaW5nID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEZvcm1hdCB0aGUgbWVzc2FnZSBpbnRvIHRoZSBwYXNzZWQgYnVmZmVyICovCisgIGlmIChpc3N0cmluZykKKyAgICBzcHJpbnRmKGJ1ZmZlciwgbXNndGV4dCwgZXJyLT5tc2dfcGFybS5zKTsKKyAgZWxzZQorICAgIHNwcmludGYoYnVmZmVyLCBtc2d0ZXh0LAorCSAgICBlcnItPm1zZ19wYXJtLmlbMF0sIGVyci0+bXNnX3Bhcm0uaVsxXSwKKwkgICAgZXJyLT5tc2dfcGFybS5pWzJdLCBlcnItPm1zZ19wYXJtLmlbM10sCisJICAgIGVyci0+bXNnX3Bhcm0uaVs0XSwgZXJyLT5tc2dfcGFybS5pWzVdLAorCSAgICBlcnItPm1zZ19wYXJtLmlbNl0sIGVyci0+bXNnX3Bhcm0uaVs3XSk7Cit9CisKKworLyoKKyAqIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZS4KKyAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwIHRvIHJlc2V0IHRyYWNlL2Vycm9yCisgKiBwcm9jZXNzaW5nIHRvIGRlZmF1bHQgc3RhdGUsIHdpdGhvdXQgbG9zaW5nIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYworICogbWV0aG9kIHBvaW50ZXJzLiAgQW4gYXBwbGljYXRpb24gbWlnaHQgcG9zc2libHkgd2FudCB0byBvdmVycmlkZQorICogdGhpcyBtZXRob2QgaWYgaXQgaGFzIGFkZGl0aW9uYWwgZXJyb3IgcHJvY2Vzc2luZyBzdGF0ZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Jlc2V0X2Vycm9yX21nciAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBjaW5mby0+ZXJyLT5udW1fd2FybmluZ3MgPSAwOworICAvKiB0cmFjZV9sZXZlbCBpcyBub3QgcmVzZXQgc2luY2UgaXQgaXMgYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgcGFyYW1ldGVyICovCisgIGNpbmZvLT5lcnItPm1zZ19jb2RlID0gMDsJLyogbWF5IGJlIHVzZWZ1bCBhcyBhIGZsYWcgZm9yICJubyBlcnJvciIgKi8KK30KKworCisvKgorICogRmlsbCBpbiB0aGUgc3RhbmRhcmQgZXJyb3ItaGFuZGxpbmcgbWV0aG9kcyBpbiBhIGpwZWdfZXJyb3JfbWdyIG9iamVjdC4KKyAqIFR5cGljYWwgY2FsbCBpczoKKyAqCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAqCXN0cnVjdCBqcGVnX2Vycm9yX21nciBlcnI7CisgKgorICoJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmVycik7CisgKiBhZnRlciB3aGljaCB0aGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHNvbWUgb2YgdGhlIG1ldGhvZHMuCisgKi8KKworR0xPQkFMKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKQoranBlZ19zdGRfZXJyb3IgKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikKK3sKKyAgZXJyLT5lcnJvcl9leGl0ID0gZXJyb3JfZXhpdDsKKyAgZXJyLT5lbWl0X21lc3NhZ2UgPSBlbWl0X21lc3NhZ2U7CisgIGVyci0+b3V0cHV0X21lc3NhZ2UgPSBvdXRwdXRfbWVzc2FnZTsKKyAgZXJyLT5mb3JtYXRfbWVzc2FnZSA9IGZvcm1hdF9tZXNzYWdlOworICBlcnItPnJlc2V0X2Vycm9yX21nciA9IHJlc2V0X2Vycm9yX21ncjsKKworICBlcnItPnRyYWNlX2xldmVsID0gMDsJCS8qIGRlZmF1bHQgPSBubyB0cmFjaW5nICovCisgIGVyci0+bnVtX3dhcm5pbmdzID0gMDsJLyogbm8gd2FybmluZ3MgZW1pdHRlZCB5ZXQgKi8KKyAgZXJyLT5tc2dfY29kZSA9IDA7CQkvKiBtYXkgYmUgdXNlZnVsIGFzIGEgZmxhZyBmb3IgIm5vIGVycm9yIiAqLworCisgIC8qIEluaXRpYWxpemUgbWVzc2FnZSB0YWJsZSBwb2ludGVycyAqLworICBlcnItPmpwZWdfbWVzc2FnZV90YWJsZSA9IGpwZWdfc3RkX21lc3NhZ2VfdGFibGU7CisgIGVyci0+bGFzdF9qcGVnX21lc3NhZ2UgPSAoaW50KSBKTVNHX0xBU1RNU0dDT0RFIC0gMTsKKworICBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgPSBOVUxMOworICBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgPSAwOwkvKiBmb3Igc2FmZXR5ICovCisgIGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlID0gMDsKKworICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvamVycm9yLmggYi9qZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzJmZmZlCi0tLSAvZGV2L251bGwKKysrIGIvamVycm9yLmgKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBqZXJyb3IuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGVycm9yIGFuZCBtZXNzYWdlIGNvZGVzIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgorICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KKyAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCisgKiBBIHNldCBvZiBlcnJvci1yZXBvcnRpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIHRvby4gIFNvbWUgYXBwbGljYXRpb25zIHVzaW5nCisgKiB0aGUgSlBFRyBsaWJyYXJ5IG1heSB3aXNoIHRvIGluY2x1ZGUgdGhpcyBmaWxlIHRvIGdldCB0aGUgZXJyb3IgY29kZXMKKyAqIGFuZC9vciB0aGUgbWFjcm9zLgorICovCisKKy8qCisgKiBUbyBkZWZpbmUgdGhlIGVudW0gbGlzdCBvZiBtZXNzYWdlIGNvZGVzLCBpbmNsdWRlIHRoaXMgZmlsZSB3aXRob3V0CisgKiBkZWZpbmluZyBtYWNybyBKTUVTU0FHRS4gIFRvIGNyZWF0ZSBhIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLCBpbmNsdWRlIGl0CisgKiBhZ2FpbiB3aXRoIGEgc3VpdGFibGUgSk1FU1NBR0UgZGVmaW5pdGlvbiAoc2VlIGplcnJvci5jIGZvciBhbiBleGFtcGxlKS4KKyAqLworI2lmbmRlZiBKTUVTU0FHRQorI2lmbmRlZiBKRVJST1JfSAorLyogRmlyc3QgdGltZSB0aHJvdWdoLCBkZWZpbmUgdGhlIGVudW0gbGlzdCAqLworI2RlZmluZSBKTUFLRV9FTlVNX0xJU1QKKyNlbHNlCisvKiBSZXBlYXRlZCBpbmNsdXNpb25zIG9mIHRoaXMgZmlsZSBhcmUgbm8tb3BzIHVubGVzcyBKTUVTU0FHRSBpcyBkZWZpbmVkICovCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQorI2VuZGlmIC8qIEpFUlJPUl9IICovCisjZW5kaWYgLyogSk1FU1NBR0UgKi8KKworI2lmZGVmIEpNQUtFX0VOVU1fTElTVAorCit0eXBlZGVmIGVudW0geworCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQljb2RlICwKKworI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLworCitKTUVTU0FHRShKTVNHX05PTUVTU0FHRSwgIkJvZ3VzIG1lc3NhZ2UgY29kZSAlZCIpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCisKKy8qIEZvciBtYWludGVuYW5jZSBjb252ZW5pZW5jZSwgbGlzdCBpcyBhbHBoYWJldGljYWwgYnkgbWVzc2FnZSBjb2RlIG5hbWUgKi8KK0pNRVNTQUdFKEpFUlJfQVJJVEhfTk9USU1QTCwKKwkgIlNvcnJ5LCB0aGVyZSBhcmUgbGVnYWwgcmVzdHJpY3Rpb25zIG9uIGFyaXRobWV0aWMgY29kaW5nIikKK0pNRVNTQUdFKEpFUlJfQkFEX0FMSUdOX1RZUEUsICJBTElHTl9UWVBFIGlzIHdyb25nLCBwbGVhc2UgZml4IikKK0pNRVNTQUdFKEpFUlJfQkFEX0FMTE9DX0NIVU5LLCAiTUFYX0FMTE9DX0NIVU5LIGlzIHdyb25nLCBwbGVhc2UgZml4IikKK0pNRVNTQUdFKEpFUlJfQkFEX0JVRkZFUl9NT0RFLCAiQm9ndXMgYnVmZmVyIGNvbnRyb2wgbW9kZSIpCitKTUVTU0FHRShKRVJSX0JBRF9DT01QT05FTlRfSUQsICJJbnZhbGlkIGNvbXBvbmVudCBJRCAlZCBpbiBTT1MiKQorSk1FU1NBR0UoSkVSUl9CQURfRENUX0NPRUYsICJEQ1QgY29lZmZpY2llbnQgb3V0IG9mIHJhbmdlIikKK0pNRVNTQUdFKEpFUlJfQkFEX0RDVFNJWkUsICJJRENUIG91dHB1dCBibG9jayBzaXplICVkIG5vdCBzdXBwb3J0ZWQiKQorSk1FU1NBR0UoSkVSUl9CQURfSFVGRl9UQUJMRSwgIkJvZ3VzIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiIpCitKTUVTU0FHRShKRVJSX0JBRF9JTl9DT0xPUlNQQUNFLCAiQm9ndXMgaW5wdXQgY29sb3JzcGFjZSIpCitKTUVTU0FHRShKRVJSX0JBRF9KX0NPTE9SU1BBQ0UsICJCb2d1cyBKUEVHIGNvbG9yc3BhY2UiKQorSk1FU1NBR0UoSkVSUl9CQURfTEVOR1RILCAiQm9ndXMgbWFya2VyIGxlbmd0aCIpCitKTUVTU0FHRShKRVJSX0JBRF9MSUJfVkVSU0lPTiwKKwkgIldyb25nIEpQRUcgbGlicmFyeSB2ZXJzaW9uOiBsaWJyYXJ5IGlzICVkLCBjYWxsZXIgZXhwZWN0cyAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9NQ1VfU0laRSwgIlNhbXBsaW5nIGZhY3RvcnMgdG9vIGxhcmdlIGZvciBpbnRlcmxlYXZlZCBzY2FuIikKK0pNRVNTQUdFKEpFUlJfQkFEX1BPT0xfSUQsICJJbnZhbGlkIG1lbW9yeSBwb29sIGNvZGUgJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfUFJFQ0lTSU9OLCAiVW5zdXBwb3J0ZWQgSlBFRyBkYXRhIHByZWNpc2lvbiAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9QUk9HUkVTU0lPTiwKKwkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBTcz0lZCBTZT0lZCBBaD0lZCBBbD0lZCIpCitKTUVTU0FHRShKRVJSX0JBRF9QUk9HX1NDUklQVCwKKwkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBhdCBzY2FuIHNjcmlwdCBlbnRyeSAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9TQU1QTElORywgIkJvZ3VzIHNhbXBsaW5nIGZhY3RvcnMiKQorSk1FU1NBR0UoSkVSUl9CQURfU0NBTl9TQ1JJUFQsICJJbnZhbGlkIHNjYW4gc2NyaXB0IGF0IGVudHJ5ICVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX1NUQVRFLCAiSW1wcm9wZXIgY2FsbCB0byBKUEVHIGxpYnJhcnkgaW4gc3RhdGUgJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfU1RSVUNUX1NJWkUsCisJICJKUEVHIHBhcmFtZXRlciBzdHJ1Y3QgbWlzbWF0Y2g6IGxpYnJhcnkgdGhpbmtzIHNpemUgaXMgJXUsIGNhbGxlciBleHBlY3RzICV1IikKK0pNRVNTQUdFKEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTLCAiQm9ndXMgdmlydHVhbCBhcnJheSBhY2Nlc3MiKQorSk1FU1NBR0UoSkVSUl9CVUZGRVJfU0laRSwgIkJ1ZmZlciBwYXNzZWQgdG8gSlBFRyBsaWJyYXJ5IGlzIHRvbyBzbWFsbCIpCitKTUVTU0FHRShKRVJSX0NBTlRfU1VTUEVORCwgIlN1c3BlbnNpb24gbm90IGFsbG93ZWQgaGVyZSIpCitKTUVTU0FHRShKRVJSX0NDSVI2MDFfTk9USU1QTCwgIkNDSVI2MDEgc2FtcGxpbmcgbm90IGltcGxlbWVudGVkIHlldCIpCitKTUVTU0FHRShKRVJSX0NPTVBPTkVOVF9DT1VOVCwgIlRvbyBtYW55IGNvbG9yIGNvbXBvbmVudHM6ICVkLCBtYXggJWQiKQorSk1FU1NBR0UoSkVSUl9DT05WRVJTSU9OX05PVElNUEwsICJVbnN1cHBvcnRlZCBjb2xvciBjb252ZXJzaW9uIHJlcXVlc3QiKQorSk1FU1NBR0UoSkVSUl9EQUNfSU5ERVgsICJCb2d1cyBEQUMgaW5kZXggJWQiKQorSk1FU1NBR0UoSkVSUl9EQUNfVkFMVUUsICJCb2d1cyBEQUMgdmFsdWUgMHgleCIpCitKTUVTU0FHRShKRVJSX0RIVF9JTkRFWCwgIkJvZ3VzIERIVCBpbmRleCAlZCIpCitKTUVTU0FHRShKRVJSX0RRVF9JTkRFWCwgIkJvZ3VzIERRVCBpbmRleCAlZCIpCitKTUVTU0FHRShKRVJSX0VNUFRZX0lNQUdFLCAiRW1wdHkgSlBFRyBpbWFnZSAoRE5MIG5vdCBzdXBwb3J0ZWQpIikKK0pNRVNTQUdFKEpFUlJfRU1TX1JFQUQsICJSZWFkIGZyb20gRU1TIGZhaWxlZCIpCitKTUVTU0FHRShKRVJSX0VNU19XUklURSwgIldyaXRlIHRvIEVNUyBmYWlsZWQiKQorSk1FU1NBR0UoSkVSUl9FT0lfRVhQRUNURUQsICJEaWRuJ3QgZXhwZWN0IG1vcmUgdGhhbiBvbmUgc2NhbiIpCitKTUVTU0FHRShKRVJSX0ZJTEVfUkVBRCwgIklucHV0IGZpbGUgcmVhZCBlcnJvciIpCitKTUVTU0FHRShKRVJSX0ZJTEVfV1JJVEUsICJPdXRwdXQgZmlsZSB3cml0ZSBlcnJvciAtLS0gb3V0IG9mIGRpc2sgc3BhY2U/IikKK0pNRVNTQUdFKEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwsICJGcmFjdGlvbmFsIHNhbXBsaW5nIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKQorSk1FU1NBR0UoSkVSUl9IVUZGX0NMRU5fT1ZFUkZMT1csICJIdWZmbWFuIGNvZGUgc2l6ZSB0YWJsZSBvdmVyZmxvdyIpCitKTUVTU0FHRShKRVJSX0hVRkZfTUlTU0lOR19DT0RFLCAiTWlzc2luZyBIdWZmbWFuIGNvZGUgdGFibGUgZW50cnkiKQorSk1FU1NBR0UoSkVSUl9JTUFHRV9UT09fQklHLCAiTWF4aW11bSBzdXBwb3J0ZWQgaW1hZ2UgZGltZW5zaW9uIGlzICV1IHBpeGVscyIpCitKTUVTU0FHRShKRVJSX0lOUFVUX0VNUFRZLCAiRW1wdHkgaW5wdXQgZmlsZSIpCitKTUVTU0FHRShKRVJSX0lOUFVUX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgaW5wdXQgZmlsZSIpCitKTUVTU0FHRShKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsCisJICJDYW5ub3QgdHJhbnNjb2RlIGR1ZSB0byBtdWx0aXBsZSB1c2Ugb2YgcXVhbnRpemF0aW9uIHRhYmxlICVkIikKK0pNRVNTQUdFKEpFUlJfTUlTU0lOR19EQVRBLCAiU2NhbiBzY3JpcHQgZG9lcyBub3QgdHJhbnNtaXQgYWxsIGRhdGEiKQorSk1FU1NBR0UoSkVSUl9NT0RFX0NIQU5HRSwgIkludmFsaWQgY29sb3IgcXVhbnRpemF0aW9uIG1vZGUgY2hhbmdlIikKK0pNRVNTQUdFKEpFUlJfTk9USU1QTCwgIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKQorSk1FU1NBR0UoSkVSUl9OT1RfQ09NUElMRUQsICJSZXF1ZXN0ZWQgZmVhdHVyZSB3YXMgb21pdHRlZCBhdCBjb21waWxlIHRpbWUiKQorSk1FU1NBR0UoSkVSUl9OT19CQUNLSU5HX1NUT1JFLCAiQmFja2luZyBzdG9yZSBub3Qgc3VwcG9ydGVkIikKK0pNRVNTQUdFKEpFUlJfTk9fSFVGRl9UQUJMRSwgIkh1ZmZtYW4gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCitKTUVTU0FHRShKRVJSX05PX0lNQUdFLCAiSlBFRyBkYXRhc3RyZWFtIGNvbnRhaW5zIG5vIGltYWdlIikKK0pNRVNTQUdFKEpFUlJfTk9fUVVBTlRfVEFCTEUsICJRdWFudGl6YXRpb24gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCitKTUVTU0FHRShKRVJSX05PX1NPSSwgIk5vdCBhIEpQRUcgZmlsZTogc3RhcnRzIHdpdGggMHglMDJ4IDB4JTAyeCIpCitKTUVTU0FHRShKRVJSX09VVF9PRl9NRU1PUlksICJJbnN1ZmZpY2llbnQgbWVtb3J5IChjYXNlICVkKSIpCitKTUVTU0FHRShKRVJSX1FVQU5UX0NPTVBPTkVOVFMsCisJICJDYW5ub3QgcXVhbnRpemUgbW9yZSB0aGFuICVkIGNvbG9yIGNvbXBvbmVudHMiKQorSk1FU1NBR0UoSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCAiQ2Fubm90IHF1YW50aXplIHRvIGZld2VyIHRoYW4gJWQgY29sb3JzIikKK0pNRVNTQUdFKEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsICJDYW5ub3QgcXVhbnRpemUgdG8gbW9yZSB0aGFuICVkIGNvbG9ycyIpCitKTUVTU0FHRShKRVJSX1NPRl9EVVBMSUNBVEUsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IHR3byBTT0YgbWFya2VycyIpCitKTUVTU0FHRShKRVJSX1NPRl9OT19TT1MsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IG1pc3NpbmcgU09TIG1hcmtlciIpCitKTUVTU0FHRShKRVJSX1NPRl9VTlNVUFBPUlRFRCwgIlVuc3VwcG9ydGVkIEpQRUcgcHJvY2VzczogU09GIHR5cGUgMHglMDJ4IikKK0pNRVNTQUdFKEpFUlJfU09JX0RVUExJQ0FURSwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogdHdvIFNPSSBtYXJrZXJzIikKK0pNRVNTQUdFKEpFUlJfU09TX05PX1NPRiwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogU09TIGJlZm9yZSBTT0YiKQorSk1FU1NBR0UoSkVSUl9URklMRV9DUkVBVEUsICJGYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIikKK0pNRVNTQUdFKEpFUlJfVEZJTEVfUkVBRCwgIlJlYWQgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfVEZJTEVfU0VFSywgIlNlZWsgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfVEZJTEVfV1JJVEUsCisJICJXcml0ZSBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUgLS0tIG91dCBvZiBkaXNrIHNwYWNlPyIpCitKTUVTU0FHRShKRVJSX1RPT19MSVRUTEVfREFUQSwgIkFwcGxpY2F0aW9uIHRyYW5zZmVycmVkIHRvbyBmZXcgc2NhbmxpbmVzIikKK0pNRVNTQUdFKEpFUlJfVU5LTk9XTl9NQVJLRVIsICJVbnN1cHBvcnRlZCBtYXJrZXIgdHlwZSAweCUwMngiKQorSk1FU1NBR0UoSkVSUl9WSVJUVUFMX0JVRywgIlZpcnR1YWwgYXJyYXkgY29udHJvbGxlciBtZXNzZWQgdXAiKQorSk1FU1NBR0UoSkVSUl9XSURUSF9PVkVSRkxPVywgIkltYWdlIHRvbyB3aWRlIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIikKK0pNRVNTQUdFKEpFUlJfWE1TX1JFQUQsICJSZWFkIGZyb20gWE1TIGZhaWxlZCIpCitKTUVTU0FHRShKRVJSX1hNU19XUklURSwgIldyaXRlIHRvIFhNUyBmYWlsZWQiKQorSk1FU1NBR0UoSk1TR19DT1BZUklHSFQsIEpDT1BZUklHSFQpCitKTUVTU0FHRShKTVNHX1ZFUlNJT04sIEpWRVJTSU9OKQorSk1FU1NBR0UoSlRSQ18xNkJJVF9UQUJMRVMsCisJICJDYXV0aW9uOiBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB0b28gY29hcnNlIGZvciBiYXNlbGluZSBKUEVHIikKK0pNRVNTQUdFKEpUUkNfQURPQkUsCisJICJBZG9iZSBBUFAxNCBtYXJrZXI6IHZlcnNpb24gJWQsIGZsYWdzIDB4JTA0eCAweCUwNHgsIHRyYW5zZm9ybSAlZCIpCitKTUVTU0FHRShKVFJDX0FQUDAsICJVbmtub3duIEFQUDAgbWFya2VyIChub3QgSkZJRiksIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX0FQUDE0LCAiVW5rbm93biBBUFAxNCBtYXJrZXIgKG5vdCBBZG9iZSksIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX0RBQywgIkRlZmluZSBBcml0aG1ldGljIFRhYmxlIDB4JTAyeDogMHglMDJ4IikKK0pNRVNTQUdFKEpUUkNfREhULCAiRGVmaW5lIEh1ZmZtYW4gVGFibGUgMHglMDJ4IikKK0pNRVNTQUdFKEpUUkNfRFFULCAiRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZSAlZCAgcHJlY2lzaW9uICVkIikKK0pNRVNTQUdFKEpUUkNfRFJJLCAiRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwgJXUiKQorSk1FU1NBR0UoSlRSQ19FTVNfQ0xPU0UsICJGcmVlZCBFTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpUUkNfRU1TX09QRU4sICJPYnRhaW5lZCBFTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpUUkNfRU9JLCAiRW5kIE9mIEltYWdlIikKK0pNRVNTQUdFKEpUUkNfSFVGRkJJVFMsICIgICAgICAgICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QiKQorSk1FU1NBR0UoSlRSQ19KRklGLCAiSkZJRiBBUFAwIG1hcmtlcjogdmVyc2lvbiAlZC4lMDJkLCBkZW5zaXR5ICVkeCVkICAlZCIpCitKTUVTU0FHRShKVFJDX0pGSUZfQkFEVEhVTUJOQUlMU0laRSwKKwkgIldhcm5pbmc6IHRodW1ibmFpbCBpbWFnZSBzaXplIGRvZXMgbm90IG1hdGNoIGRhdGEgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfSkZJRl9FWFRFTlNJT04sCisJICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IHR5cGUgMHglMDJ4LCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19KRklGX1RIVU1CTkFJTCwgIiAgICB3aXRoICVkIHggJWQgdGh1bWJuYWlsIGltYWdlIikKK0pNRVNTQUdFKEpUUkNfTUlTQ19NQVJLRVIsICJNaXNjZWxsYW5lb3VzIG1hcmtlciAweCUwMngsIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX1BBUk1MRVNTX01BUktFUiwgIlVuZXhwZWN0ZWQgbWFya2VyIDB4JTAyeCIpCitKTUVTU0FHRShKVFJDX1FVQU5UVkFMUywgIiAgICAgICAgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSIpCitKTUVTU0FHRShKVFJDX1FVQU5UXzNfTkNPTE9SUywgIlF1YW50aXppbmcgdG8gJWQgPSAlZColZColZCBjb2xvcnMiKQorSk1FU1NBR0UoSlRSQ19RVUFOVF9OQ09MT1JTLCAiUXVhbnRpemluZyB0byAlZCBjb2xvcnMiKQorSk1FU1NBR0UoSlRSQ19RVUFOVF9TRUxFQ1RFRCwgIlNlbGVjdGVkICVkIGNvbG9ycyBmb3IgcXVhbnRpemF0aW9uIikKK0pNRVNTQUdFKEpUUkNfUkVDT1ZFUllfQUNUSU9OLCAiQXQgbWFya2VyIDB4JTAyeCwgcmVjb3ZlcnkgYWN0aW9uICVkIikKK0pNRVNTQUdFKEpUUkNfUlNULCAiUlNUJWQiKQorSk1FU1NBR0UoSlRSQ19TTU9PVEhfTk9USU1QTCwKKwkgIlNtb290aGluZyBub3Qgc3VwcG9ydGVkIHdpdGggbm9uc3RhbmRhcmQgc2FtcGxpbmcgcmF0aW9zIikKK0pNRVNTQUdFKEpUUkNfU09GLCAiU3RhcnQgT2YgRnJhbWUgMHglMDJ4OiB3aWR0aD0ldSwgaGVpZ2h0PSV1LCBjb21wb25lbnRzPSVkIikKK0pNRVNTQUdFKEpUUkNfU09GX0NPTVBPTkVOVCwgIiAgICBDb21wb25lbnQgJWQ6ICVkaHglZHYgcT0lZCIpCitKTUVTU0FHRShKVFJDX1NPSSwgIlN0YXJ0IG9mIEltYWdlIikKK0pNRVNTQUdFKEpUUkNfU09TLCAiU3RhcnQgT2YgU2NhbjogJWQgY29tcG9uZW50cyIpCitKTUVTU0FHRShKVFJDX1NPU19DT01QT05FTlQsICIgICAgQ29tcG9uZW50ICVkOiBkYz0lZCBhYz0lZCIpCitKTUVTU0FHRShKVFJDX1NPU19QQVJBTVMsICIgIFNzPSVkLCBTZT0lZCwgQWg9JWQsIEFsPSVkIikKK0pNRVNTQUdFKEpUUkNfVEZJTEVfQ0xPU0UsICJDbG9zZWQgdGVtcG9yYXJ5IGZpbGUgJXMiKQorSk1FU1NBR0UoSlRSQ19URklMRV9PUEVOLCAiT3BlbmVkIHRlbXBvcmFyeSBmaWxlICVzIikKK0pNRVNTQUdFKEpUUkNfVEhVTUJfSlBFRywKKwkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogSlBFRy1jb21wcmVzc2VkIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfVEhVTUJfUEFMRVRURSwKKwkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogcGFsZXR0ZSB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX1RIVU1CX1JHQiwKKwkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogUkdCIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfVU5LTk9XTl9JRFMsCisJICJVbnJlY29nbml6ZWQgY29tcG9uZW50IElEcyAlZCAlZCAlZCwgYXNzdW1pbmcgWUNiQ3IiKQorSk1FU1NBR0UoSlRSQ19YTVNfQ0xPU0UsICJGcmVlZCBYTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpUUkNfWE1TX09QRU4sICJPYnRhaW5lZCBYTVMgaGFuZGxlICV1IikKK0pNRVNTQUdFKEpXUk5fQURPQkVfWEZPUk0sICJVbmtub3duIEFkb2JlIGNvbG9yIHRyYW5zZm9ybSBjb2RlICVkIikKK0pNRVNTQUdFKEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sCisJICJJbmNvbnNpc3RlbnQgcHJvZ3Jlc3Npb24gc2VxdWVuY2UgZm9yIGNvbXBvbmVudCAlZCBjb2VmZmljaWVudCAlZCIpCitKTUVTU0FHRShKV1JOX0VYVFJBTkVPVVNfREFUQSwKKwkgIkNvcnJ1cHQgSlBFRyBkYXRhOiAldSBleHRyYW5lb3VzIGJ5dGVzIGJlZm9yZSBtYXJrZXIgMHglMDJ4IikKK0pNRVNTQUdFKEpXUk5fSElUX01BUktFUiwgIkNvcnJ1cHQgSlBFRyBkYXRhOiBwcmVtYXR1cmUgZW5kIG9mIGRhdGEgc2VnbWVudCIpCitKTUVTU0FHRShKV1JOX0hVRkZfQkFEX0NPREUsICJDb3JydXB0IEpQRUcgZGF0YTogYmFkIEh1ZmZtYW4gY29kZSIpCitKTUVTU0FHRShKV1JOX0pGSUZfTUFKT1IsICJXYXJuaW5nOiB1bmtub3duIEpGSUYgcmV2aXNpb24gbnVtYmVyICVkLiUwMmQiKQorSk1FU1NBR0UoSldSTl9KUEVHX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgSlBFRyBmaWxlIikKK0pNRVNTQUdFKEpXUk5fTVVTVF9SRVNZTkMsCisJICJDb3JydXB0IEpQRUcgZGF0YTogZm91bmQgbWFya2VyIDB4JTAyeCBpbnN0ZWFkIG9mIFJTVCVkIikKK0pNRVNTQUdFKEpXUk5fTk9UX1NFUVVFTlRJQUwsICJJbnZhbGlkIFNPUyBwYXJhbWV0ZXJzIGZvciBzZXF1ZW50aWFsIEpQRUciKQorSk1FU1NBR0UoSldSTl9UT09fTVVDSF9EQVRBLCAiQXBwbGljYXRpb24gdHJhbnNmZXJyZWQgdG9vIG1hbnkgc2NhbmxpbmVzIikKKworI2lmZGVmIEpNQUtFX0VOVU1fTElTVAorCisgIEpNU0dfTEFTVE1TR0NPREUKK30gSl9NRVNTQUdFX0NPREU7CisKKyN1bmRlZiBKTUFLRV9FTlVNX0xJU1QKKyNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KKworLyogWmFwIEpNRVNTQUdFIG1hY3JvIHNvIHRoYXQgZnV0dXJlIHJlLWluY2x1c2lvbnMgZG8gbm90aGluZyBieSBkZWZhdWx0ICovCisjdW5kZWYgSk1FU1NBR0UKKworCisjaWZuZGVmIEpFUlJPUl9ICisjZGVmaW5lIEpFUlJPUl9ICisKKy8qIE1hY3JvcyB0byBzaW1wbGlmeSB1c2luZyB0aGUgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2Ugc3R1ZmYgKi8KKy8qIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgZWl0aGVyIHR5cGUgb2YgY2luZm8gcG9pbnRlciAqLworCisvKiBGYXRhbCBlcnJvcnMgKHByaW50IG1lc3NhZ2UgYW5kIGV4aXQpICovCisjZGVmaW5lIEVSUkVYSVQoY2luZm8sY29kZSkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisjZGVmaW5lIEVSUkVYSVQxKGNpbmZvLGNvZGUscDEpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorI2RlZmluZSBFUlJFWElUMihjaW5mbyxjb2RlLHAxLHAyKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKyNkZWZpbmUgRVJSRVhJVDMoY2luZm8sY29kZSxwMSxwMixwMykgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsyXSA9IChwMyksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisjZGVmaW5lIEVSUkVYSVQ0KGNpbmZvLGNvZGUscDEscDIscDMscDQpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMl0gPSAocDMpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbM10gPSAocDQpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorI2RlZmluZSBFUlJFWElUUyhjaW5mbyxjb2RlLHN0cikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIHN0cm5jcHkoKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5zLCAoc3RyKSwgSk1TR19TVFJfUEFSTV9NQVgpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorCisjZGVmaW5lIE1BS0VTVE1UKHN0dWZmKQkJZG8geyBzdHVmZiB9IHdoaWxlICgwKQorCisvKiBOb25mYXRhbCBlcnJvcnMgKHdlIGNhbiBrZWVwIGdvaW5nLCBidXQgdGhlIGRhdGEgaXMgcHJvYmFibHkgY29ycnVwdCkgKi8KKyNkZWZpbmUgV0FSTk1TKGNpbmZvLGNvZGUpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQorI2RlZmluZSBXQVJOTVMxKGNpbmZvLGNvZGUscDEpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQorI2RlZmluZSBXQVJOTVMyKGNpbmZvLGNvZGUscDEscDIpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQorCisvKiBJbmZvcm1hdGlvbmFsL2RlYnVnZ2luZyBtZXNzYWdlcyAqLworI2RlZmluZSBUUkFDRU1TKGNpbmZvLGx2bCxjb2RlKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKKyNkZWZpbmUgVFJBQ0VNUzEoY2luZm8sbHZsLGNvZGUscDEpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQorI2RlZmluZSBUUkFDRU1TMihjaW5mbyxsdmwsY29kZSxwMSxwMikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCisjZGVmaW5lIFRSQUNFTVMzKGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzKSAgXAorICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKKwkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBcCisJICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAorCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKKyNkZWZpbmUgVFJBQ0VNUzQoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQpICBcCisgIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAorCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKKwkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCisJICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQorI2RlZmluZSBUUkFDRU1TNShjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSkgIFwKKyAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCisJICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAorCSAgIF9tcFs0XSA9IChwNSk7IFwKKwkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCisJICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQorI2RlZmluZSBUUkFDRU1TOChjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSxwNixwNyxwOCkgIFwKKyAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCisJICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAorCSAgIF9tcFs0XSA9IChwNSk7IF9tcFs1XSA9IChwNik7IF9tcFs2XSA9IChwNyk7IF9tcFs3XSA9IChwOCk7IFwKKwkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCisJICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQorI2RlZmluZSBUUkFDRU1TUyhjaW5mbyxsdmwsY29kZSxzdHIpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICBzdHJuY3B5KChjaW5mbyktPmVyci0+bXNnX3Bhcm0ucywgKHN0ciksIEpNU0dfU1RSX1BBUk1fTUFYKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKKworI2VuZGlmIC8qIEpFUlJPUl9IICovCmRpZmYgLS1naXQgYS9qZmRjdGZsdC5jIGIvamZkY3RmbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQ3YTAwCi0tLSAvZGV2L251bGwKKysrIGIvamZkY3RmbHQuYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIGpmZGN0Zmx0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZsb2F0aW5nLXBvaW50IGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIG1vcmUgYWNjdXJhdGUgdGhhbiBlaXRoZXIgb2YgdGhlIGludGVnZXIKKyAqIERDVCBpbXBsZW1lbnRhdGlvbnMuICBIb3dldmVyLCBpdCBtYXkgbm90IGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBvbiBhbGwKKyAqIG1hY2hpbmVzIGJlY2F1c2Ugb2YgZGlmZmVyZW5jZXMgaW4gcm91bmRvZmYgYmVoYXZpb3IuICBTcGVlZCB3aWxsIGRlcGVuZAorICogb24gdGhlIGhhcmR3YXJlJ3MgZmxvYXRpbmcgcG9pbnQgY2FwYWNpdHkuCisgKgorICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAorICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQorICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCisgKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgorICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCisgKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQorICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCisgKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKKyAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKKyAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgorICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKKyAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCisgKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGEgZml4ZWQtcG9pbnQKKyAqIGltcGxlbWVudGF0aW9uLCBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgKiBzY2FsZWQgcXVhbnRpemF0aW9uIHZhbHVlcy4gIEhvd2V2ZXIsIHRoYXQgcHJvYmxlbSBkb2VzIG5vdCBhcmlzZSBpZgorICogd2UgdXNlIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0X2Zsb2F0IChGQVNUX0ZMT0FUICogZGF0YSkKK3sKKyAgRkFTVF9GTE9BVCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBGQVNUX0ZMT0FUIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBGQVNUX0ZMT0FUIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7CisgIEZBU1RfRkxPQVQgKmRhdGFwdHI7CisgIGludCBjdHI7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107CisgICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOworICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKKyAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07CisgICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOworICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKKyAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07CisgICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLworICAgIGRhdGFwdHJbNF0gPSB0bXAxMCAtIHRtcDExOworICAgIAorICAgIHoxID0gKHRtcDEyICsgdG1wMTMpICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCisgICAgZGF0YXB0clsyXSA9IHRtcDEzICsgejE7CS8qIHBoYXNlIDUgKi8KKyAgICBkYXRhcHRyWzZdID0gdG1wMTMgLSB6MTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSAodG1wMTAgLSB0bXAxMikgKiAoKEZBU1RfRkxPQVQpIDAuMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9ICgoRkFTVF9GTE9BVCkgMC41NDExOTYxMDApICogdG1wMTAgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9ICgoRkFTVF9GTE9BVCkgMS4zMDY1NjI5NjUpICogdG1wMTIgKyB6NTsgLyogYzIrYzYgKi8KKyAgICB6MyA9IHRtcDExICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCisKKyAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cls1XSA9IHoxMyArIHoyOwkvKiBwaGFzZSA2ICovCisgICAgZGF0YXB0clszXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyWzddID0gejExIC0gejQ7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gdG1wMTAgLSB0bXAxMTsKKyAgICAKKyAgICB6MSA9ICh0bXAxMiArIHRtcDEzKSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCisgICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKKyAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OworCisgICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KKyAgICB6NSA9ICh0bXAxMCAtIHRtcDEyKSAqICgoRkFTVF9GTE9BVCkgMC4zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gKChGQVNUX0ZMT0FUKSAwLjU0MTE5NjEwMCkgKiB0bXAxMCArIHo1OyAvKiBjMi1jNiAqLworICAgIHo0ID0gKChGQVNUX0ZMT0FUKSAxLjMwNjU2Mjk2NSkgKiB0bXAxMiArIHo1OyAvKiBjMitjNiAqLworICAgIHozID0gdG1wMTEgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KKyAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSB6MTMgKyB6MjsgLyogcGhhc2UgNiAqLworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IHoxMSAtIHo0OworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfRkxPQVRfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qZmRjdGZzdC5jIGIvamZkY3Rmc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IzNzhhCi0tLSAvZGV2L251bGwKKysrIGIvamZkY3Rmc3QuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIGpmZGN0ZnN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgorICoKKyAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKKyAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKKyAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgorICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KKyAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAorICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKKyAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgorICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCisgKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCisgKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCisgKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KKyAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCisgKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgorICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBmaXhlZC1wb2ludCBtYXRoLAorICogYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsZWQKKyAqIHF1YW50aXphdGlvbiB2YWx1ZXMuICBUaGUgc21hbGxlciB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJ5LCB0aGUgbGVzcworICogcHJlY2lzZSB0aGUgc2NhbGVkIHZhbHVlLCBzbyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgd29yc2Ugd2l0aCBoaWdoLQorICogcXVhbGl0eS1zZXR0aW5nIGZpbGVzIHRoYW4gd2l0aCBsb3ctcXVhbGl0eSBvbmVzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qIFNjYWxpbmcgZGVjaXNpb25zIGFyZSBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgaW4gdGhlIExMJk0gYWxnb3JpdGhtOworICogc2VlIGpmZGN0aW50LmMgZm9yIG1vcmUgZGV0YWlscy4gIEhvd2V2ZXIsIHdlIGNob29zZSB0byBkZXNjYWxlCisgKiAocmlnaHQgc2hpZnQpIG11bHRpcGxpY2F0aW9uIHByb2R1Y3RzIGFzIHNvb24gYXMgdGhleSBhcmUgZm9ybWVkLAorICogcmF0aGVyIHRoYW4gY2FycnlpbmcgYWRkaXRpb25hbCBmcmFjdGlvbmFsIGJpdHMgaW50byBzdWJzZXF1ZW50IGFkZGl0aW9ucy4KKyAqIFRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgc2xpZ2h0bHksIGJ1dCBpdCBsZXRzIHVzIHNhdmUgYSBmZXcgc2hpZnRzLgorICogTW9yZSBpbXBvcnRhbnRseSwgMTYtYml0IGFyaXRobWV0aWMgaXMgdGhlbiBhZGVxdWF0ZSAoZm9yIDgtYml0IHNhbXBsZXMpCisgKiBldmVyeXdoZXJlIGV4Y2VwdCBpbiB0aGUgbXVsdGlwbGljYXRpb25zIHByb3BlcjsgdGhpcyBzYXZlcyBhIGdvb2QgZGVhbAorICogb2Ygd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgorICoKKyAqIEFnYWluIHRvIHNhdmUgYSBmZXcgc2hpZnRzLCB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgYmV0d2VlbiBwYXNzIDEgYW5kCisgKiBwYXNzIDIgYXJlIG5vdCB1cHNjYWxlZCwgYnV0IGFyZSByZXByZXNlbnRlZCBvbmx5IHRvIGludGVncmFsIHByZWNpc2lvbi4KKyAqCisgKiBBIGZpbmFsIGNvbXByb21pc2UgaXMgdG8gcmVwcmVzZW50IHRoZSBtdWx0aXBsaWNhdGl2ZSBjb25zdGFudHMgdG8gb25seQorICogOCBmcmFjdGlvbmFsIGJpdHMsIHJhdGhlciB0aGFuIDEzLiAgVGhpcyBzYXZlcyBzb21lIHNoaWZ0aW5nIHdvcmsgb24gc29tZQorICogbWFjaGluZXMsIGFuZCBtYXkgYWxzbyByZWR1Y2UgdGhlIGNvc3Qgb2YgbXVsdGlwbGljYXRpb24gKHNpbmNlIHRoZXJlCisgKiBhcmUgZmV3ZXIgb25lLWJpdHMgaW4gdGhlIGNvbnN0YW50cykuCisgKi8KKworI2RlZmluZSBDT05TVF9CSVRTICA4CisKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDgKKyNkZWZpbmUgRklYXzBfMzgyNjgzNDMzICAoKElOVDMyKSAgIDk4KQkJLyogRklYKDAuMzgyNjgzNDMzKSAqLworI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoSU5UMzIpICAxMzkpCQkvKiBGSVgoMC41NDExOTYxMDApICovCisjZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgKChJTlQzMikgIDE4MSkJCS8qIEZJWCgwLjcwNzEwNjc4MSkgKi8KKyNkZWZpbmUgRklYXzFfMzA2NTYyOTY1ICAoKElOVDMyKSAgMzM0KQkJLyogRklYKDEuMzA2NTYyOTY1KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMzgyNjgzNDMzICBGSVgoMC4zODI2ODM0MzMpCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQorI2RlZmluZSBGSVhfMF83MDcxMDY3ODEgIEZJWCgwLjcwNzEwNjc4MSkKKyNkZWZpbmUgRklYXzFfMzA2NTYyOTY1ICBGSVgoMS4zMDY1NjI5NjUpCisjZW5kaWYKKworCisvKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAorICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKKyAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KKyAqLworCisjaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI3VuZGVmIERFU0NBTEUKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYSBEQ1RFTEVNIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50LCBhbmQgaW1tZWRpYXRlbHkKKyAqIGRlc2NhbGUgdG8geWllbGQgYSBEQ1RFTEVNIHJlc3VsdC4KKyAqLworCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoRENURUxFTSkgREVTQ0FMRSgodmFyKSAqIChjb25zdCksIENPTlNUX0JJVFMpKQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF9pZmFzdCAoRENURUxFTSAqIGRhdGEpCit7CisgIERDVEVMRU0gdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgRENURUxFTSB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgRENURUxFTSB6MSwgejIsIHozLCB6NCwgejUsIHoxMSwgejEzOworICBEQ1RFTEVNICpkYXRhcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOworICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKKyAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07CisgICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOworICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKKyAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07CisgICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOworICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0clswXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KKyAgICBkYXRhcHRyWzRdID0gdG1wMTAgLSB0bXAxMTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisgICAgZGF0YXB0clsyXSA9IHRtcDEzICsgejE7CS8qIHBoYXNlIDUgKi8KKyAgICBkYXRhcHRyWzZdID0gdG1wMTMgLSB6MTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVhfMF8zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9IE1VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxMSwgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KKyAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICBkYXRhcHRyWzVdID0gejEzICsgejI7CS8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyWzNdID0gejEzIC0gejI7CisgICAgZGF0YXB0clsxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbRENUU0laRSowXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSB0bXAxMCAtIHRtcDExOworICAgIAorICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSB0bXAxMyArIHoxOyAvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gdG1wMTMgLSB6MTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVhfMF8zODI2ODM0MzMpOyAvKiBjNiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMTAsIEZJWF8wXzU0MTE5NjEwMCkgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9IE1VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxMSwgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KKworICAgIHoxMSA9IHRtcDcgKyB6MzsJCS8qIHBoYXNlIDUgKi8KKyAgICB6MTMgPSB0bXA3IC0gejM7CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSB6MTMgKyB6MjsgLyogcGhhc2UgNiAqLworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IHoxMSArIHo0OworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IHoxMSAtIHo0OworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfSUZBU1RfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qZmRjdGludC5jIGIvamZkY3RpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTc4YjY0Ci0tLSAvZGV2L251bGwKKysrIGIvamZkY3RpbnQuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIGpmZGN0aW50LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCisgKgorICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAorICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQorICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCisgKiAgIEMuIExvZWZmbGVyLCBBLiBMaWd0ZW5iZXJnIGFuZCBHLiBNb3NjaHl0eiwgIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QKKyAqICAgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucyIsIFByb2MuIEludCdsLiBDb25mLiBvbiBBY291c3RpY3MsCisgKiAgIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nIDE5ODkgKElDQVNTUCAnODkpLCBwcC4gOTg4LTk5MS4KKyAqIFRoZSBwcmltYXJ5IGFsZ29yaXRobSBkZXNjcmliZWQgdGhlcmUgdXNlcyAxMSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzLgorICogV2UgdXNlIHRoZWlyIGFsdGVybmF0ZSBtZXRob2Qgd2l0aCAxMiBtdWx0aXBsaWVzIGFuZCAzMiBhZGRzLgorICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCisgKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KKyAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qCisgKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKKyAqCisgKiBFYWNoIDEtRCBEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCisgKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBEQ1Qgb3V0cHV0cy4gIFRoZSBmaW5hbCBvdXRwdXRzIGFyZSB0aGVyZWZvcmUKKyAqIGEgZmFjdG9yIG9mIE4gbGFyZ2VyIHRoYW4gZGVzaXJlZDsgc2luY2UgTj04IHRoaXMgY2FuIGJlIGN1cmVkIGJ5CisgKiBhIHNpbXBsZSByaWdodCBzaGlmdCBhdCB0aGUgZW5kIG9mIHRoZSBhbGdvcml0aG0uICBUaGUgYWR2YW50YWdlIG9mCisgKiB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgd2Ugc2F2ZSB0d28gbXVsdGlwbGljYXRpb25zIHBlciAxLUQgRENULAorICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IG91dHB1dHMgbmVlZCBub3QgYmUgZGl2aWRlZCBieSBzcXJ0KE4pLgorICogSW4gdGhlIElKRyBjb2RlLCB0aGlzIGZhY3RvciBvZiA4IGlzIHJlbW92ZWQgYnkgdGhlIHF1YW50aXphdGlvbiBzdGVwCisgKiAoaW4gamNkY3RtZ3IuYyksIE5PVCBpbiB0aGlzIG1vZHVsZS4KKyAqCisgKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCisgKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCisgKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKKyAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCisgKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQorICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCisgKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCisgKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKKyAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKKyAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCisgKgorICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAorICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cworICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAorICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChGb3IgMTItYml0IHNhbXBsZSBkYXRhLCB0aGUgaW50ZXJtZWRpYXRlCisgKiBhcnJheSBpcyBJTlQzMiBhbnl3YXkuKQorICoKKyAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0CisgKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKKyAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLworI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLworI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQorI2Vsc2UKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF9pc2xvdyAoRENURUxFTSAqIGRhdGEpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7CisgIERDVEVMRU0gKmRhdGFwdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107CisgICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOworICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKKyAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07CisgICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOworICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKKyAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07CisgICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OworICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCisgICAgICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pICgodG1wMTAgKyB0bXAxMSkgPDwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSAoKHRtcDEwIC0gdG1wMTEpIDw8IFBBU1MxX0JJVFMpOworICAgIAorICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKKwkJCQkgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCisJCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCisgICAgICogY0sgcmVwcmVzZW50cyBjb3MoSypwaS8xNikuCisgICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wNC4udG1wNyBoZXJlLgorICAgICAqLworICAgIAorICAgIHoxID0gdG1wNCArIHRtcDc7CisgICAgejIgPSB0bXA1ICsgdG1wNjsKKyAgICB6MyA9IHRtcDQgKyB0bXA2OworICAgIHo0ID0gdG1wNSArIHRtcDc7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICAKKyAgICB0bXA0ID0gTVVMVElQTFkodG1wNCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wNSA9IE1VTFRJUExZKHRtcDUsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDYgPSBNVUxUSVBMWSh0bXA2LCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXA3ID0gTVVMVElQTFkodG1wNywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgCisgICAgejMgKz0gejU7CisgICAgejQgKz0gejU7CisgICAgCisgICAgZGF0YXB0cls3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNiArIHoyICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIAorICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIHJlbW92ZSB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLCBidXQgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwCisgICAqIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OworICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCisgICAgICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCArIHRtcDExLCBQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCAtIHRtcDExLCBQQVNTMV9CSVRTKTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgorICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KKyAgICAgKi8KKyAgICAKKyAgICB6MSA9IHRtcDQgKyB0bXA3OworICAgIHoyID0gdG1wNSArIHRtcDY7CisgICAgejMgPSB0bXA0ICsgdG1wNjsKKyAgICB6NCA9IHRtcDUgKyB0bXA3OworICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCisgICAgCisgICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLworICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KKyAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCisgICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLworICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIAorICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworICAgIAorICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIAorICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvamlkY3RmbHQuYyBiL2ppZGN0Zmx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4OGNlMwotLS0gL2Rldi9udWxsCisrKyBiL2ppZGN0Zmx0LmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBqaWRjdGZsdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIG1vcmUgYWNjdXJhdGUgdGhhbiBlaXRoZXIgb2YgdGhlIGludGVnZXIKKyAqIElEQ1QgaW1wbGVtZW50YXRpb25zLiAgSG93ZXZlciwgaXQgbWF5IG5vdCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgb24gYWxsCisgKiBtYWNoaW5lcyBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGluIHJvdW5kb2ZmIGJlaGF2aW9yLiAgU3BlZWQgd2lsbCBkZXBlbmQKKyAqIG9uIHRoZSBoYXJkd2FyZSdzIGZsb2F0aW5nIHBvaW50IGNhcGFjaXR5LgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggYSBmaXhlZC1wb2ludAorICogaW1wbGVtZW50YXRpb24sIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqIHNjYWxlZCBxdWFudGl6YXRpb24gdmFsdWVzLiAgSG93ZXZlciwgdGhhdCBwcm9ibGVtIGRvZXMgbm90IGFyaXNlIGlmCisgKiB3ZSB1c2UgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKKyAqIGVudHJ5OyBwcm9kdWNlIGEgZmxvYXQgcmVzdWx0LgorICovCisKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoRkFTVF9GTE9BVCkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfZmxvYXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBGQVNUX0ZMT0FUIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIEZBU1RfRkxPQVQgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIEZBU1RfRkxPQVQgejUsIHoxMCwgejExLCB6MTIsIHoxMzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIEZMT0FUX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBGQVNUX0ZMT0FUICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgRkFTVF9GTE9BVCB3b3Jrc3BhY2VbRENUU0laRTJdOyAvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChGTE9BVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBjdHItLSkgeworICAgIC8qIER1ZSB0byBxdWFudGl6YXRpb24sIHdlIHdpbGwgdXN1YWxseSBmaW5kIHRoYXQgbWFueSBvZiB0aGUgaW5wdXQKKyAgICAgKiBjb2VmZmljaWVudHMgYXJlIHplcm8sIGVzcGVjaWFsbHkgdGhlIEFDIHRlcm1zLiAgV2UgY2FuIGV4cGxvaXQgdGhpcworICAgICAqIGJ5IHNob3J0LWNpcmN1aXRpbmcgdGhlIElEQ1QgY2FsY3VsYXRpb24gZm9yIGFueSBjb2x1bW4gaW4gd2hpY2ggYWxsCisgICAgICogdGhlIEFDIHRlcm1zIGFyZSB6ZXJvLiAgSW4gdGhhdCBjYXNlIGVhY2ggb3V0cHV0IGlzIGVxdWFsIHRvIHRoZQorICAgICAqIERDIGNvZWZmaWNpZW50ICh3aXRoIHNjYWxlIGZhY3RvciBhcyBuZWVkZWQpLgorICAgICAqIFdpdGggdHlwaWNhbCBpbWFnZXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMsIGhhbGYgb3IgbW9yZSBvZiB0aGUKKyAgICAgKiBjb2x1bW4gRENUIGNhbGN1bGF0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCB0aGlzIHdheS4KKyAgICAgKi8KKyAgICAKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgRkFTVF9GTE9BVCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgICAKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsJLyogcGhhc2UgMyAqLworICAgIHRtcDExID0gdG1wMCAtIHRtcDI7CisKKyAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOwkvKiBwaGFzZXMgNS0zICovCisgICAgdG1wMTIgPSAodG1wMSAtIHRtcDMpICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2MikgLSB0bXAxMzsgLyogMipjNCAqLworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKKyAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKKyAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wNCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgdG1wNSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wNiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wNyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisKKyAgICB6MTMgPSB0bXA2ICsgdG1wNTsJCS8qIHBoYXNlIDYgKi8KKyAgICB6MTAgPSB0bXA2IC0gdG1wNTsKKyAgICB6MTEgPSB0bXA0ICsgdG1wNzsKKyAgICB6MTIgPSB0bXA0IC0gdG1wNzsKKworICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCisgICAgdG1wMTEgPSAoejExIC0gejEzKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpOyAvKiAyKmM0ICovCisKKyAgICB6NSA9ICh6MTAgKyB6MTIpICogKChGQVNUX0ZMT0FUKSAxLjg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9ICgoRkFTVF9GTE9BVCkgMS4wODIzOTIyMDApICogejEyIC0gejU7IC8qIDIqKGMyLWM2KSAqLworICAgIHRtcDEyID0gKChGQVNUX0ZMT0FUKSAtMi42MTMxMjU5MzApICogejEwICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gdG1wMCArIHRtcDc7CisgICAgd3NwdHJbRENUU0laRSo3XSA9IHRtcDAgLSB0bXA3OworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSB0bXAxICsgdG1wNjsKKyAgICB3c3B0cltEQ1RTSVpFKjZdID0gdG1wMSAtIHRtcDY7CisgICAgd3NwdHJbRENUU0laRSoyXSA9IHRtcDIgKyB0bXA1OworICAgIHdzcHRyW0RDVFNJWkUqNV0gPSB0bXAyIC0gdG1wNTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gdG1wMyArIHRtcDQ7CisgICAgd3NwdHJbRENUU0laRSozXSA9IHRtcDMgLSB0bXA0OworCisgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgcXVhbnRwdHIrKzsKKyAgICB3c3B0cisrOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMy4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KKyAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KKyAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KKyAgICAgKiBBbmQgdGVzdGluZyBmbG9hdHMgZm9yIHplcm8gaXMgcmVsYXRpdmVseSBleHBlbnNpdmUsIHNvIHdlIGRvbid0IGJvdGhlci4KKyAgICAgKi8KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDEwID0gd3NwdHJbMF0gKyB3c3B0cls0XTsKKyAgICB0bXAxMSA9IHdzcHRyWzBdIC0gd3NwdHJbNF07CisKKyAgICB0bXAxMyA9IHdzcHRyWzJdICsgd3NwdHJbNl07CisgICAgdG1wMTIgPSAod3NwdHJbMl0gLSB3c3B0cls2XSkgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKSAtIHRtcDEzOworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEzID0gd3NwdHJbNV0gKyB3c3B0clszXTsKKyAgICB6MTAgPSB3c3B0cls1XSAtIHdzcHRyWzNdOworICAgIHoxMSA9IHdzcHRyWzFdICsgd3NwdHJbN107CisgICAgejEyID0gd3NwdHJbMV0gLSB3c3B0cls3XTsKKworICAgIHRtcDcgPSB6MTEgKyB6MTM7CisgICAgdG1wMTEgPSAoejExIC0gejEzKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpOworCisgICAgejUgPSAoejEwICsgejEyKSAqICgoRkFTVF9GTE9BVCkgMS44NDc3NTkwNjUpOyAvKiAyKmMyICovCisgICAgdG1wMTAgPSAoKEZBU1RfRkxPQVQpIDEuMDgyMzkyMjAwKSAqIHoxMiAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9ICgoRkFTVF9GTE9BVCkgLTIuNjEzMTI1OTMwKSAqIHoxMCArIHo1OyAvKiAtMiooYzIrYzYpICovCisKKyAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OworICAgIHRtcDUgPSB0bXAxMSAtIHRtcDY7CisgICAgdG1wNCA9IHRtcDEwICsgdG1wNTsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogc2NhbGUgZG93biBieSBhIGZhY3RvciBvZiA4IGFuZCByYW5nZS1saW1pdCAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAwICsgdG1wNyksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDAgLSB0bXA3KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMSArIHRtcDYpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAxIC0gdG1wNiksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDIgKyB0bXA1KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMiAtIHRtcDUpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAzICsgdG1wNCksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDMgLSB0bXA0KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIAorICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvamlkY3Rmc3QuUyBiL2ppZGN0ZnN0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlMWMyNAotLS0gL2Rldi9udWxsCisrKyBiL2ppZGN0ZnN0LlMKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9jcHUtZmVhdHVyZXMuaD4KKworICAgIC50ZXh0CisgICAgLmFsaWduCisKKyAgICAuZ2xvYmFsIGpwZWdfaWRjdF9pZmFzdAorICAgIC5mdW5jICAganBlZ19pZGN0X2lmYXN0CisKKy8vIE5PVEU6IHNiPXI5LCBmcD1yMTEgaXA9cjEyLCBzcD1yMTMsIGxyPXIxNCwgcGM9cjE1CisKKy8vIGpwZWdfaWRjdF9pZmFzdCAoal9kZWNvbXByZXNzX3B0ciAgICAgICBjaW5mbywKKy8vICAgICAgICAgICAgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogICBjb21wcHRyLAorLy8gICAgICAgICAgICAgICAgIHNob3J0KiAgICAgICAgICAgICAgICAgIGNvZWZfYmxvY2ssCisvLyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogICAgICAgICAgb3V0cHV0X2J1ZiwKKy8vICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29sKQorCisjZGVmaW5lICBsb2NhbF9UTVAwMTIzICAgICAgIHNwCisjZGVmaW5lICBsb2NhbF9UTVAwICAgICAgICAgIFtzcCwgIzBdCisjZGVmaW5lICBsb2NhbF9UTVAxICAgICAgICAgIFtzcCwgIzRdCisjZGVmaW5lICBsb2NhbF9UTVAyICAgICAgICAgIFtzcCwgIzhdCisjZGVmaW5lICBsb2NhbF9UTVAzICAgICAgICAgIFtzcCwgIzEyXQorI2RlZmluZSAgbG9jYWxfUkFOR0VfVEFCTEUgICBbc3AsICMxNl0KKyNkZWZpbmUgIGxvY2FsX09VVFBVVF9DT0wgICAgW3NwLCAjMjBdCisjZGVmaW5lICBsb2NhbF9PVVRQVVRfQlVGICAgIFtzcCwgIzI0XQorI2RlZmluZSAgbG9jYWxfVU5VU0VEICAgICAgICBbc3AsICMyOF0KKyNkZWZpbmUgIG9mZl9XT1JLU1BBQ0UgICAgICAgMzIKKyNkZWZpbmUgIGxvY2FsX1dPUktTUEFDRSAgICAgW3NwLCAjb2ZmV09SS1NQQUNFXQorI2RlZmluZSAgbG9jYWxfU0laRSAgICAgICAgICAob2ZmX1dPUktTUEFDRSArIDgqOCo0KQorCisjZGVmaW5lICBvZmZfREVDT01QUkVTU19yYW5nZV9saW1pdF9iYXNlICAzMjQKKyNkZWZpbmUgIG9mZl9DT01QSU5GT19xdWFudHRhYmxlICAgICAgICAgIDgwCisKKyNkZWZpbmUgIERDVFNJWkUgICA4CisjZGVmaW5lICBWWSh4KSAgICgoeCkqRENUU0laRSoyKQorI2RlZmluZSAgUVkoeCkgICAoKHgpKkRDVFNJWkUqNCkKKworI2RlZmluZSAgVlgoeCkgICAoKHgpKjIpCisjZGVmaW5lICBRWCh4KSAgICgoeCkqNCkKKworI2RlZmluZSAgRklYXzFfNDE0MjEzNTYyICAgICMzNjIKKyNkZWZpbmUgIEZJWF8xXzA4MjM5MjIwMCAgICAjMjc3CisjZGVmaW5lICBGSVhfMV84NDc3NTkwNjUgICAgIzQ3MworI2RlZmluZSAgRklYXzJfNjEzMTI1OTMwICAgICM2NjkKKworI2RlZmluZSAgUkFOR0VfTUFTSyAgIDEwMjMKKworCisKK2pwZWdfaWRjdF9pZmFzdDoKKyAgICBQTEQgICAgIChyMiwgIzApCisgICAgc3RtZGIgICBzcCEsIHtyNCxyNSwgcjYscjcsIHI4LHI5LCByMTAscjExLCByMTIsbHJ9CisgICAgbGRyICAgICByNCwgW3NwLCAjNCoxMF0KKyAgICBzdWIgICAgIHNwLCAjbG9jYWxfU0laRQorCisgICAgbGRyICAgICByMTAsW3IxLCAjb2ZmX0NPTVBJTkZPX3F1YW50dGFibGVdICAgICAgICAgLy8gcjEwID0gcXVhbnR0YWJsZQorICAgIHN0ciAgICAgcjQsIGxvY2FsX09VVFBVVF9DT0wKKyAgICBzdHIgICAgIHIzLCBsb2NhbF9PVVRQVVRfQlVGCisgICAgbGRyICAgICByNSwgW3IwLCAjb2ZmX0RFQ09NUFJFU1NfcmFuZ2VfbGltaXRfYmFzZV0KKyAgICBhZGQgICAgIHI1LCByNSwgIzEyOAorICAgIHN0ciAgICAgcjUsIGxvY2FsX1JBTkdFX1RBQkxFCisgICAgbW92ICAgICBmcCwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZwID0gY29lZl9ibG9jaworICAgIGFkZCAgICAgaXAsIHNwLCAjb2ZmX1dPUktTUEFDRQorCitWTG9vcFRhaWw6CisgICAgbGRyc2ggICAgcjAsIFtmcCwgI1ZZKDApXQorICAgIGxkcnNoICAgIHIxLCBbZnAsICNWWSgxKV0KKyAgICBsZHJzaCAgICByMiwgW2ZwLCAjVlkoMildCisgICAgbGRyc2ggICAgcjMsIFtmcCwgI1ZZKDMpXQorICAgIGxkcnNoICAgIHI0LCBbZnAsICNWWSg0KV0KKyAgICBsZHJzaCAgICByNSwgW2ZwLCAjVlkoNSldCisgICAgbGRyc2ggICAgcjYsIFtmcCwgI1ZZKDYpXQorICAgIGxkcnNoICAgIHI3LCBbZnAsICNWWSg3KV0KKworICAgIGNtcCAgICAgIHIxLCAjMAorICAgIG9ycmVxcyAgIHI4LCByMiwgcjMKKyAgICBvcnJlcXMgICByOCwgcjQsIHI1CisgICAgb3JyZXFzICAgcjgsIHI2LCByNworICAgIGJlcSAgICAgIFZMb29wSGVhZFplcm8KKworVkxvb3BIZWFkOgorICAgIC8vIHRtcDAgPSBERVFVQU5USVpFKGluW0RDVFNJWkUqMF0sIHF1YW50W0RDVFNJWkUqMF0gICAocjApCisgICAgLy8gdG1wMiA9IERFUVVBTlRJWkUoaW5bRENUU0laRSo0XSwgcXVhbnRbRENUU0laRSo0XSAgIChyNCkKKyAgICAvLyB0bXAxID0gREVRVUFOVElaRShpbltEQ1RTSVpFKjJdLCBxdWFudFtEQ1RTSVpFKjJdICAgKHIyKQorICAgIC8vIHRtcDMgPSBERVFVQU5USVpFKGluW0RDVFNJWkUqNl0sIHF1YW50W0RDVFNJWkUqNl0gICAocjYpCisgICAgLy8gdG1wMTAgPSB0bXAwICsgdG1wMiAgIChyMCkKKyAgICAvLyB0bXAxMSA9IHRtcDAgLSB0bXAyICAgKHI0KQorCisgICAgbGRyICAgICAgcjksIFtyMTAsICNRWSg0KV0KKyAgICBsZHIgICAgICByOCwgW3IxMCwgI1FZKDApXQorI2lmIF9fQVJNX0hBVkVfSEFMRldPUkRfTVVMVElQTFkKKyAgICBzbXVsYmIgICByNCwgcjksIHI0CisgICAgc21sYWJiICAgcjAsIHI4LCByMCwgcjQKKyNlbHNlCisgICAgbXVsICAgICAgcjQsIHI5LCByNAorICAgIG11bCAgICAgIHIwLCByOCwgcjAKKyAgICBhZGQgICAgICByMCwgcjQKKyNlbmRpZgorICAgIGxkciAgICAgIHI5LCBbcjEwLCAjUVkoNildCisgICAgbGRyICAgICAgcjgsIFtyMTAsICNRWSgyKV0KKyAgICBzdWIgICAgICByNCwgcjAsIHI0LCBsc2wgIzEKKyNpZiBfX0FSTV9IQVZFX0hBTEZXT1JEX01VTFRJUExZCisgICAgc211bGJiICAgcjYsIHI5LCByNgorICAgIHNtbGFiYiAgIHIyLCByOCwgcjIsIHI2CisjZWxzZQorICAgIG11bCAgICAgIHI2LCByOSwgcjYKKyAgICBtdWwgICAgICByMiwgcjgsIHIyCisgICAgYWRkICAgICAgcjIsIHI2CisjZW5kaWYKKworICAgIC8vIHRtcDEzID0gdG1wMSArIHRtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIpCisgICAgLy8gdG1wMTIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzICAgIChyNikKKyAgICAvLyBGSVhfMV80MTQyLi4uID0gMzYyID0gNDUqOCArIDIKKyAgICBzdWIgICAgICByNiwgcjIsIHI2LCBsc2wgIzEKKyAgICBtb3YgICAgICByOCwgIzM2MAorICAgIGFkZCAgICAgIHI4LCByOCwgIzIKKyAgICBtdWwgICAgICByOSwgcjYsIHI4CisKKyAgICAvLyB0bXAwID0gdG1wMTAgKyB0bXAxMzsgICAocjApCisgICAgLy8gdG1wMyA9IHRtcDEwIC0gdG1wMTM7ICAgKHI4KQorICAgIC8vIHRtcDEgPSB0bXAxMSArIHRtcDEyOyAgIChyNCkKKyAgICAvLyB0bXAyID0gdG1wMTEgLSB0bXAxMjsgICAocjYpCisgICAgYWRkICAgICByMCwgcjAsIHIyCisgICAgcnNiICAgICByNiwgcjIsIHI5LCBhc3IgIzgKKyAgICBzdWIgICAgIHI4LCByMCwgcjIsIGxzbCAjMQorICAgIGFkZCAgICAgcjQsIHI0LCByNgorICAgIHN1YiAgICAgcjYsIHI0LCByNiwgbHNsICMxCisKKyAgICBzdG1pYSAgIGxvY2FsX1RNUDAxMjMsIHtyMCwgcjQsIHI2LCByOH0KKworICAgIC8vIE5PVEU6IGJlIHN1cmUgdG8gbm90IHVzZXIgcjAscjQscjYscjggc29vbiBhZnRlciBzdG0gYWJvdmUKKworICAgIC8vIG9kZCBwYXJ0CisgICAgLy8gdG1wNCA9IERFUVVBTlRJWkUoIGluW0RDVFNJWkUqMV0sIHF1YW50W0RDVFNJWkUqMV0gKSAgIChyMSkKKyAgICAvLyB0bXA2ID0gREVRVUFOVElaRSggaW5bRENUU0laRSo1XSwgcXVhbnRbRENUU0laRSo1XSApICAgKHI1KQorICAgIC8vIHRtcDUgPSBERVFVQU5USVpFKCBpbltEQ1RTSVpFKjNdLCBxdWFudFtEQ1RTSVpFKjNdICkgICAocjMpCisgICAgLy8gdG1wNyA9IERFUVVBTlRJWkUoIGluW0RDVFNJWkUqN10sIHF1YW50W0RDVFNJWkUqN10gKSAgIChyNykKKyAgICAvLyB6MTMgPSB0bXA2ICsgdG1wNTsgIChyMCkKKyAgICAvLyB6MTAgPSB0bXA2IC0gdG1wNTsgIChyMikKKyAgICAvLyB6MTEgPSB0bXA0ICsgdG1wNzsgIChyNCkKKyAgICAvLyB6MTIgPSB0bXA0IC0gdG1wNzsgIChyNikKKworICAgIGxkciAgICAgcjIsIFtyMTAsICNRWSgxKV0KKyAgICBsZHIgICAgIHI5LCBbcjEwLCAjUVkoNSldCisjaWYgX19BUk1fSEFWRV9IQUxGV09SRF9NVUxUSVBMWQorICAgIHNtdWxiYiAgcjEsIHIyLCByMQorI2Vsc2UKKyAgICBtdWwgICAgIHIxLCByMiwgcjEKKyNlbmRpZgorICAgIGxkciAgICAgcjIsIFtyMTAsICNRWSgzKV0KKyNpZiBfX0FSTV9IQVZFX0hBTEZXT1JEX01VTFRJUExZCisgICAgc211bGJiICByNSwgcjksIHI1CisjZWxzZQorICAgIG11bCAgICAgcjUsIHI5LCByNQorI2VuZGlmCisgICAgbGRyICAgICByOSwgW3IxMCwgI1FZKDcpXQorI2lmIF9fQVJNX0hBVkVfSEFMRldPUkRfTVVMVElQTFkKKyAgICBzbWxhYmIgIHIwLCByMiwgcjMsIHI1CisgICAgc21sYWJiICByNCwgcjksIHI3LCByMQorI2Vsc2UKKyAgICBtdWwgICAgIHIwLCByMiwgcjMKKyAgICBhZGQgICAgIHIwLCByNQorICAgIG11bCAgICAgcjQsIHI5LCByNworICAgIGFkZCAgICAgcjQsIHIxCisjZW5kaWYKKyAgICByc2IgIHIyLCByMCwgcjUsIGxzbCAjMQorICAgIHJzYiAgcjYsIHI0LCByMSwgbHNsICMxCisKKyAgICAvLyB0bXA3ID0gejExICsgejEzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHI3KQorICAgIC8vIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOyAocjEpCisgICAgLy8gRklYXy4uLiA9IDM2MCArIDIKKyAgICBhZGQgICByNywgcjQsIHIwCisgICAgc3ViICAgcjEsIHI0LCByMAorICAgIG1vdiAgIHI4LCAjMzYwCisgICAgYWRkICAgcjgsIHI4LCAjMgorICAgIG11bCAgIHIxLCByOCwgcjEKKworICAgIC8vIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOyAgICAgICAgKHI4KQorICAgIC8vIHRtcDEwID0gTVVMVElQTFkoejEyLCBGSVhfMV8wODIzOTIyMDApIC0gejU7ICAgICAgKHIwKQorICAgIC8vIHRtcDEyID0gTVVMVElQTFkoejEwLCAtIEZJWF8yXzYxMzEyNTkzMCkgKyB6NTsgICAgKHIyKQorICAgIC8vIEZJWF8xXzg0NzcuLi4gPSA0NzMgPSA0NzIgKyAxCisgICAgLy8gRklYXzFfMDgyLi4uICA9IDI3NyA9IDI3NiArIDEKKyAgICAvLyBGSVhfMl8uLi4gICAgID0gNjY5ID0gNjY4ICsgMQorICAgIGFkZCAgICAgcjgsIHIyLCByNgorICAgIG1vdiAgICAgcjksICM0NzIKKyAgICBtbGEgICAgIHI4LCByOSwgcjgsIHI4CisgICAgbW92ICAgICByOSwgIzI3NgorICAgIG1sYSAgICAgcjAsIHI2LCByOSwgcjYKKyAgICBtb3YgICAgIHI5LCAjNjY4CisgICAgbWxhICAgICByMiwgcjksIHIyLCByMgorICAgIHN1YiAgICAgcjAsIHIwLCByOAorICAgIHJzYiAgICAgcjIsIHIyLCByOAorCisgICAgLy8gdG1wNiA9IHRtcDEyIC0gdG1wNzsgIChyNikKKyAgICAvLyB0bXA1ID0gdG1wMTEgLSB0bXA2OyAgKHI1KQorICAgIC8vIHRtcDQgPSB0bXAxMCArIHRtcDU7ICAocjQpCisgICAgcnNiICByNiwgcjcsIHIyLCBhc3IgIzgKKyAgICByc2IgIHI1LCByNiwgcjEsIGFzciAjOAorICAgIGFkZCAgcjQsIHI1LCByMCwgYXNyICM4CisKKyAgICBsZG1pYSBsb2NhbF9UTVAwMTIzLCB7cjAsIHIxLCByMiwgcjN9CisKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgKHRtcDAgKyB0bXA3KTsKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgKHRtcDAgLSB0bXA3KTsKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgKHRtcDEgKyB0bXA2KTsKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgKHRtcDEgLSB0bXA2KTsKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgKHRtcDIgKyB0bXA1KTsKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgKHRtcDIgLSB0bXA1KTsKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgKHRtcDMgKyB0bXA0KTsKKyAgICAvLyB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgKHRtcDMgLSB0bXA0KTsKKworICAgIGFkZCAgIHIwLCByMCwgcjcKKyAgICBzdWIgICByNywgcjAsIHI3LCBsc2wgIzEKKyAgICBhZGQgICByMSwgcjEsIHI2CisgICAgc3ViICAgcjYsIHIxLCByNiwgbHNsICMxCisgICAgYWRkICAgcjIsIHIyLCByNQorICAgIHN1YiAgIHI1LCByMiwgcjUsIGxzbCAjMQorICAgIHN1YiAgIHIzLCByMywgcjQKKyAgICBhZGQgICByNCwgcjMsIHI0LCBsc2wgIzEKKworICAgIHN0ciAgIHIwLCBbaXAsICNRWSgwKV0KKyAgICBzdHIgICByMSwgW2lwLCAjUVkoMSldCisgICAgc3RyICAgcjIsIFtpcCwgI1FZKDIpXQorICAgIHN0ciAgIHIzLCBbaXAsICNRWSgzKV0KKyAgICBzdHIgICByNCwgW2lwLCAjUVkoNCldCisgICAgc3RyICAgcjUsIFtpcCwgI1FZKDUpXQorICAgIHN0ciAgIHI2LCBbaXAsICNRWSg2KV0KKyAgICBzdHIgICByNywgW2lwLCAjUVkoNyldCisKKyAgICAvLyBpbnB0cisrOyAgICAgICAgICAgICAgICAgICAgLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIC8vIHF1YW50cHRyKys7CisgICAgLy8gd3NwdHIrKzsKKyAgICBhZGQgIGZwLCBmcCwgIzIKKyAgICBhZGQgIHIxMCwgcjEwLCAjNAorICAgIGFkZCAgaXAsIGlwLCAjNAorICAgIGFkZCAgcjAsIHNwLCAjKG9mZl9XT1JLU1BBQ0UgKyA0KjgpCisgICAgY21wICBpcCwgcjAKKyAgICBibmUgIFZMb29wVGFpbAorCisKKworSExvb3BTdGFydDoKKyAgICAvLyByZXNldCBwb2ludGVycworICAgIFBMRCAgICAgKHNwLCAjb2ZmX1dPUktTUEFDRSkKKyAgICBhZGQgICAgIGlwLCBzcCwgI29mZl9XT1JLU1BBQ0UKKyAgICBsZHIgICAgIHIxMCwgbG9jYWxfUkFOR0VfVEFCTEUKKworSExvb3BUYWlsOgorICAgIC8vIG91dHB1dCA9ICpvdXRwdXRfYnVmKysgKyBvdXRwdXRfY29sCisgICAgbGRyICAgICAgcjAsIGxvY2FsX09VVFBVVF9CVUYKKyAgICBsZHIgICAgICByMSwgbG9jYWxfT1VUUFVUX0NPTAorICAgIGxkciAgICAgIHIyLCBbcjBdLCAjNAorICAgIHN0ciAgICAgIHIwLCBsb2NhbF9PVVRQVVRfQlVGCisgICAgYWRkICAgICAgZnAsIHIyLCByMQorCisgICAgUExEICAgICAgKGlwLCAjMzIpCisgICAgbGRtaWEgICAgaXAhLCB7cjAtcjd9CisKKyAgICBjbXAgICAgICByMSwgIzAKKyAgICBvcnJlcXMgICByOCwgcjIsIHIzCisgICAgb3JyZXFzICAgcjgsIHI0LCByNQorICAgIG9ycmVxcyAgIHI4LCByNiwgcjcKKyAgICBiZXEgICAgICBITG9vcFRhaWxaZXJvCisKK0hMb29wSGVhZDoKKyAgICAvLyB0bXAxMCA9ICgoRENURUxFTSkgd3NwdHJbMF0gKyAoRENURUxFTSkgd3NwdHJbNF0pOyAgICAocjApCisgICAgLy8gdG1wMTEgPSAoKERDVEVMRU0pIHdzcHRyWzBdIC0gKERDVEVMRU0pIHdzcHRyWzRdKTsgICAgKHI0KQorICAgIGFkZCAgICAgcjAsIHIwLCByNAorICAgIHN1YiAgICAgcjQsIHIwLCByNCwgbHNsICMxCisKKyAgICAvLyB0bXAxMyA9ICgoRENURUxFTSkgd3NwdHJbMl0gKyAoRENURUxFTSkgd3NwdHJbNl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyKQorICAgIC8vIHRtcDEyID0gTVVMVElQTFkoKERDVEVMRU0pIHdzcHRyWzJdIC0gKERDVEVMRU0pIHdzcHRyWzZdLCBGSVhfMV80MTQyMTM1NjIpIC0gdG1wMTM7ICAocjYpCisgICAgLy8gRklYXy4uLiA9IDM2MCArIDIKKyAgICBhZGQgICAgIHIyLCByMiwgcjYKKyAgICBzdWIgICAgIHI2LCByMiwgcjYsIGxzbCAjMQorICAgIG1vdiAgICAgcjgsICMzNjAKKyAgICBhZGQgICAgIHI4LCByOCwgIzIKKyAgICBtdWwgICAgIHI2LCByOCwgcjYKKworICAgIC8vIHRtcDAgPSB0bXAxMCArIHRtcDEzOyAgIChyMCkKKyAgICAvLyB0bXAzID0gdG1wMTAgLSB0bXAxMzsgICAocjgpCisgICAgLy8gdG1wMSA9IHRtcDExICsgdG1wMTI7ICAgKHI0KQorICAgIC8vIHRtcDIgPSB0bXAxMSAtIHRtcDEyOyAgIChyNikKKyAgICBhZGQgICAgIHIwLCByMCwgcjIKKyAgICByc2IgICAgIHI2LCByMiwgcjYsIGFzciAjOAorICAgIHN1YiAgICAgcjgsIHIwLCByMiwgbHNsICMxCisgICAgYWRkICAgICByNCwgcjQsIHI2CisgICAgc3ViICAgICByNiwgcjQsIHI2LCBsc2wgIzEKKworICAgIHN0bWlhICAgbG9jYWxfVE1QMDEyMywge3IwLCByNCwgcjYsIHI4fQorCisgICAgLy8gT2RkIHBhcnQKKworICAgIC8vIHoxMyA9IChEQ1RFTEVNKSB3c3B0cls1XSArIChEQ1RFTEVNKSB3c3B0clszXTsgIChyMCkKKyAgICAvLyB6MTAgPSAoRENURUxFTSkgd3NwdHJbNV0gLSAoRENURUxFTSkgd3NwdHJbM107ICAocjIpCisgICAgLy8gejExID0gKERDVEVMRU0pIHdzcHRyWzFdICsgKERDVEVMRU0pIHdzcHRyWzddOyAgKHI0KQorICAgIC8vIHoxMiA9IChEQ1RFTEVNKSB3c3B0clsxXSAtIChEQ1RFTEVNKSB3c3B0cls3XTsgIChyNikKKyAgICBhZGQgIHIwLCByNSwgcjMKKyAgICBzdWIgIHIyLCByNSwgcjMKKyAgICBhZGQgIHI0LCByMSwgcjcKKyAgICBzdWIgIHI2LCByMSwgcjcKKworICAgIC8vIHRtcDcgPSB6MTEgKyB6MTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjcpCisgICAgLy8gdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IChyMSkKKyAgICAvLyBGSVhfLi4uID0gMzYwICsgMgorICAgIGFkZCAgIHI3LCByNCwgcjAKKyAgICBzdWIgICByMSwgcjQsIHIwCisgICAgbW92ICAgcjgsICMzNjAKKyAgICBhZGQgICByOCwgcjgsICMyCisgICAgbXVsICAgcjEsIHI4LCByMQorCisgICAgLy8gejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7ICAgICAgICAocjgpCisgICAgLy8gdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsgICAgICAocjApCisgICAgLy8gdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC0gRklYXzJfNjEzMTI1OTMwKSArIHo1OyAgICAocjIpCisgICAgLy8gRklYXzFfODQ3Ny4uLiA9IDQ3MyA9IDQ3MiArIDEKKyAgICAvLyBGSVhfMV8wODIuLi4gID0gMjc3ID0gMjc2ICsgMQorICAgIC8vIEZJWF8yXy4uLiAgICAgPSA2NjkgPSA2NjggKyAxCisgICAgYWRkICByOCwgcjIsIHI2CisgICAgbW92ICByOSwgIzQ3MgorICAgIG1sYSAgcjgsIHI5LCByOCwgcjgKKyAgICBtb3YgIHI5LCAjMjc2CisgICAgbWxhICByMCwgcjYsIHI5LCByNgorICAgIG1vdiAgcjksICM2NjgKKyAgICBtbGEgIHIyLCByOSwgcjIsIHIyCisgICAgc3ViICByMCwgcjAsIHI4CisgICAgc3ViICByMiwgcjgsIHIyCisKKyAgICAvLyB0bXA2ID0gdG1wMTIgLSB0bXA3OyAgKHI2KQorICAgIC8vIHRtcDUgPSB0bXAxMSAtIHRtcDY7ICAocjUpCisgICAgLy8gdG1wNCA9IHRtcDEwICsgdG1wNTsgIChyNCkKKyAgICByc2IgIHI2LCByNywgcjIsIGFzciAjOAorICAgIHJzYiAgcjUsIHI2LCByMSwgYXNyICM4CisgICAgYWRkICByNCwgcjUsIHIwLCBhc3IgIzgKKworICAgIGxkbWlhIGxvY2FsX1RNUDAxMjMsIHtyMCwgcjEsIHIyLCByM30KKworICAgIC8vIG91dHB0clswXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDAgKyB0bXA3LCBQQVNTMV9CSVRTKzMpICYgUkFOR0VfTUFTS107CisgICAgLy8gb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMCAtIHRtcDcsIFBBU1MxX0JJVFMrMykgJiBSQU5HRV9NQVNLXTsKKyAgICAvLyBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxICsgdG1wNiwgUEFTUzFfQklUUyszKSAmIFJBTkdFX01BU0tdOworICAgIC8vIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgLSB0bXA2LCBQQVNTMV9CSVRTKzMpICYgUkFOR0VfTUFTS107CisgICAgLy8gb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiArIHRtcDUsIFBBU1MxX0JJVFMrMykgJiBSQU5HRV9NQVNLXTsKKyAgICAvLyBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAyIC0gdG1wNSwgUEFTUzFfQklUUyszKSAmIFJBTkdFX01BU0tdOworICAgIC8vIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDMgKyB0bXA0LCBQQVNTMV9CSVRTKzMpICYgUkFOR0VfTUFTS107CisgICAgLy8gb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMyAtIHRtcDQsIFBBU1MxX0JJVFMrMykgJiBSQU5HRV9NQVNLXTsKKworICAgIG1vdiAgICByOCwgIzEyOAorICAgIGFkZCAgICByMCwgcjAsIHI3CisgICAgc3ViICAgIHI3LCByMCwgcjcsIGxzbCAjMQorICAgIGFkZCAgICByMCwgcjgsIHIwLCBhc3IgIzUKKyAgICBhZGQgICAgcjcsIHI4LCByNywgYXNyICM1CisgICAgYWRkICAgIHIxLCByMSwgcjYKKyAgICBzdWIgICAgcjYsIHIxLCByNiwgbHNsICMxCisgICAgYWRkICAgIHIxLCByOCwgcjEsIGFzciAjNQorICAgIGFkZCAgICByNiwgcjgsIHI2LCBhc3IgIzUKKyAgICBhZGQgICAgcjIsIHIyLCByNQorICAgIHN1YiAgICByNSwgcjIsIHI1LCBsc2wgIzEKKyAgICBhZGQgICAgcjIsIHI4LCByMiwgYXNyICM1CisgICAgYWRkICAgIHI1LCByOCwgcjUsIGFzciAjNQorICAgIHN1YiAgICByMywgcjMsIHI0CisgICAgYWRkICAgIHI0LCByMywgcjQsIGxzbCAjMQorICAgIGFkZCAgICByMywgcjgsIHIzLCBhc3IgIzUKKyAgICBhZGQgICAgcjQsIHI4LCByNCwgYXNyICM1CisKKyNpZiBfX0FSTV9BUkNIX18gPj0gNgorICAgIHVzYXQgICByMCwgIzgsIHIwCisgICAgdXNhdCAgIHIxLCAjOCwgcjEKKyAgICB1c2F0ICAgcjIsICM4LCByMgorICAgIHVzYXQgICByMywgIzgsIHIzCisgICAgdXNhdCAgIHI0LCAjOCwgcjQKKyAgICB1c2F0ICAgcjUsICM4LCByNQorICAgIHVzYXQgICByNiwgIzgsIHI2CisgICAgdXNhdCAgIHI3LCAjOCwgcjcKKyNlbHNlCisgICAgY21wICAgIHIwLCAjMjU1CisgICAgbXZuaGkgIHIwLCByMCwgYXNyICMzMQorICAgIGFuZGhpICByMCwgIzI1NQorICAgIGNtcCAgICByNywgIzI1NQorICAgIG12bmhpICByNywgcjcsIGFzciAjMzEKKyAgICBjbXAgICAgcjEsICMyNTUKKyAgICBtdm5oaSAgcjEsIHIxLCBhc3IgIzMxCisgICAgYW5kaGkgIHIxLCAjMjU1CisgICAgY21wICAgIHI2LCAjMjU1CisgICAgbXZuaGkgIHI2LCByNiwgYXNyICMzMQorICAgIGFuZGhpICByNiwgIzI1NQorICAgIGNtcCAgICByMiwgIzI1NQorICAgIG12bmhpICByMiwgcjIsIGFzciAjMzEKKyAgICBhbmRoaSAgcjIsICMyNTUKKyAgICBjbXAgICAgcjUsICMyNTUKKyAgICBtdm5oaSAgcjUsIHI1LCBhc3IgIzMxCisgICAgYW5kaGkgIHI1LCAjMjU1CisgICAgY21wICAgIHIzLCAjMjU1CisgICAgbXZuaGkgIHIzLCByMywgYXNyICMzMQorICAgIGNtcCAgICByNCwgIzI1NQorICAgIG12bmhpICByNCwgcjQsIGFzciAjMzEKKyAgICBhbmRoaSAgcjQsICMyNTUKKyNlbmRpZgorCisgICAgLy8gcjMgcjIgcjEgcjAKKyAgICBvcnIgICAgcjAsIHIwLCByMSwgbHNsICM4CisgICAgb3JyICAgIHIwLCByMCwgcjIsIGxzbCAjMTYKKyAgICBvcnIgICAgcjAsIHIwLCByMywgbHNsICMyNAorCisgICAgLy8gcjcgcjYgcjUgcjQKKyAgICBvcnIgICAgcjEsIHI0LCByNSwgbHNsICM4CisgICAgb3JyICAgIHIxLCByMSwgcjYsIGxzbCAjMTYKKyAgICBvcnIgICAgcjEsIHIxLCByNywgbHNsICMyNAorICAgIHN0bWlhICBmcCwge3IwLCByMX0KKworICAgIGFkZCAgICByMCwgc3AsICMob2ZmX1dPUktTUEFDRSArIDgqOCo0KQorICAgIGNtcCAgICBpcCwgcjAKKyAgICBibmUgICAgSExvb3BUYWlsCisKK0V4aXQ6CisgICAgYWRkICAgIHNwLCBzcCwgI2xvY2FsX1NJWkUKKyAgICBsZG1pYSAgc3AhLCB7cjQscjUsIHI2LHI3LCByOCxyOSwgcjEwLHIxMSwgcjEyLGxyfQorICAgIGJ4ICAgICBscgorCisKK1ZMb29wSGVhZFplcm86CisvLyBvaywgYWxsIEFDIGNvZWZmaWNpZW50cyBhcmUgMAorICAgIGxkciAgICAgIHIxLCBbcjEwLCAjUVkoMCldCisgICAgYWRkICAgICAgZnAsIGZwLCAjMgorICAgIGFkZCAgICAgIHIxMCwgcjEwLCAjNAorICAgIG11bCAgICAgIHIwLCByMSwgcjAKKyAgICBzdHIgICAgICByMCwgW2lwLCAjUVkoMCldCisgICAgc3RyICAgICAgcjAsIFtpcCwgI1FZKDEpXQorICAgIHN0ciAgICAgIHIwLCBbaXAsICNRWSgyKV0KKyAgICBzdHIgICAgICByMCwgW2lwLCAjUVkoMyldCisgICAgc3RyICAgICAgcjAsIFtpcCwgI1FZKDQpXQorICAgIHN0ciAgICAgIHIwLCBbaXAsICNRWSg1KV0KKyAgICBzdHIgICAgICByMCwgW2lwLCAjUVkoNildCisgICAgc3RyICAgICAgcjAsIFtpcCwgI1FZKDcpXQorICAgIGFkZCAgICAgIGlwLCBpcCwgIzQKKyAgICBhZGQgICAgICByMCwgc3AsICMob2ZmX1dPUktTUEFDRSArIDQqOCkKKyAgICBjbXAgICAgICBpcCwgcjAKKyAgICBiZXEgICAgICBITG9vcFN0YXJ0CisgICAgYiAgICAgICAgVkxvb3BUYWlsCisKK0hMb29wVGFpbFplcm86CisgICAgbW92ICAgICAgcjAsIHIwLCBhc3IgIzUKKyAgICBhZGQgICAgICByMCwgIzEyOAorCisjaWYgX19BUk1fQVJDSF9fID49IDYKKyAgICB1c2F0ICAgICByMCwgIzgsIHIwCisjZWxzZQorICAgIGNtcCAgICAgIHIwLCAjMjU1CisgICAgbXZuaGkgICAgcjAsIHIwLCBhc3IgIzMxCisgICAgYW5kaGkgICAgcjAsIHIwLCAjMjU1CisjZW5kaWYKKworICAgIG9yciAgICAgIHIwLCByMCwgbHNsICM4CisgICAgb3JyICAgICAgcjAsIHIwLCBsc2wgIzE2CisgICAgbW92ICAgICAgcjEsIHIwCisgICAgc3RtaWEgICAgZnAsIHtyMCwgcjF9CisKKyAgICBhZGQgICAgICByMCwgc3AsICMob2ZmX1dPUktTUEFDRSArIDY0KjQpCisgICAgY21wICAgICAgaXAsIHIwCisgICAgYmVxICAgICAgRXhpdAorICAgIGIgICAgICAgIEhMb29wVGFpbAorCisgICAgLmVuZGZ1bmMKZGlmZiAtLWdpdCBhL2ppZGN0ZnN0LmMgYi9qaWRjdGZzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTQyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9qaWRjdGZzdC5jCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogamlkY3Rmc3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQorICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KKyAqCisgKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCisgKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKKyAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKKyAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCisgKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgorICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCisgKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQorICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCisgKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKKyAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKKyAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgorICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKKyAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCisgKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCisgKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAorICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCisgKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCisgKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07CisgKiBzZWUgamlkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKKyAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCisgKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgorICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCisgKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKKyAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCisgKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCisgKgorICogVGhlIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgbm90IGludGVnZXJzIGJlY2F1c2UgdGhlIEFBJk4gc2NhbGluZworICogZmFjdG9ycyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkLiAgV2UgcmVwcmVzZW50IHRoZW0gc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMsCisgKiBzbyB0aGF0IHRoZSBmaXJzdCBhbmQgc2Vjb25kIElEQ1Qgcm91bmRzIGhhdmUgdGhlIHNhbWUgaW5wdXQgc2NhbGluZy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcywgd2UgY2hvb3NlIElGQVNUX1NDQUxFX0JJVFMgPSBQQVNTMV9CSVRTIHNvIGFzIHRvCisgKiBhdm9pZCBhIGRlc2NhbGluZyBzaGlmdDsgdGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSByYXRoZXIgZHJhc3RpY2FsbHkKKyAqIGZvciBzbWFsbCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcywgYnV0IGl0IHNhdmVzIGEgbG90IG9mIHNoaWZ0cy4KKyAqIEZvciAxMi1iaXQgSlNBTVBMRXMsIHRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyAxNngxNiBtdWx0aXBsaWVzIGFueXdheSwKKyAqIHNvIHdlIHVzZSBhIG11Y2ggbGFyZ2VyIHNjYWxpbmcgZmFjdG9yIHRvIHByZXNlcnZlIGFjY3VyYWN5LgorICoKKyAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5CisgKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCisgKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKKyAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgQ09OU1RfQklUUyAgOAorI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICA4CisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDgKKyNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICAoKElOVDMyKSAgMjc3KQkJLyogRklYKDEuMDgyMzkyMjAwKSAqLworI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgICgoSU5UMzIpICAzNjIpCQkvKiBGSVgoMS40MTQyMTM1NjIpICovCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDQ3MykJCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICAoKElOVDMyKSAgNjY5KQkJLyogRklYKDIuNjEzMTI1OTMwKSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICBGSVgoMS4wODIzOTIyMDApCisjZGVmaW5lIEZJWF8xXzQxNDIxMzU2MiAgRklYKDEuNDE0MjEzNTYyKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICBGSVgoMi42MTMxMjU5MzApCisjZW5kaWYKKworCisvKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAorICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKKyAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KKyAqLworCisjaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI3VuZGVmIERFU0NBTEUKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYSBEQ1RFTEVNIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50LCBhbmQgaW1tZWRpYXRlbHkKKyAqIGRlc2NhbGUgdG8geWllbGQgYSBEQ1RFTEVNIHJlc3VsdC4KKyAqLworCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoRENURUxFTSkgREVTQ0FMRSgodmFyKSAqIChjb25zdCksIENPTlNUX0JJVFMpKQorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYSBEQ1RFTEVNIHJlc3VsdC4gIEZvciA4LWJpdCBkYXRhIGEgMTZ4MTYtPjE2CisgKiBtdWx0aXBsaWNhdGlvbiB3aWxsIGRvLiAgRm9yIDEyLWJpdCBkYXRhLCB0aGUgbXVsdGlwbGllciB0YWJsZSBpcworICogZGVjbGFyZWQgSU5UMzIsIHNvIGEgMzItYml0IG11bHRpcGx5IHdpbGwgYmUgdXNlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSUZBU1RfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKKyNlbHNlCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgIFwKKwlERVNDQUxFKChjb2VmKSoocXVhbnR2YWwpLCBJRkFTVF9TQ0FMRV9CSVRTLVBBU1MxX0JJVFMpCisjZW5kaWYKKworCisvKiBMaWtlIERFU0NBTEUsIGJ1dCBhcHBsaWVzIHRvIGEgRENURUxFTSBhbmQgcHJvZHVjZXMgYW4gaW50LgorICogV2UgYXNzdW1lIHRoYXQgaW50IHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkIGlmIElOVDMyIHJpZ2h0IHNoaWZ0IGlzLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJRENURUxFTSBpc2hpZnRfdGVtcDsKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBEQ1RFTEVNQklUUyAgMTYJCS8qIERDVEVMRU0gbWF5IGJlIDE2IG9yIDMyIGJpdHMgKi8KKyNlbHNlCisjZGVmaW5lIERDVEVMRU1CSVRTICAzMgkJLyogRENURUxFTSBtdXN0IGJlIDMyIGJpdHMgKi8KKyNlbmRpZgorI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorICAgICgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKyAgICAgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4oKERDVEVMRU0pIDApKSA8PCAoRENURUxFTUJJVFMtKHNoZnQpKSkgOiBcCisgICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKyNpZmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKKyNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCgoeCkgKyAoMSA8PCAoKG4pLTEpKSwgbikpCisjZWxzZQorI2RlZmluZSBJREVTQ0FMRSh4LG4pICAoKGludCkgSVJJR0hUX1NISUZUKHgsIG4pKQorI2VuZGlmCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfaWZhc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBEQ1RFTEVNIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIERDVEVMRU0gdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIERDVEVMRU0gejUsIHoxMCwgejExLCB6MTIsIHoxMzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElGQVNUX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCQkJLyogZm9yIERFU0NBTEUgKi8KKyAgSVNISUZUX1RFTVBTCQkJLyogZm9yIElERVNDQUxFICovCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisgICAgCisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIGludCBkY3ZhbCA9IChpbnQpIERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsJLyogcGhhc2UgMyAqLworICAgIHRtcDExID0gdG1wMCAtIHRtcDI7CisKKyAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOwkvKiBwaGFzZXMgNS0zICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzOyAvKiAyKmM0ICovCisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXA0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXA1ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXA2ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXA3ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKKworICAgIHoxMyA9IHRtcDYgKyB0bXA1OwkJLyogcGhhc2UgNiAqLworICAgIHoxMCA9IHRtcDYgLSB0bXA1OworICAgIHoxMSA9IHRtcDQgKyB0bXA3OworICAgIHoxMiA9IHRtcDQgLSB0bXA3OworCisgICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgKHRtcDAgKyB0bXA3KTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgKHRtcDAgLSB0bXA3KTsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgKHRtcDEgKyB0bXA2KTsKKyAgICB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgKHRtcDEgLSB0bXA2KTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgKHRtcDIgKyB0bXA1KTsKKyAgICB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgKHRtcDIgLSB0bXA1KTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgKHRtcDMgKyB0bXA0KTsKKyAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgKHRtcDMgLSB0bXA0KTsKKworICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIHF1YW50cHRyKys7CisgICAgd3NwdHIrKzsKKyAgfQorICAKKyAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCisgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KKyAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KKyAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KKyAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQorICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KKyAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KKyAgICAgKi8KKyAgICAKKyNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAorICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbSURFU0NBTEUod3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clszXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzRdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls2XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzddID0gZGN2YWw7CisKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMTAgPSAoKERDVEVMRU0pIHdzcHRyWzBdICsgKERDVEVMRU0pIHdzcHRyWzRdKTsKKyAgICB0bXAxMSA9ICgoRENURUxFTSkgd3NwdHJbMF0gLSAoRENURUxFTSkgd3NwdHJbNF0pOworCisgICAgdG1wMTMgPSAoKERDVEVMRU0pIHdzcHRyWzJdICsgKERDVEVMRU0pIHdzcHRyWzZdKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKChEQ1RFTEVNKSB3c3B0clsyXSAtIChEQ1RFTEVNKSB3c3B0cls2XSwgRklYXzFfNDE0MjEzNTYyKQorCSAgICAtIHRtcDEzOworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEzID0gKERDVEVMRU0pIHdzcHRyWzVdICsgKERDVEVMRU0pIHdzcHRyWzNdOworICAgIHoxMCA9IChEQ1RFTEVNKSB3c3B0cls1XSAtIChEQ1RFTEVNKSB3c3B0clszXTsKKyAgICB6MTEgPSAoRENURUxFTSkgd3NwdHJbMV0gKyAoRENURUxFTSkgd3NwdHJbN107CisgICAgejEyID0gKERDVEVMRU0pIHdzcHRyWzFdIC0gKERDVEVMRU0pIHdzcHRyWzddOworCisgICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IHNjYWxlIGRvd24gYnkgYSBmYWN0b3Igb2YgOCBhbmQgcmFuZ2UtbGltaXQgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDAgKyB0bXA3LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwIC0gdG1wNywgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMSArIHRtcDYsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgLSB0bXA2LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAyICsgdG1wNSwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiAtIHRtcDUsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDMgKyB0bXA0LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzIC0gdG1wNCwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2ppZGN0aW50LmMgYi9qaWRjdGludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9qaWRjdGludC5jCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogamlkY3RpbnQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KKyAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAorICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKKyAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgorICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCisgKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCisgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKKyAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgorICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyoKKyAqIFRoZSBwb29wIG9uIHRoaXMgc2NhbGluZyBzdHVmZiBpcyBhcyBmb2xsb3dzOgorICoKKyAqIEVhY2ggMS1EIElEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCisgKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBJRENUIG91dHB1dHMuICBUaGUgZmluYWwgb3V0cHV0cyBhcmUgdGhlcmVmb3JlCisgKiBhIGZhY3RvciBvZiBOIGxhcmdlciB0aGFuIGRlc2lyZWQ7IHNpbmNlIE49OCB0aGlzIGNhbiBiZSBjdXJlZCBieQorICogYSBzaW1wbGUgcmlnaHQgc2hpZnQgYXQgdGhlIGVuZCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGFkdmFudGFnZSBvZgorICogdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IHdlIHNhdmUgdHdvIG11bHRpcGxpY2F0aW9ucyBwZXIgMS1EIElEQ1QsCisgKiBiZWNhdXNlIHRoZSB5MCBhbmQgeTQgaW5wdXRzIG5lZWQgbm90IGJlIGRpdmlkZWQgYnkgc3FydChOKS4KKyAqCisgKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCisgKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCisgKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKKyAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCisgKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQorICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCisgKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCisgKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKKyAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKKyAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCisgKgorICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAorICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cworICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAorICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChUbyBzY2FsZSB1cCAxMi1iaXQgc2FtcGxlIGRhdGEgZnVydGhlciwgYW4KKyAqIGludGVybWVkaWF0ZSBJTlQzMiBhcnJheSB3b3VsZCBiZSBuZWVkZWQuKQorICoKKyAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0CisgKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKKyAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLworI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLworI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQorI2Vsc2UKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0CisgKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KKyAqLworCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfaXNsb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIElEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisgICAgCisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKKyAgICAgIAorICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOworICAgICAgCisgICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICAgIHF1YW50cHRyKys7CisgICAgICB3c3B0cisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIAorICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOworICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKworICAgIHRtcDAgPSAoejIgKyB6MykgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKHoyIC0gejMpIDw8IENPTlNUX0JJVFM7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCisgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgCisgICAgejEgPSB0bXAwICsgdG1wMzsKKyAgICB6MiA9IHRtcDEgKyB0bXAyOworICAgIHozID0gdG1wMCArIHRtcDI7CisgICAgejQgPSB0bXAxICsgdG1wMzsKKyAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAxID0gTVVMVElQTFkodG1wMSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDIsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICAKKyAgICB6MyArPSB6NTsKKyAgICB6NCArPSB6NTsKKyAgICAKKyAgICB0bXAwICs9IHoxICsgejM7CisgICAgdG1wMSArPSB6MiArIHo0OworICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICB0bXAzICs9IHoxICsgejQ7CisgICAgCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqNl0gPSAoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgCisgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgcXVhbnRwdHIrKzsKKyAgICB3c3B0cisrOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMywgKi8KKyAgLyogYW5kIGFsc28gdW5kbyB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgorICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbworICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgorICAgICAqIE9uIG1hY2hpbmVzIHdpdGggdmVyeSBmYXN0IG11bHRpcGxpY2F0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCisgICAgICogdGVzdCB0YWtlcyBtb3JlIHRpbWUgdGhhbiBpdCdzIHdvcnRoLiAgSW4gdGhhdCBjYXNlIHRoaXMgc2VjdGlvbgorICAgICAqIG1heSBiZSBjb21tZW50ZWQgb3V0LgorICAgICAqLworICAgIAorI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzRdID09IDAgJiYKKwl3c3B0cls1XSA9PSAwICYmIHdzcHRyWzZdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clszXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzRdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls2XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzddID0gZGN2YWw7CisKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIAorICAgIHoyID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOworICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdICsgKElOVDMyKSB3c3B0cls0XSkgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKChJTlQzMikgd3NwdHJbMF0gLSAoSU5UMzIpIHdzcHRyWzRdKSA8PCBDT05TVF9CSVRTOworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cworICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgorICAgICAqLworICAgIAorICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzddOworICAgIHRtcDEgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHRtcDIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHRtcDMgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIAorICAgIHoxID0gdG1wMCArIHRtcDM7CisgICAgejIgPSB0bXAxICsgdG1wMjsKKyAgICB6MyA9IHRtcDAgKyB0bXAyOworICAgIHo0ID0gdG1wMSArIHRtcDM7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICAKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgCisgICAgejMgKz0gejU7CisgICAgejQgKz0gejU7CisgICAgCisgICAgdG1wMCArPSB6MSArIHozOworICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICB0bXAyICs9IHoyICsgejM7CisgICAgdG1wMyArPSB6MSArIHo0OworICAgIAorICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KKyAgICAKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSArIHRtcDIsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDEsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfSVNMT1dfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qaWRjdHJlZC5jIGIvamlkY3RyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFmM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvamlkY3RyZWQuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIGppZGN0cmVkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbnZlcnNlLURDVCByb3V0aW5lcyB0aGF0IHByb2R1Y2UgcmVkdWNlZC1zaXplIG91dHB1dDoKKyAqIGVpdGhlciA0eDQsIDJ4Miwgb3IgMXgxIHBpeGVscyBmcm9tIGFuIDh4OCBEQ1QgYmxvY2suCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBMb2VmZmxlciwgTGlndGVuYmVyZyBhbmQgTW9zY2h5dHogKExMJk0pCisgKiBhbGdvcml0aG0gdXNlZCBpbiBqaWRjdGludC5jLiAgV2Ugc2ltcGx5IHJlcGxhY2UgZWFjaCA4LXRvLTggMS1EIElEQ1Qgc3RlcAorICogd2l0aCBhbiA4LXRvLTQgc3RlcCB0aGF0IHByb2R1Y2VzIHRoZSBmb3VyIGF2ZXJhZ2VzIG9mIHR3byBhZGphY2VudCBvdXRwdXRzCisgKiAob3IgYW4gOC10by0yIHN0ZXAgcHJvZHVjaW5nIHR3byBhdmVyYWdlcyBvZiBmb3VyIG91dHB1dHMsIGZvciAyeDIgb3V0cHV0KS4KKyAqIFRoZXNlIHN0ZXBzIHdlcmUgZGVyaXZlZCBieSBjb21wdXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBub3JtYWwgTEwmTSBjb2RlLCB0aGVuIHNpbXBsaWZ5aW5nIGFzIG11Y2ggYXMgcG9zc2libGUuCisgKgorICogMXgxIGlzIHRyaXZpYWw6IGp1c3QgdGFrZSB0aGUgREMgY29lZmZpY2llbnQgZGl2aWRlZCBieSA4LgorICoKKyAqIFNlZSBqaWRjdGludC5jIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qIFNjYWxpbmcgaXMgdGhlIHNhbWUgYXMgaW4gamlkY3RpbnQuYy4gKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDIKKyNlbHNlCisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDEzCisjZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgKChJTlQzMikgIDE3MzApCS8qIEZJWCgwLjIxMTE2NDI0MykgKi8KKyNkZWZpbmUgRklYXzBfNTA5Nzk1NTc5ICAoKElOVDMyKSAgNDE3NikJLyogRklYKDAuNTA5Nzk1NTc5KSAqLworI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgICgoSU5UMzIpICA0OTI2KQkvKiBGSVgoMC42MDEzNDQ4ODcpICovCisjZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgKChJTlQzMikgIDU5MDYpCS8qIEZJWCgwLjcyMDk1OTgyMikgKi8KKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgICgoSU5UMzIpICA2OTY3KQkvKiBGSVgoMC44NTA0MzAwOTUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMDYxNTk0MzM3ICAoKElOVDMyKSAgODY5NykJLyogRklYKDEuMDYxNTk0MzM3KSAqLworI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgICgoSU5UMzIpICAxMDQyNikJLyogRklYKDEuMjcyNzU4NTgwKSAqLworI2RlZmluZSBGSVhfMV80NTE3NzQ5ODEgICgoSU5UMzIpICAxMTg5MykJLyogRklYKDEuNDUxNzc0OTgxKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgICgoSU5UMzIpICAxNzc5OSkJLyogRklYKDIuMTcyNzM0ODAzKSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgICgoSU5UMzIpICAyOTY5MikJLyogRklYKDMuNjI0NTA5Nzg1KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjExMTY0MjQzICBGSVgoMC4yMTExNjQyNDMpCisjZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgRklYKDAuNTA5Nzk1NTc5KQorI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgIEZJWCgwLjYwMTM0NDg4NykKKyNkZWZpbmUgRklYXzBfNzIwOTU5ODIyICBGSVgoMC43MjA5NTk4MjIpCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQorI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgIEZJWCgwLjg1MDQzMDA5NSkKKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCisjZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgRklYKDEuMDYxNTk0MzM3KQorI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgIEZJWCgxLjI3Mjc1ODU4MCkKKyNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICBGSVgoMS40NTE3NzQ5ODEpCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgIEZJWCgyLjE3MjczNDgwMykKKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCisjZGVmaW5lIEZJWF8zXzYyNDUwOTc4NSAgRklYKDMuNjI0NTA5Nzg1KQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgorICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQorICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQorICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KKyAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCisjZWxzZQorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKworLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCisgKiBlbnRyeTsgcHJvZHVjZSBhbiBpbnQgcmVzdWx0LiAgSW4gdGhpcyBtb2R1bGUsIGJvdGggaW5wdXRzIGFuZCByZXN1bHQKKyAqIGFyZSAxNiBiaXRzIG9yIGxlc3MsIHNvIGVpdGhlciBpbnQgb3Igc2hvcnQgbXVsdGlwbHkgd2lsbCB3b3JrLgorICovCisKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSVNMT1dfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA0eDQgb3V0cHV0IGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzR4NCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAyLCB0bXAxMCwgdG1wMTI7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRSo0XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW4gNCwgYmVjYXVzZSBzZWNvbmQgcGFzcyB3b24ndCB1c2UgaXQgKi8KKyAgICBpZiAoY3RyID09IERDVFNJWkUtNCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCisJaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm0gNCBmb3IgNHg0IG91dHB1dCAqLworICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOworICAgICAgCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7CisgICAgICAKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSAoQ09OU1RfQklUUysxKTsKKyAgICAKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMiA9IE1VTFRJUExZKHoyLCBGSVhfMV84NDc3NTkwNjUpICsgTVVMVElQTFkoejMsIC0gRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLworCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCisJICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KKwkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3MgNCByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KKworI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworICAgICAgCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzJdID0gZGN2YWw7CisgICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgICAgY29udGludWU7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysxKTsKKyAgICAKKyAgICB0bXAyID0gTVVMVElQTFkoKElOVDMyKSB3c3B0clsyXSwgRklYXzFfODQ3NzU5MDY1KQorCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNl0sIC0gRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbN107CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHozID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbMV07CisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLworCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCisJICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KKwkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAyLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICAKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSAyeDIgb3V0cHV0IGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzJ4MiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxMCwgejE7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFKjJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrLCBjdHItLSkgeworICAgIC8qIERvbid0IGJvdGhlciB0byBwcm9jZXNzIGNvbHVtbnMgMiw0LDYgKi8KKyAgICBpZiAoY3RyID09IERDVFNJWkUtMiB8fCBjdHIgPT0gRENUU0laRS00IHx8IGN0ciA9PSBEQ1RTSVpFLTYpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqM10gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm1zIDIsNCw2IGZvciAyeDIgb3V0cHV0ICovCisgICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7CisgICAgICAKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAxMCA9IHoxIDw8IChDT05TVF9CSVRTKzIpOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzcyMDk1OTgyMik7IC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDAgKz0gTVVMVElQTFkoejEsIEZJWF8wXzg1MDQzMDA5NSk7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1K2M3KSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCAtIEZJWF8xXzI3Mjc1ODU4MCk7IC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfM182MjQ1MDk3ODUpOyAvKiBzcXJ0KDIpICogKGMxK2MzK2M1K2M3KSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisgICAgCisgICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7CisgIH0KKyAgCisgIC8qIFBhc3MgMjogcHJvY2VzcyAyIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAyOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogSXQncyBub3QgY2xlYXIgd2hldGhlciBhIHplcm8gcm93IHRlc3QgaXMgd29ydGh3aGlsZSBoZXJlIC4uLiAqLworCisjaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKKyAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzVdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICAKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gKChJTlQzMikgd3NwdHJbMF0pIDw8IChDT05TVF9CSVRTKzIpOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAwID0gTVVMVElQTFkoKElOVDMyKSB3c3B0cls3XSwgLSBGSVhfMF83MjA5NTk4MjIpIC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0cls1XSwgRklYXzBfODUwNDMwMDk1KSAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KKwkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzNdLCAtIEZJWF8xXzI3Mjc1ODU4MCkgLyogc3FydCgyKSAqICgtYzErYzMtYzUtYzcpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clsxXSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzIpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMXgxIG91dHB1dCBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xeDEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgaW50IGRjdmFsOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBXZSBoYXJkbHkgbmVlZCBhbiBpbnZlcnNlIERDVCByb3V0aW5lIGZvciB0aGlzOiBqdXN0IHRha2UgdGhlCisgICAqIGF2ZXJhZ2UgcGl4ZWwgdmFsdWUsIHdoaWNoIGlzIG9uZS1laWdodGggb2YgdGhlIERDIGNvZWZmaWNpZW50LgorICAgKi8KKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgZGN2YWwgPSBERVFVQU5USVpFKGNvZWZfYmxvY2tbMF0sIHF1YW50cHRyWzBdKTsKKyAgZGN2YWwgPSAoaW50KSBERVNDQUxFKChJTlQzMikgZGN2YWwsIDMpOworCisgIG91dHB1dF9idWZbMF1bb3V0cHV0X2NvbF0gPSByYW5nZV9saW1pdFtkY3ZhbCAmIFJBTkdFX01BU0tdOworfQorCisjZW5kaWYgLyogSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvamluY2x1ZGUuaCBiL2ppbmNsdWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0ZjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2ppbmNsdWRlLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGppbmNsdWRlLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBleGlzdHMgdG8gcHJvdmlkZSBhIHNpbmdsZSBwbGFjZSB0byBmaXggYW55IHByb2JsZW1zIHdpdGgKKyAqIGluY2x1ZGluZyB0aGUgd3Jvbmcgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAoQ29tbW9uIHByb2JsZW1zIGFyZSB0YWtlbgorICogY2FyZSBvZiBieSB0aGUgc3RhbmRhcmQgamNvbmZpZyBzeW1ib2xzLCBidXQgb24gcmVhbGx5IHdlaXJkIHN5c3RlbXMKKyAqIHlvdSBtYXkgaGF2ZSB0byBlZGl0IHRoaXMgZmlsZS4pCisgKgorICogTk9URTogdGhpcyBmaWxlIGlzIE5PVCBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCisgKiBKUEVHIGxpYnJhcnkuICBNb3N0IGFwcGxpY2F0aW9ucyBuZWVkIG9ubHkgaW5jbHVkZSBqcGVnbGliLmguCisgKi8KKworCisvKiBJbmNsdWRlIGF1dG8tY29uZmlnIGZpbGUgdG8gZmluZCBvdXQgd2hpY2ggc3lzdGVtIGluY2x1ZGUgZmlsZXMgd2UgbmVlZC4gKi8KKworI2luY2x1ZGUgImpjb25maWcuaCIJCS8qIGF1dG8gY29uZmlndXJhdGlvbiBvcHRpb25zICovCisjZGVmaW5lIEpDT05GSUdfSU5DTFVERUQJLyogc28gdGhhdCBqcGVnbGliLmggZG9lc24ndCBkbyBpdCBhZ2FpbiAqLworCisvKgorICogV2UgbmVlZCB0aGUgTlVMTCBtYWNybyBhbmQgc2l6ZV90IHR5cGVkZWYuCisgKiBPbiBhbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtIGl0IGlzIHN1ZmZpY2llbnQgdG8gaW5jbHVkZSA8c3RkZGVmLmg+LgorICogT3RoZXJ3aXNlLCB3ZSBnZXQgdGhlbSBmcm9tIDxzdGRsaWIuaD4gb3IgPHN0ZGlvLmg+OyB3ZSBtYXkgaGF2ZSB0bworICogcHVsbCBpbiA8c3lzL3R5cGVzLmg+IGFzIHdlbGwuCisgKiBOb3RlIHRoYXQgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IHJlcXVpcmUgPHN0ZGlvLmg+OworICogb25seSB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGFuZCBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGVzIGRvLgorICogQnV0IHdlIG11c3QgcHVsbCBpdCBpbiBiZWNhdXNlIG9mIHRoZSByZWZlcmVuY2VzIHRvIEZJTEUgaW4ganBlZ2xpYi5oLgorICogWW91IGNhbiByZW1vdmUgdGhvc2UgcmVmZXJlbmNlcyBpZiB5b3Ugd2FudCB0byBjb21waWxlIHdpdGhvdXQgPHN0ZGlvLmg+LgorICovCisKKyNpZmRlZiBIQVZFX1NURERFRl9ICisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgTkVFRF9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICogV2UgbmVlZCBtZW1vcnkgY29weWluZyBhbmQgemVyb2luZyBmdW5jdGlvbnMsIHBsdXMgc3RybmNweSgpLgorICogQU5TSSBhbmQgU3lzdGVtIFYgaW1wbGVtZW50YXRpb25zIGRlY2xhcmUgdGhlc2UgaW4gPHN0cmluZy5oPi4KKyAqIEJTRCBkb2Vzbid0IGhhdmUgdGhlIG1lbSgpIGZ1bmN0aW9ucywgYnV0IGl0IGRvZXMgaGF2ZSBiY29weSgpL2J6ZXJvKCkuCisgKiBTb21lIHN5c3RlbXMgbWF5IGRlY2xhcmUgbWVtc2V0IGFuZCBtZW1jcHkgaW4gPG1lbW9yeS5oPi4KKyAqCisgKiBOT1RFOiB3ZSBhc3N1bWUgdGhlIHNpemUgcGFyYW1ldGVycyB0byB0aGVzZSBmdW5jdGlvbnMgYXJlIG9mIHR5cGUgc2l6ZV90LgorICogQ2hhbmdlIHRoZSBjYXN0cyBpbiB0aGVzZSBtYWNyb3MgaWYgbm90IQorICovCisKKyNpZmRlZiBORUVEX0JTRF9TVFJJTkdTCisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZGVmaW5lIE1FTVpFUk8odGFyZ2V0LHNpemUpCWJ6ZXJvKCh2b2lkICopKHRhcmdldCksIChzaXplX3QpKHNpemUpKQorI2RlZmluZSBNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCWJjb3B5KChjb25zdCB2b2lkICopKHNyYyksICh2b2lkICopKGRlc3QpLCAoc2l6ZV90KShzaXplKSkKKworI2Vsc2UgLyogbm90IEJTRCwgYXNzdW1lIEFOU0kvU3lzViBzdHJpbmcgbGliICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNkZWZpbmUgTUVNWkVSTyh0YXJnZXQsc2l6ZSkJbWVtc2V0KCh2b2lkICopKHRhcmdldCksIDAsIChzaXplX3QpKHNpemUpKQorI2RlZmluZSBNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCW1lbWNweSgodm9pZCAqKShkZXN0KSwgKGNvbnN0IHZvaWQgKikoc3JjKSwgKHNpemVfdCkoc2l6ZSkpCisKKyNlbmRpZgorCisvKgorICogSW4gQU5TSSBDLCBhbmQgaW5kZWVkIGFueSByYXRpb25hbCBpbXBsZW1lbnRhdGlvbiwgc2l6ZV90IGlzIGFsc28gdGhlCisgKiB0eXBlIHJldHVybmVkIGJ5IHNpemVvZigpLiAgSG93ZXZlciwgaXQgc2VlbXMgdGhlcmUgYXJlIHNvbWUgaXJyYXRpb25hbAorICogaW1wbGVtZW50YXRpb25zIG91dCB0aGVyZSwgaW4gd2hpY2ggc2l6ZW9mKCkgcmV0dXJucyBhbiBpbnQgZXZlbiB0aG91Z2gKKyAqIHNpemVfdCBpcyBkZWZpbmVkIGFzIGxvbmcgb3IgdW5zaWduZWQgbG9uZy4gIFRvIGVuc3VyZSBjb25zaXN0ZW50IHJlc3VsdHMKKyAqIHdlIGFsd2F5cyB1c2UgdGhpcyBTSVpFT0YoKSBtYWNybyBpbiBwbGFjZSBvZiB1c2luZyBzaXplb2YoKSBkaXJlY3RseS4KKyAqLworCisjZGVmaW5lIFNJWkVPRihvYmplY3QpCSgoc2l6ZV90KSBzaXplb2Yob2JqZWN0KSkKKworLyoKKyAqIFRoZSBtb2R1bGVzIHRoYXQgdXNlIGZyZWFkKCkgYW5kIGZ3cml0ZSgpIGFsd2F5cyBpbnZva2UgdGhlbSB0aHJvdWdoCisgKiB0aGVzZSBtYWNyb3MuICBPbiBzb21lIHN5c3RlbXMgeW91IG1heSBuZWVkIHRvIHR3aWRkbGUgdGhlIGFyZ3VtZW50IGNhc3RzLgorICogQ0FVVElPTjogYXJndW1lbnQgb3JkZXIgaXMgZGlmZmVyZW50IGZyb20gdW5kZXJseWluZyBmdW5jdGlvbnMhCisgKi8KKworI2RlZmluZSBKRlJFQUQoZmlsZSxidWYsc2l6ZW9mYnVmKSAgXAorICAoKHNpemVfdCkgZnJlYWQoKHZvaWQgKikgKGJ1ZiksIChzaXplX3QpIDEsIChzaXplX3QpIChzaXplb2ZidWYpLCAoZmlsZSkpKQorI2RlZmluZSBKRldSSVRFKGZpbGUsYnVmLHNpemVvZmJ1ZikgIFwKKyAgKChzaXplX3QpIGZ3cml0ZSgoY29uc3Qgdm9pZCAqKSAoYnVmKSwgKHNpemVfdCkgMSwgKHNpemVfdCkgKHNpemVvZmJ1ZiksIChmaWxlKSkpCmRpZmYgLS1naXQgYS9qbWVtLWFuZHJvaWQuYyBiL2ptZW0tYW5kcm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTRkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9qbWVtLWFuZHJvaWQuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOworZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOworI2VuZGlmCisKKyNpZm5kZWYgU0VFS19TRVQJCS8qIHByZS1BTlNJIHN5c3RlbXMgbWF5IG5vdCBkZWZpbmUgdGhpczsgKi8KKyNkZWZpbmUgU0VFS19TRVQgIDAJCS8qIGlmIG5vdCwgYXNzdW1lIDAgaXMgY29ycmVjdCAqLworI2VuZGlmCisKKworLyoKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKKyAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCisgKi8KKworR0xPQkFMKHZvaWQgKikKK2pwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgorICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKKyAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCisgKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCisgKi8KKworR0xPQkFMKHZvaWQgRkFSICopCitqcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKKyAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCisgKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0CisgKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgorICovCisKKyNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLworI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTEwMDAwMDAwTCAvKiBkZWZhdWx0OiB0ZW4gbWVnYWJ5dGUgKi8KKyNlbmRpZgorCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCisJCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCit7CisgIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOworICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCisgICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKKyAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCit7CisgIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOworICAvKiBTaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdG1wZmlsZSgpIHRvIGNyZWF0ZSB0aGUgZmlsZSwKKyAgICogbm8gZXhwbGljaXQgZmlsZSBkZWxldGlvbiBpcyBuZWVkZWQuCisgICAqLworfQorCitzdGF0aWMgRklMRSogZ2V0VGVtcEZpbGVGcm9tUGF0aChjb25zdCBjaGFyICogcGF0aCkgeworICAgIEZJTEUgKiBmZCA9IGZvcGVuKHBhdGgsICJ3KyIpOworICAgIHVubGluayhwYXRoKTsKKyAgICByZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBGSUxFKiBnZXRUZW1wRmlsZSgpIHsKKyAgICBjaGFyIHBhdGhbMTAyNF07CisgICAgc25wcmludGYocGF0aCwgMTAyMywgIi9zZGNhcmQvLiVkLnRtcCIsIGdldHBpZCgpKTsKKyAgICBGSUxFICogZmQgPSBnZXRUZW1wRmlsZUZyb21QYXRoKHBhdGgpOworICAgIGlmIChmZCA9PSBOVUxMKSB7CisgICAgICAgIC8vIGFueXdoZXJlIGVsc2Ugd2UgY2FuIGNyZWF0ZSBhIHRlbXAgZmlsZT8KKwkJLy8JICAgIHNucHJpbnRmKHBhdGgsIDEwMjMsICIvZGF0YS9kYXRhLy4lZC50bXAiLCBnZXRwaWQoKSk7CisJCS8vICAgICAgZmQgPSBnZXRUZW1wRmlsZUZyb21QYXRoKHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKKy8qCisgKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KKyAqCisgKiBUaGlzIHZlcnNpb24gdXNlcyB0bXBmaWxlKCksIHdoaWNoIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBmaWxlIG5hbWUKKyAqIGJlaGluZCB0aGUgc2NlbmVzLiAgV2UgZG9uJ3QgaGF2ZSB0byB1c2UgaW5mby0+dGVtcF9uYW1lW10gYXQgYWxsOworICogaW5kZWVkLCB3ZSBjYW4ndCBldmVuIGZpbmQgb3V0IHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdGVtcCBmaWxlLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgaWYgKChpbmZvLT50ZW1wX2ZpbGUgPSBnZXRUZW1wRmlsZSgpKSA9PSBOVUxMKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOworICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KK30KKworR0xPQkFMKHZvaWQpCitqcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KZGlmZiAtLWdpdCBhL2ptZW1hbnNpLmMgYi9qbWVtYW5zaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTNlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9qbWVtYW5zaS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogam1lbWFuc2kuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgc2ltcGxlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KKyAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgorICogYXNzdW1lcyB0aGF0IHlvdSBoYXZlIHRoZSBBTlNJLXN0YW5kYXJkIGxpYnJhcnkgcm91dGluZSB0bXBmaWxlKCkuCisgKiBBbHNvLCB0aGUgcHJvYmxlbSBvZiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUKKyAqIGlzIHNob3ZlZCBvbnRvIHRoZSB1c2VyLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KK2V4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKK2V4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfU0VUCQkvKiBwcmUtQU5TSSBzeXN0ZW1zIG1heSBub3QgZGVmaW5lIHRoaXM7ICovCisjZGVmaW5lIFNFRUtfU0VUICAwCQkvKiBpZiBub3QsIGFzc3VtZSAwIGlzIGNvcnJlY3QgKi8KKyNlbmRpZgorCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KKyAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCisgKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAorICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgorICovCisKK0dMT0JBTCh2b2lkIEZBUiAqKQoranBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCisgKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgorICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAorICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KKyAqLworCisjaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwTCAvKiBkZWZhdWx0OiBvbmUgbWVnYWJ5dGUgKi8KKyNlbmRpZgorCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCisJCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCit7CisgIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOworICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCisgICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKKyAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCit7CisgIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOworICAvKiBTaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdG1wZmlsZSgpIHRvIGNyZWF0ZSB0aGUgZmlsZSwKKyAgICogbm8gZXhwbGljaXQgZmlsZSBkZWxldGlvbiBpcyBuZWVkZWQuCisgICAqLworfQorCisKKy8qCisgKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KKyAqCisgKiBUaGlzIHZlcnNpb24gdXNlcyB0bXBmaWxlKCksIHdoaWNoIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBmaWxlIG5hbWUKKyAqIGJlaGluZCB0aGUgc2NlbmVzLiAgV2UgZG9uJ3QgaGF2ZSB0byB1c2UgaW5mby0+dGVtcF9uYW1lW10gYXQgYWxsOworICogaW5kZWVkLCB3ZSBjYW4ndCBldmVuIGZpbmQgb3V0IHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdGVtcCBmaWxlLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgaWYgKChpbmZvLT50ZW1wX2ZpbGUgPSB0bXBmaWxlKCkpID09IE5VTEwpCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiIik7CisgIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfYmFja2luZ19zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9iYWNraW5nX3N0b3JlOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICByZXR1cm4gREVGQVVMVF9NQVhfTUVNOwkvKiBkZWZhdWx0IGZvciBtYXhfbWVtb3J5X3RvX3VzZSAqLworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQpkaWZmIC0tZ2l0IGEvam1lbWRvcy5jIGIvam1lbWRvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjQ1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qbWVtZG9zLmMKQEAgLTAsMCArMSw2MzggQEAKKy8qCisgKiBqbWVtZG9zLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBNUy1ET1MtY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQorICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUZW1wb3JhcnkgZGF0YSBjYW4gYmUKKyAqIHN0b3JlZCBpbiBleHRlbmRlZCBvciBleHBhbmRlZCBtZW1vcnkgYXMgd2VsbCBhcyBpbiByZWd1bGFyIERPUyBmaWxlcy4KKyAqCisgKiBJZiB5b3UgdXNlIHRoaXMgZmlsZSwgeW91IG11c3QgYmUgc3VyZSB0aGF0IE5FRURfRkFSX1BPSU5URVJTIGlzIGRlZmluZWQKKyAqIGlmIHlvdSBjb21waWxlIGluIGEgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWw7IGl0IHNob3VsZCBOT1QgYmUgZGVmaW5lZCBpZgorICogeW91IHVzZSBhIGxhcmdlLWRhdGEgbWVtb3J5IG1vZGVsLiAgVGhpcyBmaWxlIGlzIG5vdCByZWNvbW1lbmRlZCBpZiB5b3UKKyAqIGFyZSB1c2luZyBhIGZsYXQtbWVtb3J5LXNwYWNlIDM4NiBlbnZpcm9ubWVudCBzdWNoIGFzIERKR0NDIG9yIFdhdGNvbSBDLgorICogQWxzbywgdGhpcyBjb2RlIHdpbGwgTk9UIHdvcmsgaWYgc3RydWN0IGZpZWxkcyBhcmUgYWxpZ25lZCBvbiBncmVhdGVyIHRoYW4KKyAqIDItYnl0ZSBib3VuZGFyaWVzLgorICoKKyAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgR2UnIFdlaWplcnMuCisgKi8KKworLyoKKyAqIElmIHlvdSBoYXZlIGJvdGggZXh0ZW5kZWQgYW5kIGV4cGFuZGVkIG1lbW9yeSwgeW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUKKyAqIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHRyaWVkIGluIGpvcGVuX2JhY2tpbmdfc3RvcmUuICBPbiBhIDI4NiBtYWNoaW5lCisgKiBleHBhbmRlZCBtZW1vcnkgaXMgdXN1YWxseSBmYXN0ZXIsIHNpbmNlIGV4dGVuZGVkIG1lbW9yeSBhY2Nlc3MgaW52b2x2ZXMKKyAqIGFuIGV4cGVuc2l2ZSBwcm90ZWN0ZWQtbW9kZS1hbmQtYmFjayBzd2l0Y2guICBPbiAzODYgYW5kIGJldHRlciwgZXh0ZW5kZWQKKyAqIG1lbW9yeSBpcyB1c3VhbGx5IGZhc3Rlci4gIEFzIGRpc3RyaWJ1dGVkLCB0aGUgY29kZSB0cmllcyBleHRlbmRlZCBtZW1vcnkKKyAqIGZpcnN0ICh3aGF0PyBub3QgZXZlcnlvbmUgaGFzIGEgMzg2PyA6LSkuCisgKgorICogWW91IGNhbiBkaXNhYmxlIHVzZSBvZiBleHRlbmRlZC9leHBhbmRlZCBtZW1vcnkgZW50aXJlbHkgYnkgYWx0ZXJpbmcgdGhlc2UKKyAqIGRlZmluaXRpb25zIG9yIG92ZXJyaWRpbmcgdGhlbSBmcm9tIHRoZSBNYWtlZmlsZSAoZWcsIC1ERU1TX1NVUFBPUlRFRD0wKS4KKyAqLworCisjaWZuZGVmIFhNU19TVVBQT1JURUQKKyNkZWZpbmUgWE1TX1NVUFBPUlRFRCAgMQorI2VuZGlmCisjaWZuZGVmIEVNU19TVVBQT1JURUQKKyNkZWZpbmUgRU1TX1NVUFBPUlRFRCAgMQorI2VuZGlmCisKKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIHRoZXNlICovCitleHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7CitleHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7CitleHRlcm4gY2hhciAqIGdldGVudiBKUFAoKGNvbnN0IGNoYXIgKiBuYW1lKSk7CisjZW5kaWYKKworI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCisKKyNpZmRlZiBfX1RVUkJPQ19fCisvKiBUaGVzZSBkZWZpbml0aW9ucyB3b3JrIGZvciBCb3JsYW5kIEMgKFR1cmJvIEMpICovCisjaW5jbHVkZSA8YWxsb2MuaD4JCS8qIG5lZWQgZmFybWFsbG9jKCksIGZhcmZyZWUoKSAqLworI2RlZmluZSBmYXJfbWFsbG9jKHgpCWZhcm1hbGxvYyh4KQorI2RlZmluZSBmYXJfZnJlZSh4KQlmYXJmcmVlKHgpCisjZWxzZQorLyogVGhlc2UgZGVmaW5pdGlvbnMgd29yayBmb3IgTWljcm9zb2Z0IEMgYW5kIGNvbXBhdGlibGUgY29tcGlsZXJzICovCisjaW5jbHVkZSA8bWFsbG9jLmg+CQkvKiBuZWVkIF9mbWFsbG9jKCksIF9mZnJlZSgpICovCisjZGVmaW5lIGZhcl9tYWxsb2MoeCkJX2ZtYWxsb2MoeCkKKyNkZWZpbmUgZmFyX2ZyZWUoeCkJX2ZmcmVlKHgpCisjZW5kaWYKKworI2Vsc2UgLyogbm90IE5FRURfRkFSX1BPSU5URVJTICovCisKKyNkZWZpbmUgZmFyX21hbGxvYyh4KQltYWxsb2MoeCkKKyNkZWZpbmUgZmFyX2ZyZWUoeCkJZnJlZSh4KQorCisjZW5kaWYgLyogTkVFRF9GQVJfUE9JTlRFUlMgKi8KKworI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKKyNlbHNlCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKKyNlbmRpZgorCisjaWZuZGVmIFVTRV9NU0RPU19NRU1NR1IJLyogbWFrZSBzdXJlIHVzZXIgZ290IGNvbmZpZ3VyYXRpb24gcmlnaHQgKi8KKyAgWW91IGZvcmdvdCB0byBkZWZpbmUgVVNFX01TRE9TX01FTU1HUiBpbiBqY29uZmlnLmguIC8qIGRlbGliZXJhdGUgc3ludGF4IGVycm9yICovCisjZW5kaWYKKworI2lmIE1BWF9BTExPQ19DSFVOSyA+PSA2NTUzNUwJLyogbWFrZSBzdXJlIGpjb25maWcuaCBnb3QgdGhpcyByaWdodCAqLworICBNQVhfQUxMT0NfQ0hVTksgc2hvdWxkIGJlIGxlc3MgdGhhbiA2NEsuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVycm9yICovCisjZW5kaWYKKworCisvKgorICogRGVjbGFyYXRpb25zIGZvciBhc3NlbWJseS1sYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIChzZWUgam1lbWRvc2EuYXNtKS4KKyAqCisgKiBUaGUgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCAiZmFyIiBhcyBhcmUgYWxsIHRoZWlyIHBvaW50ZXIgYXJndW1lbnRzOworICogdGhpcyBlbnN1cmVzIHRoZSBhc3NlbWJseSBzb3VyY2UgY29kZSB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGUKKyAqIGNvbXBpbGVyIG1lbW9yeSBtb2RlbC4gIFdlIGFzc3VtZSAic2hvcnQiIGlzIDE2IGJpdHMsICJsb25nIiBpcyAzMi4KKyAqLworCit0eXBlZGVmIHZvaWQgZmFyICogWE1TRFJJVkVSOwkvKiBhY3R1YWxseSBhIHBvaW50ZXIgdG8gY29kZSAqLwordHlwZWRlZiBzdHJ1Y3QgewkJLyogcmVnaXN0ZXJzIGZvciBjYWxsaW5nIFhNUyBkcml2ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBheCwgZHgsIGJ4OworCXZvaWQgZmFyICogZHNfc2k7CisgICAgICB9IFhNU2NvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCB7CQkvKiByZWdpc3RlcnMgZm9yIGNhbGxpbmcgRU1TIGRyaXZlciAqLworCXVuc2lnbmVkIHNob3J0IGF4LCBkeCwgYng7CisJdm9pZCBmYXIgKiBkc19zaTsKKyAgICAgIH0gRU1TY29udGV4dDsKKworZXh0ZXJuIHNob3J0IGZhciBqZG9zX29wZW4gSlBQKChzaG9ydCBmYXIgKiBoYW5kbGUsIGNoYXIgZmFyICogZmlsZW5hbWUpKTsKK2V4dGVybiBzaG9ydCBmYXIgamRvc19jbG9zZSBKUFAoKHNob3J0IGhhbmRsZSkpOworZXh0ZXJuIHNob3J0IGZhciBqZG9zX3NlZWsgSlBQKChzaG9ydCBoYW5kbGUsIGxvbmcgb2Zmc2V0KSk7CitleHRlcm4gc2hvcnQgZmFyIGpkb3NfcmVhZCBKUFAoKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsCisJCQkJdW5zaWduZWQgc2hvcnQgY291bnQpKTsKK2V4dGVybiBzaG9ydCBmYXIgamRvc193cml0ZSBKUFAoKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsCisJCQkJIHVuc2lnbmVkIHNob3J0IGNvdW50KSk7CitleHRlcm4gdm9pZCBmYXIganhtc19nZXRkcml2ZXIgSlBQKChYTVNEUklWRVIgZmFyICopKTsKK2V4dGVybiB2b2lkIGZhciBqeG1zX2NhbGxkcml2ZXIgSlBQKChYTVNEUklWRVIsIFhNU2NvbnRleHQgZmFyICopKTsKK2V4dGVybiBzaG9ydCBmYXIgamVtc19hdmFpbGFibGUgSlBQKCh2b2lkKSk7CitleHRlcm4gdm9pZCBmYXIgamVtc19jYWxsZHJpdmVyIEpQUCgoRU1TY29udGV4dCBmYXIgKikpOworCisKKy8qCisgKiBTZWxlY3Rpb24gb2YgYSBmaWxlIG5hbWUgZm9yIGEgdGVtcG9yYXJ5IGZpbGUuCisgKiBUaGlzIGlzIGhpZ2hseSBzeXN0ZW0tZGVwZW5kZW50LCBhbmQgeW91IG1heSB3YW50IHRvIGN1c3RvbWl6ZSBpdC4KKyAqLworCitzdGF0aWMgaW50IG5leHRfZmlsZV9udW07CS8qIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHNldmVyYWwgdGVtcCBmaWxlcyAqLworCitMT0NBTCh2b2lkKQorc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQoreworICBjb25zdCBjaGFyICogZW52OworICBjaGFyICogcHRyOworICBGSUxFICogdGZpbGU7CisKKyAgLyogS2VlcCBnZW5lcmF0aW5nIGZpbGUgbmFtZXMgdGlsbCB3ZSBmaW5kIG9uZSB0aGF0J3Mgbm90IGluIHVzZSAqLworICBmb3IgKDs7KSB7CisgICAgLyogR2V0IHRlbXAgZGlyZWN0b3J5IG5hbWUgZnJvbSBlbnZpcm9ubWVudCBUTVAgb3IgVEVNUCB2YXJpYWJsZTsKKyAgICAgKiBpZiBub25lLCB1c2UgIi4iCisgICAgICovCisgICAgaWYgKChlbnYgPSAoY29uc3QgY2hhciAqKSBnZXRlbnYoIlRNUCIpKSA9PSBOVUxMKQorICAgICAgaWYgKChlbnYgPSAoY29uc3QgY2hhciAqKSBnZXRlbnYoIlRFTVAiKSkgPT0gTlVMTCkKKwllbnYgPSAiLiI7CisgICAgaWYgKCplbnYgPT0gJ1wwJykJCS8qIG51bGwgc3RyaW5nIG1lYW5zICIuIiAqLworICAgICAgZW52ID0gIi4iOworICAgIHB0ciA9IGZuYW1lOwkJLyogY29weSBuYW1lIHRvIGZuYW1lICovCisgICAgd2hpbGUgKCplbnYgIT0gJ1wwJykKKyAgICAgICpwdHIrKyA9ICplbnYrKzsKKyAgICBpZiAocHRyWy0xXSAhPSAnXFwnICYmIHB0clstMV0gIT0gJy8nKQorICAgICAgKnB0cisrID0gJ1xcJzsJCS8qIGFwcGVuZCBiYWNrc2xhc2ggaWYgbm90IGluIGVudiB2YXJpYWJsZSAqLworICAgIC8qIEFwcGVuZCBhIHN1aXRhYmxlIGZpbGUgbmFtZSAqLworICAgIG5leHRfZmlsZV9udW0rKzsJCS8qIGFkdmFuY2UgY291bnRlciAqLworICAgIHNwcmludGYocHRyLCAiSlBHJTAzZC5UTVAiLCBuZXh0X2ZpbGVfbnVtKTsKKyAgICAvKiBQcm9iZSB0byBzZWUgaWYgZmlsZSBuYW1lIGlzIGFscmVhZHkgaW4gdXNlICovCisgICAgaWYgKCh0ZmlsZSA9IGZvcGVuKGZuYW1lLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpCisgICAgICBicmVhazsKKyAgICBmY2xvc2UodGZpbGUpOwkJLyogb29wcywgaXQncyB0aGVyZTsgY2xvc2UgdGZpbGUgJiB0cnkgYWdhaW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBOZWFyLW1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKKyAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCisgKi8KKworR0xPQkFMKHZvaWQgKikKK2pwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiAiTGFyZ2UiIG9iamVjdHMgYXJlIGFsbG9jYXRlZCBpbiBmYXIgbWVtb3J5LCBpZiBwb3NzaWJsZQorICovCisKK0dMT0JBTCh2b2lkIEZBUiAqKQoranBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSBmYXJfbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBmYXJfZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKKyAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCisgKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0CisgKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgorICovCisKKyNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLworI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTMwMDAwMEwgLyogZm9yIHRvdGFsIHVzYWdlIGFib3V0IDQ1MEsgKi8KKyNlbmRpZgorCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCisJCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCit7CisgIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworLyoKKyAqIEZvciBNUy1ET1Mgd2Ugc3VwcG9ydCB0aHJlZSB0eXBlcyBvZiBiYWNraW5nIHN0b3JhZ2U6CisgKiAgIDEuIENvbnZlbnRpb25hbCBET1MgZmlsZXMuICBXZSBhY2Nlc3MgdGhlc2UgYnkgZGlyZWN0IERPUyBjYWxscyByYXRoZXIKKyAqICAgICAgdGhhbiB2aWEgdGhlIHN0ZGlvIHBhY2thZ2UuICBUaGlzIHByb3ZpZGVzIGEgYml0IGJldHRlciBwZXJmb3JtYW5jZSwKKyAqICAgICAgYnV0IHRoZSByZWFsIHJlYXNvbiBpcyB0aGF0IHRoZSBidWZmZXJzIHRvIGJlIHJlYWQgb3Igd3JpdHRlbiBhcmUgRkFSLgorICogICAgICBUaGUgc3RkaW8gbGlicmFyeSBmb3Igc21hbGwtZGF0YSBtZW1vcnkgbW9kZWxzIGNhbid0IGNvcGUgd2l0aCB0aGF0LgorICogICAyLiBFeHRlbmRlZCBtZW1vcnksIGFjY2Vzc2VkIHBlciB0aGUgWE1TIFYyLjAgc3BlY2lmaWNhdGlvbi4KKyAqICAgMy4gRXhwYW5kZWQgbWVtb3J5LCBhY2Nlc3NlZCBwZXIgdGhlIExJTS9FTVMgNC4wIHNwZWNpZmljYXRpb24uCisgKiBZb3UnbGwgbmVlZCBjb3BpZXMgb2YgdGhvc2Ugc3BlY3MgdG8gbWFrZSBzZW5zZSBvZiB0aGUgcmVsYXRlZCBjb2RlLgorICogVGhlIHNwZWNzIGFyZSBhdmFpbGFibGUgYnkgSW50ZXJuZXQgRlRQIGZyb20gdGhlIFNJTVRFTCBhcmNoaXZlcyAKKyAqIChvYWsub2FrbGFuZC5lZHUgYW5kIGl0cyB2YXJpb3VzIG1pcnJvciBzaXRlcykuICBTZWUgZmlsZXMKKyAqIHB1Yi9tc2Rvcy9taWNyb3NvZnQveG1zMjAuYXJjIGFuZCBwdWIvbXNkb3MvaW5mby9saW1lbXM0MS56aXAuCisgKi8KKworCisvKgorICogQWNjZXNzIG1ldGhvZHMgZm9yIGEgRE9TIGZpbGUuCisgKi8KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgaWYgKGpkb3Nfc2VlayhpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGZpbGVfb2Zmc2V0KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOworICAvKiBTaW5jZSBNQVhfQUxMT0NfQ0hVTksgaXMgbGVzcyB0aGFuIDY0SywgYnl0ZV9jb3VudCB3aWxsIGJlIHRvby4gKi8KKyAgaWYgKGJ5dGVfY291bnQgPiA2NTUzNUwpCS8qIHNhZmV0eSBjaGVjayAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0FMTE9DX0NIVU5LKTsKKyAgaWYgKGpkb3NfcmVhZChpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGJ1ZmZlcl9hZGRyZXNzLAorCQkodW5zaWduZWQgc2hvcnQpIGJ5dGVfY291bnQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9maWxlX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChqZG9zX3NlZWsoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBmaWxlX29mZnNldCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgLyogU2luY2UgTUFYX0FMTE9DX0NIVU5LIGlzIGxlc3MgdGhhbiA2NEssIGJ5dGVfY291bnQgd2lsbCBiZSB0b28uICovCisgIGlmIChieXRlX2NvdW50ID4gNjU1MzVMKQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTExPQ19DSFVOSyk7CisgIGlmIChqZG9zX3dyaXRlKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSwgYnVmZmVyX2FkZHJlc3MsCisJCSAodW5zaWduZWQgc2hvcnQpIGJ5dGVfY291bnQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfV1JJVEUpOworfQorCisKK01FVEhPRERFRih2b2lkKQorY2xvc2VfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQoreworICBqZG9zX2Nsb3NlKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSk7CS8qIGNsb3NlIHRoZSBmaWxlICovCisgIHJlbW92ZShpbmZvLT50ZW1wX25hbWUpOwkvKiBkZWxldGUgdGhlIGZpbGUgKi8KKy8qIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSByZW1vdmUoKSwgdHJ5IHVubGluaygpIGluc3RlYWQuCisgKiByZW1vdmUoKSBpcyB0aGUgQU5TSS1zdGFuZGFyZCBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLCBidXQKKyAqIHVubGluaygpIHdhcyBtb3JlIGNvbW1vbiBpbiBwcmUtQU5TSSBzeXN0ZW1zLgorICovCisgIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX0NMT1NFLCBpbmZvLT50ZW1wX25hbWUpOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitvcGVuX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQoreworICBzaG9ydCBoYW5kbGU7CisKKyAgc2VsZWN0X2ZpbGVfbmFtZShpbmZvLT50ZW1wX25hbWUpOworICBpZiAoamRvc19vcGVuKChzaG9ydCBmYXIgKikgJiBoYW5kbGUsIChjaGFyIGZhciAqKSBpbmZvLT50ZW1wX25hbWUpKSB7CisgICAgLyogbWlnaHQgYXMgd2VsbCBleGl0IHNpbmNlIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIHdpbGwgZmFpbCBhbnl3YXkgKi8KKyAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSA9IGhhbmRsZTsKKyAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9maWxlX3N0b3JlOworICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfZmlsZV9zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2ZpbGVfc3RvcmU7CisgIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7CisgIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLworfQorCisKKy8qCisgKiBBY2Nlc3MgbWV0aG9kcyBmb3IgZXh0ZW5kZWQgbWVtb3J5LgorICovCisKKyNpZiBYTVNfU1VQUE9SVEVECisKK3N0YXRpYyBYTVNEUklWRVIgeG1zX2RyaXZlcjsJLyogc2F2ZWQgYWRkcmVzcyBvZiBYTVMgZHJpdmVyICovCisKK3R5cGVkZWYgdW5pb24gewkJCS8qIGVpdGhlciBsb25nIG9mZnNldCBvciByZWFsLW1vZGUgcG9pbnRlciAqLworCWxvbmcgb2Zmc2V0OworCXZvaWQgZmFyICogcHRyOworICAgICAgfSBYTVNQVFI7CisKK3R5cGVkZWYgc3RydWN0IHsJCS8qIFhNUyBtb3ZlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCisJbG9uZyBsZW5ndGg7CisJWE1TSCBzcmNfaGFuZGxlOworCVhNU1BUUiBzcmM7CisJWE1TSCBkc3RfaGFuZGxlOworCVhNU1BUUiBkc3Q7CisgICAgICB9IFhNU3NwZWM7CisKKyNkZWZpbmUgT0REKFgpCSgoKFgpICYgMUwpICE9IDApCisKKworTUVUSE9EREVGKHZvaWQpCityZWFkX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQl2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAorCQlsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIFhNU2NvbnRleHQgY3R4OworICBYTVNzcGVjIHNwZWM7CisgIGNoYXIgZW5kYnVmZmVyWzJdOworCisgIC8qIFRoZSBYTVMgZHJpdmVyIGNhbid0IGNvcGUgd2l0aCBhbiBvZGQgbGVuZ3RoLCBzbyBoYW5kbGUgdGhlIGxhc3QgYnl0ZQorICAgKiBzcGVjaWFsbHkgaWYgYnl0ZV9jb3VudCBpcyBvZGQuICBXZSBkb24ndCBleHBlY3QgdGhpcyB0byBiZSBjb21tb24uCisgICAqLworCisgIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudCAmICh+IDFMKTsKKyAgc3BlYy5zcmNfaGFuZGxlID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7CisgIHNwZWMuc3JjLm9mZnNldCA9IGZpbGVfb2Zmc2V0OworICBzcGVjLmRzdF9oYW5kbGUgPSAwOworICBzcGVjLmRzdC5wdHIgPSBidWZmZXJfYWRkcmVzczsKKyAgCisgIGN0eC5kc19zaSA9ICh2b2lkIGZhciAqKSAmIHNwZWM7CisgIGN0eC5heCA9IDB4MGIwMDsJCS8qIEVNQiBtb3ZlICovCisgIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoY3R4LmF4ICE9IDEpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9YTVNfUkVBRCk7CisKKyAgaWYgKE9ERChieXRlX2NvdW50KSkgeworICAgIHJlYWRfeG1zX3N0b3JlKGNpbmZvLCBpbmZvLCAodm9pZCBGQVIgKikgZW5kYnVmZmVyLAorCQkgICBmaWxlX29mZnNldCArIGJ5dGVfY291bnQgLSAxTCwgMkwpOworICAgICgoY2hhciBGQVIgKikgYnVmZmVyX2FkZHJlc3MpW2J5dGVfY291bnQgLSAxTF0gPSBlbmRidWZmZXJbMF07CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgWE1TY29udGV4dCBjdHg7CisgIFhNU3NwZWMgc3BlYzsKKyAgY2hhciBlbmRidWZmZXJbMl07CisKKyAgLyogVGhlIFhNUyBkcml2ZXIgY2FuJ3QgY29wZSB3aXRoIGFuIG9kZCBsZW5ndGgsIHNvIGhhbmRsZSB0aGUgbGFzdCBieXRlCisgICAqIHNwZWNpYWxseSBpZiBieXRlX2NvdW50IGlzIG9kZC4gIFdlIGRvbid0IGV4cGVjdCB0aGlzIHRvIGJlIGNvbW1vbi4KKyAgICovCisKKyAgc3BlYy5sZW5ndGggPSBieXRlX2NvdW50ICYgKH4gMUwpOworICBzcGVjLnNyY19oYW5kbGUgPSAwOworICBzcGVjLnNyYy5wdHIgPSBidWZmZXJfYWRkcmVzczsKKyAgc3BlYy5kc3RfaGFuZGxlID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7CisgIHNwZWMuZHN0Lm9mZnNldCA9IGZpbGVfb2Zmc2V0OworCisgIGN0eC5kc19zaSA9ICh2b2lkIGZhciAqKSAmIHNwZWM7CisgIGN0eC5heCA9IDB4MGIwMDsJCS8qIEVNQiBtb3ZlICovCisgIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoY3R4LmF4ICE9IDEpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9YTVNfV1JJVEUpOworCisgIGlmIChPREQoYnl0ZV9jb3VudCkpIHsKKyAgICByZWFkX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKKwkJICAgZmlsZV9vZmZzZXQgKyBieXRlX2NvdW50IC0gMUwsIDJMKTsKKyAgICBlbmRidWZmZXJbMF0gPSAoKGNoYXIgRkFSICopIGJ1ZmZlcl9hZGRyZXNzKVtieXRlX2NvdW50IC0gMUxdOworICAgIHdyaXRlX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKKwkJICAgIGZpbGVfb2Zmc2V0ICsgYnl0ZV9jb3VudCAtIDFMLCAyTCk7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK2Nsb3NlX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQoreworICBYTVNjb250ZXh0IGN0eDsKKworICBjdHguZHggPSBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZTsKKyAgY3R4LmF4ID0gMHgwYTAwOworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfWE1TX0NMT1NFLCBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZSk7CisgIC8qIHdlIGlnbm9yZSBhbnkgZXJyb3IgcmV0dXJuIGZyb20gdGhlIGRyaXZlciAqLworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitvcGVuX3htc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQlsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgWE1TY29udGV4dCBjdHg7CisKKyAgLyogR2V0IGFkZHJlc3Mgb2YgWE1TIGRyaXZlciAqLworICBqeG1zX2dldGRyaXZlcigoWE1TRFJJVkVSIGZhciAqKSAmIHhtc19kcml2ZXIpOworICBpZiAoeG1zX2RyaXZlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsJCS8qIG5vIGRyaXZlciB0byBiZSBoYWQgKi8KKworICAvKiBHZXQgdmVyc2lvbiBudW1iZXIsIG11c3QgYmUgPj0gMi4wMCAqLworICBjdHguYXggPSAweDAwMDA7CisgIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoY3R4LmF4IDwgKHVuc2lnbmVkIHNob3J0KSAweDAyMDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFRyeSB0byBnZXQgc3BhY2UgKGV4cHJlc3NlZCBpbiBraWxvYnl0ZXMpICovCisgIGN0eC5keCA9ICh1bnNpZ25lZCBzaG9ydCkgKCh0b3RhbF9ieXRlc19uZWVkZWQgKyAxMDIzTCkgPj4gMTApOworICBjdHguYXggPSAweDA5MDA7CisgIGp4bXNfY2FsbGRyaXZlcih4bXNfZHJpdmVyLCAoWE1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoY3R4LmF4ICE9IDEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFN1Y2NlZWRlZCwgc2F2ZSB0aGUgaGFuZGxlIGFuZCBhd2F5IHdlIGdvICovCisgIGluZm8tPmhhbmRsZS54bXNfaGFuZGxlID0gY3R4LmR4OworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX3htc19zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX3htc19zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX3htc19zdG9yZTsKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfWE1TX09QRU4sIGN0eC5keCk7CisgIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLworfQorCisjZW5kaWYgLyogWE1TX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBBY2Nlc3MgbWV0aG9kcyBmb3IgZXhwYW5kZWQgbWVtb3J5LgorICovCisKKyNpZiBFTVNfU1VQUE9SVEVECisKKy8qIFRoZSBFTVMgbW92ZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlcyB3b3JkIGFuZCBsb25nIGZpZWxkcyBhbGlnbmVkCisgKiBhdCBvZGQgYnl0ZSBib3VuZGFyaWVzLiAgU29tZSBjb21waWxlcnMgd2lsbCBhbGlnbiBzdHJ1Y3QgZmllbGRzIGF0IGV2ZW4KKyAqIGJ5dGUgYm91bmRhcmllcy4gIFdoaWxlIGl0J3MgdXN1YWxseSBwb3NzaWJsZSB0byBmb3JjZSBieXRlIGFsaWdubWVudCwKKyAqIHRoYXQgY2F1c2VzIGFuIG92ZXJhbGwgcGVyZm9ybWFuY2UgcGVuYWx0eSBhbmQgbWF5IHBvc2UgcHJvYmxlbXMgaW4gbWVyZ2luZworICogSlBFRyBpbnRvIGEgbGFyZ2VyIGFwcGxpY2F0aW9uLiAgSW5zdGVhZCB3ZSBhY2NlcHQgc29tZSByYXRoZXIgZGlydHkgY29kZQorICogaGVyZS4gIE5vdGUgdGhpcyBjb2RlIHdvdWxkIGZhaWwgaWYgdGhlIGhhcmR3YXJlIGRpZCBub3QgYWxsb3cgb2RkLWJ5dGUKKyAqIHdvcmQgJiBsb25nIGFjY2Vzc2VzLCBidXQgYWxsIDgweDg2IENQVXMgZG8uCisgKi8KKwordHlwZWRlZiB2b2lkIGZhciAqIEVNU1BUUjsKKwordHlwZWRlZiB1bmlvbiB7CQkJLyogRU1TIG1vdmUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKi8KKwlsb25nIGxlbmd0aDsJCS8qIEl0J3MgZWFzeSB0byBhY2Nlc3MgZmlyc3QgNCBieXRlcyAqLworCWNoYXIgYnl0ZXNbMThdOwkJLyogTWlzYWxpZ25lZCBmaWVsZHMgaW4gaGVyZSEgKi8KKyAgICAgIH0gRU1Tc3BlYzsKKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgbWlzYWxpZ25lZCBmaWVsZHMgKi8KKyNkZWZpbmUgRklFTERfQVQoc3BlYyxvZmZzZXQsdHlwZSkgICgqKCh0eXBlICopICYoc3BlYy5ieXRlc1tvZmZzZXRdKSkpCisjZGVmaW5lIFNSQ19UWVBFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDQsY2hhcikKKyNkZWZpbmUgU1JDX0hBTkRMRShzcGVjKQlGSUVMRF9BVChzcGVjLDUsRU1TSCkKKyNkZWZpbmUgU1JDX09GRlNFVChzcGVjKQlGSUVMRF9BVChzcGVjLDcsdW5zaWduZWQgc2hvcnQpCisjZGVmaW5lIFNSQ19QQUdFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDksdW5zaWduZWQgc2hvcnQpCisjZGVmaW5lIFNSQ19QVFIoc3BlYykJCUZJRUxEX0FUKHNwZWMsNyxFTVNQVFIpCisjZGVmaW5lIERTVF9UWVBFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDExLGNoYXIpCisjZGVmaW5lIERTVF9IQU5ETEUoc3BlYykJRklFTERfQVQoc3BlYywxMixFTVNIKQorI2RlZmluZSBEU1RfT0ZGU0VUKHNwZWMpCUZJRUxEX0FUKHNwZWMsMTQsdW5zaWduZWQgc2hvcnQpCisjZGVmaW5lIERTVF9QQUdFKHNwZWMpCQlGSUVMRF9BVChzcGVjLDE2LHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBEU1RfUFRSKHNwZWMpCQlGSUVMRF9BVChzcGVjLDE0LEVNU1BUUikKKworI2RlZmluZSBFTVNQQUdFU0laRQkxNjM4NEwJLyogZ29zcGVsLCBzZWUgdGhlIEVNUyBzcGVjcyAqLworCisjZGVmaW5lIEhJQllURShXKSAgKCgoVykgPj4gOCkgJiAweEZGKQorI2RlZmluZSBMT0JZVEUoVykgICgoVykgJiAweEZGKQorCisKK01FVEhPRERFRih2b2lkKQorcmVhZF9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBFTVNjb250ZXh0IGN0eDsKKyAgRU1Tc3BlYyBzcGVjOworCisgIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudDsKKyAgU1JDX1RZUEUoc3BlYykgPSAxOworICBTUkNfSEFORExFKHNwZWMpID0gaW5mby0+aGFuZGxlLmVtc19oYW5kbGU7CisgIFNSQ19QQUdFKHNwZWMpICAgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAvIEVNU1BBR0VTSVpFKTsKKyAgU1JDX09GRlNFVChzcGVjKSA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0ICUgRU1TUEFHRVNJWkUpOworICBEU1RfVFlQRShzcGVjKSA9IDA7CisgIERTVF9IQU5ETEUoc3BlYykgPSAwOworICBEU1RfUFRSKHNwZWMpICAgID0gYnVmZmVyX2FkZHJlc3M7CisgIAorICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOworICBjdHguYXggPSAweDU3MDA7CQkvKiBtb3ZlIG1lbW9yeSByZWdpb24gKi8KKyAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7CisgIGlmIChISUJZVEUoY3R4LmF4KSAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1TX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZW1zX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAorCQkgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBFTVNjb250ZXh0IGN0eDsKKyAgRU1Tc3BlYyBzcGVjOworCisgIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudDsKKyAgU1JDX1RZUEUoc3BlYykgPSAwOworICBTUkNfSEFORExFKHNwZWMpID0gMDsKKyAgU1JDX1BUUihzcGVjKSAgICA9IGJ1ZmZlcl9hZGRyZXNzOworICBEU1RfVFlQRShzcGVjKSA9IDE7CisgIERTVF9IQU5ETEUoc3BlYykgPSBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZTsKKyAgRFNUX1BBR0Uoc3BlYykgICA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0IC8gRU1TUEFHRVNJWkUpOworICBEU1RfT0ZGU0VUKHNwZWMpID0gKHVuc2lnbmVkIHNob3J0KSAoZmlsZV9vZmZzZXQgJSBFTVNQQUdFU0laRSk7CisgIAorICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOworICBjdHguYXggPSAweDU3MDA7CQkvKiBtb3ZlIG1lbW9yeSByZWdpb24gKi8KKyAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7CisgIGlmIChISUJZVEUoY3R4LmF4KSAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1TX1dSSVRFKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK2Nsb3NlX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQoreworICBFTVNjb250ZXh0IGN0eDsKKworICBjdHguYXggPSAweDQ1MDA7CisgIGN0eC5keCA9IGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlOworICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRU1TX0NMT1NFLCBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZSk7CisgIC8qIHdlIGlnbm9yZSBhbnkgZXJyb3IgcmV0dXJuIGZyb20gdGhlIGRyaXZlciAqLworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitvcGVuX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQlsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgRU1TY29udGV4dCBjdHg7CisKKyAgLyogSXMgRU1TIGRyaXZlciB0aGVyZT8gKi8KKyAgaWYgKCEgamVtc19hdmFpbGFibGUoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogR2V0IHN0YXR1cywgbWFrZSBzdXJlIEVNUyBpcyBPSyAqLworICBjdHguYXggPSAweDQwMDA7CisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogR2V0IHZlcnNpb24sIG11c3QgYmUgPj0gNC4wICovCisgIGN0eC5heCA9IDB4NDYwMDsKKyAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7CisgIGlmIChISUJZVEUoY3R4LmF4KSAhPSAwIHx8IExPQllURShjdHguYXgpIDwgMHg0MCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogVHJ5IHRvIGFsbG9jYXRlIHJlcXVlc3RlZCBzcGFjZSAqLworICBjdHguYXggPSAweDQzMDA7CisgIGN0eC5ieCA9ICh1bnNpZ25lZCBzaG9ydCkgKCh0b3RhbF9ieXRlc19uZWVkZWQgKyBFTVNQQUdFU0laRS0xTCkgLyBFTVNQQUdFU0laRSk7CisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogU3VjY2VlZGVkLCBzYXZlIHRoZSBoYW5kbGUgYW5kIGF3YXkgd2UgZ28gKi8KKyAgaW5mby0+aGFuZGxlLmVtc19oYW5kbGUgPSBjdHguZHg7CisgIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfZW1zX3N0b3JlOworICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfZW1zX3N0b3JlOworICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfZW1zX3N0b3JlOworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19FTVNfT1BFTiwgY3R4LmR4KTsKKyAgcmV0dXJuIFRSVUU7CQkJLyogc3VjY2VlZGVkICovCit9CisKKyNlbmRpZiAvKiBFTVNfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgLyogVHJ5IGV4dGVuZGVkIG1lbW9yeSwgdGhlbiBleHBhbmRlZCBtZW1vcnksIHRoZW4gcmVndWxhciBmaWxlLiAqLworI2lmIFhNU19TVVBQT1JURUQKKyAgaWYgKG9wZW5feG1zX3N0b3JlKGNpbmZvLCBpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpKQorICAgIHJldHVybjsKKyNlbmRpZgorI2lmIEVNU19TVVBQT1JURUQKKyAgaWYgKG9wZW5fZW1zX3N0b3JlKGNpbmZvLCBpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpKQorICAgIHJldHVybjsKKyNlbmRpZgorICBpZiAob3Blbl9maWxlX3N0b3JlKGNpbmZvLCBpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpKQorICAgIHJldHVybjsKKyAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiIik7Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKKyAqIGNsZWFudXAgcmVxdWlyZWQuCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIG5leHRfZmlsZV9udW0gPSAwOwkJLyogaW5pdGlhbGl6ZSB0ZW1wIGZpbGUgbmFtZSBnZW5lcmF0b3IgKi8KKyAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KK30KKworR0xPQkFMKHZvaWQpCitqcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIE1pY3Jvc29mdCBDLCBhdCBsZWFzdCBpbiB2Ni4wMEEsIHdpbGwgbm90IHN1Y2Nlc3NmdWxseSByZWNsYWltIGZyZWVkCisgICAqIGJsb2NrcyBvZiBzaXplID4gMzJLYnl0ZXMgdW5sZXNzIHdlIGdpdmUgaXQgYSBraWNrIGluIHRoZSByZWFyLCBsaWtlIHNvOgorICAgKi8KKyNpZmRlZiBORUVEX0ZIRUFQTUlOCisgIF9maGVhcG1pbigpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9qbWVtZG9zYS5hc20gYi9qbWVtZG9zYS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkNDM3MgotLS0gL2Rldi9udWxsCisrKyBiL2ptZW1kb3NhLmFzbQpAQCAtMCwwICsxLDM3OSBAQAorOworOyBqbWVtZG9zYS5hc20KKzsKKzsgQ29weXJpZ2h0IChDKSAxOTkyLCBUaG9tYXMgRy4gTGFuZS4KKzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKzsgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorOworOyBUaGlzIGZpbGUgY29udGFpbnMgbG93LWxldmVsIGludGVyZmFjZSByb3V0aW5lcyB0byBzdXBwb3J0IHRoZSBNUy1ET1MKKzsgYmFja2luZyBzdG9yZSBtYW5hZ2VyIChqbWVtZG9zLmMpLiAgUm91dGluZXMgYXJlIHByb3ZpZGVkIHRvIGFjY2VzcyBkaXNrCis7IGZpbGVzIHRocm91Z2ggZGlyZWN0IERPUyBjYWxscywgYW5kIHRvIGFjY2VzcyBYTVMgYW5kIEVNUyBkcml2ZXJzLgorOworOyBUaGlzIGZpbGUgc2hvdWxkIGFzc2VtYmxlIHdpdGggTWljcm9zb2Z0J3MgTUFTTSBvciBhbnkgY29tcGF0aWJsZQorOyBhc3NlbWJsZXIgKGluY2x1ZGluZyBCb3JsYW5kJ3MgVHVyYm8gQXNzZW1ibGVyKS4gIElmIHlvdSBoYXZlbid0IGdvdAorOyBhIGNvbXBhdGlibGUgYXNzZW1ibGVyLCBiZXR0ZXIgZmFsbCBiYWNrIHRvIGptZW1hbnNpLmMgb3Igam1lbW5hbWUuYy4KKzsKKzsgVG8gbWluaW1pemUgZGVwZW5kZW5jZSBvbiB0aGUgQyBjb21waWxlcidzIHJlZ2lzdGVyIHVzYWdlIGNvbnZlbnRpb25zLAorOyB3ZSBzYXZlIGFuZCByZXN0b3JlIGFsbCA4MDg2IHJlZ2lzdGVycywgZXZlbiB0aG91Z2ggbW9zdCBjb21waWxlcnMgb25seQorOyByZXF1aXJlIFNJLERJLERTIHRvIGJlIHByZXNlcnZlZC4gIEFsc28sIHdlIHVzZSBvbmx5IDE2LWJpdC13aWRlIHJldHVybgorOyB2YWx1ZXMsIHdoaWNoIGV2ZXJ5Ym9keSByZXR1cm5zIGluIEFYLgorOworOyBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEdlJyBXZWlqZXJzLgorOworCitKTUVNRE9TQV9UWFQJc2VnbWVudCBieXRlIHB1YmxpYyAnQ09ERScKKworCQlhc3N1bWUJY3M6Sk1FTURPU0FfVFhUCisKKwkJcHVibGljCV9qZG9zX29wZW4KKwkJcHVibGljCV9qZG9zX2Nsb3NlCisJCXB1YmxpYwlfamRvc19zZWVrCisJCXB1YmxpYwlfamRvc19yZWFkCisJCXB1YmxpYwlfamRvc193cml0ZQorCQlwdWJsaWMJX2p4bXNfZ2V0ZHJpdmVyCisJCXB1YmxpYwlfanhtc19jYWxsZHJpdmVyCisJCXB1YmxpYwlfamVtc19hdmFpbGFibGUKKwkJcHVibGljCV9qZW1zX2NhbGxkcml2ZXIKKworOworOyBzaG9ydCBmYXIgamRvc19vcGVuIChzaG9ydCBmYXIgKiBoYW5kbGUsIGNoYXIgZmFyICogZmlsZW5hbWUpCis7Cis7IENyZWF0ZSBhbmQgb3BlbiBhIHRlbXBvcmFyeSBmaWxlCis7CitfamRvc19vcGVuCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJY3gsMAkJCTsgbm9ybWFsIGZpbGUgYXR0cmlidXRlcworCQlsZHMJZHgsZHdvcmQgcHRyIFticCsxMF0JOyBnZXQgZmlsZW5hbWUgcG9pbnRlcgorCQltb3YJYWgsM2NoCQkJOyBjcmVhdGUgZmlsZQorCQlpbnQJMjFoCisJCWpjCW9wZW5fZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKKwkJbGRzCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgaGFuZGxlIHBvaW50ZXIKKwkJbW92CXdvcmQgcHRyIFtieF0sYXgJOyBzYXZlIHRoZSBoYW5kbGUKKwkJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKK29wZW5fZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0CisJCXBvcAllcworCQlwb3AJZHgKKwkJcG9wCWN4CisJCXBvcAlieAorCQlwb3AJZGkKKwkJcG9wCXNpCisJCXBvcCAJYnAKKwkJcmV0CitfamRvc19vcGVuCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZG9zX2Nsb3NlIChzaG9ydCBoYW5kbGUpCis7Cis7IENsb3NlIHRoZSBmaWxlIGhhbmRsZQorOworX2pkb3NfY2xvc2UJcHJvYwlmYXIKKwkJcHVzaAlicAkJCTsgbGlua2FnZQorCQltb3YgCWJwLHNwCisJCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5CisJCXB1c2gJZGkKKwkJcHVzaAlieAorCQlwdXNoCWN4CisJCXB1c2gJZHgKKwkJcHVzaAllcworCQlwdXNoCWRzCisJCW1vdglieCx3b3JkIHB0ciBbYnArNl0JOyBmaWxlIGhhbmRsZQorCQltb3YJYWgsM2VoCQkJOyBjbG9zZSBmaWxlCisJCWludAkyMWgKKwkJamMJY2xvc2VfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKKwkJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKK2Nsb3NlX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2pkb3NfY2xvc2UJZW5kcAorCisKKzsKKzsgc2hvcnQgZmFyIGpkb3Nfc2VlayAoc2hvcnQgaGFuZGxlLCBsb25nIG9mZnNldCkKKzsKKzsgU2V0IGZpbGUgcG9zaXRpb24KKzsKK19qZG9zX3NlZWsJcHJvYwlmYXIKKwkJcHVzaAlicAkJCTsgbGlua2FnZQorCQltb3YgCWJwLHNwCisJCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5CisJCXB1c2gJZGkKKwkJcHVzaAlieAorCQlwdXNoCWN4CisJCXB1c2gJZHgKKwkJcHVzaAllcworCQlwdXNoCWRzCisJCW1vdglieCx3b3JkIHB0ciBbYnArNl0JOyBmaWxlIGhhbmRsZQorCQltb3YJZHgsd29yZCBwdHIgW2JwKzhdCTsgTFMgb2Zmc2V0CisJCW1vdgljeCx3b3JkIHB0ciBbYnArMTBdCTsgTVMgb2Zmc2V0CisJCW1vdglheCw0MjAwaAkJOyBhYnNvbHV0ZSBzZWVrCisJCWludAkyMWgKKwkJamMJc2Vla19lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQorCQl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSworc2Vla19lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wIAlicAorCQlyZXQKK19qZG9zX3NlZWsJZW5kcAorCisKKzsKKzsgc2hvcnQgZmFyIGpkb3NfcmVhZCAoc2hvcnQgaGFuZGxlLCB2b2lkIGZhciAqIGJ1ZmZlciwgdW5zaWduZWQgc2hvcnQgY291bnQpCis7Cis7IFJlYWQgZnJvbSBmaWxlCis7CitfamRvc19yZWFkCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKKwkJbGRzCWR4LGR3b3JkIHB0ciBbYnArOF0JOyBidWZmZXIgYWRkcmVzcworCQltb3YJY3gsd29yZCBwdHIgW2JwKzEyXQk7IG51bWJlciBvZiBieXRlcworCQltb3YJYWgsM2ZoCQkJOyByZWFkIGZpbGUKKwkJaW50CTIxaAorCQlqYwlyZWFkX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCisJCWNtcAlheCx3b3JkIHB0ciBbYnArMTJdCTsgbWFrZSBzdXJlIGFsbCBieXRlcyB3ZXJlIHJlYWQKKwkJamUJcmVhZF9vaworCQltb3YJYXgsMQkJCTsgZWxzZSByZXR1cm4gMSBmb3Igbm90IE9LCisJCWptcAlzaG9ydCByZWFkX2VycgorcmVhZF9vazoJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKK3JlYWRfZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0CisJCXBvcAllcworCQlwb3AJZHgKKwkJcG9wCWN4CisJCXBvcAlieAorCQlwb3AJZGkKKwkJcG9wCXNpCisJCXBvcCAJYnAKKwkJcmV0CitfamRvc19yZWFkCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZG9zX3dyaXRlIChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLCB1bnNpZ25lZCBzaG9ydCBjb3VudCkKKzsKKzsgV3JpdGUgdG8gZmlsZQorOworX2pkb3Nfd3JpdGUJcHJvYwlmYXIKKwkJcHVzaAlicAkJCTsgbGlua2FnZQorCQltb3YgCWJwLHNwCisJCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5CisJCXB1c2gJZGkKKwkJcHVzaAlieAorCQlwdXNoCWN4CisJCXB1c2gJZHgKKwkJcHVzaAllcworCQlwdXNoCWRzCisJCW1vdglieCx3b3JkIHB0ciBbYnArNl0JOyBmaWxlIGhhbmRsZQorCQlsZHMJZHgsZHdvcmQgcHRyIFticCs4XQk7IGJ1ZmZlciBhZGRyZXNzCisJCW1vdgljeCx3b3JkIHB0ciBbYnArMTJdCTsgbnVtYmVyIG9mIGJ5dGVzCisJCW1vdglhaCw0MGgJCQk7IHdyaXRlIGZpbGUKKwkJaW50CTIxaAorCQlqYwl3cml0ZV9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQorCQljbXAJYXgsd29yZCBwdHIgW2JwKzEyXQk7IG1ha2Ugc3VyZSBhbGwgYnl0ZXMgd3JpdHRlbgorCQlqZQl3cml0ZV9vaworCQltb3YJYXgsMQkJCTsgZWxzZSByZXR1cm4gMSBmb3Igbm90IE9LCisJCWptcAlzaG9ydCB3cml0ZV9lcnIKK3dyaXRlX29rOgl4b3IJYXgsYXgJCQk7IHJldHVybiB6ZXJvIGZvciBPSword3JpdGVfZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0CisJCXBvcAllcworCQlwb3AJZHgKKwkJcG9wCWN4CisJCXBvcAlieAorCQlwb3AJZGkKKwkJcG9wCXNpCisJCXBvcCAJYnAKKwkJcmV0CitfamRvc193cml0ZQllbmRwCisKKworOworOyB2b2lkIGZhciBqeG1zX2dldGRyaXZlciAoWE1TRFJJVkVSIGZhciAqKQorOworOyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIFhNUyBkcml2ZXIsIG9yIE5VTEwgaWYgbm90IGF2YWlsYWJsZQorOworX2p4bXNfZ2V0ZHJpdmVyCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YgCWF4LDQzMDBoCQk7IGNhbGwgbXVsdGlwbGV4IGludGVycnVwdCB3aXRoCisJCWludAkyZmgJCQk7IGEgbWFnaWMgY29va2llLCBoZXggNDMwMAorCQljbXAgCWFsLDgwaAkJCTsgQUwgc2hvdWxkIGNvbnRhaW4gaGV4IDgwCisJCWplCXhtc2F2YWlsCisJCXhvciAJZHgsZHgJCQk7IG5vIFhNUyBkcml2ZXIgYXZhaWxhYmxlCisJCXhvciAJYXgsYXgJCQk7IHJldHVybiBhIG5pbCBwb2ludGVyCisJCWptcAlzaG9ydCB4bXNhdmFpbF9kb25lCit4bXNhdmFpbDoJbW92IAlheCw0MzEwaAkJOyBmZXRjaCBkcml2ZXIgYWRkcmVzcyB3aXRoCisJCWludAkyZmgJCQk7IGFub3RoZXIgbWFnaWMgY29va2llCisJCW1vdiAJZHgsZXMJCQk7IGNvcHkgYWRkcmVzcyB0byBkeDpheAorCQltb3YgCWF4LGJ4Cit4bXNhdmFpbF9kb25lOglsZXMgCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgcG9pbnRlciB0byByZXR1cm4gdmFsdWUKKwkJbW92CXdvcmQgcHRyIGVzOltieF0sYXgKKwkJbW92CXdvcmQgcHRyIGVzOltieCsyXSxkeAorCQlwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0CisJCXBvcAllcworCQlwb3AJZHgKKwkJcG9wCWN4CisJCXBvcAlieAorCQlwb3AJZGkKKwkJcG9wCXNpCisJCXBvcAlicAorCQlyZXQKK19qeG1zX2dldGRyaXZlcgllbmRwCisKKworOworOyB2b2lkIGZhciBqeG1zX2NhbGxkcml2ZXIgKFhNU0RSSVZFUiwgWE1TY29udGV4dCBmYXIgKikKKzsKKzsgVGhlIFhNU2NvbnRleHQgc3RydWN0dXJlIGNvbnRhaW5zIHZhbHVlcyBmb3IgdGhlIEFYLERYLEJYLFNJLERTIHJlZ2lzdGVycy4KKzsgVGhlc2UgYXJlIGxvYWRlZCwgdGhlIFhNUyBjYWxsIGlzIHBlcmZvcm1lZCwgYW5kIHRoZSBuZXcgdmFsdWVzIG9mIHRoZQorOyBBWCxEWCxCWCByZWdpc3RlcnMgYXJlIHdyaXR0ZW4gYmFjayB0byB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCis7Citfanhtc19jYWxsZHJpdmVyIAlwcm9jCWZhcgorCQlwdXNoCWJwCQkJOyBsaW5rYWdlCisJCW1vdiAJYnAsc3AKKwkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKKwkJcHVzaAlkaQorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCWVzCisJCXB1c2gJZHMKKwkJbGVzIAlieCxkd29yZCBwdHIgW2JwKzEwXQk7IGdldCBYTVNjb250ZXh0IHBvaW50ZXIKKwkJbW92IAlheCx3b3JkIHB0ciBlczpbYnhdCTsgbG9hZCByZWdpc3RlcnMKKwkJbW92IAlkeCx3b3JkIHB0ciBlczpbYngrMl0KKwkJbW92IAlzaSx3b3JkIHB0ciBlczpbYngrNl0KKwkJbW92IAlkcyx3b3JkIHB0ciBlczpbYngrOF0KKwkJbW92IAlieCx3b3JkIHB0ciBlczpbYngrNF0KKwkJY2FsbAlkd29yZCBwdHIgW2JwKzZdCTsgY2FsbCB0aGUgZHJpdmVyCisJCW1vdgljeCxieAkJCTsgc2F2ZSByZXR1cm5lZCBCWCBmb3IgYSBzZWMKKwkJbGVzIAlieCxkd29yZCBwdHIgW2JwKzEwXQk7IGdldCBYTVNjb250ZXh0IHBvaW50ZXIKKwkJbW92IAl3b3JkIHB0ciBlczpbYnhdLGF4CTsgcHV0IGJhY2sgYXgsZHgsYngKKwkJbW92IAl3b3JkIHB0ciBlczpbYngrMl0sZHgKKwkJbW92IAl3b3JkIHB0ciBlczpbYngrNF0sY3gKKwkJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2p4bXNfY2FsbGRyaXZlciAJZW5kcAorCisKKzsKKzsgc2hvcnQgZmFyIGplbXNfYXZhaWxhYmxlICh2b2lkKQorOworOyBIYXZlIHdlIGdvdCBhbiBFTVMgZHJpdmVyPyAodGhpcyBjb21lcyBzdHJhaWdodCBmcm9tIHRoZSBFTVMgNC4wIHNwZWNzKQorOworX2plbXNfYXZhaWxhYmxlCXByb2MJZmFyCisJCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5CisJCXB1c2gJZGkKKwkJcHVzaAlieAorCQlwdXNoCWN4CisJCXB1c2gJZHgKKwkJcHVzaAllcworCQlwdXNoCWRzCisJCW1vdglheCwzNTY3aAkJOyBnZXQgaW50ZXJydXB0IHZlY3RvciA2N2gKKwkJaW50CTIxaAorCQlwdXNoCWNzCisJCXBvcAlkcworCQltb3YJZGksMDAwYWgJCTsgY2hlY2sgb2ZmcyAxMCBpbiByZXR1cm5lZCBzZWcKKwkJbGVhCXNpLEFTQ0lJX2RldmljZV9uYW1lCTsgYWdhaW5zdCBsaXRlcmFsIHN0cmluZworCQltb3YJY3gsOAorCQljbGQKKwkJcmVwZSBjbXBzYgorCQlqbmUJbm9fZW1zCisJCW1vdglheCwxCQkJOyBtYXRjaCwgaXQncyB0aGVyZQorCQlqbXAJc2hvcnQgYXZhaWxfZG9uZQorbm9fZW1zOgkJeG9yCWF4LGF4CQkJOyBpdCdzIG5vdCB0aGVyZQorYXZhaWxfZG9uZToJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlyZXQKKworQVNDSUlfZGV2aWNlX25hbWUJZGIJIkVNTVhYWFgwIgorCitfamVtc19hdmFpbGFibGUJZW5kcAorCisKKzsKKzsgdm9pZCBmYXIgamVtc19jYWxsZHJpdmVyIChFTVNjb250ZXh0IGZhciAqKQorOworOyBUaGUgRU1TY29udGV4dCBzdHJ1Y3R1cmUgY29udGFpbnMgdmFsdWVzIGZvciB0aGUgQVgsRFgsQlgsU0ksRFMgcmVnaXN0ZXJzLgorOyBUaGVzZSBhcmUgbG9hZGVkLCB0aGUgRU1TIHRyYXAgaXMgcGVyZm9ybWVkLCBhbmQgdGhlIG5ldyB2YWx1ZXMgb2YgdGhlCis7IEFYLERYLEJYIHJlZ2lzdGVycyBhcmUgd3JpdHRlbiBiYWNrIHRvIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4KKzsKK19qZW1zX2NhbGxkcml2ZXIJcHJvYyBmYXIKKwkJcHVzaAlicAkJCTsgbGlua2FnZQorCQltb3YgCWJwLHNwCisJCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5CisJCXB1c2gJZGkKKwkJcHVzaAlieAorCQlwdXNoCWN4CisJCXB1c2gJZHgKKwkJcHVzaAllcworCQlwdXNoCWRzCisJCWxlcyAJYngsZHdvcmQgcHRyIFticCs2XQk7IGdldCBFTVNjb250ZXh0IHBvaW50ZXIKKwkJbW92IAlheCx3b3JkIHB0ciBlczpbYnhdCTsgbG9hZCByZWdpc3RlcnMKKwkJbW92IAlkeCx3b3JkIHB0ciBlczpbYngrMl0KKwkJbW92IAlzaSx3b3JkIHB0ciBlczpbYngrNl0KKwkJbW92IAlkcyx3b3JkIHB0ciBlczpbYngrOF0KKwkJbW92IAlieCx3b3JkIHB0ciBlczpbYngrNF0KKwkJaW50CTY3aAkJCTsgY2FsbCB0aGUgRU1TIGRyaXZlcgorCQltb3YJY3gsYngJCQk7IHNhdmUgcmV0dXJuZWQgQlggZm9yIGEgc2VjCisJCWxlcyAJYngsZHdvcmQgcHRyIFticCs2XQk7IGdldCBFTVNjb250ZXh0IHBvaW50ZXIKKwkJbW92IAl3b3JkIHB0ciBlczpbYnhdLGF4CTsgcHV0IGJhY2sgYXgsZHgsYngKKwkJbW92IAl3b3JkIHB0ciBlczpbYngrMl0sZHgKKwkJbW92IAl3b3JkIHB0ciBlczpbYngrNF0sY3gKKwkJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2plbXNfY2FsbGRyaXZlcgllbmRwCisKK0pNRU1ET1NBX1RYVAllbmRzCisKKwkJZW5kCmRpZmYgLS1naXQgYS9qbWVtbWFjLmMgYi9qbWVtbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2ZjliZQotLS0gL2Rldi9udWxsCisrKyBiL2ptZW1tYWMuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIGptZW1tYWMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogam1lbW1hYy5jIHByb3ZpZGVzIGFuIEFwcGxlIE1hY2ludG9zaCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQorICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuCisgKgorICogSWYgeW91IHVzZSBqbWVtbWFjLmMsIHRoZW4geW91IG11c3QgZGVmaW5lIFVTRV9NQUNfTUVNTUdSIGluIHRoZQorICogSlBFR19JTlRFUk5BTFMgcGFydCBvZiBqY29uZmlnLmguCisgKgorICogam1lbW1hYy5jIHVzZXMgdGhlIE1hY2ludG9zaCB0b29sYm94IHJvdXRpbmVzIE5ld1B0ciBhbmQgRGlzcG9zZVB0cgorICogaW5zdGVhZCBvZiBtYWxsb2MgYW5kIGZyZWUuICBJdCBhY2N1cmF0ZWx5IGRldGVybWluZXMgdGhlIGFtb3VudCBvZgorICogbWVtb3J5IGF2YWlsYWJsZSBieSB1c2luZyBDb21wYWN0TWVtLiAgTm90aWNlIHRoYXQgaWYgbGVmdCB0byBpdHMKKyAqIG93biBkZXZpY2VzLCB0aGlzIGNvZGUgY2FuIGNoZXcgdXAgYWxsIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUKKyAqIGFwcGxpY2F0aW9uJ3Mgem9uZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSByYXRoZXIgc21hbGwgInNsb3AiCisgKiBmYWN0b3IgY29tcHV0ZWQgaW4ganBlZ19tZW1fYXZhaWxhYmxlKCkuICBUaGUgYXBwbGljYXRpb24gY2FuIGVuc3VyZQorICogdGhhdCBtb3JlIHNwYWNlIGlzIGxlZnQgb3ZlciBieSByZWR1Y2luZyBtYXhfbWVtb3J5X3RvX3VzZS4KKyAqCisgKiBMYXJnZSBpbWFnZXMgYXJlIHN3YXBwZWQgdG8gZGlzayB1c2luZyB0ZW1wb3JhcnkgZmlsZXMgYW5kIFN5c3RlbSA3LjArJ3MKKyAqIHRlbXBvcmFyeSBmb2xkZXIgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBOb3RlIHRoYXQgam1lbW1hYy5jIGRlcGVuZHMgb24gdHdvIGZlYXR1cmVzIG9mIE1hY09TIHRoYXQgd2VyZSBmaXJzdAorICogaW50cm9kdWNlZCBpbiBTeXN0ZW0gNzogRmluZEZvbGRlciBhbmQgdGhlIEZTU3BlYy1iYXNlZCBjYWxscy4KKyAqIElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyBqbWVtbWFjLmMgYW5kIGlzIHJ1biB1bmRlciBTeXN0ZW0gNiBvciBlYXJsaWVyLAorICogYW5kIHRoZSBqcGVnIGxpYnJhcnkgZGVjaWRlcyBpdCBuZWVkcyBhIHRlbXBvcmFyeSBmaWxlLCBpdCB3aWxsIGFib3J0LAorICogcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMgYWJvdXQgcmVxdWlyaW5nIFN5c3RlbSA3LiAgKElmIG5vIHRlbXBvcmFyeSBmaWxlcworICogYXJlIGNyZWF0ZWQsIGl0IHdpbGwgcnVuIGZpbmUuKQorICoKKyAqIElmIHlvdSB3YW50IHRvIHVzZSBqbWVtbWFjLmMgaW4gYW4gYXBwbGljYXRpb24gdGhhdCBtaWdodCBiZSB1c2VkIHdpdGgKKyAqIFN5c3RlbSA2IG9yIGVhcmxpZXIsIHRoZW4geW91IHNob3VsZCByZW1vdmUgZGVwZW5kZW5jaWVzIG9uIEZpbmRGb2xkZXIKKyAqIGFuZCB0aGUgRlNTcGVjIGNhbGxzLiAgWW91IHdpbGwgbmVlZCB0byByZXBsYWNlIEZpbmRGb2xkZXIgd2l0aCBzb21lCisgKiBvdGhlciBtZWNoYW5pc20gZm9yIGZpbmRpbmcgYSBwbGFjZSB0byBwdXQgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgeW91CisgKiBzaG91bGQgcmVwbGFjZSB0aGUgRlNTcGVjIGNhbGxzIHdpdGggdGhlaXIgSEZTIGVxdWl2YWxlbnRzOgorICoKKyAqICAgICBGU3BEZWxldGUgICAgIC0+ICBIRGVsZXRlCisgKiAgICAgRlNwR2V0RkluZm8gICAtPiAgSEdldEZJbmZvCisgKiAgICAgRlNwQ3JlYXRlICAgICAtPiAgSENyZWF0ZQorICogICAgIEZTcE9wZW5ERiAgICAgLT4gIEhPcGVuICAgICAgKioqIE5vdGU6IG5vdCBIT3BlbkRGICoqKgorICogICAgIEZTTWFrZUZTU3BlYyAgLT4gIChmaWxsIGluIHNwZWMgYnkgaGFuZC4pCisgKgorICogKFVzZSBIT3BlbiBpbnN0ZWFkIG9mIEhPcGVuREYuICBIT3BlbiBpcyBqdXN0IGEgZ2x1ZS1pbnRlcmZhY2UgdG8gUEJIT3BlbiwKKyAqIHdoaWNoIGlzIG9uIGFsbCBIRlMgbWFjcy4gIEhPcGVuREYgaXMgYSBTeXN0ZW0gNyBhZGRpdGlvbiB3aGljaCBhdm9pZHMgdGhlCisgKiBhZ2VzLW9sZCBwcm9ibGVtIG9mIG5hbWVzIHN0YXJ0aW5nIHdpdGggYSBwZXJpb2QuKQorICoKKyAqIENvbnRyaWJ1dGVkIGJ5IFNhbSBCdXNoZWxsIChqc2FtQGlhZ3Uub24ubmV0KSBhbmQKKyAqIERhbiBHaWxkb3IgKGd5bGRAaW4tdG91Y2guY29tKS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiam1lbXN5cy5oIiAgICAvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgVVNFX01BQ19NRU1NR1IJLyogbWFrZSBzdXJlIHVzZXIgZ290IGNvbmZpZ3VyYXRpb24gcmlnaHQgKi8KKyAgWW91IGZvcmdvdCB0byBkZWZpbmUgVVNFX01BQ19NRU1NR1IgaW4gamNvbmZpZy5oLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxNZW1vcnkuaD4gICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgbWVtb3J5IG1hbmFnZXIgKi8KKyNpbmNsdWRlIDxGaWxlcy5oPiAgICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgRmlsZSBzdHVmZiAqLworI2luY2x1ZGUgPEZvbGRlcnMuaD4gICAgLyogd2UgdXNlIHRoZSBNYWNPUyBIRlMgc3R1ZmYgKi8KKyNpbmNsdWRlIDxTY3JpcHQuaD4gICAgIC8qIGZvciBzbVN5c3RlbVNjcmlwdCAqLworI2luY2x1ZGUgPEdlc3RhbHQuaD4gICAgLyogd2UgdXNlIEdlc3RhbHQgdG8gdGVzdCBmb3Igc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSAqLworCisjaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KKyNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICJKUEclMDNkLlRNUCIKKyNlbmRpZgorCitzdGF0aWMgaW50IG5leHRfZmlsZV9udW07CS8qIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHNldmVyYWwgdGVtcCBmaWxlcyAqLworCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgTWFjT1MgbGlicmFyeQorICogcm91dGluZXMgTmV3UHRyKCkgYW5kIERpc3Bvc2VQdHIoKSwgd2hpY2ggYWxsb2NhdGUgZml4ZWQtYWRkcmVzcworICogc3RvcmFnZS4gIFVuZm9ydHVuYXRlbHksIHRoZSBJSkcgbGlicmFyeSBpc24ndCBzbWFydCBlbm91Z2ggdG8gY29wZQorICogd2l0aCByZWxvY2F0YWJsZSBzdG9yYWdlLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgTmV3UHRyKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIERpc3Bvc2VQdHIoKFB0cikgb2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KKyAqIE5COiB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMgc2ltcGx5IGZvcgorICogY29uc2lzdGVuY3kgd2l0aCB0aGUgcmVzdCBvZiB0aGUgSUpHIGNvZGU7IEZBUiBzaG91bGQgZXhwYW5kIHRvIGVtcHR5CisgKiBvbiByYXRpb25hbCBhcmNoaXRlY3R1cmVzIGxpa2UgdGhlIE1hYy4KKyAqLworCitHTE9CQUwodm9pZCBGQVIgKikKK2pwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCBGQVIgKikgTmV3UHRyKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBEaXNwb3NlUHRyKChQdHIpIG9iamVjdCk7Cit9CisKKworLyoKKyAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCisJCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCit7CisgIGxvbmcgbGltaXQgPSBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOworICBsb25nIHNsb3AsIG1lbTsKKworICAvKiBEb24ndCBhc2sgZm9yIG1vcmUgdGhhbiB3aGF0IGFwcGxpY2F0aW9uIGhhcyB0b2xkIHVzIHdlIG1heSB1c2UgKi8KKyAgaWYgKG1heF9ieXRlc19uZWVkZWQgPiBsaW1pdCAmJiBsaW1pdCA+IDApCisgICAgbWF4X2J5dGVzX25lZWRlZCA9IGxpbWl0OworICAvKiBGaW5kIHdoZXRoZXIgdGhlcmUncyBhIGJpZyBlbm91Z2ggZnJlZSBibG9jayBpbiB0aGUgaGVhcC4KKyAgICogQ29tcGFjdE1lbSB0cmllcyB0byBjcmVhdGUgYSBjb250aWd1b3VzIGJsb2NrIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSwKKyAgICogYW5kIHRoZW4gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBmcmVlIGJsb2NrICh3aGljaCBjb3VsZCBiZQorICAgKiBtdWNoIG1vcmUgb3IgbXVjaCBsZXNzIHRoYW4gd2UgYXNrZWQgZm9yKS4KKyAgICogV2UgYWRkIHNvbWUgc2xvcCB0byBlbnN1cmUgd2UgZG9uJ3QgdXNlIHVwIGFsbCBhdmFpbGFibGUgbWVtb3J5LgorICAgKi8KKyAgc2xvcCA9IG1heF9ieXRlc19uZWVkZWQgLyAxNiArIDMyNzY4TDsKKyAgbWVtID0gQ29tcGFjdE1lbShtYXhfYnl0ZXNfbmVlZGVkICsgc2xvcCkgLSBzbG9wOworICBpZiAobWVtIDwgMCkKKyAgICBtZW0gPSAwOwkJCS8qIHNpZ2gsIGNvdWxkbid0IGV2ZW4gZ2V0IHRoZSBzbG9wICovCisgIC8qIERvbid0IHRha2UgbW9yZSB0aGFuIHRoZSBhcHBsaWNhdGlvbiBzYXlzIHdlIGNhbiBoYXZlICovCisgIGlmIChtZW0gPiBsaW1pdCAmJiBsaW1pdCA+IDApCisgICAgbWVtID0gbGltaXQ7CisgIHJldHVybiBtZW07Cit9CisKKworLyoKKyAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgorICogQmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAqIGpwZWdfbWVtX2F2YWlsYWJsZSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNwYWNlIG5lZWRlZC4gIFlvdSBjYW4gZGlzcGVuc2UKKyAqIHdpdGggdGhlc2Ugcm91dGluZXMgaWYgeW91IGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5OyBzZWUgam1lbW5vYnMuYy4KKyAqLworCisKK01FVEhPRERFRih2b2lkKQorcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAorCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBsb25nIGJ5dGVzID0gYnl0ZV9jb3VudDsKKyAgbG9uZyByZXRWYWw7CisKKyAgaWYgKCBTZXRGUG9zICggaW5mby0+dGVtcF9maWxlLCBmc0Zyb21TdGFydCwgZmlsZV9vZmZzZXQgKSAhPSBub0VyciApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKworICByZXRWYWwgPSBGU1JlYWQgKCBpbmZvLT50ZW1wX2ZpbGUsICZieXRlcywKKwkJICAgICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcl9hZGRyZXNzICk7CisgIGlmICggcmV0VmFsICE9IG5vRXJyIHx8IGJ5dGVzICE9IGJ5dGVfY291bnQgKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGxvbmcgYnl0ZXMgPSBieXRlX2NvdW50OworICBsb25nIHJldFZhbDsKKworICBpZiAoIFNldEZQb3MgKCBpbmZvLT50ZW1wX2ZpbGUsIGZzRnJvbVN0YXJ0LCBmaWxlX29mZnNldCApICE9IG5vRXJyICkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOworCisgIHJldFZhbCA9IEZTV3JpdGUgKCBpbmZvLT50ZW1wX2ZpbGUsICZieXRlcywKKwkJICAgICAodW5zaWduZWQgY2hhciAqKSBidWZmZXJfYWRkcmVzcyApOworICBpZiAoIHJldFZhbCAhPSBub0VyciB8fCBieXRlcyAhPSBieXRlX2NvdW50ICkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK2Nsb3NlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgRlNDbG9zZSAoIGluZm8tPnRlbXBfZmlsZSApOworICBGU3BEZWxldGUgKCAmKGluZm8tPnRlbXBTcGVjKSApOworfQorCisKKy8qCisgKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KKyAqCisgKiBUaGlzIHZlcnNpb24gdXNlcyBGaW5kRm9sZGVyIHRvIGZpbmQgdGhlIFRlbXBvcmFyeSBJdGVtcyBmb2xkZXIsCisgKiBhbmQgcHV0cyB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlcmUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQoreworICBzaG9ydCAgICAgICAgIHRtcFJlZiwgdlJlZk51bTsKKyAgbG9uZyAgICAgICAgICBkaXJJRDsKKyAgRkluZm8gICAgICAgICBmaW5kZXJJbmZvOworICBGU1NwZWMgICAgICAgIHRoZVNwZWM7CisgIFN0cjI1NSAgICAgICAgZk5hbWU7CisgIE9TRXJyICAgICAgICAgb3NFcnI7CisgIGxvbmcgICAgICAgICAgZ2VzdGFsdFJlc3BvbnNlID0gMDsKKworICAvKiBDaGVjayB0aGF0IEZTU3BlYyBjYWxscyBhcmUgYXZhaWxhYmxlLiAqLworICBvc0VyciA9IEdlc3RhbHQoIGdlc3RhbHRGU0F0dHIsICZnZXN0YWx0UmVzcG9uc2UgKTsKKyAgaWYgKCAoIG9zRXJyICE9IG5vRXJyICkKKyAgICAgICB8fCAhKCBnZXN0YWx0UmVzcG9uc2UgJiAoMTw8Z2VzdGFsdEhhc0ZTU3BlY0NhbGxzKSApICkKKyAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICItIFN5c3RlbSA3LjAgb3IgbGF0ZXIgcmVxdWlyZWQiKTsKKyAgLyogVE8gRE86IGFkZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIHRvIGplcnJvci5oLiAqLworCisgIC8qIENoZWNrIHRoYXQgRmluZEZvbGRlciBpcyBhdmFpbGFibGUuICovCisgIG9zRXJyID0gR2VzdGFsdCggZ2VzdGFsdEZpbmRGb2xkZXJBdHRyLCAmZ2VzdGFsdFJlc3BvbnNlICk7CisgIGlmICggKCBvc0VyciAhPSBub0VyciApCisgICAgICAgfHwgISggZ2VzdGFsdFJlc3BvbnNlICYgKDE8PGdlc3RhbHRGaW5kRm9sZGVyUHJlc2VudCkgKSApCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSBTeXN0ZW0gNy4wIG9yIGxhdGVyIHJlcXVpcmVkLiIpOworICAvKiBUTyBETzogYWRkIGEgcHJvcGVyIGVycm9yIG1lc3NhZ2UgdG8gamVycm9yLmguICovCisKKyAgb3NFcnIgPSBGaW5kRm9sZGVyICgga09uU3lzdGVtRGlzaywga1RlbXBvcmFyeUZvbGRlclR5cGUsIGtDcmVhdGVGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLCAmZGlySUQgKTsKKyAgaWYgKCBvc0VyciAhPSBub0VyciApCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSB0ZW1wb3JhcnkgaXRlbXMgZm9sZGVyIHVuYXZhaWxhYmxlIik7CisgIC8qIFRPIERPOiBUcnkgcHV0dGluZyB0aGUgdGVtcCBmaWxlcyBzb21ld2hlcmUgZWxzZS4gKi8KKworICAvKiBLZWVwIGdlbmVyYXRpbmcgZmlsZSBuYW1lcyB0aWxsIHdlIGZpbmQgb25lIHRoYXQncyBub3QgaW4gdXNlICovCisgIGZvciAoOzspIHsKKyAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KKworICAgIHNwcmludGYoaW5mby0+dGVtcF9uYW1lLCBURU1QX0ZJTEVfTkFNRSwgbmV4dF9maWxlX251bSk7CisgICAgc3RyY3B5ICggKFB0cilmTmFtZSsxLCBpbmZvLT50ZW1wX25hbWUgKTsKKyAgICAqZk5hbWUgPSBzdHJsZW4gKGluZm8tPnRlbXBfbmFtZSk7CisgICAgb3NFcnIgPSBGU01ha2VGU1NwZWMgKCB2UmVmTnVtLCBkaXJJRCwgZk5hbWUsICZ0aGVTcGVjICk7CisKKyAgICBpZiAoIChvc0VyciA9IEZTcEdldEZJbmZvICggJnRoZVNwZWMsICZmaW5kZXJJbmZvICkgKSAhPSBub0VyciApCisgICAgICBicmVhazsKKyAgfQorCisgIG9zRXJyID0gRlNwQ3JlYXRlICggJnRoZVNwZWMsICc/Pz8/JywgJz8/Pz8nLCBzbVN5c3RlbVNjcmlwdCApOworICBpZiAoIG9zRXJyICE9IG5vRXJyICkKKyAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7CisKKyAgb3NFcnIgPSBGU3BPcGVuREYgKCAmdGhlU3BlYywgZnNSZFdyUGVybSwgJihpbmZvLT50ZW1wX2ZpbGUpICk7CisgIGlmICggb3NFcnIgIT0gbm9FcnIgKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgaW5mby0+dGVtcF9uYW1lKTsKKworICBpbmZvLT50ZW1wU3BlYyA9IHRoZVNwZWM7CisKKyAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOworICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7CisgIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKKyAqIGNsZWFudXAgcmVxdWlyZWQuCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIG5leHRfZmlsZV9udW0gPSAwOworCisgIC8qIG1heF9tZW1vcnlfdG9fdXNlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gRnJlZU1lbSgpJ3MgcmVzdWx0OworICAgKiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBtaWdodCBsYXRlciByZWR1Y2UgaXQsIGZvciBleGFtcGxlCisgICAqIHRvIGxlYXZlIHJvb20gdG8gaW52b2tlIG11bHRpcGxlIEpQRUcgb2JqZWN0cy4KKyAgICogTm90ZSB0aGF0IEZyZWVNZW0gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGZyZWUgYnl0ZXM7CisgICAqIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gYWxsb2NhdGUgYSBzaW5nbGUgYmxvY2sgb2YgdGhpcyBzaXplLgorICAgKi8KKyAgcmV0dXJuIEZyZWVNZW0oKTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KZGlmZiAtLWdpdCBhL2ptZW1tZ3IuYyBiL2ptZW1tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODAxYjMyCi0tLSAvZGV2L251bGwKKysrIGIvam1lbW1nci5jCkBAIC0wLDAgKzEsMTExOCBAQAorLyoKKyAqIGptZW1tZ3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUEVHIHN5c3RlbS1pbmRlcGVuZGVudCBtZW1vcnkgbWFuYWdlbWVudAorICogcm91dGluZXMuICBUaGlzIGNvZGUgaXMgdXNhYmxlIGFjcm9zcyBhIHdpZGUgdmFyaWV0eSBvZiBtYWNoaW5lczsgbW9zdAorICogb2YgdGhlIHN5c3RlbSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGlzb2xhdGVkIGluIGEgc2VwYXJhdGUgZmlsZS4KKyAqIFRoZSBtYWpvciBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSBhcmU6CisgKiAgICogcG9vbC1iYXNlZCBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIG9mIG1lbW9yeTsKKyAqICAgKiBwb2xpY3kgZGVjaXNpb25zIGFib3V0IGhvdyB0byBkaXZpZGUgYXZhaWxhYmxlIG1lbW9yeSBhbW9uZyB0aGUKKyAqICAgICB2aXJ0dWFsIGFycmF5czsKKyAqICAgKiBjb250cm9sIGxvZ2ljIGZvciBzd2FwcGluZyB2aXJ0dWFsIGFycmF5cyBiZXR3ZWVuIG1haW4gbWVtb3J5IGFuZAorICogICAgIGJhY2tpbmcgc3RvcmFnZS4KKyAqIFRoZSBzZXBhcmF0ZSBzeXN0ZW0tZGVwZW5kZW50IGZpbGUgcHJvdmlkZXMgdGhlIGFjdHVhbCBiYWNraW5nLXN0b3JhZ2UKKyAqIGFjY2VzcyBjb2RlLCBhbmQgaXQgY29udGFpbnMgdGhlIHBvbGljeSBkZWNpc2lvbiBhYm91dCBob3cgbXVjaCB0b3RhbAorICogbWFpbiBtZW1vcnkgdG8gdXNlLgorICogVGhpcyBmaWxlIGlzIHN5c3RlbS1kZXBlbmRlbnQgaW4gdGhlIHNlbnNlIHRoYXQgc29tZSBvZiBpdHMgZnVuY3Rpb25zCisgKiBhcmUgdW5uZWNlc3NhcnkgaW4gc29tZSBzeXN0ZW1zLiAgRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGVub3VnaCB2aXJ0dWFsCisgKiBtZW1vcnkgc28gdGhhdCBiYWNraW5nIHN0b3JhZ2Ugd2lsbCBuZXZlciBiZSB1c2VkLCBtdWNoIG9mIHRoZSB2aXJ0dWFsCisgKiBhcnJheSBjb250cm9sIGxvZ2ljIGNvdWxkIGJlIHJlbW92ZWQuICAoT2YgY291cnNlLCBpZiB5b3UgaGF2ZSB0aGF0IG11Y2gKKyAqIG1lbW9yeSB0aGVuIHlvdSBzaG91bGRuJ3QgY2FyZSBhYm91dCBhIGxpdHRsZSBiaXQgb2YgdW51c2VkIGNvZGUuLi4pCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2RlZmluZSBBTV9NRU1PUllfTUFOQUdFUgkvKiB3ZSBkZWZpbmUganZpcnRfWGFycmF5X2NvbnRyb2wgc3RydWN0cyAqLworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBOT19HRVRFTlYKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBnZXRlbnYoKSAqLworZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOworI2VuZGlmCisjZW5kaWYKKworCisvKgorICogU29tZSBpbXBvcnRhbnQgbm90ZXM6CisgKiAgIFRoZSBhbGxvY2F0aW9uIHJvdXRpbmVzIHByb3ZpZGVkIGhlcmUgbXVzdCBuZXZlciByZXR1cm4gTlVMTC4KKyAqICAgVGhleSBzaG91bGQgZXhpdCB0byBlcnJvcl9leGl0IGlmIHVuc3VjY2Vzc2Z1bC4KKyAqCisgKiAgIEl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSB0byBtZXJnZSB0aGUgc2FycmF5IGFuZCBiYXJyYXkgcm91dGluZXMsCisgKiAgIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHRleHR1YWxseSBhbG1vc3QgdGhlIHNhbWUsIGJlY2F1c2Ugc2FtcGxlcyBhcmUKKyAqICAgdXN1YWxseSBzdG9yZWQgYXMgYnl0ZXMgd2hpbGUgY29lZmZpY2llbnRzIGFyZSBzaG9ydHMgb3IgaW50cy4gIFRodXMsCisgKiAgIGluIG1hY2hpbmVzIHdoZXJlIGJ5dGUgcG9pbnRlcnMgaGF2ZSBhIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbiBmcm9tCisgKiAgIHdvcmQgcG9pbnRlcnMsIHRoZSByZXN1bHRpbmcgbWFjaGluZSBjb2RlIGNvdWxkIG5vdCBiZSB0aGUgc2FtZS4KKyAqLworCisKKy8qCisgKiBNYW55IG1hY2hpbmVzIHJlcXVpcmUgc3RvcmFnZSBhbGlnbm1lbnQ6IGxvbmdzIG11c3Qgc3RhcnQgb24gNC1ieXRlCisgKiBib3VuZGFyaWVzLCBkb3VibGVzIG9uIDgtYnl0ZSBib3VuZGFyaWVzLCBldGMuICBPbiBzdWNoIG1hY2hpbmVzLCBtYWxsb2MoKQorICogYWx3YXlzIHJldHVybnMgcG9pbnRlcnMgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIHRoZSB3b3JzdC1jYXNlIGFsaWdubWVudAorICogcmVxdWlyZW1lbnQsIGFuZCB3ZSBoYWQgYmV0dGVyIGRvIHNvIHRvby4KKyAqIFRoZXJlIGlzbid0IGFueSByZWFsbHkgcG9ydGFibGUgd2F5IHRvIGRldGVybWluZSB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKKyAqIHJlcXVpcmVtZW50LiAgVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGF0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaXMKKyAqIG11bHRpcGxlcyBvZiBzaXplb2YoQUxJR05fVFlQRSkuCisgKiBCeSBkZWZhdWx0LCB3ZSBkZWZpbmUgQUxJR05fVFlQRSBhcyBkb3VibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzb21lCisgKiB3b3Jrc3RhdGlvbnMgKHdoZXJlIGRvdWJsZXMgcmVhbGx5IGRvIG5lZWQgOC1ieXRlIGFsaWdubWVudCkgYW5kIHdpbGwgd29yaworICogZmluZSBvbiBuZWFybHkgZXZlcnl0aGluZy4gIElmIHlvdXIgbWFjaGluZSBoYXMgbGVzc2VyIGFsaWdubWVudCBuZWVkcywKKyAqIHlvdSBjYW4gc2F2ZSBhIGZldyBieXRlcyBieSBtYWtpbmcgQUxJR05fVFlQRSBzbWFsbGVyLgorICogVGhlIG9ubHkgcGxhY2UgSSBrbm93IG9mIHdoZXJlIHRoaXMgd2lsbCBOT1Qgd29yayBpcyBjZXJ0YWluIE1hY2ludG9zaAorICogNjgweDAgY29tcGlsZXJzIHRoYXQgZGVmaW5lIGRvdWJsZSBhcyBhIDEwLWJ5dGUgSUVFRSBleHRlbmRlZCBmbG9hdC4KKyAqIERvaW5nIDEwLWJ5dGUgYWxpZ25tZW50IGlzIGNvdW50ZXJwcm9kdWN0aXZlIGJlY2F1c2UgbG9uZ3dvcmRzIHdvbid0IGJlCisgKiBhbGlnbmVkIHdlbGwuICBQdXQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiBpbiBqY29uZmlnLmggaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlci4KKyAqLworCisjaWZuZGVmIEFMSUdOX1RZUEUJCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCAqLworI2RlZmluZSBBTElHTl9UWVBFICBkb3VibGUKKyNlbmRpZgorCisKKy8qCisgKiBXZSBhbGxvY2F0ZSBvYmplY3RzIGZyb20gInBvb2xzIiwgd2hlcmUgZWFjaCBwb29sIGlzIGdvdHRlbiB3aXRoIGEgc2luZ2xlCisgKiByZXF1ZXN0IHRvIGpwZWdfZ2V0X3NtYWxsKCkgb3IganBlZ19nZXRfbGFyZ2UoKS4gIFRoZXJlIGlzIG5vIHBlci1vYmplY3QKKyAqIG92ZXJoZWFkIHdpdGhpbiBhIHBvb2wsIGV4Y2VwdCBmb3IgYWxpZ25tZW50IHBhZGRpbmcuICBFYWNoIHBvb2wgaGFzIGEKKyAqIGhlYWRlciB3aXRoIGEgbGluayB0byB0aGUgbmV4dCBwb29sIG9mIHRoZSBzYW1lIGNsYXNzLgorICogU21hbGwgYW5kIGxhcmdlIHBvb2wgaGVhZGVycyBhcmUgaWRlbnRpY2FsIGV4Y2VwdCB0aGF0IHRoZSBsYXR0ZXIncworICogbGluayBwb2ludGVyIG11c3QgYmUgRkFSIG9uIDgweDg2IG1hY2hpbmVzLgorICogTm90aWNlIHRoYXQgdGhlICJyZWFsIiBoZWFkZXIgZmllbGRzIGFyZSB1bmlvbidlZCB3aXRoIGEgZHVtbXkgQUxJR05fVFlQRQorICogZmllbGQuICBUaGlzIGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gbWFrZSBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpIGEgbXVsdGlwbGUKKyAqIG9mIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgQUxJR05fVFlQRS4KKyAqLworCit0eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0ICogc21hbGxfcG9vbF9wdHI7CisKK3R5cGVkZWYgdW5pb24gc21hbGxfcG9vbF9zdHJ1Y3QgeworICBzdHJ1Y3QgeworICAgIHNtYWxsX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLworICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCisgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCisgIH0gaGRyOworICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLworfSBzbWFsbF9wb29sX2hkcjsKKwordHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCBGQVIgKiBsYXJnZV9wb29sX3B0cjsKKwordHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCB7CisgIHN0cnVjdCB7CisgICAgbGFyZ2VfcG9vbF9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIHBvb2xzICovCisgICAgc2l6ZV90IGJ5dGVzX3VzZWQ7CQkvKiBob3cgbWFueSBieXRlcyBhbHJlYWR5IHVzZWQgd2l0aGluIHBvb2wgKi8KKyAgICBzaXplX3QgYnl0ZXNfbGVmdDsJCS8qIGJ5dGVzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGlzIHBvb2wgKi8KKyAgfSBoZHI7CisgIEFMSUdOX1RZUEUgZHVtbXk7CQkvKiBpbmNsdWRlZCBpbiB1bmlvbiB0byBlbnN1cmUgYWxpZ25tZW50ICovCit9IGxhcmdlX3Bvb2xfaGRyOworCisKKy8qCisgKiBIZXJlIGlzIHRoZSBmdWxsIGRlZmluaXRpb24gb2YgYSBtZW1vcnkgbWFuYWdlciBvYmplY3QuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIEVhY2ggcG9vbCBpZGVudGlmaWVyIChsaWZldGltZSBjbGFzcykgbmFtZXMgYSBsaW5rZWQgbGlzdCBvZiBwb29scy4gKi8KKyAgc21hbGxfcG9vbF9wdHIgc21hbGxfbGlzdFtKUE9PTF9OVU1QT09MU107CisgIGxhcmdlX3Bvb2xfcHRyIGxhcmdlX2xpc3RbSlBPT0xfTlVNUE9PTFNdOworCisgIC8qIFNpbmNlIHdlIG9ubHkgaGF2ZSBvbmUgbGlmZXRpbWUgY2xhc3Mgb2YgdmlydHVhbCBhcnJheXMsIG9ubHkgb25lCisgICAqIGxpbmtlZCBsaXN0IGlzIG5lY2Vzc2FyeSAoZm9yIGVhY2ggZGF0YXR5cGUpLiAgTm90ZSB0aGF0IHRoZSB2aXJ0dWFsCisgICAqIGFycmF5IGNvbnRyb2wgYmxvY2tzIGJlaW5nIGxpbmtlZCB0b2dldGhlciBhcmUgYWN0dWFsbHkgc3RvcmVkIHNvbWV3aGVyZQorICAgKiBpbiB0aGUgc21hbGwtcG9vbCBsaXN0LgorICAgKi8KKyAganZpcnRfc2FycmF5X3B0ciB2aXJ0X3NhcnJheV9saXN0OworICBqdmlydF9iYXJyYXlfcHRyIHZpcnRfYmFycmF5X2xpc3Q7CisKKyAgLyogVGhpcyBjb3VudHMgdG90YWwgc3BhY2Ugb2J0YWluZWQgZnJvbSBqcGVnX2dldF9zbWFsbC9sYXJnZSAqLworICBsb25nIHRvdGFsX3NwYWNlX2FsbG9jYXRlZDsKKworICAvKiBhbGxvY19zYXJyYXkgYW5kIGFsbG9jX2JhcnJheSBzZXQgdGhpcyB2YWx1ZSBmb3IgdXNlIGJ5IHZpcnR1YWwKKyAgICogYXJyYXkgcm91dGluZXMuCisgICAqLworICBKRElNRU5TSU9OIGxhc3Rfcm93c3BlcmNodW5rOwkvKiBmcm9tIG1vc3QgcmVjZW50IGFsbG9jX3NhcnJheS9iYXJyYXkgKi8KK30gbXlfbWVtb3J5X21ncjsKKwordHlwZWRlZiBteV9tZW1vcnlfbWdyICogbXlfbWVtX3B0cjsKKworCisvKgorICogVGhlIGNvbnRyb2wgYmxvY2tzIGZvciB2aXJ0dWFsIGFycmF5cy4KKyAqIE5vdGUgdGhhdCB0aGVzZSBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbiB0aGUgInNtYWxsIiBwb29sIGFyZWEuCisgKiBTeXN0ZW0tZGVwZW5kZW50IGluZm8gZm9yIHRoZSBhc3NvY2lhdGVkIGJhY2tpbmcgc3RvcmUgKGlmIGFueSkgaXMgaGlkZGVuCisgKiBpbnNpZGUgdGhlIGJhY2tpbmdfc3RvcmVfaW5mbyBzdHJ1Y3QuCisgKi8KKworc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsKKyAgSlNBTVBBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCisgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLworICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X3NhcnJheSAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCisgIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KKyAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KKyAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KKyAganZpcnRfc2FycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBzYXJyYXkgY29udHJvbCBibG9jayAqLworICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCit9OworCitzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeworICBKQkxPQ0tBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCisgIEpESU1FTlNJT04gYmxvY2tzcGVycm93OwkvKiB3aWR0aCBvZiBhcnJheSAoYW5kIG9mIG1lbW9yeSBidWZmZXIpICovCisgIEpESU1FTlNJT04gbWF4YWNjZXNzOwkJLyogbWF4IHJvd3MgYWNjZXNzZWQgYnkgYWNjZXNzX3ZpcnRfYmFycmF5ICovCisgIEpESU1FTlNJT04gcm93c19pbl9tZW07CS8qIGhlaWdodCBvZiBtZW1vcnkgYnVmZmVyICovCisgIEpESU1FTlNJT04gcm93c3BlcmNodW5rOwkvKiBhbGxvY2F0aW9uIGNodW5rIHNpemUgaW4gbWVtX2J1ZmZlciAqLworICBKRElNRU5TSU9OIGN1cl9zdGFydF9yb3c7CS8qIGZpcnN0IGxvZ2ljYWwgcm93ICMgaW4gdGhlIGJ1ZmZlciAqLworICBKRElNRU5TSU9OIGZpcnN0X3VuZGVmX3JvdzsJLyogcm93ICMgb2YgZmlyc3QgdW5pbml0aWFsaXplZCByb3cgKi8KKyAgYm9vbGVhbiBwcmVfemVybzsJCS8qIHByZS16ZXJvIG1vZGUgcmVxdWVzdGVkPyAqLworICBib29sZWFuIGRpcnR5OwkJLyogZG8gY3VycmVudCBidWZmZXIgY29udGVudHMgbmVlZCB3cml0dGVuPyAqLworICBib29sZWFuIGJfc19vcGVuOwkJLyogaXMgYmFja2luZy1zdG9yZSBkYXRhIHZhbGlkPyAqLworICBqdmlydF9iYXJyYXlfcHRyIG5leHQ7CS8qIGxpbmsgdG8gbmV4dCB2aXJ0dWFsIGJhcnJheSBjb250cm9sIGJsb2NrICovCisgIGJhY2tpbmdfc3RvcmVfaW5mbyBiX3NfaW5mbzsJLyogU3lzdGVtLWRlcGVuZGVudCBjb250cm9sIGluZm8gKi8KK307CisKKworI2lmZGVmIE1FTV9TVEFUUwkJLyogb3B0aW9uYWwgZXh0cmEgc3R1ZmYgZm9yIHN0YXRpc3RpY3MgKi8KKworTE9DQUwodm9pZCkKK3ByaW50X21lbV9zdGF0cyAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7CisgIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOworCisgIC8qIFNpbmNlIHRoaXMgaXMgb25seSBhIGRlYnVnZ2luZyBzdHViLCB3ZSBjYW4gY2hlYXQgYSBsaXR0bGUgYnkgdXNpbmcKKyAgICogZnByaW50ZiBkaXJlY3RseSByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIHRoZSB0cmFjZSBtZXNzYWdlIGNvZGUuCisgICAqIFRoaXMgaXMgaGVscGZ1bCBiZWNhdXNlIG1lc3NhZ2UgcGFybSBhcnJheSBjYW4ndCBoYW5kbGUgbG9uZ3MuCisgICAqLworICBmcHJpbnRmKHN0ZGVyciwgIkZyZWVpbmcgcG9vbCAlZCwgdG90YWwgc3BhY2UgPSAlbGRcbiIsCisJICBwb29sX2lkLCBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7CisKKyAgZm9yIChsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsgbGhkcl9wdHIgIT0gTlVMTDsKKyAgICAgICBsaGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiICBMYXJnZSBjaHVuayB1c2VkICVsZFxuIiwKKwkgICAgKGxvbmcpIGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCk7CisgIH0KKworICBmb3IgKHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOyBzaGRyX3B0ciAhPSBOVUxMOworICAgICAgIHNoZHJfcHRyID0gc2hkcl9wdHItPmhkci5uZXh0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICIgIFNtYWxsIGNodW5rIHVzZWQgJWxkIGZyZWUgJWxkXG4iLAorCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc191c2VkLAorCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0KTsKKyAgfQorfQorCisjZW5kaWYgLyogTUVNX1NUQVRTICovCisKKworTE9DQUwodm9pZCkKK291dF9vZl9tZW1vcnkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHdoaWNoKQorLyogUmVwb3J0IGFuIG91dC1vZi1tZW1vcnkgZXJyb3IgYW5kIHN0b3AgZXhlY3V0aW9uICovCisvKiBJZiB3ZSBjb21waWxlZCBNRU1fU1RBVFMgc3VwcG9ydCwgcmVwb3J0IGFsbG9jIHJlcXVlc3RzIGJlZm9yZSBkeWluZyAqLworeworI2lmZGVmIE1FTV9TVEFUUworICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDI7CS8qIGZvcmNlIHNlbGZfZGVzdHJ1Y3QgdG8gcmVwb3J0IHN0YXRzICovCisjZW5kaWYKKyAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgd2hpY2gpOworfQorCisKKy8qCisgKiBBbGxvY2F0aW9uIG9mICJzbWFsbCIgb2JqZWN0cy4KKyAqCisgKiBGb3IgdGhlc2UsIHdlIHVzZSBwb29sZWQgc3RvcmFnZS4gIFdoZW4gYSBuZXcgcG9vbCBtdXN0IGJlIGNyZWF0ZWQsCisgKiB3ZSB0cnkgdG8gZ2V0IGVub3VnaCBzcGFjZSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBwbHVzIGEgInNsb3AiIGZhY3RvciwKKyAqIHdoZXJlIHRoZSBzbG9wIHdpbGwgYmUgdGhlIGFtb3VudCBvZiBsZWZ0b3ZlciBzcGFjZSBpbiB0aGUgbmV3IHBvb2wuCisgKiBUaGUgc3BlZWQgdnMuIHNwYWNlIHRyYWRlb2ZmIGlzIGxhcmdlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2xvcCB2YWx1ZXMuCisgKiBBIGRpZmZlcmVudCBzbG9wIHZhbHVlIGlzIHByb3ZpZGVkIGZvciBlYWNoIHBvb2wgY2xhc3MgKGxpZmV0aW1lKSwKKyAqIGFuZCB3ZSBhbHNvIGRpc3Rpbmd1aXNoIHRoZSBmaXJzdCBwb29sIG9mIGEgY2xhc3MgZnJvbSBsYXRlciBvbmVzLgorICogTk9URTogdGhlIHZhbHVlcyBnaXZlbiB3b3JrIGZhaXJseSB3ZWxsIG9uIGJvdGggMTYtIGFuZCAzMi1iaXQtaW50CisgKiBtYWNoaW5lcywgYnV0IG1heSBiZSB0b28gc21hbGwgaWYgbG9uZ3MgYXJlIDY0IGJpdHMgb3IgbW9yZS4KKyAqLworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGZpcnN0X3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKK3sKKwkxNjAwLAkJCS8qIGZpcnN0IFBFUk1BTkVOVCBwb29sICovCisJMTYwMDAJCQkvKiBmaXJzdCBJTUFHRSBwb29sICovCit9OworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGV4dHJhX3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKK3sKKwkwLAkJCS8qIGFkZGl0aW9uYWwgUEVSTUFORU5UIHBvb2xzICovCisJNTAwMAkJCS8qIGFkZGl0aW9uYWwgSU1BR0UgcG9vbHMgKi8KK307CisKKyNkZWZpbmUgTUlOX1NMT1AgIDUwCQkvKiBncmVhdGVyIHRoYW4gMCB0byBhdm9pZCBmdXRpbGUgbG9vcGluZyAqLworCisKK01FVEhPRERFRih2b2lkICopCithbGxvY19zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKKy8qIEFsbG9jYXRlIGEgInNtYWxsIiBvYmplY3QgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgc21hbGxfcG9vbF9wdHIgaGRyX3B0ciwgcHJldl9oZHJfcHRyOworICBjaGFyICogZGF0YV9wdHI7CisgIHNpemVfdCBvZGRfYnl0ZXMsIG1pbl9yZXF1ZXN0LCBzbG9wOworCisgIC8qIENoZWNrIGZvciB1bnNhdGlzZmlhYmxlIHJlcXVlc3QgKGRvIG5vdyB0byBlbnN1cmUgbm8gb3ZlcmZsb3cgYmVsb3cpICovCisgIGlmIChzaXplb2ZvYmplY3QgPiAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihzbWFsbF9wb29sX2hkcikpKQorICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDEpOwkvKiByZXF1ZXN0IGV4Y2VlZHMgbWFsbG9jJ3MgYWJpbGl0eSAqLworCisgIC8qIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIFNJWkVPRihBTElHTl9UWVBFKSAqLworICBvZGRfYnl0ZXMgPSBzaXplb2ZvYmplY3QgJSBTSVpFT0YoQUxJR05fVFlQRSk7CisgIGlmIChvZGRfYnl0ZXMgPiAwKQorICAgIHNpemVvZm9iamVjdCArPSBTSVpFT0YoQUxJR05fVFlQRSkgLSBvZGRfYnl0ZXM7CisKKyAgLyogU2VlIGlmIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiBhbnkgZXhpc3RpbmcgcG9vbCAqLworICBpZiAocG9vbF9pZCA8IDAgfHwgcG9vbF9pZCA+PSBKUE9PTF9OVU1QT09MUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLworICBwcmV2X2hkcl9wdHIgPSBOVUxMOworICBoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOworICB3aGlsZSAoaGRyX3B0ciAhPSBOVUxMKSB7CisgICAgaWYgKGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID49IHNpemVvZm9iamVjdCkKKyAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHBvb2wgd2l0aCBlbm91Z2ggc3BhY2UgKi8KKyAgICBwcmV2X2hkcl9wdHIgPSBoZHJfcHRyOworICAgIGhkcl9wdHIgPSBoZHJfcHRyLT5oZHIubmV4dDsKKyAgfQorCisgIC8qIFRpbWUgdG8gbWFrZSBhIG5ldyBwb29sPyAqLworICBpZiAoaGRyX3B0ciA9PSBOVUxMKSB7CisgICAgLyogbWluX3JlcXVlc3QgaXMgd2hhdCB3ZSBuZWVkIG5vdywgc2xvcCBpcyB3aGF0IHdpbGwgYmUgbGVmdG92ZXIgKi8KKyAgICBtaW5fcmVxdWVzdCA9IHNpemVvZm9iamVjdCArIFNJWkVPRihzbWFsbF9wb29sX2hkcik7CisgICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLworICAgICAgc2xvcCA9IGZpcnN0X3Bvb2xfc2xvcFtwb29sX2lkXTsKKyAgICBlbHNlCisgICAgICBzbG9wID0gZXh0cmFfcG9vbF9zbG9wW3Bvb2xfaWRdOworICAgIC8qIERvbid0IGFzayBmb3IgbW9yZSB0aGFuIE1BWF9BTExPQ19DSFVOSyAqLworICAgIGlmIChzbG9wID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCkpCisgICAgICBzbG9wID0gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCk7CisgICAgLyogVHJ5IHRvIGdldCBzcGFjZSwgaWYgZmFpbCByZWR1Y2Ugc2xvcCBhbmQgdHJ5IGFnYWluICovCisgICAgZm9yICg7OykgeworICAgICAgaGRyX3B0ciA9IChzbWFsbF9wb29sX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIG1pbl9yZXF1ZXN0ICsgc2xvcCk7CisgICAgICBpZiAoaGRyX3B0ciAhPSBOVUxMKQorCWJyZWFrOworICAgICAgc2xvcCAvPSAyOworICAgICAgaWYgKHNsb3AgPCBNSU5fU0xPUCkJLyogZ2l2ZSB1cCB3aGVuIGl0IGdldHMgcmVhbCBzbWFsbCAqLworCW91dF9vZl9tZW1vcnkoY2luZm8sIDIpOyAvKiBqcGVnX2dldF9zbWFsbCBmYWlsZWQgKi8KKyAgICB9CisgICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gbWluX3JlcXVlc3QgKyBzbG9wOworICAgIC8qIFN1Y2Nlc3MsIGluaXRpYWxpemUgdGhlIG5ldyBwb29sIGhlYWRlciBhbmQgYWRkIHRvIGVuZCBvZiBsaXN0ICovCisgICAgaGRyX3B0ci0+aGRyLm5leHQgPSBOVUxMOworICAgIGhkcl9wdHItPmhkci5ieXRlc191c2VkID0gMDsKKyAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA9IHNpemVvZm9iamVjdCArIHNsb3A7CisgICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLworICAgICAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKKyAgICBlbHNlCisgICAgICBwcmV2X2hkcl9wdHItPmhkci5uZXh0ID0gaGRyX3B0cjsKKyAgfQorCisgIC8qIE9LLCBhbGxvY2F0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgcG9vbCAqLworICBkYXRhX3B0ciA9IChjaGFyICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCisgIGRhdGFfcHRyICs9IGhkcl9wdHItPmhkci5ieXRlc191c2VkOyAvKiBwb2ludCB0byBwbGFjZSBmb3Igb2JqZWN0ICovCisgIGhkcl9wdHItPmhkci5ieXRlc191c2VkICs9IHNpemVvZm9iamVjdDsKKyAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgLT0gc2l6ZW9mb2JqZWN0OworCisgIHJldHVybiAodm9pZCAqKSBkYXRhX3B0cjsKK30KKworCisvKgorICogQWxsb2NhdGlvbiBvZiAibGFyZ2UiIG9iamVjdHMuCisgKgorICogVGhlIGV4dGVybmFsIHNlbWFudGljcyBvZiB0aGVzZSBhcmUgdGhlIHNhbWUgYXMgInNtYWxsIiBvYmplY3RzLAorICogZXhjZXB0IHRoYXQgRkFSIHBvaW50ZXJzIGFyZSB1c2VkIG9uIDgweDg2LiAgSG93ZXZlciB0aGUgcG9vbAorICogbWFuYWdlbWVudCBoZXVyaXN0aWNzIGFyZSBxdWl0ZSBkaWZmZXJlbnQuICBXZSBhc3N1bWUgdGhhdCBlYWNoCisgKiByZXF1ZXN0IGlzIGxhcmdlIGVub3VnaCB0aGF0IGl0IG1heSBhcyB3ZWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0bworICoganBlZ19nZXRfbGFyZ2U7IHRoZSBwb29sIG1hbmFnZW1lbnQganVzdCBsaW5rcyBldmVyeXRoaW5nIHRvZ2V0aGVyCisgKiBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBvbiBkZW1hbmQuCisgKiBOb3RlOiB0aGUgbWFqb3IgdXNlIG9mICJsYXJnZSIgb2JqZWN0cyBpcyBpbiBKU0FNUEFSUkFZIGFuZCBKQkxPQ0tBUlJBWQorICogc3RydWN0dXJlcy4gIFRoZSByb3V0aW5lcyB0aGF0IGNyZWF0ZSB0aGVzZSBzdHJ1Y3R1cmVzIChzZWUgYmVsb3cpCisgKiBkZWxpYmVyYXRlbHkgYnVuY2ggcm93cyB0b2dldGhlciB0byBlbnN1cmUgYSBsYXJnZSByZXF1ZXN0IHNpemUuCisgKi8KKworTUVUSE9EREVGKHZvaWQgRkFSICopCithbGxvY19sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKKy8qIEFsbG9jYXRlIGEgImxhcmdlIiBvYmplY3QgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgbGFyZ2VfcG9vbF9wdHIgaGRyX3B0cjsKKyAgc2l6ZV90IG9kZF9ieXRlczsKKworICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLworICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSkKKyAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAzKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KKworICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KKyAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOworICBpZiAob2RkX2J5dGVzID4gMCkKKyAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOworCisgIC8qIEFsd2F5cyBtYWtlIGEgbmV3IHBvb2wgKi8KKyAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworICBoZHJfcHRyID0gKGxhcmdlX3Bvb2xfcHRyKSBqcGVnX2dldF9sYXJnZShjaW5mbywgc2l6ZW9mb2JqZWN0ICsKKwkJCQkJICAgIFNJWkVPRihsYXJnZV9wb29sX2hkcikpOworICBpZiAoaGRyX3B0ciA9PSBOVUxMKQorICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDQpOwkvKiBqcGVnX2dldF9sYXJnZSBmYWlsZWQgKi8KKyAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gc2l6ZW9mb2JqZWN0ICsgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKKworICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBsaXN0ICovCisgIGhkcl9wdHItPmhkci5uZXh0ID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOworICAvKiBXZSBtYWludGFpbiBzcGFjZSBjb3VudHMgaW4gZWFjaCBwb29sIGhlYWRlciBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMsCisgICAqIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBuZWVkZWQgZm9yIGFsbG9jYXRpb24uCisgICAqLworICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IHNpemVvZm9iamVjdDsKKyAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSAwOworICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBoZHJfcHRyOworCisgIHJldHVybiAodm9pZCBGQVIgKikgKGhkcl9wdHIgKyAxKTsgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBieXRlIGluIHBvb2wgKi8KK30KKworCisvKgorICogQ3JlYXRpb24gb2YgMi1EIHNhbXBsZSBhcnJheXMuCisgKiBUaGUgcG9pbnRlcnMgYXJlIGluIG5lYXIgaGVhcCwgdGhlIHNhbXBsZXMgdGhlbXNlbHZlcyBpbiBGQVIgaGVhcC4KKyAqCisgKiBUbyBtaW5pbWl6ZSBhbGxvY2F0aW9uIG92ZXJoZWFkIGFuZCB0byBhbGxvdyBJL08gb2YgbGFyZ2UgY29udGlndW91cworICogYmxvY2tzLCB3ZSBhbGxvY2F0ZSB0aGUgc2FtcGxlIHJvd3MgaW4gZ3JvdXBzIG9mIGFzIG1hbnkgcm93cyBhcyBwb3NzaWJsZQorICogd2l0aG91dCBleGNlZWRpbmcgTUFYX0FMTE9DX0NIVU5LIHRvdGFsIGJ5dGVzIHBlciBhbGxvY2F0aW9uIHJlcXVlc3QuCisgKiBOQjogdGhlIHZpcnR1YWwgYXJyYXkgY29udHJvbCByb3V0aW5lcywgbGF0ZXIgaW4gdGhpcyBmaWxlLCBrbm93IGFib3V0CisgKiB0aGlzIGNodW5raW5nIG9mIHJvd3MuICBUaGUgcm93c3BlcmNodW5rIHZhbHVlIGlzIGxlZnQgaW4gdGhlIG1lbSBtYW5hZ2VyCisgKiBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgc2F2ZWQgYXdheSBpZiB0aGlzIHNhcnJheSBpcyB0aGUgd29ya3NwYWNlIGZvcgorICogYSB2aXJ0dWFsIGFycmF5LgorICovCisKK01FVEhPRERFRihKU0FNUEFSUkFZKQorYWxsb2Nfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCSAgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQorLyogQWxsb2NhdGUgYSAyLUQgc2FtcGxlIGFycmF5ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIEpTQU1QQVJSQVkgcmVzdWx0OworICBKU0FNUFJPVyB3b3Jrc3BhY2U7CisgIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7CisgIGxvbmcgbHRlbXA7CisKKyAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLworICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLworCSAgKChsb25nKSBzYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpKTsKKyAgaWYgKGx0ZW1wIDw9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7CisgIGlmIChsdGVtcCA8IChsb25nKSBudW1yb3dzKQorICAgIHJvd3NwZXJjaHVuayA9IChKRElNRU5TSU9OKSBsdGVtcDsKKyAgZWxzZQorICAgIHJvd3NwZXJjaHVuayA9IG51bXJvd3M7CisgIG1lbS0+bGFzdF9yb3dzcGVyY2h1bmsgPSByb3dzcGVyY2h1bms7CisKKyAgLyogR2V0IHNwYWNlIGZvciByb3cgcG9pbnRlcnMgKHNtYWxsIG9iamVjdCkgKi8KKyAgcmVzdWx0ID0gKEpTQU1QQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAorCQkJCSAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKU0FNUFJPVykpKTsKKworICAvKiBHZXQgdGhlIHJvd3MgdGhlbXNlbHZlcyAobGFyZ2Ugb2JqZWN0cykgKi8KKyAgY3Vycm93ID0gMDsKKyAgd2hpbGUgKGN1cnJvdyA8IG51bXJvd3MpIHsKKyAgICByb3dzcGVyY2h1bmsgPSBNSU4ocm93c3BlcmNodW5rLCBudW1yb3dzIC0gY3Vycm93KTsKKyAgICB3b3Jrc3BhY2UgPSAoSlNBTVBST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAorCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBzYW1wbGVzcGVycm93CisJCSAgKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKKyAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7CisgICAgICB3b3Jrc3BhY2UgKz0gc2FtcGxlc3BlcnJvdzsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBDcmVhdGlvbiBvZiAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLgorICogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgY29kZSBmb3Igc2FtcGxlIGFycmF5cywgYWJvdmUuCisgKi8KKworTUVUSE9EREVGKEpCTE9DS0FSUkFZKQorYWxsb2NfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MpCisvKiBBbGxvY2F0ZSBhIDItRCBjb2VmZmljaWVudC1ibG9jayBhcnJheSAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBKQkxPQ0tBUlJBWSByZXN1bHQ7CisgIEpCTE9DS1JPVyB3b3Jrc3BhY2U7CisgIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7CisgIGxvbmcgbHRlbXA7CisKKyAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLworICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLworCSAgKChsb25nKSBibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKSk7CisgIGlmIChsdGVtcCA8PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOworICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKKyAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgIGVsc2UKKyAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOworICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOworCisgIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCisgIHJlc3VsdCA9IChKQkxPQ0tBUlJBWSkgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCisJCQkJICAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKQkxPQ0tST1cpKSk7CisKKyAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCisgIGN1cnJvdyA9IDA7CisgIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7CisgICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7CisgICAgd29ya3NwYWNlID0gKEpCTE9DS1JPVykgYWxsb2NfbGFyZ2UoY2luZm8sIHBvb2xfaWQsCisJKHNpemVfdCkgKChzaXplX3QpIHJvd3NwZXJjaHVuayAqIChzaXplX3QpIGJsb2Nrc3BlcnJvdworCQkgICogU0laRU9GKEpCTE9DSykpKTsKKyAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKKyAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7CisgICAgICB3b3Jrc3BhY2UgKz0gYmxvY2tzcGVycm93OworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIEFib3V0IHZpcnR1YWwgYXJyYXkgbWFuYWdlbWVudDoKKyAqCisgKiBUaGUgYWJvdmUgIm5vcm1hbCIgYXJyYXkgcm91dGluZXMgYXJlIG9ubHkgdXNlZCB0byBhbGxvY2F0ZSBzdHJpcCBidWZmZXJzCisgKiAoYXMgd2lkZSBhcyB0aGUgaW1hZ2UsIGJ1dCBqdXN0IGEgZmV3IHJvd3MgaGlnaCkuICBGdWxsLWltYWdlLXNpemVkIGJ1ZmZlcnMKKyAqIGFyZSBoYW5kbGVkIGFzICJ2aXJ0dWFsIiBhcnJheXMuICBUaGUgYXJyYXkgaXMgc3RpbGwgYWNjZXNzZWQgYSBzdHJpcCBhdCBhCisgKiB0aW1lLCBidXQgdGhlIG1lbW9yeSBtYW5hZ2VyIG11c3Qgc2F2ZSB0aGUgd2hvbGUgYXJyYXkgZm9yIHJlcGVhdGVkCisgKiBhY2Nlc3Nlcy4gIFRoZSBpbnRlbmRlZCBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHRoZXJlIGlzIGEgc3RyaXAgYnVmZmVyIGluCisgKiBtZW1vcnkgKGFzIGhpZ2ggYXMgaXMgcG9zc2libGUgZ2l2ZW4gdGhlIGRlc2lyZWQgbWVtb3J5IGxpbWl0KSwgcGx1cyBhCisgKiBiYWNraW5nIGZpbGUgdGhhdCBob2xkcyB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCisgKgorICogVGhlIHJlcXVlc3RfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgdG9sZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW1hZ2UgYW5kCisgKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgYWNjZXNzZWQgYXQgb25jZS4gIFRoZSBpbi1tZW1vcnkKKyAqIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBtYXhhY2Nlc3MgdmFsdWUuCisgKgorICogVGhlIHJlcXVlc3Qgcm91dGluZXMgY3JlYXRlIGNvbnRyb2wgYmxvY2tzIGJ1dCBub3QgdGhlIGluLW1lbW9yeSBidWZmZXJzLgorICogVGhhdCBpcyBwb3N0cG9uZWQgdW50aWwgcmVhbGl6ZV92aXJ0X2FycmF5cyBpcyBjYWxsZWQuICBBdCB0aGF0IHRpbWUgdGhlCisgKiB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGlzIGtub3duIChhcHByb3hpbWF0ZWx5LCBhbnl3YXkpLCBzbyBmcmVlCisgKiBtZW1vcnkgY2FuIGJlIGRpdmlkZWQgdXAgZmFpcmx5LgorICoKKyAqIFRoZSBhY2Nlc3NfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIG1ha2luZyBhIHNwZWNpZmljIHN0cmlwCisgKiBhcmVhIGFjY2Vzc2libGUgKGFmdGVyIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgYmFja2luZyBmaWxlLCBpZiBuZWNlc3NhcnkpLgorICogTm90ZSB0aGF0IHRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIHRvbGQgd2hldGhlciB0aGUgY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5CisgKiB0aGUgYWNjZXNzZWQgc3RyaXA7IGR1cmluZyBhIHJlYWQtb25seSBwYXNzIHRoaXMgc2F2ZXMgaGF2aW5nIHRvIHJld3JpdGUKKyAqIGRhdGEgdG8gZGlzay4gIFRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIHByZS16ZXJvaW5nCisgKiBhbnkgbmV3bHkgYWNjZXNzZWQgcm93cywgaWYgcHJlLXplcm9pbmcgd2FzIHJlcXVlc3RlZC4KKyAqCisgKiBJbiBjdXJyZW50IHVzYWdlLCB0aGUgYWNjZXNzIHJlcXVlc3RzIGFyZSB1c3VhbGx5IGZvciBub25vdmVybGFwcGluZworICogc3RyaXBzOyB0aGF0IGlzLCBzdWNjZXNzaXZlIGFjY2VzcyBzdGFydF9yb3cgbnVtYmVycyBkaWZmZXIgYnkgZXhhY3RseQorICogbnVtX3Jvd3MgPSBtYXhhY2Nlc3MuICBUaGlzIG1lYW5zIHdlIGNhbiBnZXQgZ29vZCBwZXJmb3JtYW5jZSB3aXRoIHNpbXBsZQorICogYnVmZmVyIGR1bXAvcmVsb2FkIGxvZ2ljLCBieSBtYWtpbmcgdGhlIGluLW1lbW9yeSBidWZmZXIgYmUgYSBtdWx0aXBsZQorICogb2YgdGhlIGFjY2VzcyBoZWlnaHQ7IHRoZW4gdGhlcmUgd2lsbCBuZXZlciBiZSBhY2Nlc3NlcyBhY3Jvc3MgYnVmZmVybG9hZAorICogYm91bmRhcmllcy4gIFRoZSBjb2RlIHdpbGwgc3RpbGwgd29yayB3aXRoIG92ZXJsYXBwaW5nIGFjY2VzcyByZXF1ZXN0cywKKyAqIGJ1dCBpdCBkb2Vzbid0IGhhbmRsZSBidWZmZXJsb2FkIG92ZXJsYXBzIHZlcnkgZWZmaWNpZW50bHkuCisgKi8KKworCitNRVRIT0RERUYoanZpcnRfc2FycmF5X3B0cikKK3JlcXVlc3RfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIGJvb2xlYW4gcHJlX3plcm8sCisJCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCisJCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCisvKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgc2FtcGxlIGFycmF5ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGp2aXJ0X3NhcnJheV9wdHIgcmVzdWx0OworCisgIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKyAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworICAvKiBnZXQgY29udHJvbCBibG9jayAqLworICByZXN1bHQgPSAoanZpcnRfc2FycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCisJCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCkpOworCisgIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KKyAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKKyAgcmVzdWx0LT5zYW1wbGVzcGVycm93ID0gc2FtcGxlc3BlcnJvdzsKKyAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7CisgIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKKyAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCisgIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KKyAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gcmVzdWx0OworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworTUVUSE9EREVGKGp2aXJ0X2JhcnJheV9wdHIpCityZXF1ZXN0X3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAorCQkgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCisJCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCisvKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAganZpcnRfYmFycmF5X3B0ciByZXN1bHQ7CisKKyAgLyogT25seSBJTUFHRS1saWZldGltZSB2aXJ0dWFsIGFycmF5cyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCAqLworICBpZiAocG9vbF9pZCAhPSBKUE9PTF9JTUFHRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLworCisgIC8qIGdldCBjb250cm9sIGJsb2NrICovCisgIHJlc3VsdCA9IChqdmlydF9iYXJyYXlfcHRyKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKKwkJCQkJICBTSVpFT0Yoc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sKSk7CisKKyAgcmVzdWx0LT5tZW1fYnVmZmVyID0gTlVMTDsJLyogbWFya3MgYXJyYXkgbm90IHlldCByZWFsaXplZCAqLworICByZXN1bHQtPnJvd3NfaW5fYXJyYXkgPSBudW1yb3dzOworICByZXN1bHQtPmJsb2Nrc3BlcnJvdyA9IGJsb2Nrc3BlcnJvdzsKKyAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7CisgIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKKyAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCisgIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KKyAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gcmVzdWx0OworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCityZWFsaXplX3ZpcnRfYXJyYXlzIChqX2NvbW1vbl9wdHIgY2luZm8pCisvKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yIGFueSB1bnJlYWxpemVkIHZpcnR1YWwgYXJyYXlzICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGxvbmcgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwgYXZhaWxfbWVtOworICBsb25nIG1pbmhlaWdodHMsIG1heF9taW5oZWlnaHRzOworICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7CisgIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKKworICAvKiBDb21wdXRlIHRoZSBtaW5pbXVtIHNwYWNlIG5lZWRlZCAobWF4YWNjZXNzIHJvd3MgaW4gZWFjaCBidWZmZXIpCisgICAqIGFuZCB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgKGZ1bGwgaW1hZ2UgaGVpZ2h0IGluIGVhY2ggYnVmZmVyKS4KKyAgICogVGhlc2UgbWF5IGJlIG9mIHVzZSB0byB0aGUgc3lzdGVtLWRlcGVuZGVudCBqcGVnX21lbV9hdmFpbGFibGUgcm91dGluZS4KKyAgICovCisgIHNwYWNlX3Blcl9taW5oZWlnaHQgPSAwOworICBtYXhpbXVtX3NwYWNlID0gMDsKKyAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7CisgICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCisgICAgICBzcGFjZV9wZXJfbWluaGVpZ2h0ICs9IChsb25nKSBzcHRyLT5tYXhhY2Nlc3MgKgorCQkJICAgICAobG9uZykgc3B0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKKyAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgorCQkgICAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7CisgICAgfQorICB9CisgIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgeworICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLworICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgYnB0ci0+bWF4YWNjZXNzICoKKwkJCSAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOworICAgICAgbWF4aW11bV9zcGFjZSArPSAobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCisJCSAgICAgICAobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7CisgICAgfQorICB9CisKKyAgaWYgKHNwYWNlX3Blcl9taW5oZWlnaHQgPD0gMCkKKyAgICByZXR1cm47CQkJLyogbm8gdW5yZWFsaXplZCBhcnJheXMsIG5vIHdvcmsgKi8KKworICAvKiBEZXRlcm1pbmUgYW1vdW50IG9mIG1lbW9yeSB0byBhY3R1YWxseSB1c2U7IHRoaXMgaXMgc3lzdGVtLWRlcGVuZGVudC4gKi8KKyAgYXZhaWxfbWVtID0ganBlZ19tZW1fYXZhaWxhYmxlKGNpbmZvLCBzcGFjZV9wZXJfbWluaGVpZ2h0LCBtYXhpbXVtX3NwYWNlLAorCQkJCSBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7CisKKyAgLyogSWYgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIGlzIGF2YWlsYWJsZSwgbWFrZSBhbGwgdGhlIGJ1ZmZlcnMgZnVsbAorICAgKiBoZWlnaHQ7IG90aGVyd2lzZSBwYXJjZWwgaXQgb3V0IHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG1pbmhlaWdodHMKKyAgICogaW4gZWFjaCBidWZmZXIuCisgICAqLworICBpZiAoYXZhaWxfbWVtID49IG1heGltdW1fc3BhY2UpCisgICAgbWF4X21pbmhlaWdodHMgPSAxMDAwMDAwMDAwTDsKKyAgZWxzZSB7CisgICAgbWF4X21pbmhlaWdodHMgPSBhdmFpbF9tZW0gLyBzcGFjZV9wZXJfbWluaGVpZ2h0OworICAgIC8qIElmIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBlbm91Z2ggc3BhY2UsIHRyeSB0byBnZXQgdGhlIG1pbmltdW0KKyAgICAgKiBhbnl3YXkuICBUaGlzIGFsbG93cyBhICJzdHViIiBpbXBsZW1lbnRhdGlvbiBvZiBqcGVnX21lbV9hdmFpbGFibGUoKS4KKyAgICAgKi8KKyAgICBpZiAobWF4X21pbmhlaWdodHMgPD0gMCkKKyAgICAgIG1heF9taW5oZWlnaHRzID0gMTsKKyAgfQorCisgIC8qIEFsbG9jYXRlIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBhbmQgaW5pdGlhbGl6ZSBiYWNraW5nIHN0b3JlIGFzIG5lZWRlZC4gKi8KKworICBmb3IgKHNwdHIgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IHNwdHIgIT0gTlVMTDsgc3B0ciA9IHNwdHItPm5leHQpIHsKKyAgICBpZiAoc3B0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KKyAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBzcHRyLT5tYXhhY2Nlc3MgKyAxTDsKKyAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7CisJLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KKwlzcHRyLT5yb3dzX2luX21lbSA9IHNwdHItPnJvd3NfaW5fYXJyYXk7CisgICAgICB9IGVsc2UgeworCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCisJc3B0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogc3B0ci0+bWF4YWNjZXNzKTsKKwlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBzcHRyLT5iX3NfaW5mbywKKwkJCQkobG9uZykgc3B0ci0+cm93c19pbl9hcnJheSAqCisJCQkJKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKgorCQkJCShsb25nKSBTSVpFT0YoSlNBTVBMRSkpOworCXNwdHItPmJfc19vcGVuID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIHNwdHItPm1lbV9idWZmZXIgPSBhbGxvY19zYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIHNwdHItPnNhbXBsZXNwZXJyb3csIHNwdHItPnJvd3NfaW5fbWVtKTsKKyAgICAgIHNwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7CisgICAgICBzcHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKKyAgICAgIHNwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7CisgICAgICBzcHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgeworICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLworICAgICAgbWluaGVpZ2h0cyA9ICgobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAtIDFMKSAvIGJwdHItPm1heGFjY2VzcyArIDFMOworICAgICAgaWYgKG1pbmhlaWdodHMgPD0gbWF4X21pbmhlaWdodHMpIHsKKwkvKiBUaGlzIGJ1ZmZlciBmaXRzIGluIG1lbW9yeSAqLworCWJwdHItPnJvd3NfaW5fbWVtID0gYnB0ci0+cm93c19pbl9hcnJheTsKKyAgICAgIH0gZWxzZSB7CisJLyogSXQgZG9lc24ndCBmaXQgaW4gbWVtb3J5LCBjcmVhdGUgYmFja2luZyBzdG9yZS4gKi8KKwlicHRyLT5yb3dzX2luX21lbSA9IChKRElNRU5TSU9OKSAobWF4X21pbmhlaWdodHMgKiBicHRyLT5tYXhhY2Nlc3MpOworCWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvLAorCQkJCShsb25nKSBicHRyLT5yb3dzX2luX2FycmF5ICoKKwkJCQkobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICoKKwkJCQkobG9uZykgU0laRU9GKEpCTE9DSykpOworCWJwdHItPmJfc19vcGVuID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJwdHItPm1lbV9idWZmZXIgPSBhbGxvY19iYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIGJwdHItPmJsb2Nrc3BlcnJvdywgYnB0ci0+cm93c19pbl9tZW0pOworICAgICAgYnB0ci0+cm93c3BlcmNodW5rID0gbWVtLT5sYXN0X3Jvd3NwZXJjaHVuazsKKyAgICAgIGJwdHItPmN1cl9zdGFydF9yb3cgPSAwOworICAgICAgYnB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gMDsKKyAgICAgIGJwdHItPmRpcnR5ID0gRkFMU0U7CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX3NhcnJheV9pbyAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwgYm9vbGVhbiB3cml0aW5nKQorLyogRG8gYmFja2luZyBzdG9yZSByZWFkIG9yIHdyaXRlIG9mIGEgdmlydHVhbCBzYW1wbGUgYXJyYXkgKi8KK3sKKyAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7CisKKyAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOworICBmaWxlX29mZnNldCA9IHB0ci0+Y3VyX3N0YXJ0X3JvdyAqIGJ5dGVzcGVycm93OworICAvKiBMb29wIHRvIHJlYWQgb3Igd3JpdGUgZWFjaCBhbGxvY2F0aW9uIGNodW5rIGluIG1lbV9idWZmZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IChsb25nKSBwdHItPnJvd3NfaW5fbWVtOyBpICs9IHB0ci0+cm93c3BlcmNodW5rKSB7CisgICAgLyogT25lIGNodW5rLCBidXQgY2hlY2sgZm9yIHNob3J0IGNodW5rIGF0IGVuZCBvZiBidWZmZXIgKi8KKyAgICByb3dzID0gTUlOKChsb25nKSBwdHItPnJvd3NwZXJjaHVuaywgKGxvbmcpIHB0ci0+cm93c19pbl9tZW0gLSBpKTsKKyAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gaXMgY3VycmVudGx5IGRlZmluZWQgKi8KKyAgICB0aGlzcm93ID0gKGxvbmcpIHB0ci0+Y3VyX3N0YXJ0X3JvdyArIGk7CisgICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5maXJzdF91bmRlZl9yb3cgLSB0aGlzcm93KTsKKyAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gZml0cyBpbiBmaWxlICovCisgICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5yb3dzX2luX2FycmF5IC0gdGhpc3Jvdyk7CisgICAgaWYgKHJvd3MgPD0gMCkJCS8qIHRoaXMgY2h1bmsgbWlnaHQgYmUgcGFzdCBlbmQgb2YgZmlsZSEgKi8KKyAgICAgIGJyZWFrOworICAgIGJ5dGVfY291bnQgPSByb3dzICogYnl0ZXNwZXJyb3c7CisgICAgaWYgKHdyaXRpbmcpCisgICAgICAoKnB0ci0+Yl9zX2luZm8ud3JpdGVfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCisJCQkJCSAgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAorCQkJCQkgICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOworICAgIGVsc2UKKyAgICAgICgqcHRyLT5iX3NfaW5mby5yZWFkX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAorCQkJCQkgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAorCQkJCQkgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7CisgICAgZmlsZV9vZmZzZXQgKz0gYnl0ZV9jb3VudDsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19iYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKKy8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KK3sKKyAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7CisKKyAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKKyAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKKyAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCisgIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgeworICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCisgICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCisgICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOworICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCisgICAgICBicmVhazsKKyAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OworICAgIGlmICh3cml0aW5nKQorICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAorCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKKyAgICBlbHNlCisgICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKKwkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOworICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7CisgIH0KK30KKworCitNRVRIT0RERUYoSlNBTVBBUlJBWSkKK2FjY2Vzc192aXJ0X3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwKKwkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAorCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKKy8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IHN0YXJ0X3JvdyAqLworLyogYW5kIGV4dGVuZGluZyBmb3IgbnVtX3Jvd3Mgcm93cy4gIHdyaXRhYmxlIGlzIHRydWUgaWYgICovCisvKiBjYWxsZXIgaW50ZW5kcyB0byBtb2RpZnkgdGhlIGFjY2Vzc2VkIGFyZWEuICovCit7CisgIEpESU1FTlNJT04gZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOworICBKRElNRU5TSU9OIHVuZGVmX3JvdzsKKworICAvKiBkZWJ1Z2dpbmcgY2hlY2sgKi8KKyAgaWYgKGVuZF9yb3cgPiBwdHItPnJvd3NfaW5fYXJyYXkgfHwgbnVtX3Jvd3MgPiBwdHItPm1heGFjY2VzcyB8fAorICAgICAgcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworCisgIC8qIE1ha2UgdGhlIGRlc2lyZWQgcGFydCBvZiB0aGUgdmlydHVhbCBhcnJheSBhY2Nlc3NpYmxlICovCisgIGlmIChzdGFydF9yb3cgPCBwdHItPmN1cl9zdGFydF9yb3cgfHwKKyAgICAgIGVuZF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3crcHRyLT5yb3dzX2luX21lbSkgeworICAgIGlmICghIHB0ci0+Yl9zX29wZW4pCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1ZJUlRVQUxfQlVHKTsKKyAgICAvKiBGbHVzaCBvbGQgYnVmZmVyIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChwdHItPmRpcnR5KSB7CisgICAgICBkb19zYXJyYXlfaW8oY2luZm8sIHB0ciwgVFJVRSk7CisgICAgICBwdHItPmRpcnR5ID0gRkFMU0U7CisgICAgfQorICAgIC8qIERlY2lkZSB3aGF0IHBhcnQgb2YgdmlydHVhbCBhcnJheSB0byBhY2Nlc3MuCisgICAgICogQWxnb3JpdGhtOiBpZiB0YXJnZXQgYWRkcmVzcyA+IGN1cnJlbnQgd2luZG93LCBhc3N1bWUgZm9yd2FyZCBzY2FuLAorICAgICAqIGxvYWQgc3RhcnRpbmcgYXQgdGFyZ2V0IGFkZHJlc3MuICBJZiB0YXJnZXQgYWRkcmVzcyA8IGN1cnJlbnQgd2luZG93LAorICAgICAqIGFzc3VtZSBiYWNrd2FyZCBzY2FuLCBsb2FkIHNvIHRoYXQgdGFyZ2V0IGFyZWEgaXMgdG9wIG9mIHdpbmRvdy4KKyAgICAgKiBOb3RlIHRoYXQgd2hlbiBzd2l0Y2hpbmcgZnJvbSBmb3J3YXJkIHdyaXRlIHRvIGZvcndhcmQgcmVhZCwgd2lsbCBoYXZlCisgICAgICogc3RhcnRfcm93ID0gMCwgc28gdGhlIGxpbWl0aW5nIGNhc2UgYXBwbGllcyBhbmQgd2UgbG9hZCBmcm9tIDAgYW55d2F5LgorICAgICAqLworICAgIGlmIChzdGFydF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3cpIHsKKyAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IHN0YXJ0X3JvdzsKKyAgICB9IGVsc2UgeworICAgICAgLyogdXNlIGxvbmcgYXJpdGhtZXRpYyBoZXJlIHRvIGF2b2lkIG92ZXJmbG93ICYgdW5zaWduZWQgcHJvYmxlbXMgKi8KKyAgICAgIGxvbmcgbHRlbXA7CisKKyAgICAgIGx0ZW1wID0gKGxvbmcpIGVuZF9yb3cgLSAobG9uZykgcHRyLT5yb3dzX2luX21lbTsKKyAgICAgIGlmIChsdGVtcCA8IDApCisJbHRlbXAgPSAwOwkJLyogZG9uJ3QgZmFsbCBvZmYgZnJvbnQgZW5kIG9mIGZpbGUgKi8KKyAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IChKRElNRU5TSU9OKSBsdGVtcDsKKyAgICB9CisgICAgLyogUmVhZCBpbiB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgYXJyYXkuCisgICAgICogRHVyaW5nIHRoZSBpbml0aWFsIHdyaXRlIHBhc3MsIHdlIHdpbGwgZG8gbm8gYWN0dWFsIHJlYWQKKyAgICAgKiBiZWNhdXNlIHRoZSBzZWxlY3RlZCBwYXJ0IGlzIGFsbCB1bmRlZmluZWQuCisgICAgICovCisgICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIEZBTFNFKTsKKyAgfQorICAvKiBFbnN1cmUgdGhlIGFjY2Vzc2VkIHBhcnQgb2YgdGhlIGFycmF5IGlzIGRlZmluZWQ7IHByZXplcm8gaWYgbmVlZGVkLgorICAgKiBUbyBpbXByb3ZlIGxvY2FsaXR5IG9mIGFjY2Vzcywgd2Ugb25seSBwcmV6ZXJvIHRoZSBwYXJ0IG9mIHRoZSBhcnJheQorICAgKiB0aGF0IHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gYWNjZXNzLCBub3QgdGhlIGVudGlyZSBpbi1tZW1vcnkgYXJyYXkuCisgICAqLworICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBlbmRfcm93KSB7CisgICAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgc3RhcnRfcm93KSB7CisgICAgICBpZiAod3JpdGFibGUpCQkvKiB3cml0ZXIgc2tpcHBlZCBvdmVyIGEgc2VjdGlvbiBvZiBhcnJheSAqLworCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKyAgICAgIHVuZGVmX3JvdyA9IHN0YXJ0X3JvdzsJLyogYnV0IHJlYWRlciBpcyBhbGxvd2VkIHRvIHJlYWQgYWhlYWQgKi8KKyAgICB9IGVsc2UgeworICAgICAgdW5kZWZfcm93ID0gcHRyLT5maXJzdF91bmRlZl9yb3c7CisgICAgfQorICAgIGlmICh3cml0YWJsZSkKKyAgICAgIHB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gZW5kX3JvdzsKKyAgICBpZiAocHRyLT5wcmVfemVybykgeworICAgICAgc2l6ZV90IGJ5dGVzcGVycm93ID0gKHNpemVfdCkgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOworICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLworICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7CisgICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgeworCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKKwl1bmRlZl9yb3crKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLworCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKyAgICB9CisgIH0KKyAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCisgIGlmICh3cml0YWJsZSkKKyAgICBwdHItPmRpcnR5ID0gVFJVRTsKKyAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLworICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Cit9CisKKworTUVUSE9EREVGKEpCTE9DS0FSUkFZKQorYWNjZXNzX3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLAorCQkgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gbnVtX3Jvd3MsCisJCSAgICBib29sZWFuIHdyaXRhYmxlKQorLyogQWNjZXNzIHRoZSBwYXJ0IG9mIGEgdmlydHVhbCBibG9jayBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KKy8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLworLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLworeworICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKKyAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7CisKKyAgLyogZGVidWdnaW5nIGNoZWNrICovCisgIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKKyAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKworICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLworICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8CisgICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKKyAgICBpZiAoISBwdHItPmJfc19vcGVuKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7CisgICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAocHRyLT5kaXJ0eSkgeworICAgICAgZG9fYmFycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOworICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgorICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKKyAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKKyAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCisgICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQorICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7CisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCisgICAgICBsb25nIGx0ZW1wOworCisgICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07CisgICAgICBpZiAobHRlbXAgPCAwKQorCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgICAgfQorICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgorICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCisgICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgorICAgICAqLworICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7CisgIH0KKyAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KKyAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKKyAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgorICAgKi8KKyAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgeworICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgeworICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisgICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCisgICAgfSBlbHNlIHsKKyAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OworICAgIH0KKyAgICBpZiAod3JpdGFibGUpCisgICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7CisgICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKKyAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7CisgICAgICB1bmRlZl9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OyAvKiBtYWtlIGluZGV4ZXMgcmVsYXRpdmUgdG8gYnVmZmVyICovCisgICAgICBlbmRfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsKKyAgICAgIHdoaWxlICh1bmRlZl9yb3cgPCBlbmRfcm93KSB7CisJanplcm9fZmFyKCh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbdW5kZWZfcm93XSwgYnl0ZXNwZXJyb3cpOworCXVuZGVmX3JvdysrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoISB3cml0YWJsZSkJCS8qIHJlYWRlciBsb29raW5nIGF0IHVuZGVmaW5lZCBkYXRhICovCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworICAgIH0KKyAgfQorICAvKiBGbGFnIHRoZSBidWZmZXIgZGlydHkgaWYgY2FsbGVyIHdpbGwgd3JpdGUgaW4gaXQgKi8KKyAgaWYgKHdyaXRhYmxlKQorICAgIHB0ci0+ZGlydHkgPSBUUlVFOworICAvKiBSZXR1cm4gYWRkcmVzcyBvZiBwcm9wZXIgcGFydCBvZiB0aGUgYnVmZmVyICovCisgIHJldHVybiBwdHItPm1lbV9idWZmZXIgKyAoc3RhcnRfcm93IC0gcHRyLT5jdXJfc3RhcnRfcm93KTsKK30KKworCisvKgorICogUmVsZWFzZSBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpZWQgcG9vbC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZyZWVfcG9vbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7CisgIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOworICBzaXplX3Qgc3BhY2VfZnJlZWQ7CisKKyAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworI2lmZGVmIE1FTV9TVEFUUworICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPiAxKQorICAgIHByaW50X21lbV9zdGF0cyhjaW5mbywgcG9vbF9pZCk7IC8qIHByaW50IHBvb2wncyBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyAqLworI2VuZGlmCisKKyAgLyogSWYgZnJlZWluZyBJTUFHRSBwb29sLCBjbG9zZSBhbnkgdmlydHVhbCBhcnJheXMgZmlyc3QgKi8KKyAgaWYgKHBvb2xfaWQgPT0gSlBPT0xfSU1BR0UpIHsKKyAgICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7CisgICAganZpcnRfYmFycmF5X3B0ciBicHRyOworCisgICAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7CisgICAgICBpZiAoc3B0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KKwlzcHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLworCSgqc3B0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHNwdHItPmJfc19pbmZvKTsKKyAgICAgIH0KKyAgICB9CisgICAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKKyAgICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKKyAgICAgIGlmIChicHRyLT5iX3Nfb3BlbikgewkvKiB0aGVyZSBtYXkgYmUgbm8gYmFja2luZyBzdG9yZSAqLworCWJwdHItPmJfc19vcGVuID0gRkFMU0U7CS8qIHByZXZlbnQgcmVjdXJzaXZlIGNsb3NlIGlmIGVycm9yICovCisJKCpicHRyLT5iX3NfaW5mby5jbG9zZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgYnB0ci0+Yl9zX2luZm8pOworICAgICAgfQorICAgIH0KKyAgICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOworICB9CisKKyAgLyogUmVsZWFzZSBsYXJnZSBvYmplY3RzICovCisgIGxoZHJfcHRyID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOworICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBOVUxMOworCisgIHdoaWxlIChsaGRyX3B0ciAhPSBOVUxMKSB7CisgICAgbGFyZ2VfcG9vbF9wdHIgbmV4dF9saGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dDsKKyAgICBzcGFjZV9mcmVlZCA9IGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCisJCSAgbGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKKwkJICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpOworICAgIGpwZWdfZnJlZV9sYXJnZShjaW5mbywgKHZvaWQgRkFSICopIGxoZHJfcHRyLCBzcGFjZV9mcmVlZCk7CisgICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7CisgICAgbGhkcl9wdHIgPSBuZXh0X2xoZHJfcHRyOworICB9CisKKyAgLyogUmVsZWFzZSBzbWFsbCBvYmplY3RzICovCisgIHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOworICBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF0gPSBOVUxMOworCisgIHdoaWxlIChzaGRyX3B0ciAhPSBOVUxMKSB7CisgICAgc21hbGxfcG9vbF9wdHIgbmV4dF9zaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dDsKKyAgICBzcGFjZV9mcmVlZCA9IHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCisJCSAgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKKwkJICBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOworICAgIGpwZWdfZnJlZV9zbWFsbChjaW5mbywgKHZvaWQgKikgc2hkcl9wdHIsIHNwYWNlX2ZyZWVkKTsKKyAgICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCAtPSBzcGFjZV9mcmVlZDsKKyAgICBzaGRyX3B0ciA9IG5leHRfc2hkcl9wdHI7CisgIH0KK30KKworCisvKgorICogQ2xvc2UgdXAgc2hvcCBlbnRpcmVseS4KKyAqIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSBjYWxsZWQgdW5sZXNzIGNpbmZvLT5tZW0gaXMgbm9uLU5VTEwuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZWxmX2Rlc3RydWN0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIGludCBwb29sOworCisgIC8qIENsb3NlIGFsbCBiYWNraW5nIHN0b3JlLCByZWxlYXNlIGFsbCBtZW1vcnkuCisgICAqIFJlbGVhc2luZyBwb29scyBpbiByZXZlcnNlIG9yZGVyIG1pZ2h0IGhlbHAgYXZvaWQgZnJhZ21lbnRhdGlvbgorICAgKiB3aXRoIHNvbWUgKGJyYWluLWRhbWFnZWQpIG1hbGxvYyBsaWJyYXJpZXMuCisgICAqLworICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID49IEpQT09MX1BFUk1BTkVOVDsgcG9vbC0tKSB7CisgICAgZnJlZV9wb29sKGNpbmZvLCBwb29sKTsKKyAgfQorCisgIC8qIFJlbGVhc2UgdGhlIG1lbW9yeSBtYW5hZ2VyIGNvbnRyb2wgYmxvY2sgdG9vLiAqLworICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIGNpbmZvLT5tZW0sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7CisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZW5zdXJlcyBJIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSAqLworCisgIGpwZWdfbWVtX3Rlcm0oY2luZm8pOwkJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCit9CisKKworLyoKKyAqIE1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uLgorICogV2hlbiB0aGlzIGlzIGNhbGxlZCwgb25seSB0aGUgZXJyb3IgbWFuYWdlciBwb2ludGVyIGlzIHZhbGlkIGluIGNpbmZvIQorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWVtb3J5X21nciAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBteV9tZW1fcHRyIG1lbTsKKyAgbG9uZyBtYXhfdG9fdXNlOworICBpbnQgcG9vbDsKKyAgc2l6ZV90IHRlc3RfbWFjOworCisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZm9yIHNhZmV0eSBpZiBpbml0IGZhaWxzICovCisKKyAgLyogQ2hlY2sgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3JzLgorICAgKiBTSVpFT0YoQUxJR05fVFlQRSkgc2hvdWxkIGJlIGEgcG93ZXIgb2YgMjsgb3RoZXJ3aXNlLCBpdCBwcm9iYWJseQorICAgKiBkb2Vzbid0IHJlZmxlY3QgYW55IHJlYWwgaGFyZHdhcmUgYWxpZ25tZW50IHJlcXVpcmVtZW50LgorICAgKiBUaGUgdGVzdCBpcyBhIGxpdHRsZSB0cmlja3k6IGZvciBYPjAsIFggYW5kIFgtMSBoYXZlIG5vIG9uZS1iaXRzCisgICAqIGluIGNvbW1vbiBpZiBhbmQgb25seSBpZiBYIGlzIGEgcG93ZXIgb2YgMiwgaWUgaGFzIG9ubHkgb25lIG9uZS1iaXQuCisgICAqIFNvbWUgY29tcGlsZXJzIG1heSBnaXZlIGFuICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5nIGhlcmU7IGlnbm9yZSBpdC4KKyAgICovCisgIGlmICgoU0laRU9GKEFMSUdOX1RZUEUpICYgKFNJWkVPRihBTElHTl9UWVBFKS0xKSkgIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTElHTl9UWVBFKTsKKyAgLyogTUFYX0FMTE9DX0NIVU5LIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyB0eXBlIHNpemVfdCwgYW5kIG11c3QgYmUKKyAgICogYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkuCisgICAqIEFnYWluLCBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBtYXkgYmUgaWdub3JlZCBoZXJlLgorICAgKiBCdXQgYSAiY29uc3RhbnQgdG9vIGxhcmdlIiB3YXJuaW5nIG1lYW5zIHlvdSBuZWVkIHRvIGZpeCBNQVhfQUxMT0NfQ0hVTksuCisgICAqLworICB0ZXN0X21hYyA9IChzaXplX3QpIE1BWF9BTExPQ19DSFVOSzsKKyAgaWYgKChsb25nKSB0ZXN0X21hYyAhPSBNQVhfQUxMT0NfQ0hVTksgfHwKKyAgICAgIChNQVhfQUxMT0NfQ0hVTksgJSBTSVpFT0YoQUxJR05fVFlQRSkpICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOworCisgIG1heF90b191c2UgPSBqcGVnX21lbV9pbml0KGNpbmZvKTsgLyogc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiAqLworCisgIC8qIEF0dGVtcHQgdG8gYWxsb2NhdGUgbWVtb3J5IG1hbmFnZXIncyBjb250cm9sIGJsb2NrICovCisgIG1lbSA9IChteV9tZW1fcHRyKSBqcGVnX2dldF9zbWFsbChjaW5mbywgU0laRU9GKG15X21lbW9yeV9tZ3IpKTsKKworICBpZiAobWVtID09IE5VTEwpIHsKKyAgICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgMCk7CisgIH0KKworICAvKiBPSywgZmlsbCBpbiB0aGUgbWV0aG9kIHBvaW50ZXJzICovCisgIG1lbS0+cHViLmFsbG9jX3NtYWxsID0gYWxsb2Nfc21hbGw7CisgIG1lbS0+cHViLmFsbG9jX2xhcmdlID0gYWxsb2NfbGFyZ2U7CisgIG1lbS0+cHViLmFsbG9jX3NhcnJheSA9IGFsbG9jX3NhcnJheTsKKyAgbWVtLT5wdWIuYWxsb2NfYmFycmF5ID0gYWxsb2NfYmFycmF5OworICBtZW0tPnB1Yi5yZXF1ZXN0X3ZpcnRfc2FycmF5ID0gcmVxdWVzdF92aXJ0X3NhcnJheTsKKyAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X2JhcnJheSA9IHJlcXVlc3RfdmlydF9iYXJyYXk7CisgIG1lbS0+cHViLnJlYWxpemVfdmlydF9hcnJheXMgPSByZWFsaXplX3ZpcnRfYXJyYXlzOworICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9zYXJyYXkgPSBhY2Nlc3NfdmlydF9zYXJyYXk7CisgIG1lbS0+cHViLmFjY2Vzc192aXJ0X2JhcnJheSA9IGFjY2Vzc192aXJ0X2JhcnJheTsKKyAgbWVtLT5wdWIuZnJlZV9wb29sID0gZnJlZV9wb29sOworICBtZW0tPnB1Yi5zZWxmX2Rlc3RydWN0ID0gc2VsZl9kZXN0cnVjdDsKKworICAvKiBNYWtlIE1BWF9BTExPQ19DSFVOSyBhY2Nlc3NpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgbWVtLT5wdWIubWF4X2FsbG9jX2NodW5rID0gTUFYX0FMTE9DX0NIVU5LOworCisgIC8qIEluaXRpYWxpemUgd29ya2luZyBzdGF0ZSAqLworICBtZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2U7CisKKyAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgeworICAgIG1lbS0+c21hbGxfbGlzdFtwb29sXSA9IE5VTEw7CisgICAgbWVtLT5sYXJnZV9saXN0W3Bvb2xdID0gTlVMTDsKKyAgfQorICBtZW0tPnZpcnRfc2FycmF5X2xpc3QgPSBOVUxMOworICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOworCisgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkID0gU0laRU9GKG15X21lbW9yeV9tZ3IpOworCisgIC8qIERlY2xhcmUgb3Vyc2VsdmVzIG9wZW4gZm9yIGJ1c2luZXNzICovCisgIGNpbmZvLT5tZW0gPSAmIG1lbS0+cHViOworCisgIC8qIENoZWNrIGZvciBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKUEVHTUVNOyBpZiBmb3VuZCwgb3ZlcnJpZGUgdGhlCisgICAqIGRlZmF1bHQgbWF4X21lbW9yeSBzZXR0aW5nIGZyb20ganBlZ19tZW1faW5pdC4gIE5vdGUgdGhhdCB0aGUKKyAgICogc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IGFnYWluIG92ZXJyaWRlIHRoaXMgdmFsdWUuCisgICAqIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBnZXRlbnYoKSwgZGVmaW5lIE5PX0dFVEVOViB0byBkaXNhYmxlCisgICAqIHRoaXMgZmVhdHVyZS4KKyAgICovCisjaWZuZGVmIE5PX0dFVEVOVgorICB7IGNoYXIgKiBtZW1lbnY7CisKKyAgICBpZiAoKG1lbWVudiA9IGdldGVudigiSlBFR01FTSIpKSAhPSBOVUxMKSB7CisgICAgICBjaGFyIGNoID0gJ3gnOworCisgICAgICBpZiAoc3NjYW5mKG1lbWVudiwgIiVsZCVjIiwgJm1heF90b191c2UsICZjaCkgPiAwKSB7CisJaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCisJICBtYXhfdG9fdXNlICo9IDEwMDBMOworCW1lbS0+cHViLm1heF9tZW1vcnlfdG9fdXNlID0gbWF4X3RvX3VzZSAqIDEwMDBMOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisKK30KZGlmZiAtLWdpdCBhL2ptZW1uYW1lLmMgYi9qbWVtbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTZkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9qbWVtbmFtZS5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogam1lbW5hbWUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudAorICogcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0CisgKiB5b3UgbXVzdCBleHBsaWNpdGx5IGNvbnN0cnVjdCBhIG5hbWUgZm9yIGVhY2ggdGVtcCBmaWxlLgorICogQWxzbywgdGhlIHByb2JsZW0gb2YgZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlCisgKiBpcyBzaG92ZWQgb250byB0aGUgdXNlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCitleHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7CitleHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7CisjZW5kaWYKKworI2lmbmRlZiBTRUVLX1NFVAkJLyogcHJlLUFOU0kgc3lzdGVtcyBtYXkgbm90IGRlZmluZSB0aGlzOyAqLworI2RlZmluZSBTRUVLX1NFVCAgMAkJLyogaWYgbm90LCBhc3N1bWUgMCBpcyBjb3JyZWN0ICovCisjZW5kaWYKKworI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKKyNkZWZpbmUgUldfQklOQVJZCSJ3KyIKKyNlbHNlCisjaWZkZWYgVk1TCQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIiwgImN0eD1zdG0iCisjZGVmaW5lIFJXX0JJTkFSWQkidytiIiwgImN0eD1zdG0iCisjZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKKyNkZWZpbmUgUldfQklOQVJZCSJ3K2IiCisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBTZWxlY3Rpb24gb2YgYSBmaWxlIG5hbWUgZm9yIGEgdGVtcG9yYXJ5IGZpbGUuCisgKiBUaGlzIGlzIHN5c3RlbS1kZXBlbmRlbnQhCisgKgorICogVGhlIGNvZGUgYXMgZ2l2ZW4gaXMgc3VpdGFibGUgZm9yIG1vc3QgVW5peCBzeXN0ZW1zLCBhbmQgaXQgaXMgZWFzaWx5CisgKiBtb2RpZmllZCBmb3IgbW9zdCBub24tVW5peCBzeXN0ZW1zLiAgU29tZSBub3RlczoKKyAqICAxLiAgVGhlIHRlbXAgZmlsZSBpcyBjcmVhdGVkIGluIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgVEVNUF9ESVJFQ1RPUlkuCisgKiAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC91c3IvdG1wLCB3aGljaCBpcyB0aGUgY29udmVudGlvbmFsIHBsYWNlIGZvcgorICogICAgICBjcmVhdGluZyBsYXJnZSB0ZW1wIGZpbGVzIG9uIFVuaXguICBPbiBvdGhlciBzeXN0ZW1zIHlvdSdsbCBwcm9iYWJseQorICogICAgICB3YW50IHRvIGNoYW5nZSB0aGUgZmlsZSBsb2NhdGlvbi4gIFlvdSBjYW4gZG8gdGhpcyBieSBlZGl0aW5nIHRoZQorICogICAgICAjZGVmaW5lLCBvciAocHJlZmVycmVkKSBieSBkZWZpbmluZyBURU1QX0RJUkVDVE9SWSBpbiBqY29uZmlnLmguCisgKgorICogIDIuICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGZpbGUgbmFtZSBhcyB3ZWxsIGFzIGl0cyBsb2NhdGlvbiwKKyAqICAgICAgeW91IGNhbiBvdmVycmlkZSB0aGUgVEVNUF9GSUxFX05BTUUgbWFjcm8uICAoTm90ZSB0aGF0IHRoaXMgaXMKKyAqICAgICAgYWN0dWFsbHkgYSBwcmludGYgZm9ybWF0IHN0cmluZzsgaXQgbXVzdCBjb250YWluICVzIGFuZCAlZC4pCisgKiAgICAgIEZldyBwZW9wbGUgc2hvdWxkIG5lZWQgdG8gZG8gdGhpcy4KKyAqCisgKiAgMy4gIG1rdGVtcCgpIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgbXVsdGlwbGUgcHJvY2Vzc2VzIHJ1bm5pbmcKKyAqICAgICAgc2ltdWx0YW5lb3VzbHkgd29uJ3Qgc2VsZWN0IHRoZSBzYW1lIGZpbGUgbmFtZXMuICBJZiB5b3VyIHN5c3RlbQorICogICAgICBkb2Vzbid0IGhhdmUgbWt0ZW1wKCksIGRlZmluZSBOT19NS1RFTVAgdG8gZG8gaXQgdGhlIGhhcmQgd2F5LgorICogICAgICAoSWYgeW91IGRvbid0IGhhdmUgPGVycm5vLmg+LCBhbHNvIGRlZmluZSBOT19FUlJOT19ILikKKyAqCisgKiAgNC4gIFlvdSBwcm9iYWJseSB3YW50IHRvIGRlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSIHNvIHRoYXQgY2pwZWcuYy9kanBlZy5jCisgKiAgICAgIHdpbGwgY2F1c2UgdGhlIHRlbXAgZmlsZXMgdG8gYmUgcmVtb3ZlZCBpZiB5b3Ugc3RvcCB0aGUgcHJvZ3JhbSBlYXJseS4KKyAqLworCisjaWZuZGVmIFRFTVBfRElSRUNUT1JZCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KKyNkZWZpbmUgVEVNUF9ESVJFQ1RPUlkgICIvdXNyL3RtcC8iIC8qIHJlY29tbWVuZGVkIHNldHRpbmcgZm9yIFVuaXggKi8KKyNlbmRpZgorCitzdGF0aWMgaW50IG5leHRfZmlsZV9udW07CS8qIHRvIGRpc3Rpbmd1aXNoIGFtb25nIHNldmVyYWwgdGVtcCBmaWxlcyAqLworCisjaWZkZWYgTk9fTUtURU1QCisKKyNpZm5kZWYgVEVNUF9GSUxFX05BTUUJCS8qIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCBvciBNYWtlZmlsZSAqLworI2RlZmluZSBURU1QX0ZJTEVfTkFNRSAgIiVzSlBHJTAzZC5UTVAiCisjZW5kaWYKKworI2lmbmRlZiBOT19FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4JCS8qIHRvIGRlZmluZSBFTk9FTlQgKi8KKyNlbmRpZgorCisvKiBBTlNJIEMgc3BlY2lmaWVzIHRoYXQgZXJybm8gaXMgYSBtYWNybywgYnV0IG9uIG9sZGVyIHN5c3RlbXMgaXQncyBtb3JlCisgKiBsaWtlbHkgdG8gYmUgYSBwbGFpbiBpbnQgdmFyaWFibGUuICBBbmQgbm90IGFsbCB2ZXJzaW9ucyBvZiBlcnJuby5oCisgKiBib3RoZXIgdG8gZGVjbGFyZSBpdCwgc28gd2UgaGF2ZSB0byBpbiBvcmRlciB0byBiZSBtb3N0IHBvcnRhYmxlLiAgVGh1czoKKyAqLworI2lmbmRlZiBlcnJubworZXh0ZXJuIGludCBlcnJubzsKKyNlbmRpZgorCisKK0xPQ0FMKHZvaWQpCitzZWxlY3RfZmlsZV9uYW1lIChjaGFyICogZm5hbWUpCit7CisgIEZJTEUgKiB0ZmlsZTsKKworICAvKiBLZWVwIGdlbmVyYXRpbmcgZmlsZSBuYW1lcyB0aWxsIHdlIGZpbmQgb25lIHRoYXQncyBub3QgaW4gdXNlICovCisgIGZvciAoOzspIHsKKyAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KKyAgICBzcHJpbnRmKGZuYW1lLCBURU1QX0ZJTEVfTkFNRSwgVEVNUF9ESVJFQ1RPUlksIG5leHRfZmlsZV9udW0pOworICAgIGlmICgodGZpbGUgPSBmb3BlbihmbmFtZSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICAvKiBmb3BlbiBjb3VsZCBoYXZlIGZhaWxlZCBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiB0aGUgZmlsZSBub3QKKyAgICAgICAqIGJlaW5nIHRoZXJlOyBmb3IgZXhhbXBsZSwgZmlsZSB0aGVyZSBidXQgdW5yZWFkYWJsZS4KKyAgICAgICAqIElmIDxlcnJuby5oPiBpc24ndCBhdmFpbGFibGUsIHRoZW4gd2UgY2Fubm90IHRlc3QgdGhlIGNhdXNlLgorICAgICAgICovCisjaWZkZWYgRU5PRU5UCisgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQorCWNvbnRpbnVlOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICB9CisgICAgZmNsb3NlKHRmaWxlKTsJCS8qIG9vcHMsIGl0J3MgdGhlcmU7IGNsb3NlIHRmaWxlICYgdHJ5IGFnYWluICovCisgIH0KK30KKworI2Vsc2UgLyogISBOT19NS1RFTVAgKi8KKworLyogTm90ZSB0aGF0IG1rdGVtcCgpIHJlcXVpcmVzIHRoZSBpbml0aWFsIGZpbGVuYW1lIHRvIGVuZCBpbiBzaXggWCdzICovCisjaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KKyNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICIlc0pQRyVkWFhYWFhYIgorI2VuZGlmCisKK0xPQ0FMKHZvaWQpCitzZWxlY3RfZmlsZV9uYW1lIChjaGFyICogZm5hbWUpCit7CisgIG5leHRfZmlsZV9udW0rKzsJCS8qIGFkdmFuY2UgY291bnRlciAqLworICBzcHJpbnRmKGZuYW1lLCBURU1QX0ZJTEVfTkFNRSwgVEVNUF9ESVJFQ1RPUlksIG5leHRfZmlsZV9udW0pOworICBta3RlbXAoZm5hbWUpOwkJLyogbWFrZSBzdXJlIGZpbGUgbmFtZSBpcyB1bmlxdWUgKi8KKyAgLyogbWt0ZW1wIHJlcGxhY2VzIHRoZSB0cmFpbGluZyBYWFhYWFggd2l0aCBhIHVuaXF1ZSBzdHJpbmcgb2YgY2hhcmFjdGVycyAqLworfQorCisjZW5kaWYgLyogTk9fTUtURU1QICovCisKKworLyoKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKKyAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCisgKi8KKworR0xPQkFMKHZvaWQgKikKK2pwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgorICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKKyAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCisgKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCisgKi8KKworR0xPQkFMKHZvaWQgRkFSICopCitqcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKKyAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCisgKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0CisgKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgorICovCisKKyNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLworI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTEwMDAwMDBMIC8qIGRlZmF1bHQ6IG9uZSBtZWdhYnl0ZSAqLworI2VuZGlmCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKKwkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKK3sKKyAgcmV0dXJuIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQ7Cit9CisKKworLyoKKyAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgorICogQmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAqIGpwZWdfbWVtX2F2YWlsYWJsZSBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNwYWNlIG5lZWRlZC4gIFlvdSBjYW4gZGlzcGVuc2UKKyAqIHdpdGggdGhlc2Ugcm91dGluZXMgaWYgeW91IGhhdmUgcGxlbnR5IG9mIHZpcnR1YWwgbWVtb3J5OyBzZWUgam1lbW5vYnMuYy4KKyAqLworCisKK01FVEhPRERFRih2b2lkKQorcmVhZF9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAorCQkgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisgIGlmIChKRlJFQUQoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKKyAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9SRUFEKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAorCQkgICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOworICBpZiAoSkZXUklURShpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQorICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK2Nsb3NlX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgZmNsb3NlKGluZm8tPnRlbXBfZmlsZSk7CS8qIGNsb3NlIHRoZSBmaWxlICovCisgIHVubGluayhpbmZvLT50ZW1wX25hbWUpOwkvKiBkZWxldGUgdGhlIGZpbGUgKi8KKy8qIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSB1bmxpbmsoKSwgdXNlIHJlbW92ZSgpIGluc3RlYWQuCisgKiByZW1vdmUoKSBpcyB0aGUgQU5TSS1zdGFuZGFyZCBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLCBidXQgaWYKKyAqIHlvdXIgc3lzdGVtIHdhcyBBTlNJIHlvdSdkIGJlIHVzaW5nIGptZW1hbnNpLmMsIHJpZ2h0PworICovCisgIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX0NMT1NFLCBpbmZvLT50ZW1wX25hbWUpOworfQorCisKKy8qCisgKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIHNlbGVjdF9maWxlX25hbWUoaW5mby0+dGVtcF9uYW1lKTsKKyAgaWYgKChpbmZvLT50ZW1wX2ZpbGUgPSBmb3BlbihpbmZvLT50ZW1wX25hbWUsIFJXX0JJTkFSWSkpID09IE5VTEwpCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOworICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKKyAgVFJBQ0VNU1MoY2luZm8sIDEsIEpUUkNfVEZJTEVfT1BFTiwgaW5mby0+dGVtcF9uYW1lKTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgbmV4dF9maWxlX251bSA9IDA7CQkvKiBpbml0aWFsaXplIHRlbXAgZmlsZSBuYW1lIGdlbmVyYXRvciAqLworICByZXR1cm4gREVGQVVMVF9NQVhfTUVNOwkvKiBkZWZhdWx0IGZvciBtYXhfbWVtb3J5X3RvX3VzZSAqLworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQpkaWZmIC0tZ2l0IGEvam1lbW5vYnMuYyBiL2ptZW1ub2JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4YzMzNwotLS0gL2Rldi9udWxsCisrKyBiL2ptZW1ub2JzLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBqbWVtbm9icy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSByZWFsbHkgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXN0ZW0tCisgKiBkZXBlbmRlbnQgcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGFzc3VtZXMgdGhhdCBubyBiYWNraW5nLXN0b3JlIGZpbGVzIGFyZSBuZWVkZWQ6IGFsbCByZXF1aXJlZCBzcGFjZQorICogY2FuIGJlIG9idGFpbmVkIGZyb20gbWFsbG9jKCkuCisgKiBUaGlzIGlzIHZlcnkgcG9ydGFibGUgaW4gdGhlIHNlbnNlIHRoYXQgaXQnbGwgY29tcGlsZSBvbiBhbG1vc3QgYW55dGhpbmcsCisgKiBidXQgeW91J2QgYmV0dGVyIGhhdmUgbG90cyBvZiBtYWluIG1lbW9yeSAob3IgdmlydHVhbCBtZW1vcnkpIGlmIHlvdSB3YW50CisgKiB0byBwcm9jZXNzIGJpZyBpbWFnZXMuCisgKiBOb3RlIHRoYXQgdGhlIG1heF9tZW1vcnlfdG9fdXNlIG9wdGlvbiBpcyBpZ25vcmVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOworZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOworI2VuZGlmCisKKworLyoKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKKyAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCisgKi8KKworR0xPQkFMKHZvaWQgKikKK2pwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgorICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKKyAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCisgKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCisgKi8KKworR0xPQkFMKHZvaWQgRkFSICopCitqcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZnJlZShvYmplY3QpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKiBIZXJlIHdlIGFsd2F5cyBzYXksICJ3ZSBnb3QgYWxsIHlvdSB3YW50IGJ1ZCEiCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICByZXR1cm4gbWF4X2J5dGVzX25lZWRlZDsKK30KKworCisvKgorICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCisgKiBTaW5jZSBqcGVnX21lbV9hdmFpbGFibGUgYWx3YXlzIHByb21pc2VkIHRoZSBtb29uLAorICogdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFuZCB3ZSBjYW4ganVzdCBlcnJvciBvdXQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQoreworICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0JBQ0tJTkdfU1RPUkUpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLiAgSGVyZSwgdGhlcmUgaXNuJ3QgYW55LgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICByZXR1cm4gMDsJCQkvKiBqdXN0IHNldCBtYXhfbWVtb3J5X3RvX3VzZSB0byAwICovCit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CmRpZmYgLS1naXQgYS9qbWVtc3lzLmggYi9qbWVtc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzYzZkMwotLS0gL2Rldi9udWxsCisrKyBiL2ptZW1zeXMuaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIGptZW1zeXMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBpbmNsdWRlIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHN5c3RlbS1pbmRlcGVuZGVudAorICogYW5kIHN5c3RlbS1kZXBlbmRlbnQgcG9ydGlvbnMgb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBObyBvdGhlcgorICogbW9kdWxlcyBuZWVkIGluY2x1ZGUgaXQuICAoVGhlIHN5c3RlbS1pbmRlcGVuZGVudCBwb3J0aW9uIGlzIGptZW1tZ3IuYzsKKyAqIHRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudCBwb3J0aW9uLikKKyAqCisgKiBUaGlzIGZpbGUgd29ya3MgYXMtaXMgZm9yIHRoZSBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VycyBzdXBwbGllZAorICogaW4gdGhlIElKRyBkaXN0cmlidXRpb24uICBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IGl0IGlmIHlvdSB3cml0ZSBhCisgKiBjdXN0b20gbWVtb3J5IG1hbmFnZXIuICBJZiBzeXN0ZW0tZGVwZW5kZW50IGNoYW5nZXMgYXJlIG5lZWRlZCBpbgorICogdGhpcyBmaWxlLCB0aGUgYmVzdCBtZXRob2QgaXMgdG8gI2lmZGVmIHRoZW0gYmFzZWQgb24gYSBjb25maWd1cmF0aW9uCisgKiBzeW1ib2wgc3VwcGxpZWQgaW4gamNvbmZpZy5oLCBhcyB3ZSBoYXZlIGRvbmUgd2l0aCBVU0VfTVNET1NfTUVNTUdSCisgKiBhbmQgVVNFX01BQ19NRU1NR1IuCisgKi8KKworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19nZXRfc21hbGwJCWpHZXRTbWFsbAorI2RlZmluZSBqcGVnX2ZyZWVfc21hbGwJCWpGcmVlU21hbGwKKyNkZWZpbmUganBlZ19nZXRfbGFyZ2UJCWpHZXRMYXJnZQorI2RlZmluZSBqcGVnX2ZyZWVfbGFyZ2UJCWpGcmVlTGFyZ2UKKyNkZWZpbmUganBlZ19tZW1fYXZhaWxhYmxlCWpNZW1BdmFpbAorI2RlZmluZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZQlqT3BlbkJhY2tTdG9yZQorI2RlZmluZSBqcGVnX21lbV9pbml0CQlqTWVtSW5pdAorI2RlZmluZSBqcGVnX21lbV90ZXJtCQlqTWVtVGVybQorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKgorICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBzbWFsbCBjaHVua3Mgb2YKKyAqIG1lbW9yeS4gIChUeXBpY2FsbHkgdGhlIHRvdGFsIGFtb3VudCByZXF1ZXN0ZWQgdGhyb3VnaCBqcGVnX2dldF9zbWFsbCBpcworICogbm8gbW9yZSB0aGFuIDIwSyBvciBzbzsgdGhpcyB3aWxsIGJlIHJlcXVlc3RlZCBpbiBjaHVua3Mgb2YgYSBmZXcgSyBlYWNoLikKKyAqIEJlaGF2aW9yIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmb3IgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zIG1hbGxvYworICogYW5kIGZyZWU7IGluIHBhcnRpY3VsYXIsIGpwZWdfZ2V0X3NtYWxsIG11c3QgcmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KKyAqIE9uIG1vc3Qgc3lzdGVtcywgdGhlc2UgQVJFIG1hbGxvYyBhbmQgZnJlZS4gIGpwZWdfZnJlZV9zbWFsbCBpcyBwYXNzZWQgdGhlCisgKiBzaXplIG9mIHRoZSBvYmplY3QgYmVpbmcgZnJlZWQsIGp1c3QgaW4gY2FzZSBpdCdzIG5lZWRlZC4KKyAqIE9uIGFuIDgweDg2IG1hY2hpbmUgdXNpbmcgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWwsIHRoZXNlIG1hbmFnZSBuZWFyIGhlYXAuCisgKi8KKworRVhURVJOKHZvaWQgKikganBlZ19nZXRfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZyZWVfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsCisJCQkJICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CisKKy8qCisgKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGFsbG9jYXRlIGFuZCByZWxlYXNlIGxhcmdlIGNodW5rcyBvZgorICogbWVtb3J5ICh1cCB0byB0aGUgdG90YWwgZnJlZSBzcGFjZSBkZXNpZ25hdGVkIGJ5IGpwZWdfbWVtX2F2YWlsYWJsZSkuCisgKiBUaGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhhdCBvbiBhbiA4MHg4NiBtYWNoaW5lLAorICogZmFyIHBvaW50ZXJzIGFyZSB1c2VkLiAgT24gbW9zdCBvdGhlciBtYWNoaW5lcyB0aGVzZSBhcmUgaWRlbnRpY2FsIHRvCisgKiB0aGUganBlZ19nZXQvZnJlZV9zbWFsbCByb3V0aW5lczsgYnV0IHdlIGtlZXAgdGhlbSBzZXBhcmF0ZSBhbnl3YXksCisgKiBpbiBjYXNlIGEgZGlmZmVyZW50IGFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgZGVzaXJhYmxlIGZvciBsYXJnZSBjaHVua3MuCisgKi8KKworRVhURVJOKHZvaWQgRkFSICopIGpwZWdfZ2V0X2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CitFWFRFUk4odm9pZCkganBlZ19mcmVlX2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwKKwkJCQkgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKKworLyoKKyAqIFRoZSBtYWNybyBNQVhfQUxMT0NfQ0hVTksgZGVzaWduYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkKKyAqIGJlIHJlcXVlc3RlZCBpbiBhIHNpbmdsZSBjYWxsIHRvIGpwZWdfZ2V0X2xhcmdlIChhbmQganBlZ19nZXRfc21hbGwgZm9yIHRoYXQKKyAqIG1hdHRlciwgYnV0IHRoYXQgY2FzZSBzaG91bGQgbmV2ZXIgY29tZSBpbnRvIHBsYXkpLiAgVGhpcyBtYWNybyBpcyBuZWVkZWQKKyAqIHRvIG1vZGVsIHRoZSA2NEtiLXNlZ21lbnQtc2l6ZSBsaW1pdCBvZiBmYXIgYWRkcmVzc2luZyBvbiA4MHg4NiBtYWNoaW5lcy4KKyAqIE9uIHRob3NlIG1hY2hpbmVzLCB3ZSBleHBlY3QgdGhhdCBqY29uZmlnLmggd2lsbCBwcm92aWRlIGEgcHJvcGVyIHZhbHVlLgorICogT24gbWFjaGluZXMgd2l0aCAzMi1iaXQgZmxhdCBhZGRyZXNzIHNwYWNlcywgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSB1c2VkLgorICoKKyAqIE5COiBqbWVtbWdyLmMgZXhwZWN0cyB0aGF0IE1BWF9BTExPQ19DSFVOSyB3aWxsIGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZQorICogc2l6ZV90IGFuZCB3aWxsIGJlIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKGFsaWduX3R5cGUpLgorICovCisKKyNpZm5kZWYgTUFYX0FMTE9DX0NIVU5LCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LICAxMDAwMDAwMDAwTAorI2VuZGlmCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIHNwYWNlIHN0aWxsIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBieQorICoganBlZ19nZXRfbGFyZ2UuICBJZiBtb3JlIHNwYWNlIHRoYW4gdGhpcyBpcyBuZWVkZWQsIGJhY2tpbmcgc3RvcmUgd2lsbCBiZQorICogdXNlZC4gIE5PVEU6IGFueSBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgbXVzdCBub3QgYmUgY291bnRlZC4KKyAqCisgKiBUaGVyZSBpcyBhIG1pbmltdW0gc3BhY2UgcmVxdWlyZW1lbnQsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pbmltdW0KKyAqIGZlYXNpYmxlIGJ1ZmZlciBzaXplczsgam1lbW1nci5jIHdpbGwgcmVxdWVzdCB0aGF0IG11Y2ggc3BhY2UgZXZlbiBpZgorICoganBlZ19tZW1fYXZhaWxhYmxlIHJldHVybnMgemVyby4gIFRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCwgZW5vdWdoIHRvIGhvbGQKKyAqIGFsbCB3b3JraW5nIHN0b3JhZ2UgaW4gbWVtb3J5LCBpcyBhbHNvIHBhc3NlZCBpbiBjYXNlIGl0IGlzIHVzZWZ1bC4KKyAqIEZpbmFsbHksIHRoZSB0b3RhbCBzcGFjZSBhbHJlYWR5IGFsbG9jYXRlZCBpcyBwYXNzZWQuICBJZiBubyBiZXR0ZXIKKyAqIG1ldGhvZCBpcyBhdmFpbGFibGUsIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQKKyAqIGlzIG9mdGVuIGEgc3VpdGFibGUgY2FsY3VsYXRpb24uCisgKgorICogSXQgaXMgT0sgZm9yIGpwZWdfbWVtX2F2YWlsYWJsZSB0byB1bmRlcmVzdGltYXRlIHRoZSBzcGFjZSBhdmFpbGFibGUKKyAqICh0aGF0J2xsIGp1c3QgbGVhZCB0byBtb3JlIGJhY2tpbmctc3RvcmUgYWNjZXNzIHRoYW4gaXMgcmVhbGx5IG5lY2Vzc2FyeSkuCisgKiBIb3dldmVyLCBhbiBvdmVyZXN0aW1hdGUgd2lsbCBsZWFkIHRvIGZhaWx1cmUuICBIZW5jZSBpdCdzIHdpc2UgdG8gc3VidHJhY3QKKyAqIGEgc2xvcCBmYWN0b3IgZnJvbSB0aGUgdHJ1ZSBhdmFpbGFibGUgc3BhY2UuICA1JSBzaG91bGQgYmUgZW5vdWdoLgorICoKKyAqIE9uIG1hY2hpbmVzIHdpdGggbG90cyBvZiB2aXJ0dWFsIG1lbW9yeSwgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSByZXR1cm5lZC4KKyAqIENvbnZlcnNlbHksIHplcm8gbWF5IGJlIHJldHVybmVkIHRvIGFsd2F5cyB1c2UgdGhlIG1pbmltdW0gYW1vdW50IG9mIG1lbW9yeS4KKyAqLworCitFWFRFUk4obG9uZykganBlZ19tZW1fYXZhaWxhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkJCSAgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLAorCQkJCSAgICAgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkpOworCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB3aGF0ZXZlciBzdGF0ZSBpcyBuZWVkZWQgdG8gYWNjZXNzIGEgc2luZ2xlCisgKiBiYWNraW5nLXN0b3JlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlL2Nsb3NlIG1ldGhvZCBwb2ludGVycyBhcmUgY2FsbGVkCisgKiBieSBqbWVtbWdyLmMgdG8gbWFuaXB1bGF0ZSB0aGUgYmFja2luZy1zdG9yZSBvYmplY3Q7IGFsbCBvdGhlciBmaWVsZHMKKyAqIGFyZSBwcml2YXRlIHRvIHRoZSBzeXN0ZW0tZGVwZW5kZW50IGJhY2tpbmcgc3RvcmUgcm91dGluZXMuCisgKi8KKworI2RlZmluZSBURU1QX05BTUVfTEVOR1RIICAgNjQJLyogbWF4IGxlbmd0aCBvZiBhIHRlbXBvcmFyeSBmaWxlJ3MgbmFtZSAqLworCisKKyNpZmRlZiBVU0VfTVNET1NfTUVNTUdSCQkvKiBET1Mtc3BlY2lmaWMganVuayAqLworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFhNU0g7CS8qIHR5cGUgb2YgZXh0ZW5kZWQtbWVtb3J5IGhhbmRsZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgRU1TSDsJLyogdHlwZSBvZiBleHBhbmRlZC1tZW1vcnkgaGFuZGxlcyAqLworCit0eXBlZGVmIHVuaW9uIHsKKyAgc2hvcnQgZmlsZV9oYW5kbGU7CQkvKiBET1MgZmlsZSBoYW5kbGUgaWYgaXQncyBhIHRlbXAgZmlsZSAqLworICBYTVNIIHhtc19oYW5kbGU7CQkvKiBoYW5kbGUgaWYgaXQncyBhIGNodW5rIG9mIFhNUyAqLworICBFTVNIIGVtc19oYW5kbGU7CQkvKiBoYW5kbGUgaWYgaXQncyBhIGNodW5rIG9mIEVNUyAqLworfSBoYW5kbGVfdW5pb247CisKKyNlbmRpZiAvKiBVU0VfTVNET1NfTUVNTUdSICovCisKKyNpZmRlZiBVU0VfTUFDX01FTU1HUgkJLyogTWFjLXNwZWNpZmljIGp1bmsgKi8KKyNpbmNsdWRlIDxGaWxlcy5oPgorI2VuZGlmIC8qIFVTRV9NQUNfTUVNTUdSICovCisKKwordHlwZWRlZiBzdHJ1Y3QgYmFja2luZ19zdG9yZV9zdHJ1Y3QgKiBiYWNraW5nX3N0b3JlX3B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgYmFja2luZ19zdG9yZV9zdHJ1Y3QgeworICAvKiBNZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcvY2xvc2luZyB0aGlzIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCisgIEpNRVRIT0Qodm9pZCwgcmVhZF9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCQkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkJICAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJCQkgICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpKTsKKyAgSk1FVEhPRCh2b2lkLCBjbG9zZV9iYWNraW5nX3N0b3JlLCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCSAgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pKTsKKworICAvKiBQcml2YXRlIGZpZWxkcyBmb3Igc3lzdGVtLWRlcGVuZGVudCBiYWNraW5nLXN0b3JlIG1hbmFnZW1lbnQgKi8KKyNpZmRlZiBVU0VfTVNET1NfTUVNTUdSCisgIC8qIEZvciB0aGUgTVMtRE9TIG1hbmFnZXIgKGptZW1kb3MuYyksIHdlIG5lZWQ6ICovCisgIGhhbmRsZV91bmlvbiBoYW5kbGU7CQkvKiByZWZlcmVuY2UgdG8gYmFja2luZy1zdG9yZSBzdG9yYWdlIG9iamVjdCAqLworICBjaGFyIHRlbXBfbmFtZVtURU1QX05BTUVfTEVOR1RIXTsgLyogbmFtZSBpZiBpdCdzIGEgZmlsZSAqLworI2Vsc2UKKyNpZmRlZiBVU0VfTUFDX01FTU1HUgorICAvKiBGb3IgdGhlIE1hYyBtYW5hZ2VyIChqbWVtbWFjLmMpLCB3ZSBuZWVkOiAqLworICBzaG9ydCB0ZW1wX2ZpbGU7CQkvKiBmaWxlIHJlZmVyZW5jZSBudW1iZXIgdG8gdGVtcCBmaWxlICovCisgIEZTU3BlYyB0ZW1wU3BlYzsJCS8qIHRoZSBGU1NwZWMgZm9yIHRoZSB0ZW1wIGZpbGUgKi8KKyAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgaWYgaXQncyBhIGZpbGUgKi8KKyNlbHNlCisgIC8qIEZvciBhIHR5cGljYWwgaW1wbGVtZW50YXRpb24gd2l0aCB0ZW1wIGZpbGVzLCB3ZSBuZWVkOiAqLworICBGSUxFICogdGVtcF9maWxlOwkJLyogc3RkaW8gcmVmZXJlbmNlIHRvIHRlbXAgZmlsZSAqLworICBjaGFyIHRlbXBfbmFtZVtURU1QX05BTUVfTEVOR1RIXTsgLyogbmFtZSBvZiB0ZW1wIGZpbGUgKi8KKyNlbmRpZgorI2VuZGlmCit9IGJhY2tpbmdfc3RvcmVfaW5mbzsKKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuICBUaGlzIG11c3QgZmlsbCBpbiB0aGUKKyAqIHJlYWQvd3JpdGUvY2xvc2UgcG9pbnRlcnMgaW4gdGhlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlIHJvdXRpbmVzCisgKiBtYXkgdGFrZSBhbiBlcnJvciBleGl0IGlmIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBmaWxlIHNpemUgaXMgZXhjZWVkZWQuCisgKiAoSWYganBlZ19tZW1fYXZhaWxhYmxlIGFsd2F5cyByZXR1cm5zIGEgbGFyZ2UgdmFsdWUsIHRoaXMgcm91dGluZSBjYW4KKyAqIGp1c3QgdGFrZSBhbiBlcnJvciBleGl0LikKKyAqLworCitFWFRFUk4odm9pZCkganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCSAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCQkJICBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkpOworCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLiAganBlZ19tZW1faW5pdCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgaXMKKyAqIGFsbG9jYXRlZCAoYW5kLCB0aGVyZWZvcmUsIG5vdGhpbmcgaW4gY2luZm8gaXMgb2YgdXNlIGV4Y2VwdCB0aGUgZXJyb3IKKyAqIG1hbmFnZXIgcG9pbnRlcikuICBJdCBzaG91bGQgcmV0dXJuIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSBmb3IKKyAqIG1heF9tZW1vcnlfdG9fdXNlOyB0aGlzIG1heSBzdWJzZXF1ZW50bHkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgc3Vycm91bmRpbmcKKyAqIGFwcGxpY2F0aW9uLiAgKE5vdGUgdGhhdCBtYXhfbWVtb3J5X3RvX3VzZSBpcyBvbmx5IGltcG9ydGFudCBpZgorICoganBlZ19tZW1fYXZhaWxhYmxlIGNob29zZXMgdG8gY29uc3VsdCBpdCAuLi4gbm8gb25lIGVsc2Ugd2lsbC4pCisgKiBqcGVnX21lbV90ZXJtIG1heSBhc3N1bWUgdGhhdCBhbGwgcmVxdWVzdGVkIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCBhbmQgdGhhdAorICogYWxsIG9wZW5lZCBiYWNraW5nLXN0b3JlIG9iamVjdHMgaGF2ZSBiZWVuIGNsb3NlZC4KKyAqLworCitFWFRFUk4obG9uZykganBlZ19tZW1faW5pdCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfbWVtX3Rlcm0gSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKZGlmZiAtLWdpdCBhL2ptb3JlY2ZnLmggYi9qbW9yZWNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTlhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9qbW9yZWNmZy5oCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogam1vcmVjZmcuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgY3VzdG9taXplIHRoZQorICogSlBFRyBzb2Z0d2FyZSBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgb3Igc3VwcG9ydCBtYWNoaW5lLWRlcGVuZGVudAorICogb3B0aW1pemF0aW9ucy4gIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0byB0b3VjaCB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIERlZmluZSBBTkRST0lEX1JHQiB0byBlbmFibGUgc3BlY2lmaWMgb3B0aW1pemF0aW9ucyBmb3IgQW5kcm9pZAorICogICBKQ1NfUkdCQV84ODg4IHN1cHBvcnQKKyAqICAgSkNTX1JHQl81NjUgc3VwcG9ydAorICogCisgKi8KKworI2RlZmluZSBBTkRST0lEX1JHQgorCisjaWZkZWYgQU5EUk9JRF9SR0IKKyNkZWZpbmUgUEFDS19TSE9SVF81NjUocixnLGIpICAoKCgocik8PDgpJjB4ZjgwMCl8KCgoZyk8PDMpJjB4N0MwKXwoKGIpPj4zKSkKKyNkZWZpbmUgUEFDS19UV09fUElYRUxTKGwscikgICAoKHI8PDE2KSB8IGwpCisjZGVmaW5lIFBBQ0tfTkVFRF9BTElHTk1FTlQocHRyKSAoKChpbnQpKHB0cikpJjMpCisjZGVmaW5lIFdSSVRFX1RXT19QSVhFTFMoYWRkciwgcGl4ZWxzKSBkbyB7ICAgICBcCisgICAgICAgICAoKElOVDE2KikoYWRkcikpWzBdID0gKHBpeGVscyk7ICAgICAgICBcCisgICAgICAgICAoKElOVDE2KikoYWRkcikpWzFdID0gKHBpeGVscyk+PjE2OyAgICBcCisgICAgfSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9UV09fQUxJR05FRF9QSVhFTFMoYWRkciwgcGl4ZWxzKSAgKCgqKElOVDMyKikoYWRkcikpID0gcGl4ZWxzKQorI2RlZmluZSBESVRIRVJfNTY1X1IociwgZGl0aGVyKSAoKHIpICsgKChkaXRoZXIpJjB4RkYpKQorI2RlZmluZSBESVRIRVJfNTY1X0coZywgZGl0aGVyKSAoKGcpICsgKCgoZGl0aGVyKSYweEZGKT4+MSkpCisjZGVmaW5lIERJVEhFUl81NjVfQihiLCBkaXRoZXIpICgoYikgKyAoKGRpdGhlcikmMHhGRikpCisjZW5kaWYKKworLyoKKyAqIERlZmluZSBCSVRTX0lOX0pTQU1QTEUgYXMgZWl0aGVyCisgKiAgIDggICBmb3IgOC1iaXQgc2FtcGxlIHZhbHVlcyAodGhlIHVzdWFsIHNldHRpbmcpCisgKiAgIDEyICBmb3IgMTItYml0IHNhbXBsZSB2YWx1ZXMKKyAqIE9ubHkgOCBhbmQgMTIgYXJlIGxlZ2FsIGRhdGEgcHJlY2lzaW9ucyBmb3IgbG9zc3kgSlBFRyBhY2NvcmRpbmcgdG8gdGhlCisgKiBKUEVHIHN0YW5kYXJkLCBhbmQgdGhlIElKRyBjb2RlIGRvZXMgbm90IHN1cHBvcnQgYW55dGhpbmcgZWxzZSEKKyAqIFdlIGRvIG5vdCBzdXBwb3J0IHJ1bi10aW1lIHNlbGVjdGlvbiBvZiBkYXRhIHByZWNpc2lvbiwgc29ycnkuCisgKi8KKworI2RlZmluZSBCSVRTX0lOX0pTQU1QTEUgIDgJLyogdXNlIDggb3IgMTIgKi8KKworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgY29tcG9uZW50cyAoY29sb3IgY2hhbm5lbHMpIGFsbG93ZWQgaW4gSlBFRyBpbWFnZS4KKyAqIFRvIG1lZXQgdGhlIGxldHRlciBvZiB0aGUgSlBFRyBzcGVjLCBzZXQgdGhpcyB0byAyNTUuICBIb3dldmVyLCBkYXJuCisgKiBmZXcgYXBwbGljYXRpb25zIG5lZWQgbW9yZSB0aGFuIDQgY2hhbm5lbHMgKG1heWJlIDUgZm9yIENNWUsgKyBhbHBoYQorICogbWFzaykuICBXZSByZWNvbW1lbmQgMTAgYXMgYSByZWFzb25hYmxlIGNvbXByb21pc2U7IHVzZSA0IGlmIHlvdSBhcmUKKyAqIHJlYWxseSBzaG9ydCBvbiBtZW1vcnkuICAoRWFjaCBhbGxvd2VkIGNvbXBvbmVudCBjb3N0cyBhIGh1bmRyZWQgb3Igc28KKyAqIGJ5dGVzIG9mIHN0b3JhZ2UsIHdoZXRoZXIgYWN0dWFsbHkgdXNlZCBpbiBhbiBpbWFnZSBvciBub3QuKQorICovCisKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVFMgIDEwCS8qIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIGNvbXBvbmVudHMgKi8KKworCisvKgorICogQmFzaWMgZGF0YSB0eXBlcy4KKyAqIFlvdSBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlc2UgaWYgeW91IGhhdmUgYSBtYWNoaW5lIHdpdGggdW51c3VhbCBkYXRhCisgKiB0eXBlIHNpemVzOyBmb3IgZXhhbXBsZSwgImNoYXIiIG5vdCA4IGJpdHMsICJzaG9ydCIgbm90IDE2IGJpdHMsCisgKiBvciAibG9uZyIgbm90IDMyIGJpdHMuICBXZSBkb24ndCBjYXJlIHdoZXRoZXIgImludCIgaXMgMTYgb3IgMzIgYml0cywKKyAqIGJ1dCBpdCBoYWQgYmV0dGVyIGJlIGF0IGxlYXN0IDE2LgorICovCisKKy8qIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHNhbXBsZSAocGl4ZWwgZWxlbWVudCB2YWx1ZSkuCisgKiBXZSBmcmVxdWVudGx5IGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgc28gaXQncyBpbXBvcnRhbnQgdG8ga2VlcAorICogdGhlbSBzbWFsbC4gIEJ1dCBpZiB5b3UgaGF2ZSBtZW1vcnkgdG8gYnVybiBhbmQgYWNjZXNzIHRvIGNoYXIgb3Igc2hvcnQKKyAqIGFycmF5cyBpcyB2ZXJ5IHNsb3cgb24geW91ciBoYXJkd2FyZSwgeW91IG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoZXNlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorLyogSlNBTVBMRSBzaG91bGQgYmUgdGhlIHNtYWxsZXN0IHR5cGUgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbHVlcyAwLi4yNTUuCisgKiBZb3UgY2FuIHVzZSBhIHNpZ25lZCBjaGFyIGJ5IGhhdmluZyBHRVRKU0FNUExFIG1hc2sgaXQgd2l0aCAweEZGLgorICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEpTQU1QTEU7CisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKKworI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfQ0hBUiAqLworCit0eXBlZGVmIGNoYXIgSlNBTVBMRTsKKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKKyNlbHNlCisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSAmIDB4RkYpCisjZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLworCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKyNkZWZpbmUgTUFYSlNBTVBMRQkyNTUKKyNkZWZpbmUgQ0VOVEVSSlNBTVBMRQkxMjgKKworI2VuZGlmIC8qIEJJVFNfSU5fSlNBTVBMRSA9PSA4ICovCisKKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSAxMgorLyogSlNBTVBMRSBzaG91bGQgYmUgdGhlIHNtYWxsZXN0IHR5cGUgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbHVlcyAwLi40MDk1LgorICogT24gbmVhcmx5IGFsbCBtYWNoaW5lcyAic2hvcnQiIHdpbGwgZG8gbmljZWx5LgorICovCisKK3R5cGVkZWYgc2hvcnQgSlNBTVBMRTsKKyNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQorCisjZGVmaW5lIE1BWEpTQU1QTEUJNDA5NQorI2RlZmluZSBDRU5URVJKU0FNUExFCTIwNDgKKworI2VuZGlmIC8qIEJJVFNfSU5fSlNBTVBMRSA9PSAxMiAqLworCisKKy8qIFJlcHJlc2VudGF0aW9uIG9mIGEgRENUIGZyZXF1ZW5jeSBjb2VmZmljaWVudC4KKyAqIFRoaXMgc2hvdWxkIGJlIGEgc2lnbmVkIHZhbHVlIG9mIGF0IGxlYXN0IDE2IGJpdHM7ICJzaG9ydCIgaXMgdXN1YWxseSBPSy4KKyAqIEFnYWluLCB3ZSBhbGxvY2F0ZSBsYXJnZSBhcnJheXMgb2YgdGhlc2UsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0byBpbnQKKyAqIGlmIHlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCAic2hvcnQiIGlzIHJlYWxseSBzbG93LgorICovCisKK3R5cGVkZWYgc2hvcnQgSkNPRUY7CisKKworLyogQ29tcHJlc3NlZCBkYXRhc3RyZWFtcyBhcmUgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIEpPQ1RFVC4KKyAqIFRoZXNlIG11c3QgYmUgRVhBQ1RMWSA4IGJpdHMgd2lkZSwgYXQgbGVhc3Qgb25jZSB0aGV5IGFyZSB3cml0dGVuIHRvCisgKiBleHRlcm5hbCBzdG9yYWdlLiAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgdGhlIHN0ZGlvIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uCisgKiBtYW5hZ2VycywgdGhpcyBpcyBhbHNvIHRoZSBkYXRhIHR5cGUgcGFzc2VkIHRvIGZyZWFkL2Z3cml0ZS4KKyAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBKT0NURVQ7CisjZGVmaW5lIEdFVEpPQ1RFVCh2YWx1ZSkgICh2YWx1ZSkKKworI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfQ0hBUiAqLworCit0eXBlZGVmIGNoYXIgSk9DVEVUOworI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKHZhbHVlKQorI2Vsc2UKKyNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKCh2YWx1ZSkgJiAweEZGKQorI2VuZGlmIC8qIENIQVJfSVNfVU5TSUdORUQgKi8KKworI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLworCisKKy8qIFRoZXNlIHR5cGVkZWZzIGFyZSB1c2VkIGZvciB2YXJpb3VzIHRhYmxlIGVudHJpZXMgYW5kIHNvIGZvcnRoLgorICogVGhleSBtdXN0IGJlIGF0IGxlYXN0IGFzIHdpZGUgYXMgc3BlY2lmaWVkOyBidXQgbWFraW5nIHRoZW0gdG9vIGJpZworICogd29uJ3QgY29zdCBhIGh1Z2UgYW1vdW50IG9mIG1lbW9yeSwgc28gd2UgZG9uJ3QgcHJvdmlkZSBzcGVjaWFsCisgKiBleHRyYWN0aW9uIGNvZGUgbGlrZSB3ZSBkaWQgZm9yIEpTQU1QTEUuICAoSW4gb3RoZXIgd29yZHMsIHRoZXNlCisgKiB0eXBlZGVmcyBsaXZlIGF0IGEgZGlmZmVyZW50IHBvaW50IG9uIHRoZSBzcGVlZC9zcGFjZSB0cmFkZW9mZiBjdXJ2ZS4pCisgKi8KKworLyogVUlOVDggbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgMC4uMjU1LiAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7CisjZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCisjaWZkZWYgQ0hBUl9JU19VTlNJR05FRAordHlwZWRlZiBjaGFyIFVJTlQ4OworI2Vsc2UgLyogbm90IENIQVJfSVNfVU5TSUdORUQgKi8KK3R5cGVkZWYgc2hvcnQgVUlOVDg7CisjZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLworI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLworCisvKiBVSU5UMTYgbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgMC4uNjU1MzUuICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQxNjsKKyNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX1NIT1JUICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMTY7CisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9TSE9SVCAqLworCisvKiBJTlQxNiBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAtMzI3NjguLjMyNzY3LiAqLworCisjaWZuZGVmIFhNRF9ICQkJLyogWDExL3htZC5oIGNvcnJlY3RseSBkZWZpbmVzIElOVDE2ICovCit0eXBlZGVmIHNob3J0IElOVDE2OworI2VuZGlmCisKKy8qIElOVDMyIG11c3QgaG9sZCBhdCBsZWFzdCBzaWduZWQgMzItYml0IHZhbHVlcy4gKi8KKworI2lmbmRlZiBYTURfSAkJCS8qIFgxMS94bWQuaCBjb3JyZWN0bHkgZGVmaW5lcyBJTlQzMiAqLwordHlwZWRlZiBsb25nIElOVDMyOworI2VuZGlmCisKKy8qIERhdGF0eXBlIHVzZWQgZm9yIGltYWdlIGRpbWVuc2lvbnMuICBUaGUgSlBFRyBzdGFuZGFyZCBvbmx5IHN1cHBvcnRzCisgKiBpbWFnZXMgdXAgdG8gNjRLKjY0SyBkdWUgdG8gMTYtYml0IGZpZWxkcyBpbiBTT0YgbWFya2Vycy4gIFRoZXJlZm9yZQorICogInVuc2lnbmVkIGludCIgaXMgc3VmZmljaWVudCBvbiBhbGwgbWFjaGluZXMuICBIb3dldmVyLCBpZiB5b3UgbmVlZCB0bworICogaGFuZGxlIGxhcmdlciBpbWFnZXMgYW5kIHlvdSBkb24ndCBtaW5kIGRldmlhdGluZyBmcm9tIHRoZSBzcGVjLCB5b3UKKyAqIGNhbiBjaGFuZ2UgdGhpcyBkYXRhdHlwZS4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBKRElNRU5TSU9OOworCisjZGVmaW5lIEpQRUdfTUFYX0RJTUVOU0lPTiAgNjU1MDBMICAvKiBhIHRhZCB1bmRlciA2NEsgdG8gcHJldmVudCBvdmVyZmxvd3MgKi8KKworCisvKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zLgorICogWW91IGNvdWxkIG1vZGlmeSB0aGVtIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSBmdW5jdGlvbiBsaW5rYWdlIGNvbnZlbnRpb25zOworICogaW4gcGFydGljdWxhciwgeW91J2xsIG5lZWQgdG8gZG8gdGhhdCB0byBtYWtlIHRoZSBsaWJyYXJ5IGEgV2luZG93cyBETEwuCisgKiBBbm90aGVyIGFwcGxpY2F0aW9uIGlzIHRvIG1ha2UgYWxsIGZ1bmN0aW9ucyBnbG9iYWwgZm9yIHVzZSB3aXRoIGRlYnVnZ2VycworICogb3IgY29kZSBwcm9maWxlcnMgdGhhdCByZXF1aXJlIGl0LgorICovCisKKy8qIGEgZnVuY3Rpb24gY2FsbGVkIHRocm91Z2ggbWV0aG9kIHBvaW50ZXJzOiAqLworI2RlZmluZSBNRVRIT0RERUYodHlwZSkJCXN0YXRpYyB0eXBlCisvKiBhIGZ1bmN0aW9uIHVzZWQgb25seSBpbiBpdHMgbW9kdWxlOiAqLworI2RlZmluZSBMT0NBTCh0eXBlKQkJc3RhdGljIHR5cGUKKy8qIGEgZnVuY3Rpb24gcmVmZXJlbmNlZCB0aHJ1IEVYVEVSTnM6ICovCisjZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZQorLyogYSByZWZlcmVuY2UgdG8gYSBHTE9CQUwgZnVuY3Rpb246ICovCisjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIHR5cGUKKworCisvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVjbGFyZSBhICJtZXRob2QiLCB0aGF0IGlzLCBhIGZ1bmN0aW9uIHBvaW50ZXIuCisgKiBXZSB3YW50IHRvIHN1cHBseSBwcm90b3R5cGUgcGFyYW1ldGVycyBpZiB0aGUgY29tcGlsZXIgY2FuIGNvcGUuCisgKiBOb3RlIHRoYXQgdGhlIGFyZ2xpc3QgcGFyYW1ldGVyIG11c3QgYmUgcGFyZW50aGVzaXplZCEKKyAqIEFnYWluLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGlmIHlvdSBuZWVkIHNwZWNpYWwgbGlua2FnZSBrZXl3b3Jkcy4KKyAqLworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgYXJnbGlzdAorI2Vsc2UKKyNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSAoKQorI2VuZGlmCisKKworLyogSGVyZSBpcyB0aGUgcHNldWRvLWtleXdvcmQgZm9yIGRlY2xhcmluZyBwb2ludGVycyB0aGF0IG11c3QgYmUgImZhciIKKyAqIG9uIDgweDg2IG1hY2hpbmVzLiAgTW9zdCBvZiB0aGUgc3BlY2lhbGl6ZWQgY29kaW5nIGZvciA4MHg4NiBpcyBoYW5kbGVkCisgKiBieSBqdXN0IHNheWluZyAiRkFSICoiIHdoZXJlIHN1Y2ggYSBwb2ludGVyIGlzIG5lZWRlZC4gIEluIGEgZmV3IHBsYWNlcworICogZXhwbGljaXQgY29kaW5nIGlzIG5lZWRlZDsgc2VlIHVzZXMgb2YgdGhlIE5FRURfRkFSX1BPSU5URVJTIHN5bWJvbC4KKyAqLworCisjaWZkZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyNkZWZpbmUgRkFSICBmYXIKKyNlbHNlCisjZGVmaW5lIEZBUgorI2VuZGlmCisKKworLyoKKyAqIE9uIGEgZmV3IHN5c3RlbXMsIHR5cGUgYm9vbGVhbiBhbmQvb3IgaXRzIHZhbHVlcyBGQUxTRSwgVFJVRSBtYXkgYXBwZWFyCisgKiBpbiBzdGFuZGFyZCBoZWFkZXIgZmlsZXMuICBPciB5b3UgbWF5IGhhdmUgY29uZmxpY3RzIHdpdGggYXBwbGljYXRpb24tCisgKiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIHRvZ2V0aGVyIHdpdGggdGhlc2UgZmlsZXMuCisgKiBEZWZpbmluZyBIQVZFX0JPT0xFQU4gYmVmb3JlIGluY2x1ZGluZyBqcGVnbGliLmggc2hvdWxkIG1ha2UgaXQgd29yay4KKyAqLworCisjaWZuZGVmIEhBVkVfQk9PTEVBTgordHlwZWRlZiBpbnQgYm9vbGVhbjsKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQkJCS8qIGluIGNhc2UgdGhlc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QgKi8KKyNkZWZpbmUgRkFMU0UJMAkJLyogdmFsdWVzIG9mIGJvb2xlYW4gKi8KKyNlbmRpZgorI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUJMQorI2VuZGlmCisKKworLyoKKyAqIFRoZSByZW1haW5pbmcgb3B0aW9ucyBhZmZlY3QgY29kZSBzZWxlY3Rpb24gd2l0aGluIHRoZSBKUEVHIGxpYnJhcnksCisgKiBidXQgdGhleSBkb24ndCBuZWVkIHRvIGJlIHZpc2libGUgdG8gbW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgb3IgSlBFR19JTlRFUk5BTF9PUFRJT05TIGhhcyBiZWVuIGRlZmluZWQuCisgKi8KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisjZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUworI2VuZGlmCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMX09QVElPTlMKKworCisvKgorICogVGhlc2UgZGVmaW5lcyBpbmRpY2F0ZSB3aGV0aGVyIHRvIGluY2x1ZGUgdmFyaW91cyBvcHRpb25hbCBmdW5jdGlvbnMuCisgKiBVbmRlZmluaW5nIHNvbWUgb2YgdGhlc2Ugc3ltYm9scyB3aWxsIHByb2R1Y2UgYSBzbWFsbGVyIGJ1dCBsZXNzIGNhcGFibGUKKyAqIGxpYnJhcnkuICBOb3RlIHRoYXQgeW91IGNhbiBsZWF2ZSBjZXJ0YWluIHNvdXJjZSBmaWxlcyBvdXQgb2YgdGhlCisgKiBjb21waWxhdGlvbi9saW5raW5nIHByb2Nlc3MgaWYgeW91J3ZlICN1bmRlZidkIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbHMuCisgKiAoWW91IG1heSBIQVZFIHRvIGRvIHRoYXQgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGxpa2UgbnVsbCBzb3VyY2UgZmlsZXMuKQorICovCisKKy8qIEFyaXRobWV0aWMgY29kaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLiAgQ29tcGxhaW50cyB0byBJQk0uICovCisKKy8qIENhcGFiaWxpdHkgb3B0aW9ucyBjb21tb24gdG8gZW5jb2RlciBhbmQgZGVjb2RlcjogKi8KKworI2RlZmluZSBEQ1RfSVNMT1dfU1VQUE9SVEVECS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCisjZGVmaW5lIERDVF9JRkFTVF9TVVBQT1JURUQJLyogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kICovCisjZGVmaW5lIERDVF9GTE9BVF9TVVBQT1JURUQJLyogZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFcgKi8KKworLyogRW5jb2RlciBjYXBhYmlsaXR5IG9wdGlvbnM6ICovCisKKyN1bmRlZiAgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVEICAgIC8qIEFyaXRobWV0aWMgY29kaW5nIGJhY2sgZW5kPyAqLworI2RlZmluZSBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgLyogTXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzPyAqLworI2RlZmluZSBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAkgICAgLyogUHJvZ3Jlc3NpdmUgSlBFRz8gKFJlcXVpcmVzIE1VTFRJU0NBTikqLworI2RlZmluZSBFTlRST1BZX09QVF9TVVBQT1JURUQJICAgIC8qIE9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGNvZGluZyBwYXJtcz8gKi8KKy8qIE5vdGU6IGlmIHlvdSBzZWxlY3RlZCAxMi1iaXQgZGF0YSBwcmVjaXNpb24sIGl0IGlzIGRhbmdlcm91cyB0byB0dXJuIG9mZgorICogRU5UUk9QWV9PUFRfU1VQUE9SVEVELiAgVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IGdvb2QgZm9yIDgtYml0CisgKiBwcmVjaXNpb24sIHNvIGpjaHVmZi5jIG5vcm1hbGx5IHVzZXMgZW50cm9weSBvcHRpbWl6YXRpb24gdG8gY29tcHV0ZQorICogdXNhYmxlIHRhYmxlcyBmb3IgaGlnaGVyIHByZWNpc2lvbi4gIElmIHlvdSBkb24ndCB3YW50IHRvIGRvIG9wdGltaXphdGlvbiwKKyAqIHlvdSdsbCBoYXZlIHRvIHN1cHBseSBkaWZmZXJlbnQgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KKyAqIFRoZSBleGFjdCBzYW1lIHN0YXRlbWVudHMgYXBwbHkgZm9yIHByb2dyZXNzaXZlIEpQRUc6IHRoZSBkZWZhdWx0IHRhYmxlcworICogZG9uJ3Qgd29yayBmb3IgcHJvZ3Jlc3NpdmUgbW9kZS4gIChUaGlzIG1heSBnZXQgZml4ZWQsIGhvd2V2ZXIuKQorICovCisjZGVmaW5lIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgICAvKiBJbnB1dCBpbWFnZSBzbW9vdGhpbmcgb3B0aW9uPyAqLworCisvKiBEZWNvZGVyIGNhcGFiaWxpdHkgb3B0aW9uczogKi8KKworI3VuZGVmICBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCisjZGVmaW5lIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCisjZGVmaW5lIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCisjZGVmaW5lIFNBVkVfTUFSS0VSU19TVVBQT1JURUQJICAgIC8qIGpwZWdfc2F2ZV9tYXJrZXJzKCkgbmVlZGVkPyAqLworI2RlZmluZSBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICAgLyogQmxvY2sgc21vb3RoaW5nPyAoUHJvZ3Jlc3NpdmUgb25seSkgKi8KKyNkZWZpbmUgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAkgICAgLyogT3V0cHV0IHJlc2NhbGluZyB2aWEgSURDVD8gKi8KKyN1bmRlZiAgVVBTQU1QTEVfU0NBTElOR19TVVBQT1JURUQgIC8qIE91dHB1dCByZXNjYWxpbmcgYXQgdXBzYW1wbGUgc3RhZ2U/ICovCisjZGVmaW5lIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICAvKiBGYXN0IHBhdGggZm9yIHNsb3BweSB1cHNhbXBsaW5nPyAqLworI2RlZmluZSBRVUFOVF8xUEFTU19TVVBQT1JURUQJICAgIC8qIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24/ICovCisjZGVmaW5lIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkgICAgLyogMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbj8gKi8KKworLyogbW9yZSBjYXBhYmlsaXR5IG9wdGlvbnMgbGF0ZXIsIG5vIGRvdWJ0ICovCisKKworLyoKKyAqIE9yZGVyaW5nIG9mIFJHQiBkYXRhIGluIHNjYW5saW5lcyBwYXNzZWQgdG8gb3IgZnJvbSB0aGUgYXBwbGljYXRpb24uCisgKiBJZiB5b3VyIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRlYWwgd2l0aCBkYXRhIGluIHRoZSBvcmRlciBCLEcsUiwganVzdAorICogY2hhbmdlIHRoZXNlIG1hY3Jvcy4gIFlvdSBjYW4gYWxzbyBkZWFsIHdpdGggZm9ybWF0cyBzdWNoIGFzIFIsRyxCLFgKKyAqIChvbmUgZXh0cmEgYnl0ZSBwZXIgcGl4ZWwpIGJ5IGNoYW5naW5nIFJHQl9QSVhFTFNJWkUuICBOb3RlIHRoYXQgY2hhbmdpbmcKKyAqIHRoZSBvZmZzZXRzIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIGNvbG9ybWFwIGRhdGEgaXMgb3JnYW5pemVkLgorICogUkVTVFJJQ1RJT05TOgorICogMS4gVGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcsZGpwZWcgZG8gTk9UIHN1cHBvcnQgbW9kaWZpZWQgUkdCIGZvcm1hdHMuCisgKiAyLiBUaGVzZSBtYWNyb3Mgb25seSBhZmZlY3QgUkdCPD0+WUNiQ3IgY29sb3IgY29udmVyc2lvbiwgc28gdGhleSBhcmUgbm90CisgKiAgICB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBKUEVHIGNvbG9yIHNwYWNlcyBvdGhlciB0aGFuIFlDYkNyIG9yIGdyYXlzY2FsZS4KKyAqIDMuIFRoZSBjb2xvciBxdWFudGl6ZXIgbW9kdWxlcyB3aWxsIG5vdCBiZWhhdmUgZGVzaXJhYmx5IGlmIFJHQl9QSVhFTFNJWkUKKyAqICAgIGlzIG5vdCAzICh0aGV5IGRvbid0IHVuZGVyc3RhbmQgYWJvdXQgZHVtbXkgY29sb3IgY29tcG9uZW50cyEpLiAgU28geW91CisgKiAgICBjYW4ndCB1c2UgY29sb3IgcXVhbnRpemF0aW9uIGlmIHlvdSBjaGFuZ2UgdGhhdCB2YWx1ZS4KKyAqLworCisjZGVmaW5lIFJHQl9SRUQJCTAJLyogT2Zmc2V0IG9mIFJlZCBpbiBhbiBSR0Igc2NhbmxpbmUgZWxlbWVudCAqLworI2RlZmluZSBSR0JfR1JFRU4JMQkvKiBPZmZzZXQgb2YgR3JlZW4gKi8KKyNkZWZpbmUgUkdCX0JMVUUJMgkvKiBPZmZzZXQgb2YgQmx1ZSAqLworI2lmZGVmIEFORFJPSURfUkdCCisjZGVmaW5lIFJHQl9BTFBIQSAgIDMgICAvKiBPZmZzZXQgb2YgQWxwaGEgKi8KKyNlbmRpZgorI2RlZmluZSBSR0JfUElYRUxTSVpFICAgMyAgIC8qIEpTQU1QTEVzIHBlciBSR0Igc2NhbmxpbmUgZWxlbWVudCAqLworCisvKiBEZWZpbml0aW9ucyBmb3Igc3BlZWQtcmVsYXRlZCBvcHRpbWl6YXRpb25zLiAqLworCisKKy8qIElmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lIGZ1bmN0aW9ucywgZGVmaW5lIElOTElORQorICogYXMgdGhlIGlubGluZSBrZXl3b3JkOyBvdGhlcndpc2UgZGVmaW5lIGl0IGFzIGVtcHR5LgorICovCisKKyNpZm5kZWYgSU5MSU5FCisjaWZkZWYgX19HTlVDX18JCQkvKiBmb3IgaW5zdGFuY2UsIEdOVSBDIGtub3dzIGFib3V0IGlubGluZSAqLworI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2VuZGlmCisjaWZuZGVmIElOTElORQorI2RlZmluZSBJTkxJTkUJCQkvKiBkZWZhdWx0IGlzIHRvIGRlZmluZSBpdCBhcyBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBPbiBzb21lIG1hY2hpbmVzIChub3RhYmx5IDY4MDAwIHNlcmllcykgImludCIgaXMgMzIgYml0cywgYnV0IG11bHRpcGx5aW5nCisgKiB0d28gMTYtYml0IHNob3J0cyBpcyBmYXN0ZXIgdGhhbiBtdWx0aXBseWluZyB0d28gaW50cy4gIERlZmluZSBNVUxUSVBMSUVSCisgKiBhcyBzaG9ydCBvbiBzdWNoIGEgbWFjaGluZS4gIE1VTFRJUExJRVIgbXVzdCBiZSBhdCBsZWFzdCAxNiBiaXRzIHdpZGUuCisgKi8KKworI2lmbmRlZiBNVUxUSVBMSUVSCisjZGVmaW5lIE1VTFRJUExJRVIgIGludAkJLyogdHlwZSBmb3IgZmFzdGVzdCBpbnRlZ2VyIG11bHRpcGx5ICovCisjZW5kaWYKKworCisvKiBGQVNUX0ZMT0FUIHNob3VsZCBiZSBlaXRoZXIgZmxvYXQgb3IgZG91YmxlLCB3aGljaGV2ZXIgaXMgZG9uZSBmYXN0ZXIKKyAqIGJ5IHlvdXIgY29tcGlsZXIuICAoTm90ZSB0aGF0IHRoaXMgdHlwZSBpcyBvbmx5IHVzZWQgaW4gdGhlIGZsb2F0aW5nIHBvaW50CisgKiBEQ1Qgcm91dGluZXMsIHNvIGl0IG9ubHkgbWF0dGVycyBpZiB5b3UndmUgZGVmaW5lZCBEQ1RfRkxPQVRfU1VQUE9SVEVELikKKyAqIFR5cGljYWxseSwgZmxvYXQgaXMgZmFzdGVyIGluIEFOU0kgQyBjb21waWxlcnMsIHdoaWxlIGRvdWJsZSBpcyBmYXN0ZXIgaW4KKyAqIHByZS1BTlNJIGNvbXBpbGVycyAoYmVjYXVzZSB0aGV5IGluc2lzdCBvbiBjb252ZXJ0aW5nIHRvIGRvdWJsZSBhbnl3YXkpLgorICogVGhlIGNvZGUgYmVsb3cgdGhlcmVmb3JlIGNob29zZXMgZmxvYXQgaWYgd2UgaGF2ZSBBTlNJLXN0eWxlIHByb3RvdHlwZXMuCisgKi8KKworI2lmbmRlZiBGQVNUX0ZMT0FUCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEZBU1RfRkxPQVQgIGZsb2F0CisjZWxzZQorI2RlZmluZSBGQVNUX0ZMT0FUICBkb3VibGUKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMX09QVElPTlMgKi8KZGlmZiAtLWdpdCBhL2pwZWdpbnQuaCBiL2pwZWdpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWIwMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvanBlZ2ludC5oCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICoganBlZ2ludC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHZhcmlvdXMgSlBFRyBtb2R1bGVzLgorICogVGhlc2UgZGVjbGFyYXRpb25zIGFyZSBjb25zaWRlcmVkIGludGVybmFsIHRvIHRoZSBKUEVHIGxpYnJhcnk7IG1vc3QKKyAqIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGRuJ3QgbmVlZCB0byBpbmNsdWRlIHRoaXMgZmlsZS4KKyAqLworCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgYm90aCBjb21wcmVzc2lvbiAmIGRlY29tcHJlc3Npb24gKi8KKwordHlwZWRlZiBlbnVtIHsJCQkvKiBPcGVyYXRpbmcgbW9kZXMgZm9yIGJ1ZmZlciBjb250cm9sbGVycyAqLworCUpCVUZfUEFTU19USFJVLAkJLyogUGxhaW4gc3RyaXB3aXNlIG9wZXJhdGlvbiAqLworCS8qIFJlbWFpbmluZyBtb2RlcyByZXF1aXJlIGEgZnVsbC1pbWFnZSBidWZmZXIgdG8gaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KKwlKQlVGX1NBVkVfU09VUkNFLAkvKiBSdW4gc291cmNlIHN1Ym9iamVjdCBvbmx5LCBzYXZlIG91dHB1dCAqLworCUpCVUZfQ1JBTktfREVTVCwJLyogUnVuIGRlc3Qgc3Vib2JqZWN0IG9ubHksIHVzaW5nIHNhdmVkIGRhdGEgKi8KKwlKQlVGX1NBVkVfQU5EX1BBU1MJLyogUnVuIGJvdGggc3Vib2JqZWN0cywgc2F2ZSBvdXRwdXQgKi8KK30gSl9CVUZfTU9ERTsKKworLyogVmFsdWVzIG9mIGdsb2JhbF9zdGF0ZSBmaWVsZCAoamRhcGkuYyBoYXMgc29tZSBkZXBlbmRlbmNpZXMgb24gb3JkZXJpbmchKSAqLworI2RlZmluZSBDU1RBVEVfU1RBUlQJMTAwCS8qIGFmdGVyIGNyZWF0ZV9jb21wcmVzcyAqLworI2RlZmluZSBDU1RBVEVfU0NBTk5JTkcJMTAxCS8qIHN0YXJ0X2NvbXByZXNzIGRvbmUsIHdyaXRlX3NjYW5saW5lcyBPSyAqLworI2RlZmluZSBDU1RBVEVfUkFXX09LCTEwMgkvKiBzdGFydF9jb21wcmVzcyBkb25lLCB3cml0ZV9yYXdfZGF0YSBPSyAqLworI2RlZmluZSBDU1RBVEVfV1JDT0VGUwkxMDMJLyoganBlZ193cml0ZV9jb2VmZmljaWVudHMgZG9uZSAqLworI2RlZmluZSBEU1RBVEVfU1RBUlQJMjAwCS8qIGFmdGVyIGNyZWF0ZV9kZWNvbXByZXNzICovCisjZGVmaW5lIERTVEFURV9JTkhFQURFUgkyMDEJLyogcmVhZGluZyBoZWFkZXIgbWFya2Vycywgbm8gU09TIHlldCAqLworI2RlZmluZSBEU1RBVEVfUkVBRFkJMjAyCS8qIGZvdW5kIFNPUywgcmVhZHkgZm9yIHN0YXJ0X2RlY29tcHJlc3MgKi8KKyNkZWZpbmUgRFNUQVRFX1BSRUxPQUQJMjAzCS8qIHJlYWRpbmcgbXVsdGlzY2FuIGZpbGUgaW4gc3RhcnRfZGVjb21wcmVzcyovCisjZGVmaW5lIERTVEFURV9QUkVTQ0FOCTIwNAkvKiBwZXJmb3JtaW5nIGR1bW15IHBhc3MgZm9yIDItcGFzcyBxdWFudCAqLworI2RlZmluZSBEU1RBVEVfU0NBTk5JTkcJMjA1CS8qIHN0YXJ0X2RlY29tcHJlc3MgZG9uZSwgcmVhZF9zY2FubGluZXMgT0sgKi8KKyNkZWZpbmUgRFNUQVRFX1JBV19PSwkyMDYJLyogc3RhcnRfZGVjb21wcmVzcyBkb25lLCByZWFkX3Jhd19kYXRhIE9LICovCisjZGVmaW5lIERTVEFURV9CVUZJTUFHRQkyMDcJLyogZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0ICovCisjZGVmaW5lIERTVEFURV9CVUZQT1NUCTIwOAkvKiBsb29raW5nIGZvciBTT1MvRU9JIGluIGpwZWdfZmluaXNoX291dHB1dCAqLworI2RlZmluZSBEU1RBVEVfUkRDT0VGUwkyMDkJLyogcmVhZGluZyBmaWxlIGluIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgRFNUQVRFX1NUT1BQSU5HCTIxMAkvKiBsb29raW5nIGZvciBFT0kgaW4ganBlZ19maW5pc2hfZGVjb21wcmVzcyAqLworCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgY29tcHJlc3Npb24gbW9kdWxlcyAqLworCisvKiBNYXN0ZXIgY29udHJvbCBtb2R1bGUgKi8KK3N0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBwcmVwYXJlX2Zvcl9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBwYXNzX3N0YXJ0dXAsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgYm9vbGVhbiBjYWxsX3Bhc3Nfc3RhcnR1cDsJLyogVHJ1ZSBpZiBwYXNzX3N0YXJ0dXAgbXVzdCBiZSBjYWxsZWQgKi8KKyAgYm9vbGVhbiBpc19sYXN0X3Bhc3M7CQkvKiBUcnVlIGR1cmluZyBsYXN0IHBhc3MgKi8KK307CisKKy8qIE1haW4gYnVmZmVyIGNvbnRyb2wgKGRvd25zYW1wbGVkLWRhdGEgYnVmZmVyKSAqLworc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKKyAgSk1FVEhPRCh2b2lkLCBwcm9jZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKK307CisKKy8qIENvbXByZXNzaW9uIHByZXByb2Nlc3NpbmcgKGRvd25zYW1wbGluZyBpbnB1dCBidWZmZXIgY29udHJvbCkgKi8KK3N0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7CisgIEpNRVRIT0Qodm9pZCwgcHJlX3Byb2Nlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkJCSAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCisJCQkJICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAorCQkJCSAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJCQkgICBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJCQkgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKSk7Cit9OworCisvKiBDb2VmZmljaWVudCBidWZmZXIgY29udHJvbCAqLworc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKKyAgSk1FVEhPRChib29sZWFuLCBjb21wcmVzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKK307CisKKy8qIENvbG9yc3BhY2UgY29udmVyc2lvbiAqLworc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBjb2xvcl9jb252ZXJ0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJCQlKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykpOworfTsKKworLyogRG93bnNhbXBsaW5nICovCitzdHJ1Y3QganBlZ19kb3duc2FtcGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfaW5kZXgsCisJCQkgICAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3VwX2luZGV4KSk7CisKKyAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogVFJVRSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLworfTsKKworLyogRm9yd2FyZCBEQ1QgKGFsc28gY29udHJvbHMgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uKSAqLworc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICAvKiBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIGFuIGFycmF5Pz8/ICovCisgIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1QsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkJICAgICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAorCQkJICAgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAorCQkJICAgICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKSk7Cit9OworCisvKiBFbnRyb3B5IGVuY29kaW5nICovCitzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljcykpOworICBKTUVUSE9EKGJvb2xlYW4sIGVuY29kZV9tY3UsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK307CisKKy8qIE1hcmtlciB3cml0aW5nICovCitzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9maWxlX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfZnJhbWVfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9zY2FuX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfZmlsZV90cmFpbGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV90YWJsZXNfb25seSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIFRoZXNlIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0byBhbGxvdyBpbnNlcnRpb24gb2YgZXh0cmEgbWFya2VycyAqLworICAvKiBQcm9iYWJseSBvbmx5IENPTSBhbmQgQVBQbiBtYXJrZXJzIHNob3VsZCBiZSB3cml0dGVuIHRoaXMgd2F5ICovCisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2J5dGUsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkpOworfTsKKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIGRlY29tcHJlc3Npb24gbW9kdWxlcyAqLworCisvKiBNYXN0ZXIgY29udHJvbCBtb2R1bGUgKi8KK3N0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgeworICBKTUVUSE9EKHZvaWQsIHByZXBhcmVfZm9yX291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgYm9vbGVhbiBpc19kdW1teV9wYXNzOwkvKiBUcnVlIGR1cmluZyAxc3QgcGFzcyBmb3IgMi1wYXNzIHF1YW50ICovCit9OworCisvKiBJbnB1dCBjb250cm9sIG1vZHVsZSAqLworc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciB7CisgIEpNRVRIT0QoaW50LCBjb25zdW1lX2lucHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHJlc2V0X2lucHV0X2NvbnRyb2xsZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfaW5wdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgYm9vbGVhbiBoYXNfbXVsdGlwbGVfc2NhbnM7CS8qIFRydWUgaWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMgKi8KKyAgYm9vbGVhbiBlb2lfcmVhY2hlZDsJCS8qIFRydWUgd2hlbiBFT0kgaGFzIGJlZW4gY29uc3VtZWQgKi8KK307CisKKy8qIE1haW4gYnVmZmVyIGNvbnRyb2wgKGRvd25zYW1wbGVkLWRhdGEgYnVmZmVyKSAqLworc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKHZvaWQsIHByb2Nlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCSAgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Cit9OworCisvKiBDb2VmZmljaWVudCBidWZmZXIgY29udHJvbCAqLworc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoaW50LCBjb25zdW1lX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfb3V0cHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoaW50LCBkZWNvbXByZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKKyAgLyogUG9pbnRlciB0byBhcnJheSBvZiBjb2VmZmljaWVudCB2aXJ0dWFsIGFycmF5cywgb3IgTlVMTCBpZiBub25lICovCisgIGp2aXJ0X2JhcnJheV9wdHIgKmNvZWZfYXJyYXlzOworfTsKKworLyogRGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZyAoY29sb3IgcXVhbnRpemF0aW9uIGJ1ZmZlciBjb250cm9sKSAqLworc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKHZvaWQsIHBvc3RfcHJvY2Vzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsCisJCQkJICAgIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJCQkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCQkJCSAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworfTsKKworLyogTWFya2VyIHJlYWRpbmcgJiBwYXJzaW5nICovCitzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHsKKyAgSk1FVEhPRCh2b2lkLCByZXNldF9tYXJrZXJfcmVhZGVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICAvKiBSZWFkIG1hcmtlcnMgdW50aWwgU09TIG9yIEVPSS4KKyAgICogUmV0dXJucyBzYW1lIGNvZGVzIGFzIGFyZSBkZWZpbmVkIGZvciBqcGVnX2NvbnN1bWVfaW5wdXQ6CisgICAqIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgorICAgKi8KKyAgSk1FVEhPRChpbnQsIHJlYWRfbWFya2VycywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgLyogUmVhZCBhIHJlc3RhcnQgbWFya2VyIC0tLSBleHBvcnRlZCBmb3IgdXNlIGJ5IGVudHJvcHkgZGVjb2RlciBvbmx5ICovCisgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcmVhZF9yZXN0YXJ0X21hcmtlcjsKKworICAvKiBTdGF0ZSBvZiBtYXJrZXIgcmVhZGVyIC0tLSBub21pbmFsbHkgaW50ZXJuYWwsIGJ1dCBhcHBsaWNhdGlvbnMKKyAgICogc3VwcGx5aW5nIENPTSBvciBBUFBuIGhhbmRsZXJzIG1pZ2h0IGxpa2UgdG8ga25vdyB0aGUgc3RhdGUuCisgICAqLworICBib29sZWFuIHNhd19TT0k7CQkvKiBmb3VuZCBTT0k/ICovCisgIGJvb2xlYW4gc2F3X1NPRjsJCS8qIGZvdW5kIFNPRj8gKi8KKyAgaW50IG5leHRfcmVzdGFydF9udW07CQkvKiBuZXh0IHJlc3RhcnQgbnVtYmVyIGV4cGVjdGVkICgwLTcpICovCisgIHVuc2lnbmVkIGludCBkaXNjYXJkZWRfYnl0ZXM7CS8qICMgb2YgYnl0ZXMgc2tpcHBlZCBsb29raW5nIGZvciBhIG1hcmtlciAqLworfTsKKworLyogRW50cm9weSBkZWNvZGluZyAqLworc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIGRlY29kZV9tY3UsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCUpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKKworICAvKiBUaGlzIGlzIGhlcmUgdG8gc2hhcmUgY29kZSBiZXR3ZWVuIGJhc2VsaW5lIGFuZCBwcm9ncmVzc2l2ZSBkZWNvZGVyczsgKi8KKyAgLyogb3RoZXIgbW9kdWxlcyBwcm9iYWJseSBzaG91bGQgbm90IHVzZSBpdCAqLworICBib29sZWFuIGluc3VmZmljaWVudF9kYXRhOwkvKiBzZXQgVFJVRSBhZnRlciBlbWl0dGluZyB3YXJuaW5nICovCit9OworCisvKiBJbnZlcnNlIERDVCAoYWxzbyBwZXJmb3JtcyBkZXF1YW50aXphdGlvbikgKi8KK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBpbnZlcnNlX0RDVF9tZXRob2RfcHRyLAorCQkoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKKworc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIEl0IGlzIHVzZWZ1bCB0byBhbGxvdyBlYWNoIGNvbXBvbmVudCB0byBoYXZlIGEgc2VwYXJhdGUgSURDVCBtZXRob2QuICovCisgIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1RbTUFYX0NPTVBPTkVOVFNdOworfTsKKworLyogVXBzYW1wbGluZyAobm90ZSB0aGF0IHVwc2FtcGxlciBtdXN0IGFsc28gY2FsbCBjb2xvciBjb252ZXJ0ZXIpICovCitzdHJ1Y3QganBlZ191cHNhbXBsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgdXBzYW1wbGUsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsCisJCQkgICBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkJICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCQkJICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisKKyAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogVFJVRSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLworfTsKKworLyogQ29sb3JzcGFjZSBjb252ZXJzaW9uICovCitzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBjb2xvcl9jb252ZXJ0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQlKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCQkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpKTsKK307CisKKy8qIENvbG9yIHF1YW50aXphdGlvbiBvciBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uICovCitzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3ByZV9zY2FuKSk7CisgIEpNRVRIT0Qodm9pZCwgY29sb3JfcXVhbnRpemUsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCQkJCSBpbnQgbnVtX3Jvd3MpKTsKKyAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBuZXdfY29sb3JfbWFwLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworCisvKiBNaXNjZWxsYW5lb3VzIHVzZWZ1bCBtYWNyb3MgKi8KKworI3VuZGVmIE1BWAorI2RlZmluZSBNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI3VuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCisKKy8qIFdlIGFzc3VtZSB0aGF0IHJpZ2h0IHNoaWZ0IGNvcnJlc3BvbmRzIHRvIHNpZ25lZCBkaXZpc2lvbiBieSAyIHdpdGgKKyAqIHJvdW5kaW5nIHRvd2FyZHMgbWludXMgaW5maW5pdHkuICBUaGlzIGlzIGNvcnJlY3QgZm9yIHR5cGljYWwgImFyaXRobWV0aWMKKyAqIHNoaWZ0IiBpbnN0cnVjdGlvbnMgdGhhdCBzaGlmdCBpbiBjb3BpZXMgb2YgdGhlIHNpZ24gYml0LiAgQnV0IHNvbWUKKyAqIEMgY29tcGlsZXJzIGltcGxlbWVudCA+PiB3aXRoIGFuIHVuc2lnbmVkIHNoaWZ0LiAgRm9yIHRoZXNlIG1hY2hpbmVzIHlvdQorICogbXVzdCBkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQuCisgKiBSSUdIVF9TSElGVCBwcm92aWRlcyBhIHByb3BlciBzaWduZWQgcmlnaHQgc2hpZnQgb2YgYW4gSU5UMzIgcXVhbnRpdHkuCisgKiBJdCBpcyBvbmx5IGFwcGxpZWQgd2l0aCBjb25zdGFudCBzaGlmdCBjb3VudHMuICBTSElGVF9URU1QUyBtdXN0IGJlCisgKiBpbmNsdWRlZCBpbiB0aGUgdmFyaWFibGVzIG9mIGFueSByb3V0aW5lIHVzaW5nIFJJR0hUX1NISUZULgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBTSElGVF9URU1QUwlJTlQzMiBzaGlmdF90ZW1wOworI2RlZmluZSBSSUdIVF9TSElGVCh4LHNoZnQpICBcCisJKChzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCisJIChzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4oKElOVDMyKSAwKSkgPDwgKDMyLShzaGZ0KSkpIDogXAorCSAoc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgU0hJRlRfVEVNUFMKKyNkZWZpbmUgUklHSFRfU0hJRlQoeCxzaGZ0KQkoKHgpID4+IChzaGZ0KSkKKyNlbmRpZgorCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqaW5pdF9jb21wcmVzc19tYXN0ZXIJaklDb21wcmVzcworI2RlZmluZSBqaW5pdF9jX21hc3Rlcl9jb250cm9sCWpJQ01hc3RlcgorI2RlZmluZSBqaW5pdF9jX21haW5fY29udHJvbGxlcglqSUNNYWluQworI2RlZmluZSBqaW5pdF9jX3ByZXBfY29udHJvbGxlcglqSUNQcmVwQworI2RlZmluZSBqaW5pdF9jX2NvZWZfY29udHJvbGxlcglqSUNDb2VmQworI2RlZmluZSBqaW5pdF9jb2xvcl9jb252ZXJ0ZXIJaklDQ29sb3IKKyNkZWZpbmUgamluaXRfZG93bnNhbXBsZXIJaklEb3duc2FtcGxlcgorI2RlZmluZSBqaW5pdF9mb3J3YXJkX2RjdAlqSUZEQ1QKKyNkZWZpbmUgamluaXRfaHVmZl9lbmNvZGVyCWpJSEVuY29kZXIKKyNkZWZpbmUgamluaXRfcGh1ZmZfZW5jb2RlcglqSVBIRW5jb2RlcgorI2RlZmluZSBqaW5pdF9tYXJrZXJfd3JpdGVyCWpJTVdyaXRlcgorI2RlZmluZSBqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcwlqSURNYXN0ZXIKKyNkZWZpbmUgamluaXRfZF9tYWluX2NvbnRyb2xsZXIJaklETWFpbkMKKyNkZWZpbmUgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIJaklEQ29lZkMKKyNkZWZpbmUgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIJaklEUG9zdEMKKyNkZWZpbmUgamluaXRfaW5wdXRfY29udHJvbGxlcglqSUluQ3RscgorI2RlZmluZSBqaW5pdF9tYXJrZXJfcmVhZGVyCWpJTVJlYWRlcgorI2RlZmluZSBqaW5pdF9odWZmX2RlY29kZXIJaklIRGVjb2RlcgorI2RlZmluZSBqaW5pdF9waHVmZl9kZWNvZGVyCWpJUEhEZWNvZGVyCisjZGVmaW5lIGppbml0X2ludmVyc2VfZGN0CWpJSURDVAorI2RlZmluZSBqaW5pdF91cHNhbXBsZXIJCWpJVXBzYW1wbGVyCisjZGVmaW5lIGppbml0X2NvbG9yX2RlY29udmVydGVyCWpJRENvbG9yCisjZGVmaW5lIGppbml0XzFwYXNzX3F1YW50aXplcglqSTFRdWFudAorI2RlZmluZSBqaW5pdF8ycGFzc19xdWFudGl6ZXIJakkyUXVhbnQKKyNkZWZpbmUgamluaXRfbWVyZ2VkX3Vwc2FtcGxlcglqSU1VcHNhbXBsZXIKKyNkZWZpbmUgamluaXRfbWVtb3J5X21ncglqSU1lbU1ncgorI2RlZmluZSBqZGl2X3JvdW5kX3VwCQlqRGl2Um91bmQKKyNkZWZpbmUganJvdW5kX3VwCQlqUm91bmQKKyNkZWZpbmUgamNvcHlfc2FtcGxlX3Jvd3MJakNvcHlTYW1wbGVzCisjZGVmaW5lIGpjb3B5X2Jsb2NrX3JvdwkJakNvcHlCbG9ja3MKKyNkZWZpbmUganplcm9fZmFyCQlqWmVyb0ZhcgorI2RlZmluZSBqcGVnX3ppZ3phZ19vcmRlcglqWklHVGFibGUKKyNkZWZpbmUganBlZ19uYXR1cmFsX29yZGVyCWpaQUdUYWJsZQorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKiBDb21wcmVzc2lvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KK0VYVEVSTih2b2lkKSBqaW5pdF9jb21wcmVzc19tYXN0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2NfbWFzdGVyX2NvbnRyb2wgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJIGJvb2xlYW4gdHJhbnNjb2RlX29ubHkpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jX21haW5fY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2NfcHJlcF9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfY19jb2VmX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jb2xvcl9jb252ZXJ0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2Rvd25zYW1wbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9mb3J3YXJkX2RjdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfaHVmZl9lbmNvZGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9waHVmZl9lbmNvZGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9tYXJrZXJfd3JpdGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKy8qIERlY29tcHJlc3Npb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitFWFRFUk4odm9pZCkgamluaXRfbWFzdGVyX2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfZF9tYWluX2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2RfY29lZl9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfaW5wdXRfY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9tYXJrZXJfcmVhZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2h1ZmZfZGVjb2RlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9waHVmZl9kZWNvZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2ludmVyc2VfZGN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X3Vwc2FtcGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF8xcGFzc19xdWFudGl6ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfMnBhc3NfcXVhbnRpemVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X21lcmdlZF91cHNhbXBsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisvKiBNZW1vcnkgbWFuYWdlciBpbml0aWFsaXphdGlvbiAqLworRVhURVJOKHZvaWQpIGppbml0X21lbW9yeV9tZ3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworLyogVXRpbGl0eSByb3V0aW5lcyBpbiBqdXRpbHMuYyAqLworRVhURVJOKGxvbmcpIGpkaXZfcm91bmRfdXAgSlBQKChsb25nIGEsIGxvbmcgYikpOworRVhURVJOKGxvbmcpIGpyb3VuZF91cCBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7CitFWFRFUk4odm9pZCkgamNvcHlfc2FtcGxlX3Jvd3MgSlBQKChKU0FNUEFSUkFZIGlucHV0X2FycmF5LCBpbnQgc291cmNlX3JvdywKKwkJCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYXJyYXksIGludCBkZXN0X3JvdywKKwkJCQkgICAgaW50IG51bV9yb3dzLCBKRElNRU5TSU9OIG51bV9jb2xzKSk7CitFWFRFUk4odm9pZCkgamNvcHlfYmxvY2tfcm93IEpQUCgoSkJMT0NLUk9XIGlucHV0X3JvdywgSkJMT0NLUk9XIG91dHB1dF9yb3csCisJCQkJICBKRElNRU5TSU9OIG51bV9ibG9ja3MpKTsKK0VYVEVSTih2b2lkKSBqemVyb19mYXIgSlBQKCh2b2lkIEZBUiAqIHRhcmdldCwgc2l6ZV90IGJ5dGVzdG96ZXJvKSk7CisvKiBDb25zdGFudCB0YWJsZXMgaW4ganV0aWxzLmMgKi8KKyNpZiAwCQkJCS8qIFRoaXMgdGFibGUgaXMgbm90IGFjdHVhbGx5IG5lZWRlZCBpbiB2NmEgKi8KK2V4dGVybiBjb25zdCBpbnQganBlZ196aWd6YWdfb3JkZXJbXTsgLyogbmF0dXJhbCBjb2VmIG9yZGVyIHRvIHppZ3phZyBvcmRlciAqLworI2VuZGlmCitleHRlcm4gY29uc3QgaW50IGpwZWdfbmF0dXJhbF9vcmRlcltdOyAvKiB6aWd6YWcgY29lZiBvcmRlciB0byBuYXR1cmFsIG9yZGVyICovCisKKy8qIFN1cHByZXNzIHVuZGVmaW5lZC1zdHJ1Y3R1cmUgY29tcGxhaW50cyBpZiBuZWNlc3NhcnkuICovCisKKyNpZmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorI2lmbmRlZiBBTV9NRU1PUllfTUFOQUdFUgkvKiBvbmx5IGptZW1tZ3IuYyBkZWZpbmVzIHRoZXNlICovCitzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKKyNlbmRpZgorI2VuZGlmIC8qIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOICovCmRpZmYgLS1naXQgYS9qcGVnbGliLmggYi9qcGVnbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzYTU0NwotLS0gL2Rldi9udWxsCisrKyBiL2pwZWdsaWIuaApAQCAtMCwwICsxLDExMDAgQEAKKy8qCisgKiBqcGVnbGliLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCisgKiBNb3N0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBuZWVkIG9ubHkgaW5jbHVkZSB0aGlzIGZpbGUsCisgKiBhbmQgcGVyaGFwcyBqZXJyb3IuaCBpZiB0aGV5IHdhbnQgdG8ga25vdyB0aGUgZXhhY3QgZXJyb3IgY29kZXMuCisgKi8KKworI2lmbmRlZiBKUEVHTElCX0gKKyNkZWZpbmUgSlBFR0xJQl9ICisKKy8qCisgKiBGaXJzdCB3ZSBpbmNsdWRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgcmVjb3JkIGhvdyB0aGlzCisgKiBpbnN0YWxsYXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeSBpcyBzZXQgdXAuICBqY29uZmlnLmggY2FuIGJlCisgKiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmb3IgbWFueSBzeXN0ZW1zLiAgam1vcmVjZmcuaCBjb250YWlucworICogbWFudWFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IG1vc3QgcGVvcGxlIG5lZWQgbm90IHdvcnJ5IGFib3V0LgorICovCisKKyNpZm5kZWYgSkNPTkZJR19JTkNMVURFRAkvKiBpbiBjYXNlIGppbmNsdWRlLmggYWxyZWFkeSBkaWQgKi8KKyNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiB3aWRlbHkgdXNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyNlbmRpZgorI2luY2x1ZGUgImptb3JlY2ZnLmgiCQkvKiBzZWxkb20gY2hhbmdlZCBvcHRpb25zICovCisKKworLyogVmVyc2lvbiBJRCBmb3IgdGhlIEpQRUcgbGlicmFyeS4KKyAqIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgdGVzdHMgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjAiLgorICovCisKKyNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTiAgNjIJLyogVmVyc2lvbiA2YiAqLworCisKKy8qIFZhcmlvdXMgY29uc3RhbnRzIGRldGVybWluaW5nIHRoZSBzaXplcyBvZiB0aGluZ3MuCisgKiBBbGwgb2YgdGhlc2UgYXJlIHNwZWNpZmllZCBieSB0aGUgSlBFRyBzdGFuZGFyZCwgc28gZG9uJ3QgY2hhbmdlIHRoZW0KKyAqIGlmIHlvdSB3YW50IHRvIGJlIGNvbXBhdGlibGUuCisgKi8KKworI2RlZmluZSBEQ1RTSVpFCQkgICAgOAkvKiBUaGUgYmFzaWMgRENUIGJsb2NrIGlzIDh4OCBzYW1wbGVzICovCisjZGVmaW5lIERDVFNJWkUyCSAgICA2NAkvKiBEQ1RTSVpFIHNxdWFyZWQ7ICMgb2YgZWxlbWVudHMgaW4gYSBibG9jayAqLworI2RlZmluZSBOVU1fUVVBTlRfVEJMUyAgICAgIDQJLyogUXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLworI2RlZmluZSBOVU1fSFVGRl9UQkxTICAgICAgIDQJLyogSHVmZm1hbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjMgKi8KKyNkZWZpbmUgTlVNX0FSSVRIX1RCTFMgICAgICAxNgkvKiBBcml0aC1jb2RpbmcgdGFibGVzIGFyZSBudW1iZXJlZCAwLi4xNSAqLworI2RlZmluZSBNQVhfQ09NUFNfSU5fU0NBTiAgIDQJLyogSlBFRyBsaW1pdCBvbiAjIG9mIGNvbXBvbmVudHMgaW4gb25lIHNjYW4gKi8KKyNkZWZpbmUgTUFYX1NBTVBfRkFDVE9SICAgICA0CS8qIEpQRUcgbGltaXQgb24gc2FtcGxpbmcgZmFjdG9ycyAqLworLyogVW5mb3J0dW5hdGVseSwgc29tZSBib3pvIGF0IEFkb2JlIHNhdyBubyByZWFzb24gdG8gYmUgYm91bmQgYnkgdGhlIHN0YW5kYXJkOworICogdGhlIFBvc3RTY3JpcHQgRENUIGZpbHRlciBjYW4gZW1pdCBmaWxlcyB3aXRoIG1hbnkgbW9yZSB0aGFuIDEwIGJsb2Nrcy9NQ1UuCisgKiBJZiB5b3UgaGFwcGVuIHRvIHJ1biBhY3Jvc3Mgc3VjaCBhIGZpbGUsIHlvdSBjYW4gdXAgRF9NQVhfQkxPQ0tTX0lOX01DVQorICogdG8gaGFuZGxlIGl0LiAgV2UgZXZlbiBsZXQgeW91IGRvIHRoaXMgZnJvbSB0aGUgamNvbmZpZy5oIGZpbGUuICBIb3dldmVyLAorICogd2Ugc3Ryb25nbHkgZGlzY291cmFnZSBjaGFuZ2luZyBDX01BWF9CTE9DS1NfSU5fTUNVOyBqdXN0IGJlY2F1c2UgQWRvYmUKKyAqIHNvbWV0aW1lcyBlbWl0cyBub25jb21wbGlhbnQgZmlsZXMgZG9lc24ndCBtZWFuIHlvdSBzaG91bGQgdG9vLgorICovCisjZGVmaW5lIENfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KKyNpZm5kZWYgRF9NQVhfQkxPQ0tTX0lOX01DVQorI2RlZmluZSBEX01BWF9CTE9DS1NfSU5fTUNVICAgMTAgLyogZGVjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KKyNlbmRpZgorCisKKy8qIERhdGEgc3RydWN0dXJlcyBmb3IgaW1hZ2VzIChhcnJheXMgb2Ygc2FtcGxlcyBhbmQgb2YgRENUIGNvZWZmaWNpZW50cykuCisgKiBPbiA4MHg4NiBtYWNoaW5lcywgdGhlIGltYWdlIGFycmF5cyBhcmUgdG9vIGJpZyBmb3IgbmVhciBwb2ludGVycywKKyAqIGJ1dCB0aGUgcG9pbnRlciBhcnJheXMgY2FuIGZpdCBpbiBuZWFyIG1lbW9yeS4KKyAqLworCit0eXBlZGVmIEpTQU1QTEUgRkFSICpKU0FNUFJPVzsJLyogcHRyIHRvIG9uZSBpbWFnZSByb3cgb2YgcGl4ZWwgc2FtcGxlcy4gKi8KK3R5cGVkZWYgSlNBTVBST1cgKkpTQU1QQVJSQVk7CS8qIHB0ciB0byBzb21lIHJvd3MgKGEgMi1EIHNhbXBsZSBhcnJheSkgKi8KK3R5cGVkZWYgSlNBTVBBUlJBWSAqSlNBTVBJTUFHRTsJLyogYSAzLUQgc2FtcGxlIGFycmF5OiB0b3AgaW5kZXggaXMgY29sb3IgKi8KKwordHlwZWRlZiBKQ09FRiBKQkxPQ0tbRENUU0laRTJdOwkvKiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzICovCit0eXBlZGVmIEpCTE9DSyBGQVIgKkpCTE9DS1JPVzsJLyogcG9pbnRlciB0byBvbmUgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwordHlwZWRlZiBKQkxPQ0tST1cgKkpCTE9DS0FSUkFZOwkJLyogYSAyLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCit0eXBlZGVmIEpCTE9DS0FSUkFZICpKQkxPQ0tJTUFHRTsJLyogYSAzLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCisKK3R5cGVkZWYgSkNPRUYgRkFSICpKQ09FRlBUUjsJLyogdXNlZnVsIGluIGEgY291cGxlIG9mIHBsYWNlcyAqLworCisKKy8qIFR5cGVzIGZvciBKUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgdGFibGVzLiAqLworCisKKy8qIERDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoaXMgYXJyYXkgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50IHF1YW50aXplcnMgaW4gbmF0dXJhbCBhcnJheSBvcmRlcgorICAgKiAobm90IHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc3RvcmVkIGluIGEgSlBFRyBEUVQgbWFya2VyKS4KKyAgICogQ0FVVElPTjogSUpHIHZlcnNpb25zIHByaW9yIHRvIHY2YSBrZXB0IHRoaXMgYXJyYXkgaW4gemlnemFnIG9yZGVyLgorICAgKi8KKyAgVUlOVDE2IHF1YW50dmFsW0RDVFNJWkUyXTsJLyogcXVhbnRpemF0aW9uIHN0ZXAgZm9yIGVhY2ggY29lZmZpY2llbnQgKi8KKyAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCisgICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgorICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCisgICAqIChTZWUganBlZ19zdXBwcmVzc190YWJsZXMgZm9yIGFuIGV4YW1wbGUuKQorICAgKi8KKyAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogVFJVRSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLworfSBKUVVBTlRfVEJMOworCisKKy8qIEh1ZmZtYW4gY29kaW5nIHRhYmxlcy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGVzZSB0d28gZmllbGRzIGRpcmVjdGx5IHJlcHJlc2VudCB0aGUgY29udGVudHMgb2YgYSBKUEVHIERIVCBtYXJrZXIgKi8KKyAgVUlOVDggYml0c1sxN107CQkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZXMgb2YgKi8KKwkJCQkvKiBsZW5ndGggayBiaXRzOyBiaXRzWzBdIGlzIHVudXNlZCAqLworICBVSU5UOCBodWZmdmFsWzI1Nl07CQkvKiBUaGUgc3ltYm9scywgaW4gb3JkZXIgb2YgaW5jciBjb2RlIGxlbmd0aCAqLworICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KKyAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCisgICAqLworICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCit9IEpIVUZGX1RCTDsKKworCisvKiBCYXNpYyBpbmZvIGFib3V0IG9uZSBjb21wb25lbnQgKGNvbG9yIGNoYW5uZWwpLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgZml4ZWQgb3ZlciB0aGUgd2hvbGUgaW1hZ2UuICovCisgIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KKyAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09GIG1hcmtlci4gKi8KKyAgaW50IGNvbXBvbmVudF9pZDsJCS8qIGlkZW50aWZpZXIgZm9yIHRoaXMgY29tcG9uZW50ICgwLi4yNTUpICovCisgIGludCBjb21wb25lbnRfaW5kZXg7CQkvKiBpdHMgaW5kZXggaW4gU09GIG9yIGNpbmZvLT5jb21wX2luZm9bXSAqLworICBpbnQgaF9zYW1wX2ZhY3RvcjsJCS8qIGhvcml6b250YWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLworICBpbnQgdl9zYW1wX2ZhY3RvcjsJCS8qIHZlcnRpY2FsIHNhbXBsaW5nIGZhY3RvciAoMS4uNCkgKi8KKyAgaW50IHF1YW50X3RibF9ubzsJCS8qIHF1YW50aXphdGlvbiB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KKyAgLyogVGhlc2UgdmFsdWVzIG1heSB2YXJ5IGJldHdlZW4gc2NhbnMuICovCisgIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KKyAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09TIG1hcmtlci4gKi8KKyAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCisgIGludCBkY190Ymxfbm87CQkvKiBEQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLworICBpbnQgYWNfdGJsX25vOwkJLyogQUMgZW50cm9weSB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUgYnkgYXBwbGljYXRpb25zLiAqLworCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gc3RhcnR1cDogKi8KKyAgLyogQ29tcG9uZW50J3Mgc2l6ZSBpbiBEQ1QgYmxvY2tzLgorICAgKiBBbnkgZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGNvbXBsZXRlIGFuIE1DVSBhcmUgbm90IGNvdW50ZWQ7IHRoZXJlZm9yZQorICAgKiB0aGVzZSB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB3aGV0aGVyIGEgc2NhbiBpcyBpbnRlcmxlYXZlZCBvciBub3QuCisgICAqLworICBKRElNRU5TSU9OIHdpZHRoX2luX2Jsb2NrczsKKyAgSkRJTUVOU0lPTiBoZWlnaHRfaW5fYmxvY2tzOworICAvKiBTaXplIG9mIGEgRENUIGJsb2NrIGluIHNhbXBsZXMuICBBbHdheXMgRENUU0laRSBmb3IgY29tcHJlc3Npb24uCisgICAqIEZvciBkZWNvbXByZXNzaW9uIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmcm9tIG9uZSBEQ1QgYmxvY2ssCisgICAqIHJlZmxlY3RpbmcgYW55IHNjYWxpbmcgd2UgY2hvb3NlIHRvIGFwcGx5IGR1cmluZyB0aGUgSURDVCBzdGVwLgorICAgKiBWYWx1ZXMgb2YgMSwyLDQsOCBhcmUgbGlrZWx5IHRvIGJlIHN1cHBvcnRlZC4gIE5vdGUgdGhhdCBkaWZmZXJlbnQKKyAgICogY29tcG9uZW50cyBtYXkgcmVjZWl2ZSBkaWZmZXJlbnQgSURDVCBzY2FsaW5ncy4KKyAgICovCisgIGludCBEQ1Rfc2NhbGVkX3NpemU7CisgIC8qIFRoZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIGFyZSB0aGUgY29tcG9uZW50J3MgYWN0dWFsLCB1bnBhZGRlZCBudW1iZXIKKyAgICogb2Ygc2FtcGxlcyBhdCB0aGUgbWFpbiBidWZmZXIgKHByZXByb2Nlc3NpbmcvY29tcHJlc3Npb24gaW50ZXJmYWNlKSwgdGh1cworICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4KQorICAgKiBhbmQgc2ltaWxhcmx5IGZvciBoZWlnaHQuICBGb3IgZGVjb21wcmVzc2lvbiwgSURDVCBzY2FsaW5nIGlzIGluY2x1ZGVkLCBzbworICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4ICogRENUX3NjYWxlZF9zaXplL0RDVFNJWkUpCisgICAqLworICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoOwkgLyogYWN0dWFsIHdpZHRoIGluIHNhbXBsZXMgKi8KKyAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF9oZWlnaHQ7IC8qIGFjdHVhbCBoZWlnaHQgaW4gc2FtcGxlcyAqLworICAvKiBUaGlzIGZsYWcgaXMgdXNlZCBvbmx5IGZvciBkZWNvbXByZXNzaW9uLiAgSW4gY2FzZXMgd2hlcmUgc29tZSBvZiB0aGUKKyAgICogY29tcG9uZW50cyB3aWxsIGJlIGlnbm9yZWQgKGVnIGdyYXlzY2FsZSBvdXRwdXQgZnJvbSBZQ2JDciBpbWFnZSksCisgICAqIHdlIGNhbiBza2lwIG1vc3QgY29tcHV0YXRpb25zIGZvciB0aGUgdW51c2VkIGNvbXBvbmVudHMuCisgICAqLworICBib29sZWFuIGNvbXBvbmVudF9uZWVkZWQ7CS8qIGRvIHdlIG5lZWQgdGhlIHZhbHVlIG9mIHRoaXMgY29tcG9uZW50PyAqLworCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgc2NhbiBvZiB0aGUgY29tcG9uZW50LiAqLworICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KKyAgaW50IE1DVV93aWR0aDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgaG9yaXpvbnRhbGx5ICovCisgIGludCBNQ1VfaGVpZ2h0OwkJLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgTUNVLCB2ZXJ0aWNhbGx5ICovCisgIGludCBNQ1VfYmxvY2tzOwkJLyogTUNVX3dpZHRoICogTUNVX2hlaWdodCAqLworICBpbnQgTUNVX3NhbXBsZV93aWR0aDsJCS8qIE1DVSB3aWR0aCBpbiBzYW1wbGVzLCBNQ1Vfd2lkdGgqRENUX3NjYWxlZF9zaXplICovCisgIGludCBsYXN0X2NvbF93aWR0aDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBhY3Jvc3MgaW4gbGFzdCBNQ1UgKi8KKyAgaW50IGxhc3Rfcm93X2hlaWdodDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBkb3duIGluIGxhc3QgTUNVICovCisKKyAgLyogU2F2ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGZvciBjb21wb25lbnQ7IE5VTEwgaWYgbm9uZSB5ZXQgc2F2ZWQuCisgICAqIFNlZSBqZGlucHV0LmMgY29tbWVudHMgYWJvdXQgdGhlIG5lZWQgZm9yIHRoaXMgaW5mb3JtYXRpb24uCisgICAqIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4KKyAgICovCisgIEpRVUFOVF9UQkwgKiBxdWFudF90YWJsZTsKKworICAvKiBQcml2YXRlIHBlci1jb21wb25lbnQgc3RvcmFnZSBmb3IgRENUIG9yIElEQ1Qgc3Vic3lzdGVtLiAqLworICB2b2lkICogZGN0X3RhYmxlOworfSBqcGVnX2NvbXBvbmVudF9pbmZvOworCisKKy8qIFRoZSBzY3JpcHQgZm9yIGVuY29kaW5nIGEgbXVsdGlwbGUtc2NhbiBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlOiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBjb21wc19pbl9zY2FuOwkJLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgZW5jb2RlZCBpbiB0aGlzIHNjYW4gKi8KKyAgaW50IGNvbXBvbmVudF9pbmRleFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIHRoZWlyIFNPRi9jb21wX2luZm9bXSBpbmRleGVzICovCisgIGludCBTcywgU2U7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzcGVjdHJhbCBzZWxlY3Rpb24gcGFybXMgKi8KKyAgaW50IEFoLCBBbDsJCQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHN1Y2Nlc3NpdmUgYXBwcm94LiBwYXJtcyAqLworfSBqcGVnX3NjYW5faW5mbzsKKworLyogVGhlIGRlY29tcHJlc3NvciBjYW4gc2F2ZSBBUFBuIGFuZCBDT00gbWFya2VycyBpbiBhIGxpc3Qgb2YgdGhlc2U6ICovCisKK3R5cGVkZWYgc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCBGQVIgKiBqcGVnX3NhdmVkX21hcmtlcl9wdHI7CisKK3N0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgeworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0LCBvciBOVUxMICovCisgIFVJTlQ4IG1hcmtlcjsJCQkvKiBtYXJrZXIgY29kZTogSlBFR19DT00sIG9yIEpQRUdfQVBQMCtuICovCisgIHVuc2lnbmVkIGludCBvcmlnaW5hbF9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBpbiB0aGUgZmlsZSAqLworICB1bnNpZ25lZCBpbnQgZGF0YV9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBzYXZlZCBhdCBkYXRhW10gKi8KKyAgSk9DVEVUIEZBUiAqIGRhdGE7CQkvKiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIG1hcmtlciAqLworICAvKiB0aGUgbWFya2VyIGxlbmd0aCB3b3JkIGlzIG5vdCBjb3VudGVkIGluIGRhdGFfbGVuZ3RoIG9yIG9yaWdpbmFsX2xlbmd0aCAqLworfTsKKworLyogS25vd24gY29sb3Igc3BhY2VzLiAqLworCit0eXBlZGVmIGVudW0geworCUpDU19VTktOT1dOLAkJLyogZXJyb3IvdW5zcGVjaWZpZWQgKi8KKwlKQ1NfR1JBWVNDQUxFLAkJLyogbW9ub2Nocm9tZSAqLworCUpDU19SR0IsCQkvKiByZWQvZ3JlZW4vYmx1ZSAqLworCUpDU19ZQ2JDciwJCS8qIFkvQ2IvQ3IgKGFsc28ga25vd24gYXMgWVVWKSAqLworCUpDU19DTVlLLAkJLyogQy9NL1kvSyAqLworCUpDU19ZQ0NLLAkJLyogWS9DYi9Dci9LICovCisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgICBKQ1NfUkdCQV84ODg4LCAgLyogcmVkL2dyZWVuL2JsdWUvYWxwaGEgKi8KKyAgICBKQ1NfUkdCXzU2NSAgICAgLyogcmVkL2dyZWVuL2JsdWUgaW4gNTY1IGZvcm1hdCAqLworI2VuZGlmCit9IEpfQ09MT1JfU1BBQ0U7CisKKy8qIERDVC9JRENUIGFsZ29yaXRobSBvcHRpb25zLiAqLworCit0eXBlZGVmIGVudW0geworCUpEQ1RfSVNMT1csCQkvKiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobSAqLworCUpEQ1RfSUZBU1QsCQkvKiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QgKi8KKwlKRENUX0ZMT0FUCQkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLworfSBKX0RDVF9NRVRIT0Q7CisKKyNpZm5kZWYgSkRDVF9ERUZBVUxUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgSkRDVF9ERUZBVUxUICBKRENUX0lTTE9XCisjZW5kaWYKKyNpZm5kZWYgSkRDVF9GQVNURVNUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgSkRDVF9GQVNURVNUICBKRENUX0lGQVNUCisjZW5kaWYKKworLyogRGl0aGVyaW5nIG9wdGlvbnMgZm9yIGRlY29tcHJlc3Npb24uICovCisKK3R5cGVkZWYgZW51bSB7CisJSkRJVEhFUl9OT05FLAkJLyogbm8gZGl0aGVyaW5nICovCisJSkRJVEhFUl9PUkRFUkVELAkvKiBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgKi8KKwlKRElUSEVSX0ZTCQkvKiBGbG95ZC1TdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uIGRpdGhlciAqLworfSBKX0RJVEhFUl9NT0RFOworCisKKy8qIENvbW1vbiBmaWVsZHMgYmV0d2VlbiBKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG1hc3RlciBzdHJ1Y3RzLiAqLworCisjZGVmaW5lIGpwZWdfY29tbW9uX2ZpZWxkcyBcCisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycjsJLyogRXJyb3IgaGFuZGxlciBtb2R1bGUgKi9cCisgIHN0cnVjdCBqcGVnX21lbW9yeV9tZ3IgKiBtZW07CS8qIE1lbW9yeSBtYW5hZ2VyIG1vZHVsZSAqL1wKKyAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyICogcHJvZ3Jlc3M7IC8qIFByb2dyZXNzIG1vbml0b3IsIG9yIE5VTEwgaWYgbm9uZSAqL1wKKyAgdm9pZCAqIGNsaWVudF9kYXRhOwkJLyogQXZhaWxhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb24gKi9cCisgIGJvb2xlYW4gaXNfZGVjb21wcmVzc29yOwkvKiBTbyBjb21tb24gY29kZSBjYW4gdGVsbCB3aGljaCBpcyB3aGljaCAqL1wKKyAgaW50IGdsb2JhbF9zdGF0ZQkJLyogRm9yIGNoZWNraW5nIGNhbGwgc2VxdWVuY2UgdmFsaWRpdHkgKi8KKworLyogUm91dGluZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBib3RoIGhhbHZlcyBvZiB0aGUgbGlicmFyeSBhcmUgZGVjbGFyZWQKKyAqIHRvIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLiAgVGhlcmUgYXJlIG5vIGFjdHVhbCBpbnN0YW5jZXMgb2YKKyAqIGpwZWdfY29tbW9uX3N0cnVjdCwgb25seSBvZiBqcGVnX2NvbXByZXNzX3N0cnVjdCBhbmQganBlZ19kZWNvbXByZXNzX3N0cnVjdC4KKyAqLworc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCB7CisgIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBjb21tb24gdG8gYm90aCBtYXN0ZXIgc3RydWN0IHR5cGVzICovCisgIC8qIEFkZGl0aW9uYWwgZmllbGRzIGZvbGxvdyBpbiBhbiBhY3R1YWwganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IKKyAgICoganBlZ19kZWNvbXByZXNzX3N0cnVjdC4gIEFsbCB0aHJlZSBzdHJ1Y3RzIG11c3QgYWdyZWUgb24gdGhlc2UKKyAgICogaW5pdGlhbCBmaWVsZHMhICAoVGhpcyB3b3VsZCBiZSBhIGxvdCBjbGVhbmVyIGluIEMrKy4pCisgICAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0ICogal9jb21tb25fcHRyOwordHlwZWRlZiBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgKiBqX2NvbXByZXNzX3B0cjsKK3R5cGVkZWYgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKiBqX2RlY29tcHJlc3NfcHRyOworCisKKy8qIE1hc3RlciByZWNvcmQgZm9yIGEgY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KKworc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IHsKKyAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKi8KKworICAvKiBEZXN0aW5hdGlvbiBmb3IgY29tcHJlc3NlZCBkYXRhICovCisgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3Q7CisKKyAgLyogRGVzY3JpcHRpb24gb2Ygc291cmNlIGltYWdlIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBmaWxsZWQgaW4gYnkKKyAgICogb3V0ZXIgYXBwbGljYXRpb24gYmVmb3JlIHN0YXJ0aW5nIGNvbXByZXNzaW9uLiAgaW5fY29sb3Jfc3BhY2UgbXVzdAorICAgKiBiZSBjb3JyZWN0IGJlZm9yZSB5b3UgY2FuIGV2ZW4gY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpLgorICAgKi8KKworICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBpbnB1dCBpbWFnZSB3aWR0aCAqLworICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogaW5wdXQgaW1hZ2UgaGVpZ2h0ICovCisgIGludCBpbnB1dF9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIGlucHV0IGltYWdlICovCisgIEpfQ09MT1JfU1BBQ0UgaW5fY29sb3Jfc3BhY2U7CS8qIGNvbG9yc3BhY2Ugb2YgaW5wdXQgaW1hZ2UgKi8KKworICBkb3VibGUgaW5wdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSBvZiBpbnB1dCBpbWFnZSAqLworCisgIC8qIENvbXByZXNzaW9uIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZworICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBXZSByZWNvbW1lbmQgY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIHRvCisgICAqIGluaXRpYWxpemUgZXZlcnl0aGluZyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB0aGVuIGNoYW5naW5nIGFueXRoaW5nCisgICAqIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2FsbHkgd2FudHMgdG8gY2hhbmdlLiAgVGhhdCB3YXkgeW91IHdvbid0IGdldAorICAgKiBidXJudCB3aGVuIG5ldyBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gIEFsc28gbm90ZSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsCisgICAqIGhlbHBlciByb3V0aW5lcyB0byBzaW1wbGlmeSBjaGFuZ2luZyBwYXJhbWV0ZXJzLgorICAgKi8KKworICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCisKKyAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KKyAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KKworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOworICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KKworICBKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdOworICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KKworICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworCisgIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKyAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworCisgIGludCBudW1fc2NhbnM7CQkvKiAjIG9mIGVudHJpZXMgaW4gc2Nhbl9pbmZvIGFycmF5ICovCisgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvOyAvKiBzY3JpcHQgZm9yIG11bHRpLXNjYW4gZmlsZSwgb3IgTlVMTCAqLworICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBzY2FuX2luZm8gaXMgTlVMTCwgd2hpY2ggY2F1c2VzIGEgc2luZ2xlLXNjYW4KKyAgICogc2VxdWVudGlhbCBKUEVHIGZpbGUgdG8gYmUgZW1pdHRlZC4gIFRvIGNyZWF0ZSBhIG11bHRpLXNjYW4gZmlsZSwKKyAgICogc2V0IG51bV9zY2FucyBhbmQgc2Nhbl9pbmZvIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVmaW5pdGlvbnMuCisgICAqLworCisgIGJvb2xlYW4gcmF3X2RhdGFfaW47CQkvKiBUUlVFPWNhbGxlciBzdXBwbGllcyBkb3duc2FtcGxlZCBkYXRhICovCisgIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KKyAgYm9vbGVhbiBvcHRpbWl6ZV9jb2Rpbmc7CS8qIFRSVUU9b3B0aW1pemUgZW50cm9weSBlbmNvZGluZyBwYXJtcyAqLworICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworICBpbnQgc21vb3RoaW5nX2ZhY3RvcjsJCS8qIDEuLjEwMCwgb3IgMCBmb3Igbm8gaW5wdXQgc21vb3RoaW5nICovCisgIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCisKKyAgLyogVGhlIHJlc3RhcnQgaW50ZXJ2YWwgY2FuIGJlIHNwZWNpZmllZCBpbiBhYnNvbHV0ZSBNQ1VzIGJ5IHNldHRpbmcKKyAgICogcmVzdGFydF9pbnRlcnZhbCwgb3IgaW4gTUNVIHJvd3MgYnkgc2V0dGluZyByZXN0YXJ0X2luX3Jvd3MKKyAgICogKGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QgcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGZpZ3VyZWQKKyAgICogZm9yIGVhY2ggc2NhbikuCisgICAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLworICBpbnQgcmVzdGFydF9pbl9yb3dzOwkJLyogaWYgPiAwLCBNQ1Ugcm93cyBwZXIgcmVzdGFydCBpbnRlcnZhbCAqLworCisgIC8qIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgZW1pc3Npb24gb2Ygc3BlY2lhbCBtYXJrZXJzLiAqLworCisgIGJvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXI7CS8qIHNob3VsZCBhIEpGSUYgbWFya2VyIGJlIHdyaXR0ZW4/ICovCisgIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogV2hhdCB0byB3cml0ZSBmb3IgdGhlIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KKyAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOworICAvKiBUaGVzZSB0aHJlZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGJ5IHRoZSBKUEVHIGNvZGUsIG1lcmVseSBjb3BpZWQgKi8KKyAgLyogaW50byB0aGUgSkZJRiBBUFAwIG1hcmtlci4gIGRlbnNpdHlfdW5pdCBjYW4gYmUgMCBmb3IgdW5rbm93biwgKi8KKyAgLyogMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgTm90ZSB0aGF0IHRoZSBwaXhlbCBhc3BlY3QgKi8KKyAgLyogcmF0aW8gaXMgZGVmaW5lZCBieSBYX2RlbnNpdHkvWV9kZW5zaXR5IGV2ZW4gd2hlbiBkZW5zaXR5X3VuaXQ9MC4gKi8KKyAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCisgIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KKyAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KKyAgYm9vbGVhbiB3cml0ZV9BZG9iZV9tYXJrZXI7CS8qIHNob3VsZCBhbiBBZG9iZSBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KKworICAvKiBTdGF0ZSB2YXJpYWJsZTogaW5kZXggb2YgbmV4dCBzY2FubGluZSB0byBiZSB3cml0dGVuIHRvCisgICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBBcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgdG8gY29udHJvbCBpdHMKKyAgICogcHJvY2Vzc2luZyBsb29wLCBlLmcuLCAid2hpbGUgKG5leHRfc2NhbmxpbmUgPCBpbWFnZV9oZWlnaHQpIi4KKyAgICovCisKKyAgSkRJTUVOU0lPTiBuZXh0X3NjYW5saW5lOwkvKiAwIC4uIGltYWdlX2hlaWdodC0xICAqLworCisgIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgY29tcHJlc3NvciwgYnV0IGdlbmVyYWxseQorICAgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAgICovCisKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24gc3RhcnR1cAorICAgKi8KKyAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIHNjYW4gc2NyaXB0IHVzZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLworICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLworICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLworCisgIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyB0byBiZSBpbnB1dCB0byBjb2VmIGN0bHIgKi8KKyAgLyogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgcmVjZWl2ZXMgZGF0YSBpbiB1bml0cyBvZiBNQ1Ugcm93cyBhcyBkZWZpbmVkCisgICAqIGZvciBmdWxseSBpbnRlcmxlYXZlZCBzY2FucyAod2hldGhlciB0aGUgSlBFRyBmaWxlIGlzIGludGVybGVhdmVkIG9yIG5vdCkuCisgICAqIFRoZXJlIGFyZSB2X3NhbXBfZmFjdG9yICogRENUU0laRSBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudCBpbiBhbgorICAgKiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93LgorICAgKi8KKworICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCisgICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgorICAgKi8KKyAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOworICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLworCisgIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLworICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCisKKyAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLworICBpbnQgTUNVX21lbWJlcnNoaXBbQ19NQVhfQkxPQ0tTX0lOX01DVV07CisgIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLworICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLworCisgIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLworCisgIC8qCisgICAqIExpbmtzIHRvIGNvbXByZXNzaW9uIHN1Ym9iamVjdHMgKG1ldGhvZHMgYW5kIHByaXZhdGUgdmFyaWFibGVzIG9mIG1vZHVsZXMpCisgICAqLworICBzdHJ1Y3QganBlZ19jb21wX21hc3RlciAqIG1hc3RlcjsKKyAgc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKiBtYWluOworICBzdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciAqIHByZXA7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICogY29lZjsKKyAgc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciAqIG1hcmtlcjsKKyAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyICogY2NvbnZlcnQ7CisgIHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICogZG93bnNhbXBsZTsKKyAgc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKiBmZGN0OworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKiBlbnRyb3B5OworICBqcGVnX3NjYW5faW5mbyAqIHNjcmlwdF9zcGFjZTsgLyogd29ya3NwYWNlIGZvciBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAqLworICBpbnQgc2NyaXB0X3NwYWNlX3NpemU7Cit9OworCisKKy8qIE1hc3RlciByZWNvcmQgZm9yIGEgZGVjb21wcmVzc2lvbiBpbnN0YW5jZSAqLworCitzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCB7CisgIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBzaGFyZWQgd2l0aCBqcGVnX2NvbXByZXNzX3N0cnVjdCAqLworCisgIC8qIFNvdXJjZSBvZiBjb21wcmVzc2VkIGRhdGEgKi8KKyAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIHNyYzsKKworICAvKiBCYXNpYyBkZXNjcmlwdGlvbiBvZiBpbWFnZSAtLS0gZmlsbGVkIGluIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gKi8KKyAgLyogQXBwbGljYXRpb24gbWF5IGluc3BlY3QgdGhlc2UgdmFsdWVzIHRvIGRlY2lkZSBob3cgdG8gcHJvY2VzcyBpbWFnZS4gKi8KKworICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBub21pbmFsIGltYWdlIHdpZHRoIChmcm9tIFNPRiBtYXJrZXIpICovCisgIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0OwkvKiBub21pbmFsIGltYWdlIGhlaWdodCAqLworICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLworICBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2Ugb2YgSlBFRyBpbWFnZSAqLworCisgIC8qIERlY29tcHJlc3Npb24gcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBzZXQgYmVmb3JlCisgICAqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBOb3RlIHRoYXQganBlZ19yZWFkX2hlYWRlcigpIGluaXRpYWxpemVzCisgICAqIHRoZW0gdG8gZGVmYXVsdCB2YWx1ZXMuCisgICAqLworCisgIEpfQ09MT1JfU1BBQ0Ugb3V0X2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIGZvciBvdXRwdXQgKi8KKworICB1bnNpZ25lZCBpbnQgc2NhbGVfbnVtLCBzY2FsZV9kZW5vbTsgLyogZnJhY3Rpb24gYnkgd2hpY2ggdG8gc2NhbGUgaW1hZ2UgKi8KKworICBkb3VibGUgb3V0cHV0X2dhbW1hOwkJLyogaW1hZ2UgZ2FtbWEgd2FudGVkIGluIG91dHB1dCAqLworCisgIGJvb2xlYW4gYnVmZmVyZWRfaW1hZ2U7CS8qIFRSVUU9bXVsdGlwbGUgb3V0cHV0IHBhc3NlcyAqLworICBib29sZWFuIHJhd19kYXRhX291dDsJCS8qIFRSVUU9ZG93bnNhbXBsZWQgZGF0YSB3YW50ZWQgKi8KKworICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogSURDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KKyAgYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nOwkvKiBUUlVFPWFwcGx5IGZhbmN5IHVwc2FtcGxpbmcgKi8KKyAgYm9vbGVhbiBkb19ibG9ja19zbW9vdGhpbmc7CS8qIFRSVUU9YXBwbHkgaW50ZXJibG9jayBzbW9vdGhpbmcgKi8KKworICBib29sZWFuIHF1YW50aXplX2NvbG9yczsJLyogVFJVRT1jb2xvcm1hcHBlZCBvdXRwdXQgd2FudGVkICovCisgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGlnbm9yZWQgaWYgbm90IHF1YW50aXplX2NvbG9yczogKi8KKyAgSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZTsJLyogdHlwZSBvZiBjb2xvciBkaXRoZXJpbmcgdG8gdXNlICovCisgIGJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemU7CS8qIFRSVUU9dXNlIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAqLworICBpbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOwkvKiBtYXggIyBjb2xvcnMgdG8gdXNlIGluIGNyZWF0ZWQgY29sb3JtYXAgKi8KKyAgLyogdGhlc2UgYXJlIHNpZ25pZmljYW50IG9ubHkgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZTogKi8KKyAgYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDEtcGFzcyBxdWFudGl6ZXIgKi8KKyAgYm9vbGVhbiBlbmFibGVfZXh0ZXJuYWxfcXVhbnQ7LyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgZXh0ZXJuYWwgY29sb3JtYXAgKi8KKyAgYm9vbGVhbiBlbmFibGVfMnBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDItcGFzcyBxdWFudGl6ZXIgKi8KKworICAvKiBEZXNjcmlwdGlvbiBvZiBhY3R1YWwgb3V0cHV0IGltYWdlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byBhcHBsaWNhdGlvbi4KKyAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBieSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKyAgICogWW91IGNhbiBhbHNvIHVzZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKSB0byBkZXRlcm1pbmUgdGhlc2UgdmFsdWVzCisgICAqIGluIGFkdmFuY2Ugb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKyAgICovCisKKyAgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGg7CS8qIHNjYWxlZCBpbWFnZSB3aWR0aCAqLworICBKRElNRU5TSU9OIG91dHB1dF9oZWlnaHQ7CS8qIHNjYWxlZCBpbWFnZSBoZWlnaHQgKi8KKyAgaW50IG91dF9jb2xvcl9jb21wb25lbnRzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlICovCisgIGludCBvdXRwdXRfY29tcG9uZW50czsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHJldHVybmVkICovCisgIC8qIG91dHB1dF9jb21wb25lbnRzIGlzIDEgKGEgY29sb3JtYXAgaW5kZXgpIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7CisgICAqIG90aGVyd2lzZSBpdCBlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuCisgICAqLworICBpbnQgcmVjX291dGJ1Zl9oZWlnaHQ7CS8qIG1pbiByZWNvbW1lbmRlZCBoZWlnaHQgb2Ygc2NhbmxpbmUgYnVmZmVyICovCisgIC8qIElmIHRoZSBidWZmZXIgcGFzc2VkIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBpcyBsZXNzIHRoYW4gdGhpcyBtYW55IHJvd3MKKyAgICogaGlnaCwgc3BhY2UgYW5kIHRpbWUgd2lsbCBiZSB3YXN0ZWQgZHVlIHRvIHVubmVjZXNzYXJ5IGRhdGEgY29weWluZy4KKyAgICogVXN1YWxseSByZWNfb3V0YnVmX2hlaWdodCB3aWxsIGJlIDEgb3IgMiwgYXQgbW9zdCA0LgorICAgKi8KKworICAvKiBXaGVuIHF1YW50aXppbmcgY29sb3JzLCB0aGUgb3V0cHV0IGNvbG9ybWFwIGlzIGRlc2NyaWJlZCBieSB0aGVzZSBmaWVsZHMuCisgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gc3VwcGx5IGEgY29sb3JtYXAgYnkgc2V0dGluZyBjb2xvcm1hcCBub24tTlVMTCBiZWZvcmUKKyAgICogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3M7IG90aGVyd2lzZSBhIGNvbG9ybWFwIGlzIGNyZWF0ZWQgZHVyaW5nCisgICAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBvciBqcGVnX3N0YXJ0X291dHB1dC4KKyAgICogVGhlIG1hcCBoYXMgb3V0X2NvbG9yX2NvbXBvbmVudHMgcm93cyBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgY29sdW1ucy4KKyAgICovCisgIGludCBhY3R1YWxfbnVtYmVyX29mX2NvbG9yczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdXNlICovCisgIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBUaGUgY29sb3IgbWFwIGFzIGEgMi1EIHBpeGVsIGFycmF5ICovCisKKyAgLyogU3RhdGUgdmFyaWFibGVzOiB0aGVzZSB2YXJpYWJsZXMgaW5kaWNhdGUgdGhlIHByb2dyZXNzIG9mIGRlY29tcHJlc3Npb24uCisgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgZXhhbWluZSB0aGVzZSBidXQgbXVzdCBub3QgbW9kaWZ5IHRoZW0uCisgICAqLworCisgIC8qIFJvdyBpbmRleCBvZiBuZXh0IHNjYW5saW5lIHRvIGJlIHJlYWQgZnJvbSBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuCisgICAqIEFwcGxpY2F0aW9uIG1heSB1c2UgdGhpcyB0byBjb250cm9sIGl0cyBwcm9jZXNzaW5nIGxvb3AsIGUuZy4sCisgICAqICJ3aGlsZSAob3V0cHV0X3NjYW5saW5lIDwgb3V0cHV0X2hlaWdodCkiLgorICAgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfc2NhbmxpbmU7CS8qIDAgLi4gb3V0cHV0X2hlaWdodC0xICAqLworCisgIC8qIEN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIgYW5kIG51bWJlciBvZiBpTUNVIHJvd3MgY29tcGxldGVkIGluIHNjYW4uCisgICAqIFRoZXNlIGluZGljYXRlIHRoZSBwcm9ncmVzcyBvZiB0aGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUuCisgICAqLworICBpbnQgaW5wdXRfc2Nhbl9udW1iZXI7CS8qIE51bWJlciBvZiBTT1MgbWFya2VycyBzZWVuIHNvIGZhciAqLworICBKRElNRU5TSU9OIGlucHV0X2lNQ1Vfcm93OwkvKiBOdW1iZXIgb2YgaU1DVSByb3dzIGNvbXBsZXRlZCAqLworCisgIC8qIFRoZSAib3V0cHV0IHNjYW4gbnVtYmVyIiBpcyB0aGUgbm90aW9uYWwgc2NhbiBiZWluZyBkaXNwbGF5ZWQgYnkgdGhlCisgICAqIG91dHB1dCBzaWRlLiAgVGhlIGRlY29tcHJlc3NvciB3aWxsIG5vdCBhbGxvdyBvdXRwdXQgc2Nhbi9yb3cgbnVtYmVyCisgICAqIHRvIGdldCBhaGVhZCBvZiBpbnB1dCBzY2FuL3JvdywgYnV0IGl0IGNhbiBmYWxsIGFyYml0cmFyaWx5IGZhciBiZWhpbmQuCisgICAqLworICBpbnQgb3V0cHV0X3NjYW5fbnVtYmVyOwkvKiBOb21pbmFsIHNjYW4gbnVtYmVyIGJlaW5nIGRpc3BsYXllZCAqLworICBKRElNRU5TSU9OIG91dHB1dF9pTUNVX3JvdzsJLyogTnVtYmVyIG9mIGlNQ1Ugcm93cyByZWFkICovCisKKyAgLyogQ3VycmVudCBwcm9ncmVzc2lvbiBzdGF0dXMuICBjb2VmX2JpdHNbY11baV0gaW5kaWNhdGVzIHRoZSBwcmVjaXNpb24KKyAgICogd2l0aCB3aGljaCBjb21wb25lbnQgYydzIERDVCBjb2VmZmljaWVudCBpIChpbiB6aWd6YWcgb3JkZXIpIGlzIGtub3duLgorICAgKiBJdCBpcyAtMSB3aGVuIG5vIGRhdGEgaGFzIHlldCBiZWVuIHJlY2VpdmVkLCBvdGhlcndpc2UgaXQgaXMgdGhlIHBvaW50CisgICAqIHRyYW5zZm9ybSAoc2hpZnQpIHZhbHVlIGZvciB0aGUgbW9zdCByZWNlbnQgc2NhbiBvZiB0aGUgY29lZmZpY2llbnQKKyAgICogKHRodXMsIDAgYXQgY29tcGxldGlvbiBvZiB0aGUgcHJvZ3Jlc3Npb24pLgorICAgKiBUaGlzIHBvaW50ZXIgaXMgTlVMTCB3aGVuIHJlYWRpbmcgYSBub24tcHJvZ3Jlc3NpdmUgZmlsZS4KKyAgICovCisgIGludCAoKmNvZWZfYml0cylbRENUU0laRTJdOwkvKiAtMSBvciBjdXJyZW50IEFsIHZhbHVlIGZvciBlYWNoIGNvZWYgKi8KKworICAvKiBJbnRlcm5hbCBKUEVHIHBhcmFtZXRlcnMgLS0tIHRoZSBhcHBsaWNhdGlvbiB1c3VhbGx5IG5lZWQgbm90IGxvb2sgYXQKKyAgICogdGhlc2UgZmllbGRzLiAgTm90ZSB0aGF0IHRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UKKyAgICogYW55IHBhcmFtZXRlcnMgdGhhdCBjYW4gY2hhbmdlIGJldHdlZW4gc2NhbnMuCisgICAqLworCisgIC8qIFF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMgYXJlIGNhcnJpZWQgZm9yd2FyZCBhY3Jvc3MgaW5wdXQKKyAgICogZGF0YXN0cmVhbXMgd2hlbiBwcm9jZXNzaW5nIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuCisgICAqLworCisgIEpRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU107CisgIC8qIHB0cnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworCisgIEpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107CisgIEpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107CisgIC8qIHB0cnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCisKKyAgLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgbmV2ZXIgY2FycmllZCBhY3Jvc3MgZGF0YXN0cmVhbXMsIHNpbmNlIHRoZXkKKyAgICogYXJlIGdpdmVuIGluIFNPRi9TT1MgbWFya2VycyBvciBkZWZpbmVkIHRvIGJlIHJlc2V0IGJ5IFNPSS4KKyAgICovCisKKyAgaW50IGRhdGFfcHJlY2lzaW9uOwkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gaW1hZ2UgZGF0YSAqLworCisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wX2luZm87CisgIC8qIGNvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPRiAqLworCisgIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBTT0ZuIHNwZWNpZmllcyBwcm9ncmVzc2l2ZSBtb2RlICovCisgIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KKworICBVSU5UOCBhcml0aF9kY19MW05VTV9BUklUSF9UQkxTXTsgLyogTCB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKyAgVUlOVDggYXJpdGhfZGNfVVtOVU1fQVJJVEhfVEJMU107IC8qIFUgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisgIFVJTlQ4IGFyaXRoX2FjX0tbTlVNX0FSSVRIX1RCTFNdOyAvKiBLeCB2YWx1ZXMgZm9yIEFDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKworICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCBpbnRlcnZhbCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLworCisgIC8qIFRoZXNlIGZpZWxkcyByZWNvcmQgZGF0YSBvYnRhaW5lZCBmcm9tIG9wdGlvbmFsIG1hcmtlcnMgcmVjb2duaXplZCBieQorICAgKiB0aGUgSlBFRyBsaWJyYXJ5LgorICAgKi8KKyAgYm9vbGVhbiBzYXdfSkZJRl9tYXJrZXI7CS8qIFRSVUUgaWZmIGEgSkZJRiBBUFAwIG1hcmtlciB3YXMgZm91bmQgKi8KKyAgLyogRGF0YSBjb3BpZWQgZnJvbSBKRklGIG1hcmtlcjsgb25seSB2YWxpZCBpZiBzYXdfSkZJRl9tYXJrZXIgaXMgVFJVRTogKi8KKyAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uOwkvKiBKRklGIHZlcnNpb24gbnVtYmVyICovCisgIFVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbjsKKyAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCisgIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KKyAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KKyAgYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyOwkvKiBUUlVFIGlmZiBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgd2FzIGZvdW5kICovCisgIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybTsJLyogQ29sb3IgdHJhbnNmb3JtIGNvZGUgZnJvbSBBZG9iZSBtYXJrZXIgKi8KKworICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworCisgIC8qIEFzaWRlIGZyb20gdGhlIHNwZWNpZmljIGRhdGEgcmV0YWluZWQgZnJvbSBBUFBuIG1hcmtlcnMga25vd24gdG8gdGhlCisgICAqIGxpYnJhcnksIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIGFueSBvciBhbGwgQVBQbiBhbmQgQ09NIG1hcmtlcnMKKyAgICogY2FuIGJlIHNhdmVkIGluIGEgbGlzdCBmb3IgZXhhbWluYXRpb24gYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgKi8KKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcl9saXN0OyAvKiBIZWFkIG9mIGxpc3Qgb2Ygc2F2ZWQgbWFya2VycyAqLworCisgIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgZGVjb21wcmVzc29yLCBidXQgZ2VuZXJhbGx5CisgICAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgorICAgKi8KKworICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIHN0YXJ0dXAKKyAgICovCisgIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCisgIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCisKKyAgaW50IG1pbl9EQ1Rfc2NhbGVkX3NpemU7CS8qIHNtYWxsZXN0IERDVF9zY2FsZWRfc2l6ZSBvZiBhbnkgY29tcG9uZW50ICovCisKKyAgSkRJTUVOU0lPTiB0b3RhbF9pTUNVX3Jvd3M7CS8qICMgb2YgaU1DVSByb3dzIGluIGltYWdlICovCisgIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgaW5wdXQgYW5kIG91dHB1dCBwcm9ncmVzcyBpcyBtZWFzdXJlZCBpbgorICAgKiB1bml0cyBvZiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93cy4gIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBNQ1Ugcm93cworICAgKiBpbiBmdWxseSBpbnRlcmxlYXZlZCBKUEVHIHNjYW5zLCBidXQgYXJlIHVzZWQgd2hldGhlciB0aGUgc2NhbiBpcworICAgKiBpbnRlcmxlYXZlZCBvciBub3QuICBXZSBkZWZpbmUgYW4gaU1DVSByb3cgYXMgdl9zYW1wX2ZhY3RvciBEQ1QgYmxvY2sKKyAgICogcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFRoZXJlZm9yZSwgdGhlIElEQ1Qgb3V0cHV0IGNvbnRhaW5zCisgICAqIHZfc2FtcF9mYWN0b3IqRENUX3NjYWxlZF9zaXplIHNhbXBsZSByb3dzIG9mIGEgY29tcG9uZW50IHBlciBpTUNVIHJvdy4KKyAgICovCisKKyAgSlNBTVBMRSAqIHNhbXBsZV9yYW5nZV9saW1pdDsgLyogdGFibGUgZm9yIGZhc3QgcmFuZ2UtbGltaXRpbmcgKi8KKworICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCisgICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgorICAgKiBOb3RlIHRoYXQgdGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtdXN0IG5vdCB1c2UgdGhlc2UgZmllbGRzLgorICAgKi8KKyAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOworICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLworCisgIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLworICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCisKKyAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLworICBpbnQgTUNVX21lbWJlcnNoaXBbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisgIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLworICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLworCisgIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLworCisgIC8qIFRoaXMgZmllbGQgaXMgc2hhcmVkIGJldHdlZW4gZW50cm9weSBkZWNvZGVyIGFuZCBtYXJrZXIgcGFyc2VyLgorICAgKiBJdCBpcyBlaXRoZXIgemVybyBvciB0aGUgY29kZSBvZiBhIEpQRUcgbWFya2VyIHRoYXQgaGFzIGJlZW4KKyAgICogcmVhZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSwgYnV0IGhhcyBub3QgeWV0IGJlZW4gcHJvY2Vzc2VkLgorICAgKi8KKyAgaW50IHVucmVhZF9tYXJrZXI7CisKKyAgLyoKKyAgICogTGlua3MgdG8gZGVjb21wcmVzc2lvbiBzdWJvYmplY3RzIChtZXRob2RzLCBwcml2YXRlIHZhcmlhYmxlcyBvZiBtb2R1bGVzKQorICAgKi8KKyAgc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciAqIG1hc3RlcjsKKyAgc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgKiBtYWluOworICBzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciAqIGNvZWY7CisgIHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICogcG9zdDsKKyAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciAqIGlucHV0Y3RsOworICBzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyICogbWFya2VyOworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKiBlbnRyb3B5OworICBzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqIGlkY3Q7CisgIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqIHVwc2FtcGxlOworICBzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciAqIGNjb252ZXJ0OworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBjcXVhbnRpemU7Cit9OworCisKKy8qICJPYmplY3QiIGRlY2xhcmF0aW9ucyBmb3IgSlBFRyBtb2R1bGVzIHRoYXQgbWF5IGJlIHN1cHBsaWVkIG9yIGNhbGxlZAorICogZGlyZWN0bHkgYnkgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgorICogQXMgd2l0aCBhbGwgb2JqZWN0cyBpbiB0aGUgSlBFRyBsaWJyYXJ5LCB0aGVzZSBzdHJ1Y3RzIG9ubHkgZGVmaW5lIHRoZQorICogcHVibGljbHkgdmlzaWJsZSBtZXRob2RzIGFuZCBzdGF0ZSB2YXJpYWJsZXMgb2YgYSBtb2R1bGUuICBBZGRpdGlvbmFsCisgKiBwcml2YXRlIGZpZWxkcyBtYXkgZXhpc3QgYWZ0ZXIgdGhlIHB1YmxpYyBvbmVzLgorICovCisKKworLyogRXJyb3IgaGFuZGxlciBvYmplY3QgKi8KKworc3RydWN0IGpwZWdfZXJyb3JfbWdyIHsKKyAgLyogRXJyb3IgZXhpdCBoYW5kbGVyOiBkb2VzIG5vdCByZXR1cm4gdG8gY2FsbGVyICovCisgIEpNRVRIT0Qodm9pZCwgZXJyb3JfZXhpdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOworICAvKiBDb25kaXRpb25hbGx5IGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UgKi8KKyAgSk1FVEhPRCh2b2lkLCBlbWl0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpKTsKKyAgLyogUm91dGluZSB0aGF0IGFjdHVhbGx5IG91dHB1dHMgYSB0cmFjZSBvciBlcnJvciBtZXNzYWdlICovCisgIEpNRVRIT0Qodm9pZCwgb3V0cHV0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKyAgLyogRm9ybWF0IGEgbWVzc2FnZSBzdHJpbmcgZm9yIHRoZSBtb3N0IHJlY2VudCBKUEVHIGVycm9yIG9yIG1lc3NhZ2UgKi8KKyAgSk1FVEhPRCh2b2lkLCBmb3JtYXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikpOworI2RlZmluZSBKTVNHX0xFTkdUSF9NQVggIDIwMAkvKiByZWNvbW1lbmRlZCBzaXplIG9mIGZvcm1hdF9tZXNzYWdlIGJ1ZmZlciAqLworICAvKiBSZXNldCBlcnJvciBzdGF0ZSB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgYSBuZXcgaW1hZ2UgKi8KKyAgSk1FVEhPRCh2b2lkLCByZXNldF9lcnJvcl9tZ3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworICAvKiBUaGUgbWVzc2FnZSBJRCBjb2RlIGFuZCBhbnkgcGFyYW1ldGVycyBhcmUgc2F2ZWQgaGVyZS4KKyAgICogQSBtZXNzYWdlIGNhbiBoYXZlIG9uZSBzdHJpbmcgcGFyYW1ldGVyIG9yIHVwIHRvIDggaW50IHBhcmFtZXRlcnMuCisgICAqLworICBpbnQgbXNnX2NvZGU7CisjZGVmaW5lIEpNU0dfU1RSX1BBUk1fTUFYICA4MAorICB1bmlvbiB7CisgICAgaW50IGlbOF07CisgICAgY2hhciBzW0pNU0dfU1RSX1BBUk1fTUFYXTsKKyAgfSBtc2dfcGFybTsKKworICAvKiBTdGFuZGFyZCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGVycm9yIGZhY2lsaXR5ICovCisKKyAgaW50IHRyYWNlX2xldmVsOwkJLyogbWF4IG1zZ19sZXZlbCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkICovCisKKyAgLyogRm9yIHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSBlcnJvcnMsIHdlIGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UsCisgICAqIGJ1dCBrZWVwIGdvaW5nIHVubGVzcyBlbWl0X21lc3NhZ2UgY2hvb3NlcyB0byBhYm9ydC4gIGVtaXRfbWVzc2FnZQorICAgKiBzaG91bGQgY291bnQgd2FybmluZ3MgaW4gbnVtX3dhcm5pbmdzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uCisgICAqIGNhbiBjaGVjayBmb3IgYmFkIGRhdGEgYnkgc2VlaW5nIGlmIG51bV93YXJuaW5ncyBpcyBub256ZXJvIGF0IHRoZQorICAgKiBlbmQgb2YgcHJvY2Vzc2luZy4KKyAgICovCisgIGxvbmcgbnVtX3dhcm5pbmdzOwkJLyogbnVtYmVyIG9mIGNvcnJ1cHQtZGF0YSB3YXJuaW5ncyAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBwb2ludCB0byB0aGUgdGFibGUocykgb2YgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLgorICAgKiBBbiBhcHBsaWNhdGlvbiBjYW4gY2hhbmdlIHRoZSB0YWJsZSBwb2ludGVyIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudAorICAgKiBtZXNzYWdlIGxpc3QgKHR5cGljYWxseSwgdG8gY2hhbmdlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCBlcnJvcnMgYXJlCisgICAqIHJlcG9ydGVkKS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIGNvZGVzCisgICAqIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkgZXJyb3IgbWVjaGFuaXNtOyB0aGUgc2Vjb25kCisgICAqIHRhYmxlIHBvaW50ZXIgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgorICAgKgorICAgKiBGaXJzdCB0YWJsZSBpbmNsdWRlcyBhbGwgZXJyb3JzIGdlbmVyYXRlZCBieSBKUEVHIGxpYnJhcnkgaXRzZWxmLgorICAgKiBFcnJvciBjb2RlIDAgaXMgcmVzZXJ2ZWQgZm9yIGEgIm5vIHN1Y2ggZXJyb3Igc3RyaW5nIiBtZXNzYWdlLgorICAgKi8KKyAgY29uc3QgY2hhciAqIGNvbnN0ICoganBlZ19tZXNzYWdlX3RhYmxlOyAvKiBMaWJyYXJ5IGVycm9ycyAqLworICBpbnQgbGFzdF9qcGVnX21lc3NhZ2U7ICAgIC8qIFRhYmxlIGNvbnRhaW5zIHN0cmluZ3MgMC4ubGFzdF9qcGVnX21lc3NhZ2UgKi8KKyAgLyogU2Vjb25kIHRhYmxlIGNhbiBiZSBhZGRlZCBieSBhcHBsaWNhdGlvbiAoc2VlIGNqcGVnL2RqcGVnIGZvciBleGFtcGxlKS4KKyAgICogSXQgY29udGFpbnMgc3RyaW5ncyBudW1iZXJlZCBmaXJzdF9hZGRvbl9tZXNzYWdlLi5sYXN0X2FkZG9uX21lc3NhZ2UuCisgICAqLworICBjb25zdCBjaGFyICogY29uc3QgKiBhZGRvbl9tZXNzYWdlX3RhYmxlOyAvKiBOb24tbGlicmFyeSBlcnJvcnMgKi8KKyAgaW50IGZpcnN0X2FkZG9uX21lc3NhZ2U7CS8qIGNvZGUgZm9yIGZpcnN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLworICBpbnQgbGFzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBsYXN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLworfTsKKworCisvKiBQcm9ncmVzcyBtb25pdG9yIG9iamVjdCAqLworCitzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgeworICBKTUVUSE9EKHZvaWQsIHByb2dyZXNzX21vbml0b3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworICBsb25nIHBhc3NfY291bnRlcjsJCS8qIHdvcmsgdW5pdHMgY29tcGxldGVkIGluIHRoaXMgcGFzcyAqLworICBsb25nIHBhc3NfbGltaXQ7CQkvKiB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBpbiB0aGlzIHBhc3MgKi8KKyAgaW50IGNvbXBsZXRlZF9wYXNzZXM7CQkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLworICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyBleHBlY3RlZCAqLworfTsKKworCisvKiBEYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgY29tcHJlc3Npb24gKi8KKworc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHsKKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworCisgIEpNRVRIT0Qodm9pZCwgaW5pdF9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgZW1wdHlfb3V0cHV0X2J1ZmZlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgdGVybV9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Cit9OworCisKKy8qIERhdGEgc291cmNlIG9iamVjdCBmb3IgZGVjb21wcmVzc2lvbiAqLworCitzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHsKKyAgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIGJ1ZmZlciAqLworICBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKworICBKTUVUSE9EKHZvaWQsIGluaXRfc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIGZpbGxfaW5wdXRfYnVmZmVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHNraXBfaW5wdXRfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgcmVzeW5jX3RvX3Jlc3RhcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkpOworICBKTUVUSE9EKHZvaWQsIHRlcm1fc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworCisvKiBNZW1vcnkgbWFuYWdlciBvYmplY3QuCisgKiBBbGxvY2F0ZXMgInNtYWxsIiBvYmplY3RzIChhIGZldyBLIHRvdGFsKSwgImxhcmdlIiBvYmplY3RzICh0ZW5zIG9mIEspLAorICogYW5kICJyZWFsbHkgYmlnIiBvYmplY3RzICh2aXJ0dWFsIGFycmF5cyB3aXRoIGJhY2tpbmcgc3RvcmUgaWYgbmVlZGVkKS4KKyAqIFRoZSBtZW1vcnkgbWFuYWdlciBkb2VzIG5vdCBhbGxvdyBpbmRpdmlkdWFsIG9iamVjdHMgdG8gYmUgZnJlZWQ7IHJhdGhlciwKKyAqIGVhY2ggY3JlYXRlZCBvYmplY3QgaXMgYXNzaWduZWQgdG8gYSBwb29sLCBhbmQgd2hvbGUgcG9vbHMgY2FuIGJlIGZyZWVkCisgKiBhdCBvbmNlLiAgVGhpcyBpcyBmYXN0ZXIgYW5kIG1vcmUgY29udmVuaWVudCB0aGFuIHJlbWVtYmVyaW5nIGV4YWN0bHkgd2hhdAorICogdG8gZnJlZSwgZXNwZWNpYWxseSB3aGVyZSBtYWxsb2MoKS9mcmVlKCkgYXJlIG5vdCB0b28gc3BlZWR5LgorICogTkI6IGFsbG9jIHJvdXRpbmVzIG5ldmVyIHJldHVybiBOVUxMLiAgVGhleSBleGl0IHRvIGVycm9yX2V4aXQgaWYgbm90CisgKiBzdWNjZXNzZnVsLgorICovCisKKyNkZWZpbmUgSlBPT0xfUEVSTUFORU5UCTAJLyogbGFzdHMgdW50aWwgbWFzdGVyIHJlY29yZCBpcyBkZXN0cm95ZWQgKi8KKyNkZWZpbmUgSlBPT0xfSU1BR0UJMQkvKiBsYXN0cyB1bnRpbCBkb25lIHdpdGggaW1hZ2UvZGF0YXN0cmVhbSAqLworI2RlZmluZSBKUE9PTF9OVU1QT09MUwkyCisKK3R5cGVkZWYgc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sICoganZpcnRfc2FycmF5X3B0cjsKK3R5cGVkZWYgc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sICoganZpcnRfYmFycmF5X3B0cjsKKworCitzdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHsKKyAgLyogTWV0aG9kIHBvaW50ZXJzICovCisgIEpNRVRIT0Qodm9pZCAqLCBhbGxvY19zbWFsbCwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJCQkJc2l6ZV90IHNpemVvZm9iamVjdCkpOworICBKTUVUSE9EKHZvaWQgRkFSICosIGFsbG9jX2xhcmdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkJCQkgICAgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKKyAgSk1FVEhPRChKU0FNUEFSUkFZLCBhbGxvY19zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCQkJCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LAorCQkJCSAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7CisgIEpNRVRIT0QoSkJMT0NLQVJSQVksIGFsbG9jX2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJCQkJICAgICAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCisJCQkJICAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7CisgIEpNRVRIT0QoanZpcnRfc2FycmF5X3B0ciwgcmVxdWVzdF92aXJ0X3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkJCSAgaW50IHBvb2xfaWQsCisJCQkJCQkgIGJvb2xlYW4gcHJlX3plcm8sCisJCQkJCQkgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKKwkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOworICBKTUVUSE9EKGp2aXJ0X2JhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCQkgIGludCBwb29sX2lkLAorCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAorCQkJCQkJICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywKKwkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOworICBKTUVUSE9EKHZvaWQsIHJlYWxpemVfdmlydF9hcnJheXMsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChKU0FNUEFSUkFZLCBhY2Nlc3NfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCSAgIGp2aXJ0X3NhcnJheV9wdHIgcHRyLAorCQkJCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKKwkJCQkJICAgSkRJTUVOU0lPTiBudW1fcm93cywKKwkJCQkJICAgYm9vbGVhbiB3cml0YWJsZSkpOworICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhY2Nlc3NfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCSAgICBqdmlydF9iYXJyYXlfcHRyIHB0ciwKKwkJCQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LAorCQkJCQkgICAgSkRJTUVOU0lPTiBudW1fcm93cywKKwkJCQkJICAgIGJvb2xlYW4gd3JpdGFibGUpKTsKKyAgSk1FVEhPRCh2b2lkLCBmcmVlX3Bvb2wsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkKSk7CisgIEpNRVRIT0Qodm9pZCwgc2VsZl9kZXN0cnVjdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOworCisgIC8qIExpbWl0IG9uIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGlzIEpQRUcgb2JqZWN0LiAgKE5vdGUgdGhhdCB0aGlzIGlzCisgICAqIG1lcmVseSBhZHZpc29yeSwgbm90IGEgZ3VhcmFudGVlZCBtYXhpbXVtOyBpdCBvbmx5IGFmZmVjdHMgdGhlIHNwYWNlCisgICAqIHVzZWQgZm9yIHZpcnR1YWwtYXJyYXkgYnVmZmVycy4pICBNYXkgYmUgY2hhbmdlZCBieSBvdXRlciBhcHBsaWNhdGlvbgorICAgKiBhZnRlciBjcmVhdGluZyB0aGUgSlBFRyBvYmplY3QuCisgICAqLworICBsb25nIG1heF9tZW1vcnlfdG9fdXNlOworCisgIC8qIE1heGltdW0gYWxsb2NhdGlvbiByZXF1ZXN0IGFjY2VwdGVkIGJ5IGFsbG9jX2xhcmdlLiAqLworICBsb25nIG1heF9hbGxvY19jaHVuazsKK307CisKKworLyogUm91dGluZSBzaWduYXR1cmUgZm9yIGFwcGxpY2F0aW9uLXN1cHBsaWVkIG1hcmtlciBwcm9jZXNzaW5nIG1ldGhvZHMuCisgKiBOZWVkIG5vdCBwYXNzIG1hcmtlciBjb2RlIHNpbmNlIGl0IGlzIHN0b3JlZCBpbiBjaW5mby0+dW5yZWFkX21hcmtlci4KKyAqLwordHlwZWRlZiBKTUVUSE9EKGJvb2xlYW4sIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKworLyogRGVjbGFyYXRpb25zIGZvciByb3V0aW5lcyBjYWxsZWQgYnkgYXBwbGljYXRpb24uCisgKiBUaGUgSlBQIG1hY3JvIGhpZGVzIHByb3RvdHlwZSBwYXJhbWV0ZXJzIGZyb20gY29tcGlsZXJzIHRoYXQgY2FuJ3QgY29wZS4KKyAqIE5vdGUgSlBQIHJlcXVpcmVzIGRvdWJsZSBwYXJlbnRoZXNlcy4KKyAqLworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEpQUChhcmdsaXN0KQlhcmdsaXN0CisjZWxzZQorI2RlZmluZSBKUFAoYXJnbGlzdCkJKCkKKyNlbmRpZgorCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLgorICogV2Ugc2hvcnRlbiBleHRlcm5hbCBuYW1lcyB0byBiZSB1bmlxdWUgaW4gdGhlIGZpcnN0IHNpeCBsZXR0ZXJzLCB3aGljaAorICogaXMgZ29vZCBlbm91Z2ggZm9yIGFsbCBrbm93biBzeXN0ZW1zLgorICogKElmIHlvdXIgY29tcGlsZXIgaXRzZWxmIG5lZWRzIG5hbWVzIHRvIGJlIHVuaXF1ZSBpbiBsZXNzIHRoYW4gMTUKKyAqIGNoYXJhY3RlcnMsIHlvdSBhcmUgb3V0IG9mIGx1Y2suICBHZXQgYSBiZXR0ZXIgY29tcGlsZXIuKQorICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfc3RkX2Vycm9yCQlqU3RkRXJyb3IKKyNkZWZpbmUganBlZ19DcmVhdGVDb21wcmVzcwlqQ3JlYUNvbXByZXNzCisjZGVmaW5lIGpwZWdfQ3JlYXRlRGVjb21wcmVzcwlqQ3JlYURlY29tcHJlc3MKKyNkZWZpbmUganBlZ19kZXN0cm95X2NvbXByZXNzCWpEZXN0Q29tcHJlc3MKKyNkZWZpbmUganBlZ19kZXN0cm95X2RlY29tcHJlc3MJakRlc3REZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfc3RkaW9fZGVzdAkJalN0ZERlc3QKKyNkZWZpbmUganBlZ19zdGRpb19zcmMJCWpTdGRTcmMKKyNkZWZpbmUganBlZ19zZXRfZGVmYXVsdHMJalNldERlZmF1bHRzCisjZGVmaW5lIGpwZWdfc2V0X2NvbG9yc3BhY2UJalNldENvbG9yc3BhY2UKKyNkZWZpbmUganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UJakRlZkNvbG9yc3BhY2UKKyNkZWZpbmUganBlZ19zZXRfcXVhbGl0eQlqU2V0UXVhbGl0eQorI2RlZmluZSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eQlqU2V0TFF1YWxpdHkKKyNkZWZpbmUganBlZ19hZGRfcXVhbnRfdGFibGUJakFkZFF1YW50VGFibGUKKyNkZWZpbmUganBlZ19xdWFsaXR5X3NjYWxpbmcJalF1YWxpdHlTY2FsaW5nCisjZGVmaW5lIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uCWpTaW1Qcm9ncmVzcworI2RlZmluZSBqcGVnX3N1cHByZXNzX3RhYmxlcwlqU3VwcHJlc3NUYWJsZXMKKyNkZWZpbmUganBlZ19hbGxvY19xdWFudF90YWJsZQlqQWxjUVRhYmxlCisjZGVmaW5lIGpwZWdfYWxsb2NfaHVmZl90YWJsZQlqQWxjSFRhYmxlCisjZGVmaW5lIGpwZWdfc3RhcnRfY29tcHJlc3MJalN0cnRDb21wcmVzcworI2RlZmluZSBqcGVnX3dyaXRlX3NjYW5saW5lcwlqV3J0U2NhbmxpbmVzCisjZGVmaW5lIGpwZWdfZmluaXNoX2NvbXByZXNzCWpGaW5Db21wcmVzcworI2RlZmluZSBqcGVnX3dyaXRlX3Jhd19kYXRhCWpXcnRSYXdEYXRhCisjZGVmaW5lIGpwZWdfd3JpdGVfbWFya2VyCWpXcnRNYXJrZXIKKyNkZWZpbmUganBlZ193cml0ZV9tX2hlYWRlcglqV3J0TUhlYWRlcgorI2RlZmluZSBqcGVnX3dyaXRlX21fYnl0ZQlqV3J0TUJ5dGUKKyNkZWZpbmUganBlZ193cml0ZV90YWJsZXMJaldydFRhYmxlcworI2RlZmluZSBqcGVnX3JlYWRfaGVhZGVyCWpSZWFkSGVhZGVyCisjZGVmaW5lIGpwZWdfc3RhcnRfZGVjb21wcmVzcwlqU3RydERlY29tcHJlc3MKKyNkZWZpbmUganBlZ19yZWFkX3NjYW5saW5lcwlqUmVhZFNjYW5saW5lcworI2RlZmluZSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCWpGaW5EZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfcmVhZF9yYXdfZGF0YQlqUmVhZFJhd0RhdGEKKyNkZWZpbmUganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMJakhhc011bHRTY24KKyNkZWZpbmUganBlZ19zdGFydF9vdXRwdXQJalN0cnRPdXRwdXQKKyNkZWZpbmUganBlZ19maW5pc2hfb3V0cHV0CWpGaW5PdXRwdXQKKyNkZWZpbmUganBlZ19pbnB1dF9jb21wbGV0ZQlqSW5Db21wbGV0ZQorI2RlZmluZSBqcGVnX25ld19jb2xvcm1hcAlqTmV3Q01hcAorI2RlZmluZSBqcGVnX2NvbnN1bWVfaW5wdXQJakNvbnN1bWVJbnB1dAorI2RlZmluZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMJakNhbGNEaW1lbnNpb25zCisjZGVmaW5lIGpwZWdfc2F2ZV9tYXJrZXJzCWpTYXZlTWFya2VycworI2RlZmluZSBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yCWpTZXRNYXJrZXIKKyNkZWZpbmUganBlZ19yZWFkX2NvZWZmaWNpZW50cwlqUmVhZENvZWZzCisjZGVmaW5lIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzCWpXcnRDb2VmcworI2RlZmluZSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycwlqQ29weUNyaXQKKyNkZWZpbmUganBlZ19hYm9ydF9jb21wcmVzcwlqQWJydENvbXByZXNzCisjZGVmaW5lIGpwZWdfYWJvcnRfZGVjb21wcmVzcwlqQWJydERlY29tcHJlc3MKKyNkZWZpbmUganBlZ19hYm9ydAkJakFib3J0CisjZGVmaW5lIGpwZWdfZGVzdHJveQkJakRlc3Ryb3kKKyNkZWZpbmUganBlZ19yZXN5bmNfdG9fcmVzdGFydAlqUmVzeW5jUmVzdGFydAorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKiBEZWZhdWx0IGVycm9yLW1hbmFnZW1lbnQgc2V0dXAgKi8KK0VYVEVSTihzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKikganBlZ19zdGRfZXJyb3IKKwlKUFAoKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBKUEVHIGNvbXByZXNzaW9uIG9iamVjdHMuCisgKiBqcGVnX2NyZWF0ZV9jb21wcmVzcygpIGFuZCBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkgYXJlIHRoZSBleHBvcnRlZAorICogbmFtZXMgdGhhdCBhcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwuICBUaGVzZSBleHBhbmQgdG8gY2FsbHMgb24KKyAqIGpwZWdfQ3JlYXRlQ29tcHJlc3MgYW5kIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHBhc3NlZCBmb3IgdmVyc2lvbiBtaXNtYXRjaCBjaGVja2luZy4KKyAqIE5COiB5b3UgbXVzdCBzZXQgdXAgdGhlIGVycm9yLW1hbmFnZXIgQkVGT1JFIGNhbGxpbmcganBlZ19jcmVhdGVfeHh4LgorICovCisjZGVmaW5lIGpwZWdfY3JlYXRlX2NvbXByZXNzKGNpbmZvKSBcCisgICAganBlZ19DcmVhdGVDb21wcmVzcygoY2luZm8pLCBKUEVHX0xJQl9WRVJTSU9OLCBcCisJCQkoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSkKKyNkZWZpbmUganBlZ19jcmVhdGVfZGVjb21wcmVzcyhjaW5mbykgXAorICAgIGpwZWdfQ3JlYXRlRGVjb21wcmVzcygoY2luZm8pLCBKUEVHX0xJQl9WRVJTSU9OLCBcCisJCQkgIChzaXplX3QpIHNpemVvZihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpCitFWFRFUk4odm9pZCkganBlZ19DcmVhdGVDb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkpOworRVhURVJOKHZvaWQpIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCWludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkpOworLyogRGVzdHJ1Y3Rpb24gb2YgSlBFRyBjb21wcmVzc2lvbiBvYmplY3RzICovCitFWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogU3RhbmRhcmQgZGF0YSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzOiBzdGRpbyBzdHJlYW1zLiAqLworLyogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBvcGVuaW5nIHRoZSBmaWxlIGJlZm9yZSBhbmQgY2xvc2luZyBhZnRlci4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX2Rlc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIG91dGZpbGUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX3NyYyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpKTsKKworLyogRGVmYXVsdCBwYXJhbWV0ZXIgc2V0dXAgZm9yIGNvbXByZXNzaW9uICovCitFWFRFUk4odm9pZCkganBlZ19zZXRfZGVmYXVsdHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworLyogQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNldHVwIGFpZHMgKi8KK0VYVEVSTih2b2lkKSBqcGVnX3NldF9jb2xvcnNwYWNlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgSl9DT0xPUl9TUEFDRSBjb2xvcnNwYWNlKSk7CitFWFRFUk4odm9pZCkganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfc2V0X3F1YWxpdHkgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHF1YWxpdHksCisJCQkJICAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOworRVhURVJOKHZvaWQpIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgaW50IHNjYWxlX2ZhY3RvciwKKwkJCQkJICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7CitFWFRFUk4odm9pZCkganBlZ19hZGRfcXVhbnRfdGFibGUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHdoaWNoX3RibCwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpiYXNpY190YWJsZSwKKwkJCQkgICAgICAgaW50IHNjYWxlX2ZhY3RvciwKKwkJCQkgICAgICAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOworRVhURVJOKGludCkganBlZ19xdWFsaXR5X3NjYWxpbmcgSlBQKChpbnQgcXVhbGl0eSkpOworRVhURVJOKHZvaWQpIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX3N1cHByZXNzX3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgICBib29sZWFuIHN1cHByZXNzKSk7CitFWFRFUk4oSlFVQU5UX1RCTCAqKSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CitFWFRFUk4oSkhVRkZfVEJMICopIGpwZWdfYWxsb2NfaHVmZl90YWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworCisvKiBNYWluIGVudHJ5IHBvaW50cyBmb3IgY29tcHJlc3Npb24gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3N0YXJ0X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKSk7CitFWFRFUk4oSkRJTUVOU0lPTikganBlZ193cml0ZV9zY2FubGluZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKKwkJCQkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOworRVhURVJOKHZvaWQpIGpwZWdfZmluaXNoX2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogUmVwbGFjZXMganBlZ193cml0ZV9zY2FubGluZXMgd2hlbiB3cml0aW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLiAqLworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfd3JpdGVfcmF3X2RhdGEgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpTQU1QSU1BR0UgZGF0YSwKKwkJCQkJICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKSk7CisKKy8qIFdyaXRlIGEgc3BlY2lhbCBtYXJrZXIuICBTZWUgbGlianBlZy5kb2MgY29uY2VybmluZyBzYWZlIHVzYWdlLiAqLworRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbWFya2VyCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKKwkgICAgIGNvbnN0IEpPQ1RFVCAqIGRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7CisvKiBTYW1lLCBidXQgcGllY2VtZWFsLiAqLworRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbV9oZWFkZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOworRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbV9ieXRlCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkpOworCisvKiBBbHRlcm5hdGUgY29tcHJlc3Npb24gZnVuY3Rpb246IGp1c3Qgd3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUgZmlsZSAqLworRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlICovCitFWFRFUk4oaW50KSBqcGVnX3JlYWRfaGVhZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgIGJvb2xlYW4gcmVxdWlyZV9pbWFnZSkpOworLyogUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogKi8KKyNkZWZpbmUgSlBFR19TVVNQRU5ERUQJCTAgLyogU3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGlucHV0IGRhdGEgKi8KKyNkZWZpbmUgSlBFR19IRUFERVJfT0sJCTEgLyogRm91bmQgdmFsaWQgaW1hZ2UgZGF0YXN0cmVhbSAqLworI2RlZmluZSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWQkyIC8qIEZvdW5kIHZhbGlkIHRhYmxlLXNwZWNzLW9ubHkgZGF0YXN0cmVhbSAqLworLyogSWYgeW91IHBhc3MgcmVxdWlyZV9pbWFnZSA9IFRSVUUgKG5vcm1hbCBjYXNlKSwgeW91IG5lZWQgbm90IGNoZWNrIGZvcgorICogYSBUQUJMRVNfT05MWSByZXR1cm4gY29kZTsgYW4gYWJicmV2aWF0ZWQgZmlsZSB3aWxsIGNhdXNlIGFuIGVycm9yIGV4aXQuCisgKiBKUEVHX1NVU1BFTkRFRCBpcyBvbmx5IHBvc3NpYmxlIGlmIHlvdSB1c2UgYSBkYXRhIHNvdXJjZSBtb2R1bGUgdGhhdCBjYW4KKyAqIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybiAodGhlIHN0ZGlvIHNvdXJjZSBtb2R1bGUgZG9lc24ndCkuCisgKi8KKworLyogTWFpbiBlbnRyeSBwb2ludHMgZm9yIGRlY29tcHJlc3Npb24gKi8KK0VYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3NjYW5saW5lcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKKwkJCQkJICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19maW5pc2hfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogUmVwbGFjZXMganBlZ19yZWFkX3NjYW5saW5lcyB3aGVuIHJlYWRpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuICovCitFWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3Jhd19kYXRhIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgSlNBTVBJTUFHRSBkYXRhLAorCQkJCQkgICBKRElNRU5TSU9OIG1heF9saW5lcykpOworCisvKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KK0VYVEVSTihib29sZWFuKSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgIGludCBzY2FuX251bWJlcikpOworRVhURVJOKGJvb2xlYW4pIGpwZWdfZmluaXNoX291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX2lucHV0X2NvbXBsZXRlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfbmV3X2NvbG9ybWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGludCkganBlZ19jb25zdW1lX2lucHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworLyogUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogKi8KKy8qICNkZWZpbmUgSlBFR19TVVNQRU5ERUQJMCAgICBTdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgaW5wdXQgZGF0YSAqLworI2RlZmluZSBKUEVHX1JFQUNIRURfU09TCTEgLyogUmVhY2hlZCBzdGFydCBvZiBuZXcgc2NhbiAqLworI2RlZmluZSBKUEVHX1JFQUNIRURfRU9JCTIgLyogUmVhY2hlZCBlbmQgb2YgaW1hZ2UgKi8KKyNkZWZpbmUgSlBFR19ST1dfQ09NUExFVEVECTMgLyogQ29tcGxldGVkIG9uZSBpTUNVIHJvdyAqLworI2RlZmluZSBKUEVHX1NDQU5fQ09NUExFVEVECTQgLyogQ29tcGxldGVkIGxhc3QgaU1DVSByb3cgb2YgYSBzY2FuICovCisKKy8qIFByZWNhbGN1bGF0ZSBvdXRwdXQgZGltZW5zaW9ucyBmb3IgY3VycmVudCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICovCitFWFRFUk4odm9pZCkganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBDb250cm9sIHNhdmluZyBvZiBDT00gYW5kIEFQUG4gbWFya2VycyBpbnRvIG1hcmtlcl9saXN0LiAqLworRVhURVJOKHZvaWQpIGpwZWdfc2F2ZV9tYXJrZXJzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCisJICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0KSk7CisKKy8qIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLiAqLworRVhURVJOKHZvaWQpIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKKwkgICAgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2Qgcm91dGluZSkpOworCisvKiBSZWFkIG9yIHdyaXRlIHJhdyBEQ1QgY29lZmZpY2llbnRzIC0tLSB1c2VmdWwgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nLiAqLworRVhURVJOKGp2aXJ0X2JhcnJheV9wdHIgKikganBlZ19yZWFkX2NvZWZmaWNpZW50cyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykpOworRVhURVJOKHZvaWQpIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAorCQkJCQkJal9jb21wcmVzc19wdHIgZHN0aW5mbykpOworCisvKiBJZiB5b3UgY2hvb3NlIHRvIGFib3J0IGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gYmVmb3JlIGNvbXBsZXRpbmcKKyAqIGpwZWdfZmluaXNoXyhkZSljb21wcmVzcywgdGhlbiB5b3UgbmVlZCB0byBjbGVhbiB1cCB0byByZWxlYXNlIG1lbW9yeSwKKyAqIHRlbXBvcmFyeSBmaWxlcywgZXRjLiAgWW91IGNhbiBqdXN0IGNhbGwganBlZ19kZXN0cm95XyhkZSljb21wcmVzcworICogaWYgeW91J3JlIGRvbmUgd2l0aCB0aGUgSlBFRyBvYmplY3QsIGJ1dCBpZiB5b3Ugd2FudCB0byBjbGVhbiBpdCB1cCBhbmQKKyAqIHJldXNlIGl0LCBjYWxsIHRoaXM6CisgKi8KK0VYVEVSTih2b2lkKSBqcGVnX2Fib3J0X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX2Fib3J0X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIEdlbmVyaWMgdmVyc2lvbnMgb2YganBlZ19hYm9ydCBhbmQganBlZ19kZXN0cm95IHRoYXQgd29yayBvbiBlaXRoZXIKKyAqIGZsYXZvciBvZiBKUEVHIG9iamVjdC4gIFRoZXNlIG1heSBiZSBtb3JlIGNvbnZlbmllbnQgaW4gc29tZSBwbGFjZXMuCisgKi8KK0VYVEVSTih2b2lkKSBqcGVnX2Fib3J0IEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19kZXN0cm95IEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CisKKy8qIERlZmF1bHQgcmVzdGFydC1tYXJrZXItcmVzeW5jIHByb2NlZHVyZSBmb3IgdXNlIGJ5IGRhdGEgc291cmNlIG1vZHVsZXMgKi8KK0VYVEVSTihib29sZWFuKSBqcGVnX3Jlc3luY190b19yZXN0YXJ0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIGludCBkZXNpcmVkKSk7CisKKworLyogVGhlc2UgbWFya2VyIGNvZGVzIGFyZSBleHBvcnRlZCBzaW5jZSBhcHBsaWNhdGlvbnMgYW5kIGRhdGEgc291cmNlIG1vZHVsZXMKKyAqIGFyZSBsaWtlbHkgdG8gd2FudCB0byB1c2UgdGhlbS4KKyAqLworCisjZGVmaW5lIEpQRUdfUlNUMAkweEQwCS8qIFJTVDAgbWFya2VyIGNvZGUgKi8KKyNkZWZpbmUgSlBFR19FT0kJMHhEOQkvKiBFT0kgbWFya2VyIGNvZGUgKi8KKyNkZWZpbmUgSlBFR19BUFAwCTB4RTAJLyogQVBQMCBtYXJrZXIgY29kZSAqLworI2RlZmluZSBKUEVHX0NPTQkweEZFCS8qIENPTSBtYXJrZXIgY29kZSAqLworCisKKy8qIElmIHdlIGhhdmUgYSBicmFpbi1kYW1hZ2VkIGNvbXBpbGVyIHRoYXQgZW1pdHMgd2FybmluZ3MgKG9yIHdvcnNlLCBlcnJvcnMpCisgKiBmb3Igc3RydWN0dXJlIGRlZmluaXRpb25zIHRoYXQgYXJlIG5ldmVyIGZpbGxlZCBpbiwga2VlcCBpdCBxdWlldCBieQorICogc3VwcGx5aW5nIGR1bW15IGRlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBzdWJzdHJ1Y3R1cmVzLgorICovCisKKyNpZmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorI2lmbmRlZiBKUEVHX0lOVEVSTkFMUwkJLyogd2lsbCBiZSBkZWZpbmVkIGluIGpwZWdpbnQuaCAqLworc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kb3duc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX3Vwc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgeyBsb25nIGR1bW15OyB9OworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisjZW5kaWYgLyogSU5DT01QTEVURV9UWVBFU19CUk9LRU4gKi8KKworCisvKgorICogVGhlIEpQRUcgbGlicmFyeSBtb2R1bGVzIGRlZmluZSBKUEVHX0lOVEVSTkFMUyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4KKyAqIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIGFyZSByZWFkIG9ubHkgd2hlbiB0aGF0IGlzIHRydWUuCisgKiBBcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBpbmNsdWRlIGpwZWdpbnQuaCwgYnV0IG1heSB3aXNoCisgKiB0byBpbmNsdWRlIGplcnJvci5oLgorICovCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImpwZWdpbnQuaCIJCS8qIGZldGNoIHByaXZhdGUgZGVjbGFyYXRpb25zICovCisjaW5jbHVkZSAiamVycm9yLmgiCQkvKiBmZXRjaCBlcnJvciBjb2RlcyB0b28gKi8KKyNlbmRpZgorCisjZW5kaWYgLyogSlBFR0xJQl9IICovCmRpZmYgLS1naXQgYS9qcGVndHJhbi4xIGIvanBlZ3RyYW4uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGUxOGUyCi0tLSAvZGV2L251bGwKKysrIGIvanBlZ3RyYW4uMQpAQCAtMCwwICsxLDIzOCBAQAorLlRIIEpQRUdUUkFOIDEgIjMgQXVndXN0IDE5OTciCisuU0ggTkFNRQoranBlZ3RyYW4gXC0gbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gb2YgSlBFRyBmaWxlcworLlNIIFNZTk9QU0lTCisuQiBqcGVndHJhbgorWworLkkgb3B0aW9ucworXQorWworLkkgZmlsZW5hbWUKK10KKy5MUAorLlNIIERFU0NSSVBUSU9OCisuTFAKKy5CIGpwZWd0cmFuCitwZXJmb3JtcyB2YXJpb3VzIHVzZWZ1bCB0cmFuc2Zvcm1hdGlvbnMgb2YgSlBFRyBmaWxlcy4KK0l0IGNhbiB0cmFuc2xhdGUgdGhlIGNvZGVkIHJlcHJlc2VudGF0aW9uIGZyb20gb25lIHZhcmlhbnQgb2YgSlBFRyB0byBhbm90aGVyLAorZm9yIGV4YW1wbGUgZnJvbSBiYXNlbGluZSBKUEVHIHRvIHByb2dyZXNzaXZlIEpQRUcgb3IgdmljZSB2ZXJzYS4gIEl0IGNhbiBhbHNvCitwZXJmb3JtIHNvbWUgcmVhcnJhbmdlbWVudHMgb2YgdGhlIGltYWdlIGRhdGEsIGZvciBleGFtcGxlIHR1cm5pbmcgYW4gaW1hZ2UKK2Zyb20gbGFuZHNjYXBlIHRvIHBvcnRyYWl0IGZvcm1hdCBieSByb3RhdGlvbi4KKy5QUAorLkIganBlZ3RyYW4KK3dvcmtzIGJ5IHJlYXJyYW5naW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKERDVCBjb2VmZmljaWVudHMpLCB3aXRob3V0CitldmVyIGZ1bGx5IGRlY29kaW5nIHRoZSBpbWFnZS4gIFRoZXJlZm9yZSwgaXRzIHRyYW5zZm9ybWF0aW9ucyBhcmUgbG9zc2xlc3M6Cit0aGVyZSBpcyBubyBpbWFnZSBkZWdyYWRhdGlvbiBhdCBhbGwsIHdoaWNoIHdvdWxkIG5vdCBiZSB0cnVlIGlmIHlvdSB1c2VkCisuQiBkanBlZworZm9sbG93ZWQgYnkKKy5CIGNqcGVnCit0byBhY2NvbXBsaXNoIHRoZSBzYW1lIGNvbnZlcnNpb24uICBCdXQgYnkgdGhlIHNhbWUgdG9rZW4sCisuQiBqcGVndHJhbgorY2Fubm90IHBlcmZvcm0gbG9zc3kgb3BlcmF0aW9ucyBzdWNoIGFzIGNoYW5naW5nIHRoZSBpbWFnZSBxdWFsaXR5LgorLlBQCisuQiBqcGVndHJhbgorcmVhZHMgdGhlIG5hbWVkIEpQRUcvSkZJRiBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcworbmFtZWQsIGFuZCBwcm9kdWNlcyBhIEpQRUcvSkZJRiBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisuU0ggT1BUSU9OUworQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAorLkIgXC1vcHRpbWl6ZQorbWF5IGJlIHdyaXR0ZW4KKy5CIFwtb3B0CitvcgorLkJSIFwtbyAuCitVcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudC4KK0JyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLAorLkJSIFwtb3B0aW1pc2UgKSwKK3Rob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KKy5QUAorVG8gc3BlY2lmeSB0aGUgY29kZWQgSlBFRyByZXByZXNlbnRhdGlvbiB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSwKKy5CIGpwZWd0cmFuCithY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5CisuQlIgY2pwZWcgOgorLlRQCisuQiBcLW9wdGltaXplCitQZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuCisuVFAKKy5CIFwtcHJvZ3Jlc3NpdmUKK0NyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUuCisuVFAKKy5CSSBcLXJlc3RhcnQgIiBOIgorRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkgTiBNQ1UgYmxvY2tzIGlmICJCIiBpcworYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KKy5UUAorLkJJIFwtc2NhbnMgIiBmaWxlIgorVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KKy5QUAorU2VlCisuQlIgY2pwZWcgKDEpCitmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZXNlIHN3aXRjaGVzLgorSWYgeW91IHNwZWNpZnkgbm9uZSBvZiB0aGVzZSBzd2l0Y2hlcywgeW91IGdldCBhIHBsYWluIGJhc2VsaW5lLUpQRUcgb3V0cHV0CitmaWxlLiAgVGhlIHF1YWxpdHkgc2V0dGluZyBhbmQgc28gZm9ydGggYXJlIGRldGVybWluZWQgYnkgdGhlIGlucHV0IGZpbGUuCisuUFAKK1RoZSBpbWFnZSBjYW4gYmUgbG9zc2xlc3NseSB0cmFuc2Zvcm1lZCBieSBnaXZpbmcgb25lIG9mIHRoZXNlIHN3aXRjaGVzOgorLlRQCisuQiBcLWZsaXAgaG9yaXpvbnRhbAorTWlycm9yIGltYWdlIGhvcml6b250YWxseSAobGVmdC1yaWdodCkuCisuVFAKKy5CIFwtZmxpcCB2ZXJ0aWNhbAorTWlycm9yIGltYWdlIHZlcnRpY2FsbHkgKHRvcC1ib3R0b20pLgorLlRQCisuQiBcLXJvdGF0ZSA5MAorUm90YXRlIGltYWdlIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLgorLlRQCisuQiBcLXJvdGF0ZSAxODAKK1JvdGF0ZSBpbWFnZSAxODAgZGVncmVlcy4KKy5UUAorLkIgXC1yb3RhdGUgMjcwCitSb3RhdGUgaW1hZ2UgMjcwIGRlZ3JlZXMgY2xvY2t3aXNlIChvciA5MCBjY3cpLgorLlRQCisuQiBcLXRyYW5zcG9zZQorVHJhbnNwb3NlIGltYWdlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuCisuVFAKKy5CIFwtdHJhbnN2ZXJzZQorVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgKGFjcm9zcyBVUi10by1MTCBheGlzKS4KKy5QUAorVGhlIHRyYW5zcG9zZSB0cmFuc2Zvcm1hdGlvbiBoYXMgbm8gcmVzdHJpY3Rpb25zIHJlZ2FyZGluZyBpbWFnZSBkaW1lbnNpb25zLgorVGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBvcGVyYXRlIHJhdGhlciBvZGRseSBpZiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgbm90CithIG11bHRpcGxlIG9mIHRoZSBpTUNVIHNpemUgKHVzdWFsbHkgOCBvciAxNiBwaXhlbHMpLCBiZWNhdXNlIHRoZXkgY2FuIG9ubHkKK3RyYW5zZm9ybSBjb21wbGV0ZSBibG9ja3Mgb2YgRENUIGNvZWZmaWNpZW50IGRhdGEgaW4gdGhlIGRlc2lyZWQgd2F5LgorLlBQCisuQlIganBlZ3RyYW4gJ3MKK2RlZmF1bHQgYmVoYXZpb3Igd2hlbiB0cmFuc2Zvcm1pbmcgYW4gb2RkLXNpemUgaW1hZ2UgaXMgZGVzaWduZWQKK3RvIHByZXNlcnZlIGV4YWN0IHJldmVyc2liaWxpdHkgYW5kIG1hdGhlbWF0aWNhbCBjb25zaXN0ZW5jeSBvZiB0aGUKK3RyYW5zZm9ybWF0aW9uIHNldC4gIEFzIHN0YXRlZCwgdHJhbnNwb3NlIGlzIGFibGUgdG8gZmxpcCB0aGUgZW50aXJlIGltYWdlCithcmVhLiAgSG9yaXpvbnRhbCBtaXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1UgY29sdW1uIGF0IHRoZSByaWdodCBlZGdlCit1bnRvdWNoZWQsIGJ1dCBpcyBhYmxlIHRvIGZsaXAgYWxsIHJvd3Mgb2YgdGhlIGltYWdlLiAgU2ltaWxhcmx5LCB2ZXJ0aWNhbAorbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIHJvdyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLCBidXQgaXMKK2FibGUgdG8gZmxpcCBhbGwgY29sdW1ucy4gIFRoZSBvdGhlciB0cmFuc2Zvcm1zIGNhbiBiZSBidWlsdCB1cCBhcyBzZXF1ZW5jZXMKK29mIHRyYW5zcG9zZSBhbmQgZmxpcCBvcGVyYXRpb25zOyBmb3IgY29uc2lzdGVuY3ksIHRoZWlyIGFjdGlvbnMgb24gZWRnZQorcGl4ZWxzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBlbmQgcmVzdWx0IG9mIHRoZSBjb3JyZXNwb25kaW5nCit0cmFuc3Bvc2UtYW5kLWZsaXAgc2VxdWVuY2UuCisuUFAKK0ZvciBwcmFjdGljYWwgdXNlLCB5b3UgbWF5IHByZWZlciB0byBkaXNjYXJkIGFueSB1bnRyYW5zZm9ybWFibGUgZWRnZSBwaXhlbHMKK3JhdGhlciB0aGFuIGhhdmluZyBhIHN0cmFuZ2UtbG9va2luZyBzdHJpcCBhbG9uZyB0aGUgcmlnaHQgYW5kL29yIGJvdHRvbSBlZGdlcworb2YgYSB0cmFuc2Zvcm1lZCBpbWFnZS4gIFRvIGRvIHRoaXMsIGFkZCB0aGUKKy5CIFwtdHJpbQorc3dpdGNoOgorLlRQCisuQiBcLXRyaW0KK0Ryb3Agbm9uLXRyYW5zZm9ybWFibGUgZWRnZSBibG9ja3MuCisuUFAKK09idmlvdXNseSwgYSB0cmFuc2Zvcm1hdGlvbiB3aXRoCisuQiBcLXRyaW0KK2lzIG5vdCByZXZlcnNpYmxlLCBzbyBzdHJpY3RseSBzcGVha2luZworLkIganBlZ3RyYW4KK3dpdGggdGhpcyBzd2l0Y2ggaXMgbm90IGxvc3NsZXNzLiAgQWxzbywgdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbAorZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybWF0aW9ucyBubyBsb25nZXIgaG9sZC4gIEZvciBleGFtcGxlLAorLkIgXC1yb3QgMjcwIC10cmltCit0cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0CisuQiBcLXJvdCA5MCAtdHJpbQorZm9sbG93ZWQgYnkKKy5CIFwtcm90IDE4MCAtdHJpbQordHJpbXMgYm90aCBlZGdlcy4KKy5QUAorQW5vdGhlciBub3Qtc3RyaWN0bHktbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gc3dpdGNoIGlzOgorLlRQCisuQiBcLWdyYXlzY2FsZQorRm9yY2UgZ3JheXNjYWxlIG91dHB1dC4KKy5QUAorVGhpcyBvcHRpb24gZGlzY2FyZHMgdGhlIGNocm9taW5hbmNlIGNoYW5uZWxzIGlmIHRoZSBpbnB1dCBpbWFnZSBpcyBZQ2JDcgorKGllLCBhIHN0YW5kYXJkIGNvbG9yIEpQRUcpLCByZXN1bHRpbmcgaW4gYSBncmF5c2NhbGUgSlBFRyBmaWxlLiAgVGhlCitsdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseSwgc28gdGhpcyBpcyBhIGJldHRlciBtZXRob2Qgb2YgcmVkdWNpbmcKK3RvIGdyYXlzY2FsZSB0aGFuIGRlY29tcHJlc3Npb24sIGNvbnZlcnNpb24sIGFuZCByZWNvbXByZXNzaW9uLiAgVGhpcyBzd2l0Y2gKK2lzIHBhcnRpY3VsYXJseSBoYW5keSBmb3IgZml4aW5nIGEgbW9ub2Nocm9tZSBwaWN0dXJlIHRoYXQgd2FzIG1pc3Rha2VubHkKK2VuY29kZWQgYXMgYSBjb2xvciBKUEVHLiAgKEluIHN1Y2ggYSBjYXNlLCB0aGUgc3BhY2Ugc2F2aW5ncyBmcm9tIGdldHRpbmcgcmlkCitvZiB0aGUgbmVhci1lbXB0eSBjaHJvbWEgY2hhbm5lbHMgd29uJ3QgYmUgbGFyZ2U7IGJ1dCB0aGUgZGVjb2RpbmcgdGltZSBmb3IKK2EgZ3JheXNjYWxlIEpQRUcgaXMgc3Vic3RhbnRpYWxseSBsZXNzIHRoYW4gdGhhdCBmb3IgYSBjb2xvciBKUEVHLikKKy5QUAorLkIganBlZ3RyYW4KK2Fsc28gcmVjb2duaXplcyB0aGVzZSBzd2l0Y2hlcyB0aGF0IGNvbnRyb2wgd2hhdCB0byBkbyB3aXRoICJleHRyYSIgbWFya2VycywKK3N1Y2ggYXMgY29tbWVudCBibG9ja3M6CisuVFAKKy5CIFwtY29weSBub25lCitDb3B5IG5vIGV4dHJhIG1hcmtlcnMgZnJvbSBzb3VyY2UgZmlsZS4gIFRoaXMgc2V0dGluZyBzdXBwcmVzc2VzIGFsbAorY29tbWVudHMgYW5kIG90aGVyIGV4Y2VzcyBiYWdnYWdlIHByZXNlbnQgaW4gdGhlIHNvdXJjZSBmaWxlLgorLlRQCisuQiBcLWNvcHkgY29tbWVudHMKK0NvcHkgb25seSBjb21tZW50IG1hcmtlcnMuICBUaGlzIHNldHRpbmcgY29waWVzIGNvbW1lbnRzIGZyb20gdGhlIHNvdXJjZSBmaWxlLAorYnV0IGRpc2NhcmRzIGFueSBvdGhlciBpbmVzc2VudGlhbCBkYXRhLgorLlRQCisuQiBcLWNvcHkgYWxsCitDb3B5IGFsbCBleHRyYSBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIHByZXNlcnZlcyBtaXNjZWxsYW5lb3VzIG1hcmtlcnMKK2ZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZSwgc3VjaCBhcyBKRklGIHRodW1ibmFpbHMgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4KK0luIHNvbWUgZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KKy5QUAorVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKKy5CUiAiXC1jb3B5IGNvbW1lbnRzIiAuCisoTm90ZTogaW4gSUpHIHJlbGVhc2VzIHY2IGFuZCB2NmEsCisuQiBqcGVndHJhbgorYWx3YXlzIGRpZCB0aGUgZXF1aXZhbGVudCBvZgorLkJSICJcLWNvcHkgbm9uZSIgLikKKy5QUAorQWRkaXRpb25hbCBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5IGpwZWd0cmFuIGFyZToKKy5UUAorLkJJIFwtbWF4bWVtb3J5ICIgTiIKK1NldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZyBsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcworaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvciBtaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlCitudW1iZXIuICBGb3IgZXhhbXBsZSwKKy5CIFwtbWF4IDRtCitzZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KKy5UUAorLkJJIFwtb3V0ZmlsZSAiIG5hbWUiCitTZW5kIG91dHB1dCBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZSwgbm90IHRvIHN0YW5kYXJkIG91dHB1dC4KKy5UUAorLkIgXC12ZXJib3NlCitFbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlCisuQlIgXC12ICdzCitnaXZlIG1vcmUgb3V0cHV0LiAgQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCisuVFAKKy5CIFwtZGVidWcKK1NhbWUgYXMKKy5CUiBcLXZlcmJvc2UgLgorLlNIIEVYQU1QTEVTCisuTFAKK1RoaXMgZXhhbXBsZSBjb252ZXJ0cyBhIGJhc2VsaW5lIEpQRUcgZmlsZSB0byBwcm9ncmVzc2l2ZSBmb3JtOgorLklQCisuQiBqcGVndHJhbiBcLXByb2dyZXNzaXZlCisuSSBmb28uanBnCisuQiA+CisuSSBmb29wcm9nLmpwZworLlBQCitUaGlzIGV4YW1wbGUgcm90YXRlcyBhbiBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZSwgZGlzY2FyZGluZyBhbnkKK3Vucm90YXRhYmxlIGVkZ2UgcGl4ZWxzOgorLklQCisuQiBqcGVndHJhbiBcLXJvdCA5MCAtdHJpbQorLkkgZm9vLmpwZworLkIgPgorLkkgZm9vOTAuanBnCisuU0ggRU5WSVJPTk1FTlQKKy5UUAorLkIgSlBFR01FTQorSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0cyB2YWx1ZSBpcyB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuCitUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBmb3IgdGhlCisuQiBcLW1heG1lbW9yeQorc3dpdGNoLgorLkIgSlBFR01FTQorb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kCitpdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbiBleHBsaWNpdAorLkJSIFwtbWF4bWVtb3J5IC4KKy5TSCBTRUUgQUxTTworLkJSIGNqcGVnICgxKSwKKy5CUiBkanBlZyAoMSksCisuQlIgcmRqcGdjb20gKDEpLAorLkJSIHdyanBnY29tICgxKQorLmJyCitXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCitDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkxICh2b2wuIDM0LCBuby4gNCksIHBwLiAzMC00NC4KKy5TSCBBVVRIT1IKK0luZGVwZW5kZW50IEpQRUcgR3JvdXAKKy5TSCBCVUdTCitBcml0aG1ldGljIGNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLgorLlBQCitUaGUgdHJhbnNmb3JtIG9wdGlvbnMgY2FuJ3QgdHJhbnNmb3JtIG9kZC1zaXplIGltYWdlcyBwZXJmZWN0bHkuICBVc2UKKy5CIFwtdHJpbQoraWYgeW91IGRvbid0IGxpa2UgdGhlIHJlc3VsdHMgd2l0aG91dCBpdC4KKy5QUAorVGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGludG8gbWVtb3J5IGFuZCB0aGVuIHdyaXR0ZW4gb3V0IGFnYWluLCBldmVuIGluCitjYXNlcyB3aGVyZSB0aGlzIGlzbid0IHJlYWxseSBuZWNlc3NhcnkuICBFeHBlY3Qgc3dhcHBpbmcgb24gbGFyZ2UgaW1hZ2VzLAorZXNwZWNpYWxseSB3aGVuIHVzaW5nIHRoZSBtb3JlIGNvbXBsZXggdHJhbnNmb3JtIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9qcGVndHJhbi5jIGIvanBlZ3RyYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGVmMTExCi0tLSAvZGV2L251bGwKKysrIGIvanBlZ3RyYW4uYwpAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIGpwZWd0cmFuLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvbW1hbmQtbGluZSB1c2VyIGludGVyZmFjZSBmb3IgSlBFRyB0cmFuc2NvZGluZy4KKyAqIEl0IGlzIHZlcnkgc2ltaWxhciB0byBjanBlZy5jLCBidXQgcHJvdmlkZXMgbG9zc2xlc3MgdHJhbnNjb2RpbmcgYmV0d2VlbgorICogZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXRzLiAgSXQgYWxzbyBwcm92aWRlcyBzb21lIGxvc3NsZXNzIGFuZCBzb3J0LW9mLQorICogbG9zc2xlc3MgdHJhbnNmb3JtYXRpb25zIG9mIEpQRUcgZGF0YS4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworI2luY2x1ZGUgInRyYW5zdXBwLmgiCQkvKiBTdXBwb3J0IHJvdXRpbmVzIGZvciBqcGVndHJhbiAqLworI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKgorICogQXJndW1lbnQtcGFyc2luZyBjb2RlLgorICogVGhlIHN3aXRjaCBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgdXNlZnVsIHdpdGggRE9TLXN0eWxlIGNvbW1hbmQgbGluZQorICogc3ludGF4LCBpZSwgaW50ZXJtaXhlZCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lcywgd2hlcmUgb25seSB0aGUgc3dpdGNoZXMKKyAqIHRvIHRoZSBsZWZ0IG9mIGEgZ2l2ZW4gZmlsZSBuYW1lIGFmZmVjdCBwcm9jZXNzaW5nIG9mIHRoYXQgZmlsZS4KKyAqIFRoZSBtYWluIHByb2dyYW0gaW4gdGhpcyBmaWxlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoaXMgY2FwYWJpbGl0eS4uLgorICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLworc3RhdGljIGNoYXIgKiBvdXRmaWxlbmFtZTsJLyogZm9yIC1vdXRmaWxlIHN3aXRjaCAqLworc3RhdGljIEpDT1BZX09QVElPTiBjb3B5b3B0aW9uOwkvKiAtY29weSBzd2l0Y2ggKi8KK3N0YXRpYyBqcGVnX3RyYW5zZm9ybV9pbmZvIHRyYW5zZm9ybW9wdGlvbjsgLyogaW1hZ2UgdHJhbnNmb3JtYXRpb24gb3B0aW9ucyAqLworCisKK0xPQ0FMKHZvaWQpCit1c2FnZSAodm9pZCkKKy8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KK3sKKyAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7CisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7CisjZWxzZQorICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKKyNlbmRpZgorCisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IG5vbmUgICAgIENvcHkgbm8gZXh0cmEgbWFya2VycyBmcm9tIHNvdXJjZSBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IGNvbW1lbnRzIENvcHkgb25seSBjb21tZW50IG1hcmtlcnMgKGRlZmF1bHQpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IGFsbCAgICAgIENvcHkgYWxsIGV4dHJhIG1hcmtlcnNcbiIpOworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9wdGltaXplICAgICAgT3B0aW1pemUgSHVmZm1hbiB0YWJsZSAoc21hbGxlciBmaWxlLCBidXQgc2xvdyBjb21wcmVzc2lvbilcbiIpOworI2VuZGlmCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1wcm9ncmVzc2l2ZSAgIENyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVcbiIpOworI2VuZGlmCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgbW9kaWZ5aW5nIHRoZSBpbWFnZTpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgUmVkdWNlIHRvIGdyYXlzY2FsZSAob21pdCBjb2xvciBkYXRhKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZmxpcCBbaG9yaXpvbnRhbHx2ZXJ0aWNhbF0gIE1pcnJvciBpbWFnZSAobGVmdC1yaWdodCBvciB0b3AtYm90dG9tKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcm90YXRlIFs5MHwxODB8MjcwXSAgICAgICAgIFJvdGF0ZSBpbWFnZSAoZGVncmVlcyBjbG9ja3dpc2UpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC10cmFuc3Bvc2UgICAgIFRyYW5zcG9zZSBpbWFnZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdHJhbnN2ZXJzZSAgICBUcmFuc3ZlcnNlIHRyYW5zcG9zZSBpbWFnZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdHJpbSAgICAgICAgICBEcm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzXG4iKTsKKyNlbmRpZiAvKiBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlc3RhcnQgTiAgICAgU2V0IHJlc3RhcnQgaW50ZXJ2YWwgaW4gcm93cywgb3IgaW4gYmxvY2tzIHdpdGggQlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtbWF4bWVtb3J5IE4gICBNYXhpbXVtIG1lbW9yeSB0byB1c2UgKGluIGtieXRlcylcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOworI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKKyNlbmRpZgorI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNjYW5zIGZpbGUgICAgQ3JlYXRlIG11bHRpLXNjYW4gSlBFRyBwZXIgc2NyaXB0IGZpbGVcbiIpOworI2VuZGlmCisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X3RyYW5zZm9ybSAoSlhGT1JNX0NPREUgdHJhbnNmb3JtKQorLyogU2lsbHkgbGl0dGxlIHJvdXRpbmUgdG8gZGV0ZWN0IG11bHRpcGxlIHRyYW5zZm9ybSBvcHRpb25zLAorICogd2hpY2ggd2UgY2FuJ3QgaGFuZGxlLgorICovCit7CisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgaWYgKHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPT0gSlhGT1JNX05PTkUgfHwKKyAgICAgIHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPT0gdHJhbnNmb3JtKSB7CisgICAgdHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4gb25seSBkbyBvbmUgaW1hZ2UgdHJhbnNmb3JtYXRpb24gYXQgYSB0aW1lXG4iLAorCSAgICBwcm9nbmFtZSk7CisgICAgdXNhZ2UoKTsKKyAgfQorI2Vsc2UKKyAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGltYWdlIHRyYW5zZm9ybWF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCisJICBwcm9nbmFtZSk7CisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorfQorCisKK0xPQ0FMKGludCkKK3BhcnNlX3N3aXRjaGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQorLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCisgKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCisgKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOworICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCisgKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKKyAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKKyAqIHByb2Nlc3NpbmcuCisgKi8KK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisgIGJvb2xlYW4gc2ltcGxlX3Byb2dyZXNzaXZlOworICBjaGFyICogc2NhbnNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2NhbnMgcGFybSBpZiBhbnkgKi8KKworICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCisgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IEZBTFNFOworICBvdXRmaWxlbmFtZSA9IE5VTEw7CisgIGNvcHlvcHRpb24gPSBKQ09QWU9QVF9ERUZBVUxUOworICB0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID0gSlhGT1JNX05PTkU7CisgIHRyYW5zZm9ybW9wdGlvbi50cmltID0gRkFMU0U7CisgIHRyYW5zZm9ybW9wdGlvbi5mb3JjZV9ncmF5c2NhbGUgPSBGQUxTRTsKKyAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAwOworCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFkanVzdCBwYXJhbWV0ZXJzICovCisKKyAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgeworICAgIGFyZyA9IGFyZ3ZbYXJnbl07CisgICAgaWYgKCphcmcgIT0gJy0nKSB7CisgICAgICAvKiBOb3QgYSBzd2l0Y2gsIG11c3QgYmUgYSBmaWxlIG5hbWUgYXJndW1lbnQgKi8KKyAgICAgIGlmIChhcmduIDw9IGxhc3RfZmlsZV9hcmdfc2VlbikgeworCW91dGZpbGVuYW1lID0gTlVMTDsJLyogLW91dGZpbGUgYXBwbGllcyB0byBqdXN0IG9uZSBpbnB1dCBmaWxlICovCisJY29udGludWU7CQkvKiBpZ25vcmUgdGhpcyBuYW1lIGlmIHByZXZpb3VzbHkgcHJvY2Vzc2VkICovCisgICAgICB9CisgICAgICBicmVhazsJCQkvKiBlbHNlIGRvbmUgcGFyc2luZyBzd2l0Y2hlcyAqLworICAgIH0KKyAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIHBhc3Qgc3dpdGNoIG1hcmtlciBjaGFyYWN0ZXIgKi8KKworICAgIGlmIChrZXltYXRjaChhcmcsICJhcml0aG1ldGljIiwgMSkpIHsKKyAgICAgIC8qIFVzZSBhcml0aG1ldGljIGNvZGluZy4gKi8KKyNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKyAgICAgIGNpbmZvLT5hcml0aF9jb2RlID0gVFJVRTsKKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgYXJpdGhtZXRpYyBjb2Rpbmcgbm90IHN1cHBvcnRlZFxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29weSIsIDEpKSB7CisgICAgICAvKiBTZWxlY3Qgd2hpY2ggZXh0cmEgbWFya2VycyB0byBjb3B5LiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJub25lIiwgMSkpIHsKKwljb3B5b3B0aW9uID0gSkNPUFlPUFRfTk9ORTsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImNvbW1lbnRzIiwgMSkpIHsKKwljb3B5b3B0aW9uID0gSkNPUFlPUFRfQ09NTUVOVFM7CisgICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJhbGwiLCAxKSkgeworCWNvcHlvcHRpb24gPSBKQ09QWU9QVF9BTEw7CisgICAgICB9IGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgeworICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KKyAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCisgICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKKworICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7CisJZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFR1RSQU4sIHZlcnNpb24gJXNcbiVzXG4iLAorCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7CisJcHJpbnRlZF92ZXJzaW9uID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsKys7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImZsaXAiLCAxKSkgeworICAgICAgLyogTWlycm9yIGxlZnQtcmlnaHQgb3IgdG9wLWJvdHRvbS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiaG9yaXpvbnRhbCIsIDEpKQorCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX0ZMSVBfSCk7CisgICAgICBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAidmVydGljYWwiLCAxKSkKKwlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9GTElQX1YpOworICAgICAgZWxzZQorCXVzYWdlKCk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdyYXlzY2FsZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgImdyZXlzY2FsZSIsMSkpIHsKKyAgICAgIC8qIEZvcmNlIHRvIGdyYXlzY2FsZS4gKi8KKyNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorICAgICAgdHJhbnNmb3Jtb3B0aW9uLmZvcmNlX2dyYXlzY2FsZSA9IFRSVUU7CisjZWxzZQorICAgICAgc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fTk9ORSk7CS8qIGZvcmNlIGFuIGVycm9yICovCisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWF4bWVtb3J5IiwgMykpIHsKKyAgICAgIC8qIE1heGltdW0gbWVtb3J5IGluIEtiIChvciBNYiB3aXRoICdtJykuICovCisgICAgICBsb25nIGx2YWw7CisgICAgICBjaGFyIGNoID0gJ3gnOworCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKKwl1c2FnZSgpOworICAgICAgaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCisJbHZhbCAqPSAxMDAwTDsKKyAgICAgIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gbHZhbCAqIDEwMDBMOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvcHRpbWl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgIm9wdGltaXNlIiwgMSkpIHsKKyAgICAgIC8qIEVuYWJsZSBlbnRyb3B5IHBhcm0gb3B0aW1pemF0aW9uLiAqLworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICAgICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7CisjZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGVudHJvcHkgb3B0aW1pemF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm91dGZpbGUiLCA0KSkgeworICAgICAgLyogU2V0IG91dHB1dCBmaWxlIG5hbWUuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbYXJnbl07CS8qIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlICovCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInByb2dyZXNzaXZlIiwgMSkpIHsKKyAgICAgIC8qIFNlbGVjdCBzaW1wbGUgcHJvZ3Jlc3NpdmUgbW9kZS4gKi8KKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgc2ltcGxlX3Byb2dyZXNzaXZlID0gVFJVRTsKKyAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgZXhlY3V0aW9uIHVudGlsIG51bV9jb21wb25lbnRzIGlzIGtub3duLiAqLworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBwcm9ncmVzc2l2ZSBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmVzdGFydCIsIDEpKSB7CisgICAgICAvKiBSZXN0YXJ0IGludGVydmFsIGluIE1DVSByb3dzIChvciBpbiBNQ1VzIHdpdGggJ2InKS4gKi8KKyAgICAgIGxvbmcgbHZhbDsKKyAgICAgIGNoYXIgY2ggPSAneCc7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQorCXVzYWdlKCk7CisgICAgICBpZiAobHZhbCA8IDAgfHwgbHZhbCA+IDY1NTM1TCkKKwl1c2FnZSgpOworICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKKwljaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIGx2YWw7CisJY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7IC8qIGVsc2UgcHJpb3IgJy1yZXN0YXJ0IG4nIG92ZXJyaWRlcyBtZSAqLworICAgICAgfSBlbHNlIHsKKwljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gKGludCkgbHZhbDsKKwkvKiByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgY29tcHV0ZWQgZHVyaW5nIHN0YXJ0dXAgKi8KKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicm90YXRlIiwgMikpIHsKKyAgICAgIC8qIFJvdGF0ZSA5MCwgMTgwLCBvciAyNzAgZGVncmVlcyAobWVhc3VyZWQgY2xvY2t3aXNlKS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiOTAiLCAyKSkKKwlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9ST1RfOTApOworICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjE4MCIsIDMpKQorCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1JPVF8xODApOworICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjI3MCIsIDMpKQorCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1JPVF8yNzApOworICAgICAgZWxzZQorCXVzYWdlKCk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYW5zIiwgMSkpIHsKKyAgICAgIC8qIFNldCBzY2FuIHNjcmlwdC4gKi8KKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIHNjYW5zYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1wcm9ncmVzc2l2ZSBhcHBlYXJzLiAqLworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBtdWx0aS1zY2FuIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0cmFuc3Bvc2UiLCAxKSkgeworICAgICAgLyogVHJhbnNwb3NlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuICovCisgICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9UUkFOU1BPU0UpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0cmFuc3ZlcnNlIiwgNikpIHsKKyAgICAgIC8qIFRyYW5zdmVyc2UgdHJhbnNwb3NlIChhY3Jvc3MgVVItdG8tTEwgYXhpcykuICovCisgICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9UUkFOU1ZFUlNFKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidHJpbSIsIDMpKSB7CisgICAgICAvKiBUcmltIG9mZiBhbnkgcGFydGlhbCBlZGdlIE1DVXMgdGhhdCB0aGUgdHJhbnNmb3JtIGNhbid0IGhhbmRsZS4gKi8KKyAgICAgIHRyYW5zZm9ybW9wdGlvbi50cmltID0gVFJVRTsKKworICAgIH0gZWxzZSB7CisgICAgICB1c2FnZSgpOwkJCS8qIGJvZ3VzIHN3aXRjaCAqLworICAgIH0KKyAgfQorCisgIC8qIFBvc3Qtc3dpdGNoLXNjYW5uaW5nIGNsZWFudXAgKi8KKworICBpZiAoZm9yX3JlYWwpIHsKKworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgaWYgKHNpbXBsZV9wcm9ncmVzc2l2ZSkJLyogcHJvY2VzcyAtcHJvZ3Jlc3NpdmU7IC1zY2FucyBjYW4gb3ZlcnJpZGUgKi8KKyAgICAgIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKGNpbmZvKTsKKyNlbmRpZgorCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgaWYgKHNjYW5zYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNjYW5zIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISByZWFkX3NjYW5fc2NyaXB0KGNpbmZvLCBzY2Fuc2FyZykpCisJdXNhZ2UoKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IHNyY2luZm87CisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBkc3RpbmZvOworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IganNyY2VyciwgamRzdGVycjsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7CisjZW5kaWYKKyAganZpcnRfYmFycmF5X3B0ciAqIHNyY19jb2VmX2FycmF5czsKKyAganZpcnRfYmFycmF5X3B0ciAqIGRzdF9jb2VmX2FycmF5czsKKyAgaW50IGZpbGVfaW5kZXg7CisgIEZJTEUgKiBpbnB1dF9maWxlOworICBGSUxFICogb3V0cHV0X2ZpbGU7CisKKyAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KKyNpZmRlZiBVU0VfQ0NPTU1BTkQKKyAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKKyNlbmRpZgorCisgIHByb2duYW1lID0gYXJndlswXTsKKyAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKKyAgICBwcm9nbmFtZSA9ICJqcGVndHJhbiI7CS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLworCisgIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLworICBzcmNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqc3JjZXJyKTsKKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmc3JjaW5mbyk7CisgIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KKyAgZHN0aW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamRzdGVycik7CisgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZkc3RpbmZvKTsKKworICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuCisgICAqIE5vdGU6IHdlIGFzc3VtZSBvbmx5IHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCB3aWxsIGhhdmUgdmlydHVhbCBhcnJheXMuCisgICAqLworI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKKyAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpICZzcmNpbmZvKTsKKyNlbmRpZgorCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4KKyAgICogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKKyAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgbW9zdGx5IGlnbm9yZWQ7IHdlIHdpbGwgcmVzY2FuIHRoZSBzd2l0Y2hlcyBhZnRlcgorICAgKiBvcGVuaW5nIHRoZSBpbnB1dCBmaWxlLiAgQWxzbyBub3RlIHRoYXQgbW9zdCBvZiB0aGUgc3dpdGNoZXMgYWZmZWN0IHRoZQorICAgKiBkZXN0aW5hdGlvbiBKUEVHIG9iamVjdCwgc28gd2UgcGFyc2UgaW50byB0aGF0IGFuZCB0aGVuIGNvcHkgb3ZlciB3aGF0CisgICAqIG5lZWRzIHRvIGFmZmVjdHMgdGhlIHNvdXJjZSB0b28uCisgICAqLworCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmZHN0aW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOworICBqc3JjZXJyLnRyYWNlX2xldmVsID0gamRzdGVyci50cmFjZV9sZXZlbDsKKyAgc3JjaW5mby5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gZHN0aW5mby5tZW0tPm1heF9tZW1vcnlfdG9fdXNlOworCisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLworICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOworICB9IGVsc2UgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICB9CisjZWxzZQorICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLworCisgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYykgeworICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KKyAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOworICB9CisKKyAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCisgIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7CisgICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLworICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7CisgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZkc3RpbmZvLCAmcHJvZ3Jlc3MpOworI2VuZGlmCisKKyAgLyogU3BlY2lmeSBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbiAqLworICBqcGVnX3N0ZGlvX3NyYygmc3JjaW5mbywgaW5wdXRfZmlsZSk7CisKKyAgLyogRW5hYmxlIHNhdmluZyBvZiBleHRyYSBtYXJrZXJzIHRoYXQgd2Ugd2FudCB0byBjb3B5ICovCisgIGpjb3B5X21hcmtlcnNfc2V0dXAoJnNyY2luZm8sIGNvcHlvcHRpb24pOworCisgIC8qIFJlYWQgZmlsZSBoZWFkZXIgKi8KKyAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJnNyY2luZm8sIFRSVUUpOworCisgIC8qIEFueSBzcGFjZSBuZWVkZWQgYnkgYSB0cmFuc2Zvcm0gb3B0aW9uIG11c3QgYmUgcmVxdWVzdGVkIGJlZm9yZQorICAgKiBqcGVnX3JlYWRfY29lZmZpY2llbnRzIHNvIHRoYXQgbWVtb3J5IGFsbG9jYXRpb24gd2lsbCBiZSBkb25lIHJpZ2h0LgorICAgKi8KKyNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorICBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlKCZzcmNpbmZvLCAmdHJhbnNmb3Jtb3B0aW9uKTsKKyNlbmRpZgorCisgIC8qIFJlYWQgc291cmNlIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cyAqLworICBzcmNfY29lZl9hcnJheXMgPSBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCZzcmNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGRlc3RpbmF0aW9uIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZnJvbSBzb3VyY2UgdmFsdWVzICovCisgIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzKCZzcmNpbmZvLCAmZHN0aW5mbyk7CisKKyAgLyogQWRqdXN0IGRlc3RpbmF0aW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgYnkgdHJhbnNmb3JtIG9wdGlvbnM7CisgICAqIGFsc28gZmluZCBvdXQgd2hpY2ggc2V0IG9mIGNvZWZmaWNpZW50IGFycmF5cyB3aWxsIGhvbGQgdGhlIG91dHB1dC4KKyAgICovCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgZHN0X2NvZWZfYXJyYXlzID0ganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycygmc3JjaW5mbywgJmRzdGluZm8sCisJCQkJCQkgc3JjX2NvZWZfYXJyYXlzLAorCQkJCQkJICZ0cmFuc2Zvcm1vcHRpb24pOworI2Vsc2UKKyAgZHN0X2NvZWZfYXJyYXlzID0gc3JjX2NvZWZfYXJyYXlzOworI2VuZGlmCisKKyAgLyogQWRqdXN0IGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycyBieSByZS1wYXJzaW5nIHRoZSBvcHRpb25zICovCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmZHN0aW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7CisKKyAgLyogU3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIGZvciBjb21wcmVzc2lvbiAqLworICBqcGVnX3N0ZGlvX2Rlc3QoJmRzdGluZm8sIG91dHB1dF9maWxlKTsKKworICAvKiBTdGFydCBjb21wcmVzc29yIChub3RlIG5vIGltYWdlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBoZXJlKSAqLworICBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygmZHN0aW5mbywgZHN0X2NvZWZfYXJyYXlzKTsKKworICAvKiBDb3B5IHRvIHRoZSBvdXRwdXQgZmlsZSBhbnkgZXh0cmEgbWFya2VycyB0aGF0IHdlIHdhbnQgdG8gcHJlc2VydmUgKi8KKyAgamNvcHlfbWFya2Vyc19leGVjdXRlKCZzcmNpbmZvLCAmZHN0aW5mbywgY29weW9wdGlvbik7CisKKyAgLyogRXhlY3V0ZSBpbWFnZSB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55ICovCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uKCZzcmNpbmZvLCAmZHN0aW5mbywKKwkJCQkgICAgc3JjX2NvZWZfYXJyYXlzLAorCQkJCSAgICAmdHJhbnNmb3Jtb3B0aW9uKTsKKyNlbmRpZgorCisgIC8qIEZpbmlzaCBjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkgKi8KKyAganBlZ19maW5pc2hfY29tcHJlc3MoJmRzdGluZm8pOworICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmRzdGluZm8pOworICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmc3JjaW5mbyk7CisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZzcmNpbmZvKTsKKworICAvKiBDbG9zZSBmaWxlcywgaWYgd2Ugb3BlbmVkIHRoZW0gKi8KKyAgaWYgKGlucHV0X2ZpbGUgIT0gc3RkaW4pCisgICAgZmNsb3NlKGlucHV0X2ZpbGUpOworICBpZiAob3V0cHV0X2ZpbGUgIT0gc3Rkb3V0KQorICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgZW5kX3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmRzdGluZm8pOworI2VuZGlmCisKKyAgLyogQWxsIGRvbmUuICovCisgIGV4aXQoanNyY2Vyci5udW1fd2FybmluZ3MgKyBqZHN0ZXJyLm51bV93YXJuaW5ncyA/RVhJVF9XQVJOSU5HOkVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvanF1YW50MS5jIGIvanF1YW50MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjk2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcXVhbnQxLmMKQEAgLTAsMCArMSw4NTYgQEAKKy8qCisgKiBqcXVhbnQxLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIChjb2xvciBtYXBwaW5nKSByb3V0aW5lcy4KKyAqIFRoZXNlIHJvdXRpbmVzIHByb3ZpZGUgbWFwcGluZyB0byBhIGZpeGVkIGNvbG9yIG1hcCB1c2luZyBlcXVhbGx5IHNwYWNlZAorICogY29sb3IgdmFsdWVzLiAgT3B0aW9uYWwgRmxveWQtU3RlaW5iZXJnIG9yIG9yZGVyZWQgZGl0aGVyaW5nIGlzIGF2YWlsYWJsZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKyNpZmRlZiBRVUFOVF8xUEFTU19TVVBQT1JURUQKKworCisvKgorICogVGhlIG1haW4gcHVycG9zZSBvZiAxLXBhc3MgcXVhbnRpemF0aW9uIGlzIHRvIHByb3ZpZGUgYSBmYXN0LCBpZiBub3QgdmVyeQorICogaGlnaCBxdWFsaXR5LCBjb2xvcm1hcHBlZCBvdXRwdXQgY2FwYWJpbGl0eS4gIEEgMi1wYXNzIHF1YW50aXplciB1c3VhbGx5CisgKiBnaXZlcyBiZXR0ZXIgdmlzdWFsIHF1YWxpdHk7IGhvd2V2ZXIsIGZvciBxdWFudGl6ZWQgZ3JheXNjYWxlIG91dHB1dCB0aGlzCisgKiBxdWFudGl6ZXIgaXMgcGVyZmVjdGx5IGFkZXF1YXRlLiAgRGl0aGVyaW5nIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMKKyAqIHF1YW50aXplciwgdGhvdWdoIHlvdSBjYW4gdHVybiBpdCBvZmYgaWYgeW91IHJlYWxseSB3YW50IHRvLgorICoKKyAqIEluIDEtcGFzcyBxdWFudGl6YXRpb24gdGhlIGNvbG9ybWFwIG11c3QgYmUgY2hvc2VuIGluIGFkdmFuY2Ugb2Ygc2VlaW5nIHRoZQorICogaW1hZ2UuICBXZSB1c2UgYSBtYXAgY29uc2lzdGluZyBvZiBhbGwgY29tYmluYXRpb25zIG9mIE5jb2xvcnNbaV0gY29sb3IKKyAqIHZhbHVlcyBmb3IgdGhlIGkndGggY29tcG9uZW50LiAgVGhlIE5jb2xvcnNbXSB2YWx1ZXMgYXJlIGNob3NlbiBzbyB0aGF0CisgKiB0aGVpciBwcm9kdWN0LCB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbG9ycywgaXMgbm8gbW9yZSB0aGFuIHRoYXQgcmVxdWVzdGVkLgorICogKEluIG1vc3QgY2FzZXMsIHRoZSBwcm9kdWN0IHdpbGwgYmUgc29tZXdoYXQgbGVzcy4pCisgKgorICogU2luY2UgdGhlIGNvbG9ybWFwIGlzIG9ydGhvZ29uYWwsIHRoZSByZXByZXNlbnRhdGl2ZSB2YWx1ZSBmb3IgZWFjaCBjb2xvcgorICogY29tcG9uZW50IGNhbiBiZSBkZXRlcm1pbmVkIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG90aGVyIGNvbXBvbmVudHM7CisgKiB0aGVuIHRoZXNlIGluZGV4ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBjb2xvcm1hcCBpbmRleCBieSBhIHN0YW5kYXJkCisgKiBOLWRpbWVuc2lvbmFsLWFycmF5LXN1YnNjcmlwdCBjYWxjdWxhdGlvbi4gIE1vc3Qgb2YgdGhlIGFyaXRobWV0aWMgaW52b2x2ZWQKKyAqIGNhbiBiZSBwcmVjYWxjdWxhdGVkIGFuZCBzdG9yZWQgaW4gdGhlIGxvb2t1cCB0YWJsZSBjb2xvcmluZGV4W10uCisgKiBjb2xvcmluZGV4W2ldW2pdIG1hcHMgcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSB0byB0aGUgbmVhcmVzdAorICogcmVwcmVzZW50YXRpdmUgdmFsdWUgKGdyaWQgcGxhbmUpIGZvciB0aGF0IGNvbXBvbmVudDsgdGhpcyBpbmRleCBpcworICogbXVsdGlwbGllZCBieSB0aGUgYXJyYXkgc3RyaWRlIGZvciBjb21wb25lbnQgaSwgc28gdGhhdCB0aGUKKyAqIGluZGV4IG9mIHRoZSBjb2xvcm1hcCBlbnRyeSBjbG9zZXN0IHRvIGEgZ2l2ZW4gcGl4ZWwgdmFsdWUgaXMganVzdAorICogICAgc3VtKCBjb2xvcmluZGV4W2NvbXBvbmVudC1udW1iZXJdW3BpeGVsLWNvbXBvbmVudC12YWx1ZV0gKQorICogQXNpZGUgZnJvbSBiZWluZyBmYXN0LCB0aGlzIHNjaGVtZSBhbGxvd3MgZm9yIHZhcmlhYmxlIHNwYWNpbmcgYmV0d2VlbgorICogcmVwcmVzZW50YXRpdmUgdmFsdWVzIHdpdGggbm8gYWRkaXRpb25hbCBsb29rdXAgY29zdC4KKyAqCisgKiBJZiBnYW1tYSBjb3JyZWN0aW9uIGhhcyBiZWVuIGFwcGxpZWQgaW4gY29sb3IgY29udmVyc2lvbiwgaXQgbWlnaHQgYmUgd2lzZQorICogdG8gYWRqdXN0IHRoZSBjb2xvciBncmlkIHNwYWNpbmcgc28gdGhhdCB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3JzIGFyZQorICogZXF1aWRpc3RhbnQgaW4gbGluZWFyIHNwYWNlLiAgQXQgdGhpcyB3cml0aW5nLCBnYW1tYSBjb3JyZWN0aW9uIGlzIG5vdAorICogaW1wbGVtZW50ZWQgYnkgamRjb2xvciwgc28gbm90aGluZyBpcyBkb25lIGhlcmUuCisgKi8KKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgorICoKKyAqIFdlIHVzZSBhIHN0YW5kYXJkIDE2eDE2IG9yZGVyZWQgZGl0aGVyIGFycmF5LiAgVGhlIGJhc2ljIGNvbmNlcHQgb2Ygb3JkZXJlZAorICogZGl0aGVyaW5nIGlzIGRlc2NyaWJlZCBpbiBtYW55IHJlZmVyZW5jZXMsIGZvciBpbnN0YW5jZSBEYWxlIFNjaHVtYWNoZXIncworICogY2hhcHRlciBJSS4yIG9mIEdyYXBoaWNzIEdlbXMgSUkgKEphbWVzIEFydm8sIGVkLiBBY2FkZW1pYyBQcmVzcywgMTk5MSkuCisgKiBJbiBwbGFjZSBvZiBTY2h1bWFjaGVyJ3MgY29tcGFyaXNvbnMgYWdhaW5zdCBhICJ0aHJlc2hvbGQiIHZhbHVlLCB3ZSBhZGQgYQorICogImRpdGhlciIgdmFsdWUgdG8gdGhlIGlucHV0IHBpeGVsIGFuZCB0aGVuIHJvdW5kIHRoZSByZXN1bHQgdG8gdGhlIG5lYXJlc3QKKyAqIG91dHB1dCB2YWx1ZS4gIFRoZSBkaXRoZXIgdmFsdWUgaXMgZXF1aXZhbGVudCB0byAoMC41IC0gdGhyZXNob2xkKSB0aW1lcworICogdGhlIGRpc3RhbmNlIGJldHdlZW4gb3V0cHV0IHZhbHVlcy4gIEZvciBvcmRlcmVkIGRpdGhlcmluZywgd2UgYXNzdW1lIHRoYXQKKyAqIHRoZSBvdXRwdXQgY29sb3JzIGFyZSBlcXVhbGx5IHNwYWNlZDsgaWYgbm90LCByZXN1bHRzIHdpbGwgcHJvYmFibHkgYmUKKyAqIHdvcnNlLCBzaW5jZSB0aGUgZGl0aGVyIG1heSBiZSB0b28gbXVjaCBvciB0b28gbGl0dGxlIGF0IGEgZ2l2ZW4gcG9pbnQuCisgKgorICogVGhlIG5vcm1hbCBjYWxjdWxhdGlvbiB3b3VsZCBiZSB0byBmb3JtIHBpeGVsIHZhbHVlICsgZGl0aGVyLCByYW5nZS1saW1pdAorICogdGhpcyB0byAwLi5NQVhKU0FNUExFLCBhbmQgdGhlbiBpbmRleCBpbnRvIHRoZSBjb2xvcmluZGV4IHRhYmxlIGFzIHVzdWFsLgorICogV2UgY2FuIHNraXAgdGhlIHNlcGFyYXRlIHJhbmdlLWxpbWl0aW5nIHN0ZXAgYnkgZXh0ZW5kaW5nIHRoZSBjb2xvcmluZGV4CisgKiB0YWJsZSBpbiBib3RoIGRpcmVjdGlvbnMuCisgKi8KKworI2RlZmluZSBPRElUSEVSX1NJWkUgIDE2CS8qIGRpbWVuc2lvbiBvZiBkaXRoZXIgbWF0cml4ICovCisvKiBOQjogaWYgT0RJVEhFUl9TSVpFIGlzIG5vdCBhIHBvd2VyIG9mIDIsIE9ESVRIRVJfTUFTSyB1c2VzIHdpbGwgYnJlYWsgKi8KKyNkZWZpbmUgT0RJVEhFUl9DRUxMUyAoT0RJVEhFUl9TSVpFKk9ESVRIRVJfU0laRSkJLyogIyBjZWxscyBpbiBtYXRyaXggKi8KKyNkZWZpbmUgT0RJVEhFUl9NQVNLICAoT0RJVEhFUl9TSVpFLTEpIC8qIG1hc2sgZm9yIHdyYXBwaW5nIGFyb3VuZCBjb3VudGVycyAqLworCit0eXBlZGVmIGludCBPRElUSEVSX01BVFJJWFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV07Cit0eXBlZGVmIGludCAoKk9ESVRIRVJfTUFUUklYX1BUUilbT0RJVEhFUl9TSVpFXTsKKworc3RhdGljIGNvbnN0IFVJTlQ4IGJhc2VfZGl0aGVyX21hdHJpeFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV0gPSB7CisgIC8qIEJheWVyJ3Mgb3JkZXItNCBkaXRoZXIgYXJyYXkuICBHZW5lcmF0ZWQgYnkgdGhlIGNvZGUgZ2l2ZW4gaW4KKyAgICogU3RlcGhlbiBIYXdsZXkncyBhcnRpY2xlICJPcmRlcmVkIERpdGhlcmluZyIgaW4gR3JhcGhpY3MgR2VtcyBJLgorICAgKiBUaGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgbXVzdCByYW5nZSBmcm9tIDAgdG8gT0RJVEhFUl9DRUxMUy0xLgorICAgKi8KKyAgeyAgIDAsMTkyLCA0OCwyNDAsIDEyLDIwNCwgNjAsMjUyLCAgMywxOTUsIDUxLDI0MywgMTUsMjA3LCA2MywyNTUgfSwKKyAgeyAxMjgsIDY0LDE3NiwxMTIsMTQwLCA3NiwxODgsMTI0LDEzMSwgNjcsMTc5LDExNSwxNDMsIDc5LDE5MSwxMjcgfSwKKyAgeyAgMzIsMjI0LCAxNiwyMDgsIDQ0LDIzNiwgMjgsMjIwLCAzNSwyMjcsIDE5LDIxMSwgNDcsMjM5LCAzMSwyMjMgfSwKKyAgeyAxNjAsIDk2LDE0NCwgODAsMTcyLDEwOCwxNTYsIDkyLDE2MywgOTksMTQ3LCA4MywxNzUsMTExLDE1OSwgOTUgfSwKKyAgeyAgIDgsMjAwLCA1NiwyNDgsICA0LDE5NiwgNTIsMjQ0LCAxMSwyMDMsIDU5LDI1MSwgIDcsMTk5LCA1NSwyNDcgfSwKKyAgeyAxMzYsIDcyLDE4NCwxMjAsMTMyLCA2OCwxODAsMTE2LDEzOSwgNzUsMTg3LDEyMywxMzUsIDcxLDE4MywxMTkgfSwKKyAgeyAgNDAsMjMyLCAyNCwyMTYsIDM2LDIyOCwgMjAsMjEyLCA0MywyMzUsIDI3LDIxOSwgMzksMjMxLCAyMywyMTUgfSwKKyAgeyAxNjgsMTA0LDE1MiwgODgsMTY0LDEwMCwxNDgsIDg0LDE3MSwxMDcsMTU1LCA5MSwxNjcsMTAzLDE1MSwgODcgfSwKKyAgeyAgIDIsMTk0LCA1MCwyNDIsIDE0LDIwNiwgNjIsMjU0LCAgMSwxOTMsIDQ5LDI0MSwgMTMsMjA1LCA2MSwyNTMgfSwKKyAgeyAxMzAsIDY2LDE3OCwxMTQsMTQyLCA3OCwxOTAsMTI2LDEyOSwgNjUsMTc3LDExMywxNDEsIDc3LDE4OSwxMjUgfSwKKyAgeyAgMzQsMjI2LCAxOCwyMTAsIDQ2LDIzOCwgMzAsMjIyLCAzMywyMjUsIDE3LDIwOSwgNDUsMjM3LCAyOSwyMjEgfSwKKyAgeyAxNjIsIDk4LDE0NiwgODIsMTc0LDExMCwxNTgsIDk0LDE2MSwgOTcsMTQ1LCA4MSwxNzMsMTA5LDE1NywgOTMgfSwKKyAgeyAgMTAsMjAyLCA1OCwyNTAsICA2LDE5OCwgNTQsMjQ2LCAgOSwyMDEsIDU3LDI0OSwgIDUsMTk3LCA1MywyNDUgfSwKKyAgeyAxMzgsIDc0LDE4NiwxMjIsMTM0LCA3MCwxODIsMTE4LDEzNywgNzMsMTg1LDEyMSwxMzMsIDY5LDE4MSwxMTcgfSwKKyAgeyAgNDIsMjM0LCAyNiwyMTgsIDM4LDIzMCwgMjIsMjE0LCA0MSwyMzMsIDI1LDIxNywgMzcsMjI5LCAyMSwyMTMgfSwKKyAgeyAxNzAsMTA2LDE1NCwgOTAsMTY2LDEwMiwxNTAsIDg2LDE2OSwxMDUsMTUzLCA4OSwxNjUsMTAxLDE0OSwgODUgfQorfTsKKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCisgKgorICogRXJyb3JzIGFyZSBhY2N1bXVsYXRlZCBpbnRvIHRoZSBhcnJheSBmc2Vycm9yc1tdLCBhdCBhIHJlc29sdXRpb24gb2YKKyAqIDEvMTZ0aCBvZiBhIHBpeGVsIGNvdW50LiAgVGhlIGVycm9yIGF0IGEgZ2l2ZW4gcGl4ZWwgaXMgcHJvcGFnYXRlZAorICogdG8gaXRzIG5vdC15ZXQtcHJvY2Vzc2VkIG5laWdoYm9ycyB1c2luZyB0aGUgc3RhbmRhcmQgRi1TIGZyYWN0aW9ucywKKyAqCQkuLi4JKGhlcmUpCTcvMTYKKyAqCQkzLzE2CTUvMTYJMS8xNgorICogV2Ugd29yayBsZWZ0LXRvLXJpZ2h0IG9uIGV2ZW4gcm93cywgcmlnaHQtdG8tbGVmdCBvbiBvZGQgcm93cy4KKyAqCisgKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aCBhIHNpbmdsZSBhcnJheSAoaG9sZGluZyBvbmUgcm93J3Mgd29ydGggb2YgZXJyb3JzKQorICogYnkgdXNpbmcgaXQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgcm93J3MgZXJyb3JzIGF0IHBpeGVsIGNvbHVtbnMgbm90IHlldAorICogcHJvY2Vzc2VkLCBidXQgdGhlIG5leHQgcm93J3MgZXJyb3JzIGF0IGNvbHVtbnMgYWxyZWFkeSBwcm9jZXNzZWQuICBXZQorICogbmVlZCBvbmx5IGEgZmV3IGV4dHJhIHZhcmlhYmxlcyB0byBob2xkIHRoZSBlcnJvcnMgaW1tZWRpYXRlbHkgYXJvdW5kIHRoZQorICogY3VycmVudCBjb2x1bW4uICAoSWYgd2UgYXJlIGx1Y2t5LCB0aG9zZSB2YXJpYWJsZXMgYXJlIGluIHJlZ2lzdGVycywgYnV0CisgKiBldmVuIGlmIG5vdCwgdGhleSdyZSBwcm9iYWJseSBjaGVhcGVyIHRvIGFjY2VzcyB0aGFuIGFycmF5IGVsZW1lbnRzIGFyZS4pCisgKgorICogVGhlIGZzZXJyb3JzW10gYXJyYXkgaXMgaW5kZXhlZCBbY29tcG9uZW50I11bcG9zaXRpb25dLgorICogV2UgcHJvdmlkZSAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzIHBlciBjb21wb25lbnQ7IHRoZSBleHRyYSBlbnRyeSBhdCBlYWNoCisgKiBlbmQgc2F2ZXMgdXMgZnJvbSBzcGVjaWFsLWNhc2luZyB0aGUgZmlyc3QgYW5kIGxhc3QgcGl4ZWxzLgorICoKKyAqIE5vdGU6IG9uIGEgd2lkZSBpbWFnZSwgd2UgbWlnaHQgbm90IGhhdmUgZW5vdWdoIHJvb20gaW4gYSBQQydzIG5lYXIgZGF0YQorICogc2VnbWVudCB0byBob2xkIHRoZSBlcnJvciBhcnJheTsgc28gaXQgaXMgYWxsb2NhdGVkIHdpdGggYWxsb2NfbGFyZ2UuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIElOVDE2IEZTRVJST1I7CQkvKiAxNiBiaXRzIHNob3VsZCBiZSBlbm91Z2ggKi8KK3R5cGVkZWYgaW50IExPQ0ZTRVJST1I7CQkvKiB1c2UgJ2ludCcgZm9yIGNhbGN1bGF0aW9uIHRlbXBzICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBGU0VSUk9SOwkJLyogbWF5IG5lZWQgbW9yZSB0aGFuIDE2IGJpdHMgKi8KK3R5cGVkZWYgSU5UMzIgTE9DRlNFUlJPUjsJLyogYmUgc3VyZSBjYWxjdWxhdGlvbiB0ZW1wcyBhcmUgYmlnIGVub3VnaCAqLworI2VuZGlmCisKK3R5cGVkZWYgRlNFUlJPUiBGQVIgKkZTRVJSUFRSOwkvKiBwb2ludGVyIHRvIGVycm9yIGFycmF5IChpbiBGQVIgc3RvcmFnZSEpICovCisKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKworI2RlZmluZSBNQVhfUV9DT01QUyA0CQkvKiBtYXggY29tcG9uZW50cyBJIGNhbiBoYW5kbGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogSW5pdGlhbGx5IGFsbG9jYXRlZCBjb2xvcm1hcCBpcyBzYXZlZCBoZXJlICovCisgIEpTQU1QQVJSQVkgc3ZfY29sb3JtYXA7CS8qIFRoZSBjb2xvciBtYXAgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgKi8KKyAgaW50IHN2X2FjdHVhbDsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLworCisgIEpTQU1QQVJSQVkgY29sb3JpbmRleDsJLyogUHJlY29tcHV0ZWQgbWFwcGluZyBmb3Igc3BlZWQgKi8KKyAgLyogY29sb3JpbmRleFtpXVtqXSA9IGluZGV4IG9mIGNvbG9yIGNsb3Nlc3QgdG8gcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSwKKyAgICogcHJlbXVsdGlwbGllZCBhcyBkZXNjcmliZWQgYWJvdmUuICBTaW5jZSBjb2xvcm1hcCBpbmRleGVzIG11c3QgZml0IGludG8KKyAgICogSlNBTVBMRXMsIHRoZSBlbnRyaWVzIG9mIHRoaXMgYXJyYXkgd2lsbCB0b28uCisgICAqLworICBib29sZWFuIGlzX3BhZGRlZDsJCS8qIGlzIHRoZSBjb2xvcmluZGV4IHBhZGRlZCBmb3Igb2RpdGhlcj8gKi8KKworICBpbnQgTmNvbG9yc1tNQVhfUV9DT01QU107CS8qICMgb2YgdmFsdWVzIGFsbG9jZWQgdG8gZWFjaCBjb21wb25lbnQgKi8KKworICAvKiBWYXJpYWJsZXMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nICovCisgIGludCByb3dfaW5kZXg7CQkvKiBjdXIgcm93J3MgdmVydGljYWwgaW5kZXggaW4gZGl0aGVyIG1hdHJpeCAqLworICBPRElUSEVSX01BVFJJWF9QVFIgb2RpdGhlcltNQVhfUV9DT01QU107IC8qIG9uZSBkaXRoZXIgYXJyYXkgcGVyIGNvbXBvbmVudCAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworICBGU0VSUlBUUiBmc2Vycm9yc1tNQVhfUV9DT01QU107IC8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLworICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KK30gbXlfY3F1YW50aXplcjsKKwordHlwZWRlZiBteV9jcXVhbnRpemVyICogbXlfY3F1YW50aXplX3B0cjsKKworCisvKgorICogUG9saWN5LW1ha2luZyBzdWJyb3V0aW5lcyBmb3IgY3JlYXRlX2NvbG9ybWFwIGFuZCBjcmVhdGVfY29sb3JpbmRleC4KKyAqIFRoZXNlIHJvdXRpbmVzIGRldGVybWluZSB0aGUgY29sb3JtYXAgdG8gYmUgdXNlZC4gIFRoZSByZXN0IG9mIHRoZSBtb2R1bGUKKyAqIG9ubHkgYXNzdW1lcyB0aGF0IHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLgorICoKKyAqICAqIHNlbGVjdF9uY29sb3JzIGRlY2lkZXMgaG93IHRvIGRpdnZ5IHVwIHRoZSBhdmFpbGFibGUgY29sb3JzCisgKiAgICBhbW9uZyB0aGUgY29tcG9uZW50cy4KKyAqICAqIG91dHB1dF92YWx1ZSBkZWZpbmVzIHRoZSBzZXQgb2YgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KKyAqICAqIGxhcmdlc3RfaW5wdXRfdmFsdWUgZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGlucHV0IHZhbHVlcyB0bworICogICAgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KKyAqIE5vdGUgdGhhdCB0aGUgbGF0dGVyIHR3byByb3V0aW5lcyBtYXkgaW1wb3NlIGRpZmZlcmVudCBwb2xpY2llcyBmb3IKKyAqIGRpZmZlcmVudCBjb21wb25lbnRzLCB0aG91Z2ggdGhpcyBpcyBub3QgY3VycmVudGx5IGRvbmUuCisgKi8KKworCitMT0NBTChpbnQpCitzZWxlY3RfbmNvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IE5jb2xvcnNbXSkKKy8qIERldGVybWluZSBhbGxvY2F0aW9uIG9mIGRlc2lyZWQgY29sb3JzIHRvIGNvbXBvbmVudHMsICovCisvKiBhbmQgZmlsbCBpbiBOY29sb3JzW10gYXJyYXkgdG8gaW5kaWNhdGUgY2hvaWNlLiAqLworLyogUmV0dXJuIHZhbHVlIGlzIHRvdGFsIG51bWJlciBvZiBjb2xvcnMgKHByb2R1Y3Qgb2YgTmNvbG9yc1tdIHZhbHVlcykuICovCit7CisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgLyogbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgKi8KKyAgaW50IG1heF9jb2xvcnMgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOworICBpbnQgdG90YWxfY29sb3JzLCBpcm9vdCwgaSwgajsKKyAgYm9vbGVhbiBjaGFuZ2VkOworICBsb25nIHRlbXA7CisgIHN0YXRpYyBjb25zdCBpbnQgUkdCX29yZGVyWzNdID0geyBSR0JfR1JFRU4sIFJHQl9SRUQsIFJHQl9CTFVFIH07CisKKyAgLyogV2UgY2FuIGFsbG9jYXRlIGF0IGxlYXN0IHRoZSBuYyd0aCByb290IG9mIG1heF9jb2xvcnMgcGVyIGNvbXBvbmVudC4gKi8KKyAgLyogQ29tcHV0ZSBmbG9vcihuYyd0aCByb290IG9mIG1heF9jb2xvcnMpLiAqLworICBpcm9vdCA9IDE7CisgIGRvIHsKKyAgICBpcm9vdCsrOworICAgIHRlbXAgPSBpcm9vdDsJCS8qIHNldCB0ZW1wID0gaXJvb3QgKiogbmMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbmM7IGkrKykKKyAgICAgIHRlbXAgKj0gaXJvb3Q7CisgIH0gd2hpbGUgKHRlbXAgPD0gKGxvbmcpIG1heF9jb2xvcnMpOyAvKiByZXBlYXQgdGlsbCBpcm9vdCBleGNlZWRzIHJvb3QgKi8KKyAgaXJvb3QtLTsJCQkvKiBub3cgaXJvb3QgPSBmbG9vcihyb290KSAqLworCisgIC8qIE11c3QgaGF2ZSBhdCBsZWFzdCAyIGNvbG9yIHZhbHVlcyBwZXIgY29tcG9uZW50ICovCisgIGlmIChpcm9vdCA8IDIpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgKGludCkgdGVtcCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0byBpcm9vdCBjb2xvciB2YWx1ZXMgZm9yIGVhY2ggY29tcG9uZW50ICovCisgIHRvdGFsX2NvbG9ycyA9IDE7CisgIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7CisgICAgTmNvbG9yc1tpXSA9IGlyb290OworICAgIHRvdGFsX2NvbG9ycyAqPSBpcm9vdDsKKyAgfQorICAvKiBXZSBtYXkgYmUgYWJsZSB0byBpbmNyZW1lbnQgdGhlIGNvdW50IGZvciBvbmUgb3IgbW9yZSBjb21wb25lbnRzIHdpdGhvdXQKKyAgICogZXhjZWVkaW5nIG1heF9jb2xvcnMsIHRob3VnaCB3ZSBrbm93IG5vdCBhbGwgY2FuIGJlIGluY3JlbWVudGVkLgorICAgKiBTb21ldGltZXMsIHRoZSBmaXJzdCBjb21wb25lbnQgY2FuIGJlIGluY3JlbWVudGVkIG1vcmUgdGhhbiBvbmNlIQorICAgKiAoRXhhbXBsZTogZm9yIDE2IGNvbG9ycywgd2Ugc3RhcnQgYXQgMioyKjIsIGdvIHRvIDMqMioyLCB0aGVuIDQqMioyLikKKyAgICogSW4gUkdCIGNvbG9yc3BhY2UsIHRyeSB0byBpbmNyZW1lbnQgRyBmaXJzdCwgdGhlbiBSLCB0aGVuIEIuCisgICAqLworICBkbyB7CisgICAgY2hhbmdlZCA9IEZBTFNFOworICAgIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7CisgICAgICBqID0gKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiA/IFJHQl9vcmRlcltpXSA6IGkpOworICAgICAgLyogY2FsY3VsYXRlIG5ldyB0b3RhbF9jb2xvcnMgaWYgTmNvbG9yc1tqXSBpcyBpbmNyZW1lbnRlZCAqLworICAgICAgdGVtcCA9IHRvdGFsX2NvbG9ycyAvIE5jb2xvcnNbal07CisgICAgICB0ZW1wICo9IE5jb2xvcnNbal0rMTsJLyogZG9uZSBpbiBsb25nIGFyaXRoIHRvIGF2b2lkIG9mbG8gKi8KKyAgICAgIGlmICh0ZW1wID4gKGxvbmcpIG1heF9jb2xvcnMpCisJYnJlYWs7CQkJLyogd29uJ3QgZml0LCBkb25lIHdpdGggdGhpcyBwYXNzICovCisgICAgICBOY29sb3JzW2pdKys7CQkvKiBPSywgYXBwbHkgdGhlIGluY3JlbWVudCAqLworICAgICAgdG90YWxfY29sb3JzID0gKGludCkgdGVtcDsKKyAgICAgIGNoYW5nZWQgPSBUUlVFOworICAgIH0KKyAgfSB3aGlsZSAoY2hhbmdlZCk7CisKKyAgcmV0dXJuIHRvdGFsX2NvbG9yczsKK30KKworCitMT0NBTChpbnQpCitvdXRwdXRfdmFsdWUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBjaSwgaW50IGosIGludCBtYXhqKQorLyogUmV0dXJuIGondGggb3V0cHV0IHZhbHVlLCB3aGVyZSBqIHdpbGwgcmFuZ2UgZnJvbSAwIHRvIG1heGogKi8KKy8qIFRoZSBvdXRwdXQgdmFsdWVzIG11c3QgZmFsbCBpbiAwLi5NQVhKU0FNUExFIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KK3sKKyAgLyogV2UgYWx3YXlzIHByb3ZpZGUgdmFsdWVzIDAgYW5kIE1BWEpTQU1QTEUgZm9yIGVhY2ggY29tcG9uZW50OworICAgKiBhbnkgYWRkaXRpb25hbCB2YWx1ZXMgYXJlIGVxdWFsbHkgc3BhY2VkIGJldHdlZW4gdGhlc2UgbGltaXRzLgorICAgKiAoRm9yY2luZyB0aGUgdXBwZXIgYW5kIGxvd2VyIHZhbHVlcyB0byB0aGUgbGltaXRzIGVuc3VyZXMgdGhhdAorICAgKiBkaXRoZXJpbmcgY2FuJ3QgcHJvZHVjZSBhIGNvbG9yIG91dHNpZGUgdGhlIHNlbGVjdGVkIGdhbXV0LikKKyAgICovCisgIHJldHVybiAoaW50KSAoKChJTlQzMikgaiAqIE1BWEpTQU1QTEUgKyBtYXhqLzIpIC8gbWF4aik7Cit9CisKKworTE9DQUwoaW50KQorbGFyZ2VzdF9pbnB1dF92YWx1ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGNpLCBpbnQgaiwgaW50IG1heGopCisvKiBSZXR1cm4gbGFyZ2VzdCBpbnB1dCB2YWx1ZSB0aGF0IHNob3VsZCBtYXAgdG8gaid0aCBvdXRwdXQgdmFsdWUgKi8KKy8qIE11c3QgaGF2ZSBsYXJnZXN0KGo9MCkgPj0gMCwgYW5kIGxhcmdlc3Qoaj1tYXhqKSA+PSBNQVhKU0FNUExFICovCit7CisgIC8qIEJyZWFrcG9pbnRzIGFyZSBoYWxmd2F5IGJldHdlZW4gdmFsdWVzIHJldHVybmVkIGJ5IG91dHB1dF92YWx1ZSAqLworICByZXR1cm4gKGludCkgKCgoSU5UMzIpICgyKmogKyAxKSAqIE1BWEpTQU1QTEUgKyBtYXhqKSAvICgyKm1heGopKTsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBjb2xvcm1hcC4KKyAqLworCitMT0NBTCh2b2lkKQorY3JlYXRlX2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogQ3JlYXRlZCBjb2xvcm1hcCAqLworICBpbnQgdG90YWxfY29sb3JzOwkJLyogTnVtYmVyIG9mIGRpc3RpbmN0IG91dHB1dCBjb2xvcnMgKi8KKyAgaW50IGksaixrLCBuY2ksIGJsa3NpemUsIGJsa2Rpc3QsIHB0ciwgdmFsOworCisgIC8qIFNlbGVjdCBudW1iZXIgb2YgY29sb3JzIGZvciBlYWNoIGNvbXBvbmVudCAqLworICB0b3RhbF9jb2xvcnMgPSBzZWxlY3RfbmNvbG9ycyhjaW5mbywgY3F1YW50aXplLT5OY29sb3JzKTsKKworICAvKiBSZXBvcnQgc2VsZWN0ZWQgY29sb3IgY291bnRzICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19RVUFOVF8zX05DT0xPUlMsCisJICAgICB0b3RhbF9jb2xvcnMsIGNxdWFudGl6ZS0+TmNvbG9yc1swXSwKKwkgICAgIGNxdWFudGl6ZS0+TmNvbG9yc1sxXSwgY3F1YW50aXplLT5OY29sb3JzWzJdKTsKKyAgZWxzZQorICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1FVQU5UX05DT0xPUlMsIHRvdGFsX2NvbG9ycyk7CisKKyAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGNvbG9ybWFwLiAqLworICAvKiBUaGUgY29sb3JzIGFyZSBvcmRlcmVkIGluIHRoZSBtYXAgaW4gc3RhbmRhcmQgcm93LW1ham9yIG9yZGVyLCAqLworICAvKiBpLmUuIHJpZ2h0bW9zdCAoaGlnaGVzdC1pbmRleGVkKSBjb2xvciBjaGFuZ2VzIG1vc3QgcmFwaWRseS4gKi8KKworICBjb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSB0b3RhbF9jb2xvcnMsIChKRElNRU5TSU9OKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOworCisgIC8qIGJsa3NpemUgaXMgbnVtYmVyIG9mIGFkamFjZW50IHJlcGVhdGVkIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCisgIC8qIGJsa2Rpc3QgaXMgZGlzdGFuY2UgYmV0d2VlbiBncm91cHMgb2YgaWRlbnRpY2FsIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCisgIGJsa2Rpc3QgPSB0b3RhbF9jb2xvcnM7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgLyogZmlsbCBpbiBjb2xvcm1hcCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLworICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KKyAgICBibGtzaXplID0gYmxrZGlzdCAvIG5jaTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbmNpOyBqKyspIHsKKyAgICAgIC8qIENvbXB1dGUgaid0aCBvdXRwdXQgdmFsdWUgKG91dCBvZiBuY2kpIGZvciBjb21wb25lbnQgKi8KKyAgICAgIHZhbCA9IG91dHB1dF92YWx1ZShjaW5mbywgaSwgaiwgbmNpLTEpOworICAgICAgLyogRmlsbCBpbiBhbGwgY29sb3JtYXAgZW50cmllcyB0aGF0IGhhdmUgdGhpcyB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudCAqLworICAgICAgZm9yIChwdHIgPSBqICogYmxrc2l6ZTsgcHRyIDwgdG90YWxfY29sb3JzOyBwdHIgKz0gYmxrZGlzdCkgeworCS8qIGZpbGwgaW4gYmxrc2l6ZSBlbnRyaWVzIGJlZ2lubmluZyBhdCBwdHIgKi8KKwlmb3IgKGsgPSAwOyBrIDwgYmxrc2l6ZTsgaysrKQorCSAgY29sb3JtYXBbaV1bcHRyK2tdID0gKEpTQU1QTEUpIHZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgYmxrZGlzdCA9IGJsa3NpemU7CQkvKiBibGtzaXplIG9mIHRoaXMgY29sb3IgaXMgYmxrZGlzdCBvZiBuZXh0ICovCisgIH0KKworICAvKiBTYXZlIHRoZSBjb2xvcm1hcCBpbiBwcml2YXRlIHN0b3JhZ2UsCisgICAqIHdoZXJlIGl0IHdpbGwgc3Vydml2ZSBjb2xvciBxdWFudGl6YXRpb24gbW9kZSBjaGFuZ2VzLgorICAgKi8KKyAgY3F1YW50aXplLT5zdl9jb2xvcm1hcCA9IGNvbG9ybWFwOworICBjcXVhbnRpemUtPnN2X2FjdHVhbCA9IHRvdGFsX2NvbG9yczsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBjb2xvciBpbmRleCB0YWJsZS4KKyAqLworCitMT0NBTCh2b2lkKQorY3JlYXRlX2NvbG9yaW5kZXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIEpTQU1QUk9XIGluZGV4cHRyOworICBpbnQgaSxqLGssIG5jaSwgYmxrc2l6ZSwgdmFsLCBwYWQ7CisKKyAgLyogRm9yIG9yZGVyZWQgZGl0aGVyLCB3ZSBwYWQgdGhlIGNvbG9yIGluZGV4IHRhYmxlcyBieSBNQVhKU0FNUExFIGluCisgICAqIGVhY2ggZGlyZWN0aW9uIChpbnB1dCBpbmRleCB2YWx1ZXMgY2FuIGJlIC1NQVhKU0FNUExFIC4uIDIqTUFYSlNBTVBMRSkuCisgICAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpbiB0aGUgb3RoZXIgZGl0aGVyaW5nIG1vZGVzLiAgSG93ZXZlciwgd2UKKyAgICogZmxhZyB3aGV0aGVyIGl0IHdhcyBkb25lIGluIGNhc2UgdXNlciBjaGFuZ2VzIGRpdGhlcmluZyBtb2RlLgorICAgKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX09SREVSRUQpIHsKKyAgICBwYWQgPSBNQVhKU0FNUExFKjI7CisgICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBUUlVFOworICB9IGVsc2UgeworICAgIHBhZCA9IDA7CisgICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBGQUxTRTsKKyAgfQorCisgIGNxdWFudGl6ZS0+Y29sb3JpbmRleCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSAoTUFYSlNBTVBMRSsxICsgcGFkKSwKKyAgICAgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyk7CisKKyAgLyogYmxrc2l6ZSBpcyBudW1iZXIgb2YgYWRqYWNlbnQgcmVwZWF0ZWQgZW50cmllcyBmb3IgYSBjb21wb25lbnQgKi8KKyAgYmxrc2l6ZSA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOworCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykgeworICAgIC8qIGZpbGwgaW4gY29sb3JpbmRleCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLworICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KKyAgICBibGtzaXplID0gYmxrc2l6ZSAvIG5jaTsKKworICAgIC8qIGFkanVzdCBjb2xvcmluZGV4IHBvaW50ZXJzIHRvIHByb3ZpZGUgcGFkZGluZyBhdCBuZWdhdGl2ZSBpbmRleGVzLiAqLworICAgIGlmIChwYWQpCisgICAgICBjcXVhbnRpemUtPmNvbG9yaW5kZXhbaV0gKz0gTUFYSlNBTVBMRTsKKworICAgIC8qIGluIGxvb3AsIHZhbCA9IGluZGV4IG9mIGN1cnJlbnQgb3V0cHV0IHZhbHVlLCAqLworICAgIC8qIGFuZCBrID0gbGFyZ2VzdCBqIHRoYXQgbWFwcyB0byBjdXJyZW50IHZhbCAqLworICAgIGluZGV4cHRyID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2ldOworICAgIHZhbCA9IDA7CisgICAgayA9IGxhcmdlc3RfaW5wdXRfdmFsdWUoY2luZm8sIGksIDAsIG5jaS0xKTsKKyAgICBmb3IgKGogPSAwOyBqIDw9IE1BWEpTQU1QTEU7IGorKykgeworICAgICAgd2hpbGUgKGogPiBrKQkJLyogYWR2YW5jZSB2YWwgaWYgcGFzdCBib3VuZGFyeSAqLworCWsgPSBsYXJnZXN0X2lucHV0X3ZhbHVlKGNpbmZvLCBpLCArK3ZhbCwgbmNpLTEpOworICAgICAgLyogcHJlbXVsdGlwbHkgc28gdGhhdCBubyBtdWx0aXBsaWNhdGlvbiBuZWVkZWQgaW4gbWFpbiBwcm9jZXNzaW5nICovCisgICAgICBpbmRleHB0cltqXSA9IChKU0FNUExFKSAodmFsICogYmxrc2l6ZSk7CisgICAgfQorICAgIC8qIFBhZCBhdCBib3RoIGVuZHMgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHBhZCkKKyAgICAgIGZvciAoaiA9IDE7IGogPD0gTUFYSlNBTVBMRTsgaisrKSB7CisJaW5kZXhwdHJbLWpdID0gaW5kZXhwdHJbMF07CisJaW5kZXhwdHJbTUFYSlNBTVBMRStqXSA9IGluZGV4cHRyW01BWEpTQU1QTEVdOworICAgICAgfQorICB9Cit9CisKKworLyoKKyAqIENyZWF0ZSBhbiBvcmRlcmVkLWRpdGhlciBhcnJheSBmb3IgYSBjb21wb25lbnQgaGF2aW5nIG5jb2xvcnMKKyAqIGRpc3RpbmN0IG91dHB1dCB2YWx1ZXMuCisgKi8KKworTE9DQUwoT0RJVEhFUl9NQVRSSVhfUFRSKQorbWFrZV9vZGl0aGVyX2FycmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbmNvbG9ycykKK3sKKyAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7CisgIGludCBqLGs7CisgIElOVDMyIG51bSxkZW47CisKKyAgb2RpdGhlciA9IChPRElUSEVSX01BVFJJWF9QVFIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YoT0RJVEhFUl9NQVRSSVgpKTsKKyAgLyogVGhlIGludGVyLXZhbHVlIGRpc3RhbmNlIGZvciB0aGlzIGNvbG9yIGlzIE1BWEpTQU1QTEUvKG5jb2xvcnMtMSkuCisgICAqIEhlbmNlIHRoZSBkaXRoZXIgdmFsdWUgZm9yIHRoZSBtYXRyaXggY2VsbCB3aXRoIGZpbGwgb3JkZXIgZgorICAgKiAoZj0wLi5OLTEpIHNob3VsZCBiZSAoTi0xLTIqZikvKDIqTikgKiBNQVhKU0FNUExFLyhuY29sb3JzLTEpLgorICAgKiBPbiAxNi1iaXQtaW50IG1hY2hpbmUsIGJlIGNhcmVmdWwgdG8gYXZvaWQgb3ZlcmZsb3cuCisgICAqLworICBkZW4gPSAyICogT0RJVEhFUl9DRUxMUyAqICgoSU5UMzIpIChuY29sb3JzIC0gMSkpOworICBmb3IgKGogPSAwOyBqIDwgT0RJVEhFUl9TSVpFOyBqKyspIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgT0RJVEhFUl9TSVpFOyBrKyspIHsKKyAgICAgIG51bSA9ICgoSU5UMzIpIChPRElUSEVSX0NFTExTLTEgLSAyKigoaW50KWJhc2VfZGl0aGVyX21hdHJpeFtqXVtrXSkpKQorCSAgICAqIE1BWEpTQU1QTEU7CisgICAgICAvKiBFbnN1cmUgcm91bmQgdG93YXJkcyB6ZXJvIGRlc3BpdGUgQydzIGxhY2sgb2YgY29uc2lzdGVuY3kKKyAgICAgICAqIGFib3V0IHJvdW5kaW5nIG5lZ2F0aXZlIHZhbHVlcyBpbiBpbnRlZ2VyIGRpdmlzaW9uLi4uCisgICAgICAgKi8KKyAgICAgIG9kaXRoZXJbal1ba10gPSAoaW50KSAobnVtPDAgPyAtKCgtbnVtKS9kZW4pIDogbnVtL2Rlbik7CisgICAgfQorICB9CisgIHJldHVybiBvZGl0aGVyOworfQorCisKKy8qCisgKiBDcmVhdGUgdGhlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcy4KKyAqIENvbXBvbmVudHMgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiByZXByZXNlbnRhdGl2ZSBjb2xvcnMgbWF5IAorICogc2hhcmUgYSBkaXRoZXIgdGFibGUuCisgKi8KKworTE9DQUwodm9pZCkKK2NyZWF0ZV9vZGl0aGVyX3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7CisgIGludCBpLCBqLCBuY2k7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgbmNpID0gY3F1YW50aXplLT5OY29sb3JzW2ldOyAvKiAjIG9mIGRpc3RpbmN0IHZhbHVlcyBmb3IgdGhpcyBjb2xvciAqLworICAgIG9kaXRoZXIgPSBOVUxMOwkJLyogc2VhcmNoIGZvciBtYXRjaGluZyBwcmlvciBjb21wb25lbnQgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICBpZiAobmNpID09IGNxdWFudGl6ZS0+TmNvbG9yc1tqXSkgeworCW9kaXRoZXIgPSBjcXVhbnRpemUtPm9kaXRoZXJbal07CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChvZGl0aGVyID09IE5VTEwpCS8qIG5lZWQgYSBuZXcgdGFibGU/ICovCisgICAgICBvZGl0aGVyID0gbWFrZV9vZGl0aGVyX2FycmF5KGNpbmZvLCBuY2kpOworICAgIGNxdWFudGl6ZS0+b2RpdGhlcltpXSA9IG9kaXRoZXI7CisgIH0KK30KKworCisvKgorICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2NvbG9yX3F1YW50aXplIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBHZW5lcmFsIGNhc2UsIG5vIGRpdGhlcmluZyAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBKU0FNUEFSUkFZIGNvbG9yaW5kZXggPSBjcXVhbnRpemUtPmNvbG9yaW5kZXg7CisgIHJlZ2lzdGVyIGludCBwaXhjb2RlLCBjaTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyaW4sIHB0cm91dDsKKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICByZWdpc3RlciBpbnQgbmMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBwdHJpbiA9IGlucHV0X2J1Zltyb3ddOworICAgIHB0cm91dCA9IG91dHB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcGl4Y29kZSA9IDA7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgeworCXBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4W2NpXVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOworICAgICAgfQorICAgICAgKnB0cm91dCsrID0gKEpTQU1QTEUpIHBpeGNvZGU7CisgICAgfQorICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjb2xvcl9xdWFudGl6ZTMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCBubyBkaXRoZXJpbmcgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgcmVnaXN0ZXIgaW50IHBpeGNvZGU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cmluLCBwdHJvdXQ7CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOworICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07CisgIGludCByb3c7CisgIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIHB0cmluID0gaW5wdXRfYnVmW3Jvd107CisgICAgcHRyb3V0ID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICBwaXhjb2RlICA9IEdFVEpTQU1QTEUoY29sb3JpbmRleDBbR0VUSlNBTVBMRSgqcHRyaW4rKyldKTsKKyAgICAgIHBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4MVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKnB0cmluKyspXSk7CisgICAgICAqcHRyb3V0KysgPSAoSlNBTVBMRSkgcGl4Y29kZTsKKyAgICB9CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplX29yZF9kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQorLyogR2VuZXJhbCBjYXNlLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHV0X3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHV0X3B0cjsKKyAgSlNBTVBST1cgY29sb3JpbmRleF9jaTsKKyAgaW50ICogZGl0aGVyOwkJCS8qIHBvaW50cyB0byBhY3RpdmUgcm93IG9mIGRpdGhlciBtYXRyaXggKi8KKyAgaW50IHJvd19pbmRleCwgY29sX2luZGV4OwkvKiBjdXJyZW50IGluZGV4ZXMgaW50byBkaXRoZXIgbWF0cml4ICovCisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgaW50IGNpOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICAvKiBJbml0aWFsaXplIG91dHB1dCB2YWx1ZXMgdG8gMCBzbyBjYW4gcHJvY2VzcyBjb21wb25lbnRzIHNlcGFyYXRlbHkgKi8KKyAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIG91dHB1dF9idWZbcm93XSwKKwkgICAgICAoc2l6ZV90KSAod2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgeworICAgICAgaW5wdXRfcHRyID0gaW5wdXRfYnVmW3Jvd10gKyBjaTsKKyAgICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW3Jvd107CisgICAgICBjb2xvcmluZGV4X2NpID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2NpXTsKKyAgICAgIGRpdGhlciA9IGNxdWFudGl6ZS0+b2RpdGhlcltjaV1bcm93X2luZGV4XTsKKyAgICAgIGNvbF9pbmRleCA9IDA7CisKKyAgICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisJLyogRm9ybSBwaXhlbCB2YWx1ZSArIGRpdGhlciwgcmFuZ2UtbGltaXQgdG8gMC4uTUFYSlNBTVBMRSwKKwkgKiBzZWxlY3Qgb3V0cHV0IHZhbHVlLCBhY2N1bXVsYXRlIGludG8gb3V0cHV0IGNvZGUgZm9yIHRoaXMgcGl4ZWwuCisJICogUmFuZ2UtbGltaXRpbmcgbmVlZCBub3QgYmUgZG9uZSBleHBsaWNpdGx5LCBhcyB3ZSBoYXZlIGV4dGVuZGVkCisJICogdGhlIGNvbG9yaW5kZXggdGFibGUgdG8gcHJvZHVjZSB0aGUgcmlnaHQgYW5zd2VycyBmb3Igb3V0LW9mLXJhbmdlCisJICogaW5wdXRzLiAgVGhlIG1heGltdW0gZGl0aGVyIGlzICstIE1BWEpTQU1QTEU7IHRoaXMgc2V0cyB0aGUKKwkgKiByZXF1aXJlZCBhbW91bnQgb2YgcGFkZGluZy4KKwkgKi8KKwkqb3V0cHV0X3B0ciArPSBjb2xvcmluZGV4X2NpW0dFVEpTQU1QTEUoKmlucHV0X3B0cikrZGl0aGVyW2NvbF9pbmRleF1dOworCWlucHV0X3B0ciArPSBuYzsKKwlvdXRwdXRfcHRyKys7CisJY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgICAgfQorICAgIH0KKyAgICAvKiBBZHZhbmNlIHJvdyBpbmRleCBmb3IgbmV4dCByb3cgKi8KKyAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7CisgICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplM19vcmRfZGl0aGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIGludCBwaXhjb2RlOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB1dF9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB1dF9wdHI7CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOworICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07CisgIGludCAqIGRpdGhlcjA7CQkvKiBwb2ludHMgdG8gYWN0aXZlIHJvdyBvZiBkaXRoZXIgbWF0cml4ICovCisgIGludCAqIGRpdGhlcjE7CisgIGludCAqIGRpdGhlcjI7CisgIGludCByb3dfaW5kZXgsIGNvbF9pbmRleDsJLyogY3VycmVudCBpbmRleGVzIGludG8gZGl0aGVyIG1hdHJpeCAqLworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKKyAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XTsKKyAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGRpdGhlcjAgPSBjcXVhbnRpemUtPm9kaXRoZXJbMF1bcm93X2luZGV4XTsKKyAgICBkaXRoZXIxID0gY3F1YW50aXplLT5vZGl0aGVyWzFdW3Jvd19pbmRleF07CisgICAgZGl0aGVyMiA9IGNxdWFudGl6ZS0+b2RpdGhlclsyXVtyb3dfaW5kZXhdOworICAgIGNvbF9pbmRleCA9IDA7CisKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcGl4Y29kZSAgPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgwW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjBbY29sX2luZGV4XV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgxW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjFbY29sX2luZGV4XV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjJbY29sX2luZGV4XV0pOworICAgICAgKm91dHB1dF9wdHIrKyA9IChKU0FNUExFKSBwaXhjb2RlOworICAgICAgY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgIH0KKyAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7CisgICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIEdlbmVyYWwgY2FzZSwgd2l0aCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIExPQ0ZTRVJST1IgY3VyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCisgIExPQ0ZTRVJST1IgYmVsb3dlcnI7CQkvKiBlcnJvciBmb3IgcGl4ZWwgYmVsb3cgY3VyICovCisgIExPQ0ZTRVJST1IgYnByZXZlcnI7CQkvKiBlcnJvciBmb3IgYmVsb3cvcHJldiBjb2wgKi8KKyAgTE9DRlNFUlJPUiBibmV4dGVycjsJCS8qIGVycm9yIGZvciBiZWxvdy9uZXh0IGNvbCAqLworICBMT0NGU0VSUk9SIGRlbHRhOworICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdXRfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdXRfcHRyOworICBKU0FNUFJPVyBjb2xvcmluZGV4X2NpOworICBKU0FNUFJPVyBjb2xvcm1hcF9jaTsKKyAgaW50IHBpeGNvZGU7CisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgaW50IGRpcjsJCQkvKiAxIGZvciBsZWZ0LXRvLXJpZ2h0LCAtMSBmb3IgcmlnaHQtdG8tbGVmdCAqLworICBpbnQgZGlybmM7CQkJLyogZGlyICogbmMgKi8KKyAgaW50IGNpOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgU0hJRlRfVEVNUFMKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IHZhbHVlcyB0byAwIHNvIGNhbiBwcm9jZXNzIGNvbXBvbmVudHMgc2VwYXJhdGVseSAqLworICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgb3V0cHV0X2J1Zltyb3ddLAorCSAgICAgIChzaXplX3QpICh3aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7CisgICAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XSArIGNpOworICAgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbcm93XTsKKyAgICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKKwkvKiB3b3JrIHJpZ2h0IHRvIGxlZnQgaW4gdGhpcyByb3cgKi8KKwlpbnB1dF9wdHIgKz0gKHdpZHRoLTEpICogbmM7IC8qIHNvIHBvaW50IHRvIHJpZ2h0bW9zdCBwaXhlbCAqLworCW91dHB1dF9wdHIgKz0gd2lkdGgtMTsKKwlkaXIgPSAtMTsKKwlkaXJuYyA9IC1uYzsKKwllcnJvcnB0ciA9IGNxdWFudGl6ZS0+ZnNlcnJvcnNbY2ldICsgKHdpZHRoKzEpOyAvKiA9PiBlbnRyeSBhZnRlciBsYXN0IGNvbHVtbiAqLworICAgICAgfSBlbHNlIHsKKwkvKiB3b3JrIGxlZnQgdG8gcmlnaHQgaW4gdGhpcyByb3cgKi8KKwlkaXIgPSAxOworCWRpcm5jID0gbmM7CisJZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzW2NpXTsgLyogPT4gZW50cnkgYmVmb3JlIGZpcnN0IGNvbHVtbiAqLworICAgICAgfQorICAgICAgY29sb3JpbmRleF9jaSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFtjaV07CisgICAgICBjb2xvcm1hcF9jaSA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXBbY2ldOworICAgICAgLyogUHJlc2V0IGVycm9yIHZhbHVlczogbm8gZXJyb3IgcHJvcGFnYXRlZCB0byBmaXJzdCBwaXhlbCBmcm9tIGxlZnQgKi8KKyAgICAgIGN1ciA9IDA7CisgICAgICAvKiBhbmQgbm8gZXJyb3IgcHJvcGFnYXRlZCB0byByb3cgYmVsb3cgeWV0ICovCisgICAgICBiZWxvd2VyciA9IGJwcmV2ZXJyID0gMDsKKworICAgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKwkvKiBjdXIgaG9sZHMgdGhlIGVycm9yIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcHJldmlvdXMgcGl4ZWwgb24gdGhlCisJICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKKwkgKiB0byBmb3JtIHRoZSBjb21wbGV0ZSBlcnJvciBjb3JyZWN0aW9uIHRlcm0gZm9yIHRoaXMgcGl4ZWwsIGFuZAorCSAqIHJvdW5kIHRoZSBlcnJvciB0ZXJtICh3aGljaCBpcyBleHByZXNzZWQgKiAxNikgdG8gYW4gaW50ZWdlci4KKwkgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAorCSAqIGZvciBlaXRoZXIgc2lnbiBvZiB0aGUgZXJyb3IgdmFsdWUuCisJICogTm90ZTogZXJyb3JwdHIgcG9pbnRzIHRvICpwcmV2aW91cyogY29sdW1uJ3MgYXJyYXkgZW50cnkuCisJICovCisJY3VyID0gUklHSFRfU0hJRlQoY3VyICsgZXJyb3JwdHJbZGlyXSArIDgsIDQpOworCS8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCisJICogVGhlIG1heGltdW0gZXJyb3IgaXMgKy0gTUFYSlNBTVBMRTsgdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplCisJICogb2YgdGhlIHJhbmdlX2xpbWl0IGFycmF5LgorCSAqLworCWN1ciArPSBHRVRKU0FNUExFKCppbnB1dF9wdHIpOworCWN1ciA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyXSk7CisJLyogU2VsZWN0IG91dHB1dCB2YWx1ZSwgYWNjdW11bGF0ZSBpbnRvIG91dHB1dCBjb2RlIGZvciB0aGlzIHBpeGVsICovCisJcGl4Y29kZSA9IEdFVEpTQU1QTEUoY29sb3JpbmRleF9jaVtjdXJdKTsKKwkqb3V0cHV0X3B0ciArPSAoSlNBTVBMRSkgcGl4Y29kZTsKKwkvKiBDb21wdXRlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBlcnJvciBhdCB0aGlzIHBpeGVsICovCisJLyogTm90ZTogd2UgY2FuIGRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSB0aGUgZmluYWwgKi8KKwkvKiBwaXhlbCBjb2RlLCBiZWNhdXNlIHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLiAqLworCWN1ciAtPSBHRVRKU0FNUExFKGNvbG9ybWFwX2NpW3BpeGNvZGVdKTsKKwkvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KKwkgKiBBZGQgdGhlc2UgaW50byB0aGUgcnVubmluZyBzdW1zLCBhbmQgc2ltdWx0YW5lb3VzbHkgc2hpZnQgdGhlCisJICogbmV4dC1saW5lIGVycm9yIHN1bXMgbGVmdCBieSAxIGNvbHVtbi4KKwkgKi8KKwlibmV4dGVyciA9IGN1cjsKKwlkZWx0YSA9IGN1ciAqIDI7CisJY3VyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KKwllcnJvcnB0clswXSA9IChGU0VSUk9SKSAoYnByZXZlcnIgKyBjdXIpOworCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCisJYnByZXZlcnIgPSBiZWxvd2VyciArIGN1cjsKKwliZWxvd2VyciA9IGJuZXh0ZXJyOworCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCisJLyogQXQgdGhpcyBwb2ludCBjdXIgY29udGFpbnMgdGhlIDcvMTYgZXJyb3IgdmFsdWUgdG8gYmUgcHJvcGFnYXRlZAorCSAqIHRvIHRoZSBuZXh0IHBpeGVsIG9uIHRoZSBjdXJyZW50IGxpbmUsIGFuZCBhbGwgdGhlIGVycm9ycyBmb3IgdGhlCisJICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuIFdlIGFyZSB0aGVyZWZvcmUgcmVhZHkgdG8gbW92ZSBvbi4KKwkgKi8KKwlpbnB1dF9wdHIgKz0gZGlybmM7CS8qIGFkdmFuY2UgaW5wdXQgcHRyIHRvIG5leHQgY29sdW1uICovCisJb3V0cHV0X3B0ciArPSBkaXI7CS8qIGFkdmFuY2Ugb3V0cHV0IHB0ciB0byBuZXh0IGNvbHVtbiAqLworCWVycm9ycHRyICs9IGRpcjsJLyogYWR2YW5jZSBlcnJvcnB0ciB0byBjdXJyZW50IGNvbHVtbiAqLworICAgICAgfQorICAgICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZSBpbnRvIHRoZQorICAgICAgICogZmluYWwgZnNlcnJvcnNbXSBlbnRyeS4gIE5vdGUgd2UgbmVlZCBub3QgdW5sb2FkIGJlbG93ZXJyIGJlY2F1c2UKKyAgICAgICAqIGl0IGlzIGZvciB0aGUgZHVtbXkgY29sdW1uIGJlZm9yZSBvciBhZnRlciB0aGUgYWN0dWFsIGFycmF5LgorICAgICAgICovCisgICAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjsgLyogdW5sb2FkIHByZXYgZXJyIGludG8gYXJyYXkgKi8KKyAgICB9CisgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gKGNxdWFudGl6ZS0+b25fb2RkX3JvdyA/IEZBTFNFIDogVFJVRSk7CisgIH0KK30KKworCisvKgorICogQWxsb2NhdGUgd29ya3NwYWNlIGZvciBGbG95ZC1TdGVpbmJlcmcgZXJyb3JzLgorICovCisKK0xPQ0FMKHZvaWQpCithbGxvY19mc193b3Jrc3BhY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHNpemVfdCBhcnJheXNpemU7CisgIGludCBpOworCisgIGFycmF5c2l6ZSA9IChzaXplX3QpICgoY2luZm8tPm91dHB1dF93aWR0aCArIDIpICogU0laRU9GKEZTRVJST1IpKTsKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgY3F1YW50aXplLT5mc2Vycm9yc1tpXSA9IChGU0VSUlBUUikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgYXJyYXlzaXplKTsKKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBvbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzXzFfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHNpemVfdCBhcnJheXNpemU7CisgIGludCBpOworCisgIC8qIEluc3RhbGwgbXkgY29sb3JtYXAuICovCisgIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOworCisgIC8qIEluaXRpYWxpemUgZm9yIGRlc2lyZWQgZGl0aGVyaW5nIG1vZGUuICovCisgIHN3aXRjaCAoY2luZm8tPmRpdGhlcl9tb2RlKSB7CisgIGNhc2UgSkRJVEhFUl9OT05FOgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemUzOworICAgIGVsc2UKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemU7CisgICAgYnJlYWs7CisgIGNhc2UgSkRJVEhFUl9PUkRFUkVEOgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcXVhbnRpemUzX29yZF9kaXRoZXI7CisgICAgZWxzZQorICAgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9vcmRfZGl0aGVyOworICAgIGNxdWFudGl6ZS0+cm93X2luZGV4ID0gMDsJLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3Igb3JkZXJlZCBkaXRoZXIgKi8KKyAgICAvKiBJZiB1c2VyIGNoYW5nZWQgdG8gb3JkZXJlZCBkaXRoZXIgZnJvbSBhbm90aGVyIG1vZGUsCisgICAgICogd2UgbXVzdCByZWNyZWF0ZSB0aGUgY29sb3IgaW5kZXggdGFibGUgd2l0aCBwYWRkaW5nLgorICAgICAqIFRoaXMgd2lsbCBjb3N0IGV4dHJhIHNwYWNlLCBidXQgcHJvYmFibHkgaXNuJ3QgdmVyeSBsaWtlbHkuCisgICAgICovCisgICAgaWYgKCEgY3F1YW50aXplLT5pc19wYWRkZWQpCisgICAgICBjcmVhdGVfY29sb3JpbmRleChjaW5mbyk7CisgICAgLyogQ3JlYXRlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcyBpZiB3ZSBkaWRuJ3QgYWxyZWFkeS4gKi8KKyAgICBpZiAoY3F1YW50aXplLT5vZGl0aGVyWzBdID09IE5VTEwpCisgICAgICBjcmVhdGVfb2RpdGhlcl90YWJsZXMoY2luZm8pOworICAgIGJyZWFrOworICBjYXNlIEpESVRIRVJfRlM6CisgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9mc19kaXRoZXI7CisgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7IC8qIGluaXRpYWxpemUgc3RhdGUgZm9yIEYtUyBkaXRoZXIgKi8KKyAgICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIGRpZG4ndCBhbHJlYWR5LiAqLworICAgIGlmIChjcXVhbnRpemUtPmZzZXJyb3JzWzBdID09IE5VTEwpCisgICAgICBhbGxvY19mc193b3Jrc3BhY2UoY2luZm8pOworICAgIC8qIEluaXRpYWxpemUgdGhlIHByb3BhZ2F0ZWQgZXJyb3JzIHRvIHplcm8uICovCisgICAgYXJyYXlzaXplID0gKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiBTSVpFT0YoRlNFUlJPUikpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykKKyAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9yc1tpXSwgYXJyYXlzaXplKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzc18xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrIGluIDEtcGFzcyBjYXNlICovCit9CisKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKiBTaG91bGRuJ3QgZ2V0IHRvIHRoaXMgbW9kdWxlIQorICovCisKK01FVEhPRERFRih2b2lkKQorbmV3X2NvbG9yX21hcF8xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF8xcGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOworCisgIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2NxdWFudGl6ZXIpKTsKKyAgY2luZm8tPmNxdWFudGl6ZSA9IChzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKikgY3F1YW50aXplOworICBjcXVhbnRpemUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc18xX3F1YW50OworICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzXzFfcXVhbnQ7CisgIGNxdWFudGl6ZS0+cHViLm5ld19jb2xvcl9tYXAgPSBuZXdfY29sb3JfbWFwXzFfcXVhbnQ7CisgIGNxdWFudGl6ZS0+ZnNlcnJvcnNbMF0gPSBOVUxMOyAvKiBGbGFnIEZTIHdvcmtzcGFjZSBub3QgYWxsb2NhdGVkICovCisgIGNxdWFudGl6ZS0+b2RpdGhlclswXSA9IE5VTEw7CS8qIEFsc28gZmxhZyBvZGl0aGVyIGFycmF5cyBub3QgYWxsb2NhdGVkICovCisKKyAgLyogTWFrZSBzdXJlIG15IGludGVybmFsIGFycmF5cyB3b24ndCBvdmVyZmxvdyAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID4gTUFYX1FfQ09NUFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfQ09NUE9ORU5UUywgTUFYX1FfQ09NUFMpOworICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KKyAgaWYgKGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPiAoTUFYSlNBTVBMRSsxKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgTUFYSlNBTVBMRSsxKTsKKworICAvKiBDcmVhdGUgdGhlIGNvbG9ybWFwIGFuZCBjb2xvciBpbmRleCB0YWJsZS4gKi8KKyAgY3JlYXRlX2NvbG9ybWFwKGNpbmZvKTsKKyAgY3JlYXRlX2NvbG9yaW5kZXgoY2luZm8pOworCisgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2Ugbm93IGlmIHJlcXVlc3RlZC4KKyAgICogV2UgZG8gdGhpcyBub3cgc2luY2UgaXQgaXMgRkFSIHN0b3JhZ2UgYW5kIG1heSBhZmZlY3QgdGhlIG1lbW9yeQorICAgKiBtYW5hZ2VyJ3Mgc3BhY2UgY2FsY3VsYXRpb25zLiAgSWYgdGhlIHVzZXIgY2hhbmdlcyB0byBGUyBkaXRoZXIKKyAgICogbW9kZSBpbiBhIGxhdGVyIHBhc3MsIHdlIHdpbGwgYWxsb2NhdGUgdGhlIHNwYWNlIHRoZW4sIGFuZCB3aWxsCisgICAqIHBvc3NpYmx5IG92ZXJydW4gdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcuCisgICAqLworICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpCisgICAgYWxsb2NfZnNfd29ya3NwYWNlKGNpbmZvKTsKK30KKworI2VuZGlmIC8qIFFVQU5UXzFQQVNTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvanF1YW50Mi5jIGIvanF1YW50Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjAxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcXVhbnQyLmMKQEAgLTAsMCArMSwxMzEwIEBACisvKgorICoganF1YW50Mi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAoY29sb3IgbWFwcGluZykgcm91dGluZXMuCisgKiBUaGVzZSByb3V0aW5lcyBwcm92aWRlIHNlbGVjdGlvbiBvZiBhIGN1c3RvbSBjb2xvciBtYXAgZm9yIGFuIGltYWdlLAorICogZm9sbG93ZWQgYnkgbWFwcGluZyBvZiB0aGUgaW1hZ2UgdG8gdGhhdCBjb2xvciBtYXAsIHdpdGggb3B0aW9uYWwKKyAqIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCisgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBqdXN0IHRoZSBzZWNvbmQgcGFzcyB0byBtYXAgdG8gYW4gYXJiaXRyYXJ5CisgKiBleHRlcm5hbGx5LWdpdmVuIGNvbG9yIG1hcC4KKyAqCisgKiBOb3RlOiBvcmRlcmVkIGRpdGhlcmluZyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSB0aGVyZSBpc24ndCBhbnkgZmFzdAorICogd2F5IHRvIGNvbXB1dGUgaW50ZXJjb2xvciBkaXN0YW5jZXM7IGl0J3MgdW5jbGVhciB0aGF0IG9yZGVyZWQgZGl0aGVyJ3MKKyAqIGZ1bmRhbWVudGFsIGFzc3VtcHRpb25zIGV2ZW4gaG9sZCB3aXRoIGFuIGlycmVndWxhcmx5IHNwYWNlZCBjb2xvciBtYXAuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHdlbGwta25vd24gSGVja2JlcnQgcGFyYWRpZ20gZm9yIGNvbG9yCisgKiBxdWFudGl6YXRpb24uICBNb3N0IG9mIHRoZSBpZGVhcyB1c2VkIGhlcmUgY2FuIGJlIHRyYWNlZCBiYWNrIHRvCisgKiBIZWNrYmVydCdzIHNlbWluYWwgcGFwZXIKKyAqICAgSGVja2JlcnQsIFBhdWwuICAiQ29sb3IgSW1hZ2UgUXVhbnRpemF0aW9uIGZvciBGcmFtZSBCdWZmZXIgRGlzcGxheSIsCisgKiAgIFByb2MuIFNJR0dSQVBIICc4MiwgQ29tcHV0ZXIgR3JhcGhpY3Mgdi4xNiAjMyAoSnVseSAxOTgyKSwgcHAgMjk3LTMwNC4KKyAqCisgKiBJbiB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSBpbWFnZSwgd2UgYWNjdW11bGF0ZSBhIGhpc3RvZ3JhbSBzaG93aW5nIHRoZQorICogdXNhZ2UgY291bnQgb2YgZWFjaCBwb3NzaWJsZSBjb2xvci4gIFRvIGtlZXAgdGhlIGhpc3RvZ3JhbSB0byBhIHJlYXNvbmFibGUKKyAqIHNpemUsIHdlIHJlZHVjZSB0aGUgcHJlY2lzaW9uIG9mIHRoZSBpbnB1dDsgdHlwaWNhbCBwcmFjdGljZSBpcyB0byByZXRhaW4KKyAqIDUgb3IgNiBiaXRzIHBlciBjb2xvciwgc28gdGhhdCA4IG9yIDQgZGlmZmVyZW50IGlucHV0IHZhbHVlcyBhcmUgY291bnRlZAorICogaW4gdGhlIHNhbWUgaGlzdG9ncmFtIGNlbGwuCisgKgorICogTmV4dCwgdGhlIGNvbG9yLXNlbGVjdGlvbiBzdGVwIGJlZ2lucyB3aXRoIGEgYm94IHJlcHJlc2VudGluZyB0aGUgd2hvbGUKKyAqIGNvbG9yIHNwYWNlLCBhbmQgcmVwZWF0ZWRseSBzcGxpdHMgdGhlICJsYXJnZXN0IiByZW1haW5pbmcgYm94IHVudGlsIHdlCisgKiBoYXZlIGFzIG1hbnkgYm94ZXMgYXMgZGVzaXJlZCBjb2xvcnMuICBUaGVuIHRoZSBtZWFuIGNvbG9yIGluIGVhY2gKKyAqIHJlbWFpbmluZyBib3ggYmVjb21lcyBvbmUgb2YgdGhlIHBvc3NpYmxlIG91dHB1dCBjb2xvcnMuCisgKiAKKyAqIFRoZSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBpbWFnZSBtYXBzIGVhY2ggaW5wdXQgcGl4ZWwgdG8gdGhlIGNsb3Nlc3Qgb3V0cHV0CisgKiBjb2xvciAob3B0aW9uYWxseSBhZnRlciBhcHBseWluZyBhIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgY29ycmVjdGlvbikuCisgKiBUaGlzIG1hcHBpbmcgaXMgbG9naWNhbGx5IHRyaXZpYWwsIGJ1dCBtYWtpbmcgaXQgZ28gZmFzdCBlbm91Z2ggcmVxdWlyZXMKKyAqIGNvbnNpZGVyYWJsZSBjYXJlLgorICoKKyAqIEhlY2tiZXJ0LXN0eWxlIHF1YW50aXplcnMgdmFyeSBhIGdvb2QgZGVhbCBpbiB0aGVpciBwb2xpY2llcyBmb3IgY2hvb3NpbmcKKyAqIHRoZSAibGFyZ2VzdCIgYm94IGFuZCBkZWNpZGluZyB3aGVyZSB0byBjdXQgaXQuICBUaGUgcGFydGljdWxhciBwb2xpY2llcworICogdXNlZCBoZXJlIGhhdmUgcHJvdmVkIG91dCB3ZWxsIGluIGV4cGVyaW1lbnRhbCBjb21wYXJpc29ucywgYnV0IGJldHRlciBvbmVzCisgKiBtYXkgeWV0IGJlIGZvdW5kLgorICoKKyAqIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlLCB0aGlzIG1vZHVsZSBxdWFudGl6ZWQgaW4gWUNiQ3IgY29sb3IKKyAqIHNwYWNlLCBwcm9jZXNzaW5nIHRoZSByYXcgdXBzYW1wbGVkIGRhdGEgd2l0aG91dCBhIGNvbG9yIGNvbnZlcnNpb24gc3RlcC4KKyAqIFRoaXMgYWxsb3dlZCB0aGUgY29sb3IgY29udmVyc2lvbiBtYXRoIHRvIGJlIGRvbmUgb25seSBvbmNlIHBlciBjb2xvcm1hcAorICogZW50cnksIG5vdCBvbmNlIHBlciBwaXhlbC4gIEhvd2V2ZXIsIHRoYXQgb3B0aW1pemF0aW9uIHByZWNsdWRlZCBvdGhlcgorICogdXNlZnVsIG9wdGltaXphdGlvbnMgKHN1Y2ggYXMgbWVyZ2luZyBjb2xvciBjb252ZXJzaW9uIHdpdGggdXBzYW1wbGluZykKKyAqIGFuZCBpdCBhbHNvIGludGVyZmVyZWQgd2l0aCBkZXNpcmVkIGNhcGFiaWxpdGllcyBzdWNoIGFzIHF1YW50aXppbmcgdG8gYW4KKyAqIGV4dGVybmFsbHktc3VwcGxpZWQgY29sb3JtYXAuICBXZSBoYXZlIHRoZXJlZm9yZSBhYmFuZG9uZWQgdGhhdCBhcHByb2FjaC4KKyAqIFRoZSBwcmVzZW50IGNvZGUgd29ya3MgaW4gdGhlIHBvc3QtY29udmVyc2lvbiBjb2xvciBzcGFjZSwgdHlwaWNhbGx5IFJHQi4KKyAqCisgKiBUbyBpbXByb3ZlIHRoZSB2aXN1YWwgcXVhbGl0eSBvZiB0aGUgcmVzdWx0cywgd2UgYWN0dWFsbHkgd29yayBpbiBzY2FsZWQKKyAqIFJHQiBzcGFjZSwgZ2l2aW5nIEcgZGlzdGFuY2VzIG1vcmUgd2VpZ2h0IHRoYW4gUiwgYW5kIFIgaW4gdHVybiBtb3JlIHRoYW4KKyAqIEIuICBUbyBkbyBldmVyeXRoaW5nIGluIGludGVnZXIgbWF0aCwgd2UgbXVzdCB1c2UgaW50ZWdlciBzY2FsZSBmYWN0b3JzLgorICogVGhlIDIvMy8xIHNjYWxlIGZhY3RvcnMgdXNlZCBoZXJlIGNvcnJlc3BvbmQgbG9vc2VseSB0byB0aGUgcmVsYXRpdmUKKyAqIHdlaWdodHMgb2YgdGhlIGNvbG9ycyBpbiB0aGUgTlRTQyBncmF5c2NhbGUgZXF1YXRpb24uCisgKiBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb2RlIHRvIHF1YW50aXplIGEgbm9uLVJHQiBjb2xvciBzcGFjZSwgeW91J2xsCisgKiBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBzY2FsZSBmYWN0b3JzLgorICovCisKKyNkZWZpbmUgUl9TQ0FMRSAyCQkvKiBzY2FsZSBSIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KKyNkZWZpbmUgR19TQ0FMRSAzCQkvKiBzY2FsZSBHIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KKyNkZWZpbmUgQl9TQ0FMRSAxCQkvKiBhbmQgQiBieSB0aGlzIG11Y2ggKi8KKworLyogUmVsYWJlbCBSL0cvQiBhcyBjb21wb25lbnRzIDAvMS8yLCByZXNwZWN0aW5nIHRoZSBSR0Igb3JkZXJpbmcgZGVmaW5lZAorICogaW4gam1vcmVjZmcuaC4gIEFzIHRoZSBjb2RlIHN0YW5kcywgaXQgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIFIsRyxCCisgKiBhbmQgQixHLFIgb3JkZXJzLiAgSWYgeW91IGRlZmluZSBzb21lIG90aGVyIHdlaXJkIG9yZGVyIGluIGptb3JlY2ZnLmgsCisgKiB5b3UnbGwgZ2V0IGNvbXBpbGUgZXJyb3JzIHVudGlsIHlvdSBleHRlbmQgdGhpcyBsb2dpYy4gIEluIHRoYXQgY2FzZQorICogeW91J2xsIHByb2JhYmx5IHdhbnQgdG8gdHdlYWsgdGhlIGhpc3RvZ3JhbSBzaXplcyB0b28uCisgKi8KKworI2lmIFJHQl9SRUQgPT0gMAorI2RlZmluZSBDMF9TQ0FMRSBSX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfQkxVRSA9PSAwCisjZGVmaW5lIEMwX1NDQUxFIEJfU0NBTEUKKyNlbmRpZgorI2lmIFJHQl9HUkVFTiA9PSAxCisjZGVmaW5lIEMxX1NDQUxFIEdfU0NBTEUKKyNlbmRpZgorI2lmIFJHQl9SRUQgPT0gMgorI2RlZmluZSBDMl9TQ0FMRSBSX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfQkxVRSA9PSAyCisjZGVmaW5lIEMyX1NDQUxFIEJfU0NBTEUKKyNlbmRpZgorCisKKy8qCisgKiBGaXJzdCB3ZSBoYXZlIHRoZSBoaXN0b2dyYW0gZGF0YSBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmVzIGZvciBjcmVhdGluZyBpdC4KKyAqCisgKiBUaGUgbnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIGNhbiBiZSBhZGp1c3RlZCBieSBjaGFuZ2luZyB0aGVzZSBzeW1ib2xzLgorICogV2UgcmVjb21tZW5kIGtlZXBpbmcgNiBiaXRzIGZvciBHIGFuZCA1IGVhY2ggZm9yIFIgYW5kIEIuCisgKiBJZiB5b3UgaGF2ZSBwbGVudHkgb2YgbWVtb3J5IGFuZCBjeWNsZXMsIDYgYml0cyBhbGwgYXJvdW5kIGdpdmVzIG1hcmdpbmFsbHkKKyAqIGJldHRlciByZXN1bHRzOyBpZiB5b3UgYXJlIHNob3J0IG9mIG1lbW9yeSwgNSBiaXRzIGFsbCBhcm91bmQgd2lsbCBzYXZlCisgKiBzb21lIHNwYWNlIGJ1dCBkZWdyYWRlIHRoZSByZXN1bHRzLgorICogVG8gbWFpbnRhaW4gYSBmdWxseSBhY2N1cmF0ZSBoaXN0b2dyYW0sIHdlJ2QgbmVlZCB0byBhbGxvY2F0ZSBhICJsb25nIgorICogKHByZWZlcmFibHkgdW5zaWduZWQgbG9uZykgZm9yIGVhY2ggY2VsbC4gIEluIHByYWN0aWNlIHRoaXMgaXMgb3ZlcmtpbGw7CisgKiB3ZSBjYW4gZ2V0IGJ5IHdpdGggMTYgYml0cyBwZXIgY2VsbC4gIEZldyBvZiB0aGUgY2VsbCBjb3VudHMgd2lsbCBvdmVyZmxvdywKKyAqIGFuZCBjbGFtcGluZyB0aG9zZSB0aGF0IGRvIG92ZXJmbG93IHRvIHRoZSBtYXhpbXVtIHZhbHVlIHdpbGwgZ2l2ZSBjbG9zZS0KKyAqIGVub3VnaCByZXN1bHRzLiAgVGhpcyByZWR1Y2VzIHRoZSByZWNvbW1lbmRlZCBoaXN0b2dyYW0gc2l6ZSBmcm9tIDI1NktiCisgKiB0byAxMjhLYiwgd2hpY2ggaXMgYSB1c2VmdWwgc2F2aW5ncyBvbiBQQy1jbGFzcyBtYWNoaW5lcy4KKyAqIChJbiB0aGUgc2Vjb25kIHBhc3MgdGhlIGhpc3RvZ3JhbSBzcGFjZSBpcyByZS11c2VkIGZvciBwaXhlbCBtYXBwaW5nIGRhdGE7CisgKiBpbiB0aGF0IGNhcGFjaXR5LCBlYWNoIGNlbGwgbXVzdCBiZSBhYmxlIHRvIHN0b3JlIHplcm8gdG8gdGhlIG51bWJlciBvZgorICogZGVzaXJlZCBjb2xvcnMuICAxNiBiaXRzL2NlbGwgaXMgcGxlbnR5IGZvciB0aGF0IHRvby4pCisgKiBTaW5jZSB0aGUgSlBFRyBjb2RlIGlzIGludGVuZGVkIHRvIHJ1biBpbiBzbWFsbCBtZW1vcnkgbW9kZWwgb24gODB4ODYKKyAqIG1hY2hpbmVzLCB3ZSBjYW4ndCBqdXN0IGFsbG9jYXRlIHRoZSBoaXN0b2dyYW0gaW4gb25lIGNodW5rLiAgSW5zdGVhZAorICogb2YgYSB0cnVlIDMtRCBhcnJheSwgd2UgdXNlIGEgcm93IG9mIHBvaW50ZXJzIHRvIDItRCBhcnJheXMuICBFYWNoCisgKiBwb2ludGVyIGNvcnJlc3BvbmRzIHRvIGEgQzAgdmFsdWUgKHR5cGljYWxseSAyXjUgPSAzMiBwb2ludGVycykgYW5kCisgKiBlYWNoIDItRCBhcnJheSBoYXMgMl42KjJeNSA9IDIwNDggb3IgMl42KjJeNiA9IDQwOTYgZW50cmllcy4gIE5vdGUgdGhhdAorICogb24gODB4ODYgbWFjaGluZXMsIHRoZSBwb2ludGVyIHJvdyBpcyBpbiBuZWFyIG1lbW9yeSBidXQgdGhlIGFjdHVhbAorICogYXJyYXlzIGFyZSBpbiBmYXIgbWVtb3J5IChzYW1lIGFycmFuZ2VtZW50IGFzIHdlIHVzZSBmb3IgaW1hZ2UgYXJyYXlzKS4KKyAqLworCisjZGVmaW5lIE1BWE5VTUNPTE9SUyAgKE1BWEpTQU1QTEUrMSkgLyogbWF4aW11bSBzaXplIG9mIGNvbG9ybWFwICovCisKKy8qIFRoZXNlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBlaXRoZXIgUixHLEIgb3IgQixHLFIgY29sb3Igb3JkZXIsCisgKiBidXQgeW91IG1heSBub3QgbGlrZSB0aGUgcmVzdWx0cyBmb3Igb3RoZXIgY29sb3Igb3JkZXJzLgorICovCisjZGVmaW5lIEhJU1RfQzBfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gUi9CIGhpc3RvZ3JhbSAqLworI2RlZmluZSBISVNUX0MxX0JJVFMgIDYJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIEcgaGlzdG9ncmFtICovCisjZGVmaW5lIEhJU1RfQzJfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gQi9SIGhpc3RvZ3JhbSAqLworCisvKiBOdW1iZXIgb2YgZWxlbWVudHMgYWxvbmcgaGlzdG9ncmFtIGF4ZXMuICovCisjZGVmaW5lIEhJU1RfQzBfRUxFTVMgICgxPDxISVNUX0MwX0JJVFMpCisjZGVmaW5lIEhJU1RfQzFfRUxFTVMgICgxPDxISVNUX0MxX0JJVFMpCisjZGVmaW5lIEhJU1RfQzJfRUxFTVMgICgxPDxISVNUX0MyX0JJVFMpCisKKy8qIFRoZXNlIGFyZSB0aGUgYW1vdW50cyB0byBzaGlmdCBhbiBpbnB1dCB2YWx1ZSB0byBnZXQgYSBoaXN0b2dyYW0gaW5kZXguICovCisjZGVmaW5lIEMwX1NISUZUICAoQklUU19JTl9KU0FNUExFLUhJU1RfQzBfQklUUykKKyNkZWZpbmUgQzFfU0hJRlQgIChCSVRTX0lOX0pTQU1QTEUtSElTVF9DMV9CSVRTKQorI2RlZmluZSBDMl9TSElGVCAgKEJJVFNfSU5fSlNBTVBMRS1ISVNUX0MyX0JJVFMpCisKKwordHlwZWRlZiBVSU5UMTYgaGlzdGNlbGw7CS8qIGhpc3RvZ3JhbSBjZWxsOyBwcmVmZXIgYW4gdW5zaWduZWQgdHlwZSAqLworCit0eXBlZGVmIGhpc3RjZWxsIEZBUiAqIGhpc3RwdHI7CS8qIGZvciBwb2ludGVycyB0byBoaXN0b2dyYW0gY2VsbHMgKi8KKwordHlwZWRlZiBoaXN0Y2VsbCBoaXN0MWRbSElTVF9DMl9FTEVNU107IC8qIHR5cGVkZWZzIGZvciB0aGUgYXJyYXkgKi8KK3R5cGVkZWYgaGlzdDFkIEZBUiAqIGhpc3QyZDsJLyogdHlwZSBmb3IgdGhlIDJuZC1sZXZlbCBwb2ludGVycyAqLwordHlwZWRlZiBoaXN0MmQgKiBoaXN0M2Q7CS8qIHR5cGUgZm9yIHRvcC1sZXZlbCBwb2ludGVyICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nLgorICoKKyAqIEVycm9ycyBhcmUgYWNjdW11bGF0ZWQgaW50byB0aGUgYXJyYXkgZnNlcnJvcnNbXSwgYXQgYSByZXNvbHV0aW9uIG9mCisgKiAxLzE2dGggb2YgYSBwaXhlbCBjb3VudC4gIFRoZSBlcnJvciBhdCBhIGdpdmVuIHBpeGVsIGlzIHByb3BhZ2F0ZWQKKyAqIHRvIGl0cyBub3QteWV0LXByb2Nlc3NlZCBuZWlnaGJvcnMgdXNpbmcgdGhlIHN0YW5kYXJkIEYtUyBmcmFjdGlvbnMsCisgKgkJLi4uCShoZXJlKQk3LzE2CisgKgkJMy8xNgk1LzE2CTEvMTYKKyAqIFdlIHdvcmsgbGVmdC10by1yaWdodCBvbiBldmVuIHJvd3MsIHJpZ2h0LXRvLWxlZnQgb24gb2RkIHJvd3MuCisgKgorICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzaW5nbGUgYXJyYXkgKGhvbGRpbmcgb25lIHJvdydzIHdvcnRoIG9mIGVycm9ycykKKyAqIGJ5IHVzaW5nIGl0IHRvIHN0b3JlIHRoZSBjdXJyZW50IHJvdydzIGVycm9ycyBhdCBwaXhlbCBjb2x1bW5zIG5vdCB5ZXQKKyAqIHByb2Nlc3NlZCwgYnV0IHRoZSBuZXh0IHJvdydzIGVycm9ycyBhdCBjb2x1bW5zIGFscmVhZHkgcHJvY2Vzc2VkLiAgV2UKKyAqIG5lZWQgb25seSBhIGZldyBleHRyYSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgZXJyb3JzIGltbWVkaWF0ZWx5IGFyb3VuZCB0aGUKKyAqIGN1cnJlbnQgY29sdW1uLiAgKElmIHdlIGFyZSBsdWNreSwgdGhvc2UgdmFyaWFibGVzIGFyZSBpbiByZWdpc3RlcnMsIGJ1dAorICogZXZlbiBpZiBub3QsIHRoZXkncmUgcHJvYmFibHkgY2hlYXBlciB0byBhY2Nlc3MgdGhhbiBhcnJheSBlbGVtZW50cyBhcmUuKQorICoKKyAqIFRoZSBmc2Vycm9yc1tdIGFycmF5IGhhcyAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzOyB0aGUgZXh0cmEgZW50cnkgYXQKKyAqIGVhY2ggZW5kIHNhdmVzIHVzIGZyb20gc3BlY2lhbC1jYXNpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHBpeGVscy4KKyAqIEVhY2ggZW50cnkgaXMgdGhyZWUgdmFsdWVzIGxvbmcsIG9uZSB2YWx1ZSBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCisgKgorICogTm90ZTogb24gYSB3aWRlIGltYWdlLCB3ZSBtaWdodCBub3QgaGF2ZSBlbm91Z2ggcm9vbSBpbiBhIFBDJ3MgbmVhciBkYXRhCisgKiBzZWdtZW50IHRvIGhvbGQgdGhlIGVycm9yIGFycmF5OyBzbyBpdCBpcyBhbGxvY2F0ZWQgd2l0aCBhbGxvY19sYXJnZS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKK3R5cGVkZWYgSU5UMTYgRlNFUlJPUjsJCS8qIDE2IGJpdHMgc2hvdWxkIGJlIGVub3VnaCAqLwordHlwZWRlZiBpbnQgTE9DRlNFUlJPUjsJCS8qIHVzZSAnaW50JyBmb3IgY2FsY3VsYXRpb24gdGVtcHMgKi8KKyNlbHNlCit0eXBlZGVmIElOVDMyIEZTRVJST1I7CQkvKiBtYXkgbmVlZCBtb3JlIHRoYW4gMTYgYml0cyAqLwordHlwZWRlZiBJTlQzMiBMT0NGU0VSUk9SOwkvKiBiZSBzdXJlIGNhbGN1bGF0aW9uIHRlbXBzIGFyZSBiaWcgZW5vdWdoICovCisjZW5kaWYKKwordHlwZWRlZiBGU0VSUk9SIEZBUiAqRlNFUlJQVFI7CS8qIHBvaW50ZXIgdG8gZXJyb3IgYXJyYXkgKGluIEZBUiBzdG9yYWdlISkgKi8KKworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBTcGFjZSBmb3IgdGhlIGV2ZW50dWFsbHkgY3JlYXRlZCBjb2xvcm1hcCBpcyBzdGFzaGVkIGhlcmUgKi8KKyAgSlNBTVBBUlJBWSBzdl9jb2xvcm1hcDsJLyogY29sb3JtYXAgYWxsb2NhdGVkIGF0IGluaXQgdGltZSAqLworICBpbnQgZGVzaXJlZDsJCQkvKiBkZXNpcmVkICMgb2YgY29sb3JzID0gc2l6ZSBvZiBjb2xvcm1hcCAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgYWNjdW11bGF0aW5nIGltYWdlIHN0YXRpc3RpY3MgKi8KKyAgaGlzdDNkIGhpc3RvZ3JhbTsJCS8qIHBvaW50ZXIgdG8gdGhlIGhpc3RvZ3JhbSAqLworCisgIGJvb2xlYW4gbmVlZHNfemVyb2VkOwkJLyogVFJVRSBpZiBuZXh0IHBhc3MgbXVzdCB6ZXJvIGhpc3RvZ3JhbSAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworICBGU0VSUlBUUiBmc2Vycm9yczsJCS8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLworICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KKyAgaW50ICogZXJyb3JfbGltaXRlcjsJCS8qIHRhYmxlIGZvciBjbGFtcGluZyB0aGUgYXBwbGllZCBlcnJvciAqLworfSBteV9jcXVhbnRpemVyOworCit0eXBlZGVmIG15X2NxdWFudGl6ZXIgKiBteV9jcXVhbnRpemVfcHRyOworCisKKy8qCisgKiBQcmVzY2FuIHNvbWUgcm93cyBvZiBwaXhlbHMuCisgKiBJbiB0aGlzIG1vZHVsZSB0aGUgcHJlc2NhbiBzaW1wbHkgdXBkYXRlcyB0aGUgaGlzdG9ncmFtLCB3aGljaCBoYXMgYmVlbgorICogaW5pdGlhbGl6ZWQgdG8gemVyb2VzIGJ5IHN0YXJ0X3Bhc3MuCisgKiBBbiBvdXRwdXRfYnVmIHBhcmFtZXRlciBpcyByZXF1aXJlZCBieSB0aGUgbWV0aG9kIHNpZ25hdHVyZSwgYnV0IG5vIGRhdGEKKyAqIGlzIGFjdHVhbGx5IG91dHB1dCAoaW4gZmFjdCB0aGUgYnVmZmVyIGNvbnRyb2xsZXIgaXMgcHJvYmFibHkgcGFzc2luZyBhCisgKiBOVUxMIHBvaW50ZXIpLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJlc2Nhbl9xdWFudGl6ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgaGlzdHB0ciBoaXN0cDsKKyAgcmVnaXN0ZXIgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBwdHIgPSBpbnB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgLyogZ2V0IHBpeGVsIHZhbHVlIGFuZCBpbmRleCBpbnRvIHRoZSBoaXN0b2dyYW0gKi8KKyAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bR0VUSlNBTVBMRShwdHJbMF0pID4+IEMwX1NISUZUXQorCQkJIFtHRVRKU0FNUExFKHB0clsxXSkgPj4gQzFfU0hJRlRdCisJCQkgW0dFVEpTQU1QTEUocHRyWzJdKSA+PiBDMl9TSElGVF07CisgICAgICAvKiBpbmNyZW1lbnQsIGNoZWNrIGZvciBvdmVyZmxvdyBhbmQgdW5kbyBpbmNyZW1lbnQgaWYgc28uICovCisgICAgICBpZiAoKysoKmhpc3RwKSA8PSAwKQorCSgqaGlzdHApLS07CisgICAgICBwdHIgKz0gMzsKKyAgICB9CisgIH0KK30KKworCisvKgorICogTmV4dCB3ZSBoYXZlIHRoZSByZWFsbHkgaW50ZXJlc3Rpbmcgcm91dGluZXM6IHNlbGVjdGlvbiBvZiBhIGNvbG9ybWFwCisgKiBnaXZlbiB0aGUgY29tcGxldGVkIGhpc3RvZ3JhbS4KKyAqIFRoZXNlIHJvdXRpbmVzIHdvcmsgd2l0aCBhIGxpc3Qgb2YgImJveGVzIiwgZWFjaCByZXByZXNlbnRpbmcgYSByZWN0YW5ndWxhcgorICogc3Vic2V0IG9mIHRoZSBpbnB1dCBjb2xvciBzcGFjZSAodG8gaGlzdG9ncmFtIHByZWNpc2lvbikuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGUgYm91bmRzIG9mIHRoZSBib3ggKGluY2x1c2l2ZSk7IGV4cHJlc3NlZCBhcyBoaXN0b2dyYW0gaW5kZXhlcyAqLworICBpbnQgYzBtaW4sIGMwbWF4OworICBpbnQgYzFtaW4sIGMxbWF4OworICBpbnQgYzJtaW4sIGMybWF4OworICAvKiBUaGUgdm9sdW1lIChhY3R1YWxseSAyLW5vcm0pIG9mIHRoZSBib3ggKi8KKyAgSU5UMzIgdm9sdW1lOworICAvKiBUaGUgbnVtYmVyIG9mIG5vbnplcm8gaGlzdG9ncmFtIGNlbGxzIHdpdGhpbiB0aGlzIGJveCAqLworICBsb25nIGNvbG9yY291bnQ7Cit9IGJveDsKKwordHlwZWRlZiBib3ggKiBib3hwdHI7CisKKworTE9DQUwoYm94cHRyKQorZmluZF9iaWdnZXN0X2NvbG9yX3BvcCAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKKy8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgY29sb3IgcG9wdWxhdGlvbiAqLworLyogUmV0dXJucyBOVUxMIGlmIG5vIHNwbGl0dGFibGUgYm94ZXMgcmVtYWluICovCit7CisgIHJlZ2lzdGVyIGJveHB0ciBib3hwOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgbG9uZyBtYXhjID0gMDsKKyAgYm94cHRyIHdoaWNoID0gTlVMTDsKKyAgCisgIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7CisgICAgaWYgKGJveHAtPmNvbG9yY291bnQgPiBtYXhjICYmIGJveHAtPnZvbHVtZSA+IDApIHsKKyAgICAgIHdoaWNoID0gYm94cDsKKyAgICAgIG1heGMgPSBib3hwLT5jb2xvcmNvdW50OworICAgIH0KKyAgfQorICByZXR1cm4gd2hpY2g7Cit9CisKKworTE9DQUwoYm94cHRyKQorZmluZF9iaWdnZXN0X3ZvbHVtZSAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKKy8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgKHNjYWxlZCkgdm9sdW1lICovCisvKiBSZXR1cm5zIE5VTEwgaWYgbm8gc3BsaXR0YWJsZSBib3hlcyByZW1haW4gKi8KK3sKKyAgcmVnaXN0ZXIgYm94cHRyIGJveHA7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBJTlQzMiBtYXh2ID0gMDsKKyAgYm94cHRyIHdoaWNoID0gTlVMTDsKKyAgCisgIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7CisgICAgaWYgKGJveHAtPnZvbHVtZSA+IG1heHYpIHsKKyAgICAgIHdoaWNoID0gYm94cDsKKyAgICAgIG1heHYgPSBib3hwLT52b2x1bWU7CisgICAgfQorICB9CisgIHJldHVybiB3aGljaDsKK30KKworCitMT0NBTCh2b2lkKQordXBkYXRlX2JveCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm94cHRyIGJveHApCisvKiBTaHJpbmsgdGhlIG1pbi9tYXggYm91bmRzIG9mIGEgYm94IHRvIGVuY2xvc2Ugb25seSBub256ZXJvIGVsZW1lbnRzLCAqLworLyogYW5kIHJlY29tcHV0ZSBpdHMgdm9sdW1lIGFuZCBwb3B1bGF0aW9uICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaGlzdHB0ciBoaXN0cDsKKyAgaW50IGMwLGMxLGMyOworICBpbnQgYzBtaW4sYzBtYXgsYzFtaW4sYzFtYXgsYzJtaW4sYzJtYXg7CisgIElOVDMyIGRpc3QwLGRpc3QxLGRpc3QyOworICBsb25nIGNjb3VudDsKKyAgCisgIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OworICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKKyAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7CisgIAorICBpZiAoYzBtYXggPiBjMG1pbikKKyAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQorICAgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisJZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKKwkgIGlmICgqaGlzdHArKyAhPSAwKSB7CisJICAgIGJveHAtPmMwbWluID0gYzBtaW4gPSBjMDsKKwkgICAgZ290byBoYXZlX2MwbWluOworCSAgfQorICAgICAgfQorIGhhdmVfYzBtaW46CisgIGlmIChjMG1heCA+IGMwbWluKQorICAgIGZvciAoYzAgPSBjMG1heDsgYzAgPj0gYzBtaW47IGMwLS0pCisgICAgICBmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKKwlmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQorCSAgaWYgKCpoaXN0cCsrICE9IDApIHsKKwkgICAgYm94cC0+YzBtYXggPSBjMG1heCA9IGMwOworCSAgICBnb3RvIGhhdmVfYzBtYXg7CisJICB9CisgICAgICB9CisgaGF2ZV9jMG1heDoKKyAgaWYgKGMxbWF4ID4gYzFtaW4pCisgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykKKyAgICAgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspIHsKKwloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOworCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisJICBpZiAoKmhpc3RwKysgIT0gMCkgeworCSAgICBib3hwLT5jMW1pbiA9IGMxbWluID0gYzE7CisJICAgIGdvdG8gaGF2ZV9jMW1pbjsKKwkgIH0KKyAgICAgIH0KKyBoYXZlX2MxbWluOgorICBpZiAoYzFtYXggPiBjMW1pbikKKyAgICBmb3IgKGMxID0gYzFtYXg7IGMxID49IGMxbWluOyBjMS0tKQorICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisJZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKKwkgIGlmICgqaGlzdHArKyAhPSAwKSB7CisJICAgIGJveHAtPmMxbWF4ID0gYzFtYXggPSBjMTsKKwkgICAgZ290byBoYXZlX2MxbWF4OworCSAgfQorICAgICAgfQorIGhhdmVfYzFtYXg6CisgIGlmIChjMm1heCA+IGMybWluKQorICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisgICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKKwlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQorCSAgaWYgKCpoaXN0cCAhPSAwKSB7CisJICAgIGJveHAtPmMybWluID0gYzJtaW4gPSBjMjsKKwkgICAgZ290byBoYXZlX2MybWluOworCSAgfQorICAgICAgfQorIGhhdmVfYzJtaW46CisgIGlmIChjMm1heCA+IGMybWluKQorICAgIGZvciAoYzIgPSBjMm1heDsgYzIgPj0gYzJtaW47IGMyLS0pCisgICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKKwlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQorCSAgaWYgKCpoaXN0cCAhPSAwKSB7CisJICAgIGJveHAtPmMybWF4ID0gYzJtYXggPSBjMjsKKwkgICAgZ290byBoYXZlX2MybWF4OworCSAgfQorICAgICAgfQorIGhhdmVfYzJtYXg6CisKKyAgLyogVXBkYXRlIGJveCB2b2x1bWUuCisgICAqIFdlIHVzZSAyLW5vcm0gcmF0aGVyIHRoYW4gcmVhbCB2b2x1bWUgaGVyZTsgdGhpcyBiaWFzZXMgdGhlIG1ldGhvZAorICAgKiBhZ2FpbnN0IG1ha2luZyBsb25nIG5hcnJvdyBib3hlcywgYW5kIGl0IGhhcyB0aGUgc2lkZSBiZW5lZml0IHRoYXQKKyAgICogYSBib3ggaXMgc3BsaXR0YWJsZSBpZmYgbm9ybSA+IDAuCisgICAqIFNpbmNlIHRoZSBkaWZmZXJlbmNlcyBhcmUgZXhwcmVzc2VkIGluIGhpc3RvZ3JhbS1jZWxsIHVuaXRzLAorICAgKiB3ZSBoYXZlIHRvIHNoaWZ0IGJhY2sgdG8gSlNBTVBMRSB1bml0cyB0byBnZXQgY29uc2lzdGVudCBkaXN0YW5jZXM7CisgICAqIGFmdGVyIHdoaWNoLCB3ZSBzY2FsZSBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGRpc3RhbmNlIHNjYWxlIGZhY3RvcnMuCisgICAqLworICBkaXN0MCA9ICgoYzBtYXggLSBjMG1pbikgPDwgQzBfU0hJRlQpICogQzBfU0NBTEU7CisgIGRpc3QxID0gKChjMW1heCAtIGMxbWluKSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRTsKKyAgZGlzdDIgPSAoKGMybWF4IC0gYzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOworICBib3hwLT52b2x1bWUgPSBkaXN0MCpkaXN0MCArIGRpc3QxKmRpc3QxICsgZGlzdDIqZGlzdDI7CisgIAorICAvKiBOb3cgc2NhbiByZW1haW5pbmcgdm9sdW1lIG9mIGJveCBhbmQgY29tcHV0ZSBwb3B1bGF0aW9uICovCisgIGNjb3VudCA9IDA7CisgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspCisgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgeworICAgICAgaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKKyAgICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyssIGhpc3RwKyspCisJaWYgKCpoaXN0cCAhPSAwKSB7CisJICBjY291bnQrKzsKKwl9CisgICAgfQorICBib3hwLT5jb2xvcmNvdW50ID0gY2NvdW50OworfQorCisKK0xPQ0FMKGludCkKK21lZGlhbl9jdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMsCisJICAgIGludCBkZXNpcmVkX2NvbG9ycykKKy8qIFJlcGVhdGVkbHkgc2VsZWN0IGFuZCBzcGxpdCB0aGUgbGFyZ2VzdCBib3ggdW50aWwgd2UgaGF2ZSBlbm91Z2ggYm94ZXMgKi8KK3sKKyAgaW50IG4sbGI7CisgIGludCBjMCxjMSxjMixjbWF4OworICByZWdpc3RlciBib3hwdHIgYjEsYjI7CisKKyAgd2hpbGUgKG51bWJveGVzIDwgZGVzaXJlZF9jb2xvcnMpIHsKKyAgICAvKiBTZWxlY3QgYm94IHRvIHNwbGl0LgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBieSBwb3B1bGF0aW9uIGZvciBmaXJzdCBoYWxmLCB0aGVuIGJ5IHZvbHVtZS4KKyAgICAgKi8KKyAgICBpZiAobnVtYm94ZXMqMiA8PSBkZXNpcmVkX2NvbG9ycykgeworICAgICAgYjEgPSBmaW5kX2JpZ2dlc3RfY29sb3JfcG9wKGJveGxpc3QsIG51bWJveGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgYjEgPSBmaW5kX2JpZ2dlc3Rfdm9sdW1lKGJveGxpc3QsIG51bWJveGVzKTsKKyAgICB9CisgICAgaWYgKGIxID09IE5VTEwpCQkvKiBubyBzcGxpdHRhYmxlIGJveGVzIGxlZnQhICovCisgICAgICBicmVhazsKKyAgICBiMiA9ICZib3hsaXN0W251bWJveGVzXTsJLyogd2hlcmUgbmV3IGJveCB3aWxsIGdvICovCisgICAgLyogQ29weSB0aGUgY29sb3IgYm91bmRzIHRvIHRoZSBuZXcgYm94LiAqLworICAgIGIyLT5jMG1heCA9IGIxLT5jMG1heDsgYjItPmMxbWF4ID0gYjEtPmMxbWF4OyBiMi0+YzJtYXggPSBiMS0+YzJtYXg7CisgICAgYjItPmMwbWluID0gYjEtPmMwbWluOyBiMi0+YzFtaW4gPSBiMS0+YzFtaW47IGIyLT5jMm1pbiA9IGIxLT5jMm1pbjsKKyAgICAvKiBDaG9vc2Ugd2hpY2ggYXhpcyB0byBzcGxpdCB0aGUgYm94IG9uLgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBsb25nZXN0IHNjYWxlZCBheGlzLgorICAgICAqIFNlZSBub3RlcyBpbiB1cGRhdGVfYm94IGFib3V0IHNjYWxpbmcgZGlzdGFuY2VzLgorICAgICAqLworICAgIGMwID0gKChiMS0+YzBtYXggLSBiMS0+YzBtaW4pIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFOworICAgIGMxID0gKChiMS0+YzFtYXggLSBiMS0+YzFtaW4pIDw8IEMxX1NISUZUKSAqIEMxX1NDQUxFOworICAgIGMyID0gKChiMS0+YzJtYXggLSBiMS0+YzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOworICAgIC8qIFdlIHdhbnQgdG8gYnJlYWsgYW55IHRpZXMgaW4gZmF2b3Igb2YgZ3JlZW4sIHRoZW4gcmVkLCBibHVlIGxhc3QuCisgICAgICogVGhpcyBjb2RlIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvciBSLEcsQiBvciBCLEcsUiBjb2xvciBvcmRlcnMgb25seS4KKyAgICAgKi8KKyNpZiBSR0JfUkVEID09IDAKKyAgICBjbWF4ID0gYzE7IG4gPSAxOworICAgIGlmIChjMCA+IGNtYXgpIHsgY21heCA9IGMwOyBuID0gMDsgfQorICAgIGlmIChjMiA+IGNtYXgpIHsgbiA9IDI7IH0KKyNlbHNlCisgICAgY21heCA9IGMxOyBuID0gMTsKKyAgICBpZiAoYzIgPiBjbWF4KSB7IGNtYXggPSBjMjsgbiA9IDI7IH0KKyAgICBpZiAoYzAgPiBjbWF4KSB7IG4gPSAwOyB9CisjZW5kaWYKKyAgICAvKiBDaG9vc2Ugc3BsaXQgcG9pbnQgYWxvbmcgc2VsZWN0ZWQgYXhpcywgYW5kIHVwZGF0ZSBib3ggYm91bmRzLgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBzcGxpdCBhdCBoYWxmd2F5IHBvaW50LgorICAgICAqIChTaW5jZSB0aGUgYm94IGhhcyBiZWVuIHNocnVuayB0byBtaW5pbXVtIHZvbHVtZSwKKyAgICAgKiBhbnkgc3BsaXQgd2lsbCBwcm9kdWNlIHR3byBub25lbXB0eSBzdWJib3hlcy4pCisgICAgICogTm90ZSB0aGF0IGxiIHZhbHVlIGlzIG1heCBmb3IgbG93ZXIgYm94LCBzbyBtdXN0IGJlIDwgb2xkIG1heC4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDA6CisgICAgICBsYiA9IChiMS0+YzBtYXggKyBiMS0+YzBtaW4pIC8gMjsKKyAgICAgIGIxLT5jMG1heCA9IGxiOworICAgICAgYjItPmMwbWluID0gbGIrMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGxiID0gKGIxLT5jMW1heCArIGIxLT5jMW1pbikgLyAyOworICAgICAgYjEtPmMxbWF4ID0gbGI7CisgICAgICBiMi0+YzFtaW4gPSBsYisxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbGIgPSAoYjEtPmMybWF4ICsgYjEtPmMybWluKSAvIDI7CisgICAgICBiMS0+YzJtYXggPSBsYjsKKyAgICAgIGIyLT5jMm1pbiA9IGxiKzE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIHN0YXRzIGZvciBib3hlcyAqLworICAgIHVwZGF0ZV9ib3goY2luZm8sIGIxKTsKKyAgICB1cGRhdGVfYm94KGNpbmZvLCBiMik7CisgICAgbnVtYm94ZXMrKzsKKyAgfQorICByZXR1cm4gbnVtYm94ZXM7Cit9CisKKworTE9DQUwodm9pZCkKK2NvbXB1dGVfY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hwLCBpbnQgaWNvbG9yKQorLyogQ29tcHV0ZSByZXByZXNlbnRhdGl2ZSBjb2xvciBmb3IgYSBib3gsIHB1dCBpdCBpbiBjb2xvcm1hcFtpY29sb3JdICovCit7CisgIC8qIEN1cnJlbnQgYWxnb3JpdGhtOiBtZWFuIHdlaWdodGVkIGJ5IHBpeGVscyAobm90IGNvbG9ycykgKi8KKyAgLyogTm90ZSBpdCBpcyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSByb3VuZGluZyBjb3JyZWN0ISAqLworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07CisgIGhpc3RwdHIgaGlzdHA7CisgIGludCBjMCxjMSxjMjsKKyAgaW50IGMwbWluLGMwbWF4LGMxbWluLGMxbWF4LGMybWluLGMybWF4OworICBsb25nIGNvdW50OworICBsb25nIHRvdGFsID0gMDsKKyAgbG9uZyBjMHRvdGFsID0gMDsKKyAgbG9uZyBjMXRvdGFsID0gMDsKKyAgbG9uZyBjMnRvdGFsID0gMDsKKyAgCisgIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OworICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKKyAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7CisgIAorICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQorICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKKyAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisgICAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKSB7CisJaWYgKChjb3VudCA9ICpoaXN0cCsrKSAhPSAwKSB7CisJICB0b3RhbCArPSBjb3VudDsKKwkgIGMwdG90YWwgKz0gKChjMCA8PCBDMF9TSElGVCkgKyAoKDE8PEMwX1NISUZUKT4+MSkpICogY291bnQ7CisJICBjMXRvdGFsICs9ICgoYzEgPDwgQzFfU0hJRlQpICsgKCgxPDxDMV9TSElGVCk+PjEpKSAqIGNvdW50OworCSAgYzJ0b3RhbCArPSAoKGMyIDw8IEMyX1NISUZUKSArICgoMTw8QzJfU0hJRlQpPj4xKSkgKiBjb3VudDsKKwl9CisgICAgICB9CisgICAgfQorICAKKyAgY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0gPSAoSlNBTVBMRSkgKChjMHRvdGFsICsgKHRvdGFsPj4xKSkgLyB0b3RhbCk7CisgIGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdID0gKEpTQU1QTEUpICgoYzF0b3RhbCArICh0b3RhbD4+MSkpIC8gdG90YWwpOworICBjaW5mby0+Y29sb3JtYXBbMl1baWNvbG9yXSA9IChKU0FNUExFKSAoKGMydG90YWwgKyAodG90YWw+PjEpKSAvIHRvdGFsKTsKK30KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X2NvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWRfY29sb3JzKQorLyogTWFzdGVyIHJvdXRpbmUgZm9yIGNvbG9yIHNlbGVjdGlvbiAqLworeworICBib3hwdHIgYm94bGlzdDsKKyAgaW50IG51bWJveGVzOworICBpbnQgaTsKKworICAvKiBBbGxvY2F0ZSB3b3Jrc3BhY2UgZm9yIGJveCBsaXN0ICovCisgIGJveGxpc3QgPSAoYm94cHRyKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc2lyZWRfY29sb3JzICogU0laRU9GKGJveCkpOworICAvKiBJbml0aWFsaXplIG9uZSBib3ggY29udGFpbmluZyB3aG9sZSBzcGFjZSAqLworICBudW1ib3hlcyA9IDE7CisgIGJveGxpc3RbMF0uYzBtaW4gPSAwOworICBib3hsaXN0WzBdLmMwbWF4ID0gTUFYSlNBTVBMRSA+PiBDMF9TSElGVDsKKyAgYm94bGlzdFswXS5jMW1pbiA9IDA7CisgIGJveGxpc3RbMF0uYzFtYXggPSBNQVhKU0FNUExFID4+IEMxX1NISUZUOworICBib3hsaXN0WzBdLmMybWluID0gMDsKKyAgYm94bGlzdFswXS5jMm1heCA9IE1BWEpTQU1QTEUgPj4gQzJfU0hJRlQ7CisgIC8qIFNocmluayBpdCB0byBhY3R1YWxseS11c2VkIHZvbHVtZSBhbmQgc2V0IGl0cyBzdGF0aXN0aWNzICovCisgIHVwZGF0ZV9ib3goY2luZm8sICYgYm94bGlzdFswXSk7CisgIC8qIFBlcmZvcm0gbWVkaWFuLWN1dCB0byBwcm9kdWNlIGZpbmFsIGJveCBsaXN0ICovCisgIG51bWJveGVzID0gbWVkaWFuX2N1dChjaW5mbywgYm94bGlzdCwgbnVtYm94ZXMsIGRlc2lyZWRfY29sb3JzKTsKKyAgLyogQ29tcHV0ZSB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3IgZm9yIGVhY2ggYm94LCBmaWxsIGNvbG9ybWFwICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1ib3hlczsgaSsrKQorICAgIGNvbXB1dGVfY29sb3IoY2luZm8sICYgYm94bGlzdFtpXSwgaSk7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IG51bWJveGVzOworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19RVUFOVF9TRUxFQ1RFRCwgbnVtYm94ZXMpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggdGhlIHRpbWUtY3JpdGljYWwgdGFzayBvZiBtYXBwaW5nIGlucHV0CisgKiBjb2xvcnMgdG8gdGhlIG5lYXJlc3QgY29sb3IgaW4gdGhlIHNlbGVjdGVkIGNvbG9ybWFwLgorICoKKyAqIFdlIHJlLXVzZSB0aGUgaGlzdG9ncmFtIHNwYWNlIGFzIGFuICJpbnZlcnNlIGNvbG9yIG1hcCIsIGVzc2VudGlhbGx5IGEKKyAqIGNhY2hlIGZvciB0aGUgcmVzdWx0cyBvZiBuZWFyZXN0LWNvbG9yIHNlYXJjaGVzLiAgQWxsIGNvbG9ycyB3aXRoaW4gYQorICogaGlzdG9ncmFtIGNlbGwgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIHNhbWUgY29sb3JtYXAgZW50cnksIG5hbWVseSB0aGUgb25lCisgKiBjbG9zZXN0IHRvIHRoZSBjZWxsJ3MgY2VudGVyLiAgVGhpcyBtYXkgbm90IGJlIHF1aXRlIHRoZSBjbG9zZXN0IGVudHJ5IHRvCisgKiB0aGUgYWN0dWFsIGlucHV0IGNvbG9yLCBidXQgaXQncyBhbG1vc3QgYXMgZ29vZC4gIEEgemVybyBpbiB0aGUgY2FjaGUKKyAqIGluZGljYXRlcyB3ZSBoYXZlbid0IGZvdW5kIHRoZSBuZWFyZXN0IGNvbG9yIGZvciB0aGF0IGNlbGwgeWV0OyB0aGUgYXJyYXkKKyAqIGlzIGNsZWFyZWQgdG8gemVyb2VzIGJlZm9yZSBzdGFydGluZyB0aGUgbWFwcGluZyBwYXNzLiAgV2hlbiB3ZSBmaW5kIHRoZQorICogbmVhcmVzdCBjb2xvciBmb3IgYSBjZWxsLCBpdHMgY29sb3JtYXAgaW5kZXggcGx1cyBvbmUgaXMgcmVjb3JkZWQgaW4gdGhlCisgKiBjYWNoZSBmb3IgZnV0dXJlIHVzZS4gIFRoZSBwYXNzMiBzY2FubmluZyByb3V0aW5lcyBjYWxsIGZpbGxfaW52ZXJzZV9jbWFwCisgKiB3aGVuIHRoZXkgbmVlZCB0byB1c2UgYW4gdW5maWxsZWQgZW50cnkgaW4gdGhlIGNhY2hlLgorICoKKyAqIE91ciBtZXRob2Qgb2YgZWZmaWNpZW50bHkgZmluZGluZyBuZWFyZXN0IGNvbG9ycyBpcyBiYXNlZCBvbiB0aGUgImxvY2FsbHkKKyAqIHNvcnRlZCBzZWFyY2giIGlkZWEgZGVzY3JpYmVkIGJ5IEhlY2tiZXJ0IGFuZCBvbiB0aGUgaW5jcmVtZW50YWwgZGlzdGFuY2UKKyAqIGNhbGN1bGF0aW9uIGRlc2NyaWJlZCBieSBTcGVuY2VyIFcuIFRob21hcyBpbiBjaGFwdGVyIElJSS4xIG9mIEdyYXBoaWNzCisgKiBHZW1zIElJIChKYW1lcyBBcnZvLCBlZC4gIEFjYWRlbWljIFByZXNzLCAxOTkxKS4gIFRob21hcyBwb2ludHMgb3V0IHRoYXQKKyAqIHRoZSBkaXN0YW5jZXMgZnJvbSBhIGdpdmVuIGNvbG9ybWFwIGVudHJ5IHRvIGVhY2ggY2VsbCBvZiB0aGUgaGlzdG9ncmFtIGNhbgorICogYmUgY29tcHV0ZWQgcXVpY2tseSB1c2luZyBhbiBpbmNyZW1lbnRhbCBtZXRob2Q6IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgKiBkaXN0YW5jZXMgdG8gYWRqYWNlbnQgY2VsbHMgdGhlbXNlbHZlcyBkaWZmZXIgYnkgYSBjb25zdGFudC4gIFRoaXMgYWxsb3dzIGEKKyAqIGZhaXJseSBmYXN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSAiYnJ1dGUgZm9yY2UiIGFwcHJvYWNoIG9mIGNvbXB1dGluZyB0aGUKKyAqIGRpc3RhbmNlIGZyb20gZXZlcnkgY29sb3JtYXAgZW50cnkgdG8gZXZlcnkgaGlzdG9ncmFtIGNlbGwuICBVbmZvcnR1bmF0ZWx5LAorICogaXQgbmVlZHMgYSB3b3JrIGFycmF5IHRvIGhvbGQgdGhlIGJlc3QtZGlzdGFuY2Utc28tZmFyIGZvciBlYWNoIGhpc3RvZ3JhbQorICogY2VsbCAoYmVjYXVzZSB0aGUgaW5uZXIgbG9vcCBoYXMgdG8gYmUgb3ZlciBjZWxscywgbm90IGNvbG9ybWFwIGVudHJpZXMpLgorICogVGhlIHdvcmsgYXJyYXkgZWxlbWVudHMgaGF2ZSB0byBiZSBJTlQzMnMsIHNvIHRoZSB3b3JrIGFycmF5IHdvdWxkIG5lZWQKKyAqIDI1NktiIGF0IG91ciByZWNvbW1lbmRlZCBwcmVjaXNpb24uICBUaGlzIGlzIG5vdCBmZWFzaWJsZSBpbiBET1MgbWFjaGluZXMuCisgKgorICogVG8gZ2V0IGFyb3VuZCB0aGVzZSBwcm9ibGVtcywgd2UgYXBwbHkgVGhvbWFzJyBtZXRob2QgdG8gY29tcHV0ZSB0aGUKKyAqIG5lYXJlc3QgY29sb3JzIGZvciBvbmx5IHRoZSBjZWxscyB3aXRoaW4gYSBzbWFsbCBzdWJib3ggb2YgdGhlIGhpc3RvZ3JhbS4KKyAqIFRoZSB3b3JrIGFycmF5IG5lZWQgYmUgb25seSBhcyBiaWcgYXMgdGhlIHN1YmJveCwgc28gdGhlIG1lbW9yeSB1c2FnZQorICogcHJvYmxlbSBpcyBzb2x2ZWQuICBGdXJ0aGVybW9yZSwgd2UgbmVlZCBub3QgZmlsbCBzdWJib3hlcyB0aGF0IGFyZSBuZXZlcgorICogcmVmZXJlbmNlZCBpbiBwYXNzMjsgbWFueSBpbWFnZXMgdXNlIG9ubHkgcGFydCBvZiB0aGUgY29sb3IgZ2FtdXQsIHNvIGEKKyAqIGZhaXIgYW1vdW50IG9mIHdvcmsgaXMgc2F2ZWQuICBBbiBhZGRpdGlvbmFsIGFkdmFudGFnZSBvZiB0aGlzCisgKiBhcHByb2FjaCBpcyB0aGF0IHdlIGNhbiBhcHBseSBIZWNrYmVydCdzIGxvY2FsaXR5IGNyaXRlcmlvbiB0byBxdWlja2x5CisgKiBlbGltaW5hdGUgY29sb3JtYXAgZW50cmllcyB0aGF0IGFyZSBmYXIgYXdheSBmcm9tIHRoZSBzdWJib3g7IHR5cGljYWxseQorICogdGhyZWUtZm91cnRocyBvZiB0aGUgY29sb3JtYXAgZW50cmllcyBhcmUgcmVqZWN0ZWQgYnkgSGVja2JlcnQncyBjcml0ZXJpb24sCisgKiBhbmQgd2UgbmVlZCBub3QgY29tcHV0ZSB0aGVpciBkaXN0YW5jZXMgdG8gaW5kaXZpZHVhbCBjZWxscyBpbiB0aGUgc3ViYm94LgorICogVGhlIHNwZWVkIG9mIHRoaXMgYXBwcm9hY2ggaXMgaGVhdmlseSBpbmZsdWVuY2VkIGJ5IHRoZSBzdWJib3ggc2l6ZTogdG9vCisgKiBzbWFsbCBtZWFucyB0b28gbXVjaCBvdmVyaGVhZCwgdG9vIGJpZyBsb3NlcyBiZWNhdXNlIEhlY2tiZXJ0J3MgY3JpdGVyaW9uCisgKiBjYW4ndCBlbGltaW5hdGUgYXMgbWFueSBjb2xvcm1hcCBlbnRyaWVzLiAgRW1waXJpY2FsbHkgdGhlIGJlc3Qgc3ViYm94CisgKiBzaXplIHNlZW1zIHRvIGJlIGFib3V0IDEvNTEydGggb2YgdGhlIGhpc3RvZ3JhbSAoMS84dGggaW4gZWFjaCBkaXJlY3Rpb24pLgorICoKKyAqIFRob21hcycgYXJ0aWNsZSBhbHNvIGRlc2NyaWJlcyBhIHJlZmluZWQgbWV0aG9kIHdoaWNoIGlzIGFzeW1wdG90aWNhbGx5CisgKiBmYXN0ZXIgdGhhbiB0aGUgYnJ1dGUtZm9yY2UgbWV0aG9kLCBidXQgaXQgaXMgYWxzbyBmYXIgbW9yZSBjb21wbGV4IGFuZAorICogY2Fubm90IGVmZmljaWVudGx5IGJlIGFwcGxpZWQgdG8gc21hbGwgc3ViYm94ZXMuICBJdCBpcyB0aGVyZWZvcmUgbm90CisgKiB1c2VmdWwgZm9yIHByb2dyYW1zIGludGVuZGVkIHRvIGJlIHBvcnRhYmxlIHRvIERPUyBtYWNoaW5lcy4gIE9uIG1hY2hpbmVzCisgKiB3aXRoIHBsZW50eSBvZiBtZW1vcnksIGZpbGxpbmcgdGhlIHdob2xlIGhpc3RvZ3JhbSBpbiBvbmUgc2hvdCB3aXRoIFRob21hcycKKyAqIHJlZmluZWQgbWV0aG9kIG1pZ2h0IGJlIGZhc3RlciB0aGFuIHRoZSBwcmVzZW50IGNvZGUgLS0tIGJ1dCB0aGVuIGFnYWluLAorICogaXQgbWlnaHQgbm90IGJlIGFueSBmYXN0ZXIsIGFuZCBpdCdzIGNlcnRhaW5seSBtb3JlIGNvbXBsaWNhdGVkLgorICovCisKKworLyogbG9nMihoaXN0b2dyYW0gY2VsbHMgaW4gdXBkYXRlIGJveCkgZm9yIGVhY2ggYXhpczsgdGhpcyBjYW4gYmUgYWRqdXN0ZWQgKi8KKyNkZWZpbmUgQk9YX0MwX0xPRyAgKEhJU1RfQzBfQklUUy0zKQorI2RlZmluZSBCT1hfQzFfTE9HICAoSElTVF9DMV9CSVRTLTMpCisjZGVmaW5lIEJPWF9DMl9MT0cgIChISVNUX0MyX0JJVFMtMykKKworI2RlZmluZSBCT1hfQzBfRUxFTVMgICgxPDxCT1hfQzBfTE9HKSAvKiAjIG9mIGhpc3QgY2VsbHMgaW4gdXBkYXRlIGJveCAqLworI2RlZmluZSBCT1hfQzFfRUxFTVMgICgxPDxCT1hfQzFfTE9HKQorI2RlZmluZSBCT1hfQzJfRUxFTVMgICgxPDxCT1hfQzJfTE9HKQorCisjZGVmaW5lIEJPWF9DMF9TSElGVCAgKEMwX1NISUZUICsgQk9YX0MwX0xPRykKKyNkZWZpbmUgQk9YX0MxX1NISUZUICAoQzFfU0hJRlQgKyBCT1hfQzFfTE9HKQorI2RlZmluZSBCT1hfQzJfU0hJRlQgIChDMl9TSElGVCArIEJPWF9DMl9MT0cpCisKKworLyoKKyAqIFRoZSBuZXh0IHRocmVlIHJvdXRpbmVzIGltcGxlbWVudCBpbnZlcnNlIGNvbG9ybWFwIGZpbGxpbmcuICBUaGV5IGNvdWxkCisgKiBhbGwgYmUgZm9sZGVkIGludG8gb25lIGJpZyByb3V0aW5lLCBidXQgc3BsaXR0aW5nIHRoZW0gdXAgdGhpcyB3YXkgc2F2ZXMKKyAqIHNvbWUgc3RhY2sgc3BhY2UgKHRoZSBtaW5kaXN0W10gYW5kIGJlc3RkaXN0W10gYXJyYXlzIG5lZWQgbm90IGNvZXhpc3QpCisgKiBhbmQgbWF5IGFsbG93IHNvbWUgY29tcGlsZXJzIHRvIHByb2R1Y2UgYmV0dGVyIGNvZGUgYnkgcmVnaXN0ZXJpemluZyBtb3JlCisgKiBpbm5lci1sb29wIHZhcmlhYmxlcy4KKyAqLworCitMT0NBTChpbnQpCitmaW5kX25lYXJieV9jb2xvcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtaW5jMCwgaW50IG1pbmMxLCBpbnQgbWluYzIsCisJCSAgICBKU0FNUExFIGNvbG9ybGlzdFtdKQorLyogTG9jYXRlIHRoZSBjb2xvcm1hcCBlbnRyaWVzIGNsb3NlIGVub3VnaCB0byBhbiB1cGRhdGUgYm94IHRvIGJlIGNhbmRpZGF0ZXMKKyAqIGZvciB0aGUgbmVhcmVzdCBlbnRyeSB0byBzb21lIGNlbGwocykgaW4gdGhlIHVwZGF0ZSBib3guICBUaGUgdXBkYXRlIGJveAorICogaXMgc3BlY2lmaWVkIGJ5IHRoZSBjZW50ZXIgY29vcmRpbmF0ZXMgb2YgaXRzIGZpcnN0IGNlbGwuICBUaGUgbnVtYmVyIG9mCisgKiBjYW5kaWRhdGUgY29sb3JtYXAgZW50cmllcyBpcyByZXR1cm5lZCwgYW5kIHRoZWlyIGNvbG9ybWFwIGluZGV4ZXMgYXJlCisgKiBwbGFjZWQgaW4gY29sb3JsaXN0W10uCisgKiBUaGlzIHJvdXRpbmUgdXNlcyBIZWNrYmVydCdzICJsb2NhbGx5IHNvcnRlZCBzZWFyY2giIGNyaXRlcmlvbiB0byBzZWxlY3QKKyAqIHRoZSBjb2xvcnMgdGhhdCBuZWVkIGZ1cnRoZXIgY29uc2lkZXJhdGlvbi4KKyAqLworeworICBpbnQgbnVtY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICBpbnQgbWF4YzAsIG1heGMxLCBtYXhjMjsKKyAgaW50IGNlbnRlcmMwLCBjZW50ZXJjMSwgY2VudGVyYzI7CisgIGludCBpLCB4LCBuY29sb3JzOworICBJTlQzMiBtaW5tYXhkaXN0LCBtaW5fZGlzdCwgbWF4X2Rpc3QsIHRkaXN0OworICBJTlQzMiBtaW5kaXN0W01BWE5VTUNPTE9SU107CS8qIG1pbiBkaXN0YW5jZSB0byBjb2xvcm1hcCBlbnRyeSBpICovCisKKyAgLyogQ29tcHV0ZSB0cnVlIGNvb3JkaW5hdGVzIG9mIHVwZGF0ZSBib3gncyB1cHBlciBjb3JuZXIgYW5kIGNlbnRlci4KKyAgICogQWN0dWFsbHkgd2UgY29tcHV0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgdXBwZXItY29ybmVyCisgICAqIGhpc3RvZ3JhbSBjZWxsLCB3aGljaCBhcmUgdGhlIHVwcGVyIGJvdW5kcyBvZiB0aGUgdm9sdW1lIHdlIGNhcmUgYWJvdXQuCisgICAqIE5vdGUgdGhhdCBzaW5jZSAiPj4iIHJvdW5kcyBkb3duLCB0aGUgImNlbnRlciIgdmFsdWVzIG1heSBiZSBjbG9zZXIgdG8KKyAgICogbWluIHRoYW4gdG8gbWF4OyBoZW5jZSBjb21wYXJpc29ucyB0byB0aGVtIG11c3QgYmUgIjw9Iiwgbm90ICI8Ii4KKyAgICovCisgIG1heGMwID0gbWluYzAgKyAoKDEgPDwgQk9YX0MwX1NISUZUKSAtICgxIDw8IEMwX1NISUZUKSk7CisgIGNlbnRlcmMwID0gKG1pbmMwICsgbWF4YzApID4+IDE7CisgIG1heGMxID0gbWluYzEgKyAoKDEgPDwgQk9YX0MxX1NISUZUKSAtICgxIDw8IEMxX1NISUZUKSk7CisgIGNlbnRlcmMxID0gKG1pbmMxICsgbWF4YzEpID4+IDE7CisgIG1heGMyID0gbWluYzIgKyAoKDEgPDwgQk9YX0MyX1NISUZUKSAtICgxIDw8IEMyX1NISUZUKSk7CisgIGNlbnRlcmMyID0gKG1pbmMyICsgbWF4YzIpID4+IDE7CisKKyAgLyogRm9yIGVhY2ggY29sb3IgaW4gY29sb3JtYXAsIGZpbmQ6CisgICAqICAxLiBpdHMgbWluaW11bSBzcXVhcmVkLWRpc3RhbmNlIHRvIGFueSBwb2ludCBpbiB0aGUgdXBkYXRlIGJveAorICAgKiAgICAgKHplcm8gaWYgY29sb3IgaXMgd2l0aGluIHVwZGF0ZSBib3gpOworICAgKiAgMi4gaXRzIG1heGltdW0gc3F1YXJlZC1kaXN0YW5jZSB0byBhbnkgcG9pbnQgaW4gdGhlIHVwZGF0ZSBib3guCisgICAqIEJvdGggb2YgdGhlc2UgY2FuIGJlIGZvdW5kIGJ5IGNvbnNpZGVyaW5nIG9ubHkgdGhlIGNvcm5lcnMgb2YgdGhlIGJveC4KKyAgICogV2Ugc2F2ZSB0aGUgbWluaW11bSBkaXN0YW5jZSBmb3IgZWFjaCBjb2xvciBpbiBtaW5kaXN0W107CisgICAqIG9ubHkgdGhlIHNtYWxsZXN0IG1heGltdW0gZGlzdGFuY2UgaXMgb2YgaW50ZXJlc3QuCisgICAqLworICBtaW5tYXhkaXN0ID0gMHg3RkZGRkZGRkw7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7CisgICAgLyogV2UgY29tcHV0ZSB0aGUgc3F1YXJlZC1jMC1kaXN0YW5jZSB0ZXJtLCB0aGVuIGFkZCBpbiB0aGUgb3RoZXIgdHdvLiAqLworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFswXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMCkgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMwKSAqIEMwX1NDQUxFOworICAgICAgbWluX2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKKyAgICAgIG1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgfSBlbHNlIGlmICh4ID4gbWF4YzApIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzApICogQzBfU0NBTEU7CisgICAgICBtYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgIH0gZWxzZSB7CisgICAgICAvKiB3aXRoaW4gY2VsbCByYW5nZSBzbyBubyBjb250cmlidXRpb24gdG8gbWluX2Rpc3QgKi8KKyAgICAgIG1pbl9kaXN0ID0gMDsKKyAgICAgIGlmICh4IDw9IGNlbnRlcmMwKSB7CisJdGRpc3QgPSAoeCAtIG1heGMwKSAqIEMwX1NDQUxFOworCW1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgICB9IGVsc2UgeworCXRkaXN0ID0gKHggLSBtaW5jMCkgKiBDMF9TQ0FMRTsKKwltYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMSkgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzEpICogQzFfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgaWYgKHggPiBtYXhjMSkgeworICAgICAgdGRpc3QgPSAoeCAtIG1heGMxKSAqIEMxX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzEpICogQzFfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCisgICAgICBpZiAoeCA8PSBjZW50ZXJjMSkgeworCXRkaXN0ID0gKHggLSBtYXhjMSkgKiBDMV9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0gZWxzZSB7CisJdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOworCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMikgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzIpICogQzJfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgaWYgKHggPiBtYXhjMikgeworICAgICAgdGRpc3QgPSAoeCAtIG1heGMyKSAqIEMyX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzIpICogQzJfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCisgICAgICBpZiAoeCA8PSBjZW50ZXJjMikgeworCXRkaXN0ID0gKHggLSBtYXhjMikgKiBDMl9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0gZWxzZSB7CisJdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOworCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIG1pbmRpc3RbaV0gPSBtaW5fZGlzdDsJLyogc2F2ZSBhd2F5IHRoZSByZXN1bHRzICovCisgICAgaWYgKG1heF9kaXN0IDwgbWlubWF4ZGlzdCkKKyAgICAgIG1pbm1heGRpc3QgPSBtYXhfZGlzdDsKKyAgfQorCisgIC8qIE5vdyB3ZSBrbm93IHRoYXQgbm8gY2VsbCBpbiB0aGUgdXBkYXRlIGJveCBpcyBtb3JlIHRoYW4gbWlubWF4ZGlzdAorICAgKiBhd2F5IGZyb20gc29tZSBjb2xvcm1hcCBlbnRyeS4gIFRoZXJlZm9yZSwgb25seSBjb2xvcnMgdGhhdCBhcmUKKyAgICogd2l0aGluIG1pbm1heGRpc3Qgb2Ygc29tZSBwYXJ0IG9mIHRoZSBib3ggbmVlZCBiZSBjb25zaWRlcmVkLgorICAgKi8KKyAgbmNvbG9ycyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgeworICAgIGlmIChtaW5kaXN0W2ldIDw9IG1pbm1heGRpc3QpCisgICAgICBjb2xvcmxpc3RbbmNvbG9ycysrXSA9IChKU0FNUExFKSBpOworICB9CisgIHJldHVybiBuY29sb3JzOworfQorCisKK0xPQ0FMKHZvaWQpCitmaW5kX2Jlc3RfY29sb3JzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWluYzAsIGludCBtaW5jMSwgaW50IG1pbmMyLAorCQkgIGludCBudW1jb2xvcnMsIEpTQU1QTEUgY29sb3JsaXN0W10sIEpTQU1QTEUgYmVzdGNvbG9yW10pCisvKiBGaW5kIHRoZSBjbG9zZXN0IGNvbG9ybWFwIGVudHJ5IGZvciBlYWNoIGNlbGwgaW4gdGhlIHVwZGF0ZSBib3gsCisgKiBnaXZlbiB0aGUgbGlzdCBvZiBjYW5kaWRhdGUgY29sb3JzIHByZXBhcmVkIGJ5IGZpbmRfbmVhcmJ5X2NvbG9ycy4KKyAqIFJldHVybiB0aGUgaW5kZXhlcyBvZiB0aGUgY2xvc2VzdCBlbnRyaWVzIGluIHRoZSBiZXN0Y29sb3JbXSBhcnJheS4KKyAqIFRoaXMgcm91dGluZSB1c2VzIFRob21hcycgaW5jcmVtZW50YWwgZGlzdGFuY2UgY2FsY3VsYXRpb24gbWV0aG9kIHRvCisgKiBmaW5kIHRoZSBkaXN0YW5jZSBmcm9tIGEgY29sb3JtYXAgZW50cnkgdG8gc3VjY2Vzc2l2ZSBjZWxscyBpbiB0aGUgYm94LgorICovCit7CisgIGludCBpYzAsIGljMSwgaWMyOworICBpbnQgaSwgaWNvbG9yOworICByZWdpc3RlciBJTlQzMiAqIGJwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0ZGlzdFtdIGFycmF5ICovCisgIEpTQU1QTEUgKiBjcHRyOwkJLyogcG9pbnRlciBpbnRvIGJlc3Rjb2xvcltdIGFycmF5ICovCisgIElOVDMyIGRpc3QwLCBkaXN0MTsJCS8qIGluaXRpYWwgZGlzdGFuY2UgdmFsdWVzICovCisgIHJlZ2lzdGVyIElOVDMyIGRpc3QyOwkJLyogY3VycmVudCBkaXN0YW5jZSBpbiBpbm5lciBsb29wICovCisgIElOVDMyIHh4MCwgeHgxOwkJLyogZGlzdGFuY2UgaW5jcmVtZW50cyAqLworICByZWdpc3RlciBJTlQzMiB4eDI7CisgIElOVDMyIGluYzAsIGluYzEsIGluYzI7CS8qIGluaXRpYWwgdmFsdWVzIGZvciBpbmNyZW1lbnRzICovCisgIC8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0LXNvLWZhciBjb2xvciBmb3IgZWFjaCBjZWxsICovCisgIElOVDMyIGJlc3RkaXN0W0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107CisKKyAgLyogSW5pdGlhbGl6ZSBiZXN0LWRpc3RhbmNlIGZvciBlYWNoIGNlbGwgb2YgdGhlIHVwZGF0ZSBib3ggKi8KKyAgYnB0ciA9IGJlc3RkaXN0OworICBmb3IgKGkgPSBCT1hfQzBfRUxFTVMqQk9YX0MxX0VMRU1TKkJPWF9DMl9FTEVNUy0xOyBpID49IDA7IGktLSkKKyAgICAqYnB0cisrID0gMHg3RkZGRkZGRkw7CisgIAorICAvKiBGb3IgZWFjaCBjb2xvciBzZWxlY3RlZCBieSBmaW5kX25lYXJieV9jb2xvcnMsCisgICAqIGNvbXB1dGUgaXRzIGRpc3RhbmNlIHRvIHRoZSBjZW50ZXIgb2YgZWFjaCBjZWxsIGluIHRoZSBib3guCisgICAqIElmIHRoYXQncyBsZXNzIHRoYW4gYmVzdC1zby1mYXIsIHVwZGF0ZSBiZXN0IGRpc3RhbmNlIGFuZCBjb2xvciBudW1iZXIuCisgICAqLworICAKKyAgLyogTm9taW5hbCBzdGVwcyBiZXR3ZWVuIGNlbGwgY2VudGVycyAoIngiIGluIFRob21hcyBhcnRpY2xlKSAqLworI2RlZmluZSBTVEVQX0MwICAoKDEgPDwgQzBfU0hJRlQpICogQzBfU0NBTEUpCisjZGVmaW5lIFNURVBfQzEgICgoMSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRSkKKyNkZWZpbmUgU1RFUF9DMiAgKCgxIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFKQorICAKKyAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7CisgICAgaWNvbG9yID0gR0VUSlNBTVBMRShjb2xvcmxpc3RbaV0pOworICAgIC8qIENvbXB1dGUgKHNxdWFyZSBvZikgZGlzdGFuY2UgZnJvbSBtaW5jMC9jMS9jMiB0byB0aGlzIGNvbG9yICovCisgICAgaW5jMCA9IChtaW5jMCAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0pKSAqIEMwX1NDQUxFOworICAgIGRpc3QwID0gaW5jMCppbmMwOworICAgIGluYzEgPSAobWluYzEgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdKSkgKiBDMV9TQ0FMRTsKKyAgICBkaXN0MCArPSBpbmMxKmluYzE7CisgICAgaW5jMiA9IChtaW5jMiAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzJdW2ljb2xvcl0pKSAqIEMyX1NDQUxFOworICAgIGRpc3QwICs9IGluYzIqaW5jMjsKKyAgICAvKiBGb3JtIHRoZSBpbml0aWFsIGRpZmZlcmVuY2UgaW5jcmVtZW50cyAqLworICAgIGluYzAgPSBpbmMwICogKDIgKiBTVEVQX0MwKSArIFNURVBfQzAgKiBTVEVQX0MwOworICAgIGluYzEgPSBpbmMxICogKDIgKiBTVEVQX0MxKSArIFNURVBfQzEgKiBTVEVQX0MxOworICAgIGluYzIgPSBpbmMyICogKDIgKiBTVEVQX0MyKSArIFNURVBfQzIgKiBTVEVQX0MyOworICAgIC8qIE5vdyBsb29wIG92ZXIgYWxsIGNlbGxzIGluIGJveCwgdXBkYXRpbmcgZGlzdGFuY2UgcGVyIFRob21hcyBtZXRob2QgKi8KKyAgICBicHRyID0gYmVzdGRpc3Q7CisgICAgY3B0ciA9IGJlc3Rjb2xvcjsKKyAgICB4eDAgPSBpbmMwOworICAgIGZvciAoaWMwID0gQk9YX0MwX0VMRU1TLTE7IGljMCA+PSAwOyBpYzAtLSkgeworICAgICAgZGlzdDEgPSBkaXN0MDsKKyAgICAgIHh4MSA9IGluYzE7CisgICAgICBmb3IgKGljMSA9IEJPWF9DMV9FTEVNUy0xOyBpYzEgPj0gMDsgaWMxLS0pIHsKKwlkaXN0MiA9IGRpc3QxOworCXh4MiA9IGluYzI7CisJZm9yIChpYzIgPSBCT1hfQzJfRUxFTVMtMTsgaWMyID49IDA7IGljMi0tKSB7CisJICBpZiAoZGlzdDIgPCAqYnB0cikgeworCSAgICAqYnB0ciA9IGRpc3QyOworCSAgICAqY3B0ciA9IChKU0FNUExFKSBpY29sb3I7CisJICB9CisJICBkaXN0MiArPSB4eDI7CisJICB4eDIgKz0gMiAqIFNURVBfQzIgKiBTVEVQX0MyOworCSAgYnB0cisrOworCSAgY3B0cisrOworCX0KKwlkaXN0MSArPSB4eDE7CisJeHgxICs9IDIgKiBTVEVQX0MxICogU1RFUF9DMTsKKyAgICAgIH0KKyAgICAgIGRpc3QwICs9IHh4MDsKKyAgICAgIHh4MCArPSAyICogU1RFUF9DMCAqIFNURVBfQzA7CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2ZpbGxfaW52ZXJzZV9jbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgYzAsIGludCBjMSwgaW50IGMyKQorLyogRmlsbCB0aGUgaW52ZXJzZS1jb2xvcm1hcCBlbnRyaWVzIGluIHRoZSB1cGRhdGUgYm94IHRoYXQgY29udGFpbnMgKi8KKy8qIGhpc3RvZ3JhbSBjZWxsIGMwL2MxL2MyLiAgKE9ubHkgdGhhdCBvbmUgY2VsbCBNVVNUIGJlIGZpbGxlZCwgYnV0ICovCisvKiB3ZSBjYW4gZmlsbCBhcyBtYW55IG90aGVycyBhcyB3ZSB3aXNoLikgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICBpbnQgbWluYzAsIG1pbmMxLCBtaW5jMjsJLyogbG93ZXIgbGVmdCBjb3JuZXIgb2YgdXBkYXRlIGJveCAqLworICBpbnQgaWMwLCBpYzEsIGljMjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIGNwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0Y29sb3JbXSBhcnJheSAqLworICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsJLyogcG9pbnRlciBpbnRvIG1haW4gY2FjaGUgYXJyYXkgKi8KKyAgLyogVGhpcyBhcnJheSBsaXN0cyB0aGUgY2FuZGlkYXRlIGNvbG9ybWFwIGluZGV4ZXMuICovCisgIEpTQU1QTEUgY29sb3JsaXN0W01BWE5VTUNPTE9SU107CisgIGludCBudW1jb2xvcnM7CQkvKiBudW1iZXIgb2YgY2FuZGlkYXRlIGNvbG9ycyAqLworICAvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBhY3R1YWxseSBjbG9zZXN0IGNvbG9ybWFwIGluZGV4IGZvciBlYWNoIGNlbGwuICovCisgIEpTQU1QTEUgYmVzdGNvbG9yW0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107CisKKyAgLyogQ29udmVydCBjZWxsIGNvb3JkaW5hdGVzIHRvIHVwZGF0ZSBib3ggSUQgKi8KKyAgYzAgPj49IEJPWF9DMF9MT0c7CisgIGMxID4+PSBCT1hfQzFfTE9HOworICBjMiA+Pj0gQk9YX0MyX0xPRzsKKworICAvKiBDb21wdXRlIHRydWUgY29vcmRpbmF0ZXMgb2YgdXBkYXRlIGJveCdzIG9yaWdpbiBjb3JuZXIuCisgICAqIEFjdHVhbGx5IHdlIGNvbXB1dGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNvcm5lcgorICAgKiBoaXN0b2dyYW0gY2VsbCwgd2hpY2ggYXJlIHRoZSBsb3dlciBib3VuZHMgb2YgdGhlIHZvbHVtZSB3ZSBjYXJlIGFib3V0LgorICAgKi8KKyAgbWluYzAgPSAoYzAgPDwgQk9YX0MwX1NISUZUKSArICgoMSA8PCBDMF9TSElGVCkgPj4gMSk7CisgIG1pbmMxID0gKGMxIDw8IEJPWF9DMV9TSElGVCkgKyAoKDEgPDwgQzFfU0hJRlQpID4+IDEpOworICBtaW5jMiA9IChjMiA8PCBCT1hfQzJfU0hJRlQpICsgKCgxIDw8IEMyX1NISUZUKSA+PiAxKTsKKyAgCisgIC8qIERldGVybWluZSB3aGljaCBjb2xvcm1hcCBlbnRyaWVzIGFyZSBjbG9zZSBlbm91Z2ggdG8gYmUgY2FuZGlkYXRlcworICAgKiBmb3IgdGhlIG5lYXJlc3QgZW50cnkgdG8gc29tZSBjZWxsIGluIHRoZSB1cGRhdGUgYm94LgorICAgKi8KKyAgbnVtY29sb3JzID0gZmluZF9uZWFyYnlfY29sb3JzKGNpbmZvLCBtaW5jMCwgbWluYzEsIG1pbmMyLCBjb2xvcmxpc3QpOworCisgIC8qIERldGVybWluZSB0aGUgYWN0dWFsbHkgbmVhcmVzdCBjb2xvcnMuICovCisgIGZpbmRfYmVzdF9jb2xvcnMoY2luZm8sIG1pbmMwLCBtaW5jMSwgbWluYzIsIG51bWNvbG9ycywgY29sb3JsaXN0LAorCQkgICBiZXN0Y29sb3IpOworCisgIC8qIFNhdmUgdGhlIGJlc3QgY29sb3IgbnVtYmVycyAocGx1cyAxKSBpbiB0aGUgbWFpbiBjYWNoZSBhcnJheSAqLworICBjMCA8PD0gQk9YX0MwX0xPRzsJCS8qIGNvbnZlcnQgSUQgYmFjayB0byBiYXNlIGNlbGwgaW5kZXhlcyAqLworICBjMSA8PD0gQk9YX0MxX0xPRzsKKyAgYzIgPDw9IEJPWF9DMl9MT0c7CisgIGNwdHIgPSBiZXN0Y29sb3I7CisgIGZvciAoaWMwID0gMDsgaWMwIDwgQk9YX0MwX0VMRU1TOyBpYzArKykgeworICAgIGZvciAoaWMxID0gMDsgaWMxIDwgQk9YX0MxX0VMRU1TOyBpYzErKykgeworICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bYzAraWMwXVtjMStpYzFdW2MyXTsKKyAgICAgIGZvciAoaWMyID0gMDsgaWMyIDwgQk9YX0MyX0VMRU1TOyBpYzIrKykgeworCSpjYWNoZXArKyA9IChoaXN0Y2VsbCkgKEdFVEpTQU1QTEUoKmNwdHIrKykgKyAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKgorICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bhc3MyX25vX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBubyBkaXRoZXJpbmcgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsKKyAgcmVnaXN0ZXIgaW50IGMwLCBjMSwgYzI7CisgIGludCByb3c7CisgIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAvKiBnZXQgcGl4ZWwgdmFsdWUgYW5kIGluZGV4IGludG8gdGhlIGNhY2hlICovCisgICAgICBjMCA9IEdFVEpTQU1QTEUoKmlucHRyKyspID4+IEMwX1NISUZUOworICAgICAgYzEgPSBHRVRKU0FNUExFKCppbnB0cisrKSA+PiBDMV9TSElGVDsKKyAgICAgIGMyID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgPj4gQzJfU0hJRlQ7CisgICAgICBjYWNoZXAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MyXTsKKyAgICAgIC8qIElmIHdlIGhhdmUgbm90IHNlZW4gdGhpcyBjb2xvciBiZWZvcmUsIGZpbmQgbmVhcmVzdCBjb2xvcm1hcCBlbnRyeSAqLworICAgICAgLyogYW5kIHVwZGF0ZSB0aGUgY2FjaGUgKi8KKyAgICAgIGlmICgqY2FjaGVwID09IDApCisJZmlsbF9pbnZlcnNlX2NtYXAoY2luZm8sIGMwLGMxLGMyKTsKKyAgICAgIC8qIE5vdyBlbWl0IHRoZSBjb2xvcm1hcCBpbmRleCBmb3IgdGhpcyBjZWxsICovCisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCpjYWNoZXAgLSAxKTsKKyAgICB9CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3Bhc3MyX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgcmVnaXN0ZXIgTE9DRlNFUlJPUiBjdXIwLCBjdXIxLCBjdXIyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCisgIExPQ0ZTRVJST1IgYmVsb3dlcnIwLCBiZWxvd2VycjEsIGJlbG93ZXJyMjsgLyogZXJyb3IgZm9yIHBpeGVsIGJlbG93IGN1ciAqLworICBMT0NGU0VSUk9SIGJwcmV2ZXJyMCwgYnByZXZlcnIxLCBicHJldmVycjI7IC8qIGVycm9yIGZvciBiZWxvdy9wcmV2IGNvbCAqLworICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KKyAgSlNBTVBST1cgaW5wdHI7CQkvKiA9PiBjdXJyZW50IGlucHV0IHBpeGVsICovCisgIEpTQU1QUk9XIG91dHB0cjsJCS8qID0+IGN1cnJlbnQgb3V0cHV0IHBpeGVsICovCisgIGhpc3RwdHIgY2FjaGVwOworICBpbnQgZGlyOwkJCS8qICsxIG9yIC0xIGRlcGVuZGluZyBvbiBkaXJlY3Rpb24gKi8KKyAgaW50IGRpcjM7CQkJLyogMypkaXIsIGZvciBhZHZhbmNpbmcgaW5wdHIgJiBlcnJvcnB0ciAqLworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICplcnJvcl9saW1pdCA9IGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlcjsKKyAgSlNBTVBST1cgY29sb3JtYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOworICBKU0FNUFJPVyBjb2xvcm1hcDEgPSBjaW5mby0+Y29sb3JtYXBbMV07CisgIEpTQU1QUk9XIGNvbG9ybWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKKyAgU0hJRlRfVEVNUFMKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKKyAgICAgIC8qIHdvcmsgcmlnaHQgdG8gbGVmdCBpbiB0aGlzIHJvdyAqLworICAgICAgaW5wdHIgKz0gKHdpZHRoLTEpICogMzsJLyogc28gcG9pbnQgdG8gcmlnaHRtb3N0IHBpeGVsICovCisgICAgICBvdXRwdHIgKz0gd2lkdGgtMTsKKyAgICAgIGRpciA9IC0xOworICAgICAgZGlyMyA9IC0zOworICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzICsgKHdpZHRoKzEpKjM7IC8qID0+IGVudHJ5IGFmdGVyIGxhc3QgY29sdW1uICovCisgICAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSBGQUxTRTsgLyogZmxpcCBmb3IgbmV4dCB0aW1lICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHdvcmsgbGVmdCB0byByaWdodCBpbiB0aGlzIHJvdyAqLworICAgICAgZGlyID0gMTsKKyAgICAgIGRpcjMgPSAzOworICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzOyAvKiA9PiBlbnRyeSBiZWZvcmUgZmlyc3QgcmVhbCBjb2x1bW4gKi8KKyAgICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IFRSVUU7IC8qIGZsaXAgZm9yIG5leHQgdGltZSAqLworICAgIH0KKyAgICAvKiBQcmVzZXQgZXJyb3IgdmFsdWVzOiBubyBlcnJvciBwcm9wYWdhdGVkIHRvIGZpcnN0IHBpeGVsIGZyb20gbGVmdCAqLworICAgIGN1cjAgPSBjdXIxID0gY3VyMiA9IDA7CisgICAgLyogYW5kIG5vIGVycm9yIHByb3BhZ2F0ZWQgdG8gcm93IGJlbG93IHlldCAqLworICAgIGJlbG93ZXJyMCA9IGJlbG93ZXJyMSA9IGJlbG93ZXJyMiA9IDA7CisgICAgYnByZXZlcnIwID0gYnByZXZlcnIxID0gYnByZXZlcnIyID0gMDsKKworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAvKiBjdXJOIGhvbGRzIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIHBpeGVsIG9uIHRoZQorICAgICAgICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKKyAgICAgICAqIHRvIGZvcm0gdGhlIGNvbXBsZXRlIGVycm9yIGNvcnJlY3Rpb24gdGVybSBmb3IgdGhpcyBwaXhlbCwgYW5kCisgICAgICAgKiByb3VuZCB0aGUgZXJyb3IgdGVybSAod2hpY2ggaXMgZXhwcmVzc2VkICogMTYpIHRvIGFuIGludGVnZXIuCisgICAgICAgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAorICAgICAgICogZm9yIGVpdGhlciBzaWduIG9mIHRoZSBlcnJvciB2YWx1ZS4KKyAgICAgICAqIE5vdGU6IGVycm9ycHRyIHBvaW50cyB0byAqcHJldmlvdXMqIGNvbHVtbidzIGFycmF5IGVudHJ5LgorICAgICAgICovCisgICAgICBjdXIwID0gUklHSFRfU0hJRlQoY3VyMCArIGVycm9ycHRyW2RpcjMrMF0gKyA4LCA0KTsKKyAgICAgIGN1cjEgPSBSSUdIVF9TSElGVChjdXIxICsgZXJyb3JwdHJbZGlyMysxXSArIDgsIDQpOworICAgICAgY3VyMiA9IFJJR0hUX1NISUZUKGN1cjIgKyBlcnJvcnB0cltkaXIzKzJdICsgOCwgNCk7CisgICAgICAvKiBMaW1pdCB0aGUgZXJyb3IgdXNpbmcgdHJhbnNmZXIgZnVuY3Rpb24gc2V0IGJ5IGluaXRfZXJyb3JfbGltaXQuCisgICAgICAgKiBTZWUgY29tbWVudHMgd2l0aCBpbml0X2Vycm9yX2xpbWl0IGZvciByYXRpb25hbGUuCisgICAgICAgKi8KKyAgICAgIGN1cjAgPSBlcnJvcl9saW1pdFtjdXIwXTsKKyAgICAgIGN1cjEgPSBlcnJvcl9saW1pdFtjdXIxXTsKKyAgICAgIGN1cjIgPSBlcnJvcl9saW1pdFtjdXIyXTsKKyAgICAgIC8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCisgICAgICAgKiBUaGUgbWF4aW11bSBlcnJvciBpcyArLSBNQVhKU0FNUExFIChvciBsZXNzIHdpdGggZXJyb3IgbGltaXRpbmcpOworICAgICAgICogdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSByYW5nZV9saW1pdCBhcnJheS4KKyAgICAgICAqLworICAgICAgY3VyMCArPSBHRVRKU0FNUExFKGlucHRyWzBdKTsKKyAgICAgIGN1cjEgKz0gR0VUSlNBTVBMRShpbnB0clsxXSk7CisgICAgICBjdXIyICs9IEdFVEpTQU1QTEUoaW5wdHJbMl0pOworICAgICAgY3VyMCA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMF0pOworICAgICAgY3VyMSA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMV0pOworICAgICAgY3VyMiA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMl0pOworICAgICAgLyogSW5kZXggaW50byB0aGUgY2FjaGUgd2l0aCBhZGp1c3RlZCBwaXhlbCB2YWx1ZSAqLworICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bY3VyMD4+QzBfU0hJRlRdW2N1cjE+PkMxX1NISUZUXVtjdXIyPj5DMl9TSElGVF07CisgICAgICAvKiBJZiB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgY29sb3IgYmVmb3JlLCBmaW5kIG5lYXJlc3QgY29sb3JtYXAgKi8KKyAgICAgIC8qIGVudHJ5IGFuZCB1cGRhdGUgdGhlIGNhY2hlICovCisgICAgICBpZiAoKmNhY2hlcCA9PSAwKQorCWZpbGxfaW52ZXJzZV9jbWFwKGNpbmZvLCBjdXIwPj5DMF9TSElGVCxjdXIxPj5DMV9TSElGVCxjdXIyPj5DMl9TSElGVCk7CisgICAgICAvKiBOb3cgZW1pdCB0aGUgY29sb3JtYXAgaW5kZXggZm9yIHRoaXMgY2VsbCAqLworICAgICAgeyByZWdpc3RlciBpbnQgcGl4Y29kZSA9ICpjYWNoZXAgLSAxOworCSpvdXRwdHIgPSAoSlNBTVBMRSkgcGl4Y29kZTsKKwkvKiBDb21wdXRlIHJlcHJlc2VudGF0aW9uIGVycm9yIGZvciB0aGlzIHBpeGVsICovCisJY3VyMCAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMFtwaXhjb2RlXSk7CisJY3VyMSAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMVtwaXhjb2RlXSk7CisJY3VyMiAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMltwaXhjb2RlXSk7CisgICAgICB9CisgICAgICAvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KKyAgICAgICAqIEFkZCB0aGVzZSBpbnRvIHRoZSBydW5uaW5nIHN1bXMsIGFuZCBzaW11bHRhbmVvdXNseSBzaGlmdCB0aGUKKyAgICAgICAqIG5leHQtbGluZSBlcnJvciBzdW1zIGxlZnQgYnkgMSBjb2x1bW4uCisgICAgICAgKi8KKyAgICAgIHsgcmVnaXN0ZXIgTE9DRlNFUlJPUiBibmV4dGVyciwgZGVsdGE7CisKKwlibmV4dGVyciA9IGN1cjA7CS8qIFByb2Nlc3MgY29tcG9uZW50IDAgKi8KKwlkZWx0YSA9IGN1cjAgKiAyOworCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogMyAqLworCWVycm9ycHRyWzBdID0gKEZTRVJST1IpIChicHJldmVycjAgKyBjdXIwKTsKKwljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDUgKi8KKwlicHJldmVycjAgPSBiZWxvd2VycjAgKyBjdXIwOworCWJlbG93ZXJyMCA9IGJuZXh0ZXJyOworCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNyAqLworCWJuZXh0ZXJyID0gY3VyMTsJLyogUHJvY2VzcyBjb21wb25lbnQgMSAqLworCWRlbHRhID0gY3VyMSAqIDI7CisJY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiAzICovCisJZXJyb3JwdHJbMV0gPSAoRlNFUlJPUikgKGJwcmV2ZXJyMSArIGN1cjEpOworCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNSAqLworCWJwcmV2ZXJyMSA9IGJlbG93ZXJyMSArIGN1cjE7CisJYmVsb3dlcnIxID0gYm5leHRlcnI7CisJY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCisJYm5leHRlcnIgPSBjdXIyOwkvKiBQcm9jZXNzIGNvbXBvbmVudCAyICovCisJZGVsdGEgPSBjdXIyICogMjsKKwljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KKwllcnJvcnB0clsyXSA9IChGU0VSUk9SKSAoYnByZXZlcnIyICsgY3VyMik7CisJY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCisJYnByZXZlcnIyID0gYmVsb3dlcnIyICsgY3VyMjsKKwliZWxvd2VycjIgPSBibmV4dGVycjsKKwljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDcgKi8KKyAgICAgIH0KKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY3VyTiBjb250YWlucyB0aGUgNy8xNiBlcnJvciB2YWx1ZSB0byBiZSBwcm9wYWdhdGVkCisgICAgICAgKiB0byB0aGUgbmV4dCBwaXhlbCBvbiB0aGUgY3VycmVudCBsaW5lLCBhbmQgYWxsIHRoZSBlcnJvcnMgZm9yIHRoZQorICAgICAgICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuICBXZSBhcmUgdGhlcmVmb3JlIHJlYWR5IHRvIG1vdmUgb24uCisgICAgICAgKi8KKyAgICAgIGlucHRyICs9IGRpcjM7CQkvKiBBZHZhbmNlIHBpeGVsIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBvdXRwdHIgKz0gZGlyOworICAgICAgZXJyb3JwdHIgKz0gZGlyMzsJCS8qIGFkdmFuY2UgZXJyb3JwdHIgdG8gY3VycmVudCBjb2x1bW4gKi8KKyAgICB9CisgICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZXMgaW50byB0aGUKKyAgICAgKiBmaW5hbCBmc2Vycm9yc1tdIGVudHJ5LiAgTm90ZSB3ZSBuZWVkIG5vdCB1bmxvYWQgYmVsb3dlcnJOIGJlY2F1c2UKKyAgICAgKiBpdCBpcyBmb3IgdGhlIGR1bW15IGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbCBhcnJheS4KKyAgICAgKi8KKyAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjA7IC8qIHVubG9hZCBwcmV2IGVycnMgaW50byBhcnJheSAqLworICAgIGVycm9ycHRyWzFdID0gKEZTRVJST1IpIGJwcmV2ZXJyMTsKKyAgICBlcnJvcnB0clsyXSA9IChGU0VSUk9SKSBicHJldmVycjI7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgZXJyb3ItbGltaXRpbmcgdHJhbnNmZXIgZnVuY3Rpb24gKGxvb2t1cCB0YWJsZSkuCisgKiBUaGUgcmF3IEYtUyBlcnJvciBjb21wdXRhdGlvbiBjYW4gcG90ZW50aWFsbHkgY29tcHV0ZSBlcnJvciB2YWx1ZXMgb2YgdXAgdG8KKyAqICstIE1BWEpTQU1QTEUuICBCdXQgd2Ugd2FudCB0aGUgbWF4aW11bSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gYSBwaXhlbCB0byBiZQorICogbXVjaCBsZXNzLCBvdGhlcndpc2Ugb2J2aW91c2x5IHdyb25nIHBpeGVscyB3aWxsIGJlIGNyZWF0ZWQuICAoVHlwaWNhbAorICogZWZmZWN0cyBpbmNsdWRlIHdlaXJkIGZyaW5nZXMgYXQgY29sb3ItYXJlYSBib3VuZGFyaWVzLCBpc29sYXRlZCBicmlnaHQKKyAqIHBpeGVscyBpbiBhIGRhcmsgYXJlYSwgZXRjLikgIFRoZSBzdGFuZGFyZCBhZHZpY2UgZm9yIGF2b2lkaW5nIHRoaXMgcHJvYmxlbQorICogaXMgdG8gZW5zdXJlIHRoYXQgdGhlICJjb3JuZXJzIiBvZiB0aGUgY29sb3IgY3ViZSBhcmUgYWxsb2NhdGVkIGFzIG91dHB1dAorICogY29sb3JzOyB0aGVuIHJlcGVhdGVkIGVycm9ycyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gY2Fubm90IGNhdXNlIGNhc2NhZGluZworICogZXJyb3IgYnVpbGR1cC4gIEhvd2V2ZXIsIHRoYXQgb25seSBwcmV2ZW50cyB0aGUgZXJyb3IgZnJvbSBnZXR0aW5nCisgKiBjb21wbGV0ZWx5IG91dCBvZiBoYW5kOyBBYXJvbiBHaWxlcyByZXBvcnRzIHRoYXQgZXJyb3IgbGltaXRpbmcgaW1wcm92ZXMKKyAqIHRoZSByZXN1bHRzIGV2ZW4gd2l0aCBjb3JuZXIgY29sb3JzIGFsbG9jYXRlZC4KKyAqIEEgc2ltcGxlIGNsYW1waW5nIG9mIHRoZSBlcnJvciB2YWx1ZXMgdG8gYWJvdXQgKy0gTUFYSlNBTVBMRS84IHdvcmtzIHByZXR0eQorICogd2VsbCwgYnV0IHRoZSBzbW9vdGhlciB0cmFuc2ZlciBmdW5jdGlvbiB1c2VkIGJlbG93IGlzIGV2ZW4gYmV0dGVyLiAgVGhhbmtzCisgKiB0byBBYXJvbiBHaWxlcyBmb3IgdGhpcyBpZGVhLgorICovCisKK0xPQ0FMKHZvaWQpCitpbml0X2Vycm9yX2xpbWl0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGVycm9yX2xpbWl0ZXIgdGFibGUgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaW50ICogdGFibGU7CisgIGludCBpbiwgb3V0OworCisgIHRhYmxlID0gKGludCAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIChNQVhKU0FNUExFKjIrMSkgKiBTSVpFT0YoaW50KSk7CisgIHRhYmxlICs9IE1BWEpTQU1QTEU7CQkvKiBzbyBjYW4gaW5kZXggLU1BWEpTQU1QTEUgLi4gK01BWEpTQU1QTEUgKi8KKyAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gdGFibGU7CisKKyNkZWZpbmUgU1RFUFNJWkUgKChNQVhKU0FNUExFKzEpLzE2KQorICAvKiBNYXAgZXJyb3JzIDE6MSB1cCB0byArLSBNQVhKU0FNUExFLzE2ICovCisgIG91dCA9IDA7CisgIGZvciAoaW4gPSAwOyBpbiA8IFNURVBTSVpFOyBpbisrLCBvdXQrKykgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyAgLyogTWFwIGVycm9ycyAxOjIgdXAgdG8gKy0gMypNQVhKU0FNUExFLzE2ICovCisgIGZvciAoOyBpbiA8IFNURVBTSVpFKjM7IGluKyssIG91dCArPSAoaW4mMSkgPyAwIDogMSkgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyAgLyogQ2xhbXAgdGhlIHJlc3QgdG8gZmluYWwgb3V0IHZhbHVlICh3aGljaCBpcyAoTUFYSlNBTVBMRSsxKS84KSAqLworICBmb3IgKDsgaW4gPD0gTUFYSlNBTVBMRTsgaW4rKykgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyN1bmRlZiBTVEVQU0laRQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBlYWNoIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzczEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisKKyAgLyogU2VsZWN0IHRoZSByZXByZXNlbnRhdGl2ZSBjb2xvcnMgYW5kIGZpbGwgaW4gY2luZm8tPmNvbG9ybWFwICovCisgIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7CisgIHNlbGVjdF9jb2xvcnMoY2luZm8sIGNxdWFudGl6ZS0+ZGVzaXJlZCk7CisgIC8qIEZvcmNlIG5leHQgcGFzcyB0byB6ZXJvIHRoZSBjb2xvciBpbmRleCB0YWJsZSAqLworICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzczIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgZWFjaCBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaW50IGk7CisKKyAgLyogT25seSBGLVMgZGl0aGVyaW5nIG9yIG5vIGRpdGhlcmluZyBpcyBzdXBwb3J0ZWQuICovCisgIC8qIElmIHVzZXIgYXNrcyBmb3Igb3JkZXJlZCBkaXRoZXIsIGdpdmUgaGltIEYtUy4gKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpCisgICAgY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKKworICBpZiAoaXNfcHJlX3NjYW4pIHsKKyAgICAvKiBTZXQgdXAgbWV0aG9kIHBvaW50ZXJzICovCisgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBwcmVzY2FuX3F1YW50aXplOworICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MxOworICAgIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsgLyogQWx3YXlzIHplcm8gaGlzdG9ncmFtICovCisgIH0gZWxzZSB7CisgICAgLyogU2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9GUykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfZnNfZGl0aGVyOworICAgIGVsc2UKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfbm9fZGl0aGVyOworICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MyOworCisgICAgLyogTWFrZSBzdXJlIGNvbG9yIGNvdW50IGlzIGFjY2VwdGFibGUgKi8KKyAgICBpID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICAgIGlmIChpIDwgMSkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX0ZFV19DT0xPUlMsIDEpOworICAgIGlmIChpID4gTUFYTlVNQ09MT1JTKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsIE1BWE5VTUNPTE9SUyk7CisKKyAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpIHsKKyAgICAgIHNpemVfdCBhcnJheXNpemUgPSAoc2l6ZV90KSAoKGNpbmZvLT5vdXRwdXRfd2lkdGggKyAyKSAqCisJCQkJICAgKDMgKiBTSVpFT0YoRlNFUlJPUikpKTsKKyAgICAgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgd2UgZGlkbid0IGFscmVhZHkuICovCisgICAgICBpZiAoY3F1YW50aXplLT5mc2Vycm9ycyA9PSBOVUxMKQorCWNxdWFudGl6ZS0+ZnNlcnJvcnMgPSAoRlNFUlJQVFIpICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpCisJICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBhcnJheXNpemUpOworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGFnYXRlZCBlcnJvcnMgdG8gemVyby4gKi8KKyAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9ycywgYXJyYXlzaXplKTsKKyAgICAgIC8qIE1ha2UgdGhlIGVycm9yLWxpbWl0IHRhYmxlIGlmIHdlIGRpZG4ndCBhbHJlYWR5LiAqLworICAgICAgaWYgKGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9PSBOVUxMKQorCWluaXRfZXJyb3JfbGltaXQoY2luZm8pOworICAgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7CisgICAgfQorCisgIH0KKyAgLyogWmVybyB0aGUgaGlzdG9ncmFtIG9yIGludmVyc2UgY29sb3IgbWFwLCBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEhJU1RfQzBfRUxFTVM7IGkrKykgeworICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBoaXN0b2dyYW1baV0sCisJCUhJU1RfQzFfRUxFTVMqSElTVF9DMl9FTEVNUyAqIFNJWkVPRihoaXN0Y2VsbCkpOworICAgIH0KKyAgICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IEZBTFNFOworICB9Cit9CisKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCituZXdfY29sb3JfbWFwXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisKKyAgLyogUmVzZXQgdGhlIGludmVyc2UgY29sb3IgbWFwICovCisgIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF8ycGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOworICBpbnQgaTsKKworICBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jcXVhbnRpemVyKSk7CisgIGNpbmZvLT5jcXVhbnRpemUgPSAoc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICopIGNxdWFudGl6ZTsKKyAgY3F1YW50aXplLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfMl9xdWFudDsKKyAgY3F1YW50aXplLT5wdWIubmV3X2NvbG9yX21hcCA9IG5ld19jb2xvcl9tYXBfMl9xdWFudDsKKyAgY3F1YW50aXplLT5mc2Vycm9ycyA9IE5VTEw7CS8qIGZsYWcgb3B0aW9uYWwgYXJyYXlzIG5vdCBhbGxvY2F0ZWQgKi8KKyAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gTlVMTDsKKworICAvKiBNYWtlIHN1cmUgamRtYXN0ZXIgZGlkbid0IGdpdmUgbWUgYSBjYXNlIEkgY2FuJ3QgaGFuZGxlICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gMykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOworCisgIC8qIEFsbG9jYXRlIHRoZSBoaXN0b2dyYW0vaW52ZXJzZSBjb2xvcm1hcCBzdG9yYWdlICovCisgIGNxdWFudGl6ZS0+aGlzdG9ncmFtID0gKGhpc3QzZCkgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBISVNUX0MwX0VMRU1TICogU0laRU9GKGhpc3QyZCkpOworICBmb3IgKGkgPSAwOyBpIDwgSElTVF9DMF9FTEVNUzsgaSsrKSB7CisgICAgY3F1YW50aXplLT5oaXN0b2dyYW1baV0gPSAoaGlzdDJkKSAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICBISVNUX0MxX0VMRU1TKkhJU1RfQzJfRUxFTVMgKiBTSVpFT0YoaGlzdGNlbGwpKTsKKyAgfQorICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7IC8qIGhpc3RvZ3JhbSBpcyBnYXJiYWdlIG5vdyAqLworCisgIC8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZSBjb21wbGV0ZWQgY29sb3JtYXAsIGlmIHJlcXVpcmVkLgorICAgKiBXZSBkbyB0aGlzIG5vdyBzaW5jZSBpdCBpcyBGQVIgc3RvcmFnZSBhbmQgbWF5IGFmZmVjdAorICAgKiB0aGUgbWVtb3J5IG1hbmFnZXIncyBzcGFjZSBjYWxjdWxhdGlvbnMuCisgICAqLworICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCkgeworICAgIC8qIE1ha2Ugc3VyZSBjb2xvciBjb3VudCBpcyBhY2NlcHRhYmxlICovCisgICAgaW50IGRlc2lyZWQgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOworICAgIC8qIExvd2VyIGJvdW5kIG9uICMgb2YgY29sb3JzIC4uLiBzb21ld2hhdCBhcmJpdHJhcnkgYXMgbG9uZyBhcyA+IDAgKi8KKyAgICBpZiAoZGVzaXJlZCA8IDgpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCA4KTsKKyAgICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KKyAgICBpZiAoZGVzaXJlZCA+IE1BWE5VTUNPTE9SUykKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCBNQVhOVU1DT0xPUlMpOworICAgIGNxdWFudGl6ZS0+c3ZfY29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbyxKUE9PTF9JTUFHRSwgKEpESU1FTlNJT04pIGRlc2lyZWQsIChKRElNRU5TSU9OKSAzKTsKKyAgICBjcXVhbnRpemUtPmRlc2lyZWQgPSBkZXNpcmVkOworICB9IGVsc2UKKyAgICBjcXVhbnRpemUtPnN2X2NvbG9ybWFwID0gTlVMTDsKKworICAvKiBPbmx5IEYtUyBkaXRoZXJpbmcgb3Igbm8gZGl0aGVyaW5nIGlzIHN1cHBvcnRlZC4gKi8KKyAgLyogSWYgdXNlciBhc2tzIGZvciBvcmRlcmVkIGRpdGhlciwgZ2l2ZSBoaW0gRi1TLiAqLworICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlICE9IEpESVRIRVJfTk9ORSkKKyAgICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOworCisgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgbmVjZXNzYXJ5LgorICAgKiBUaGlzIGlzbid0IHJlYWxseSBuZWVkZWQgdW50aWwgcGFzcyAyLCBidXQgYWdhaW4gaXQgaXMgRkFSIHN0b3JhZ2UuCisgICAqIEFsdGhvdWdoIHdlIHdpbGwgY29wZSB3aXRoIGEgbGF0ZXIgY2hhbmdlIGluIGRpdGhlcl9tb2RlLAorICAgKiB3ZSBkbyBub3QgcHJvbWlzZSB0byBob25vciBtYXhfbWVtb3J5X3RvX3VzZSBpZiBkaXRoZXJfbW9kZSBjaGFuZ2VzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX0ZTKSB7CisgICAgY3F1YW50aXplLT5mc2Vycm9ycyA9IChGU0VSUlBUUikgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiAoMyAqIFNJWkVPRihGU0VSUk9SKSkpKTsKKyAgICAvKiBNaWdodCBhcyB3ZWxsIGNyZWF0ZSB0aGUgZXJyb3ItbGltaXRpbmcgdGFibGUgdG9vLiAqLworICAgIGluaXRfZXJyb3JfbGltaXQoY2luZm8pOworICB9Cit9CisKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2p1dGlscy5jIGIvanV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4YTk1NQotLS0gL2Rldi9udWxsCisrKyBiL2p1dGlscy5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICoganV0aWxzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0YWJsZXMgYW5kIG1pc2NlbGxhbmVvdXMgdXRpbGl0eSByb3V0aW5lcyBuZWVkZWQKKyAqIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgorICogTm90ZSB3ZSBwcmVmaXggYWxsIGdsb2JhbCBuYW1lcyB3aXRoICJqIiB0byBtaW5pbWl6ZSBjb25mbGljdHMgd2l0aAorICogYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIGpwZWdfemlnemFnX29yZGVyW2ldIGlzIHRoZSB6aWd6YWctb3JkZXIgcG9zaXRpb24gb2YgdGhlIGkndGggZWxlbWVudAorICogb2YgYSBEQ1QgYmxvY2sgcmVhZCBpbiBuYXR1cmFsIG9yZGVyIChsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tKS4KKyAqLworCisjaWYgMAkJCQkvKiBUaGlzIHRhYmxlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQgaW4gdjZhICovCisKK2NvbnN0IGludCBqcGVnX3ppZ3phZ19vcmRlcltEQ1RTSVpFMl0gPSB7CisgICAwLCAgMSwgIDUsICA2LCAxNCwgMTUsIDI3LCAyOCwKKyAgIDIsICA0LCAgNywgMTMsIDE2LCAyNiwgMjksIDQyLAorICAgMywgIDgsIDEyLCAxNywgMjUsIDMwLCA0MSwgNDMsCisgICA5LCAxMSwgMTgsIDI0LCAzMSwgNDAsIDQ0LCA1MywKKyAgMTAsIDE5LCAyMywgMzIsIDM5LCA0NSwgNTIsIDU0LAorICAyMCwgMjIsIDMzLCAzOCwgNDYsIDUxLCA1NSwgNjAsCisgIDIxLCAzNCwgMzcsIDQ3LCA1MCwgNTYsIDU5LCA2MSwKKyAgMzUsIDM2LCA0OCwgNDksIDU3LCA1OCwgNjIsIDYzCit9OworCisjZW5kaWYKKworLyoKKyAqIGpwZWdfbmF0dXJhbF9vcmRlcltpXSBpcyB0aGUgbmF0dXJhbC1vcmRlciBwb3NpdGlvbiBvZiB0aGUgaSd0aCBlbGVtZW50CisgKiBvZiB6aWd6YWcgb3JkZXIuCisgKgorICogV2hlbiByZWFkaW5nIGNvcnJ1cHRlZCBkYXRhLCB0aGUgSHVmZm1hbiBkZWNvZGVycyBjb3VsZCBhdHRlbXB0CisgKiB0byByZWZlcmVuY2UgYW4gZW50cnkgYmV5b25kIHRoZSBlbmQgb2YgdGhpcyBhcnJheSAoaWYgdGhlIGRlY29kZWQKKyAqIHplcm8gcnVuIGxlbmd0aCByZWFjaGVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYmxvY2spLiAgVG8gcHJldmVudAorICogd2lsZCBzdG9yZXMgd2l0aG91dCBhZGRpbmcgYW4gaW5uZXItbG9vcCB0ZXN0LCB3ZSBwdXQgc29tZSBleHRyYQorICogIjYzInMgYWZ0ZXIgdGhlIHJlYWwgZW50cmllcy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZXh0cmEgY29lZmZpY2llbnQKKyAqIHRvIGJlIHN0b3JlZCBpbiBsb2NhdGlvbiA2MyBvZiB0aGUgYmxvY2ssIG5vdCBzb21ld2hlcmUgcmFuZG9tLgorICogVGhlIHdvcnN0IGNhc2Ugd291bGQgYmUgYSBydW4tbGVuZ3RoIG9mIDE1LCB3aGljaCBtZWFucyB3ZSBuZWVkIDE2CisgKiBmYWtlIGVudHJpZXMuCisgKi8KKworY29uc3QgaW50IGpwZWdfbmF0dXJhbF9vcmRlcltEQ1RTSVpFMisxNl0gPSB7CisgIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAorIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKKyAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LAorIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKKyAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCisgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MywKKyA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIC8qIGV4dHJhIGVudHJpZXMgZm9yIHNhZmV0eSBpbiBkZWNvZGVyICovCisgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzCit9OworCisKKy8qCisgKiBBcml0aG1ldGljIHV0aWxpdGllcworICovCisKK0dMT0JBTChsb25nKQoramRpdl9yb3VuZF91cCAobG9uZyBhLCBsb25nIGIpCisvKiBDb21wdXRlIGEvYiByb3VuZGVkIHVwIHRvIG5leHQgaW50ZWdlciwgaWUsIGNlaWwoYS9iKSAqLworLyogQXNzdW1lcyBhID49IDAsIGIgPiAwICovCit7CisgIHJldHVybiAoYSArIGIgLSAxTCkgLyBiOworfQorCisKK0dMT0JBTChsb25nKQoranJvdW5kX3VwIChsb25nIGEsIGxvbmcgYikKKy8qIENvbXB1dGUgYSByb3VuZGVkIHVwIHRvIG5leHQgbXVsdGlwbGUgb2YgYiwgaWUsIGNlaWwoYS9iKSpiICovCisvKiBBc3N1bWVzIGEgPj0gMCwgYiA+IDAgKi8KK3sKKyAgYSArPSBiIC0gMUw7CisgIHJldHVybiBhIC0gKGEgJSBiKTsKK30KKworCisvKiBPbiBub3JtYWwgbWFjaGluZXMgd2UgY2FuIGFwcGx5IE1FTUNPUFkoKSBhbmQgTUVNWkVSTygpIHRvIHNhbXBsZSBhcnJheXMKKyAqIGFuZCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMuICBUaGlzIHdvbid0IHdvcmsgb24gODB4ODYgYmVjYXVzZSB0aGUgYXJyYXlzCisgKiBhcmUgRkFSIGFuZCB3ZSdyZSBhc3N1bWluZyBhIHNtYWxsLXBvaW50ZXIgbWVtb3J5IG1vZGVsLiAgSG93ZXZlciwgc29tZQorICogRE9TIGNvbXBpbGVycyBwcm92aWRlIGZhci1wb2ludGVyIHZlcnNpb25zIG9mIG1lbWNweSgpIGFuZCBtZW1zZXQoKSBldmVuCisgKiBpbiB0aGUgc21hbGwtbW9kZWwgbGlicmFyaWVzLiAgVGhlc2Ugd2lsbCBiZSB1c2VkIGlmIFVTRV9GTUVNIGlzIGRlZmluZWQuCisgKiBPdGhlcndpc2UsIHRoZSByb3V0aW5lcyBiZWxvdyBkbyBpdCB0aGUgaGFyZCB3YXkuICAoVGhlIHBlcmZvcm1hbmNlIGNvc3QKKyAqIGlzIG5vdCBhbGwgdGhhdCBncmVhdCwgYmVjYXVzZSB0aGVzZSByb3V0aW5lcyBhcmVuJ3QgdmVyeSBoZWF2aWx5IHVzZWQuKQorICovCisKKyNpZm5kZWYgTkVFRF9GQVJfUE9JTlRFUlMJLyogbm9ybWFsIGNhc2UsIHNhbWUgYXMgcmVndWxhciBtYWNyb3MgKi8KKyNkZWZpbmUgRk1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJTUVNQ09QWShkZXN0LHNyYyxzaXplKQorI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJTUVNWkVSTyh0YXJnZXQsc2l6ZSkKKyNlbHNlCQkJCS8qIDgweDg2IGNhc2UsIGRlZmluZSBpZiB3ZSBjYW4gKi8KKyNpZmRlZiBVU0VfRk1FTQorI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlfZm1lbWNweSgodm9pZCBGQVIgKikoZGVzdCksIChjb25zdCB2b2lkIEZBUiAqKShzcmMpLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgRk1FTVpFUk8odGFyZ2V0LHNpemUpCV9mbWVtc2V0KCh2b2lkIEZBUiAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKKyNlbmRpZgorI2VuZGlmCisKKworR0xPQkFMKHZvaWQpCitqY29weV9zYW1wbGVfcm93cyAoSlNBTVBBUlJBWSBpbnB1dF9hcnJheSwgaW50IHNvdXJjZV9yb3csCisJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2FycmF5LCBpbnQgZGVzdF9yb3csCisJCSAgIGludCBudW1fcm93cywgSkRJTUVOU0lPTiBudW1fY29scykKKy8qIENvcHkgc29tZSByb3dzIG9mIHNhbXBsZXMgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4KKyAqIG51bV9yb3dzIHJvd3MgYXJlIGNvcGllZCBmcm9tIGlucHV0X2FycmF5W3NvdXJjZV9yb3crK10KKyAqIHRvIG91dHB1dF9hcnJheVtkZXN0X3JvdysrXTsgdGhlc2UgYXJlYXMgbWF5IG92ZXJsYXAgZm9yIGR1cGxpY2F0aW9uLgorICogVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJyYXlzIG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBudW1fY29scy4KKyAqLworeworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworI2lmZGVmIEZNRU1DT1BZCisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IChzaXplX3QpIChudW1fY29scyAqIFNJWkVPRihKU0FNUExFKSk7CisjZWxzZQorICByZWdpc3RlciBKRElNRU5TSU9OIGNvdW50OworI2VuZGlmCisgIHJlZ2lzdGVyIGludCByb3c7CisKKyAgaW5wdXRfYXJyYXkgKz0gc291cmNlX3JvdzsKKyAgb3V0cHV0X2FycmF5ICs9IGRlc3Rfcm93OworCisgIGZvciAocm93ID0gbnVtX3Jvd3M7IHJvdyA+IDA7IHJvdy0tKSB7CisgICAgaW5wdHIgPSAqaW5wdXRfYXJyYXkrKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2FycmF5Kys7CisjaWZkZWYgRk1FTUNPUFkKKyAgICBGTUVNQ09QWShvdXRwdHIsIGlucHRyLCBjb3VudCk7CisjZWxzZQorICAgIGZvciAoY291bnQgPSBudW1fY29sczsgY291bnQgPiAwOyBjb3VudC0tKQorICAgICAgKm91dHB0cisrID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyNlbmRpZgorICB9Cit9CisKKworR0xPQkFMKHZvaWQpCitqY29weV9ibG9ja19yb3cgKEpCTE9DS1JPVyBpbnB1dF9yb3csIEpCTE9DS1JPVyBvdXRwdXRfcm93LAorCQkgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQorLyogQ29weSBhIHJvdyBvZiBjb2VmZmljaWVudCBibG9ja3MgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4gKi8KK3sKKyNpZmRlZiBGTUVNQ09QWQorICBGTUVNQ09QWShvdXRwdXRfcm93LCBpbnB1dF9yb3csIG51bV9ibG9ja3MgKiAoRENUU0laRTIgKiBTSVpFT0YoSkNPRUYpKSk7CisjZWxzZQorICByZWdpc3RlciBKQ09FRlBUUiBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBsb25nIGNvdW50OworCisgIGlucHRyID0gKEpDT0VGUFRSKSBpbnB1dF9yb3c7CisgIG91dHB0ciA9IChKQ09FRlBUUikgb3V0cHV0X3JvdzsKKyAgZm9yIChjb3VudCA9IChsb25nKSBudW1fYmxvY2tzICogRENUU0laRTI7IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICpvdXRwdHIrKyA9ICppbnB0cisrOworICB9CisjZW5kaWYKK30KKworCitHTE9CQUwodm9pZCkKK2p6ZXJvX2ZhciAodm9pZCBGQVIgKiB0YXJnZXQsIHNpemVfdCBieXRlc3RvemVybykKKy8qIFplcm8gb3V0IGEgY2h1bmsgb2YgRkFSIG1lbW9yeS4gKi8KKy8qIFRoaXMgbWlnaHQgYmUgc2FtcGxlLWFycmF5IGRhdGEsIGJsb2NrLWFycmF5IGRhdGEsIG9yIGFsbG9jX2xhcmdlIGRhdGEuICovCit7CisjaWZkZWYgRk1FTVpFUk8KKyAgRk1FTVpFUk8odGFyZ2V0LCBieXRlc3RvemVybyk7CisjZWxzZQorICByZWdpc3RlciBjaGFyIEZBUiAqIHB0ciA9IChjaGFyIEZBUiAqKSB0YXJnZXQ7CisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKKworICBmb3IgKGNvdW50ID0gYnl0ZXN0b3plcm87IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICpwdHIrKyA9IDA7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvanZlcnNpb24uaCBiL2p2ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3MmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2p2ZXJzaW9uLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGp2ZXJzaW9uLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzb2Z0d2FyZSB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uLgorICovCisKKworI2RlZmluZSBKVkVSU0lPTgkiNmIgIDI3LU1hci0xOTk4IgorCisjZGVmaW5lIEpDT1BZUklHSFQJIkNvcHlyaWdodCAoQykgMTk5OCwgVGhvbWFzIEcuIExhbmUiCmRpZmYgLS1naXQgYS9saWJqcGVnLmRvYyBiL2xpYmpwZWcuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWIyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJqcGVnLmRvYwpAQCAtMCwwICsxLDMwMDYgQEAKK1VTSU5HIFRIRSBJSkcgSlBFRyBMSUJSQVJZCisKK0NvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCitGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisKKworVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIHRoZSBJSkcgSlBFRyBsaWJyYXJ5IHdpdGhpbiBhbiBhcHBsaWNhdGlvbgorcHJvZ3JhbS4gIFJlYWQgaXQgaWYgeW91IHdhbnQgdG8gd3JpdGUgYSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgbGlicmFyeS4KKworVGhlIGZpbGUgZXhhbXBsZS5jIHByb3ZpZGVzIGhlYXZpbHkgY29tbWVudGVkIHNrZWxldG9uIGNvZGUgZm9yIGNhbGxpbmcgdGhlCitKUEVHIGxpYnJhcnkuICBBbHNvIHNlZSBqcGVnbGliLmggKHRoZSBpbmNsdWRlIGZpbGUgdG8gYmUgdXNlZCBieSBhcHBsaWNhdGlvbgorcHJvZ3JhbXMpIGZvciBmdWxsIGRldGFpbHMgYWJvdXQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdHMuCitUaGUgbGlicmFyeSBzb3VyY2UgY29kZSwgb2YgY291cnNlLCBpcyB0aGUgdWx0aW1hdGUgcmVmZXJlbmNlLgorCitOb3RlIHRoYXQgdGhlcmUgaGF2ZSBiZWVuICptYWpvciogY2hhbmdlcyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UKK3ByZXNlbnRlZCBieSBJSkcgdmVyc2lvbiA0IGFuZCBlYXJsaWVyIHZlcnNpb25zLiAgVGhlIG9sZCBkZXNpZ24gaGFkIHNldmVyYWwKK2luaGVyZW50IGxpbWl0YXRpb25zLCBhbmQgaXQgaGFkIGFjY3VtdWxhdGVkIGEgbG90IG9mIGNydWZ0IGFzIHdlIGFkZGVkCitmZWF0dXJlcyB3aGlsZSB0cnlpbmcgdG8gbWluaW1pemUgYXBwbGljYXRpb24taW50ZXJmYWNlIGNoYW5nZXMuICBXZSBoYXZlCitzYWNyaWZpY2VkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaW4gdGhlIHZlcnNpb24gNSByZXdyaXRlLCBidXQgd2UgdGhpbmsgdGhlCitpbXByb3ZlbWVudHMganVzdGlmeSB0aGlzLgorCisKK1RBQkxFIE9GIENPTlRFTlRTCistLS0tLS0tLS0tLS0tLS0tLQorCitPdmVydmlldzoKKwlGdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkKKwlPdXRsaW5lIG9mIHR5cGljYWwgdXNhZ2UKK0Jhc2ljIGxpYnJhcnkgdXNhZ2U6CisJRGF0YSBmb3JtYXRzCisJQ29tcHJlc3Npb24gZGV0YWlscworCURlY29tcHJlc3Npb24gZGV0YWlscworCU1lY2hhbmljcyBvZiB1c2FnZTogaW5jbHVkZSBmaWxlcywgbGlua2luZywgZXRjCitBZHZhbmNlZCBmZWF0dXJlczoKKwlDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uCisJRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uCisJU3BlY2lhbCBjb2xvciBzcGFjZXMKKwlFcnJvciBoYW5kbGluZworCUNvbXByZXNzZWQgZGF0YSBoYW5kbGluZyAoc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2VycykKKwlJL08gc3VzcGVuc2lvbgorCVByb2dyZXNzaXZlIEpQRUcgc3VwcG9ydAorCUJ1ZmZlcmVkLWltYWdlIG1vZGUKKwlBYmJyZXZpYXRlZCBkYXRhc3RyZWFtcyBhbmQgbXVsdGlwbGUgaW1hZ2VzCisJU3BlY2lhbCBtYXJrZXJzCisJUmF3IChkb3duc2FtcGxlZCkgaW1hZ2UgZGF0YQorCVJlYWxseSByYXcgZGF0YTogRENUIGNvZWZmaWNpZW50cworCVByb2dyZXNzIG1vbml0b3JpbmcKKwlNZW1vcnkgbWFuYWdlbWVudAorCU1lbW9yeSB1c2FnZQorCUxpYnJhcnkgY29tcGlsZS10aW1lIG9wdGlvbnMKKwlQb3J0YWJpbGl0eSBjb25zaWRlcmF0aW9ucworCU5vdGVzIGZvciBNUy1ET1MgaW1wbGVtZW50b3JzCisKK1lvdSBzaG91bGQgcmVhZCBhdCBsZWFzdCB0aGUgb3ZlcnZpZXcgYW5kIGJhc2ljIHVzYWdlIHNlY3Rpb25zIGJlZm9yZSB0cnlpbmcKK3RvIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeS4gIFRoZSBzZWN0aW9ucyBvbiBhZHZhbmNlZCBmZWF0dXJlcyBjYW4gYmUgcmVhZAoraWYgYW5kIHdoZW4geW91IG5lZWQgdGhlbS4KKworCitPVkVSVklFVworPT09PT09PT0KKworRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIElKRyBKUEVHIGxpYnJhcnkgcHJvdmlkZXMgQyBjb2RlIHRvIHJlYWQgYW5kIHdyaXRlIEpQRUctY29tcHJlc3NlZCBpbWFnZQorZmlsZXMuICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gcHJvZ3JhbSByZWNlaXZlcyBvciBzdXBwbGllcyBpbWFnZSBkYXRhIGEKK3NjYW5saW5lIGF0IGEgdGltZSwgdXNpbmcgYSBzdHJhaWdodGZvcndhcmQgdW5jb21wcmVzc2VkIGltYWdlIGZvcm1hdC4gIEFsbAorZGV0YWlscyBvZiBjb2xvciBjb252ZXJzaW9uIGFuZCBvdGhlciBwcmVwcm9jZXNzaW5nL3Bvc3Rwcm9jZXNzaW5nIGNhbiBiZQoraGFuZGxlZCBieSB0aGUgbGlicmFyeS4KKworVGhlIGxpYnJhcnkgaW5jbHVkZXMgYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZQorSlBFRyBzdGFuZGFyZCBidXQgaXMgbmVjZXNzYXJ5IGZvciB0eXBpY2FsIGFwcGxpY2F0aW9ucyBvZiBKUEVHLiAgVGhlc2UKK2Z1bmN0aW9ucyBwcmVwcm9jZXNzIHRoZSBpbWFnZSBiZWZvcmUgSlBFRyBjb21wcmVzc2lvbiBvciBwb3N0cHJvY2VzcyBpdCBhZnRlcgorZGVjb21wcmVzc2lvbi4gIFRoZXkgaW5jbHVkZSBjb2xvcnNwYWNlIGNvbnZlcnNpb24sIGRvd25zYW1wbGluZy91cHNhbXBsaW5nLAorYW5kIGNvbG9yIHF1YW50aXphdGlvbi4gIFRoZSBhcHBsaWNhdGlvbiBpbmRpcmVjdGx5IHNlbGVjdHMgdXNlIG9mIHRoaXMgY29kZQorYnkgc3BlY2lmeWluZyB0aGUgZm9ybWF0IGluIHdoaWNoIGl0IHdpc2hlcyB0byBzdXBwbHkgb3IgcmVjZWl2ZSBpbWFnZSBkYXRhLgorRm9yIGV4YW1wbGUsIGlmIGNvbG9ybWFwcGVkIG91dHB1dCBpcyByZXF1ZXN0ZWQsIHRoZW4gdGhlIGRlY29tcHJlc3Npb24KK2xpYnJhcnkgYXV0b21hdGljYWxseSBpbnZva2VzIGNvbG9yIHF1YW50aXphdGlvbi4KKworQSB3aWRlIHJhbmdlIG9mIHF1YWxpdHkgdnMuIHNwZWVkIHRyYWRlb2ZmcyBhcmUgcG9zc2libGUgaW4gSlBFRyBwcm9jZXNzaW5nLAorYW5kIGV2ZW4gbW9yZSBzbyBpbiBkZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nLiAgVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeQorcHJvdmlkZXMgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zIHRoYXQgY292ZXIgbW9zdCBvZiB0aGUgdXNlZnVsIHRyYWRlb2ZmcywKK3JhbmdpbmcgZnJvbSB2ZXJ5LWhpZ2gtcXVhbGl0eSBkb3duIHRvIGZhc3QtcHJldmlldyBvcGVyYXRpb24uICBPbiB0aGUKK2NvbXByZXNzaW9uIHNpZGUgd2UgaGF2ZSBnZW5lcmFsbHkgbm90IHByb3ZpZGVkIGxvdy1xdWFsaXR5IGNob2ljZXMsIHNpbmNlCitjb21wcmVzc2lvbiBpcyBub3JtYWxseSBsZXNzIHRpbWUtY3JpdGljYWwuICBJdCBzaG91bGQgYmUgdW5kZXJzdG9vZCB0aGF0IHRoZQorbG93LXF1YWxpdHkgbW9kZXMgbWF5IG5vdCBtZWV0IHRoZSBKUEVHIHN0YW5kYXJkJ3MgYWNjdXJhY3kgcmVxdWlyZW1lbnRzOworbm9uZXRoZWxlc3MsIHRoZXkgYXJlIHVzZWZ1bCBmb3Igdmlld2Vycy4KKworQSB3b3JkIGFib3V0IGZ1bmN0aW9ucyAqbm90KiBwcm92aWRlZCBieSB0aGUgbGlicmFyeS4gIFdlIGhhbmRsZSBhIHN1YnNldCBvZgordGhlIElTTyBKUEVHIHN0YW5kYXJkOyBtb3N0IGJhc2VsaW5lLCBleHRlbmRlZC1zZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUKK0pQRUcgcHJvY2Vzc2VzIGFyZSBzdXBwb3J0ZWQuICAoT3VyIHN1YnNldCBpbmNsdWRlcyBhbGwgZmVhdHVyZXMgbm93IGluIGNvbW1vbgordXNlLikgIFVuc3VwcG9ydGVkIElTTyBvcHRpb25zIGluY2x1ZGU6CisJKiBIaWVyYXJjaGljYWwgc3RvcmFnZQorCSogTG9zc2xlc3MgSlBFRworCSogQXJpdGhtZXRpYyBlbnRyb3B5IGNvZGluZyAodW5zdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMpCisJKiBETkwgbWFya2VyCisJKiBOb25pbnRlZ3JhbCBzdWJzYW1wbGluZyByYXRpb3MKK1dlIHN1cHBvcnQgYm90aCA4LSBhbmQgMTItYml0IGRhdGEgcHJlY2lzaW9uLCBidXQgdGhpcyBpcyBhIGNvbXBpbGUtdGltZQorY2hvaWNlIHJhdGhlciB0aGFuIGEgcnVuLXRpbWUgY2hvaWNlOyBoZW5jZSBpdCBpcyBkaWZmaWN1bHQgdG8gdXNlIGJvdGgKK3ByZWNpc2lvbnMgaW4gYSBzaW5nbGUgYXBwbGljYXRpb24uCisKK0J5IGl0c2VsZiwgdGhlIGxpYnJhcnkgaGFuZGxlcyBvbmx5IGludGVyY2hhbmdlIEpQRUcgZGF0YXN0cmVhbXMgLS0tIGluCitwYXJ0aWN1bGFyIHRoZSB3aWRlbHkgdXNlZCBKRklGIGZpbGUgZm9ybWF0LiAgVGhlIGxpYnJhcnkgY2FuIGJlIHVzZWQgYnkKK3N1cnJvdW5kaW5nIGNvZGUgdG8gcHJvY2VzcyBpbnRlcmNoYW5nZSBvciBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zIHRoYXQKK2FyZSBlbWJlZGRlZCBpbiBtb3JlIGNvbXBsZXggZmlsZSBmb3JtYXRzLiAgKEZvciBleGFtcGxlLCB0aGlzIGxpYnJhcnkgaXMKK3VzZWQgYnkgdGhlIGZyZWUgTElCVElGRiBsaWJyYXJ5IHRvIHN1cHBvcnQgSlBFRyBjb21wcmVzc2lvbiBpbiBUSUZGLikKKworCitPdXRsaW5lIG9mIHR5cGljYWwgdXNhZ2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcm91Z2ggb3V0bGluZSBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3BlcmF0aW9uIGlzOgorCisJQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAorCVNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKQorCVNldCBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2lvbiwgaW5jbHVkaW5nIGltYWdlIHNpemUgJiBjb2xvcnNwYWNlCisJanBlZ19zdGFydF9jb21wcmVzcyguLi4pOworCXdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSB3cml0dGVuKQorCQlqcGVnX3dyaXRlX3NjYW5saW5lcyguLi4pOworCWpwZWdfZmluaXNoX2NvbXByZXNzKC4uLik7CisJUmVsZWFzZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QKKworQSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCBob2xkcyBwYXJhbWV0ZXJzIGFuZCB3b3JraW5nIHN0YXRlIGZvciB0aGUgSlBFRworbGlicmFyeS4gIFdlIG1ha2UgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gb2YgdGhlIG9iamVjdCBzZXBhcmF0ZSBmcm9tIHN0YXJ0aW5nCitvciBmaW5pc2hpbmcgY29tcHJlc3Npb24gb2YgYW4gaW1hZ2U7IHRoZSBzYW1lIG9iamVjdCBjYW4gYmUgcmUtdXNlZCBmb3IgYQorc2VyaWVzIG9mIGltYWdlIGNvbXByZXNzaW9uIG9wZXJhdGlvbnMuICBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gcmUtdXNlIHRoZQorc2FtZSBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIGEgc2VxdWVuY2Ugb2YgaW1hZ2VzLiAgUmUtdXNlIG9mIGEgSlBFRyBvYmplY3QKK2Fsc28gaGFzIGltcG9ydGFudCBpbXBsaWNhdGlvbnMgZm9yIHByb2Nlc3NpbmcgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcywKK2FzIGRpc2N1c3NlZCBsYXRlci4KKworVGhlIGltYWdlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzdXBwbGllZCB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpIGZyb20KK2luLW1lbW9yeSBidWZmZXJzLiAgSWYgdGhlIGFwcGxpY2F0aW9uIGlzIGRvaW5nIGZpbGUtdG8tZmlsZSBjb21wcmVzc2lvbiwKK3JlYWRpbmcgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzb3VyY2UgZmlsZSBpcyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eS4KK1RoZSBsaWJyYXJ5IGVtaXRzIGNvbXByZXNzZWQgZGF0YSBieSBjYWxsaW5nIGEgImRhdGEgZGVzdGluYXRpb24gbWFuYWdlciIsCit3aGljaCB0eXBpY2FsbHkgd2lsbCB3cml0ZSB0aGUgZGF0YSBpbnRvIGEgZmlsZTsgYnV0IHRoZSBhcHBsaWNhdGlvbiBjYW4KK3Byb3ZpZGUgaXRzIG93biBkZXN0aW5hdGlvbiBtYW5hZ2VyIHRvIGRvIHNvbWV0aGluZyBlbHNlLgorCitTaW1pbGFybHksIHRoZSByb3VnaCBvdXRsaW5lIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiBpczoKKworCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAorCVNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIChlZywgYSBmaWxlKQorCUNhbGwganBlZ19yZWFkX2hlYWRlcigpIHRvIG9idGFpbiBpbWFnZSBpbmZvCisJU2V0IHBhcmFtZXRlcnMgZm9yIGRlY29tcHJlc3Npb24KKwlqcGVnX3N0YXJ0X2RlY29tcHJlc3MoLi4uKTsKKwl3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgcmVhZCkKKwkJanBlZ19yZWFkX3NjYW5saW5lcyguLi4pOworCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoLi4uKTsKKwlSZWxlYXNlIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0CisKK1RoaXMgaXMgY29tcGFyYWJsZSB0byB0aGUgY29tcHJlc3Npb24gb3V0bGluZSBleGNlcHQgdGhhdCByZWFkaW5nIHRoZQorZGF0YXN0cmVhbSBoZWFkZXIgaXMgYSBzZXBhcmF0ZSBzdGVwLiAgVGhpcyBpcyBoZWxwZnVsIGJlY2F1c2UgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBpbWFnZSdzIHNpemUsIGNvbG9yc3BhY2UsIGV0YyBpcyBhdmFpbGFibGUgd2hlbiB0aGUgYXBwbGljYXRpb24KK3NlbGVjdHMgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGUsIHRoZSBhcHBsaWNhdGlvbiBjYW4gY2hvb3NlIGFuCitvdXRwdXQgc2NhbGluZyByYXRpbyB0aGF0IHdpbGwgZml0IHRoZSBpbWFnZSBpbnRvIHRoZSBhdmFpbGFibGUgc2NyZWVuIHNpemUuCisKK1RoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2J0YWlucyBjb21wcmVzc2VkIGRhdGEgYnkgY2FsbGluZyBhIGRhdGEgc291cmNlCittYW5hZ2VyLCB3aGljaCB0eXBpY2FsbHkgd2lsbCByZWFkIHRoZSBkYXRhIGZyb20gYSBmaWxlOyBidXQgb3RoZXIgYmVoYXZpb3JzCitjYW4gYmUgb2J0YWluZWQgd2l0aCBhIGN1c3RvbSBzb3VyY2UgbWFuYWdlci4gIERlY29tcHJlc3NlZCBkYXRhIGlzIGRlbGl2ZXJlZAoraW50byBpbi1tZW1vcnkgYnVmZmVycyBwYXNzZWQgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpLgorCitJdCBpcyBwb3NzaWJsZSB0byBhYm9ydCBhbiBpbmNvbXBsZXRlIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uCitieSBjYWxsaW5nIGpwZWdfYWJvcnQoKTsgb3IsIGlmIHlvdSBkbyBub3QgbmVlZCB0byByZXRhaW4gdGhlIEpQRUcgb2JqZWN0LAorc2ltcGx5IHJlbGVhc2UgaXQgYnkgY2FsbGluZyBqcGVnX2Rlc3Ryb3koKS4KKworSlBFRyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvYmplY3RzIGFyZSB0d28gc2VwYXJhdGUgc3RydWN0IHR5cGVzLgorSG93ZXZlciwgdGhleSBzaGFyZSBzb21lIGNvbW1vbiBmaWVsZHMsIGFuZCBjZXJ0YWluIHJvdXRpbmVzIHN1Y2ggYXMKK2pwZWdfZGVzdHJveSgpIGNhbiB3b3JrIG9uIGVpdGhlciB0eXBlIG9mIG9iamVjdC4KKworVGhlIEpQRUcgbGlicmFyeSBoYXMgbm8gc3RhdGljIHZhcmlhYmxlczogYWxsIHN0YXRlIGlzIGluIHRoZSBjb21wcmVzc2lvbgorb3IgZGVjb21wcmVzc2lvbiBvYmplY3QuICBUaGVyZWZvcmUgaXQgaXMgcG9zc2libGUgdG8gcHJvY2VzcyBtdWx0aXBsZQorY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb3BlcmF0aW9ucyBjb25jdXJyZW50bHksIHVzaW5nIG11bHRpcGxlIEpQRUcKK29iamVjdHMuCisKK0JvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYW4gaW5jcmVtZW50YWwgbWVtb3J5LXRvLQorbWVtb3J5IGZhc2hpb24sIGlmIHN1aXRhYmxlIHNvdXJjZS9kZXN0aW5hdGlvbiBtYW5hZ2VycyBhcmUgdXNlZC4gIFNlZSB0aGUKK3NlY3Rpb24gb24gIkkvTyBzdXNwZW5zaW9uIiBmb3IgbW9yZSBkZXRhaWxzLgorCisKK0JBU0lDIExJQlJBUlkgVVNBR0UKKz09PT09PT09PT09PT09PT09PT0KKworRGF0YSBmb3JtYXRzCistLS0tLS0tLS0tLS0KKworQmVmb3JlIGRpdmluZyBpbnRvIHByb2NlZHVyYWwgZGV0YWlscywgaXQgaXMgaGVscGZ1bCB0byB1bmRlcnN0YW5kIHRoZQoraW1hZ2UgZGF0YSBmb3JtYXQgdGhhdCB0aGUgSlBFRyBsaWJyYXJ5IGV4cGVjdHMgb3IgcmV0dXJucy4KKworVGhlIHN0YW5kYXJkIGlucHV0IGltYWdlIGZvcm1hdCBpcyBhIHJlY3Rhbmd1bGFyIGFycmF5IG9mIHBpeGVscywgd2l0aCBlYWNoCitwaXhlbCBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mICJjb21wb25lbnQiIG9yICJzYW1wbGUiIHZhbHVlcyAoY29sb3IKK2NoYW5uZWxzKS4gIFlvdSBtdXN0IHNwZWNpZnkgaG93IG1hbnkgY29tcG9uZW50cyB0aGVyZSBhcmUgYW5kIHRoZSBjb2xvcnNwYWNlCitpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29tcG9uZW50cy4gIE1vc3QgYXBwbGljYXRpb25zIHdpbGwgdXNlIFJHQiBkYXRhCisodGhyZWUgY29tcG9uZW50cyBwZXIgcGl4ZWwpIG9yIGdyYXlzY2FsZSBkYXRhIChvbmUgY29tcG9uZW50IHBlciBwaXhlbCkuCitQTEVBU0UgTk9URSBUSEFUIFJHQiBEQVRBIElTIFRIUkVFIFNBTVBMRVMgUEVSIFBJWEVMLCBHUkFZU0NBTEUgT05MWSBPTkUuCitBIHJlbWFya2FibGUgbnVtYmVyIG9mIHBlb3BsZSBtYW5hZ2UgdG8gbWlzcyB0aGlzLCBvbmx5IHRvIGZpbmQgdGhhdCB0aGVpcgorcHJvZ3JhbXMgZG9uJ3Qgd29yayB3aXRoIGdyYXlzY2FsZSBKUEVHIGZpbGVzLgorCitUaGVyZSBpcyBubyBwcm92aXNpb24gZm9yIGNvbG9ybWFwcGVkIGlucHV0LiAgSlBFRyBmaWxlcyBhcmUgYWx3YXlzIGZ1bGwtY29sb3IKK29yIGZ1bGwgZ3JheXNjYWxlIChvciBzb21ldGltZXMgYW5vdGhlciBjb2xvcnNwYWNlIHN1Y2ggYXMgQ01ZSykuICBZb3UgY2FuCitmZWVkIGluIGEgY29sb3JtYXBwZWQgaW1hZ2UgYnkgZXhwYW5kaW5nIGl0IHRvIGZ1bGwtY29sb3IgZm9ybWF0LiAgSG93ZXZlcgorSlBFRyBvZnRlbiBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsIHdpdGggc291cmNlIGRhdGEgdGhhdCBoYXMgYmVlbiBjb2xvcm1hcHBlZCwKK2JlY2F1c2Ugb2YgZGl0aGVyaW5nIG5vaXNlLiAgVGhpcyBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIEpQRUcgRkFRCithbmQgdGhlIG90aGVyIHJlZmVyZW5jZXMgbWVudGlvbmVkIGluIHRoZSBSRUFETUUgZmlsZS4KKworUGl4ZWxzIGFyZSBzdG9yZWQgYnkgc2NhbmxpbmVzLCB3aXRoIGVhY2ggc2NhbmxpbmUgcnVubmluZyBmcm9tIGxlZnQgdG8KK3JpZ2h0LiAgVGhlIGNvbXBvbmVudCB2YWx1ZXMgZm9yIGVhY2ggcGl4ZWwgYXJlIGFkamFjZW50IGluIHRoZSByb3c7IGZvcgorZXhhbXBsZSwgUixHLEIsUixHLEIsUixHLEIsLi4uIGZvciAyNC1iaXQgUkdCIGNvbG9yLiAgRWFjaCBzY2FubGluZSBpcyBhbgorYXJyYXkgb2YgZGF0YSB0eXBlIEpTQU1QTEUgLS0tIHdoaWNoIGlzIHR5cGljYWxseSAidW5zaWduZWQgY2hhciIsIHVubGVzcworeW91J3ZlIGNoYW5nZWQgam1vcmVjZmcuaC4gIChZb3UgY2FuIGFsc28gY2hhbmdlIHRoZSBSR0IgcGl4ZWwgbGF5b3V0LCBzYXkKK3RvIEIsRyxSIG9yZGVyLCBieSBtb2RpZnlpbmcgam1vcmVjZmcuaC4gIEJ1dCBzZWUgdGhlIHJlc3RyaWN0aW9ucyBsaXN0ZWQgaW4KK3RoYXQgZmlsZSBiZWZvcmUgZG9pbmcgc28uKQorCitBIDItRCBhcnJheSBvZiBwaXhlbHMgaXMgZm9ybWVkIGJ5IG1ha2luZyBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gdGhlIHN0YXJ0cyBvZgorc2NhbmxpbmVzOyBzbyB0aGUgc2NhbmxpbmVzIG5lZWQgbm90IGJlIHBoeXNpY2FsbHkgYWRqYWNlbnQgaW4gbWVtb3J5LiAgRXZlbgoraWYgeW91IHByb2Nlc3MganVzdCBvbmUgc2NhbmxpbmUgYXQgYSB0aW1lLCB5b3UgbXVzdCBtYWtlIGEgb25lLWVsZW1lbnQKK3BvaW50ZXIgYXJyYXkgdG8gY29uZm9ybSB0byB0aGlzIHN0cnVjdHVyZS4gIFBvaW50ZXJzIHRvIEpTQU1QTEUgcm93cyBhcmUgb2YKK3R5cGUgSlNBTVBST1csIGFuZCB0aGUgcG9pbnRlciB0byB0aGUgcG9pbnRlciBhcnJheSBpcyBvZiB0eXBlIEpTQU1QQVJSQVkuCisKK1RoZSBsaWJyYXJ5IGFjY2VwdHMgb3Igc3VwcGxpZXMgb25lIG9yIG1vcmUgY29tcGxldGUgc2NhbmxpbmVzIHBlciBjYWxsLgorSXQgaXMgbm90IHBvc3NpYmxlIHRvIHByb2Nlc3MgcGFydCBvZiBhIHJvdyBhdCBhIHRpbWUuICBTY2FubGluZXMgYXJlIGFsd2F5cworcHJvY2Vzc2VkIHRvcC10by1ib3R0b20uICBZb3UgY2FuIHByb2Nlc3MgYW4gZW50aXJlIGltYWdlIGluIG9uZSBjYWxsIGlmIHlvdQoraGF2ZSBpdCBhbGwgaW4gbWVtb3J5LCBidXQgdXN1YWxseSBpdCdzIHNpbXBsZXN0IHRvIHByb2Nlc3Mgb25lIHNjYW5saW5lIGF0CithIHRpbWUuCisKK0ZvciBiZXN0IHJlc3VsdHMsIHNvdXJjZSBkYXRhIHZhbHVlcyBzaG91bGQgaGF2ZSB0aGUgcHJlY2lzaW9uIHNwZWNpZmllZCBieQorQklUU19JTl9KU0FNUExFIChub3JtYWxseSA4IGJpdHMpLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgY2hvb3NlIHRvIGNvbXByZXNzCitkYXRhIHRoYXQncyBvbmx5IDYgYml0cy9jaGFubmVsLCB5b3Ugc2hvdWxkIGxlZnQtanVzdGlmeSBlYWNoIHZhbHVlIGluIGEKK2J5dGUgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGNvbXByZXNzb3IuICBJZiB5b3UgbmVlZCB0byBjb21wcmVzcyBkYXRhCit0aGF0IGhhcyBtb3JlIHRoYW4gOCBiaXRzL2NoYW5uZWwsIGNvbXBpbGUgd2l0aCBCSVRTX0lOX0pTQU1QTEUgPSAxMi4KKyhTZWUgIkxpYnJhcnkgY29tcGlsZS10aW1lIG9wdGlvbnMiLCBsYXRlci4pCisKKworVGhlIGRhdGEgZm9ybWF0IHJldHVybmVkIGJ5IHRoZSBkZWNvbXByZXNzb3IgaXMgdGhlIHNhbWUgaW4gYWxsIGRldGFpbHMsCitleGNlcHQgdGhhdCBjb2xvcm1hcHBlZCBvdXRwdXQgaXMgc3VwcG9ydGVkLiAgKEFnYWluLCBhIEpQRUcgZmlsZSBpcyBuZXZlcgorY29sb3JtYXBwZWQuICBCdXQgeW91IGNhbiBhc2sgdGhlIGRlY29tcHJlc3NvciB0byBwZXJmb3JtIG9uLXRoZS1mbHkgY29sb3IKK3F1YW50aXphdGlvbiB0byBkZWxpdmVyIGNvbG9ybWFwcGVkIG91dHB1dC4pICBJZiB5b3UgcmVxdWVzdCBjb2xvcm1hcHBlZAorb3V0cHV0IHRoZW4gdGhlIHJldHVybmVkIGRhdGEgYXJyYXkgY29udGFpbnMgYSBzaW5nbGUgSlNBTVBMRSBwZXIgcGl4ZWw7CitpdHMgdmFsdWUgaXMgYW4gaW5kZXggaW50byBhIGNvbG9yIG1hcC4gIFRoZSBjb2xvciBtYXAgaXMgcmVwcmVzZW50ZWQgYXMKK2EgMi1EIEpTQU1QQVJSQVkgaW4gd2hpY2ggZWFjaCByb3cgaG9sZHMgdGhlIHZhbHVlcyBvZiBvbmUgY29sb3IgY29tcG9uZW50LAordGhhdCBpcywgY29sb3JtYXBbaV1bal0gaXMgdGhlIHZhbHVlIG9mIHRoZSBpJ3RoIGNvbG9yIGNvbXBvbmVudCBmb3IgcGl4ZWwKK3ZhbHVlIChtYXAgaW5kZXgpIGouICBOb3RlIHRoYXQgc2luY2UgdGhlIGNvbG9ybWFwIGluZGV4ZXMgYXJlIHN0b3JlZCBpbgorSlNBTVBMRXMsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2xvcnMgaXMgbGltaXRlZCBieSB0aGUgc2l6ZSBvZiBKU0FNUExFCisoaWUsIGF0IG1vc3QgMjU2IGNvbG9ycyBmb3IgYW4gOC1iaXQgSlBFRyBsaWJyYXJ5KS4KKworCitDb21wcmVzc2lvbiBkZXRhaWxzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUgd2UgcmV2aXNpdCB0aGUgSlBFRyBjb21wcmVzc2lvbiBvdXRsaW5lIGdpdmVuIGluIHRoZSBvdmVydmlldy4KKworMS4gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4KKworQSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCBpcyBhICJzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QiLiAgKEl0IGFsc28gaGFzCithIGJ1bmNoIG9mIHN1YnNpZGlhcnkgc3RydWN0dXJlcyB3aGljaCBhcmUgYWxsb2NhdGVkIHZpYSBtYWxsb2MoKSwgYnV0IHRoZQorYXBwbGljYXRpb24gZG9lc24ndCBjb250cm9sIHRob3NlIGRpcmVjdGx5LikgIFRoaXMgc3RydWN0IGNhbiBiZSBqdXN0IGEgbG9jYWwKK3ZhcmlhYmxlIGluIHRoZSBjYWxsaW5nIHJvdXRpbmUsIGlmIGEgc2luZ2xlIHJvdXRpbmUgaXMgZ29pbmcgdG8gZXhlY3V0ZSB0aGUKK3dob2xlIEpQRUcgY29tcHJlc3Npb24gc2VxdWVuY2UuICBPdGhlcndpc2UgaXQgY2FuIGJlIHN0YXRpYyBvciBhbGxvY2F0ZWQKK2Zyb20gbWFsbG9jKCkuCisKK1lvdSB3aWxsIGFsc28gbmVlZCBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBKUEVHIGVycm9yIGhhbmRsZXIuICBUaGUgcGFydAorb2YgdGhpcyB0aGF0IHRoZSBsaWJyYXJ5IGNhcmVzIGFib3V0IGlzIGEgInN0cnVjdCBqcGVnX2Vycm9yX21nciIuICBJZiB5b3UKK2FyZSBwcm92aWRpbmcgeW91ciBvd24gZXJyb3IgaGFuZGxlciwgeW91J2xsIHR5cGljYWxseSB3YW50IHRvIGVtYmVkIHRoZQoranBlZ19lcnJvcl9tZ3Igc3RydWN0IGluIGEgbGFyZ2VyIHN0cnVjdHVyZTsgdGhpcyBpcyBkaXNjdXNzZWQgbGF0ZXIgdW5kZXIKKyJFcnJvciBoYW5kbGluZyIuICBGb3Igbm93IHdlJ2xsIGFzc3VtZSB5b3UgYXJlIGp1c3QgdXNpbmcgdGhlIGRlZmF1bHQgZXJyb3IKK2hhbmRsZXIuICBUaGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIHdpbGwgcHJpbnQgSlBFRyBlcnJvci93YXJuaW5nIG1lc3NhZ2VzCitvbiBzdGRlcnIsIGFuZCBpdCB3aWxsIGNhbGwgZXhpdCgpIGlmIGEgZmF0YWwgZXJyb3Igb2NjdXJzLgorCitZb3UgbXVzdCBpbml0aWFsaXplIHRoZSBlcnJvciBoYW5kbGVyIHN0cnVjdHVyZSwgc3RvcmUgYSBwb2ludGVyIHRvIGl0IGludG8KK3RoZSBKUEVHIG9iamVjdCdzICJlcnIiIGZpZWxkLCBhbmQgdGhlbiBjYWxsIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgdG8KK2luaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIEpQRUcgb2JqZWN0LgorCitUeXBpY2FsIGNvZGUgZm9yIHRoaXMgc3RlcCwgaWYgeW91IGFyZSB1c2luZyB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyLCBpcworCisJc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOworCXN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworCS4uLgorCWNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKKwlqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOworCitqcGVnX2NyZWF0ZV9jb21wcmVzcyBhbGxvY2F0ZXMgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5LCBzbyBpdCBjb3VsZCBmYWlsCitpZiB5b3UgYXJlIG91dCBvZiBtZW1vcnkuICBJbiB0aGF0IGNhc2UgaXQgd2lsbCBleGl0IHZpYSB0aGUgZXJyb3IgaGFuZGxlcjsKK3RoYXQncyB3aHkgdGhlIGVycm9yIGhhbmRsZXIgbXVzdCBiZSBpbml0aWFsaXplZCBmaXJzdC4KKworCisyLiBTcGVjaWZ5IHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSAoZWcsIGEgZmlsZSkuCisKK0FzIHByZXZpb3VzbHkgbWVudGlvbmVkLCB0aGUgSlBFRyBsaWJyYXJ5IGRlbGl2ZXJzIGNvbXByZXNzZWQgZGF0YSB0byBhCisiZGF0YSBkZXN0aW5hdGlvbiIgbW9kdWxlLiAgVGhlIGxpYnJhcnkgaW5jbHVkZXMgb25lIGRhdGEgZGVzdGluYXRpb24KK21vZHVsZSB3aGljaCBrbm93cyBob3cgdG8gd3JpdGUgdG8gYSBzdGRpbyBzdHJlYW0uICBZb3UgY2FuIHVzZSB5b3VyIG93bgorZGVzdGluYXRpb24gbW9kdWxlIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBlbHNlLCBhcyBkaXNjdXNzZWQgbGF0ZXIuCisKK0lmIHlvdSB1c2UgdGhlIHN0YW5kYXJkIGRlc3RpbmF0aW9uIG1vZHVsZSwgeW91IG11c3Qgb3BlbiB0aGUgdGFyZ2V0IHN0ZGlvCitzdHJlYW0gYmVmb3JlaGFuZC4gIFR5cGljYWwgY29kZSBmb3IgdGhpcyBzdGVwIGxvb2tzIGxpa2U6CisKKwlGSUxFICogb3V0ZmlsZTsKKwkuLi4KKwlpZiAoKG91dGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIikpID09IE5VTEwpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisJICAgIGV4aXQoMSk7CisJfQorCWpwZWdfc3RkaW9fZGVzdCgmY2luZm8sIG91dGZpbGUpOworCit3aGVyZSB0aGUgbGFzdCBsaW5lIGludm9rZXMgdGhlIHN0YW5kYXJkIGRlc3RpbmF0aW9uIG1vZHVsZS4KKworV0FSTklORzogaXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgYmluYXJ5IGNvbXByZXNzZWQgZGF0YSBiZSBkZWxpdmVyZWQgdG8gdGhlCitvdXRwdXQgZmlsZSB1bmNoYW5nZWQuICBPbiBub24tVW5peCBzeXN0ZW1zIHRoZSBzdGRpbyBsaWJyYXJ5IG1heSBwZXJmb3JtCituZXdsaW5lIHRyYW5zbGF0aW9uIG9yIG90aGVyd2lzZSBjb3JydXB0IGJpbmFyeSBkYXRhLiAgVG8gc3VwcHJlc3MgdGhpcworYmVoYXZpb3IsIHlvdSBtYXkgbmVlZCB0byB1c2UgYSAiYiIgb3B0aW9uIHRvIGZvcGVuIChhcyBzaG93biBhYm92ZSksIG9yIHVzZQorc2V0bW9kZSgpIG9yIGFub3RoZXIgcm91dGluZSB0byBwdXQgdGhlIHN0ZGlvIHN0cmVhbSBpbiBiaW5hcnkgbW9kZS4gIFNlZQorY2pwZWcuYyBhbmQgZGpwZWcuYyBmb3IgY29kZSB0aGF0IGhhcyBiZWVuIGZvdW5kIHRvIHdvcmsgb24gbWFueSBzeXN0ZW1zLgorCitZb3UgY2FuIHNlbGVjdCB0aGUgZGF0YSBkZXN0aW5hdGlvbiBhZnRlciBzZXR0aW5nIG90aGVyIHBhcmFtZXRlcnMgKHN0ZXAgMyksCitpZiB0aGF0J3MgbW9yZSBjb252ZW5pZW50LiAgWW91IG1heSBub3QgY2hhbmdlIHRoZSBkZXN0aW5hdGlvbiBiZXR3ZWVuCitjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQganBlZ19maW5pc2hfY29tcHJlc3MoKS4KKworCiszLiBTZXQgcGFyYW1ldGVycyBmb3IgY29tcHJlc3Npb24sIGluY2x1ZGluZyBpbWFnZSBzaXplICYgY29sb3JzcGFjZS4KKworWW91IG11c3Qgc3VwcGx5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzb3VyY2UgaW1hZ2UgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nCitmaWVsZHMgaW4gdGhlIEpQRUcgb2JqZWN0IChjaW5mbyBzdHJ1Y3R1cmUpOgorCisJaW1hZ2Vfd2lkdGgJCVdpZHRoIG9mIGltYWdlLCBpbiBwaXhlbHMKKwlpbWFnZV9oZWlnaHQJCUhlaWdodCBvZiBpbWFnZSwgaW4gcGl4ZWxzCisJaW5wdXRfY29tcG9uZW50cwlOdW1iZXIgb2YgY29sb3IgY2hhbm5lbHMgKHNhbXBsZXMgcGVyIHBpeGVsKQorCWluX2NvbG9yX3NwYWNlCQlDb2xvciBzcGFjZSBvZiBzb3VyY2UgaW1hZ2UKKworVGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlLCBob3BlZnVsbHksIG9idmlvdXMuICBKUEVHIHN1cHBvcnRzIGltYWdlIGRpbWVuc2lvbnMKK29mIDEgdG8gNjRLIHBpeGVscyBpbiBlaXRoZXIgZGlyZWN0aW9uLiAgVGhlIGlucHV0IGNvbG9yIHNwYWNlIGlzIHR5cGljYWxseQorUkdCIG9yIGdyYXlzY2FsZSwgYW5kIGlucHV0X2NvbXBvbmVudHMgaXMgMyBvciAxIGFjY29yZGluZ2x5LiAgKFNlZSAiU3BlY2lhbAorY29sb3Igc3BhY2VzIiwgbGF0ZXIsIGZvciBtb3JlIGluZm8uKSAgVGhlIGluX2NvbG9yX3NwYWNlIGZpZWxkIG11c3QgYmUKK2Fzc2lnbmVkIG9uZSBvZiB0aGUgSl9DT0xPUl9TUEFDRSBlbnVtIGNvbnN0YW50cywgdHlwaWNhbGx5IEpDU19SR0Igb3IKK0pDU19HUkFZU0NBTEUuCisKK0pQRUcgaGFzIGEgbGFyZ2UgbnVtYmVyIG9mIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZQoraW1hZ2UgaXMgZW5jb2RlZC4gIE1vc3QgYXBwbGljYXRpb25zIGRvbid0IG5lZWQgb3Igd2FudCB0byBrbm93IGFib3V0IGFsbAordGhlc2UgcGFyYW1ldGVycy4gIFlvdSBjYW4gc2V0IGFsbCB0aGUgcGFyYW1ldGVycyB0byByZWFzb25hYmxlIGRlZmF1bHRzIGJ5CitjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCk7IHRoZW4sIGlmIHRoZXJlIGFyZSBwYXJ0aWN1bGFyIHZhbHVlcyB5b3Ugd2FudAordG8gY2hhbmdlLCB5b3UgY2FuIGRvIHNvIGFmdGVyIHRoYXQuICBUaGUgIkNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24iCitzZWN0aW9uIHRlbGxzIGFib3V0IGFsbCB0aGUgcGFyYW1ldGVycy4KKworWW91IG11c3Qgc2V0IGluX2NvbG9yX3NwYWNlIGNvcnJlY3RseSBiZWZvcmUgY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpLAorYmVjYXVzZSB0aGUgZGVmYXVsdHMgZGVwZW5kIG9uIHRoZSBzb3VyY2UgaW1hZ2UgY29sb3JzcGFjZS4gIEhvd2V2ZXIgdGhlCitvdGhlciB0aHJlZSBzb3VyY2UgaW1hZ2UgcGFyYW1ldGVycyBuZWVkIG5vdCBiZSB2YWxpZCB1bnRpbCB5b3UgY2FsbAoranBlZ19zdGFydF9jb21wcmVzcygpLiAgVGhlcmUncyBubyBoYXJtIGluIGNhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKSBtb3JlCit0aGFuIG9uY2UsIGlmIHRoYXQgaGFwcGVucyB0byBiZSBjb252ZW5pZW50LgorCitUeXBpY2FsIGNvZGUgZm9yIGEgMjQtYml0IFJHQiBzb3VyY2UgaW1hZ2UgaXMKKworCWNpbmZvLmltYWdlX3dpZHRoID0gV2lkdGg7IAkvKiBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0LCBpbiBwaXhlbHMgKi8KKwljaW5mby5pbWFnZV9oZWlnaHQgPSBIZWlnaHQ7CisJY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IDM7CS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBwZXIgcGl4ZWwgKi8KKwljaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7IC8qIGNvbG9yc3BhY2Ugb2YgaW5wdXQgaW1hZ2UgKi8KKworCWpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisJLyogTWFrZSBvcHRpb25hbCBwYXJhbWV0ZXIgc2V0dGluZ3MgaGVyZSAqLworCisKKzQuIGpwZWdfc3RhcnRfY29tcHJlc3MoLi4uKTsKKworQWZ0ZXIgeW91IGhhdmUgZXN0YWJsaXNoZWQgdGhlIGRhdGEgZGVzdGluYXRpb24gYW5kIHNldCBhbGwgdGhlIG5lY2Vzc2FyeQorc291cmNlIGltYWdlIGluZm8gYW5kIG90aGVyIHBhcmFtZXRlcnMsIGNhbGwganBlZ19zdGFydF9jb21wcmVzcygpIHRvIGJlZ2luCithIGNvbXByZXNzaW9uIGN5Y2xlLiAgVGhpcyB3aWxsIGluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGUsIGFsbG9jYXRlIHdvcmtpbmcKK3N0b3JhZ2UsIGFuZCBlbWl0IHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgdGhlIEpQRUcgZGF0YXN0cmVhbSBoZWFkZXIuCisKK1R5cGljYWwgY29kZToKKworCWpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKworVGhlICJUUlVFIiBwYXJhbWV0ZXIgZW5zdXJlcyB0aGF0IGEgY29tcGxldGUgSlBFRyBpbnRlcmNoYW5nZSBkYXRhc3RyZWFtCit3aWxsIGJlIHdyaXR0ZW4uICBUaGlzIGlzIGFwcHJvcHJpYXRlIGluIG1vc3QgY2FzZXMuICBJZiB5b3UgdGhpbmsgeW91IG1pZ2h0Cit3YW50IHRvIHVzZSBhbiBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtLCByZWFkIHRoZSBzZWN0aW9uIG9uIGFiYnJldmlhdGVkCitkYXRhc3RyZWFtcywgYmVsb3cuCisKK09uY2UgeW91IGhhdmUgY2FsbGVkIGpwZWdfc3RhcnRfY29tcHJlc3MoKSwgeW91IG1heSBub3QgYWx0ZXIgYW55IEpQRUcKK3BhcmFtZXRlcnMgb3Igb3RoZXIgZmllbGRzIG9mIHRoZSBKUEVHIG9iamVjdCB1bnRpbCB5b3UgaGF2ZSBjb21wbGV0ZWQKK3RoZSBjb21wcmVzc2lvbiBjeWNsZS4KKworCis1LiB3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgd3JpdHRlbikKKwlqcGVnX3dyaXRlX3NjYW5saW5lcyguLi4pOworCitOb3cgd3JpdGUgYWxsIHRoZSByZXF1aXJlZCBpbWFnZSBkYXRhIGJ5IGNhbGxpbmcganBlZ193cml0ZV9zY2FubGluZXMoKQorb25lIG9yIG1vcmUgdGltZXMuICBZb3UgY2FuIHBhc3Mgb25lIG9yIG1vcmUgc2NhbmxpbmVzIGluIGVhY2ggY2FsbCwgdXAKK3RvIHRoZSB0b3RhbCBpbWFnZSBoZWlnaHQuICBJbiBtb3N0IGFwcGxpY2F0aW9ucyBpdCBpcyBjb252ZW5pZW50IHRvIHBhc3MKK2p1c3Qgb25lIG9yIGEgZmV3IHNjYW5saW5lcyBhdCBhIHRpbWUuICBUaGUgZXhwZWN0ZWQgZm9ybWF0IGZvciB0aGUgcGFzc2VkCitkYXRhIGlzIGRpc2N1c3NlZCB1bmRlciAiRGF0YSBmb3JtYXRzIiwgYWJvdmUuCisKK0ltYWdlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gdG9wLXRvLWJvdHRvbSBzY2FubGluZSBvcmRlci4gIFRoZSBKUEVHIHNwZWMKK2NvbnRhaW5zIHNvbWUgd2Vhc2VsIHdvcmRpbmcgYWJvdXQgaG93IHRvcCBhbmQgYm90dG9tIGFyZSBhcHBsaWNhdGlvbi1kZWZpbmVkCit0ZXJtcyAoYSBjdXJpb3VzIGludGVycHJldGF0aW9uIG9mIHRoZSBFbmdsaXNoIGxhbmd1YWdlLi4uKSBidXQgaWYgeW91IHdhbnQKK3lvdXIgZmlsZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV2ZXJ5b25lIGVsc2UncywgeW91IFdJTEwgdXNlIHRvcC10by1ib3R0b20KK29yZGVyLiAgSWYgdGhlIHNvdXJjZSBkYXRhIG11c3QgYmUgcmVhZCBpbiBib3R0b20tdG8tdG9wIG9yZGVyLCB5b3UgY2FuIHVzZQordGhlIEpQRUcgbGlicmFyeSdzIHZpcnR1YWwgYXJyYXkgbWVjaGFuaXNtIHRvIGludmVydCB0aGUgZGF0YSBlZmZpY2llbnRseS4KK0V4YW1wbGVzIG9mIHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gY2pwZWcuCisKK1RoZSBsaWJyYXJ5IG1haW50YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIHdyaXR0ZW4gc28gZmFyCitpbiB0aGUgbmV4dF9zY2FubGluZSBmaWVsZCBvZiB0aGUgSlBFRyBvYmplY3QuICBVc3VhbGx5IHlvdSBjYW4ganVzdCB1c2UKK3RoaXMgdmFyaWFibGUgYXMgdGhlIGxvb3AgY291bnRlciwgc28gdGhhdCB0aGUgbG9vcCB0ZXN0IGxvb2tzIGxpa2UKKyJ3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkiLgorCitDb2RlIGZvciB0aGlzIHN0ZXAgZGVwZW5kcyBoZWF2aWx5IG9uIHRoZSB3YXkgdGhhdCB5b3Ugc3RvcmUgdGhlIHNvdXJjZSBkYXRhLgorZXhhbXBsZS5jIHNob3dzIHRoZSBmb2xsb3dpbmcgY29kZSBmb3IgdGhlIGNhc2Ugb2YgYSBmdWxsLXNpemUgMi1EIHNvdXJjZQorYXJyYXkgY29udGFpbmluZyAzLWJ5dGUgUkdCIHBpeGVsczoKKworCUpTQU1QUk9XIHJvd19wb2ludGVyWzFdOwkvKiBwb2ludGVyIHRvIGEgc2luZ2xlIHJvdyAqLworCWludCByb3dfc3RyaWRlOwkJCS8qIHBoeXNpY2FsIHJvdyB3aWR0aCBpbiBidWZmZXIgKi8KKworCXJvd19zdHJpZGUgPSBpbWFnZV93aWR0aCAqIDM7CS8qIEpTQU1QTEVzIHBlciByb3cgaW4gaW1hZ2VfYnVmZmVyICovCisKKwl3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgeworCSAgICByb3dfcG9pbnRlclswXSA9ICYgaW1hZ2VfYnVmZmVyW2NpbmZvLm5leHRfc2NhbmxpbmUgKiByb3dfc3RyaWRlXTsKKwkgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCByb3dfcG9pbnRlciwgMSk7CisJfQorCitqcGVnX3dyaXRlX3NjYW5saW5lcygpIHJldHVybnMgdGhlIG51bWJlciBvZiBzY2FubGluZXMgYWN0dWFsbHkgd3JpdHRlbi4KK1RoaXMgd2lsbCBub3JtYWxseSBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIHBhc3NlZCBpbiwgc28geW91IGNhbiB1c3VhbGx5CitpZ25vcmUgdGhlIHJldHVybiB2YWx1ZS4gIEl0IGlzIGRpZmZlcmVudCBpbiBqdXN0IHR3byBjYXNlczoKKyAgKiBJZiB5b3UgdHJ5IHRvIHdyaXRlIG1vcmUgc2NhbmxpbmVzIHRoYW4gdGhlIGRlY2xhcmVkIGltYWdlIGhlaWdodCwKKyAgICB0aGUgYWRkaXRpb25hbCBzY2FubGluZXMgYXJlIGlnbm9yZWQuCisgICogSWYgeW91IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyLCBvdXRwdXQgYnVmZmVyIG92ZXJydW4KKyAgICB3aWxsIGNhdXNlIHRoZSBjb21wcmVzc29yIHRvIHJldHVybiBiZWZvcmUgYWNjZXB0aW5nIGFsbCB0aGUgcGFzc2VkIGxpbmVzLgorICAgIFRoaXMgZmVhdHVyZSBpcyBkaXNjdXNzZWQgdW5kZXIgIkkvTyBzdXNwZW5zaW9uIiwgYmVsb3cuICBUaGUgbm9ybWFsCisgICAgc3RkaW8gZGVzdGluYXRpb24gbWFuYWdlciB3aWxsIE5PVCBjYXVzZSB0aGlzIHRvIGhhcHBlbi4KK0luIGFueSBjYXNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mCituZXh0X3NjYW5saW5lLgorCisKKzYuIGpwZWdfZmluaXNoX2NvbXByZXNzKC4uLik7CisKK0FmdGVyIGFsbCB0aGUgaW1hZ2UgZGF0YSBoYXMgYmVlbiB3cml0dGVuLCBjYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgdG8KK2NvbXBsZXRlIHRoZSBjb21wcmVzc2lvbiBjeWNsZS4gIFRoaXMgc3RlcCBpcyBFU1NFTlRJQUwgdG8gZW5zdXJlIHRoYXQgdGhlCitsYXN0IGJ1ZmZlcmxvYWQgb2YgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBkYXRhIGRlc3RpbmF0aW9uLgoranBlZ19maW5pc2hfY29tcHJlc3MoKSBhbHNvIHJlbGVhc2VzIHdvcmtpbmcgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgSlBFRworb2JqZWN0LgorCitUeXBpY2FsIGNvZGU6CisKKwlqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOworCitJZiB1c2luZyB0aGUgc3RkaW8gZGVzdGluYXRpb24gbWFuYWdlciwgZG9uJ3QgZm9yZ2V0IHRvIGNsb3NlIHRoZSBvdXRwdXQKK3N0ZGlvIHN0cmVhbSAoaWYgbmVjZXNzYXJ5KSBhZnRlcndhcmRzLgorCitJZiB5b3UgaGF2ZSByZXF1ZXN0ZWQgYSBtdWx0aS1wYXNzIG9wZXJhdGluZyBtb2RlLCBzdWNoIGFzIEh1ZmZtYW4gY29kZQorb3B0aW1pemF0aW9uLCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHdpbGwgcGVyZm9ybSB0aGUgYWRkaXRpb25hbCBwYXNzZXMgdXNpbmcKK2RhdGEgYnVmZmVyZWQgYnkgdGhlIGZpcnN0IHBhc3MuICBJbiB0aGlzIGNhc2UganBlZ19maW5pc2hfY29tcHJlc3MoKSBtYXkgdGFrZQorcXVpdGUgYSB3aGlsZSB0byBjb21wbGV0ZS4gIFdpdGggdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycywgdGhpcyB3aWxsCitub3QgaGFwcGVuLgorCitJdCBpcyBhbiBlcnJvciB0byBjYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgYmVmb3JlIHdyaXRpbmcgdGhlIG5lY2Vzc2FyeQordG90YWwgbnVtYmVyIG9mIHNjYW5saW5lcy4gIElmIHlvdSB3aXNoIHRvIGFib3J0IGNvbXByZXNzaW9uLCBjYWxsCitqcGVnX2Fib3J0KCkgYXMgZGlzY3Vzc2VkIGJlbG93LgorCitBZnRlciBjb21wbGV0aW5nIGEgY29tcHJlc3Npb24gY3ljbGUsIHlvdSBtYXkgZGlzcG9zZSBvZiB0aGUgSlBFRyBvYmplY3QKK2FzIGRpc2N1c3NlZCBuZXh0LCBvciB5b3UgbWF5IHVzZSBpdCB0byBjb21wcmVzcyBhbm90aGVyIGltYWdlLiAgSW4gdGhhdCBjYXNlCityZXR1cm4gdG8gc3RlcCAyLCAzLCBvciA0IGFzIGFwcHJvcHJpYXRlLiAgSWYgeW91IGRvIG5vdCBjaGFuZ2UgdGhlCitkZXN0aW5hdGlvbiBtYW5hZ2VyLCB0aGUgbmV3IGRhdGFzdHJlYW0gd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBzYW1lIHRhcmdldC4KK0lmIHlvdSBkbyBub3QgY2hhbmdlIGFueSBKUEVHIHBhcmFtZXRlcnMsIHRoZSBuZXcgZGF0YXN0cmVhbSB3aWxsIGJlIHdyaXR0ZW4KK3dpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBiZWZvcmUuICBOb3RlIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIGlucHV0IGltYWdlCitkaW1lbnNpb25zIGZyZWVseSBiZXR3ZWVuIGN5Y2xlcywgYnV0IGlmIHlvdSBjaGFuZ2UgdGhlIGlucHV0IGNvbG9yc3BhY2UsIHlvdQorc2hvdWxkIGNhbGwganBlZ19zZXRfZGVmYXVsdHMoKSB0byBhZGp1c3QgZm9yIHRoZSBuZXcgY29sb3JzcGFjZTsgYW5kIHRoZW4KK3lvdSdsbCBuZWVkIHRvIHJlcGVhdCBhbGwgb2Ygc3RlcCAzLgorCisKKzcuIFJlbGVhc2UgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LgorCitXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QsIGRlc3Ryb3kgaXQgYnkgY2FsbGluZworanBlZ19kZXN0cm95X2NvbXByZXNzKCkuICBUaGlzIHdpbGwgZnJlZSBhbGwgc3Vic2lkaWFyeSBtZW1vcnkgKHJlZ2FyZGxlc3Mgb2YKK3RoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgb2JqZWN0KS4gIE9yIHlvdSBjYW4gY2FsbCBqcGVnX2Rlc3Ryb3koKSwgd2hpY2gKK3dvcmtzIGZvciBlaXRoZXIgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvYmplY3RzIC0tLSB0aGlzIG1heSBiZSBtb3JlCitjb252ZW5pZW50IGlmIHlvdSBhcmUgc2hhcmluZyBjb2RlIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK2Nhc2VzLiAgKEFjdHVhbGx5LCB0aGVzZSByb3V0aW5lcyBhcmUgZXF1aXZhbGVudCBleGNlcHQgZm9yIHRoZSBkZWNsYXJlZCB0eXBlCitvZiB0aGUgcGFzc2VkIHBvaW50ZXIuICBUbyBhdm9pZCBncmlwZXMgZnJvbSBBTlNJIEMgY29tcGlsZXJzLCBqcGVnX2Rlc3Ryb3koKQorc2hvdWxkIGJlIHBhc3NlZCBhIGpfY29tbW9uX3B0ci4pCisKK0lmIHlvdSBhbGxvY2F0ZWQgdGhlIGpwZWdfY29tcHJlc3Nfc3RydWN0IHN0cnVjdHVyZSBmcm9tIG1hbGxvYygpLCBmcmVlaW5nCitpdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IC0tLSBqcGVnX2Rlc3Ryb3koKSB3b24ndC4gIERpdHRvIGZvciB0aGUgZXJyb3IKK2hhbmRsZXIgc3RydWN0dXJlLgorCitUeXBpY2FsIGNvZGU6CisKKwlqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKKworCis4LiBBYm9ydGluZy4KKworSWYgeW91IGRlY2lkZSB0byBhYm9ydCBhIGNvbXByZXNzaW9uIGN5Y2xlIGJlZm9yZSBmaW5pc2hpbmcsIHlvdSBjYW4gY2xlYW4gdXAKK2luIGVpdGhlciBvZiB0d28gd2F5czoKKworKiBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgSlBFRyBvYmplY3QgYW55IG1vcmUsIGp1c3QgY2FsbAorICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoKSBvciBqcGVnX2Rlc3Ryb3koKSB0byByZWxlYXNlIG1lbW9yeS4gIFRoaXMgaXMKKyAgbGVnaXRpbWF0ZSBhdCBhbnkgcG9pbnQgYWZ0ZXIgY2FsbGluZyBqcGVnX2NyZWF0ZV9jb21wcmVzcygpIC0tLSBpbiBmYWN0LAorICBpdCdzIHNhZmUgZXZlbiBpZiBqcGVnX2NyZWF0ZV9jb21wcmVzcygpIGZhaWxzLgorCisqIElmIHlvdSB3YW50IHRvIHJlLXVzZSB0aGUgSlBFRyBvYmplY3QsIGNhbGwganBlZ19hYm9ydF9jb21wcmVzcygpLCBvciBjYWxsCisgIGpwZWdfYWJvcnQoKSB3aGljaCB3b3JrcyBvbiBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9iamVjdHMuCisgIFRoaXMgd2lsbCByZXR1cm4gdGhlIG9iamVjdCB0byBhbiBpZGxlIHN0YXRlLCByZWxlYXNpbmcgYW55IHdvcmtpbmcgbWVtb3J5LgorICBqcGVnX2Fib3J0KCkgaXMgYWxsb3dlZCBhdCBhbnkgdGltZSBhZnRlciBzdWNjZXNzZnVsIG9iamVjdCBjcmVhdGlvbi4KKworTm90ZSB0aGF0IGNsZWFuaW5nIHVwIHRoZSBkYXRhIGRlc3RpbmF0aW9uLCBpZiByZXF1aXJlZCwgaXMgeW91cgorcmVzcG9uc2liaWxpdHk7IG5laXRoZXIgb2YgdGhlc2Ugcm91dGluZXMgd2lsbCBjYWxsIHRlcm1fZGVzdGluYXRpb24oKS4KKyhTZWUgIkNvbXByZXNzZWQgZGF0YSBoYW5kbGluZyIsIGJlbG93LCBmb3IgbW9yZSBhYm91dCB0aGF0LikKKworanBlZ19kZXN0cm95KCkgYW5kIGpwZWdfYWJvcnQoKSBhcmUgdGhlIG9ubHkgc2FmZSBjYWxscyB0byBtYWtlIG9uIGEgSlBFRworb2JqZWN0IHRoYXQgaGFzIHJlcG9ydGVkIGFuIGVycm9yIGJ5IGNhbGxpbmcgZXJyb3JfZXhpdCAoc2VlICJFcnJvciBoYW5kbGluZyIKK2ZvciBtb3JlIGluZm8pLiAgVGhlIGludGVybmFsIHN0YXRlIG9mIHN1Y2ggYW4gb2JqZWN0IGlzIGxpa2VseSB0byBiZSBvdXQgb2YKK3doYWNrLiAgRWl0aGVyIG9mIHRoZXNlIHR3byByb3V0aW5lcyB3aWxsIHJldHVybiB0aGUgb2JqZWN0IHRvIGEga25vd24gc3RhdGUuCisKKworRGVjb21wcmVzc2lvbiBkZXRhaWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSB3ZSByZXZpc2l0IHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb3V0bGluZSBnaXZlbiBpbiB0aGUgb3ZlcnZpZXcuCisKKzEuIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdC4KKworVGhpcyBpcyBqdXN0IGxpa2UgaW5pdGlhbGl6YXRpb24gZm9yIGNvbXByZXNzaW9uLCBhcyBkaXNjdXNzZWQgYWJvdmUsCitleGNlcHQgdGhhdCB0aGUgb2JqZWN0IGlzIGEgInN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IiBhbmQgeW91CitjYWxsIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoKS4gIEVycm9yIGhhbmRsaW5nIGlzIGV4YWN0bHkgdGhlIHNhbWUuCisKK1R5cGljYWwgY29kZToKKworCXN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOworCXN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworCS4uLgorCWNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKKwlqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7CisKKyhCb3RoIGhlcmUgYW5kIGluIHRoZSBJSkcgY29kZSwgd2UgdXN1YWxseSB1c2UgdmFyaWFibGUgbmFtZSAiY2luZm8iIGZvcgorYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvYmplY3RzLikKKworCisyLiBTcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAoZWcsIGEgZmlsZSkuCisKK0FzIHByZXZpb3VzbHkgbWVudGlvbmVkLCB0aGUgSlBFRyBsaWJyYXJ5IHJlYWRzIGNvbXByZXNzZWQgZGF0YSBmcm9tIGEgImRhdGEKK3NvdXJjZSIgbW9kdWxlLiAgVGhlIGxpYnJhcnkgaW5jbHVkZXMgb25lIGRhdGEgc291cmNlIG1vZHVsZSB3aGljaCBrbm93cyBob3cKK3RvIHJlYWQgZnJvbSBhIHN0ZGlvIHN0cmVhbS4gIFlvdSBjYW4gdXNlIHlvdXIgb3duIHNvdXJjZSBtb2R1bGUgaWYgeW91IHdhbnQKK3RvIGRvIHNvbWV0aGluZyBlbHNlLCBhcyBkaXNjdXNzZWQgbGF0ZXIuCisKK0lmIHlvdSB1c2UgdGhlIHN0YW5kYXJkIHNvdXJjZSBtb2R1bGUsIHlvdSBtdXN0IG9wZW4gdGhlIHNvdXJjZSBzdGRpbyBzdHJlYW0KK2JlZm9yZWhhbmQuICBUeXBpY2FsIGNvZGUgZm9yIHRoaXMgc3RlcCBsb29rcyBsaWtlOgorCisJRklMRSAqIGluZmlsZTsKKwkuLi4KKwlpZiAoKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgPT0gTlVMTCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKwkgICAgZXhpdCgxKTsKKwl9CisJanBlZ19zdGRpb19zcmMoJmNpbmZvLCBpbmZpbGUpOworCit3aGVyZSB0aGUgbGFzdCBsaW5lIGludm9rZXMgdGhlIHN0YW5kYXJkIHNvdXJjZSBtb2R1bGUuCisKK1dBUk5JTkc6IGl0IGlzIGNyaXRpY2FsIHRoYXQgdGhlIGJpbmFyeSBjb21wcmVzc2VkIGRhdGEgYmUgcmVhZCB1bmNoYW5nZWQuCitPbiBub24tVW5peCBzeXN0ZW1zIHRoZSBzdGRpbyBsaWJyYXJ5IG1heSBwZXJmb3JtIG5ld2xpbmUgdHJhbnNsYXRpb24gb3IKK290aGVyd2lzZSBjb3JydXB0IGJpbmFyeSBkYXRhLiAgVG8gc3VwcHJlc3MgdGhpcyBiZWhhdmlvciwgeW91IG1heSBuZWVkIHRvIHVzZQorYSAiYiIgb3B0aW9uIHRvIGZvcGVuIChhcyBzaG93biBhYm92ZSksIG9yIHVzZSBzZXRtb2RlKCkgb3IgYW5vdGhlciByb3V0aW5lIHRvCitwdXQgdGhlIHN0ZGlvIHN0cmVhbSBpbiBiaW5hcnkgbW9kZS4gIFNlZSBjanBlZy5jIGFuZCBkanBlZy5jIGZvciBjb2RlIHRoYXQKK2hhcyBiZWVuIGZvdW5kIHRvIHdvcmsgb24gbWFueSBzeXN0ZW1zLgorCitZb3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGRhdGEgc291cmNlIGJldHdlZW4gY2FsbGluZyBqcGVnX3JlYWRfaGVhZGVyKCkgYW5kCitqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuICBJZiB5b3Ugd2lzaCB0byByZWFkIGEgc2VyaWVzIG9mIEpQRUcgaW1hZ2VzIGZyb20KK2Egc2luZ2xlIHNvdXJjZSBmaWxlLCB5b3Ugc2hvdWxkIHJlcGVhdCB0aGUganBlZ19yZWFkX2hlYWRlcigpIHRvCitqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgc2VxdWVuY2Ugd2l0aG91dCByZWluaXRpYWxpemluZyBlaXRoZXIgdGhlIEpQRUcKK29iamVjdCBvciB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlOyB0aGlzIHByZXZlbnRzIGJ1ZmZlcmVkIGlucHV0IGRhdGEgZnJvbQorYmVpbmcgZGlzY2FyZGVkLgorCisKKzMuIENhbGwganBlZ19yZWFkX2hlYWRlcigpIHRvIG9idGFpbiBpbWFnZSBpbmZvLgorCitUeXBpY2FsIGNvZGUgZm9yIHRoaXMgc3RlcCBpcyBqdXN0CisKKwlqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7CisKK1RoaXMgd2lsbCByZWFkIHRoZSBzb3VyY2UgZGF0YXN0cmVhbSBoZWFkZXIgbWFya2VycywgdXAgdG8gdGhlIGJlZ2lubmluZworb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBwcm9wZXIuICBPbiByZXR1cm4sIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFuZCBvdGhlcgoraW5mbyBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSBKUEVHIG9iamVjdC4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgd2lzaCB0bworY29uc3VsdCB0aGlzIGluZm9ybWF0aW9uIGJlZm9yZSBzZWxlY3RpbmcgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorCitNb3JlIGNvbXBsZXggY29kZSBpcyBuZWNlc3NhcnkgaWYKKyAgKiBBIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZCAtLS0gaW4gdGhhdCBjYXNlIGpwZWdfcmVhZF9oZWFkZXIoKQorICAgIG1heSByZXR1cm4gYmVmb3JlIGl0IGhhcyByZWFkIGFsbCB0aGUgaGVhZGVyIGRhdGEuICBTZWUgIkkvTyBzdXNwZW5zaW9uIiwKKyAgICBiZWxvdy4gIFRoZSBub3JtYWwgc3RkaW8gc291cmNlIG1hbmFnZXIgd2lsbCBOT1QgY2F1c2UgdGhpcyB0byBoYXBwZW4uCisgICogQWJicmV2aWF0ZWQgSlBFRyBmaWxlcyBhcmUgdG8gYmUgcHJvY2Vzc2VkIC0tLSBzZWUgdGhlIHNlY3Rpb24gb24KKyAgICBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtcy4gIFN0YW5kYXJkIGFwcGxpY2F0aW9ucyB0aGF0IGRlYWwgb25seSBpbgorICAgIGludGVyY2hhbmdlIEpQRUcgZmlsZXMgbmVlZCBub3QgYmUgY29uY2VybmVkIHdpdGggdGhpcyBjYXNlIGVpdGhlci4KKworSXQgaXMgcGVybWlzc2libGUgdG8gc3RvcCBhdCB0aGlzIHBvaW50IGlmIHlvdSBqdXN0IHdhbnRlZCB0byBmaW5kIG91dCB0aGUKK2ltYWdlIGRpbWVuc2lvbnMgYW5kIG90aGVyIGhlYWRlciBpbmZvIGZvciBhIEpQRUcgZmlsZS4gIEluIHRoYXQgY2FzZSwKK2NhbGwganBlZ19kZXN0cm95KCkgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgSlBFRyBvYmplY3QsIG9yIGNhbGwKK2pwZWdfYWJvcnQoKSB0byByZXR1cm4gaXQgdG8gYW4gaWRsZSBzdGF0ZSBiZWZvcmUgc2VsZWN0aW5nIGEgbmV3IGRhdGEKK3NvdXJjZSBhbmQgcmVhZGluZyBhbm90aGVyIGhlYWRlci4KKworCis0LiBTZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbi4KKworanBlZ19yZWFkX2hlYWRlcigpIHNldHMgYXBwcm9wcmlhdGUgZGVmYXVsdCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYmFzZWQgb24KK3RoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpbWFnZSAoaW4gcGFydGljdWxhciwgaXRzIGNvbG9yc3BhY2UpLiAgSG93ZXZlciwgeW91CittYXkgd2VsbCB3YW50IHRvIGFsdGVyIHRoZXNlIGRlZmF1bHRzIGJlZm9yZSBiZWdpbm5pbmcgdGhlIGRlY29tcHJlc3Npb24uCitGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgaXMgdG8gcHJvZHVjZSBmdWxsIGNvbG9yIG91dHB1dCBmcm9tIGEgY29sb3IgZmlsZS4KK0lmIHlvdSB3YW50IGNvbG9ybWFwcGVkIG91dHB1dCB5b3UgbXVzdCBhc2sgZm9yIGl0LiAgT3RoZXIgb3B0aW9ucyBhbGxvdyB0aGUKK3JldHVybmVkIGltYWdlIHRvIGJlIHNjYWxlZCBhbmQgYWxsb3cgdmFyaW91cyBzcGVlZC9xdWFsaXR5IHRyYWRlb2ZmcyB0byBiZQorc2VsZWN0ZWQuICAiRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uIiwgYmVsb3csIGdpdmVzIGRldGFpbHMuCisKK0lmIHRoZSBkZWZhdWx0cyBhcmUgYXBwcm9wcmlhdGUsIG5vdGhpbmcgbmVlZCBiZSBkb25lIGF0IHRoaXMgc3RlcC4KKworTm90ZSB0aGF0IGFsbCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGJ5IGVhY2ggY2FsbCB0byBqcGVnX3JlYWRfaGVhZGVyKCkuCitJZiB5b3UgcmV1c2UgYSBkZWNvbXByZXNzaW9uIG9iamVjdCwgeW91IGNhbm5vdCBleHBlY3QgeW91ciBwYXJhbWV0ZXIKK3NldHRpbmdzIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3MgY3ljbGVzLCBhcyB5b3UgY2FuIGZvciBjb21wcmVzc2lvbi4KK1lvdSBtdXN0IHNldCBkZXNpcmVkIHBhcmFtZXRlciB2YWx1ZXMgZWFjaCB0aW1lLgorCisKKzUuIGpwZWdfc3RhcnRfZGVjb21wcmVzcyguLi4pOworCitPbmNlIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBzYXRpc2ZhY3RvcnksIGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzKCkgdG8KK2JlZ2luIGRlY29tcHJlc3Npb24uICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZSwgYWxsb2NhdGUgd29ya2luZworbWVtb3J5LCBhbmQgcHJlcGFyZSBmb3IgcmV0dXJuaW5nIGRhdGEuCisKK1R5cGljYWwgY29kZSBpcyBqdXN0CisKKwlqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKTsKKworSWYgeW91IGhhdmUgcmVxdWVzdGVkIGEgbXVsdGktcGFzcyBvcGVyYXRpbmcgbW9kZSwgc3VjaCBhcyAyLXBhc3MgY29sb3IKK3F1YW50aXphdGlvbiwganBlZ19zdGFydF9kZWNvbXByZXNzKCkgd2lsbCBkbyBldmVyeXRoaW5nIG5lZWRlZCBiZWZvcmUgZGF0YQorb3V0cHV0IGNhbiBiZWdpbi4gIEluIHRoaXMgY2FzZSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBtYXkgdGFrZSBxdWl0ZSBhIHdoaWxlCit0byBjb21wbGV0ZS4gIFdpdGggYSBzaW5nbGUtc2NhbiAobm9uIHByb2dyZXNzaXZlKSBKUEVHIGZpbGUgYW5kIGRlZmF1bHQKK2RlY29tcHJlc3Npb24gcGFyYW1ldGVycywgdGhpcyB3aWxsIG5vdCBoYXBwZW47IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHdpbGwKK3JldHVybiBxdWlja2x5LgorCitBZnRlciB0aGlzIGNhbGwsIHRoZSBmaW5hbCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucywgaW5jbHVkaW5nIGFueSByZXF1ZXN0ZWQKK3NjYWxpbmcsIGFyZSBhdmFpbGFibGUgaW4gdGhlIEpQRUcgb2JqZWN0OyBzbyBpcyB0aGUgc2VsZWN0ZWQgY29sb3JtYXAsIGlmCitjb2xvcm1hcHBlZCBvdXRwdXQgaGFzIGJlZW4gcmVxdWVzdGVkLiAgVXNlZnVsIGZpZWxkcyBpbmNsdWRlCisKKwlvdXRwdXRfd2lkdGgJCWltYWdlIHdpZHRoIGFuZCBoZWlnaHQsIGFzIHNjYWxlZAorCW91dHB1dF9oZWlnaHQKKwlvdXRfY29sb3JfY29tcG9uZW50cwkjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlCisJb3V0cHV0X2NvbXBvbmVudHMJIyBvZiBjb2xvciBjb21wb25lbnRzIHJldHVybmVkIHBlciBwaXhlbAorCWNvbG9ybWFwCQl0aGUgc2VsZWN0ZWQgY29sb3JtYXAsIGlmIGFueQorCWFjdHVhbF9udW1iZXJfb2ZfY29sb3JzCQludW1iZXIgb2YgZW50cmllcyBpbiBjb2xvcm1hcAorCitvdXRwdXRfY29tcG9uZW50cyBpcyAxIChhIGNvbG9ybWFwIGluZGV4KSB3aGVuIHF1YW50aXppbmcgY29sb3JzOyBvdGhlcndpc2UgaXQKK2VxdWFscyBvdXRfY29sb3JfY29tcG9uZW50cy4gIEl0IGlzIHRoZSBudW1iZXIgb2YgSlNBTVBMRSB2YWx1ZXMgdGhhdCB3aWxsIGJlCitlbWl0dGVkIHBlciBwaXhlbCBpbiB0aGUgb3V0cHV0IGFycmF5cy4KKworVHlwaWNhbGx5IHlvdSB3aWxsIG5lZWQgdG8gYWxsb2NhdGUgZGF0YSBidWZmZXJzIHRvIGhvbGQgdGhlIGluY29taW5nIGltYWdlLgorWW91IHdpbGwgbmVlZCBvdXRwdXRfd2lkdGggKiBvdXRwdXRfY29tcG9uZW50cyBKU0FNUExFcyBwZXIgc2NhbmxpbmUgaW4geW91cgorb3V0cHV0IGJ1ZmZlciwgYW5kIGEgdG90YWwgb2Ygb3V0cHV0X2hlaWdodCBzY2FubGluZXMgd2lsbCBiZSByZXR1cm5lZC4KKworTm90ZTogaWYgeW91IGFyZSB1c2luZyB0aGUgSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUKK2RhdGEgYnVmZmVycyAoYXMgZGpwZWcgZG9lcyksIHRoZW4gdGhlIG1hbmFnZXIncyBwcm90b2NvbCByZXF1aXJlcyB0aGF0IHlvdQorcmVxdWVzdCBsYXJnZSBidWZmZXJzICpiZWZvcmUqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBUaGlzIGlzIGEKK2xpdHRsZSB0cmlja3kgc2luY2UgdGhlIG91dHB1dF9YWFggZmllbGRzIGFyZSBub3Qgbm9ybWFsbHkgdmFsaWQgdGhlbi4gIFlvdQorY2FuIG1ha2UgdGhlbSB2YWxpZCBieSBjYWxsaW5nIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucygpIGFmdGVyIHNldHRpbmcgdGhlCityZWxldmFudCBwYXJhbWV0ZXJzIChzY2FsaW5nLCBvdXRwdXQgY29sb3Igc3BhY2UsIGFuZCBxdWFudGl6YXRpb24gZmxhZykuCisKKworNi4gd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHJlYWQpCisJanBlZ19yZWFkX3NjYW5saW5lcyguLi4pOworCitOb3cgeW91IGNhbiByZWFkIHRoZSBkZWNvbXByZXNzZWQgaW1hZ2UgZGF0YSBieSBjYWxsaW5nIGpwZWdfcmVhZF9zY2FubGluZXMoKQorb25lIG9yIG1vcmUgdGltZXMuICBBdCBlYWNoIGNhbGwsIHlvdSBwYXNzIGluIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2FubGluZXMKK3RvIGJlIHJlYWQgKGllLCB0aGUgaGVpZ2h0IG9mIHlvdXIgd29ya2luZyBidWZmZXIpOyBqcGVnX3JlYWRfc2NhbmxpbmVzKCkKK3dpbGwgcmV0dXJuIHVwIHRvIHRoYXQgbWFueSBsaW5lcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBsaW5lcworYWN0dWFsbHkgcmVhZC4gIFRoZSBmb3JtYXQgb2YgdGhlIHJldHVybmVkIGRhdGEgaXMgZGlzY3Vzc2VkIHVuZGVyICJEYXRhCitmb3JtYXRzIiwgYWJvdmUuICBEb24ndCBmb3JnZXQgdGhhdCBncmF5c2NhbGUgYW5kIGNvbG9yIEpQRUdzIHdpbGwgcmV0dXJuCitkaWZmZXJlbnQgZGF0YSBmb3JtYXRzIQorCitJbWFnZSBkYXRhIGlzIHJldHVybmVkIGluIHRvcC10by1ib3R0b20gc2NhbmxpbmUgb3JkZXIuICBJZiB5b3UgbXVzdCB3cml0ZQorb3V0IHRoZSBpbWFnZSBpbiBib3R0b20tdG8tdG9wIG9yZGVyLCB5b3UgY2FuIHVzZSB0aGUgSlBFRyBsaWJyYXJ5J3MgdmlydHVhbAorYXJyYXkgbWVjaGFuaXNtIHRvIGludmVydCB0aGUgZGF0YSBlZmZpY2llbnRseS4gIEV4YW1wbGVzIG9mIHRoaXMgY2FuIGJlCitmb3VuZCBpbiB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGRqcGVnLgorCitUaGUgbGlicmFyeSBtYWludGFpbnMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyByZXR1cm5lZCBzbyBmYXIKK2luIHRoZSBvdXRwdXRfc2NhbmxpbmUgZmllbGQgb2YgdGhlIEpQRUcgb2JqZWN0LiAgVXN1YWxseSB5b3UgY2FuIGp1c3QgdXNlCit0aGlzIHZhcmlhYmxlIGFzIHRoZSBsb29wIGNvdW50ZXIsIHNvIHRoYXQgdGhlIGxvb3AgdGVzdCBsb29rcyBsaWtlCisid2hpbGUgKGNpbmZvLm91dHB1dF9zY2FubGluZSA8IGNpbmZvLm91dHB1dF9oZWlnaHQpIi4gIChOb3RlIHRoYXQgdGhlIHRlc3QKK3Nob3VsZCBOT1QgYmUgYWdhaW5zdCBpbWFnZV9oZWlnaHQsIHVubGVzcyB5b3UgbmV2ZXIgdXNlIHNjYWxpbmcuICBUaGUKK2ltYWdlX2hlaWdodCBmaWVsZCBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBvcmlnaW5hbCB1bnNjYWxlZCBpbWFnZS4pCitUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBlcXVhbHMgdGhlIGNoYW5nZSBpbiB0aGUgdmFsdWUgb2Ygb3V0cHV0X3NjYW5saW5lLgorCitJZiB5b3UgZG9uJ3QgdXNlIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSwgaXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdAoranBlZ19yZWFkX3NjYW5saW5lcygpIHJlYWRzIGF0IGxlYXN0IG9uZSBzY2FubGluZSBwZXIgY2FsbCwgdW50aWwgdGhlCitib3R0b20gb2YgdGhlIGltYWdlIGhhcyBiZWVuIHJlYWNoZWQuCisKK0lmIHlvdSB1c2UgYSBidWZmZXIgbGFyZ2VyIHRoYW4gb25lIHNjYW5saW5lLCBpdCBpcyBOT1Qgc2FmZSB0byBhc3N1bWUgdGhhdAoranBlZ19yZWFkX3NjYW5saW5lcygpIGZpbGxzIGl0LiAgKFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHJldHVybnMgb25seSBhCitmZXcgc2NhbmxpbmVzIHBlciBjYWxsLCBubyBtYXR0ZXIgaG93IGxhcmdlIGEgYnVmZmVyIHlvdSBwYXNzLikgIFNvIHlvdSBtdXN0CithbHdheXMgcHJvdmlkZSBhIGxvb3AgdGhhdCBjYWxscyBqcGVnX3JlYWRfc2NhbmxpbmVzKCkgcmVwZWF0ZWRseSB1bnRpbCB0aGUKK3dob2xlIGltYWdlIGhhcyBiZWVuIHJlYWQuCisKKworNy4ganBlZ19maW5pc2hfZGVjb21wcmVzcyguLi4pOworCitBZnRlciBhbGwgdGhlIGltYWdlIGRhdGEgaGFzIGJlZW4gcmVhZCwgY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgdG8KK2NvbXBsZXRlIHRoZSBkZWNvbXByZXNzaW9uIGN5Y2xlLiAgVGhpcyBjYXVzZXMgd29ya2luZyBtZW1vcnkgYXNzb2NpYXRlZAord2l0aCB0aGUgSlBFRyBvYmplY3QgdG8gYmUgcmVsZWFzZWQuCisKK1R5cGljYWwgY29kZToKKworCWpwZWdfZmluaXNoX2RlY29tcHJlc3MoJmNpbmZvKTsKKworSWYgdXNpbmcgdGhlIHN0ZGlvIHNvdXJjZSBtYW5hZ2VyLCBkb24ndCBmb3JnZXQgdG8gY2xvc2UgdGhlIHNvdXJjZSBzdGRpbworc3RyZWFtIGlmIG5lY2Vzc2FyeS4KKworSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgYmVmb3JlIHJlYWRpbmcgdGhlIGNvcnJlY3QKK3RvdGFsIG51bWJlciBvZiBzY2FubGluZXMuICBJZiB5b3Ugd2lzaCB0byBhYm9ydCBkZWNvbXByZXNzaW9uLCBjYWxsCitqcGVnX2Fib3J0KCkgYXMgZGlzY3Vzc2VkIGJlbG93LgorCitBZnRlciBjb21wbGV0aW5nIGEgZGVjb21wcmVzc2lvbiBjeWNsZSwgeW91IG1heSBkaXNwb3NlIG9mIHRoZSBKUEVHIG9iamVjdCBhcworZGlzY3Vzc2VkIG5leHQsIG9yIHlvdSBtYXkgdXNlIGl0IHRvIGRlY29tcHJlc3MgYW5vdGhlciBpbWFnZS4gIEluIHRoYXQgY2FzZQorcmV0dXJuIHRvIHN0ZXAgMiBvciAzIGFzIGFwcHJvcHJpYXRlLiAgSWYgeW91IGRvIG5vdCBjaGFuZ2UgdGhlIHNvdXJjZQorbWFuYWdlciwgdGhlIG5leHQgaW1hZ2Ugd2lsbCBiZSByZWFkIGZyb20gdGhlIHNhbWUgc291cmNlLgorCisKKzguIFJlbGVhc2UgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCisKK1doZW4geW91IGFyZSBkb25lIHdpdGggYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LCBkZXN0cm95IGl0IGJ5IGNhbGxpbmcKK2pwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkgb3IganBlZ19kZXN0cm95KCkuICBUaGUgcHJldmlvdXMgZGlzY3Vzc2lvbiBvZgorZGVzdHJveWluZyBjb21wcmVzc2lvbiBvYmplY3RzIGFwcGxpZXMgaGVyZSB0b28uCisKK1R5cGljYWwgY29kZToKKworCWpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CisKKworOS4gQWJvcnRpbmcuCisKK1lvdSBjYW4gYWJvcnQgYSBkZWNvbXByZXNzaW9uIGN5Y2xlIGJ5IGNhbGxpbmcganBlZ19kZXN0cm95X2RlY29tcHJlc3MoKSBvcgoranBlZ19kZXN0cm95KCkgaWYgeW91IGRvbid0IG5lZWQgdGhlIEpQRUcgb2JqZWN0IGFueSBtb3JlLCBvcgoranBlZ19hYm9ydF9kZWNvbXByZXNzKCkgb3IganBlZ19hYm9ydCgpIGlmIHlvdSB3YW50IHRvIHJldXNlIHRoZSBvYmplY3QuCitUaGUgcHJldmlvdXMgZGlzY3Vzc2lvbiBvZiBhYm9ydGluZyBjb21wcmVzc2lvbiBjeWNsZXMgYXBwbGllcyBoZXJlIHRvby4KKworCitNZWNoYW5pY3Mgb2YgdXNhZ2U6IGluY2x1ZGUgZmlsZXMsIGxpbmtpbmcsIGV0YworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXBwbGljYXRpb25zIHVzaW5nIHRoZSBKUEVHIGxpYnJhcnkgc2hvdWxkIGluY2x1ZGUgdGhlIGhlYWRlciBmaWxlIGpwZWdsaWIuaAordG8gb2J0YWluIGRlY2xhcmF0aW9ucyBvZiBkYXRhIHR5cGVzIGFuZCByb3V0aW5lcy4gIEJlZm9yZSBpbmNsdWRpbmcKK2pwZWdsaWIuaCwgaW5jbHVkZSBzeXN0ZW0gaGVhZGVycyB0aGF0IGRlZmluZSBhdCBsZWFzdCB0aGUgdHlwZWRlZnMgRklMRSBhbmQKK3NpemVfdC4gIE9uIEFOU0ktY29uZm9ybWluZyBzeXN0ZW1zLCBpbmNsdWRpbmcgPHN0ZGlvLmg+IGlzIHN1ZmZpY2llbnQ7IG9uCitvbGRlciBVbml4IHN5c3RlbXMsIHlvdSBtYXkgbmVlZCA8c3lzL3R5cGVzLmg+IHRvIGRlZmluZSBzaXplX3QuCisKK0lmIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWZlciB0byBpbmRpdmlkdWFsIEpQRUcgbGlicmFyeSBlcnJvciBjb2RlcywgYWxzbworaW5jbHVkZSBqZXJyb3IuaCB0byBkZWZpbmUgdGhvc2Ugc3ltYm9scy4KKworanBlZ2xpYi5oIGluZGlyZWN0bHkgaW5jbHVkZXMgdGhlIGZpbGVzIGpjb25maWcuaCBhbmQgam1vcmVjZmcuaC4gIElmIHlvdSBhcmUKK2luc3RhbGxpbmcgdGhlIEpQRUcgaGVhZGVyIGZpbGVzIGluIGEgc3lzdGVtIGRpcmVjdG9yeSwgeW91IHdpbGwgd2FudCB0bworaW5zdGFsbCBhbGwgZm91ciBmaWxlczoganBlZ2xpYi5oLCBqZXJyb3IuaCwgamNvbmZpZy5oLCBqbW9yZWNmZy5oLgorCitUaGUgbW9zdCBjb252ZW5pZW50IHdheSB0byBpbmNsdWRlIHRoZSBKUEVHIGNvZGUgaW50byB5b3VyIGV4ZWN1dGFibGUgcHJvZ3JhbQoraXMgdG8gcHJlcGFyZSBhIGxpYnJhcnkgZmlsZSAoImxpYmpwZWcuYSIsIG9yIGEgY29ycmVzcG9uZGluZyBuYW1lIG9uIG5vbi1Vbml4CittYWNoaW5lcykgYW5kIHJlZmVyZW5jZSBpdCBhdCB5b3VyIGxpbmsgc3RlcC4gIElmIHlvdSB1c2Ugb25seSBoYWxmIG9mIHRoZQorbGlicmFyeSAob25seSBjb21wcmVzc2lvbiBvciBvbmx5IGRlY29tcHJlc3Npb24pLCBvbmx5IHRoYXQgbXVjaCBjb2RlIHdpbGwgYmUKK2luY2x1ZGVkIGZyb20gdGhlIGxpYnJhcnksIHVubGVzcyB5b3VyIGxpbmtlciBpcyBob3BlbGVzc2x5IGJyYWluLWRhbWFnZWQuCitUaGUgc3VwcGxpZWQgbWFrZWZpbGVzIGJ1aWxkIGxpYmpwZWcuYSBhdXRvbWF0aWNhbGx5IChzZWUgaW5zdGFsbC5kb2MpLgorCitXaGlsZSB5b3UgY2FuIGJ1aWxkIHRoZSBKUEVHIGxpYnJhcnkgYXMgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgd2hpbSBzdHJpa2VzCit5b3UsIHdlIGRvbid0IHJlYWxseSByZWNvbW1lbmQgaXQuICBUaGUgdHJvdWJsZSB3aXRoIHNoYXJlZCBsaWJyYXJpZXMgaXMgdGhhdAorYXQgc29tZSBwb2ludCB5b3UnbGwgcHJvYmFibHkgdHJ5IHRvIHN1YnN0aXR1dGUgYSBuZXcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQord2l0aG91dCByZWNvbXBpbGluZyB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbnMuICBUaGF0IGdlbmVyYWxseSBkb2Vzbid0IHdvcmsKK2JlY2F1c2UgdGhlIHBhcmFtZXRlciBzdHJ1Y3QgZGVjbGFyYXRpb25zIHVzdWFsbHkgY2hhbmdlIHdpdGggZWFjaCBuZXcKK3ZlcnNpb24uICBJbiBvdGhlciB3b3JkcywgdGhlIGxpYnJhcnkncyBBUEkgaXMgKm5vdCogZ3VhcmFudGVlZCBiaW5hcnkKK2NvbXBhdGlibGUgYWNyb3NzIHZlcnNpb25zOyB3ZSBvbmx5IHRyeSB0byBlbnN1cmUgc291cmNlLWNvZGUgY29tcGF0aWJpbGl0eS4KKyhJbiBoaW5kc2lnaHQsIGl0IG1pZ2h0IGhhdmUgYmVlbiBzbWFydGVyIHRvIGhpZGUgdGhlIHBhcmFtZXRlciBzdHJ1Y3RzIGZyb20KK2FwcGxpY2F0aW9ucyBhbmQgaW50cm9kdWNlIGEgdG9uIG9mIGFjY2VzcyBmdW5jdGlvbnMgaW5zdGVhZC4gIFRvbyBsYXRlIG5vdywKK2hvd2V2ZXIuKQorCitPbiBzb21lIHN5c3RlbXMgeW91ciBhcHBsaWNhdGlvbiBtYXkgbmVlZCB0byBzZXQgdXAgYSBzaWduYWwgaGFuZGxlciB0byBlbnN1cmUKK3RoYXQgdGVtcG9yYXJ5IGZpbGVzIGFyZSBkZWxldGVkIGlmIHRoZSBwcm9ncmFtIGlzIGludGVycnVwdGVkLiAgVGhpcyBpcyBtb3N0Citjcml0aWNhbCBpZiB5b3UgYXJlIG9uIE1TLURPUyBhbmQgdXNlIHRoZSBqbWVtZG9zLmMgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQ7CitpdCB3aWxsIHRyeSB0byBncmFiIGV4dGVuZGVkIG1lbW9yeSBmb3IgdGVtcCBmaWxlcywgYW5kIHRoYXQgc3BhY2Ugd2lsbCBOT1QgYmUKK2ZyZWVkIGF1dG9tYXRpY2FsbHkuICBTZWUgY2pwZWcuYyBvciBkanBlZy5jIGZvciBhbiBleGFtcGxlIHNpZ25hbCBoYW5kbGVyLgorCitJdCBtYXkgYmUgd29ydGggcG9pbnRpbmcgb3V0IHRoYXQgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IGFjdHVhbGx5CityZXF1aXJlIHRoZSBzdGRpbyBsaWJyYXJ5OiBvbmx5IHRoZSBkZWZhdWx0IHNvdXJjZS9kZXN0aW5hdGlvbiBtYW5hZ2VycyBhbmQKK2Vycm9yIGhhbmRsZXIgbmVlZCBpdC4gIFlvdSBjYW4gdXNlIHRoZSBsaWJyYXJ5IGluIGEgc3RkaW8tbGVzcyBlbnZpcm9ubWVudAoraWYgeW91IHJlcGxhY2UgdGhvc2UgbW9kdWxlcyBhbmQgdXNlIGptZW1ub2JzLmMgKG9yIGFub3RoZXIgbWVtb3J5IG1hbmFnZXIgb2YKK3lvdXIgb3duIGRldmlzaW5nKS4gIE1vcmUgaW5mbyBhYm91dCB0aGUgbWluaW11bSBzeXN0ZW0gbGlicmFyeSByZXF1aXJlbWVudHMKK21heSBiZSBmb3VuZCBpbiBqaW5jbHVkZS5oLgorCisKK0FEVkFOQ0VEIEZFQVRVUkVTCis9PT09PT09PT09PT09PT09PQorCitDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgYWxsIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIHlvdSBjYW4gc2V0IGZvciBKUEVHCitjb21wcmVzc2lvbiwgYXMgd2VsbCBhcyB0aGUgImhlbHBlciIgcm91dGluZXMgcHJvdmlkZWQgdG8gYXNzaXN0IGluIHRoaXMKK3Rhc2suICBQcm9wZXIgc2V0dGluZyBvZiBzb21lIHBhcmFtZXRlcnMgcmVxdWlyZXMgZGV0YWlsZWQgdW5kZXJzdGFuZGluZworb2YgdGhlIEpQRUcgc3RhbmRhcmQ7IGlmIHlvdSBkb24ndCBrbm93IHdoYXQgYSBwYXJhbWV0ZXIgaXMgZm9yLCBpdCdzIGJlc3QKK25vdCB0byBtZXNzIHdpdGggaXQhICBTZWUgUkVGRVJFTkNFUyBpbiB0aGUgUkVBRE1FIGZpbGUgZm9yIHBvaW50ZXJzIHRvCittb3JlIGluZm8gYWJvdXQgSlBFRy4KKworSXQncyBhIGdvb2QgaWRlYSB0byBjYWxsIGpwZWdfc2V0X2RlZmF1bHRzKCkgZmlyc3QsIGV2ZW4gaWYgeW91IHBsYW4gdG8gc2V0CithbGwgdGhlIHBhcmFtZXRlcnM7IHRoYXQgd2F5IHlvdXIgY29kZSBpcyBtb3JlIGxpa2VseSB0byB3b3JrIHdpdGggZnV0dXJlIEpQRUcKK2xpYnJhcmllcyB0aGF0IGhhdmUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2UgcmVjb21tZW5kCit5b3UgdXNlIGEgaGVscGVyIHJvdXRpbmUgd2hlcmUgb25lIGlzIHByb3ZpZGVkLCBpbiBwcmVmZXJlbmNlIHRvIHR3aWRkbGluZworY2luZm8gZmllbGRzIGRpcmVjdGx5LgorCitUaGUgaGVscGVyIHJvdXRpbmVzIGFyZToKKworanBlZ19zZXRfZGVmYXVsdHMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorCVRoaXMgcm91dGluZSBzZXRzIGFsbCBKUEVHIHBhcmFtZXRlcnMgdG8gcmVhc29uYWJsZSBkZWZhdWx0cywgdXNpbmcKKwlvbmx5IHRoZSBpbnB1dCBpbWFnZSdzIGNvbG9yIHNwYWNlIChmaWVsZCBpbl9jb2xvcl9zcGFjZSwgd2hpY2ggbXVzdAorCWFscmVhZHkgYmUgc2V0IGluIGNpbmZvKS4gIE1hbnkgYXBwbGljYXRpb25zIHdpbGwgb25seSBuZWVkIHRvIHVzZQorCXRoaXMgcm91dGluZSBhbmQgcGVyaGFwcyBqcGVnX3NldF9xdWFsaXR5KCkuCisKK2pwZWdfc2V0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCisJU2V0cyB0aGUgSlBFRyBmaWxlJ3MgY29sb3JzcGFjZSAoZmllbGQganBlZ19jb2xvcl9zcGFjZSkgYXMgc3BlY2lmaWVkLAorCWFuZCBzZXRzIG90aGVyIGNvbG9yLXNwYWNlLWRlcGVuZGVudCBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlbHkuICBTZWUKKwkiU3BlY2lhbCBjb2xvciBzcGFjZXMiLCBiZWxvdywgYmVmb3JlIHVzaW5nIHRoaXMuICBBIGxhcmdlIG51bWJlciBvZgorCXBhcmFtZXRlcnMsIGluY2x1ZGluZyBhbGwgcGVyLWNvbXBvbmVudCBwYXJhbWV0ZXJzLCBhcmUgc2V0IGJ5IHRoaXMKKwlyb3V0aW5lOyBpZiB5b3Ugd2FudCB0byB0d2lkZGxlIGluZGl2aWR1YWwgcGFyYW1ldGVycyB5b3Ugc2hvdWxkIGNhbGwKKwlqcGVnX3NldF9jb2xvcnNwYWNlKCkgYmVmb3JlIHJhdGhlciB0aGFuIGFmdGVyLgorCitqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSAoal9jb21wcmVzc19wdHIgY2luZm8pCisJU2VsZWN0cyBhbiBhcHByb3ByaWF0ZSBKUEVHIGNvbG9yc3BhY2UgYmFzZWQgb24gY2luZm8tPmluX2NvbG9yX3NwYWNlLAorCWFuZCBjYWxscyBqcGVnX3NldF9jb2xvcnNwYWNlKCkuICBUaGlzIGlzIGFjdHVhbGx5IGEgc3Vicm91dGluZSBvZgorCWpwZWdfc2V0X2RlZmF1bHRzKCkuICBJdCdzIGJyb2tlbiBvdXQgaW4gY2FzZSB5b3Ugd2FudCB0byBjaGFuZ2UKKwlqdXN0IHRoZSBjb2xvcnNwYWNlLWRlcGVuZGVudCBKUEVHIHBhcmFtZXRlcnMuCisKK2pwZWdfc2V0X3F1YWxpdHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgcXVhbGl0eSwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKKwlDb25zdHJ1Y3RzIEpQRUcgcXVhbnRpemF0aW9uIHRhYmxlcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGluZGljYXRlZAorCXF1YWxpdHkgc2V0dGluZy4gIFRoZSBxdWFsaXR5IHZhbHVlIGlzIGV4cHJlc3NlZCBvbiB0aGUgMC4uMTAwIHNjYWxlCisJcmVjb21tZW5kZWQgYnkgSUpHIChjanBlZydzICItcXVhbGl0eSIgc3dpdGNoIHVzZXMgdGhpcyByb3V0aW5lKS4KKwlOb3RlIHRoYXQgdGhlIGV4YWN0IG1hcHBpbmcgZnJvbSBxdWFsaXR5IHZhbHVlcyB0byB0YWJsZXMgbWF5IGNoYW5nZQorCWluIGZ1dHVyZSBJSkcgcmVsZWFzZXMgYXMgbW9yZSBpcyBsZWFybmVkIGFib3V0IERDVCBxdWFudGl6YXRpb24uCisJSWYgdGhlIGZvcmNlX2Jhc2VsaW5lIHBhcmFtZXRlciBpcyBUUlVFLCB0aGVuIHRoZSBxdWFudGl6YXRpb24gdGFibGUKKwllbnRyaWVzIGFyZSBjb25zdHJhaW5lZCB0byB0aGUgcmFuZ2UgMS4uMjU1IGZvciBmdWxsIEpQRUcgYmFzZWxpbmUKKwljb21wYXRpYmlsaXR5LiAgSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoaXMgb25seSBtYWtlcyBhCisJZGlmZmVyZW5jZSBmb3IgcXVhbGl0eSBzZXR0aW5ncyBiZWxvdyAyNSwgYW5kIGl0IGVmZmVjdGl2ZWx5IHByZXZlbnRzCisJdmVyeSBzbWFsbC9sb3cgcXVhbGl0eSBmaWxlcyBmcm9tIGJlaW5nIGdlbmVyYXRlZC4gIFRoZSBJSkcgZGVjb2RlcgorCWlzIGNhcGFibGUgb2YgcmVhZGluZyB0aGUgbm9uLWJhc2VsaW5lIGZpbGVzIGdlbmVyYXRlZCBhdCBsb3cgcXVhbGl0eQorCXNldHRpbmdzIHdoZW4gZm9yY2VfYmFzZWxpbmUgaXMgRkFMU0UsIGJ1dCBvdGhlciBkZWNvZGVycyBtYXkgbm90IGJlLgorCitqcGVnX3NldF9saW5lYXJfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBzY2FsZV9mYWN0b3IsCisJCQkgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKKwlTYW1lIGFzIGpwZWdfc2V0X3F1YWxpdHkoKSBleGNlcHQgdGhhdCB0aGUgZ2VuZXJhdGVkIHRhYmxlcyBhcmUgdGhlCisJc2FtcGxlIHRhYmxlcyBnaXZlbiBpbiB0aGUgSlBFQyBzcGVjIHNlY3Rpb24gSy4xLCBtdWx0aXBsaWVkIGJ5IHRoZQorCXNwZWNpZmllZCBzY2FsZSBmYWN0b3IgKHdoaWNoIGlzIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2U7IHRodXMKKwlzY2FsZV9mYWN0b3IgPSAxMDAgcmVwcm9kdWNlcyB0aGUgc3BlYydzIHRhYmxlcykuICBOb3RlIHRoYXQgbGFyZ2VyCisJc2NhbGUgZmFjdG9ycyBnaXZlIGxvd2VyIHF1YWxpdHkuICBUaGlzIGVudHJ5IHBvaW50IGlzIHVzZWZ1bCBmb3IKKwljb25mb3JtaW5nIHRvIHRoZSBBZG9iZSBQb3N0U2NyaXB0IERDVCBjb252ZW50aW9ucywgYnV0IHdlIGRvIG5vdAorCXJlY29tbWVuZCBsaW5lYXIgc2NhbGluZyBhcyBhIHVzZXItdmlzaWJsZSBxdWFsaXR5IHNjYWxlIG90aGVyd2lzZS4KKwlmb3JjZV9iYXNlbGluZSBhZ2FpbiBjb25zdHJhaW5zIHRoZSBjb21wdXRlZCB0YWJsZSBlbnRyaWVzIHRvIDEuLjI1NS4KKworaW50IGpwZWdfcXVhbGl0eV9zY2FsaW5nIChpbnQgcXVhbGl0eSkKKwlDb252ZXJ0cyBhIHZhbHVlIG9uIHRoZSBJSkctcmVjb21tZW5kZWQgcXVhbGl0eSBzY2FsZSB0byBhIGxpbmVhcgorCXNjYWxpbmcgcGVyY2VudGFnZS4gIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGNoYW5nZSBvciBnbyBhd2F5CisJaW4gZnV0dXJlIHJlbGVhc2VzIC0tLSBJSkcgbWF5IGNob29zZSB0byBhZG9wdCBhIHNjYWxpbmcgbWV0aG9kIHRoYXQKKwljYW4ndCBiZSBleHByZXNzZWQgYXMgYSBzaW1wbGUgc2NhbGFyIG11bHRpcGxpZXIsIGluIHdoaWNoIGNhc2UgdGhlCisJcHJlbWlzZSBvZiB0aGlzIHJvdXRpbmUgY29sbGFwc2VzLiAgQ2F2ZWF0IHVzZXIuCisKK2pwZWdfYWRkX3F1YW50X3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHdoaWNoX3RibCwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpiYXNpY190YWJsZSwKKwkJICAgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKKwlBbGxvd3MgYW4gYXJiaXRyYXJ5IHF1YW50aXphdGlvbiB0YWJsZSB0byBiZSBjcmVhdGVkLiAgd2hpY2hfdGJsCisJaW5kaWNhdGVzIHdoaWNoIHRhYmxlIHNsb3QgdG8gZmlsbC4gIGJhc2ljX3RhYmxlIHBvaW50cyB0byBhbiBhcnJheQorCW9mIDY0IHVuc2lnbmVkIGludHMgZ2l2ZW4gaW4gbm9ybWFsIGFycmF5IG9yZGVyLiAgVGhlc2UgdmFsdWVzIGFyZQorCW11bHRpcGxpZWQgYnkgc2NhbGVfZmFjdG9yLzEwMCBhbmQgdGhlbiBjbGFtcGVkIHRvIHRoZSByYW5nZSAxLi42NTUzNQorCShvciB0byAxLi4yNTUgaWYgZm9yY2VfYmFzZWxpbmUgaXMgVFJVRSkuCisJQ0FVVElPTjogcHJpb3IgdG8gbGlicmFyeSB2ZXJzaW9uIDZhLCBqcGVnX2FkZF9xdWFudF90YWJsZSBleHBlY3RlZAorCXRoZSBiYXNpYyB0YWJsZSB0byBiZSBnaXZlbiBpbiBKUEVHIHppZ3phZyBvcmRlci4gIElmIHlvdSBuZWVkIHRvCisJd3JpdGUgY29kZSB0aGF0IHdvcmtzIHdpdGggZWl0aGVyIG9sZGVyIG9yIG5ld2VyIHZlcnNpb25zIG9mIHRoaXMKKwlyb3V0aW5lLCB5b3UgbXVzdCBjaGVjayB0aGUgbGlicmFyeSB2ZXJzaW9uIG51bWJlci4gIFNvbWV0aGluZyBsaWtlCisJIiNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDYxIiBpcyB0aGUgcmlnaHQgdGVzdC4KKworanBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorCUdlbmVyYXRlcyBhIGRlZmF1bHQgc2NhbiBzY3JpcHQgZm9yIHdyaXRpbmcgYSBwcm9ncmVzc2l2ZS1KUEVHIGZpbGUuCisJVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgbWV0aG9kIG9mIGNyZWF0aW5nIGEgcHJvZ3Jlc3NpdmUgZmlsZSwKKwl1bmxlc3MgeW91IHdhbnQgdG8gbWFrZSBhIGN1c3RvbSBzY2FuIHNlcXVlbmNlLiAgWW91IG11c3QgZW5zdXJlIHRoYXQKKwl0aGUgSlBFRyBjb2xvciBzcGFjZSBpcyBzZXQgY29ycmVjdGx5IGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKworCitDb21wcmVzc2lvbiBwYXJhbWV0ZXJzIChjaW5mbyBmaWVsZHMpIGluY2x1ZGU6CisKK0pfRENUX01FVEhPRCBkY3RfbWV0aG9kCisJU2VsZWN0cyB0aGUgYWxnb3JpdGhtIHVzZWQgZm9yIHRoZSBEQ1Qgc3RlcC4gIENob2ljZXMgYXJlOgorCQlKRENUX0lTTE9XOiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobQorCQlKRENUX0lGQVNUOiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QKKwkJSkRDVF9GTE9BVDogZmxvYXRpbmctcG9pbnQgbWV0aG9kCisJCUpEQ1RfREVGQVVMVDogZGVmYXVsdCBtZXRob2QgKG5vcm1hbGx5IEpEQ1RfSVNMT1cpCisJCUpEQ1RfRkFTVEVTVDogZmFzdGVzdCBtZXRob2QgKG5vcm1hbGx5IEpEQ1RfSUZBU1QpCisJVGhlIEZMT0FUIG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgSVNMT1cgbWV0aG9kLAorCWJ1dCBtYXkgZ2l2ZSBkaWZmZXJlbnQgcmVzdWx0cyBvbiBkaWZmZXJlbnQgbWFjaGluZXMgZHVlIHRvIHZhcnlpbmcKKwlyb3VuZG9mZiBiZWhhdmlvci4gIFRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUgdGhlIHNhbWUgcmVzdWx0cworCW9uIGFsbCBtYWNoaW5lcy4gIE9uIG1hY2hpbmVzIHdpdGggc3VmZmljaWVudGx5IGZhc3QgRlAgaGFyZHdhcmUsIHRoZQorCWZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgYWxzbyBiZSB0aGUgZmFzdGVzdC4gIFRoZSBJRkFTVCBtZXRob2QgaXMKKwljb25zaWRlcmFibHkgbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d287IGl0cyB1c2UgaXMgbm90CisJcmVjb21tZW5kZWQgaWYgaGlnaCBxdWFsaXR5IGlzIGEgY29uY2Vybi4gIEpEQ1RfREVGQVVMVCBhbmQKKwlKRENUX0ZBU1RFU1QgYXJlIG1hY3JvcyBjb25maWd1cmFibGUgYnkgZWFjaCBpbnN0YWxsYXRpb24uCisKK0pfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZQoraW50IG51bV9jb21wb25lbnRzCisJVGhlIEpQRUcgY29sb3Igc3BhY2UgYW5kIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGNvbXBvbmVudHM7IHNlZQorCSJTcGVjaWFsIGNvbG9yIHNwYWNlcyIsIGJlbG93LCBmb3IgbW9yZSBpbmZvLiAgV2UgcmVjb21tZW5kIHVzaW5nCisJanBlZ19zZXRfY29sb3Jfc3BhY2UoKSBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlc2UuCisKK2Jvb2xlYW4gb3B0aW1pemVfY29kaW5nCisJVFJVRSBjYXVzZXMgdGhlIGNvbXByZXNzb3IgdG8gY29tcHV0ZSBvcHRpbWFsIEh1ZmZtYW4gY29kaW5nIHRhYmxlcworCWZvciB0aGUgaW1hZ2UuICBUaGlzIHJlcXVpcmVzIGFuIGV4dHJhIHBhc3Mgb3ZlciB0aGUgZGF0YSBhbmQKKwl0aGVyZWZvcmUgY29zdHMgYSBnb29kIGRlYWwgb2Ygc3BhY2UgYW5kIHRpbWUuICBUaGUgZGVmYXVsdCBpcworCUZBTFNFLCB3aGljaCB0ZWxscyB0aGUgY29tcHJlc3NvciB0byB1c2UgdGhlIHN1cHBsaWVkIG9yIGRlZmF1bHQKKwlIdWZmbWFuIHRhYmxlcy4gIEluIG1vc3QgY2FzZXMgb3B0aW1hbCB0YWJsZXMgc2F2ZSBvbmx5IGEgZmV3IHBlcmNlbnQKKwlvZiBmaWxlIHNpemUgY29tcGFyZWQgdG8gdGhlIGRlZmF1bHQgdGFibGVzLiAgTm90ZSB0aGF0IHdoZW4gdGhpcyBpcworCVRSVUUsIHlvdSBuZWVkIG5vdCBzdXBwbHkgSHVmZm1hbiB0YWJsZXMgYXQgYWxsLCBhbmQgYW55IHlvdSBkbworCXN1cHBseSB3aWxsIGJlIG92ZXJ3cml0dGVuLgorCit1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbAoraW50IHJlc3RhcnRfaW5fcm93cworCVRvIGVtaXQgcmVzdGFydCBtYXJrZXJzIGluIHRoZSBKUEVHIGZpbGUsIHNldCBvbmUgb2YgdGhlc2Ugbm9uemVyby4KKwlTZXQgcmVzdGFydF9pbnRlcnZhbCB0byBzcGVjaWZ5IHRoZSBleGFjdCBpbnRlcnZhbCBpbiBNQ1UgYmxvY2tzLgorCVNldCByZXN0YXJ0X2luX3Jvd3MgdG8gc3BlY2lmeSB0aGUgaW50ZXJ2YWwgaW4gTUNVIHJvd3MuICAoSWYKKwlyZXN0YXJ0X2luX3Jvd3MgaXMgbm90IDAsIHRoZW4gcmVzdGFydF9pbnRlcnZhbCBpcyBzZXQgYWZ0ZXIgdGhlCisJaW1hZ2Ugd2lkdGggaW4gTUNVcyBpcyBjb21wdXRlZC4pICBEZWZhdWx0cyBhcmUgemVybyAobm8gcmVzdGFydHMpLgorCU9uZSByZXN0YXJ0IG1hcmtlciBwZXIgTUNVIHJvdyBpcyBvZnRlbiBhIGdvb2QgY2hvaWNlLgorCU5PVEU6IHRoZSBvdmVyaGVhZCBvZiByZXN0YXJ0IG1hcmtlcnMgaXMgaGlnaGVyIGluIGdyYXlzY2FsZSBKUEVHCisJZmlsZXMgdGhhbiBpbiBjb2xvciBmaWxlcywgYW5kIE1VQ0ggaGlnaGVyIGluIHByb2dyZXNzaXZlIEpQRUdzLgorCUlmIHlvdSB1c2UgcmVzdGFydHMsIHlvdSBtYXkgd2FudCB0byB1c2UgbGFyZ2VyIGludGVydmFscyBpbiB0aG9zZQorCWNhc2VzLgorCitjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5faW5mbworaW50IG51bV9zY2FucworCUJ5IGRlZmF1bHQsIHNjYW5faW5mbyBpcyBOVUxMOyB0aGlzIGNhdXNlcyB0aGUgY29tcHJlc3NvciB0byB3cml0ZSBhCisJc2luZ2xlLXNjYW4gc2VxdWVudGlhbCBKUEVHIGZpbGUuICBJZiBub3QgTlVMTCwgc2Nhbl9pbmZvIHBvaW50cyB0bworCWFuIGFycmF5IG9mIHNjYW4gZGVmaW5pdGlvbiByZWNvcmRzIG9mIGxlbmd0aCBudW1fc2NhbnMuICBUaGUKKwljb21wcmVzc29yIHdpbGwgdGhlbiB3cml0ZSBhIEpQRUcgZmlsZSBoYXZpbmcgb25lIHNjYW4gZm9yIGVhY2ggc2NhbgorCWRlZmluaXRpb24gcmVjb3JkLiAgVGhpcyBpcyB1c2VkIHRvIGdlbmVyYXRlIG5vbmludGVybGVhdmVkIG9yCisJcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcy4gIFRoZSBsaWJyYXJ5IGNoZWNrcyB0aGF0IHRoZSBzY2FuIGFycmF5CisJZGVmaW5lcyBhIHZhbGlkIEpQRUcgc2NhbiBzZXF1ZW5jZS4gIChqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBjcmVhdGVzCisJYSBzdWl0YWJsZSBzY2FuIGRlZmluaXRpb24gYXJyYXkgZm9yIHByb2dyZXNzaXZlIEpQRUcuKSAgVGhpcyBpcworCWRpc2N1c3NlZCBmdXJ0aGVyIHVuZGVyICJQcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQiLgorCitpbnQgc21vb3RoaW5nX2ZhY3RvcgorCUlmIG5vbi16ZXJvLCB0aGUgaW5wdXQgaW1hZ2UgaXMgc21vb3RoZWQ7IHRoZSB2YWx1ZSBzaG91bGQgYmUgMSBmb3IKKwltaW5pbWFsIHNtb290aGluZyB0byAxMDAgZm9yIG1heGltdW0gc21vb3RoaW5nLiAgQ29uc3VsdCBqY3NhbXBsZS5jCisJZm9yIGRldGFpbHMgb2YgdGhlIHNtb290aGluZyBhbGdvcml0aG0uICBUaGUgZGVmYXVsdCBpcyB6ZXJvLgorCitib29sZWFuIHdyaXRlX0pGSUZfaGVhZGVyCisJSWYgVFJVRSwgYSBKRklGIEFQUDAgbWFya2VyIGlzIGVtaXR0ZWQuICBqcGVnX3NldF9kZWZhdWx0cygpIGFuZAorCWpwZWdfc2V0X2NvbG9yc3BhY2UoKSBzZXQgdGhpcyBUUlVFIGlmIGEgSkZJRi1sZWdhbCBKUEVHIGNvbG9yIHNwYWNlCisJKGllLCBZQ2JDciBvciBncmF5c2NhbGUpIGlzIHNlbGVjdGVkLCBvdGhlcndpc2UgRkFMU0UuCisKK1VJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbgorVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uCisJVGhlIHZlcnNpb24gbnVtYmVyIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgSkZJRiBtYXJrZXIuCisJanBlZ19zZXRfZGVmYXVsdHMoKSBpbml0aWFsaXplcyB0aGUgdmVyc2lvbiB0byAxLjAxIChtYWpvcj1taW5vcj0xKS4KKwlZb3Ugc2hvdWxkIHNldCBpdCB0byAxLjAyIChtYWpvcj0xLCBtaW5vcj0yKSBpZiB5b3UgcGxhbiB0byB3cml0ZQorCWFueSBKRklGIDEuMDIgZXh0ZW5zaW9uIG1hcmtlcnMuCisKK1VJTlQ4IGRlbnNpdHlfdW5pdAorVUlOVDE2IFhfZGVuc2l0eQorVUlOVDE2IFlfZGVuc2l0eQorCVRoZSByZXNvbHV0aW9uIGluZm9ybWF0aW9uIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgSkZJRiBtYXJrZXI7CisJbm90IHVzZWQgb3RoZXJ3aXNlLiAgZGVuc2l0eV91bml0IG1heSBiZSAwIGZvciB1bmtub3duLAorCTEgZm9yIGRvdHMvaW5jaCwgb3IgMiBmb3IgZG90cy9jbS4gIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgMCwxLDEKKwlpbmRpY2F0aW5nIHNxdWFyZSBwaXhlbHMgb2YgdW5rbm93biBzaXplLgorCitib29sZWFuIHdyaXRlX0Fkb2JlX21hcmtlcgorCUlmIFRSVUUsIGFuIEFkb2JlIEFQUDE0IG1hcmtlciBpcyBlbWl0dGVkLiAganBlZ19zZXRfZGVmYXVsdHMoKSBhbmQKKwlqcGVnX3NldF9jb2xvcnNwYWNlKCkgc2V0IHRoaXMgVFJVRSBpZiBKUEVHIGNvbG9yIHNwYWNlIFJHQiwgQ01ZSywKKwlvciBZQ0NLIGlzIHNlbGVjdGVkLCBvdGhlcndpc2UgRkFMU0UuICBJdCBpcyBnZW5lcmFsbHkgYSBiYWQgaWRlYQorCXRvIHNldCBib3RoIHdyaXRlX0pGSUZfaGVhZGVyIGFuZCB3cml0ZV9BZG9iZV9tYXJrZXIuICBJbiBmYWN0LAorCXlvdSBwcm9iYWJseSBzaG91bGRuJ3QgY2hhbmdlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGF0IGFsbCAtLS0gdGhlCisJZGVmYXVsdCBiZWhhdmlvciBlbnN1cmVzIHRoYXQgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGNhbiBiZQorCXJlY29nbml6ZWQgYnkgdGhlIGRlY29kZXIuCisKK0pRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU10KKwlQb2ludGVycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvbmUgcGVyIHRhYmxlIHNsb3QsCisJb3IgTlVMTCBpZiBubyB0YWJsZSBpcyBkZWZpbmVkIGZvciBhIHNsb3QuICBVc3VhbGx5IHRoZXNlIHNob3VsZAorCWJlIHNldCB2aWEgb25lIG9mIHRoZSBhYm92ZSBoZWxwZXIgcm91dGluZXM7IGpwZWdfYWRkX3F1YW50X3RhYmxlKCkKKwlpcyBnZW5lcmFsIGVub3VnaCB0byBkZWZpbmUgYW55IHF1YW50aXphdGlvbiB0YWJsZS4gIFRoZSBvdGhlcgorCXJvdXRpbmVzIHdpbGwgc2V0IHVwIHRhYmxlIHNsb3QgMCBmb3IgbHVtaW5hbmNlIHF1YWxpdHkgYW5kIHRhYmxlCisJc2xvdCAxIGZvciBjaHJvbWluYW5jZS4KKworSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXQorSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXQorCVBvaW50ZXJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb25lIHBlciB0YWJsZSBzbG90LCBvciBOVUxMIGlmCisJbm8gdGFibGUgaXMgZGVmaW5lZCBmb3IgYSBzbG90LiAgU2xvdHMgMCBhbmQgMSBhcmUgZmlsbGVkIHdpdGggdGhlCisJSlBFRyBzYW1wbGUgdGFibGVzIGJ5IGpwZWdfc2V0X2RlZmF1bHRzKCkuICBJZiB5b3UgbmVlZCB0byBhbGxvY2F0ZQorCW1vcmUgdGFibGUgc3RydWN0dXJlcywganBlZ19hbGxvY19odWZmX3RhYmxlKCkgbWF5IGJlIHVzZWQuCisJTm90ZSB0aGF0IG9wdGltYWwgSHVmZm1hbiB0YWJsZXMgY2FuIGJlIGNvbXB1dGVkIGZvciBhbiBpbWFnZQorCWJ5IHNldHRpbmcgb3B0aW1pemVfY29kaW5nLCBhcyBkaXNjdXNzZWQgYWJvdmU7IHRoZXJlJ3Mgc2VsZG9tCisJYW55IG5lZWQgdG8gbWVzcyB3aXRoIHByb3ZpZGluZyB5b3VyIG93biBIdWZmbWFuIHRhYmxlcy4KKworVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBjaW5mbyBmaWVsZHMgd2hpY2ggYXJlIG5vdCBkb2N1bWVudGVkIGhlcmUKK2JlY2F1c2UgeW91IGN1cnJlbnRseSBjYW4ndCBjaGFuZ2UgdGhlbTsgZm9yIGV4YW1wbGUsIHlvdSBjYW4ndCBzZXQKK2FyaXRoX2NvZGUgVFJVRSBiZWNhdXNlIGFyaXRobWV0aWMgY29kaW5nIGlzIHVuc3VwcG9ydGVkLgorCisKK1Blci1jb21wb25lbnQgcGFyYW1ldGVycyBhcmUgc3RvcmVkIGluIHRoZSBzdHJ1Y3QgY2luZm8uY29tcF9pbmZvW2ldIGZvcgorY29tcG9uZW50IG51bWJlciBpLiAgTm90ZSB0aGF0IGNvbXBvbmVudHMgaGVyZSByZWZlciB0byBjb21wb25lbnRzIG9mIHRoZQorSlBFRyBjb2xvciBzcGFjZSwgKm5vdCogdGhlIHNvdXJjZSBpbWFnZSBjb2xvciBzcGFjZS4gIEEgc3VpdGFibHkgbGFyZ2UKK2NvbXBfaW5mb1tdIGFycmF5IGlzIGFsbG9jYXRlZCBieSBqcGVnX3NldF9kZWZhdWx0cygpOyBpZiB5b3UgY2hvb3NlIG5vdAordG8gdXNlIHRoYXQgcm91dGluZSwgaXQncyB1cCB0byB5b3UgdG8gYWxsb2NhdGUgdGhlIGFycmF5LgorCitpbnQgY29tcG9uZW50X2lkCisJVGhlIG9uZS1ieXRlIGlkZW50aWZpZXIgY29kZSB0byBiZSByZWNvcmRlZCBpbiB0aGUgSlBFRyBmaWxlIGZvcgorCXRoaXMgY29tcG9uZW50LiAgRm9yIHRoZSBzdGFuZGFyZCBjb2xvciBzcGFjZXMsIHdlIHJlY29tbWVuZCB5b3UKKwlsZWF2ZSB0aGUgZGVmYXVsdCB2YWx1ZXMgYWxvbmUuCisKK2ludCBoX3NhbXBfZmFjdG9yCitpbnQgdl9zYW1wX2ZhY3RvcgorCUhvcml6b250YWwgYW5kIHZlcnRpY2FsIHNhbXBsaW5nIGZhY3RvcnMgZm9yIHRoZSBjb21wb25lbnQ7IG11c3QKKwliZSAxLi40IGFjY29yZGluZyB0byB0aGUgSlBFRyBzdGFuZGFyZC4gIE5vdGUgdGhhdCBsYXJnZXIgc2FtcGxpbmcKKwlmYWN0b3JzIGluZGljYXRlIGEgaGlnaGVyLXJlc29sdXRpb24gY29tcG9uZW50OyBtYW55IHBlb3BsZSBmaW5kCisJdGhpcyBiZWhhdmlvciBxdWl0ZSB1bmludHVpdGl2ZS4gIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgMiwyIGZvcgorCWx1bWluYW5jZSBjb21wb25lbnRzIGFuZCAxLDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMsIGV4Y2VwdAorCWZvciBncmF5c2NhbGUgd2hlcmUgMSwxIGlzIHVzZWQuCisKK2ludCBxdWFudF90Ymxfbm8KKwlRdWFudGl6YXRpb24gdGFibGUgbnVtYmVyIGZvciBjb21wb25lbnQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcworCTAgZm9yIGx1bWluYW5jZSBjb21wb25lbnRzIGFuZCAxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLgorCitpbnQgZGNfdGJsX25vCitpbnQgYWNfdGJsX25vCisJREMgYW5kIEFDIGVudHJvcHkgY29kaW5nIHRhYmxlIG51bWJlcnMuICBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlCisJMCBmb3IgbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisKK2ludCBjb21wb25lbnRfaW5kZXgKKwlNdXN0IGVxdWFsIHRoZSBjb21wb25lbnQncyBpbmRleCBpbiBjb21wX2luZm9bXS4gIChCZWdpbm5pbmcgaW4KKwlyZWxlYXNlIHY2LCB0aGUgY29tcHJlc3NvciBsaWJyYXJ5IHdpbGwgZmlsbCB0aGlzIGluIGF1dG9tYXRpY2FsbHk7CisJeW91IGRvbid0IGhhdmUgdG8uKQorCisKK0RlY29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RlY29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbiBpcyBzb21ld2hhdCBzaW1wbGVyIHRoYW4gY29tcHJlc3Npb24KK3BhcmFtZXRlciBzZWxlY3Rpb24sIHNpbmNlIGFsbCBvZiB0aGUgSlBFRyBpbnRlcm5hbCBwYXJhbWV0ZXJzIGFyZQorcmVjb3JkZWQgaW4gdGhlIHNvdXJjZSBmaWxlIGFuZCBuZWVkIG5vdCBiZSBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24uCisoVW5sZXNzIHlvdSBhcmUgd29ya2luZyB3aXRoIGFiYnJldmlhdGVkIGZpbGVzLCBpbiB3aGljaCBjYXNlIHNlZQorIkFiYnJldmlhdGVkIGRhdGFzdHJlYW1zIiwgYmVsb3cuKSAgRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGNvbnRyb2wKK3RoZSBwb3N0cHJvY2Vzc2luZyBkb25lIG9uIHRoZSBpbWFnZSB0byBkZWxpdmVyIGl0IGluIGEgZm9ybWF0IHN1aXRhYmxlCitmb3IgdGhlIGFwcGxpY2F0aW9uJ3MgdXNlLiAgTWFueSBvZiB0aGUgcGFyYW1ldGVycyBjb250cm9sIHNwZWVkL3F1YWxpdHkKK3RyYWRlb2ZmcywgaW4gd2hpY2ggZmFzdGVyIGRlY29tcHJlc3Npb24gbWF5IGJlIG9idGFpbmVkIGF0IHRoZSBwcmljZSBvZgorYSBwb29yZXItcXVhbGl0eSBpbWFnZS4gIFRoZSBkZWZhdWx0cyBzZWxlY3QgdGhlIGhpZ2hlc3QgcXVhbGl0eSAoc2xvd2VzdCkKK3Byb2Nlc3NpbmcuCisKK1RoZSBmb2xsb3dpbmcgZmllbGRzIGluIHRoZSBKUEVHIG9iamVjdCBhcmUgc2V0IGJ5IGpwZWdfcmVhZF9oZWFkZXIoKSBhbmQKK21heSBiZSB1c2VmdWwgdG8gdGhlIGFwcGxpY2F0aW9uIGluIGNob29zaW5nIGRlY29tcHJlc3Npb24gcGFyYW1ldGVyczoKKworSkRJTUVOU0lPTiBpbWFnZV93aWR0aAkJCVdpZHRoIGFuZCBoZWlnaHQgb2YgaW1hZ2UKK0pESU1FTlNJT04gaW1hZ2VfaGVpZ2h0CitpbnQgbnVtX2NvbXBvbmVudHMJCQlOdW1iZXIgb2YgY29sb3IgY29tcG9uZW50cworSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlCQlDb2xvcnNwYWNlIG9mIGltYWdlCitib29sZWFuIHNhd19KRklGX21hcmtlcgkJCVRSVUUgaWYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBzZWVuCisgIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbgkJVmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEpGSUYgbWFya2VyCisgIFVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbgorICBVSU5UOCBkZW5zaXR5X3VuaXQJCQlSZXNvbHV0aW9uIGRhdGEgZnJvbSBKRklGIG1hcmtlcgorICBVSU5UMTYgWF9kZW5zaXR5CisgIFVJTlQxNiBZX2RlbnNpdHkKK2Jvb2xlYW4gc2F3X0Fkb2JlX21hcmtlcgkJVFJVRSBpZiBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgd2FzIHNlZW4KKyAgVUlOVDggQWRvYmVfdHJhbnNmb3JtCQkJQ29sb3IgdHJhbnNmb3JtIGNvZGUgZnJvbSBBZG9iZSBtYXJrZXIKKworVGhlIEpQRUcgY29sb3Igc3BhY2UsIHVuZm9ydHVuYXRlbHksIGlzIHNvbWV0aGluZyBvZiBhIGd1ZXNzIHNpbmNlIHRoZSBKUEVHCitzdGFuZGFyZCBwcm9wZXIgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byByZWNvcmQgaXQuICBJbiBwcmFjdGljZSBtb3N0IGZpbGVzCithZGhlcmUgdG8gdGhlIEpGSUYgb3IgQWRvYmUgY29udmVudGlvbnMsIGFuZCB0aGUgZGVjb2RlciB3aWxsIHJlY29nbml6ZSB0aGVzZQorY29ycmVjdGx5LiAgU2VlICJTcGVjaWFsIGNvbG9yIHNwYWNlcyIsIGJlbG93LCBmb3IgbW9yZSBpbmZvLgorCisKK1RoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdGhhdCBkZXRlcm1pbmUgdGhlIGJhc2ljIHByb3BlcnRpZXMgb2YgdGhlCityZXR1cm5lZCBpbWFnZSBhcmU6CisKK0pfQ09MT1JfU1BBQ0Ugb3V0X2NvbG9yX3NwYWNlCisJT3V0cHV0IGNvbG9yIHNwYWNlLiAganBlZ19yZWFkX2hlYWRlcigpIHNldHMgYW4gYXBwcm9wcmlhdGUgZGVmYXVsdAorCWJhc2VkIG9uIGpwZWdfY29sb3Jfc3BhY2U7IHR5cGljYWxseSBpdCB3aWxsIGJlIFJHQiBvciBncmF5c2NhbGUuCisJVGhlIGFwcGxpY2F0aW9uIGNhbiBjaGFuZ2UgdGhpcyBmaWVsZCB0byByZXF1ZXN0IG91dHB1dCBpbiBhIGRpZmZlcmVudAorCWNvbG9yc3BhY2UuICBGb3IgZXhhbXBsZSwgc2V0IGl0IHRvIEpDU19HUkFZU0NBTEUgdG8gZ2V0IGdyYXlzY2FsZQorCW91dHB1dCBmcm9tIGEgY29sb3IgZmlsZS4gIChUaGlzIGlzIHVzZWZ1bCBmb3IgcHJldmlld2luZzogZ3JheXNjYWxlCisJb3V0cHV0IGlzIGZhc3RlciB0aGFuIGZ1bGwgY29sb3Igc2luY2UgdGhlIGNvbG9yIGNvbXBvbmVudHMgbmVlZCBub3QKKwliZSBwcm9jZXNzZWQuKSAgTm90ZSB0aGF0IG5vdCBhbGwgcG9zc2libGUgY29sb3Igc3BhY2UgdHJhbnNmb3JtcyBhcmUKKwljdXJyZW50bHkgaW1wbGVtZW50ZWQ7IHlvdSBtYXkgbmVlZCB0byBleHRlbmQgamRjb2xvci5jIGlmIHlvdSB3YW50IGFuCisJdW51c3VhbCBjb252ZXJzaW9uLgorCit1bnNpZ25lZCBpbnQgc2NhbGVfbnVtLCBzY2FsZV9kZW5vbQorCVNjYWxlIHRoZSBpbWFnZSBieSB0aGUgZnJhY3Rpb24gc2NhbGVfbnVtL3NjYWxlX2Rlbm9tLiAgRGVmYXVsdCBpcworCTEvMSwgb3Igbm8gc2NhbGluZy4gIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIHNjYWxpbmcgcmF0aW9zCisJYXJlIDEvMSwgMS8yLCAxLzQsIGFuZCAxLzguICAoVGhlIGxpYnJhcnkgZGVzaWduIGFsbG93cyBmb3IgYXJiaXRyYXJ5CisJc2NhbGluZyByYXRpb3MgYnV0IHRoaXMgaXMgbm90IGxpa2VseSB0byBiZSBpbXBsZW1lbnRlZCBhbnkgdGltZSBzb29uLikKKwlTbWFsbGVyIHNjYWxpbmcgcmF0aW9zIHBlcm1pdCBzaWduaWZpY2FudGx5IGZhc3RlciBkZWNvZGluZyBzaW5jZQorCWZld2VyIHBpeGVscyBuZWVkIGJlIHByb2Nlc3NlZCBhbmQgYSBzaW1wbGVyIElEQ1QgbWV0aG9kIGNhbiBiZSB1c2VkLgorCitib29sZWFuIHF1YW50aXplX2NvbG9ycworCUlmIHNldCBUUlVFLCBjb2xvcm1hcHBlZCBvdXRwdXQgd2lsbCBiZSBkZWxpdmVyZWQuICBEZWZhdWx0IGlzIEZBTFNFLAorCW1lYW5pbmcgdGhhdCBmdWxsLWNvbG9yIG91dHB1dCB3aWxsIGJlIGRlbGl2ZXJlZC4KKworVGhlIG5leHQgdGhyZWUgcGFyYW1ldGVycyBhcmUgcmVsZXZhbnQgb25seSBpZiBxdWFudGl6ZV9jb2xvcnMgaXMgVFJVRS4KKworaW50IGRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycworCU1heGltdW0gbnVtYmVyIG9mIGNvbG9ycyB0byB1c2UgaW4gZ2VuZXJhdGluZyBhIGxpYnJhcnktc3VwcGxpZWQgY29sb3IKKwltYXAgKHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvbG9ycyBpcyByZXR1cm5lZCBpbiBhIGRpZmZlcmVudCBmaWVsZCkuCisJRGVmYXVsdCAyNTYuICBJZ25vcmVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN1cHBsaWVzIGl0cyBvd24gY29sb3IgbWFwLgorCitib29sZWFuIHR3b19wYXNzX3F1YW50aXplCisJSWYgVFJVRSwgYW4gZXh0cmEgcGFzcyBvdmVyIHRoZSBpbWFnZSBpcyBtYWRlIHRvIHNlbGVjdCBhIGN1c3RvbSBjb2xvcgorCW1hcCBmb3IgdGhlIGltYWdlLiAgVGhpcyB1c3VhbGx5IGxvb2tzIGEgbG90IGJldHRlciB0aGFuIHRoZSBvbmUtc2l6ZS0KKwlmaXRzLWFsbCBjb2xvcm1hcCB0aGF0IGlzIHVzZWQgb3RoZXJ3aXNlLiAgRGVmYXVsdCBpcyBUUlVFLiAgSWdub3JlZAorCXdoZW4gdGhlIGFwcGxpY2F0aW9uIHN1cHBsaWVzIGl0cyBvd24gY29sb3IgbWFwLgorCitKX0RJVEhFUl9NT0RFIGRpdGhlcl9tb2RlCisJU2VsZWN0cyBjb2xvciBkaXRoZXJpbmcgbWV0aG9kLiAgU3VwcG9ydGVkIHZhbHVlcyBhcmU6CisJCUpESVRIRVJfTk9ORQlubyBkaXRoZXJpbmc6IGZhc3QsIHZlcnkgbG93IHF1YWxpdHkKKwkJSkRJVEhFUl9PUkRFUkVECW9yZGVyZWQgZGl0aGVyOiBtb2RlcmF0ZSBzcGVlZCBhbmQgcXVhbGl0eQorCQlKRElUSEVSX0ZTCUZsb3lkLVN0ZWluYmVyZyBkaXRoZXI6IHNsb3csIGhpZ2ggcXVhbGl0eQorCURlZmF1bHQgaXMgSkRJVEhFUl9GUy4gIChBdCBwcmVzZW50LCBvcmRlcmVkIGRpdGhlciBpcyBpbXBsZW1lbnRlZAorCW9ubHkgaW4gdGhlIHNpbmdsZS1wYXNzLCBzdGFuZGFyZC1jb2xvcm1hcCBjYXNlLiAgSWYgeW91IGFzayBmb3IKKwlvcmRlcmVkIGRpdGhlciB3aGVuIHR3b19wYXNzX3F1YW50aXplIGlzIFRSVUUgb3Igd2hlbiB5b3Ugc3VwcGx5CisJYW4gZXh0ZXJuYWwgY29sb3IgbWFwLCB5b3UnbGwgZ2V0IEYtUyBkaXRoZXJpbmcuKQorCitXaGVuIHF1YW50aXplX2NvbG9ycyBpcyBUUlVFLCB0aGUgdGFyZ2V0IGNvbG9yIG1hcCBpcyBkZXNjcmliZWQgYnkgdGhlIG5leHQKK3R3byBmaWVsZHMuICBjb2xvcm1hcCBpcyBzZXQgdG8gTlVMTCBieSBqcGVnX3JlYWRfaGVhZGVyKCkuICBUaGUgYXBwbGljYXRpb24KK2NhbiBzdXBwbHkgYSBjb2xvciBtYXAgYnkgc2V0dGluZyBjb2xvcm1hcCBub24tTlVMTCBhbmQgc2V0dGluZworYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgdG8gdGhlIG1hcCBzaXplLiAgT3RoZXJ3aXNlLCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKQorc2VsZWN0cyBhIHN1aXRhYmxlIGNvbG9yIG1hcCBhbmQgc2V0cyB0aGVzZSB0d28gZmllbGRzIGl0c2VsZi4KK1tJbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbjogYXQgcHJlc2VudCwgYW4gZXh0ZXJuYWxseSBzdXBwbGllZCBjb2xvcm1hcCBpcworb25seSBhY2NlcHRlZCBmb3IgMy1jb21wb25lbnQgb3V0cHV0IGNvbG9yIHNwYWNlcy5dCisKK0pTQU1QQVJSQVkgY29sb3JtYXAKKwlUaGUgY29sb3IgbWFwLCByZXByZXNlbnRlZCBhcyBhIDItRCBwaXhlbCBhcnJheSBvZiBvdXRfY29sb3JfY29tcG9uZW50cworCXJvd3MgYW5kIGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzIGNvbHVtbnMuICBJZ25vcmVkIGlmIG5vdCBxdWFudGl6aW5nLgorCUNBVVRJT046IGlmIHRoZSBKUEVHIGxpYnJhcnkgY3JlYXRlcyBpdHMgb3duIGNvbG9ybWFwLCB0aGUgc3RvcmFnZQorCXBvaW50ZWQgdG8gYnkgdGhpcyBmaWVsZCBpcyByZWxlYXNlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkuCisJQ29weSB0aGUgY29sb3JtYXAgc29tZXdoZXJlIGVsc2UgZmlyc3QsIGlmIHlvdSB3YW50IHRvIHNhdmUgaXQuCisKK2ludCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycworCVRoZSBudW1iZXIgb2YgY29sb3JzIGluIHRoZSBjb2xvciBtYXAuCisKK0FkZGl0aW9uYWwgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIG1heSBzZXQgaW5jbHVkZToKKworSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2QKKwlTZWxlY3RzIHRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIERDVCBzdGVwLiAgQ2hvaWNlcyBhcmUgdGhlIHNhbWUKKwlhcyBkZXNjcmliZWQgYWJvdmUgZm9yIGNvbXByZXNzaW9uLgorCitib29sZWFuIGRvX2ZhbmN5X3Vwc2FtcGxpbmcKKwlJZiBUUlVFLCBkbyBjYXJlZnVsIHVwc2FtcGxpbmcgb2YgY2hyb21hIGNvbXBvbmVudHMuICBJZiBGQUxTRSwKKwlhIGZhc3RlciBidXQgc2xvcHBpZXIgbWV0aG9kIGlzIHVzZWQuICBEZWZhdWx0IGlzIFRSVUUuICBUaGUgdmlzdWFsCisJaW1wYWN0IG9mIHRoZSBzbG9wcGllciBtZXRob2QgaXMgb2Z0ZW4gdmVyeSBzbWFsbC4KKworYm9vbGVhbiBkb19ibG9ja19zbW9vdGhpbmcKKwlJZiBUUlVFLCBpbnRlcmJsb2NrIHNtb290aGluZyBpcyBhcHBsaWVkIGluIGVhcmx5IHN0YWdlcyBvZiBkZWNvZGluZworCXByb2dyZXNzaXZlIEpQRUcgZmlsZXM7IGlmIEZBTFNFLCBub3QuICBEZWZhdWx0IGlzIFRSVUUuICBFYXJseQorCXByb2dyZXNzaW9uIHN0YWdlcyBsb29rICJmdXp6eSIgd2l0aCBzbW9vdGhpbmcsICJibG9ja3kiIHdpdGhvdXQuCisJSW4gYW55IGNhc2UsIGJsb2NrIHNtb290aGluZyBjZWFzZXMgdG8gYmUgYXBwbGllZCBhZnRlciB0aGUgZmlyc3QgZmV3CisJQUMgY29lZmZpY2llbnRzIGFyZSBrbm93biB0byBmdWxsIGFjY3VyYWN5LCBzbyBpdCBpcyByZWxldmFudCBvbmx5CisJd2hlbiB1c2luZyBidWZmZXJlZC1pbWFnZSBtb2RlIGZvciBwcm9ncmVzc2l2ZSBpbWFnZXMuCisKK2Jvb2xlYW4gZW5hYmxlXzFwYXNzX3F1YW50Citib29sZWFuIGVuYWJsZV9leHRlcm5hbF9xdWFudAorYm9vbGVhbiBlbmFibGVfMnBhc3NfcXVhbnQKKwlUaGVzZSBhcmUgc2lnbmlmaWNhbnQgb25seSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB3aGljaCBpcworCWRlc2NyaWJlZCBpbiBpdHMgb3duIHNlY3Rpb24gYmVsb3cuCisKKworVGhlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFyZSBnaXZlbiBieSB0aGUgZm9sbG93aW5nIGZpZWxkcy4gIFRoZXNlIGFyZQorY29tcHV0ZWQgZnJvbSB0aGUgc291cmNlIGltYWdlIGRpbWVuc2lvbnMgYW5kIHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKK2J5IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgWW91IGNhbiBhbHNvIGNhbGwganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkKK3RvIG9idGFpbiB0aGUgdmFsdWVzIHRoYXQgd2lsbCByZXN1bHQgZnJvbSB0aGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0dGluZ3MuCitUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSB0cnlpbmcgdG8gcGljayBhIHNjYWxpbmcgcmF0aW8gdGhhdCB3aWxsIGdldAorY2xvc2UgdG8gYSBkZXNpcmVkIHRhcmdldCBzaXplLiAgSXQncyBhbHNvIGltcG9ydGFudCBpZiB5b3UgYXJlIHVzaW5nIHRoZQorSlBFRyBsaWJyYXJ5J3MgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBzcGFjZSwgYmVjYXVzZSB5b3UKK2FyZSBzdXBwb3NlZCB0byByZXF1ZXN0IHN1Y2ggYnVmZmVycyAqYmVmb3JlKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKworSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGgJCUFjdHVhbCBkaW1lbnNpb25zIG9mIG91dHB1dCBpbWFnZS4KK0pESU1FTlNJT04gb3V0cHV0X2hlaWdodAoraW50IG91dF9jb2xvcl9jb21wb25lbnRzCU51bWJlciBvZiBjb2xvciBjb21wb25lbnRzIGluIG91dF9jb2xvcl9zcGFjZS4KK2ludCBvdXRwdXRfY29tcG9uZW50cwkJTnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgcmV0dXJuZWQuCitpbnQgcmVjX291dGJ1Zl9oZWlnaHQJCVJlY29tbWVuZGVkIGhlaWdodCBvZiBzY2FubGluZSBidWZmZXIuCisKK1doZW4gcXVhbnRpemluZyBjb2xvcnMsIG91dHB1dF9jb21wb25lbnRzIGlzIDEsIGluZGljYXRpbmcgYSBzaW5nbGUgY29sb3IgbWFwCitpbmRleCBwZXIgcGl4ZWwuICBPdGhlcndpc2UgaXQgZXF1YWxzIG91dF9jb2xvcl9jb21wb25lbnRzLiAgVGhlIG91dHB1dCBhcnJheXMKK2FyZSByZXF1aXJlZCB0byBiZSBvdXRwdXRfd2lkdGggKiBvdXRwdXRfY29tcG9uZW50cyBKU0FNUExFcyB3aWRlLgorCityZWNfb3V0YnVmX2hlaWdodCBpcyB0aGUgcmVjb21tZW5kZWQgbWluaW11bSBoZWlnaHQgKGluIHNjYW5saW5lcykgb2YgdGhlCitidWZmZXIgcGFzc2VkIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKS4gIElmIHRoZSBidWZmZXIgaXMgc21hbGxlciwgdGhlCitsaWJyYXJ5IHdpbGwgc3RpbGwgd29yaywgYnV0IHRpbWUgd2lsbCBiZSB3YXN0ZWQgZHVlIHRvIHVubmVjZXNzYXJ5IGRhdGEKK2NvcHlpbmcuICBJbiBoaWdoLXF1YWxpdHkgbW9kZXMsIHJlY19vdXRidWZfaGVpZ2h0IGlzIGFsd2F5cyAxLCBidXQgc29tZQorZmFzdGVyLCBsb3dlci1xdWFsaXR5IG1vZGVzIHNldCBpdCB0byBsYXJnZXIgdmFsdWVzICh0eXBpY2FsbHkgMiB0byA0KS4KK0lmIHlvdSBhcmUgZ29pbmcgdG8gYXNrIGZvciBhIGhpZ2gtc3BlZWQgcHJvY2Vzc2luZyBtb2RlLCB5b3UgbWF5IGFzIHdlbGwKK2dvIHRvIHRoZSB0cm91YmxlIG9mIGhvbm9yaW5nIHJlY19vdXRidWZfaGVpZ2h0IHNvIGFzIHRvIGF2b2lkIGRhdGEgY29weWluZy4KKyhBbiBvdXRwdXQgYnVmZmVyIGxhcmdlciB0aGFuIHJlY19vdXRidWZfaGVpZ2h0IGxpbmVzIGlzIE9LLCBidXQgd29uJ3QKK3Byb3ZpZGUgYW55IG1hdGVyaWFsIHNwZWVkIGltcHJvdmVtZW50IG92ZXIgdGhhdCBoZWlnaHQuKQorCisKK1NwZWNpYWwgY29sb3Igc3BhY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgSlBFRyBzdGFuZGFyZCBpdHNlbGYgaXMgImNvbG9yIGJsaW5kIiBhbmQgZG9lc24ndCBzcGVjaWZ5IGFueSBwYXJ0aWN1bGFyCitjb2xvciBzcGFjZS4gIEl0IGlzIGN1c3RvbWFyeSB0byBjb252ZXJ0IGNvbG9yIGRhdGEgdG8gYSBsdW1pbmFuY2UvY2hyb21pbmFuY2UKK2NvbG9yIHNwYWNlIGJlZm9yZSBjb21wcmVzc2luZywgc2luY2UgdGhpcyBwZXJtaXRzIGdyZWF0ZXIgY29tcHJlc3Npb24uICBUaGUKK2V4aXN0aW5nIGRlLWZhY3RvIEpQRUcgZmlsZSBmb3JtYXQgc3RhbmRhcmRzIHNwZWNpZnkgWUNiQ3Igb3IgZ3JheXNjYWxlIGRhdGEKKyhKRklGKSwgb3IgZ3JheXNjYWxlLCBSR0IsIFlDYkNyLCBDTVlLLCBvciBZQ0NLIChBZG9iZSkuICBGb3Igc3BlY2lhbAorYXBwbGljYXRpb25zIHN1Y2ggYXMgbXVsdGlzcGVjdHJhbCBpbWFnZXMsIG90aGVyIGNvbG9yIHNwYWNlcyBjYW4gYmUgdXNlZCwKK2J1dCBpdCBtdXN0IGJlIHVuZGVyc3Rvb2QgdGhhdCBzdWNoIGZpbGVzIHdpbGwgYmUgdW5wb3J0YWJsZS4KKworVGhlIEpQRUcgbGlicmFyeSBjYW4gaGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBjb2xvcnNwYWNlIGNvbnZlcnNpb25zIChuYW1lbHkKK1JHQiA8PT4gWUNiQ3IgYW5kIENNWUsgPD0+IFlDQ0spLiAgSXQgY2FuIGFsc28gZGVhbCB3aXRoIGRhdGEgb2YgYW4gdW5rbm93bgorY29sb3Igc3BhY2UsIHBhc3NpbmcgaXQgdGhyb3VnaCB3aXRob3V0IGNvbnZlcnNpb24uICBJZiB5b3UgZGVhbCBleHRlbnNpdmVseQord2l0aCBhbiB1bnVzdWFsIGNvbG9yIHNwYWNlLCB5b3UgY2FuIGVhc2lseSBleHRlbmQgdGhlIGxpYnJhcnkgdG8gdW5kZXJzdGFuZAorYWRkaXRpb25hbCBjb2xvciBzcGFjZXMgYW5kIHBlcmZvcm0gYXBwcm9wcmlhdGUgY29udmVyc2lvbnMuCisKK0ZvciBjb21wcmVzc2lvbiwgdGhlIHNvdXJjZSBkYXRhJ3MgY29sb3Igc3BhY2UgaXMgc3BlY2lmaWVkIGJ5IGZpZWxkCitpbl9jb2xvcl9zcGFjZS4gIFRoaXMgaXMgdHJhbnNmb3JtZWQgdG8gdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGdpdmVuCitieSBqcGVnX2NvbG9yX3NwYWNlLiAganBlZ19zZXRfZGVmYXVsdHMoKSBjaG9vc2VzIGEgcmVhc29uYWJsZSBKUEVHIGNvbG9yCitzcGFjZSBkZXBlbmRpbmcgb24gaW5fY29sb3Jfc3BhY2UsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgY2FsbGluZworanBlZ19zZXRfY29sb3JzcGFjZSgpLiAgT2YgY291cnNlIHlvdSBtdXN0IHNlbGVjdCBhIHN1cHBvcnRlZCB0cmFuc2Zvcm1hdGlvbi4KK2pjY29sb3IuYyBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbnM6CisJUkdCID0+IFlDYkNyCisJUkdCID0+IEdSQVlTQ0FMRQorCVlDYkNyID0+IEdSQVlTQ0FMRQorCUNNWUsgPT4gWUNDSworcGx1cyB0aGUgbnVsbCB0cmFuc2Zvcm1zOiBHUkFZU0NBTEUgPT4gR1JBWVNDQUxFLCBSR0IgPT4gUkdCLAorWUNiQ3IgPT4gWUNiQ3IsIENNWUsgPT4gQ01ZSywgWUNDSyA9PiBZQ0NLLCBhbmQgVU5LTk9XTiA9PiBVTktOT1dOLgorCitUaGUgZGUtZmFjdG8gZmlsZSBmb3JtYXQgc3RhbmRhcmRzIChKRklGIGFuZCBBZG9iZSkgc3BlY2lmeSBBUFBuIG1hcmtlcnMgdGhhdAoraW5kaWNhdGUgdGhlIGNvbG9yIHNwYWNlIG9mIHRoZSBKUEVHIGZpbGUuICBJdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQKK3RoZXNlIGFyZSB3cml0dGVuIGNvcnJlY3RseSwgb3Igb21pdHRlZCBpZiB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgaXMgbm90CitvbmUgb2YgdGhlIG9uZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZS1mYWN0byBzdGFuZGFyZHMuICBqcGVnX3NldF9jb2xvcnNwYWNlKCkKK3dpbGwgc2V0IHRoZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgb3Igb21pdCB0aGUgQVBQbiBtYXJrZXJzCitwcm9wZXJseSwgc28gbG9uZyBhcyBpdCBpcyB0b2xkIHRoZSB0cnV0aCBhYm91dCB0aGUgSlBFRyBjb2xvciBzcGFjZS4KK0ZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHdyaXRpbmcgc29tZSByYW5kb20gMy1jb21wb25lbnQgY29sb3Igc3BhY2Ugd2l0aG91dAorY29udmVyc2lvbiwgZG9uJ3QgdHJ5IHRvIGZha2Ugb3V0IHRoZSBsaWJyYXJ5IGJ5IHNldHRpbmcgaW5fY29sb3Jfc3BhY2UgYW5kCitqcGVnX2NvbG9yX3NwYWNlIHRvIEpDU19ZQ2JDcjsgdXNlIEpDU19VTktOT1dOLiAgWW91IG1heSB3YW50IHRvIHdyaXRlIGFuCitBUFBuIG1hcmtlciBvZiB5b3VyIG93biBkZXZpc2luZyB0byBpZGVudGlmeSB0aGUgY29sb3JzcGFjZSAtLS0gc2VlICJTcGVjaWFsCittYXJrZXJzIiwgYmVsb3cuCisKK1doZW4gdG9sZCB0aGF0IHRoZSBjb2xvciBzcGFjZSBpcyBVTktOT1dOLCB0aGUgbGlicmFyeSB3aWxsIGRlZmF1bHQgdG8gdXNpbmcKK2x1bWluYW5jZS1xdWFsaXR5IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZm9yIGFsbCBjb2xvciBjb21wb25lbnRzLiAgWW91IG1heQord2VsbCB3YW50IHRvIGNoYW5nZSB0aGVzZSBwYXJhbWV0ZXJzLiAgU2VlIHRoZSBzb3VyY2UgY29kZSBmb3IKK2pwZWdfc2V0X2NvbG9yc3BhY2UoKSwgaW4gamNwYXJhbS5jLCBmb3IgZGV0YWlscy4KKworRm9yIGRlY29tcHJlc3Npb24sIHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBpcyBnaXZlbiBpbiBqcGVnX2NvbG9yX3NwYWNlLAorYW5kIHRoaXMgaXMgdHJhbnNmb3JtZWQgdG8gdGhlIG91dHB1dCBjb2xvciBzcGFjZSBvdXRfY29sb3Jfc3BhY2UuCitqcGVnX3JlYWRfaGVhZGVyJ3Mgc2V0dGluZyBvZiBqcGVnX2NvbG9yX3NwYWNlIGNhbiBiZSByZWxpZWQgb24gaWYgdGhlIGZpbGUKK2NvbmZvcm1zIHRvIEpGSUYgb3IgQWRvYmUgY29udmVudGlvbnMsIGJ1dCBvdGhlcndpc2UgaXQgaXMgbm8gYmV0dGVyIHRoYW4gYQorZ3Vlc3MuICBJZiB5b3Uga25vdyB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgZm9yIGNlcnRhaW4sIHlvdSBjYW4gb3ZlcnJpZGUKK2pwZWdfcmVhZF9oZWFkZXIncyBndWVzcyBieSBzZXR0aW5nIGpwZWdfY29sb3Jfc3BhY2UuICBqcGVnX3JlYWRfaGVhZGVyIGFsc28KK3NlbGVjdHMgYSBkZWZhdWx0IG91dHB1dCBjb2xvciBzcGFjZSBiYXNlZCBvbiAoaXRzIGd1ZXNzIG9mKSBqcGVnX2NvbG9yX3NwYWNlOworc2V0IG91dF9jb2xvcl9zcGFjZSB0byBvdmVycmlkZSB0aGlzLiAgQWdhaW4sIHlvdSBtdXN0IHNlbGVjdCBhIHN1cHBvcnRlZAordHJhbnNmb3JtYXRpb24uICBqZGNvbG9yLmMgY3VycmVudGx5IHN1cHBvcnRzCisJWUNiQ3IgPT4gR1JBWVNDQUxFCisJWUNiQ3IgPT4gUkdCCisJR1JBWVNDQUxFID0+IFJHQgorCVlDQ0sgPT4gQ01ZSworYXMgd2VsbCBhcyB0aGUgbnVsbCB0cmFuc2Zvcm1zLiAgKFNpbmNlIEdSQVlTQ0FMRT0+UkdCIGlzIHByb3ZpZGVkLCBhbgorYXBwbGljYXRpb24gY2FuIGZvcmNlIGdyYXlzY2FsZSBKUEVHcyB0byBsb29rIGxpa2UgY29sb3IgSlBFR3MgaWYgaXQgb25seQord2FudHMgdG8gaGFuZGxlIG9uZSBjYXNlLikKKworVGhlIHR3by1wYXNzIGNvbG9yIHF1YW50aXplciwganF1YW50Mi5jLCBpcyBzcGVjaWFsaXplZCB0byBoYW5kbGUgUkdCIGRhdGEKKyhpdCB3ZWlnaHRzIGRpc3RhbmNlcyBhcHByb3ByaWF0ZWx5IGZvciBSR0IgY29sb3JzKS4gIFlvdSdsbCBuZWVkIHRvIG1vZGlmeQordGhlIGNvZGUgaWYgeW91IHdhbnQgdG8gdXNlIGl0IGZvciBub24tUkdCIG91dHB1dCBjb2xvciBzcGFjZXMuICBOb3RlIHRoYXQKK2pxdWFudDIuYyBpcyB1c2VkIHRvIG1hcCB0byBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBjb2xvcm1hcCBhcyB3ZWxsIGFzIGZvcgordGhlIG5vcm1hbCB0d28tcGFzcyBjb2xvcm1hcCBzZWxlY3Rpb24gcHJvY2Vzcy4KKworQ0FVVElPTjogaXQgYXBwZWFycyB0aGF0IEFkb2JlIFBob3Rvc2hvcCB3cml0ZXMgaW52ZXJ0ZWQgZGF0YSBpbiBDTVlLIEpQRUcKK2ZpbGVzOiAwIHJlcHJlc2VudHMgMTAwJSBpbmsgY292ZXJhZ2UsIHJhdGhlciB0aGFuIDAlIGluayBhcyB5b3UnZCBleHBlY3QuCitUaGlzIGlzIGFyZ3VhYmx5IGEgYnVnIGluIFBob3Rvc2hvcCwgYnV0IGlmIHlvdSBuZWVkIHRvIHdvcmsgd2l0aCBQaG90b3Nob3AKK0NNWUsgZmlsZXMsIHlvdSB3aWxsIGhhdmUgdG8gZGVhbCB3aXRoIGl0IGluIHlvdXIgYXBwbGljYXRpb24uICBXZSBjYW5ub3QKKyJmaXgiIHRoaXMgaW4gdGhlIGxpYnJhcnkgYnkgaW52ZXJ0aW5nIHRoZSBkYXRhIGR1cmluZyB0aGUgQ01ZSzw9PllDQ0sKK3RyYW5zZm9ybSwgYmVjYXVzZSB0aGF0IHdvdWxkIGJyZWFrIG90aGVyIGFwcGxpY2F0aW9ucywgbm90YWJseSBHaG9zdHNjcmlwdC4KK1Bob3Rvc2hvcCB2ZXJzaW9ucyBwcmlvciB0byAzLjAgd3JpdGUgRVBTIGZpbGVzIGNvbnRhaW5pbmcgSlBFRy1lbmNvZGVkIENNWUsKK2RhdGEgaW4gdGhlIHNhbWUgaW52ZXJ0ZWQtWUNDSyByZXByZXNlbnRhdGlvbiB1c2VkIGluIGJhcmUgSlBFRyBmaWxlcywgYnV0Cit0aGUgc3Vycm91bmRpbmcgUG9zdFNjcmlwdCBjb2RlIHBlcmZvcm1zIGFuIGludmVyc2lvbiB1c2luZyB0aGUgUFMgaW1hZ2UKK29wZXJhdG9yLiAgSSBhbSB0b2xkIHRoYXQgUGhvdG9zaG9wIDMuMCB3aWxsIHdyaXRlIHVuaW52ZXJ0ZWQgWUNDSyBpbgorRVBTL0pQRUcgZmlsZXMsIGFuZCB3aWxsIG9taXQgdGhlIFBTLWxldmVsIGludmVyc2lvbi4gIChCdXQgdGhlIGRhdGEKK3BvbGFyaXR5IHVzZWQgaW4gYmFyZSBKUEVHIGZpbGVzIHdpbGwgbm90IGNoYW5nZSBpbiAzLjAuKSAgSW4gZWl0aGVyIGNhc2UsCit0aGUgSlBFRyBsaWJyYXJ5IG11c3Qgbm90IGludmVydCB0aGUgZGF0YSBpdHNlbGYsIG9yIGVsc2UgR2hvc3RzY3JpcHQgd291bGQKK3JlYWQgdGhlc2UgRVBTIGZpbGVzIGluY29ycmVjdGx5LgorCisKK0Vycm9yIGhhbmRsaW5nCistLS0tLS0tLS0tLS0tLQorCitXaGVuIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgaXMgdXNlZCwgYW55IGVycm9yIGRldGVjdGVkIGluc2lkZSB0aGUgSlBFRworcm91dGluZXMgd2lsbCBjYXVzZSBhIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZCBvbiBzdGRlcnIsIGZvbGxvd2VkIGJ5IGV4aXQoKS4KK1lvdSBjYW4gc3VwcGx5IHlvdXIgb3duIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IKK2FuZCB0byBjb250cm9sIHRoZSB0cmVhdG1lbnQgb2Ygbm9uZmF0YWwgd2FybmluZ3MgYW5kIHRyYWNlL2RlYnVnIG1lc3NhZ2VzLgorVGhlIGZpbGUgZXhhbXBsZS5jIGlsbHVzdHJhdGVzIHRoZSBtb3N0IGNvbW1vbiBjYXNlLCB3aGljaCBpcyB0byBoYXZlIHRoZQorYXBwbGljYXRpb24gcmVnYWluIGNvbnRyb2wgYWZ0ZXIgYW4gZXJyb3IgcmF0aGVyIHRoYW4gZXhpdGluZy4KKworVGhlIEpQRUcgbGlicmFyeSBuZXZlciB3cml0ZXMgYW55IG1lc3NhZ2UgZGlyZWN0bHk7IGl0IGFsd2F5cyBnb2VzIHRocm91Z2gKK3RoZSBlcnJvciBoYW5kbGluZyByb3V0aW5lcy4gIFRocmVlIGNsYXNzZXMgb2YgbWVzc2FnZXMgYXJlIHJlY29nbml6ZWQ6CisgICogRmF0YWwgZXJyb3JzOiB0aGUgbGlicmFyeSBjYW5ub3QgY29udGludWUuCisgICogV2FybmluZ3M6IHRoZSBsaWJyYXJ5IGNhbiBjb250aW51ZSwgYnV0IHRoZSBkYXRhIGlzIGNvcnJ1cHQsIGFuZCBhCisgICAgZGFtYWdlZCBvdXRwdXQgaW1hZ2UgaXMgbGlrZWx5IHRvIHJlc3VsdC4KKyAgKiBUcmFjZS9pbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLiAgVGhlc2UgY29tZSB3aXRoIGEgdHJhY2UgbGV2ZWwgaW5kaWNhdGluZworICAgIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBtZXNzYWdlOyB5b3UgY2FuIGNvbnRyb2wgdGhlIHZlcmJvc2l0eSBvZiB0aGUKKyAgICBwcm9ncmFtIGJ5IGFkanVzdGluZyB0aGUgbWF4aW11bSB0cmFjZSBsZXZlbCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkLgorCitZb3UgbWF5LCBpZiB5b3Ugd2lzaCwgc2ltcGx5IHJlcGxhY2UgdGhlIGVudGlyZSBKUEVHIGVycm9yIGhhbmRsaW5nIG1vZHVsZQorKGplcnJvci5jKSB3aXRoIHlvdXIgb3duIGNvZGUuICBIb3dldmVyLCB5b3UgY2FuIGF2b2lkIGNvZGUgZHVwbGljYXRpb24gYnkKK29ubHkgcmVwbGFjaW5nIHNvbWUgb2YgdGhlIHJvdXRpbmVzIGRlcGVuZGluZyBvbiB0aGUgYmVoYXZpb3IgeW91IG5lZWQuCitUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBjYWxsaW5nIGpwZWdfc3RkX2Vycm9yKCkgYXMgdXN1YWwsIGJ1dCB0aGVuIG92ZXJyaWRpbmcKK3NvbWUgb2YgdGhlIG1ldGhvZCBwb2ludGVycyBpbiB0aGUganBlZ19lcnJvcl9tZ3Igc3RydWN0LCBhcyBpbGx1c3RyYXRlZCBieQorZXhhbXBsZS5jLgorCitBbGwgb2YgdGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHdpbGwgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gdGhlIEpQRUcgb2JqZWN0CisoYSBqX2NvbW1vbl9wdHIgd2hpY2ggcG9pbnRzIHRvIGVpdGhlciBhIGpwZWdfY29tcHJlc3Nfc3RydWN0IG9yIGEKK2pwZWdfZGVjb21wcmVzc19zdHJ1Y3Q7IGlmIHlvdSBuZWVkIHRvIHRlbGwgd2hpY2gsIHRlc3QgdGhlIGlzX2RlY29tcHJlc3NvcgorZmllbGQpLiAgVGhpcyBzdHJ1Y3QgaW5jbHVkZXMgYSBwb2ludGVyIHRvIHRoZSBlcnJvciBtYW5hZ2VyIHN0cnVjdCBpbiBpdHMKKyJlcnIiIGZpZWxkLiAgRnJlcXVlbnRseSwgY3VzdG9tIGVycm9yIGhhbmRsZXIgcm91dGluZXMgd2lsbCBuZWVkIHRvIGFjY2VzcworYWRkaXRpb25hbCBkYXRhIHdoaWNoIGlzIG5vdCBrbm93biB0byB0aGUgSlBFRyBsaWJyYXJ5IG9yIHRoZSBzdGFuZGFyZCBlcnJvcgoraGFuZGxlci4gIFRoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIGRvIHRoaXMgaXMgdG8gZW1iZWQgZWl0aGVyIHRoZSBKUEVHCitvYmplY3Qgb3IgdGhlIGpwZWdfZXJyb3JfbWdyIHN0cnVjdCBpbiBhIGxhcmdlciBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworYWRkaXRpb25hbCBmaWVsZHM7IHRoZW4gY2FzdGluZyB0aGUgcGFzc2VkIHBvaW50ZXIgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorYWRkaXRpb25hbCBmaWVsZHMuICBBZ2Fpbiwgc2VlIGV4YW1wbGUuYyBmb3Igb25lIHdheSB0byBkbyBpdC4gIChCZWdpbm5pbmcKK3dpdGggSUpHIHZlcnNpb24gNmIsIHRoZXJlIGlzIGFsc28gYSB2b2lkIHBvaW50ZXIgImNsaWVudF9kYXRhIiBpbiBlYWNoCitKUEVHIG9iamVjdCwgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGNhbiBhbHNvIHVzZSB0byBmaW5kIHJlbGF0ZWQgZGF0YS4KK1RoZSBsaWJyYXJ5IGRvZXMgbm90IHRvdWNoIGNsaWVudF9kYXRhIGF0IGFsbC4pCisKK1RoZSBpbmRpdmlkdWFsIG1ldGhvZHMgdGhhdCB5b3UgbWlnaHQgd2lzaCB0byBvdmVycmlkZSBhcmU6CisKK2Vycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKKwlSZWNlaXZlcyBjb250cm9sIGZvciBhIGZhdGFsIGVycm9yLiAgSW5mb3JtYXRpb24gc3VmZmljaWVudCB0bworCWdlbmVyYXRlIHRoZSBlcnJvciBtZXNzYWdlIGhhcyBiZWVuIHN0b3JlZCBpbiBjaW5mby0+ZXJyOyBjYWxsCisJb3V0cHV0X21lc3NhZ2UgdG8gZGlzcGxheSBpdC4gIENvbnRyb2wgbXVzdCBOT1QgcmV0dXJuIHRvIHRoZSBjYWxsZXI7CisJZ2VuZXJhbGx5IHRoaXMgcm91dGluZSB3aWxsIGV4aXQoKSBvciBsb25nam1wKCkgc29tZXdoZXJlLgorCVR5cGljYWxseSB5b3Ugd291bGQgb3ZlcnJpZGUgdGhpcyByb3V0aW5lIHRvIGdldCByaWQgb2YgdGhlIGV4aXQoKQorCWRlZmF1bHQgYmVoYXZpb3IuICBOb3RlIHRoYXQgaWYgeW91IGNvbnRpbnVlIHByb2Nlc3NpbmcsIHlvdSBzaG91bGQKKwljbGVhbiB1cCB0aGUgSlBFRyBvYmplY3Qgd2l0aCBqcGVnX2Fib3J0KCkgb3IganBlZ19kZXN0cm95KCkuCisKK291dHB1dF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8pCisJQWN0dWFsIG91dHB1dCBvZiBhbnkgSlBFRyBtZXNzYWdlLiAgT3ZlcnJpZGUgdGhpcyB0byBzZW5kIG1lc3NhZ2VzCisJc29tZXdoZXJlIG90aGVyIHRoYW4gc3RkZXJyLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGtub3cKKwlob3cgdG8gZ2VuZXJhdGUgYSBtZXNzYWdlLCBvbmx5IHdoZXJlIHRvIHNlbmQgaXQuCisKK2Zvcm1hdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpCisJQ29uc3RydWN0cyBhIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIGJhc2VkIG9uIHRoZSBlcnJvciBpbmZvCisJc3RvcmVkIGluIGNpbmZvLT5lcnIuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgb3V0cHV0X21lc3NhZ2UuICBGZXcKKwlhcHBsaWNhdGlvbnMgc2hvdWxkIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuICBPbmUgcG9zc2libGUKKwlyZWFzb24gZm9yIGRvaW5nIHNvIGlzIHRvIGltcGxlbWVudCBkeW5hbWljIHN3aXRjaGluZyBvZiBlcnJvciBtZXNzYWdlCisJbGFuZ3VhZ2UuCisKK2VtaXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKQorCURlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBlbWl0IGEgd2FybmluZyBvciB0cmFjZSBtZXNzYWdlOyBpZiBzbywKKwljYWxscyBvdXRwdXRfbWVzc2FnZS4gIFRoZSBtYWluIHJlYXNvbiBmb3Igb3ZlcnJpZGluZyB0aGlzIG1ldGhvZAorCXdvdWxkIGJlIHRvIGFib3J0IG9uIHdhcm5pbmdzLiAgbXNnX2xldmVsIGlzIC0xIGZvciB3YXJuaW5ncywKKwkwIGFuZCB1cCBmb3IgdHJhY2UgbWVzc2FnZXMuCisKK09ubHkgZXJyb3JfZXhpdCgpIGFuZCBlbWl0X21lc3NhZ2UoKSBhcmUgY2FsbGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIEpQRUcKK2xpYnJhcnk7IHRoZSBvdGhlciB0d28gYXJlIGludGVybmFsIHRvIHRoZSBlcnJvciBoYW5kbGVyLgorCitUaGUgYWN0dWFsIG1lc3NhZ2UgdGV4dHMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGlzIHBvaW50ZWQgdG8KK2J5IHRoZSBmaWVsZCBlcnItPmpwZWdfbWVzc2FnZV90YWJsZS4gIFRoZSBtZXNzYWdlcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvCitlcnItPmxhc3RfanBlZ19tZXNzYWdlLCBhbmQgaXQgaXMgdGhlc2UgY29kZSBudW1iZXJzIHRoYXQgYXJlIHVzZWQgaW4gdGhlCitKUEVHIGxpYnJhcnkgY29kZS4gIFlvdSBjb3VsZCByZXBsYWNlIHRoZSBtZXNzYWdlIHRleHRzIChmb3IgaW5zdGFuY2UsIHdpdGgKK21lc3NhZ2VzIGluIEZyZW5jaCBvciBHZXJtYW4pIGJ5IGNoYW5naW5nIHRoZSBtZXNzYWdlIHRhYmxlIHBvaW50ZXIuICBTZWUKK2plcnJvci5oIGZvciB0aGUgZGVmYXVsdCB0ZXh0cy4gIENBVVRJT046IHRoaXMgdGFibGUgd2lsbCBhbG1vc3QgY2VydGFpbmx5CitjaGFuZ2Ugb3IgZ3JvdyBmcm9tIG9uZSBsaWJyYXJ5IHZlcnNpb24gdG8gdGhlIG5leHQuCisKK0l0IG1heSBiZSB1c2VmdWwgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGFkZCBpdHMgb3duIG1lc3NhZ2UgdGV4dHMgdGhhdCBhcmUKK2hhbmRsZWQgYnkgdGhlIHNhbWUgbWVjaGFuaXNtLiAgVGhlIGVycm9yIGhhbmRsZXIgc3VwcG9ydHMgYSBzZWNvbmQgImFkZC1vbiIKK21lc3NhZ2UgdGFibGUgZm9yIHRoaXMgcHVycG9zZS4gIFRvIGRlZmluZSBhbiBhZGRvbiB0YWJsZSwgc2V0IHRoZSBwb2ludGVyCitlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgYW5kIHRoZSBtZXNzYWdlIG51bWJlcnMgZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlIGFuZAorZXJyLT5sYXN0X2FkZG9uX21lc3NhZ2UuICBJZiB5b3UgbnVtYmVyIHRoZSBhZGRvbiBtZXNzYWdlcyBiZWdpbm5pbmcgYXQgMTAwMAorb3Igc28sIHlvdSB3b24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGNvbmZsaWN0cyB3aXRoIHRoZSBsaWJyYXJ5J3MgYnVpbHQtaW4KK21lc3NhZ2VzLiAgU2VlIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIGZvciBhbiBleGFtcGxlIG9mIHVzaW5nCithZGRvbiBtZXNzYWdlcyAodGhlIGFkZG9uIG1lc3NhZ2VzIGFyZSBkZWZpbmVkIGluIGNkZXJyb3IuaCkuCisKK0FjdHVhbCBpbnZvY2F0aW9uIG9mIHRoZSBlcnJvciBoYW5kbGVyIGlzIGRvbmUgdmlhIG1hY3JvcyBkZWZpbmVkIGluIGplcnJvci5oOgorCUVSUkVYSVRuKC4uLikJZm9yIGZhdGFsIGVycm9ycworCVdBUk5NU24oLi4uKQlmb3IgY29ycnVwdC1kYXRhIHdhcm5pbmdzCisJVFJBQ0VNU24oLi4uKQlmb3IgdHJhY2UgYW5kIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCitUaGVzZSBtYWNyb3Mgc3RvcmUgdGhlIG1lc3NhZ2UgY29kZSBhbmQgYW55IGFkZGl0aW9uYWwgcGFyYW1ldGVycyBpbnRvIHRoZQorZXJyb3IgaGFuZGxlciBzdHJ1Y3QsIHRoZW4gaW52b2tlIHRoZSBlcnJvcl9leGl0KCkgb3IgZW1pdF9tZXNzYWdlKCkgbWV0aG9kLgorVGhlIHZhcmlhbnRzIG9mIGVhY2ggbWFjcm8gYXJlIGZvciB2YXJ5aW5nIG51bWJlcnMgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLgorVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgdXNpbmcKK3N0YW5kYXJkIHByaW50ZigpIGZvcm1hdCBjb2Rlcy4KKworU2VlIGplcnJvci5oIGFuZCBqZXJyb3IuYyBmb3IgZnVydGhlciBkZXRhaWxzLgorCisKK0NvbXByZXNzZWQgZGF0YSBoYW5kbGluZyAoc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2VycykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEpQRUcgY29tcHJlc3Npb24gbGlicmFyeSBzZW5kcyBpdHMgY29tcHJlc3NlZCBkYXRhIHRvIGEgImRlc3RpbmF0aW9uCittYW5hZ2VyIiBtb2R1bGUuICBUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBtYW5hZ2VyIGp1c3Qgd3JpdGVzIHRoZSBkYXRhIHRvIGEKK3N0ZGlvIHN0cmVhbSwgYnV0IHlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biBtYW5hZ2VyIHRvIGRvIHNvbWV0aGluZyBlbHNlLgorU2ltaWxhcmx5LCB0aGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IGNhbGxzIGEgInNvdXJjZSBtYW5hZ2VyIiB0byBvYnRhaW4gdGhlCitjb21wcmVzc2VkIGRhdGE7IHlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biBzb3VyY2UgbWFuYWdlciBpZiB5b3Ugd2FudCB0aGUgZGF0YQordG8gY29tZSBmcm9tIHNvbWV3aGVyZSBvdGhlciB0aGFuIGEgc3RkaW8gc3RyZWFtLgorCitJbiBib3RoIGNhc2VzLCBjb21wcmVzc2VkIGRhdGEgaXMgcHJvY2Vzc2VkIGEgYnVmZmVybG9hZCBhdCBhIHRpbWU6IHRoZQorZGVzdGluYXRpb24gb3Igc291cmNlIG1hbmFnZXIgcHJvdmlkZXMgYSB3b3JrIGJ1ZmZlciwgYW5kIHRoZSBsaWJyYXJ5IGludm9rZXMKK3RoZSBtYW5hZ2VyIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGZpbGxlZCBvciBlbXB0aWVkLiAgKFlvdSBjb3VsZCBkZWZpbmUgYQorb25lLWNoYXJhY3RlciBidWZmZXIgdG8gZm9yY2UgdGhlIG1hbmFnZXIgdG8gYmUgaW52b2tlZCBmb3IgZWFjaCBieXRlLCBidXQKK3RoYXQgd291bGQgYmUgcmF0aGVyIGluZWZmaWNpZW50LikgIFRoZSBidWZmZXIncyBzaXplIGFuZCBsb2NhdGlvbiBhcmUKK2NvbnRyb2xsZWQgYnkgdGhlIG1hbmFnZXIsIG5vdCBieSB0aGUgbGlicmFyeS4gIEZvciBleGFtcGxlLCBpZiB5b3UgZGVzaXJlZCB0bworZGVjb21wcmVzcyBhIEpQRUcgZGF0YXN0cmVhbSB0aGF0IHdhcyBhbGwgaW4gbWVtb3J5LCB5b3UgY291bGQganVzdCBtYWtlIHRoZQorYnVmZmVyIHBvaW50ZXIgYW5kIGxlbmd0aCBwb2ludCB0byB0aGUgb3JpZ2luYWwgZGF0YSBpbiBtZW1vcnkuICBUaGVuIHRoZQorYnVmZmVyLXJlbG9hZCBwcm9jZWR1cmUgd291bGQgYmUgaW52b2tlZCBvbmx5IGlmIHRoZSBkZWNvbXByZXNzb3IgcmFuIG9mZiB0aGUKK2VuZCBvZiB0aGUgZGF0YXN0cmVhbSwgd2hpY2ggd291bGQgaW5kaWNhdGUgYW4gZXJyb25lb3VzIGRhdGFzdHJlYW0uCisKK1RoZSB3b3JrIGJ1ZmZlciBpcyBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIGRhdGF0eXBlIEpPQ1RFVCwgd2hpY2ggaXMgZ2VuZXJhbGx5CisiY2hhciIgb3IgInVuc2lnbmVkIGNoYXIiLiAgT24gYSBtYWNoaW5lIHdoZXJlIGNoYXIgaXMgbm90IGV4YWN0bHkgOCBiaXRzCit3aWRlLCB5b3UgbXVzdCBkZWZpbmUgSk9DVEVUIGFzIGEgd2lkZXIgZGF0YSB0eXBlIGFuZCB0aGVuIG1vZGlmeSB0aGUgZGF0YQorc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtb2R1bGVzIHRvIHRyYW5zY3JpYmUgdGhlIHdvcmsgYXJyYXlzIGludG8gOC1iaXQgdW5pdHMKK29uIGV4dGVybmFsIHN0b3JhZ2UuCisKK0EgZGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHN0cnVjdCBjb250YWlucyBhIHBvaW50ZXIgYW5kIGNvdW50IGRlZmluaW5nIHRoZQorbmV4dCBieXRlIHRvIHdyaXRlIGluIHRoZSB3b3JrIGJ1ZmZlciBhbmQgdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlOgorCisJSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsgIC8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KKwlzaXplX3QgZnJlZV9pbl9idWZmZXI7ICAgICAgLyogIyBvZiBieXRlIHNwYWNlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCisKK1RoZSBsaWJyYXJ5IGluY3JlbWVudHMgdGhlIHBvaW50ZXIgYW5kIGRlY3JlbWVudHMgdGhlIGNvdW50IHVudGlsIHRoZSBidWZmZXIKK2lzIGZpbGxlZC4gIFRoZSBtYW5hZ2VyJ3MgZW1wdHlfb3V0cHV0X2J1ZmZlciBtZXRob2QgbXVzdCByZXNldCB0aGUgcG9pbnRlcgorYW5kIGNvdW50LiAgVGhlIG1hbmFnZXIgaXMgZXhwZWN0ZWQgdG8gcmVtZW1iZXIgdGhlIGJ1ZmZlcidzIHN0YXJ0aW5nIGFkZHJlc3MKK2FuZCB0b3RhbCBzaXplIGluIHByaXZhdGUgZmllbGRzIG5vdCB2aXNpYmxlIHRvIHRoZSBsaWJyYXJ5LgorCitBIGRhdGEgZGVzdGluYXRpb24gbWFuYWdlciBwcm92aWRlcyB0aHJlZSBtZXRob2RzOgorCitpbml0X2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKwlJbml0aWFsaXplIGRlc3RpbmF0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcygpCisJYmVmb3JlIGFueSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4uICBJdCBtdXN0IGluaXRpYWxpemUKKwluZXh0X291dHB1dF9ieXRlIGFuZCBmcmVlX2luX2J1ZmZlci4gIGZyZWVfaW5fYnVmZmVyIG11c3QgYmUKKwlpbml0aWFsaXplZCB0byBhIHBvc2l0aXZlIHZhbHVlLgorCitlbXB0eV9vdXRwdXRfYnVmZmVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKwlUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgYnVmZmVyIGhhcyBmaWxsZWQgKGZyZWVfaW5fYnVmZmVyCisJcmVhY2hlcyB6ZXJvKS4gIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCBpdCBzaG91bGQgd3JpdGUgb3V0IHRoZQorCSplbnRpcmUqIGJ1ZmZlciAodXNlIHRoZSBzYXZlZCBzdGFydCBhZGRyZXNzIGFuZCBidWZmZXIgbGVuZ3RoOworCWlnbm9yZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXh0X291dHB1dF9ieXRlIGFuZCBmcmVlX2luX2J1ZmZlcikuCisJVGhlbiByZXNldCB0aGUgcG9pbnRlciAmIGNvdW50IHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLCBhbmQKKwlyZXR1cm4gVFJVRSBpbmRpY2F0aW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkdW1wZWQuCisJZnJlZV9pbl9idWZmZXIgbXVzdCBiZSBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZSB3aGVuIFRSVUUgaXMKKwlyZXR1cm5lZC4gIEEgRkFMU0UgcmV0dXJuIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBJL08gc3VzcGVuc2lvbiBpcworCWRlc2lyZWQgKHRoaXMgb3BlcmF0aW5nIG1vZGUgaXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24pLgorCit0ZXJtX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKwlUZXJtaW5hdGUgZGVzdGluYXRpb24gLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGFmdGVyIGFsbAorCWRhdGEgaGFzIGJlZW4gd3JpdHRlbi4gIEluIG1vc3QgYXBwbGljYXRpb25zLCB0aGlzIG11c3QgZmx1c2ggYW55CisJZGF0YSByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlci4gIFVzZSBlaXRoZXIgbmV4dF9vdXRwdXRfYnl0ZSBvcgorCWZyZWVfaW5fYnVmZmVyIHRvIGRldGVybWluZSBob3cgbXVjaCBkYXRhIGlzIGluIHRoZSBidWZmZXIuCisKK3Rlcm1fZGVzdGluYXRpb24oKSBpcyBOT1QgY2FsbGVkIGJ5IGpwZWdfYWJvcnQoKSBvciBqcGVnX2Rlc3Ryb3koKS4gIElmIHlvdQord2FudCB0aGUgZGVzdGluYXRpb24gbWFuYWdlciB0byBiZSBjbGVhbmVkIHVwIGR1cmluZyBhbiBhYm9ydCwgeW91IG11c3QgZG8gaXQKK3lvdXJzZWxmLgorCitZb3Ugd2lsbCBhbHNvIG5lZWQgY29kZSB0byBjcmVhdGUgYSBqcGVnX2Rlc3RpbmF0aW9uX21nciBzdHJ1Y3QsIGZpbGwgaW4gaXRzCittZXRob2QgcG9pbnRlcnMsIGFuZCBpbnNlcnQgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgaW50byB0aGUgImRlc3QiIGZpZWxkIG9mCit0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuICBUaGlzIGNhbiBiZSBkb25lIGluLWxpbmUgaW4geW91ciBzZXR1cCBjb2RlIGlmCit5b3UgbGlrZSwgYnV0IGl0J3MgcHJvYmFibHkgY2xlYW5lciB0byBwcm92aWRlIGEgc2VwYXJhdGUgcm91dGluZSBzaW1pbGFyIHRvCit0aGUganBlZ19zdGRpb19kZXN0KCkgcm91dGluZSBvZiB0aGUgc3VwcGxpZWQgZGVzdGluYXRpb24gbWFuYWdlci4KKworRGVjb21wcmVzc2lvbiBzb3VyY2UgbWFuYWdlcnMgZm9sbG93IGEgcGFyYWxsZWwgZGVzaWduLCBidXQgd2l0aCBzb21lCithZGRpdGlvbmFsIGZyYW1taXNoZXMuICBUaGUgc291cmNlIG1hbmFnZXIgc3RydWN0IGNvbnRhaW5zIGEgcG9pbnRlciBhbmQgY291bnQKK2RlZmluaW5nIHRoZSBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIHRoZSB3b3JrIGJ1ZmZlciBhbmQgdGhlIG51bWJlciBvZiBieXRlcworcmVtYWluaW5nOgorCisJY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIGJ1ZmZlciAqLworCXNpemVfdCBieXRlc19pbl9idWZmZXI7ICAgICAgICAgLyogIyBvZiBieXRlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCisKK1RoZSBsaWJyYXJ5IGluY3JlbWVudHMgdGhlIHBvaW50ZXIgYW5kIGRlY3JlbWVudHMgdGhlIGNvdW50IHVudGlsIHRoZSBidWZmZXIKK2lzIGVtcHRpZWQuICBUaGUgbWFuYWdlcidzIGZpbGxfaW5wdXRfYnVmZmVyIG1ldGhvZCBtdXN0IHJlc2V0IHRoZSBwb2ludGVyIGFuZAorY291bnQuICBJbiBtb3N0IGFwcGxpY2F0aW9ucywgdGhlIG1hbmFnZXIgbXVzdCByZW1lbWJlciB0aGUgYnVmZmVyJ3Mgc3RhcnRpbmcKK2FkZHJlc3MgYW5kIHRvdGFsIHNpemUgaW4gcHJpdmF0ZSBmaWVsZHMgbm90IHZpc2libGUgdG8gdGhlIGxpYnJhcnkuCisKK0EgZGF0YSBzb3VyY2UgbWFuYWdlciBwcm92aWRlcyBmaXZlIG1ldGhvZHM6CisKK2luaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorCUluaXRpYWxpemUgc291cmNlLiAgVGhpcyBpcyBjYWxsZWQgYnkganBlZ19yZWFkX2hlYWRlcigpIGJlZm9yZSBhbnkKKwlkYXRhIGlzIGFjdHVhbGx5IHJlYWQuICBVbmxpa2UgaW5pdF9kZXN0aW5hdGlvbigpLCBpdCBtYXkgbGVhdmUKKwlieXRlc19pbl9idWZmZXIgc2V0IHRvIDAgKGluIHdoaWNoIGNhc2UgYSBmaWxsX2lucHV0X2J1ZmZlcigpIGNhbGwKKwl3aWxsIG9jY3VyIGltbWVkaWF0ZWx5KS4KKworZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisJVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgYnl0ZXNfaW5fYnVmZmVyIGhhcyByZWFjaGVkIHplcm8gYW5kIG1vcmUKKwlkYXRhIGlzIHdhbnRlZC4gIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCBpdCBzaG91bGQgcmVhZCBmcmVzaCBkYXRhCisJaW50byB0aGUgYnVmZmVyIChpZ25vcmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXh0X2lucHV0X2J5dGUgYW5kCisJYnl0ZXNfaW5fYnVmZmVyKSwgcmVzZXQgdGhlIHBvaW50ZXIgJiBjb3VudCB0byB0aGUgc3RhcnQgb2YgdGhlCisJYnVmZmVyLCBhbmQgcmV0dXJuIFRSVUUgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcmVsb2FkZWQuCisJSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBmaWxsIHRoZSBidWZmZXIgZW50aXJlbHksIG9ubHkgdG8gb2J0YWluIGF0CisJbGVhc3Qgb25lIG1vcmUgYnl0ZS4gIGJ5dGVzX2luX2J1ZmZlciBNVVNUIGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlCisJaWYgVFJVRSBpcyByZXR1cm5lZC4gIEEgRkFMU0UgcmV0dXJuIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBJL08KKwlzdXNwZW5zaW9uIGlzIGRlc2lyZWQgKHRoaXMgbW9kZSBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbikuCisKK3NraXBfaW5wdXRfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCisJU2tpcCBudW1fYnl0ZXMgd29ydGggb2YgZGF0YS4gIFRoZSBidWZmZXIgcG9pbnRlciBhbmQgY291bnQgc2hvdWxkCisJYmUgYWR2YW5jZWQgb3ZlciBudW1fYnl0ZXMgaW5wdXQgYnl0ZXMsIHJlZmlsbGluZyB0aGUgYnVmZmVyIGFzCisJbmVlZGVkLiAgVGhpcyBpcyB1c2VkIHRvIHNraXAgb3ZlciBhIHBvdGVudGlhbGx5IGxhcmdlIGFtb3VudCBvZgorCXVuaW50ZXJlc3RpbmcgZGF0YSAoc3VjaCBhcyBhbiBBUFBuIG1hcmtlcikuICBJbiBzb21lIGFwcGxpY2F0aW9ucworCWl0IG1heSBiZSBwb3NzaWJsZSB0byBvcHRpbWl6ZSBhd2F5IHRoZSByZWFkaW5nIG9mIHRoZSBza2lwcGVkIGRhdGEsCisJYnV0IGl0J3Mgbm90IGNsZWFyIHRoYXQgYmVpbmcgc21hcnQgaXMgd29ydGggbXVjaCB0cm91YmxlOyBsYXJnZQorCXNraXBzIGFyZSB1bmNvbW1vbi4gIGJ5dGVzX2luX2J1ZmZlciBtYXkgYmUgemVybyBvbiByZXR1cm4uCisJQSB6ZXJvIG9yIG5lZ2F0aXZlIHNraXAgY291bnQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBuby1vcC4KKworcmVzeW5jX3RvX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKQorCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBkZWNvbXByZXNzb3IgaGFzIGZhaWxlZCB0byBmaW5kCisJYSByZXN0YXJ0IChSU1RuKSBtYXJrZXIgd2hlcmUgb25lIGlzIGV4cGVjdGVkLiAgSXRzIG1pc3Npb24gaXMgdG8KKwlmaW5kIGEgc3VpdGFibGUgcG9pbnQgZm9yIHJlc3VtaW5nIGRlY29tcHJlc3Npb24uICBGb3IgbW9zdAorCWFwcGxpY2F0aW9ucywgd2UgcmVjb21tZW5kIHRoYXQgeW91IGp1c3QgdXNlIHRoZSBkZWZhdWx0IHJlc3luYworCXByb2NlZHVyZSwganBlZ19yZXN5bmNfdG9fcmVzdGFydCgpLiAgSG93ZXZlciwgaWYgeW91IGFyZSBhYmxlIHRvIGJhY2sKKwl1cCBpbiB0aGUgaW5wdXQgZGF0YSBzdHJlYW0sIG9yIGlmIHlvdSBoYXZlIGEtcHJpb3JpIGtub3dsZWRnZSBhYm91dAorCXRoZSBsaWtlbHkgbG9jYXRpb24gb2YgcmVzdGFydCBtYXJrZXJzLCB5b3UgbWF5IGJlIGFibGUgdG8gZG8gYmV0dGVyLgorCVJlYWQgdGhlIHJlYWRfcmVzdGFydF9tYXJrZXIoKSBhbmQganBlZ19yZXN5bmNfdG9fcmVzdGFydCgpIHJvdXRpbmVzCisJaW4gamRtYXJrZXIuYyBpZiB5b3UgdGhpbmsgeW91J2QgbGlrZSB0byBpbXBsZW1lbnQgeW91ciBvd24gcmVzeW5jCisJcHJvY2VkdXJlLgorCit0ZXJtX3NvdXJjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKwlUZXJtaW5hdGUgc291cmNlIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfZGVjb21wcmVzcygpIGFmdGVyIGFsbAorCWRhdGEgaGFzIGJlZW4gcmVhZC4gIE9mdGVuIGEgbm8tb3AuCisKK0ZvciBib3RoIGZpbGxfaW5wdXRfYnVmZmVyKCkgYW5kIHNraXBfaW5wdXRfZGF0YSgpLCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nCithcyBhbiBFT0YgcmV0dXJuLiAgSWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbiByZWFjaGVkLCB0aGUgcm91dGluZSBoYXMKK2EgY2hvaWNlIG9mIGV4aXRpbmcgdmlhIEVSUkVYSVQoKSBvciBpbnNlcnRpbmcgZmFrZSBkYXRhIGludG8gdGhlIGJ1ZmZlci4KK0luIG1vc3QgY2FzZXMsIGdlbmVyYXRpbmcgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIGluc2VydGluZyBhIGZha2UgRU9JIG1hcmtlcgoraXMgdGhlIGJlc3QgY291cnNlIG9mIGFjdGlvbiAtLS0gdGhpcyB3aWxsIGFsbG93IHRoZSBkZWNvbXByZXNzb3IgdG8gb3V0cHV0Citob3dldmVyIG11Y2ggb2YgdGhlIGltYWdlIGlzIHRoZXJlLiAgSW4gcGF0aG9sb2dpY2FsIGNhc2VzLCB0aGUgZGVjb21wcmVzc29yCittYXkgc3dhbGxvdyB0aGUgRU9JIGFuZCBhZ2FpbiBkZW1hbmQgZGF0YSAuLi4ganVzdCBrZWVwIGZlZWRpbmcgaXQgZmFrZSBFT0lzLgoramRhdGFzcmMuYyBpbGx1c3RyYXRlcyB0aGUgcmVjb21tZW5kZWQgZXJyb3IgcmVjb3ZlcnkgYmVoYXZpb3IuCisKK3Rlcm1fc291cmNlKCkgaXMgTk9UIGNhbGxlZCBieSBqcGVnX2Fib3J0KCkgb3IganBlZ19kZXN0cm95KCkuICBJZiB5b3Ugd2FudAordGhlIHNvdXJjZSBtYW5hZ2VyIHRvIGJlIGNsZWFuZWQgdXAgZHVyaW5nIGFuIGFib3J0LCB5b3UgbXVzdCBkbyBpdCB5b3Vyc2VsZi4KKworWW91IHdpbGwgYWxzbyBuZWVkIGNvZGUgdG8gY3JlYXRlIGEganBlZ19zb3VyY2VfbWdyIHN0cnVjdCwgZmlsbCBpbiBpdHMgbWV0aG9kCitwb2ludGVycywgYW5kIGluc2VydCBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBpbnRvIHRoZSAic3JjIiBmaWVsZCBvZiB0aGUgSlBFRworZGVjb21wcmVzc2lvbiBvYmplY3QuICBUaGlzIGNhbiBiZSBkb25lIGluLWxpbmUgaW4geW91ciBzZXR1cCBjb2RlIGlmIHlvdQorbGlrZSwgYnV0IGl0J3MgcHJvYmFibHkgY2xlYW5lciB0byBwcm92aWRlIGEgc2VwYXJhdGUgcm91dGluZSBzaW1pbGFyIHRvIHRoZQoranBlZ19zdGRpb19zcmMoKSByb3V0aW5lIG9mIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFuYWdlci4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNvbnN1bHQgdGhlIHN0ZGlvIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWFuYWdlcnMKK2luIGpkYXRhc3JjLmMgYW5kIGpkYXRhZHN0LmMuCisKKworSS9PIHN1c3BlbnNpb24KKy0tLS0tLS0tLS0tLS0tCisKK1NvbWUgYXBwbGljYXRpb25zIG5lZWQgdG8gdXNlIHRoZSBKUEVHIGxpYnJhcnkgYXMgYW4gaW5jcmVtZW50YWwgbWVtb3J5LXRvLQorbWVtb3J5IGZpbHRlcjogd2hlbiB0aGUgY29tcHJlc3NlZCBkYXRhIGJ1ZmZlciBpcyBmaWxsZWQgb3IgZW1wdGllZCwgdGhleSB3YW50Citjb250cm9sIHRvIHJldHVybiB0byB0aGUgb3V0ZXIgbG9vcCwgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoYXQgdGhlIGJ1ZmZlciBjYW4KK2JlIGVtcHRpZWQgb3IgcmVsb2FkZWQgd2l0aGluIHRoZSBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtYW5hZ2VyIHN1YnJvdXRpbmUuCitUaGUgbGlicmFyeSBzdXBwb3J0cyB0aGlzIG5lZWQgYnkgcHJvdmlkaW5nIGFuICJJL08gc3VzcGVuc2lvbiIgbW9kZSwgd2hpY2ggd2UKK2Rlc2NyaWJlIGluIHRoaXMgc2VjdGlvbi4KKworVGhlIEkvTyBzdXNwZW5zaW9uIG1vZGUgaXMgbm90IGEgcGFuYWNlYTogbm90aGluZyBpcyBndWFyYW50ZWVkIGFib3V0IHRoZQorbWF4aW11bSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBhbnkgb25lIGNhbGwgdG8gdGhlIGxpYnJhcnksIHNvIGl0IHdpbGwgbm90CitlbGltaW5hdGUgcmVzcG9uc2UtdGltZSBwcm9ibGVtcyBpbiBzaW5nbGUtdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgSWYgeW91CituZWVkIGd1YXJhbnRlZWQgcmVzcG9uc2UgdGltZSwgd2Ugc3VnZ2VzdCB5b3UgImJpdGUgdGhlIGJ1bGxldCIgYW5kIGltcGxlbWVudAorYSByZWFsIG11bHRpLXRhc2tpbmcgY2FwYWJpbGl0eS4KKworVG8gdXNlIEkvTyBzdXNwZW5zaW9uLCBjb29wZXJhdGlvbiBpcyBuZWVkZWQgYmV0d2VlbiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbgorYW5kIHRoZSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBtYW5hZ2VyOyB5b3Ugd2lsbCBhbHdheXMgbmVlZCBhIGN1c3RvbQorc291cmNlL2Rlc3RpbmF0aW9uIG1hbmFnZXIuICAoUGxlYXNlIHJlYWQgdGhlIHByZXZpb3VzIHNlY3Rpb24gaWYgeW91IGhhdmVuJ3QKK2FscmVhZHkuKSAgVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCB0aGUgZW1wdHlfb3V0cHV0X2J1ZmZlcigpIG9yCitmaWxsX2lucHV0X2J1ZmZlcigpIHJvdXRpbmUgaXMgYSBuby1vcCwgbWVyZWx5IHJldHVybmluZyBGQUxTRSB0byBpbmRpY2F0ZQordGhhdCBpdCBoYXMgZG9uZSBub3RoaW5nLiAgVXBvbiBzZWVpbmcgdGhpcywgdGhlIEpQRUcgbGlicmFyeSBzdXNwZW5kcworb3BlcmF0aW9uIGFuZCByZXR1cm5zIHRvIGl0cyBjYWxsZXIuICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gaXMKK3Jlc3BvbnNpYmxlIGZvciBlbXB0eWluZyBvciByZWZpbGxpbmcgdGhlIHdvcmsgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoZQorSlBFRyBsaWJyYXJ5IGFnYWluLgorCitDb21wcmVzc2lvbiBzdXNwZW5zaW9uOgorCitGb3IgY29tcHJlc3Npb24gc3VzcGVuc2lvbiwgdXNlIGFuIGVtcHR5X291dHB1dF9idWZmZXIoKSByb3V0aW5lIHRoYXQgcmV0dXJucworRkFMU0U7IHR5cGljYWxseSBpdCB3aWxsIG5vdCBkbyBhbnl0aGluZyBlbHNlLiAgVGhpcyB3aWxsIGNhdXNlIHRoZQorY29tcHJlc3NvciB0byByZXR1cm4gdG8gdGhlIGNhbGxlciBvZiBqcGVnX3dyaXRlX3NjYW5saW5lcygpLCB3aXRoIHRoZSByZXR1cm4KK3ZhbHVlIGluZGljYXRpbmcgdGhhdCBub3QgYWxsIHRoZSBzdXBwbGllZCBzY2FubGluZXMgaGF2ZSBiZWVuIGFjY2VwdGVkLgorVGhlIGFwcGxpY2F0aW9uIG11c3QgbWFrZSBtb3JlIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsIGFkanVzdCB0aGUgb3V0cHV0CitidWZmZXIgcG9pbnRlci9jb3VudCBhcHByb3ByaWF0ZWx5LCBhbmQgdGhlbiBjYWxsIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkKK2FnYWluLCBwb2ludGluZyB0byB0aGUgZmlyc3QgdW5jb25zdW1lZCBzY2FubGluZS4KKworV2hlbiBmb3JjZWQgdG8gc3VzcGVuZCwgdGhlIGNvbXByZXNzb3Igd2lsbCBiYWNrdHJhY2sgdG8gYSBjb252ZW5pZW50IHN0b3BwaW5nCitwb2ludCAodXN1YWxseSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVKTsgaXQgd2lsbCByZWdlbmVyYXRlIHNvbWUgb3V0cHV0CitkYXRhIHdoZW4gcmVzdGFydGVkLiAgVGhlcmVmb3JlLCBhbHRob3VnaCBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgaXMgb25seQorY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBmaWxsZWQsIHlvdSBzaG91bGQgTk9UIHdyaXRlIG91dCB0aGUgZW50aXJlIGJ1ZmZlcgorYWZ0ZXIgYSBzdXNwZW5zaW9uLiAgV3JpdGUgb25seSB0aGUgZGF0YSB1cCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZgorbmV4dF9vdXRwdXRfYnl0ZS9mcmVlX2luX2J1ZmZlci4gIFRoZSBkYXRhIGJleW9uZCB0aGF0IHBvaW50IHdpbGwgYmUKK3JlZ2VuZXJhdGVkIGFmdGVyIHJlc3VtcHRpb24uCisKK0JlY2F1c2Ugb2YgdGhlIGJhY2t0cmFja2luZyBiZWhhdmlvciwgYSBnb29kLXNpemUgb3V0cHV0IGJ1ZmZlciBpcyBlc3NlbnRpYWwKK2ZvciBlZmZpY2llbmN5OyB5b3UgZG9uJ3Qgd2FudCB0aGUgY29tcHJlc3NvciB0byBzdXNwZW5kIG9mdGVuLiAgKEluIGZhY3QsIGFuCitvdmVybHkgc21hbGwgYnVmZmVyIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgbG9vcGluZywgaWYgYSBzaW5nbGUgTUNVIHJlcXVpcmVkCittb3JlIGRhdGEgdGhhbiB3b3VsZCBmaXQgaW4gdGhlIGJ1ZmZlci4pICBXZSByZWNvbW1lbmQgYSBidWZmZXIgb2YgYXQgbGVhc3QKK3NldmVyYWwgS2J5dGVzLiAgWW91IG1heSB3YW50IHRvIGluc2VydCBleHBsaWNpdCBjb2RlIHRvIGVuc3VyZSB0aGF0IHlvdSBkb24ndAorY2FsbCBqcGVnX3dyaXRlX3NjYW5saW5lcygpIHVubGVzcyB0aGVyZSBpcyBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHNwYWNlIGluCit0aGUgb3V0cHV0IGJ1ZmZlcjsgaW4gb3RoZXIgd29yZHMsIGZsdXNoIHRoZSBidWZmZXIgYmVmb3JlIHRyeWluZyB0byBjb21wcmVzcworbW9yZSBkYXRhLgorCitUaGUgY29tcHJlc3NvciBkb2VzIG5vdCBhbGxvdyBzdXNwZW5zaW9uIHdoaWxlIGl0IGlzIHRyeWluZyB0byB3cml0ZSBKUEVHCittYXJrZXJzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgZmlsZS4gIFRoaXMgbWVhbnMgdGhhdDoKKyAgKiBBdCB0aGUgYmVnaW5uaW5nIG9mIGEgY29tcHJlc3Npb24gb3BlcmF0aW9uLCB0aGVyZSBtdXN0IGJlIGVub3VnaCBmcmVlCisgICAgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgdG8gaG9sZCB0aGUgaGVhZGVyIG1hcmtlcnMgKHR5cGljYWxseSA2MDAgb3IKKyAgICBzbyBieXRlcykuICBUaGUgcmVjb21tZW5kZWQgYnVmZmVyIHNpemUgaXMgYmlnZ2VyIHRoYW4gdGhpcyBhbnl3YXksIHNvCisgICAgdGhpcyBpcyBub3QgYSBwcm9ibGVtIGFzIGxvbmcgYXMgeW91IHN0YXJ0IHdpdGggYW4gZW1wdHkgYnVmZmVyLiAgSG93ZXZlciwKKyAgICB0aGlzIHJlc3RyaWN0aW9uIG1pZ2h0IGNhdGNoIHlvdSBpZiB5b3UgaW5zZXJ0IGxhcmdlIHNwZWNpYWwgbWFya2Vycywgc3VjaAorICAgIGFzIGEgSkZJRiB0aHVtYm5haWwgaW1hZ2UsIHdpdGhvdXQgZmx1c2hpbmcgdGhlIGJ1ZmZlciBhZnRlcndhcmRzLgorICAqIFdoZW4geW91IGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSwgdGhlcmUgbXVzdCBiZSBlbm91Z2ggc3BhY2UgaW4gdGhlCisgICAgb3V0cHV0IGJ1ZmZlciB0byBlbWl0IGFueSBidWZmZXJlZCBkYXRhIGFuZCB0aGUgZmluYWwgRU9JIG1hcmtlci4gIEluIHRoZQorICAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGhhbGYgYSBkb3plbiBieXRlcyBzaG91bGQgc3VmZmljZSBmb3IgdGhpcywgYnV0CisgICAgZm9yIHNhZmV0eSdzIHNha2Ugd2UgcmVjb21tZW5kIGVuc3VyaW5nIHRoYXQgYXQgbGVhc3QgMTAwIGJ5dGVzIGFyZSBmcmVlCisgICAgYmVmb3JlIGNhbGxpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKS4KKworQSBtb3JlIHNpZ25pZmljYW50IHJlc3RyaWN0aW9uIGlzIHRoYXQganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYW5ub3Qgc3VzcGVuZC4KK1RoaXMgbWVhbnMgeW91IGNhbm5vdCB1c2Ugc3VzcGVuc2lvbiB3aXRoIG11bHRpLXBhc3Mgb3BlcmF0aW5nIG1vZGVzLCBuYW1lbHkKK0h1ZmZtYW4gY29kZSBvcHRpbWl6YXRpb24gYW5kIG11bHRpcGxlLXNjYW4gb3V0cHV0LiAgVGhvc2UgbW9kZXMgd3JpdGUgdGhlCit3aG9sZSBmaWxlIGR1cmluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLCB3aGljaCB3aWxsIGNlcnRhaW5seSByZXN1bHQgaW4KK2J1ZmZlciBvdmVycnVuLiAgKE5vdGUgdGhhdCB0aGlzIHJlc3RyaWN0aW9uIGFwcGxpZXMgb25seSB0byBjb21wcmVzc2lvbiwKK25vdCBkZWNvbXByZXNzaW9uLiAgVGhlIGRlY29tcHJlc3NvciBzdXBwb3J0cyBpbnB1dCBzdXNwZW5zaW9uIGluIGFsbCBvZiBpdHMKK29wZXJhdGluZyBtb2Rlcy4pCisKK0RlY29tcHJlc3Npb24gc3VzcGVuc2lvbjoKKworRm9yIGRlY29tcHJlc3Npb24gc3VzcGVuc2lvbiwgdXNlIGEgZmlsbF9pbnB1dF9idWZmZXIoKSByb3V0aW5lIHRoYXQgc2ltcGx5CityZXR1cm5zIEZBTFNFIChleGNlcHQgcGVyaGFwcyBkdXJpbmcgZXJyb3IgcmVjb3ZlcnksIGFzIGRpc2N1c3NlZCBiZWxvdykuCitUaGlzIHdpbGwgY2F1c2UgdGhlIGRlY29tcHJlc3NvciB0byByZXR1cm4gdG8gaXRzIGNhbGxlciB3aXRoIGFuIGluZGljYXRpb24KK3RoYXQgc3VzcGVuc2lvbiBoYXMgb2NjdXJyZWQuICBUaGlzIGNhbiBoYXBwZW4gYXQgZm91ciBwbGFjZXM6CisgICoganBlZ19yZWFkX2hlYWRlcigpOiB3aWxsIHJldHVybiBKUEVHX1NVU1BFTkRFRC4KKyAgKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKTogd2lsbCByZXR1cm4gRkFMU0UsIHJhdGhlciB0aGFuIGl0cyB1c3VhbCBUUlVFLgorICAqIGpwZWdfcmVhZF9zY2FubGluZXMoKTogd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBzY2FubGluZXMgYWxyZWFkeQorCWNvbXBsZXRlZCAocG9zc2libHkgMCkuCisgICoganBlZ19maW5pc2hfZGVjb21wcmVzcygpOiB3aWxsIHJldHVybiBGQUxTRSwgcmF0aGVyIHRoYW4gaXRzIHVzdWFsIFRSVUUuCitUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbXVzdCByZWNvZ25pemUgdGhlc2UgY2FzZXMsIGxvYWQgbW9yZSBkYXRhIGludG8KK3RoZSBpbnB1dCBidWZmZXIsIGFuZCByZXBlYXQgdGhlIGNhbGwuICBJbiB0aGUgY2FzZSBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzKCksCitpbmNyZW1lbnQgdGhlIHBhc3NlZCBwb2ludGVycyBwYXN0IGFueSBzY2FubGluZXMgc3VjY2Vzc2Z1bGx5IHJlYWQuCisKK0p1c3QgYXMgd2l0aCBjb21wcmVzc2lvbiwgdGhlIGRlY29tcHJlc3NvciB3aWxsIHR5cGljYWxseSBiYWNrdHJhY2sgdG8gYQorY29udmVuaWVudCByZXN0YXJ0IHBvaW50IGJlZm9yZSBzdXNwZW5kaW5nLiAgV2hlbiBmaWxsX2lucHV0X2J1ZmZlcigpIGlzCitjYWxsZWQsIG5leHRfaW5wdXRfYnl0ZS9ieXRlc19pbl9idWZmZXIgcG9pbnQgdG8gdGhlIGN1cnJlbnQgcmVzdGFydCBwb2ludCwKK3doaWNoIGlzIHdoZXJlIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBiYWNrdHJhY2sgdG8gaWYgRkFMU0UgaXMgcmV0dXJuZWQuCitUaGUgZGF0YSBiZXlvbmQgdGhhdCBwb3NpdGlvbiBtdXN0IE5PVCBiZSBkaXNjYXJkZWQgaWYgeW91IHN1c3BlbmQ7IGl0IG5lZWRzCit0byBiZSByZS1yZWFkIHVwb24gcmVzdW1wdGlvbi4gIEluIG1vc3QgaW1wbGVtZW50YXRpb25zLCB5b3UnbGwgbmVlZCB0byBzaGlmdAordGhpcyBkYXRhIGRvd24gdG8gdGhlIHN0YXJ0IG9mIHlvdXIgd29yayBidWZmZXIgYW5kIHRoZW4gbG9hZCBtb3JlIGRhdGEgYWZ0ZXIKK2l0LiAgQWdhaW4sIHRoaXMgYmVoYXZpb3IgbWVhbnMgdGhhdCBhIHNldmVyYWwtS2J5dGUgd29yayBidWZmZXIgaXMgZXNzZW50aWFsCitmb3IgZGVjZW50IHBlcmZvcm1hbmNlOyBmdXJ0aGVybW9yZSwgeW91IHNob3VsZCBsb2FkIGEgcmVhc29uYWJsZSBhbW91bnQgb2YKK25ldyBkYXRhIGJlZm9yZSByZXN1bWluZyBkZWNvbXByZXNzaW9uLiAgKElmIHlvdSBsb2FkZWQsIHNheSwgb25seSBvbmUgbmV3CitieXRlIGVhY2ggdGltZSBhcm91bmQsIHlvdSBjb3VsZCB3YXN0ZSBhIExPVCBvZiBjeWNsZXMuKQorCitUaGUgc2tpcF9pbnB1dF9kYXRhKCkgc291cmNlIG1hbmFnZXIgcm91dGluZSByZXF1aXJlcyBzcGVjaWFsIGNhcmUgaW4gYQorc3VzcGVuc2lvbiBzY2VuYXJpby4gIFRoaXMgcm91dGluZSBpcyBOT1QgZ3JhbnRlZCB0aGUgYWJpbGl0eSB0byBzdXNwZW5kIHRoZQorZGVjb21wcmVzc29yOyBpdCBjYW4gZGVjcmVtZW50IGJ5dGVzX2luX2J1ZmZlciB0byB6ZXJvLCBidXQgbm8gbW9yZS4gIElmIHRoZQorcmVxdWVzdGVkIHNraXAgZGlzdGFuY2UgZXhjZWVkcyB0aGUgYW1vdW50IG9mIGRhdGEgY3VycmVudGx5IGluIHRoZSBpbnB1dAorYnVmZmVyLCB0aGVuIHNraXBfaW5wdXRfZGF0YSgpIG11c3Qgc2V0IGJ5dGVzX2luX2J1ZmZlciB0byB6ZXJvIGFuZCByZWNvcmQgdGhlCithZGRpdGlvbmFsIHNraXAgZGlzdGFuY2Ugc29tZXdoZXJlIGVsc2UuICBUaGUgZGVjb21wcmVzc29yIHdpbGwgaW1tZWRpYXRlbHkKK2NhbGwgZmlsbF9pbnB1dF9idWZmZXIoKSwgd2hpY2ggc2hvdWxkIHJldHVybiBGQUxTRSwgd2hpY2ggd2lsbCBjYXVzZSBhCitzdXNwZW5zaW9uIHJldHVybi4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtdXN0IHRoZW4gYXJyYW5nZSB0byBkaXNjYXJkCit0aGUgcmVjb3JkZWQgbnVtYmVyIG9mIGJ5dGVzIGJlZm9yZSBpdCByZXN1bWVzIGxvYWRpbmcgdGhlIGlucHV0IGJ1ZmZlci4KKyhZZXMsIHRoaXMgZGVzaWduIGlzIHJhdGhlciBiYXJvcXVlLCBidXQgaXQgYXZvaWRzIGNvbXBsZXhpdHkgaW4gdGhlIGZhciBtb3JlCitjb21tb24gY2FzZSB3aGVyZSBhIG5vbi1zdXNwZW5kaW5nIHNvdXJjZSBtYW5hZ2VyIGlzIHVzZWQuKQorCitJZiB0aGUgaW5wdXQgZGF0YSBoYXMgYmVlbiBleGhhdXN0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBlbWl0IGEgd2FybmluZworYW5kIGluc2VydCBkdW1teSBFT0kgbWFya2VycyBqdXN0IGFzIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgbWFuYWdlcgord291bGQgZG8uICBUaGlzIGNhbiBiZSBoYW5kbGVkIGVpdGhlciBpbiB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbG9naWMgb3IKK3dpdGhpbiBmaWxsX2lucHV0X2J1ZmZlcigpOyB0aGUgbGF0dGVyIGlzIHByb2JhYmx5IG1vcmUgZWZmaWNpZW50LiAgSWYKK2ZpbGxfaW5wdXRfYnVmZmVyKCkga25vd3MgdGhhdCBubyBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlLCBpdCBjYW4gc2V0IHRoZQorcG9pbnRlci9jb3VudCB0byBwb2ludCB0byBhIGR1bW15IEVPSSBtYXJrZXIgYW5kIHRoZW4gcmV0dXJuIFRSVUUganVzdCBhcwordGhvdWdoIGl0IGhhZCByZWFkIG1vcmUgZGF0YSBpbiBhIG5vbi1zdXNwZW5kaW5nIHNpdHVhdGlvbi4KKworVGhlIGRlY29tcHJlc3NvciBkb2VzIG5vdCBhdHRlbXB0IHRvIHN1c3BlbmQgd2l0aGluIHN0YW5kYXJkIEpQRUcgbWFya2VyczsKK2luc3RlYWQgaXQgd2lsbCBiYWNrdHJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXJrZXIgYW5kIHJlcHJvY2VzcyB0aGUgd2hvbGUKK21hcmtlciBuZXh0IHRpbWUuICBIZW5jZSB0aGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCitsb25nZXN0IHN0YW5kYXJkIG1hcmtlciBpbiB0aGUgZmlsZS4gIFN0YW5kYXJkIEpQRUcgbWFya2VycyBzaG91bGQgbm9ybWFsbHkKK25vdCBleGNlZWQgYSBmZXcgaHVuZHJlZCBieXRlcyBlYWNoIChESFQgdGFibGVzIGFyZSB0eXBpY2FsbHkgdGhlIGxvbmdlc3QpLgorV2UgcmVjb21tZW5kIGF0IGxlYXN0IGEgMksgYnVmZmVyIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3aGljaCBpcyBtdWNoCitsYXJnZXIgdGhhbiBhbnkgY29ycmVjdCBtYXJrZXIgaXMgbGlrZWx5IHRvIGJlLiAgRm9yIHJvYnVzdG5lc3MgYWdhaW5zdAorZGFtYWdlZCBtYXJrZXIgbGVuZ3RoIGNvdW50cywgeW91IG1heSB3aXNoIHRvIGluc2VydCBhIHRlc3QgaW4geW91cgorYXBwbGljYXRpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlIGlucHV0IGJ1ZmZlciBpcyBjb21wbGV0ZWx5IGZ1bGwgYW5kIHlldAordGhlIGRlY29kZXIgaGFzIHN1c3BlbmRlZCB3aXRob3V0IGNvbnN1bWluZyBhbnkgZGF0YSAtLS0gb3RoZXJ3aXNlLCBpZiB0aGlzCitzaXR1YXRpb24gZGlkIG9jY3VyLCBpdCB3b3VsZCBsZWFkIHRvIGFuIGVuZGxlc3MgbG9vcC4gIChUaGUgbGlicmFyeSBjYW4ndAorcHJvdmlkZSB0aGlzIHRlc3Qgc2luY2UgaXQgaGFzIG5vIGlkZWEgd2hldGhlciAidGhlIGJ1ZmZlciBpcyBmdWxsIiwgb3IKK2V2ZW4gd2hldGhlciB0aGVyZSBpcyBhIGZpeGVkLXNpemUgaW5wdXQgYnVmZmVyLikKKworVGhlIGlucHV0IGJ1ZmZlciB3b3VsZCBuZWVkIHRvIGJlIDY0SyB0byBhbGxvdyBmb3IgYXJiaXRyYXJ5IENPTSBvciBBUFBuCittYXJrZXJzLCBidXQgdGhlc2UgYXJlIGhhbmRsZWQgc3BlY2lhbGx5OiB0aGV5IGFyZSBlaXRoZXIgc2F2ZWQgaW50byBhbGxvY2F0ZWQKK21lbW9yeSwgb3Igc2tpcHBlZCBvdmVyIGJ5IGNhbGxpbmcgc2tpcF9pbnB1dF9kYXRhKCkuICBJbiB0aGUgZm9ybWVyIGNhc2UsCitzdXNwZW5zaW9uIGlzIGhhbmRsZWQgY29ycmVjdGx5LCBhbmQgaW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgcHJvYmxlbSBvZgorYnVmZmVyIG92ZXJydW4gaXMgcGxhY2VkIG9uIHNraXBfaW5wdXRfZGF0YSdzIHNob3VsZGVycywgYXMgZXhwbGFpbmVkIGFib3ZlLgorTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIHlvdXIgb3duIG1hcmtlciBoYW5kbGluZyByb3V0aW5lIGZvciBsYXJnZSBtYXJrZXJzLAoreW91IHNob3VsZCBjb25zaWRlciBob3cgdG8gZGVhbCB3aXRoIGJ1ZmZlciBvdmVyZmxvdy4KKworTXVsdGlwbGUtYnVmZmVyIG1hbmFnZW1lbnQ6CisKK0luIHNvbWUgYXBwbGljYXRpb25zIGl0IGlzIGRlc2lyYWJsZSB0byBzdG9yZSB0aGUgY29tcHJlc3NlZCBkYXRhIGluIGEgbGlua2VkCitsaXN0IG9mIGJ1ZmZlciBhcmVhcywgc28gYXMgdG8gYXZvaWQgZGF0YSBjb3B5aW5nLiAgVGhpcyBjYW4gYmUgaGFuZGxlZCBieQoraGF2aW5nIGVtcHR5X291dHB1dF9idWZmZXIoKSBvciBmaWxsX2lucHV0X2J1ZmZlcigpIHNldCB0aGUgcG9pbnRlciBhbmQgY291bnQKK3RvIHJlZmVyZW5jZSB0aGUgbmV4dCBhdmFpbGFibGUgYnVmZmVyOyBGQUxTRSBpcyByZXR1cm5lZCBvbmx5IGlmIG5vIG1vcmUKK2J1ZmZlcnMgYXJlIGF2YWlsYWJsZS4gIEFsdGhvdWdoIHNlZW1pbmdseSBzdHJhaWdodGZvcndhcmQsIHRoZXJlIGlzIGEKK3BpdGZhbGwgaW4gdGhpcyBhcHByb2FjaDogdGhlIGJhY2t0cmFjayB0aGF0IG9jY3VycyB3aGVuIEZBTFNFIGlzIHJldHVybmVkCitjb3VsZCBiYWNrIHVwIGludG8gYW4gZWFybGllciBidWZmZXIuICBGb3IgZXhhbXBsZSwgd2hlbiBmaWxsX2lucHV0X2J1ZmZlcigpCitpcyBjYWxsZWQsIHRoZSBjdXJyZW50IHBvaW50ZXIgJiBjb3VudCBpbmRpY2F0ZSB0aGUgYmFja3RyYWNrIHJlc3RhcnQgcG9pbnQuCitTaW5jZSBmaWxsX2lucHV0X2J1ZmZlcigpIHdpbGwgc2V0IHRoZSBwb2ludGVyIGFuZCBjb3VudCB0byByZWZlciB0byBhIG5ldworYnVmZmVyLCB0aGUgcmVzdGFydCBwb3NpdGlvbiBtdXN0IGJlIHNhdmVkIHNvbWV3aGVyZSBlbHNlLiAgU3VwcG9zZSBhIHNlY29uZAorY2FsbCB0byBmaWxsX2lucHV0X2J1ZmZlcigpIG9jY3VycyBpbiB0aGUgc2FtZSBsaWJyYXJ5IGNhbGwsIGFuZCBubworYWRkaXRpb25hbCBpbnB1dCBkYXRhIGlzIGF2YWlsYWJsZSwgc28gZmlsbF9pbnB1dF9idWZmZXIgbXVzdCByZXR1cm4gRkFMU0UuCitJZiB0aGUgSlBFRyBsaWJyYXJ5IGhhcyBub3QgbW92ZWQgdGhlIHBvaW50ZXIvY291bnQgZm9yd2FyZCBpbiB0aGUgY3VycmVudAorYnVmZmVyLCB0aGVuICp0aGUgY29ycmVjdCByZXN0YXJ0IHBvaW50IGlzIHRoZSBzYXZlZCBwb3NpdGlvbiBpbiB0aGUgcHJpb3IKK2J1ZmZlciouICBQcmlvciBidWZmZXJzIG1heSBiZSBkaXNjYXJkZWQgb25seSBhZnRlciB0aGUgbGlicmFyeSBlc3RhYmxpc2hlcworYSByZXN0YXJ0IHBvaW50IHdpdGhpbiBhIGxhdGVyIGJ1ZmZlci4gIFNpbWlsYXIgcmVtYXJrcyBhcHBseSBmb3Igb3V0cHV0IGludG8KK2EgY2hhaW4gb2YgYnVmZmVycy4KKworVGhlIGxpYnJhcnkgd2lsbCBuZXZlciBhdHRlbXB0IHRvIGJhY2t0cmFjayBvdmVyIGEgc2tpcF9pbnB1dF9kYXRhKCkgY2FsbCwKK3NvIGFueSBza2lwcGVkIGRhdGEgY2FuIGJlIHBlcm1hbmVudGx5IGRpc2NhcmRlZC4gIFlvdSBzdGlsbCBoYXZlIHRvIGRlYWwKK3dpdGggdGhlIGNhc2Ugb2Ygc2tpcHBpbmcgbm90LXlldC1yZWNlaXZlZCBkYXRhLCBob3dldmVyLgorCitJdCdzIG11Y2ggc2ltcGxlciB0byB1c2Ugb25seSBhIHNpbmdsZSBidWZmZXI7IHdoZW4gZmlsbF9pbnB1dF9idWZmZXIoKSBpcworY2FsbGVkLCBtb3ZlIGFueSB1bmNvbnN1bWVkIGRhdGEgKGJleW9uZCB0aGUgY3VycmVudCBwb2ludGVyL2NvdW50KSBkb3duIHRvCit0aGUgYmVnaW5uaW5nIG9mIHRoaXMgYnVmZmVyIGFuZCB0aGVuIGxvYWQgbmV3IGRhdGEgaW50byB0aGUgcmVtYWluaW5nIGJ1ZmZlcgorc3BhY2UuICBUaGlzIGFwcHJvYWNoIHJlcXVpcmVzIGEgbGl0dGxlIG1vcmUgZGF0YSBjb3B5aW5nIGJ1dCBpcyBmYXIgZWFzaWVyCit0byBnZXQgcmlnaHQuCisKKworUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUHJvZ3Jlc3NpdmUgSlBFRyByZWFycmFuZ2VzIHRoZSBzdG9yZWQgZGF0YSBpbnRvIGEgc2VyaWVzIG9mIHNjYW5zIG9mCitpbmNyZWFzaW5nIHF1YWxpdHkuICBJbiBzaXR1YXRpb25zIHdoZXJlIGEgSlBFRyBmaWxlIGlzIHRyYW5zbWl0dGVkIGFjcm9zcyBhCitzbG93IGNvbW11bmljYXRpb25zIGxpbmssIGEgZGVjb2RlciBjYW4gZ2VuZXJhdGUgYSBsb3ctcXVhbGl0eSBpbWFnZSB2ZXJ5CitxdWlja2x5IGZyb20gdGhlIGZpcnN0IHNjYW4sIHRoZW4gZ3JhZHVhbGx5IGltcHJvdmUgdGhlIGRpc3BsYXllZCBxdWFsaXR5IGFzCittb3JlIHNjYW5zIGFyZSByZWNlaXZlZC4gIFRoZSBmaW5hbCBpbWFnZSBhZnRlciBhbGwgc2NhbnMgYXJlIGNvbXBsZXRlIGlzCitpZGVudGljYWwgdG8gdGhhdCBvZiBhIHJlZ3VsYXIgKHNlcXVlbnRpYWwpIEpQRUcgZmlsZSBvZiB0aGUgc2FtZSBxdWFsaXR5CitzZXR0aW5nLiAgUHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyBhcmUgb2Z0ZW4gc2xpZ2h0bHkgc21hbGxlciB0aGFuIGVxdWl2YWxlbnQKK3NlcXVlbnRpYWwgSlBFRyBmaWxlcywgYnV0IHRoZSBwb3NzaWJpbGl0eSBvZiBpbmNyZW1lbnRhbCBkaXNwbGF5IGlzIHRoZSBtYWluCityZWFzb24gZm9yIHVzaW5nIHByb2dyZXNzaXZlIEpQRUcuCisKK1RoZSBJSkcgZW5jb2RlciBsaWJyYXJ5IGdlbmVyYXRlcyBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIHdoZW4gZ2l2ZW4gYQorc3VpdGFibGUgInNjYW4gc2NyaXB0IiBkZWZpbmluZyBob3cgdG8gZGl2aWRlIHRoZSBkYXRhIGludG8gc2NhbnMuCitDcmVhdGlvbiBvZiBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIGlzIG90aGVyd2lzZSB0cmFuc3BhcmVudCB0byB0aGUgZW5jb2Rlci4KK1Byb2dyZXNzaXZlIEpQRUcgZmlsZXMgY2FuIGFsc28gYmUgcmVhZCB0cmFuc3BhcmVudGx5IGJ5IHRoZSBkZWNvZGVyIGxpYnJhcnkuCitJZiB0aGUgZGVjb2RpbmcgYXBwbGljYXRpb24gc2ltcGx5IHVzZXMgdGhlIGxpYnJhcnkgYXMgZGVmaW5lZCBhYm92ZSwgaXQKK3dpbGwgcmVjZWl2ZSBhIGZpbmFsIGRlY29kZWQgaW1hZ2Ugd2l0aG91dCBhbnkgaW5kaWNhdGlvbiB0aGF0IHRoZSBmaWxlIHdhcworcHJvZ3Jlc3NpdmUuICBPZiBjb3Vyc2UsIHRoaXMgYXBwcm9hY2ggZG9lcyBub3QgYWxsb3cgaW5jcmVtZW50YWwgZGlzcGxheS4KK1RvIHBlcmZvcm0gaW5jcmVtZW50YWwgZGlzcGxheSwgYW4gYXBwbGljYXRpb24gbmVlZHMgdG8gdXNlIHRoZSBkZWNvZGVyCitsaWJyYXJ5J3MgImJ1ZmZlcmVkLWltYWdlIiBtb2RlLCBpbiB3aGljaCBpdCByZWNlaXZlcyBhIGRlY29kZWQgaW1hZ2UKK211bHRpcGxlIHRpbWVzLgorCitFYWNoIGRpc3BsYXllZCBzY2FuIHJlcXVpcmVzIGFib3V0IGFzIG11Y2ggd29yayB0byBkZWNvZGUgYXMgYSBmdWxsIEpQRUcKK2ltYWdlIG9mIHRoZSBzYW1lIHNpemUsIHNvIHRoZSBkZWNvZGVyIG11c3QgYmUgZmFpcmx5IGZhc3QgaW4gcmVsYXRpb24gdG8gdGhlCitkYXRhIHRyYW5zbWlzc2lvbiByYXRlIGluIG9yZGVyIHRvIG1ha2UgaW5jcmVtZW50YWwgZGlzcGxheSB1c2VmdWwuICBIb3dldmVyLAoraXQgaXMgcG9zc2libGUgdG8gc2tpcCBkaXNwbGF5aW5nIHRoZSBpbWFnZSBhbmQgc2ltcGx5IGFkZCB0aGUgaW5jb21pbmcgYml0cwordG8gdGhlIGRlY29kZXIncyBjb2VmZmljaWVudCBidWZmZXIuICBUaGlzIGlzIGZhc3QgYmVjYXVzZSBvbmx5IEh1ZmZtYW4KK2RlY29kaW5nIG5lZWQgYmUgZG9uZSwgbm90IElEQ1QsIHVwc2FtcGxpbmcsIGNvbG9yc3BhY2UgY29udmVyc2lvbiwgZXRjLgorVGhlIElKRyBkZWNvZGVyIGxpYnJhcnkgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzd2l0Y2ggZHluYW1pY2FsbHkgYmV0d2VlbgorZGlzcGxheWluZyB0aGUgaW1hZ2UgYW5kIHNpbXBseSBhYnNvcmJpbmcgdGhlIGluY29taW5nIGJpdHMuICBBIHByb3Blcmx5Citjb2RlZCBhcHBsaWNhdGlvbiBjYW4gYXV0b21hdGljYWxseSBhZGFwdCB0aGUgbnVtYmVyIG9mIGRpc3BsYXkgcGFzc2VzIHRvCitzdWl0IHRoZSB0aW1lIGF2YWlsYWJsZSBhcyB0aGUgaW1hZ2UgaXMgcmVjZWl2ZWQuICBBbHNvLCBhIGZpbmFsCitoaWdoZXItcXVhbGl0eSBkaXNwbGF5IGN5Y2xlIGNhbiBiZSBwZXJmb3JtZWQgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YSBhZnRlcgordGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLgorCitQcm9ncmVzc2l2ZSBjb21wcmVzc2lvbjoKKworVG8gY3JlYXRlIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIChvciBhIG11bHRpcGxlLXNjYW4gc2VxdWVudGlhbCBKUEVHIGZpbGUpLAorc2V0IHRoZSBzY2FuX2luZm8gY2luZm8gZmllbGQgdG8gcG9pbnQgdG8gYW4gYXJyYXkgb2Ygc2NhbiBkZXNjcmlwdG9ycywgYW5kCitwZXJmb3JtIGNvbXByZXNzaW9uIGFzIHVzdWFsLiAgSW5zdGVhZCBvZiBjb25zdHJ1Y3RpbmcgeW91ciBvd24gc2NhbiBsaXN0LAoreW91IGNhbiBjYWxsIHRoZSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbigpIGhlbHBlciByb3V0aW5lIHRvIGNyZWF0ZSBhCityZWNvbW1lbmRlZCBwcm9ncmVzc2lvbiBzZXF1ZW5jZTsgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYnkgYWxsCithcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvIGdldCBpbnZvbHZlZCBpbiB0aGUgbml0dHktZ3JpdHR5IG9mCitwcm9ncmVzc2l2ZSBzY2FuIHNlcXVlbmNlIGRlc2lnbi4gIChJZiB5b3Ugd2FudCB0byBwcm92aWRlIHVzZXIgY29udHJvbCBvZgorc2NhbiBzZXF1ZW5jZXMsIHlvdSBtYXkgd2lzaCB0byBib3Jyb3cgdGhlIHNjYW4gc2NyaXB0IHJlYWRpbmcgY29kZSBmb3VuZAoraW4gcmRzd2l0Y2guYywgc28gdGhhdCB5b3UgY2FuIHJlYWQgc2NhbiBzY3JpcHQgZmlsZXMganVzdCBsaWtlIGNqcGVnJ3MuKQorV2hlbiBzY2FuX2luZm8gaXMgbm90IE5VTEwsIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwgc3RvcmUgRENUJ2QgZGF0YQoraW50byBhIGJ1ZmZlciBhcnJheSBhcyBqcGVnX3dyaXRlX3NjYW5saW5lcygpIGlzIGNhbGxlZCwgYW5kIHdpbGwgZW1pdCBhbGwKK3RoZSByZXF1ZXN0ZWQgc2NhbnMgZHVyaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCkuICBUaGlzIGltcGxpZXMgdGhhdAorbXVsdGlwbGUtc2NhbiBvdXRwdXQgY2Fubm90IGJlIGNyZWF0ZWQgd2l0aCBhIHN1c3BlbmRpbmcgZGF0YSBkZXN0aW5hdGlvbgorbWFuYWdlciwgc2luY2UganBlZ19maW5pc2hfY29tcHJlc3MoKSBkb2VzIG5vdCBzdXBwb3J0IHN1c3BlbnNpb24uICBXZQorc2hvdWxkIGFsc28gbm90ZSB0aGF0IHRoZSBjb21wcmVzc29yIGN1cnJlbnRseSBmb3JjZXMgSHVmZm1hbiBvcHRpbWl6YXRpb24KK21vZGUgd2hlbiBjcmVhdGluZyBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSwgYmVjYXVzZSB0aGUgZGVmYXVsdCBIdWZmbWFuCit0YWJsZXMgYXJlIHVuc3VpdGFibGUgZm9yIHByb2dyZXNzaXZlIGZpbGVzLgorCitQcm9ncmVzc2l2ZSBkZWNvbXByZXNzaW9uOgorCitXaGVuIGJ1ZmZlcmVkLWltYWdlIG1vZGUgaXMgbm90IHVzZWQsIHRoZSBkZWNvZGVyIGxpYnJhcnkgd2lsbCByZWFkIGFsbCBvZgorYSBtdWx0aS1zY2FuIGZpbGUgZHVyaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLCBzbyB0aGF0IGl0IGNhbiBwcm92aWRlIGEKK2ZpbmFsIGRlY29kZWQgaW1hZ2UuICAoSGVyZSAibXVsdGktc2NhbiIgbWVhbnMgZWl0aGVyIHByb2dyZXNzaXZlIG9yCittdWx0aS1zY2FuIHNlcXVlbnRpYWwuKSAgVGhpcyBtYWtlcyBtdWx0aS1zY2FuIGZpbGVzIHRyYW5zcGFyZW50IHRvIHRoZQorZGVjb2RpbmcgYXBwbGljYXRpb24uICBIb3dldmVyLCBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCB1c2VkIHN1c3BlbmRpbmcKK2lucHV0IHdpdGggdmVyc2lvbiA1IG9mIHRoZSBJSkcgbGlicmFyeSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gY2hlY2sKK2ZvciBhIHN1c3BlbnNpb24gcmV0dXJuIGZyb20ganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisKK1RvIHBlcmZvcm0gaW5jcmVtZW50YWwgZGlzcGxheSwgYW4gYXBwbGljYXRpb24gbXVzdCB1c2UgdGhlIGxpYnJhcnkncworYnVmZmVyZWQtaW1hZ2UgbW9kZS4gIFRoaXMgaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCisKKworQnVmZmVyZWQtaW1hZ2UgbW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGUgbGlicmFyeSBzdG9yZXMgdGhlIHBhcnRpYWxseSBkZWNvZGVkIGltYWdlIGluIGEKK2NvZWZmaWNpZW50IGJ1ZmZlciwgZnJvbSB3aGljaCBpdCBjYW4gYmUgcmVhZCBvdXQgYXMgbWFueSB0aW1lcyBhcyBkZXNpcmVkLgorVGhpcyBtb2RlIGlzIHR5cGljYWxseSB1c2VkIGZvciBpbmNyZW1lbnRhbCBkaXNwbGF5IG9mIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMsCitidXQgaXQgY2FuIGJlIHVzZWQgd2l0aCBhbnkgSlBFRyBmaWxlLiAgRWFjaCBzY2FuIG9mIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlCithZGRzIG1vcmUgZGF0YSAobW9yZSBkZXRhaWwpIHRvIHRoZSBidWZmZXJlZCBpbWFnZS4gIFRoZSBhcHBsaWNhdGlvbiBjYW4KK2Rpc3BsYXkgaW4gbG9ja3N0ZXAgd2l0aCB0aGUgc291cmNlIGZpbGUgKG9uZSBkaXNwbGF5IHBhc3MgcGVyIGlucHV0IHNjYW4pLAorb3IgaXQgY2FuIGFsbG93IGlucHV0IHByb2Nlc3NpbmcgdG8gb3V0cnVuIGRpc3BsYXkgcHJvY2Vzc2luZy4gIEJ5IG1ha2luZworaW5wdXQgYW5kIGRpc3BsYXkgcHJvY2Vzc2luZyBydW4gaW5kZXBlbmRlbnRseSwgaXQgaXMgcG9zc2libGUgZm9yIHRoZQorYXBwbGljYXRpb24gdG8gYWRhcHQgcHJvZ3Jlc3NpdmUgZGlzcGxheSB0byBhIHdpZGUgcmFuZ2Ugb2YgZGF0YSB0cmFuc21pc3Npb24KK3JhdGVzLgorCitUaGUgYmFzaWMgY29udHJvbCBmbG93IGZvciBidWZmZXJlZC1pbWFnZSBkZWNvZGluZyBpcworCisJanBlZ19jcmVhdGVfZGVjb21wcmVzcygpCisJc2V0IGRhdGEgc291cmNlCisJanBlZ19yZWFkX2hlYWRlcigpCisJc2V0IG92ZXJhbGwgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCisJY2luZm8uYnVmZmVyZWRfaW1hZ2UgPSBUUlVFOwkvKiBzZWxlY3QgYnVmZmVyZWQtaW1hZ2UgbW9kZSAqLworCWpwZWdfc3RhcnRfZGVjb21wcmVzcygpCisJZm9yIChlYWNoIG91dHB1dCBwYXNzKSB7CisJICAgIGFkanVzdCBvdXRwdXQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGlmIHJlcXVpcmVkCisJICAgIGpwZWdfc3RhcnRfb3V0cHV0KCkJCS8qIHN0YXJ0IGEgbmV3IG91dHB1dCBwYXNzICovCisJICAgIGZvciAoYWxsIHNjYW5saW5lcyBpbiBpbWFnZSkgeworCSAgICAgICAganBlZ19yZWFkX3NjYW5saW5lcygpCisJICAgICAgICBkaXNwbGF5IHNjYW5saW5lcworCSAgICB9CisJICAgIGpwZWdfZmluaXNoX291dHB1dCgpCS8qIHRlcm1pbmF0ZSBvdXRwdXQgcGFzcyAqLworCX0KKwlqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkKKwlqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpCisKK1RoaXMgZGlmZmVycyBmcm9tIG9yZGluYXJ5IHVuYnVmZmVyZWQgZGVjb2RpbmcgaW4gdGhhdCB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsCitsZXZlbCBvZiBsb29waW5nLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjaG9vc2UgaG93IG1hbnkgb3V0cHV0IHBhc3NlcyB0byBtYWtlCithbmQgaG93IHRvIGRpc3BsYXkgZWFjaCBwYXNzLgorCitUaGUgc2ltcGxlc3QgYXBwcm9hY2ggdG8gZGlzcGxheWluZyBwcm9ncmVzc2l2ZSBpbWFnZXMgaXMgdG8gZG8gb25lIGRpc3BsYXkKK3Bhc3MgZm9yIGVhY2ggc2NhbiBhcHBlYXJpbmcgaW4gdGhlIGlucHV0IGZpbGUuICBJbiB0aGlzIGNhc2UgdGhlIG91dGVyIGxvb3AKK2NvbmRpdGlvbiBpcyB0eXBpY2FsbHkKKwl3aGlsZSAoISBqcGVnX2lucHV0X2NvbXBsZXRlKCZjaW5mbykpCithbmQgdGhlIHN0YXJ0LW91dHB1dCBjYWxsIHNob3VsZCByZWFkCisJanBlZ19zdGFydF9vdXRwdXQoJmNpbmZvLCBjaW5mby5pbnB1dF9zY2FuX251bWJlcik7CitUaGUgc2Vjb25kIHBhcmFtZXRlciB0byBqcGVnX3N0YXJ0X291dHB1dCgpIGluZGljYXRlcyB3aGljaCBzY2FuIG9mIHRoZSBpbnB1dAorZmlsZSBpcyB0byBiZSBkaXNwbGF5ZWQ7IHRoZSBzY2FucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgYXQgMSBmb3IgdGhpcworcHVycG9zZS4gIChZb3UgY2FuIHVzZSBhIGxvb3AgY291bnRlciBzdGFydGluZyBhdCAxIGlmIHlvdSBsaWtlLCBidXQgdXNpbmcKK3RoZSBsaWJyYXJ5J3MgaW5wdXQgc2NhbiBjb3VudGVyIGlzIGVhc2llci4pICBUaGUgbGlicmFyeSBhdXRvbWF0aWNhbGx5IHJlYWRzCitkYXRhIGFzIG5lY2Vzc2FyeSB0byBjb21wbGV0ZSBlYWNoIHJlcXVlc3RlZCBzY2FuLCBhbmQganBlZ19maW5pc2hfb3V0cHV0KCkKK2FkdmFuY2VzIHRvIHRoZSBuZXh0IHNjYW4gb3IgZW5kLW9mLWltYWdlIG1hcmtlciAoaGVuY2UgaW5wdXRfc2Nhbl9udW1iZXIKK3dpbGwgYmUgaW5jcmVtZW50ZWQgYnkgdGhlIHRpbWUgY29udHJvbCBhcnJpdmVzIGJhY2sgYXQganBlZ19zdGFydF9vdXRwdXQoKSkuCitXaXRoIHRoaXMgdGVjaG5pcXVlLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgaW5wdXQgZmlsZSBvbmx5IGFzIG5lZWRlZCwgYW5kCitpbnB1dCBhbmQgb3V0cHV0IHByb2Nlc3NpbmcgcnVuIGluIGxvY2tzdGVwLgorCitBZnRlciByZWFkaW5nIHRoZSBmaW5hbCBzY2FuIGFuZCByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLCB0aGUKK2J1ZmZlcmVkIGltYWdlIHJlbWFpbnMgYXZhaWxhYmxlOyBpdCBjYW4gYmUgcmVhZCBhZGRpdGlvbmFsIHRpbWVzIGJ5CityZXBlYXRpbmcgdGhlIGpwZWdfc3RhcnRfb3V0cHV0KCkvanBlZ19yZWFkX3NjYW5saW5lcygpL2pwZWdfZmluaXNoX291dHB1dCgpCitzZXF1ZW5jZS4gIEZvciBleGFtcGxlLCBhIHVzZWZ1bCB0ZWNobmlxdWUgaXMgdG8gdXNlIGZhc3Qgb25lLXBhc3MgY29sb3IKK3F1YW50aXphdGlvbiBmb3IgZGlzcGxheSBwYXNzZXMgbWFkZSB3aGlsZSB0aGUgaW1hZ2UgaXMgYXJyaXZpbmcsIGZvbGxvd2VkIGJ5CithIGZpbmFsIGRpc3BsYXkgcGFzcyB1c2luZyB0d28tcGFzcyBxdWFudGl6YXRpb24gZm9yIGhpZ2hlc3QgcXVhbGl0eS4gIFRoaXMKK2lzIGRvbmUgYnkgY2hhbmdpbmcgdGhlIGxpYnJhcnkgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGZpbmFsIG91dHB1dCBwYXNzLgorQ2hhbmdpbmcgcGFyYW1ldGVycyBiZXR3ZWVuIHBhc3NlcyBpcyBkaXNjdXNzZWQgaW4gZGV0YWlsIGJlbG93LgorCitJbiBnZW5lcmFsIHRoZSBsYXN0IHNjYW4gb2YgYSBwcm9ncmVzc2l2ZSBmaWxlIGNhbm5vdCBiZSByZWNvZ25pemVkIGFzIHN1Y2gKK3VudGlsIGFmdGVyIGl0IGlzIHJlYWQsIHNvIGEgcG9zdC1pbnB1dCBkaXNwbGF5IHBhc3MgaXMgdGhlIGJlc3QgYXBwcm9hY2ggaWYKK3lvdSB3YW50IHNwZWNpYWwgcHJvY2Vzc2luZyBpbiB0aGUgZmluYWwgcGFzcy4KKworV2hlbiBkb25lIHdpdGggdGhlIGltYWdlLCBiZSBzdXJlIHRvIGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHRvIHJlbGVhc2UKK3RoZSBidWZmZXJlZCBpbWFnZSAob3IganVzdCB1c2UganBlZ19kZXN0cm95X2RlY29tcHJlc3MoKSkuCisKK0lmIGlucHV0IGRhdGEgYXJyaXZlcyBmYXN0ZXIgdGhhbiBpdCBjYW4gYmUgZGlzcGxheWVkLCB0aGUgYXBwbGljYXRpb24gY2FuCitjYXVzZSB0aGUgbGlicmFyeSB0byBkZWNvZGUgaW5wdXQgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQncyBuZWVkZWQgdG8gcHJvZHVjZQorb3V0cHV0LiAgVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcgdGhlIHJvdXRpbmUganBlZ19jb25zdW1lX2lucHV0KCkuCitUaGUgcmV0dXJuIHZhbHVlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCUpQRUdfUkVBQ0hFRF9TT1M6ICAgIHJlYWNoZWQgYW4gU09TIG1hcmtlciAodGhlIHN0YXJ0IG9mIGEgbmV3IHNjYW4pCisJSlBFR19SRUFDSEVEX0VPSTogICAgcmVhY2hlZCB0aGUgRU9JIG1hcmtlciAoZW5kIG9mIGltYWdlKQorCUpQRUdfUk9XX0NPTVBMRVRFRDogIGNvbXBsZXRlZCByZWFkaW5nIG9uZSBNQ1Ugcm93IG9mIGNvbXByZXNzZWQgZGF0YQorCUpQRUdfU0NBTl9DT01QTEVURUQ6IGNvbXBsZXRlZCByZWFkaW5nIGxhc3QgTUNVIHJvdyBvZiBjdXJyZW50IHNjYW4KKwlKUEVHX1NVU1BFTkRFRDogICAgICBzdXNwZW5kZWQgYmVmb3JlIGNvbXBsZXRpbmcgYW55IG9mIHRoZSBhYm92ZQorKEpQRUdfU1VTUEVOREVEIGNhbiBvY2N1ciBvbmx5IGlmIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLikgIFRoaXMKK3JvdXRpbmUgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciBpbml0aWFsaXppbmcgdGhlIEpQRUcgb2JqZWN0LiAgSXQKK3JlYWRzIHNvbWUgYWRkaXRpb25hbCBkYXRhIGFuZCByZXR1cm5zIHdoZW4gb25lIG9mIHRoZSBpbmRpY2F0ZWQgc2lnbmlmaWNhbnQKK2V2ZW50cyBvY2N1cnMuICAoSWYgY2FsbGVkIGFmdGVyIHRoZSBFT0kgbWFya2VyIGlzIHJlYWNoZWQsIGl0IHdpbGwKK2ltbWVkaWF0ZWx5IHJldHVybiBKUEVHX1JFQUNIRURfRU9JIHdpdGhvdXQgYXR0ZW1wdGluZyB0byByZWFkIG1vcmUgZGF0YS4pCisKK1RoZSBsaWJyYXJ5J3Mgb3V0cHV0IHByb2Nlc3Npbmcgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkKK3doZW5ldmVyIHRoZSBvdXRwdXQgcHJvY2Vzc2luZyBvdmVydGFrZXMgdGhlIGlucHV0OyB0aHVzLCBzaW1wbGUgbG9ja3N0ZXAKK2Rpc3BsYXkgcmVxdWlyZXMgbm8gZGlyZWN0IGNhbGxzIHRvIGpwZWdfY29uc3VtZV9pbnB1dCgpLiAgQnV0IGJ5IGFkZGluZworY2FsbHMgdG8ganBlZ19jb25zdW1lX2lucHV0KCksIHlvdSBjYW4gYWJzb3JiIGRhdGEgaW4gYWR2YW5jZSBvZiB3aGF0IGlzCitiZWluZyBkaXNwbGF5ZWQuICBUaGlzIGhhcyB0d28gYmVuZWZpdHM6CisgICogWW91IGNhbiBsaW1pdCBidWlsZHVwIG9mIHVucHJvY2Vzc2VkIGRhdGEgaW4geW91ciBpbnB1dCBidWZmZXIuCisgICogWW91IGNhbiBlbGltaW5hdGUgZXh0cmEgZGlzcGxheSBwYXNzZXMgYnkgcGF5aW5nIGF0dGVudGlvbiB0byB0aGUKKyAgICBzdGF0ZSBvZiB0aGUgbGlicmFyeSdzIGlucHV0IHByb2Nlc3NpbmcuCisKK1RoZSBmaXJzdCBvZiB0aGVzZSBiZW5lZml0cyBvbmx5IHJlcXVpcmVzIGludGVyc3BlcnNpbmcgY2FsbHMgdG8KK2pwZWdfY29uc3VtZV9pbnB1dCgpIHdpdGggeW91ciBkaXNwbGF5IG9wZXJhdGlvbnMgYW5kIGFueSBvdGhlciBwcm9jZXNzaW5nCit5b3UgbWF5IGJlIGRvaW5nLiAgVG8gYXZvaWQgd2FzdGluZyBjeWNsZXMgZHVlIHRvIGJhY2t0cmFja2luZywgaXQncyBiZXN0IHRvCitjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpIG9ubHkgYWZ0ZXIgYSBodW5kcmVkIG9yIHNvIG5ldyBieXRlcyBoYXZlIGFycml2ZWQuCitUaGlzIGlzIGRpc2N1c3NlZCBmdXJ0aGVyIHVuZGVyICJJL08gc3VzcGVuc2lvbiIsIGFib3ZlLiAgKE5vdGU6IHRoZSBKUEVHCitsaWJyYXJ5IGN1cnJlbnRseSBpcyBub3QgdGhyZWFkLXNhZmUuICBZb3UgbXVzdCBub3QgY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKQorZnJvbSBvbmUgdGhyZWFkIG9mIGNvbnRyb2wgaWYgYSBkaWZmZXJlbnQgbGlicmFyeSByb3V0aW5lIGlzIHdvcmtpbmcgb24gdGhlCitzYW1lIEpQRUcgb2JqZWN0IGluIGFub3RoZXIgdGhyZWFkLikKKworV2hlbiBpbnB1dCBhcnJpdmVzIGZhc3QgZW5vdWdoIHRoYXQgbW9yZSB0aGFuIG9uZSBuZXcgc2NhbiBpcyBhdmFpbGFibGUKK2JlZm9yZSB5b3Ugc3RhcnQgYSBuZXcgb3V0cHV0IHBhc3MsIHlvdSBtYXkgYXMgd2VsbCBza2lwIHRoZSBvdXRwdXQgcGFzcworY29ycmVzcG9uZGluZyB0byB0aGUgY29tcGxldGVkIHNjYW4uICBUaGlzIG9jY3VycyBmb3IgZnJlZSBpZiB5b3UgcGFzcworY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIgYXMgdGhlIHRhcmdldCBzY2FuIG51bWJlciB0byBqcGVnX3N0YXJ0X291dHB1dCgpLgorVGhlIGlucHV0X3NjYW5fbnVtYmVyIGZpZWxkIGlzIHNpbXBseSB0aGUgaW5kZXggb2YgdGhlIHNjYW4gY3VycmVudGx5IGJlaW5nCitjb25zdW1lZCBieSB0aGUgaW5wdXQgcHJvY2Vzc29yLiAgWW91IGNhbiBlbnN1cmUgdGhhdCB0aGlzIGlzIHVwLXRvLWRhdGUgYnkKK2VtcHR5aW5nIHRoZSBpbnB1dCBidWZmZXIganVzdCBiZWZvcmUgY2FsbGluZyBqcGVnX3N0YXJ0X291dHB1dCgpOiBjYWxsCitqcGVnX2NvbnN1bWVfaW5wdXQoKSByZXBlYXRlZGx5IHVudGlsIGl0IHJldHVybnMgSlBFR19TVVNQRU5ERUQgb3IKK0pQRUdfUkVBQ0hFRF9FT0kuCisKK1RoZSB0YXJnZXQgc2NhbiBudW1iZXIgcGFzc2VkIHRvIGpwZWdfc3RhcnRfb3V0cHV0KCkgaXMgc2F2ZWQgaW4gdGhlCitjaW5mby5vdXRwdXRfc2Nhbl9udW1iZXIgZmllbGQuICBUaGUgbGlicmFyeSdzIG91dHB1dCBwcm9jZXNzaW5nIGNhbGxzCitqcGVnX2NvbnN1bWVfaW5wdXQoKSB3aGVuZXZlciB0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciBhbmQgcm93IHdpdGhpbgordGhhdCBzY2FuIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBvdXRwdXQgc2NhbiBudW1iZXIgYW5kIHJvdy4KK1RodXMsIGlucHV0IHByb2Nlc3NpbmcgY2FuICJnZXQgYWhlYWQiIG9mIHRoZSBvdXRwdXQgcHJvY2Vzc2luZyBidXQgaXMgbm90CithbGxvd2VkIHRvICJmYWxsIGJlaGluZCIuICBZb3UgY2FuIGFjaGlldmUgc2V2ZXJhbCBkaWZmZXJlbnQgZWZmZWN0cyBieQorbWFuaXB1bGF0aW5nIHRoaXMgaW50ZXJsb2NrIHJ1bGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IHBhc3MgYSB0YXJnZXQgc2NhbgorbnVtYmVyIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciwgdGhlIG91dHB1dCBwcm9jZXNzb3Igd2lsbAord2FpdCB1bnRpbCB0aGF0IHNjYW4gc3RhcnRzIHRvIGFycml2ZSBiZWZvcmUgcHJvZHVjaW5nIGFueSBvdXRwdXQuICAoVG8gYXZvaWQKK2FuIGluZmluaXRlIGxvb3AsIHRoZSB0YXJnZXQgc2NhbiBudW1iZXIgaXMgYXV0b21hdGljYWxseSByZXNldCB0byB0aGUgbGFzdAorc2NhbiBudW1iZXIgd2hlbiB0aGUgZW5kIG9mIGltYWdlIGlzIHJlYWNoZWQuICBUaHVzLCBpZiB5b3Ugc3BlY2lmeSBhIGxhcmdlCit0YXJnZXQgc2NhbiBudW1iZXIsIHRoZSBsaWJyYXJ5IHdpbGwganVzdCBhYnNvcmIgdGhlIGVudGlyZSBpbnB1dCBmaWxlIGFuZAordGhlbiBwZXJmb3JtIGFuIG91dHB1dCBwYXNzLiAgVGhpcyBpcyBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyB3aGF0CitqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBkb2VzIHdoZW4geW91IGRvbid0IHNlbGVjdCBidWZmZXJlZC1pbWFnZSBtb2RlLikKK1doZW4geW91IHBhc3MgYSB0YXJnZXQgc2NhbiBudW1iZXIgZXF1YWwgdG8gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIsCit0aGUgaW1hZ2UgaXMgZGlzcGxheWVkIG5vIGZhc3RlciB0aGFuIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gYXJyaXZlcy4gIFRoZQorZmluYWwgcG9zc2liaWxpdHkgaXMgdG8gcGFzcyBhIHRhcmdldCBzY2FuIG51bWJlciBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgaW5wdXQKK3NjYW4gbnVtYmVyOyB0aGlzIGRpc2FibGVzIHRoZSBpbnB1dC9vdXRwdXQgaW50ZXJsb2NrIGFuZCBjYXVzZXMgdGhlIG91dHB1dAorcHJvY2Vzc29yIHRvIHNpbXBseSBkaXNwbGF5IHdoYXRldmVyIGl0IGZpbmRzIGluIHRoZSBpbWFnZSBidWZmZXIsIHdpdGhvdXQKK3dhaXRpbmcgZm9yIGlucHV0LiAgKEhvd2V2ZXIsIHRoZSBsaWJyYXJ5IHdpbGwgbm90IGFjY2VwdCBhIHRhcmdldCBzY2FuCitudW1iZXIgbGVzcyB0aGFuIG9uZSwgc28geW91IGNhbid0IGF2b2lkIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCBzY2FuLikKKworV2hlbiBkYXRhIGlzIGFycml2aW5nIGZhc3RlciB0aGFuIHRoZSBvdXRwdXQgZGlzcGxheSBwcm9jZXNzaW5nIGNhbiBhZHZhbmNlCit0aHJvdWdoIHRoZSBpbWFnZSwganBlZ19jb25zdW1lX2lucHV0KCkgd2lsbCBzdG9yZSBkYXRhIGludG8gdGhlIGJ1ZmZlcmVkCitpbWFnZSBiZXlvbmQgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBvdXRwdXQgcHJvY2Vzc2luZyBpcyByZWFkaW5nIGRhdGEgb3V0CithZ2Fpbi4gIElmIHRoZSBpbnB1dCBhcnJpdmVzIGZhc3QgZW5vdWdoLCBpdCBtYXkgIndyYXAgYXJvdW5kIiB0aGUgYnVmZmVyIHRvCit0aGUgcG9pbnQgd2hlcmUgdGhlIGlucHV0IGlzIG1vcmUgdGhhbiBvbmUgd2hvbGUgc2NhbiBhaGVhZCBvZiB0aGUgb3V0cHV0LgorSWYgdGhlIG91dHB1dCBwcm9jZXNzaW5nIHNpbXBseSBwcm9jZWVkcyB0aHJvdWdoIGl0cyBkaXNwbGF5IHBhc3Mgd2l0aG91dAorcGF5aW5nIGF0dGVudGlvbiB0byB0aGUgaW5wdXQsIHRoZSBlZmZlY3Qgc2VlbiBvbi1zY3JlZW4gaXMgdGhhdCB0aGUgbG93ZXIKK3BhcnQgb2YgdGhlIGltYWdlIGlzIG9uZSBvciBtb3JlIHNjYW5zIGJldHRlciBpbiBxdWFsaXR5IHRoYW4gdGhlIHVwcGVyIHBhcnQuCitUaGVuLCB3aGVuIHRoZSBuZXh0IG91dHB1dCBzY2FuIGlzIHN0YXJ0ZWQsIHlvdSBoYXZlIGEgY2hvaWNlIG9mIHdoYXQgdGFyZ2V0CitzY2FuIG51bWJlciB0byB1c2UuICBUaGUgcmVjb21tZW5kZWQgY2hvaWNlIGlzIHRvIHVzZSB0aGUgY3VycmVudCBpbnB1dCBzY2FuCitudW1iZXIgYXQgdGhhdCB0aW1lLCB3aGljaCBpbXBsaWVzIHRoYXQgeW91J3ZlIHNraXBwZWQgdGhlIG91dHB1dCBzY2FucworY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgc2NhbnMgdGhhdCB3ZXJlIGNvbXBsZXRlZCB3aGlsZSB5b3UgcHJvY2Vzc2VkIHRoZQorcHJldmlvdXMgb3V0cHV0IHNjYW4uICBJbiB0aGlzIHdheSwgdGhlIGRlY29kZXIgYXV0b21hdGljYWxseSBhZGFwdHMgaXRzCitzcGVlZCB0byB0aGUgYXJyaXZpbmcgZGF0YSwgYnkgc2tpcHBpbmcgb3V0cHV0IHNjYW5zIGFzIG5lY2Vzc2FyeSB0byBrZWVwIHVwCit3aXRoIHRoZSBhcnJpdmluZyBkYXRhLgorCitXaGVuIHVzaW5nIHRoaXMgc3RyYXRlZ3ksIHlvdSdsbCB3YW50IHRvIGJlIHN1cmUgdGhhdCB5b3UgcGVyZm9ybSBhIGZpbmFsCitvdXRwdXQgcGFzcyBhZnRlciByZWNlaXZpbmcgYWxsIHRoZSBkYXRhOyBvdGhlcndpc2UgeW91ciBsYXN0IGRpc3BsYXkgbWF5IG5vdAorYmUgZnVsbCBxdWFsaXR5IGFjcm9zcyB0aGUgd2hvbGUgc2NyZWVuLiAgU28gdGhlIHJpZ2h0IG91dGVyIGxvb3AgbG9naWMgaXMKK3NvbWV0aGluZyBsaWtlIHRoaXM6CisJZG8geworCSAgICBhYnNvcmIgYW55IHdhaXRpbmcgaW5wdXQgYnkgY2FsbGluZyBqcGVnX2NvbnN1bWVfaW5wdXQoKQorCSAgICBmaW5hbF9wYXNzID0ganBlZ19pbnB1dF9jb21wbGV0ZSgmY2luZm8pOworCSAgICBhZGp1c3Qgb3V0cHV0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZAorCSAgICBqcGVnX3N0YXJ0X291dHB1dCgmY2luZm8sIGNpbmZvLmlucHV0X3NjYW5fbnVtYmVyKTsKKwkgICAgLi4uCisJICAgIGpwZWdfZmluaXNoX291dHB1dCgpCisJfSB3aGlsZSAoISBmaW5hbF9wYXNzKTsKK3JhdGhlciB0aGFuIHF1aXR0aW5nIGFzIHNvb24gYXMganBlZ19pbnB1dF9jb21wbGV0ZSgpIHJldHVybnMgVFJVRS4gIFRoaXMKK2FycmFuZ2VtZW50IG1ha2VzIGl0IHNpbXBsZSB0byB1c2UgaGlnaGVyLXF1YWxpdHkgZGVjb2RpbmcgcGFyYW1ldGVycworZm9yIHRoZSBmaW5hbCBwYXNzLiAgQnV0IGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBzcGVjaWFsIHBhcmFtZXRlcnMgZm9yCit0aGUgZmluYWwgcGFzcywgdGhlIHJpZ2h0IGxvb3AgbG9naWMgaXMgbGlrZSB0aGlzOgorCWZvciAoOzspIHsKKwkgICAgYWJzb3JiIGFueSB3YWl0aW5nIGlucHV0IGJ5IGNhbGxpbmcganBlZ19jb25zdW1lX2lucHV0KCkKKwkgICAganBlZ19zdGFydF9vdXRwdXQoJmNpbmZvLCBjaW5mby5pbnB1dF9zY2FuX251bWJlcik7CisJICAgIC4uLgorCSAgICBqcGVnX2ZpbmlzaF9vdXRwdXQoKQorCSAgICBpZiAoanBlZ19pbnB1dF9jb21wbGV0ZSgmY2luZm8pICYmCisJICAgICAgICBjaW5mby5pbnB1dF9zY2FuX251bWJlciA9PSBjaW5mby5vdXRwdXRfc2Nhbl9udW1iZXIpCisJICAgICAgYnJlYWs7CisJfQorSW4gdGhpcyBjYXNlIHlvdSBkb24ndCBuZWVkIHRvIGtub3cgaW4gYWR2YW5jZSB3aGV0aGVyIGFuIG91dHB1dCBwYXNzIGlzIHRvCitiZSB0aGUgbGFzdCBvbmUsIHNvIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBoYXZlIHJlYWNoZWQgRU9GIGJlZm9yZSBzdGFydGluZwordGhlIGZpbmFsIG91dHB1dCBwYXNzOyByYXRoZXIsIHdoYXQgeW91IHdhbnQgdG8gdGVzdCBpcyB3aGV0aGVyIHRoZSBvdXRwdXQKK3Bhc3Mgd2FzIHBlcmZvcm1lZCBpbiBzeW5jIHdpdGggdGhlIGZpbmFsIGlucHV0IHNjYW4uICBUaGlzIGZvcm0gb2YgdGhlIGxvb3AKK3dpbGwgYXZvaWQgYW4gZXh0cmEgb3V0cHV0IHBhc3Mgd2hlbmV2ZXIgdGhlIGRlY29kZXIgaXMgYWJsZSAob3IgbmVhcmx5IGFibGUpCit0byBrZWVwIHVwIHdpdGggdGhlIGluY29taW5nIGRhdGEuCisKK1doZW4gdGhlIGRhdGEgdHJhbnNtaXNzaW9uIHNwZWVkIGlzIGhpZ2gsIHlvdSBtaWdodCBiZWdpbiBhIGRpc3BsYXkgcGFzcywKK3RoZW4gZmluZCB0aGF0IG11Y2ggb3IgYWxsIG9mIHRoZSBmaWxlIGhhcyBhcnJpdmVkIGJlZm9yZSB5b3UgY2FuIGNvbXBsZXRlCit0aGUgcGFzcy4gIChZb3UgY2FuIGRldGVjdCB0aGlzIGJ5IG5vdGluZyB0aGUgSlBFR19SRUFDSEVEX0VPSSByZXR1cm4gY29kZQorZnJvbSBqcGVnX2NvbnN1bWVfaW5wdXQoKSwgb3IgZXF1aXZhbGVudGx5IGJ5IHRlc3RpbmcganBlZ19pbnB1dF9jb21wbGV0ZSgpLikKK0luIHRoaXMgc2l0dWF0aW9uIHlvdSBtYXkgd2lzaCB0byBhYm9ydCB0aGUgY3VycmVudCBkaXNwbGF5IHBhc3MgYW5kIHN0YXJ0IGEKK25ldyBvbmUgdXNpbmcgdGhlIG5ld2x5IGFycml2ZWQgaW5mb3JtYXRpb24uICBUbyBkbyBzbywganVzdCBjYWxsCitqcGVnX2ZpbmlzaF9vdXRwdXQoKSBhbmQgdGhlbiBzdGFydCBhIG5ldyBwYXNzIHdpdGgganBlZ19zdGFydF9vdXRwdXQoKS4KKworQSB2YXJpYW50IHN0cmF0ZWd5IGlzIHRvIGFib3J0IGFuZCByZXN0YXJ0IGRpc3BsYXkgaWYgbW9yZSB0aGFuIG9uZSBjb21wbGV0ZQorc2NhbiBhcnJpdmVzIGR1cmluZyBhbiBvdXRwdXQgcGFzczsgdGhpcyBjYW4gYmUgZGV0ZWN0ZWQgYnkgbm90aW5nCitKUEVHX1JFQUNIRURfU09TIHJldHVybnMgYW5kL29yIGV4YW1pbmluZyBjaW5mby5pbnB1dF9zY2FuX251bWJlci4gIFRoaXMKK2lkZWEgc2hvdWxkIGJlIGVtcGxveWVkIHdpdGggY2F1dGlvbiwgaG93ZXZlciwgc2luY2UgdGhlIGRpc3BsYXkgcHJvY2VzcworbWlnaHQgbmV2ZXIgZ2V0IHRvIHRoZSBib3R0b20gb2YgdGhlIGltYWdlIGJlZm9yZSBiZWluZyBhYm9ydGVkLCByZXN1bHRpbmcKK2luIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBzY3JlZW4gYmVpbmcgc2V2ZXJhbCBwYXNzZXMgd29yc2UgdGhhbiB0aGUgdXBwZXIuCitJbiBtb3N0IGNhc2VzIGl0J3MgcHJvYmFibHkgYmVzdCB0byBhYm9ydCBhbiBvdXRwdXQgcGFzcyBvbmx5IGlmIHRoZSB3aG9sZQorZmlsZSBoYXMgYXJyaXZlZCBhbmQgeW91IHdhbnQgdG8gYmVnaW4gdGhlIGZpbmFsIG91dHB1dCBwYXNzIGltbWVkaWF0ZWx5LgorCitXaGVuIHJlY2VpdmluZyBkYXRhIGFjcm9zcyBhIGNvbW11bmljYXRpb24gbGluaywgd2UgcmVjb21tZW5kIGFsd2F5cyB1c2luZwordGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIgZm9yIHRoZSBvdXRwdXQgdGFyZ2V0IHNjYW4gbnVtYmVyOyBpZiBhCitoaWdoZXItcXVhbGl0eSBmaW5hbCBwYXNzIGlzIHRvIGJlIGRvbmUsIGl0IHNob3VsZCBiZSBzdGFydGVkIChhYm9ydGluZyBhbnkKK2luY29tcGxldGUgb3V0cHV0IHBhc3MpIGFzIHNvb24gYXMgdGhlIGVuZCBvZiBmaWxlIGlzIHJlY2VpdmVkLiAgSG93ZXZlciwKK21hbnkgb3RoZXIgc3RyYXRlZ2llcyBhcmUgcG9zc2libGUuICBGb3IgZXhhbXBsZSwgdGhlIGFwcGxpY2F0aW9uIGNhbiBleGFtaW5lCit0aGUgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBpbnB1dCBzY2FuIGFuZCBkZWNpZGUgd2hldGhlciB0byBkaXNwbGF5IGl0IG9yCitub3QuICBJZiB0aGUgc2NhbiBjb250YWlucyBvbmx5IGNocm9tYSBkYXRhLCBvbmUgbWlnaHQgY2hvb3NlIG5vdCB0byB1c2UgaXQKK2FzIHRoZSB0YXJnZXQgc2NhbiwgZXhwZWN0aW5nIHRoYXQgdGhlIHNjYW4gd2lsbCBiZSBzbWFsbCBhbmQgd2lsbCBhcnJpdmUKK3F1aWNrbHkuICBUbyBza2lwIHRvIHRoZSBuZXh0IHNjYW4sIGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkgdW50aWwgaXQKK3JldHVybnMgSlBFR19SRUFDSEVEX1NPUyBvciBKUEVHX1JFQUNIRURfRU9JLiAgT3IganVzdCB1c2UgdGhlIG5leHQgaGlnaGVyCitudW1iZXIgYXMgdGhlIHRhcmdldCBzY2FuIGZvciBqcGVnX3N0YXJ0X291dHB1dCgpOyBidXQgdGhhdCBtZXRob2QgZG9lc24ndAorbGV0IHlvdSBpbnNwZWN0IHRoZSBuZXh0IHNjYW4ncyBwYXJhbWV0ZXJzIGJlZm9yZSBkZWNpZGluZyB0byBkaXNwbGF5IGl0LgorCisKK0luIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIG5ldmVyIHBlcmZvcm1zIGlucHV0IGFuZAordGh1cyBuZXZlciBzdXNwZW5kcy4gIEFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBpbnB1dCBzdXNwZW5zaW9uIHdpdGgKK2J1ZmZlcmVkLWltYWdlIG1vZGUgbXVzdCBiZSBwcmVwYXJlZCBmb3Igc3VzcGVuc2lvbiByZXR1cm5zIGZyb20gdGhlc2UKK3JvdXRpbmVzOgorKiBqcGVnX3N0YXJ0X291dHB1dCgpIHBlcmZvcm1zIGlucHV0IG9ubHkgaWYgeW91IHJlcXVlc3QgMi1wYXNzIHF1YW50aXphdGlvbgorICBhbmQgdGhlIHRhcmdldCBzY2FuIGlzbid0IGZ1bGx5IHJlYWQgeWV0LiAgKFRoaXMgaXMgZGlzY3Vzc2VkIGJlbG93LikKKyoganBlZ19yZWFkX3NjYW5saW5lcygpLCBhcyBhbHdheXMsIHJldHVybnMgdGhlIG51bWJlciBvZiBzY2FubGluZXMgdGhhdCBpdAorICB3YXMgYWJsZSB0byBwcm9kdWNlIGJlZm9yZSBzdXNwZW5kaW5nLgorKiBqcGVnX2ZpbmlzaF9vdXRwdXQoKSB3aWxsIHJlYWQgYW55IG1hcmtlcnMgZm9sbG93aW5nIHRoZSB0YXJnZXQgc2NhbiwKKyAgdXAgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBvciB0aGUgU09TIG1hcmtlciB0aGF0IGJlZ2lucyBhbm90aGVyIHNjYW4uCisgIChCdXQgaXQgcmVhZHMgbm8gaW5wdXQgaWYganBlZ19jb25zdW1lX2lucHV0KCkgaGFzIGFscmVhZHkgcmVhY2hlZCB0aGUKKyAgZW5kIG9mIHRoZSBmaWxlIG9yIGEgU09TIG1hcmtlciBiZXlvbmQgdGhlIHRhcmdldCBvdXRwdXQgc2Nhbi4pCisqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB3aWxsIHJlYWQgdW50aWwgdGhlIGVuZCBvZiBmaWxlLCBhbmQgdGh1cyBjYW4KKyAgc3VzcGVuZCBpZiB0aGUgZW5kIGhhc24ndCBhbHJlYWR5IGJlZW4gcmVhY2hlZCAoYXMgY2FuIGJlIHRlc3RlZCBieQorICBjYWxsaW5nIGpwZWdfaW5wdXRfY29tcGxldGUoKSkuCitqcGVnX3N0YXJ0X291dHB1dCgpLCBqcGVnX2ZpbmlzaF9vdXRwdXQoKSwgYW5kIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKQorYWxsIHJldHVybiBUUlVFIGlmIHRoZXkgY29tcGxldGVkIHRoZWlyIHRhc2tzLCBGQUxTRSBpZiB0aGV5IGhhZCB0byBzdXNwZW5kLgorSW4gdGhlIGV2ZW50IG9mIGEgRkFMU0UgcmV0dXJuLCB0aGUgYXBwbGljYXRpb24gbXVzdCBsb2FkIG1vcmUgaW5wdXQgZGF0YQorYW5kIHJlcGVhdCB0aGUgY2FsbC4gIEFwcGxpY2F0aW9ucyB0aGF0IHVzZSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZXMgbmVlZAorbm90IGNoZWNrIHRoZSByZXR1cm4gdmFsdWVzIG9mIHRoZXNlIHRocmVlIHJvdXRpbmVzLgorCisKK0l0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSBkZWNvZGluZyBwYXJhbWV0ZXJzIGJldHdlZW4gb3V0cHV0IHBhc3NlcyBpbiB0aGUKK2J1ZmZlcmVkLWltYWdlIG1vZGUuICBUaGUgZGVjb2RlciBsaWJyYXJ5IGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IHZlcnkKK2xpbWl0ZWQgY2hhbmdlcyBvZiBwYXJhbWV0ZXJzLiAgT05MWSBUSEUgRk9MTE9XSU5HIHBhcmFtZXRlciBjaGFuZ2VzIGFyZQorYWxsb3dlZCBhZnRlciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBpcyBjYWxsZWQ6CisqIGRjdF9tZXRob2QgY2FuIGJlIGNoYW5nZWQgYmVmb3JlIGVhY2ggY2FsbCB0byBqcGVnX3N0YXJ0X291dHB1dCgpLgorICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIHVzZSBhIGZhc3QgRENUIG1ldGhvZCBmb3IgZWFybHkgc2NhbnMsIGNoYW5naW5nCisgIHRvIGEgaGlnaGVyIHF1YWxpdHkgbWV0aG9kIGZvciB0aGUgZmluYWwgc2Nhbi4KKyogZGl0aGVyX21vZGUgY2FuIGJlIGNoYW5nZWQgYmVmb3JlIGVhY2ggY2FsbCB0byBqcGVnX3N0YXJ0X291dHB1dCgpOworICBvZiBjb3Vyc2UgdGhpcyBoYXMgbm8gaW1wYWN0IGlmIG5vdCB1c2luZyBjb2xvciBxdWFudGl6YXRpb24uICBUeXBpY2FsbHkKKyAgb25lIHdvdWxkIHVzZSBvcmRlcmVkIGRpdGhlciBmb3IgaW5pdGlhbCBwYXNzZXMsIHRoZW4gc3dpdGNoIHRvCisgIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXIgZm9yIHRoZSBmaW5hbCBwYXNzLiAgQ2F1dGlvbjogY2hhbmdpbmcgZGl0aGVyIG1vZGUKKyAgY2FuIGNhdXNlIG1vcmUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBieSB0aGUgbGlicmFyeS4gIEFsdGhvdWdoIHRoZSBhbW91bnQKKyAgb2YgbWVtb3J5IGludm9sdmVkIGlzIG5vdCBsYXJnZSAoYSBzY2FubGluZSBvciBzbyksIGl0IG1heSBjYXVzZSB0aGUKKyAgaW5pdGlhbCBtYXhfbWVtb3J5X3RvX3VzZSBzcGVjaWZpY2F0aW9uIHRvIGJlIGV4Y2VlZGVkLCB3aGljaCBpbiB0aGUgd29yc3QKKyAgY2FzZSB3b3VsZCByZXN1bHQgaW4gYW4gb3V0LW9mLW1lbW9yeSBmYWlsdXJlLgorKiBkb19ibG9ja19zbW9vdGhpbmcgY2FuIGJlIGNoYW5nZWQgYmVmb3JlIGVhY2ggY2FsbCB0byBqcGVnX3N0YXJ0X291dHB1dCgpLgorICBUaGlzIHNldHRpbmcgaXMgcmVsZXZhbnQgb25seSB3aGVuIGRlY29kaW5nIGEgcHJvZ3Jlc3NpdmUgSlBFRyBpbWFnZS4KKyAgRHVyaW5nIHRoZSBmaXJzdCBEQy1vbmx5IHNjYW4sIGJsb2NrIHNtb290aGluZyBwcm92aWRlcyBhIHZlcnkgImZ1enp5IiBsb29rCisgIGluc3RlYWQgb2YgdGhlIHZlcnkgImJsb2NreSIgbG9vayBzZWVuIHdpdGhvdXQgaXQ7IHdoaWNoIGlzIGJldHRlciBzZWVtcyBhCisgIG1hdHRlciBvZiBwZXJzb25hbCB0YXN0ZS4gIEJ1dCBibG9jayBzbW9vdGhpbmcgaXMgbmVhcmx5IGFsd2F5cyBhIHdpbgorICBkdXJpbmcgbGF0ZXIgc3RhZ2VzLCBlc3BlY2lhbGx5IHdoZW4gZGVjb2RpbmcgYSBzdWNjZXNzaXZlLWFwcHJveGltYXRpb24KKyAgaW1hZ2U6IHNtb290aGluZyBoZWxwcyB0byBoaWRlIHRoZSBzbGlnaHQgYmxvY2tpbmVzcyB0aGF0IG90aGVyd2lzZSBzaG93cworICB1cCBvbiBzbW9vdGggZ3JhZGllbnRzIHVudGlsIHRoZSBsb3dlc3QgY29lZmZpY2llbnQgYml0cyBhcmUgc2VudC4KKyogQ29sb3IgcXVhbnRpemF0aW9uIG1vZGUgY2FuIGJlIGNoYW5nZWQgdW5kZXIgdGhlIHJ1bGVzIGRlc2NyaWJlZCBiZWxvdy4KKyAgWW91ICpjYW5ub3QqIGNoYW5nZSBiZXR3ZWVuIGZ1bGwtY29sb3IgYW5kIHF1YW50aXplZCBvdXRwdXQgKGJlY2F1c2UgdGhhdAorICB3b3VsZCBhbHRlciB0aGUgcmVxdWlyZWQgSS9PIGJ1ZmZlciBzaXplcyksIGJ1dCB5b3UgY2FuIGNoYW5nZSB3aGljaAorICBxdWFudGl6YXRpb24gbWV0aG9kIGlzIHVzZWQuCisKK1doZW4gZ2VuZXJhdGluZyBjb2xvci1xdWFudGl6ZWQgb3V0cHV0LCBjaGFuZ2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGlzIGEKK3ZlcnkgdXNlZnVsIHdheSBvZiBzd2l0Y2hpbmcgYmV0d2VlbiBoaWdoLXNwZWVkIGFuZCBoaWdoLXF1YWxpdHkgZGlzcGxheS4KK1RoZSBsaWJyYXJ5IGFsbG93cyB5b3UgdG8gY2hhbmdlIGFtb25nIGl0cyB0aHJlZSBxdWFudGl6YXRpb24gbWV0aG9kczoKKzEuIFNpbmdsZS1wYXNzIHF1YW50aXphdGlvbiB0byBhIGZpeGVkIGNvbG9yIGN1YmUuCisgICBTZWxlY3RlZCBieSBjaW5mby50d29fcGFzc19xdWFudGl6ZSA9IEZBTFNFIGFuZCBjaW5mby5jb2xvcm1hcCA9IE5VTEwuCisyLiBTaW5nbGUtcGFzcyBxdWFudGl6YXRpb24gdG8gYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgY29sb3JtYXAuCisgICBTZWxlY3RlZCBieSBzZXR0aW5nIGNpbmZvLmNvbG9ybWFwIHRvIHBvaW50IHRvIHRoZSBjb2xvcm1hcCAodGhlIHZhbHVlIG9mCisgICB0d29fcGFzc19xdWFudGl6ZSBpcyBpZ25vcmVkKTsgYWxzbyBzZXQgY2luZm8uYWN0dWFsX251bWJlcl9vZl9jb2xvcnMuCiszLiBUd28tcGFzcyBxdWFudGl6YXRpb24gdG8gYSBjb2xvcm1hcCBjaG9zZW4gc3BlY2lmaWNhbGx5IGZvciB0aGUgaW1hZ2UuCisgICBTZWxlY3RlZCBieSBjaW5mby50d29fcGFzc19xdWFudGl6ZSA9IFRSVUUgYW5kIGNpbmZvLmNvbG9ybWFwID0gTlVMTC4KKyAgIChUaGlzIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcgc2VsZWN0ZWQgYnkganBlZ19yZWFkX2hlYWRlciwgYnV0IGl0IGlzCisgICBwcm9iYWJseSBOT1Qgd2hhdCB5b3Ugd2FudCBmb3IgdGhlIGZpcnN0IHBhc3Mgb2YgcHJvZ3Jlc3NpdmUgZGlzcGxheSEpCitUaGVzZSBtZXRob2RzIG9mZmVyIHN1Y2Nlc3NpdmVseSBiZXR0ZXIgcXVhbGl0eSBhbmQgbGVzc2VyIHNwZWVkLiAgSG93ZXZlciwKK29ubHkgdGhlIGZpcnN0IG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIHF1YW50aXppbmcgaW4gbm9uLVJHQiBjb2xvciBzcGFjZXMuCisKK0lNUE9SVEFOVDogYmVjYXVzZSB0aGUgZGlmZmVyZW50IHF1YW50aXplciBtZXRob2RzIGhhdmUgdmVyeSBkaWZmZXJlbnQKK3dvcmtpbmctc3RvcmFnZSByZXF1aXJlbWVudHMsIHRoZSBsaWJyYXJ5IHJlcXVpcmVzIHlvdSB0byBpbmRpY2F0ZSB3aGljaAorb25lKHMpIHlvdSBpbnRlbmQgdG8gdXNlIGJlZm9yZSB5b3UgY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIChJZiB3ZSBkaWQKK25vdCByZXF1aXJlIHRoaXMsIHRoZSBtYXhfbWVtb3J5X3RvX3VzZSBzZXR0aW5nIHdvdWxkIGJlIGEgY29tcGxldGUgZmljdGlvbi4pCitZb3UgZG8gdGhpcyBieSBzZXR0aW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHRocmVlIGNpbmZvIGZpZWxkcyB0byBUUlVFOgorCWVuYWJsZV8xcGFzc19xdWFudAkJRml4ZWQgY29sb3IgY3ViZSBjb2xvcm1hcAorCWVuYWJsZV9leHRlcm5hbF9xdWFudAkJRXh0ZXJuYWxseS1zdXBwbGllZCBjb2xvcm1hcAorCWVuYWJsZV8ycGFzc19xdWFudAkJVHdvLXBhc3MgY3VzdG9tIGNvbG9ybWFwCitBbGwgdGhyZWUgYXJlIGluaXRpYWxpemVkIEZBTFNFIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gIEJ1dAoranBlZ19zdGFydF9kZWNvbXByZXNzKCkgYXV0b21hdGljYWxseSBzZXRzIFRSVUUgdGhlIG9uZSBzZWxlY3RlZCBieSB0aGUKK2N1cnJlbnQgdHdvX3Bhc3NfcXVhbnRpemUgYW5kIGNvbG9ybWFwIHNldHRpbmdzLCBzbyB5b3Ugb25seSBuZWVkIHRvIHNldCB0aGUKK2VuYWJsZSBmbGFncyBmb3IgYW55IG90aGVyIHF1YW50aXphdGlvbiBtZXRob2RzIHlvdSBwbGFuIHRvIGNoYW5nZSB0byBsYXRlci4KKworQWZ0ZXIgc2V0dGluZyB0aGUgZW5hYmxlIGZsYWdzIGNvcnJlY3RseSBhdCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB0aW1lLCB5b3UKK2NhbiBjaGFuZ2UgdG8gYW55IGVuYWJsZWQgcXVhbnRpemF0aW9uIG1ldGhvZCBieSBzZXR0aW5nIHR3b19wYXNzX3F1YW50aXplCithbmQgY29sb3JtYXAgcHJvcGVybHkganVzdCBiZWZvcmUgY2FsbGluZyBqcGVnX3N0YXJ0X291dHB1dCgpLiAgVGhlIGZvbGxvd2luZworc3BlY2lhbCBydWxlcyBhcHBseToKKzEuIFlvdSBtdXN0IGV4cGxpY2l0bHkgc2V0IGNpbmZvLmNvbG9ybWFwIHRvIE5VTEwgd2hlbiBzd2l0Y2hpbmcgdG8gMS1wYXNzCisgICBvciAyLXBhc3MgbW9kZSBmcm9tIGEgZGlmZmVyZW50IG1vZGUsIG9yIHdoZW4geW91IHdhbnQgdGhlIDItcGFzcworICAgcXVhbnRpemVyIHRvIGJlIHJlLXJ1biB0byBnZW5lcmF0ZSBhIG5ldyBjb2xvcm1hcC4KKzIuIFRvIHN3aXRjaCB0byBhbiBleHRlcm5hbCBjb2xvcm1hcCwgb3IgdG8gY2hhbmdlIHRvIGEgZGlmZmVyZW50IGV4dGVybmFsCisgICBjb2xvcm1hcCB0aGFuIHdhcyB1c2VkIG9uIHRoZSBwcmlvciBwYXNzLCB5b3UgbXVzdCBjYWxsCisgICBqcGVnX25ld19jb2xvcm1hcCgpIGFmdGVyIHNldHRpbmcgY2luZm8uY29sb3JtYXAuCitOT1RFOiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHNhbWUgY29sb3JtYXAgYXMgd2FzIHVzZWQgaW4gdGhlIHByaW9yIHBhc3MsCit5b3Ugc2hvdWxkIG5vdCBkbyBlaXRoZXIgb2YgdGhlc2UgdGhpbmdzLiAgVGhpcyB3aWxsIHNhdmUgc29tZSBub250cml2aWFsCitzd2l0Y2hvdmVyIGNvc3RzLgorKFRoZXNlIHJlcXVpcmVtZW50cyBleGlzdCBiZWNhdXNlIGNpbmZvLmNvbG9ybWFwIHdpbGwgYWx3YXlzIGJlIG5vbi1OVUxMCithZnRlciBjb21wbGV0aW5nIGEgcHJpb3Igb3V0cHV0IHBhc3MsIHNpbmNlIGJvdGggdGhlIDEtcGFzcyBhbmQgMi1wYXNzCitxdWFudGl6ZXJzIHNldCBpdCB0byBwb2ludCB0byB0aGVpciBvdXRwdXQgY29sb3JtYXBzLiAgVGh1cyB5b3UgaGF2ZSB0bworZG8gb25lIG9mIHRoZXNlIHR3byB0aGluZ3MgdG8gbm90aWZ5IHRoZSBsaWJyYXJ5IHRoYXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLgorWXVwLCBpdCdzIGEgYml0IGtsdWd5LCBidXQgaXQncyBuZWNlc3NhcnkgdG8gZG8gaXQgdGhpcyB3YXkgZm9yIGJhY2t3YXJkcworY29tcGF0aWJpbGl0eS4pCisKK05vdGUgdGhhdCBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGUgbGlicmFyeSBnZW5lcmF0ZXMgYW55IHJlcXVlc3RlZCBjb2xvcm1hcAorZHVyaW5nIGpwZWdfc3RhcnRfb3V0cHV0KCksIG5vdCBkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisKK1doZW4gdXNpbmcgdHdvLXBhc3MgcXVhbnRpemF0aW9uLCBqcGVnX3N0YXJ0X291dHB1dCgpIG1ha2VzIGEgcGFzcyBvdmVyIHRoZQorYnVmZmVyZWQgaW1hZ2UgdG8gZGV0ZXJtaW5lIHRoZSBvcHRpbXVtIGNvbG9yIG1hcDsgaXQgdGhlcmVmb3JlIG1heSB0YWtlIGEKK3NpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lLCB3aGVyZWFzIG9yZGluYXJpbHkgaXQgZG9lcyBsaXR0bGUgd29yay4gIFRoZQorcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlzIGNhbGxlZCBkdXJpbmcgdGhpcyBwYXNzLCBpZiBkZWZpbmVkLiAgSXQgaXMgYWxzbworaW1wb3J0YW50IHRvIHJlYWxpemUgdGhhdCBpZiB0aGUgc3BlY2lmaWVkIHRhcmdldCBzY2FuIG51bWJlciBpcyBncmVhdGVyIHRoYW4KK29yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyLCBqcGVnX3N0YXJ0X291dHB1dCgpIHdpbGwgYXR0ZW1wdAordG8gY29uc3VtZSBpbnB1dCBhcyBpdCBtYWtlcyB0aGlzIHBhc3MuICBJZiB5b3UgdXNlIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSwKK3lvdSBuZWVkIHRvIGNoZWNrIGZvciBhIEZBTFNFIHJldHVybiBmcm9tIGpwZWdfc3RhcnRfb3V0cHV0KCkgdW5kZXIgdGhlc2UKK2NvbmRpdGlvbnMuICBUaGUgY29tYmluYXRpb24gb2YgMi1wYXNzIHF1YW50aXphdGlvbiBhbmQgYSBub3QteWV0LWZ1bGx5LXJlYWQKK3RhcmdldCBzY2FuIGlzIHRoZSBvbmx5IGNhc2UgaW4gd2hpY2gganBlZ19zdGFydF9vdXRwdXQoKSB3aWxsIGNvbnN1bWUgaW5wdXQuCisKKworQXBwbGljYXRpb24gYXV0aG9ycyB3aG8gc3VwcG9ydCBidWZmZXJlZC1pbWFnZSBtb2RlIG1heSBiZSB0ZW1wdGVkIHRvIHVzZSBpdAorZm9yIGFsbCBKUEVHIGltYWdlcywgZXZlbiBzaW5nbGUtc2NhbiBvbmVzLiAgVGhpcyB3aWxsIHdvcmssIGJ1dCBpdCBpcworaW5lZmZpY2llbnQ6IHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGFuIGltYWdlLXNpemVkIGNvZWZmaWNpZW50IGJ1ZmZlciBmb3IKK3NpbmdsZS1zY2FuIGltYWdlcy4gIFJlcXVlc3RpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZSBmb3Igc3VjaCBhbiBpbWFnZSB3YXN0ZXMKK21lbW9yeS4gIFdvcnNlLCBpdCBjYW4gY29zdCB0aW1lIG9uIGxhcmdlIGltYWdlcywgc2luY2UgdGhlIGJ1ZmZlcmVkIGRhdGEgaGFzCit0byBiZSBzd2FwcGVkIG91dCBvciB3cml0dGVuIHRvIGEgdGVtcG9yYXJ5IGZpbGUuICBJZiB5b3UgYXJlIGNvbmNlcm5lZCBhYm91dAorbWF4aW11bSBwZXJmb3JtYW5jZSBvbiBiYXNlbGluZSBKUEVHIGZpbGVzLCB5b3Ugc2hvdWxkIHVzZSBidWZmZXJlZC1pbWFnZQorbW9kZSBvbmx5IHdoZW4gdGhlIGluY29taW5nIGZpbGUgYWN0dWFsbHkgaGFzIG11bHRpcGxlIHNjYW5zLiAgVGhpcyBjYW4gYmUKK3Rlc3RlZCBieSBjYWxsaW5nIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zKCksIHdoaWNoIHdpbGwgcmV0dXJuIGEgY29ycmVjdAorcmVzdWx0IGF0IGFueSB0aW1lIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIoKSBjb21wbGV0ZXMuCisKK0l0IGlzIGFsc28gd29ydGggbm90aW5nIHRoYXQgd2hlbiB5b3UgdXNlIGpwZWdfY29uc3VtZV9pbnB1dCgpIHRvIGxldCBpbnB1dAorcHJvY2Vzc2luZyBnZXQgYWhlYWQgb2Ygb3V0cHV0IHByb2Nlc3NpbmcsIHRoZSByZXN1bHRpbmcgcGF0dGVybiBvZiBhY2Nlc3MgdG8KK3RoZSBjb2VmZmljaWVudCBidWZmZXIgaXMgcXVpdGUgbm9uc2VxdWVudGlhbC4gIEl0J3MgYmVzdCB0byB1c2UgdGhlIG1lbW9yeQorbWFuYWdlciBqbWVtbm9icy5jIGlmIHlvdSBjYW4gKGllLCBpZiB5b3UgaGF2ZSBlbm91Z2ggcmVhbCBvciB2aXJ0dWFsIG1haW4KK21lbW9yeSkuICBJZiBub3QsIGF0IGxlYXN0IG1ha2Ugc3VyZSB0aGF0IG1heF9tZW1vcnlfdG9fdXNlIGlzIHNldCBhcyBoaWdoIGFzCitwb3NzaWJsZS4gIElmIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyIGhhcyB0byB1c2UgYSB0ZW1wb3JhcnkgZmlsZSwgeW91IHdpbGwKK3Byb2JhYmx5IHNlZSBhIGxvdCBvZiBkaXNrIHRyYWZmaWMgYW5kIHBvb3IgcGVyZm9ybWFuY2UuICAoVGhpcyBjb3VsZCBiZQoraW1wcm92ZWQgd2l0aCBhZGRpdGlvbmFsIHdvcmsgb24gdGhlIG1lbW9yeSBtYW5hZ2VyLCBidXQgd2UgaGF2ZW4ndCBnb3R0ZW4KK2Fyb3VuZCB0byBpdCB5ZXQuKQorCitJbiBzb21lIGFwcGxpY2F0aW9ucyBpdCBtYXkgYmUgY29udmVuaWVudCB0byB1c2UganBlZ19jb25zdW1lX2lucHV0KCkgZm9yIGFsbAoraW5wdXQgcHJvY2Vzc2luZywgaW5jbHVkaW5nIHJlYWRpbmcgdGhlIGluaXRpYWwgbWFya2VyczsgdGhhdCBpcywgeW91IG1heQord2lzaCB0byBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpIGluc3RlYWQgb2YganBlZ19yZWFkX2hlYWRlcigpIGR1cmluZworc3RhcnR1cC4gIFRoaXMgd29ya3MsIGJ1dCBub3RlIHRoYXQgeW91IG11c3QgY2hlY2sgZm9yIEpQRUdfUkVBQ0hFRF9TT1MgYW5kCitKUEVHX1JFQUNIRURfRU9JIHJldHVybiBjb2RlcyBhcyB0aGUgZXF1aXZhbGVudCBvZiBqcGVnX3JlYWRfaGVhZGVyJ3MgY29kZXMuCitPbmNlIHRoZSBmaXJzdCBTT1MgbWFya2VyIGhhcyBiZWVuIHJlYWNoZWQsIHlvdSBtdXN0IGNhbGwKK2pwZWdfc3RhcnRfZGVjb21wcmVzcygpIGJlZm9yZSBqcGVnX2NvbnN1bWVfaW5wdXQoKSB3aWxsIGNvbnN1bWUgbW9yZSBpbnB1dDsKK2l0J2xsIGp1c3Qga2VlcCByZXR1cm5pbmcgSlBFR19SRUFDSEVEX1NPUyB1bnRpbCB5b3UgZG8uICBJZiB5b3UgcmVhZCBhCit0YWJsZXMtb25seSBmaWxlIHRoaXMgd2F5LCBqcGVnX2NvbnN1bWVfaW5wdXQoKSB3aWxsIHJldHVybiBKUEVHX1JFQUNIRURfRU9JCit3aXRob3V0IGV2ZXIgcmV0dXJuaW5nIEpQRUdfUkVBQ0hFRF9TT1M7IGJlIHN1cmUgdG8gY2hlY2sgZm9yIHRoaXMgY2FzZS4KK0lmIHRoaXMgaGFwcGVucywgdGhlIGRlY29tcHJlc3NvciB3aWxsIG5vdCByZWFkIGFueSBtb3JlIGlucHV0IHVudGlsIHlvdSBjYWxsCitqcGVnX2Fib3J0KCkgdG8gcmVzZXQgaXQuICBJdCBpcyBPSyB0byBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpIGV2ZW4gd2hlbiBub3QKK3VzaW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIGJ1dCBpbiB0aGF0IGNhc2UgaXQncyBiYXNpY2FsbHkgYSBuby1vcCBhZnRlciB0aGUKK2luaXRpYWwgbWFya2VycyBoYXZlIGJlZW4gcmVhZDogaXQgd2lsbCBqdXN0IHJldHVybiBKUEVHX1NVU1BFTkRFRC4KKworCitBYmJyZXZpYXRlZCBkYXRhc3RyZWFtcyBhbmQgbXVsdGlwbGUgaW1hZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgSlBFRyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9iamVjdCBjYW4gYmUgcmV1c2VkIHRvIHByb2Nlc3MgbXVsdGlwbGUKK2ltYWdlcy4gIFRoaXMgc2F2ZXMgYSBzbWFsbCBhbW91bnQgb2YgdGltZSBwZXIgaW1hZ2UgYnkgZWxpbWluYXRpbmcgdGhlCisiY3JlYXRlIiBhbmQgImRlc3Ryb3kiIG9wZXJhdGlvbnMsIGJ1dCB0aGF0IGlzbid0IHRoZSByZWFsIHB1cnBvc2Ugb2YgdGhlCitmZWF0dXJlLiAgUmF0aGVyLCByZXVzZSBvZiBhbiBvYmplY3QgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYWJicmV2aWF0ZWQgSlBFRworZGF0YXN0cmVhbXMuICBPYmplY3QgcmV1c2UgY2FuIGFsc28gc2ltcGxpZnkgcHJvY2Vzc2luZyBhIHNlcmllcyBvZiBpbWFnZXMgaW4KK2Egc2luZ2xlIGlucHV0IG9yIG91dHB1dCBmaWxlLiAgVGhpcyBzZWN0aW9uIGV4cGxhaW5zIHRoZXNlIGZlYXR1cmVzLgorCitBIEpQRUcgZmlsZSBub3JtYWxseSBjb250YWlucyBzZXZlcmFsIGh1bmRyZWQgYnl0ZXMgd29ydGggb2YgcXVhbnRpemF0aW9uCithbmQgSHVmZm1hbiB0YWJsZXMuICBJbiBhIHNpdHVhdGlvbiB3aGVyZSBtYW55IGltYWdlcyB3aWxsIGJlIHN0b3JlZCBvcgordHJhbnNtaXR0ZWQgd2l0aCBpZGVudGljYWwgdGFibGVzLCB0aGlzIG1heSByZXByZXNlbnQgYW4gYW5ub3lpbmcgb3ZlcmhlYWQuCitUaGUgSlBFRyBzdGFuZGFyZCB0aGVyZWZvcmUgcGVybWl0cyB0YWJsZXMgdG8gYmUgb21pdHRlZC4gIFRoZSBzdGFuZGFyZAorZGVmaW5lcyB0aHJlZSBjbGFzc2VzIG9mIEpQRUcgZGF0YXN0cmVhbXM6CisgICogIkludGVyY2hhbmdlIiBkYXRhc3RyZWFtcyBjb250YWluIGFuIGltYWdlIGFuZCBhbGwgdGFibGVzIG5lZWRlZCB0byBkZWNvZGUKKyAgICAgdGhlIGltYWdlLiAgVGhlc2UgYXJlIHRoZSB1c3VhbCBraW5kIG9mIEpQRUcgZmlsZS4KKyAgKiAiQWJicmV2aWF0ZWQgaW1hZ2UiIGRhdGFzdHJlYW1zIGNvbnRhaW4gYW4gaW1hZ2UsIGJ1dCBhcmUgbWlzc2luZyBzb21lIG9yCisgICAgYWxsIG9mIHRoZSB0YWJsZXMgbmVlZGVkIHRvIGRlY29kZSB0aGF0IGltYWdlLgorICAqICJBYmJyZXZpYXRlZCB0YWJsZSBzcGVjaWZpY2F0aW9uIiAoaGVuY2Vmb3J0aCAidGFibGVzLW9ubHkiKSBkYXRhc3RyZWFtcworICAgIGNvbnRhaW4gb25seSB0YWJsZSBzcGVjaWZpY2F0aW9ucy4KK1RvIGRlY29kZSBhbiBhYmJyZXZpYXRlZCBpbWFnZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvYWQgdGhlIG1pc3NpbmcgdGFibGUocykKK2ludG8gdGhlIGRlY29kZXIgYmVmb3JlaGFuZC4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSByZWFkaW5nIGEgc2VwYXJhdGUKK3RhYmxlcy1vbmx5IGZpbGUuICBBIHZhcmlhbnQgc2NoZW1lIHVzZXMgYSBzZXJpZXMgb2YgaW1hZ2VzIGluIHdoaWNoIHRoZSBmaXJzdAoraW1hZ2UgaXMgYW4gaW50ZXJjaGFuZ2UgKGNvbXBsZXRlKSBkYXRhc3RyZWFtLCB3aGlsZSBzdWJzZXF1ZW50IG9uZXMgYXJlCithYmJyZXZpYXRlZCBhbmQgcmVseSBvbiB0aGUgdGFibGVzIGxvYWRlZCBieSB0aGUgZmlyc3QgaW1hZ2UuICBJdCBpcyBhc3N1bWVkCit0aGF0IG9uY2UgdGhlIGRlY29kZXIgaGFzIHJlYWQgYSB0YWJsZSwgaXQgd2lsbCByZW1lbWJlciB0aGF0IHRhYmxlIHVudGlsIGEKK25ldyBkZWZpbml0aW9uIGZvciB0aGUgc2FtZSB0YWJsZSBudW1iZXIgaXMgZW5jb3VudGVyZWQuCisKK0l0IGlzIHRoZSBhcHBsaWNhdGlvbiBkZXNpZ25lcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFzc29jaWF0ZQordGhlIGNvcnJlY3QgdGFibGVzIHdpdGggYW4gYWJicmV2aWF0ZWQgaW1hZ2UuICBXaGlsZSBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtcworY2FuIGJlIHVzZWZ1bCBpbiBhIGNsb3NlZCBlbnZpcm9ubWVudCwgdGhlaXIgdXNlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkIGluCithbnkgc2l0dWF0aW9uIHdoZXJlIGRhdGEgZXhjaGFuZ2Ugd2l0aCBvdGhlciBhcHBsaWNhdGlvbnMgbWlnaHQgYmUgbmVlZGVkLgorQ2F2ZWF0IGRlc2lnbmVyLgorCitUaGUgSlBFRyBsaWJyYXJ5IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgYW55IGNvbWJpbmF0aW9uIG9mCit0YWJsZXMtb25seSBkYXRhc3RyZWFtcyBhbmQgYWJicmV2aWF0ZWQgaW1hZ2VzLiAgSW4gYm90aCBjb21wcmVzc2lvbiBhbmQKK2RlY29tcHJlc3Npb24gb2JqZWN0cywgYSBxdWFudGl6YXRpb24gb3IgSHVmZm1hbiB0YWJsZSB3aWxsIGJlIHJldGFpbmVkIGZvcgordGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QsIHVubGVzcyBpdCBpcyBvdmVyd3JpdHRlbiBieSBhIG5ldyB0YWJsZSBkZWZpbml0aW9uLgorCisKK1RvIGNyZWF0ZSBhYmJyZXZpYXRlZCBpbWFnZSBkYXRhc3RyZWFtcywgaXQgaXMgb25seSBuZWNlc3NhcnkgdG8gdGVsbCB0aGUKK2NvbXByZXNzb3Igbm90IHRvIGVtaXQgc29tZSBvciBhbGwgb2YgdGhlIHRhYmxlcyBpdCBpcyB1c2luZy4gIEVhY2gKK3F1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZSBzdHJ1Y3QgY29udGFpbnMgYSBib29sZWFuIGZpZWxkICJzZW50X3RhYmxlIiwKK3doaWNoIG5vcm1hbGx5IGlzIGluaXRpYWxpemVkIHRvIEZBTFNFLiAgRm9yIGVhY2ggdGFibGUgdXNlZCBieSB0aGUgaW1hZ2UsIHRoZQoraGVhZGVyLXdyaXRpbmcgcHJvY2VzcyBlbWl0cyB0aGUgdGFibGUgYW5kIHNldHMgc2VudF90YWJsZSA9IFRSVUUgdW5sZXNzIGl0IGlzCithbHJlYWR5IFRSVUUuICAoSW4gbm9ybWFsIHVzYWdlLCB0aGlzIHByZXZlbnRzIG91dHB1dHRpbmcgdGhlIHNhbWUgdGFibGUKK2RlZmluaXRpb24gbXVsdGlwbGUgdGltZXMsIGFzIHdvdWxkIG90aGVyd2lzZSBvY2N1ciBiZWNhdXNlIHRoZSBjaHJvbWEKK2NvbXBvbmVudHMgdHlwaWNhbGx5IHNoYXJlIHRhYmxlcy4pICBUaHVzLCBzZXR0aW5nIHRoaXMgZmllbGQgdG8gVFJVRSBiZWZvcmUKK2NhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpIHdpbGwgcHJldmVudCB0aGUgdGFibGUgZnJvbSBiZWluZyB3cml0dGVuIGF0CithbGwuCisKK0lmIHlvdSB3YW50IHRvIGNyZWF0ZSBhICJwdXJlIiBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlIGNvbnRhaW5pbmcgbm8gdGFibGVzLAoranVzdCBjYWxsICJqcGVnX3N1cHByZXNzX3RhYmxlcygmY2luZm8sIFRSVUUpIiBhZnRlciBjb25zdHJ1Y3RpbmcgYWxsIHRoZQordGFibGVzLiAgSWYgeW91IHdhbnQgdG8gZW1pdCBzb21lIGJ1dCBub3QgYWxsIHRhYmxlcywgeW91J2xsIG5lZWQgdG8gc2V0IHRoZQoraW5kaXZpZHVhbCBzZW50X3RhYmxlIGZpZWxkcyBkaXJlY3RseS4KKworVG8gY3JlYXRlIGFuIGFiYnJldmlhdGVkIGltYWdlLCB5b3UgbXVzdCBhbHNvIGNhbGwganBlZ19zdGFydF9jb21wcmVzcygpCit3aXRoIGEgc2Vjb25kIHBhcmFtZXRlciBvZiBGQUxTRSwgbm90IFRSVUUuICBPdGhlcndpc2UganBlZ19zdGFydF9jb21wcmVzcygpCit3aWxsIGZvcmNlIGFsbCB0aGUgc2VudF90YWJsZSBmaWVsZHMgdG8gRkFMU0UuICAoVGhpcyBpcyBhIHNhZmV0eSBmZWF0dXJlIHRvCitwcmV2ZW50IGFiYnJldmlhdGVkIGltYWdlcyBmcm9tIGJlaW5nIGNyZWF0ZWQgYWNjaWRlbnRhbGx5LikKKworVG8gY3JlYXRlIGEgdGFibGVzLW9ubHkgZmlsZSwgcGVyZm9ybSB0aGUgc2FtZSBwYXJhbWV0ZXIgc2V0dXAgdGhhdCB5b3UKK25vcm1hbGx5IHdvdWxkLCBidXQgaW5zdGVhZCBvZiBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQgc28gb24sIGNhbGwKK2pwZWdfd3JpdGVfdGFibGVzKCZjaW5mbykuICBUaGlzIHdpbGwgd3JpdGUgYW4gYWJicmV2aWF0ZWQgZGF0YXN0cmVhbQorY29udGFpbmluZyBvbmx5IFNPSSwgRFFUIGFuZC9vciBESFQgbWFya2VycywgYW5kIEVPSS4gIEFsbCB0aGUgcXVhbnRpemF0aW9uCithbmQgSHVmZm1hbiB0YWJsZXMgdGhhdCBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIGNvbXByZXNzaW9uIG9iamVjdCB3aWxsCitiZSBlbWl0dGVkIHVubGVzcyB0aGVpciBzZW50X3RhYmxlcyBmbGFnIGlzIGFscmVhZHkgVFJVRSwgYW5kIHRoZW4gYWxsIHRoZQorc2VudF90YWJsZXMgZmxhZ3Mgd2lsbCBiZSBzZXQgVFJVRS4KKworQSBzdXJlLWZpcmUgd2F5IHRvIGNyZWF0ZSBtYXRjaGluZyB0YWJsZXMtb25seSBhbmQgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZXMKK2lzIHRvIHByb2NlZWQgYXMgZm9sbG93czoKKworCWNyZWF0ZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAorCXNldCBKUEVHIHBhcmFtZXRlcnMKKwlzZXQgZGVzdGluYXRpb24gdG8gdGFibGVzLW9ubHkgZmlsZQorCWpwZWdfd3JpdGVfdGFibGVzKCZjaW5mbyk7CisJc2V0IGRlc3RpbmF0aW9uIHRvIGltYWdlIGZpbGUKKwlqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgRkFMU0UpOworCXdyaXRlIGRhdGEuLi4KKwlqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOworCitTaW5jZSB0aGUgSlBFRyBwYXJhbWV0ZXJzIGFyZSBub3QgYWx0ZXJlZCBiZXR3ZWVuIHdyaXRpbmcgdGhlIHRhYmxlIGZpbGUgYW5kCit0aGUgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZSwgdGhlIHNhbWUgdGFibGVzIGFyZSBzdXJlIHRvIGJlIHVzZWQuICBPZiBjb3Vyc2UsCit5b3UgY2FuIHJlcGVhdCB0aGUganBlZ19zdGFydF9jb21wcmVzcygpIC4uLiBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHNlcXVlbmNlCittYW55IHRpbWVzIHRvIHByb2R1Y2UgbWFueSBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlcyBtYXRjaGluZyB0aGUgdGFibGUgZmlsZS4KKworWW91IGNhbm5vdCBzdXBwcmVzcyBvdXRwdXQgb2YgdGhlIGNvbXB1dGVkIEh1ZmZtYW4gdGFibGVzIHdoZW4gSHVmZm1hbgorb3B0aW1pemF0aW9uIGlzIHNlbGVjdGVkLiAgKElmIHlvdSBjb3VsZCwgdGhlcmUnZCBiZSBubyB3YXkgdG8gZGVjb2RlIHRoZQoraW1hZ2UuLi4pICBHZW5lcmFsbHksIHlvdSBkb24ndCB3YW50IHRvIHNldCBvcHRpbWl6ZV9jb2RpbmcgPSBUUlVFIHdoZW4KK3lvdSBhcmUgdHJ5aW5nIHRvIHByb2R1Y2UgYWJicmV2aWF0ZWQgZmlsZXMuCisKK0luIHNvbWUgY2FzZXMgeW91IG1pZ2h0IHdhbnQgdG8gY29tcHJlc3MgYW4gaW1hZ2UgdXNpbmcgdGFibGVzIHdoaWNoIGFyZQorbm90IHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24sIGJ1dCBhcmUgZGVmaW5lZCBpbiBhbiBpbnRlcmNoYW5nZSBvcgordGFibGVzLW9ubHkgZmlsZSByZWFkYWJsZSBieSB0aGUgYXBwbGljYXRpb24uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgdXAKK2EgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCB0byByZWFkIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUsIHRoZW4gY29weWluZyB0aGUKK3RhYmxlcyBpbnRvIHlvdXIgY29tcHJlc3Npb24gb2JqZWN0LiAgU2VlIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzKCkKK2ZvciBhbiBleGFtcGxlIG9mIGNvcHlpbmcgcXVhbnRpemF0aW9uIHRhYmxlcy4KKworCitUbyByZWFkIGFiYnJldmlhdGVkIGltYWdlIGZpbGVzLCB5b3Ugc2ltcGx5IG5lZWQgdG8gbG9hZCB0aGUgcHJvcGVyIHRhYmxlcworaW50byB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgYmVmb3JlIHRyeWluZyB0byByZWFkIHRoZSBhYmJyZXZpYXRlZCBpbWFnZS4KK0lmIHRoZSBwcm9wZXIgdGFibGVzIGFyZSBzdG9yZWQgaW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0sIHlvdSBjYW4ganVzdAorYWxsb2NhdGUgdGhlIHRhYmxlIHN0cnVjdHMgYW5kIGZpbGwgaW4gdGhlaXIgY29udGVudHMgZGlyZWN0bHkuICBGb3IgZXhhbXBsZSwKK3RvIGxvYWQgYSBmaXhlZCBxdWFudGl6YXRpb24gdGFibGUgaW50byB0YWJsZSBzbG90ICJuIjoKKworICAgIGlmIChjaW5mby5xdWFudF90YmxfcHRyc1tuXSA9PSBOVUxMKQorICAgICAgY2luZm8ucXVhbnRfdGJsX3B0cnNbbl0gPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisgICAgcXVhbnRfcHRyID0gY2luZm8ucXVhbnRfdGJsX3B0cnNbbl07CS8qIHF1YW50X3B0ciBpcyBKUVVBTlRfVEJMKiAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAvKiBRdGFibGVbXSBpcyBkZXNpcmVkIHF1YW50aXphdGlvbiB0YWJsZSwgaW4gbmF0dXJhbCBhcnJheSBvcmRlciAqLworICAgICAgcXVhbnRfcHRyLT5xdWFudHZhbFtpXSA9IFF0YWJsZVtpXTsKKyAgICB9CisKK0NvZGUgdG8gbG9hZCBhIGZpeGVkIEh1ZmZtYW4gdGFibGUgaXMgdHlwaWNhbGx5IChmb3IgQUMgdGFibGUgIm4iKToKKworICAgIGlmIChjaW5mby5hY19odWZmX3RibF9wdHJzW25dID09IE5VTEwpCisgICAgICBjaW5mby5hY19odWZmX3RibF9wdHJzW25dID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisgICAgaHVmZl9wdHIgPSBjaW5mby5hY19odWZmX3RibF9wdHJzW25dOwkvKiBodWZmX3B0ciBpcyBKSFVGRl9UQkwqICovCisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKSB7CisgICAgICAvKiBjb3VudHNbaV0gaXMgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZXMgb2YgbGVuZ3RoIGkgYml0cywgaT0xLi4xNiAqLworICAgICAgaHVmZl9wdHItPmJpdHNbaV0gPSBjb3VudHNbaV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgLyogc3ltYm9sc1tdIGlzIHRoZSBsaXN0IG9mIEh1ZmZtYW4gc3ltYm9scywgaW4gY29kZS1sZW5ndGggb3JkZXIgKi8KKyAgICAgIGh1ZmZfcHRyLT5odWZmdmFsW2ldID0gc3ltYm9sc1tpXTsKKyAgICB9CisKKyhOb3RlIHRoYXQgdHJ5aW5nIHRvIHNldCBjaW5mby5xdWFudF90YmxfcHRyc1tuXSB0byBwb2ludCBkaXJlY3RseSBhdCBhCitjb25zdGFudCBKUVVBTlRfVEJMIG9iamVjdCBpcyBub3Qgc2FmZS4gIElmIHRoZSBpbmNvbWluZyBmaWxlIGhhcHBlbmVkIHRvCitjb250YWluIGEgcXVhbnRpemF0aW9uIHRhYmxlIGRlZmluaXRpb24sIHlvdXIgbWFzdGVyIHRhYmxlIHdvdWxkIGdldAorb3ZlcndyaXR0ZW4hICBJbnN0ZWFkIGFsbG9jYXRlIGEgd29ya2luZyB0YWJsZSBjb3B5IGFuZCBjb3B5IHRoZSBtYXN0ZXIgdGFibGUKK2ludG8gaXQsIGFzIGlsbHVzdHJhdGVkIGFib3ZlLiAgRGl0dG8gZm9yIEh1ZmZtYW4gdGFibGVzLCBvZiBjb3Vyc2UuKQorCitZb3UgbWlnaHQgd2FudCB0byByZWFkIHRoZSB0YWJsZXMgZnJvbSBhIHRhYmxlcy1vbmx5IGZpbGUsIHJhdGhlciB0aGFuCitoYXJkLXdpcmluZyB0aGVtIGludG8geW91ciBhcHBsaWNhdGlvbi4gIFRoZSBqcGVnX3JlYWRfaGVhZGVyKCkgY2FsbCBpcworc3VmZmljaWVudCB0byByZWFkIGEgdGFibGVzLW9ubHkgZmlsZS4gIFlvdSBtdXN0IHBhc3MgYSBzZWNvbmQgcGFyYW1ldGVyIG9mCitGQUxTRSB0byBpbmRpY2F0ZSB0aGF0IHlvdSBkbyBub3QgcmVxdWlyZSBhbiBpbWFnZSB0byBiZSBwcmVzZW50LiAgVGh1cywgdGhlCit0eXBpY2FsIHNjZW5hcmlvIGlzCisKKwljcmVhdGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAorCXNldCBzb3VyY2UgdG8gdGFibGVzLW9ubHkgZmlsZQorCWpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBGQUxTRSk7CisJc2V0IHNvdXJjZSB0byBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlCisJanBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworCXNldCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKKwlqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKTsKKwlyZWFkIGRhdGEuLi4KKwlqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZjaW5mbyk7CisKK0luIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byByZWFkIGEgZmlsZSB3aXRob3V0IGtub3dpbmcgd2hldGhlciBpdCBjb250YWlucworYW4gaW1hZ2Ugb3IganVzdCB0YWJsZXMuICBJbiB0aGF0IGNhc2UsIHBhc3MgRkFMU0UgYW5kIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKK2Zyb20ganBlZ19yZWFkX2hlYWRlcigpOiBpdCB3aWxsIGJlIEpQRUdfSEVBREVSX09LIGlmIGFuIGltYWdlIHdhcyBmb3VuZCwKK0pQRUdfSEVBREVSX1RBQkxFU19PTkxZIGlmIG9ubHkgdGFibGVzIHdlcmUgZm91bmQuICAoQSB0aGlyZCByZXR1cm4gdmFsdWUsCitKUEVHX1NVU1BFTkRFRCwgaXMgcG9zc2libGUgd2hlbiB1c2luZyBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgbWFuYWdlci4pCitOb3RlIHRoYXQganBlZ19yZWFkX2hlYWRlcigpIHdpbGwgbm90IGNvbXBsYWluIGlmIHlvdSByZWFkIGFuIGFiYnJldmlhdGVkCitpbWFnZSBmb3Igd2hpY2ggeW91IGhhdmVuJ3QgbG9hZGVkIHRoZSBtaXNzaW5nIHRhYmxlczsgdGhlIG1pc3NpbmctdGFibGUgY2hlY2sKK29jY3VycyBsYXRlciwgaW4ganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisKKworSXQgaXMgcG9zc2libGUgdG8gcmVhZCBhIHNlcmllcyBvZiBpbWFnZXMgZnJvbSBhIHNpbmdsZSBzb3VyY2UgZmlsZSBieQorcmVwZWF0aW5nIHRoZSBqcGVnX3JlYWRfaGVhZGVyKCkgLi4uIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBzZXF1ZW5jZSwKK3dpdGhvdXQgcmVsZWFzaW5nL3JlY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0IG9yIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUuCisoSWYgeW91IGRpZCByZWluaXRpYWxpemUsIGFueSBwYXJ0aWFsIGJ1ZmZlcmxvYWQgbGVmdCBpbiB0aGUgZGF0YSBzb3VyY2UKK2J1ZmZlciBhdCB0aGUgZW5kIG9mIG9uZSBpbWFnZSB3b3VsZCBiZSBkaXNjYXJkZWQsIGNhdXNpbmcgeW91IHRvIGxvc2UgdGhlCitzdGFydCBvZiB0aGUgbmV4dCBpbWFnZS4pICBXaGVuIHlvdSB1c2UgdGhpcyBtZXRob2QsIHN0b3JlZCB0YWJsZXMgYXJlCithdXRvbWF0aWNhbGx5IGNhcnJpZWQgZm9yd2FyZCwgc28gc29tZSBvZiB0aGUgaW1hZ2VzIGNhbiBiZSBhYmJyZXZpYXRlZCBpbWFnZXMKK3RoYXQgZGVwZW5kIG9uIHRhYmxlcyBmcm9tIGVhcmxpZXIgaW1hZ2VzLgorCitJZiB5b3UgaW50ZW5kIHRvIHdyaXRlIGEgc2VyaWVzIG9mIGltYWdlcyBpbnRvIGEgc2luZ2xlIGRlc3RpbmF0aW9uIGZpbGUsCit5b3UgbWlnaHQgd2FudCB0byBtYWtlIGEgc3BlY2lhbGl6ZWQgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgdGhhdCBkb2Vzbid0CitmbHVzaCB0aGUgb3V0cHV0IGJ1ZmZlciBhdCB0ZXJtX2Rlc3RpbmF0aW9uKCkgdGltZS4gIFRoaXMgd291bGQgc3BlZWQgdGhpbmdzCit1cCBieSBzb21lIHRyaWZsaW5nIGFtb3VudC4gIE9mIGNvdXJzZSwgeW91J2QgbmVlZCB0byByZW1lbWJlciB0byBmbHVzaCB0aGUKK2J1ZmZlciBhZnRlciB0aGUgbGFzdCBpbWFnZS4gIFlvdSBjYW4gbWFrZSB0aGUgbGF0ZXIgaW1hZ2VzIGJlIGFiYnJldmlhdGVkCitvbmVzIGJ5IHBhc3NpbmcgRkFMU0UgdG8ganBlZ19zdGFydF9jb21wcmVzcygpLgorCisKK1NwZWNpYWwgbWFya2VycworLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIGluc2VydCBvciBleHRyYWN0IHNwZWNpYWwgZGF0YSBpbiB0aGUgSlBFRworZGF0YXN0cmVhbS4gIFRoZSBKUEVHIHN0YW5kYXJkIHByb3ZpZGVzIG1hcmtlciB0eXBlcyAiQ09NIiAoY29tbWVudCkgYW5kCisiQVBQMCIgdGhyb3VnaCAiQVBQMTUiIChhcHBsaWNhdGlvbikgdG8gaG9sZCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkYXRhLgorVW5mb3J0dW5hdGVseSwgdGhlIHVzZSBvZiB0aGVzZSBtYXJrZXJzIGlzIG5vdCBzcGVjaWZpZWQgYnkgdGhlIHN0YW5kYXJkLgorQ09NIG1hcmtlcnMgYXJlIGZhaXJseSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dC4gIFRoZSBKRklGIGZpbGUKK2Zvcm1hdCBzcGVjIHVzZXMgQVBQMCBtYXJrZXJzIHdpdGggc3BlY2lmaWVkIGluaXRpYWwgc3RyaW5ncyB0byBob2xkIGNlcnRhaW4KK2RhdGEuICBBZG9iZSBhcHBsaWNhdGlvbnMgdXNlIEFQUDE0IG1hcmtlcnMgYmVnaW5uaW5nIHdpdGggdGhlIHN0cmluZyAiQWRvYmUiCitmb3IgbWlzY2VsbGFuZW91cyBkYXRhLiAgT3RoZXIgQVBQbiBtYXJrZXJzIGFyZSByYXJlbHkgc2VlbiwgYnV0IG1pZ2h0Citjb250YWluIGFsbW9zdCBhbnl0aGluZy4KKworSWYgeW91IHdpc2ggdG8gc3RvcmUgdXNlci1zdXBwbGllZCB0ZXh0LCB3ZSByZWNvbW1lbmQgeW91IHVzZSBDT00gbWFya2VycworYW5kIHBsYWNlIHJlYWRhYmxlIDctYml0IEFTQ0lJIHRleHQgaW4gdGhlbS4gIE5ld2xpbmUgY29udmVudGlvbnMgYXJlIG5vdAorc3RhbmRhcmRpemVkIC0tLSBleHBlY3QgdG8gZmluZCBMRiAoVW5peCBzdHlsZSksIENSL0xGIChET1Mgc3R5bGUpLCBvciBDUgorKE1hYyBzdHlsZSkuICBBIHJvYnVzdCBDT00gcmVhZGVyIHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgd2l0aCByYW5kb20gYmluYXJ5CitnYXJiYWdlLCBpbmNsdWRpbmcgbnVsbHMsIHNpbmNlIHNvbWUgYXBwbGljYXRpb25zIGdlbmVyYXRlIENPTSBtYXJrZXJzCitjb250YWluaW5nIG5vbi1BU0NJSSBqdW5rLiAgKEJ1dCB5b3VycyBzaG91bGQgbm90IGJlIG9uZSBvZiB0aGVtLikKKworRm9yIHByb2dyYW0tc3VwcGxpZWQgZGF0YSwgdXNlIGFuIEFQUG4gbWFya2VyLCBhbmQgYmUgc3VyZSB0byBiZWdpbiBpdCB3aXRoIGFuCitpZGVudGlmeWluZyBzdHJpbmcgc28gdGhhdCB5b3UgY2FuIHRlbGwgd2hldGhlciB0aGUgbWFya2VyIGlzIGFjdHVhbGx5IHlvdXJzLgorSXQncyBwcm9iYWJseSBiZXN0IHRvIGF2b2lkIHVzaW5nIEFQUDAgb3IgQVBQMTQgZm9yIGFueSBwcml2YXRlIG1hcmtlcnMuCisoTk9URTogdGhlIHVwY29taW5nIFNQSUZGIHN0YW5kYXJkIHdpbGwgdXNlIEFQUDggbWFya2Vyczsgd2UgcmVjb21tZW5kIHlvdQorbm90IHVzZSBBUFA4IG1hcmtlcnMgZm9yIGFueSBwcml2YXRlIHB1cnBvc2VzLCBlaXRoZXIuKQorCitLZWVwIGluIG1pbmQgdGhhdCBhdCBtb3N0IDY1NTMzIGJ5dGVzIGNhbiBiZSBwdXQgaW50byBvbmUgbWFya2VyLCBidXQgeW91CitjYW4gaGF2ZSBhcyBtYW55IG1hcmtlcnMgYXMgeW91IGxpa2UuCisKK0J5IGRlZmF1bHQsIHRoZSBJSkcgY29tcHJlc3Npb24gbGlicmFyeSB3aWxsIHdyaXRlIGEgSkZJRiBBUFAwIG1hcmtlciBpZiB0aGUKK3NlbGVjdGVkIEpQRUcgY29sb3JzcGFjZSBpcyBncmF5c2NhbGUgb3IgWUNiQ3IsIG9yIGFuIEFkb2JlIEFQUDE0IG1hcmtlciBpZgordGhlIHNlbGVjdGVkIGNvbG9yc3BhY2UgaXMgUkdCLCBDTVlLLCBvciBZQ0NLLiAgWW91IGNhbiBkaXNhYmxlIHRoaXMsIGJ1dAord2UgZG9uJ3QgcmVjb21tZW5kIGl0LiAgVGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSB3aWxsIHJlY29nbml6ZSBKRklGIGFuZAorQWRvYmUgbWFya2VycyBhbmQgd2lsbCBzZXQgdGhlIEpQRUcgY29sb3JzcGFjZSBwcm9wZXJseSB3aGVuIG9uZSBpcyBmb3VuZC4KKworCitZb3UgY2FuIHdyaXRlIHNwZWNpYWwgbWFya2VycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIGJ5CitjYWxsaW5nIGpwZWdfd3JpdGVfbWFya2VyKCkgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBiZWZvcmUgdGhlIGZpcnN0CitjYWxsIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBXaGVuIHlvdSBkbyB0aGlzLCB0aGUgbWFya2VycyBhcHBlYXIgYWZ0ZXIKK3RoZSBTT0kgYW5kIHRoZSBKRklGIEFQUDAgYW5kIEFkb2JlIEFQUDE0IG1hcmtlcnMgKGlmIHdyaXR0ZW4pLCBidXQgYmVmb3JlCithbGwgZWxzZS4gIFNwZWNpZnkgdGhlIG1hcmtlciB0eXBlIHBhcmFtZXRlciBhcyAiSlBFR19DT00iIGZvciBDT00gb3IKKyJKUEVHX0FQUDAgKyBuIiBmb3IgQVBQbi4gIChBY3R1YWxseSwganBlZ193cml0ZV9tYXJrZXIgd2lsbCBsZXQgeW91IHdyaXRlCithbnkgbWFya2VyIHR5cGUsIGJ1dCB3ZSBkb24ndCByZWNvbW1lbmQgd3JpdGluZyBhbnkgb3RoZXIga2luZHMgb2YgbWFya2VyLikKK0ZvciBleGFtcGxlLCB0byB3cml0ZSBhIHVzZXIgY29tbWVudCBzdHJpbmcgcG9pbnRlZCB0byBieSBjb21tZW50X3RleHQ6CisJanBlZ193cml0ZV9tYXJrZXIoY2luZm8sIEpQRUdfQ09NLCBjb21tZW50X3RleHQsIHN0cmxlbihjb21tZW50X3RleHQpKTsKKworSWYgaXQncyBub3QgY29udmVuaWVudCB0byBzdG9yZSBhbGwgdGhlIG1hcmtlciBkYXRhIGluIG1lbW9yeSBhdCBvbmNlLAoreW91IGNhbiBpbnN0ZWFkIGNhbGwganBlZ193cml0ZV9tX2hlYWRlcigpIGZvbGxvd2VkIGJ5IG11bHRpcGxlIGNhbGxzIHRvCitqcGVnX3dyaXRlX21fYnl0ZSgpLiAgSWYgeW91IGRvIGl0IHRoaXMgd2F5LCBpdCdzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8KK2NhbGwganBlZ193cml0ZV9tX2J5dGUoKSBleGFjdGx5IHRoZSBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gaW4gdGhlIGxlbmd0aAorcGFyYW1ldGVyIHRvIGpwZWdfd3JpdGVfbV9oZWFkZXIoKS4gIChUaGlzIG1ldGhvZCBsZXRzIHlvdSBlbXB0eSB0aGUKK291dHB1dCBidWZmZXIgcGFydHdheSB0aHJvdWdoIGEgbWFya2VyLCB3aGljaCBtaWdodCBiZSBpbXBvcnRhbnQgd2hlbgordXNpbmcgYSBzdXNwZW5kaW5nIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlLiAgSW4gYW55IGNhc2UsIGlmIHlvdSBhcmUgdXNpbmcKK2Egc3VzcGVuZGluZyBkZXN0aW5hdGlvbiwgeW91IHNob3VsZCBmbHVzaCBpdHMgYnVmZmVyIGFmdGVyIGluc2VydGluZworYW55IHNwZWNpYWwgbWFya2Vycy4gIFNlZSAiSS9PIHN1c3BlbnNpb24iLikKKworT3IsIGlmIHlvdSBwcmVmZXIgdG8gc3ludGhlc2l6ZSB0aGUgbWFya2VyIGJ5dGUgc2VxdWVuY2UgeW91cnNlbGYsCit5b3UgY2FuIGp1c3QgY3JhbSBpdCBzdHJhaWdodCBpbnRvIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZS4KKworSWYgeW91IGFyZSB3cml0aW5nIEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyAodGh1bWJuYWlsIGltYWdlcyksIGRvbid0Citmb3JnZXQgdG8gc2V0IGNpbmZvLkpGSUZfbWlub3JfdmVyc2lvbiA9IDIgc28gdGhhdCB0aGUgZW5jb2RlciB3aWxsIHdyaXRlIHRoZQorY29ycmVjdCBKRklGIHZlcnNpb24gbnVtYmVyIGluIHRoZSBKRklGIGhlYWRlciBtYXJrZXIuICBUaGUgbGlicmFyeSdzIGRlZmF1bHQKK2lzIHRvIHdyaXRlIHZlcnNpb24gMS4wMSwgYnV0IHRoYXQncyB3cm9uZyBpZiB5b3UgaW5zZXJ0IGFueSAxLjAyIGV4dGVuc2lvbgorbWFya2Vycy4gIChXZSBjb3VsZCBwcm9iYWJseSBnZXQgYXdheSB3aXRoIGp1c3QgZGVmYXVsdGluZyB0byAxLjAyLCBidXQgdGhlcmUKK3VzZWQgdG8gYmUgYnJva2VuIGRlY29kZXJzIHRoYXQgd291bGQgY29tcGxhaW4gYWJvdXQgdW5rbm93biBtaW5vciB2ZXJzaW9uCitudW1iZXJzLiAgVG8gcmVkdWNlIGNvbXBhdGliaWxpdHkgcmlza3MgaXQncyBzYWZlc3Qgbm90IHRvIHdyaXRlIDEuMDIgdW5sZXNzCit5b3UgYXJlIGFjdHVhbGx5IHVzaW5nIDEuMDIgZXh0ZW5zaW9ucy4pCisKKworV2hlbiByZWFkaW5nLCB0d28gbWV0aG9kcyBvZiBoYW5kbGluZyBzcGVjaWFsIG1hcmtlcnMgYXJlIGF2YWlsYWJsZToKKzEuIFlvdSBjYW4gYXNrIHRoZSBsaWJyYXJ5IHRvIHNhdmUgdGhlIGNvbnRlbnRzIG9mIENPTSBhbmQvb3IgQVBQbiBtYXJrZXJzCitpbnRvIG1lbW9yeSwgYW5kIHRoZW4gZXhhbWluZSB0aGVtIGF0IHlvdXIgbGVpc3VyZSBhZnRlcndhcmRzLgorMi4gWW91IGNhbiBzdXBwbHkgeW91ciBvd24gcm91dGluZSB0byBwcm9jZXNzIENPTSBhbmQvb3IgQVBQbiBtYXJrZXJzCitvbi10aGUtZmx5IGFzIHRoZXkgYXJlIHJlYWQuCitUaGUgZmlyc3QgbWV0aG9kIGlzIHNpbXBsZXIgdG8gdXNlLCBlc3BlY2lhbGx5IGlmIHlvdSBhcmUgdXNpbmcgYSBzdXNwZW5kaW5nCitkYXRhIHNvdXJjZTsgd3JpdGluZyBhIG1hcmtlciBwcm9jZXNzb3IgdGhhdCBjb3BlcyB3aXRoIGlucHV0IHN1c3BlbnNpb24gaXMKK25vdCBlYXN5IChjb25zaWRlciB3aGF0IGhhcHBlbnMgaWYgdGhlIG1hcmtlciBpcyBsb25nZXIgdGhhbiB5b3VyIGF2YWlsYWJsZQoraW5wdXQgYnVmZmVyKS4gIEhvd2V2ZXIsIHRoZSBzZWNvbmQgbWV0aG9kIGNvbnNlcnZlcyBtZW1vcnkgc2luY2UgdGhlIG1hcmtlcgorZGF0YSBuZWVkIG5vdCBiZSBrZXB0IGFyb3VuZCBhZnRlciBpdCdzIGJlZW4gcHJvY2Vzc2VkLgorCitGb3IgZWl0aGVyIG1ldGhvZCwgeW91J2Qgbm9ybWFsbHkgc2V0IHVwIG1hcmtlciBoYW5kbGluZyBhZnRlciBjcmVhdGluZyBhCitkZWNvbXByZXNzaW9uIG9iamVjdCBhbmQgYmVmb3JlIGNhbGxpbmcganBlZ19yZWFkX2hlYWRlcigpLCBiZWNhdXNlIHRoZQorbWFya2VycyBvZiBpbnRlcmVzdCB3aWxsIHR5cGljYWxseSBiZSBuZWFyIHRoZSBoZWFkIG9mIHRoZSBmaWxlIGFuZCBzbyB3aWxsCitiZSBzY2FubmVkIGJ5IGpwZWdfcmVhZF9oZWFkZXIuICBPbmNlIHlvdSd2ZSBlc3RhYmxpc2hlZCBhIG1hcmtlciBoYW5kbGluZworbWV0aG9kLCBpdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBsaWZlIG9mIHRoYXQgZGVjb21wcmVzc2lvbiBvYmplY3QKKyhwb3RlbnRpYWxseSBtYW55IGRhdGFzdHJlYW1zKSwgdW5sZXNzIHlvdSBjaGFuZ2UgaXQuICBNYXJrZXIgaGFuZGxpbmcgaXMKK2RldGVybWluZWQgc2VwYXJhdGVseSBmb3IgQ09NIG1hcmtlcnMgYW5kIGZvciBlYWNoIEFQUG4gbWFya2VyIGNvZGUuCisKKworVG8gc2F2ZSB0aGUgY29udGVudHMgb2Ygc3BlY2lhbCBtYXJrZXJzIGluIG1lbW9yeSwgY2FsbAorCWpwZWdfc2F2ZV9tYXJrZXJzKGNpbmZvLCBtYXJrZXJfY29kZSwgbGVuZ3RoX2xpbWl0KQord2hlcmUgbWFya2VyX2NvZGUgaXMgdGhlIG1hcmtlciB0eXBlIHRvIHNhdmUsIEpQRUdfQ09NIG9yIEpQRUdfQVBQMCtuLgorKFRvIGFycmFuZ2UgdG8gc2F2ZSBhbGwgdGhlIHNwZWNpYWwgbWFya2VyIHR5cGVzLCB5b3UgbmVlZCB0byBjYWxsIHRoaXMKK3JvdXRpbmUgMTcgdGltZXMsIGZvciBDT00gYW5kIEFQUDAtQVBQMTUuKSAgSWYgdGhlIGluY29taW5nIG1hcmtlciBpcyBsb25nZXIKK3RoYW4gbGVuZ3RoX2xpbWl0IGRhdGEgYnl0ZXMsIG9ubHkgbGVuZ3RoX2xpbWl0IGJ5dGVzIHdpbGwgYmUgc2F2ZWQ7IHRoaXMKK3BhcmFtZXRlciBhbGxvd3MgeW91IHRvIGF2b2lkIGNoZXdpbmcgdXAgbWVtb3J5IHdoZW4geW91IG9ubHkgbmVlZCB0byBzZWUgdGhlCitmaXJzdCBmZXcgYnl0ZXMgb2YgYSBwb3RlbnRpYWxseSBsYXJnZSBtYXJrZXIuICBJZiB5b3Ugd2FudCB0byBzYXZlIGFsbCB0aGUKK2RhdGEsIHNldCBsZW5ndGhfbGltaXQgdG8gMHhGRkZGOyB0aGF0IGlzIGVub3VnaCBzaW5jZSBtYXJrZXIgbGVuZ3RocyBhcmUgb25seQorMTYgYml0cy4gIEFzIGEgc3BlY2lhbCBjYXNlLCBzZXR0aW5nIGxlbmd0aF9saW1pdCB0byAwIHByZXZlbnRzIHRoYXQgbWFya2VyCit0eXBlIGZyb20gYmVpbmcgc2F2ZWQgYXQgYWxsLiAgKFRoYXQgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGZhY3QuKQorCitBZnRlciBqcGVnX3JlYWRfaGVhZGVyKCkgY29tcGxldGVzLCB5b3UgY2FuIGV4YW1pbmUgdGhlIHNwZWNpYWwgbWFya2VycyBieQorZm9sbG93aW5nIHRoZSBjaW5mby0+bWFya2VyX2xpc3QgcG9pbnRlciBjaGFpbi4gIEFsbCB0aGUgc3BlY2lhbCBtYXJrZXJzIGluCit0aGUgZmlsZSBhcHBlYXIgaW4gdGhpcyBsaXN0LCBpbiBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBmaWxlIChidXQKK29taXR0aW5nIGFueSBtYXJrZXJzIG9mIHR5cGVzIHlvdSBkaWRuJ3QgYXNrIGZvcikuICBCb3RoIHRoZSBvcmlnaW5hbCBkYXRhCitsZW5ndGggYW5kIHRoZSBzYXZlZCBkYXRhIGxlbmd0aCBhcmUgcmVjb3JkZWQgZm9yIGVhY2ggbGlzdCBlbnRyeTsgdGhlIGxhdHRlcgord2lsbCBub3QgZXhjZWVkIGxlbmd0aF9saW1pdCBmb3IgdGhlIHBhcnRpY3VsYXIgbWFya2VyIHR5cGUuICBOb3RlIHRoYXQgdGhlc2UKK2xlbmd0aHMgZXhjbHVkZSB0aGUgbWFya2VyIGxlbmd0aCB3b3JkLCB3aGVyZWFzIHRoZSBzdG9yZWQgcmVwcmVzZW50YXRpb24KK3dpdGhpbiB0aGUgSlBFRyBmaWxlIGluY2x1ZGVzIGl0LiAgKEhlbmNlIHRoZSBtYXhpbXVtIGRhdGEgbGVuZ3RoIGlzIHJlYWxseQorb25seSA2NTUzMy4pCisKK0l0IGlzIHBvc3NpYmxlIHRoYXQgYWRkaXRpb25hbCBzcGVjaWFsIG1hcmtlcnMgYXBwZWFyIGluIHRoZSBmaWxlIGJleW9uZCB0aGUKK1NPUyBtYXJrZXIgYXQgd2hpY2gganBlZ19yZWFkX2hlYWRlciBzdG9wczsgaWYgc28sIHRoZSBtYXJrZXIgbGlzdCB3aWxsIGJlCitleHRlbmRlZCBkdXJpbmcgcmVhZGluZyBvZiB0aGUgcmVzdCBvZiB0aGUgZmlsZS4gIFRoaXMgaXMgbm90IGV4cGVjdGVkIHRvIGJlCitjb21tb24sIGhvd2V2ZXIuICBJZiB5b3UgYXJlIHNob3J0IG9uIG1lbW9yeSB5b3UgbWF5IHdhbnQgdG8gcmVzZXQgdGhlIGxlbmd0aAorbGltaXQgdG8gemVybyBmb3IgYWxsIG1hcmtlciB0eXBlcyBhZnRlciBmaW5pc2hpbmcganBlZ19yZWFkX2hlYWRlciwgdG8KK2Vuc3VyZSB0aGF0IHRoZSBtYXhfbWVtb3J5X3RvX3VzZSBzZXR0aW5nIGNhbm5vdCBiZSBleGNlZWRlZCBkdWUgdG8gYWRkaXRpb24KK29mIGxhdGVyIG1hcmtlcnMuCisKK1RoZSBtYXJrZXIgbGlzdCByZW1haW5zIHN0b3JlZCB1bnRpbCB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIG9yCitqcGVnX2Fib3J0LCBhdCB3aGljaCBwb2ludCB0aGUgbWVtb3J5IGlzIGZyZWVkIGFuZCB0aGUgbGlzdCBpcyBzZXQgdG8gZW1wdHkuCisoanBlZ19kZXN0cm95IGFsc28gcmVsZWFzZXMgdGhlIHN0b3JhZ2UsIG9mIGNvdXJzZS4pCisKK05vdGUgdGhhdCB0aGUgbGlicmFyeSBpcyBpbnRlcm5hbGx5IGludGVyZXN0ZWQgaW4gQVBQMCBhbmQgQVBQMTQgbWFya2VyczsKK2lmIHlvdSB0cnkgdG8gc2V0IGEgc21hbGwgbm9uemVybyBsZW5ndGggbGltaXQgb24gdGhlc2UgdHlwZXMsIHRoZSBsaWJyYXJ5Cit3aWxsIHNpbGVudGx5IGZvcmNlIHRoZSBsZW5ndGggdXAgdG8gdGhlIG1pbmltdW0gaXQgd2FudHMuICAoQnV0IHlvdSBjYW4gc2V0CithIHplcm8gbGVuZ3RoIGxpbWl0IHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIHNhdmVkIGF0IGFsbC4pICBBbHNvLCBpbiBhCisxNi1iaXQgZW52aXJvbm1lbnQsIHRoZSBtYXhpbXVtIGxlbmd0aCBsaW1pdCBtYXkgYmUgY29uc3RyYWluZWQgdG8gbGVzcyB0aGFuCis2NTUzMyBieSBtYWxsb2MoKSBsaW1pdGF0aW9ucy4gIEl0IGlzIHRoZXJlZm9yZSBiZXN0IG5vdCB0byBhc3N1bWUgdGhhdCB0aGUKK2VmZmVjdGl2ZSBsZW5ndGggbGltaXQgaXMgZXhhY3RseSB3aGF0IHlvdSBzZXQgaXQgdG8gYmUuCisKKworSWYgeW91IHdhbnQgdG8gc3VwcGx5IHlvdXIgb3duIG1hcmtlci1yZWFkaW5nIHJvdXRpbmUsIHlvdSBkbyBpdCBieSBjYWxsaW5nCitqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKCkuICBBIG1hcmtlciBwcm9jZXNzb3Igcm91dGluZSBtdXN0IGhhdmUgdGhlCitzaWduYXR1cmUKKwlib29sZWFuIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCitBbHRob3VnaCB0aGUgbWFya2VyIGNvZGUgaXMgbm90IGV4cGxpY2l0bHkgcGFzc2VkLCB0aGUgcm91dGluZSBjYW4gZmluZCBpdAoraW4gY2luZm8tPnVucmVhZF9tYXJrZXIuICBBdCB0aGUgdGltZSBvZiBjYWxsLCB0aGUgbWFya2VyIHByb3BlciBoYXMgYmVlbgorcmVhZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUuICBUaGUgcHJvY2Vzc29yIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yCityZWFkaW5nIHRoZSBtYXJrZXIgbGVuZ3RoIHdvcmQgYW5kIHRoZSByZW1haW5pbmcgcGFyYW1ldGVyIGJ5dGVzLCBpZiBhbnkuCitSZXR1cm4gVFJVRSB0byBpbmRpY2F0ZSBzdWNjZXNzLiAgKEZBTFNFIHNob3VsZCBiZSByZXR1cm5lZCBvbmx5IGlmIHlvdSBhcmUKK3VzaW5nIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBhbmQgaXQgdGVsbHMgeW91IHRvIHN1c3BlbmQuICBTZWUgdGhlIHN0YW5kYXJkCittYXJrZXIgcHJvY2Vzc29ycyBpbiBqZG1hcmtlci5jIGZvciBhcHByb3ByaWF0ZSBjb2RpbmcgbWV0aG9kcyBpZiB5b3UgbmVlZCB0bwordXNlIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZS4pCisKK0lmIHlvdSBvdmVycmlkZSB0aGUgZGVmYXVsdCBBUFAwIG9yIEFQUDE0IHByb2Nlc3NvcnMsIGl0IGlzIHVwIHRvIHlvdSB0bworcmVjb2duaXplIEpGSUYgYW5kIEFkb2JlIG1hcmtlcnMgaWYgeW91IHdhbnQgY29sb3JzcGFjZSByZWNvZ25pdGlvbiB0byBvY2N1cgorcHJvcGVybHkuICBXZSByZWNvbW1lbmQgY29weWluZyBhbmQgZXh0ZW5kaW5nIHRoZSBkZWZhdWx0IHByb2Nlc3NvcnMgaWYgeW91Cit3YW50IHRvIGRvIHRoYXQuICAoQSBiZXR0ZXIgaWRlYSBpcyB0byBzYXZlIHRoZXNlIG1hcmtlciB0eXBlcyBmb3IgbGF0ZXIKK2V4YW1pbmF0aW9uIGJ5IGNhbGxpbmcganBlZ19zYXZlX21hcmtlcnMoKTsgdGhhdCBtZXRob2QgZG9lc24ndCBpbnRlcmZlcmUKK3dpdGggdGhlIGxpYnJhcnkncyBvd24gcHJvY2Vzc2luZyBvZiB0aGVzZSBtYXJrZXJzLikKKworanBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigpIGFuZCBqcGVnX3NhdmVfbWFya2VycygpIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKKy0tLSBpZiB5b3UgY2FsbCBvbmUgaXQgb3ZlcnJpZGVzIGFueSBwcmV2aW91cyBjYWxsIHRvIHRoZSBvdGhlciwgZm9yIHRoZQorcGFydGljdWxhciBtYXJrZXIgdHlwZSBzcGVjaWZpZWQuCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgYW4gZXh0ZXJuYWwgQ09NIHByb2Nlc3NvciBjYW4gYmUgZm91bmQgaW4gZGpwZWcuYy4KK0Fsc28sIHNlZSBqcGVndHJhbi5jIGZvciBhbiBleGFtcGxlIG9mIHVzaW5nIGpwZWdfc2F2ZV9tYXJrZXJzLgorCisKK1JhdyAoZG93bnNhbXBsZWQpIGltYWdlIGRhdGEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSBhcHBsaWNhdGlvbnMgbmVlZCB0byBzdXBwbHkgYWxyZWFkeS1kb3duc2FtcGxlZCBpbWFnZSBkYXRhIHRvIHRoZSBKUEVHCitjb21wcmVzc29yLCBvciB0byByZWNlaXZlIHJhdyBkb3duc2FtcGxlZCBkYXRhIGZyb20gdGhlIGRlY29tcHJlc3Nvci4gIFRoZQorbGlicmFyeSBzdXBwb3J0cyB0aGlzIHJlcXVpcmVtZW50IGJ5IGFsbG93aW5nIHRoZSBhcHBsaWNhdGlvbiB0byB3cml0ZSBvcgorcmVhZCByYXcgZGF0YSwgYnlwYXNzaW5nIHRoZSBub3JtYWwgcHJlcHJvY2Vzc2luZyBvciBwb3N0cHJvY2Vzc2luZyBzdGVwcy4KK1RoZSBpbnRlcmZhY2UgaXMgZGlmZmVyZW50IGZyb20gdGhlIHN0YW5kYXJkIG9uZSBhbmQgaXMgc29tZXdoYXQgaGFyZGVyIHRvCit1c2UuICBJZiB5b3VyIGludGVyZXN0IGlzIG1lcmVseSBpbiBieXBhc3NpbmcgY29sb3IgY29udmVyc2lvbiwgd2UgcmVjb21tZW5kCit0aGF0IHlvdSB1c2UgdGhlIHN0YW5kYXJkIGludGVyZmFjZSBhbmQgc2ltcGx5IHNldCBqcGVnX2NvbG9yX3NwYWNlID0KK2luX2NvbG9yX3NwYWNlIChvciBqcGVnX2NvbG9yX3NwYWNlID0gb3V0X2NvbG9yX3NwYWNlIGZvciBkZWNvbXByZXNzaW9uKS4KK1RoZSBtZWNoYW5pc20gZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiBpcyBuZWNlc3Nhcnkgb25seSB0byBzdXBwbHkgb3IKK3JlY2VpdmUgZG93bnNhbXBsZWQgaW1hZ2UgZGF0YSwgaW4gd2hpY2ggbm90IGFsbCBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUKK2RpbWVuc2lvbnMuCisKKworVG8gY29tcHJlc3MgcmF3IGRhdGEsIHlvdSBtdXN0IHN1cHBseSB0aGUgZGF0YSBpbiB0aGUgY29sb3JzcGFjZSB0byBiZSB1c2VkCitpbiB0aGUgSlBFRyBmaWxlIChwbGVhc2UgcmVhZCB0aGUgZWFybGllciBzZWN0aW9uIG9uIFNwZWNpYWwgY29sb3Igc3BhY2VzKQorYW5kIGRvd25zYW1wbGVkIHRvIHRoZSBzYW1wbGluZyBmYWN0b3JzIHNwZWNpZmllZCBpbiB0aGUgSlBFRyBwYXJhbWV0ZXJzLgorWW91IG11c3Qgc3VwcGx5IHRoZSBkYXRhIGluIHRoZSBmb3JtYXQgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBKUEVHIGxpYnJhcnksCituYW1lbHkgYSBKU0FNUElNQUdFIGFycmF5LiAgVGhpcyBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0d28tZGltZW5zaW9uYWwKK2FycmF5cywgZWFjaCBvZiB0eXBlIEpTQU1QQVJSQVkuICBFYWNoIDItRCBhcnJheSBob2xkcyB0aGUgdmFsdWVzIGZvciBvbmUKK2NvbG9yIGNvbXBvbmVudC4gIFRoaXMgc3RydWN0dXJlIGlzIG5lY2Vzc2FyeSBzaW5jZSB0aGUgY29tcG9uZW50cyBhcmUgb2YKK2RpZmZlcmVudCBzaXplcy4gIElmIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSBub3QgYSBtdWx0aXBsZSBvZiB0aGUgTUNVIHNpemUsCit5b3UgbXVzdCBhbHNvIHBhZCB0aGUgZGF0YSBjb3JyZWN0bHkgKHVzdWFsbHksIHRoaXMgaXMgZG9uZSBieSByZXBsaWNhdGluZwordGhlIGxhc3QgY29sdW1uIGFuZC9vciByb3cpLiAgVGhlIGRhdGEgbXVzdCBiZSBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiBhIERDVAorYmxvY2sgaW4gZWFjaCBjb21wb25lbnQ6IHRoYXQgaXMsIGVhY2ggZG93bnNhbXBsZWQgcm93IG11c3QgY29udGFpbiBhCittdWx0aXBsZSBvZiA4IHZhbGlkIHNhbXBsZXMsIGFuZCB0aGVyZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBzYW1wbGUgcm93cworZm9yIGVhY2ggY29tcG9uZW50LiAgKEZvciBhcHBsaWNhdGlvbnMgc3VjaCBhcyBjb252ZXJzaW9uIG9mIGRpZ2l0YWwgVFYKK2ltYWdlcywgdGhlIHN0YW5kYXJkIGltYWdlIHNpemUgaXMgdXN1YWxseSBhIG11bHRpcGxlIG9mIHRoZSBEQ1QgYmxvY2sgc2l6ZSwKK3NvIHRoYXQgbm8gcGFkZGluZyBuZWVkIGFjdHVhbGx5IGJlIGRvbmUuKQorCitUaGUgcHJvY2VkdXJlIGZvciBjb21wcmVzc2lvbiBvZiByYXcgZGF0YSBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgbm9ybWFsCitjb21wcmVzc2lvbiwgZXhjZXB0IHRoYXQgeW91IGNhbGwganBlZ193cml0ZV9yYXdfZGF0YSgpIGluIHBsYWNlIG9mCitqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgQmVmb3JlIGNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcygpLCB5b3UgbXVzdCBkbwordGhlIGZvbGxvd2luZzoKKyAgKiBTZXQgY2luZm8tPnJhd19kYXRhX2luIHRvIFRSVUUuICAoSXQgaXMgc2V0IEZBTFNFIGJ5IGpwZWdfc2V0X2RlZmF1bHRzKCkuKQorICAgIFRoaXMgbm90aWZpZXMgdGhlIGxpYnJhcnkgdGhhdCB5b3Ugd2lsbCBiZSBzdXBwbHlpbmcgcmF3IGRhdGEuCisgICogRW5zdXJlIGpwZWdfY29sb3Jfc3BhY2UgaXMgY29ycmVjdCAtLS0gYW4gZXhwbGljaXQganBlZ19zZXRfY29sb3JzcGFjZSgpCisgICAgY2FsbCBpcyBhIGdvb2QgaWRlYS4gIE5vdGUgdGhhdCBzaW5jZSBjb2xvciBjb252ZXJzaW9uIGlzIGJ5cGFzc2VkLAorICAgIGluX2NvbG9yX3NwYWNlIGlzIGlnbm9yZWQsIGV4Y2VwdCB0aGF0IGpwZWdfc2V0X2RlZmF1bHRzKCkgdXNlcyBpdCB0bworICAgIGNob29zZSB0aGUgZGVmYXVsdCBqcGVnX2NvbG9yX3NwYWNlIHNldHRpbmcuCisgICogRW5zdXJlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBjaW5mby0+Y29tcF9pbmZvW2ldLmhfc2FtcF9mYWN0b3IgYW5kCisgICAgY2luZm8tPmNvbXBfaW5mb1tpXS52X3NhbXBfZmFjdG9yLCBhcmUgY29ycmVjdC4gIFNpbmNlIHRoZXNlIGluZGljYXRlIHRoZQorICAgIGRpbWVuc2lvbnMgb2YgdGhlIGRhdGEgeW91IGFyZSBzdXBwbHlpbmcsIGl0J3Mgd2lzZSB0byBzZXQgdGhlbQorICAgIGV4cGxpY2l0bHksIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoZSBsaWJyYXJ5J3MgZGVmYXVsdHMgYXJlIHdoYXQgeW91IHdhbnQuCisKK1RvIHBhc3MgcmF3IGRhdGEgdG8gdGhlIGxpYnJhcnksIGNhbGwganBlZ193cml0ZV9yYXdfZGF0YSgpIGluIHBsYWNlIG9mCitqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgVGhlIHR3byByb3V0aW5lcyB3b3JrIHNpbWlsYXJseSBleGNlcHQgdGhhdAoranBlZ193cml0ZV9yYXdfZGF0YSB0YWtlcyBhIEpTQU1QSU1BR0UgZGF0YSBhcnJheSByYXRoZXIgdGhhbiBKU0FNUEFSUkFZLgorVGhlIHNjYW5saW5lcyBjb3VudCBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGZyb20ganBlZ193cml0ZV9yYXdfZGF0YSBpcworbWVhc3VyZWQgaW4gdGVybXMgb2YgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSBsYXJnZXN0IHZfc2FtcF9mYWN0b3IuCisKK2pwZWdfd3JpdGVfcmF3X2RhdGEoKSBwcm9jZXNzZXMgb25lIE1DVSByb3cgcGVyIGNhbGwsIHdoaWNoIGlzIHRvIHNheQordl9zYW1wX2ZhY3RvcipEQ1RTSVpFIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVGhlIHBhc3NlZCBudW1fbGluZXMKK3ZhbHVlIG11c3QgYmUgYXQgbGVhc3QgbWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSwgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbAorYmUgZXhhY3RseSB0aGF0IGFtb3VudCAob3IgcG9zc2libHkgc29tZSBtdWx0aXBsZSBvZiB0aGF0IGFtb3VudCwgaW4gZnV0dXJlCitsaWJyYXJ5IHZlcnNpb25zKS4gIFRoaXMgaXMgdHJ1ZSBldmVuIG9uIHRoZSBsYXN0IGNhbGwgYXQgdGhlIGJvdHRvbSBvZiB0aGUKK2ltYWdlOyBkb24ndCBmb3JnZXQgdG8gcGFkIHlvdXIgZGF0YSBhcyBuZWNlc3NhcnkuCisKK1RoZSByZXF1aXJlZCBkaW1lbnNpb25zIG9mIHRoZSBzdXBwbGllZCBkYXRhIGNhbiBiZSBjb21wdXRlZCBmb3IgZWFjaAorY29tcG9uZW50IGFzCisJY2luZm8tPmNvbXBfaW5mb1tpXS53aWR0aF9pbl9ibG9ja3MqRENUU0laRSAgc2FtcGxlcyBwZXIgcm93CisJY2luZm8tPmNvbXBfaW5mb1tpXS5oZWlnaHRfaW5fYmxvY2tzKkRDVFNJWkUgcm93cyBpbiBpbWFnZQorYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIGhhcyBpbml0aWFsaXplZCB0aG9zZSBmaWVsZHMuICBJZiB0aGUgdmFsaWQgZGF0YQoraXMgc21hbGxlciB0aGFuIHRoaXMsIGl0IG11c3QgYmUgcGFkZGVkIGFwcHJvcHJpYXRlbHkuICBGb3Igc29tZSBzYW1wbGluZworZmFjdG9ycyBhbmQgaW1hZ2Ugc2l6ZXMsIGFkZGl0aW9uYWwgZHVtbXkgRENUIGJsb2NrcyBhcmUgaW5zZXJ0ZWQgdG8gbWFrZQordGhlIGltYWdlIGEgbXVsdGlwbGUgb2YgdGhlIE1DVSBkaW1lbnNpb25zLiAgVGhlIGxpYnJhcnkgY3JlYXRlcyBzdWNoIGR1bW15CitibG9ja3MgaXRzZWxmOyBpdCBkb2VzIG5vdCByZWFkIHRoZW0gZnJvbSB5b3VyIHN1cHBsaWVkIGRhdGEuICBUaGVyZWZvcmUgeW91CituZWVkIG5ldmVyIHBhZCBieSBtb3JlIHRoYW4gRENUU0laRSBzYW1wbGVzLiAgQW4gZXhhbXBsZSBtYXkgaGVscCBoZXJlLgorQXNzdW1lIDJoMnYgZG93bnNhbXBsaW5nIG9mIFlDYkNyIGRhdGEsIHRoYXQgaXMKKwljaW5mby0+Y29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAyCQlmb3IgWQorCWNpbmZvLT5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDIKKwljaW5mby0+Y29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxCQlmb3IgQ2IKKwljaW5mby0+Y29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxCisJY2luZm8tPmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMQkJZm9yIENyCisJY2luZm8tPmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMQorYW5kIHN1cHBvc2UgdGhhdCB0aGUgbm9taW5hbCBpbWFnZSBkaW1lbnNpb25zIChjaW5mby0+aW1hZ2Vfd2lkdGggYW5kCitjaW5mby0+aW1hZ2VfaGVpZ2h0KSBhcmUgMTAxeDEwMSBwaXhlbHMuICBUaGVuIGpwZWdfc3RhcnRfY29tcHJlc3MoKSB3aWxsCitjb21wdXRlIGRvd25zYW1wbGVkX3dpZHRoID0gMTAxIGFuZCB3aWR0aF9pbl9ibG9ja3MgPSAxMyBmb3IgWSwKK2Rvd25zYW1wbGVkX3dpZHRoID0gNTEgYW5kIHdpZHRoX2luX2Jsb2NrcyA9IDcgZm9yIENiIGFuZCBDciAoYW5kIHRoZSBzYW1lCitmb3IgdGhlIGhlaWdodCBmaWVsZHMpLiAgWW91IG11c3QgcGFkIHRoZSBZIGRhdGEgdG8gYXQgbGVhc3QgMTMqOCA9IDEwNAorY29sdW1ucyBhbmQgcm93cywgdGhlIENiL0NyIGRhdGEgdG8gYXQgbGVhc3QgNyo4ID0gNTYgY29sdW1ucyBhbmQgcm93cy4gIFRoZQorTUNVIGhlaWdodCBpcyBtYXhfdl9zYW1wX2ZhY3RvciA9IDIgRENUIHJvd3Mgc28geW91IG11c3QgcGFzcyBhdCBsZWFzdCAxNgorc2NhbmxpbmVzIG9uIGVhY2ggY2FsbCB0byBqcGVnX3dyaXRlX3Jhd19kYXRhKCksIHdoaWNoIGlzIHRvIHNheSAxNiBhY3R1YWwKK3NhbXBsZSByb3dzIG9mIFkgYW5kIDggZWFjaCBvZiBDYiBhbmQgQ3IuICBBIHRvdGFsIG9mIDcgTUNVIHJvd3MgYXJlIG5lZWRlZCwKK3NvIHlvdSBtdXN0IHBhc3MgYSB0b3RhbCBvZiA3KjE2ID0gMTEyICJzY2FubGluZXMiLiAgVGhlIGxhc3QgRENUIGJsb2NrIHJvdworb2YgWSBkYXRhIGlzIGR1bW15LCBzbyBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHlvdSBwYXNzIGZvciBpdCBpbiB0aGUgZGF0YQorYXJyYXlzLCBidXQgdGhlIHNjYW5saW5lcyBjb3VudCBtdXN0IHRvdGFsIHVwIHRvIDExMiBzbyB0aGF0IGFsbCBvZiB0aGUgQ2IKK2FuZCBDciBkYXRhIGdldHMgcGFzc2VkLgorCitPdXRwdXQgc3VzcGVuc2lvbiBpcyBzdXBwb3J0ZWQgd2l0aCByYXctZGF0YSBjb21wcmVzc2lvbjogaWYgdGhlIGRhdGEKK2Rlc3RpbmF0aW9uIG1vZHVsZSBzdXNwZW5kcywganBlZ193cml0ZV9yYXdfZGF0YSgpIHdpbGwgcmV0dXJuIDAuCitJbiB0aGlzIGNhc2UgdGhlIHNhbWUgZGF0YSByb3dzIG11c3QgYmUgcGFzc2VkIGFnYWluIG9uIHRoZSBuZXh0IGNhbGwuCisKKworRGVjb21wcmVzc2lvbiB3aXRoIHJhdyBkYXRhIG91dHB1dCBpbXBsaWVzIGJ5cGFzc2luZyBhbGwgcG9zdHByb2Nlc3Npbmc6Cit5b3UgY2Fubm90IGFzayBmb3IgcmVzY2FsaW5nIG9yIGNvbG9yIHF1YW50aXphdGlvbiwgZm9yIGluc3RhbmNlLiAgTW9yZQorc2VyaW91c2x5LCB5b3UgbXVzdCBkZWFsIHdpdGggdGhlIGNvbG9yIHNwYWNlIGFuZCBzYW1wbGluZyBmYWN0b3JzIHByZXNlbnQgaW4KK3RoZSBpbmNvbWluZyBmaWxlLiAgSWYgeW91ciBhcHBsaWNhdGlvbiBvbmx5IGhhbmRsZXMsIHNheSwgMmgxdiBZQ2JDciBkYXRhLAoreW91IG11c3QgY2hlY2sgZm9yIGFuZCBmYWlsIG9uIG90aGVyIGNvbG9yIHNwYWNlcyBvciBvdGhlciBzYW1wbGluZyBmYWN0b3JzLgorVGhlIGxpYnJhcnkgd2lsbCBub3QgY29udmVydCB0byBhIGRpZmZlcmVudCBjb2xvciBzcGFjZSBmb3IgeW91LgorCitUbyBvYnRhaW4gcmF3IGRhdGEgb3V0cHV0LCBzZXQgY2luZm8tPnJhd19kYXRhX291dCA9IFRSVUUgYmVmb3JlCitqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSAoaXQgaXMgc2V0IEZBTFNFIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKSkuICBCZSBzdXJlIHRvCit2ZXJpZnkgdGhhdCB0aGUgY29sb3Igc3BhY2UgYW5kIHNhbXBsaW5nIGZhY3RvcnMgYXJlIG9uZXMgeW91IGNhbiBoYW5kbGUuCitUaGVuIGNhbGwganBlZ19yZWFkX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YganBlZ19yZWFkX3NjYW5saW5lcygpLiAgVGhlCitkZWNvbXByZXNzaW9uIHByb2Nlc3MgaXMgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIHVzdWFsLgorCitqcGVnX3JlYWRfcmF3X2RhdGEoKSByZXR1cm5zIG9uZSBNQ1Ugcm93IHBlciBjYWxsLCBhbmQgdGh1cyB5b3UgbXVzdCBwYXNzIGEKK2J1ZmZlciBvZiBhdCBsZWFzdCBtYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFIHNjYW5saW5lcyAoc2NhbmxpbmUgY291bnRpbmcgaXMKK3RoZSBzYW1lIGFzIGZvciByYXctZGF0YSBjb21wcmVzc2lvbikuICBUaGUgYnVmZmVyIHlvdSBwYXNzIG11c3QgYmUgbGFyZ2UKK2Vub3VnaCB0byBob2xkIHRoZSBhY3R1YWwgZGF0YSBwbHVzIHBhZGRpbmcgdG8gRENULWJsb2NrIGJvdW5kYXJpZXMuICBBcyB3aXRoCitjb21wcmVzc2lvbiwgYW55IGVudGlyZWx5IGR1bW15IERDVCBibG9ja3MgYXJlIG5vdCBwcm9jZXNzZWQgc28geW91IG5lZWQgbm90CithbGxvY2F0ZSBzcGFjZSBmb3IgdGhlbSwgYnV0IHRoZSB0b3RhbCBzY2FubGluZSBjb3VudCBpbmNsdWRlcyB0aGVtLiAgVGhlCithYm92ZSBleGFtcGxlIG9mIGNvbXB1dGluZyBidWZmZXIgZGltZW5zaW9ucyBmb3IgcmF3LWRhdGEgY29tcHJlc3Npb24gaXMKK2VxdWFsbHkgdmFsaWQgZm9yIGRlY29tcHJlc3Npb24uCisKK0lucHV0IHN1c3BlbnNpb24gaXMgc3VwcG9ydGVkIHdpdGggcmF3LWRhdGEgZGVjb21wcmVzc2lvbjogaWYgdGhlIGRhdGEgc291cmNlCittb2R1bGUgc3VzcGVuZHMsIGpwZWdfcmVhZF9yYXdfZGF0YSgpIHdpbGwgcmV0dXJuIDAuICBZb3UgY2FuIGFsc28gdXNlCitidWZmZXJlZC1pbWFnZSBtb2RlIHRvIHJlYWQgcmF3IGRhdGEgaW4gbXVsdGlwbGUgcGFzc2VzLgorCisKK1JlYWxseSByYXcgZGF0YTogRENUIGNvZWZmaWNpZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIHBvc3NpYmxlIHRvIHJlYWQgb3Igd3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgSlBFRyBmaWxlIGFzIHJhdyBEQ1QKK2NvZWZmaWNpZW50cy4gIFRoaXMgZmFjaWxpdHkgaXMgbWFpbmx5IGludGVuZGVkIGZvciB1c2UgaW4gbG9zc2xlc3MKK3RyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXRzLiAgT3RoZXIgcG9zc2libGUgYXBwbGljYXRpb25zCitpbmNsdWRlIGxvc3NsZXNzIGNyb3BwaW5nIG9mIGEgSlBFRyBpbWFnZSwgbG9zc2xlc3MgcmVhc3NlbWJseSBvZiBhCittdWx0aS1zdHJpcCBvciBtdWx0aS10aWxlIFRJRkYvSlBFRyBmaWxlIGludG8gYSBzaW5nbGUgSlBFRyBkYXRhc3RyZWFtLCBldGMuCisKK1RvIHJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgSlBFRyBmaWxlIGFzIERDVCBjb2VmZmljaWVudHMsIG9wZW4gdGhlIGZpbGUgYW5kIGRvCitqcGVnX3JlYWRfaGVhZGVyKCkgYXMgdXN1YWwuICBCdXQgaW5zdGVhZCBvZiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpCithbmQganBlZ19yZWFkX3NjYW5saW5lcygpLCBjYWxsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKS4gIFRoaXMgd2lsbCByZWFkIHRoZQorZW50aXJlIGltYWdlIGludG8gYSBzZXQgb2YgdmlydHVhbCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMsIG9uZSBhcnJheSBwZXIKK2NvbXBvbmVudC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZpcnR1YWwtYXJyYXkKK2Rlc2NyaXB0b3JzLiAgRWFjaCB2aXJ0dWFsIGFycmF5IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB1c2luZyB0aGUgSlBFRworbWVtb3J5IG1hbmFnZXIncyBhY2Nlc3NfdmlydF9iYXJyYXkgbWV0aG9kIChzZWUgTWVtb3J5IG1hbmFnZW1lbnQsIGJlbG93LAorYW5kIGFsc28gcmVhZCBzdHJ1Y3R1cmUuZG9jJ3MgZGlzY3Vzc2lvbiBvZiB2aXJ0dWFsIGFycmF5IGhhbmRsaW5nKS4gIE9yLAorZm9yIHNpbXBsZSB0cmFuc2NvZGluZyB0byBhIGRpZmZlcmVudCBKUEVHIGZpbGUgZm9ybWF0LCB0aGUgYXJyYXkgbGlzdCBjYW4KK2p1c3QgYmUgaGFuZGVkIGRpcmVjdGx5IHRvIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCisKK0VhY2ggYmxvY2sgaW4gdGhlIGJsb2NrIGFycmF5cyBjb250YWlucyBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWVzIGluCitub3JtYWwgYXJyYXkgb3JkZXIgKG5vdCBKUEVHIHppZ3phZyBvcmRlcikuICBUaGUgYmxvY2sgYXJyYXlzIGNvbnRhaW4gb25seQorRENUIGJsb2NrcyBjb250YWluaW5nIHJlYWwgZGF0YTsgYW55IGVudGlyZWx5LWR1bW15IGJsb2NrcyBhZGRlZCB0byBmaWxsIG91dAoraW50ZXJsZWF2ZWQgTUNVcyBhdCB0aGUgcmlnaHQgb3IgYm90dG9tIGVkZ2VzIG9mIHRoZSBpbWFnZSBhcmUgZGlzY2FyZGVkCitkdXJpbmcgcmVhZGluZyBhbmQgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIGJsb2NrIGFycmF5cy4gIChUaGUgc2l6ZSBvZiBlYWNoCitibG9jayBhcnJheSBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSB3aWR0aF9pbl9ibG9ja3MgYW5kIGhlaWdodF9pbl9ibG9ja3MKK2ZpZWxkcyBvZiB0aGUgY29tcG9uZW50J3MgY29tcF9pbmZvIGVudHJ5LikgIFRoaXMgaXMgYWxzbyB0aGUgZGF0YSBmb3JtYXQKK2V4cGVjdGVkIGJ5IGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCisKK1doZW4geW91IGFyZSBkb25lIHVzaW5nIHRoZSB2aXJ0dWFsIGFycmF5cywgY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkKK3RvIHJlbGVhc2UgdGhlIGFycmF5IHN0b3JhZ2UgYW5kIHJldHVybiB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgdG8gYW4gaWRsZQorc3RhdGU7IG9yIGp1c3QgY2FsbCBqcGVnX2Rlc3Ryb3koKSBpZiB5b3UgZG9uJ3QgbmVlZCB0byByZXVzZSB0aGUgb2JqZWN0LgorCitJZiB5b3UgdXNlIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpIHdpbGwgcmV0dXJuCitOVUxMIGlmIGl0IGlzIGZvcmNlZCB0byBzdXNwZW5kOyBhIG5vbi1OVUxMIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgc3VjY2Vzc2Z1bAorY29tcGxldGlvbi4gIFlvdSBuZWVkIG5vdCB0ZXN0IGZvciBhIE5VTEwgcmV0dXJuIHZhbHVlIHdoZW4gdXNpbmcgYQorbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gY2FsbCBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCkgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUKK2RlY29kZXIncyBjb2VmZmljaWVudCBhcnJheXMgZHVyaW5nIGEgbm9ybWFsIGRlY29kZSBjeWNsZSBpbiBidWZmZXJlZC1pbWFnZQorbW9kZS4gIFRoaXMgZnJhbW1pc2ggbWlnaHQgYmUgdXNlZnVsIGZvciBwcm9ncmVzc2l2ZWx5IGRpc3BsYXlpbmcgYW4gaW5jb21pbmcKK2ltYWdlIGFuZCB0aGVuIHJlLWVuY29kaW5nIGl0IHdpdGhvdXQgbG9zcy4gIFRvIGRvIHRoaXMsIGRlY29kZSBpbiBidWZmZXJlZC0KK2ltYWdlIG1vZGUgYXMgZGlzY3Vzc2VkIHByZXZpb3VzbHksIHRoZW4gY2FsbCBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCkgYWZ0ZXIKK3RoZSBsYXN0IGpwZWdfZmluaXNoX291dHB1dCgpIGNhbGwuICBUaGUgYXJyYXlzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3VyIHVzZQordW50aWwgeW91IGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpLgorCisKK1RvIHdyaXRlIHRoZSBjb250ZW50cyBvZiBhIEpQRUcgZmlsZSBhcyBEQ1QgY29lZmZpY2llbnRzLCB5b3UgbXVzdCBwcm92aWRlCit0aGUgRENUIGNvZWZmaWNpZW50cyBzdG9yZWQgaW4gdmlydHVhbCBibG9jayBhcnJheXMuICBZb3UgY2FuIGVpdGhlciBwYXNzCitibG9jayBhcnJheXMgcmVhZCBmcm9tIGFuIGlucHV0IEpQRUcgZmlsZSBieSBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCksIG9yCithbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cyBmcm9tIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCBhbmQgZmlsbCB0aGVtCit5b3Vyc2VsZi4gIEluIGVpdGhlciBjYXNlLCBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIHN1YnN0aXR1dGVkIGZvcgoranBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgVGh1cyB0aGUgc2VxdWVuY2UgaXMKKyAgKiBDcmVhdGUgY29tcHJlc3Npb24gb2JqZWN0CisgICogU2V0IGFsbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFzIG5lY2Vzc2FyeQorICAqIFJlcXVlc3QgdmlydHVhbCBhcnJheXMgaWYgbmVlZGVkCisgICoganBlZ193cml0ZV9jb2VmZmljaWVudHMoKQorICAqIGpwZWdfZmluaXNoX2NvbXByZXNzKCkKKyAgKiBEZXN0cm95IG9yIHJlLXVzZSBjb21wcmVzc2lvbiBvYmplY3QKK2pwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgaXMgcGFzc2VkIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aXJ0dWFsIGJsb2NrCithcnJheSBkZXNjcmlwdG9yczsgdGhlIG51bWJlciBvZiBhcnJheXMgaXMgZXF1YWwgdG8gY2luZm8ubnVtX2NvbXBvbmVudHMuCisKK1RoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG9ubHkgaGF2ZSBiZWVuIHJlcXVlc3RlZCwgbm90IHJlYWxpemVkLCBiZWZvcmUKK2pwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgaXMgY2FsbGVkLiAgQSBzaWRlLWVmZmVjdCBvZgoranBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyB0byByZWFsaXplIGFueSB2aXJ0dWFsIGFycmF5cyB0aGF0IGhhdmUgYmVlbgorcmVxdWVzdGVkIGZyb20gdGhlIGNvbXByZXNzaW9uIG9iamVjdCdzIG1lbW9yeSBtYW5hZ2VyLiAgVGh1cywgd2hlbiBvYnRhaW5pbmcKK3RoZSB2aXJ0dWFsIGFycmF5cyBmcm9tIHRoZSBjb21wcmVzc2lvbiBvYmplY3QsIHlvdSBzaG91bGQgZmlsbCB0aGUgYXJyYXlzCithZnRlciBjYWxsaW5nIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuICBUaGUgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuIG91dAord2hlbiB5b3UgY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpOyBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIG9ubHkgd3JpdGVzCit0aGUgZmlsZSBoZWFkZXIuCisKK1doZW4gd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50cywgaXQgaXMgY3J1Y2lhbCB0aGF0IHRoZSBKUEVHIHF1YW50aXphdGlvbgordGFibGVzIGFuZCBzYW1wbGluZyBmYWN0b3JzIG1hdGNoIHRoZSB3YXkgdGhlIGRhdGEgd2FzIGVuY29kZWQsIG9yIHRoZQorcmVzdWx0aW5nIGZpbGUgd2lsbCBiZSBpbnZhbGlkLiAgRm9yIHRyYW5zY29kaW5nIGZyb20gYW4gZXhpc3RpbmcgSlBFRyBmaWxlLAord2UgcmVjb21tZW5kIHVzaW5nIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzKCkuICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMKK2FsbCB0aGUgY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcyAobGlrZSBqcGVnX3NldF9kZWZhdWx0cygpKSwKK3RoZW4gY29waWVzIHRoZSBjcml0aWNhbCBpbmZvcm1hdGlvbiBmcm9tIGEgc291cmNlIGRlY29tcHJlc3Npb24gb2JqZWN0LgorVGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IHNob3VsZCBoYXZlIGp1c3QgYmVlbiB1c2VkIHRvIHJlYWQgdGhlIGVudGlyZQorSlBFRyBpbnB1dCBmaWxlIC0tLSB0aGF0IGlzLCBpdCBzaG91bGQgYmUgYXdhaXRpbmcganBlZ19maW5pc2hfZGVjb21wcmVzcygpLgorCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIG1hcmtzIGFsbCB0YWJsZXMgc3RvcmVkIGluIHRoZSBjb21wcmVzc2lvbiBvYmplY3QKK2FzIG5lZWRpbmcgdG8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGZpbGUgKHRodXMsIGl0IGFjdHMgbGlrZQoranBlZ19zdGFydF9jb21wcmVzcyhjaW5mbywgVFJVRSkpLiAgVGhpcyBpcyBmb3Igc2FmZXR5J3Mgc2FrZSwgdG8gYXZvaWQKK2VtaXR0aW5nIGFiYnJldmlhdGVkIEpQRUcgZmlsZXMgYnkgYWNjaWRlbnQuICBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gZW1pdCBhbgorYWJicmV2aWF0ZWQgSlBFRyBmaWxlLCBjYWxsIGpwZWdfc3VwcHJlc3NfdGFibGVzKCksIG9yIHNldCB0aGUgdGFibGVzJworaW5kaXZpZHVhbCBzZW50X3RhYmxlIGZsYWdzLCBiZXR3ZWVuIGNhbGxpbmcganBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBhbmQKK2pwZWdfZmluaXNoX2NvbXByZXNzKCkuCisKKworUHJvZ3Jlc3MgbW9uaXRvcmluZworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTb21lIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byByZWdhaW4gY29udHJvbCBmcm9tIHRoZSBKUEVHIGxpYnJhcnkgZXZlcnkgc28KK29mdGVuLiAgVGhlIHR5cGljYWwgdXNlIG9mIHRoaXMgZmVhdHVyZSBpcyB0byBwcm9kdWNlIGEgcGVyY2VudC1kb25lIGJhciBvcgorb3RoZXIgcHJvZ3Jlc3MgZGlzcGxheS4gIChGb3IgYSBzaW1wbGUgZXhhbXBsZSwgc2VlIGNqcGVnLmMgb3IgZGpwZWcuYy4pCitBbHRob3VnaCB5b3UgZG8gZ2V0IGNvbnRyb2wgYmFjayBmcmVxdWVudGx5IGR1cmluZyB0aGUgZGF0YS10cmFuc2ZlcnJpbmcgcGFzcworKHRoZSBqcGVnX3JlYWRfc2NhbmxpbmVzIG9yIGpwZWdfd3JpdGVfc2NhbmxpbmVzIGxvb3ApLCBhbnkgYWRkaXRpb25hbCBwYXNzZXMKK3dpbGwgb2NjdXIgaW5zaWRlIGpwZWdfZmluaXNoX2NvbXByZXNzIG9yIGpwZWdfc3RhcnRfZGVjb21wcmVzczsgdGhvc2UKK3JvdXRpbmVzIG1heSB0YWtlIGEgbG9uZyB0aW1lIHRvIGV4ZWN1dGUsIGFuZCB5b3UgZG9uJ3QgZ2V0IGNvbnRyb2wgYmFjawordW50aWwgdGhleSBhcmUgZG9uZS4KKworWW91IGNhbiBkZWZpbmUgYSBwcm9ncmVzcy1tb25pdG9yIHJvdXRpbmUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5CitieSB0aGUgbGlicmFyeS4gIE5vIGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgaG93IG9mdGVuIHRoaXMgY2FsbCB3aWxsIG9jY3VyLAorc28gd2UgZG9uJ3QgcmVjb21tZW5kIHlvdSB1c2UgaXQgZm9yIG1vdXNlIHRyYWNraW5nIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4KK0F0IHByZXNlbnQsIGEgY2FsbCB3aWxsIG9jY3VyIG9uY2UgcGVyIE1DVSByb3csIHNjYW5saW5lLCBvciBzYW1wbGUgcm93Citncm91cCwgd2hpY2hldmVyIHVuaXQgaXMgY29udmVuaWVudCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc2luZyBtb2RlOyBzbyB0aGUKK3dpZGVyIHRoZSBpbWFnZSwgdGhlIGxvbmdlciB0aGUgdGltZSBiZXR3ZWVuIGNhbGxzLiAgRHVyaW5nIHRoZSBkYXRhCit0cmFuc2ZlcnJpbmcgcGFzcywgb25seSBvbmUgY2FsbCBvY2N1cnMgcGVyIGNhbGwgb2YganBlZ19yZWFkX3NjYW5saW5lcyBvcgoranBlZ193cml0ZV9zY2FubGluZXMsIHNvIGRvbid0IHBhc3MgYSBsYXJnZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGF0IG9uY2UgaWYKK3lvdSB3YW50IGZpbmUgcmVzb2x1dGlvbiBpbiB0aGUgcHJvZ3Jlc3MgY291bnQuICAoSWYgeW91IHJlYWxseSBuZWVkIHRvIHVzZQordGhlIGNhbGxiYWNrIG1lY2hhbmlzbSBmb3IgdGltZS1jcml0aWNhbCB0YXNrcyBsaWtlIG1vdXNlIHRyYWNraW5nLCB5b3UgY291bGQKK2luc2VydCBhZGRpdGlvbmFsIGNhbGxzIGluc2lkZSBzb21lIG9mIHRoZSBsaWJyYXJ5J3MgaW5uZXIgbG9vcHMuKQorCitUbyBlc3RhYmxpc2ggYSBwcm9ncmVzcy1tb25pdG9yIGNhbGxiYWNrLCBjcmVhdGUgYSBzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IsCitmaWxsIGluIGl0cyBwcm9ncmVzc19tb25pdG9yIGZpZWxkIHdpdGggYSBwb2ludGVyIHRvIHlvdXIgY2FsbGJhY2sgcm91dGluZSwKK2FuZCBzZXQgY2luZm8tPnByb2dyZXNzIHRvIHBvaW50IHRvIHRoZSBzdHJ1Y3QuICBUaGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKK3doZW5ldmVyIGNpbmZvLT5wcm9ncmVzcyBpcyBub24tTlVMTC4gIChUaGlzIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwgYnkKK2pwZWdfY3JlYXRlX2NvbXByZXNzIG9yIGpwZWdfY3JlYXRlX2RlY29tcHJlc3M7IHRoZSBsaWJyYXJ5IHdpbGwgbm90IGNoYW5nZQoraXQgdGhlcmVhZnRlci4gIFNvIGlmIHlvdSBhbGxvY2F0ZSBkeW5hbWljIHN0b3JhZ2UgZm9yIHRoZSBwcm9ncmVzcyBzdHJ1Y3QsCittYWtlIHN1cmUgaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgdGhlIEpQRUcgb2JqZWN0IGRvZXMuICBBbGxvY2F0aW5nIGZyb20gdGhlCitKUEVHIG1lbW9yeSBtYW5hZ2VyIHdpdGggbGlmZXRpbWUgSlBPT0xfUEVSTUFORU5UIHdpbGwgd29yayBuaWNlbHkuKSAgWW91CitjYW4gdXNlIHRoZSBzYW1lIGNhbGxiYWNrIHJvdXRpbmUgZm9yIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCisKK1RoZSBqcGVnX3Byb2dyZXNzX21nciBzdHJ1Y3QgY29udGFpbnMgZm91ciBmaWVsZHMgd2hpY2ggYXJlIHNldCBieSB0aGUgbGlicmFyeToKKwlsb25nIHBhc3NfY291bnRlcjsJLyogd29yayB1bml0cyBjb21wbGV0ZWQgaW4gdGhpcyBwYXNzICovCisJbG9uZyBwYXNzX2xpbWl0OwkvKiB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBpbiB0aGlzIHBhc3MgKi8KKwlpbnQgY29tcGxldGVkX3Bhc3NlczsJLyogcGFzc2VzIGNvbXBsZXRlZCBzbyBmYXIgKi8KKwlpbnQgdG90YWxfcGFzc2VzOwkvKiB0b3RhbCBudW1iZXIgb2YgcGFzc2VzIGV4cGVjdGVkICovCitEdXJpbmcgYW55IG9uZSBwYXNzLCBwYXNzX2NvdW50ZXIgaW5jcmVhc2VzIGZyb20gMCB1cCB0byAobm90IGluY2x1ZGluZykKK3Bhc3NfbGltaXQ7IHRoZSBzdGVwIHNpemUgaXMgdXN1YWxseSBidXQgbm90IG5lY2Vzc2FyaWx5IDEuICBUaGUgcGFzc19saW1pdAordmFsdWUgbWF5IGNoYW5nZSBmcm9tIG9uZSBwYXNzIHRvIGFub3RoZXIuICBUaGUgZXhwZWN0ZWQgdG90YWwgbnVtYmVyIG9mCitwYXNzZXMgaXMgaW4gdG90YWxfcGFzc2VzLCBhbmQgdGhlIG51bWJlciBvZiBwYXNzZXMgYWxyZWFkeSBjb21wbGV0ZWQgaXMgaW4KK2NvbXBsZXRlZF9wYXNzZXMuICBUaHVzIHRoZSBmcmFjdGlvbiBvZiB3b3JrIGNvbXBsZXRlZCBtYXkgYmUgZXN0aW1hdGVkIGFzCisJCWNvbXBsZXRlZF9wYXNzZXMgKyAocGFzc19jb3VudGVyL3Bhc3NfbGltaXQpCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJdG90YWxfcGFzc2VzCitpZ25vcmluZyB0aGUgZmFjdCB0aGF0IHRoZSBwYXNzZXMgbWF5IG5vdCBiZSBlcXVhbCBhbW91bnRzIG9mIHdvcmsuCisKK1doZW4gZGVjb21wcmVzc2luZywgcGFzc19saW1pdCBjYW4gZXZlbiBjaGFuZ2Ugd2l0aGluIGEgcGFzcywgYmVjYXVzZSBpdAorZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIHNjYW5zIGluIHRoZSBKUEVHIGZpbGUsIHdoaWNoIGlzbid0IGFsd2F5cyBrbm93biBpbgorYWR2YW5jZS4gIFRoZSBjb21wdXRlZCBmcmFjdGlvbi1vZi13b3JrLWRvbmUgbWF5IGp1bXAgc3VkZGVubHkgKGlmIHRoZSBsaWJyYXJ5CitkaXNjb3ZlcnMgaXQgaGFzIG92ZXJlc3RpbWF0ZWQgdGhlIG51bWJlciBvZiBzY2Fucykgb3IgZXZlbiBkZWNyZWFzZSAoaW4gdGhlCitvcHBvc2l0ZSBjYXNlKS4gIEl0IGlzIG5vdCB3aXNlIHRvIHB1dCBncmVhdCBmYWl0aCBpbiB0aGUgd29yayBlc3RpbWF0ZS4KKworV2hlbiB1c2luZyB0aGUgZGVjb21wcmVzc29yJ3MgYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIHByb2dyZXNzIG1vbml0b3Igd29yaworZXN0aW1hdGUgaXMgbGlrZWx5IHRvIGJlIGNvbXBsZXRlbHkgdW5oZWxwZnVsLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IGhhcyBubyB3YXkKK3RvIGtub3cgaG93IG1hbnkgb3V0cHV0IHBhc3NlcyB3aWxsIGJlIGRlbWFuZGVkIG9mIGl0LiAgQ3VycmVudGx5LCB0aGUgbGlicmFyeQorc2V0cyB0b3RhbF9wYXNzZXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGVyZSB3aWxsIGJlIG9uZSBtb3JlIG91dHB1dAorcGFzcyBpZiB0aGUgaW5wdXQgZmlsZSBlbmQgaGFzbid0IHlldCBiZWVuIHJlYWQgKGpwZWdfaW5wdXRfY29tcGxldGUoKSBpc24ndAorVFJVRSksIGJ1dCBubyBtb3JlIG91dHB1dCBwYXNzZXMgaWYgdGhlIGZpbGUgZW5kIGhhcyBiZWVuIHJlYWNoZWQgd2hlbiB0aGUKK291dHB1dCBwYXNzIGlzIHN0YXJ0ZWQuICBUaGlzIG1lYW5zIHRoYXQgdG90YWxfcGFzc2VzIHdpbGwgcmlzZSBhcyBhZGRpdGlvbmFsCitvdXRwdXQgcGFzc2VzIGFyZSByZXF1ZXN0ZWQuICBJZiB5b3UgaGF2ZSBhIHdheSBvZiBkZXRlcm1pbmluZyB0aGUgaW5wdXQgZmlsZQorc2l6ZSwgZXN0aW1hdGluZyBwcm9ncmVzcyBiYXNlZCBvbiB0aGUgZnJhY3Rpb24gb2YgdGhlIGZpbGUgdGhhdCdzIGJlZW4gcmVhZAord2lsbCBwcm9iYWJseSBiZSBtb3JlIHVzZWZ1bCB0aGFuIHVzaW5nIHRoZSBsaWJyYXJ5J3MgdmFsdWUuCisKKworTWVtb3J5IG1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgc2VjdGlvbiBjb3ZlcnMgc29tZSBrZXkgZmFjdHMgYWJvdXQgdGhlIEpQRUcgbGlicmFyeSdzIGJ1aWx0LWluIG1lbW9yeQorbWFuYWdlci4gIEZvciBtb3JlIGluZm8sIHBsZWFzZSByZWFkIHN0cnVjdHVyZS5kb2MncyBzZWN0aW9uIGFib3V0IHRoZSBtZW1vcnkKK21hbmFnZXIsIGFuZCBjb25zdWx0IHRoZSBzb3VyY2UgY29kZSBpZiBuZWNlc3NhcnkuCisKK0FsbCBtZW1vcnkgYW5kIHRlbXBvcmFyeSBmaWxlIGFsbG9jYXRpb24gd2l0aGluIHRoZSBsaWJyYXJ5IGlzIGRvbmUgdmlhIHRoZQorbWVtb3J5IG1hbmFnZXIuICBJZiBuZWNlc3NhcnksIHlvdSBjYW4gcmVwbGFjZSB0aGUgImJhY2sgZW5kIiBvZiB0aGUgbWVtb3J5CittYW5hZ2VyIHRvIGNvbnRyb2wgYWxsb2NhdGlvbiB5b3Vyc2VsZiAoZm9yIGV4YW1wbGUsIGlmIHlvdSBkb24ndCB3YW50IHRoZQorbGlicmFyeSB0byB1c2UgbWFsbG9jKCkgYW5kIGZyZWUoKSBmb3Igc29tZSByZWFzb24pLgorCitTb21lIGRhdGEgaXMgYWxsb2NhdGVkICJwZXJtYW5lbnRseSIgYW5kIHdpbGwgbm90IGJlIGZyZWVkIHVudGlsIHRoZSBKUEVHCitvYmplY3QgaXMgZGVzdHJveWVkLiAgTW9zdCBkYXRhIGlzIGFsbG9jYXRlZCAicGVyIGltYWdlIiBhbmQgaXMgZnJlZWQgYnkKK2pwZWdfZmluaXNoX2NvbXByZXNzLCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzLCBvciBqcGVnX2Fib3J0LiAgWW91IGNhbiBjYWxsIHRoZQorbWVtb3J5IG1hbmFnZXIgeW91cnNlbGYgdG8gYWxsb2NhdGUgc3RydWN0dXJlcyB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBiZQorZnJlZWQgYXQgdGhlc2UgdGltZXMuICBUeXBpY2FsIGNvZGUgZm9yIHRoaXMgaXMKKyAgcHRyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgc2l6ZSk7CitVc2UgSlBPT0xfUEVSTUFORU5UIHRvIGdldCBzdG9yYWdlIHRoYXQgbGFzdHMgYXMgbG9uZyBhcyB0aGUgSlBFRyBvYmplY3QuCitVc2UgYWxsb2NfbGFyZ2UgaW5zdGVhZCBvZiBhbGxvY19zbWFsbCBmb3IgYW55dGhpbmcgYmlnZ2VyIHRoYW4gYSBmZXcgS2J5dGVzLgorVGhlcmUgYXJlIGFsc28gYWxsb2Nfc2FycmF5IGFuZCBhbGxvY19iYXJyYXkgcm91dGluZXMgdGhhdCBhdXRvbWF0aWNhbGx5CitidWlsZCAyLUQgc2FtcGxlIG9yIGJsb2NrIGFycmF5cy4KKworVGhlIGxpYnJhcnkncyBtaW5pbXVtIHNwYWNlIHJlcXVpcmVtZW50cyB0byBwcm9jZXNzIGFuIGltYWdlIGRlcGVuZCBvbiB0aGUKK2ltYWdlJ3Mgd2lkdGgsIGJ1dCBub3Qgb24gaXRzIGhlaWdodCwgYmVjYXVzZSB0aGUgbGlicmFyeSBvcmRpbmFyaWx5IHdvcmtzCit3aXRoICJzdHJpcCIgYnVmZmVycyB0aGF0IGFyZSBhcyB3aWRlIGFzIHRoZSBpbWFnZSBidXQganVzdCBhIGZldyByb3dzIGhpZ2guCitTb21lIG9wZXJhdGluZyBtb2RlcyAoZWcsIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbikgcmVxdWlyZSBmdWxsLWltYWdlCitidWZmZXJzLiAgU3VjaCBidWZmZXJzIGFyZSB0cmVhdGVkIGFzICJ2aXJ0dWFsIGFycmF5cyI6IG9ubHkgdGhlIGN1cnJlbnQgc3RyaXAKK25lZWQgYmUgaW4gbWVtb3J5LCBhbmQgdGhlIHJlc3QgY2FuIGJlIHN3YXBwZWQgb3V0IHRvIGEgdGVtcG9yYXJ5IGZpbGUuCisKK0lmIHlvdSB1c2UgdGhlIHNpbXBsZXN0IG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kIChqbWVtbm9icy5jKSwgdGhlbiBubwordGVtcG9yYXJ5IGZpbGVzIGFyZSB1c2VkOyB2aXJ0dWFsIGFycmF5cyBhcmUgc2ltcGx5IG1hbGxvYygpJ2QuICBJbWFnZXMgYmlnZ2VyCit0aGFuIG1lbW9yeSBjYW4gYmUgcHJvY2Vzc2VkIG9ubHkgaWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgdmlydHVhbCBtZW1vcnkuCitUaGUgb3RoZXIgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmRzIHN1cHBvcnQgdGVtcG9yYXJ5IGZpbGVzIG9mIHZhcmlvdXMgZmxhdm9ycworYW5kIHRodXMgd29yayBpbiBtYWNoaW5lcyB3aXRob3V0IHZpcnR1YWwgbWVtb3J5LiAgVGhleSBtYXkgYWxzbyBiZSB1c2VmdWwgb24KK1VuaXggbWFjaGluZXMgaWYgeW91IG5lZWQgdG8gcHJvY2VzcyBpbWFnZXMgdGhhdCBleGNlZWQgYXZhaWxhYmxlIHN3YXAgc3BhY2UuCisKK1doZW4gdXNpbmcgdGVtcG9yYXJ5IGZpbGVzLCB0aGUgbGlicmFyeSB3aWxsIG1ha2UgdGhlIGluLW1lbW9yeSBidWZmZXJzIGZvcgoraXRzIHZpcnR1YWwgYXJyYXlzIGp1c3QgYmlnIGVub3VnaCB0byBzdGF5IHdpdGhpbiBhICJtYXhpbXVtIG1lbW9yeSIgc2V0dGluZy4KK1lvdXIgYXBwbGljYXRpb24gY2FuIHNldCB0aGlzIGxpbWl0IGJ5IHNldHRpbmcgY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UKK2FmdGVyIGNyZWF0aW5nIHRoZSBKUEVHIG9iamVjdC4gIChPZiBjb3Vyc2UsIHRoZXJlIGlzIHN0aWxsIGEgbWluaW11bSBzaXplIGZvcgordGhlIGJ1ZmZlcnMsIHNvIHRoZSBtYXgtbWVtb3J5IHNldHRpbmcgaXMgZWZmZWN0aXZlIG9ubHkgaWYgaXQgaXMgYmlnZ2VyIHRoYW4KK3RoZSBtaW5pbXVtIHNwYWNlIG5lZWRlZC4pICBJZiB5b3UgYWxsb2NhdGUgYW55IGxhcmdlIHN0cnVjdHVyZXMgeW91cnNlbGYsIHlvdQorbXVzdCBhbGxvY2F0ZSB0aGVtIGJlZm9yZSBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgb3IganBlZ19zdGFydF9kZWNvbXByZXNzKCkgaW4KK29yZGVyIHRvIGhhdmUgdGhlbSBjb3VudGVkIGFnYWluc3QgdGhlIG1heCBtZW1vcnkgbGltaXQuICBBbHNvIGtlZXAgaW4gbWluZAordGhhdCBzcGFjZSBhbGxvY2F0ZWQgd2l0aCBhbGxvY19zbWFsbCgpIGlzIGlnbm9yZWQsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKK2l0J3MgdG9vIHNtYWxsIHRvIGJlIHdvcnRoIHdvcnJ5aW5nIGFib3V0OyBzbyBhIHJlYXNvbmFibGUgc2FmZXR5IG1hcmdpbgorc2hvdWxkIGJlIGxlZnQgd2hlbiBzZXR0aW5nIG1heF9tZW1vcnlfdG9fdXNlLgorCitJZiB5b3UgdXNlIHRoZSBqbWVtbmFtZS5jIG9yIGptZW1kb3MuYyBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCwgaXQgaXMKK2ltcG9ydGFudCB0byBjbGVhbiB1cCB0aGUgSlBFRyBvYmplY3QgcHJvcGVybHkgdG8gZW5zdXJlIHRoYXQgdGhlIHRlbXBvcmFyeQorZmlsZXMgZ2V0IGRlbGV0ZWQuICAoVGhpcyBpcyBlc3BlY2lhbGx5IGNydWNpYWwgd2l0aCBqbWVtZG9zLmMsIHdoZXJlIHRoZQorInRlbXBvcmFyeSBmaWxlcyIgbWF5IGJlIGV4dGVuZGVkLW1lbW9yeSBzZWdtZW50czsgaWYgdGhleSBhcmUgbm90IGZyZWVkLAorRE9TIHdpbGwgcmVxdWlyZSBhIHJlYm9vdCB0byByZWNvdmVyIHRoZSBtZW1vcnkuKSAgVGh1cywgd2l0aCB0aGVzZSBtZW1vcnkKK21hbmFnZXJzLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHByb3ZpZGUgYSBzaWduYWwgaGFuZGxlciB0aGF0IHdpbGwgdHJhcCBhbnkKK2Vhcmx5IGV4aXQgZnJvbSB5b3VyIHByb2dyYW0uICBUaGUgaGFuZGxlciBzaG91bGQgY2FsbCBlaXRoZXIganBlZ19hYm9ydCgpCitvciBqcGVnX2Rlc3Ryb3koKSBmb3IgYW55IGFjdGl2ZSBKUEVHIG9iamVjdHMuICBBIGhhbmRsZXIgaXMgbm90IG5lZWRlZCB3aXRoCitqbWVtbm9icy5jLCBhbmQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB3aXRoIGptZW1hbnNpLmMgb3Igam1lbW1hYy5jIGVpdGhlciwKK3NpbmNlIHRoZSBDIGxpYnJhcnkgaXMgc3VwcG9zZWQgdG8gdGFrZSBjYXJlIG9mIGRlbGV0aW5nIGZpbGVzIG1hZGUgd2l0aAordG1wZmlsZSgpLgorCisKK01lbW9yeSB1c2FnZQorLS0tLS0tLS0tLS0tCisKK1dvcmtpbmcgbWVtb3J5IHJlcXVpcmVtZW50cyB3aGlsZSBwZXJmb3JtaW5nIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24KK2RlcGVuZCBvbiBpbWFnZSBkaW1lbnNpb25zLCBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MgKHN1Y2ggYXMgY29sb3JzcGFjZSBhbmQKK0pQRUcgcHJvY2VzcyksIGFuZCBvcGVyYXRpbmcgbW9kZSAoYXBwbGljYXRpb24tc2VsZWN0ZWQgb3B0aW9ucykuCisKK0FzIG9mIHY2YiwgdGhlIGRlY29tcHJlc3NvciByZXF1aXJlczoKKyAxLiBBYm91dCAyNEsgaW4gbW9yZS1vci1sZXNzLWZpeGVkLXNpemUgZGF0YS4gIFRoaXMgdmFyaWVzIGEgYml0IGRlcGVuZGluZworICAgIG9uIG9wZXJhdGluZyBtb2RlIGFuZCBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MgKHBhcnRpY3VsYXJseSBjb2xvciB2cy4KKyAgICBncmF5c2NhbGUpLCBidXQgaXQgZG9lc24ndCBkZXBlbmQgb24gaW1hZ2UgZGltZW5zaW9ucy4KKyAyLiBTdHJpcCBidWZmZXJzIChvZiBzaXplIHByb3BvcnRpb25hbCB0byB0aGUgaW1hZ2Ugd2lkdGgpIGZvciBJRENUIGFuZAorICAgIHVwc2FtcGxpbmcgcmVzdWx0cy4gIFRoZSB3b3JzdCBjYXNlIGZvciBjb21tb25seSB1c2VkIHNhbXBsaW5nIGZhY3RvcnMKKyAgICBpcyBhYm91dCAzNCBieXRlcyAqIHdpZHRoIGluIHBpeGVscyBmb3IgYSBjb2xvciBpbWFnZS4gIEEgZ3JheXNjYWxlIGltYWdlCisgICAgb25seSBuZWVkcyBhYm91dCA4IGJ5dGVzIHBlciBwaXhlbCBjb2x1bW4uCisgMy4gQSBmdWxsLWltYWdlIERDVCBjb2VmZmljaWVudCBidWZmZXIgaXMgbmVlZGVkIHRvIGRlY29kZSBhIG11bHRpLXNjYW4gSlBFRworICAgIGZpbGUgKGluY2x1ZGluZyBwcm9ncmVzc2l2ZSBKUEVHcyksIG9yIHdoZW5ldmVyIHlvdSBzZWxlY3QgYnVmZmVyZWQtaW1hZ2UKKyAgICBtb2RlLiAgVGhpcyB0YWtlcyAyIGJ5dGVzL2NvZWZmaWNpZW50LiAgQXQgdHlwaWNhbCAyeDIgc2FtcGxpbmcsIHRoYXQncworICAgIDMgYnl0ZXMgcGVyIHBpeGVsIGZvciBhIGNvbG9yIGltYWdlLiAgV29yc3QgY2FzZSAoMXgxIHNhbXBsaW5nKSByZXF1aXJlcworICAgIDYgYnl0ZXMvcGl4ZWwuICBGb3IgZ3JheXNjYWxlLCBmaWd1cmUgMiBieXRlcy9waXhlbC4KKyA0LiBUbyBwZXJmb3JtIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24sIHRoZSBkZWNvbXByZXNzb3IgYWxzbyBuZWVkcyBhCisgICAgMTI4SyBjb2xvciBsb29rdXAgdGFibGUgYW5kIGEgZnVsbC1pbWFnZSBwaXhlbCBidWZmZXIgKDMgYnl0ZXMvcGl4ZWwpLgorVGhpcyBkb2VzIG5vdCBjb3VudCBhbnkgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24sIHN1Y2ggYXMgYQorYnVmZmVyIHRvIGhvbGQgdGhlIGZpbmFsIG91dHB1dCBpbWFnZS4KKworVGhlIGFib3ZlIGZpZ3VyZXMgYXJlIHZhbGlkIGZvciA4LWJpdCBKUEVHIGRhdGEgcHJlY2lzaW9uIGFuZCBhIG1hY2hpbmUgd2l0aAorMzItYml0IGludHMuICBGb3IgMTItYml0IEpQRUcgZGF0YSwgZG91YmxlIHRoZSBzaXplIG9mIHRoZSBzdHJpcCBidWZmZXJzIGFuZAorcXVhbnRpemF0aW9uIHBpeGVsIGJ1ZmZlci4gIFRoZSAiZml4ZWQtc2l6ZSIgZGF0YSB3aWxsIGJlIHNvbWV3aGF0IHNtYWxsZXIKK3dpdGggMTYtYml0IGludHMsIGxhcmdlciB3aXRoIDY0LWJpdCBpbnRzLiAgQWxzbywgQ01ZSyBvciBvdGhlciB1bnVzdWFsCitjb2xvciBzcGFjZXMgd2lsbCByZXF1aXJlIGRpZmZlcmVudCBhbW91bnRzIG9mIHNwYWNlLgorCitUaGUgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBhbmQgcGl4ZWwgYnVmZmVycywgaWYgbmVlZGVkIGF0IGFsbCwgZG8gbm90CitoYXZlIHRvIGJlIGZ1bGx5IFJBTSByZXNpZGVudDsgeW91IGNhbiBoYXZlIHRoZSBsaWJyYXJ5IHVzZSB0ZW1wb3JhcnkKK2ZpbGVzIGluc3RlYWQgd2hlbiB0aGUgdG90YWwgbWVtb3J5IHVzYWdlIHdvdWxkIGV4Y2VlZCBhIGxpbWl0IHlvdSBzZXQuCisoQnV0IGlmIHlvdXIgT1Mgc3VwcG9ydHMgdmlydHVhbCBtZW1vcnksIGl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIGp1c3QgdXNlCitqbWVtbm9icyBhbmQgbGV0IHRoZSBPUyBkbyB0aGUgc3dhcHBpbmcuKQorCitUaGUgY29tcHJlc3NvcidzIG1lbW9yeSByZXF1aXJlbWVudHMgYXJlIHNpbWlsYXIsIGV4Y2VwdCB0aGF0IGl0IGhhcyBubyBuZWVkCitmb3IgY29sb3IgcXVhbnRpemF0aW9uLiAgQWxzbywgaXQgbmVlZHMgYSBmdWxsLWltYWdlIERDVCBjb2VmZmljaWVudCBidWZmZXIKK2lmIEh1ZmZtYW4tdGFibGUgb3B0aW1pemF0aW9uIGlzIGFza2VkIGZvciwgZXZlbiBpZiBwcm9ncmVzc2l2ZSBtb2RlIGlzIG5vdAorcmVxdWVzdGVkLgorCitJZiB5b3UgbmVlZCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeSB1c2FnZSBpbiBhIHBhcnRpY3VsYXIKK3NpdHVhdGlvbiwgeW91IGNhbiBlbmFibGUgdGhlIE1FTV9TVEFUUyBjb2RlIGluIGptZW1tZ3IuYy4KKworCitMaWJyYXJ5IGNvbXBpbGUtdGltZSBvcHRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgbnVtYmVyIG9mIGNvbXBpbGUtdGltZSBvcHRpb25zIGFyZSBhdmFpbGFibGUgYnkgbW9kaWZ5aW5nIGptb3JlY2ZnLmguCisKK1RoZSBKUEVHIHN0YW5kYXJkIHByb3ZpZGVzIGZvciBib3RoIHRoZSBiYXNlbGluZSA4LWJpdCBEQ1QgcHJvY2VzcyBhbmQKK2EgMTItYml0IERDVCBwcm9jZXNzLiAgVGhlIElKRyBjb2RlIHN1cHBvcnRzIDEyLWJpdCBsb3NzeSBKUEVHIGlmIHlvdSBkZWZpbmUKK0JJVFNfSU5fSlNBTVBMRSBhcyAxMiByYXRoZXIgdGhhbiA4LiAgTm90ZSB0aGF0IHRoaXMgY2F1c2VzIEpTQU1QTEUgdG8gYmUKK2xhcmdlciB0aGFuIGEgY2hhciwgc28gaXQgYWZmZWN0cyB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24ncyBpbWFnZSBkYXRhLgorVGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcgYW5kIGRqcGVnIGNhbiBzdXBwb3J0IDEyLWJpdCBtb2RlIG9ubHkgZm9yIFBQTQorYW5kIEdJRiBmaWxlIGZvcm1hdHM7IHlvdSBtdXN0IGRpc2FibGUgdGhlIG90aGVyIGZpbGUgZm9ybWF0cyB0byBjb21waWxlIGEKKzEyLWJpdCBjanBlZyBvciBkanBlZy4gIChpbnN0YWxsLmRvYyBoYXMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0LikKK0F0IHByZXNlbnQsIGEgMTItYml0IGxpYnJhcnkgY2FuIGhhbmRsZSAqb25seSogMTItYml0IGltYWdlcywgbm90IGJvdGgKK3ByZWNpc2lvbnMuICAoSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBib3RoIDgtIGFuZCAxMi1iaXQgbGlicmFyaWVzIGluIGEgc2luZ2xlCithcHBsaWNhdGlvbiwgeW91IGNvdWxkIHByb2JhYmx5IGRvIGl0IGJ5IGRlZmluaW5nIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKK2ZvciBqdXN0IG9uZSBvZiB0aGUgY29waWVzLiAgWW91J2QgaGF2ZSB0byBhY2Nlc3MgdGhlIDgtYml0IGFuZCAxMi1iaXQgY29waWVzCitmcm9tIHNlcGFyYXRlIGFwcGxpY2F0aW9uIHNvdXJjZSBmaWxlcy4gIFRoaXMgaXMgdW50ZXN0ZWQgLi4uIGlmIHlvdSB0cnkgaXQsCit3ZSdkIGxpa2UgdG8gaGVhciB3aGV0aGVyIGl0IHdvcmtzISkKKworTm90ZSB0aGF0IGEgMTItYml0IGxpYnJhcnkgYWx3YXlzIGNvbXByZXNzZXMgaW4gSHVmZm1hbiBvcHRpbWl6YXRpb24gbW9kZSwKK2luIG9yZGVyIHRvIGdlbmVyYXRlIHZhbGlkIEh1ZmZtYW4gdGFibGVzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdXIKK2RlZmF1bHQgSHVmZm1hbiB0YWJsZXMgb25seSBjb3ZlciA4LWJpdCBkYXRhLiAgSWYgeW91IG5lZWQgdG8gb3V0cHV0IDEyLWJpdAorZmlsZXMgaW4gb25lIHBhc3MsIHlvdSdsbCBoYXZlIHRvIHN1cHBseSBzdWl0YWJsZSBkZWZhdWx0IEh1ZmZtYW4gdGFibGVzLgorWW91IG1heSBhbHNvIHdhbnQgdG8gc3VwcGx5IHlvdXIgb3duIERDVCBxdWFudGl6YXRpb24gdGFibGVzOyB0aGUgZXhpc3RpbmcKK3F1YWxpdHktc2NhbGluZyBjb2RlIGhhcyBiZWVuIGRldmVsb3BlZCBmb3IgOC1iaXQgdXNlLCBhbmQgcHJvYmFibHkgZG9lc24ndAorZ2VuZXJhdGUgZXNwZWNpYWxseSBnb29kIHRhYmxlcyBmb3IgMTItYml0LgorCitUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcG9uZW50cyAoY29sb3IgY2hhbm5lbHMpIGluIHRoZSBpbWFnZSBpcyBkZXRlcm1pbmVkCitieSBNQVhfQ09NUE9ORU5UUy4gIFRoZSBKUEVHIHN0YW5kYXJkIGFsbG93cyB1cCB0byAyNTUgY29tcG9uZW50cywgYnV0IHdlCitleHBlY3QgdGhhdCBmZXcgYXBwbGljYXRpb25zIHdpbGwgbmVlZCBtb3JlIHRoYW4gZm91ciBvciBzby4KKworT24gbWFjaGluZXMgd2l0aCB1bnVzdWFsIGRhdGEgdHlwZSBzaXplcywgeW91IG1heSBiZSBhYmxlIHRvIGltcHJvdmUKK3BlcmZvcm1hbmNlIG9yIHJlZHVjZSBtZW1vcnkgc3BhY2UgYnkgdHdlYWtpbmcgdGhlIHZhcmlvdXMgdHlwZWRlZnMgaW4KK2ptb3JlY2ZnLmguICBJbiBwYXJ0aWN1bGFyLCBvbiBzb21lIFJJU0MgQ1BVcywgYWNjZXNzIHRvIGFycmF5cyBvZiAic2hvcnQicworaXMgcXVpdGUgc2xvdzsgY29uc2lkZXIgdHJhZGluZyBtZW1vcnkgZm9yIHNwZWVkIGJ5IG1ha2luZyBKQ09FRiwgSU5UMTYsIGFuZAorVUlOVDE2IGJlICJpbnQiIG9yICJ1bnNpZ25lZCBpbnQiLiAgVUlOVDggaXMgYWxzbyBhIGNhbmRpZGF0ZSB0byBiZWNvbWUgaW50LgorWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gbWFrZSBKU0FNUExFIGJlIGludCB1bmxlc3MgeW91IGhhdmUgbG90cyBvZiBtZW1vcnkKK3RvIGJ1cm4uCisKK1lvdSBjYW4gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsaWJyYXJ5IGJ5IGNvbXBpbGluZyBvdXQgdmFyaW91cyBvcHRpb25hbAorZnVuY3Rpb25zLiAgVG8gZG8gdGhpcywgdW5kZWZpbmUgeHh4X1NVUFBPUlRFRCBzeW1ib2xzIGFzIG5lY2Vzc2FyeS4KKworWW91IGNhbiBhbHNvIHNhdmUgYSBmZXcgSyBieSBub3QgaGF2aW5nIHRleHQgZXJyb3IgbWVzc2FnZXMgaW4gdGhlIGxpYnJhcnk7Cit0aGUgc3RhbmRhcmQgZXJyb3IgbWVzc2FnZSB0YWJsZSBvY2N1cGllcyBhYm91dCA1S2IuICBUaGlzIGlzIHBhcnRpY3VsYXJseQorcmVhc29uYWJsZSBmb3IgZW1iZWRkZWQgYXBwbGljYXRpb25zIHdoZXJlIHRoZXJlJ3Mgbm8gZ29vZCB3YXkgdG8gZGlzcGxheSAKK2EgbWVzc2FnZSBhbnl3YXkuICBUbyBkbyB0aGlzLCByZW1vdmUgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlIHRhYmxlCisoanBlZ19zdGRfbWVzc2FnZV90YWJsZVtdKSBmcm9tIGplcnJvci5jLCBhbmQgYWx0ZXIgZm9ybWF0X21lc3NhZ2UgdG8gZG8KK3NvbWV0aGluZyByZWFzb25hYmxlIHdpdGhvdXQgaXQuICBZb3UgY291bGQgb3V0cHV0IHRoZSBudW1lcmljIHZhbHVlIG9mIHRoZQorbWVzc2FnZSBjb2RlIG51bWJlciwgZm9yIGV4YW1wbGUuICBJZiB5b3UgZG8gdGhpcywgeW91IGNhbiBhbHNvIHNhdmUgYSBjb3VwbGUKK21vcmUgSyBieSBtb2RpZnlpbmcgdGhlIFRSQUNFTVNuKCkgbWFjcm9zIGluIGplcnJvci5oIHRvIGV4cGFuZCB0byBub3RoaW5nOworeW91IGRvbid0IG5lZWQgdHJhY2UgY2FwYWJpbGl0eSBhbnl3YXksIHJpZ2h0PworCisKK1BvcnRhYmlsaXR5IGNvbnNpZGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgSlBFRyBsaWJyYXJ5IGhhcyBiZWVuIHdyaXR0ZW4gdG8gYmUgZXh0cmVtZWx5IHBvcnRhYmxlOyB0aGUgc2FtcGxlCithcHBsaWNhdGlvbnMgY2pwZWcgYW5kIGRqcGVnIGFyZSBzbGlnaHRseSBsZXNzIHNvLiAgVGhpcyBzZWN0aW9uIHN1bW1hcml6ZXMKK3RoZSBkZXNpZ24gZ29hbHMgaW4gdGhpcyBhcmVhLiAgKElmIHlvdSBlbmNvdW50ZXIgYW55IGJ1Z3MgdGhhdCBjYXVzZSB0aGUKK2xpYnJhcnkgdG8gYmUgbGVzcyBwb3J0YWJsZSB0aGFuIGlzIGNsYWltZWQgaGVyZSwgd2UnZCBhcHByZWNpYXRlIGhlYXJpbmcKK2Fib3V0IHRoZW0uKQorCitUaGUgY29kZSB3b3JrcyBmaW5lIG9uIEFOU0kgQywgQysrLCBhbmQgcHJlLUFOU0kgQyBjb21waWxlcnMsIHVzaW5nIGFueSBvZgordGhlIHBvcHVsYXIgc3lzdGVtIGluY2x1ZGUgZmlsZSBzZXR1cHMsIGFuZCBzb21lIG5vdC1zby1wb3B1bGFyIG9uZXMgdG9vLgorU2VlIGluc3RhbGwuZG9jIGZvciBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMuCisKK1RoZSBjb2RlIGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlIGV4YWN0IHNpemVzIG9mIHRoZSBDIGRhdGEgdHlwZXMuICBBcworZGlzdHJpYnV0ZWQsIHdlIG1ha2UgdGhlIGFzc3VtcHRpb25zIHRoYXQKKwljaGFyCWlzIGF0IGxlYXN0IDggYml0cyB3aWRlCisJc2hvcnQJaXMgYXQgbGVhc3QgMTYgYml0cyB3aWRlCisJaW50CWlzIGF0IGxlYXN0IDE2IGJpdHMgd2lkZQorCWxvbmcJaXMgYXQgbGVhc3QgMzIgYml0cyB3aWRlCisoVGhlc2UgYXJlIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBvZiB0aGUgQU5TSSBDIHN0YW5kYXJkLikgIFdpZGVyIHR5cGVzIHdpbGwKK3dvcmsgZmluZSwgYWx0aG91Z2ggbWVtb3J5IG1heSBiZSB1c2VkIGluZWZmaWNpZW50bHkgaWYgY2hhciBpcyBtdWNoIGxhcmdlcgordGhhbiA4IGJpdHMgb3Igc2hvcnQgaXMgbXVjaCBiaWdnZXIgdGhhbiAxNiBiaXRzLiAgVGhlIGNvZGUgc2hvdWxkIHdvcmsKK2VxdWFsbHkgd2VsbCB3aXRoIDE2LSBvciAzMi1iaXQgaW50cy4KKworSW4gYSBzeXN0ZW0gd2hlcmUgdGhlc2UgYXNzdW1wdGlvbnMgYXJlIG5vdCBtZXQsIHlvdSBtYXkgYmUgYWJsZSB0byBtYWtlIHRoZQorY29kZSB3b3JrIGJ5IG1vZGlmeWluZyB0aGUgdHlwZWRlZnMgaW4gam1vcmVjZmcuaC4gIEhvd2V2ZXIsIHlvdSB3aWxsIHByb2JhYmx5CitoYXZlIGRpZmZpY3VsdHkgaWYgaW50IGlzIGxlc3MgdGhhbiAxNiBiaXRzIHdpZGUsIHNpbmNlIHJlZmVyZW5jZXMgdG8gcGxhaW4KK2ludCBhYm91bmQgaW4gdGhlIGNvZGUuCisKK2NoYXIgY2FuIGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQsIGFsdGhvdWdoIHRoZSBjb2RlIHJ1bnMgZmFzdGVyIGlmIGFuCit1bnNpZ25lZCBjaGFyIHR5cGUgaXMgYXZhaWxhYmxlLiAgSWYgY2hhciBpcyB3aWRlciB0aGFuIDggYml0cywgeW91IHdpbGwgbmVlZAordG8gcmVkZWZpbmUgSk9DVEVUIGFuZC9vciBwcm92aWRlIGN1c3RvbSBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtYW5hZ2VycyBzbwordGhhdCBKT0NURVQgcmVwcmVzZW50cyBleGFjdGx5IDggYml0cyBvZiBkYXRhIG9uIGV4dGVybmFsIHN0b3JhZ2UuCisKK1RoZSBKUEVHIGxpYnJhcnkgcHJvcGVyIGRvZXMgbm90IGFzc3VtZSBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBjaGFyYWN0ZXJzLgorQnV0IHNvbWUgb2YgdGhlIGltYWdlIGZpbGUgSS9PIG1vZHVsZXMgaW4gY2pwZWcvZGpwZWcgZG8gaGF2ZSBBU0NJSQorZGVwZW5kZW5jaWVzIGluIGZpbGUtaGVhZGVyIG1hbmlwdWxhdGlvbjsgc28gZG9lcyBjanBlZydzIHNlbGVjdF9maWxlX3R5cGUoKQorcm91dGluZS4KKworVGhlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCByZWx5IGhlYXZpbHkgb24gdGhlIEMgbGlicmFyeS4gIEluIHBhcnRpY3VsYXIsIEMKK3N0ZGlvIGlzIHVzZWQgb25seSBieSB0aGUgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbW9kdWxlcyBhbmQgdGhlIGVycm9yCitoYW5kbGVyLCBhbGwgb2Ygd2hpY2ggYXJlIGFwcGxpY2F0aW9uLXJlcGxhY2VhYmxlLiAgKGNqcGVnL2RqcGVnIGFyZSBtb3JlCitoZWF2aWx5IGRlcGVuZGVudCBvbiBzdGRpby4pICBtYWxsb2MgYW5kIGZyZWUgYXJlIGNhbGxlZCBvbmx5IGZyb20gdGhlIG1lbW9yeQorbWFuYWdlciAiYmFjayBlbmQiIG1vZHVsZSwgc28geW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgbWVtb3J5IGFsbG9jYXRvciBieQorcmVwbGFjaW5nIHRoYXQgb25lIGZpbGUuCisKK1RoZSBjb2RlIGdlbmVyYWxseSBhc3N1bWVzIHRoYXQgQyBuYW1lcyBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgZmlyc3QgMTUKK2NoYXJhY3RlcnMuICBIb3dldmVyLCBnbG9iYWwgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIG1hZGUgdW5pcXVlIGluIHRoZQorZmlyc3QgNiBjaGFyYWN0ZXJzIGJ5IGRlZmluaW5nIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMuCisKK01vcmUgaW5mbyBhYm91dCBwb3J0aW5nIHRoZSBjb2RlIG1heSBiZSBnbGVhbmVkIGJ5IHJlYWRpbmcgamNvbmZpZy5kb2MsCitqbW9yZWNmZy5oLCBhbmQgamluY2x1ZGUuaC4KKworCitOb3RlcyBmb3IgTVMtRE9TIGltcGxlbWVudG9ycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIElKRyBjb2RlIGlzIGRlc2lnbmVkIHRvIHdvcmsgZWZmaWNpZW50bHkgaW4gODB4ODYgInNtYWxsIiBvciAibWVkaXVtIgorbWVtb3J5IG1vZGVscyAoaS5lLiwgZGF0YSBwb2ludGVycyBhcmUgMTYgYml0cyB1bmxlc3MgZXhwbGljaXRseSBkZWNsYXJlZAorImZhciI7IGNvZGUgcG9pbnRlcnMgY2FuIGJlIGVpdGhlciBzaXplKS4gIFlvdSBtYXkgYmUgYWJsZSB0byB1c2Ugc21hbGwKK21vZGVsIHRvIGNvbXBpbGUgY2pwZWcgb3IgZGpwZWcgYnkgaXRzZWxmLCBidXQgeW91IHdpbGwgcHJvYmFibHkgaGF2ZSB0byB1c2UKK21lZGl1bSBtb2RlbCBmb3IgYW55IGxhcmdlciBhcHBsaWNhdGlvbi4gIFRoaXMgd29uJ3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UgaW4KK3BlcmZvcm1hbmNlLiAgWW91ICp3aWxsKiB0YWtlIGEgbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBoaXQgaWYgeW91IHVzZSBhCitsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCAocGVyaGFwcyAxMCUtMjUlKSwgYW5kIHlvdSBzaG91bGQgYXZvaWQgImh1Z2UiIG1vZGVsCitpZiBhdCBhbGwgcG9zc2libGUuCisKK1RoZSBKUEVHIGxpYnJhcnkgdHlwaWNhbGx5IG5lZWRzIDJLYi0zS2Igb2Ygc3RhY2sgc3BhY2UuICBJdCB3aWxsIGFsc28KK21hbGxvYyBhYm91dCAyMEstMzBLIG9mIG5lYXIgaGVhcCBzcGFjZSB3aGlsZSBleGVjdXRpbmcgKGFuZCBsb3RzIG9mIGZhcgoraGVhcCwgYnV0IHRoYXQgZG9lc24ndCBjb3VudCBpbiB0aGlzIGNhbGN1bGF0aW9uKS4gIFRoaXMgZmlndXJlIHdpbGwgdmFyeQorZGVwZW5kaW5nIG9uIHNlbGVjdGVkIG9wZXJhdGluZyBtb2RlLCBhbmQgdG8gYSBsZXNzZXIgZXh0ZW50IG9uIGltYWdlIHNpemUuCitUaGVyZSBpcyBhbHNvIGFib3V0IDVLYi02S2Igb2YgY29uc3RhbnQgZGF0YSB3aGljaCB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGUKK25lYXIgZGF0YSBzZWdtZW50IChhYm91dCA0S2Igb2YgdGhpcyBpcyB0aGUgZXJyb3IgbWVzc2FnZSB0YWJsZSkuCitUaHVzIHlvdSBoYXZlIHBlcmhhcHMgMjBLIGF2YWlsYWJsZSBmb3Igb3RoZXIgbW9kdWxlcycgc3RhdGljIGRhdGEgYW5kIG5lYXIKK2hlYXAgc3BhY2UgYmVmb3JlIHlvdSBuZWVkIHRvIGdvIHRvIGEgbGFyZ2VyIG1lbW9yeSBtb2RlbC4gIFRoZSBDIGxpYnJhcnkncworc3RhdGljIGRhdGEgd2lsbCBhY2NvdW50IGZvciBzZXZlcmFsIEsgb2YgdGhpcywgYnV0IHRoYXQgc3RpbGwgbGVhdmVzIGEgZ29vZAorZGVhbCBmb3IgeW91ciBuZWVkcy4gIChJZiB5b3UgYXJlIHRpZ2h0IG9uIHNwYWNlLCB5b3UgY291bGQgcmVkdWNlIHRoZSBzaXplcworb2YgdGhlIEkvTyBidWZmZXJzIGFsbG9jYXRlZCBieSBqZGF0YXNyYy5jIGFuZCBqZGF0YWRzdC5jLCBzYXkgZnJvbSA0SyB0bworMUsuICBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIG1vdmUgdGhlIGVycm9yIG1lc3NhZ2UgdGFibGUgdG8gZmFyIG1lbW9yeTsKK3RoaXMgc2hvdWxkIGJlIGRvYWJsZSB3aXRoIG9ubHkgbG9jYWxpemVkIGhhY2tpbmcgb24gamVycm9yLmMuKQorCitBYm91dCAySyBvZiB0aGUgbmVhciBoZWFwIHNwYWNlIGlzICJwZXJtYW5lbnQiIG1lbW9yeSB0aGF0IHdpbGwgbm90IGJlCityZWxlYXNlZCB1bnRpbCB5b3UgZGVzdHJveSB0aGUgSlBFRyBvYmplY3QuICBUaGlzIGlzIG9ubHkgYW4gaXNzdWUgaWYgeW91CitzYXZlIGEgSlBFRyBvYmplY3QgYmV0d2VlbiBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbnMuCisKK0ZhciBkYXRhIHNwYWNlIG1heSBhbHNvIGJlIGEgdGlnaHQgcmVzb3VyY2Ugd2hlbiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBsYXJnZQoraW1hZ2VzLiAgVGhlIG1vc3QgbWVtb3J5LWludGVuc2l2ZSBjYXNlIGlzIGRlY29tcHJlc3Npb24gd2l0aCB0d28tcGFzcyBjb2xvcgorcXVhbnRpemF0aW9uLCBvciBzaW5nbGUtcGFzcyBxdWFudGl6YXRpb24gdG8gYW4gZXh0ZXJuYWxseSBzdXBwbGllZCBjb2xvcgorbWFwLiAgVGhpcyByZXF1aXJlcyBhIDEyOEtiIGNvbG9yIGxvb2t1cCB0YWJsZSBwbHVzIHN0cmlwIGJ1ZmZlcnMgYW1vdW50aW5nCit0byBhYm91dCA0MCBieXRlcyBwZXIgY29sdW1uIGZvciB0eXBpY2FsIHNhbXBsaW5nIHJhdGlvcyAoZWcsIGFib3V0IDI1NjAwCitieXRlcyBmb3IgYSA2NDAtcGl4ZWwtd2lkZSBpbWFnZSkuICBZb3UgbWF5IG5vdCBiZSBhYmxlIHRvIHByb2Nlc3Mgd2lkZQoraW1hZ2VzIGlmIHlvdSBoYXZlIGxhcmdlIGRhdGEgc3RydWN0dXJlcyBvZiB5b3VyIG93bi4KKworT2YgY291cnNlLCBhbGwgb2YgdGhlc2UgY29uY2VybnMgdmFuaXNoIGlmIHlvdSB1c2UgYSAzMi1iaXQgZmxhdC1tZW1vcnktbW9kZWwKK2NvbXBpbGVyLCBzdWNoIGFzIERKR1BQIG9yIFdhdGNvbSBDLiAgV2UgaGlnaGx5IHJlY29tbWVuZCBmbGF0IG1vZGVsIGlmIHlvdQorY2FuIHVzZSBpdDsgdGhlIEpQRUcgbGlicmFyeSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBpbiBmbGF0IG1vZGVsLgpkaWZmIC0tZ2l0IGEvbHRjb25maWcgYi9sdGNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzQ3ZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbHRjb25maWcKQEAgLTAsMCArMSwxNTEyIEBACisjISAvYmluL3NoCisKKyMgbHRjb25maWcgLSBDcmVhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbC4KKyMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgQSBsb3Qgb2YgdGhpcyBzY3JpcHQgaXMgdGFrZW4gZnJvbSBhdXRvY29uZi0yLjEwLgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKKworZWNobz1lY2hvCitpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4gOgorZWxzZQorICAjIFRoZSBTb2xhcmlzIGFuZCBBSVggZGVmYXVsdCBlY2hvIHByb2dyYW0gdW5xdW90ZXMgYmFja3NsYXNoZXMuCisgICMgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCisgICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCisgICMgU28sIHdlIGVtdWxhdGUgZWNobyB3aXRoIHByaW50ZiAnJXNcbicKKyAgZWNobz0icHJpbnRmICVzXFxuIgorICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4gOgorICBlbHNlCisgICAgIyBPb3BzLiAgV2UgaGF2ZSBubyB3b3JraW5nIHByaW50Zi4gIFRyeSB0byBmaW5kIGEgbm90LXNvLWJ1Z2d5IGVjaG8uCisgICAgZWNobz1lY2hvCisgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbworICAgICAgaWYgdGVzdCAtZiAkZGlyL2VjaG8gJiYgdGVzdCAiWGAkZGlyL2VjaG8gJ1x0J2AiID0gJ1hcdCc7IHRoZW4KKyAgICAgICAgZWNobz0iJGRpci9lY2hvIgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisgIGZpCitmaQorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIHMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJworCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KK3Byb2duYW1lPWAkZWNobyAiWCQwIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyMgQ29uc3RhbnRzOgorUFJPR1JBTT1sdGNvbmZpZworUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPTEuMgorYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuYyAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuYyAkTElCUyAxPiY1Jworcm09InJtIC1mIgorCitoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCitlbmFibGVfc2hhcmVkPXllcworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZy4KK2VuYWJsZV9zdGF0aWM9eWVzCitsdG1haW49CitzaWxlbnQ9CitzcmNkaXI9CithY19jb25maWdfZ3Vlc3M9CithY19jb25maWdfc3ViPQoraG9zdD0KK25vbm9wdD0KK3ZlcmlmeV9ob3N0PXllcword2l0aF9nY2M9bm8KK3dpdGhfZ251X2xkPW5vCisKK29sZF9BUj0iJEFSIgorb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorb2xkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCitvbGRfTEQ9IiRMRCIKK29sZF9MTl9TPSIkTE5fUyIKK29sZF9OTT0iJE5NIgorb2xkX1JBTkxJQj0iJFJBTkxJQiIKKworIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCithcmdzPQorcHJldj0KK2ZvciBvcHRpb24KK2RvCisgIGNhc2UgIiRvcHRpb24iIGluCisgIC0qPSopIG9wdGFyZz1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBvcHRhcmc9IDs7CisgIGVzYWMKKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgZXZhbCAiJHByZXY9XCRvcHRpb24iCisgICAgcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRvcHRpb24iIGluCisgIC0taGVscCkgY2F0IDw8RU9NCitVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIExUTUFJTiBbSE9TVF0KKworR2VuZXJhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbCBzY3JpcHQuCisKKyAgICAtLWRpc2FibGUtc2hhcmVkICAgICAgIGRvIG5vdCBidWlsZCBzaGFyZWQgbGlicmFyaWVzCisgICAgLS1kaXNhYmxlLXN0YXRpYyAgICAgICBkbyBub3QgYnVpbGQgc3RhdGljIGxpYnJhcmllcworICAgIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAtLW5vLXZlcmlmeSAgICAgICAgICAgIGRvIG5vdCB2ZXJpZnkgdGhhdCBIT1NUIGlzIGEgdmFsaWQgaG9zdCB0eXBlCisgICAgLS1xdWlldCAgICAgICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCisgICAgLS1zaWxlbnQgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworICAgIC0tc3JjZGlyPURJUiAgICAgICAgICAgZmluZCBcYGNvbmZpZy5ndWVzcycgaW4gRElSCisgICAgLS12ZXJzaW9uICAgICAgICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAgIC0td2l0aC1nY2MgICAgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEdOVSBDIGNvbXBpbGVyIHdpbGwgYmUgdXNlZAorICAgIC0td2l0aC1nbnUtbGQgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEMgY29tcGlsZXIgdXNlcyB0aGUgR05VIGxpbmtlcgorCitMVE1BSU4gaXMgdGhlIFxgbHRtYWluLnNoJyBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBwcm92aWRlcyBiYXNpYyBsaWJ0b29sCitmdW5jdGlvbmFsaXR5LgorCitIT1NUIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzeXN0ZW0gbmFtZSBbZGVmYXVsdD1ndWVzc2VkXS4KK0VPTQorICBleGl0IDAKKyAgOzsKKworICAtLWRpc2FibGUtc2hhcmVkKSBlbmFibGVfc2hhcmVkPW5vIDs7CisKKyAgLS1kaXNhYmxlLXN0YXRpYykgZW5hYmxlX3N0YXRpYz1ubyA7OworCisgIC0tcXVpZXQgfCAtLXNpbGVudCkgc2lsZW50PXllcyA7OworCisgIC0tc3JjZGlyKSBwcmV2PXNyY2RpciA7OworICAtLXNyY2Rpcj0qKSBzcmNkaXI9IiRvcHRhcmciIDs7CisKKyAgLS1uby12ZXJpZnkpIHZlcmlmeV9ob3N0PW5vIDs7CisKKyAgLS12ZXJzaW9uKSBlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiI7IGV4aXQgMCA7OworCisgIC0td2l0aC1nY2MpIHdpdGhfZ2NjPXllcyA7OworICAtLXdpdGgtZ251LWxkKSB3aXRoX2dudV9sZD15ZXMgOzsKKworICAtKikKKyAgICBlY2hvICIkcHJvZ25hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIgMT4mMgorICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCisgICAgICBsdG1haW49IiRvcHRpb24iCisgICAgZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KKyMgVGhpcyBnZW5lcmF0ZXMgYW4gdW5uZWNlc3Nhcnkgd2FybmluZyBmb3Igc3BhcmMtc3VuLXNvbGFyaXM0LjEuM19VMQorIyAgICAgIGlmIHRlc3QgLW4gImBlY2hvICRvcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisjICAgICAgICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmcgXGAkb3B0aW9uJyBpcyBub3QgYSB2YWxpZCBob3N0IHR5cGUiIDE+JjIKKyMgICAgICBmaQorICAgICAgaG9zdD0iJG9wdGlvbiIKKyAgICBlbHNlCisgICAgICBlY2hvICIkcHJvZ25hbWU6IHRvbyBtYW55IGFyZ3VtZW50cyIgMT4mMgorICAgICAgZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KKyAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTFRNQUlOIGZpbGUiIDE+JjIKKyAgZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCitmaQorCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbiA6CitlbHNlCisgIGVjaG8gIiRwcm9nbmFtZTogXGAkbHRtYWluJyBkb2VzIG5vdCBleGlzdCIgMT4mMgorICBlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgUXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2x0Y29uZmlnX2FyZ3M9Citmb3IgYXJnCitkbworICBjYXNlICIkYXJnIiBpbgorICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAnJGFyZyciIDs7CisgICopIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICRhcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBBIHJlbGV2YW50IHN1YnNldCBvZiBBQ19JTklULgorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Pi4vY29uZmlnLmxvZworCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgorIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKKyMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgICMgQXNzdW1lIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIG9uZSBhcyB0aGUgcGF0aCB0byBsdG1haW4uc2guCisgIHNyY2Rpcj1gJGVjaG8gIiRsdG1haW4iIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgdGVzdCAiJHNyY2RpciIgPSAiJGx0bWFpbiIgJiYgc3JjZGlyPS4KK2ZpCisKK3RyYXAgIiRybSBjb25mdGVzdCo7IGV4aXQgMSIgMSAyIDE1CitpZiB0ZXN0ICIkdmVyaWZ5X2hvc3QiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgZm9yIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1Yi4KKyAgYWNfYXV4X2Rpcj0KKyAgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvY29uZmlnLmd1ZXNzOyB0aGVuCisgICAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBmaW5kIGNvbmZpZy5ndWVzcyBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMgorICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCisgIGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKKyAgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCisKKyAgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorICBpZiAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjIKKyAgICBlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorCisgIGhvc3RfYWxpYXM9JGhvc3QKKyAgY2FzZSAiJGhvc3RfYWxpYXMiIGluCisgICIiKQorICAgIGlmIGhvc3RfYWxpYXM9YCRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlCisgICAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyCisgICAgICBlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkgOzsKKyAgZXNhYworICBob3N0PWAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKKyAgZWNobyAiJGFjX3QkaG9zdCIgMT4mNgorCisgICMgTWFrZSBzdXJlIHRoZSBob3N0IHZlcmlmaWVkLgorICB0ZXN0IC16ICIkaG9zdCIgJiYgZXhpdCAxCisKK2VsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCisgIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGhvc3QgdHlwZSBpZiB5b3UgdXNlIFxgLS1uby12ZXJpZnknIiAxPiYyCisgIGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgMQorZWxzZQorICBob3N0X2FsaWFzPSRob3N0CitmaQorCisjIFRyYW5zZm9ybSBsaW51eCogdG8gKi0qLWxpbnV4LWdudSosIHRvIHN1cHBvcnQgb2xkIGNvbmZpZ3VyZSBzY3JpcHRzLgorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eC1nbnUqKSA7OworbGludXgqKSBob3N0PWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qLS4qLWxpbnV4XClcKC4qXCkkL1wxLWdudVwyLydgCitlc2FjCisKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgY3J1ICRvbGRsaWIkb2xkb2JqcycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKKyMgU2V0IGEgc2FuZSBkZWZhdWx0IGZvciBgQVInLgordGVzdCAteiAiJEFSIiAmJiBBUj1hcgorCisjIElmIFJBTkxJQiBpcyBub3Qgc2V0LCB0aGVuIHJ1biB0aGUgdGVzdC4KK2lmIHRlc3QgIiR7UkFOTElCK3NldH0iICE9ICJzZXQiOyB0aGVuCisgIHJlc3VsdD1ubworCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByYW5saWIuLi4gJGFjX2MiIDE+JjYKKyAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGRpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgorICAgIGlmIHRlc3QgLWYgJGRpci9yYW5saWI7IHRoZW4KKyAgICAgIFJBTkxJQj0icmFubGliIgorICAgICAgcmVzdWx0PSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgZWNobyAiJGFjX3QkcmVzdWx0IiAxPiY2CitmaQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kcztcJFJBTkxJQiBcJG9sZGxpYiIKKyAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGliOyRvbGRfcG9zdGluc3RhbGxfY21kcyIKK2ZpCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB1c2luZyBHQ0MuCitpZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllcyB8fCB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgSWYgQ0MgaXMgbm90IHNldCwgdGhlbiB0cnkgdG8gZmluZCBHQ0Mgb3IgYSB1c2FibGUgQ0MuCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2NjLi4uICRhY19jIiAxPiY2CisgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgorICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgorCUNDPSJnY2MiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJHNhdmVfaWZzIgorCisgICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgICAgZmkKKyAgZmkKKworICAjIE5vdCAiZ2NjIiwgc28gdHJ5ICJjYyIsIHJlamVjdGluZyAiL3Vzci91Y2IvY2MiLgorICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNjLi4uICRhY19jIiAxPiY2CisgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgICBjY19yZWplY3RlZD1ubworICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCisgICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgorICAgICAgaWYgdGVzdCAtZiAkZGlyL2NjOyB0aGVuCisJaWYgdGVzdCAiJGRpci9jYyIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisJICBjY19yZWplY3RlZD15ZXMKKwkgIGNvbnRpbnVlCisJZmkKKwlDQz0iY2MiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGlmIHRlc3QgJGNjX3JlamVjdGVkID0geWVzOyB0aGVuCisgICAgICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgICAgICBzZXQgZHVtbXkgJENDCisgICAgICBzaGlmdAorICAgICAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorCSMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorCSMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIG5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorCSMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIG5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisJc2hpZnQKKwlzZXQgZHVtbXkgIiRkaXIvY2MiICIkQCIKKwlzaGlmdAorCUNDPSIkQCIKKyAgICAgIGZpCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2CisgICAgZWxzZQorICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBzZWUgaWYgdGhlIGNvbXBpbGVyIGlzIHJlYWxseSBHQ0MuCisgIHdpdGhfZ2NjPW5vCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uICRhY19jIiAxPiY2CisgIGVjaG8gIiRwcm9nbmFtZTo0MjQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKKworICAkcm0gY29uZnRlc3QuYworICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKKyAgaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gJHByb2duYW1lOjQzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgd2l0aF9nY2M9eWVzCisgIGZpCisgICRybSBjb25mdGVzdC5jCisgIGVjaG8gIiRhY190JHdpdGhfZ2NjIiAxPiY2CitmaQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorc2V0IGR1bW15ICRDQworY29tcGlsZXI9IiQyIgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkYWNfYyIgMT4mNgorcGljX2ZsYWc9CitzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Cit3bD0KK2xpbmtfc3RhdGljX2ZsYWc9Citub19idWlsdGluX2ZsYWc9CisKK2lmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KKyAgd2w9Jy1XbCwnCisgIGxpbmtfc3RhdGljX2ZsYWc9Jy1zdGF0aWMnCisgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKKworICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgYWl4MyogfCBhaXg0KiB8IGlyaXg1KiB8IGlyaXg2KiB8IG9zZjMqIHwgb3NmNCopCisgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgOzsKKyAgb3MyKikKKyAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KKyAgICA7OworICBhbWlnYW9zKikKKyAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICBwaWNfZmxhZz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgIDs7CisgICopCisgICAgcGljX2ZsYWc9Jy1mUElDJworICAgIDs7CisgIGVzYWMKK2Vsc2UKKyAgIyBQT1JUTUUgQ2hlY2sgZm9yIFBJQyBmbGFncyBmb3IgdGhlIHN5c3RlbSBjb21waWxlci4KKyAgY2FzZSAiJGhvc3Rfb3MiIGluCisgIGFpeDMqIHwgYWl4NCopCisgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICA7OworCisgIGhwdXg5KiB8IGhwdXgxMCopCisgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsaW5rX3N0YXRpY19mbGFnIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICB3bD0nLVdsLCcKKyAgICBsaW5rX3N0YXRpY19mbGFnPSIke3dsfS1hICR7d2x9YXJjaGl2ZSIKKyAgICBwaWNfZmxhZz0nK1onCisgICAgOzsKKworICBpcml4NSogfCBpcml4NiopCisgICAgd2w9Jy1XbCwnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCisgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgIDs7CisKKyAgb3MyKikKKyAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KKyAgICA7OworCisgIG9zZjMqIHwgb3NmNCopCisgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgd2w9Jy1XbCwnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCisgICAgOzsKKworICBzY28zLjJ2NSopCisgICAgcGljX2ZsYWc9Jy1LcGljJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1kbicKKyAgICBzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Jy1iZWxmJworICAgIDs7CisKKyAgc29sYXJpczIqKQorICAgIHBpY19mbGFnPSctS1BJQycKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKKyAgICB3bD0nLVdsLCcKKyAgICA7OworCisgIHN1bm9zNCopCisgICAgcGljX2ZsYWc9Jy1QSUMnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCisgICAgd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICA7OworCisgIHN5c3Y0LjJ1dzIqKQorICAgIHBpY19mbGFnPSctS1BJQycKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKKyAgICB3bD0nLVdsLCcKKyAgICA7OworCisgIHV0czQqKQorICAgIHBpY19mbGFnPSctcGljJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJworICAgIDs7CisKKyAgKikKKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgOzsKKyAgZXNhYworZmkKKworaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgorICBlY2hvICIkYWNfdCRwaWNfZmxhZyIgMT4mNgorCisgICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgorICAkcm0gY29uZnRlc3QqCisgIGVjaG8gPiBjb25mdGVzdC5jCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgJHBpY19mbGFnIC1EUElDIgorICBlY2hvICIkcHJvZ25hbWU6NTQ3OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzIiA+JjUKKyAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1NDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgorICAgICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKworICAgICMgT24gSFAtVVgsIGJvdGggQ0MgYW5kIEdDQyBvbmx5IHdhcm4gdGhhdCBQSUMgaXMgc3VwcG9ydGVkLi4uIHRoZW4gdGhleQorICAgICMgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UgYXNzdW1lIHRoYXQKKyAgICAjIFBJQyBpcyBub3Qgc3VwcG9ydGVkLgorICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgICAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBwaWNfZmxhZz0KKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgorICAgICAgcGljX2ZsYWc9IiAkcGljX2ZsYWciCisgICAgZmkKKyAgZWxzZQorICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgY2FuX2J1aWxkX3NoYXJlZD1ubworICAgIHBpY19mbGFnPQorICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgZmkKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICRybSBjb25mdGVzdCoKK2Vsc2UKKyAgZWNobyAiJGFjX3Qibm9uZSAxPiY2CitmaQorCisjIENoZWNrIGZvciBhbnkgc3BlY2lhbCBzaGFyZWQgbGlicmFyeSBjb21waWxhdGlvbiBmbGFncy4KK2lmIHRlc3QgLW4gIiRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MiOyB0aGVuCisgIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZzogXGAkQ0MnIHJlcXVpcmVzIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgorICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiWyAJXSRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3NbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogYWRkIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiAxPiYyCisgICAgY2FuX2J1aWxkX3NoYXJlZD1ubworICBmaQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ciskcm0gY29uZnRlc3QqCitlY2hvICdtYWluKCl7cmV0dXJuKDApO30nID4gY29uZnRlc3QuYworc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKK0xERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgorZWNobyAiJHByb2duYW1lOjU5MTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKK2lmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgZWNobyAiJGFjX3QkbGlua19zdGF0aWNfZmxhZyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCJub25lIDE+JjYKKyAgbGlua19zdGF0aWNfZmxhZz0KK2ZpCitMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorJHJtIGNvbmZ0ZXN0KgorCitpZiB0ZXN0IC16ICIkTE5fUyI7IHRoZW4KKyAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSBsbiAtcywgb3Igd2UgbmVlZCBoYXJkIGxpbmtzLgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRhY19jIiAxPiY2CisgICRybSBjb25mdGVzdGRhdGEKKyAgaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGw7IHRoZW4KKyAgICAkcm0gY29uZnRlc3RkYXRhCisgICAgTE5fUz0ibG4gLXMiCisgIGVsc2UKKyAgICBMTl9TPWxuCisgIGZpCisgIGlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgorICBlbHNlCisgICAgZWNobyAiJGFjX3Qibm8gMT4mNgorICBmaQorZmkKKworIyBNYWtlIHN1cmUgTEQgaXMgYW4gYWJzb2x1dGUgcGF0aC4KK2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgYWNfcHJvZz1sZAorICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCisgICAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDLi4uICRhY19jIiAxPiY2CisgICAgZWNobyAiJHByb2duYW1lOjYyNDogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCisgICAgY2FzZSAiJGFjX3Byb2ciIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgLyogfCBbQS1aYS16XTpcXCopCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICAgIiIpCisgICAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlIG5vdCB1c2luZyBHQ0MuCisgICAgICBhY19wcm9nPWxkCisgICAgICA7OworICAgICopCisgICAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgICA7OworICAgIGVzYWMKKyAgZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgorICAgIGVjaG8gIiRwcm9nbmFtZTo2NDI6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorICBlbHNlCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorICAgIGVjaG8gIiRwcm9nbmFtZTo2NDU6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyAgZmkKKworICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCisJTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorCSMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKwkjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKwlpZiAiJExEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCWVsc2UKKwkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJZmkKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGFjX3NhdmVfaWZzIgorICBmaQorCisgIGlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgICBlY2hvICIkYWNfdCRMRCIgMT4mNgorICBlbHNlCisgICAgZWNobyAiJGFjX3Qibm8gMT4mNgorICBmaQorCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmkKKworIyBDaGVjayB0byBzZWUgaWYgaXQgcmVhbGx5IGlzIG9yIGlzIG5vdCBHTlUgbGQuCitlY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgorIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KK2lmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KKyAgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorZWNobyAiJGFjX3Qkd2l0aF9nbnVfbGQiIDE+JjYKKworIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKKworYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Citub191bmRlZmluZWRfZmxhZz0KK2FyY2hpdmVfY21kcz0KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9CitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KK2hhcmRjb2RlX2RpcmVjdD1ubworaGFyZGNvZGVfbWludXNfTD1ubworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorcnVucGF0aF92YXI9CisKK2Nhc2UgIiRob3N0X29zIiBpbgorYW1pZ2FvcyogfCBzdW5vczQqKQorICAjIE9uIHRoZXNlIG9wZXJhdGluZyBzeXN0ZW1zLCB3ZSBzaG91bGQgdHJlYXQgR05VIGxkIGxpa2UgdGhlIHN5c3RlbSBsZC4KKyAgZ251X2xkX2FjdHNfbmF0aXZlPXllcworICA7OworKikKKyAgZ251X2xkX2FjdHNfbmF0aXZlPW5vCisgIDs7Citlc2FjCisKK2xkX3NobGlicz15ZXMKK2lmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXMgJiYgdGVzdCAiJGdudV9sZF9hY3RzX25hdGl2ZSIgIT0geWVzOyB0aGVuCisKKyAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWIkbGlib2JqcycKKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGxkX3NobGlicz15ZXMKKyAgZWxzZQorICAgIGxkX3NobGlicz1ubworICBmaQorCisgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgZmkKK2Vsc2UKKyAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgYWl4MyopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhcmNoaXZlX2NtZHM9JyROTSRsaWJvYmpzIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgPiAkbGliLmV4cDskTEQgLW8gJG9iamRpci8kc29uYW1lJGxpYm9ianMgLWJFOiRsaWIuZXhwIC1UNTEyIC1INTEyIC1iTTpTUkU7JEFSIGNydSAkbGliICRvYmpkaXIvJHNvbmFtZScKKyAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisgICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKyAgICAgICMgYnJva2VuIGNvbGxlY3QyLgorICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgZmkKKyAgICA7OworCisgIGFpeDQqKQorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgYXJjaGl2ZV9jbWRzPSckTk0kbGlib2JqcyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnID4gJGxpYi5leHA7JENDIC1vICRvYmpkaXIvJHNvbmFtZSRsaWJvYmpzICR7d2x9LWJFOiRsaWIuZXhwICR7d2x9LWJNOlNSRSAke3dsfS1ibm9lbnRyeTskQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JEFSIGNydSAkbGliJGxpYm9ianM7JFJBTkxJQiAkbGliOyhjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgOzsKKworICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAjIGV4dHJhIHNwYWNlKS4KKyAgZnJlZWJzZDIuMiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzIC91c3IvbGliL2MrK3J0MC5vJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgIGZyZWVic2QyKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliJGxpYm9ianMnCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgIyBGcmVlQlNEIDMsIGF0IGxhc3QsIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgZnJlZWJzZDMqKQorICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBocHV4OSopCisgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci8kc29uYW1lOyRMRCAtYiArcyArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG9iamRpci8kc29uYW1lJGxpYm9ianM7bXYgJG9iamRpci8kc29uYW1lICRsaWInCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgIDs7CisKKyAgaHB1eDEwKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliJGxpYm9ianMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgIDs7CisKKyAgaXJpeDUqIHwgaXJpeDYqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAtc29uYW1lICRzb25hbWUgLXNldF92ZXJzaW9uICR2ZXJzdHJpbmckbGlib2JqcycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgOzsKKworICBuZXRic2QqKQorICAgICMgVGVzdGVkIHdpdGggTmV0QlNEIDEuMiBsZAorICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIG9wZW5ic2QqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIG9zMiopCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhcmNoaXZlX2NtZHM9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyBEQVRBID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7JGVjaG8gRVhQT1JUUyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjtlbXhleHAkbGlib2JqcyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiRsaWJvYmpzICRvYmpkaXIvJGxpYm5hbWUuZGVmJworICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb2JqZGlyLyRsaWJuYW1lLmEgJG9iamRpci8kbGlibmFtZS5kZWYnCisgICAgOzsKKworICBvc2YzKiB8IG9zZjQqKQorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtbyAkbGliIC1zb25hbWUgJHNvbmFtZSAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyRsaWJvYmpzJGRlcGxpYnMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgIDs7CisKKyAgc2NvMy4ydjUqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgOzsKKworICBzb2xhcmlzMiopCisgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JworICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliJGxpYm9ianMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKworICAgICMgU29sYXJpcyAyIGJlZm9yZSAyLjUgaGFyZGNvZGVzIC1MIHBhdGhzLgorICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIHNvbGFyaXMyLlswLTRdKikKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgIHN1bm9zNCopCisgICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliJGxpYm9ianMnCisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiRsaWJvYmpzJworICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LWV4cG9ydC1keW5hbWljJworICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIHV0czQqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICBoYXJkY29kZV9taW51c19MPW5vCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgKikKKyAgICBsZF9zaGxpYnM9bm8KKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgOzsKKyAgZXNhYworZmkKK2VjaG8gIiRhY190JGxkX3NobGlicyIgMT4mNgorCitpZiB0ZXN0IC16ICIkTk0iOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAkYWNfYyIgMT4mNgorICBjYXNlICIkTk0iIGluCisgIC8qIHwgW0EtWmEtel06XFwqKSA7OyAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgKikKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBhY19kaXIgaW4gL3Vzci91Y2IgL3Vzci9jY3MvYmluICRQQVRIIC9iaW47IGRvCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorICAgICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisgICAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIE5NPSIkYWNfZGlyL25tIC1CIgorICAgICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIE5NPSIkYWNfZGlyL25tIC1wIgorCWVsc2UKKyAgICAgICAgICBOTT0iJGFjX2Rpci9ubSIKKwlmaQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJE5NIiAmJiBOTT1ubQorICAgIDs7CisgIGVzYWMKKyAgZWNobyAiJGFjX3QkTk0iIDE+JjYKK2ZpCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitlY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQuLi4gJGFjX2MiIDE+JjYKKworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbQkNERUdSU1RVXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJworCisjIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCitzeW14ZnJtPSdcMSBcMScKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4KikKKyAgc3ltY29kZT0nW0JDRFRVXScKKyAgOzsKK2lyaXgqKQorICAjIENhbm5vdCB1c2UgdW5kZWZpbmVkIHN5bWJvbHMgb24gSVJJWCBiZWNhdXNlIGlubGluZWQgZnVuY3Rpb25zIG1lc3MgdXMgdXAuCisgIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citzb2xhcmlzMiopCisgIHN5bWNvZGU9J1tCRFRVXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitpZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKyAgc3ltY29kZT0nW0FCQ0RHSVNUVVddJworZmkKKworIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qICRzeW1jb2RlICRzeW1wYXQkLyRzeW14ZnJtL3AnIgorCisjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KK3BpcGVfd29ya3M9bm8KKyRybSBjb25mdGVzdCoKK2NhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCittYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitFT0YKKworZWNobyAiJHByb2duYW1lOjk3MTogY2hlY2tpbmcgaWYgZ2xvYmFsX3N5bWJvbF9waXBlIHdvcmtzIiA+JjUKK2lmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6OTcyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgorICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgaWYgeyBlY2hvICIkcHJvZ25hbWU6OTc1OiBldmFsIFwiJE5NIGNvbmZ0ZXN0Lm8gfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0XCIiID4mNTsgZXZhbCAiJE5NIGNvbmZ0ZXN0Lm8gfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0IDI+JjUiOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KKworICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKyAgICAgIG12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgd2NvdXQ9YHdjICIkbmxpc3QiIDI+L2Rldi9udWxsYAorICAgICAgY291bnQ9YCRlY2hvICJYJHdjb3V0IiB8ICRYc2VkIC1lICdzL15bIAldKlwoWzAtOV1bMC05XSpcKS4qJC9cMS8nYAorICAgICAgKHRlc3QgIiRjb3VudCIgLWdlIDApIDI+L2Rldi9udWxsIHx8IGNvdW50PS0xCisgICAgZWxzZQorICAgICAgcm0gLWYgIiRubGlzdCJUCisgICAgICBjb3VudD0tMQorICAgIGZpCisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworRU9GCisgICAgICAgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKyAgICAgICAgc2VkICdzL14uKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy8nIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYworCisJY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIF9fcHRyX3Qgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgX19wdHJfdCBjaGFyICoKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gZGxkX3ByZWxvYWRlZF9zeW1ib2xzLCAtMSBpZiB1bnNvcnRlZC4gKi8KK2ludCBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudCA9ICRjb3VudDsKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCitzdHJ1Y3QgeworICBjaGFyICpuYW1lOworICBfX3B0cl90IGFkZHJlc3M7Cit9CitkbGRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7CitFT0YKKyAgICAgICAgc2VkICdzL15cKC4qXCkgXCguKlwpJC8gIHsiXDEiLCAoX19wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCisgICAgICAgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYworICB7MCwgKF9fcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorRU9GCisgICAgICAgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisgICAgICAgIG12IGNvbmZ0ZXN0Lm8gY29uZnRlc3RtLm8KKwlzYXZlX0xJQlM9IiRMSUJTIgorCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBMSUJTPSdjb25mdGVzdG0ubycKKwlDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgorICAgICAgICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjEwMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICAgICAgICAgIHBpcGVfd29ya3M9eWVzCisgICAgICAgIGVsc2UKKyAgICAgICAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICAgICAgICAgIGNhdCBjb25mdGVzdC5jID4mNQorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgZWxzZQorICAgICAgICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiY2Fubm90IHJ1biAkZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LmMgPiY1CitmaQorJHJtIGNvbmZ0ZXN0KgorCisjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCitlY2hvICIkYWNfdCRwaXBlX3dvcmtzIiAxPiY2Cit0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXMgfHwgZ2xvYmFsX3N5bWJvbF9waXBlPQorCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJGFjX2MiIDE+JjYKK2hhcmRjb2RlX2FjdGlvbj0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCisgICB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJiBcCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubyAmJiBcCisgICAgIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubzsgdGhlbgorCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKKyAgZmkKK2VsaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IHllcyAmJiBcCisgICAgIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSB5ZXM7IHRoZW4KKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcuCisgIGhhcmRjb2RlX2FjdGlvbj11bnN1cHBvcnRlZAorZWxzZQorICAjIFdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCitmaQorZWNobyAiJGFjX3QkaGFyZGNvZGVfYWN0aW9uIiAxPiY2Cit0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHVuc3VwcG9ydGVkICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworCityZWxvYWRfZmxhZz0KK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gJGFjX2MiIDE+JjYKKyMgUE9SVE1FIFNvbWUgbGlua2VyIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgorcmVsb2FkX2ZsYWc9Jy1yJworZWNobyAiJGFjX3QkcmVsb2FkX2ZsYWciCit0ZXN0IC1uICIkcmVsb2FkX2ZsYWciICYmIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIgorCisjIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9Citwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9Cit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorCitlY2hvICRhY19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJGFjX2MiIDE+JjYKK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4MyogfCBhaXg0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJworICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICIoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkiOyAoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkgfHwgZXhpdCAxOyBkb25lJworICA7OworCitmcmVlYnNkMiogfCBmcmVlYnNkMyopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCisgIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCcKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wuJG1ham9yICRsaWJuYW1lLnNsJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wuJG1ham9yJworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgtZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKworICBpZiB0ZXN0IC1mIC9saWIvbGQuc28uMTsgdGhlbgorICAgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIGVsc2UKKyAgICAjIE9ubHkgdGhlIEdOVSBsZC5zbyBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIG9uIE1rTGludXguCisgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgIHBvd2VycGMqKSBkeW5hbWljX2xpbmtlcj1ubyA7OworICAgICopIGR5bmFtaWNfbGlua2VyPSdMaW51eCBsZC5zbycgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7CisKK25ldGJzZCogfCBvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbCAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzY28zLjJ2NSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc29sYXJpczIqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzeXN2NC4ydXcyKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK2VjaG8gIiRhY190JGR5bmFtaWNfbGlua2VyIgordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIyBSZXBvcnQgdGhlIGZpbmFsIGNvbnNlcXVlbmNlcy4KK2VjaG8gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkY2FuX2J1aWxkX3NoYXJlZCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4KikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHM7XCRSQU5MSUIgXCRsaWIiCisgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICBmaQorICA7OworZXNhYworCitlY2hvICIkYWNfdCRlbmFibGVfc2hhcmVkIiAxPiY2CisKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisKK2VjaG8gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAkZW5hYmxlX3N0YXRpYyIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRhY19jIiAxPiY2CitybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIG9iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsCitlY2hvICIkYWNfdCRvYmpkaXIiIDE+JjYKKworIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCwgYmVjYXVzZSBpdCBpcworIyB1c2VkIGxhdGVyLgorbHRlY2hvPSIkZWNobyIKKworIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycy4KK2ZvciB2YXIgaW4gbHRlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBvbGRfTEQgb2xkX05NIG9sZF9SQU5MSUIgXAorICBvbGRfTE5fUyBBUiBDQyBMRCBMTl9TIE5NIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIHdsIHBpY19mbGFnIFwKKyAgbGlua19zdGF0aWNfZmxhZyBub19idWlsdGluX2ZsYWcgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKKyAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBSQU5MSUIgXAorICBvbGRfYXJjaGl2ZV9jbWRzIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAorICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBwb3N0aW5zdGFsbF9jbWRzIHBvc3R1bmluc3RhbGxfY21kcyBcCisgIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKKyAgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgZ2xvYmFsX3N5bWJvbF9waXBlIFwKKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yOyBkbworCisgIGNhc2UgIiR2YXIiIGluCisgIHJlbG9hZF9jbWRzIHwgb2xkX2FyY2hpdmVfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCisgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IGFyY2hpdmVfY21kcyB8IFwKKyAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IGZpbmlzaF9jbWRzKQorICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICBldmFsICIkdmFyPVxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYCIKKyAgICA7OworICAqKQorICAgIGV2YWwgIiR2YXI9XGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGAiCisgICAgOzsKKyAgZXNhYworZG9uZQorCitvZmlsZT1saWJ0b29sCit0cmFwICIkcm0gJG9maWxlOyBleGl0IDEiIDEgMiAxNQorZWNobyBjcmVhdGluZyAkb2ZpbGUKKyRybSAkb2ZpbGUKK2NhdCA8PEVPRiA+ICRvZmlsZQorIyEgL2Jpbi9zaAorCisjIGxpYnRvb2wgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04KKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRjb25maWcgb3IgbHRtYWluLnNoLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBUaGlzIHByb2dyYW0gd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjIENDPSIkb2xkX0NDIiBDRkxBR1M9IiRvbGRfQ0ZMQUdTIiBDUFBGTEFHUz0iJG9sZF9DUFBGTEFHUyIgXFwKKyMgTEQ9IiRvbGRfTEQiIE5NPSIkb2xkX05NIiBSQU5MSUI9IiRvbGRfUkFOTElCIiBMTl9TPSIkb2xkX0xOX1MiIFxcCisjICAgJDAkbHRjb25maWdfYXJncworIworIyBDb21waWxlciBhbmQgb3RoZXIgdGVzdCBvdXRwdXQgcHJvZHVjZWQgYnkgJHByb2duYW1lLCB1c2VmdWwgZm9yCisjIGRlYnVnZ2luZyAkcHJvZ25hbWUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSJzZWQgLWUgcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiXCR7Q0RQQVRIK3NldH0iID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0iJGx0ZWNobyIKKworIyBUaGUgdmVyc2lvbiBvZiAkcHJvZ25hbWUgdGhhdCBnZW5lcmF0ZWQgdGhpcyBzY3JpcHQuCitMVENPTkZJR19WRVJTSU9OPSIkVkVSU0lPTiIKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBsaWJ0b29sIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIG9sZC1zdHlsZSBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9IiRob3N0X2FsaWFzIgoraG9zdD0iJGhvc3QiCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9IiRBUiIKKworIyBUaGUgZGVmYXVsdCBDIGNvbXBpbGVyLgorQ0M9IiRDQyIKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9IiRMRCIKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0iJExOX1MiCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09IiROTSIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9IiRvYmpkaXIiCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSIkcmVsb2FkX2ZsYWciCityZWxvYWRfY21kcz0iJHJlbG9hZF9jbWRzIgorCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0iJHdsIgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSIkcGljX2ZsYWciCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9IiRsaW5rX3N0YXRpY19mbGFnIgorCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9IiRub19idWlsdGluX2ZsYWciCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0iJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyIKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9IiRsaWJuYW1lX3NwZWMiCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0iJGxpYnJhcnlfbmFtZXNfc3BlYyIKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSIkc29uYW1lX3NwZWMiCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0iJFJBTkxJQiIKK29sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzIgorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kcyIKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9IiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIgorCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHMiCitwb3N0aW5zdGFsbF9jbWRzPSIkcG9zdGluc3RhbGxfY21kcyIKK3Bvc3R1bmluc3RhbGxfY21kcz0iJHBvc3R1bmluc3RhbGxfY21kcyIKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9IiRmaW5pc2hfY21kcyIKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9IiRmaW5pc2hfZXZhbCIKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSIkZ2xvYmFsX3N5bWJvbF9waXBlIgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgorCisjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9IiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0iJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgorCitFT0YKKworY2FzZSAiJGhvc3Rfb3MiIGluCithaXgzKikKKyAgY2F0IDw8XEVPRiA+PiAkb2ZpbGUKKyMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCitpZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorCitFT0YKKyAgOzsKK2VzYWMKKworIyBBcHBlbmQgdGhlIGx0bWFpbi5zaCBzY3JpcHQuCitjYXQgIiRsdG1haW4iID4+ICRvZmlsZSB8fCAocm0gLWYgJG9maWxlOyBleGl0IDEpCisKK2NobW9kICt4ICRvZmlsZQorZXhpdCAwCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOnNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjoyCisjIEVuZDoKZGlmZiAtLWdpdCBhL2x0bWFpbi5zaCBiL2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM1MGIzCi0tLSAvZGV2L251bGwKKysrIGIvbHRtYWluLnNoCkBAIC0wLDAgKzEsMjQ1MyBAQAorIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gbHRjb25maWcuCisjCisjIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KK3Byb2duYW1lPWAkZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCittb2RlbmFtZT0iJHByb2duYW1lIgorCisjIENvbnN0YW50cy4KK1BST0dSQU09bHRtYWluLnNoCitQQUNLQUdFPWxpYnRvb2wKK1ZFUlNJT049MS4yCisKK2RlZmF1bHRfbW9kZT0KK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKK21rZGlyPSJta2RpciIKK212PSJtdiAtZiIKK3JtPSJybSAtZiIKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9J3NlZCAtZSBzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJworCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgorIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKKyMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCisKK2lmIHRlc3QgIiRMVENPTkZJR19WRVJTSU9OIiAhPSAiJFZFUlNJT04iOyB0aGVuCisgIGVjaG8gIiRtb2RlbmFtZTogbHRjb25maWcgdmVyc2lvbiBcYCRMVENPTkZJR19WRVJTSU9OJyBkb2VzIG5vdCBtYXRjaCAkUFJPR1JBTSB2ZXJzaW9uIFxgJFZFUlNJT04nIiAxPiYyCisgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgIGV4aXQgMQorZmkKKworaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgIGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgorICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgR2xvYmFsIHZhcmlhYmxlcy4KK21vZGU9JGRlZmF1bHRfbW9kZQorbm9ub3B0PQorcHJldj0KK3ByZXZvcHQ9CitydW49CitzaG93PSIkZWNobyIKK3Nob3dfaGVscD0KK2V4ZWN1dGVfZGxmaWxlcz0KKworIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KK3doaWxlIHRlc3QgJCMgLWd0IDAKK2RvCisgIGFyZz0iJDEiCisgIHNoaWZ0CisKKyAgY2FzZSAiJGFyZyIgaW4KKyAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBvcHRhcmc9IDs7CisgIGVzYWMKKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgY2FzZSAiJHByZXYiIGluCisgICAgZXhlY3V0ZV9kbGZpbGVzKQorICAgICAgZXZhbCAiJHByZXY9XCJcJCRwcmV2IFwkYXJnXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICIkcHJldj1cJGFyZyIKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgcHJldj0KKyAgICBwcmV2b3B0PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PworICBjYXNlICIkYXJnIiBpbgorICAtLWhlbHApCisgICAgc2hvd19oZWxwPXllcworICAgIDs7CisKKyAgLS12ZXJzaW9uKQorICAgIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OIgorICAgIGV4aXQgMAorICAgIDs7CisKKyAgLS1kcnktcnVuIHwgLW4pCisgICAgcnVuPToKKyAgICA7OworCisgIC0tZmVhdHVyZXMpCisgICAgZWNobyAiaG9zdDogJGhvc3QiCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGV4aXQgMAorICAgIDs7CisKKyAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKKworICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7CisgIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OworCisgIC0tcXVpZXQgfCAtLXNpbGVudCkKKyAgICBzaG93PToKKyAgICA7OworCisgIC1kbG9wZW4pCisgICAgcHJldm9wdD0iLWRsb3BlbiIKKyAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcworICAgIDs7CisKKyAgLSopCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgICAgOzsKKworICAqKQorICAgIG5vbm9wdD0iJGFyZyIKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCisgICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCitmaQorCitpZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgorCisgICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgorICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKyAgICBjYXNlICIkbm9ub3B0IiBpbgorICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyopCisgICAgICBtb2RlPWxpbmsKKyAgICAgIGZvciBhcmcKKyAgICAgIGRvCisgICAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAgIC1jKQorICAgICAgICAgICBtb2RlPWNvbXBpbGUKKyAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICAqZGIgfCAqZGJ4KQorICAgICAgbW9kZT1leGVjdXRlCisgICAgICA7OworICAgICppbnN0YWxsKnxjcHxtdikKKyAgICAgIG1vZGU9aW5zdGFsbAorICAgICAgOzsKKyAgICAqcm0pCisgICAgICBtb2RlPXVuaW5zdGFsbAorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KKyAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQorCisgICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgorICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLW4gIiRub25vcHQiOyB0aGVuCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIGZyb20gXGAkbm9ub3B0JyIgMT4mMgorICAgICAgICBlbHNlCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIHdpdGhvdXQgTU9ERS1BUkdTIiAxPiYyCisgICAgICAgIGZpCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KKyAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKKyAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKKworICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgIGdlbmVyaWNfaGVscD0iJGhlbHAiCisgIGhlbHA9IlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyAgIyBUaGVzZSBtb2RlcyBhcmUgaW4gb3JkZXIgb2YgZXhlY3V0aW9uIGZyZXF1ZW5jeSBzbyB0aGF0IHRoZXkgcnVuIHF1aWNrbHkuCisgIGNhc2UgIiRtb2RlIiBpbgorICAjIGxpYnRvb2wgY29tcGlsZSBtb2RlCisgIGNvbXBpbGUpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogY29tcGlsZSIKKyAgICAjIEdldCB0aGUgY29tcGlsYXRpb24gY29tbWFuZCBhbmQgdGhlIHNvdXJjZSBmaWxlLgorICAgIGJhc2VfY29tcGlsZT0KKyAgICBsYXN0YXJnPQorICAgIHNyY2ZpbGU9IiRub25vcHQiCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICAjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLW8pCisJJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZW5hbWUgd2l0aCBcYC1vJyIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorCWV4aXQgMQorCTs7CisKKyAgICAgIC1zdGF0aWMpCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCisgICAgICBsYXN0YXJnPSIkc3JjZmlsZSIKKyAgICAgIHNyY2ZpbGU9IiRhcmciCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCisKKyAgICAgICMgQmFja3NsYXNoaWZ5IGFueSBiYWNrc2xhc2hlcywgZG91YmxlIHF1b3RlcywgYW5kIGRvbGxhciBzaWducy4KKyAgICAgICMgVGhlc2UgYXJlIHRoZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgc3BlY2lhbGx5CisgICAgICAjIGludGVycHJldGVkIGluc2lkZSBvZiBkb3VibGUtcXVvdGVkIHNjcmluZ3MuCisgICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKworICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkgaW4gc2NhbgorICAgICAgIyBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICBjYXNlICIkbGFzdGFyZyIgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgorICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KKwliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgorICAgICAgZWxzZQorCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgIGxpYm9iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgIyBSZWNvZ25pemUgc2V2ZXJhbCBkaWZmZXJlbnQgZmlsZSBzdWZmaXhlcy4KKyAgICB4Zm9ybT0nW2NDRlNmbXNdJworICAgIGNhc2UgIiRsaWJvYmoiIGluCisgICAgKi5hZGEpIHhmb3JtPWFkYSA7OworICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKKyAgICAqLmFkcykgeGZvcm09YWRzIDs7CisgICAgKi5hc20pIHhmb3JtPWFzbSA7OworICAgICouYysrKSB4Zm9ybT1jKysgOzsKKyAgICAqLmNjKSB4Zm9ybT1jYyA7OworICAgICouY3BwKSB4Zm9ybT1jcHAgOzsKKyAgICAqLmN4eCkgeGZvcm09Y3h4IDs7CisgICAgKi5mOTApIHhmb3JtPWY5MCA7OworICAgICouZm9yKSB4Zm9ybT1mb3IgOzsKKyAgICBlc2FjCisKKyAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCisKKyAgICBjYXNlICIkbGlib2JqIiBpbgorICAgICoubG8pIG9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzL1wubG8kLy5vLydgIDs7CisgICAgKikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJHNyY2ZpbGUnIiAxPiYyCisgICAgICBleGl0IDEKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagorICAgICAgdHJhcCAiJHJ1biAkcm0gJG9iaiAkbGlib2JqOyBleGl0IDEiIDEgMiAxNQorICAgIGVsc2UKKyAgICAgICRydW4gJHJtICRsaWJvYmoKKyAgICAgIHRyYXAgIiRydW4gJHJtICRsaWJvYmo7IGV4aXQgMSIgMSAyIDE1CisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgorICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCisKKyAgICAgICMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCisgICAgICAkc2hvdyAiJGJhc2VfY29tcGlsZSRwaWNfZmxhZyAtRFBJQyAkc3JjZmlsZSIKKyAgICAgIGlmICRydW4gZXZhbCAiJGJhc2VfY29tcGlsZVwkcGljX2ZsYWcgLURQSUMgXCRzcmNmaWxlIjsgdGhlbiA6CisgICAgICBlbHNlCisgICAgICAgIHRlc3QgLW4gIiRvYmoiICYmICRydW4gJHJtICRvYmoKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorCisgICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KKyAgICAgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyI7IHRoZW4KKyAgICAgICAgJHNob3cgIiRMTl9TICRvYmogJGxpYm9iaiIKKyAgICAgICAgJHJ1biAkTE5fUyAkb2JqICRsaWJvYmoKKyAgICAgICAgZXhpdCAkPworICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQorICAgICAgJHNob3cgIiRtdiAkb2JqICRsaWJvYmoiCisgICAgICAkcnVuICRtdiAkb2JqICRsaWJvYmogfHwgZXhpdCAxCisKKyAgICAgICMgQWxsb3cgZXJyb3IgbWVzc2FnZXMgb25seSBmcm9tIHRoZSBmaXJzdCBjb21waWxhdGlvbi4KKyAgICAgIHN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKKyAgICBmaQorCisgICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgorICAgICAgJHNob3cgIiRiYXNlX2NvbXBpbGUgJHNyY2ZpbGUkc3VwcHJlc3Nfb3V0cHV0IgorICAgICAgaWYgJHJ1biBldmFsICIkYmFzZV9jb21waWxlIFwkc3JjZmlsZSRzdXBwcmVzc19vdXRwdXQiOyB0aGVuIDoKKyAgICAgIGVsc2UKKyAgICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG8gbm90CisgICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisgICAgICAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gXCRsaWJvYmoiIHx8IGV4aXQgJD8KKyAgICBmaQorCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgbGluayBtb2RlCisgIGxpbmspCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKKyAgICBDQz0iJG5vbm9wdCIKKyAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgY29tcGlsZV9jb21tYW5kPSIkQ0MiCisgICAgZmluYWxpemVfY29tbWFuZD0iJENDIgorCisgICAgY29tcGlsZV9zaGxpYnBhdGg9CisgICAgZmluYWxpemVfc2hsaWJwYXRoPQorICAgIGRlcGxpYnM9CisgICAgZGxmaWxlcz0KKyAgICBkbHByZWZpbGVzPQorICAgIGV4cG9ydF9keW5hbWljPW5vCisgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICBsaWJvYmpzPQorICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9CisgICAgbHRsaWJzPQorICAgIG9ianM9CisgICAgcHJldj0KKyAgICBwcmV2YXJnPQorICAgIHJlbGVhc2U9CisgICAgcnBhdGg9CisgICAgcGVybV9ycGF0aD0KKyAgICB0ZW1wX3JwYXRoPQorICAgIHZpbmZvPQorCisgICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKKyAgICAgICAgaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCisgICAgICAgIGZpCisgICAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworICAgICAgICBicmVhaworICAgICAgICA7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KKyAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCisKKyAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAgIGNhc2UgIiRwcmV2IiBpbgorICAgICAgICBvdXRwdXQpCisgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgorICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBPVVRQVVRAIgorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICIkcHJldiIgaW4KKyAgICAgICAgZGxmaWxlc3xkbHByZWZpbGVzKQorICAgICAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAgICAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KKyAgICAgICAgICAqKQorICAgICAgICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKKyAgICAgICAgICAgIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKyAgICAgICAgICAgIHByZXY9CisgICAgICAgICAgICA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKyAgICAgICAgcnBhdGgpCisgICAgICAgICAgcnBhdGg9IiRycGF0aCAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworICAgICAgICAqKQorICAgICAgICAgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKKyAgICAgICAgICBwcmV2PQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgZmkKKworICAgICAgcHJldmFyZz0iJGFyZyIKKworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgIC1hbGwtc3RhdGljKQorCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorICAgICAgICBmaQorICAgICAgICBjb250aW51ZQorCTs7CisKKyAgICAgIC1hbGxvdy11bmRlZmluZWQpCisJIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgorCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCisJY29udGludWUKKwk7OworCisgICAgICAtZGxvcGVuKQorICAgICAgICBwcmV2PWRsZmlsZXMKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgLWRscHJlb3BlbikKKyAgICAgICAgcHJldj1kbHByZWZpbGVzCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgIC1leHBvcnQtZHluYW1pYykKKyAgICAgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCisJICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisJICBlbHNlCisJICAgIGFyZz0KKwkgIGZpCisKKyAgICAgICAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBTWU1GSUxFQCIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgLUwqKQorICAgICAgICBkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLUxcKC4qXCkkJVwxJSdgCisgICAgICAgIGNhc2UgIiRkaXIiIGluCisgICAgICAgIC8qIHwgW0EtWmEtel06XFwqKQorCSAgIyBBZGQgdGhlIGNvcnJlc3BvbmRpbmcgaGFyZGNvZGVfbGliZGlyX2ZsYWcsIGlmIGl0IGlzIG5vdCBpZGVudGljYWwuCisgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYC1MJGRpcicgY2Fubm90IHNwZWNpZnkgYSByZWxhdGl2ZSBkaXJlY3RvcnkiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisgICAgICAgIDs7CisKKyAgICAgIC1sKikgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIgOzsKKworICAgICAgLW5vLXVuZGVmaW5lZCkKKwlhbGxvd191bmRlZmluZWQ9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcmVsZWFzZSkKKwlwcmV2PXJlbGVhc2UKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1ycGF0aCkKKyAgICAgICAgcHJldj1ycGF0aAorICAgICAgICBjb250aW51ZQorICAgICAgICA7OworCisgICAgICAtc3RhdGljKQorCSMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiB0aGlzIGlzIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljLgorCWlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisgICAgICAgIGZpCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorICAgICAgICBwcmV2PXZpbmZvCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKwkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKKwkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwljYXNlICIkYXJnIiBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworICAgICAgICA7OworCisgICAgICAqLm8gfCAqLmEpCisgICAgICAgICMgQSBzdGFuZGFyZCBvYmplY3QuCisgICAgICAgIG9ianM9IiRvYmpzICRhcmciCisgICAgICAgIDs7CisKKyAgICAgICoubG8pCisgICAgICAgICMgQSBsaWJyYXJ5IG9iamVjdC4KKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgIGVsc2UKKwkgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkgICAgcHJldj1kbHByZWZpbGVzCisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKKwkgIHByZXY9CisJZmkKKwlsaWJvYmpzPSIkbGlib2JqcyAkYXJnIgorICAgICAgICA7OworCisgICAgICAqLmxhKQorICAgICAgICAjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKyAgICAgICAgZGxuYW1lPQorICAgICAgICBsaWJkaXI9CisgICAgICAgIGxpYnJhcnlfbmFtZXM9CisgICAgICAgIG9sZF9saWJyYXJ5PQorCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisgICAgICAgIGlmIChzZWQgLWUgJzJxJyAkYXJnIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgICAgICAgZWxzZQorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisKKyAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisgICAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAgICovKiB8ICpcXCopIC4gJGFyZyA7OworICAgICAgICAqKSAuIC4vJGFyZyA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGNvbnRhaW5zIG5vIC1ycGF0aCBpbmZvcm1hdGlvbiIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorCisgICAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KKyAgICAgICAgbGlua2xpYj0KKyAgICAgICAgZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworICAgICAgICAgIGxpbmtsaWI9IiRsIgorICAgICAgICBkb25lCisKKyAgICAgICAgaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGFyZyciIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKworICAgICAgICAjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KKyAgICAgICAgbmFtZT1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKKyAgICAgICAgZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICAgICAgaWYgdGVzdCAiWCRkaXIiID0gIlgkYXJnIjsgdGhlbgorICAgICAgICAgIGRpcj0iJG9iamRpciIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRpcj0iJGRpci8kb2JqZGlyIgorICAgICAgICBmaQorCisgICAgICAgICMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorICAgICAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisgICAgICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKyAgICAgICAgICBpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIHdlIG5lZWQgdG8gcHJlbG9hZC4KKyAgICAgICAgICAgIHByZXY9ZGxwcmVmaWxlcworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgV2Ugc2hvdWxkIG5vdCBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbGlicmFyeSwgYnV0IHdlCisJICAgICMgbWF5IG5lZWQgYW55IGxpYnJhcmllcyBpdCByZXF1aXJlcy4KKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgorICAgICAgICAgICAgcHJldj0KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICAjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgorICAgICAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisgICAgICAgICAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisgICAgICAgICAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorICAgICAgICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKKyAgICAgICAgICBmaQorICAgICAgICAgIHByZXY9CisgICAgICAgIGZpCisKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisgICAgICAgICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0iJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMgJGFyZyIKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKyAgICAgICAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KKyAgICAgICAgICAgICoiICRkaXIgIiopIDs7CisgICAgICAgICAgICAqKSB0ZW1wX3JwYXRoPSIkdGVtcF9ycGF0aCAkZGlyIiA7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgIGZpCisKKwkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKyAgICAgICAgICAgICAgICAjIFB1dCB0aGUgbWFnaWMgbGliZGlyIHdpdGggdGhlIGhhcmRjb2RlIGZsYWcuCisgICAgICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKyAgICAgICAgICAgICAgICBsaWJkaXI9IkBIQVJEQ09ERV9MSUJESVJTQCIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkJY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgorCQkqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCSAgOzsKKwkJKikKKwkJICBoYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJICA7OworCQllc2FjCisgICAgICAgICAgICAgICAgbGliZGlyPQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGxpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZmxhZyIKKyAgICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZsYWciCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorICAgICAgICAgICAgIyBEbyB0aGUgc2FtZSBmb3IgdGhlIHBlcm1hbmVudCBydW4gcGF0aC4KKyAgICAgICAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKyAgICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7CisgICAgICAgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgIGZpCisKKworICAgICAgICAgIGNhc2UgIiRoYXJkY29kZV9hY3Rpb24iIGluCisgICAgICAgICAgaW1tZWRpYXRlKQorICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKKyAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgorICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgorICAgICAgICAgICAgICBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGRpcjoiCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisKKyAgICAgICAgICByZWxpbmspCisgICAgICAgICAgICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKyAgICAgICAgICAgIGNhc2UgIiRkaXIiIGluCisgICAgICAgICAgICAvKiB8IFtBLVphLXpdOlxcKikgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKKyAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZGlyPSIkYWJzZGlyIgorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworCisgICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKKyAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKKyAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKworICAgICAgICAgICopCisgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRoYXJkY29kZV9hY3Rpb24nIGlzIGFuIHVua25vd24gaGFyZGNvZGUgYWN0aW9uIiAxPiYyCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworCisgICAgICAgICAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KKyAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpYmRpci8kbGlua2xpYiIKKyAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkbGliZGlyIC1sJG5hbWUiCisgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IgorICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLWwkbmFtZSIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkbGliZGlyIC1sJG5hbWUiCisgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgVHJhbnNmb3JtIGRpcmVjdGx5IHRvIG9sZCBhcmNoaXZlcyBpZiB3ZSBkb24ndCBidWlsZCBuZXcgbGlicmFyaWVzLgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgJiYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgc3RhdGljIGxpYnJhcnkgZm9yIFxgJGFyZyciIDE+JjIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIGZpCisKKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorCSAgZWxzZQorCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgorCSAgZmkKKyAgICAgICAgZmkKKworCSMgQWRkIGluIGFueSBsaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCisJY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGFyZ3VtZW50LgorICAgICAgKikKKwkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKKwkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwljYXNlICIkYXJnIiBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggXGAtdmVyc2lvbi1pbmZvJyBhbmQgXGAtcmVsZWFzZSciIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIG9sZGxpYj0KKyAgICBvbGRvYmpzPQorICAgIGNhc2UgIiRvdXRwdXQiIGluCisgICAgIiIpCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKworICAgICovKiB8ICpcXCopCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiBvdXRwdXQgZmlsZSBcYCRvdXRwdXQnIG11c3QgaGF2ZSBubyBkaXJlY3RvcnkgY29tcG9uZW50cyIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworCisgICAgKi5hKQorICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIGJ1aWxkX29sZF9saWJzPXllcworICAgICAgb2xkbGliPSIkb3V0cHV0IgorICAgICAgJHNob3cgIiRybSAkb2xkbGliIgorICAgICAgJHJ1biAkcm0gJG9sZGxpYgorICAgICAgOzsKKworICAgICoubGEpCisgICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCisgICAgICBjYXNlICIkb3V0cHV0IiBpbgorICAgICAgbGliKikgOzsKKyAgICAgICopCisJJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJGFyZycgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorCWV4aXQgMQorCTs7CisgICAgICBlc2FjCisKKyAgICAgIG5hbWU9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorICAgICAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisKKyAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KKyAgICAgIGxpYnJhcnlfbmFtZXM9CisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIGRsbmFtZT0KKyAgICAgIGN1cnJlbnQ9MAorICAgICAgcmV2aXNpb249MAorICAgICAgYWdlPTAKKworICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHM6JG9ianMiIDI+JjEKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorCisgICAgICAjIEhvdyB0aGUgaGVjayBhcmUgd2Ugc3VwcG9zZWQgdG8gd3JpdGUgYSB3cmFwcGVyIGZvciBhIHNoYXJlZCBsaWJyYXJ5PworICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG1heSBub3QgZGVwZW5kIG9uIHVuaW5zdGFsbGVkIGxpYnJhcmllczokbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgorICAgICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB3aXRoIFxgLXJwYXRoJyIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIHNldCBkdW1teSAkcnBhdGgKKyAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgorICAgICAgZmkKKyAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKKworICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKyAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCisgICAgICBzZXQgZHVtbXkgJHZpbmZvCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKworICAgICAgaWYgdGVzdCAtbiAiJDUiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgorICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorCisgICAgICB0ZXN0IC1uICIkMiIgJiYgY3VycmVudD0iJDIiCisgICAgICB0ZXN0IC1uICIkMyIgJiYgcmV2aXNpb249IiQzIgorICAgICAgdGVzdCAtbiAiJDQiICYmIGFnZT0iJDQiCisKKyAgICAgICMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCisgICAgICBjYXNlICIkY3VycmVudCIgaW4KKyAgICAgIDAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OworICAgICAgKikKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogQ1VSUkVOVCBcYCRjdXJyZW50JyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAiJHJldmlzaW9uIiBpbgorICAgICAgMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7CisgICAgICAqKQorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgIGNhc2UgIiRhZ2UiIGluCisgICAgICAwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKKyAgICAgICopCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0ICRhZ2UgLWd0ICRjdXJyZW50OyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKyAgICAgIHZlcnNpb25fdmFycz0idmVyc2lvbl90eXBlIGN1cnJlbnQgYWdlIHJldmlzaW9uIgorICAgICAgY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KKyAgICAgIG5vbmUpIDs7CisKKyAgICAgIGxpbnV4KQorICAgICAgICB2ZXJzaW9uX3ZhcnM9IiR2ZXJzaW9uX3ZhcnMgbWFqb3IgdmVyc3VmZml4IgorICAgICAgICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisgICAgICAgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorICAgICAgICA7OworCisgICAgICBvc2YpCisgICAgICAgIHZlcnNpb25fdmFycz0iJHZlcnNpb25fdmFycyB2ZXJzdWZmaXggdmVyc3RyaW5nIgorICAgICAgICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisgICAgICAgIHZlcnN1ZmZpeD0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisgICAgICAgIHZlcnN0cmluZz0iJHZlcnN1ZmZpeCIKKworICAgICAgICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorICAgICAgICBsb29wPSRhZ2UKKyAgICAgICAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbworICAgICAgICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCisgICAgICAgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCisgICAgICAgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCisgICAgICAgIGRvbmUKKworICAgICAgICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisgICAgICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2N1cnJlbnR9LjAiCisgICAgICAgIDs7CisKKyAgICAgIHN1bm9zKQorICAgICAgICB2ZXJzaW9uX3ZhcnM9IiR2ZXJzaW9uX3ZhcnMgbWFqb3IgdmVyc3VmZml4IgorICAgICAgICBtYWpvcj0iJGN1cnJlbnQiCisgICAgICAgIHZlcnN1ZmZpeD0iJGN1cnJlbnQuJHJldmlzaW9uIgorICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciIDE+JjIKKyAgICAgICAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBvciByZW1vdmUgb3VyIG91dHB1dHMgaWYgd2UgbmVlZCB0by4KKyAgICAgIGlmIHRlc3QgLWQgJG9iamRpcjsgdGhlbgorICAgICAgICAkc2hvdyAiJHJtICRvYmpkaXIvJG91dHB1dCAkb2JqZGlyLyRsaWJuYW1lLiogJG9iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qIgorICAgICAgICAkcnVuICRybSAkb2JqZGlyLyRvdXRwdXQgJG9iamRpci8kbGlibmFtZS4qICRvYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKgorICAgICAgZWxzZQorICAgICAgICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCisgICAgICAgICRydW4gJG1rZGlyICRvYmpkaXIKKwlzdGF0dXM9JD8KKwlpZiB0ZXN0ICRzdGF0dXMgLWVxIDAgfHwgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKKwllbHNlCisJICBleGl0ICRzdGF0dXMKKwlmaQorICAgICAgZmkKKworICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorICAgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgorICAgICAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgYnVpbGRfb2xkX2xpYnM9eWVzCisgICAgICAgIGZpCisgICAgICBlbHNlCisgICAgICAgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCisgICAgICBmaQorCisgICAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIHN5c3RlbXMuCisgICAgICBkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgorICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgICAjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCisgICAgICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworICAgICAgICByZWFsbmFtZT0iJDIiCisgICAgICAgIHNoaWZ0OyBzaGlmdAorCisgICAgICAgIGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKyAgICAgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKyAgICAgICAgZmkKKworICAgICAgICBsaWI9IiRvYmpkaXIvJHJlYWxuYW1lIgorCWZvciBsaW5rCisJZG8KKwkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwlkb25lCisKKyAgICAgICAgIyBVc2Ugc3RhbmRhcmQgb2JqZWN0cyBpZiB0aGV5IGFyZSBQSUMuCisgICAgICAgIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy9nJ2AKKworICAgICAgICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCisgICAgICAgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorICAgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgICBkb25lCisgICAgICAgIElGUz0iJHNhdmVfaWZzIgorCisgICAgICAgICMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCisgICAgICAgIGZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbworICAgICAgICAgICRzaG93ICIoY2QgJG9iamRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKKyAgICAgICAgICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/CisgICAgICAgIGRvbmUKKworICAgICAgICAjIElmIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KKyAgICAgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgorICAgICAgICAgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgorICAgICAgICAgIGRsbmFtZT0iJHNvbmFtZSIKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgb2xkbGliPSIkb2JqZGlyLyRsaWJuYW1lLmEiCisgICAgICA7OworCisgICAgKi5sbyB8ICoubykKKyAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byByZWxvYWRhYmxlIG9iamVjdHMiIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgY2FzZSAiJG91dHB1dCIgaW4KKyAgICAgICoubG8pCisgICAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICBsaWJvYmo9IiRvdXRwdXQiCisgICAgICAgIG9iaj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzL1wubG8kLy5vLydgCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBsaWJvYmo9CisgICAgICAgIG9iaj0iJG91dHB1dCIKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgorICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzImAkZWNobyAiWCRsaWJvYmpzICIgfCAkWHNlZCAtZSAncy9bXiAgICAgICBdKlwuYSAvL2cnIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vZydgCisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCisgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIHRlc3QgLXogIiRsaWJvYmoiICYmIGV4aXQgMAorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKyAgICAgICAgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKyAgICAgICAgJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKyAgICAgICAgZXhpdCAwCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCisgICAgICAgICMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCisgICAgICAgIHJlbG9hZF9vYmpzPSIkbGlib2JqcyIKKyAgICAgICAgb3V0cHV0PSIkbGlib2JqIgorICAgICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgorICAgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgICBkb25lCisgICAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgICAgZWxzZQorICAgICAgICAjIEp1c3QgY3JlYXRlIGEgc3ltbGluay4KKyAgICAgICAgJHNob3cgIiRMTl9TICRvYmogJGxpYm9iaiIKKyAgICAgICAgJHJ1biAkTE5fUyAkb2JqICRsaWJvYmogfHwgZXhpdCAxCisgICAgICBmaQorCisgICAgICBleGl0IDAKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgd2hpbGUgbGlua2luZyBwcm9ncmFtcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwlmb3IgbGliZGlyIGluICRycGF0aDsgZG8KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKyAgICAgICAgICAgICAgICAjIFB1dCB0aGUgbWFnaWMgbGliZGlyIHdpdGggdGhlIGhhcmRjb2RlIGZsYWcuCisgICAgICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKyAgICAgICAgICAgICAgICBsaWJkaXI9IkBIQVJEQ09ERV9MSUJESVJTQCIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkJY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgorCQkqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCSAgOzsKKwkJKikKKwkJICBoYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJICA7OworCQllc2FjCisgICAgICAgICAgICAgICAgbGliZGlyPQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGxpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZmxhZyIKKyAgICAgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZsYWciCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorICAgICAgICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorICAgICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKKyAgICAgICAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIGNvbXBpbGUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVASEFSRENPREVfTElCRElSU0AlJGhhcmRjb2RlX2xpYmRpcnMlZyJgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVASEFSRENPREVfTElCRElSU0AlJGhhcmRjb2RlX2xpYmRpcnMlZyJgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgICAjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvLydgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vJ2AKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICAgICAgICBkbHN5bXM9IiR7b3V0cHV0fVMuYyIKKyAgICAgIGVsc2UKKyAgICAgICAgZGxzeW1zPQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KKyAgICAgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHByZWxvYWRlZCBsaXN0LgorICAgICAgICBkbHByZWZpbGVzPWAkZWNobyAiWCRvYmpzJGRscHJlZmlsZXMgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vJ2AKKworCSMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCisgICAgICAgIG5saXN0PSIkb2JqZGlyLyR7b3V0cHV0fS5ubSIKKworCWlmIHRlc3QgLWQgJG9iamRpcjsgdGhlbgorCSAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1UIgorCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9VCIKKwllbHNlCisJICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCisJICAkcnVuICRta2RpciAkb2JqZGlyCisJICBzdGF0dXM9JD8KKwkgIGlmIHRlc3QgJHN0YXR1cyAtZXEgMCB8fCB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgorCSAgZWxzZQorCSAgICBleGl0ICRzdGF0dXMKKwkgIGZpCisJZmkKKworICAgICAgICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbworCSAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCisJICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKyAgICAgICAgZG9uZQorCisgICAgICAgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCisgICAgICAgICRzaG93ICJjcmVhdGluZyAkb2JqZGlyLyRkbHN5bXMiCisgICAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAjIE1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBoYXZlIGFuIGVtcHR5IGZpbGUuCisJICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgorCisJICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorCSAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwkgICAgbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisJICAgIHdjb3V0PWB3YyAiJG5saXN0IiAyPi9kZXYvbnVsbGAKKwkgICAgY291bnQ9YGVjaG8gIlgkd2NvdXQiIHwgJFhzZWQgLWUgJ3MvXlsgCV0qXChbMC05XVswLTldKlwpLiokL1wxLydgCisJICAgICh0ZXN0ICIkY291bnQiIC1nZSAwKSAyPi9kZXYvbnVsbCB8fCBjb3VudD0tMQorCSAgZWxzZQorCSAgICAkcm0gIiRubGlzdCJUCisJICAgIGNvdW50PS0xCisJICBmaQorCisJICBjYXNlICIkZGxzeW1zIiBpbgorCSAgIiIpIDs7CisJICAqLmMpCisJICAgICRlY2hvID4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKKy8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0JyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKy8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCisjZGVmaW5lIGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50IHNvbWVfb3RoZXJfc3ltYm9sCisjZGVmaW5lIGRsZF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAorCisvKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAorIgorCisJICAgIGlmIHRlc3QgLWYgIiRubGlzdCI7IHRoZW4KKwkgICAgICBzZWQgLWUgJ3MvXi4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7LycgPCAiJG5saXN0IiA+PiAiJG9iamRpci8kZGxzeW1zIgorCSAgICBlbHNlCisJICAgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvYmpkaXIvJGRsc3ltcyIKKwkgICAgZmkKKworCSAgICAkZWNobyA+PiAiJG9iamRpci8kZGxzeW1zIiAiXAorCisjdW5kZWYgZGxkX3ByZWxvYWRlZF9zeW1ib2xfY291bnQKKyN1bmRlZiBkbGRfcHJlbG9hZGVkX3N5bWJvbHMKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgX19wdHJfdCB2b2lkICoKKyNlbHNlCisjIGRlZmluZSBfX3B0cl90IGNoYXIgKgorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBkbGRfcHJlbG9hZGVkX3N5bWJvbHMsIC0xIGlmIHVuc29ydGVkLiAqLworaW50IGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50ID0gJGNvdW50OworCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK3N0cnVjdCB7CisgIGNoYXIgKm5hbWU7CisgIF9fcHRyX3QgYWRkcmVzczsKK30KK2RsZF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3tcCisiCisKKwkgICAgaWYgdGVzdCAtZiAiJG5saXN0IjsgdGhlbgorCSAgICAgIHNlZCAncy9eXCguKlwpIFwoLipcKSQvICB7IlwxIiwgKF9fcHRyX3QpIFwmXDJ9LC8nIDwgIiRubGlzdCIgPj4gIiRvYmpkaXIvJGRsc3ltcyIKKwkgICAgZmkKKworCSAgICAkZWNobyA+PiAiJG9iamRpci8kZGxzeW1zIiAiXAorICB7MCwgKF9fcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZlwKKyIKKwkgICAgOzsKKworCSAgKikKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKKwkgICAgZXhpdCAxCisJICAgIDs7CisJICBlc2FjCisgICAgICAgIGZpCisKKyAgICAgICAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KKyAgICAgICAgJHNob3cgIihjZCAkb2JqZGlyICYmICRDQyAtYyRub19idWlsdGluX2ZsYWcgXCIkZGxzeW1zXCIpIgorICAgICAgICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRDQyAtYyRub19idWlsdGluX2ZsYWcgIiRkbHN5bXMiKScgfHwgZXhpdCAkPworCisgICAgICAgICMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMubyUiYAorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMubyUiYAorICAgICAgZWxpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiICE9IHllczsgdGhlbgorICAgICAgICB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGFuZCBcYC1kbHByZW9wZW4nIGFyZSBpZ25vcmVkIHdpdGhvdXQgXGAtZXhwb3J0LWR5bmFtaWMnIiAxPiYyCisgICAgICBlbHNlCisgICAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisgICAgICAgICMgZGxkX3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisgICAgICAgICMgcmVhbGx5IHdhcyByZXF1aXJlZC4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCisKKyAgICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorICAgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAorCisgICAgICAgICMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorICAgICAgICAkc2hvdyAiJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgICAgJHJ1biBldmFsICIkY29tcGlsZV9jb21tYW5kIgorICAgICAgICBleGl0ICQ/CisgICAgICBmaQorCisgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvYmpkaXIvJG91dHB1dCInJWcnYAorICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvYmpkaXIvJG91dHB1dCInVCVnJ2AKKworICAgICAgIyBDcmVhdGUgdGhlIGJpbmFyeSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeSwgdGhlbiB3cmFwIGl0LgorICAgICAgaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKKyAgICAgIGVsc2UKKyAgICAgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgorCSRydW4gJG1rZGlyICRvYmpkaXIKKwlzdGF0dXM9JD8KKwlpZiB0ZXN0ICRzdGF0dXMgLWVxIDAgfHwgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKKwllbHNlCisJICBleGl0ICRzdGF0dXMKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgorICAgICAgICBycGF0aD0KKyAgICAgICAgZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KKyAgICAgICAgICBjYXNlICIkZGlyIiBpbgorICAgICAgICAgIC8qIHwgW0EtWmEtel06XFwqKQorICAgICAgICAgICAgIyBBYnNvbHV0ZSBwYXRoLgorICAgICAgICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgorICAgICAgICAgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBkb25lCisgICAgICAgIHRlbXBfcnBhdGg9IiRycGF0aCIKKyAgICAgIGZpCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCisgICAgICAkcnVuICRybSAkb3V0cHV0CisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCI7IHRoZW4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisgICAgICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisgICAgICAgIHJwYXRoPQorICAgICAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworICAgICAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKyAgICAgICAgZG9uZQorICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiRoYXJkY29kZV9hY3Rpb24iIGluCisgICAgICByZWxpbmspCisgICAgICAgICMgQUdIISBGbGFtZSB0aGUgQUlYIGFuZCBIUC1VWCBwZW9wbGUgZm9yIG1lLCB3aWxsIHlhPworICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1c2luZyBhIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogcmVsaW5raW5nIHdpbGwgYmUgcmVxdWlyZWQgYmVmb3JlIFxgJG91dHB1dCcgY2FuIGJlIGluc3RhbGxlZCIgMT4mMgorICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICAkc2hvdyAiJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgICRydW4gZXZhbCAiJGNvbXBpbGVfY29tbWFuZCIgfHwgZXhpdCAkPworCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUXVvdGUgdGhlIGZpbmFsaXplIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKKyAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgorICAgICAgcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KKyAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICAgICRybSAkb3V0cHV0CisgICAgICAgIHRyYXAgIiRybSAkb3V0cHV0OyBleGl0IDEiIDEgMiAxNQorCisgICAgICAgICRlY2hvID4gJG91dHB1dCAiXAorIyEgL2Jpbi9zaAorCisjICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dAorIyBHZW5lcmF0ZWQgYnkgbHRtYWluLnNoIC0gR05VICRQQUNLQUdFICRWRVJTSU9OCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiBcYGBwd2RgJy4KKyMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIHMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KK2lmIHRlc3QgXCJcJHtDRFBBVEgrc2V0fVwiID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KK2lmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgorICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKyAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0nJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMnCisgIGZpbmFsaXplX2NvbW1hbmQ9XCIkZmluYWxpemVfY29tbWFuZFwiCitlbHNlCisgICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KKyAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuIDoKKyAgZWxzZQorICAgIGVjaG89XCIkcWVjaG9cIgorICAgIGZpbGU9XCJcJDBcIgorICBmaVwKKyIKKyAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAorCisgICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCisgIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCisgIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KKworICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KKyAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCisgIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KKyAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKKworICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KKyAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCisgICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KKyAgICAgIC8qIHwgW0EtWmEtel06XFwqKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCisgIGRvbmUKKworICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgorICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCisgIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCisKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyAgcHJvZ3JhbT0nJG91dHB1dCcKKworICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgorCisgICAgICAgICMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgorICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisgICAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XGBcJGVjaG8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisgICAgICAgIGZpCisKKyAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCisKKyAgICAgICMgRXhwb3J0IHRoZSBwYXRoIHRvIHRoZSBwcm9ncmFtLgorICAgICAgUEFUSD1cIlwkcHJvZ2RpcjpcJFBBVEhcIgorICAgICAgZXhwb3J0IFBBVEgKKworICAgICAgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifQorCisgICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgIGVsc2UKKyAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCisgICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXCRwcm9nZGlyL1wkcHJvZ3JhbSBkb2VzIG5vdCBleGlzdFwiIDE+JjIKKyAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKKyAgICBlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpXAorIgorICAgICAgICBjaG1vZCAreCAkb3V0cHV0CisgICAgICBmaQorICAgICAgZXhpdCAwCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSAieWVzIjsgdGhlbgorICAgICAgIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgorICAgICAgb2xkb2Jqcz0iJG9ianMiYCRlY2hvICJYJGxpYm9ianMgIiB8ICRYc2VkIC1lICdzL1teICAgXSpcLmEgLy9nJyAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvL2cnYAorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXCIKKyAgICAgIGVsc2UKKwlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisgICAgICBmaQorICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKKyAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAkc2hvdyAiJGNtZCIKKyAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICBmaQorCisgICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCisgICAgY2FzZSAiJG91dHB1dCIgaW4KKyAgICAqLmxhKQorICAgICAgb2xkX2xpYnJhcnk9CisgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS5hIgorCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorICAgICAgICAkZWNobyA+ICRvdXRwdXQgIlwKKyMgJG91dHB1dCAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTgorCisjIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KK2RsbmFtZT0nJGRsbmFtZScKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKKworIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KK2N1cnJlbnQ9JGN1cnJlbnQKK2FnZT0kYWdlCityZXZpc2lvbj0kcmV2aXNpb24KKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPSckaW5zdGFsbF9saWJkaXInXAorIgorICAgICAgZmkKKworICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgorICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KKyAgICAgICRzaG93ICIoY2QgJG9iamRpciAmJiAkTE5fUyAuLi8kb3V0cHV0ICRvdXRwdXQpIgorICAgICAgJHJ1biBldmFsICIoY2QgJG9iamRpciAmJiAkTE5fUyAuLi8kb3V0cHV0ICRvdXRwdXQpIiB8fCBleGl0IDEKKyAgICAgIDs7CisgICAgZXNhYworICAgIGV4aXQgMAorICAgIDs7CisKKyAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQorICBpbnN0YWxsKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCisKKyAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCAvYmluL3NoIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KKyAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiOyB0aGVuCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJYXJnPSJcIiRhcmdcIiIKKwk7OworICAgICAgZXNhYworICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgIGVsc2UKKyAgICAgIGluc3RhbGxfcHJvZz0KKyAgICAgIGFyZz0iJG5vbm9wdCIKKyAgICBmaQorCisgICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgorICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKKyAgICAgIGFyZz0iXCIkYXJnXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgorCisgICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgorICAgIGRlc3Q9CisgICAgZmlsZXM9CisgICAgb3B0cz0KKyAgICBwcmV2PQorICAgIGluc3RhbGxfdHlwZT0KKyAgICBpc2Rpcj0KKyAgICBzdHJpcG1lPQorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCisgICAgICAgIGZpbGVzPSIkZmlsZXMgJGRlc3QiCisgICAgICAgIGRlc3Q9IiRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLWQpIGlzZGlyPXllcyA7OworICAgICAgLWYpIHByZXY9Ii1mIiA7OworICAgICAgLWcpIHByZXY9Ii1nIiA7OworICAgICAgLW0pIHByZXY9Ii1tIiA7OworICAgICAgLW8pIHByZXY9Ii1vIiA7OworICAgICAgLXMpCisgICAgICAgIHN0cmlwbWU9IiAtcyIKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKyAgICAgIC0qKSA7OworCisgICAgICAqKQorICAgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCisgICAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgICAgICAgIHByZXY9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkZXN0PSIkYXJnIgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCisgICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJYXJnPSJcIiRhcmdcIiIKKwk7OworICAgICAgZXNhYworICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgorICAgICAgZWxzZQorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iIDE+JjIKKyAgICAgIGZpCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KKyAgICBkZXN0PWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS8kJSUnYAorCisgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCisgICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcworICAgIGlmIHRlc3QgLW4gIiRpc2RpciI7IHRoZW4KKyAgICAgIGRlc3RkaXI9IiRkZXN0IgorICAgICAgZGVzdG5hbWU9CisgICAgZWxzZQorICAgICAgZGVzdGRpcj1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgICAgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGRlc3QiICYmIGRlc3RkaXI9LgorICAgICAgZGVzdG5hbWU9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgorICAgICAgc2V0IGR1bW15ICRmaWxlcworICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKKyAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKyAgICBmaQorICAgIGNhc2UgIiRkZXN0ZGlyIiBpbgorICAgIC8qIHwgW0EtWmEtel06XFwqKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisgICAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgICAqLmxvKSA7OworICAgICAgICAqKQorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKKyAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgc3RhdGljbGlicz0KKyAgICBmdXR1cmVfbGliZGlycz0KKyAgICBjdXJyZW50X2xpYmRpcnM9CisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCisgICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgorICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAqLmEpCisgICAgICAgICMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCisgICAgICAgIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgorICAgICAgICA7OworCisgICAgICAqLmxhKQorICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorICAgICAgICBpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgICAgICBlbHNlCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisgICAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisKKyAgICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgICAgb2xkX2xpYnJhcnk9CisgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorICAgICAgICBjYXNlICIkZmlsZSIgaW4KKyAgICAgICAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OworICAgICAgICAqKSAuIC4vJGZpbGUgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgICMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgICAgaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KKyAgICAgICAgICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KKyAgICAgICAgICAqIiAkbGliZGlyICIqKSA7OworICAgICAgICAgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KKyAgICAgICAgICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgorICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7CisgICAgICAgICAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKKworICAgICAgICBkaXI9ImAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLyIKKyAgICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KKyAgICAgICAgZGlyPSIkZGlyJG9iamRpciIKKworICAgICAgICAjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKyAgICAgICAgaWYgdGVzdCAtbiAiJDIiOyB0aGVuCisgICAgICAgICAgcmVhbG5hbWU9IiQyIgorICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgc2hpZnQKKworICAgICAgICAgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KKyAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCisgICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPworICAgICAgICAgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJHJlYWxuYW1lIiAmJiBkbG5hbWU9CisKKyAgICAgICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgICAgICAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLgorICAgICAgICAgICAgcm1jbWQ9IiRybSIKKyAgICAgICAgICAgIGZvciBsaW5rbmFtZQorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgcm1jbWQ9IiRybWNtZCAkZGVzdGRpci8kbGlua25hbWUiCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAkc2hvdyAiJHJtY21kIgorICAgICAgICAgICAgJHJ1biAkcm1jbWQKKworICAgICAgICAgICAgIyAuLi4gYW5kIGNyZWF0ZSBuZXcgb25lcy4KKyAgICAgICAgICAgIGZvciBsaW5rbmFtZQorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgdGVzdCAiWCRkbG5hbWUiID0gIlgkbGlua25hbWUiICYmIGRsbmFtZT0KKyAgICAgICAgICAgICAgJHNob3cgIihjZCAkZGVzdGRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKKyAgICAgICAgICAgICAgJHJ1biBldmFsICIoY2QgJGRlc3RkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisgICAgICAgICAgICAjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5LWxvYWRhYmxlIGxpYnJhcnkuCisgICAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIKKyAgICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIgfHwgZXhpdCAkPworICAgICAgICAgIGZpCisKKyAgICAgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisgICAgICAgICAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisgICAgICAgICAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgorICAgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCisgICAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKyAgICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgICAgJHNob3cgIiRjbWQiCisgICAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgICAgICBkb25lCisgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgIGZpCisKKyAgICAgICAgIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCisgICAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RkaXIvJG5hbWUiCisgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPworCisgICAgICAgICMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KKyAgICAgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKKyAgICAgICAgOzsKKworICAgICAgKi5sbykKKyAgICAgICAgIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCisKKyAgICAgICAgIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorICAgICAgICBpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisgICAgICAgICAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICAgICAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKyAgICAgICAgZmkKKworICAgICAgICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorICAgICAgICBjYXNlICIkZGVzdGZpbGUiIGluCisgICAgICAgICoubG8pCisgICAgICAgICAgc3RhdGljZGVzdD1gJGVjaG8gIlgkZGVzdGZpbGUiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCisgICAgICAgICAgOzsKKyAgICAgICAgKi5vKQorICAgICAgICAgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKyAgICAgICAgICBkZXN0ZmlsZT0KKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCisgICAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgICMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgorICAgICAgICBpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCisgICAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIgorICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KKyAgICAgICAgZmkKKworICAgICAgICAjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgICAgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisgICAgICAgICAgc3RhdGljb2JqPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzL1wubG8kL1wuby8nYAorCisgICAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKKyAgICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiB8fCBleGl0ICQ/CisgICAgICAgIGZpCisgICAgICAgIGV4aXQgMAorICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisgICAgICAgIGlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9CisgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0KKworICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorICAgICAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgICAgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKKyAgICAgICAgICAqKSAuIC4vJGZpbGUgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KKyAgICAgICAgICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgfHwgdGVzdCAteiAiJGZpbmFsaXplX2NvbW1hbmQiOyB0aGVuCisgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkZmlsZSciIDE+JjIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBmaW5hbGl6ZT15ZXMKKyAgICAgICAgICBmb3IgbGliIGluICRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzOyBkbworICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgorICAgICAgICAgICAgbGliZGlyPQorICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKyAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisgICAgICAgICAgICAgIGNhc2UgIiRsaWIiIGluCisgICAgICAgICAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OworICAgICAgICAgICAgICAqKSAuIC4vJGxpYiA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgbGliZmlsZT0iJGxpYmRpci9gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCIKKyAgICAgICAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgY29udGFpbnMgbm8gLXJwYXRoIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgICAgICBlbGlmIHRlc3QgLWYgIiRsaWJmaWxlIjsgdGhlbiA6CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCisgICAgICAgICAgICAgIGZpbmFsaXplPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKworICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCisgICAgICAgICAgICAgICRzaG93ICIkZmluYWxpemVfY29tbWFuZCIKKyAgICAgICAgICAgICAgaWYgJHJ1biBldmFsICIkZmluYWxpemVfY29tbWFuZCI7IHRoZW4gOgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZmlsZT0iJG9iamRpci8kZmlsZSJUCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgorICAgICAgICAgICAgZmkKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCisJICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyRzdHJpcG1lICRmaWxlICRkZXN0IgorICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdCIgfHwgZXhpdCAkPworICAgICAgICA7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbworICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCisgICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorCisgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkb2xkbGliIgorICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgfHwgZXhpdCAkPworCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisgICAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3RpbnN0YWxsX2NtZHNcIgorICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKKyAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAkc2hvdyAiJGNtZCIKKyAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCisgICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgorICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgorICAgICAgZXhlYyAkU0hFTEwgJDAgLS1maW5pc2gkY3VycmVudF9saWJkaXJzCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKKyAgZmluaXNoKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKKyAgICBsaWJkaXJzPSIkbm9ub3B0IgorCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGZvciBkaXIKKyAgICAgIGRvCisgICAgICAgIGxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCisgICAgICBkb25lCisKKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgorCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfY21kc1wiCisgICAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKKyAgICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgICAkc2hvdyAiJGNtZCIKKyAgICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIKKyAgICAgICAgICBkb25lCisgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCisJICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgorCSAgJHJ1biBldmFsICIkY21kcyIKKwlmaQorICAgICAgZG9uZQorICAgIGZpCisKKyAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgorICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisgICAgICBlY2hvICIgICAkbGliZGlyIgorICAgIGRvbmUKKyAgICBlY2hvCisgICAgZWNobyAiVG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwiCisgICAgZWNobyAieW91IG11c3QgdXNlIHRoZSBcYC1MTElCRElSJyBmbGFnIGR1cmluZyBsaW5raW5nLiIKKyAgICBlY2hvCisgICAgZWNobyAiIFlvdSB3aWxsIGFsc28gbmVlZCB0byBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorICAgICAgZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICBlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisgICAgICBsaWJkaXI9TElCRElSCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgIGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKKyAgICBmaQorICAgIGVjaG8KKyAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKKyAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCisgIGV4ZWN1dGUpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKKworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCisgICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbiA6CisgICAgICBlbHNlCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorCWV4aXQgMQorICAgICAgZmkKKworICAgICAgZGlyPQorICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAqLmxhKQorICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorICAgICAgICBpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgICAgICBlbHNlCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKyAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKworCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgorCWRsbmFtZT0KKwlsaWJyYXJ5X25hbWVzPQorCisgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCWNhc2UgIiRmaWxlIiBpbgorCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKKyAgICAgICAgKikgLiAuLyRmaWxlIDs7CisJZXNhYworCisJIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KKwkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKKwkgIGNvbnRpbnVlCisJZmkKKworCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisKKwlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KKwkgIGRpcj0iJGRpci8kb2JqZGlyIgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKKwkgIGV4aXQgMQorCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKwk7OworCisgICAgICAqKQorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKKyAgICAgICAgY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCisgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisgICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCisKKyAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCisgICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKKyAgICAgIGVsc2UKKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCisgICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgorCisgICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgorICAgIGFyZ3M9CisgICAgZm9yIGZpbGUKKyAgICBkbworICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAtKikgOzsKKyAgICAgICopCisgICAgICAgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKyAgICAgICAgaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgIiRmaWxlIiBpbgorCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSAgKikgLiAuLyRmaWxlIDs7CisJICBlc2FjCisKKwkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCisJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKKwlmaQorICAgICAgICA7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICAjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KKyAgICAgIGV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKworICAgICAgIyBOb3cgYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KKyAgICAgIGV2YWwgImV4ZWMgXCRjbWQkYXJncyIKKworICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGV4ZWMgXCRjbWQkYXJncyIKKyAgICAgIGV4aXQgMQorICAgIGVsc2UKKyAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCisgICAgICBldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgJGVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgICRlY2hvICIkY21kJGFyZ3MiCisgICAgICBleGl0IDAKKyAgICBmaQorICAgIDs7CisKKyAgIyBsaWJ0b29sIHVuaW5zdGFsbCBtb2RlCisgIHVuaW5zdGFsbCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiB1bmluc3RhbGwiCisgICAgcm09IiRub25vcHQiCisgICAgZmlsZXM9CisKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAtKikgcm09IiRybSAkYXJnIiA7OworICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgorICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAiJG5hbWUiIGluCisgICAgICAqLmxhKQorICAgICAgICAjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisgICAgICAgIGlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICAgIC4gJGRpci8kbmFtZQorCisgICAgICAgICAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKyAgICAgICAgICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KKyAgICAgICAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG4iCisgICAgICAgICAgICB0ZXN0ICJYJG4iID0gIlgkZGxuYW1lIiAmJiBkbG5hbWU9CisgICAgICAgICAgZG9uZQorICAgICAgICAgIHRlc3QgLW4gIiRkbG5hbWUiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJGRsbmFtZSIKKyAgICAgICAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgorCisJICAkc2hvdyAiJHJtICRybWZpbGVzIgorCSAgJHJ1biAkcm0gJHJtZmlsZXMKKworCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisJICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKKwkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkc2hvdyAiJGNtZCIKKwkgICAgICAkcnVuIGV2YWwgIiRjbWQiCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICBmaQorCisgICAgICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXCIKKwkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkc2hvdyAiJGNtZCIKKwkgICAgICAkcnVuIGV2YWwgIiRjbWQiCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICBmaQorCisgICAgICAgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgIGZpCisgICAgICAgIDs7CisKKyAgICAgICoubG8pCisgICAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBvbGRvYmo9YCRlY2hvICJYJG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCisgICAgICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkb2JqIgorICAgICAgICBmaQorCSRzaG93ICIkcm0gJHJtZmlsZXMiCisJJHJ1biAkcm0gJHJtZmlsZXMKKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgIAkkc2hvdyAiJHJtICRybWZpbGVzIgorCSRydW4gJHJtICRybWZpbGVzCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgICAgZXhpdCAwCisgICAgOzsKKworICAiIikKKyAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgorICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCisgICAgZXhpdCAxCisgICAgOzsKKyAgZXNhYworCisgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKKyAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKKyAgZXhpdCAxCitmaSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCisKKyMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgorY2FzZSAiJG1vZGUiIGluCisiIikgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gW01PREUtQVJHXS4uLgorCitQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKworLW4sIC0tZHJ5LXJ1biAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCisgICAgLS1mZWF0dXJlcyAgICAgICAgZGlzcGxheSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgICAgLS1maW5pc2ggICAgICAgICAgc2FtZSBhcyBcYC0tbW9kZT1maW5pc2gnCisgICAgLS1oZWxwICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgIC0tbW9kZT1NT0RFICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFIFtkZWZhdWx0PWluZmVycmVkIGZyb20gTU9ERS1BUkdTXQorICAgIC0tcXVpZXQgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKKyAgICAtLXNpbGVudCAgICAgICAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgICAgLS12ZXJzaW9uICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgorCitNT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0CisgICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KKyAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKKyAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKKyAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorCitNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKK2EgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLiIKKyAgZXhpdCAwCisgIDs7CisKK2NvbXBpbGUpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCisKK0NvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KKworQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKK2Zyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCisKK1RoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQorU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCitsaWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCisgIDs7CisKK2V4ZWN1dGUpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCisKK0F1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAorCitUaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCitmbGFncy4KKworSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAoraW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5CitkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KKworVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCisgIDs7CisKK2ZpbmlzaCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgorCitDb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgorCitFYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgorCitUaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKK3RoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgorICA7OworCitpbnN0YWxsKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KKworSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCisKK0lOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQorZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCisKK1RoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5CitCU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKKyAgOzsKKworbGluaykKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCisKK0xpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KK2NyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCisKK0xJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQorYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAorICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKKyAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gZGxkX3ByZWxvYWRlZF9zeW1ib2xzCisgIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCisgIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cworICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgorICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCisgIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLCBvbmx5CitsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcyByZXF1aXJlZC4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZCB1c2luZyBcYGFyJworYW5kIFxgcmFubGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAubycsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGlzCitjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgorICA7OworCit1bmluc3RhbGwpCisgICRlY2hvCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KKworUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgorT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgorICA7OworCisqKQorICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCisgICRlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKKyAgOzsKK2VzYWMKKworZWNobworJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKKworZXhpdCAwCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOnNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjoyCisjIEVuZDoKZGlmZiAtLWdpdCBhL21ha2NqcGVnLnN0IGIvbWFrY2pwZWcuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MmM4OQotLS0gL2Rldi9udWxsCisrKyBiL21ha2NqcGVnLnN0CkBAIC0wLDAgKzEsMzggQEAKKzsgUHJvamVjdCBmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKzsKKzsgVGhpcyBwcm9qZWN0IGZpbGUgaXMgZm9yIEF0YXJpIFNUL1NURS9UVCBzeXN0ZW1zIHVzaW5nIFB1cmUgQyBvciBUdXJibyBDLgorOyBUaGFua3MgdG8gRnJhbmsgTW9laGxlIChGcmFuay5Nb2VobGVAYXJiaS5pbmZvcm1hdGlrLnVuaS1vbGRlbmJ1cmcuZGUpLAorOyBEci4gQi4gU2V0emVwZmFuZHQgKGJlcm5kQGdpbmEudW5pLW11ZW5zdGVyLmRlKSwKKzsgYW5kIEd1aWRvIFZvbGxiZWRpbmcgKGd1aXZvbEBlc2MuZGUpLgorOworOyBUbyB1c2UgdGhpcyBmaWxlLCByZW5hbWUgaXQgdG8gY2pwZWcucHJqLgorOyBJZiB5b3UgYXJlIHVzaW5nIFR1cmJvIEMsIGNoYW5nZSBmaWxlbmFtZXMgYmVnaW5uaW5nIHdpdGggInBjLi4uIiB0byAidGMuLi4iCis7IFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgdHJ5aW5nIHRvIG1ha2UgdGhlIHByb2dyYW0hCis7Cis7Cis7ICAgICAgKiAqICogT3V0cHV0IGZpbGUgKiAqICoKK2NqcGVnLnR0cAorOworOyAqICogKiBDT01QSUxFUiBPUFRJT05TICogKiAqICAKKy5DWy1QXSAgICAgICAgOyBhYnNvbHV0ZSBjYWxscworLkNbLU1dICAgICAgICA7IGFuZCBubyBzdHJpbmcgbWVyZ2luZywgZm9sa3MKKy5DWy13LWNsbl0gICAgOyBubyAiY29uc3RhbnQgaXMgbG9uZyIgd2FybmluZ3MKKy5DWy13LXBhcl0gICAgOyBubyAicGFyYW1ldGVyIHh4eHggdW51c2VkIgorLkNbLXctcmNoXSAgICA7IG5vICJ1bnJlYWNoYWJsZSBjb2RlIgorLkNbLXdzaWddICAgICA7IHdhcm4gaWYgc2lnbmlmaWNhbnQgZGlnaXRzIG1heSBiZSBsb3N0Cis9Cis7ICogKiAqICogTGlzdCBvZiBtb2R1bGVzICogKiAqICogCitwY3N0YXJ0Lm8KK2NqcGVnLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCxqdmVyc2lvbi5oKQorY2RqcGVnLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3Jkc3dpdGNoLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3JkcHBtLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3JkZ2lmLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3JkdGFyZ2EuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRibXAuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRybGUuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorbGlianBlZy5saWIgICAgICAgIDsgYnVpbHQgYnkgbGlianBlZy5wcmoKK3BjZmx0bGliLmxpYiAgICAgICA7IGZsb2F0aW5nIHBvaW50IGxpYnJhcnkKKzsgdGhlIGZsb2F0IGxpYnJhcnkgY2FuIGJlIG9taXR0ZWQgaWYgeW91J3ZlIHR1cm5lZCBvZmYgRENUX0ZMT0FUX1NVUFBPUlRFRAorcGNzdGRsaWIubGliICAgICAgIDsgc3RhbmRhcmQgbGlicmFyeQorcGNleHRsaWIubGliICAgICAgIDsgZXh0ZW5kZWQgbGlicmFyeQpkaWZmIC0tZ2l0IGEvbWFrZGpwZWcuc3QgYi9tYWtkanBlZy5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjI2NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWFrZGpwZWcuc3QKQEAgLTAsMCArMSwzOCBAQAorOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorOworOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCis7IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAorOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7Cis7IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBkanBlZy5wcmouCis7IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKKzsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKKzsKKzsKKzsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgorZGpwZWcudHRwCis7Cis7ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAorLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCisuQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcworLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncworLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCisuQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCisuQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKKz0KKzsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK3Bjc3RhcnQubworZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLGp2ZXJzaW9uLmgpCitjZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRjb2xtYXAuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQord3JwcG0uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQord3JnaWYuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQord3J0YXJnYS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cmJtcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cnJsZS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCitsaWJqcGVnLmxpYiAgICAgICAgOyBidWlsdCBieSBsaWJqcGVnLnByagorcGNmbHRsaWIubGliICAgICAgIDsgZmxvYXRpbmcgcG9pbnQgbGlicmFyeQorOyB0aGUgZmxvYXQgbGlicmFyeSBjYW4gYmUgb21pdHRlZCBpZiB5b3UndmUgdHVybmVkIG9mZiBEQ1RfRkxPQVRfU1VQUE9SVEVECitwY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5CitwY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9tYWtlYXBwcy5kcyBiL21ha2VhcHBzLmRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZGQwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlYXBwcy5kcwpAQCAtMCwwICsxLDgyOCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4yMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKKworIUlGICIkKENGRykiID09ICIiCitDRkc9Y2pwZWcgLSBXaW4zMgorIU1FU1NBR0UgTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuICBEZWZhdWx0aW5nIHRvIGNqcGVnIC0gV2luMzIuCishRU5ESUYgCisKKyFJRiAiJChDRkcpIiAhPSAiY2pwZWcgLSBXaW4zMiIgJiYgIiQoQ0ZHKSIgIT0gImRqcGVnIC0gV2luMzIiICYmXAorICIkKENGRykiICE9ICJqcGVndHJhbiAtIFdpbjMyIiAmJiAiJChDRkcpIiAhPSAicmRqcGdjb20gLSBXaW4zMiIgJiZcCisgIiQoQ0ZHKSIgIT0gIndyanBnY29tIC0gV2luMzIiCishTUVTU0FHRSBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gIiQoQ0ZHKSIgc3BlY2lmaWVkLgorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0Ugb24gdGhpcyBtYWtlZmlsZQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJhcHBzLm1hayIgQ0ZHPSJjanBlZyAtIFdpbjMyIgorIU1FU1NBR0UgCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgImNqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAiZGpwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJqcGVndHJhbiAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgInJkanBnY29tIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAid3JqcGdjb20gLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorIUVSUk9SIEFuIGludmFsaWQgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQuCishRU5ESUYgCisKKyFJRiAiJChPUykiID09ICJXaW5kb3dzX05UIgorTlVMTD0KKyFFTFNFIAorTlVMTD1udWwKKyFFTkRJRiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBUYXJnZXRfTGFzdF9TY2FubmVkICJjanBlZyAtIFdpbjMyIgorQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorCishSUYgICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiY2pwZWdcUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImNqcGVnXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICJjanBlZyIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJjanBlZ1xSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImNqcGVnXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAiY2pwZWciCitPVVRESVI9LlxjanBlZ1xSZWxlYXNlCitJTlRESVI9LlxjanBlZ1xSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilcY2pwZWcuZXhlIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVxjanBlZy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkcHBtLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRnaWYub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZHRhcmdhLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRybGUub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZGJtcC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcY2RqcGVnLm9iaiIKKwktQGVyYXNlICIkKE9VVERJUilcY2pwZWcuZXhlIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCitDUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCisgL0ZwIiQoSU5URElSKS9janBlZy5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCitDUFBfT0JKUz0uXGNqcGVnXFJlbGVhc2UvCitDUFBfU0JSUz0uXC4KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0JTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2NqcGVnLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKK0xJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCisgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAorIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKKyAvcGRiOiIkKE9VVERJUikvY2pwZWcucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9janBlZy5leGUiIAorTElOSzMyX09CSlM9IFwKKwkiJChJTlRESVIpXGNqcGVnLm9iaiIgXAorCSIkKElOVERJUilccmRwcG0ub2JqIiBcCisJIiQoSU5URElSKVxyZGdpZi5vYmoiIFwKKwkiJChJTlRESVIpXHJkdGFyZ2Eub2JqIiBcCisJIiQoSU5URElSKVxyZHJsZS5vYmoiIFwKKwkiJChJTlRESVIpXHJkYm1wLm9iaiIgXAorCSIkKElOVERJUilccmRzd2l0Y2gub2JqIiBcCisJIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCisKKworIiQoT1VURElSKVxjanBlZy5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKKyAgICAkKExJTkszMikgQDw8CisgICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQorPDwKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJkanBlZ1xSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZGpwZWdcUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgImRqcGVnIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgImRqcGVnXFJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZGpwZWdcUmVsZWFzZSIKKyMgUFJPUCBUYXJnZXRfRGlyICJkanBlZyIKK09VVERJUj0uXGRqcGVnXFJlbGVhc2UKK0lOVERJUj0uXGRqcGVnXFJlbGVhc2UKKworQUxMIDogIiQoT1VURElSKVxkanBlZy5leGUiCisKK0NMRUFOIDogCisJLUBlcmFzZSAiJChJTlRESVIpXGRqcGVnLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcd3JwcG0ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx3cmdpZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHdydGFyZ2Eub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx3cnJsZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHdyYm1wLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRjb2xtYXAub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgorCS1AZXJhc2UgIiQoT1VURElSKVxkanBlZy5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKKyAvRnAiJChJTlRESVIpL2RqcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5cZGpwZWdcUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvZGpwZWcuYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKKyBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCisgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAorIC9wZGI6IiQoT1VURElSKS9kanBlZy5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2RqcGVnLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcZGpwZWcub2JqIiBcCisJIiQoSU5URElSKVx3cnBwbS5vYmoiIFwKKwkiJChJTlRESVIpXHdyZ2lmLm9iaiIgXAorCSIkKElOVERJUilcd3J0YXJnYS5vYmoiIFwKKwkiJChJTlRESVIpXHdycmxlLm9iaiIgXAorCSIkKElOVERJUilcd3JibXAub2JqIiBcCisJIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiIFwKKwkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKKworCisiJChPVVRESVIpXGRqcGVnLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCishRUxTRUlGICAiJChDRkcpIiA9PSAianBlZ3RyYW4gLSBXaW4zMiIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJqcGVndHJhblxSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAianBlZ3RyYW4iCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAianBlZ3RyYW5cUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJqcGVndHJhblxSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgImpwZWd0cmFuIgorT1VURElSPS5canBlZ3RyYW5cUmVsZWFzZQorSU5URElSPS5canBlZ3RyYW5cUmVsZWFzZQorCitBTEwgOiAiJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIKKworQ0xFQU4gOiAKKwktQGVyYXNlICIkKElOVERJUilcanBlZ3RyYW4ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIKKwktQGVyYXNlICIkKE9VVERJUilcanBlZ3RyYW4uZXhlIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCitDUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSJcCisgL0ZwIiQoSU5URElSKS9qcGVndHJhbi5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCitDUFBfT0JKUz0uXGpwZWd0cmFuXFJlbGVhc2UvCitDUFBfU0JSUz0uXC4KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0JTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2pwZWd0cmFuLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKK0xJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWJcCisgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliXAorIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpub1wKKyAvcGRiOiIkKE9VVERJUikvanBlZ3RyYW4ucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKS9qcGVndHJhbi5leGUiIAorTElOSzMyX09CSlM9IFwKKwkiJChJTlRESVIpXGpwZWd0cmFuLm9iaiIgXAorCSIkKElOVERJUilccmRzd2l0Y2gub2JqIiBcCisJIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCisJIiQoSU5URElSKVx0cmFuc3VwcC5vYmoiIFwKKworCisiJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCishRUxTRUlGICAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgInJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAicmRqcGdjb20iCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAicmRqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgInJkanBnY29tIgorT1VURElSPS5ccmRqcGdjb21cUmVsZWFzZQorSU5URElSPS5ccmRqcGdjb21cUmVsZWFzZQorCitBTEwgOiAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKKworQ0xFQU4gOiAKKwktQGVyYXNlICIkKElOVERJUilccmRqcGdjb20ub2JqIgorCS1AZXJhc2UgIiQoT1VURElSKVxyZGpwZ2NvbS5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKKyAvRnAiJChJTlRESVIpL3JkanBnY29tLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5ccmRqcGdjb21cUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvcmRqcGdjb20uYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKKyBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCisgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAorIC9wZGI6IiQoT1VURElSKS9yZGpwZ2NvbS5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL3JkanBnY29tLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilccmRqcGdjb20ub2JqIgorCisiJChPVVRESVIpXHJkanBnY29tLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCishRUxTRUlGICAiJChDRkcpIiA9PSAid3JqcGdjb20gLSBXaW4zMiIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIndyanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAid3JqcGdjb20iCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAid3JqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgIndyanBnY29tIgorT1VURElSPS5cd3JqcGdjb21cUmVsZWFzZQorSU5URElSPS5cd3JqcGdjb21cUmVsZWFzZQorCitBTEwgOiAiJChPVVRESVIpXHdyanBnY29tLmV4ZSIKKworQ0xFQU4gOiAKKwktQGVyYXNlICIkKElOVERJUilcd3JqcGdjb20ub2JqIgorCS1AZXJhc2UgIiQoT1VURElSKVx3cmpwZ2NvbS5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKKyAvRnAiJChJTlRESVIpL3dyanBnY29tLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5cd3JqcGdjb21cUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvd3JqcGdjb20uYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKKyBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCisgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAorIC9wZGI6IiQoT1VURElSKS93cmpwZ2NvbS5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL3dyanBnY29tLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcd3JqcGdjb20ub2JqIgorCisiJChPVVRESVIpXHdyanBnY29tLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCishRU5ESUYgCisKKy5jeyQoQ1BQX09CSlMpfS5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3BweyQoQ1BQX09CSlMpfS5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3h4eyQoQ1BQX09CSlMpfS5vYmo6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3skKENQUF9TQlJTKX0uc2JyOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmNwcHskKENQUF9TQlJTKX0uc2JyOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmN4eHskKENQUF9TQlJTKX0uc2JyOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiY2pwZWcgLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAiY2pwZWcgLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImNqcGVnLmMiCitERVBfQ1BQX0NKUEVHPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkianZlcnNpb24uaCJcCisJCisKKyIkKElOVERJUilcY2pwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0pQRUcpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iY2RqcGVnLmMiCitERVBfQ1BQX0NESlBFPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmRzd2l0Y2guYyIKK0RFUF9DUFBfUkRTV0k9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEU1dJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkcHBtLmMiCitERVBfQ1BQX1JEUFBNPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZHBwbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFBQTSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZGdpZi5jIgorREVQX0NQUF9SREdJRj1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRnaWYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRHSUYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmR0YXJnYS5jIgorREVQX0NQUF9SRFRBUj1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmR0YXJnYS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRFRBUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZGJtcC5jIgorREVQX0NQUF9SREJNUD1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRibXAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRCTVApICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmRybGUuYyIKK0RFUF9DUFBfUkRSTEU9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHJkcmxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEUkxFKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImRqcGVnIC0gV2luMzIiCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIiCisKKyFFTkRJRiAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJkanBlZy5jIgorREVQX0NQUF9ESlBFRz1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJImp2ZXJzaW9uLmgiXAorCQorCisiJChJTlRESVIpXGRqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0RKUEVHKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImNkanBlZy5jIgorREVQX0NQUF9DREpQRT1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcY2RqcGVnLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0NESlBFKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkY29sbWFwLmMiCitERVBfQ1BQX1JEQ09MPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SRENPTCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJ3cnBwbS5jIgorREVQX0NQUF9XUlBQTT1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcd3JwcG0ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JQUE0pICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0id3JnaWYuYyIKK0RFUF9DUFBfV1JHSUY9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHdyZ2lmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSR0lGKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9IndydGFyZ2EuYyIKK0RFUF9DUFBfV1JUQVI9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHdydGFyZ2Eub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JUQVIpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0id3JibXAuYyIKK0RFUF9DUFBfV1JCTVA9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHdyYm1wLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSQk1QKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9IndycmxlLmMiCitERVBfQ1BQX1dSUkxFPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVx3cnJsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlJMRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJqcGVndHJhbiAtIFdpbjMyIgorCishSUYgICIkKENGRykiID09ICJqcGVndHJhbiAtIFdpbjMyIgorCishRU5ESUYgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0ianBlZ3RyYW4uYyIKK0RFUF9DUFBfSlBFR1Q9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCSJ0cmFuc3VwcC5oIlwKKwkianZlcnNpb24uaCJcCisJCisKKyIkKElOVERJUilcanBlZ3RyYW4ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlBFR1QpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iY2RqcGVnLmMiCitERVBfQ1BQX0NESlBFPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmRzd2l0Y2guYyIKK0RFUF9DUFBfUkRTV0k9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEU1dJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InRyYW5zdXBwLmMiCitERVBfQ1BQX1RSQU5TPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJInRyYW5zdXBwLmgiXAorCQorCisiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1RSQU5TKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgInJkanBnY29tIC0gV2luMzIiCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInJkanBnY29tIC0gV2luMzIiCisKKyFFTkRJRiAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZGpwZ2NvbS5jIgorREVQX0NQUF9SREpQRz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCQorCisiJChJTlRESVIpXHJkanBnY29tLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JESlBHKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgIndyanBnY29tIC0gV2luMzIiCisKKyFJRiAgIiQoQ0ZHKSIgPT0gIndyanBnY29tIC0gV2luMzIiCisKKyFFTkRJRiAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJ3cmpwZ2NvbS5jIgorREVQX0NQUF9XUkpQRz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCQorCisiJChJTlRESVIpXHdyanBnY29tLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSSlBHKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKZGlmZiAtLWdpdCBhL21ha2VmaWxlLmFuc2kgYi9tYWtlZmlsZS5hbnNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTE5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlZmlsZS5hbnNpCkBAIC0wLDAgKzEsMjE0IEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyB3aXRoIEFOU0ktY2FwYWJsZSBjb21waWxlcnMuCisjIElmIHlvdSBoYXZlIGEgbm9uLUFOU0kgY29tcGlsZXIsIG1ha2VmaWxlLnVuaXggaXMgYSBiZXR0ZXIgc3RhcnRpbmcgcG9pbnQuCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IGNjCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorQ0ZMQUdTPSAtTworIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKKyMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorTERGTEFHUz0gCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAorIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KK1NZU0RFUE1FTT0gam1lbW5vYnMubworCisjIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCisjIGxpbmtlcgorTE49ICQoQ0MpCisjIGZpbGUgZGVsZXRpb24gY29tbWFuZAorUk09IHJtIC1mCisjIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBhciByYworIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKK0FSMj0gcmFubGliCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCisgICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAorICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCisgICAgICAgIGpmZGN0aW50Lm8KKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKKyAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCisgICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gamlkY3RpbnQubyBqaWRjdHJlZC5vIFwKKyAgICAgICAgamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCisgICAgICAgIGNkanBlZy5vCitET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK1RST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KKworCithbGw6IGxpYmpwZWcuYSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQorCitsaWJqcGVnLmE6ICQoTElCT0JKRUNUUykKKwkkKFJNKSBsaWJqcGVnLmEKKwkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKKwkkKEFSMikgbGlianBlZy5hCisKK2NqcGVnOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnICQoQ09CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworZGpwZWc6ICQoRE9CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcgJChET0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitqcGVndHJhbjogJChUUk9CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4gJChUUk9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworcmRqcGdjb206IHJkanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tIHJkanBnY29tLm8gJChMRExJQlMpCisKK3dyanBnY29tOiB3cmpwZ2NvbS5vCisJJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbSB3cmpwZ2NvbS5vICQoTERMSUJTKQorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJJChSTSkgKi5vIGNqcGVnIGRqcGVnIGpwZWd0cmFuIGxpYmpwZWcuYSByZGpwZ2NvbSB3cmpwZ2NvbQorCSQoUk0pIGNvcmUgdGVzdG91dCoKKwordGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KKwkkKFJNKSB0ZXN0b3V0KgorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJLi9kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJLi9janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KKwkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLmJjYyBiL21ha2VmaWxlLmJjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNmY2RlCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZWZpbGUuYmNjCkBAIC0wLDAgKzEsMjg1IEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIHN1aXRhYmxlIGZvciBCb3JsYW5kIEMgb24gTVMtRE9TIG9yIE9TLzIuCisjIEl0IHdvcmtzIHdpdGggQm9ybGFuZCBDKysgZm9yIERPUywgcmV2aXNpb24gMy4wIG9yIGxhdGVyLAorIyBhbmQgaGFzIGJlZW4gdGVzdGVkIHdpdGggQm9ybGFuZCBDKysgZm9yIE9TLzIuCisjIFdhdGNoIG91dCBmb3Igb3B0aW1pemF0aW9uIGJ1Z3MgaW4gdGhlIE9TLzIgY29tcGlsZXJzIC0tLSBzZWUgbm90ZXMgYmVsb3chCisjIFRoYW5rcyB0byBUb20gV3JpZ2h0IGFuZCBHZScgV2VpamVycyAob3JpZ2luYWwgRE9TKSBhbmQKKyMgS2VuIFBvcnRlciAoT1MvMikgZm9yIHRoaXMgZmlsZS4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKKworIyBBcmUgd2UgdW5kZXIgRE9TIG9yIE9TLzI/CishaWYgISRkKERPUykgJiYgISRkKE9TMikKKyFpZiAkZChfX09TMl9fKQorT1MyPTEKKyFlbHNlCitET1M9MQorIWVuZGlmCishZW5kaWYKKworIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6CitDQz0gYmNjCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorIWlmICRkKERPUykKK0NGTEFHUz0gLU8yIC1tbSAtdy1wYXIgLXctc3R1IC13LWNjYyAtdy1yY2gKKyFlbHNlCitDRkxBR1M9IC1PMSAtdy1wYXIgLXctc3R1IC13LWNjYyAtdy1yY2gKKyFlbmRpZgorIyAtTzIgZW5hYmxlcyBmdWxsIGNvZGUgb3B0aW1pemF0aW9uIChmb3IgcHJlLTMuMCBCb3JsYW5kIEMrKywgdXNlIC1PIC1HIC1aKS4KKyMgLU8yIGlzIGJ1Z2d5IGluIEJvcmxhbmQgT1MvMiBDKysgcmV2aXNpb24gMi4wLCBzbyB1c2UgLU8xIHRoZXJlIGZvciBub3cuCisjIElmIHlvdSBoYXZlIEJvcmxhbmQgT1MvMiBDKysgcmV2aXNpb24gMS4wLCB1c2UgLU8gb3Igbm8gb3B0aW1pemF0aW9uIGF0IGFsbC4KKyMgLW1tIHNlbGVjdHMgbWVkaXVtIG1lbW9yeSBtb2RlbCAobmVhciBkYXRhLCBmYXIgY29kZSBwb2ludGVyczsgRE9TIG9ubHkhKQorIyAtdy1wYXIgc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCB1bnVzZWQgZnVuY3Rpb24gcGFyYW1ldGVycworIyAtdy1zdHUgc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCBpbmNvbXBsZXRlIHN0cnVjdHVyZXMKKyMgLXctY2NjIHN1cHByZXNzZXMgd2FybmluZ3MgYWJvdXQgY29tcGlsZS10aW1lLWNvbnN0YW50IGNvbmRpdGlvbnMKKyMgLXctcmNoIHN1cHByZXNzZXMgd2FybmluZ3MgYWJvdXQgdW5yZWFjaGFibGUgY29kZQorIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKKyMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorIWlmICRkKERPUykKK0xERkxBR1M9IC1tbQorIyBtZW1vcnkgbW9kZWwgb3B0aW9uIGhlcmUgbXVzdCBtYXRjaCBDRkxBR1MhCishZWxzZQorTERGTEFHUz0KKyMgLWxhaSBmdWxsLXNjcmVlbiBhcHAKKyMgLWxjIGNhc2Utc2lnbmlmaWNhbnQgbGluaworIWVuZGlmCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4KKyMgRm9yIERPUywgd2UgcmVjb21tZW5kIGptZW1kb3MuYyBhbmQgam1lbWRvc2EuYXNtLgorIyBGb3IgT1MvMiwgd2UgcmVjb21tZW5kIGptZW1ub2JzLmMgKGZsYXQgbWVtb3J5ISkKKyMgU1lTREVQTUVNTElCIG11c3QgbGlzdCB0aGUgc2FtZSBmaWxlcyB3aXRoICIrIiBzaWducyBmb3IgdGhlIGxpYnJhcmlhbi4KKyFpZiAkZChET1MpCitTWVNERVBNRU09IGptZW1kb3Mub2JqIGptZW1kb3NhLm9iagorU1lTREVQTUVNTElCPSAram1lbWRvcy5vYmogK2ptZW1kb3NhLm9iagorIWVsc2UKK1NZU0RFUE1FTT0gam1lbW5vYnMub2JqCitTWVNERVBNRU1MSUI9ICtqbWVtbm9icy5vYmoKKyFlbmRpZgorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAorICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCisgICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCisgICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagorIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAorICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAorICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKKyAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKKyAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCitMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCisjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCitDT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCisgICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCitET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCisgICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCitUUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKKworCithbGw6IGxpYmpwZWcubGliIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKKworbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKKwktIGRlbCBsaWJqcGVnLmxpYgorCXRsaWIgbGlianBlZy5saWIgL0UgL0MgQCYmfAorK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY3RyYW5zLm9iaiAramNwYXJhbS5vYmogK2pkYXRhZHN0Lm9iaiAmCisramNpbml0Lm9iaiAramNtYXN0ZXIub2JqICtqY21hcmtlci5vYmogK2pjbWFpbmN0Lm9iaiAramNwcmVwY3Qub2JqICYKKytqY2NvZWZjdC5vYmogK2pjY29sb3Iub2JqICtqY3NhbXBsZS5vYmogK2pjaHVmZi5vYmogK2pjcGh1ZmYub2JqICYKKytqY2RjdG1nci5vYmogK2pmZGN0ZnN0Lm9iaiAramZkY3RmbHQub2JqICtqZmRjdGludC5vYmogK2pkYXBpbWluLm9iaiAmCisramRhcGlzdGQub2JqICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICtqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICYKKytqZG1hcmtlci5vYmogK2pkaHVmZi5vYmogK2pkcGh1ZmYub2JqICtqZG1haW5jdC5vYmogK2pkY29lZmN0Lm9iaiAmCisramRwb3N0Y3Qub2JqICtqZGRjdG1nci5vYmogK2ppZGN0ZnN0Lm9iaiAramlkY3RmbHQub2JqICtqaWRjdGludC5vYmogJgorK2ppZGN0cmVkLm9iaiAramRzYW1wbGUub2JqICtqZGNvbG9yLm9iaiAranF1YW50MS5vYmogK2pxdWFudDIub2JqICYKKytqZG1lcmdlLm9iaiAramNvbWFwaS5vYmogK2p1dGlscy5vYmogK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYKKyQoU1lTREVQTUVNTElCKQorfAorCitjanBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAtZWNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCitkanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAtZWRqcGVnLmV4ZSAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCitqcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoQ0MpICQoTERGTEFHUykgLWVqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisKK3JkanBnY29tLmV4ZTogcmRqcGdjb20uYworIWlmICRkKERPUykKKwkkKENDKSAtbXMgLU8gcmRqcGdjb20uYworIWVsc2UKKwkkKENDKSAkKENGTEFHUykgcmRqcGdjb20uYworIWVuZGlmCisKKyMgT24gRE9TLCB3cmpwZ2NvbSBuZWVkcyBsYXJnZSBtb2RlbCBzbyBpdCBjYW4gbWFsbG9jIGEgNjRLIGNodW5rCit3cmpwZ2NvbS5leGU6IHdyanBnY29tLmMKKyFpZiAkZChET1MpCisJJChDQykgLW1sIC1PIHdyanBnY29tLmMKKyFlbHNlCisJJChDQykgJChDRkxBR1MpIHdyanBnY29tLmMKKyFlbmRpZgorCisjIFRoaXMgInt9IiBzeW50YXggYWxsb3dzIEJvcmxhbmQgTWFrZSB0byAiYmF0Y2giIHNvdXJjZSBmaWxlcy4KKyMgSW4gdGhpcyB3YXksIGVhY2ggcnVuIG9mIHRoZSBjb21waWxlciBjYW4gYnVpbGQgbWFueSBtb2R1bGVzLgorLmMub2JqOgorCSQoQ0MpICQoQ0ZMQUdTKSAtY3sgJDx9CisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCitjbGVhbjoKKwktIGRlbCAqLm9iagorCS0gZGVsIGxpYmpwZWcubGliCisJLSBkZWwgY2pwZWcuZXhlCisJLSBkZWwgZGpwZWcuZXhlCisJLSBkZWwganBlZ3RyYW4uZXhlCisJLSBkZWwgcmRqcGdjb20uZXhlCisJLSBkZWwgd3JqcGdjb20uZXhlCisJLSBkZWwgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQorCS0gZGVsIHRlc3RvdXQqLioKKwlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKKwlkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKKwljanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KKwlqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCishaWYgJGQoRE9TKQorCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCishZWxzZQorCWVjaG8gbiA+IG4udG1wCisJY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbSA8IG4udG1wCisJY29tcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcCA8IG4udG1wCisJY29tcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZyA8IG4udG1wCisJY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0gPCBuLnRtcAorCWNvbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZyA8IG4udG1wCisJY29tcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnIDwgbi50bXAKKwlkZWwgbi50bXAKKyFlbmRpZgorCisKK2pjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoranF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2ptZW1tZ3Iub2JqOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kub2JqOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm9iajogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbm9icy5vYmo6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vYmo6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm9iajogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2NqcGVnLm9iajogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcub2JqOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vYmo6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAorcmRqcGdjb20ub2JqOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vYmo6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vYmo6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRjb2xtYXAub2JqOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gub2JqOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAub2JqOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCityZHBwbS5vYmo6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vYmo6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vYmo6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmdpZi5vYmo6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm9iajogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vYmo6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkYm1wLm9iajogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm9iajogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm9iajogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycmxlLm9iajogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK2ptZW1kb3NhLm9iajogam1lbWRvc2EuYXNtCisJdGFzbSAvbXggam1lbWRvc2EuYXNtCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5jZmcgYi9tYWtlZmlsZS5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ZTQyZQotLS0gL2Rldi9udWxsCisrKyBiL21ha2VmaWxlLmNmZwpAQCAtMCwwICsxLDMxOSBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgbWFrZWZpbGUuY2ZnIGlzIGVkaXRlZCBieSBjb25maWd1cmUgdG8gcHJvZHVjZSBhIGN1c3RvbSBNYWtlZmlsZS4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKKworIyBGb3IgY29tcGlsaW5nIHdpdGggc291cmNlIGFuZCBvYmplY3QgZmlsZXMgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLgorc3JjZGlyID0gQHNyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworIyBXaGVyZSB0byBpbnN0YWxsIHRoZSBwcm9ncmFtcyBhbmQgbWFuIHBhZ2VzLgorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorYmluZGlyID0gJChleGVjX3ByZWZpeCkvYmluCitsaWJkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWIKK2luY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQorYmlucHJlZml4ID0KK21hbnByZWZpeCA9CittYW5leHQgPSAxCittYW5kaXIgPSAkKHByZWZpeCkvbWFuL21hbiQobWFuZXh0KQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBAQ0NACisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorQ0ZMQUdTPSBAQ0ZMQUdTQCBAQ1BQRkxBR1NAIEBJTkNMVURFRkxBR1NACisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisjIEhvd2V2ZXIsIGFueSBzcGVjaWFsIGRlZmluZXMgZm9yIGFuc2kya25yLmMgbWF5IGJlIGluY2x1ZGVkIGhlcmU6CitBTlNJMktOUkZMQUdTPSBAQU5TSTJLTlJGTEFHU0AKKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IEBMREZMQUdTQAorCisjIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgorTERMSUJTPSBATElCU0AKKworIyBJZiB1c2luZyBHTlUgbGlidG9vbCwgTElCVE9PTCByZWZlcmVuY2VzIGl0OyBpZiBub3QsIExJQlRPT0wgaXMgZW1wdHkuCitMSUJUT09MID0gQExJQlRPT0xACisjICQoTykgZXhwYW5kcyB0byAibG8iIGlmIHVzaW5nIGxpYnRvb2wsIHBsYWluICJvIiBpZiBub3QuCisjIFNpbWlsYXJseSwgJChBKSBleHBhbmRzIHRvICJsYSIgb3IgImEiLgorTyA9IEBPQAorQSA9IEBBQAorCisjIExpYnJhcnkgdmVyc2lvbiBJRDsgbGlidG9vbCB1c2VzIHRoaXMgZm9yIHRoZSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIG51bWJlci4KKyMgTm90ZTogd2Ugc3VnZ2VzdCB0aGlzIG1hdGNoIHRoZSBtYWNybyBvZiB0aGUgc2FtZSBuYW1lIGluIGpwZWdsaWIuaC4KK0pQRUdfTElCX1ZFUlNJT04gPSBASlBFR19MSUJfVkVSU0lPTkAKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKKyMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCitTWVNERVBNRU09IEBNRU1PUllNR1JACisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKK1NIRUxMPSAvYmluL3NoCisjIGxpbmtlcgorTE49IEBMTkAKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gcm0gLWYKKyMgZGlyZWN0b3J5IGNyZWF0aW9uIGNvbW1hbmQKK01LRElSPSBta2RpcgorIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCitBUj0gYXIgcmMKKyMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCitBUjI9IEBSQU5MSUJACisjIGluc3RhbGxhdGlvbiBwcm9ncmFtCitJTlNUQUxMPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTT0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfTElCPSBASU5TVEFMTF9MSUJACitJTlNUQUxMX0RBVEE9IEBJTlNUQUxMX0RBVEFACisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkuJChPKSBqdXRpbHMuJChPKSBqZXJyb3IuJChPKSBqbWVtbWdyLiQoTykgJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4uJChPKSBqY2FwaXN0ZC4kKE8pIGpjdHJhbnMuJChPKSBqY3BhcmFtLiQoTykgXAorICAgICAgICBqZGF0YWRzdC4kKE8pIGpjaW5pdC4kKE8pIGpjbWFzdGVyLiQoTykgamNtYXJrZXIuJChPKSBqY21haW5jdC4kKE8pIFwKKyAgICAgICAgamNwcmVwY3QuJChPKSBqY2NvZWZjdC4kKE8pIGpjY29sb3IuJChPKSBqY3NhbXBsZS4kKE8pIGpjaHVmZi4kKE8pIFwKKyAgICAgICAgamNwaHVmZi4kKE8pIGpjZGN0bWdyLiQoTykgamZkY3Rmc3QuJChPKSBqZmRjdGZsdC4kKE8pIFwKKyAgICAgICAgamZkY3RpbnQuJChPKQorIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4uJChPKSBqZGFwaXN0ZC4kKE8pIGpkdHJhbnMuJChPKSBqZGF0YXNyYy4kKE8pIFwKKyAgICAgICAgamRtYXN0ZXIuJChPKSBqZGlucHV0LiQoTykgamRtYXJrZXIuJChPKSBqZGh1ZmYuJChPKSBqZHBodWZmLiQoTykgXAorICAgICAgICBqZG1haW5jdC4kKE8pIGpkY29lZmN0LiQoTykgamRwb3N0Y3QuJChPKSBqZGRjdG1nci4kKE8pIFwKKyAgICAgICAgamlkY3Rmc3QuJChPKSBqaWRjdGZsdC4kKE8pIGppZGN0aW50LiQoTykgamlkY3RyZWQuJChPKSBcCisgICAgICAgIGpkc2FtcGxlLiQoTykgamRjb2xvci4kKE8pIGpxdWFudDEuJChPKSBqcXVhbnQyLiQoTykgamRtZXJnZS4kKE8pCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy4kKE8pIHJkcHBtLiQoTykgcmRnaWYuJChPKSByZHRhcmdhLiQoTykgcmRybGUuJChPKSBcCisgICAgICAgIHJkYm1wLiQoTykgcmRzd2l0Y2guJChPKSBjZGpwZWcuJChPKQorRE9CSkVDVFM9IGRqcGVnLiQoTykgd3JwcG0uJChPKSB3cmdpZi4kKE8pIHdydGFyZ2EuJChPKSB3cnJsZS4kKE8pIFwKKyAgICAgICAgd3JibXAuJChPKSByZGNvbG1hcC4kKE8pIGNkanBlZy4kKE8pCitUUk9CSkVDVFM9IGpwZWd0cmFuLiQoTykgcmRzd2l0Y2guJChPKSBjZGpwZWcuJChPKSB0cmFuc3VwcC4kKE8pCisKKworYWxsOiBAQTJLX0RFUFNAIGxpYmpwZWcuJChBKSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQorCisjIFNwZWNpYWwgY29tcGlsYXRpb24gcnVsZXMgdG8gc3VwcG9ydCBhbnNpMmtuciBhbmQgbGlidG9vbC4KKy5TVUZGSVhFUzogLmxvIC5sYQorCisjIEhvdyB0byBjb21waWxlIHdpdGggbGlidG9vbC4KK0BDT01fTFRALmMubG86CitAQ09NX0xUQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoQ0ZMQUdTKSAtYyAkKHNyY2RpcikvJCouYworCisjIEhvdyB0byB1c2UgYW5zaTJrbnIsIHdoZW4gbm90IHVzaW5nIGxpYnRvb2wuCitAQ09NX0EyS0AuYy5vOgorQENPTV9BMktACS4vYW5zaTJrbnIgJChzcmNkaXIpLyQqLmMga25yLyQqLmMKK0BDT01fQTJLQAkkKENDKSAkKENGTEFHUykgLWMga25yLyQqLmMKK0BDT01fQTJLQAkkKFJNKSBrbnIvJCouYworCisjIEhvdyB0byB1c2UgYW5zaTJrbnIgQU5EIGxpYnRvb2wuCitAQ09NX0EyS0AuYy5sbzoKK0BDT01fQTJLQAkuL2Fuc2kya25yICQoc3JjZGlyKS8kKi5jIGtuci8kKi5jCitAQ09NX0EyS0AJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKENGTEFHUykgLWMga25yLyQqLmMKK0BDT01fQTJLQAkkKFJNKSBrbnIvJCouYworCithbnNpMmtucjogYW5zaTJrbnIuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKEFOU0kyS05SRkxBR1MpIC1vIGFuc2kya25yICQoc3JjZGlyKS9hbnNpMmtuci5jCisJJChNS0RJUikga25yCisKKyMgdGhlIGxpYnJhcnk6CisKKyMgd2l0aG91dCBsaWJ0b29sOgorbGlianBlZy5hOiBAQTJLX0RFUFNAICQoTElCT0JKRUNUUykKKwkkKFJNKSBsaWJqcGVnLmEKKwkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKKwkkKEFSMikgbGlianBlZy5hCisKKyMgd2l0aCBsaWJ0b29sOgorbGlianBlZy5sYTogQEEyS19ERVBTQCAkKExJQk9CSkVDVFMpCisJJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKSAtbyBsaWJqcGVnLmxhICQoTElCT0JKRUNUUykgXAorCQktcnBhdGggJChsaWJkaXIpIC12ZXJzaW9uLWluZm8gJChKUEVHX0xJQl9WRVJTSU9OKQorCisjIHNhbXBsZSBwcm9ncmFtczoKKworY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcuJChBKQorCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy4kKEEpICQoTERMSUJTKQorCitkanBlZzogJChET0JKRUNUUykgbGlianBlZy4kKEEpCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCisKK2pwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy4kKEEpCisJJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy4kKEEpICQoTERMSUJTKQorCityZGpwZ2NvbTogcmRqcGdjb20uJChPKQorCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20uJChPKSAkKExETElCUykKKword3JqcGdjb206IHdyanBnY29tLiQoTykKKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLiQoTykgJChMRExJQlMpCisKKyMgSW5zdGFsbGF0aW9uIHJ1bGVzOgorCitpbnN0YWxsOiBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbSBARk9SQ0VfSU5TVEFMTF9MSUJACisJJChJTlNUQUxMX1BST0dSQU0pIGNqcGVnICQoYmluZGlyKS8kKGJpbnByZWZpeCljanBlZworCSQoSU5TVEFMTF9QUk9HUkFNKSBkanBlZyAkKGJpbmRpcikvJChiaW5wcmVmaXgpZGpwZWcKKwkkKElOU1RBTExfUFJPR1JBTSkganBlZ3RyYW4gJChiaW5kaXIpLyQoYmlucHJlZml4KWpwZWd0cmFuCisJJChJTlNUQUxMX1BST0dSQU0pIHJkanBnY29tICQoYmluZGlyKS8kKGJpbnByZWZpeClyZGpwZ2NvbQorCSQoSU5TVEFMTF9QUk9HUkFNKSB3cmpwZ2NvbSAkKGJpbmRpcikvJChiaW5wcmVmaXgpd3JqcGdjb20KKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2NqcGVnLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWNqcGVnLiQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvZGpwZWcuMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpZGpwZWcuJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVndHJhbi4xICQobWFuZGlyKS8kKG1hbnByZWZpeClqcGVndHJhbi4kKG1hbmV4dCkKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3JkanBnY29tLjEgJChtYW5kaXIpLyQobWFucHJlZml4KXJkanBnY29tLiQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2Rpcikvd3JqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpd3JqcGdjb20uJChtYW5leHQpCisKK2luc3RhbGwtbGliOiBsaWJqcGVnLiQoQSkgaW5zdGFsbC1oZWFkZXJzCisJJChJTlNUQUxMX0xJQikgbGlianBlZy4kKEEpICQobGliZGlyKS8kKGJpbnByZWZpeClsaWJqcGVnLiQoQSkKKworaW5zdGFsbC1oZWFkZXJzOiBqY29uZmlnLmgKKwkkKElOU1RBTExfREFUQSkgamNvbmZpZy5oICQoaW5jbHVkZWRpcikvamNvbmZpZy5oCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qcGVnbGliLmggJChpbmNsdWRlZGlyKS9qcGVnbGliLmgKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2ptb3JlY2ZnLmggJChpbmNsdWRlZGlyKS9qbW9yZWNmZy5oCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9qZXJyb3IuaCAkKGluY2x1ZGVkaXIpL2plcnJvci5oCisKK2NsZWFuOgorCSQoUk0pICoubyAqLmxvIGxpYmpwZWcuYSBsaWJqcGVnLmxhCisJJChSTSkgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KKwkkKFJNKSBhbnNpMmtuciBjb3JlIHRlc3RvdXQqIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1cworCSQoUk0pIC1yIGtuciAubGlicyBfbGlicworCitkaXN0Y2xlYW46IGNsZWFuCisJJChSTSkgTWFrZWZpbGUgamNvbmZpZy5oIGxpYnRvb2wgY29uZmlnLmNhY2hlCisKK3Rlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCisJJChSTSkgdGVzdG91dCoKKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKKwkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICAkKHNyY2RpcikvdGVzdGltZy5wcG0KKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyAkKHNyY2RpcikvdGVzdGltZy5wcG0KKwkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyAkKHNyY2RpcikvdGVzdHByb2cuanBnCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCAkKHNyY2RpcikvdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgJChzcmNkaXIpL3Rlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworY2hlY2s6IHRlc3QKKworIyBNaXN0YWtlIGNhdGNoZXI6CisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCisjIEdOVSBNYWtlIGxpa2VzIHRvIGtub3cgd2hpY2ggdGFyZ2V0IG5hbWVzIGFyZSBub3QgcmVhbGx5IGZpbGVzIHRvIGJlIG1hZGU6CisuUEhPTlk6IGFsbCBpbnN0YWxsIGluc3RhbGwtbGliIGluc3RhbGwtaGVhZGVycyBjbGVhbiBkaXN0Y2xlYW4gdGVzdCBjaGVjaworCisKK2pjYXBpbWluLiQoTyk6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC4kKE8pOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3QuJChPKTogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3IuJChPKTogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3IuJChPKTogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYuJChPKTogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQuJChPKTogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC4kKE8pOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIuJChPKTogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLiQoTyk6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLiQoTyk6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0uJChPKTogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi4kKE8pOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC4kKE8pOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUuJChPKTogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMuJChPKTogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4uJChPKTogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLiQoTyk6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC4kKE8pOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy4kKE8pOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC4kKE8pOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci4kKE8pOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci4kKE8pOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi4kKE8pOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQuJChPKTogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3QuJChPKTogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLiQoTyk6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci4kKE8pOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS4kKE8pOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLiQoTyk6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0LiQoTyk6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS4kKE8pOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy4kKE8pOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3IuJChPKTogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQuJChPKTogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC4kKE8pOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50LiQoTyk6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQuJChPKTogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC4kKE8pOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50LiQoTyk6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQuJChPKTogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLiQoTyk6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIuJChPKToganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLiQoTyk6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci4kKE8pOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kuJChPKTogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS4kKE8pOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLiQoTyk6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy4kKE8pOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy4kKE8pOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcuJChPKTogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcuJChPKTogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4uJChPKToganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS4kKE8pOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS4kKE8pOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcuJChPKTogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC4kKE8pOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2guJChPKTogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLiQoTyk6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLiQoTyk6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS4kKE8pOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYuJChPKTogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLiQoTyk6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLiQoTyk6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2EuJChPKTogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAuJChPKTogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLiQoTyk6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS4kKE8pOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUuJChPKTogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLmRqIGIvbWFrZWZpbGUuZGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2NmQyNQotLS0gL2Rldi9udWxsCisrKyBiL21ha2VmaWxlLmRqCkBAIC0wLDAgKzEsMjIwIEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBESkdQUCAoRGVsb3JpZSdzIEdOVSBDIHBvcnQgb24gTVMtRE9TKSwgdjIuMCBvciBsYXRlci4KKyMgVGhhbmtzIHRvIEZyYW5rIEouIERvbmFob2UgZm9yIHRoaXMgdmVyc2lvbi4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKKworIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6CitDQz0gZ2NjCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorQ0ZMQUdTPSAtTzIgLVdhbGwgLUkuCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIGNjIG9wdGlvbnM6CitMREZMQUdTPSAtcworCisjIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgorTERMSUJTPSAKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIERKR1BQIHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IGNvdWxkCisjIHVzZSBqbWVtbmFtZS5vIGlmIHlvdSB3YW50IHRvIHVzZSBuYW1lZCB0ZW1wIGZpbGVzIGluc3RlYWQgb2Ygc3dhcCBzcGFjZS4KK1NZU0RFUE1FTT0gam1lbW5vYnMubworCisjIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCisjIGxpbmtlcgorTE49ICQoQ0MpCisjIGZpbGUgZGVsZXRpb24gY29tbWFuZAorUk09IGRlbAorIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCitBUj0gYXIgcmMKKyMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCitBUjI9IHJhbmxpYgorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAorICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKKyAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAorICAgICAgICBqZmRjdGludC5vCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCisgICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAorICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCisgICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAorICAgICAgICBjZGpwZWcubworRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCisgICAgICAgIGNkanBlZy5vCitUUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCisKKworYWxsOiBsaWJqcGVnLmEgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCitsaWJqcGVnLmE6ICQoTElCT0JKRUNUUykKKwkkKFJNKSBsaWJqcGVnLmEKKwkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKKwkkKEFSMikgbGlianBlZy5hCisKK2NqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBjanBlZy5leGUgJChDT0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitkanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcuZXhlICQoRE9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5vCisJJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbS5leGUgcmRqcGdjb20ubyAkKExETElCUykKKword3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5vCisJJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbS5leGUgd3JqcGdjb20ubyAkKExETElCUykKKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKK2NsZWFuOgorCSQoUk0pICoubworCSQoUk0pIGNqcGVnLmV4ZQorCSQoUk0pIGRqcGVnLmV4ZQorCSQoUk0pIGpwZWd0cmFuLmV4ZQorCSQoUk0pIHJkanBnY29tLmV4ZQorCSQoUk0pIHdyanBnY29tLmV4ZQorCSQoUk0pIGxpYmpwZWcuYQorCSQoUk0pIHRlc3RvdXQqLioKKwordGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKKwkkKFJNKSB0ZXN0b3V0Ki4qCisJLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKKwkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUubWFueCBiL21ha2VmaWxlLm1hbngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiNDJkMQotLS0gL2Rldi9udWxsCisrKyBiL21ha2VmaWxlLm1hbngKQEAgLTAsMCArMSwyMTQgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgTWFueCBBenRlYyBDIHZlciA1LnguCisjIFRoYW5rcyB0byBELkouIEphbWVzIChkamphbWVzQGN1cC5wb3J0YWwuY29tKSBmb3IgdGhpcyB2ZXJzaW9uLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBjYworCisjIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKKyMgVW5jb21tZW50IGZvciBnZW5lcmljIDY4MDAwIGNvZGUgKHdpbGwgd29yayBvbiBhbnkgQW1pZ2EpCitBUkNIRkxBR1M9IC1zbgorCisjIFVuY29tbWVudCBmb3IgNjgwMjAvNjgwMzAgY29kZSAoZmFzdGVyLCBidXQgd29uJ3QgcnVuIG9uIDY4MDAwIENQVSkKKyNBUkNIRkxBR1M9IC1jMgorCitDRkxBR1M9IC1NQyAtTUQgJChBUkNIRkxBR1MpIC1zcGZhbSAtcjQKKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IC1nCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IC1sbWwgLWxjbAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgQW1pZ2Egd2UgcmVjb21tZW5kIGptZW1uYW1lLm8uCitTWVNERVBNRU09IGptZW1uYW1lLm8KKworIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgorIyBsaW5rZXIKK0xOPSBsbgorIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKK1JNPSBkZWxldGUgcXVpZXQKKyMgbGlicmFyeSAoLmxpYikgZmlsZSBjcmVhdGlvbiBjb21tYW5kCitBUj0gbGIKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKKyAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCisgICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKKyAgICAgICAgamZkY3RpbnQubworIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAorICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKKyAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAorICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubworIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAorICAgICAgICBjZGpwZWcubworRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCisgICAgICAgIGNkanBlZy5vCitUUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCisKKworYWxsOiBsaWJqcGVnLmxpYiBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQorCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQorCS0kKFJNKSBsaWJqcGVnLmxpYgorCSQoQVIpIGxpYmpwZWcubGliICAkKExJQk9CSkVDVFMpCisKK2NqcGVnOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCisKK2RqcGVnOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcgJChET0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCisKK2pwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworcmRqcGdjb206IHJkanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tIHJkanBnY29tLm8gJChMRExJQlMpCisKK3dyanBnY29tOiB3cmpwZ2NvbS5vCisJJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbSB3cmpwZ2NvbS5vICQoTERMSUJTKQorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJLSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBsaWJqcGVnLmxpYiByZGpwZ2NvbSB3cmpwZ2NvbQorCS0kKFJNKSBjb3JlIHRlc3RvdXQqLioKKwordGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KKwktJChSTSkgdGVzdG91dCouKgorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLm1jNiBiL21ha2VmaWxlLm1jNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWZmMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFrZWZpbGUubWM2CkBAIC0wLDAgKzEsMjQ5IEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBNaWNyb3NvZnQgQyBmb3IgTVMtRE9TLCB2ZXJzaW9uIDYuMDBBIGFuZCB1cC4KKyMgVXNlIE5NQUtFLCBub3QgTWljcm9zb2Z0J3MgYnJhaW4tZGFtYWdlZCBNQUtFLgorIyBUaGFua3MgdG8gQWxhbiBXcmlnaHQgYW5kIENocmlzIFR1cm5lciBvZiBPbGl2ZXR0aSBSZXNlYXJjaCBMdGQuCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm5tYWtlIiAhIQorCisjIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY29tcGlsZXIgb3B0aW9uczoKK0NGTEFHUyA9IC1BTSAtT2VjaWd0IC1HcyAtVzMKKyMgLUFNIG1lZGl1bSBtZW1vcnkgbW9kZWwgKG9yIHVzZSAtQVMgZm9yIHNtYWxsIG1vZGVsLCBpZiB5b3UgcmVtb3ZlIGZlYXR1cmVzKQorIyAtT2VjaWd0IC1HcyAgbWF4aW11bSBzYWZlIG9wdGltaXNhdGlvbiAoLU9sIGhhcyBidWdzIGluIE1TQyA2LjAwQSkKKyMgLVczIHdhcm5pbmcgbGV2ZWwgMworIyBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIGFkZCAtRzIgaWYgeW91IGhhdmUgYW4gODAyODYsIGV0Yy4KKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKworIyBKYW4tSGVybWFuIEJ1aW5pbmcgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBmb3IgTVMgQyA4LjAgYW5kIGEgNDg2OgorIyBDRkxBR1MgPSAvQU0gL2YtIC9GUGk4NyAvRzMgL0dzIC9HeSAvT2IxIC9PYyAvT2UgL09nIC9PaSAvT2wgL09uIC9PbyAvT3QgXAorIyAgICAgICAgICAvT1Y0IC9XMworIyBleGNlcHQgZm9yIGpxdWFudDEuYywgd2hpY2ggbXVzdCBiZSBjb21waWxlZCB3aXRoIC9Pby0gdG8gYXZvaWQgYSBjb21waWxlcgorIyBjcmFzaC4KKworIyBJbmdhciBTdGVpbnNsYW5kIHN1Z2dlc3RzIHRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgd2hlbiBidWlsZGluZworIyBhIDE2LWJpdCBXaW5kb3dzIERMTDoKKyMgQ0ZMQUdTID0gLUFMdyAtR3N3IC1acGUgLVczIC1PMiAtWmkgLVpkCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBET1MsIHdlIHJlY29tbWVuZCBqbWVtZG9zLmMgYW5kIGptZW1kb3NhLmFzbS4KKyMgKEJ1dCBub3QgZm9yIFdpbmRvd3M7IHNlZSBpbnN0YWxsLmRvYyBpZiB5b3UgdXNlIHRoaXMgbWFrZWZpbGUgZm9yIFdpbmRvd3MuKQorU1lTREVQTUVNPSBqbWVtZG9zLm9iaiBqbWVtZG9zYS5vYmoKKyMgU1lTREVQTUVNTElCIG11c3QgbGlzdCB0aGUgc2FtZSBmaWxlcyB3aXRoICIrIiBzaWducyBmb3IgdGhlIGxpYnJhcmlhbi4KK1NZU0RFUE1FTUxJQj0gK2ptZW1kb3Mub2JqICtqbWVtZG9zYS5vYmoKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKKyAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAorICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAorICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKKyAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCisgICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCisgICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAorICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagorRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAorICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagorVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCisKKyMgbmVlZCBsaW5rZXIgcmVzcG9uc2UgZmlsZSBiZWNhdXNlIGZpbGUgbGlzdCA+IDEyOCBjaGFycworUkZJTEUgPSBsaWJqcGVnLmFucworCisKK2FsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKSAkKFJGSUxFKQorCWRlbCBsaWJqcGVnLmxpYgorCWxpYiBAJChSRklMRSkKKworIyBsaW5rZXIgcmVzcG9uc2UgZmlsZSBmb3IgYnVpbGRpbmcgbGlianBlZy5saWIKKyQoUkZJTEUpIDogbWFrZWZpbGUKKwlkZWwgJChSRklMRSkKKwllY2hvIGxpYmpwZWcubGliID4kKFJGSUxFKQorIyBzaWxseSB3YW50LXRvLWNyZWF0ZS1pdCBwcm9tcHQ6CisJZWNobyB5ID4+JChSRklMRSkKKwllY2hvICtqY2FwaW1pbi5vYmogK2pjYXBpc3RkLm9iaiAramN0cmFucy5vYmogK2pjcGFyYW0ub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pkYXRhZHN0Lm9iaiAramNpbml0Lm9iaiAramNtYXN0ZXIub2JqICtqY21hcmtlci5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogK2pjY29lZmN0Lm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqY2NvbG9yLm9iaiAramNzYW1wbGUub2JqICtqY2h1ZmYub2JqICtqY3BodWZmLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqY2RjdG1nci5vYmogK2pmZGN0ZnN0Lm9iaiAramZkY3RmbHQub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pmZGN0aW50Lm9iaiAramRhcGltaW4ub2JqICtqZGFwaXN0ZC5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramR0cmFucy5vYmogK2pkYXRhc3JjLm9iaiAramRtYXN0ZXIub2JqICtqZGlucHV0Lm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqZG1hcmtlci5vYmogK2pkaHVmZi5vYmogK2pkcGh1ZmYub2JqICtqZG1haW5jdC5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramRjb2VmY3Qub2JqICtqZHBvc3RjdC5vYmogK2pkZGN0bWdyLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqaWRjdGZzdC5vYmogK2ppZGN0Zmx0Lm9iaiAramlkY3RpbnQub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2ppZGN0cmVkLm9iaiAramRzYW1wbGUub2JqICtqZGNvbG9yLm9iaiAranF1YW50MS5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAranF1YW50Mi5vYmogK2pkbWVyZ2Uub2JqICtqY29tYXBpLm9iaiAranV0aWxzLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqZXJyb3Iub2JqICtqbWVtbWdyLm9iaiAmID4+JChSRklMRSkKKwllY2hvICQoU1lTREVQTUVNTElCKSA7ID4+JChSRklMRSkKKworY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCWVjaG8gJChDT0JKRUNUUykgPmNqcGVnLmxzdAorCWxpbmsgL1NUQUNLOjQwOTYgL0VYRVBBQ0sgQGNqcGVnLmxzdCwgY2pwZWcuZXhlLCAsIGxpYmpwZWcubGliLCA7CisJZGVsIGNqcGVnLmxzdAorCitkanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisJZWNobyAkKERPQkpFQ1RTKSA+ZGpwZWcubHN0CisJbGluayAvU1RBQ0s6NDA5NiAvRVhFUEFDSyBAZGpwZWcubHN0LCBkanBlZy5leGUsICwgbGlianBlZy5saWIsIDsKKwlkZWwgZGpwZWcubHN0CisKK2pwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisJbGluayAvU1RBQ0s6NDA5NiAvRVhFUEFDSyAkKFRST0JKRUNUUyksIGpwZWd0cmFuLmV4ZSwgLCBsaWJqcGVnLmxpYiwgOworCityZGpwZ2NvbS5leGU6IHJkanBnY29tLmMKKwkkKENDKSAtQVMgLU8gLVczIHJkanBnY29tLmMKKworIyB3cmpwZ2NvbSBuZWVkcyBsYXJnZSBtb2RlbCBzbyBpdCBjYW4gbWFsbG9jIGEgNjRLIGNodW5rCit3cmpwZ2NvbS5leGU6IHdyanBnY29tLmMKKwkkKENDKSAtQUwgLU8gLVczIHdyanBnY29tLmMKKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKK2NsZWFuOgorCWRlbCAqLm9iagorCWRlbCBsaWJqcGVnLmxpYgorCWRlbCBjanBlZy5leGUKKwlkZWwgZGpwZWcuZXhlCisJZGVsIGpwZWd0cmFuLmV4ZQorCWRlbCByZGpwZ2NvbS5leGUKKwlkZWwgd3JqcGdjb20uZXhlCisJZGVsIHRlc3RvdXQqLioKKwordGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKKwlkZWwgdGVzdG91dCouKgorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWZjIC9iIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCisJZmMgL2IgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwlmYyAvYiB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwlmYyAvYiB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCisJZmMgL2IgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoranF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2ptZW1tZ3Iub2JqOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kub2JqOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm9iajogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbm9icy5vYmo6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vYmo6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm9iajogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2NqcGVnLm9iajogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcub2JqOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vYmo6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAorcmRqcGdjb20ub2JqOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vYmo6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vYmo6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRjb2xtYXAub2JqOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gub2JqOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAub2JqOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCityZHBwbS5vYmo6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vYmo6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vYmo6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmdpZi5vYmo6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm9iajogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vYmo6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkYm1wLm9iajogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm9iajogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm9iajogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycmxlLm9iajogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK2ptZW1kb3NhLm9iaiA6IGptZW1kb3NhLmFzbQorCW1hc20gL214ICQqOwpkaWZmIC0tZ2l0IGEvbWFrZWZpbGUubW1zIGIvbWFrZWZpbGUubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTMwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlZmlsZS5tbXMKQEAgLTAsMCArMSwyMTggQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgZm9yIHVzZSB3aXRoIE1NUyBvbiBEaWdpdGFsIFZNUyBzeXN0ZW1zLgorIyBUaGFua3MgdG8gUmljayBEeXNvbiAoZHlzb25AaW93YXNwLnBoeXNpY3MudWlvd2EuZWR1KQorIyBhbmQgVGltIEJlbGwgKHRiZWxsQG5ldGNvbS5jb20pIGZvciB0aGVpciBoZWxwLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJNTVMiICEhCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorQ0ZMQUdTPSAkKENGTEFHUykgL05vRGVidWcgL09wdGltaXplCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC9EZWZpbmUgc3dpdGNoZXMgaGVyZS4KKy5pZmRlZiBBTFBIQQorT1BUPQorLmVsc2UKK09QVD0gLFN5cyREaXNrOltdTUFLVk1TLk9QVC9PcHRpb24KKy5lbmRpZgorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAorIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KK1NZU0RFUE1FTT0gam1lbW5vYnMub2JqCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCisgICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKKyAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKKyAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCisgICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCisgICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAorICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAorICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagorIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5vbGIKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKKyAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKK0RPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKKyAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKK1RST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagorIyBvYmplY3RmaWxlIGxpc3RzIHdpdGggY29tbWFzIC0tLSB3aGF0IGEgY3JvY2sKK0NPQkpMSVNUPSBjanBlZy5vYmoscmRwcG0ub2JqLHJkZ2lmLm9iaixyZHRhcmdhLm9iaixyZHJsZS5vYmoscmRibXAub2JqLFwKKyAgICAgICAgICByZHN3aXRjaC5vYmosY2RqcGVnLm9iagorRE9CSkxJU1Q9IGRqcGVnLm9iaix3cnBwbS5vYmosd3JnaWYub2JqLHdydGFyZ2Eub2JqLHdycmxlLm9iaix3cmJtcC5vYmosXAorICAgICAgICAgIHJkY29sbWFwLm9iaixjZGpwZWcub2JqCitUUk9CSkxJU1Q9IGpwZWd0cmFuLm9iaixyZHN3aXRjaC5vYmosY2RqcGVnLm9iaix0cmFuc3VwcC5vYmoKK0xJQk9CSkxJU1Q9IGpjYXBpbWluLm9iaixqY2FwaXN0ZC5vYmosamN0cmFucy5vYmosamNwYXJhbS5vYmosamRhdGFkc3Qub2JqLFwKKyAgICAgICAgICBqY2luaXQub2JqLGpjbWFzdGVyLm9iaixqY21hcmtlci5vYmosamNtYWluY3Qub2JqLGpjcHJlcGN0Lm9iaixcCisgICAgICAgICAgamNjb2VmY3Qub2JqLGpjY29sb3Iub2JqLGpjc2FtcGxlLm9iaixqY2h1ZmYub2JqLGpjcGh1ZmYub2JqLFwKKyAgICAgICAgICBqY2RjdG1nci5vYmosamZkY3Rmc3Qub2JqLGpmZGN0Zmx0Lm9iaixqZmRjdGludC5vYmosamRhcGltaW4ub2JqLFwKKyAgICAgICAgICBqZGFwaXN0ZC5vYmosamR0cmFucy5vYmosamRhdGFzcmMub2JqLGpkbWFzdGVyLm9iaixqZGlucHV0Lm9iaixcCisgICAgICAgICAgamRtYXJrZXIub2JqLGpkaHVmZi5vYmosamRwaHVmZi5vYmosamRtYWluY3Qub2JqLGpkY29lZmN0Lm9iaixcCisgICAgICAgICAgamRwb3N0Y3Qub2JqLGpkZGN0bWdyLm9iaixqaWRjdGZzdC5vYmosamlkY3RmbHQub2JqLGppZGN0aW50Lm9iaixcCisgICAgICAgICAgamlkY3RyZWQub2JqLGpkc2FtcGxlLm9iaixqZGNvbG9yLm9iaixqcXVhbnQxLm9iaixqcXVhbnQyLm9iaixcCisgICAgICAgICAgamRtZXJnZS5vYmosamNvbWFwaS5vYmosanV0aWxzLm9iaixqZXJyb3Iub2JqLGptZW1tZ3Iub2JqLCQoU1lTREVQTUVNKQorCisKKy5maXJzdAorCUAtIERlZmluZSAvTm9Mb2cgU3lzIFN5cyRMaWJyYXJ5CisKK0FMTCA6IGxpYmpwZWcub2xiIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKKwlAIENvbnRpbnVlCisKK2xpYmpwZWcub2xiIDogJChMSUJPQkpFQ1RTKQorCUxpYnJhcnkgL0NyZWF0ZSBsaWJqcGVnLm9sYiAkKExJQk9CSkxJU1QpCisKK2NqcGVnLmV4ZSA6ICQoQ09CSkVDVFMpIGxpYmpwZWcub2xiCisJJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSBjanBlZy5leGUgJChDT0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQorCitkanBlZy5leGUgOiAkKERPQkpFQ1RTKSBsaWJqcGVnLm9sYgorCSQoTElOSykgJChMRkxBR1MpIC9FeGVjdXRhYmxlID0gZGpwZWcuZXhlICQoRE9CSkxJU1QpLGxpYmpwZWcub2xiL0xpYnJhcnkkKE9QVCkKKworanBlZ3RyYW4uZXhlIDogJChUUk9CSkVDVFMpIGxpYmpwZWcub2xiCisJJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSBqcGVndHJhbi5leGUgJChUUk9CSkxJU1QpLGxpYmpwZWcub2xiL0xpYnJhcnkkKE9QVCkKKworcmRqcGdjb20uZXhlIDogcmRqcGdjb20ub2JqCisJJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSByZGpwZ2NvbS5leGUgcmRqcGdjb20ub2JqJChPUFQpCisKK3dyanBnY29tLmV4ZSA6IHdyanBnY29tLm9iagorCSQoTElOSykgJChMRkxBR1MpIC9FeGVjdXRhYmxlID0gd3JqcGdjb20uZXhlIHdyanBnY29tLm9iaiQoT1BUKQorCitqY29uZmlnLmggOiBqY29uZmlnLnZtcworCUAtIENvcHkgamNvbmZpZy52bXMgamNvbmZpZy5oCisKK2NsZWFuIDoKKwlALSBTZXQgUHJvdGVjdGlvbiA9IE93bmVyOlJXRUQgKi4qOy0xCisJQC0gU2V0IFByb3RlY3Rpb24gPSBPd25lcjpSV0VEICouT0JKCisJLSBQdXJnZSAvTm9Mb2cgL05vQ29uZmlybSAqLioKKwktIERlbGV0ZSAvTm9Mb2cgL05vQ29uZmlybSAqLk9CSjsKKwordGVzdCA6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCisJbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSB0ZXN0b3JpZy5qcGcKKwltY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wIHRlc3RvcmlnLmpwZworCW1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50ICAgICAgLW91dGZpbGUgdGVzdG91dC5qcGcgdGVzdGltZy5wcG0KKwltY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwltY3Igc3lzJGRpc2s6W11janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KKwltY3Igc3lzJGRpc2s6W11qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCisJLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworCitqY2FwaW1pbi5vYmogOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqIDogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29lZmN0Lm9iaiA6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvbG9yLm9iaiA6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iaiA6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramNodWZmLm9iaiA6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNpbml0Lm9iaiA6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqIDogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFya2VyLm9iaiA6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hc3Rlci5vYmogOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmogOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BhcmFtLm9iaiA6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGh1ZmYub2JqIDogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqIDogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjc2FtcGxlLm9iaiA6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3RyYW5zLm9iaiA6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iaiA6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaXN0ZC5vYmogOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhdGFkc3Qub2JqIDogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqIDogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRjb2VmY3Qub2JqIDogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkY29sb3Iub2JqIDogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqIDogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZGh1ZmYub2JqIDogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGlucHV0Lm9iaiA6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iaiA6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hcmtlci5vYmogOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXN0ZXIub2JqIDogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqIDogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRwaHVmZi5vYmogOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZHBvc3RjdC5vYmogOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqIDogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkdHJhbnMub2JqIDogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramVycm9yLm9iaiA6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iaiA6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3Qub2JqIDogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGludC5vYmogOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iaiA6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3Qub2JqIDogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGludC5vYmogOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iaiA6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoranF1YW50MS5vYmogOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqcXVhbnQyLm9iaiA6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmogOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2ptZW1tZ3Iub2JqIDogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1hbnNpLm9iaiA6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqIDogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbm9icy5vYmogOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1kb3Mub2JqIDogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqIDogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2NqcGVnLm9iaiA6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2RqcGVnLm9iaiA6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iaiA6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAorcmRqcGdjb20ub2JqIDogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAord3JqcGdjb20ub2JqIDogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iaiA6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRjb2xtYXAub2JqIDogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3Jkc3dpdGNoLm9iaiA6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmogOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCityZHBwbS5vYmogOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JwcG0ub2JqIDogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iaiA6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmdpZi5vYmogOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmR0YXJnYS5vYmogOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iaiA6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkYm1wLm9iaiA6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmJtcC5vYmogOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqIDogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycmxlLm9iaiA6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5zYXMgYi9tYWtlZmlsZS5zYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5NmZhZgotLS0gL2Rldi9udWxsCisrKyBiL21ha2VmaWxlLnNhcwpAQCAtMCwwICsxLDI1MiBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgQW1pZ2Egc3lzdGVtcyB1c2luZyBTQVMgQyA2LjAgYW5kIHVwLgorIyBUaGFua3MgdG8gRWQgSGFud2F5LCBNYXJrIFJpbmZyZXQsIGFuZCBKaW0gWmVwZWRhLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBzYworCisjIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKKyMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgZm9yIGdlbmVyaWMgNjgweDAgdmVyc2lvbgorQVJDSEZMQUdTPSBjcHU9YW55CitTVUZGSVg9CisKKyMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgZm9yIDY4MDMwLW9ubHkgdmVyc2lvbgorI0FSQ0hGTEFHUz0gY3B1PTY4MDMwCisjU1VGRklYPS4wMzAKKworQ0ZMQUdTPSBub3N0YWNrY2hlY2sgZGF0YT1uZWFyIHBhcm1zPXJlZ2lzdGVyIG9wdGltaXplICQoQVJDSEZMQUdTKSBcCisJaWdub3JlPTEwNCBpZ25vcmU9MzA0IGlnbm9yZT0zMDYKKyMgaWdub3JlPTEwNCBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgbWlzbWF0Y2hlZCBjb25zdCBxdWFsaWZpZXJzCisjIGlnbm9yZT0zMDQgZGlzYWJsZXMgd2FybmluZ3MgZm9yIHZhcmlhYmxlcyBiZWluZyBvcHRpbWl6ZWQgb3V0CisjIGlnbm9yZT0zMDYgZGlzYWJsZXMgd2FybmluZ3MgZm9yIHRoZSBpbmxpbmluZyBvZiBmdW5jdGlvbnMKKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgZGVmaW5lIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIGNjIG9wdGlvbnM6CitMREZMQUdTPSBTQyBTRCBORCBCQVRDSAorCisjIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSBjb21tYW5kcyBoZXJlLgorTERMSUJTPSBMSUI6c2NtLmxpYiBMSUI6c2MubGliCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBBbWlnYSB3ZSByZWNvbW1lbmQgam1lbW5hbWUuby4KK1NZU0RFUE1FTT0gam1lbW5hbWUubworCisjIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCisjIGxpbmtlcgorTE49IHNsaW5rCisjIGZpbGUgZGVsZXRpb24gY29tbWFuZAorUk09IGRlbGV0ZSBxdWlldAorIyBsaWJyYXJ5ICgubGliKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBvbWwKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKKyAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCisgICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKKyAgICAgICAgamZkY3RpbnQubworIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAorICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKKyAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAorICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubworIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAorICAgICAgICBjZGpwZWcubworRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCisgICAgICAgIGNkanBlZy5vCitUUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCisKKworYWxsOiBsaWJqcGVnLmxpYiBjanBlZyQoU1VGRklYKSBkanBlZyQoU1VGRklYKSBqcGVndHJhbiQoU1VGRklYKSByZGpwZ2NvbSQoU1VGRklYKSB3cmpwZ2NvbSQoU1VGRklYKQorCisjIG5vdGU6IGRvIHNldmVyYWwgQVIgc3RlcHMgdG8gYXZvaWQgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdGF0aW9ucworCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQorCS0kKFJNKSBsaWJqcGVnLmxpYgorCSQoQVIpIGxpYmpwZWcubGliIHIgJChDTElCT0JKRUNUUykKKwkkKEFSKSBsaWJqcGVnLmxpYiByICQoRExJQk9CSkVDVFMpCisJJChBUikgbGlianBlZy5saWIgciAkKENPTU9CSkVDVFMpCisKK2NqcGVnJChTVUZGSVgpOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoTE4pIDxXSVRIIDwKKyQoTERGTEFHUykKK1RPIGNqcGVnJChTVUZGSVgpCitGUk9NIExJQjpjLm8gJChDT0JKRUNUUykKK0xJQiBsaWJqcGVnLmxpYiAkKExETElCUykKKzwKKworZGpwZWckKFNVRkZJWCk6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgPFdJVEggPAorJChMREZMQUdTKQorVE8gZGpwZWckKFNVRkZJWCkKK0ZST00gTElCOmMubyAkKERPQkpFQ1RTKQorTElCIGxpYmpwZWcubGliICQoTERMSUJTKQorPAorCitqcGVndHJhbiQoU1VGRklYKTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgPFdJVEggPAorJChMREZMQUdTKQorVE8ganBlZ3RyYW4kKFNVRkZJWCkKK0ZST00gTElCOmMubyAkKFRST0JKRUNUUykKK0xJQiBsaWJqcGVnLmxpYiAkKExETElCUykKKzwKKworcmRqcGdjb20kKFNVRkZJWCk6IHJkanBnY29tLm8KKwkkKExOKSA8V0lUSCA8CiskKExERkxBR1MpCitUTyByZGpwZ2NvbSQoU1VGRklYKQorRlJPTSBMSUI6Yy5vIHJkanBnY29tLm8KK0xJQiAkKExETElCUykKKzwKKword3JqcGdjb20kKFNVRkZJWCk6IHdyanBnY29tLm8KKwkkKExOKSA8V0lUSCA8CiskKExERkxBR1MpCitUTyB3cmpwZ2NvbSQoU1VGRklYKQorRlJPTSBMSUI6Yy5vIHdyanBnY29tLm8KK0xJQiAkKExETElCUykKKzwKKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKK2NsZWFuOgorCS0kKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gY2pwZWcuMDMwIGRqcGVnLjAzMCBqcGVndHJhbi4wMzAKKwktJChSTSkgcmRqcGdjb20gd3JqcGdjb20gcmRqcGdjb20uMDMwIHdyanBnY29tLjAzMAorCS0kKFJNKSBsaWJqcGVnLmxpYiBjb3JlIHRlc3RvdXQqLioKKwordGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KKwktJChSTSkgdGVzdG91dCouKgorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLnVuaXggYi9tYWtlZmlsZS51bml4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDU1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlZmlsZS51bml4CkBAIC0wLDAgKzEsMjI4IEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4KKyMgSWYgeW91IGhhdmUgYW4gQU5TSSBjb21waWxlciwgbWFrZWZpbGUuYW5zaSBpcyBhIGJldHRlciBzdGFydGluZyBwb2ludC4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKKworIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6CitDQz0gY2MKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IC1PCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisjIEhvd2V2ZXIsIGFueSBzcGVjaWFsIGRlZmluZXMgZm9yIGFuc2kya25yLmMgbWF5IGJlIGluY2x1ZGVkIGhlcmU6CitBTlNJMktOUkZMQUdTPSAKKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IAorCisjIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSAtbCBjb21tYW5kcyBoZXJlLgorTERMSUJTPSAKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIFVuaXggdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgbWF5IHdhbnQKKyMgdG8gdXNlIGptZW1hbnNpLm8gb3Igam1lbW5hbWUubyBpZiB5b3UgaGF2ZSBsaW1pdGVkIHN3YXAgc3BhY2UuCitTWVNERVBNRU09IGptZW1ub2JzLm8KKworIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgorIyBsaW5rZXIKK0xOPSAkKENDKQorIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKK1JNPSBybSAtZgorIyBmaWxlIHJlbmFtZSBjb21tYW5kCitNVj0gbXYKKyMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAorQVI9IGFyIHJjCisjIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQorQVIyPSByYW5saWIKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKKyAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCisgICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKKyAgICAgICAgamZkY3RpbnQubworIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAorICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKKyAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAorICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubworIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCitMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCisjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCitDT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK0RPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAorICAgICAgICBjZGpwZWcubworVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubworCisKK2FsbDogYW5zaTJrbnIgbGlianBlZy5hIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisKKyMgVGhpcyBydWxlIGNhdXNlcyBhbnNpMmtuciB0byBiZSBpbnZva2VkLgorLmMubzoKKwkuL2Fuc2kya25yICQqLmMgVCQqLmMKKwkkKENDKSAkKENGTEFHUykgLWMgVCQqLmMKKwkkKFJNKSBUJCouYyAkKi5vCisJJChNVikgVCQqLm8gJCoubworCithbnNpMmtucjogYW5zaTJrbnIuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKEFOU0kyS05SRkxBR1MpIC1vIGFuc2kya25yIGFuc2kya25yLmMKKworbGlianBlZy5hOiBhbnNpMmtuciAkKExJQk9CSkVDVFMpCisJJChSTSkgbGlianBlZy5hCisJJChBUikgbGlianBlZy5hICAkKExJQk9CSkVDVFMpCisJJChBUjIpIGxpYmpwZWcuYQorCitjanBlZzogYW5zaTJrbnIgJChDT0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCisKK2RqcGVnOiBhbnNpMmtuciAkKERPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworanBlZ3RyYW46IGFuc2kya25yICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCisKK3JkanBnY29tOiByZGpwZ2NvbS5vCisJJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS5vICQoTERMSUJTKQorCit3cmpwZ2NvbTogd3JqcGdjb20ubworCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKK2NsZWFuOgorCSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBsaWJqcGVnLmEgcmRqcGdjb20gd3JqcGdjb20KKwkkKFJNKSBhbnNpMmtuciBjb3JlIHRlc3RvdXQqCisKK3Rlc3Q6IGNqcGVnIGRqcGVnIGpwZWd0cmFuCisJJChSTSkgdGVzdG91dCoKKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCisJY21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJY21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCisJY21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJY21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWNtcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCisJY21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworCitqY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoranF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2ptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2NqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2RqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAorcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAord3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3Jkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCityZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS52YyBiL21ha2VmaWxlLnZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2YwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlZmlsZS52YwpAQCAtMCwwICsxLDIxMSBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgb24gV2luZG93cyBOVCAoYW5kIDk1PykuCisjIEl0IGJ1aWxkcyB0aGUgSUpHIGxpYnJhcnkgYXMgYSBzdGF0aWNhbGx5IGxpbmthYmxlIGxpYnJhcnkgKC5MSUIpLAorIyBhbmQgYnVpbGRzIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGFzIGNvbnNvbGUtbW9kZSBhcHBzLgorIyBUaGFua3MgdG8gWGluZ29uZyBDaGFuZywgUmF5bW9uZCBFdmVybHkgYW5kIG90aGVycy4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibm1ha2UiICEhCisjIFRvIGJ1aWxkIGFuIG9wdGltaXplZCBsaWJyYXJ5IHdpdGhvdXQgZGVidWcgaW5mbywgc2F5ICJubWFrZSBub2RlYnVnPTEiLgorCisjIFB1bGwgaW4gc3RhbmRhcmQgdmFyaWFibGUgZGVmaW5pdGlvbnMKKyFpbmNsdWRlIDx3aW4zMi5tYWs+CisKKyMgWW91IG1heSB3YW50IHRvIGFkanVzdCB0aGVzZSBjb21waWxlciBvcHRpb25zOgorQ0ZMQUdTPSAkKGNmbGFncykgJChjZGVidWcpICQoY3ZhcnMpIC1JLgorIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKKyMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgorCisjIExpbmstdGltZSBvcHRpb25zOgorTERGTEFHUz0gJChsZGVidWcpICQoY29ubGZsYWdzKQorCisjIFRvIGxpbmsgYW55IHNwZWNpYWwgbGlicmFyaWVzLCBhZGQgdGhlIG5lY2Vzc2FyeSBjb21tYW5kcyBoZXJlLgorTERMSUJTPSAkKGNvbmxpYnMpCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBOVCB3ZSBzdWdnZXN0IGptZW1ub2JzLm9iaiwgd2hpY2ggZXhwZWN0cyB0aGUgT1MgdG8KKyMgcHJvdmlkZSBhZGVxdWF0ZSB2aXJ0dWFsIG1lbW9yeS4KK1NZU0RFUE1FTT0gam1lbW5vYnMub2JqCisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gZGVsCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCisgICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKKyAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKKyAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCisgICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCisgICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAorICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAorICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagorIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKKyAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKK0RPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKKyAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKK1RST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagorCisjIFRlbXBsYXRlIGNvbW1hbmQgZm9yIGNvbXBpbGluZyAuYyB0byAub2JqCisuYy5vYmo6CisJJChjYykgJChDRkxBR1MpICQqLmMKKworCithbGw6IGxpYmpwZWcubGliIGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlIHJkanBnY29tLmV4ZSB3cmpwZ2NvbS5leGUKKworbGlianBlZy5saWI6ICQoTElCT0JKRUNUUykKKwkkKFJNKSBsaWJqcGVnLmxpYgorCWxpYiAtb3V0OmxpYmpwZWcubGliICAkKExJQk9CSkVDVFMpCisKK2NqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5saWIKKwkkKGxpbmspICQoTERGTEFHUykgLW91dDpjanBlZy5leGUgJChDT0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCisKK2RqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKKwkkKGxpbmspICQoTERGTEFHUykgLW91dDpkanBlZy5leGUgJChET0JKRUNUUykgbGlianBlZy5saWIgJChMRExJQlMpCisKK2pwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisJJChsaW5rKSAkKExERkxBR1MpIC1vdXQ6anBlZ3RyYW4uZXhlICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5vYmoKKwkkKGxpbmspICQoTERGTEFHUykgLW91dDpyZGpwZ2NvbS5leGUgcmRqcGdjb20ub2JqICQoTERMSUJTKQorCit3cmpwZ2NvbS5leGU6IHdyanBnY29tLm9iagorCSQobGluaykgJChMREZMQUdTKSAtb3V0OndyanBnY29tLmV4ZSB3cmpwZ2NvbS5vYmogJChMRExJQlMpCisKKworY2xlYW46CisJJChSTSkgKi5vYmogKi5leGUgbGlianBlZy5saWIKKwkkKFJNKSB0ZXN0b3V0KgorCit0ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQorCSQoUk0pIHRlc3RvdXQqCisJLlxkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKKwkuXGRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCS5cY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJLlxkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwkuXGNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCS5canBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUudm1zIGIvbWFrZWZpbGUudm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjM1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlZmlsZS52bXMKQEAgLTAsMCArMSwxNDIgQEAKKyQhIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKyQhCiskISBUaGlzIGlzIGEgY29tbWFuZCBwcm9jZWR1cmUgZm9yIERpZ2l0YWwgVk1TIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBNTVMuCiskISBJdCBidWlsZHMgdGhlIEpQRUcgc29mdHdhcmUgYnkgYnJ1dGUgZm9yY2UsIHJlY29tcGlsaW5nIGV2ZXJ5dGhpbmcgd2hldGhlcgorJCEgb3Igbm90IGl0IGlzIG5lY2Vzc2FyeS4gIEl0IHRoZW4gcnVucyB0aGUgYmFzaWMgc2VsZi10ZXN0LgorJCEgVGhhbmtzIHRvIFJpY2sgRHlzb24gKGR5c29uQGlvd2FzcC5waHlzaWNzLnVpb3dhLmVkdSkKKyQhIGFuZCBUaW0gQmVsbCAodGJlbGxAbmV0Y29tLmNvbSkgZm9yIHRoZWlyIGhlbHAuCiskIQorJCEgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBydW5uaW5nIHRoaXMhIQorJCEKKyQgSWYgRiRNb2RlICgpIC5lcXMuICJJTlRFUkFDVElWRSIKKyQgICBUaGVuCiskICAgICAgIFZFUklGWSA9IEYkVmVyaWZ5ICgwKQorJCAgIEVsc2UKKyQgICAgICAgVkVSSUZZID0gRiRWZXJpZnkgKDEpCiskIEVuZElmCiskIE9uIENvbnRyb2xfWSBUaGVuIEdvVG8gRW5kCiskIE9uIEVycm9yICAgICBUaGVuIEdvVG8gRW5kCiskCiskIElmIEYkR2V0U3lpICgiSFdfTU9ERUwiKSAuZ3QuIDEwMjMgCiskICAgVGhlbgorJCAgICAgICBPUFQgPSAiIgorJCAgIEVsc2UKKyQgICAgICAgT1BUID0gIixTeXMkRGlzazpbXW1ha3Ztcy5vcHQvT3B0aW9uIgorJCBFbmRJZgorJCAKKyQgRG9Db21waWxlIDo9IENDIC9Ob0RlYnVnIC9PcHRpbWl6ZSAvTm9MaXN0CiskIQorJCBEb0NvbXBpbGUgamNhcGltaW4uYworJCBEb0NvbXBpbGUgamNhcGlzdGQuYworJCBEb0NvbXBpbGUgamN0cmFucy5jCiskIERvQ29tcGlsZSBqY3BhcmFtLmMKKyQgRG9Db21waWxlIGpkYXRhZHN0LmMKKyQgRG9Db21waWxlIGpjaW5pdC5jCiskIERvQ29tcGlsZSBqY21hc3Rlci5jCiskIERvQ29tcGlsZSBqY21hcmtlci5jCiskIERvQ29tcGlsZSBqY21haW5jdC5jCiskIERvQ29tcGlsZSBqY3ByZXBjdC5jCiskIERvQ29tcGlsZSBqY2NvZWZjdC5jCiskIERvQ29tcGlsZSBqY2NvbG9yLmMKKyQgRG9Db21waWxlIGpjc2FtcGxlLmMKKyQgRG9Db21waWxlIGpjaHVmZi5jCiskIERvQ29tcGlsZSBqY3BodWZmLmMKKyQgRG9Db21waWxlIGpjZGN0bWdyLmMKKyQgRG9Db21waWxlIGpmZGN0ZnN0LmMKKyQgRG9Db21waWxlIGpmZGN0Zmx0LmMKKyQgRG9Db21waWxlIGpmZGN0aW50LmMKKyQgRG9Db21waWxlIGpkYXBpbWluLmMKKyQgRG9Db21waWxlIGpkYXBpc3RkLmMKKyQgRG9Db21waWxlIGpkdHJhbnMuYworJCBEb0NvbXBpbGUgamRhdGFzcmMuYworJCBEb0NvbXBpbGUgamRtYXN0ZXIuYworJCBEb0NvbXBpbGUgamRpbnB1dC5jCiskIERvQ29tcGlsZSBqZG1hcmtlci5jCiskIERvQ29tcGlsZSBqZGh1ZmYuYworJCBEb0NvbXBpbGUgamRwaHVmZi5jCiskIERvQ29tcGlsZSBqZG1haW5jdC5jCiskIERvQ29tcGlsZSBqZGNvZWZjdC5jCiskIERvQ29tcGlsZSBqZHBvc3RjdC5jCiskIERvQ29tcGlsZSBqZGRjdG1nci5jCiskIERvQ29tcGlsZSBqaWRjdGZzdC5jCiskIERvQ29tcGlsZSBqaWRjdGZsdC5jCiskIERvQ29tcGlsZSBqaWRjdGludC5jCiskIERvQ29tcGlsZSBqaWRjdHJlZC5jCiskIERvQ29tcGlsZSBqZHNhbXBsZS5jCiskIERvQ29tcGlsZSBqZGNvbG9yLmMKKyQgRG9Db21waWxlIGpxdWFudDEuYworJCBEb0NvbXBpbGUganF1YW50Mi5jCiskIERvQ29tcGlsZSBqZG1lcmdlLmMKKyQgRG9Db21waWxlIGpjb21hcGkuYworJCBEb0NvbXBpbGUganV0aWxzLmMKKyQgRG9Db21waWxlIGplcnJvci5jCiskIERvQ29tcGlsZSBqbWVtbWdyLmMKKyQgRG9Db21waWxlIGptZW1ub2JzLmMKKyQhCiskIExpYnJhcnkgL0NyZWF0ZSBsaWJqcGVnLm9sYiAgamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY3RyYW5zLm9iaiwgLQorICAgICAgICAgIGpjcGFyYW0ub2JqLGpkYXRhZHN0Lm9iaixqY2luaXQub2JqLGpjbWFzdGVyLm9iaixqY21hcmtlci5vYmosIC0KKyAgICAgICAgICBqY21haW5jdC5vYmosamNwcmVwY3Qub2JqLGpjY29lZmN0Lm9iaixqY2NvbG9yLm9iaixqY3NhbXBsZS5vYmosIC0KKyAgICAgICAgICBqY2h1ZmYub2JqLGpjcGh1ZmYub2JqLGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLCAtCisgICAgICAgICAgamZkY3RpbnQub2JqLGpkYXBpbWluLm9iaixqZGFwaXN0ZC5vYmosamR0cmFucy5vYmosamRhdGFzcmMub2JqLCAtCisgICAgICAgICAgamRtYXN0ZXIub2JqLGpkaW5wdXQub2JqLGpkbWFya2VyLm9iaixqZGh1ZmYub2JqLGpkcGh1ZmYub2JqLCAtCisgICAgICAgICAgamRtYWluY3Qub2JqLGpkY29lZmN0Lm9iaixqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaiwgLQorICAgICAgICAgIGppZGN0Zmx0Lm9iaixqaWRjdGludC5vYmosamlkY3RyZWQub2JqLGpkc2FtcGxlLm9iaixqZGNvbG9yLm9iaiwgLQorICAgICAgICAgIGpxdWFudDEub2JqLGpxdWFudDIub2JqLGpkbWVyZ2Uub2JqLGpjb21hcGkub2JqLGp1dGlscy5vYmosIC0KKyAgICAgICAgICBqZXJyb3Iub2JqLGptZW1tZ3Iub2JqLGptZW1ub2JzLm9iagorJCEKKyQgRG9Db21waWxlIGNqcGVnLmMKKyQgRG9Db21waWxlIHJkcHBtLmMKKyQgRG9Db21waWxlIHJkZ2lmLmMKKyQgRG9Db21waWxlIHJkdGFyZ2EuYworJCBEb0NvbXBpbGUgcmRybGUuYworJCBEb0NvbXBpbGUgcmRibXAuYworJCBEb0NvbXBpbGUgcmRzd2l0Y2guYworJCBEb0NvbXBpbGUgY2RqcGVnLmMKKyQhCiskIExpbmsgL05vTWFwIC9FeGVjdXRhYmxlID0gY2pwZWcuZXhlICBjanBlZy5vYmoscmRwcG0ub2JqLHJkZ2lmLm9iaiwgLQorICAgICAgICAgIHJkdGFyZ2Eub2JqLHJkcmxlLm9iaixyZGJtcC5vYmoscmRzd2l0Y2gub2JqLGNkanBlZy5vYmosbGlianBlZy5vbGIvTGlicmFyeSdPUFQnCiskIQorJCBEb0NvbXBpbGUgZGpwZWcuYworJCBEb0NvbXBpbGUgd3JwcG0uYworJCBEb0NvbXBpbGUgd3JnaWYuYworJCBEb0NvbXBpbGUgd3J0YXJnYS5jCiskIERvQ29tcGlsZSB3cnJsZS5jCiskIERvQ29tcGlsZSB3cmJtcC5jCiskIERvQ29tcGlsZSByZGNvbG1hcC5jCiskIERvQ29tcGlsZSBjZGpwZWcuYworJCEKKyQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBkanBlZy5leGUgIGRqcGVnLm9iaix3cnBwbS5vYmosd3JnaWYub2JqLCAtCisgICAgICAgICAgd3J0YXJnYS5vYmosd3JybGUub2JqLHdyYm1wLm9iaixyZGNvbG1hcC5vYmosY2RqcGVnLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKKyQhCiskIERvQ29tcGlsZSBqcGVndHJhbi5jCiskIERvQ29tcGlsZSByZHN3aXRjaC5jCiskIERvQ29tcGlsZSBjZGpwZWcuYworJCBEb0NvbXBpbGUgdHJhbnN1cHAuYworJCEKKyQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBqcGVndHJhbi5leGUgIGpwZWd0cmFuLm9iaixyZHN3aXRjaC5vYmosIC0KKyAgICAgICAgICBjZGpwZWcub2JqLHRyYW5zdXBwLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKKyQhCiskIERvQ29tcGlsZSByZGpwZ2NvbS5jCiskIExpbmsgL05vTWFwIC9FeGVjdXRhYmxlID0gcmRqcGdjb20uZXhlICByZGpwZ2NvbS5vYmonT1BUJworJCEKKyQgRG9Db21waWxlIHdyanBnY29tLmMKKyQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSB3cmpwZ2NvbS5leGUgIHdyanBnY29tLm9iaidPUFQnCiskIQorJCEgUnVuIHRoZSBzZWxmLXRlc3QKKyQhCiskIG1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gdGVzdG9yaWcuanBnCiskIG1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgdGVzdG9yaWcuanBnCiskIG1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50ICAgICAgLW91dGZpbGUgdGVzdG91dC5qcGcgdGVzdGltZy5wcG0KKyQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCiskIG1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorJCBtY3Igc3lzJGRpc2s6W11qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCiskIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKyQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCiskIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCiskIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKyQhCiskRW5kOgorJCAgIElmIFZlcmlmeSBUaGVuIFNldCBWZXJpZnkKKyQgRXhpdApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUud2F0IGIvbWFrZWZpbGUud2F0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTNlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlZmlsZS53YXQKQEAgLTAsMCArMSwyMzMgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFdhdGNvbSBDL0MrKyAxMC4wIG9uIE1TLURPUyAodXNpbmcKKyMgZG9zNGcgZXh0ZW5kZXIpLCBPUy8yLCBhbmQgV2luZG93cyBOVCBjb25zb2xlIG1vZGUuCisjIFRoYW5rcyB0byBKYW5vcyBIYWlkZSwgamhhaWRlQGJ0cnZ0ZWNoLmNvbS4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAid21ha2UiICEhCisKKyMgVW5jb21tZW50IGxpbmUgZm9yIGRlc2lyZWQgc3lzdGVtCitTWVNURU09RE9TCisjU1lTVEVNPU9TMgorI1NZU1RFTT1OVAorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSB3Y2wzODYKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IC00ciAtb3J0IC13eCAtenEgLWJ0PSQoU1lTVEVNKQorIyBDYXV0aW9uOiBhdm9pZCAtb2wgb3IgLW94OyB0aGVzZSBnZW5lcmF0ZSBiYWQgY29kZSB3aXRoIDEwLjAgb3IgMTAuMGEuCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIGNjIG9wdGlvbnM6CishaWZlcSBTWVNURU0gRE9TCitMREZMQUdTPSAtenEgLWw9ZG9zNGcKKyFlbHNlIGlmZXEgU1lTVEVNIE9TMgorTERGTEFHUz0gLXpxIC1sPW9zMnYyCishZWxzZSBpZmVxIFNZU1RFTSBOVAorTERGTEFHUz0gLXpxIC1sPW50CishZW5kaWYKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgam1lbW5vYnMgc2hvdWxkIHdvcmsgZmluZSBmb3IgZG9zNGcgb3IgT1MvMiBlbnZpcm9ubWVudC4KK1NZU0RFUE1FTT0gam1lbW5vYnMub2JqCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyAmCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgJgorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgJgorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyAmCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jICYKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgJgorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jICYKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyAmCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgJgorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oICYKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgJgorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgJgorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgJgorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgJgorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgJgorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zICYKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgJgorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzICYKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgJgorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgJgorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiAmCisgICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqICYKKyAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqICYKKyAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiAmCisgICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiAmCisgICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogJgorICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogJgorICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagorIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqICYKKyAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKK0RPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqICYKKyAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKK1RST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagorCisKK2FsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQorCS0gZGVsIGxpYmpwZWcubGliCisJKiB3bGliIC1uIGxpYmpwZWcubGliICQoTElCT0JKRUNUUykKKworY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoQ0MpICQoTERGTEFHUykgJChDT0JKRUNUUykgbGlianBlZy5saWIKKworZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoQ0MpICQoTERGTEFHUykgJChET0JKRUNUUykgbGlianBlZy5saWIKKworanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwkkKENDKSAkKExERkxBR1MpICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCityZGpwZ2NvbS5leGU6IHJkanBnY29tLmMKKwkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSByZGpwZ2NvbS5jCisKK3dyanBnY29tLmV4ZTogd3JqcGdjb20uYworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHdyanBnY29tLmMKKworLmMub2JqOgorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46IC5TWU1CT0xJQworCS0gZGVsICoub2JqCisJLSBkZWwgbGlianBlZy5saWIKKwktIGRlbCBjanBlZy5leGUKKwktIGRlbCBkanBlZy5leGUKKwktIGRlbCBqcGVndHJhbi5leGUKKwktIGRlbCByZGpwZ2NvbS5leGUKKwktIGRlbCB3cmpwZ2NvbS5leGUKKwktIGRlbCB0ZXN0b3V0Ki4qCisKK3Rlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlICAuU1lNQk9MSUMKKwktIGRlbCB0ZXN0b3V0Ki4qCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworIWlmZXEgU1lTVEVNIERPUworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCishZWxzZQorCWVjaG8gbiA+IG4udG1wCisJY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbSA8IG4udG1wCisJY29tcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcCA8IG4udG1wCisJY29tcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZyA8IG4udG1wCisJY29tcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0gPCBuLnRtcAorCWNvbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZyA8IG4udG1wCisJY29tcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnIDwgbi50bXAKKwlkZWwgbi50bXAKKyFlbmRpZgorCisKK2pjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3Iub2JqOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vYmo6IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3Qub2JqOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm9iajogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoranF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2ptZW1tZ3Iub2JqOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kub2JqOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm9iajogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbm9icy5vYmo6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vYmo6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm9iajogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2NqcGVnLm9iajogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcub2JqOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vYmo6IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAorcmRqcGdjb20ub2JqOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vYmo6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vYmo6IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRjb2xtYXAub2JqOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gub2JqOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAub2JqOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCityZHBwbS5vYmo6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vYmo6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vYmo6IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmdpZi5vYmo6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm9iajogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vYmo6IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkYm1wLm9iajogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm9iajogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm9iajogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycmxlLm9iajogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VsaWIuZHMgYi9tYWtlbGliLmRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWQzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlbGliLmRzCkBAIC0wLDAgKzEsMTA0NiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNC4yMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0CisKKyFJRiAiJChDRkcpIiA9PSAiIgorQ0ZHPWpwZWcgLSBXaW4zMgorIU1FU1NBR0UgTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuICBEZWZhdWx0aW5nIHRvIGpwZWcgLSBXaW4zMi4KKyFFTkRJRiAKKworIUlGICIkKENGRykiICE9ICJqcGVnIC0gV2luMzIiCishTUVTU0FHRSBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gIiQoQ0ZHKSIgc3BlY2lmaWVkLgorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0Ugb24gdGhpcyBtYWtlZmlsZQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVnLm1hayIgQ0ZHPSJqcGVnIC0gV2luMzIiCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAianBlZyAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFIAorIUVSUk9SIEFuIGludmFsaWQgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQuCishRU5ESUYgCisKKyFJRiAiJChPUykiID09ICJXaW5kb3dzX05UIgorTlVMTD0KKyFFTFNFIAorTlVMTD1udWwKKyFFTkRJRiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBUYXJnZXRfTGFzdF9TY2FubmVkICJqcGVnIC0gV2luMzIiCitDUFA9Y2wuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImpwZWcgLSBXaW4zMiIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitPVVRESVI9LlxSZWxlYXNlCitJTlRESVI9LlxSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilcanBlZy5saWIiCisKK0NMRUFOIDogCisJLUBlcmFzZSAiJChJTlRESVIpXGpjYXBpbWluLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNhcGlzdGQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY3RyYW5zLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNwYXJhbS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNpbml0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNtYXN0ZXIub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY21hcmtlci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNwcmVwY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjY29sb3Iub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjaHVmZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjcGh1ZmYub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2RjdG1nci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamZkY3RmbHQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGludC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkYXBpbWluLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRhcGlzdGQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZHRyYW5zLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRhdGFzcmMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZG1hc3Rlci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkaW5wdXQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZG1hcmtlci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkaHVmZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkcGh1ZmYub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZG1haW5jdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRwb3N0Y3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGRjdG1nci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamlkY3RmbHQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGludC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGppZGN0cmVkLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRzYW1wbGUub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGNvbG9yLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcanF1YW50MS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpxdWFudDIub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZG1lcmdlLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNvbWFwaS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGp1dGlscy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGplcnJvci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGptZW1tZ3Iub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqbWVtbm9icy5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXGpwZWcubGliIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCitDUFBfUFJPSj0vbm9sb2dvIC9NTCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyJcCisgL0ZwIiQoSU5URElSKS9qcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5cUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvanBlZy5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElCMzI9bGluay5leGUgLWxpYgorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCisjIEFERCBMSUIzMiAvbm9sb2dvCitMSUIzMl9GTEFHUz0vbm9sb2dvIC9vdXQ6IiQoT1VURElSKS9qcGVnLmxpYiIgCitMSUIzMl9PQkpTPSBcCisJIiQoSU5URElSKVxqY2FwaW1pbi5vYmoiIFwKKwkiJChJTlRESVIpXGpjYXBpc3RkLm9iaiIgXAorCSIkKElOVERJUilcamN0cmFucy5vYmoiIFwKKwkiJChJTlRESVIpXGpjcGFyYW0ub2JqIiBcCisJIiQoSU5URElSKVxqZGF0YWRzdC5vYmoiIFwKKwkiJChJTlRESVIpXGpjaW5pdC5vYmoiIFwKKwkiJChJTlRESVIpXGpjbWFzdGVyLm9iaiIgXAorCSIkKElOVERJUilcamNtYXJrZXIub2JqIiBcCisJIiQoSU5URElSKVxqY21haW5jdC5vYmoiIFwKKwkiJChJTlRESVIpXGpjcHJlcGN0Lm9iaiIgXAorCSIkKElOVERJUilcamNjb2VmY3Qub2JqIiBcCisJIiQoSU5URElSKVxqY2NvbG9yLm9iaiIgXAorCSIkKElOVERJUilcamNzYW1wbGUub2JqIiBcCisJIiQoSU5URElSKVxqY2h1ZmYub2JqIiBcCisJIiQoSU5URElSKVxqY3BodWZmLm9iaiIgXAorCSIkKElOVERJUilcamNkY3RtZ3Iub2JqIiBcCisJIiQoSU5URElSKVxqZmRjdGZzdC5vYmoiIFwKKwkiJChJTlRESVIpXGpmZGN0Zmx0Lm9iaiIgXAorCSIkKElOVERJUilcamZkY3RpbnQub2JqIiBcCisJIiQoSU5URElSKVxqZGFwaW1pbi5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXBpc3RkLm9iaiIgXAorCSIkKElOVERJUilcamR0cmFucy5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXRhc3JjLm9iaiIgXAorCSIkKElOVERJUilcamRtYXN0ZXIub2JqIiBcCisJIiQoSU5URElSKVxqZGlucHV0Lm9iaiIgXAorCSIkKElOVERJUilcamRtYXJrZXIub2JqIiBcCisJIiQoSU5URElSKVxqZGh1ZmYub2JqIiBcCisJIiQoSU5URElSKVxqZHBodWZmLm9iaiIgXAorCSIkKElOVERJUilcamRtYWluY3Qub2JqIiBcCisJIiQoSU5URElSKVxqZGNvZWZjdC5vYmoiIFwKKwkiJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIgXAorCSIkKElOVERJUilcamRkY3RtZ3Iub2JqIiBcCisJIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiIFwKKwkiJChJTlRESVIpXGppZGN0Zmx0Lm9iaiIgXAorCSIkKElOVERJUilcamlkY3RpbnQub2JqIiBcCisJIiQoSU5URElSKVxqaWRjdHJlZC5vYmoiIFwKKwkiJChJTlRESVIpXGpkc2FtcGxlLm9iaiIgXAorCSIkKElOVERJUilcamRjb2xvci5vYmoiIFwKKwkiJChJTlRESVIpXGpxdWFudDEub2JqIiBcCisJIiQoSU5URElSKVxqcXVhbnQyLm9iaiIgXAorCSIkKElOVERJUilcamRtZXJnZS5vYmoiIFwKKwkiJChJTlRESVIpXGpjb21hcGkub2JqIiBcCisJIiQoSU5URElSKVxqdXRpbHMub2JqIiBcCisJIiQoSU5URElSKVxqZXJyb3Iub2JqIiBcCisJIiQoSU5URElSKVxqbWVtbWdyLm9iaiIgXAorCSIkKElOVERJUilcam1lbW5vYnMub2JqIgorCisiJChPVVRESVIpXGpwZWcubGliIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElCMzJfT0JKUykKKyAgICAkKExJQjMyKSBAPDwKKyAgJChMSUIzMl9GTEFHUykgJChERUZfRkxBR1MpICQoTElCMzJfT0JKUykKKzw8CisKKyFFTkRJRiAKKworLmN7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jcHB7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeHh7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3BweyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3h4eyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJqcGVnIC0gV2luMzIiCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImpwZWcgLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjYXBpbWluLmMiCitERVBfQ1BQX0pDQVBJPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNhcGltaW4ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNBUEkpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNhcGlzdGQuYyIKK0RFUF9DUFBfSkNBUElTPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNhcGlzdGQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNBUElTKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjY29lZmN0LmMiCitERVBfQ1BQX0pDQ09FPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNjb2VmY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNDT0UpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNjb2xvci5jIgorREVQX0NQUF9KQ0NPTD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjY29sb3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNDT0wpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNkY3RtZ3IuYyIKK0RFUF9DUFBfSkNEQ1Q9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqY2RjdG1nci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0RDVCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2h1ZmYuYyIKK0RFUF9DUFBfSkNIVUY9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamNodWZmLmgiXAorCQorCisiJChJTlRESVIpXGpjaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0hVRikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2luaXQuYyIKK0RFUF9DUFBfSkNJTkk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY2luaXQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNJTkkpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNtYWluY3QuYyIKK0RFUF9DUFBfSkNNQUk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY21haW5jdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ01BSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY21hcmtlci5jIgorREVQX0NQUF9KQ01BUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjbWFya2VyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDTUFSKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjbWFzdGVyLmMiCitERVBfQ1BQX0pDTUFTPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNtYXN0ZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNNQVMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNvbWFwaS5jIgorREVQX0NQUF9KQ09NQT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjb21hcGkub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNPTUEpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNwYXJhbS5jIgorREVQX0NQUF9KQ1BBUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjcGFyYW0ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNQQVIpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNwaHVmZi5jIgorREVQX0NQUF9KQ1BIVT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqY2h1ZmYuaCJcCisJCisKKyIkKElOVERJUilcamNwaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1BIVSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY3ByZXBjdC5jIgorREVQX0NQUF9KQ1BSRT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjcHJlcGN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDUFJFKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Impjc2FtcGxlLmMiCitERVBfQ1BQX0pDU0FNPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNzYW1wbGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNTQU0pICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamN0cmFucy5jIgorREVQX0NQUF9KQ1RSQT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjdHJhbnMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNUUkEpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRhcGltaW4uYyIKK0RFUF9DUFBfSkRBUEk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGFwaW1pbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KREFQSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGFwaXN0ZC5jIgorREVQX0NQUF9KREFQSVM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KREFQSVMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRhdGFkc3QuYyIKK0RFUF9DUFBfSkRBVEE9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGF0YWRzdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KREFUQSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGF0YXNyYy5jIgorREVQX0NQUF9KREFUQVM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KREFUQVMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRjb2VmY3QuYyIKK0RFUF9DUFBfSkRDT0U9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGNvZWZjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRENPRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGNvbG9yLmMiCitERVBfQ1BQX0pEQ09MPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamRjb2xvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRENPTCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGRjdG1nci5jIgorREVQX0NQUF9KRERDVD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGpkZGN0bWdyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pERENUKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkaHVmZi5jIgorREVQX0NQUF9KREhVRj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGh1ZmYuaCJcCisJCisKKyIkKElOVERJUilcamRodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pESFVGKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkaW5wdXQuYyIKK0RFUF9DUFBfSkRJTlA9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGlucHV0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pESU5QKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkbWFpbmN0LmMiCitERVBfQ1BQX0pETUFJPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamRtYWluY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNQUkpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRtYXJrZXIuYyIKK0RFUF9DUFBfSkRNQVI9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZG1hcmtlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1BUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZG1hc3Rlci5jIgorREVQX0NQUF9KRE1BUz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUFTKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkbWVyZ2UuYyIKK0RFUF9DUFBfSkRNRVI9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZG1lcmdlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUVSKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkcGh1ZmYuYyIKK0RFUF9DUFBfSkRQSFU9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRodWZmLmgiXAorCQorCisiJChJTlRESVIpXGpkcGh1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRQSFUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRwb3N0Y3QuYyIKK0RFUF9DUFBfSkRQT1M9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZHBvc3RjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFBPUykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZHNhbXBsZS5jIgorREVQX0NQUF9KRFNBTT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkc2FtcGxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEU0FNKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkdHJhbnMuYyIKK0RFUF9DUFBfSkRUUkE9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZHRyYW5zLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEVFJBKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImplcnJvci5jIgorREVQX0NQUF9KRVJSTz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianZlcnNpb24uaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZXJyb3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkVSUk8pICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamZkY3RmbHQuYyIKK0RFUF9DUFBfSkZEQ1Q9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRkRDVCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZmRjdGZzdC5jIgorREVQX0NQUF9KRkRDVEY9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqZmRjdGZzdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRkRDVEYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamZkY3RpbnQuYyIKK0RFUF9DUFBfSkZEQ1RJPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkY3QuaCJcCisJCisKKyIkKElOVERJUilcamZkY3RpbnQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkZEQ1RJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImppZGN0Zmx0LmMiCitERVBfQ1BQX0pJRENUPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkY3QuaCJcCisJCisKKyIkKElOVERJUilcamlkY3RmbHQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1QpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamlkY3Rmc3QuYyIKK0RFUF9DUFBfSklEQ1RGPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkY3QuaCJcCisJCisKKyIkKElOVERJUilcamlkY3Rmc3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1RGKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImppZGN0aW50LmMiCitERVBfQ1BQX0pJRENUST1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGppZGN0aW50Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENUSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqaWRjdHJlZC5jIgorREVQX0NQUF9KSURDVFI9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqaWRjdHJlZC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVFIpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0ianF1YW50MS5jIgorREVQX0NQUF9KUVVBTj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpxdWFudDEub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlFVQU4pICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0ianF1YW50Mi5jIgorREVQX0NQUF9KUVVBTlQ9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqcXVhbnQyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pRVUFOVCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqdXRpbHMuYyIKK0RFUF9DUFBfSlVUSUw9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqdXRpbHMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlVUSUwpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iam1lbW1nci5jIgorREVQX0NQUF9KTUVNTT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqbWVtc3lzLmgiXAorCQorCisiJChJTlRESVIpXGptZW1tZ3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSk1FTU0pICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iam1lbW5vYnMuYyIKK0RFUF9DUFBfSk1FTU49XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiam1lbXN5cy5oIlwKKwkKKworIiQoSU5URElSKVxqbWVtbm9icy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KTUVNTikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCmRpZmYgLS1naXQgYS9tYWtlcHJvai5tYWMgYi9tYWtlcHJvai5tYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyNzdjOAotLS0gL2Rldi9udWxsCisrKyBiL21ha2Vwcm9qLm1hYwpAQCAtMCwwICsxLDIxMyBAQAorLS0KKy0tIG1ha2Vwcm9qLm1hYworLS0KKy0tIFRoaXMgQXBwbGVTY3JpcHQgYnVpbGRzIENvZGUgV2FycmlvciBQUk8gUmVsZWFzZSAyIHByb2plY3QgZmlsZXMgZm9yIHRoZQorLS0gbGlianBlZyBsaWJyYXJ5IGFzIHdlbGwgYXMgdGhlIHRlc3QgcHJvZ3JhbXMgJ2NqcGVnJywgJ2RqcGVnJywgJ2pwZWd0cmFuJy4KKy0tIChXZSdkIGRpc3RyaWJ1dGUgcmVhbCBwcm9qZWN0IGZpbGVzLCBleGNlcHQgdGhleSdyZSBub3QgdGV4dAorLS0gYW5kIHdvdWxkIGNyZWF0ZSBtYWludGVuYW5jZSBoZWFkYWNoZXMuKQorLS0KKy0tIFRoZSBzY3JpcHQgdGhlbiBjb21waWxlcyBhbmQgbGlua3MgdGhlIGxpYnJhcnkgYW5kIHRoZSB0ZXN0IHByb2dyYW1zLgorLS0gTk9URTogaWYgeW91IGhhdmVuJ3QgYWxyZWFkeSBjcmVhdGVkIGEgJ2pjb25maWcuaCcgZmlsZSwgdGhlIHNjcmlwdAorLS0gYXV0b21hdGljYWxseSBjb3BpZXMgJ2pjb25maWcubWFjJyB0byAnamNvbmZpZy5oJy4KKy0tCistLSBUbyB1c2UgdGhpcyBzY3JpcHQsIHlvdSBtdXN0IGhhdmUgQXBwbGVTY3JpcHQgMS4xIG9yIGxhdGVyIGluc3RhbGxlZAorLS0gYW5kIGEgc3VpdGFibGUgQXBwbGVTY3JpcHQgZWRpdG9yIGxpa2UgU2NyaXB0IEVkaXRvciBvciBTY3JpcHQgRGVidWdnZXIKKy0tIChodHRwOi8vd3d3LmxhdGVuaWdodHN3LmNvbSkuIE9wZW4gdGhpcyBmaWxlIHdpdGggeW91ciBBcHBsZVNjcmlwdAorLS0gZWRpdG9yIGFuZCBleGVjdXRlIHRoZSAicnVuIiBjb21tYW5kIHRvIGJ1aWxkIHRoZSBwcm9qZWN0cy4KKy0tCistLSBUaGFua3MgdG8gRGFuIFNlYXJzIGFuZCBEb24gQWdybyBmb3IgdGhpcyBzY3JpcHQuCistLSBRdWVzdGlvbnMgYWJvdXQgdGhpcyBzY3JpcHQgY2FuIGJlIGFkZHJlc3NlZCB0byBkb2dwYXJrQGludGVybG9nLmNvbQorLS0KKworb24gcnVuCisKKwljaG9vc2UgZm9sZGVyIHdpdGggcHJvbXB0ICI+Pj4gU2VsZWN0IElKRyBzb3VyY2UgZm9sZGVyIDw8PCIKKwlzZXQgaWpnX2ZvbGRlciB0byByZXN1bHQKKworCWNob29zZSBmb2xkZXIgd2l0aCBwcm9tcHQgIj4+PiBTZWxlY3QgTWV0cm9XZXJrcyBmb2xkZXIgPDw8IgorCXNldCBjd19mb2xkZXIgdG8gcmVzdWx0CisKKwktLSBpZiBqY29uZmlnLmggZG9lc24ndCBhbHJlYWR5IGV4aXN0LCBjb3B5IGpjb25maWcubWFjCisKKwl0ZWxsIGFwcGxpY2F0aW9uICJGaW5kZXIiCisJCWlmIG5vdCAoZXhpc3RzIGZpbGUgImpjb25maWcuaCIgb2YgaWpnX2ZvbGRlcikgdGhlbgorCQkJZHVwbGljYXRlIHtmaWxlICJqY29uZmlnLm1hYyIgb2YgZm9sZGVyIGlqZ19mb2xkZXJ9CisJCQlzZWxlY3QgZmlsZSAiamNvbmZpZy5tYWMgY29weSIgb2YgZm9sZGVyIGlqZ19mb2xkZXIKKwkJCXNldCBuYW1lIG9mIHNlbGVjdGlvbiB0byAiamNvbmZpZy5oIgorCQllbmQgaWYKKwllbmQgdGVsbAorCisJdGVsbCBhcHBsaWNhdGlvbiAiQ29kZVdhcnJpb3IgSURFIDIuMSIKKwkgIHdpdGggdGltZW91dCBvZiAxMDAwMCBzZWNvbmRzCisKKwkJLS0gY3JlYXRlIGxpYmpwZWcgcHJvamVjdAorCisJCWFjdGl2YXRlCisJCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZy5wcm9qIgorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJsaWJqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToibGlianBlZyJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge1Byb2plY3QgVHlwZTpsaWJyYXJ5fQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQorCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjYXBpbWluLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2FwaXN0ZC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamN0cmFucy5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwYXJhbS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhdGFkc3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjaW5pdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNtYXN0ZXIuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjbWFya2VyLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY21haW5jdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwcmVwY3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjY29lZmN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2NvbG9yLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3NhbXBsZS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNodWZmLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3BodWZmLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2RjdG1nci5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamZkY3Rmc3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpmZGN0Zmx0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZmRjdGludC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhcGltaW4uYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkYXBpc3RkLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHRyYW5zLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGF0YXNyYy5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYXN0ZXIuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkaW5wdXQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWFya2VyLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGh1ZmYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkcGh1ZmYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWFpbmN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGNvZWZjdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRwb3N0Y3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkZGN0bWdyLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdGZzdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamlkY3RmbHQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0aW50LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdHJlZC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRzYW1wbGUuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkY29sb3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpxdWFudDEuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpxdWFudDIuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWVyZ2UuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjb21hcGkuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImp1dGlscy5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamVycm9yLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqbWVtbWdyLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqbWVtbWFjLmMiIFRvIFNlZ21lbnQgMQorCisJCS0tIGNvbXBpbGUgYW5kIGxpbmsgdGhlIGxpYnJhcnkKKworCQlNYWtlIFByb2plY3QKKwkJQ2xvc2UgUHJvamVjdAorCisJCS0tIGNyZWF0ZSBjanBlZyBwcm9qZWN0CisKKwkJYWN0aXZhdGUKKwkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjanBlZy5wcm9qIgorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJjanBlZyJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIFByb2plY3QiIHRvIHtGaWxlIE5hbWU6ImNqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQorCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNqcGVnLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZHBwbS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRnaWYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkdGFyZ2EuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkcmxlLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZGJtcC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRzd2l0Y2guYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKKworCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnIiBUbyBTZWdtZW50IDIKKworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgQy5QUEMuTGliIiBUbyBTZWdtZW50IDMKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIFNJT1VYLlBQQy5MaWIiIFRvIFNlZ21lbnQgMworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6UnVudGltZTpSdW50aW1lIFBQQzpNU0wgUnVudGltZVBQQy5MaWIiIFRvIFNlZ21lbnQgMworCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246SW50ZXJmYWNlTGliIiBUbyBTZWdtZW50IDQKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpNYXRoTGliIiBUbyBTZWdtZW50IDQKKworCQktLSBjb21waWxlIGFuZCBsaW5rIGNqcGVnCisKKwkJTWFrZSBQcm9qZWN0CisJCUNsb3NlIFByb2plY3QKKworCQktLSBjcmVhdGUgZGpwZWcgcHJvamVjdAorCisJCWFjdGl2YXRlCisJCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiZGpwZWcucHJvaiIKKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtUYXJnZXQgTmFtZToiZGpwZWcifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJkanBlZyJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0FOU0kgU3RyaWN0OnRydWV9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtFbnVtcyBBbHdheXMgSW50czp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBDb2RlZ2VuIiB0byB7U3RydWN0IEFsaWdubWVudDpQb3dlclBDfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBMaW5rZXIiIHRvIHtHZW5lcmF0ZSBTWU0gRmlsZTpmYWxzZX0KKworCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJkanBlZy5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JwcG0uYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndyZ2lmLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnRhcmdhLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnJsZS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JibXAuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkY29sbWFwLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjZGpwZWcuYyIgVG8gU2VnbWVudCAxCisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZyIgVG8gU2VnbWVudCAyCisKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIEMuUFBDLkxpYiIgVG8gU2VnbWVudCAzCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBTSU9VWC5QUEMuTGliIiBUbyBTZWdtZW50IDMKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIFJ1bnRpbWVQUEMuTGliIiBUbyBTZWdtZW50IDMKKworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOkludGVyZmFjZUxpYiIgVG8gU2VnbWVudCA0CisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246TWF0aExpYiIgVG8gU2VnbWVudCA0CisKKwkJLS0gY29tcGlsZSBhbmQgbGluayBkanBlZworCisJCU1ha2UgUHJvamVjdAorCQlDbG9zZSBQcm9qZWN0CisKKwkJLS0gY3JlYXRlIGpwZWd0cmFuIHByb2plY3QKKworCQlhY3RpdmF0ZQorCQlDcmVhdGUgUHJvamVjdCAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpwZWd0cmFuLnByb2oiCisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImpwZWd0cmFuIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToianBlZ3RyYW4ifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge0xpbmtlcjoiTWFjT1MgUFBDIExpbmtlciJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9CisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianBlZ3RyYW4uYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkc3dpdGNoLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJjZGpwZWcuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInRyYW5zdXBwLmMiIFRvIFNlZ21lbnQgMQorCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImxpYmpwZWciIFRvIFNlZ21lbnQgMgorCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBDLlBQQy5MaWIiIFRvIFNlZ21lbnQgMworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgU0lPVVguUFBDLkxpYiIgVG8gU2VnbWVudCAzCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBSdW50aW1lUFBDLkxpYiIgVG8gU2VnbWVudCAzCisKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpJbnRlcmZhY2VMaWIiIFRvIFNlZ21lbnQgNAorCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOk1hdGhMaWIiIFRvIFNlZ21lbnQgNAorCisJCS0tIGNvbXBpbGUgYW5kIGxpbmsganBlZ3RyYW4KKworCQlNYWtlIFByb2plY3QKKwkJQ2xvc2UgUHJvamVjdAorCisJCXF1aXQKKworCSAgZW5kIHRpbWVvdXQKKwllbmQgdGVsbAorZW5kIHJ1bgpkaWZmIC0tZ2l0IGEvbWFrbGpwZWcuc3QgYi9tYWtsanBlZy5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM0OTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWFrbGpwZWcuc3QKQEAgLTAsMCArMSw3MCBAQAorOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorOworOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCis7IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAorOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7Cis7IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBsaWJqcGVnLnByai4KKzsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKKzsKKzsKKzsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgorbGlianBlZy5saWIKKzsKKzsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCisuQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKKy5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCisuQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCisuQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKKy5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKKy5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAorLkxbLUpdICAgICAgICA7IGxpbmsgbmV3IE9iai1mb3JtYXQgKHNvIHdlIGdldCBhIGxpYnJhcnkpCis9Cis7ICogKiAqICogTGlzdCBvZiBtb2R1bGVzICogKiAqICogCitqY2FwaW1pbi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqY2FwaXN0ZC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqY2NvZWZjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqY2NvbG9yLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjZGN0bWdyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCitqY2h1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpjaHVmZi5oKQoramNpbml0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjbWFpbmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjbWFya2VyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjbWFzdGVyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjb21hcGkuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNwYXJhbS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqY3BodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqY2h1ZmYuaCkKK2pjcHJlcGN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjc2FtcGxlLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjdHJhbnMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRhcGltaW4uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRhcGlzdGQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRhdGFkc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgpCitqZGF0YXNyYy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCkKK2pkY29lZmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkY29sb3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRkY3RtZ3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2pkaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRodWZmLmgpCitqZGlucHV0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkbWFpbmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkbWFya2VyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkbWFzdGVyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkbWVyZ2UuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRwaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRodWZmLmgpCitqZHBvc3RjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZHNhbXBsZS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZHRyYW5zLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2plcnJvci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqdmVyc2lvbi5oLGplcnJvci5oKQoramZkY3RmbHQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2pmZGN0ZnN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCitqZmRjdGludC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramlkY3RmbHQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2ppZGN0ZnN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCitqaWRjdGludC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramlkY3RyZWQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2pxdWFudDEuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoranF1YW50Mi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqdXRpbHMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoram1lbW1nci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsam1lbXN5cy5oKQoram1lbWFuc2kuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGptZW1zeXMuaCkKZGlmZiAtLWdpdCBhL21ha3RqcGVnLnN0IGIvbWFrdGpwZWcuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmNGQxNgotLS0gL2Rldi9udWxsCisrKyBiL21ha3RqcGVnLnN0CkBAIC0wLDAgKzEsMzIgQEAKKzsgUHJvamVjdCBmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKzsKKzsgVGhpcyBwcm9qZWN0IGZpbGUgaXMgZm9yIEF0YXJpIFNUL1NURS9UVCBzeXN0ZW1zIHVzaW5nIFB1cmUgQyBvciBUdXJibyBDLgorOyBUaGFua3MgdG8gRnJhbmsgTW9laGxlIChGcmFuay5Nb2VobGVAYXJiaS5pbmZvcm1hdGlrLnVuaS1vbGRlbmJ1cmcuZGUpLAorOyBEci4gQi4gU2V0emVwZmFuZHQgKGJlcm5kQGdpbmEudW5pLW11ZW5zdGVyLmRlKSwKKzsgYW5kIEd1aWRvIFZvbGxiZWRpbmcgKGd1aXZvbEBlc2MuZGUpLgorOworOyBUbyB1c2UgdGhpcyBmaWxlLCByZW5hbWUgaXQgdG8ganBlZ3RyYW4ucHJqLgorOyBJZiB5b3UgYXJlIHVzaW5nIFR1cmJvIEMsIGNoYW5nZSBmaWxlbmFtZXMgYmVnaW5uaW5nIHdpdGggInBjLi4uIiB0byAidGMuLi4iCis7IFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgdHJ5aW5nIHRvIG1ha2UgdGhlIHByb2dyYW0hCis7Cis7Cis7ICAgICAgKiAqICogT3V0cHV0IGZpbGUgKiAqICoKK2pwZWd0cmFuLnR0cAorOworOyAqICogKiBDT01QSUxFUiBPUFRJT05TICogKiAqICAKKy5DWy1QXSAgICAgICAgOyBhYnNvbHV0ZSBjYWxscworLkNbLU1dICAgICAgICA7IGFuZCBubyBzdHJpbmcgbWVyZ2luZywgZm9sa3MKKy5DWy13LWNsbl0gICAgOyBubyAiY29uc3RhbnQgaXMgbG9uZyIgd2FybmluZ3MKKy5DWy13LXBhcl0gICAgOyBubyAicGFyYW1ldGVyIHh4eHggdW51c2VkIgorLkNbLXctcmNoXSAgICA7IG5vICJ1bnJlYWNoYWJsZSBjb2RlIgorLkNbLXdzaWddICAgICA7IHdhcm4gaWYgc2lnbmlmaWNhbnQgZGlnaXRzIG1heSBiZSBsb3N0Cis9Cis7ICogKiAqICogTGlzdCBvZiBtb2R1bGVzICogKiAqICogCitwY3N0YXJ0Lm8KK2pwZWd0cmFuLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCx0cmFuc3VwcC5oLGp2ZXJzaW9uLmgpCitjZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRzd2l0Y2guYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQordHJhbnN1cHAuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLHRyYW5zdXBwLmgpCitsaWJqcGVnLmxpYiAgICAgICAgOyBidWlsdCBieSBsaWJqcGVnLnByagorcGNzdGRsaWIubGliICAgICAgIDsgc3RhbmRhcmQgbGlicmFyeQorcGNleHRsaWIubGliICAgICAgIDsgZXh0ZW5kZWQgbGlicmFyeQpkaWZmIC0tZ2l0IGEvbWFrdm1zLm9wdCBiL21ha3Ztcy5vcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ZThmZQotLS0gL2Rldi9udWxsCisrKyBiL21ha3Ztcy5vcHQKQEAgLTAsMCArMSw0IEBACishIEEgcG9pbnRlciB0byB0aGUgVkFYL1ZNUyBDIFJ1bi1UaW1lIFNoYXJlYWJsZSBMaWJyYXJ5LgorISBUaGlzIGZpbGUgaXMgbmVlZGVkIGJ5IG1ha2VmaWxlLm1tcyBhbmQgbWFrZWZpbGUudm1zLAorISBidXQgb25seSBmb3IgdGhlIG9sZGVyIFZBWCBDIGNvbXBpbGVyLiAgREVDIEMgZG9lcyBub3QgbmVlZCBpdC4KK1N5cyRMaWJyYXJ5OlZBWENSVEwuRVhFIC9TaGFyZQpkaWZmIC0tZ2l0IGEvcmRibXAuYyBiL3JkYm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1ZmUyYQotLS0gL2Rldi9udWxsCisrKyBiL3JkYm1wLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiByZGJtcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gTWljcm9zb2Z0ICJCTVAiCisgKiBmb3JtYXQgKE1TIFdpbmRvd3MgMy54LCBPUy8yIDEueCwgYW5kIE9TLzIgMi54IGZsYXZvcnMpLgorICogQ3VycmVudGx5LCBvbmx5IDgtYml0IGFuZCAyNC1iaXQgaW1hZ2VzIGFyZSBzdXBwb3J0ZWQsIG5vdCAxLWJpdCBvcgorICogNC1iaXQgKGZlZWRpbmcgc3VjaCBsb3ctZGVwdGggaW1hZ2VzIGludG8gSlBFRyB3b3VsZCBiZSBzaWxseSBhbnl3YXkpLgorICogQWxzbywgd2UgZG9uJ3Qgc3VwcG9ydCBSTEUtY29tcHJlc3NlZCBmaWxlcy4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQorICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCisgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCisgKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKKyAqIHRoZSBmaWxlIGlzIGluZGVlZCBCTVAgZm9ybWF0KS4KKyAqCisgKiBUaGlzIGNvZGUgY29udHJpYnV0ZWQgYnkgSmFtZXMgQXJ0aHVyIEJvdWNoZXIuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIEJNUF9TVVBQT1JURUQKKworCisvKiBNYWNyb3MgdG8gZGVhbCB3aXRoIHVuc2lnbmVkIGNoYXJzIGFzIGVmZmljaWVudGx5IGFzIGNvbXBpbGVyIGFsbG93cyAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKKyNlbHNlIC8qICFIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECit0eXBlZGVmIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKKyNlbHNlCit0eXBlZGVmIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSAmIDB4RkYpCisjZW5kaWYKKyNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKworCisjZGVmaW5lCVJlYWRPSyhmaWxlLGJ1ZmZlcixsZW4pCShKRlJFQUQoZmlsZSxidWZmZXIsbGVuKSA9PSAoKHNpemVfdCkgKGxlbikpKQorCisKKy8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIHNvdXJjZSBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2JtcF9zb3VyY2Vfc3RydWN0ICogYm1wX3NvdXJjZV9wdHI7CisKK3R5cGVkZWYgc3RydWN0IF9ibXBfc291cmNlX3N0cnVjdCB7CisgIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogYmFjayBsaW5rIHNhdmVzIHBhc3Npbmcgc2VwYXJhdGUgcGFybSAqLworCisgIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBCTVAgY29sb3JtYXAgKGNvbnZlcnRlZCB0byBteSBmb3JtYXQpICovCisKKyAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZTsJLyogTmVlZGVkIHRvIHJldmVyc2Ugcm93IG9yZGVyICovCisgIEpESU1FTlNJT04gc291cmNlX3JvdzsJLyogQ3VycmVudCBzb3VyY2Ugcm93IG51bWJlciAqLworICBKRElNRU5TSU9OIHJvd193aWR0aDsJCS8qIFBoeXNpY2FsIHdpZHRoIG9mIHNjYW5saW5lcyBpbiBmaWxlICovCisKKyAgaW50IGJpdHNfcGVyX3BpeGVsOwkJLyogcmVtZW1iZXJzIDgtIG9yIDI0LWJpdCBmb3JtYXQgKi8KK30gYm1wX3NvdXJjZV9zdHJ1Y3Q7CisKKworTE9DQUwoaW50KQorcmVhZF9ieXRlIChibXBfc291cmNlX3B0ciBzaW5mbykKKy8qIFJlYWQgbmV4dCBieXRlIGZyb20gQk1QIGZpbGUgKi8KK3sKKyAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc2luZm8tPnB1Yi5pbnB1dF9maWxlOworICByZWdpc3RlciBpbnQgYzsKKworICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKKyAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICByZXR1cm4gYzsKK30KKworCitMT0NBTCh2b2lkKQorcmVhZF9jb2xvcm1hcCAoYm1wX3NvdXJjZV9wdHIgc2luZm8sIGludCBjbWFwbGVuLCBpbnQgbWFwZW50cnlzaXplKQorLyogUmVhZCB0aGUgY29sb3JtYXAgZnJvbSBhIEJNUCBmaWxlICovCit7CisgIGludCBpOworCisgIHN3aXRjaCAobWFwZW50cnlzaXplKSB7CisgIGNhc2UgMzoKKyAgICAvKiBCR1IgZm9ybWF0IChvY2N1cnMgaW4gT1MvMiBmaWxlcykgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7CisgICAgICBzaW5mby0+Y29sb3JtYXBbMl1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICAgIHNpbmZvLT5jb2xvcm1hcFsxXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgICAgc2luZm8tPmNvbG9ybWFwWzBdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDQ6CisgICAgLyogQkdSMCBmb3JtYXQgKG9jY3VycyBpbiBNUyBXaW5kb3dzIGZpbGVzKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjbWFwbGVuOyBpKyspIHsKKyAgICAgIHNpbmZvLT5jb2xvcm1hcFsyXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgICAgc2luZm8tPmNvbG9ybWFwWzFdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgICBzaW5mby0+Y29sb3JtYXBbMF1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICAgICh2b2lkKSByZWFkX2J5dGUoc2luZm8pOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9CTVBfQkFEQ01BUCk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KKyAqIFRoZSBpbWFnZSBoYXMgYmVlbiByZWFkIGludG8gdGhlIHdob2xlX2ltYWdlIGFycmF5LCBidXQgaXMgb3RoZXJ3aXNlCisgKiB1bnByb2Nlc3NlZC4gIFdlIG11c3QgcmVhZCBpdCBvdXQgaW4gdG9wLXRvLWJvdHRvbSByb3cgb3JkZXIsIGFuZCBpZgorICogaXQgaXMgYW4gOC1iaXQgaW1hZ2UsIHdlIG11c3QgZXhwYW5kIGNvbG9ybWFwcGVkIHBpeGVscyB0byAyNGJpdCBmb3JtYXQuCisgKi8KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfOGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGNvbG9ybWFwIGluZGV4ZXMgKi8KK3sKKyAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBBUlJBWSBjb2xvcm1hcCA9IHNvdXJjZS0+Y29sb3JtYXA7CisgIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOworICByZWdpc3RlciBpbnQgdDsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgLyogRmV0Y2ggbmV4dCByb3cgZnJvbSB2aXJ0dWFsIGFycmF5ICovCisgIHNvdXJjZS0+c291cmNlX3Jvdy0tOworICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCisgICAgIHNvdXJjZS0+c291cmNlX3JvdywgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKworICAvKiBFeHBhbmQgdGhlIGNvbG9ybWFwIGluZGV4ZXMgdG8gcmVhbCBkYXRhICovCisgIGlucHRyID0gaW1hZ2VfcHRyWzBdOworICBvdXRwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIHQgPSBHRVRKU0FNUExFKCppbnB0cisrKTsKKyAgICAqb3V0cHRyKysgPSBjb2xvcm1hcFswXVt0XTsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLworICAgICpvdXRwdHIrKyA9IGNvbG9ybWFwWzFdW3RdOworICAgICpvdXRwdHIrKyA9IGNvbG9ybWFwWzJdW3RdOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfMjRiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyAyNC1iaXQgcGl4ZWxzICovCit7CisgIGJtcF9zb3VyY2VfcHRyIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikgc2luZm87CisgIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICAvKiBGZXRjaCBuZXh0IHJvdyBmcm9tIHZpcnR1YWwgYXJyYXkgKi8KKyAgc291cmNlLT5zb3VyY2Vfcm93LS07CisgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKKyAgICAgc291cmNlLT5zb3VyY2Vfcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworCisgIC8qIFRyYW5zZmVyIGRhdGEuICBOb3RlIHNvdXJjZSB2YWx1ZXMgYXJlIGluIEJHUiBvcmRlcgorICAgKiAoZXZlbiB0aG91Z2ggTWljcm9zb2Z0J3Mgb3duIGRvY3VtZW50cyBzYXkgdGhlIG9wcG9zaXRlKS4KKyAgICovCisgIGlucHRyID0gaW1hZ2VfcHRyWzBdOworICBvdXRwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIG91dHB0clsyXSA9ICppbnB0cisrOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCisgICAgb3V0cHRyWzFdID0gKmlucHRyKys7CisgICAgb3V0cHRyWzBdID0gKmlucHRyKys7CisgICAgb3V0cHRyICs9IDM7CisgIH0KKworICByZXR1cm4gMTsKK30KKworCisvKgorICogVGhpcyBtZXRob2QgbG9hZHMgdGhlIGltYWdlIGludG8gd2hvbGVfaW1hZ2UgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIG9uCisgKiBnZXRfcGl4ZWxfcm93cy4gIFRoZSBnZXRfcGl4ZWxfcm93cyBwb2ludGVyIGlzIHRoZW4gYWRqdXN0ZWQgdG8gY2FsbAorICogZ2V0XzhiaXRfcm93IG9yIGdldF8yNGJpdF9yb3cgb24gc3Vic2VxdWVudCBjYWxscy4KKyAqLworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK3ByZWxvYWRfaW1hZ2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOworICByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0X3B0cjsKKyAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7CisgIEpESU1FTlNJT04gcm93LCBjb2w7CisgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKworICAvKiBSZWFkIHRoZSBkYXRhIGludG8gYSB2aXJ0dWFsIGFycmF5IGluIGlucHV0LWZpbGUgcm93IG9yZGVyLiAqLworICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7CisgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gKGxvbmcpIHJvdzsKKyAgICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgfQorICAgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAorICAgICAgIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICAgIG91dF9wdHIgPSBpbWFnZV9wdHJbMF07CisgICAgZm9yIChjb2wgPSBzb3VyY2UtPnJvd193aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgIC8qIGlubGluZSBjb3B5IG9mIHJlYWRfYnl0ZSgpIGZvciBzcGVlZCAqLworICAgICAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCisJRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICAgICAgKm91dF9wdHIrKyA9IChKU0FNUExFKSBjOworICAgIH0KKyAgfQorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOworCisgIC8qIFNldCB1cCB0byByZWFkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXkgaW4gdG9wLXRvLWJvdHRvbSBvcmRlciAqLworICBzd2l0Y2ggKHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwpIHsKKyAgY2FzZSA4OgorICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0XzhiaXRfcm93OworICAgIGJyZWFrOworICBjYXNlIDI0OgorICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0XzI0Yml0X3JvdzsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURERVBUSCk7CisgIH0KKyAgc291cmNlLT5zb3VyY2Vfcm93ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKworICAvKiBBbmQgcmVhZCB0aGUgZmlyc3Qgcm93ICovCisgIHJldHVybiAoKnNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzKSAoY2luZm8sIHNpbmZvKTsKK30KKworCisvKgorICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF9ibXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOworICBVX0NIQVIgYm1wZmlsZWhlYWRlclsxNF07CisgIFVfQ0hBUiBibXBpbmZvaGVhZGVyWzY0XTsKKyNkZWZpbmUgR0VUXzJCKGFycmF5LG9mZnNldCkgICgodW5zaWduZWQgaW50KSBVQ0goYXJyYXlbb2Zmc2V0XSkgKyBcCisJCQkgICAgICAgKCgodW5zaWduZWQgaW50KSBVQ0goYXJyYXlbb2Zmc2V0KzFdKSkgPDwgOCkpCisjZGVmaW5lIEdFVF80QihhcnJheSxvZmZzZXQpICAoKElOVDMyKSBVQ0goYXJyYXlbb2Zmc2V0XSkgKyBcCisJCQkgICAgICAgKCgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXQrMV0pKSA8PCA4KSArIFwKKwkJCSAgICAgICAoKChJTlQzMikgVUNIKGFycmF5W29mZnNldCsyXSkpIDw8IDE2KSArIFwKKwkJCSAgICAgICAoKChJTlQzMikgVUNIKGFycmF5W29mZnNldCszXSkpIDw8IDI0KSkKKyAgSU5UMzIgYmZPZmZCaXRzOworICBJTlQzMiBoZWFkZXJTaXplOworICBJTlQzMiBiaVdpZHRoID0gMDsJCS8qIGluaXRpYWxpemUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworICBJTlQzMiBiaUhlaWdodCA9IDA7CisgIHVuc2lnbmVkIGludCBiaVBsYW5lczsKKyAgSU5UMzIgYmlDb21wcmVzc2lvbjsKKyAgSU5UMzIgYmlYUGVsc1Blck1ldGVyLGJpWVBlbHNQZXJNZXRlcjsKKyAgSU5UMzIgYmlDbHJVc2VkID0gMDsKKyAgaW50IG1hcGVudHJ5c2l6ZSA9IDA7CQkvKiAwIGluZGljYXRlcyBubyBjb2xvcm1hcCAqLworICBJTlQzMiBiUGFkOworICBKRElNRU5TSU9OIHJvd193aWR0aDsKKworICAvKiBSZWFkIGFuZCB2ZXJpZnkgdGhlIGJpdG1hcCBmaWxlIGhlYWRlciAqLworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgYm1wZmlsZWhlYWRlciwgMTQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgaWYgKEdFVF8yQihibXBmaWxlaGVhZGVyLDApICE9IDB4NEQ0MikgLyogJ0JNJyAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX05PVCk7CisgIGJmT2ZmQml0cyA9IChJTlQzMikgR0VUXzRCKGJtcGZpbGVoZWFkZXIsMTApOworICAvKiBXZSBpZ25vcmUgdGhlIHJlbWFpbmluZyBmaWxlaGVhZGVyIGZpZWxkcyAqLworCisgIC8qIFRoZSBpbmZvaGVhZGVyIG1pZ2h0IGJlIDEyIGJ5dGVzIChPUy8yIDEueCksIDQwIGJ5dGVzIChXaW5kb3dzKSwKKyAgICogb3IgNjQgYnl0ZXMgKE9TLzIgMi54KS4gIENoZWNrIHRoZSBmaXJzdCA0IGJ5dGVzIHRvIGZpbmQgb3V0IHdoaWNoLgorICAgKi8KKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIGJtcGluZm9oZWFkZXIsIDQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgaGVhZGVyU2l6ZSA9IChJTlQzMikgR0VUXzRCKGJtcGluZm9oZWFkZXIsMCk7CisgIGlmIChoZWFkZXJTaXplIDwgMTIgfHwgaGVhZGVyU2l6ZSA+IDY0KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBREhFQURFUik7CisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBibXBpbmZvaGVhZGVyKzQsIGhlYWRlclNpemUtNCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworCisgIHN3aXRjaCAoKGludCkgaGVhZGVyU2l6ZSkgeworICBjYXNlIDEyOgorICAgIC8qIERlY29kZSBPUy8yIDEueCBoZWFkZXIgKE1pY3Jvc29mdCBjYWxscyB0aGlzIGEgQklUTUFQQ09SRUhFQURFUikgKi8KKyAgICBiaVdpZHRoID0gKElOVDMyKSBHRVRfMkIoYm1waW5mb2hlYWRlciw0KTsKKyAgICBiaUhlaWdodCA9IChJTlQzMikgR0VUXzJCKGJtcGluZm9oZWFkZXIsNik7CisgICAgYmlQbGFuZXMgPSBHRVRfMkIoYm1waW5mb2hlYWRlciw4KTsKKyAgICBzb3VyY2UtPmJpdHNfcGVyX3BpeGVsID0gKGludCkgR0VUXzJCKGJtcGluZm9oZWFkZXIsMTApOworCisgICAgc3dpdGNoIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsKSB7CisgICAgY2FzZSA4OgkJCS8qIGNvbG9ybWFwcGVkIGltYWdlICovCisgICAgICBtYXBlbnRyeXNpemUgPSAzOwkJLyogT1MvMiB1c2VzIFJHQlRSSVBMRSBjb2xvcm1hcCAqLworICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QX09TMl9NQVBQRUQsIChpbnQpIGJpV2lkdGgsIChpbnQpIGJpSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CQkJLyogUkdCIGltYWdlICovCisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVBfT1MyLCAoaW50KSBiaVdpZHRoLCAoaW50KSBiaUhlaWdodCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEREVQVEgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChiaVBsYW5lcyAhPSAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFEUExBTkVTKTsKKyAgICBicmVhazsKKyAgY2FzZSA0MDoKKyAgY2FzZSA2NDoKKyAgICAvKiBEZWNvZGUgV2luZG93cyAzLnggaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUElORk9IRUFERVIpICovCisgICAgLyogb3IgT1MvMiAyLnggaGVhZGVyLCB3aGljaCBoYXMgYWRkaXRpb25hbCBmaWVsZHMgdGhhdCB3ZSBpZ25vcmUgKi8KKyAgICBiaVdpZHRoID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsNCk7CisgICAgYmlIZWlnaHQgPSBHRVRfNEIoYm1waW5mb2hlYWRlciw4KTsKKyAgICBiaVBsYW5lcyA9IEdFVF8yQihibXBpbmZvaGVhZGVyLDEyKTsKKyAgICBzb3VyY2UtPmJpdHNfcGVyX3BpeGVsID0gKGludCkgR0VUXzJCKGJtcGluZm9oZWFkZXIsMTQpOworICAgIGJpQ29tcHJlc3Npb24gPSBHRVRfNEIoYm1waW5mb2hlYWRlciwxNik7CisgICAgYmlYUGVsc1Blck1ldGVyID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMjQpOworICAgIGJpWVBlbHNQZXJNZXRlciA9IEdFVF80QihibXBpbmZvaGVhZGVyLDI4KTsKKyAgICBiaUNsclVzZWQgPSBHRVRfNEIoYm1waW5mb2hlYWRlciwzMik7CisgICAgLyogYmlTaXplSW1hZ2UsIGJpQ2xySW1wb3J0YW50IGZpZWxkcyBhcmUgaWdub3JlZCAqLworCisgICAgc3dpdGNoIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsKSB7CisgICAgY2FzZSA4OgkJCS8qIGNvbG9ybWFwcGVkIGltYWdlICovCisgICAgICBtYXBlbnRyeXNpemUgPSA0OwkJLyogV2luZG93cyB1c2VzIFJHQlFVQUQgY29sb3JtYXAgKi8KKyAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0JNUF9NQVBQRUQsIChpbnQpIGJpV2lkdGgsIChpbnQpIGJpSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CQkJLyogUkdCIGltYWdlICovCisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVAsIChpbnQpIGJpV2lkdGgsIChpbnQpIGJpSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURERVBUSCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGJpUGxhbmVzICE9IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURQTEFORVMpOworICAgIGlmIChiaUNvbXByZXNzaW9uICE9IDApCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9DT01QUkVTU0VEKTsKKworICAgIGlmIChiaVhQZWxzUGVyTWV0ZXIgPiAwICYmIGJpWVBlbHNQZXJNZXRlciA+IDApIHsKKyAgICAgIC8qIFNldCBKRklGIGRlbnNpdHkgcGFyYW1ldGVycyBmcm9tIHRoZSBCTVAgZGF0YSAqLworICAgICAgY2luZm8tPlhfZGVuc2l0eSA9IChVSU5UMTYpIChiaVhQZWxzUGVyTWV0ZXIvMTAwKTsgLyogMTAwIGNtIHBlciBtZXRlciAqLworICAgICAgY2luZm8tPllfZGVuc2l0eSA9IChVSU5UMTYpIChiaVlQZWxzUGVyTWV0ZXIvMTAwKTsKKyAgICAgIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSAyOwkvKiBkb3RzL2NtICovCisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBREhFQURFUik7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBDb21wdXRlIGRpc3RhbmNlIHRvIGJpdG1hcCBkYXRhIC0tLSB3aWxsIGFkanVzdCBmb3IgY29sb3JtYXAgYmVsb3cgKi8KKyAgYlBhZCA9IGJmT2ZmQml0cyAtIChoZWFkZXJTaXplICsgMTQpOworCisgIC8qIFJlYWQgdGhlIGNvbG9ybWFwLCBpZiBhbnkgKi8KKyAgaWYgKG1hcGVudHJ5c2l6ZSA+IDApIHsKKyAgICBpZiAoYmlDbHJVc2VkIDw9IDApCisgICAgICBiaUNsclVzZWQgPSAyNTY7CQkvKiBhc3N1bWUgaXQncyAyNTYgKi8KKyAgICBlbHNlIGlmIChiaUNsclVzZWQgPiAyNTYpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURDTUFQKTsKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB0aGUgY29sb3JtYXAgKi8KKyAgICBzb3VyY2UtPmNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgIChKRElNRU5TSU9OKSBiaUNsclVzZWQsIChKRElNRU5TSU9OKSAzKTsKKyAgICAvKiBhbmQgcmVhZCBpdCBmcm9tIHRoZSBmaWxlICovCisgICAgcmVhZF9jb2xvcm1hcChzb3VyY2UsIChpbnQpIGJpQ2xyVXNlZCwgbWFwZW50cnlzaXplKTsKKyAgICAvKiBhY2NvdW50IGZvciBzaXplIG9mIGNvbG9ybWFwICovCisgICAgYlBhZCAtPSBiaUNsclVzZWQgKiBtYXBlbnRyeXNpemU7CisgIH0KKworICAvKiBTa2lwIGFueSByZW1haW5pbmcgcGFkIGJ5dGVzICovCisgIGlmIChiUGFkIDwgMCkJCQkvKiBpbmNvcnJlY3QgYmZPZmZCaXRzIHZhbHVlPyAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBREhFQURFUik7CisgIHdoaWxlICgtLWJQYWQgPj0gMCkgeworICAgICh2b2lkKSByZWFkX2J5dGUoc291cmNlKTsKKyAgfQorCisgIC8qIENvbXB1dGUgcm93IHdpZHRoIGluIGZpbGUsIGluY2x1ZGluZyBwYWRkaW5nIHRvIDQtYnl0ZSBib3VuZGFyeSAqLworICBpZiAoc291cmNlLT5iaXRzX3Blcl9waXhlbCA9PSAyNCkKKyAgICByb3dfd2lkdGggPSAoSkRJTUVOU0lPTikgKGJpV2lkdGggKiAzKTsKKyAgZWxzZQorICAgIHJvd193aWR0aCA9IChKRElNRU5TSU9OKSBiaVdpZHRoOworICB3aGlsZSAoKHJvd193aWR0aCAmIDMpICE9IDApIHJvd193aWR0aCsrOworICBzb3VyY2UtPnJvd193aWR0aCA9IHJvd193aWR0aDsKKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgaW52ZXJzaW9uIGFycmF5LCBwcmVwYXJlIGZvciBwcmVsb2FkIHBhc3MgKi8KKyAgc291cmNlLT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKyAgICAgcm93X3dpZHRoLCAoSkRJTUVOU0lPTikgYmlIZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKKyAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBwcmVsb2FkX2ltYWdlOworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisgICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOyAvKiBjb3VudCBmaWxlIGlucHV0IGFzIHNlcGFyYXRlIHBhc3MgKi8KKyAgfQorCisgIC8qIEFsbG9jYXRlIG9uZS1yb3cgYnVmZmVyIGZvciByZXR1cm5lZCBkYXRhICovCisgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSAoYmlXaWR0aCAqIDMpLCAoSkRJTUVOU0lPTikgMSk7CisgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworCisgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgY2luZm8tPmRhdGFfcHJlY2lzaW9uID0gODsKKyAgY2luZm8tPmltYWdlX3dpZHRoID0gKEpESU1FTlNJT04pIGJpV2lkdGg7CisgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSAoSkRJTUVOU0lPTikgYmlIZWlnaHQ7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX2lucHV0X2JtcCAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgQk1QIGZvcm1hdCBpbnB1dC4KKyAqLworCitHTE9CQUwoY2pwZWdfc291cmNlX3B0cikKK2ppbml0X3JlYWRfYm1wIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgYm1wX3NvdXJjZV9wdHIgc291cmNlOworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLworICBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKGJtcF9zb3VyY2Vfc3RydWN0KSk7CisgIHNvdXJjZS0+Y2luZm8gPSBjaW5mbzsJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCisgIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCisgIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfYm1wOworICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfYm1wOworCisgIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOworfQorCisjZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvcmRjb2xtYXAuYyBiL3JkY29sbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiMzQzNwotLS0gL2Rldi9udWxsCisrKyBiL3JkY29sbWFwLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiByZGNvbG1hcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBkanBlZydzICItbWFwIGZpbGUiIHN3aXRjaC4gIEl0IHJlYWRzIGEgc291cmNlIGltYWdlCisgKiBhbmQgY29uc3RydWN0cyBhIGNvbG9ybWFwIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqCisgKiBDdXJyZW50bHksIHRoZXNlIGZpbGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIGZvciB0aGUgbWFwIGZpbGU6CisgKiAgIEdJRjogdGhlIGNvbnRlbnRzIG9mIHRoZSBHSUYncyBnbG9iYWwgY29sb3JtYXAgYXJlIHVzZWQuCisgKiAgIFBQTSAoZWl0aGVyIHRleHQgb3IgcmF3IGZsYXZvcik6IHRoZSBlbnRpcmUgZmlsZSBpcyByZWFkIGFuZAorICogICAgICBlYWNoIHVuaXF1ZSBwaXhlbCB2YWx1ZSBpcyBlbnRlcmVkIGluIHRoZSBtYXAuCisgKiBOb3RlIHRoYXQgcmVhZGluZyBhIGxhcmdlIFBQTSBmaWxlIHdpbGwgYmUgaG9ycmVuZG91c2x5IHNsb3cuCisgKiBUeXBpY2FsbHksIGEgUFBNLWZvcm1hdCBtYXAgZmlsZSBzaG91bGQgY29udGFpbiBqdXN0IG9uZSBwaXhlbAorICogb2YgZWFjaCBkZXNpcmVkIGNvbG9yLiAgU3VjaCBhIGZpbGUgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGFuCisgKiBvcmRpbmFyeSBpbWFnZSBQUE0gZmlsZSB3aXRoIHBwbXRvbWFwKDEpLgorICoKKyAqIFJlc2NhbGluZyBhIFBQTSB0aGF0IGhhcyBhIG1heHZhbCB1bmVxdWFsIHRvIE1BWEpTQU1QTEUgaXMgbm90CisgKiBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkvKiBvdGhlcndpc2UgY2FuJ3QgcXVhbnRpemUgdG8gc3VwcGxpZWQgbWFwICovCisKKy8qIFBvcnRpb25zIG9mIHRoaXMgY29kZSBhcmUgYmFzZWQgb24gdGhlIFBCTVBMVVMgbGlicmFyeSwgd2hpY2ggaXM6CisqKgorKiogQ29weXJpZ2h0IChDKSAxOTg4IGJ5IEplZiBQb3NrYW56ZXIuCisqKgorKiogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisqKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCisqKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorKiogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworKiogZG9jdW1lbnRhdGlvbi4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IKKyoqIGltcGxpZWQgd2FycmFudHkuCisqLworCisKKy8qCisgKiBBZGQgYSAocG90ZW50aWFsbHkpIG5ldyBjb2xvciB0byB0aGUgY29sb3IgbWFwLgorICovCisKK0xPQ0FMKHZvaWQpCithZGRfbWFwX2VudHJ5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgUiwgaW50IEcsIGludCBCKQoreworICBKU0FNUFJPVyBjb2xvcm1hcDAgPSBjaW5mby0+Y29sb3JtYXBbMF07CisgIEpTQU1QUk9XIGNvbG9ybWFwMSA9IGNpbmZvLT5jb2xvcm1hcFsxXTsKKyAgSlNBTVBST1cgY29sb3JtYXAyID0gY2luZm8tPmNvbG9ybWFwWzJdOworICBpbnQgbmNvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKKyAgaW50IGluZGV4OworCisgIC8qIENoZWNrIGZvciBkdXBsaWNhdGUgY29sb3IuICovCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5jb2xvcnM7IGluZGV4KyspIHsKKyAgICBpZiAoR0VUSlNBTVBMRShjb2xvcm1hcDBbaW5kZXhdKSA9PSBSICYmCisJR0VUSlNBTVBMRShjb2xvcm1hcDFbaW5kZXhdKSA9PSBHICYmCisJR0VUSlNBTVBMRShjb2xvcm1hcDJbaW5kZXhdKSA9PSBCKQorICAgICAgcmV0dXJuOwkJCS8qIGNvbG9yIGlzIGFscmVhZHkgaW4gbWFwICovCisgIH0KKworICAvKiBDaGVjayBmb3IgbWFwIG92ZXJmbG93LiAqLworICBpZiAobmNvbG9ycyA+PSAoTUFYSlNBTVBMRSsxKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgKE1BWEpTQU1QTEUrMSkpOworCisgIC8qIE9LLCBhZGQgY29sb3IgdG8gbWFwLiAqLworICBjb2xvcm1hcDBbbmNvbG9yc10gPSAoSlNBTVBMRSkgUjsKKyAgY29sb3JtYXAxW25jb2xvcnNdID0gKEpTQU1QTEUpIEc7CisgIGNvbG9ybWFwMltuY29sb3JzXSA9IChKU0FNUExFKSBCOworICBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMrKzsKK30KKworCisvKgorICogRXh0cmFjdCBjb2xvciBtYXAgZnJvbSBhIEdJRiBmaWxlLgorICovCisKK0xPQ0FMKHZvaWQpCityZWFkX2dpZl9tYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCit7CisgIGludCBoZWFkZXJbMTNdOworICBpbnQgaSwgY29sb3JtYXBsZW47CisgIGludCBSLCBHLCBCOworCisgIC8qIEluaXRpYWwgJ0cnIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBieSByZWFkX2NvbG9yX21hcCAqLworICAvKiBSZWFkIHRoZSByZXN0IG9mIHRoZSBHSUYgaGVhZGVyIGFuZCBsb2dpY2FsIHNjcmVlbiBkZXNjcmlwdG9yICovCisgIGZvciAoaSA9IDE7IGkgPCAxMzsgaSsrKSB7CisgICAgaWYgKChoZWFkZXJbaV0gPSBnZXRjKGluZmlsZSkpID09IEVPRikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisgIH0KKworICAvKiBWZXJpZnkgR0lGIEhlYWRlciAqLworICBpZiAoaGVhZGVyWzFdICE9ICdJJyB8fCBoZWFkZXJbMl0gIT0gJ0YnKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisKKyAgLyogVGhlcmUgbXVzdCBiZSBhIGdsb2JhbCBjb2xvciBtYXAuICovCisgIGlmICgoaGVhZGVyWzEwXSAmIDB4ODApID09IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKworICAvKiBPSywgZmV0Y2ggaXQuICovCisgIGNvbG9ybWFwbGVuID0gMiA8PCAoaGVhZGVyWzEwXSAmIDB4MDcpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb2xvcm1hcGxlbjsgaSsrKSB7CisgICAgUiA9IGdldGMoaW5maWxlKTsKKyAgICBHID0gZ2V0YyhpbmZpbGUpOworICAgIEIgPSBnZXRjKGluZmlsZSk7CisgICAgaWYgKFIgPT0gRU9GIHx8IEcgPT0gRU9GIHx8IEIgPT0gRU9GKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKyAgICBhZGRfbWFwX2VudHJ5KGNpbmZvLAorCQkgIFIgPDwgKEJJVFNfSU5fSlNBTVBMRS04KSwKKwkJICBHIDw8IChCSVRTX0lOX0pTQU1QTEUtOCksCisJCSAgQiA8PCAoQklUU19JTl9KU0FNUExFLTgpKTsKKyAgfQorfQorCisKKy8qIFN1cHBvcnQgcm91dGluZXMgZm9yIHJlYWRpbmcgUFBNICovCisKKworTE9DQUwoaW50KQorcGJtX2dldGMgKEZJTEUgKiBpbmZpbGUpCisvKiBSZWFkIG5leHQgY2hhciwgc2tpcHBpbmcgb3ZlciBhbnkgY29tbWVudHMgKi8KKy8qIEEgY29tbWVudC9uZXdsaW5lIHNlcXVlbmNlIGlzIHJldHVybmVkIGFzIGEgbmV3bGluZSAqLworeworICByZWdpc3RlciBpbnQgY2g7CisgIAorICBjaCA9IGdldGMoaW5maWxlKTsKKyAgaWYgKGNoID09ICcjJykgeworICAgIGRvIHsKKyAgICAgIGNoID0gZ2V0YyhpbmZpbGUpOworICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKKyAgfQorICByZXR1cm4gY2g7Cit9CisKKworTE9DQUwodW5zaWduZWQgaW50KQorcmVhZF9wYm1faW50ZWdlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKKy8qIFJlYWQgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyIGZyb20gdGhlIFBQTSBmaWxlICovCisvKiBTd2FsbG93cyBvbmUgdHJhaWxpbmcgY2hhcmFjdGVyIGFmdGVyIHRoZSBpbnRlZ2VyICovCisvKiBOb3RlIHRoYXQgb24gYSAxNi1iaXQtaW50IG1hY2hpbmUsIG9ubHkgdmFsdWVzIHVwIHRvIDY0ayBjYW4gYmUgcmVhZC4gKi8KKy8qIFRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gaW4gcHJhY3RpY2UuICovCit7CisgIHJlZ2lzdGVyIGludCBjaDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHZhbDsKKyAgCisgIC8qIFNraXAgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICBkbyB7CisgICAgY2ggPSBwYm1fZ2V0YyhpbmZpbGUpOworICAgIGlmIChjaCA9PSBFT0YpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworICB9IHdoaWxlIChjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicpOworICAKKyAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisgIAorICB2YWwgPSBjaCAtICcwJzsKKyAgd2hpbGUgKChjaCA9IHBibV9nZXRjKGluZmlsZSkpID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICB2YWwgKj0gMTA7CisgICAgdmFsICs9IGNoIC0gJzAnOworICB9CisgIHJldHVybiB2YWw7Cit9CisKKworLyoKKyAqIEV4dHJhY3QgY29sb3IgbWFwIGZyb20gYSBQUE0gZmlsZS4KKyAqLworCitMT0NBTCh2b2lkKQorcmVhZF9wcG1fbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQoreworICBpbnQgYzsKKyAgdW5zaWduZWQgaW50IHcsIGgsIG1heHZhbCwgcm93LCBjb2w7CisgIGludCBSLCBHLCBCOworCisgIC8qIEluaXRpYWwgJ1AnIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBieSByZWFkX2NvbG9yX21hcCAqLworICBjID0gZ2V0YyhpbmZpbGUpOwkJLyogc2F2ZSBmb3JtYXQgZGlzY3JpbWluYXRvciBmb3IgYSBzZWMgKi8KKworICAvKiB3aGlsZSB3ZSBmZXRjaCB0aGUgcmVtYWluaW5nIGhlYWRlciBpbmZvICovCisgIHcgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOworICBoID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKKyAgbWF4dmFsID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKKworICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCBtYXh2YWwgPD0gMCkgLyogZXJyb3IgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworCisgIC8qIEZvciBub3csIHdlIGRvbid0IHN1cHBvcnQgcmVzY2FsaW5nIGZyb20gYW4gdW51c3VhbCBtYXh2YWwuICovCisgIGlmIChtYXh2YWwgIT0gKHVuc2lnbmVkIGludCkgTUFYSlNBTVBMRSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworCisgIHN3aXRjaCAoYykgeworICBjYXNlICczJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUFBNIGZpbGUgKi8KKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGg7IHJvdysrKSB7CisgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHc7IGNvbCsrKSB7CisJUiA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7CisJRyA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7CisJQiA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7CisJYWRkX21hcF9lbnRyeShjaW5mbywgUiwgRywgQik7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgJzYnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBQTSBmaWxlICovCisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoOyByb3crKykgeworICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3OyBjb2wrKykgeworCVIgPSBnZXRjKGluZmlsZSk7CisJRyA9IGdldGMoaW5maWxlKTsKKwlCID0gZ2V0YyhpbmZpbGUpOworCWlmIChSID09IEVPRiB8fCBHID09IEVPRiB8fCBCID09IEVPRikKKwkgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisJYWRkX21hcF9lbnRyeShjaW5mbywgUiwgRywgQik7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBNYWluIGVudHJ5IHBvaW50IGZyb20gZGpwZWcuYy4KKyAqICBJbnB1dDogb3BlbmVkIGlucHV0IGZpbGUgKGZyb20gZmlsZSBuYW1lIGFyZ3VtZW50IG9uIGNvbW1hbmQgbGluZSkuCisgKiAgT3V0cHV0OiBjb2xvcm1hcCBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgZmllbGRzIGFyZSBzZXQgaW4gY2luZm8uCisgKi8KKworR0xPQkFMKHZvaWQpCityZWFkX2NvbG9yX21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgY29sb3IgbWFwIG9mIG1heGltdW0gc3VwcG9ydGVkIHNpemUuICovCisgIGNpbmZvLT5jb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSAoTUFYSlNBTVBMRSsxKSwgKEpESU1FTlNJT04pIDMpOworICBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMgPSAwOyAvKiBpbml0aWFsaXplIG1hcCB0byBlbXB0eSAqLworCisgIC8qIFJlYWQgZmlyc3QgYnl0ZSB0byBkZXRlcm1pbmUgZmlsZSBmb3JtYXQgKi8KKyAgc3dpdGNoIChnZXRjKGluZmlsZSkpIHsKKyAgY2FzZSAnRyc6CisgICAgcmVhZF9naWZfbWFwKGNpbmZvLCBpbmZpbGUpOworICAgIGJyZWFrOworICBjYXNlICdQJzoKKyAgICByZWFkX3BwbV9tYXAoY2luZm8sIGluZmlsZSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9yZGdpZi5jIGIvcmRnaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjdjMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvcmRnaWYuYwpAQCAtMCwwICsxLDM4IEBACisvKgorICogcmRnaWYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIEdJRiBmb3JtYXQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiB0byBhdm9pZCBlbnRhbmdsZW1lbnRzIHdpdGggVW5pc3lzJyBwYXRlbnQgb24gTFpXIGNvbXByZXNzaW9uLCAgICAgICoKKyAqIHRoZSBhYmlsaXR5IHRvIHJlYWQgR0lGIGZpbGVzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSUpHIGRpc3RyaWJ1dGlvbi4gKgorICogU29ycnkgYWJvdXQgdGhhdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBXZSBhcmUgcmVxdWlyZWQgdG8gc3RhdGUgdGhhdAorICogICAgIlRoZSBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQoYykgaXMgdGhlIENvcHlyaWdodCBwcm9wZXJ0eSBvZgorICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIEdJRihzbSkgaXMgYSBTZXJ2aWNlIE1hcmsgcHJvcGVydHkgb2YKKyAqICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiIKKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgR0lGIGZvcm1hdCBpbnB1dC4KKyAqLworCitHTE9CQUwoY2pwZWdfc291cmNlX3B0cikKK2ppbml0X3JlYWRfZ2lmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgZnByaW50ZihzdGRlcnIsICJHSUYgaW5wdXQgaXMgdW5zdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuICBTb3JyeS5cbiIpOworICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIHJldHVybiBOVUxMOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KK30KKworI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3JkanBnY29tLjEgYi9yZGpwZ2NvbS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYmEwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9yZGpwZ2NvbS4xCkBAIC0wLDAgKzEsNTQgQEAKKy5USCBSREpQR0NPTSAxICIxMSBPY3RvYmVyIDE5OTciCisuU0ggTkFNRQorcmRqcGdjb20gXC0gZGlzcGxheSB0ZXh0IGNvbW1lbnRzIGZyb20gYSBKUEVHIGZpbGUKKy5TSCBTWU5PUFNJUworLkIgcmRqcGdjb20KK1sKKy5CIFwtdmVyYm9zZQorXQorWworLkkgZmlsZW5hbWUKK10KKy5MUAorLlNIIERFU0NSSVBUSU9OCisuTFAKKy5CIHJkanBnY29tCityZWFkcyB0aGUgbmFtZWQgSlBFRy9KRklGIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzIG5hbWVkLAorYW5kIHByaW50cyBhbnkgdGV4dCBjb21tZW50cyBmb3VuZCBpbiB0aGUgZmlsZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorLlBQCitUaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCitBbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKK2FyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKK2Fubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKK3RoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKK2ZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCit0aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCisuU0ggT1BUSU9OUworLlRQCisuQiBcLXZlcmJvc2UKK0NhdXNlcworLkIgcmRqcGdjb20KK3RvIGFsc28gZGlzcGxheSB0aGUgSlBFRyBpbWFnZSBkaW1lbnNpb25zLgorLlBQCitTd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkLCBhbmQgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4KKy5TSCBISU5UUworLkIgcmRqcGdjb20KK2RvZXMgbm90IGRlcGVuZCBvbiB0aGUgSUpHIEpQRUcgbGlicmFyeS4gIEl0cyBzb3VyY2UgY29kZSBpcyBpbnRlbmRlZCBhcyBhbgoraWxsdXN0cmF0aW9uIG9mIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkIHRvIHBhcnNlIGEgSlBFRyBmaWxlCitoZWFkZXIgY29ycmVjdGx5LgorLlBQCitJbgorLkIgXC12ZXJib3NlCittb2RlLAorLkIgcmRqcGdjb20KK3dpbGwgYWxzbyBhdHRlbXB0IHRvIHByaW50IHRoZSBjb250ZW50cyBvZiBhbnkgIkFQUDEyIiBtYXJrZXJzIGFzIHRleHQuCitTb21lIGRpZ2l0YWwgY2FtZXJhcyBwcm9kdWNlIEFQUDEyIG1hcmtlcnMgY29udGFpbmluZyB1c2VmdWwgdGV4dHVhbAoraW5mb3JtYXRpb24uICBJZiB5b3UgbGlrZSwgeW91IGNhbiBtb2RpZnkgdGhlIHNvdXJjZSBjb2RlIHRvIHByaW50CitvdGhlciBBUFBuIG1hcmtlciB0eXBlcyBhcyB3ZWxsLgorLlNIIFNFRSBBTFNPCisuQlIgY2pwZWcgKDEpLAorLkJSIGRqcGVnICgxKSwKKy5CUiBqcGVndHJhbiAoMSksCisuQlIgd3JqcGdjb20gKDEpCisuU0ggQVVUSE9SCitJbmRlcGVuZGVudCBKUEVHIEdyb3VwCmRpZmYgLS1naXQgYS9yZGpwZ2NvbS5jIGIvcmRqcGdjb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU2ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvcmRqcGdjb20uYwpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIHJkanBnY29tLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHZlcnkgc2ltcGxlIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9uIHRoYXQgZGlzcGxheXMKKyAqIHRoZSB0ZXh0IGluIENPTSAoY29tbWVudCkgbWFya2VycyBpbiBhIEpGSUYgZmlsZS4KKyAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBhcyBhbiBleGFtcGxlIG9mIHRoZSBtaW5pbXVtIGxvZ2ljIG5lZWRlZCB0byBwYXJzZQorICogSlBFRyBtYXJrZXJzLgorICovCisKKyNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiB0byBnZXQgdGhlIGNvbW1hbmQtbGluZSBjb25maWcgc3ltYm9scyAqLworI2luY2x1ZGUgImppbmNsdWRlLmgiCQkvKiBnZXQgYXV0by1jb25maWcgc3ltYm9scywgPHN0ZGlvLmg+ICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc3VwcGVyKCksIHRvbG93ZXIoKSAqLworI2lmZGVmIFVTRV9TRVRNT0RFCisjaW5jbHVkZSA8ZmNudGwuaD4JCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpJ3MgcGFyYW1ldGVyIG1hY3JvcyAqLworLyogSWYgeW91IGhhdmUgc2V0bW9kZSgpIGJ1dCBub3QgPGlvLmg+LCBqdXN0IGRlbGV0ZSB0aGlzIGxpbmU6ICovCisjaW5jbHVkZSA8aW8uaD4JCQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSAqLworI2VuZGlmCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKKyNlbHNlCisjaWZkZWYgVk1TCQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIiwgImN0eD1zdG0iCisjZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLworI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKKyNlbmRpZgorI2lmbmRlZiBFWElUX1NVQ0NFU1MKKyNpZmRlZiBWTVMKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2Vsc2UKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAwCisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gcmVhZCB0aGUgaW5wdXQgZmlsZS4KKyAqIFRvIHJldXNlIHRoaXMgY29kZSBpbiBhbm90aGVyIGFwcGxpY2F0aW9uLCB5b3UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhlc2UuCisgKi8KKworc3RhdGljIEZJTEUgKiBpbmZpbGU7CQkvKiBpbnB1dCBKUEVHIGZpbGUgKi8KKworLyogUmV0dXJuIG5leHQgaW5wdXQgYnl0ZSwgb3IgRU9GIGlmIG5vIG1vcmUgKi8KKyNkZWZpbmUgTkVYVEJZVEUoKSAgZ2V0YyhpbmZpbGUpCisKKworLyogRXJyb3IgZXhpdCBoYW5kbGVyICovCisjZGVmaW5lIEVSUkVYSVQobXNnKSAgKGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyksIGV4aXQoRVhJVF9GQUlMVVJFKSkKKworCisvKiBSZWFkIG9uZSBieXRlLCB0ZXN0aW5nIGZvciBFT0YgKi8KK3N0YXRpYyBpbnQKK3JlYWRfMV9ieXRlICh2b2lkKQoreworICBpbnQgYzsKKworICBjID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMgPT0gRU9GKQorICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7CisgIHJldHVybiBjOworfQorCisvKiBSZWFkIDIgYnl0ZXMsIGNvbnZlcnQgdG8gdW5zaWduZWQgaW50ICovCisvKiBBbGwgMi1ieXRlIHF1YW50aXRpZXMgaW4gSlBFRyBtYXJrZXJzIGFyZSBNU0IgZmlyc3QgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3JlYWRfMl9ieXRlcyAodm9pZCkKK3sKKyAgaW50IGMxLCBjMjsKKworICBjMSA9IE5FWFRCWVRFKCk7CisgIGlmIChjMSA9PSBFT0YpCisgICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKKyAgYzIgPSBORVhUQllURSgpOworICBpZiAoYzIgPT0gRU9GKQorICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpIGMxKSA8PCA4KSArICgodW5zaWduZWQgaW50KSBjMik7Cit9CisKKworLyoKKyAqIEpQRUcgbWFya2VycyBjb25zaXN0IG9mIG9uZSBvciBtb3JlIDB4RkYgYnl0ZXMsIGZvbGxvd2VkIGJ5IGEgbWFya2VyCisgKiBjb2RlIGJ5dGUgKHdoaWNoIGlzIG5vdCBhbiBGRikuICBIZXJlIGFyZSB0aGUgbWFya2VyIGNvZGVzIG9mIGludGVyZXN0CisgKiBpbiB0aGlzIHByb2dyYW0uICAoU2VlIGpkbWFya2VyLmMgZm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0LikKKyAqLworCisjZGVmaW5lIE1fU09GMCAgMHhDMAkJLyogU3RhcnQgT2YgRnJhbWUgTiAqLworI2RlZmluZSBNX1NPRjEgIDB4QzEJCS8qIE4gaW5kaWNhdGVzIHdoaWNoIGNvbXByZXNzaW9uIHByb2Nlc3MgKi8KKyNkZWZpbmUgTV9TT0YyICAweEMyCQkvKiBPbmx5IFNPRjAtU09GMiBhcmUgbm93IGluIGNvbW1vbiB1c2UgKi8KKyNkZWZpbmUgTV9TT0YzICAweEMzCisjZGVmaW5lIE1fU09GNSAgMHhDNQkJLyogTkI6IGNvZGVzIEM0IGFuZCBDQyBhcmUgTk9UIFNPRiBtYXJrZXJzICovCisjZGVmaW5lIE1fU09GNiAgMHhDNgorI2RlZmluZSBNX1NPRjcgIDB4QzcKKyNkZWZpbmUgTV9TT0Y5ICAweEM5CisjZGVmaW5lIE1fU09GMTAgMHhDQQorI2RlZmluZSBNX1NPRjExIDB4Q0IKKyNkZWZpbmUgTV9TT0YxMyAweENECisjZGVmaW5lIE1fU09GMTQgMHhDRQorI2RlZmluZSBNX1NPRjE1IDB4Q0YKKyNkZWZpbmUgTV9TT0kgICAweEQ4CQkvKiBTdGFydCBPZiBJbWFnZSAoYmVnaW5uaW5nIG9mIGRhdGFzdHJlYW0pICovCisjZGVmaW5lIE1fRU9JICAgMHhEOQkJLyogRW5kIE9mIEltYWdlIChlbmQgb2YgZGF0YXN0cmVhbSkgKi8KKyNkZWZpbmUgTV9TT1MgICAweERBCQkvKiBTdGFydCBPZiBTY2FuIChiZWdpbnMgY29tcHJlc3NlZCBkYXRhKSAqLworI2RlZmluZSBNX0FQUDAJMHhFMAkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgbWFya2VyLCB0eXBlIE4gKi8KKyNkZWZpbmUgTV9BUFAxMgkweEVDCQkvKiAod2UgZG9uJ3QgYm90aGVyIHRvIGxpc3QgYWxsIDE2IEFQUG4ncykgKi8KKyNkZWZpbmUgTV9DT00gICAweEZFCQkvKiBDT01tZW50ICovCisKKworLyoKKyAqIEZpbmQgdGhlIG5leHQgSlBFRyBtYXJrZXIgYW5kIHJldHVybiBpdHMgbWFya2VyIGNvZGUuCisgKiBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIEZGIGJ5dGUsIHBvc3NpYmx5IG1vcmUgaWYgdGhlIGNvbXByZXNzb3IgdXNlZCBGRnMKKyAqIHRvIHBhZCB0aGUgZmlsZS4KKyAqIFRoZXJlIGNvdWxkIGFsc28gYmUgbm9uLUZGIGdhcmJhZ2UgYmV0d2VlbiBtYXJrZXJzLiAgVGhlIHRyZWF0bWVudCBvZiBzdWNoCisgKiBnYXJiYWdlIGlzIHVuc3BlY2lmaWVkOyB3ZSBjaG9vc2UgdG8gc2tpcCBvdmVyIGl0IGJ1dCBlbWl0IGEgd2FybmluZyBtc2cuCisgKiBOQjogdGhpcyByb3V0aW5lIG11c3Qgbm90IGJlIHVzZWQgYWZ0ZXIgc2VlaW5nIFNPUyBtYXJrZXIsIHNpbmNlIGl0IHdpbGwKKyAqIG5vdCBkZWFsIGNvcnJlY3RseSB3aXRoIEZGLzAwIHNlcXVlbmNlcyBpbiB0aGUgY29tcHJlc3NlZCBpbWFnZSBkYXRhLi4uCisgKi8KKworc3RhdGljIGludAorbmV4dF9tYXJrZXIgKHZvaWQpCit7CisgIGludCBjOworICBpbnQgZGlzY2FyZGVkX2J5dGVzID0gMDsKKworICAvKiBGaW5kIDB4RkYgYnl0ZTsgY291bnQgYW5kIHNraXAgYW55IG5vbi1GRnMuICovCisgIGMgPSByZWFkXzFfYnl0ZSgpOworICB3aGlsZSAoYyAhPSAweEZGKSB7CisgICAgZGlzY2FyZGVkX2J5dGVzKys7CisgICAgYyA9IHJlYWRfMV9ieXRlKCk7CisgIH0KKyAgLyogR2V0IG1hcmtlciBjb2RlIGJ5dGUsIHN3YWxsb3dpbmcgYW55IGR1cGxpY2F0ZSBGRiBieXRlcy4gIEV4dHJhIEZGcworICAgKiBhcmUgbGVnYWwgYXMgcGFkIGJ5dGVzLCBzbyBkb24ndCBjb3VudCB0aGVtIGluIGRpc2NhcmRlZF9ieXRlcy4KKyAgICovCisgIGRvIHsKKyAgICBjID0gcmVhZF8xX2J5dGUoKTsKKyAgfSB3aGlsZSAoYyA9PSAweEZGKTsKKworICBpZiAoZGlzY2FyZGVkX2J5dGVzICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGdhcmJhZ2UgZGF0YSBmb3VuZCBpbiBKUEVHIGZpbGVcbiIpOworICB9CisKKyAgcmV0dXJuIGM7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGluaXRpYWwgbWFya2VyLCB3aGljaCBzaG91bGQgYmUgU09JLgorICogRm9yIGEgSkZJRiBmaWxlLCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBmaWxlIHNob3VsZCBiZSBsaXRlcmFsbHkKKyAqIDB4RkYgTV9TT0kuICBUbyBiZSBtb3JlIGdlbmVyYWwsIHdlIGNvdWxkIHVzZSBuZXh0X21hcmtlciwgYnV0IGlmIHRoZQorICogaW5wdXQgZmlsZSB3ZXJlbid0IGFjdHVhbGx5IEpQRUcgYXQgYWxsLCBuZXh0X21hcmtlciBtaWdodCByZWFkIHRoZSB3aG9sZQorICogZmlsZSBhbmQgdGhlbiByZXR1cm4gYSBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2UuLi4KKyAqLworCitzdGF0aWMgaW50CitmaXJzdF9tYXJrZXIgKHZvaWQpCit7CisgIGludCBjMSwgYzI7CisKKyAgYzEgPSBORVhUQllURSgpOworICBjMiA9IE5FWFRCWVRFKCk7CisgIGlmIChjMSAhPSAweEZGIHx8IGMyICE9IE1fU09JKQorICAgIEVSUkVYSVQoIk5vdCBhIEpQRUcgZmlsZSIpOworICByZXR1cm4gYzI7Cit9CisKKworLyoKKyAqIE1vc3QgdHlwZXMgb2YgbWFya2VyIGFyZSBmb2xsb3dlZCBieSBhIHZhcmlhYmxlLWxlbmd0aCBwYXJhbWV0ZXIgc2VnbWVudC4KKyAqIFRoaXMgcm91dGluZSBza2lwcyBvdmVyIHRoZSBwYXJhbWV0ZXJzIGZvciBhbnkgbWFya2VyIHdlIGRvbid0IG90aGVyd2lzZQorICogd2FudCB0byBwcm9jZXNzLgorICogTm90ZSB0aGF0IHdlIE1VU1Qgc2tpcCB0aGUgcGFyYW1ldGVyIHNlZ21lbnQgZXhwbGljaXRseSBpbiBvcmRlciBub3QgdG8KKyAqIGJlIGZvb2xlZCBieSAweEZGIGJ5dGVzIHRoYXQgbWlnaHQgYXBwZWFyIHdpdGhpbiB0aGUgcGFyYW1ldGVyIHNlZ21lbnQ7CisgKiBzdWNoIGJ5dGVzIGRvIE5PVCBpbnRyb2R1Y2UgbmV3IG1hcmtlcnMuCisgKi8KKworc3RhdGljIHZvaWQKK3NraXBfdmFyaWFibGUgKHZvaWQpCisvKiBTa2lwIG92ZXIgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KK3sKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKworICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCisgIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOworICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KKyAgaWYgKGxlbmd0aCA8IDIpCisgICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOworICBsZW5ndGggLT0gMjsKKyAgLyogU2tpcCBvdmVyIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAodm9pZCkgcmVhZF8xX2J5dGUoKTsKKyAgICBsZW5ndGgtLTsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIGEgQ09NIG1hcmtlci4KKyAqIFdlIHdhbnQgdG8gcHJpbnQgb3V0IHRoZSBtYXJrZXIgY29udGVudHMgYXMgbGVnaWJsZSB0ZXh0OworICogd2UgbXVzdCBndWFyZCBhZ2FpbnN0IG5vbi10ZXh0IGp1bmsgYW5kIHZhcnlpbmcgbmV3bGluZSByZXByZXNlbnRhdGlvbnMuCisgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfQ09NICh2b2lkKQoreworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworICBpbnQgY2g7CisgIGludCBsYXN0Y2ggPSAwOworCisgIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KKyAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CisgIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLworICBpZiAobGVuZ3RoIDwgMikKKyAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7CisgIGxlbmd0aCAtPSAyOworCisgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgY2ggPSByZWFkXzFfYnl0ZSgpOworICAgIC8qIEVtaXQgdGhlIGNoYXJhY3RlciBpbiBhIHJlYWRhYmxlIGZvcm0uCisgICAgICogTm9ucHJpbnRhYmxlcyBhcmUgY29udmVydGVkIHRvIFxubm4gZm9ybSwKKyAgICAgKiB3aGlsZSBcIGlzIGNvbnZlcnRlZCB0byBcXC4KKyAgICAgKiBOZXdsaW5lcyBpbiBDUiwgQ1IvTEYsIG9yIExGIGZvcm0gd2lsbCBiZSBwcmludGVkIGFzIG9uZSBuZXdsaW5lLgorICAgICAqLworICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICBwcmludGYoIlxuIik7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICBpZiAobGFzdGNoICE9ICdccicpCisJcHJpbnRmKCJcbiIpOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgcHJpbnRmKCJcXFxcIik7CisgICAgfSBlbHNlIGlmIChpc3ByaW50KGNoKSkgeworICAgICAgcHV0YyhjaCwgc3Rkb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJcXCUwM28iLCBjaCk7CisgICAgfQorICAgIGxhc3RjaCA9IGNoOworICAgIGxlbmd0aC0tOworICB9CisgIHByaW50ZigiXG4iKTsKK30KKworCisvKgorICogUHJvY2VzcyBhIFNPRm4gbWFya2VyLgorICogVGhpcyBjb2RlIGlzIG9ubHkgbmVlZGVkIGlmIHlvdSB3YW50IHRvIGtub3cgdGhlIGltYWdlIGRpbWVuc2lvbnMuLi4KKyAqLworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19TT0ZuIChpbnQgbWFya2VyKQoreworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworICB1bnNpZ25lZCBpbnQgaW1hZ2VfaGVpZ2h0LCBpbWFnZV93aWR0aDsKKyAgaW50IGRhdGFfcHJlY2lzaW9uLCBudW1fY29tcG9uZW50czsKKyAgY29uc3QgY2hhciAqIHByb2Nlc3M7CisgIGludCBjaTsKKworICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsJLyogdXN1YWwgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLworCisgIGRhdGFfcHJlY2lzaW9uID0gcmVhZF8xX2J5dGUoKTsKKyAgaW1hZ2VfaGVpZ2h0ID0gcmVhZF8yX2J5dGVzKCk7CisgIGltYWdlX3dpZHRoID0gcmVhZF8yX2J5dGVzKCk7CisgIG51bV9jb21wb25lbnRzID0gcmVhZF8xX2J5dGUoKTsKKworICBzd2l0Y2ggKG1hcmtlcikgeworICBjYXNlIE1fU09GMDoJcHJvY2VzcyA9ICJCYXNlbGluZSI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjE6CXByb2Nlc3MgPSAiRXh0ZW5kZWQgc2VxdWVudGlhbCI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjI6CXByb2Nlc3MgPSAiUHJvZ3Jlc3NpdmUiOyAgYnJlYWs7CisgIGNhc2UgTV9TT0YzOglwcm9jZXNzID0gIkxvc3NsZXNzIjsgIGJyZWFrOworICBjYXNlIE1fU09GNToJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjY6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlIjsgIGJyZWFrOworICBjYXNlIE1fU09GNzoJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgbG9zc2xlc3MiOyAgYnJlYWs7CisgIGNhc2UgTV9TT0Y5Oglwcm9jZXNzID0gIkV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgY29kaW5nIjsgIGJyZWFrOworICBjYXNlIE1fU09GMTA6CXByb2Nlc3MgPSAiUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgY29kaW5nIjsgIGJyZWFrOworICBjYXNlIE1fU09GMTE6CXByb2Nlc3MgPSAiTG9zc2xlc3MsIGFyaXRobWV0aWMgY29kaW5nIjsgIGJyZWFrOworICBjYXNlIE1fU09GMTM6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgY29kaW5nIjsgIGJyZWFrOworICBjYXNlIE1fU09GMTQ6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljIGNvZGluZyI7IGJyZWFrOworICBjYXNlIE1fU09GMTU6CXByb2Nlc3MgPSAiRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljIGNvZGluZyI7ICBicmVhazsKKyAgZGVmYXVsdDoJcHJvY2VzcyA9ICJVbmtub3duIjsgIGJyZWFrOworICB9CisKKyAgcHJpbnRmKCJKUEVHIGltYWdlIGlzICV1dyAqICV1aCwgJWQgY29sb3IgY29tcG9uZW50cywgJWQgYml0cyBwZXIgc2FtcGxlXG4iLAorCSBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCBudW1fY29tcG9uZW50cywgZGF0YV9wcmVjaXNpb24pOworICBwcmludGYoIkpQRUcgcHJvY2VzczogJXNcbiIsIHByb2Nlc3MpOworCisgIGlmIChsZW5ndGggIT0gKHVuc2lnbmVkIGludCkgKDggKyBudW1fY29tcG9uZW50cyAqIDMpKQorICAgIEVSUkVYSVQoIkJvZ3VzIFNPRiBtYXJrZXIgbGVuZ3RoIik7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgbnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAodm9pZCkgcmVhZF8xX2J5dGUoKTsJLyogQ29tcG9uZW50IElEIGNvZGUgKi8KKyAgICAodm9pZCkgcmVhZF8xX2J5dGUoKTsJLyogSCwgViBzYW1wbGluZyBmYWN0b3JzICovCisgICAgKHZvaWQpIHJlYWRfMV9ieXRlKCk7CS8qIFF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIgKi8KKyAgfQorfQorCisKKy8qCisgKiBQYXJzZSB0aGUgbWFya2VyIHN0cmVhbSB1bnRpbCBTT1Mgb3IgRU9JIGlzIHNlZW47CisgKiBkaXNwbGF5IGFueSBDT00gbWFya2Vycy4KKyAqIFdoaWxlIHRoZSBjb21wYW5pb24gcHJvZ3JhbSB3cmpwZ2NvbSB3aWxsIGFsd2F5cyBpbnNlcnQgQ09NIG1hcmtlcnMgYmVmb3JlCisgKiBTT0ZuLCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgbm90LCBzbyB3ZSBzY2FuIHRvIFNPUyBiZWZvcmUgc3RvcHBpbmcuCisgKiBJZiB3ZSB3ZXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgaW1hZ2UgZGltZW5zaW9ucywgd2Ugd291bGQgc3RvcCBhdCBTT0ZuLgorICogKENvbnZlcnNlbHksIGlmIHdlIG9ubHkgY2FyZWQgYWJvdXQgQ09NIG1hcmtlcnMsIHRoZXJlIHdvdWxkIGJlIG5vIG5lZWQKKyAqIGZvciBzcGVjaWFsIGNvZGUgdG8gaGFuZGxlIFNPRm47IHdlIGNvdWxkIHRyZWF0IGl0IGxpa2Ugb3RoZXIgbWFya2Vycy4pCisgKi8KKworc3RhdGljIGludAorc2Nhbl9KUEVHX2hlYWRlciAoaW50IHZlcmJvc2UpCit7CisgIGludCBtYXJrZXI7CisKKyAgLyogRXhwZWN0IFNPSSBhdCBzdGFydCBvZiBmaWxlICovCisgIGlmIChmaXJzdF9tYXJrZXIoKSAhPSBNX1NPSSkKKyAgICBFUlJFWElUKCJFeHBlY3RlZCBTT0kgbWFya2VyIGZpcnN0Iik7CisKKyAgLyogU2NhbiBtaXNjZWxsYW5lb3VzIG1hcmtlcnMgdW50aWwgd2UgcmVhY2ggU09TLiAqLworICBmb3IgKDs7KSB7CisgICAgbWFya2VyID0gbmV4dF9tYXJrZXIoKTsKKyAgICBzd2l0Y2ggKG1hcmtlcikgeworICAgICAgLyogTm90ZSB0aGF0IG1hcmtlciBjb2RlcyAweEM0LCAweEM4LCAweENDIGFyZSBub3QsIGFuZCBtdXN0IG5vdCBiZSwKKyAgICAgICAqIHRyZWF0ZWQgYXMgU09Gbi4gIEM0IGluIHBhcnRpY3VsYXIgaXMgYWN0dWFsbHkgREhULgorICAgICAgICovCisgICAgY2FzZSBNX1NPRjA6CQkvKiBCYXNlbGluZSAqLworICAgIGNhc2UgTV9TT0YxOgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0YyOgkJLyogUHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GMzoJCS8qIExvc3NsZXNzLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjU6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y2OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjc6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GOToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTA6CQkvKiBQcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxMToJCS8qIExvc3NsZXNzLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjEzOgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTQ6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTU6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICAgIGlmICh2ZXJib3NlKQorCXByb2Nlc3NfU09GbihtYXJrZXIpOworICAgICAgZWxzZQorCXNraXBfdmFyaWFibGUoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPUzoJCQkvKiBzdG9wIGJlZm9yZSBoaXR0aW5nIGNvbXByZXNzZWQgZGF0YSAqLworICAgICAgcmV0dXJuIG1hcmtlcjsKKworICAgIGNhc2UgTV9FT0k6CQkJLyogaW4gY2FzZSBpdCdzIGEgdGFibGVzLW9ubHkgSlBFRyBzdHJlYW0gKi8KKyAgICAgIHJldHVybiBtYXJrZXI7CisKKyAgICBjYXNlIE1fQ09NOgorICAgICAgcHJvY2Vzc19DT00oKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0FQUDEyOgorICAgICAgLyogU29tZSBkaWdpdGFsIGNhbWVyYSBtYWtlcnMgcHV0IHVzZWZ1bCB0ZXh0dWFsIGluZm9ybWF0aW9uIGludG8KKyAgICAgICAqIEFQUDEyIG1hcmtlcnMsIHNvIHdlIHByaW50IHRob3NlIG91dCB0b28gd2hlbiBpbiAtdmVyYm9zZSBtb2RlLgorICAgICAgICovCisgICAgICBpZiAodmVyYm9zZSkgeworCXByaW50ZigiQVBQMTIgY29udGFpbnM6XG4iKTsKKwlwcm9jZXNzX0NPTSgpOworICAgICAgfSBlbHNlCisJc2tpcF92YXJpYWJsZSgpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgkJCS8qIEFueXRoaW5nIGVsc2UganVzdCBnZXRzIHNraXBwZWQgKi8KKyAgICAgIHNraXBfdmFyaWFibGUoKTsJCS8qIHdlIGFzc3VtZSBpdCBoYXMgYSBwYXJhbWV0ZXIgY291bnQuLi4gKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSAvKiBlbmQgbG9vcCAqLworfQorCisKKy8qIENvbW1hbmQgbGluZSBwYXJzaW5nIGNvZGUgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLworCisKK3N0YXRpYyB2b2lkCit1c2FnZSAodm9pZCkKKy8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KK3sKKyAgZnByaW50ZihzdGRlcnIsICJyZGpwZ2NvbSBkaXNwbGF5cyBhbnkgdGV4dHVhbCBjb21tZW50cyBpbiBhIEpQRUcgZmlsZS5cbiIpOworCisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtzd2l0Y2hlc10gW2lucHV0ZmlsZV1cbiIsIHByb2duYW1lKTsKKworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgICBBbHNvIGRpc3BsYXkgZGltZW5zaW9ucyBvZiBKUEVHIGltYWdlXG4iKTsKKworICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworc3RhdGljIGludAora2V5bWF0Y2ggKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpCisvKiBDYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nIG9mIChwb3NzaWJseSBhYmJyZXZpYXRlZCkga2V5d29yZCBzd2l0Y2hlcy4gKi8KKy8qIGtleXdvcmQgaXMgdGhlIGNvbnN0YW50IGtleXdvcmQgKG11c3QgYmUgbG93ZXIgY2FzZSBhbHJlYWR5KSwgKi8KKy8qIG1pbmNoYXJzIGlzIGxlbmd0aCBvZiBtaW5pbXVtIGxlZ2FsIGFiYnJldmlhdGlvbi4gKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNhLCBjazsKKyAgcmVnaXN0ZXIgaW50IG5tYXRjaGVkID0gMDsKKworICB3aGlsZSAoKGNhID0gKmFyZysrKSAhPSAnXDAnKSB7CisgICAgaWYgKChjayA9ICprZXl3b3JkKyspID09ICdcMCcpCisgICAgICByZXR1cm4gMDsJCQkvKiBhcmcgbG9uZ2VyIHRoYW4ga2V5d29yZCwgbm8gZ29vZCAqLworICAgIGlmIChpc3VwcGVyKGNhKSkJCS8qIGZvcmNlIGFyZyB0byBsY2FzZSAoYXNzdW1lIGNrIGlzIGFscmVhZHkpICovCisgICAgICBjYSA9IHRvbG93ZXIoY2EpOworICAgIGlmIChjYSAhPSBjaykKKyAgICAgIHJldHVybiAwOwkJCS8qIG5vIGdvb2QgKi8KKyAgICBubWF0Y2hlZCsrOwkJCS8qIGNvdW50IG1hdGNoZWQgY2hhcmFjdGVycyAqLworICB9CisgIC8qIHJlYWNoZWQgZW5kIG9mIGFyZ3VtZW50OyBmYWlsIGlmIGl0J3MgdG9vIHNob3J0IGZvciB1bmlxdWUgYWJicmV2ICovCisgIGlmIChubWF0Y2hlZCA8IG1pbmNoYXJzKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsJCQkvKiBBLU9LICovCit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGludCBhcmduOworICBjaGFyICogYXJnOworICBpbnQgdmVyYm9zZSA9IDA7CisKKyAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KKyNpZmRlZiBVU0VfQ0NPTU1BTkQKKyAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKKyNlbmRpZgorCisgIHByb2duYW1lID0gYXJndlswXTsKKyAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKKyAgICBwcm9nbmFtZSA9ICJyZGpwZ2NvbSI7CS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLworCisgIC8qIFBhcnNlIHN3aXRjaGVzLCBpZiBhbnkgKi8KKyAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgeworICAgIGFyZyA9IGFyZ3ZbYXJnbl07CisgICAgaWYgKGFyZ1swXSAhPSAnLScpCisgICAgICBicmVhazsJCQkvKiBub3Qgc3dpdGNoLCBtdXN0IGJlIGZpbGUgbmFtZSAqLworICAgIGFyZysrOwkJCS8qIGFkdmFuY2Ugb3ZlciAnLScgKi8KKyAgICBpZiAoa2V5bWF0Y2goYXJnLCAidmVyYm9zZSIsIDEpKSB7CisgICAgICB2ZXJib3NlKys7CisgICAgfSBlbHNlCisgICAgICB1c2FnZSgpOworICB9CisKKyAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZS4gKi8KKyAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLworICBpZiAoYXJnbiA8IGFyZ2MtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKKyAgICB1c2FnZSgpOworICB9CisgIGlmIChhcmduIDwgYXJnYykgeworICAgIGlmICgoaW5maWxlID0gZm9wZW4oYXJndlthcmduXSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduXSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGRlZmF1bHQgaW5wdXQgZmlsZSBpcyBzdGRpbiAqLworI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLworICAgIHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOworI2VuZGlmCisjaWZkZWYgVVNFX0ZET1BFTgkJLyogbmVlZCB0byByZS1vcGVuIGluIGJpbmFyeSBtb2RlPyAqLworICAgIGlmICgoaW5maWxlID0gZmRvcGVuKGZpbGVubyhzdGRpbiksIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBzdGRpblxuIiwgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyNlbHNlCisgICAgaW5maWxlID0gc3RkaW47CisjZW5kaWYKKyAgfQorCisgIC8qIFNjYW4gdGhlIEpQRUcgaGVhZGVycy4gKi8KKyAgKHZvaWQpIHNjYW5fSlBFR19oZWFkZXIodmVyYm9zZSk7CisKKyAgLyogQWxsIGRvbmUuICovCisgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyAgcmV0dXJuIDA7CQkJLyogc3VwcHJlc3Mgbm8tcmV0dXJuLXZhbHVlIHdhcm5pbmdzICovCit9CmRpZmYgLS1naXQgYS9yZHBwbS5jIGIvcmRwcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGYzNWMxCi0tLSAvZGV2L251bGwKKysrIGIvcmRwcG0uYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIHJkcHBtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBQUE0vUEdNIGZvcm1hdC4KKyAqIFRoZSBleHRlbmRlZCAyLWJ5dGUtcGVyLXNhbXBsZSByYXcgUFBNL1BHTSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCisgKiBUaGUgUEJNUExVUyBsaWJyYXJ5IGlzIE5PVCByZXF1aXJlZCB0byBjb21waWxlIHRoaXMgc29mdHdhcmUKKyAqIChidXQgaXQgaXMgaGlnaGx5IHVzZWZ1bCBhcyBhIHNldCBvZiBQUE0gaW1hZ2UgbWFuaXB1bGF0aW9uIHByb2dyYW1zKS4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQorICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCisgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCisgKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKKyAqIHRoZSBmaWxlIGlzIGluZGVlZCBQUE0gZm9ybWF0KS4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgUFBNX1NVUFBPUlRFRAorCisKKy8qIFBvcnRpb25zIG9mIHRoaXMgY29kZSBhcmUgYmFzZWQgb24gdGhlIFBCTVBMVVMgbGlicmFyeSwgd2hpY2ggaXM6CisqKgorKiogQ29weXJpZ2h0IChDKSAxOTg4IGJ5IEplZiBQb3NrYW56ZXIuCisqKgorKiogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisqKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCisqKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorKiogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworKiogZG9jdW1lbnRhdGlvbi4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IKKyoqIGltcGxpZWQgd2FycmFudHkuCisqLworCisKKy8qIE1hY3JvcyB0byBkZWFsIHdpdGggdW5zaWduZWQgY2hhcnMgYXMgZWZmaWNpZW50bHkgYXMgY29tcGlsZXIgYWxsb3dzICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQorI2Vsc2UgLyogIUhBVkVfVU5TSUdORURfQ0hBUiAqLworI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKK3R5cGVkZWYgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQorI2Vsc2UKK3R5cGVkZWYgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpICYgMHhGRikKKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLworCisKKyNkZWZpbmUJUmVhZE9LKGZpbGUsYnVmZmVyLGxlbikJKEpGUkVBRChmaWxlLGJ1ZmZlcixsZW4pID09ICgoc2l6ZV90KSAobGVuKSkpCisKKworLyoKKyAqIE9uIG1vc3Qgc3lzdGVtcywgcmVhZGluZyBpbmRpdmlkdWFsIGJ5dGVzIHdpdGggZ2V0YygpIGlzIGRyYXN0aWNhbGx5IGxlc3MKKyAqIGVmZmljaWVudCB0aGFuIGJ1ZmZlcmluZyBhIHJvdyBhdCBhIHRpbWUgd2l0aCBmcmVhZCgpLiAgT24gUENzLCB3ZSBtdXN0CisgKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUgYXNzdW1pbmcgc21hbGwtZGF0YQorICogbWVtb3J5IG1vZGVsLCB3aGVyZWluIGZyZWFkKCkgY2FuJ3QgcmVhY2ggZmFyIG1lbW9yeS4gIElmIHlvdSBuZWVkIHRvCisgKiBwcm9jZXNzIHZlcnkgd2lkZSBpbWFnZXMgb24gYSBQQywgeW91IG1pZ2h0IGhhdmUgdG8gY29tcGlsZSBpbiBsYXJnZS1tZW1vcnkKKyAqIG1vZGVsLCBvciBlbHNlIHJlcGxhY2UgZnJlYWQoKSB3aXRoIGEgZ2V0YygpIGxvb3AgLS0tIHdoaWNoIHdpbGwgYmUgbXVjaAorICogc2xvd2VyLgorICovCisKKworLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgc291cmNlIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIFVfQ0hBUiAqaW9idWZmZXI7CQkvKiBub24tRkFSIHBvaW50ZXIgdG8gSS9PIGJ1ZmZlciAqLworICBKU0FNUFJPVyBwaXhyb3c7CQkvKiBGQVIgcG9pbnRlciB0byBzYW1lICovCisgIHNpemVfdCBidWZmZXJfd2lkdGg7CQkvKiB3aWR0aCBvZiBJL08gYnVmZmVyICovCisgIEpTQU1QTEUgKnJlc2NhbGU7CQkvKiA9PiBtYXh2YWwtcmVtYXBwaW5nIGFycmF5LCBvciBOVUxMICovCit9IHBwbV9zb3VyY2Vfc3RydWN0OworCit0eXBlZGVmIHBwbV9zb3VyY2Vfc3RydWN0ICogcHBtX3NvdXJjZV9wdHI7CisKKworTE9DQUwoaW50KQorcGJtX2dldGMgKEZJTEUgKiBpbmZpbGUpCisvKiBSZWFkIG5leHQgY2hhciwgc2tpcHBpbmcgb3ZlciBhbnkgY29tbWVudHMgKi8KKy8qIEEgY29tbWVudC9uZXdsaW5lIHNlcXVlbmNlIGlzIHJldHVybmVkIGFzIGEgbmV3bGluZSAqLworeworICByZWdpc3RlciBpbnQgY2g7CisKKyAgY2ggPSBnZXRjKGluZmlsZSk7CisgIGlmIChjaCA9PSAnIycpIHsKKyAgICBkbyB7CisgICAgICBjaCA9IGdldGMoaW5maWxlKTsKKyAgICB9IHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRik7CisgIH0KKyAgcmV0dXJuIGNoOworfQorCisKK0xPQ0FMKHVuc2lnbmVkIGludCkKK3JlYWRfcGJtX2ludGVnZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQorLyogUmVhZCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgZnJvbSB0aGUgUFBNIGZpbGUgKi8KKy8qIFN3YWxsb3dzIG9uZSB0cmFpbGluZyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGludGVnZXIgKi8KKy8qIE5vdGUgdGhhdCBvbiBhIDE2LWJpdC1pbnQgbWFjaGluZSwgb25seSB2YWx1ZXMgdXAgdG8gNjRrIGNhbiBiZSByZWFkLiAqLworLyogVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNoOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgdmFsOworCisgIC8qIFNraXAgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICBkbyB7CisgICAgY2ggPSBwYm1fZ2V0YyhpbmZpbGUpOworICAgIGlmIChjaCA9PSBFT0YpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIH0gd2hpbGUgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyk7CisKKyAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX05PTk5VTUVSSUMpOworCisgIHZhbCA9IGNoIC0gJzAnOworICB3aGlsZSAoKGNoID0gcGJtX2dldGMoaW5maWxlKSkgPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgIHZhbCAqPSAxMDsKKyAgICB2YWwgKz0gY2ggLSAnMCc7CisgIH0KKyAgcmV0dXJuIHZhbDsKK30KKworCisvKgorICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KKyAqCisgKiBXZSBwcm92aWRlIHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zIGRlcGVuZGluZyBvbiBpbnB1dCBmaWxlIGZvcm1hdC4KKyAqIEluIGFsbCBjYXNlcywgaW5wdXQgaXMgc2NhbGVkIHRvIHRoZSBzaXplIG9mIEpTQU1QTEUuCisgKgorICogQSByZWFsbHkgZmFzdCBwYXRoIGlzIHByb3ZpZGVkIGZvciByZWFkaW5nIGJ5dGUvc2FtcGxlIHJhdyBmaWxlcyB3aXRoCisgKiBtYXh2YWwgPSBNQVhKU0FNUExFLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UgZm9yIDgtYml0IGRhdGEuCisgKi8KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF90ZXh0X2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyB0ZXh0LWZvcm1hdCBQR00gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisgIEZJTEUgKiBpbmZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7CisgIEpESU1FTlNJT04gY29sOworCisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF90ZXh0X3JnYl9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHRleHQtZm9ybWF0IFBQTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgRklMRSAqIGluZmlsZSA9IHNvdXJjZS0+cHViLmlucHV0X2ZpbGU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKKyAgSkRJTUVOU0lPTiBjb2w7CisKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOworICAgICpwdHIrKyA9IHJlc2NhbGVbcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKV07CisgICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF9zY2FsZWRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy1ieXRlLWZvcm1hdCBQR00gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgVV9DSEFSICogYnVmZmVycHRyOworICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOworICBKRElNRU5TSU9OIGNvbDsKKworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBidWZmZXJwdHIgPSBzb3VyY2UtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAqcHRyKysgPSByZXNjYWxlW1VDSCgqYnVmZmVycHRyKyspXTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF9zY2FsZWRfcmdiX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IFBQTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7CisgIEpESU1FTlNJT04gY29sOworCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOworICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOworICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOworICB9CisgIHJldHVybiAxOworfQorCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3Jhd19yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy1ieXRlLWZvcm1hdCBmaWxlcyB3aXRoIG1heHZhbCA9IE1BWEpTQU1QTEUuCisgKiBJbiB0aGlzIGNhc2Ugd2UganVzdCByZWFkIHJpZ2h0IGludG8gdGhlIEpTQU1QTEUgYnVmZmVyIQorICogTm90ZSB0aGF0IHNhbWUgY29kZSB3b3JrcyBmb3IgUFBNIGFuZCBQR00gZmlsZXMuCisgKi8KK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgcmV0dXJuIDE7Cit9CisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfd29yZF9ncmF5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LXdvcmQtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7CisgIEpESU1FTlNJT04gY29sOworCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIHJlZ2lzdGVyIGludCB0ZW1wOworICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7CisgICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OworICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfd29yZF9yZ2Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctd29yZC1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLworeworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKKyAgSkRJTUVOU0lPTiBjb2w7CisKKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgcmVnaXN0ZXIgaW50IHRlbXA7CisgICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKKyAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7CisgICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKKyAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOworICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKKyAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOworICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7CisgICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OworICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfaW5wdXRfcHBtIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgaW50IGM7CisgIHVuc2lnbmVkIGludCB3LCBoLCBtYXh2YWw7CisgIGJvb2xlYW4gbmVlZF9pb2J1ZmZlciwgdXNlX3Jhd19idWZmZXIsIG5lZWRfcmVzY2FsZTsKKworICBpZiAoZ2V0Yyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKSAhPSAnUCcpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9UKTsKKworICBjID0gZ2V0Yyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKTsgLyogc3ViZm9ybWF0IGRpc2NyaW1pbmF0b3IgY2hhcmFjdGVyICovCisKKyAgLyogZGV0ZWN0IHVuc3VwcG9ydGVkIHZhcmlhbnRzIChpZSwgUEJNKSBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQgaGVhZGVyICovCisgIHN3aXRjaCAoYykgeworICBjYXNlICcyJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUEdNIGZpbGUgKi8KKyAgY2FzZSAnMyc6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBQTSBmaWxlICovCisgIGNhc2UgJzUnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBHTSBmaWxlICovCisgIGNhc2UgJzYnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBQTSBmaWxlICovCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9UKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIGZldGNoIHRoZSByZW1haW5pbmcgaGVhZGVyIGluZm8gKi8KKyAgdyA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOworICBoID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7CisgIG1heHZhbCA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOworCisgIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8IG1heHZhbCA8PSAwKSAvKiBlcnJvciBjaGVjayAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX05PVCk7CisKKyAgY2luZm8tPmRhdGFfcHJlY2lzaW9uID0gQklUU19JTl9KU0FNUExFOyAvKiB3ZSBhbHdheXMgcmVzY2FsZSBkYXRhIHRvIHRoaXMgKi8KKyAgY2luZm8tPmltYWdlX3dpZHRoID0gKEpESU1FTlNJT04pIHc7CisgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSAoSkRJTUVOU0lPTikgaDsKKworICAvKiBpbml0aWFsaXplIGZsYWdzIHRvIG1vc3QgY29tbW9uIHNldHRpbmdzICovCisgIG5lZWRfaW9idWZmZXIgPSBUUlVFOwkJLyogZG8gd2UgbmVlZCBhbiBJL08gYnVmZmVyPyAqLworICB1c2VfcmF3X2J1ZmZlciA9IEZBTFNFOwkvKiBkbyB3ZSBtYXAgaW5wdXQgYnVmZmVyIG9udG8gSS9PIGJ1ZmZlcj8gKi8KKyAgbmVlZF9yZXNjYWxlID0gVFJVRTsJCS8qIGRvIHdlIG5lZWQgYSByZXNjYWxlIGFycmF5PyAqLworCisgIHN3aXRjaCAoYykgeworICBjYXNlICcyJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUEdNIGZpbGUgKi8KKyAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDE7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QR01fVEVYVCwgdywgaCk7CisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfdGV4dF9ncmF5X3JvdzsKKyAgICBuZWVkX2lvYnVmZmVyID0gRkFMU0U7CisgICAgYnJlYWs7CisKKyAgY2FzZSAnMyc6CQkJLyogaXQncyBhIHRleHQtZm9ybWF0IFBQTSBmaWxlICovCisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUFBNX1RFWFQsIHcsIGgpOworICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3RleHRfcmdiX3JvdzsKKyAgICBuZWVkX2lvYnVmZmVyID0gRkFMU0U7CisgICAgYnJlYWs7CisKKyAgY2FzZSAnNSc6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUEdNIGZpbGUgKi8KKyAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDE7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QR00sIHcsIGgpOworICAgIGlmIChtYXh2YWwgPiAyNTUpIHsKKyAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3dvcmRfZ3JheV9yb3c7CisgICAgfSBlbHNlIGlmIChtYXh2YWwgPT0gTUFYSlNBTVBMRSAmJiBTSVpFT0YoSlNBTVBMRSkgPT0gU0laRU9GKFVfQ0hBUikpIHsKKyAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3Jhd19yb3c7CisgICAgICB1c2VfcmF3X2J1ZmZlciA9IFRSVUU7CisgICAgICBuZWVkX3Jlc2NhbGUgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfc2NhbGVkX2dyYXlfcm93OworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlICc2JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQUE0gZmlsZSAqLworICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BQTSwgdywgaCk7CisgICAgaWYgKG1heHZhbCA+IDI1NSkgeworICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfd29yZF9yZ2Jfcm93OworICAgIH0gZWxzZSBpZiAobWF4dmFsID09IE1BWEpTQU1QTEUgJiYgU0laRU9GKEpTQU1QTEUpID09IFNJWkVPRihVX0NIQVIpKSB7CisgICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9yYXdfcm93OworICAgICAgdXNlX3Jhd19idWZmZXIgPSBUUlVFOworICAgICAgbmVlZF9yZXNjYWxlID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3NjYWxlZF9yZ2Jfcm93OworICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBJL08gYnVmZmVyOiAxIG9yIDMgYnl0ZXMgb3Igd29yZHMvcGl4ZWwuICovCisgIGlmIChuZWVkX2lvYnVmZmVyKSB7CisgICAgc291cmNlLT5idWZmZXJfd2lkdGggPSAoc2l6ZV90KSB3ICogY2luZm8tPmlucHV0X2NvbXBvbmVudHMgKgorICAgICAgKChtYXh2YWw8PTI1NSkgPyBTSVpFT0YoVV9DSEFSKSA6ICgyKlNJWkVPRihVX0NIQVIpKSk7CisgICAgc291cmNlLT5pb2J1ZmZlciA9IChVX0NIQVIgKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBzb3VyY2UtPmJ1ZmZlcl93aWR0aCk7CisgIH0KKworICAvKiBDcmVhdGUgY29tcHJlc3NvciBpbnB1dCBidWZmZXIuICovCisgIGlmICh1c2VfcmF3X2J1ZmZlcikgeworICAgIC8qIEZvciB1bnNjYWxlZCByYXctaW5wdXQgY2FzZSwgd2UgY2FuIGp1c3QgbWFwIGl0IG9udG8gdGhlIEkvTyBidWZmZXIuICovCisgICAgLyogU3ludGhlc2l6ZSBhIEpTQU1QQVJSQVkgcG9pbnRlciBzdHJ1Y3R1cmUgKi8KKyAgICAvKiBDYXN0IGhlcmUgaW1wbGllcyBuZWFyLT5mYXIgcG9pbnRlciBjb252ZXJzaW9uIG9uIFBDcyAqLworICAgIHNvdXJjZS0+cGl4cm93ID0gKEpTQU1QUk9XKSBzb3VyY2UtPmlvYnVmZmVyOworICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICYgc291cmNlLT5waXhyb3c7CisgICAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisgIH0gZWxzZSB7CisgICAgLyogTmVlZCB0byB0cmFuc2xhdGUgYW55d2F5LCBzbyBtYWtlIGEgc2VwYXJhdGUgc2FtcGxlIGJ1ZmZlci4gKi8KKyAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pIHcgKiBjaW5mby0+aW5wdXRfY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOworICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworICB9CisKKyAgLyogQ29tcHV0ZSB0aGUgcmVzY2FsaW5nIGFycmF5IGlmIHJlcXVpcmVkLiAqLworICBpZiAobmVlZF9yZXNjYWxlKSB7CisgICAgSU5UMzIgdmFsLCBoYWxmX21heHZhbDsKKworICAgIC8qIE9uIDE2LWJpdC1pbnQgbWFjaGluZXMgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIG9mIG1heHZhbCA9IDY1NTM1ICovCisgICAgc291cmNlLT5yZXNjYWxlID0gKEpTQU1QTEUgKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAoc2l6ZV90KSAoKChsb25nKSBtYXh2YWwgKyAxTCkgKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgICBoYWxmX21heHZhbCA9IG1heHZhbCAvIDI7CisgICAgZm9yICh2YWwgPSAwOyB2YWwgPD0gKElOVDMyKSBtYXh2YWw7IHZhbCsrKSB7CisgICAgICAvKiBUaGUgbXVsdGlwbGljYXRpb24gaGVyZSBtdXN0IGJlIGRvbmUgaW4gMzIgYml0cyB0byBhdm9pZCBvdmVyZmxvdyAqLworICAgICAgc291cmNlLT5yZXNjYWxlW3ZhbF0gPSAoSlNBTVBMRSkgKCh2YWwqTUFYSlNBTVBMRSArIGhhbGZfbWF4dmFsKS9tYXh2YWwpOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9pbnB1dF9wcG0gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFBQTSBmb3JtYXQgaW5wdXQuCisgKi8KKworR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCitqaW5pdF9yZWFkX3BwbSAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZTsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QgKi8KKyAgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihwcG1fc291cmNlX3N0cnVjdCkpOworICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzLCBleGNlcHQgZ2V0X3BpeGVsX3Jvd3Mgd2hpY2ggc3RhcnRfaW5wdXQgc2V0cyAqLworICBzb3VyY2UtPnB1Yi5zdGFydF9pbnB1dCA9IHN0YXJ0X2lucHV0X3BwbTsKKyAgc291cmNlLT5wdWIuZmluaXNoX2lucHV0ID0gZmluaXNoX2lucHV0X3BwbTsKKworICByZXR1cm4gKGNqcGVnX3NvdXJjZV9wdHIpIHNvdXJjZTsKK30KKworI2VuZGlmIC8qIFBQTV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3JkcmxlLmMgYi9yZHJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmJjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9yZHJsZS5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogcmRybGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFV0YWggUkxFIGZvcm1hdC4KKyAqIFRoZSBVdGFoIFJhc3RlciBUb29sa2l0IGxpYnJhcnkgaXMgcmVxdWlyZWQgKHZlcnNpb24gMy4xIG9yIGxhdGVyKS4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQorICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCisgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCisgKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKKyAqIHRoZSBmaWxlIGlzIGluZGVlZCBSTEUgZm9ybWF0KS4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgTGlqZXdza2ksCisgKiB3aXRoIHVwZGF0ZXMgZnJvbSBSb2JlcnQgSHV0Y2hpbnNvbi4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgUkxFX1NVUFBPUlRFRAorCisvKiBybGUuaCBpcyBwcm92aWRlZCBieSB0aGUgVXRhaCBSYXN0ZXIgVG9vbGtpdC4gKi8KKworI2luY2x1ZGUgPHJsZS5oPgorCisvKgorICogV2UgYXNzdW1lIHRoYXQgSlNBTVBMRSBoYXMgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYXMgcmxlX3BpeGVsLAorICogdG8gd2l0LCAidW5zaWduZWQgY2hhciIuICBIZW5jZSB3ZSBjYW4ndCBjb3BlIHdpdGggMTItIG9yIDE2LWJpdCBzYW1wbGVzLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworLyoKKyAqIFdlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBSTEUgZmlsZXM6CisgKiAgIAorICogICBHUkFZU0NBTEUgICAtIDggYml0cywgbm8gY29sb3JtYXAKKyAqICAgTUFQUEVER1JBWSAgLSA4IGJpdHMsIDEgY2hhbm5lbCBjb2xvbWFwCisgKiAgIFBTRVVET0NPTE9SIC0gOCBiaXRzLCAzIGNoYW5uZWwgY29sb3JtYXAKKyAqICAgVFJVRUNPTE9SICAgLSAyNCBiaXRzLCAzIGNoYW5uZWwgY29sb3JtYXAKKyAqICAgRElSRUNUQ09MT1IgLSAyNCBiaXRzLCBubyBjb2xvcm1hcAorICoKKyAqIEZvciBub3csIHdlIGlnbm9yZSBhbnkgYWxwaGEgY2hhbm5lbCBpbiB0aGUgaW1hZ2UuCisgKi8KKwordHlwZWRlZiBlbnVtCisgIHsgR1JBWVNDQUxFLCBNQVBQRURHUkFZLCBQU0VVRE9DT0xPUiwgVFJVRUNPTE9SLCBESVJFQ1RDT0xPUiB9IHJsZV9raW5kOworCisKKy8qCisgKiBTaW5jZSBSTEUgc3RvcmVzIHNjYW5saW5lcyBib3R0b20tdG8tdG9wLCB3ZSBoYXZlIHRvIGludmVydCB0aGUgaW1hZ2UKKyAqIHRvIGNvbmZvcm0gdG8gSlBFRydzIHRvcC10by1ib3R0b20gb3JkZXIuICBUbyBkbyB0aGlzLCB3ZSByZWFkIHRoZQorICogaW5jb21pbmcgaW1hZ2UgaW50byBhIHZpcnR1YWwgYXJyYXkgb24gdGhlIGZpcnN0IGdldF9waXhlbF9yb3dzIGNhbGwsCisgKiB0aGVuIGZldGNoIHRoZSByZXF1aXJlZCByb3cgZnJvbSB0aGUgdmlydHVhbCBhcnJheSBvbiBzdWJzZXF1ZW50IGNhbGxzLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9ybGVfc291cmNlX3N0cnVjdCAqIHJsZV9zb3VyY2VfcHRyOworCit0eXBlZGVmIHN0cnVjdCBfcmxlX3NvdXJjZV9zdHJ1Y3QgeworICBzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBybGVfa2luZCB2aXN1YWw7ICAgICAgICAgICAgICAvKiBhY3R1YWwgdHlwZSBvZiBpbnB1dCBmaWxlICovCisgIGp2aXJ0X3NhcnJheV9wdHIgaW1hZ2U7ICAgICAgIC8qIHZpcnR1YWwgYXJyYXkgdG8gaG9sZCB0aGUgaW1hZ2UgKi8KKyAgSkRJTUVOU0lPTiByb3c7CQkvKiBjdXJyZW50IHJvdyAjIGluIHRoZSB2aXJ0dWFsIGFycmF5ICovCisgIHJsZV9oZHIgaGVhZGVyOyAgICAgICAgICAgICAgIC8qIElucHV0IGZpbGUgaW5mb3JtYXRpb24gKi8KKyAgcmxlX3BpeGVsKiogcmxlX3JvdzsgICAgICAgICAgLyogaG9sZHMgYSByb3cgcmV0dXJuZWQgYnkgcmxlX2dldHJvdygpICovCisKK30gcmxlX3NvdXJjZV9zdHJ1Y3Q7CisKKworLyoKKyAqIFJlYWQgdGhlIGZpbGUgaGVhZGVyOyByZXR1cm4gaW1hZ2Ugc2l6ZSBhbmQgY29tcG9uZW50IGNvdW50LgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfaW5wdXRfcmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgSkRJTUVOU0lPTiB3aWR0aCwgaGVpZ2h0OworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisjZW5kaWYKKworICAvKiBVc2UgUkxFIGxpYnJhcnkgcm91dGluZSB0byBnZXQgdGhlIGhlYWRlciBpbmZvICovCisgIHNvdXJjZS0+aGVhZGVyID0gKnJsZV9oZHJfaW5pdChOVUxMKTsKKyAgc291cmNlLT5oZWFkZXIucmxlX2ZpbGUgPSBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlOworICBzd2l0Y2ggKHJsZV9nZXRfc2V0dXAoJihzb3VyY2UtPmhlYWRlcikpKSB7CisgIGNhc2UgUkxFX1NVQ0NFU1M6CisgICAgLyogQS1PSyAqLworICAgIGJyZWFrOworICBjYXNlIFJMRV9OT1RfUkxFOgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX05PVCk7CisgICAgYnJlYWs7CisgIGNhc2UgUkxFX05PX1NQQUNFOgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX01FTSk7CisgICAgYnJlYWs7CisgIGNhc2UgUkxFX0VNUFRZOgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0VNUFRZKTsKKyAgICBicmVhazsKKyAgY2FzZSBSTEVfRU9GOgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX0VPRik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfQkFERVJST1IpOworICAgIGJyZWFrOworICB9CisKKyAgLyogRmlndXJlIG91dCB3aGF0IHdlIGhhdmUsIHNldCBwcml2YXRlIHZhcnMgYW5kIHJldHVybiB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KKyAgCisgIHdpZHRoICA9IHNvdXJjZS0+aGVhZGVyLnhtYXggLSBzb3VyY2UtPmhlYWRlci54bWluICsgMTsKKyAgaGVpZ2h0ID0gc291cmNlLT5oZWFkZXIueW1heCAtIHNvdXJjZS0+aGVhZGVyLnltaW4gKyAxOworICBzb3VyY2UtPmhlYWRlci54bWluID0gMDsJCS8qIHJlYWxpZ24gaG9yaXpvbnRhbGx5ICovCisgIHNvdXJjZS0+aGVhZGVyLnhtYXggPSB3aWR0aC0xOworCisgIGNpbmZvLT5pbWFnZV93aWR0aCAgICAgID0gd2lkdGg7CisgIGNpbmZvLT5pbWFnZV9oZWlnaHQgICAgID0gaGVpZ2h0OworICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gICA9IDg7ICAvKiB3ZSBjYW4gb25seSBoYW5kbGUgOCBiaXQgZGF0YSAqLworCisgIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDEgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMCkgeworICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IEdSQVlTQ0FMRTsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19STEVfR1JBWSwgd2lkdGgsIGhlaWdodCk7CisgIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDEpIHsKKyAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBNQVBQRURHUkFZOworICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1JMRV9NQVBHUkFZLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7CisgIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAxICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDMpIHsKKyAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBQU0VVRE9DT0xPUjsKKyAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfTUFQUEVELCB3aWR0aCwgaGVpZ2h0LAorCSAgICAgMSA8PCBzb3VyY2UtPmhlYWRlci5jbWFwbGVuKTsKKyAgfSBlbHNlIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDMgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMykgeworICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IFRSVUVDT0xPUjsKKyAgICBUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19STEVfRlVMTE1BUCwgd2lkdGgsIGhlaWdodCwKKwkgICAgIDEgPDwgc291cmNlLT5oZWFkZXIuY21hcGxlbik7CisgIH0gZWxzZSBpZiAoc291cmNlLT5oZWFkZXIubmNvbG9ycyA9PSAzICYmIHNvdXJjZS0+aGVhZGVyLm5jbWFwID09IDApIHsKKyAgICBzb3VyY2UtPnZpc3VhbCAgICAgPSBESVJFQ1RDT0xPUjsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19STEUsIHdpZHRoLCBoZWlnaHQpOworICB9IGVsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9VTlNVUFBPUlRFRCk7CisgIAorICBpZiAoc291cmNlLT52aXN1YWwgPT0gR1JBWVNDQUxFIHx8IHNvdXJjZS0+dmlzdWFsID09IE1BUFBFREdSQVkpIHsKKyAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgICA9IEpDU19HUkFZU0NBTEU7CisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICB9IGVsc2UgeworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSAgID0gSkNTX1JHQjsKKyAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7CisgIH0KKworICAvKgorICAgKiBBIHBsYWNlIHRvIGhvbGQgZWFjaCBzY2FubGluZSB3aGlsZSBpdCdzIGNvbnZlcnRlZC4KKyAgICogKEdSQVlTQ0FMRSBzY2FubGluZXMgZG9uJ3QgbmVlZCBjb252ZXJ0aW5nKQorICAgKi8KKyAgaWYgKHNvdXJjZS0+dmlzdWFsICE9IEdSQVlTQ0FMRSkgeworICAgIHNvdXJjZS0+cmxlX3JvdyA9IChybGVfcGl4ZWwqKikgKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCwgKEpESU1FTlNJT04pIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKTsKKyAgfQorCisgIC8qIHJlcXVlc3QgYSB2aXJ0dWFsIGFycmF5IHRvIGhvbGQgdGhlIGltYWdlICovCisgIHNvdXJjZS0+aW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisgICAgIChKRElNRU5TSU9OKSAod2lkdGggKiBzb3VyY2UtPmhlYWRlci5uY29sb3JzKSwKKyAgICAgKEpESU1FTlNJT04pIGhlaWdodCwgKEpESU1FTlNJT04pIDEpOworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCisgICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOworICB9CisjZW5kaWYKKworICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKK30KKworCisvKgorICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KKyAqIENhbGxlZCBvbmx5IGFmdGVyIGxvYWRfaW1hZ2UgaGFzIHJlYWQgdGhlIGltYWdlIGludG8gdGhlIHZpcnR1YWwgYXJyYXkuCisgKiBVc2VkIGZvciBHUkFZU0NBTEUsIE1BUFBFREdSQVksIFRSVUVDT0xPUiwgYW5kIERJUkVDVENPTE9SIGltYWdlcy4KKyAqLworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF9ybGVfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKKworICBzb3VyY2UtPnJvdy0tOworICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHNvdXJjZS0+cm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworCisgIHJldHVybiAxOworfQorCisvKgorICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KKyAqIENhbGxlZCBvbmx5IGFmdGVyIGxvYWRfaW1hZ2UgaGFzIHJlYWQgdGhlIGltYWdlIGludG8gdGhlIHZpcnR1YWwgYXJyYXkuCisgKiBVc2VkIGZvciBQU0VVRE9DT0xPUiBpbWFnZXMuCisgKi8KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfcHNldWRvY29sb3Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgSlNBTVBST1cgc3JjX3JvdywgZGVzdF9yb3c7CisgIEpESU1FTlNJT04gY29sOworICBybGVfbWFwICpjb2xvcm1hcDsKKyAgaW50IHZhbDsKKworICBjb2xvcm1hcCA9IHNvdXJjZS0+aGVhZGVyLmNtYXA7CisgIGRlc3Rfcm93ID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBzb3VyY2UtPnJvdy0tOworICBzcmNfcm93ID0gKiAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHNvdXJjZS0+cm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworCisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIHZhbCA9IEdFVEpTQU1QTEUoKnNyY19yb3crKyk7CisgICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCAgICAgIF0gPj4gOCk7CisgICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCArIDI1Nl0gPj4gOCk7CisgICAgKmRlc3Rfcm93KysgPSAoSlNBTVBMRSkgKGNvbG9ybWFwW3ZhbCArIDUxMl0gPj4gOCk7CisgIH0KKworICByZXR1cm4gMTsKK30KKworCisvKgorICogTG9hZCB0aGUgaW1hZ2UgaW50byBhIHZpcnR1YWwgYXJyYXkuICBXZSBoYXZlIHRvIGRvIHRoaXMgYmVjYXVzZSBSTEUKKyAqIGZpbGVzIHN0YXJ0IGF0IHRoZSBsb3dlciBsZWZ0IHdoaWxlIHRoZSBKUEVHIHN0YW5kYXJkIGhhcyB0aGVtIHN0YXJ0aW5nCisgKiBpbiB0aGUgdXBwZXIgbGVmdC4gIFRoaXMgaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHdlIHdhbnQgdG8gZ2V0IGEgcm93CisgKiBvZiBpbnB1dC4gIFdoYXQgd2UgZG8gaXMgbG9hZCB0aGUgUkxFIGRhdGEgaW50byB0aGUgYXJyYXkgYW5kIHRoZW4gY2FsbAorICogdGhlIGFwcHJvcHJpYXRlIHJvdXRpbmUgdG8gcmVhZCBvbmUgcm93IGZyb20gdGhlIGFycmF5LiAgQmVmb3JlIHJldHVybmluZywKKyAqIHdlIHNldCBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyBzbyB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgZ28gc3RyYWlnaHQgdG8KKyAqIHRoZSBhcHByb3ByaWF0ZSByb3ctcmVhZGluZyByb3V0aW5lLgorICovCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorbG9hZF9pbWFnZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHJsZV9zb3VyY2VfcHRyIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikgc2luZm87CisgIEpESU1FTlNJT04gcm93LCBjb2w7CisgIEpTQU1QUk9XICBzY2FubGluZSwgcmVkX3B0ciwgZ3JlZW5fcHRyLCBibHVlX3B0cjsKKyAgcmxlX3BpeGVsICoqcmxlX3JvdzsKKyAgcmxlX21hcCAqY29sb3JtYXA7CisgIGNoYXIgY2hhbm5lbDsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworI2VuZGlmCisKKyAgY29sb3JtYXAgPSBzb3VyY2UtPmhlYWRlci5jbWFwOworICBybGVfcm93ID0gc291cmNlLT5ybGVfcm93OworCisgIC8qIFJlYWQgdGhlIFJMRSBkYXRhIGludG8gb3VyIHZpcnR1YWwgYXJyYXkuCisgICAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgKGEpIHJsZV9waXhlbCBpcyByZXByZXNlbnRlZCB0aGUgc2FtZSBhcyBKU0FNUExFLAorICAgKiBhbmQgKGIpIHdlIGFyZSBub3Qgb24gYSBtYWNoaW5lIHdoZXJlIEZBUiBwb2ludGVycyBkaWZmZXIgZnJvbSByZWd1bGFyLgorICAgKi8KKyAgUkxFX0NMUl9CSVQoc291cmNlLT5oZWFkZXIsIFJMRV9BTFBIQSk7IC8qIGRvbid0IHJlYWQgdGhlIGFscGhhIGNoYW5uZWwgKi8KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAwOworICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisjZW5kaWYKKworICBzd2l0Y2ggKHNvdXJjZS0+dmlzdWFsKSB7CisKKyAgY2FzZSBHUkFZU0NBTEU6CisgIGNhc2UgUFNFVURPQ09MT1I6CisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgeworICAgICAgcmxlX3JvdyA9IChybGVfcGl4ZWwgKiopICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPmltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7CisgICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgTUFQUEVER1JBWToKKyAgY2FzZSBUUlVFQ09MT1I6CisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgeworICAgICAgc2NhbmxpbmUgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICAgICAgcmxlX3JvdyA9IHNvdXJjZS0+cmxlX3JvdzsKKyAgICAgIHJsZV9nZXRyb3coJnNvdXJjZS0+aGVhZGVyLCBybGVfcm93KTsKKworICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCsrKSB7CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBzb3VyY2UtPmhlYWRlci5uY29sb3JzOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAqc2NhbmxpbmUrKyA9IChKU0FNUExFKQorICAgICAgICAgICAgKGNvbG9ybWFwW0dFVEpTQU1QTEUocmxlX3Jvd1tjaGFubmVsXVtjb2xdKSArIDI1NiAqIGNoYW5uZWxdID4+IDgpOworICAgICAgICB9CisgICAgICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7CisgICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgRElSRUNUQ09MT1I6CisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0OyByb3crKykgeworICAgICAgc2NhbmxpbmUgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICAgICAgcmxlX2dldHJvdygmc291cmNlLT5oZWFkZXIsIHJsZV9yb3cpOworCisgICAgICByZWRfcHRyICAgPSBybGVfcm93WzBdOworICAgICAgZ3JlZW5fcHRyID0gcmxlX3Jvd1sxXTsKKyAgICAgIGJsdWVfcHRyICA9IHJsZV9yb3dbMl07CisKKyAgICAgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgICAqc2NhbmxpbmUrKyA9ICpyZWRfcHRyKys7CisgICAgICAgICpzY2FubGluZSsrID0gKmdyZWVuX3B0cisrOworICAgICAgICAqc2NhbmxpbmUrKyA9ICpibHVlX3B0cisrOworICAgICAgfQorCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgICAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlcisrOworICAgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKQorICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7CisjZW5kaWYKKworICAvKiBTZXQgdXAgdG8gY2FsbCBwcm9wZXIgcm93LWV4dHJhY3Rpb24gcm91dGluZSBpbiBmdXR1cmUgKi8KKyAgaWYgKHNvdXJjZS0+dmlzdWFsID09IFBTRVVET0NPTE9SKSB7CisgICAgc291cmNlLT5wdWIuYnVmZmVyID0gc291cmNlLT5ybGVfcm93OworICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3BzZXVkb2NvbG9yX3JvdzsKKyAgfSBlbHNlIHsKKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9ybGVfcm93OworICB9CisgIHNvdXJjZS0+cm93ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKworICAvKiBBbmQgZmV0Y2ggdGhlIHRvcG1vc3QgKGJvdHRvbW1vc3QpIHJvdyAqLworICByZXR1cm4gKCpzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7ICAgCit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX2lucHV0X3JsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUkxFIGZvcm1hdCBpbnB1dC4KKyAqLworCitHTE9CQUwoY2pwZWdfc291cmNlX3B0cikKK2ppbml0X3JlYWRfcmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcmxlX3NvdXJjZV9wdHIgc291cmNlOworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLworICBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVPRihybGVfc291cmNlX3N0cnVjdCkpOworICAvKiBGaWxsIGluIG1ldGhvZCBwdHJzICovCisgIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfcmxlOworICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfcmxlOworICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGxvYWRfaW1hZ2U7CisKKyAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Cit9CisKKyNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9yZHN3aXRjaC5jIGIvcmRzd2l0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjRiYjRmCi0tLSAvZGV2L251bGwKKysrIGIvcmRzd2l0Y2guYwpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIHJkc3dpdGNoLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byBwcm9jZXNzIHNvbWUgb2YgY2pwZWcncyBtb3JlIGNvbXBsaWNhdGVkCisgKiBjb21tYW5kLWxpbmUgc3dpdGNoZXMuICBTd2l0Y2hlcyBwcm9jZXNzZWQgaGVyZSBhcmU6CisgKgktcXRhYmxlcyBmaWxlCQlSZWFkIHF1YW50aXphdGlvbiB0YWJsZXMgZnJvbSB0ZXh0IGZpbGUKKyAqCS1zY2FucyBmaWxlCQlSZWFkIHNjYW4gc2NyaXB0IGZyb20gdGV4dCBmaWxlCisgKgktcXNsb3RzIE5bLE4sLi4uXQlTZXQgY29tcG9uZW50IHF1YW50aXphdGlvbiB0YWJsZSBzZWxlY3RvcnMKKyAqCS1zYW1wbGUgSHhWWyxIeFYsLi4uXQlTZXQgY29tcG9uZW50IHNhbXBsaW5nIGZhY3RvcnMKKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzZGlnaXQoKSwgaXNzcGFjZSgpICovCisKKworTE9DQUwoaW50KQordGV4dF9nZXRjIChGSUxFICogZmlsZSkKKy8qIFJlYWQgbmV4dCBjaGFyLCBza2lwcGluZyBvdmVyIGFueSBjb21tZW50cyAoIyB0byBlbmQgb2YgbGluZSkgKi8KKy8qIEEgY29tbWVudC9uZXdsaW5lIHNlcXVlbmNlIGlzIHJldHVybmVkIGFzIGEgbmV3bGluZSAqLworeworICByZWdpc3RlciBpbnQgY2g7CisgIAorICBjaCA9IGdldGMoZmlsZSk7CisgIGlmIChjaCA9PSAnIycpIHsKKyAgICBkbyB7CisgICAgICBjaCA9IGdldGMoZmlsZSk7CisgICAgfSB3aGlsZSAoY2ggIT0gJ1xuJyAmJiBjaCAhPSBFT0YpOworICB9CisgIHJldHVybiBjaDsKK30KKworCitMT0NBTChib29sZWFuKQorcmVhZF90ZXh0X2ludGVnZXIgKEZJTEUgKiBmaWxlLCBsb25nICogcmVzdWx0LCBpbnQgKiB0ZXJtY2hhcikKKy8qIFJlYWQgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyIGZyb20gYSBmaWxlLCBzdG9yZSBpdCBpbiByZXN1bHQgKi8KKy8qIFJlYWRzIG9uZSB0cmFpbGluZyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGludGVnZXI7IHJldHVybnMgaXQgaW4gdGVybWNoYXIgKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNoOworICByZWdpc3RlciBsb25nIHZhbDsKKyAgCisgIC8qIFNraXAgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSwgZGV0ZWN0IEVPRiAqLworICBkbyB7CisgICAgY2ggPSB0ZXh0X2dldGMoZmlsZSk7CisgICAgaWYgKGNoID09IEVPRikgeworICAgICAgKnRlcm1jaGFyID0gY2g7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IHdoaWxlIChpc3NwYWNlKGNoKSk7CisgIAorICBpZiAoISBpc2RpZ2l0KGNoKSkgeworICAgICp0ZXJtY2hhciA9IGNoOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHZhbCA9IGNoIC0gJzAnOworICB3aGlsZSAoKGNoID0gdGV4dF9nZXRjKGZpbGUpKSAhPSBFT0YpIHsKKyAgICBpZiAoISBpc2RpZ2l0KGNoKSkKKyAgICAgIGJyZWFrOworICAgIHZhbCAqPSAxMDsKKyAgICB2YWwgKz0gY2ggLSAnMCc7CisgIH0KKyAgKnJlc3VsdCA9IHZhbDsKKyAgKnRlcm1jaGFyID0gY2g7CisgIHJldHVybiBUUlVFOworfQorCisKK0dMT0JBTChib29sZWFuKQorcmVhZF9xdWFudF90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICogZmlsZW5hbWUsCisJCSAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisvKiBSZWFkIGEgc2V0IG9mIHF1YW50aXphdGlvbiB0YWJsZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCisgKiBUaGUgZmlsZSBpcyBwbGFpbiBBU0NJSSB0ZXh0OiBkZWNpbWFsIG51bWJlcnMgd2l0aCB3aGl0ZXNwYWNlIGJldHdlZW4uCisgKiBDb21tZW50cyBwcmVjZWRlZCBieSAnIycgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBmaWxlLgorICogVGhlcmUgbWF5IGJlIG9uZSB0byBOVU1fUVVBTlRfVEJMUyB0YWJsZXMgaW4gdGhlIGZpbGUsIGVhY2ggb2YgNjQgdmFsdWVzLgorICogVGhlIHRhYmxlcyBhcmUgaW1wbGljaXRseSBudW1iZXJlZCAwLDEsZXRjLgorICogTk9URTogZG9lcyBub3QgYWZmZWN0IHRoZSBxc2xvdHMgbWFwcGluZywgd2hpY2ggd2lsbCBkZWZhdWx0IHRvIHNlbGVjdGluZworICogdGFibGUgMCBmb3IgbHVtaW5hbmNlIChvciBwcmltYXJ5KSBjb21wb25lbnRzLCAxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLgorICogWW91IG11c3QgdXNlIC1xc2xvdHMgaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgY29tcG9uZW50LT50YWJsZSBtYXBwaW5nLgorICovCit7CisgIEZJTEUgKiBmcDsKKyAgaW50IHRibG5vLCBpLCB0ZXJtY2hhcjsKKyAgbG9uZyB2YWw7CisgIHVuc2lnbmVkIGludCB0YWJsZVtEQ1RTSVpFMl07CisKKyAgaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuIHRhYmxlIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdGJsbm8gPSAwOworCisgIHdoaWxlIChyZWFkX3RleHRfaW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkgeyAvKiByZWFkIDFzdCBlbGVtZW50IG9mIHRhYmxlICovCisgICAgaWYgKHRibG5vID49IE5VTV9RVUFOVF9UQkxTKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IHRhYmxlcyBpbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICBmY2xvc2UoZnApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB0YWJsZVswXSA9ICh1bnNpZ25lZCBpbnQpIHZhbDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgICAgaWYgKCEgcmVhZF90ZXh0X2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgdGFibGUgZGF0YSBpbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICB0YWJsZVtpXSA9ICh1bnNpZ25lZCBpbnQpIHZhbDsKKyAgICB9CisgICAganBlZ19hZGRfcXVhbnRfdGFibGUoY2luZm8sIHRibG5vLCB0YWJsZSwgc2NhbGVfZmFjdG9yLCBmb3JjZV9iYXNlbGluZSk7CisgICAgdGJsbm8rKzsKKyAgfQorCisgIGlmICh0ZXJtY2hhciAhPSBFT0YpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vbi1udW1lcmljIGRhdGEgaW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZmNsb3NlKGZwKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorCitMT0NBTChib29sZWFuKQorcmVhZF9zY2FuX2ludGVnZXIgKEZJTEUgKiBmaWxlLCBsb25nICogcmVzdWx0LCBpbnQgKiB0ZXJtY2hhcikKKy8qIFZhcmlhbnQgb2YgcmVhZF90ZXh0X2ludGVnZXIgdGhhdCBhbHdheXMgbG9va3MgZm9yIGEgbm9uLXNwYWNlIHRlcm1jaGFyOworICogdGhpcyBzaW1wbGlmaWVzIHBhcnNpbmcgb2YgcHVuY3R1YXRpb24gaW4gc2NhbiBzY3JpcHRzLgorICovCit7CisgIHJlZ2lzdGVyIGludCBjaDsKKworICBpZiAoISByZWFkX3RleHRfaW50ZWdlcihmaWxlLCByZXN1bHQsIHRlcm1jaGFyKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGNoID0gKnRlcm1jaGFyOworICB3aGlsZSAoY2ggIT0gRU9GICYmIGlzc3BhY2UoY2gpKQorICAgIGNoID0gdGV4dF9nZXRjKGZpbGUpOworICBpZiAoaXNkaWdpdChjaCkpIHsJCS8qIG9vcHMsIHB1dCBpdCBiYWNrICovCisgICAgaWYgKHVuZ2V0YyhjaCwgZmlsZSkgPT0gRU9GKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGNoID0gJyAnOworICB9IGVsc2UgeworICAgIC8qIEFueSBzZXBhcmF0b3JzIG90aGVyIHRoYW4gJzsnIGFuZCAnOicgYXJlIGlnbm9yZWQ7CisgICAgICogdGhpcyBhbGxvd3MgdXNlciB0byBpbnNlcnQgY29tbWFzLCBldGMsIGlmIGRlc2lyZWQuCisgICAgICovCisgICAgaWYgKGNoICE9IEVPRiAmJiBjaCAhPSAnOycgJiYgY2ggIT0gJzonKQorICAgICAgY2ggPSAnICc7CisgIH0KKyAgKnRlcm1jaGFyID0gY2g7CisgIHJldHVybiBUUlVFOworfQorCisKK0dMT0JBTChib29sZWFuKQorcmVhZF9zY2FuX3NjcmlwdCAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSkKKy8qIFJlYWQgYSBzY2FuIHNjcmlwdCBmcm9tIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgorICogRWFjaCBlbnRyeSBpbiB0aGUgZmlsZSBkZWZpbmVzIG9uZSBzY2FuIHRvIGJlIGVtaXR0ZWQuCisgKiBFbnRyaWVzIGFyZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAnOycuCisgKiBBbiBlbnRyeSBjb250YWlucyBvbmUgdG8gZm91ciBjb21wb25lbnQgaW5kZXhlcywKKyAqIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiAnOicgYW5kIGZvdXIgcHJvZ3Jlc3NpdmUtSlBFRyBwYXJhbWV0ZXJzLgorICogVGhlIGNvbXBvbmVudCBpbmRleGVzIGRlbm90ZSB3aGljaCBjb21wb25lbnQocykgYXJlIHRvIGJlIHRyYW5zbWl0dGVkCisgKiBpbiB0aGUgY3VycmVudCBzY2FuLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBoYXMgaW5kZXggMC4KKyAqIFNlcXVlbnRpYWwgSlBFRyBpcyB1c2VkIGlmIHRoZSBwcm9ncmVzc2l2ZS1KUEVHIHBhcmFtZXRlcnMgYXJlIG9taXR0ZWQuCisgKiBUaGUgZmlsZSBpcyBmcmVlIGZvcm1hdCB0ZXh0OiBhbnkgd2hpdGVzcGFjZSBtYXkgYXBwZWFyIGJldHdlZW4gbnVtYmVycworICogYW5kIHRoZSAnOicgYW5kICc7JyBwdW5jdHVhdGlvbiBtYXJrcy4gIEFsc28sIG90aGVyIHB1bmN0dWF0aW9uIChzdWNoCisgKiBhcyBjb21tYXMgb3IgZGFzaGVzKSBjYW4gYmUgcGxhY2VkIGJldHdlZW4gbnVtYmVycyBpZiBkZXNpcmVkLgorICogQ29tbWVudHMgcHJlY2VkZWQgYnkgJyMnIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsZS4KKyAqIE5vdGU6IHdlIGRvIHZlcnkgbGl0dGxlIHZhbGlkaXR5IGNoZWNraW5nIGhlcmU7CisgKiBqY21hc3Rlci5jIHdpbGwgdmFsaWRhdGUgdGhlIHNjcmlwdCBwYXJhbWV0ZXJzLgorICovCit7CisgIEZJTEUgKiBmcDsKKyAgaW50IHNjYW5ubywgbmNvbXBzLCB0ZXJtY2hhcjsKKyAgbG9uZyB2YWw7CisgIGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKyNkZWZpbmUgTUFYX1NDQU5TICAxMDAJCS8qIHF1aXRlIGFyYml0cmFyeSBsaW1pdCAqLworICBqcGVnX3NjYW5faW5mbyBzY2Fuc1tNQVhfU0NBTlNdOworCisgIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiBzY2FuIGRlZmluaXRpb24gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzY2FucHRyID0gc2NhbnM7CisgIHNjYW5ubyA9IDA7CisKKyAgd2hpbGUgKHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKSB7CisgICAgaWYgKHNjYW5ubyA+PSBNQVhfU0NBTlMpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgc2NhbnMgZGVmaW5lZCBpbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICBmY2xvc2UoZnApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbMF0gPSAoaW50KSB2YWw7CisgICAgbmNvbXBzID0gMTsKKyAgICB3aGlsZSAodGVybWNoYXIgPT0gJyAnKSB7CisgICAgICBpZiAobmNvbXBzID49IE1BWF9DT01QU19JTl9TQ0FOKSB7CisJZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBjb21wb25lbnRzIGluIG9uZSBzY2FuIGluIGZpbGUgJXNcbiIsCisJCWZpbGVuYW1lKTsKKwlmY2xvc2UoZnApOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKQorCWdvdG8gYm9ndXM7CisgICAgICBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbbmNvbXBzXSA9IChpbnQpIHZhbDsKKyAgICAgIG5jb21wcysrOworICAgIH0KKyAgICBzY2FucHRyLT5jb21wc19pbl9zY2FuID0gbmNvbXBzOworICAgIGlmICh0ZXJtY2hhciA9PSAnOicpIHsKKyAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpIHx8IHRlcm1jaGFyICE9ICcgJykKKwlnb3RvIGJvZ3VzOworICAgICAgc2NhbnB0ci0+U3MgPSAoaW50KSB2YWw7CisgICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSB8fCB0ZXJtY2hhciAhPSAnICcpCisJZ290byBib2d1czsKKyAgICAgIHNjYW5wdHItPlNlID0gKGludCkgdmFsOworICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikgfHwgdGVybWNoYXIgIT0gJyAnKQorCWdvdG8gYm9ndXM7CisgICAgICBzY2FucHRyLT5BaCA9IChpbnQpIHZhbDsKKyAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKQorCWdvdG8gYm9ndXM7CisgICAgICBzY2FucHRyLT5BbCA9IChpbnQpIHZhbDsKKyAgICB9IGVsc2UgeworICAgICAgLyogc2V0IG5vbi1wcm9ncmVzc2l2ZSBwYXJhbWV0ZXJzICovCisgICAgICBzY2FucHRyLT5TcyA9IDA7CisgICAgICBzY2FucHRyLT5TZSA9IERDVFNJWkUyLTE7CisgICAgICBzY2FucHRyLT5BaCA9IDA7CisgICAgICBzY2FucHRyLT5BbCA9IDA7CisgICAgfQorICAgIGlmICh0ZXJtY2hhciAhPSAnOycgJiYgdGVybWNoYXIgIT0gRU9GKSB7Citib2d1czoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBzY2FuIGVudHJ5IGZvcm1hdCBpbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICBmY2xvc2UoZnApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBzY2FucHRyKyssIHNjYW5ubysrOworICB9CisKKyAgaWYgKHRlcm1jaGFyICE9IEVPRikgeworICAgIGZwcmludGYoc3RkZXJyLCAiTm9uLW51bWVyaWMgZGF0YSBpbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoc2Nhbm5vID4gMCkgeworICAgIC8qIFN0YXNoIGNvbXBsZXRlZCBzY2FuIGxpc3QgaW4gY2luZm8gc3RydWN0dXJlLgorICAgICAqIE5PVEU6IGZvciBjanBlZydzIHVzZSwgSlBPT0xfSU1BR0UgaXMgdGhlIHJpZ2h0IGxpZmV0aW1lIGZvciB0aGlzIGRhdGEsCisgICAgICogYnV0IGlmIHlvdSB3YW50IHRvIGNvbXByZXNzIG11bHRpcGxlIGltYWdlcyB5b3UnZCB3YW50IEpQT09MX1BFUk1BTkVOVC4KKyAgICAgKi8KKyAgICBzY2FucHRyID0gKGpwZWdfc2Nhbl9pbmZvICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgc2Nhbm5vICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7CisgICAgTUVNQ09QWShzY2FucHRyLCBzY2Fucywgc2Nhbm5vICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7CisgICAgY2luZm8tPnNjYW5faW5mbyA9IHNjYW5wdHI7CisgICAgY2luZm8tPm51bV9zY2FucyA9IHNjYW5ubzsKKyAgfQorCisgIGZjbG9zZShmcCk7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisKKworR0xPQkFMKGJvb2xlYW4pCitzZXRfcXVhbnRfc2xvdHMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpCisvKiBQcm9jZXNzIGEgcXVhbnRpemF0aW9uLXRhYmxlLXNlbGVjdG9ycyBwYXJhbWV0ZXIgc3RyaW5nLCBvZiB0aGUgZm9ybQorICogICAgIE5bLE4sLi4uXQorICogSWYgdGhlcmUgYXJlIG1vcmUgY29tcG9uZW50cyB0aGFuIHBhcmFtZXRlcnMsIHRoZSBsYXN0IHZhbHVlIGlzIHJlcGxpY2F0ZWQuCisgKi8KK3sKKyAgaW50IHZhbCA9IDA7CQkJLyogZGVmYXVsdCB0YWJsZSAjICovCisgIGludCBjaTsKKyAgY2hhciBjaDsKKworICBmb3IgKGNpID0gMDsgY2kgPCBNQVhfQ09NUE9ORU5UUzsgY2krKykgeworICAgIGlmICgqYXJnKSB7CisgICAgICBjaCA9ICcsJzsJCQkvKiBpZiBub3Qgc2V0IGJ5IHNzY2FuZiwgd2lsbCBiZSAnLCcgKi8KKyAgICAgIGlmIChzc2NhbmYoYXJnLCAiJWQlYyIsICZ2YWwsICZjaCkgPCAxKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGlmIChjaCAhPSAnLCcpCQkvKiBzeW50YXggY2hlY2sgKi8KKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPj0gTlVNX1FVQU5UX1RCTFMpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkpQRUcgcXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uJWRcbiIsCisJCU5VTV9RVUFOVF9UQkxTLTEpOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLnF1YW50X3RibF9ubyA9IHZhbDsKKyAgICAgIHdoaWxlICgqYXJnICYmICphcmcrKyAhPSAnLCcpIC8qIGFkdmFuY2UgdG8gbmV4dCBzZWdtZW50IG9mIGFyZyBzdHJpbmcgKi8KKwk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJlYWNoZWQgZW5kIG9mIHBhcmFtZXRlciwgc2V0IHJlbWFpbmluZyBjb21wb25lbnRzIHRvIGxhc3QgdGFibGUgKi8KKyAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLnF1YW50X3RibF9ubyA9IHZhbDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworR0xPQkFMKGJvb2xlYW4pCitzZXRfc2FtcGxlX2ZhY3RvcnMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpCisvKiBQcm9jZXNzIGEgc2FtcGxlLWZhY3RvcnMgcGFyYW1ldGVyIHN0cmluZywgb2YgdGhlIGZvcm0KKyAqICAgICBIeFZbLEh4ViwuLi5dCisgKiBJZiB0aGVyZSBhcmUgbW9yZSBjb21wb25lbnRzIHRoYW4gcGFyYW1ldGVycywgIjF4MSIgaXMgYXNzdW1lZCBmb3IgdGhlIHJlc3QuCisgKi8KK3sKKyAgaW50IGNpLCB2YWwxLCB2YWwyOworICBjaGFyIGNoMSwgY2gyOworCisgIGZvciAoY2kgPSAwOyBjaSA8IE1BWF9DT01QT05FTlRTOyBjaSsrKSB7CisgICAgaWYgKCphcmcpIHsKKyAgICAgIGNoMiA9ICcsJzsJCS8qIGlmIG5vdCBzZXQgYnkgc3NjYW5mLCB3aWxsIGJlICcsJyAqLworICAgICAgaWYgKHNzY2FuZihhcmcsICIlZCVjJWQlYyIsICZ2YWwxLCAmY2gxLCAmdmFsMiwgJmNoMikgPCAzKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGlmICgoY2gxICE9ICd4JyAmJiBjaDEgIT0gJ1gnKSB8fCBjaDIgIT0gJywnKSAvKiBzeW50YXggY2hlY2sgKi8KKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAodmFsMSA8PSAwIHx8IHZhbDEgPiA0IHx8IHZhbDIgPD0gMCB8fCB2YWwyID4gNCkgeworCWZwcmludGYoc3RkZXJyLCAiSlBFRyBzYW1wbGluZyBmYWN0b3JzIG11c3QgYmUgMS4uNFxuIik7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0uaF9zYW1wX2ZhY3RvciA9IHZhbDE7CisgICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS52X3NhbXBfZmFjdG9yID0gdmFsMjsKKyAgICAgIHdoaWxlICgqYXJnICYmICphcmcrKyAhPSAnLCcpIC8qIGFkdmFuY2UgdG8gbmV4dCBzZWdtZW50IG9mIGFyZyBzdHJpbmcgKi8KKwk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJlYWNoZWQgZW5kIG9mIHBhcmFtZXRlciwgc2V0IHJlbWFpbmluZyBjb21wb25lbnRzIHRvIDF4MSBzYW1wbGluZyAqLworICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS52X3NhbXBfZmFjdG9yID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9yZHRhcmdhLmMgYi9yZHRhcmdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyY2QyNgotLS0gL2Rldi9udWxsCisrKyBiL3JkdGFyZ2EuYwpAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqIHJkdGFyZ2EuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFRhcmdhIGZvcm1hdC4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgaW5wdXQgZnJvbQorICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLiAgVGhleSBmdXJ0aGVyIGFzc3VtZSB0aGF0IHJlYWRpbmcgYmVnaW5zCisgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGU7IHN0YXJ0X2lucHV0IG1heSBuZWVkIHdvcmsgaWYgdGhlCisgKiB1c2VyIGludGVyZmFjZSBoYXMgYWxyZWFkeSByZWFkIHNvbWUgZGF0YSAoZS5nLiwgdG8gZGV0ZXJtaW5lIHRoYXQKKyAqIHRoZSBmaWxlIGlzIGluZGVlZCBUYXJnYSBmb3JtYXQpLgorICoKKyAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTGVlIERhbmllbCBDcm9ja2VyLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKKworCisvKiBNYWNyb3MgdG8gZGVhbCB3aXRoIHVuc2lnbmVkIGNoYXJzIGFzIGVmZmljaWVudGx5IGFzIGNvbXBpbGVyIGFsbG93cyAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKKyNlbHNlIC8qICFIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECit0eXBlZGVmIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSkKKyNlbHNlCit0eXBlZGVmIGNoYXIgVV9DSEFSOworI2RlZmluZSBVQ0goeCkJKChpbnQpICh4KSAmIDB4RkYpCisjZW5kaWYKKyNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KKworCisjZGVmaW5lCVJlYWRPSyhmaWxlLGJ1ZmZlcixsZW4pCShKRlJFQUQoZmlsZSxidWZmZXIsbGVuKSA9PSAoKHNpemVfdCkgKGxlbikpKQorCisKKy8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIHNvdXJjZSBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3RnYV9zb3VyY2Vfc3RydWN0ICogdGdhX3NvdXJjZV9wdHI7CisKK3R5cGVkZWYgc3RydWN0IF90Z2Ffc291cmNlX3N0cnVjdCB7CisgIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogYmFjayBsaW5rIHNhdmVzIHBhc3Npbmcgc2VwYXJhdGUgcGFybSAqLworCisgIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBUYXJnYSBjb2xvcm1hcCAoY29udmVydGVkIHRvIG15IGZvcm1hdCkgKi8KKworICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiBOZWVkZWQgaWYgZnVubnkgaW5wdXQgcm93IG9yZGVyICovCisgIEpESU1FTlNJT04gY3VycmVudF9yb3c7CS8qIEN1cnJlbnQgbG9naWNhbCByb3cgbnVtYmVyIHRvIHJlYWQgKi8KKworICAvKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZXh0cmFjdCBuZXh0IFRhcmdhIHBpeGVsIGZyb20gaW5wdXQgZmlsZSAqLworICBKTUVUSE9EKHZvaWQsIHJlYWRfcGl4ZWwsICh0Z2Ffc291cmNlX3B0ciBzaW5mbykpOworCisgIC8qIFJlc3VsdCBvZiByZWFkX3BpeGVsIGlzIGRlbGl2ZXJlZCBoZXJlOiAqLworICBVX0NIQVIgdGdhX3BpeGVsWzRdOworCisgIGludCBwaXhlbF9zaXplOwkJLyogQnl0ZXMgcGVyIFRhcmdhIHBpeGVsICgxIHRvIDQpICovCisKKyAgLyogU3RhdGUgaW5mbyBmb3IgcmVhZGluZyBSTEUtY29kZWQgcGl4ZWxzOyBib3RoIGNvdW50cyBtdXN0IGJlIGluaXQgdG8gMCAqLworICBpbnQgYmxvY2tfY291bnQ7CQkvKiAjIG9mIHBpeGVscyByZW1haW5pbmcgaW4gUkxFIGJsb2NrICovCisgIGludCBkdXBfcGl4ZWxfY291bnQ7CQkvKiAjIG9mIHRpbWVzIHRvIGR1cGxpY2F0ZSBwcmV2aW91cyBwaXhlbCAqLworCisgIC8qIFRoaXMgc2F2ZXMgdGhlIGNvcnJlY3QgcGl4ZWwtcm93LWV4cGFuc2lvbiBtZXRob2QgZm9yIHByZWxvYWRfaW1hZ2UgKi8KKyAgSk1FVEhPRChKRElNRU5TSU9OLCBnZXRfcGl4ZWxfcm93cywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7Cit9IHRnYV9zb3VyY2Vfc3RydWN0OworCisKKy8qIEZvciBleHBhbmRpbmcgNS1iaXQgcGl4ZWwgdmFsdWVzIHRvIDgtYml0IHdpdGggYmVzdCByb3VuZGluZyAqLworCitzdGF0aWMgY29uc3QgVUlOVDggYzV0bzhiaXRzWzMyXSA9IHsKKyAgICAwLCAgIDgsICAxNiwgIDI1LCAgMzMsICA0MSwgIDQ5LCAgNTgsCisgICA2NiwgIDc0LCAgODIsICA5MCwgIDk5LCAxMDcsIDExNSwgMTIzLAorICAxMzIsIDE0MCwgMTQ4LCAxNTYsIDE2NSwgMTczLCAxODEsIDE4OSwKKyAgMTk3LCAyMDYsIDIxNCwgMjIyLCAyMzAsIDIzOSwgMjQ3LCAyNTUKK307CisKKworCitMT0NBTChpbnQpCityZWFkX2J5dGUgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKQorLyogUmVhZCBuZXh0IGJ5dGUgZnJvbSBUYXJnYSBmaWxlICovCit7CisgIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKKyAgcmVnaXN0ZXIgaW50IGM7CisKKyAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCisgICAgRVJSRVhJVChzaW5mby0+Y2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgcmV0dXJuIGM7Cit9CisKKworTE9DQUwodm9pZCkKK3JlYWRfY29sb3JtYXAgKHRnYV9zb3VyY2VfcHRyIHNpbmZvLCBpbnQgY21hcGxlbiwgaW50IG1hcGVudHJ5c2l6ZSkKKy8qIFJlYWQgdGhlIGNvbG9ybWFwIGZyb20gYSBUYXJnYSBmaWxlICovCit7CisgIGludCBpOworCisgIC8qIFByZXNlbnRseSBvbmx5IGhhbmRsZXMgMjQtYml0IEJHUiBmb3JtYXQgKi8KKyAgaWYgKG1hcGVudHJ5c2l6ZSAhPSAyNCkKKyAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9UR0FfQkFEQ01BUCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNtYXBsZW47IGkrKykgeworICAgIHNpbmZvLT5jb2xvcm1hcFsyXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgIHNpbmZvLT5jb2xvcm1hcFsxXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgIHNpbmZvLT5jb2xvcm1hcFswXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICB9Cit9CisKKworLyoKKyAqIHJlYWRfcGl4ZWwgbWV0aG9kczogZ2V0IGEgc2luZ2xlIHBpeGVsIGZyb20gVGFyZ2EgZmlsZSBpbnRvIHRnYV9waXhlbFtdCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZWFkX25vbl9ybGVfcGl4ZWwgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKQorLyogUmVhZCBvbmUgVGFyZ2EgcGl4ZWwgZnJvbSB0aGUgaW5wdXQgZmlsZTsgbm8gUkxFIGV4cGFuc2lvbiAqLworeworICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7CisgIHJlZ2lzdGVyIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaW5mby0+cGl4ZWxfc2l6ZTsgaSsrKSB7CisgICAgc2luZm8tPnRnYV9waXhlbFtpXSA9IChVX0NIQVIpIGdldGMoaW5maWxlKTsKKyAgfQorfQorCisKK01FVEhPRERFRih2b2lkKQorcmVhZF9ybGVfcGl4ZWwgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKQorLyogUmVhZCBvbmUgVGFyZ2EgcGl4ZWwgZnJvbSB0aGUgaW5wdXQgZmlsZSwgZXhwYW5kaW5nIFJMRSBkYXRhIGFzIG5lZWRlZCAqLworeworICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7CisgIHJlZ2lzdGVyIGludCBpOworCisgIC8qIER1cGxpY2F0ZSBwcmV2aW91c2x5IHJlYWQgcGl4ZWw/ICovCisgIGlmIChzaW5mby0+ZHVwX3BpeGVsX2NvdW50ID4gMCkgeworICAgIHNpbmZvLT5kdXBfcGl4ZWxfY291bnQtLTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBUaW1lIHRvIHJlYWQgUkxFIGJsb2NrIGhlYWRlcj8gKi8KKyAgaWYgKC0tc2luZm8tPmJsb2NrX2NvdW50IDwgMCkgeyAvKiBkZWNyZW1lbnQgcGl4ZWxzIHJlbWFpbmluZyBpbiBibG9jayAqLworICAgIGkgPSByZWFkX2J5dGUoc2luZm8pOworICAgIGlmIChpICYgMHg4MCkgewkJLyogU3RhcnQgb2YgZHVwbGljYXRlLXBpeGVsIGJsb2NrPyAqLworICAgICAgc2luZm8tPmR1cF9waXhlbF9jb3VudCA9IGkgJiAweDdGOyAvKiBudW1iZXIgb2YgZHVwcyBhZnRlciB0aGlzIG9uZSAqLworICAgICAgc2luZm8tPmJsb2NrX2NvdW50ID0gMDsJLyogdGhlbiByZWFkIG5ldyBibG9jayBoZWFkZXIgKi8KKyAgICB9IGVsc2UgeworICAgICAgc2luZm8tPmJsb2NrX2NvdW50ID0gaSAmIDB4N0Y7IC8qIG51bWJlciBvZiBwaXhlbHMgYWZ0ZXIgdGhpcyBvbmUgKi8KKyAgICB9CisgIH0KKworICAvKiBSZWFkIG5leHQgcGl4ZWwgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNpbmZvLT5waXhlbF9zaXplOyBpKyspIHsKKyAgICBzaW5mby0+dGdhX3BpeGVsW2ldID0gKFVfQ0hBUikgZ2V0YyhpbmZpbGUpOworICB9Cit9CisKKworLyoKKyAqIFJlYWQgb25lIHJvdyBvZiBwaXhlbHMuCisgKgorICogV2UgcHJvdmlkZSBzZXZlcmFsIGRpZmZlcmVudCB2ZXJzaW9ucyBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZSBmb3JtYXQuCisgKi8KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF84Yml0X2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyA4LWJpdCBncmF5c2NhbGUgcGl4ZWxzICovCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIAorICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICgqc291cmNlLT5yZWFkX3BpeGVsKSAoc291cmNlKTsgLyogTG9hZCBuZXh0IHBpeGVsIGludG8gdGdhX3BpeGVsICovCisgICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFswXSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0XzhiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyA4LWJpdCBjb2xvcm1hcCBpbmRleGVzICovCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIGludCB0OworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICByZWdpc3RlciBKU0FNUEFSUkFZIGNvbG9ybWFwID0gc291cmNlLT5jb2xvcm1hcDsKKworICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICgqc291cmNlLT5yZWFkX3BpeGVsKSAoc291cmNlKTsgLyogTG9hZCBuZXh0IHBpeGVsIGludG8gdGdhX3BpeGVsICovCisgICAgdCA9IFVDSChzb3VyY2UtPnRnYV9waXhlbFswXSk7CisgICAgKnB0cisrID0gY29sb3JtYXBbMF1bdF07CisgICAgKnB0cisrID0gY29sb3JtYXBbMV1bdF07CisgICAgKnB0cisrID0gY29sb3JtYXBbMl1bdF07CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0XzE2Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgMTYtYml0IHBpeGVscyAqLworeworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBpbnQgdDsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgCisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KKyAgICB0ID0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKKyAgICB0ICs9IFVDSChzb3VyY2UtPnRnYV9waXhlbFsxXSkgPDwgODsKKyAgICAvKiBXZSBleHBhbmQgNSBiaXQgZGF0YSB0byA4IGJpdCBzYW1wbGUgd2lkdGguCisgICAgICogVGhlIGZvcm1hdCBvZiB0aGUgMTYtYml0IChMU0IgZmlyc3QpIGlucHV0IHdvcmQgaXMKKyAgICAgKiAgICAgeFJSUlJSR0dHR0dCQkJCQgorICAgICAqLworICAgIHB0clsyXSA9IChKU0FNUExFKSBjNXRvOGJpdHNbdCAmIDB4MUZdOworICAgIHQgPj49IDU7CisgICAgcHRyWzFdID0gKEpTQU1QTEUpIGM1dG84Yml0c1t0ICYgMHgxRl07CisgICAgdCA+Pj0gNTsKKyAgICBwdHJbMF0gPSAoSlNBTVBMRSkgYzV0bzhiaXRzW3QgJiAweDFGXTsKKyAgICBwdHIgKz0gMzsKKyAgfQorICByZXR1cm4gMTsKK30KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfMjRiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyAyNC1iaXQgcGl4ZWxzICovCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIAorICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICgqc291cmNlLT5yZWFkX3BpeGVsKSAoc291cmNlKTsgLyogTG9hZCBuZXh0IHBpeGVsIGludG8gdGdhX3BpeGVsICovCisgICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFsyXSk7IC8qIGNoYW5nZSBCR1IgdG8gUkdCIG9yZGVyICovCisgICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFsxXSk7CisgICAgKnB0cisrID0gKEpTQU1QTEUpIFVDSChzb3VyY2UtPnRnYV9waXhlbFswXSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUYXJnYSBhbHNvIGRlZmluZXMgYSAzMi1iaXQgcGl4ZWwgZm9ybWF0IHdpdGggb3JkZXIgQixHLFIsQS4KKyAqIFdlIHByZXNlbnRseSBpZ25vcmUgdGhlIGF0dHJpYnV0ZSBieXRlLCBzbyB0aGUgY29kZSBmb3IgcmVhZGluZworICogdGhlc2UgcGl4ZWxzIGlzIGlkZW50aWNhbCB0byB0aGUgMjQtYml0IHJvdXRpbmUgYWJvdmUuCisgKiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGFjdHVhbCBwaXhlbCBsZW5ndGggaXMgb25seSBrbm93biB0byByZWFkX3BpeGVsLgorICovCisKKyNkZWZpbmUgZ2V0XzMyYml0X3JvdyAgZ2V0XzI0Yml0X3JvdworCisKKy8qCisgKiBUaGlzIG1ldGhvZCBpcyBmb3IgcmUtcmVhZGluZyB0aGUgaW5wdXQgZGF0YSBpbiBzdGFuZGFyZCB0b3AtZG93bgorICogcm93IG9yZGVyLiAgVGhlIGVudGlyZSBpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgaW50byB3aG9sZV9pbWFnZQorICogd2l0aCBwcm9wZXIgY29udmVyc2lvbiBvZiBwaXhlbCBmb3JtYXQsIGJ1dCBpdCdzIGluIGEgZnVubnkgcm93IG9yZGVyLgorICovCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X21lbW9yeV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOworICBKRElNRU5TSU9OIHNvdXJjZV9yb3c7CisKKyAgLyogQ29tcHV0ZSByb3cgb2Ygc291cmNlIHRoYXQgbWFwcyB0byBjdXJyZW50X3JvdyBvZiBub3JtYWwgb3JkZXIgKi8KKyAgLyogRm9yIG5vdywgYXNzdW1lIGltYWdlIGlzIGJvdHRvbS11cCBhbmQgbm90IGludGVybGFjZWQuICovCisgIC8qIE5FRURTIFdPUksgdG8gc3VwcG9ydCBpbnRlcmxhY2VkIGltYWdlcyEgKi8KKyAgc291cmNlX3JvdyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgLSBzb3VyY2UtPmN1cnJlbnRfcm93IC0gMTsKKworICAvKiBGZXRjaCB0aGF0IHJvdyBmcm9tIHZpcnR1YWwgYXJyYXkgKi8KKyAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAorICAgICBzb3VyY2Vfcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworCisgIHNvdXJjZS0+Y3VycmVudF9yb3crKzsKKyAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFRoaXMgbWV0aG9kIGxvYWRzIHRoZSBpbWFnZSBpbnRvIHdob2xlX2ltYWdlIGR1cmluZyB0aGUgZmlyc3QgY2FsbCBvbgorICogZ2V0X3BpeGVsX3Jvd3MuICBUaGUgZ2V0X3BpeGVsX3Jvd3MgcG9pbnRlciBpcyB0aGVuIGFkanVzdGVkIHRvIGNhbGwKKyAqIGdldF9tZW1vcnlfcm93IG9uIHN1YnNlcXVlbnQgY2FsbHMuCisgKi8KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitwcmVsb2FkX2ltYWdlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgSkRJTUVOU0lPTiByb3c7CisgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKworICAvKiBSZWFkIHRoZSBkYXRhIGludG8gYSB2aXJ0dWFsIGFycmF5IGluIGlucHV0LWZpbGUgcm93IG9yZGVyLiAqLworICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7CisgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gKGxvbmcpIHJvdzsKKyAgICAgIHByb2dyZXNzLT5wdWIucGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgfQorICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLCByb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgICAoKnNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MpIChjaW5mbywgc2luZm8pOworICB9CisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKQorICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7CisKKyAgLyogU2V0IHVwIHRvIHJlYWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheSBpbiB1bnNjcmFtYmxlZCBvcmRlciAqLworICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9tZW1vcnlfcm93OworICBzb3VyY2UtPmN1cnJlbnRfcm93ID0gMDsKKyAgLyogQW5kIHJlYWQgdGhlIGZpcnN0IHJvdyAqLworICByZXR1cm4gZ2V0X21lbW9yeV9yb3coY2luZm8sIHNpbmZvKTsKK30KKworCisvKgorICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF90Z2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOworICBVX0NIQVIgdGFyZ2FoZWFkZXJbMThdOworICBpbnQgaWRsZW4sIGNtYXB0eXBlLCBzdWJ0eXBlLCBmbGFncywgaW50ZXJsYWNlX3R5cGUsIGNvbXBvbmVudHM7CisgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0LCBtYXBsZW47CisgIGJvb2xlYW4gaXNfYm90dG9tX3VwOworCisjZGVmaW5lIEdFVF8yQihvZmZzZXQpCSgodW5zaWduZWQgaW50KSBVQ0godGFyZ2FoZWFkZXJbb2Zmc2V0XSkgKyBcCisJCQkgKCgodW5zaWduZWQgaW50KSBVQ0godGFyZ2FoZWFkZXJbb2Zmc2V0KzFdKSkgPDwgOCkpCisKKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHRhcmdhaGVhZGVyLCAxOCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworCisgIC8qIFByZXRlbmQgIjE1LWJpdCIgcGl4ZWxzIGFyZSAxNi1iaXQgLS0tIHdlIGlnbm9yZSBhdHRyaWJ1dGUgYml0IGFueXdheSAqLworICBpZiAodGFyZ2FoZWFkZXJbMTZdID09IDE1KQorICAgIHRhcmdhaGVhZGVyWzE2XSA9IDE2OworCisgIGlkbGVuID0gVUNIKHRhcmdhaGVhZGVyWzBdKTsKKyAgY21hcHR5cGUgPSBVQ0godGFyZ2FoZWFkZXJbMV0pOworICBzdWJ0eXBlID0gVUNIKHRhcmdhaGVhZGVyWzJdKTsKKyAgbWFwbGVuID0gR0VUXzJCKDUpOworICB3aWR0aCA9IEdFVF8yQigxMik7CisgIGhlaWdodCA9IEdFVF8yQigxNCk7CisgIHNvdXJjZS0+cGl4ZWxfc2l6ZSA9IFVDSCh0YXJnYWhlYWRlclsxNl0pID4+IDM7CisgIGZsYWdzID0gVUNIKHRhcmdhaGVhZGVyWzE3XSk7CS8qIEltYWdlIERlc2NyaXB0b3IgYnl0ZSAqLworCisgIGlzX2JvdHRvbV91cCA9ICgoZmxhZ3MgJiAweDIwKSA9PSAwKTsJLyogYml0IDUgc2V0ID0+IHRvcC1kb3duICovCisgIGludGVybGFjZV90eXBlID0gZmxhZ3MgPj4gNjsJLyogYml0cyA2LzcgYXJlIGludGVybGFjZSBjb2RlICovCisKKyAgaWYgKGNtYXB0eXBlID4gMSB8fAkJLyogY21hcHR5cGUgbXVzdCBiZSAwIG9yIDEgKi8KKyAgICAgIHNvdXJjZS0+cGl4ZWxfc2l6ZSA8IDEgfHwgc291cmNlLT5waXhlbF9zaXplID4gNCB8fAorICAgICAgKFVDSCh0YXJnYWhlYWRlclsxNl0pICYgNykgIT0gMCB8fCAvKiBiaXRzL3BpeGVsIG11c3QgYmUgbXVsdGlwbGUgb2YgOCAqLworICAgICAgaW50ZXJsYWNlX3R5cGUgIT0gMCkJLyogY3VycmVudGx5IGRvbid0IGFsbG93IGludGVybGFjZWQgaW1hZ2UgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7CisgIAorICBpZiAoc3VidHlwZSA+IDgpIHsKKyAgICAvKiBJdCdzIGFuIFJMRS1jb2RlZCBmaWxlICovCisgICAgc291cmNlLT5yZWFkX3BpeGVsID0gcmVhZF9ybGVfcGl4ZWw7CisgICAgc291cmNlLT5ibG9ja19jb3VudCA9IHNvdXJjZS0+ZHVwX3BpeGVsX2NvdW50ID0gMDsKKyAgICBzdWJ0eXBlIC09IDg7CisgIH0gZWxzZSB7CisgICAgLyogTm9uLVJMRSBmaWxlICovCisgICAgc291cmNlLT5yZWFkX3BpeGVsID0gcmVhZF9ub25fcmxlX3BpeGVsOworICB9CisKKyAgLyogTm93IHNob3VsZCBoYXZlIHN1YnR5cGUgMSwgMiwgb3IgMyAqLworICBjb21wb25lbnRzID0gMzsJCS8qIHVudGlsIHByb3ZlbiBkaWZmZXJlbnQgKi8KKyAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKworICBzd2l0Y2ggKHN1YnR5cGUpIHsKKyAgY2FzZSAxOgkJCS8qIENvbG9ybWFwcGVkIGltYWdlICovCisgICAgaWYgKHNvdXJjZS0+cGl4ZWxfc2l6ZSA9PSAxICYmIGNtYXB0eXBlID09IDEpCisgICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzhiaXRfcm93OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19UR0FfTUFQUEVELCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBicmVhazsKKyAgY2FzZSAyOgkJCS8qIFJHQiBpbWFnZSAqLworICAgIHN3aXRjaCAoc291cmNlLT5waXhlbF9zaXplKSB7CisgICAgY2FzZSAyOgorICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF8xNmJpdF9yb3c7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzI0Yml0X3JvdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfMzJiaXRfcm93OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19UR0EsIHdpZHRoLCBoZWlnaHQpOworICAgIGJyZWFrOworICBjYXNlIDM6CQkJLyogR3JheXNjYWxlIGltYWdlICovCisgICAgY29tcG9uZW50cyA9IDE7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBpZiAoc291cmNlLT5waXhlbF9zaXplID09IDEpCisgICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzhiaXRfZ3JheV9yb3c7CisgICAgZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQV9HUkFZLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoaXNfYm90dG9tX3VwKSB7CisgICAgLyogQ3JlYXRlIGEgdmlydHVhbCBhcnJheSB0byBidWZmZXIgdGhlIHVwc2lkZS1kb3duIGltYWdlLiAqLworICAgIHNvdXJjZS0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKyAgICAgICAoSkRJTUVOU0lPTikgd2lkdGggKiBjb21wb25lbnRzLCAoSkRJTUVOU0lPTikgaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisgICAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7IC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLworICAgIH0KKyAgICAvKiBzb3VyY2UtPnB1Yi5idWZmZXIgd2lsbCBwb2ludCB0byB0aGUgdmlydHVhbCBhcnJheS4gKi8KKyAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsgLyogaW4gY2FzZSBhbnlvbmUgbG9va3MgYXQgaXQgKi8KKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IHByZWxvYWRfaW1hZ2U7CisgIH0gZWxzZSB7CisgICAgLyogRG9uJ3QgbmVlZCBhIHZpcnR1YWwgYXJyYXksIGJ1dCBkbyBuZWVkIGEgb25lLXJvdyBpbnB1dCBidWZmZXIuICovCisgICAgc291cmNlLT53aG9sZV9pbWFnZSA9IE5VTEw7CisgICAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCAqIGNvbXBvbmVudHMsIChKRElNRU5TSU9OKSAxKTsKKyAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3M7CisgIH0KKyAgCisgIHdoaWxlIChpZGxlbi0tKQkJLyogVGhyb3cgYXdheSBJRCBmaWVsZCAqLworICAgICh2b2lkKSByZWFkX2J5dGUoc291cmNlKTsKKworICBpZiAobWFwbGVuID4gMCkgeworICAgIGlmIChtYXBsZW4gPiAyNTYgfHwgR0VUXzJCKDMpICE9IDApCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURDTUFQKTsKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB0aGUgY29sb3JtYXAgKi8KKyAgICBzb3VyY2UtPmNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCAoSkRJTUVOU0lPTikgbWFwbGVuLCAoSkRJTUVOU0lPTikgMyk7CisgICAgLyogYW5kIHJlYWQgaXQgZnJvbSB0aGUgZmlsZSAqLworICAgIHJlYWRfY29sb3JtYXAoc291cmNlLCAoaW50KSBtYXBsZW4sIFVDSCh0YXJnYWhlYWRlcls3XSkpOworICB9IGVsc2UgeworICAgIGlmIChjbWFwdHlwZSkJCS8qIGJ1dCB5b3UgcHJvbWlzZWQgYSBjbWFwISAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOworICAgIHNvdXJjZS0+Y29sb3JtYXAgPSBOVUxMOworICB9CisKKyAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSBjb21wb25lbnRzOworICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSA4OworICBjaW5mby0+aW1hZ2Vfd2lkdGggPSB3aWR0aDsKKyAgY2luZm8tPmltYWdlX2hlaWdodCA9IGhlaWdodDsKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfaW5wdXRfdGdhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBUYXJnYSBmb3JtYXQgaW5wdXQuCisgKi8KKworR0xPQkFMKGNqcGVnX3NvdXJjZV9wdHIpCitqaW5pdF9yZWFkX3RhcmdhIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlOworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLworICBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKHRnYV9zb3VyY2Vfc3RydWN0KSk7CisgIHNvdXJjZS0+Y2luZm8gPSBjaW5mbzsJLyogbWFrZSBiYWNrIGxpbmsgZm9yIHN1YnJvdXRpbmVzICovCisgIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCisgIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfdGdhOworICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfdGdhOworCisgIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOworfQorCisjZW5kaWYgLyogVEFSR0FfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9zdHJ1Y3R1cmUuZG9jIGIvc3RydWN0dXJlLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM5ZGVmCi0tLSAvZGV2L251bGwKKysrIGIvc3RydWN0dXJlLmRvYwpAQCAtMCwwICsxLDk0OCBAQAorSUpHIEpQRUcgTElCUkFSWTogIFNZU1RFTSBBUkNISVRFQ1RVUkUKKworQ29weXJpZ2h0IChDKSAxOTkxLTE5OTUsIFRob21hcyBHLiBMYW5lLgorVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KK0ZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKworCitUaGlzIGZpbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgSUpHIEpQRUcgc29mdHdhcmU7Cit0aGF0IGlzLCB0aGUgZnVuY3Rpb25zIG9mIHRoZSB2YXJpb3VzIG1vZHVsZXMgaW4gdGhlIHN5c3RlbSBhbmQgdGhlIGludGVyZmFjZXMKK2JldHdlZW4gbW9kdWxlcy4gIEZvciBtb3JlIHByZWNpc2UgZGV0YWlscyBhYm91dCBhbnkgZGF0YSBzdHJ1Y3R1cmUgb3IgY2FsbGluZworY29udmVudGlvbiwgc2VlIHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBjb21tZW50cyBpbiB0aGUgc291cmNlIGNvZGUuCisKK1dlIGFzc3VtZSB0aGF0IHRoZSByZWFkZXIgaXMgYWxyZWFkeSBzb21ld2hhdCBmYW1pbGlhciB3aXRoIHRoZSBKUEVHIHN0YW5kYXJkLgorVGhlIFJFQURNRSBmaWxlIGluY2x1ZGVzIHJlZmVyZW5jZXMgZm9yIGxlYXJuaW5nIGFib3V0IEpQRUcuICBUaGUgZmlsZQorbGlianBlZy5kb2MgZGVzY3JpYmVzIHRoZSBsaWJyYXJ5IGZyb20gdGhlIHZpZXdwb2ludCBvZiBhbiBhcHBsaWNhdGlvbgorcHJvZ3JhbW1lciB1c2luZyB0aGUgbGlicmFyeTsgaXQncyBiZXN0IHRvIHJlYWQgdGhhdCBmaWxlIGJlZm9yZSB0aGlzIG9uZS4KK0Fsc28sIHRoZSBmaWxlIGNvZGVydWxlcy5kb2MgZGVzY3JpYmVzIHRoZSBjb2Rpbmcgc3R5bGUgY29udmVudGlvbnMgd2UgdXNlLgorCitJbiB0aGlzIGRvY3VtZW50LCBKUEVHLXNwZWNpZmljIHRlcm1pbm9sb2d5IGZvbGxvd3MgdGhlIEpQRUcgc3RhbmRhcmQ6CisgIEEgImNvbXBvbmVudCIgbWVhbnMgYSBjb2xvciBjaGFubmVsLCBlLmcuLCBSZWQgb3IgTHVtaW5hbmNlLgorICBBICJzYW1wbGUiIGlzIGEgc2luZ2xlIGNvbXBvbmVudCB2YWx1ZSAoaS5lLiwgb25lIG51bWJlciBpbiB0aGUgaW1hZ2UgZGF0YSkuCisgIEEgImNvZWZmaWNpZW50IiBpcyBhIGZyZXF1ZW5jeSBjb2VmZmljaWVudCAoYSBEQ1QgdHJhbnNmb3JtIG91dHB1dCBudW1iZXIpLgorICBBICJibG9jayIgaXMgYW4gOHg4IGdyb3VwIG9mIHNhbXBsZXMgb3IgY29lZmZpY2llbnRzLgorICBBbiAiTUNVIiAobWluaW11bSBjb2RlZCB1bml0KSBpcyBhbiBpbnRlcmxlYXZlZCBzZXQgb2YgYmxvY2tzIG9mIHNpemUKKwlkZXRlcm1pbmVkIGJ5IHRoZSBzYW1wbGluZyBmYWN0b3JzLCBvciBhIHNpbmdsZSBibG9jayBpbiBhCisJbm9uaW50ZXJsZWF2ZWQgc2Nhbi4KK1dlIGRvIG5vdCB1c2UgdGhlIHRlcm1zICJwaXhlbCIgYW5kICJzYW1wbGUiIGludGVyY2hhbmdlYWJseS4gIFdoZW4gd2Ugc2F5CitwaXhlbCwgd2UgbWVhbiBhbiBlbGVtZW50IG9mIHRoZSBmdWxsLXNpemUgaW1hZ2UsIHdoaWxlIGEgc2FtcGxlIGlzIGFuIGVsZW1lbnQKK29mIHRoZSBkb3duc2FtcGxlZCBpbWFnZS4gIFRodXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG1heSB2YXJ5IGFjcm9zcworY29tcG9uZW50cyB3aGlsZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBkb2VzIG5vdC4gIChUaGlzIHRlcm1pbm9sb2d5IGlzIG5vdCB1c2VkCityaWdvcm91c2x5IHRocm91Z2hvdXQgdGhlIGNvZGUsIGJ1dCBpdCBpcyB1c2VkIGluIHBsYWNlcyB3aGVyZSBjb25mdXNpb24gd291bGQKK290aGVyd2lzZSByZXN1bHQuKQorCisKKyoqKiBTeXN0ZW0gZmVhdHVyZXMgKioqCisKK1RoZSBJSkcgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIHR3byBwYXJ0czoKKyAgKiBBIHN1YnJvdXRpbmUgbGlicmFyeSBmb3IgSlBFRyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKyAgKiBjanBlZy9kanBlZywgdHdvIHNhbXBsZSBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIGxpYnJhcnkgdG8gdHJhbnNmb3JtCisgICAgSkZJRiBKUEVHIGZpbGVzIHRvIGFuZCBmcm9tIHNldmVyYWwgb3RoZXIgaW1hZ2UgZm9ybWF0cy4KK2NqcGVnL2RqcGVnIGFyZSBvZiBubyBncmVhdCBpbnRlbGxlY3R1YWwgY29tcGxleGl0eTogdGhleSBtZXJlbHkgYWRkIGEgc2ltcGxlCitjb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgYW5kIEkvTyByb3V0aW5lcyBmb3Igc2V2ZXJhbCB1bmNvbXByZXNzZWQgaW1hZ2UKK2Zvcm1hdHMuICBUaGlzIGRvY3VtZW50IGNvbmNlbnRyYXRlcyBvbiB0aGUgbGlicmFyeSBpdHNlbGYuCisKK1dlIGRlc2lyZSB0aGUgbGlicmFyeSB0byBiZSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgYWxsIEpQRUcgYmFzZWxpbmUsIGV4dGVuZGVkCitzZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUgRENUIHByb2Nlc3Nlcy4gIEhpZXJhcmNoaWNhbCBwcm9jZXNzZXMgYXJlIG5vdAorc3VwcG9ydGVkLgorCitUaGUgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBsb3NzbGVzcyAoc3BhdGlhbCkgSlBFRyBwcm9jZXNzLiAgTG9zc2xlc3MKK0pQRUcgc2hhcmVzIGxpdHRsZSBvciBubyBjb2RlIHdpdGggbG9zc3kgSlBFRywgYW5kIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQKK3dpdGhvdXQgdGhlIGV4dGVuc2l2ZSBwcmUtIGFuZCBwb3N0LXByb2Nlc3NpbmcgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5LgorV2UgZmVlbCB0aGF0IGxvc3NsZXNzIEpQRUcgaXMgYmV0dGVyIGhhbmRsZWQgYnkgYSBzZXBhcmF0ZSBsaWJyYXJ5LgorCitXaXRoaW4gdGhlc2UgbGltaXRzLCBhbnkgc2V0IG9mIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYWxsb3dlZCBieSB0aGUgSlBFRworc3BlYyBzaG91bGQgYmUgcmVhZGFibGUgZm9yIGRlY29tcHJlc3Npb24uICAoV2UgY2FuIGJlIG1vcmUgcmVzdHJpY3RpdmUgYWJvdXQKK3doYXQgZm9ybWF0cyB3ZSBjYW4gZ2VuZXJhdGUuKSAgQWx0aG91Z2ggdGhlIHN5c3RlbSBkZXNpZ24gYWxsb3dzIGZvciBhbGwKK3BhcmFtZXRlciB2YWx1ZXMsIHNvbWUgdW5jb21tb24gc2V0dGluZ3MgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYW5kIG1heQorbmV2ZXIgYmU7IG5vbmludGVncmFsIHNhbXBsaW5nIHJhdGlvcyBhcmUgdGhlIHByaW1lIGV4YW1wbGUuICBGdXJ0aGVybW9yZSwKK3dlIHRyZWF0IDgtYml0IHZzLiAxMi1iaXQgZGF0YSBwcmVjaXNpb24gYXMgYSBjb21waWxlLXRpbWUgc3dpdGNoLCBub3QgYQorcnVuLXRpbWUgb3B0aW9uLCBiZWNhdXNlIG1vc3QgbWFjaGluZXMgY2FuIHN0b3JlIDgtYml0IHBpeGVscyBtdWNoIG1vcmUKK2NvbXBhY3RseSB0aGFuIDEyLWJpdC4KKworRm9yIGxlZ2FsIHJlYXNvbnMsIEpQRUcgYXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQsIGJ1dAorZXh0ZW5kaW5nIHRoZSBsaWJyYXJ5IHRvIGluY2x1ZGUgaXQgd291bGQgYmUgc3RyYWlnaHRmb3J3YXJkLgorCitCeSBpdHNlbGYsIHRoZSBsaWJyYXJ5IGhhbmRsZXMgb25seSBpbnRlcmNoYW5nZSBKUEVHIGRhdGFzdHJlYW1zIC0tLSBpbgorcGFydGljdWxhciB0aGUgd2lkZWx5IHVzZWQgSkZJRiBmaWxlIGZvcm1hdC4gIFRoZSBsaWJyYXJ5IGNhbiBiZSB1c2VkIGJ5CitzdXJyb3VuZGluZyBjb2RlIHRvIHByb2Nlc3MgaW50ZXJjaGFuZ2Ugb3IgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcyB0aGF0CithcmUgZW1iZWRkZWQgaW4gbW9yZSBjb21wbGV4IGZpbGUgZm9ybWF0cy4gIChGb3IgZXhhbXBsZSwgbGlidGlmZiB1c2VzIHRoaXMKK2xpYnJhcnkgdG8gaW1wbGVtZW50IEpQRUcgY29tcHJlc3Npb24gd2l0aGluIHRoZSBUSUZGIGZpbGUgZm9ybWF0LikKKworVGhlIGxpYnJhcnkgaW5jbHVkZXMgYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZQorSlBFRyBzdGFuZGFyZCBidXQgaXMgbmVjZXNzYXJ5IGZvciB0eXBpY2FsIGFwcGxpY2F0aW9ucyBvZiBKUEVHLiAgVGhlc2UKK2Z1bmN0aW9ucyBwcmVwcm9jZXNzIHRoZSBpbWFnZSBiZWZvcmUgSlBFRyBjb21wcmVzc2lvbiBvciBwb3N0cHJvY2VzcyBpdCBhZnRlcgorZGVjb21wcmVzc2lvbi4gIFRoZXkgaW5jbHVkZSBjb2xvcnNwYWNlIGNvbnZlcnNpb24sIGRvd25zYW1wbGluZy91cHNhbXBsaW5nLAorYW5kIGNvbG9yIHF1YW50aXphdGlvbi4gIFRoaXMgY29kZSBjYW4gYmUgb21pdHRlZCBpZiBub3QgbmVlZGVkLgorCitBIHdpZGUgcmFuZ2Ugb2YgcXVhbGl0eSB2cy4gc3BlZWQgdHJhZGVvZmZzIGFyZSBwb3NzaWJsZSBpbiBKUEVHIHByb2Nlc3NpbmcsCithbmQgZXZlbiBtb3JlIHNvIGluIGRlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcuICBUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5Citwcm92aWRlcyBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjb3ZlciBtb3N0IG9mIHRoZSB1c2VmdWwgdHJhZGVvZmZzLAorcmFuZ2luZyBmcm9tIHZlcnktaGlnaC1xdWFsaXR5IGRvd24gdG8gZmFzdC1wcmV2aWV3IG9wZXJhdGlvbi4gIE9uIHRoZQorY29tcHJlc3Npb24gc2lkZSB3ZSBoYXZlIGdlbmVyYWxseSBub3QgcHJvdmlkZWQgbG93LXF1YWxpdHkgY2hvaWNlcywgc2luY2UKK2NvbXByZXNzaW9uIGlzIG5vcm1hbGx5IGxlc3MgdGltZS1jcml0aWNhbC4gIEl0IHNob3VsZCBiZSB1bmRlcnN0b29kIHRoYXQgdGhlCitsb3ctcXVhbGl0eSBtb2RlcyBtYXkgbm90IG1lZXQgdGhlIEpQRUcgc3RhbmRhcmQncyBhY2N1cmFjeSByZXF1aXJlbWVudHM7Citub25ldGhlbGVzcywgdGhleSBhcmUgdXNlZnVsIGZvciB2aWV3ZXJzLgorCisKKyoqKiBQb3J0YWJpbGl0eSBpc3N1ZXMgKioqCisKK1BvcnRhYmlsaXR5IGlzIGFuIGVzc2VudGlhbCByZXF1aXJlbWVudCBmb3IgdGhlIGxpYnJhcnkuICBUaGUga2V5IHBvcnRhYmlsaXR5Citpc3N1ZXMgdGhhdCBzaG93IHVwIGF0IHRoZSBsZXZlbCBvZiBzeXN0ZW0gYXJjaGl0ZWN0dXJlIGFyZToKKworMS4gIE1lbW9yeSB1c2FnZS4gIFdlIHdhbnQgdGhlIGNvZGUgdG8gYmUgYWJsZSB0byBydW4gb24gUEMtY2xhc3MgbWFjaGluZXMKK3dpdGggbGltaXRlZCBtZW1vcnkuICBJbWFnZXMgc2hvdWxkIHRoZXJlZm9yZSBiZSBwcm9jZXNzZWQgc2VxdWVudGlhbGx5IChpbgorc3RyaXBzKSwgdG8gYXZvaWQgaG9sZGluZyB0aGUgd2hvbGUgaW1hZ2UgaW4gbWVtb3J5IGF0IG9uY2UuICBXaGVyZSBhCitmdWxsLWltYWdlIGJ1ZmZlciBpcyBuZWNlc3NhcnksIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBlaXRoZXIgdmlydHVhbCBtZW1vcnkKK29yIHRlbXBvcmFyeSBmaWxlcy4KKworMi4gIE5lYXIvZmFyIHBvaW50ZXIgZGlzdGluY3Rpb24uICBUbyBydW4gZWZmaWNpZW50bHkgb24gODB4ODYgbWFjaGluZXMsIHRoZQorY29kZSBzaG91bGQgZGlzdGluZ3Vpc2ggInNtYWxsIiBvYmplY3RzIChrZXB0IGluIG5lYXIgZGF0YSBzcGFjZSkgZnJvbQorImxhcmdlIiBvbmVzIChrZXB0IGluIGZhciBkYXRhIHNwYWNlKS4gIFRoaXMgaXMgYW4gYW5ub3lpbmcgcmVzdHJpY3Rpb24sIGJ1dAorZm9ydHVuYXRlbHkgaXQgZG9lcyBub3QgaW1wYWN0IGNvZGUgcXVhbGl0eSBmb3IgbGVzcyBicmFpbi1kYW1hZ2VkIG1hY2hpbmVzLAorYW5kIHRoZSBzb3VyY2UgY29kZSBjbHV0dGVyIHR1cm5zIG91dCB0byBiZSBtaW5pbWFsIHdpdGggc3VmZmljaWVudCB1c2Ugb2YKK3BvaW50ZXIgdHlwZWRlZnMuCisKKzMuIERhdGEgcHJlY2lzaW9uLiAgV2UgYXNzdW1lIHRoYXQgImNoYXIiIGlzIGF0IGxlYXN0IDggYml0cywgInNob3J0IiBhbmQKKyJpbnQiIGF0IGxlYXN0IDE2LCAibG9uZyIgYXQgbGVhc3QgMzIuICBUaGUgY29kZSB3aWxsIHdvcmsgZmluZSB3aXRoIGxhcmdlcgorZGF0YSBzaXplcywgYWx0aG91Z2ggbWVtb3J5IG1heSBiZSB1c2VkIGluZWZmaWNpZW50bHkgaW4gc29tZSBjYXNlcy4gIEhvd2V2ZXIsCit0aGUgSlBFRyBjb21wcmVzc2VkIGRhdGFzdHJlYW0gbXVzdCB1bHRpbWF0ZWx5IGFwcGVhciBvbiBleHRlcm5hbCBzdG9yYWdlIGFzIGEKK3NlcXVlbmNlIG9mIDgtYml0IGJ5dGVzIGlmIGl0IGlzIHRvIGNvbmZvcm0gdG8gdGhlIHN0YW5kYXJkLiAgVGhpcyBtYXkgcG9zZSBhCitwcm9ibGVtIG9uIG1hY2hpbmVzIHdoZXJlIGNoYXIgaXMgd2lkZXIgdGhhbiA4IGJpdHMuICBUaGUgbGlicmFyeSByZXByZXNlbnRzCitjb21wcmVzc2VkIGRhdGEgYXMgYW4gYXJyYXkgb2YgdmFsdWVzIG9mIHR5cGVkZWYgSk9DVEVULiAgSWYgbm8gZGF0YSB0eXBlCitleGFjdGx5IDggYml0cyB3aWRlIGlzIGF2YWlsYWJsZSwgY3VzdG9tIGRhdGEgc291cmNlIGFuZCBkYXRhIGRlc3RpbmF0aW9uCittb2R1bGVzIG11c3QgYmUgd3JpdHRlbiB0byB1bnBhY2sgYW5kIHBhY2sgdGhlIGNob3NlbiBKT0NURVQgZGF0YXR5cGUgaW50bworOC1iaXQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24uCisKKworKioqIFN5c3RlbSBvdmVydmlldyAqKioKKworVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBhcmUgZWFjaCBkaXZpZGVkIGludG8gdHdvIG1haW4gc2VjdGlvbnM6Cit0aGUgSlBFRyBjb21wcmVzc29yIG9yIGRlY29tcHJlc3NvciBwcm9wZXIsIGFuZCB0aGUgcHJlcHJvY2Vzc2luZyBvcgorcG9zdHByb2Nlc3NpbmcgZnVuY3Rpb25zLiAgVGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZXNlIHR3byBzZWN0aW9ucyBpcyB0aGUKK2ltYWdlIGRhdGEgdGhhdCB0aGUgb2ZmaWNpYWwgSlBFRyBzcGVjIHJlZ2FyZHMgYXMgaXRzIGlucHV0IG9yIG91dHB1dDogdGhpcworZGF0YSBpcyBpbiB0aGUgY29sb3JzcGFjZSB0byBiZSB1c2VkIGZvciBjb21wcmVzc2lvbiwgYW5kIGl0IGlzIGRvd25zYW1wbGVkCit0byB0aGUgc2FtcGxpbmcgZmFjdG9ycyB0byBiZSB1c2VkLiAgVGhlIHByZXByb2Nlc3NpbmcgYW5kIHBvc3Rwcm9jZXNzaW5nCitzdGVwcyBhcmUgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgYSBub3JtYWwgaW1hZ2UgcmVwcmVzZW50YXRpb24gdG8gb3IgZnJvbQordGhpcyBmb3JtLiAgKFRob3NlIGZldyBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIGRlYWwgd2l0aCBZQ2JDciBkb3duc2FtcGxlZAorZGF0YSBjYW4gc2tpcCB0aGUgcHJlcHJvY2Vzc2luZyBvciBwb3N0cHJvY2Vzc2luZyBzdGVwLikKKworTG9va2luZyBtb3JlIGNsb3NlbHksIHRoZSBjb21wcmVzc29yIGxpYnJhcnkgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtYWluCitlbGVtZW50czoKKworICBQcmVwcm9jZXNzaW5nOgorICAgICogQ29sb3Igc3BhY2UgY29udmVyc2lvbiAoZS5nLiwgUkdCIHRvIFlDYkNyKS4KKyAgICAqIEVkZ2UgZXhwYW5zaW9uIGFuZCBkb3duc2FtcGxpbmcuICBPcHRpb25hbGx5LCB0aGlzIHN0ZXAgY2FuIGRvIHNpbXBsZQorICAgICAgc21vb3RoaW5nIC0tLSB0aGlzIGlzIG9mdGVuIGhlbHBmdWwgZm9yIGxvdy1xdWFsaXR5IHNvdXJjZSBkYXRhLgorICBKUEVHIHByb3BlcjoKKyAgICAqIE1DVSBhc3NlbWJseSwgRENULCBxdWFudGl6YXRpb24uCisgICAgKiBFbnRyb3B5IGNvZGluZyAoc2VxdWVudGlhbCBvciBwcm9ncmVzc2l2ZSwgSHVmZm1hbiBvciBhcml0aG1ldGljKS4KKworSW4gYWRkaXRpb24gdG8gdGhlc2UgbW9kdWxlcyB3ZSBuZWVkIG92ZXJhbGwgY29udHJvbCwgbWFya2VyIGdlbmVyYXRpb24sCithbmQgc3VwcG9ydCBjb2RlIChtZW1vcnkgbWFuYWdlbWVudCAmIGVycm9yIGhhbmRsaW5nKS4gIFRoZXJlIGlzIGFsc28gYQorbW9kdWxlIHJlc3BvbnNpYmxlIGZvciBwaHlzaWNhbGx5IHdyaXRpbmcgdGhlIG91dHB1dCBkYXRhIC0tLSB0eXBpY2FsbHkKK3RoaXMgaXMganVzdCBhbiBpbnRlcmZhY2UgdG8gZndyaXRlKCksIGJ1dCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0bworZG8gc29tZXRoaW5nIGVsc2Ugd2l0aCB0aGUgZGF0YS4KKworVGhlIGRlY29tcHJlc3NvciBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbWFpbiBlbGVtZW50czoKKworICBKUEVHIHByb3BlcjoKKyAgICAqIEVudHJvcHkgZGVjb2RpbmcgKHNlcXVlbnRpYWwgb3IgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYykuCisgICAgKiBEZXF1YW50aXphdGlvbiwgaW52ZXJzZSBEQ1QsIE1DVSBkaXNhc3NlbWJseS4KKyAgUG9zdHByb2Nlc3Npbmc6CisgICAgKiBVcHNhbXBsaW5nLiAgT3B0aW9uYWxseSwgdGhpcyBzdGVwIG1heSBiZSBhYmxlIHRvIGRvIG1vcmUgZ2VuZXJhbAorICAgICAgcmVzY2FsaW5nIG9mIHRoZSBpbWFnZS4KKyAgICAqIENvbG9yIHNwYWNlIGNvbnZlcnNpb24gKGUuZy4sIFlDYkNyIHRvIFJHQikuICBUaGlzIHN0ZXAgbWF5IGFsc28KKyAgICAgIHByb3ZpZGUgZ2FtbWEgYWRqdXN0bWVudCBbIGN1cnJlbnRseSBpdCBkb2VzIG5vdCBdLgorICAgICogT3B0aW9uYWwgY29sb3IgcXVhbnRpemF0aW9uIChlLmcuLCByZWR1Y3Rpb24gdG8gMjU2IGNvbG9ycykuCisgICAgKiBPcHRpb25hbCBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uIChlLmcuLCAyNC1iaXQgdG8gMTUtYml0IGNvbG9yKS4KKyAgICAgIFtUaGlzIGZlYXR1cmUgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC5dCisKK1dlIGFsc28gbmVlZCBvdmVyYWxsIGNvbnRyb2wsIG1hcmtlciBwYXJzaW5nLCBhbmQgYSBkYXRhIHNvdXJjZSBtb2R1bGUuCitUaGUgc3VwcG9ydCBjb2RlIChtZW1vcnkgbWFuYWdlbWVudCAmIGVycm9yIGhhbmRsaW5nKSBjYW4gYmUgc2hhcmVkIHdpdGgKK3RoZSBjb21wcmVzc2lvbiBoYWxmIG9mIHRoZSBsaWJyYXJ5LgorCitUaGVyZSBtYXkgYmUgc2V2ZXJhbCBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBvZiB0aGVzZSBlbGVtZW50cywgcGFydGljdWxhcmx5CitpbiB0aGUgZGVjb21wcmVzc29yLCB3aGVyZSBhIHdpZGUgcmFuZ2Ugb2Ygc3BlZWQvcXVhbGl0eSB0cmFkZW9mZnMgaXMgdmVyeQordXNlZnVsLiAgSXQgbXVzdCBiZSB1bmRlcnN0b29kIHRoYXQgc29tZSBvZiB0aGUgYmVzdCBzcGVlZHVwcyBpbnZvbHZlCittZXJnaW5nIGFkamFjZW50IHN0ZXBzIGluIHRoZSBwaXBlbGluZS4gIEZvciBleGFtcGxlLCB1cHNhbXBsaW5nLCBjb2xvciBzcGFjZQorY29udmVyc2lvbiwgYW5kIGNvbG9yIHF1YW50aXphdGlvbiBtaWdodCBhbGwgYmUgZG9uZSBhdCBvbmNlIHdoZW4gdXNpbmcgYQorbG93LXF1YWxpdHkgb3JkZXJlZC1kaXRoZXIgdGVjaG5pcXVlLiAgVGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgaXMgZGVzaWduZWQgdG8KK2FsbG93IHN1Y2ggbWVyZ2luZyB3aGVyZSBhcHByb3ByaWF0ZS4KKworCitOb3RlOiBpdCBpcyBjb252ZW5pZW50IHRvIHJlZ2FyZCBlZGdlIGV4cGFuc2lvbiAocGFkZGluZyB0byBibG9jayBib3VuZGFyaWVzKQorYXMgYSBwcmVwcm9jZXNzaW5nL3Bvc3Rwcm9jZXNzaW5nIGZ1bmN0aW9uLCBldmVuIHRob3VnaCB0aGUgSlBFRyBzcGVjIGluY2x1ZGVzCitpdCBpbiBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLiAgV2UgZG8gdGhpcyBiZWNhdXNlIGRvd25zYW1wbGluZy91cHNhbXBsaW5nCitjYW4gYmUgc2ltcGxpZmllZCBhIGxpdHRsZSBpZiB0aGV5IHdvcmsgb24gcGFkZGVkIGRhdGE6IGl0J3Mgbm90IG5lY2Vzc2FyeSB0bworaGF2ZSBzcGVjaWFsIGNhc2VzIGF0IHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2VzLiAgVGhlcmVmb3JlIHRoZSBpbnRlcmZhY2UKK2J1ZmZlciBpcyBhbHdheXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIGJsb2NrcyB3aWRlIGFuZCBoaWdoLCBhbmQgd2UgZXhwZWN0Citjb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIHRvIHBhZCB0aGUgc291cmNlIGRhdGEgcHJvcGVybHkuICBQYWRkaW5nIHdpbGwgb2NjdXIKK29ubHkgdG8gdGhlIG5leHQgYmxvY2sgKDgtc2FtcGxlKSBib3VuZGFyeS4gIEluIGFuIGludGVybGVhdmVkLXNjYW4gc2l0dWF0aW9uLAorYWRkaXRpb25hbCBkdW1teSBibG9ja3MgbWF5IGJlIHVzZWQgdG8gZmlsbCBvdXQgTUNVcywgYnV0IHRoZSBNQ1UgYXNzZW1ibHkgYW5kCitkaXNhc3NlbWJseSBsb2dpYyB3aWxsIGNyZWF0ZSBvciBkaXNjYXJkIHRoZXNlIGJsb2NrcyBpbnRlcm5hbGx5LiAgKFRoaXMgaXMKK2FkdmFudGFnZW91cyBmb3Igc3BlZWQgcmVhc29ucywgc2luY2Ugd2UgYXZvaWQgRENUaW5nIHRoZSBkdW1teSBibG9ja3MuCitJdCBhbHNvIHBlcm1pdHMgYSBzbWFsbCByZWR1Y3Rpb24gaW4gZmlsZSBzaXplLCBiZWNhdXNlIHRoZSBjb21wcmVzc29yIGNhbgorY2hvb3NlIGR1bW15IGJsb2NrIGNvbnRlbnRzIHNvIGFzIHRvIG1pbmltaXplIHRoZWlyIHNpemUgaW4gY29tcHJlc3NlZCBmb3JtLgorRmluYWxseSwgaXQgbWFrZXMgdGhlIGludGVyZmFjZSBidWZmZXIgc3BlY2lmaWNhdGlvbiBpbmRlcGVuZGVudCBvZiB3aGV0aGVyCit0aGUgZmlsZSBpcyBhY3R1YWxseSBpbnRlcmxlYXZlZCBvciBub3QuKSAgQXBwbGljYXRpb25zIHRoYXQgd2lzaCB0byBkZWFsCitkaXJlY3RseSB3aXRoIHRoZSBkb3duc2FtcGxlZCBkYXRhIG11c3QgcHJvdmlkZSBzaW1pbGFyIGJ1ZmZlcmluZyBhbmQgcGFkZGluZworZm9yIG9kZC1zaXplZCBpbWFnZXMuCisKKworKioqIFBvb3IgbWFuJ3Mgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nICoqKgorCitJdCBzaG91bGQgYmUgY2xlYXIgYnkgbm93IHRoYXQgd2UgaGF2ZSBhIGxvdCBvZiBxdWFzaS1pbmRlcGVuZGVudCBwcm9jZXNzaW5nCitzdGVwcywgbWFueSBvZiB3aGljaCBoYXZlIHNldmVyYWwgcG9zc2libGUgYmVoYXZpb3JzLiAgVG8gYXZvaWQgY2x1dHRlcmluZyB0aGUKK2NvZGUgd2l0aCBsb3RzIG9mIHN3aXRjaCBzdGF0ZW1lbnRzLCB3ZSB1c2UgYSBzaW1wbGUgZm9ybSBvZiBvYmplY3Qtc3R5bGUKK3Byb2dyYW1taW5nIHRvIHNlcGFyYXRlIG91dCB0aGUgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuCisKK0ZvciBleGFtcGxlLCB0d28gZGlmZmVyZW50IGNvbG9yIHF1YW50aXphdGlvbiBhbGdvcml0aG1zIGNvdWxkIGJlIGltcGxlbWVudGVkCithcyB0d28gc2VwYXJhdGUgbW9kdWxlcyB0aGF0IHByZXNlbnQgdGhlIHNhbWUgZXh0ZXJuYWwgaW50ZXJmYWNlOyBhdCBydW50aW1lLAordGhlIGNhbGxpbmcgY29kZSB3aWxsIGFjY2VzcyB0aGUgcHJvcGVyIG1vZHVsZSBpbmRpcmVjdGx5IHRocm91Z2ggYW4gIm9iamVjdCIuCisKK1dlIGNhbiBnZXQgdGhlIGxpbWl0ZWQgZmVhdHVyZXMgd2UgbmVlZCB3aGlsZSBzdGF5aW5nIHdpdGhpbiBwb3J0YWJsZSBDLgorVGhlIGJhc2ljIHRvb2wgaXMgYSBmdW5jdGlvbiBwb2ludGVyLiAgQW4gIm9iamVjdCIgaXMganVzdCBhIHN0cnVjdAorY29udGFpbmluZyBvbmUgb3IgbW9yZSBmdW5jdGlvbiBwb2ludGVyIGZpZWxkcywgZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcyB0bworYSBtZXRob2QgbmFtZSBpbiByZWFsIG9iamVjdC1vcmllbnRlZCBsYW5ndWFnZXMuICBEdXJpbmcgaW5pdGlhbGl6YXRpb24gd2UKK2ZpbGwgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggcmVmZXJlbmNlcyB0byB3aGljaGV2ZXIgbW9kdWxlIHdlIGhhdmUKK2RldGVybWluZWQgd2UgbmVlZCB0byB1c2UgaW4gdGhpcyBydW4uICBUaGVuIGludm9jYXRpb24gb2YgdGhlIG1vZHVsZSBpcyBkb25lCitieSBpbmRpcmVjdGluZyB0aHJvdWdoIGEgZnVuY3Rpb24gcG9pbnRlcjsgb24gbW9zdCBtYWNoaW5lcyB0aGlzIGlzIG5vIG1vcmUKK2V4cGVuc2l2ZSB0aGFuIGEgc3dpdGNoIHN0YXRlbWVudCwgd2hpY2ggd291bGQgYmUgdGhlIG9ubHkgb3RoZXIgd2F5IG9mCittYWtpbmcgdGhlIHJlcXVpcmVkIHJ1bi10aW1lIGNob2ljZS4gIFRoZSByZWFsbHkgc2lnbmlmaWNhbnQgYmVuZWZpdCwgb2YKK2NvdXJzZSwgaXMga2VlcGluZyB0aGUgc291cmNlIGNvZGUgY2xlYW4gYW5kIHdlbGwgc3RydWN0dXJlZC4KKworV2UgY2FuIGFsc28gYXJyYW5nZSB0byBoYXZlIHByaXZhdGUgc3RvcmFnZSB0aGF0IHZhcmllcyBiZXR3ZWVuIGRpZmZlcmVudAoraW1wbGVtZW50YXRpb25zIG9mIHRoZSBzYW1lIGtpbmQgb2Ygb2JqZWN0LiAgV2UgZG8gdGhpcyBieSBtYWtpbmcgYWxsIHRoZQorbW9kdWxlLXNwZWNpZmljIG9iamVjdCBzdHJ1Y3RzIGJlIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGVudGl0aWVzLCB3aGljaCB3aWxsCitiZSBhY2Nlc3NlZCB2aWEgcG9pbnRlcnMgaW4gdGhlIG1hc3RlciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHN0cnVjdC4KK1RoZSAicHVibGljIiBmaWVsZHMgb3IgbWV0aG9kcyBmb3IgYSBnaXZlbiBraW5kIG9mIG9iamVjdCBhcmUgc3BlY2lmaWVkIGJ5CithIGNvbW1vbmx5IGtub3duIHN0cnVjdC4gIEJ1dCBhIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uIGNvZGUgY2FuIGFsbG9jYXRlCithIGxhcmdlciBzdHJ1Y3QgdGhhdCBjb250YWlucyB0aGUgY29tbW9uIHN0cnVjdCBhcyBpdHMgZmlyc3QgbWVtYmVyLCBwbHVzCithZGRpdGlvbmFsIHByaXZhdGUgZmllbGRzLiAgV2l0aCBhcHByb3ByaWF0ZSBwb2ludGVyIGNhc3RpbmcsIHRoZSBtb2R1bGUncworaW50ZXJuYWwgZnVuY3Rpb25zIGNhbiBhY2Nlc3MgdGhlc2UgcHJpdmF0ZSBmaWVsZHMuICAoRm9yIGEgc2ltcGxlIGV4YW1wbGUsCitzZWUgamRhdGFkc3QuYywgd2hpY2ggaW1wbGVtZW50cyB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHNwZWNpZmllZCBieSBzdHJ1Y3QKK2pwZWdfZGVzdGluYXRpb25fbWdyLCBidXQgYWRkcyBleHRyYSBmaWVsZHMuKQorCisoT2YgY291cnNlIHRoaXMgd291bGQgYWxsIGJlIGEgbG90IGVhc2llciBpZiB3ZSB3ZXJlIHVzaW5nIEMrKywgYnV0IHdlIGFyZQorbm90IHlldCBwcmVwYXJlZCB0byBhc3N1bWUgdGhhdCBldmVyeW9uZSBoYXMgYSBDKysgY29tcGlsZXIuKQorCitBbiBpbXBvcnRhbnQgYmVuZWZpdCBvZiB0aGlzIHNjaGVtZSBpcyB0aGF0IGl0IGlzIGVhc3kgdG8gcHJvdmlkZSBtdWx0aXBsZQordmVyc2lvbnMgb2YgYW55IG1ldGhvZCwgZWFjaCB0dW5lZCB0byBhIHBhcnRpY3VsYXIgY2FzZS4gIFdoaWxlIGEgbG90IG9mCitwcmVjYWxjdWxhdGlvbiBtaWdodCBiZSBkb25lIHRvIHNlbGVjdCBhbiBvcHRpbWFsIGltcGxlbWVudGF0aW9uIG9mIGEgbWV0aG9kLAordGhlIGNvc3QgcGVyIGludm9jYXRpb24gaXMgY29uc3RhbnQuICBGb3IgZXhhbXBsZSwgdGhlIHVwc2FtcGxpbmcgc3RlcCBtaWdodAoraGF2ZSBhICJnZW5lcmljIiBtZXRob2QsIHBsdXMgb25lIG9yIG1vcmUgImhhcmR3aXJlZCIgbWV0aG9kcyBmb3IgdGhlIG1vc3QKK3BvcHVsYXIgc2FtcGxpbmcgZmFjdG9yczsgdGhlIGhhcmR3aXJlZCBtZXRob2RzIHdvdWxkIGJlIGZhc3RlciBiZWNhdXNlIHRoZXknZAordXNlIHN0cmFpZ2h0LWxpbmUgY29kZSBpbnN0ZWFkIG9mIGZvci1sb29wcy4gIFRoZSBjb3N0IHRvIGRldGVybWluZSB3aGljaAorbWV0aG9kIHRvIHVzZSBpcyBwYWlkIG9ubHkgb25jZSwgYXQgc3RhcnR1cCwgYW5kIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgYXJlCitoaWRkZW4gZnJvbSB0aGUgY2FsbGVycyBvZiB0aGUgbWV0aG9kLgorCitUaGlzIHBsYW4gZGlmZmVycyBhIGxpdHRsZSBiaXQgZnJvbSB1c3VhbCBvYmplY3Qtb3JpZW50ZWQgc3RydWN0dXJlcywgaW4gdGhhdAorb25seSBvbmUgaW5zdGFuY2Ugb2YgZWFjaCBvYmplY3QgY2xhc3Mgd2lsbCBleGlzdCBkdXJpbmcgZXhlY3V0aW9uLiAgVGhlCityZWFzb24gZm9yIGhhdmluZyB0aGUgY2xhc3Mgc3RydWN0dXJlIGlzIHRoYXQgb24gZGlmZmVyZW50IHJ1bnMgd2UgbWF5IGNyZWF0ZQorZGlmZmVyZW50IGluc3RhbmNlcyAoY2hvb3NlIHRvIGV4ZWN1dGUgZGlmZmVyZW50IG1vZHVsZXMpLiAgWW91IGNhbiB0aGluayBvZgordGhlIHRlcm0gIm1ldGhvZCIgYXMgZGVub3RpbmcgdGhlIGNvbW1vbiBpbnRlcmZhY2UgcHJlc2VudGVkIGJ5IGEgcGFydGljdWxhcgorc2V0IG9mIGludGVyY2hhbmdlYWJsZSBmdW5jdGlvbnMsIGFuZCAib2JqZWN0IiBhcyBkZW5vdGluZyBhIGdyb3VwIG9mIHJlbGF0ZWQKK21ldGhvZHMsIG9yIHRoZSB0b3RhbCBzaGFyZWQgaW50ZXJmYWNlIGJlaGF2aW9yIG9mIGEgZ3JvdXAgb2YgbW9kdWxlcy4KKworCisqKiogT3ZlcmFsbCBjb250cm9sIHN0cnVjdHVyZSAqKioKKworV2UgcHJldmlvdXNseSBtZW50aW9uZWQgdGhlIG5lZWQgZm9yIG92ZXJhbGwgY29udHJvbCBsb2dpYyBpbiB0aGUgY29tcHJlc3Npb24KK2FuZCBkZWNvbXByZXNzaW9uIGxpYnJhcmllcy4gIEluIElKRyBpbXBsZW1lbnRhdGlvbnMgcHJpb3IgdG8gdjUsIG92ZXJhbGwKK2NvbnRyb2wgd2FzIG1vc3RseSBwcm92aWRlZCBieSAicGlwZWxpbmUgY29udHJvbCIgbW9kdWxlcywgd2hpY2ggcHJvdmVkIHRvIGJlCitsYXJnZSwgdW53aWVsZHksIGFuZCBoYXJkIHRvIHVuZGVyc3RhbmQuICBUbyBpbXByb3ZlIHRoZSBzaXR1YXRpb24sIHRoZQorY29udHJvbCBsb2dpYyBoYXMgYmVlbiBzdWJkaXZpZGVkIGludG8gbXVsdGlwbGUgbW9kdWxlcy4gIFRoZSBjb250cm9sIG1vZHVsZXMKK2NvbnNpc3Qgb2Y6CisKKzEuIE1hc3RlciBjb250cm9sIGZvciBtb2R1bGUgc2VsZWN0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4gIFRoaXMgaGFzIHR3bworcmVzcG9uc2liaWxpdGllczoKKworICAgMUEuICBTdGFydHVwIGluaXRpYWxpemF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgaW1hZ2UgcHJvY2Vzc2luZy4KKyAgICAgICAgVGhlIGluZGl2aWR1YWwgcHJvY2Vzc2luZyBtb2R1bGVzIHRvIGJlIHVzZWQgaW4gdGhpcyBydW4gYXJlIHNlbGVjdGVkCisgICAgICAgIGFuZCBnaXZlbiBpbml0aWFsaXphdGlvbiBjYWxscy4KKworICAgMUIuICBQZXItcGFzcyBjb250cm9sLiAgVGhpcyBkZXRlcm1pbmVzIGhvdyBtYW55IHBhc3NlcyB3aWxsIGJlIHBlcmZvcm1lZAorICAgICAgICBhbmQgY2FsbHMgZWFjaCBhY3RpdmUgcHJvY2Vzc2luZyBtb2R1bGUgdG8gY29uZmlndXJlIGl0c2VsZgorICAgICAgICBhcHByb3ByaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzLiAgRW5kLW9mLXBhc3MgcHJvY2Vzc2luZywKKwl3aGVyZSBuZWNlc3NhcnksIGlzIGFsc28gaW52b2tlZCBmcm9tIHRoZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUuCisKKyAgIE1ldGhvZCBzZWxlY3Rpb24gaXMgcGFydGlhbGx5IGRpc3RyaWJ1dGVkLCBpbiB0aGF0IGEgcGFydGljdWxhciBwcm9jZXNzaW5nCisgICBtb2R1bGUgbWF5IGNvbnRhaW4gc2V2ZXJhbCBwb3NzaWJsZSBpbXBsZW1lbnRhdGlvbnMgb2YgYSBwYXJ0aWN1bGFyIG1ldGhvZCwKKyAgIHdoaWNoIGl0IHdpbGwgc2VsZWN0IGFtb25nIHdoZW4gZ2l2ZW4gaXRzIGluaXRpYWxpemF0aW9uIGNhbGwuICBUaGUgbWFzdGVyCisgICBjb250cm9sIGNvZGUgbmVlZCBvbmx5IGJlIGNvbmNlcm5lZCB3aXRoIGRlY2lzaW9ucyB0aGF0IGFmZmVjdCBtb3JlIHRoYW4KKyAgIG9uZSBtb2R1bGUuCisgCisyLiBEYXRhIGJ1ZmZlcmluZyBjb250cm9sLiAgQSBzZXBhcmF0ZSBjb250cm9sIG1vZHVsZSBleGlzdHMgZm9yIGVhY2gKKyAgIGludGVyLXByb2Nlc3Npbmctc3RlcCBkYXRhIGJ1ZmZlci4gIFRoaXMgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgaW52b2tpbmcgdGhlIHByb2Nlc3Npbmcgc3RlcHMgdGhhdCB3cml0ZSBvciByZWFkIHRoYXQgZGF0YSBidWZmZXIuCisKK0VhY2ggYnVmZmVyIGNvbnRyb2xsZXIgc2VlcyB0aGUgd29ybGQgYXMgZm9sbG93czoKKworaW5wdXQgZGF0YSA9PiBwcm9jZXNzaW5nIHN0ZXAgQSA9PiBidWZmZXIgPT4gcHJvY2Vzc2luZyBzdGVwIEIgPT4gb3V0cHV0IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gY29udHJvbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGNvbnRyb2xsZXIga25vd3MgdGhlIGRhdGFmbG93IHJlcXVpcmVtZW50cyBvZiBzdGVwcyBBIGFuZCBCOiBob3cgbXVjaCBkYXRhCit0aGV5IHdhbnQgdG8gYWNjZXB0IGluIG9uZSBjaHVuayBhbmQgaG93IG11Y2ggdGhleSBvdXRwdXQgaW4gb25lIGNodW5rLiAgSXRzCitmdW5jdGlvbiBpcyB0byBtYW5hZ2UgaXRzIGJ1ZmZlciBhbmQgY2FsbCBBIGFuZCBCIGF0IHRoZSBwcm9wZXIgdGltZXMuCisKK0EgZGF0YSBidWZmZXIgY29udHJvbCBtb2R1bGUgbWF5IGl0c2VsZiBiZSB2aWV3ZWQgYXMgYSBwcm9jZXNzaW5nIHN0ZXAgYnkgYQoraGlnaGVyLWxldmVsIGNvbnRyb2wgbW9kdWxlOyB0aHVzIHRoZSBjb250cm9sIG1vZHVsZXMgZm9ybSBhIGJpbmFyeSB0cmVlIHdpdGgKK2VsZW1lbnRhcnkgcHJvY2Vzc2luZyBzdGVwcyBhdCB0aGUgbGVhdmVzIG9mIHRoZSB0cmVlLgorCitUaGUgY29udHJvbCBtb2R1bGVzIGFyZSBvYmplY3RzLiAgQSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGZsZXhpYmlsaXR5IGNhbgorYmUgaGFkIGJ5IHJlcGxhY2luZyBpbXBsZW1lbnRhdGlvbnMgb2YgYSBjb250cm9sIG1vZHVsZS4gIEZvciBleGFtcGxlOgorKiBNZXJnaW5nIG9mIGFkamFjZW50IHN0ZXBzIGluIHRoZSBwaXBlbGluZSBpcyBkb25lIGJ5IHJlcGxhY2luZyBhIGNvbnRyb2wKKyAgbW9kdWxlIGFuZCBpdHMgcGFpciBvZiBwcm9jZXNzaW5nLXN0ZXAgbW9kdWxlcyB3aXRoIGEgc2luZ2xlIHByb2Nlc3NpbmctCisgIHN0ZXAgbW9kdWxlLiAgKEhlbmNlIHRoZSBwb3NzaWJsZSBtZXJnZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRyZWUgb2YKKyAgY29udHJvbCBtb2R1bGVzLikKKyogSW4gc29tZSBwcm9jZXNzaW5nIG1vZGVzLCBhIGdpdmVuIGludGVyc3RlcCBidWZmZXIgbmVlZCBvbmx5IGJlIGEgInN0cmlwIgorICBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGFjY29tbW9kYXRlIHRoZSBkZXNpcmVkIGRhdGEgY2h1bmsgc2l6ZXMuICBJbiBvdGhlcgorICBtb2RlcywgYSBmdWxsLWltYWdlIGJ1ZmZlciBpcyBuZWVkZWQgYW5kIHNldmVyYWwgcGFzc2VzIGFyZSByZXF1aXJlZC4KKyAgVGhlIGNvbnRyb2wgbW9kdWxlIGRldGVybWluZXMgd2hpY2gga2luZCBvZiBidWZmZXIgaXMgdXNlZCBhbmQgbWFuaXB1bGF0ZXMKKyAgdmlydHVhbCBhcnJheSBidWZmZXJzIGFzIG5lZWRlZC4gIE9uZSBvciBib3RoIHByb2Nlc3Npbmcgc3RlcHMgbWF5IGJlCisgIHVuYXdhcmUgb2YgdGhlIG11bHRpLXBhc3MgYmVoYXZpb3IuCisKK0luIHRoZW9yeSwgd2UgbWlnaHQgYmUgYWJsZSB0byBtYWtlIGFsbCBvZiB0aGUgZGF0YSBidWZmZXIgY29udHJvbGxlcnMKK2ludGVyY2hhbmdlYWJsZSBhbmQgcHJvdmlkZSBqdXN0IG9uZSBzZXQgb2YgaW1wbGVtZW50YXRpb25zIGZvciBhbGwuICBJbgorcHJhY3RpY2UsIGVhY2ggb25lIGNvbnRhaW5zIGNvbnNpZGVyYWJsZSBzcGVjaWFsLWNhc2UgcHJvY2Vzc2luZyBmb3IgaXRzCitwYXJ0aWN1bGFyIGpvYi4gIFRoZSBidWZmZXIgY29udHJvbGxlciBjb25jZXB0IHNob3VsZCBiZSByZWdhcmRlZCBhcyBhbgorb3ZlcmFsbCBzeXN0ZW0gc3RydWN0dXJpbmcgcHJpbmNpcGxlLCBub3QgYXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUKK3Rhc2sgcGVyZm9ybWVkIGJ5IGFueSBvbmUgY29udHJvbGxlci4KKworCisqKiogQ29tcHJlc3Npb24gb2JqZWN0IHN0cnVjdHVyZSAqKioKKworSGVyZSBpcyBhIHNrZXRjaCBvZiB0aGUgbG9naWNhbCBzdHJ1Y3R1cmUgb2YgdGhlIEpQRUcgY29tcHJlc3Npb24gbGlicmFyeToKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBDb2xvcnNwYWNlIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgIHwtLSBQcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIgLS18CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIERvd25zYW1wbGluZworTWFpbiBjb250cm9sbGVyIC0tfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gRm9yd2FyZCBEQ1QsIHF1YW50aXplCisgICAgICAgICAgICAgICAgICB8LS0gQ29lZmZpY2llbnQgY29udHJvbGxlciAtLXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIEVudHJvcHkgZW5jb2RpbmcKKworVGhpcyBza2V0Y2ggYWxzbyBkZXNjcmliZXMgdGhlIGZsb3cgb2YgY29udHJvbCAoc3Vicm91dGluZSBjYWxscykgZHVyaW5nCit0eXBpY2FsIGltYWdlIGRhdGEgcHJvY2Vzc2luZy4gIEVhY2ggb2YgdGhlIGNvbXBvbmVudHMgc2hvd24gaW4gdGhlIGRpYWdyYW0gaXMKK2FuICJvYmplY3QiIHdoaWNoIG1heSBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBhdmFpbGFibGUuICBPbmUKK29yIG1vcmUgc291cmNlIGNvZGUgZmlsZXMgY29udGFpbiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uKHMpIG9mIGVhY2ggb2JqZWN0LgorCitUaGUgb2JqZWN0cyBzaG93biBhYm92ZSBhcmU6CisKKyogTWFpbiBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIHN1YnNhbXBsZWQtZGF0YSBidWZmZXIsIHdoaWNoCisgIGhvbGRzIHRoZSBwcmVwcm9jZXNzZWQgaW5wdXQgZGF0YS4gIFRoaXMgY29udHJvbGxlciBpbnZva2VzIHByZXByb2Nlc3NpbmcgdG8KKyAgZmlsbCB0aGUgc3Vic2FtcGxlZC1kYXRhIGJ1ZmZlciwgYW5kIEpQRUcgY29tcHJlc3Npb24gdG8gZW1wdHkgaXQuICBUaGVyZSBpcworICB1c3VhbGx5IG5vIG5lZWQgZm9yIGEgZnVsbC1pbWFnZSBidWZmZXIgaGVyZTsgYSBzdHJpcCBidWZmZXIgaXMgYWRlcXVhdGUuCisKKyogUHJlcHJvY2Vzc2luZyBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIGRvd25zYW1wbGluZyBpbnB1dCBkYXRhCisgIGJ1ZmZlciwgd2hpY2ggbGllcyBiZXR3ZWVuIGNvbG9yc3BhY2UgY29udmVyc2lvbiBhbmQgZG93bnNhbXBsaW5nLiAgTm90ZQorICB0aGF0IGEgdW5pZmllZCBjb252ZXJzaW9uL2Rvd25zYW1wbGluZyBtb2R1bGUgd291bGQgcHJvYmFibHkgcmVwbGFjZSB0aGlzCisgIGNvbnRyb2xsZXIgZW50aXJlbHkuCisKKyogQ29sb3JzcGFjZSBjb252ZXJzaW9uOiBjb252ZXJ0cyBhcHBsaWNhdGlvbiBpbWFnZSBkYXRhIGludG8gdGhlIGRlc2lyZWQKKyAgSlBFRyBjb2xvciBzcGFjZTsgYWxzbyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gcGl4ZWwtaW50ZXJsZWF2ZWQgbGF5b3V0IHRvCisgIHNlcGFyYXRlIGNvbXBvbmVudCBwbGFuZXMuICBQcm9jZXNzZXMgb25lIHBpeGVsIHJvdyBhdCBhIHRpbWUuCisKKyogRG93bnNhbXBsaW5nOiBwZXJmb3JtcyByZWR1Y3Rpb24gb2YgY2hyb21hIGNvbXBvbmVudHMgYXMgcmVxdWlyZWQuCisgIE9wdGlvbmFsbHkgbWF5IHBlcmZvcm0gcGl4ZWwtbGV2ZWwgc21vb3RoaW5nIGFzIHdlbGwuICBQcm9jZXNzZXMgYSAicm93CisgIGdyb3VwIiBhdCBhIHRpbWUsIHdoZXJlIGEgcm93IGdyb3VwIGlzIGRlZmluZWQgYXMgVm1heCBwaXhlbCByb3dzIG9mIGVhY2gKKyAgY29tcG9uZW50IGJlZm9yZSBkb3duc2FtcGxpbmcsIGFuZCBWayBzYW1wbGUgcm93cyBhZnRlcndhcmRzIChyZW1lbWJlciBWaworICBkaWZmZXJzIGFjcm9zcyBjb21wb25lbnRzKS4gIFNvbWUgZG93bnNhbXBsaW5nIG9yIHNtb290aGluZyBhbGdvcml0aG1zIG1heQorICByZXF1aXJlIGNvbnRleHQgcm93cyBhYm92ZSBhbmQgYmVsb3cgdGhlIGN1cnJlbnQgcm93IGdyb3VwOyB0aGUKKyAgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzdXBwbHlpbmcgdGhlc2Ugcm93cyB2aWEgcHJvcGVyCisgIGJ1ZmZlcmluZy4gIFRoZSBkb3duc2FtcGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWRnZSBleHBhbnNpb24gYXQgdGhlIHJpZ2h0CisgIGVkZ2UgKGkuZS4sIGV4dGVuZGluZyBlYWNoIHNhbXBsZSByb3cgdG8gYSBtdWx0aXBsZSBvZiA4IHNhbXBsZXMpOyBidXQgdGhlCisgIHByZXByb2Nlc3NpbmcgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdmVydGljYWwgZWRnZSBleHBhbnNpb24gKGkuZS4sCisgIGR1cGxpY2F0aW5nIHRoZSBib3R0b20gc2FtcGxlIHJvdyBhcyBuZWVkZWQgdG8gbWFrZSBhIG11bHRpcGxlIG9mIDggcm93cykuCisKKyogQ29lZmZpY2llbnQgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBEQ1QtY29lZmZpY2llbnQgZGF0YS4KKyAgVGhpcyBjb250cm9sbGVyIGhhbmRsZXMgTUNVIGFzc2VtYmx5LCBpbmNsdWRpbmcgaW5zZXJ0aW9uIG9mIGR1bW15IERDVAorICBibG9ja3Mgd2hlbiBuZWVkZWQgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlLiAgV2hlbiBwZXJmb3JtaW5nCisgIEh1ZmZtYW4tY29kZSBvcHRpbWl6YXRpb24gb3IgZW1pdHRpbmcgYSBtdWx0aXNjYW4gSlBFRyBmaWxlLCB0aGlzCisgIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJ1ZmZlcmluZyB0aGUgZnVsbCBpbWFnZS4gIFRoZSBlcXVpdmFsZW50IG9mCisgIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93IG9mIHN1YnNhbXBsZWQgZGF0YSBpcyBwcm9jZXNzZWQgcGVyIGNhbGwsCisgIGV2ZW4gd2hlbiB0aGUgSlBFRyBmaWxlIGlzIG5vbmludGVybGVhdmVkLgorCisqIEZvcndhcmQgRENUIGFuZCBxdWFudGl6YXRpb246IFBlcmZvcm0gRENULCBxdWFudGl6ZSwgYW5kIGVtaXQgY29lZmZpY2llbnRzLgorICBXb3JrcyBvbiBvbmUgb3IgbW9yZSBEQ1QgYmxvY2tzIGF0IGEgdGltZS4gIChOb3RlOiB0aGUgY29lZmZpY2llbnRzIGFyZSBub3cKKyAgZW1pdHRlZCBpbiBub3JtYWwgYXJyYXkgb3JkZXIsIHdoaWNoIHRoZSBlbnRyb3B5IGVuY29kZXIgaXMgZXhwZWN0ZWQgdG8KKyAgY29udmVydCB0byB6aWd6YWcgb3JkZXIgYXMgbmVjZXNzYXJ5LiAgUHJpb3IgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlIGRpZAorICB0aGUgY29udmVyc2lvbiB0byB6aWd6YWcgb3JkZXIgd2l0aGluIHRoZSBxdWFudGl6YXRpb24gc3RlcC4pCisKKyogRW50cm9weSBlbmNvZGluZzogUGVyZm9ybSBIdWZmbWFuIG9yIGFyaXRobWV0aWMgZW50cm9weSBjb2RpbmcgYW5kIGVtaXQgdGhlCisgIGNvZGVkIGRhdGEgdG8gdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlLiAgV29ya3Mgb24gb25lIE1DVSBwZXIgY2FsbC4KKyAgRm9yIHByb2dyZXNzaXZlIEpQRUcsIHRoZSBzYW1lIERDVCBibG9ja3MgYXJlIGZlZCB0byB0aGUgZW50cm9weSBjb2RlcgorICBkdXJpbmcgZWFjaCBwYXNzLCBhbmQgdGhlIGNvZGVyIG11c3QgZW1pdCB0aGUgYXBwcm9wcmlhdGUgc3Vic2V0IG9mCisgIGNvZWZmaWNpZW50cy4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIG9iamVjdHMsIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGluY2x1ZGVzIHRoZXNlCitvYmplY3RzOgorCisqIE1hc3RlciBjb250cm9sOiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcGFzc2VzIHJlcXVpcmVkLCBjb250cm9scyBvdmVyYWxsCisgIGFuZCBwZXItcGFzcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3RoZXIgbW9kdWxlcy4KKworKiBNYXJrZXIgd3JpdGluZzogZ2VuZXJhdGVzIEpQRUcgbWFya2VycyAoZXhjZXB0IGZvciBSU1RuLCB3aGljaCBpcyBlbWl0dGVkCisgIGJ5IHRoZSBlbnRyb3B5IGVuY29kZXIgd2hlbiBuZWVkZWQpLgorCisqIERhdGEgZGVzdGluYXRpb24gbWFuYWdlcjogd3JpdGVzIHRoZSBvdXRwdXQgSlBFRyBkYXRhc3RyZWFtIHRvIGl0cyBmaW5hbAorICBkZXN0aW5hdGlvbiAoZS5nLiwgYSBmaWxlKS4gIFRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIHN1cHBsaWVkIHdpdGggdGhlCisgIGxpYnJhcnkga25vd3MgaG93IHRvIHdyaXRlIHRvIGEgc3RkaW8gc3RyZWFtOyBmb3Igb3RoZXIgYmVoYXZpb3JzLCB0aGUKKyAgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IHByb3ZpZGUgaXRzIG93biBkZXN0aW5hdGlvbiBtYW5hZ2VyLgorCisqIE1lbW9yeSBtYW5hZ2VyOiBhbGxvY2F0ZXMgYW5kIHJlbGVhc2VzIG1lbW9yeSwgY29udHJvbHMgdmlydHVhbCBhcnJheXMKKyAgKHdpdGggYmFja2luZyBzdG9yZSBtYW5hZ2VtZW50LCB3aGVyZSByZXF1aXJlZCkuCisKKyogRXJyb3IgaGFuZGxlcjogcGVyZm9ybXMgZm9ybWF0dGluZyBhbmQgb3V0cHV0IG9mIGVycm9yIGFuZCB0cmFjZSBtZXNzYWdlczsKKyAgZGV0ZXJtaW5lcyBoYW5kbGluZyBvZiBub25mYXRhbCBlcnJvcnMuICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5CisgIG92ZXJyaWRlIHNvbWUgb3IgYWxsIG9mIHRoaXMgb2JqZWN0J3MgbWV0aG9kcyB0byBjaGFuZ2UgZXJyb3IgaGFuZGxpbmcuCisKKyogUHJvZ3Jlc3MgbW9uaXRvcjogc3VwcG9ydHMgb3V0cHV0IG9mICJwZXJjZW50LWRvbmUiIHByb2dyZXNzIHJlcG9ydHMuCisgIFRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uOgorICBpZiB3YW50ZWQsIGl0IG11c3QgYmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCitUaGUgZXJyb3IgaGFuZGxlciwgZGVzdGluYXRpb24gbWFuYWdlciwgYW5kIHByb2dyZXNzIG1vbml0b3Igb2JqZWN0cyBhcmUKK2RlZmluZWQgYXMgc2VwYXJhdGUgb2JqZWN0cyBpbiBvcmRlciB0byBzaW1wbGlmeSBhcHBsaWNhdGlvbi1zcGVjaWZpYworY3VzdG9taXphdGlvbiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgQSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUKK2luZGl2aWR1YWwgbWV0aG9kcyBvciBzdXBwbHkgaXRzIG93biBhbGwtbmV3IGltcGxlbWVudGF0aW9uIG9mIG9uZSBvZiB0aGVzZQorb2JqZWN0cy4gIFRoZSBvYmplY3QgaW50ZXJmYWNlcyBmb3IgdGhlc2Ugb2JqZWN0cyBhcmUgdGhlcmVmb3JlIHRyZWF0ZWQgYXMKK3BhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZSBvZiB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgb3RoZXIgb2JqZWN0cworYXJlIGludGVybmFsIHRvIHRoZSBsaWJyYXJ5LgorCitUaGUgZXJyb3IgaGFuZGxlciBhbmQgbWVtb3J5IG1hbmFnZXIgYXJlIHNoYXJlZCBieSBKUEVHIGNvbXByZXNzaW9uIGFuZAorZGVjb21wcmVzc2lvbjsgdGhlIHByb2dyZXNzIG1vbml0b3IsIGlmIHVzZWQsIG1heSBiZSBzaGFyZWQgYXMgd2VsbC4KKworCisqKiogRGVjb21wcmVzc2lvbiBvYmplY3Qgc3RydWN0dXJlICoqKgorCitIZXJlIGlzIGEgc2tldGNoIG9mIHRoZSBsb2dpY2FsIHN0cnVjdHVyZSBvZiB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIGxpYnJhcnk6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIEVudHJvcHkgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgIHwtLSBDb2VmZmljaWVudCBjb250cm9sbGVyIC0tfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gRGVxdWFudGl6ZSwgSW52ZXJzZSBEQ1QKK01haW4gY29udHJvbGxlciAtLXwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIFVwc2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgIHwtLSBQb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyIC0tfCAgIHwtLSBDb2xvcnNwYWNlIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIENvbG9yIHF1YW50aXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gQ29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbgorCitBcyBiZWZvcmUsIHRoaXMgZGlhZ3JhbSBhbHNvIHJlcHJlc2VudHMgdHlwaWNhbCBjb250cm9sIGZsb3cuICBUaGUgb2JqZWN0cworc2hvd24gYXJlOgorCisqIE1haW4gY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBzdWJzYW1wbGVkLWRhdGEgYnVmZmVyLCB3aGljaAorICBob2xkcyB0aGUgb3V0cHV0IG9mIEpQRUcgZGVjb21wcmVzc2lvbiBwcm9wZXIuICBUaGlzIGNvbnRyb2xsZXIncyBwcmltYXJ5CisgIHRhc2sgaXMgdG8gZmVlZCB0aGUgcG9zdHByb2Nlc3NpbmcgcHJvY2VkdXJlLiAgU29tZSB1cHNhbXBsaW5nIGFsZ29yaXRobXMKKyAgbWF5IHJlcXVpcmUgY29udGV4dCByb3dzIGFib3ZlIGFuZCBiZWxvdyB0aGUgY3VycmVudCByb3cgZ3JvdXA7IHdoZW4gdGhpcworICBpcyB0cnVlLCB0aGUgbWFpbiBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBpdHMgYnVmZmVyIHNvIGFzCisgIHRvIG1ha2UgY29udGV4dCByb3dzIGF2YWlsYWJsZS4gIEluIHRoZSBjdXJyZW50IGRlc2lnbiwgdGhlIG1haW4gYnVmZmVyIGlzCisgIGFsd2F5cyBhIHN0cmlwIGJ1ZmZlcjsgYSBmdWxsLWltYWdlIGJ1ZmZlciBpcyBuZXZlciByZXF1aXJlZC4KKworKiBDb2VmZmljaWVudCBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIERDVC1jb2VmZmljaWVudCBkYXRhLgorICBUaGlzIGNvbnRyb2xsZXIgaGFuZGxlcyBNQ1UgZGlzYXNzZW1ibHksIGluY2x1ZGluZyBkZWxldGlvbiBvZiBhbnkgZHVtbXkKKyAgRENUIGJsb2NrcyBhdCB0aGUgcmlnaHQgb3IgYm90dG9tIGVkZ2UuICBXaGVuIHJlYWRpbmcgYSBtdWx0aXNjYW4gSlBFRworICBmaWxlLCB0aGlzIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIGJ1ZmZlcmluZyB0aGUgZnVsbCBpbWFnZS4KKyAgKEJ1ZmZlcmluZyBEQ1QgY29lZmZpY2llbnRzLCByYXRoZXIgdGhhbiBzYW1wbGVzLCBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydAorICBwcm9ncmVzc2l2ZSBKUEVHLikgIFRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93IG9mCisgIHN1YnNhbXBsZWQgZGF0YSBpcyBwcm9jZXNzZWQgcGVyIGNhbGwsIGV2ZW4gd2hlbiB0aGUgc291cmNlIEpQRUcgZmlsZSBpcworICBub25pbnRlcmxlYXZlZC4KKworKiBFbnRyb3B5IGRlY29kaW5nOiBSZWFkIGNvZGVkIGRhdGEgZnJvbSB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGFuZCBwZXJmb3JtCisgIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBlbnRyb3B5IGRlY29kaW5nLiAgV29ya3Mgb24gb25lIE1DVSBwZXIgY2FsbC4KKyAgRm9yIHByb2dyZXNzaXZlIEpQRUcgZGVjb2RpbmcsIHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHN1cHBsaWVzIHRoZSBwcmlvcgorICBjb2VmZmljaWVudHMgb2YgZWFjaCBNQ1UgKGluaXRpYWxseSBhbGwgemVyb2VzKSwgd2hpY2ggdGhlIGVudHJvcHkgZGVjb2RlcgorICBtb2RpZmllcyBpbiBlYWNoIHNjYW4uCisKKyogRGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUOiBsaWtlIGl0IHNheXMuICBOb3RlIHRoYXQgdGhlIGNvZWZmaWNpZW50cworICBidWZmZXJlZCBieSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBoYXZlIE5PVCBiZWVuIGRlcXVhbnRpemVkOyB3ZQorICBtZXJnZSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1QgaW50byBhIHNpbmdsZSBzdGVwIGZvciBzcGVlZCByZWFzb25zLgorICBXaGVuIHNjYWxlZC1kb3duIG91dHB1dCBpcyBhc2tlZCBmb3IsIHNpbXBsaWZpZWQgRENUIGFsZ29yaXRobXMgbWF5IGJlIHVzZWQKKyAgdGhhdCBlbWl0IG9ubHkgMXgxLCAyeDIsIG9yIDR4NCBzYW1wbGVzIHBlciBEQ1QgYmxvY2ssIG5vdCB0aGUgZnVsbCA4eDguCisgIFdvcmtzIG9uIG9uZSBEQ1QgYmxvY2sgYXQgYSB0aW1lLgorCisqIFBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgY29sb3IgcXVhbnRpemF0aW9uCisgIGlucHV0IGJ1ZmZlciwgd2hlbiBxdWFudGl6YXRpb24gaXMgaW4gdXNlLiAgKFdpdGhvdXQgcXVhbnRpemF0aW9uLCB0aGlzCisgIGNvbnRyb2xsZXIganVzdCBjYWxscyB0aGUgdXBzYW1wbGVyLikgIEZvciB0d28tcGFzcyBxdWFudGl6YXRpb24sIHRoaXMKKyAgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYnVmZmVyaW5nIHRoZSBmdWxsLWltYWdlIGRhdGEuCisKKyogVXBzYW1wbGluZzogcmVzdG9yZXMgY2hyb21hIGNvbXBvbmVudHMgdG8gZnVsbCBzaXplLiAgKE1heSBzdXBwb3J0IG1vcmUKKyAgZ2VuZXJhbCBvdXRwdXQgcmVzY2FsaW5nLCB0b28uICBOb3RlIHRoYXQgaWYgdW5kZXJzaXplZCBEQ1Qgb3V0cHV0cyBoYXZlCisgIGJlZW4gZW1pdHRlZCBieSB0aGUgRENUIG1vZHVsZSwgdGhpcyBtb2R1bGUgbXVzdCBhZGp1c3Qgc28gdGhhdCBwcm9wZXJseQorICBzaXplZCBvdXRwdXRzIGFyZSBjcmVhdGVkLikgIFdvcmtzIG9uIG9uZSByb3cgZ3JvdXAgYXQgYSB0aW1lLiAgVGhpcyBtb2R1bGUKKyAgYWxzbyBjYWxscyB0aGUgY29sb3IgY29udmVyc2lvbiBtb2R1bGUsIHNvIGl0cyB0b3AgbGV2ZWwgaXMgZWZmZWN0aXZlbHkgYQorICBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIHVwc2FtcGxpbmctPmNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLiAgSG93ZXZlciwgaW4KKyAgYWxsIGJ1dCB0aGUgaGlnaGVzdC1xdWFsaXR5IG9wZXJhdGluZyBtb2RlcywgdXBzYW1wbGluZyBhbmQgY29sb3IKKyAgY29udmVyc2lvbiBhcmUgbGlrZWx5IHRvIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHN0ZXAuCisKKyogQ29sb3JzcGFjZSBjb252ZXJzaW9uOiBjb252ZXJ0IGZyb20gSlBFRyBjb2xvciBzcGFjZSB0byBvdXRwdXQgY29sb3Igc3BhY2UsCisgIGFuZCBjaGFuZ2UgZGF0YSBsYXlvdXQgZnJvbSBzZXBhcmF0ZSBjb21wb25lbnQgcGxhbmVzIHRvIHBpeGVsLWludGVybGVhdmVkLgorICBXb3JrcyBvbiBvbmUgcGl4ZWwgcm93IGF0IGEgdGltZS4KKworKiBDb2xvciBxdWFudGl6YXRpb246IHJlZHVjZSB0aGUgZGF0YSB0byBjb2xvcm1hcHBlZCBmb3JtLCB1c2luZyBlaXRoZXIgYW4KKyAgZXh0ZXJuYWxseSBzcGVjaWZpZWQgY29sb3JtYXAgb3IgYW4gaW50ZXJuYWxseSBnZW5lcmF0ZWQgb25lLiAgVGhpcyBtb2R1bGUKKyAgaXMgbm90IHVzZWQgZm9yIGZ1bGwtY29sb3Igb3V0cHV0LiAgV29ya3Mgb24gb25lIHBpeGVsIHJvdyBhdCBhIHRpbWU7IG1heQorICByZXF1aXJlIHR3byBwYXNzZXMgdG8gZ2VuZXJhdGUgYSBjb2xvciBtYXAuICBOb3RlIHRoYXQgdGhlIG91dHB1dCB3aWxsCisgIGFsd2F5cyBiZSBhIHNpbmdsZSBjb21wb25lbnQgcmVwcmVzZW50aW5nIGNvbG9ybWFwIGluZGV4ZXMuICBJbiB0aGUgY3VycmVudAorICBkZXNpZ24sIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSBKU0FNUExFcywgc28gYW4gOC1iaXQgY29tcGlsYXRpb24gY2Fubm90CisgIHF1YW50aXplIHRvIG1vcmUgdGhhbiAyNTYgY29sb3JzLiAgVGhpcyBpcyB1bmxpa2VseSB0byBiZSBhIHByb2JsZW0gaW4KKyAgcHJhY3RpY2UuCisKKyogQ29sb3IgcmVkdWN0aW9uOiB0aGlzIG1vZHVsZSBoYW5kbGVzIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24sIGUuZy4sCisgIGdlbmVyYXRpbmcgMTUtYml0IGNvbG9yICg1IGJpdHMvcHJpbWFyeSkgZnJvbSBKUEVHJ3MgMjQtYml0IG91dHB1dC4KKyAgTm90IHF1aXRlIGNsZWFyIHlldCBob3cgdGhpcyBzaG91bGQgYmUgaGFuZGxlZC4uLiBzaG91bGQgd2UgbWVyZ2UgaXQgd2l0aAorICBjb2xvcnNwYWNlIGNvbnZlcnNpb24/Pz8KKworTm90ZSB0aGF0IHNvbWUgaGlnaC1zcGVlZCBvcGVyYXRpbmcgbW9kZXMgbWlnaHQgY29uZGVuc2UgdGhlIGVudGlyZQorcG9zdHByb2Nlc3Npbmcgc2VxdWVuY2UgdG8gYSBzaW5nbGUgbW9kdWxlICh1cHNhbXBsZSwgY29sb3IgY29udmVydCwgYW5kCitxdWFudGl6ZSBpbiBvbmUgc3RlcCkuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBvYmplY3RzLCB0aGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IGluY2x1ZGVzIHRoZXNlCitvYmplY3RzOgorCisqIE1hc3RlciBjb250cm9sOiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcGFzc2VzIHJlcXVpcmVkLCBjb250cm9scyBvdmVyYWxsCisgIGFuZCBwZXItcGFzcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3RoZXIgbW9kdWxlcy4gIFRoaXMgaXMgc3ViZGl2aWRlZCBpbnRvCisgIGlucHV0IGFuZCBvdXRwdXQgY29udHJvbDogamRpbnB1dC5jIGNvbnRyb2xzIG9ubHkgaW5wdXQtc2lkZSBwcm9jZXNzaW5nLAorICB3aGlsZSBqZG1hc3Rlci5jIGhhbmRsZXMgb3ZlcmFsbCBpbml0aWFsaXphdGlvbiBhbmQgb3V0cHV0LXNpZGUgY29udHJvbC4KKworKiBNYXJrZXIgcmVhZGluZzogZGVjb2RlcyBKUEVHIG1hcmtlcnMgKGV4Y2VwdCBmb3IgUlNUbikuCisKKyogRGF0YSBzb3VyY2UgbWFuYWdlcjogc3VwcGxpZXMgdGhlIGlucHV0IEpQRUcgZGF0YXN0cmVhbS4gIFRoZSBzb3VyY2UKKyAgbWFuYWdlciBzdXBwbGllZCB3aXRoIHRoZSBsaWJyYXJ5IGtub3dzIGhvdyB0byByZWFkIGZyb20gYSBzdGRpbyBzdHJlYW07CisgIGZvciBvdGhlciBiZWhhdmlvcnMsIHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtYXkgcHJvdmlkZSBpdHMgb3duIHNvdXJjZQorICBtYW5hZ2VyLgorCisqIE1lbW9yeSBtYW5hZ2VyOiBzYW1lIGFzIGZvciBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisqIEVycm9yIGhhbmRsZXI6IHNhbWUgYXMgZm9yIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyogUHJvZ3Jlc3MgbW9uaXRvcjogc2FtZSBhcyBmb3IgY29tcHJlc3Npb24gbGlicmFyeS4KKworQXMgd2l0aCBjb21wcmVzc2lvbiwgdGhlIGRhdGEgc291cmNlIG1hbmFnZXIsIGVycm9yIGhhbmRsZXIsIGFuZCBwcm9ncmVzcworbW9uaXRvciBhcmUgY2FuZGlkYXRlcyBmb3IgcmVwbGFjZW1lbnQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKworCisqKiogRGVjb21wcmVzc2lvbiBpbnB1dCBhbmQgb3V0cHV0IHNlcGFyYXRpb24gKioqCisKK1RvIHN1cHBvcnQgZWZmaWNpZW50IGluY3JlbWVudGFsIGRpc3BsYXkgb2YgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcywgdGhlCitkZWNvbXByZXNzb3IgaXMgZGl2aWRlZCBpbnRvIHR3byBzZWN0aW9ucyB0aGF0IGNhbiBydW4gaW5kZXBlbmRlbnRseToKKworMS4gRGF0YSBpbnB1dCBpbmNsdWRlcyBtYXJrZXIgcGFyc2luZywgZW50cm9weSBkZWNvZGluZywgYW5kIGlucHV0IGludG8gdGhlCisgICBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4gIE5vdGUgdGhhdCB0aGlzCisgICBwcm9jZXNzaW5nIGlzIHJlbGF0aXZlbHkgY2hlYXAgYW5kIGZhc3QuCisKKzIuIERhdGEgb3V0cHV0IHJlYWRzIGZyb20gdGhlIERDVCBjb2VmZmljaWVudCBidWZmZXIgYW5kIHBlcmZvcm1zIHRoZSBJRENUCisgICBhbmQgYWxsIHBvc3Rwcm9jZXNzaW5nIHN0ZXBzLgorCitGb3IgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUsIHRoZSBkYXRhIGlucHV0IHByb2Nlc3NpbmcgaXMgYWxsb3dlZCB0byBnZXQKK2FyYml0cmFyaWx5IGZhciBhaGVhZCBvZiB0aGUgZGF0YSBvdXRwdXQgcHJvY2Vzc2luZy4gIChUaGlzIG9jY3VycyBvbmx5CitpZiB0aGUgYXBwbGljYXRpb24gY2FsbHMganBlZ19jb25zdW1lX2lucHV0KCk7IG90aGVyd2lzZSBpbnB1dCBhbmQgb3V0cHV0CitydW4gaW4gbG9ja3N0ZXAsIHNpbmNlIHRoZSBpbnB1dCBzZWN0aW9uIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIG91dHB1dAorc2VjdGlvbiBuZWVkcyBtb3JlIGRhdGEuKSAgSW4gdGhpcyB3YXkgdGhlIGFwcGxpY2F0aW9uIGNhbiBhdm9pZCBtYWtpbmcKK2V4dHJhIGRpc3BsYXkgcGFzc2VzIHdoZW4gZGF0YSBpcyBhcnJpdmluZyBmYXN0ZXIgdGhhbiB0aGUgZGlzcGxheSBwYXNzCitjYW4gcnVuLiAgRnVydGhlcm1vcmUsIGl0IGlzIHBvc3NpYmxlIHRvIGFib3J0IGFuIG91dHB1dCBwYXNzIHdpdGhvdXQKK2xvc2luZyBhbnl0aGluZywgc2luY2UgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyByZWFkLW9ubHkgYXMgZmFyIGFzIHRoZQorb3V0cHV0IHNlY3Rpb24gaXMgY29uY2VybmVkLiAgU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGRldGFpbC4KKworQSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGFycmF5IGlzIG9ubHkgY3JlYXRlZCBpZiB0aGUgSlBFRyBmaWxlIGhhcyBtdWx0aXBsZQorc2NhbnMgKG9yIGlmIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpZXMgYnVmZmVyZWQtaW1hZ2UgbW9kZSBhbnl3YXkpLiAgV2hlbgorcmVhZGluZyBhIHNpbmdsZS1zY2FuIGZpbGUsIHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIG5vcm1hbGx5IGNyZWF0ZXMgb25seQorYSBvbmUtTUNVIGJ1ZmZlciwgc28gaW5wdXQgYW5kIG91dHB1dCBwcm9jZXNzaW5nIG11c3QgcnVuIGluIGxvY2tzdGVwIGluIHRoaXMKK2Nhc2UuICBqcGVnX2NvbnN1bWVfaW5wdXQoKSBpcyBlZmZlY3RpdmVseSBhIG5vLW9wIGluIHRoaXMgc2l0dWF0aW9uLgorCitUaGUgbWFpbiBpbXBhY3Qgb2YgZGl2aWRpbmcgdGhlIGRlY29tcHJlc3NvciBpbiB0aGlzIGZhc2hpb24gaXMgdGhhdCB3ZSBtdXN0CitiZSB2ZXJ5IGNhcmVmdWwgd2l0aCBzaGFyZWQgdmFyaWFibGVzIGluIHRoZSBjaW5mbyBkYXRhIHN0cnVjdHVyZS4gIEVhY2gKK3ZhcmlhYmxlIHRoYXQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGNvdXJzZSBvZiBkZWNvbXByZXNzaW9uIG11c3QgYmUKK2NsYXNzaWZpZWQgYXMgYmVsb25naW5nIHRvIGRhdGEgaW5wdXQgb3IgZGF0YSBvdXRwdXQsIGFuZCBlYWNoIHNlY3Rpb24gbXVzdAorbG9vayBvbmx5IGF0IGl0cyBvd24gdmFyaWFibGVzLiAgRm9yIGV4YW1wbGUsIHRoZSBkYXRhIG91dHB1dCBzZWN0aW9uIG1heSBub3QKK2RlcGVuZCBvbiBhbnkgb2YgdGhlIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjdXJyZW50IHNjYW4gaW4gdGhlIEpQRUcKK2ZpbGUsIGJlY2F1c2UgdGhlc2UgbWF5IGNoYW5nZSBhcyB0aGUgZGF0YSBpbnB1dCBzZWN0aW9uIGFkdmFuY2VzIGludG8gYSBuZXcKK3NjYW4uCisKK1RoZSBwcm9ncmVzcyBtb25pdG9yIGlzIChzb21ld2hhdCBhcmJpdHJhcmlseSkgZGVmaW5lZCB0byB0cmVhdCBpbnB1dCBvZiB0aGUKK2ZpbGUgYXMgb25lIHBhc3Mgd2hlbiBidWZmZXJlZC1pbWFnZSBtb2RlIGlzIG5vdCB1c2VkLCBhbmQgdG8gaWdub3JlIGRhdGEKK2lucHV0IHdvcmsgY29tcGxldGVseSB3aGVuIGJ1ZmZlcmVkLWltYWdlIG1vZGUgaXMgdXNlZC4gIE5vdGUgdGhhdCB0aGUKK2xpYnJhcnkgaGFzIG5vIHJlbGlhYmxlIHdheSB0byBwcmVkaWN0IHRoZSBudW1iZXIgb2YgcGFzc2VzIHdoZW4gZGVhbGluZword2l0aCBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSwgbm9yIGNhbiBpdCBwcmVkaWN0IHRoZSBudW1iZXIgb2Ygb3V0cHV0IHBhc3NlcworaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4gIFNvIHRoZSB3b3JrIGVzdGltYXRlIGlzIGluaGVyZW50bHkgYm9ndXMgYW55d2F5LgorCitObyBjb21wYXJhYmxlIGRpdmlzaW9uIGlzIGN1cnJlbnRseSBtYWRlIGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LCBiZWNhdXNlCit0aGVyZSBpc24ndCBhbnkgcmVhbCBuZWVkIGZvciBpdC4KKworCisqKiogRGF0YSBmb3JtYXRzICoqKgorCitBcnJheXMgb2YgcGl4ZWwgc2FtcGxlIHZhbHVlcyB1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZToKKworICAgIHR5cGVkZWYgc29tZXRoaW5nIEpTQU1QTEU7CQlhIHBpeGVsIGNvbXBvbmVudCB2YWx1ZSwgMC4uTUFYSlNBTVBMRQorICAgIHR5cGVkZWYgSlNBTVBMRSAqSlNBTVBST1c7CQlwdHIgdG8gYSByb3cgb2Ygc2FtcGxlcworICAgIHR5cGVkZWYgSlNBTVBST1cgKkpTQU1QQVJSQVk7CXB0ciB0byBhIGxpc3Qgb2Ygcm93cworICAgIHR5cGVkZWYgSlNBTVBBUlJBWSAqSlNBTVBJTUFHRTsJcHRyIHRvIGEgbGlzdCBvZiBjb2xvci1jb21wb25lbnQgYXJyYXlzCisKK1RoZSBiYXNpYyBlbGVtZW50IHR5cGUgSlNBTVBMRSB3aWxsIHR5cGljYWxseSBiZSBvbmUgb2YgdW5zaWduZWQgY2hhciwKKyhzaWduZWQpIGNoYXIsIG9yIHNob3J0LiAgU2hvcnQgd2lsbCBiZSB1c2VkIGlmIHNhbXBsZXMgd2lkZXIgdGhhbiA4IGJpdHMgYXJlCit0byBiZSBzdXBwb3J0ZWQgKHRoaXMgaXMgYSBjb21waWxlLXRpbWUgb3B0aW9uKS4gIE90aGVyd2lzZSwgdW5zaWduZWQgY2hhciBpcwordXNlZCBpZiBwb3NzaWJsZS4gIElmIHRoZSBjb21waWxlciBvbmx5IHN1cHBvcnRzIHNpZ25lZCBjaGFycywgdGhlbiBpdCBpcworbmVjZXNzYXJ5IHRvIG1hc2sgb2ZmIHRoZSB2YWx1ZSB3aGVuIHJlYWRpbmcuICBUaHVzLCBhbGwgcmVhZHMgb2YgSlNBTVBMRQordmFsdWVzIG11c3QgYmUgY29kZWQgYXMgIkdFVEpTQU1QTEUodmFsdWUpIiwgd2hlcmUgdGhlIG1hY3JvIHdpbGwgYmUgZGVmaW5lZAorYXMgIigodmFsdWUpICYgMHhGRikiIG9uIHNpZ25lZC1jaGFyIG1hY2hpbmVzIGFuZCAiKChpbnQpICh2YWx1ZSkpIiBlbHNld2hlcmUuCisKK1dpdGggdGhlc2UgY29udmVudGlvbnMsIEpTQU1QTEUgdmFsdWVzIGNhbiBiZSBhc3N1bWVkIHRvIGJlID49IDAuICBUaGlzIGhlbHBzCitzaW1wbGlmeSBjb3JyZWN0IHJvdW5kaW5nIGR1cmluZyBkb3duc2FtcGxpbmcsIGV0Yy4gIFRoZSBKUEVHIHN0YW5kYXJkJ3MKK3NwZWNpZmljYXRpb24gdGhhdCBzYW1wbGUgdmFsdWVzIHJ1biBmcm9tIC0xMjguLjEyNyBpcyBhY2NvbW1vZGF0ZWQgYnkKK3N1YnRyYWN0aW5nIDEyOCBqdXN0IGFzIHRoZSBzYW1wbGUgdmFsdWUgaXMgY29waWVkIGludG8gdGhlIHNvdXJjZSBhcnJheSBmb3IKK3RoZSBEQ1Qgc3RlcCAodGhpcyB3aWxsIGJlIGFuIGFycmF5IG9mIHNpZ25lZCBpbnRzKS4gIFNpbWlsYXJseSwgZHVyaW5nCitkZWNvbXByZXNzaW9uIHRoZSBvdXRwdXQgb2YgdGhlIElEQ1Qgc3RlcCB3aWxsIGJlIGltbWVkaWF0ZWx5IHNoaWZ0ZWQgYmFjayB0bworMC4uMjU1LiAgKE5COiBkaWZmZXJlbnQgdmFsdWVzIGFyZSByZXF1aXJlZCB3aGVuIDEyLWJpdCBzYW1wbGVzIGFyZSBpbiB1c2UuCitUaGUgY29kZSBpcyB3cml0dGVuIGluIHRlcm1zIG9mIE1BWEpTQU1QTEUgYW5kIENFTlRFUkpTQU1QTEUsIHdoaWNoIHdpbGwgYmUKK2RlZmluZWQgYXMgMjU1IGFuZCAxMjggcmVzcGVjdGl2ZWx5IGluIGFuIDgtYml0IGltcGxlbWVudGF0aW9uLCBhbmQgYXMgNDA5NQorYW5kIDIwNDggaW4gYSAxMi1iaXQgaW1wbGVtZW50YXRpb24uKQorCitXZSB1c2UgYSBwb2ludGVyIHBlciByb3csIHJhdGhlciB0aGFuIGEgdHdvLWRpbWVuc2lvbmFsIEpTQU1QTEUgYXJyYXkuICBUaGlzCitjaG9pY2UgY29zdHMgb25seSBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgYW5kIGhhcyBzZXZlcmFsIGJlbmVmaXRzOgorKiBDb2RlIHVzaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSBkb2Vzbid0IG5lZWQgdG8ga25vdyB0aGUgYWxsb2NhdGVkIHdpZHRoIG9mCisgIHRoZSByb3dzLiAgVGhpcyBzaW1wbGlmaWVzIGVkZ2UgZXhwYW5zaW9uL2NvbXByZXNzaW9uLCBzaW5jZSB3ZSBjYW4gd29yaworICBpbiBhbiBhcnJheSB0aGF0J3Mgd2lkZXIgdGhhbiB0aGUgbG9naWNhbCBwaWN0dXJlIHdpZHRoLgorKiBJbmRleGluZyBkb2Vzbid0IHJlcXVpcmUgbXVsdGlwbGljYXRpb247IHRoaXMgaXMgYSBwZXJmb3JtYW5jZSB3aW4gb24gbWFueQorICBtYWNoaW5lcy4KKyogQXJyYXlzIHdpdGggbW9yZSB0aGFuIDY0SyB0b3RhbCBlbGVtZW50cyBjYW4gYmUgc3VwcG9ydGVkIGV2ZW4gb24gbWFjaGluZXMKKyAgd2hlcmUgbWFsbG9jKCkgY2Fubm90IGFsbG9jYXRlIGNodW5rcyBsYXJnZXIgdGhhbiA2NEsuCisqIFRoZSByb3dzIGZvcm1pbmcgYSBjb21wb25lbnQgYXJyYXkgbWF5IGJlIGFsbG9jYXRlZCBhdCBkaWZmZXJlbnQgdGltZXMKKyAgd2l0aG91dCBleHRyYSBjb3B5aW5nLiAgVGhpcyB0cmljayBhbGxvd3Mgc29tZSBzcGVlZHVwcyBpbiBzbW9vdGhpbmcgc3RlcHMKKyAgdGhhdCBuZWVkIGFjY2VzcyB0byB0aGUgcHJldmlvdXMgYW5kIG5leHQgcm93cy4KKworTm90ZSB0aGF0IGVhY2ggY29sb3IgY29tcG9uZW50IGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIGFycmF5OyB3ZSBkb24ndCB1c2UgdGhlCit0cmFkaXRpb25hbCBsYXlvdXQgaW4gd2hpY2ggdGhlIGNvbXBvbmVudHMgb2YgYSBwaXhlbCBhcmUgc3RvcmVkIHRvZ2V0aGVyLgorVGhpcyBzaW1wbGlmaWVzIGNvZGluZyBvZiBtb2R1bGVzIHRoYXQgd29yayBvbiBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LAorYmVjYXVzZSB0aGV5IGRvbid0IG5lZWQgdG8ga25vdyBob3cgbWFueSBjb21wb25lbnRzIHRoZXJlIGFyZS4gIEZ1cnRoZXJtb3JlLAord2UgY2FuIHJlYWQgb3Igd3JpdGUgZWFjaCBjb21wb25lbnQgdG8gYSB0ZW1wb3JhcnkgZmlsZSBpbmRlcGVuZGVudGx5LCB3aGljaAoraXMgaGVscGZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBub25pbnRlcmxlYXZlZCBKUEVHIGZpbGVzLgorCitJbiBnZW5lcmFsLCBhIHNwZWNpZmljIHNhbXBsZSB2YWx1ZSBpcyBhY2Nlc3NlZCBieSBjb2RlIHN1Y2ggYXMKKwlHRVRKU0FNUExFKGltYWdlW2NvbG9yY29tcG9uZW50XVtyb3ddW2NvbF0pCit3aGVyZSBjb2wgaXMgbWVhc3VyZWQgZnJvbSB0aGUgaW1hZ2UgbGVmdCBlZGdlLCBidXQgcm93IGlzIG1lYXN1cmVkIGZyb20gdGhlCitmaXJzdCBzYW1wbGUgcm93IGN1cnJlbnRseSBpbiBtZW1vcnkuICBFaXRoZXIgb2YgdGhlIGZpcnN0IHR3byBpbmRleGluZ3MgY2FuCitiZSBwcmVjb21wdXRlZCBieSBjb3B5aW5nIHRoZSByZWxldmFudCBwb2ludGVyLgorCisKK1NpbmNlIG1vc3QgaW1hZ2UtcHJvY2Vzc2luZyBhcHBsaWNhdGlvbnMgcHJlZmVyIHRvIHdvcmsgb24gaW1hZ2VzIGluIHdoaWNoCit0aGUgY29tcG9uZW50cyBvZiBhIHBpeGVsIGFyZSBzdG9yZWQgdG9nZXRoZXIsIHRoZSBkYXRhIHBhc3NlZCB0byBvciBmcm9tIHRoZQorc3Vycm91bmRpbmcgYXBwbGljYXRpb24gdXNlcyB0aGUgdHJhZGl0aW9uYWwgY29udmVudGlvbjogYSBzaW5nbGUgcGl4ZWwgaXMKK3JlcHJlc2VudGVkIGJ5IE4gY29uc2VjdXRpdmUgSlNBTVBMRSB2YWx1ZXMsIGFuZCBhbiBpbWFnZSByb3cgaXMgYW4gYXJyYXkgb2YKKygjIG9mIGNvbG9yIGNvbXBvbmVudHMpKihpbWFnZSB3aWR0aCkgSlNBTVBMRXMuICBPbmUgb3IgbW9yZSByb3dzIG9mIGRhdGEgY2FuCitiZSByZXByZXNlbnRlZCBieSBhIHBvaW50ZXIgb2YgdHlwZSBKU0FNUEFSUkFZIGluIHRoaXMgc2NoZW1lLiAgVGhpcyBzY2hlbWUgaXMKK2NvbnZlcnRlZCB0byBjb21wb25lbnQtd2lzZSBzdG9yYWdlIGluc2lkZSB0aGUgSlBFRyBsaWJyYXJ5LiAgKEFwcGxpY2F0aW9ucwordGhhdCB3YW50IHRvIHNraXAgSlBFRyBwcmVwcm9jZXNzaW5nIG9yIHBvc3Rwcm9jZXNzaW5nIHdpbGwgaGF2ZSB0byBjb250ZW5kCit3aXRoIGNvbXBvbmVudC13aXNlIHN0b3JhZ2UuKQorCisKK0FycmF5cyBvZiBEQ1QtY29lZmZpY2llbnQgdmFsdWVzIHVzZSB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlOgorCisgICAgdHlwZWRlZiBzaG9ydCBKQ09FRjsJCWEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgdHlwZWRlZiBKQ09FRiBKQkxPQ0tbRENUU0laRTJdOwlhbiA4eDggYmxvY2sgb2YgY29lZmZpY2llbnRzCisgICAgdHlwZWRlZiBKQkxPQ0sgKkpCTE9DS1JPVzsJCXB0ciB0byBvbmUgaG9yaXpvbnRhbCByb3cgb2YgOHg4IGJsb2NrcworICAgIHR5cGVkZWYgSkJMT0NLUk9XICpKQkxPQ0tBUlJBWTsJcHRyIHRvIGEgbGlzdCBvZiBzdWNoIHJvd3MKKyAgICB0eXBlZGVmIEpCTE9DS0FSUkFZICpKQkxPQ0tJTUFHRTsJcHRyIHRvIGEgbGlzdCBvZiBjb2xvciBjb21wb25lbnQgYXJyYXlzCisKK1RoZSB1bmRlcmx5aW5nIHR5cGUgaXMgYXQgbGVhc3QgYSAxNi1iaXQgc2lnbmVkIGludGVnZXI7IHdoaWxlICJzaG9ydCIgaXMgYmlnCitlbm91Z2ggb24gYWxsIG1hY2hpbmVzIG9mIGludGVyZXN0LCBvbiBzb21lIG1hY2hpbmVzIGl0IGlzIHByZWZlcmFibGUgdG8gdXNlCisiaW50IiBmb3Igc3BlZWQgcmVhc29ucywgZGVzcGl0ZSB0aGUgc3RvcmFnZSBjb3N0LiAgQ29lZmZpY2llbnRzIGFyZSBncm91cGVkCitpbnRvIDh4OCBibG9ja3MgKGJ1dCB3ZSBhbHdheXMgdXNlICNkZWZpbmVzIERDVFNJWkUgYW5kIERDVFNJWkUyIHJhdGhlciB0aGFuCisiOCIgYW5kICI2NCIpLgorCitUaGUgY29udGVudHMgb2YgYSBjb2VmZmljaWVudCBibG9jayBtYXkgYmUgaW4gZWl0aGVyICJuYXR1cmFsIiBvciB6aWd6YWdnZWQKK29yZGVyLCBhbmQgbWF5IGJlIHRydWUgdmFsdWVzIG9yIGRpdmlkZWQgYnkgdGhlIHF1YW50aXphdGlvbiBjb2VmZmljaWVudHMsCitkZXBlbmRpbmcgb24gd2hlcmUgdGhlIGJsb2NrIGlzIGluIHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lLiAgSW4gdGhlIGN1cnJlbnQKK2xpYnJhcnksIGNvZWZmaWNpZW50IGJsb2NrcyBhcmUga2VwdCBpbiBuYXR1cmFsIG9yZGVyIGV2ZXJ5d2hlcmU7IHRoZSBlbnRyb3B5Citjb2RlY3MgemlnemFnIG9yIGRlemlnemFnIHRoZSBkYXRhIGFzIGl0IGlzIHdyaXR0ZW4gb3IgcmVhZC4gIFRoZSBibG9ja3MKK2NvbnRhaW4gcXVhbnRpemVkIGNvZWZmaWNpZW50cyBldmVyeXdoZXJlIG91dHNpZGUgdGhlIERDVC9JRENUIHN1YnN5c3RlbXMuCisoVGhpcyBsYXR0ZXIgZGVjaXNpb24gbWF5IG5lZWQgdG8gYmUgcmV2aXNpdGVkIHRvIHN1cHBvcnQgdmFyaWFibGUKK3F1YW50aXphdGlvbiBhIGxhIEpQRUcgUGFydCAzLikKKworTm90aWNlIHRoYXQgdGhlIGFsbG9jYXRpb24gdW5pdCBpcyBub3cgYSByb3cgb2YgOHg4IGJsb2NrcywgY29ycmVzcG9uZGluZyB0bworZWlnaHQgcm93cyBvZiBzYW1wbGVzLiAgT3RoZXJ3aXNlIHRoZSBzdHJ1Y3R1cmUgaXMgbXVjaCB0aGUgc2FtZSBhcyBmb3IKK3NhbXBsZXMsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29ucy4KKworT24gbWFjaGluZXMgd2hlcmUgbWFsbG9jKCkgY2FuJ3QgaGFuZGxlIGEgcmVxdWVzdCBiaWdnZXIgdGhhbiA2NEtiLCB0aGlzIGRhdGEKK3N0cnVjdHVyZSBsaW1pdHMgdXMgdG8gcm93cyBvZiBsZXNzIHRoYW4gNTEyIEpCTE9DS3MsIG9yIGEgcGljdHVyZSB3aWR0aCBvZgorNDAwMCsgcGl4ZWxzLiAgVGhpcyBzZWVtcyBhbiBhY2NlcHRhYmxlIHJlc3RyaWN0aW9uLgorCisKK09uIDgweDg2IG1hY2hpbmVzLCB0aGUgYm90dG9tLWxldmVsIHBvaW50ZXIgdHlwZXMgKEpTQU1QUk9XIGFuZCBKQkxPQ0tST1cpCittdXN0IGJlIGRlY2xhcmVkIGFzICJmYXIiIHBvaW50ZXJzLCBidXQgdGhlIHVwcGVyIGxldmVscyBjYW4gYmUgIm5lYXIiCisoaW1wbHlpbmcgdGhhdCB0aGUgcG9pbnRlciBsaXN0cyBhcmUgYWxsb2NhdGVkIGluIHRoZSBEUyBzZWdtZW50KS4KK1dlIHVzZSBhICNkZWZpbmUgc3ltYm9sIEZBUiwgd2hpY2ggZXhwYW5kcyB0byB0aGUgImZhciIga2V5d29yZCB3aGVuCitjb21waWxpbmcgb24gODB4ODYgbWFjaGluZXMgYW5kIHRvIG5vdGhpbmcgZWxzZXdoZXJlLgorCisKKyoqKiBTdXNwZW5kYWJsZSBwcm9jZXNzaW5nICoqKgorCitJbiBzb21lIGFwcGxpY2F0aW9ucyBpdCBpcyBkZXNpcmFibGUgdG8gdXNlIHRoZSBKUEVHIGxpYnJhcnkgYXMgYW4KK2luY3JlbWVudGFsLCBtZW1vcnktdG8tbWVtb3J5IGZpbHRlci4gIEluIHRoaXMgc2l0dWF0aW9uIHRoZSBkYXRhIHNvdXJjZSBvcgorZGVzdGluYXRpb24gbWF5IGJlIGEgbGltaXRlZC1zaXplIGJ1ZmZlciwgYW5kIHdlIGNhbid0IHJlbHkgb24gYmVpbmcgYWJsZSB0bworZW1wdHkgb3IgcmVmaWxsIHRoZSBidWZmZXIgYXQgYXJiaXRyYXJ5IHRpbWVzLiAgSW5zdGVhZCB0aGUgYXBwbGljYXRpb24gd291bGQKK2xpa2UgdG8gaGF2ZSBjb250cm9sIHJldHVybiBmcm9tIHRoZSBsaWJyYXJ5IGF0IGJ1ZmZlciBvdmVyZmxvdy91bmRlcnJ1biwgYW5kCit0aGVuIHJlc3VtZSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGF0IGEgbGF0ZXIgdGltZS4KKworVGhpcyBzY2VuYXJpbyBpcyBzdXBwb3J0ZWQgZm9yIHNpbXBsZSBjYXNlcy4gIChGb3IgYW55dGhpbmcgbW9yZSBjb21wbGV4LCB3ZQorcmVjb21tZW5kIHRoYXQgdGhlIGFwcGxpY2F0aW9uICJiaXRlIHRoZSBidWxsZXQiIGFuZCBkZXZlbG9wIHJlYWwgbXVsdGl0YXNraW5nCitjYXBhYmlsaXR5LikgIFRoZSBsaWJqcGVnLmRvYyBmaWxlIGdvZXMgaW50byBtb3JlIGRldGFpbCBhYm91dCB0aGUgdXNhZ2UgYW5kCitsaW1pdGF0aW9ucyBvZiB0aGlzIGNhcGFiaWxpdHk7IGhlcmUgd2UgYWRkcmVzcyB0aGUgaW1wbGljYXRpb25zIGZvciBsaWJyYXJ5CitzdHJ1Y3R1cmUuCisKK1RoZSBlc3NlbmNlIG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGVudHJvcHkgY29kZWMgKGNvZGVyIG9yIGRlY29kZXIpIG11c3QKK2JlIHByZXBhcmVkIHRvIHN0b3AgYXQgYXJiaXRyYXJ5IHRpbWVzLiAgSW4gdHVybiwgdGhlIGNvbnRyb2xsZXJzIHRoYXQgY2FsbAordGhlIGVudHJvcHkgY29kZWMgbXVzdCBiZSBhYmxlIHRvIHN0b3AgYmVmb3JlIGhhdmluZyBwcm9kdWNlZCBvciBjb25zdW1lZCBhbGwKK3RoZSBkYXRhIHRoYXQgdGhleSBub3JtYWxseSB3b3VsZCBoYW5kbGUgaW4gb25lIGNhbGwuICBUaGF0IHBhcnQgaXMgcmVhc29uYWJseQorc3RyYWlnaHRmb3J3YXJkOiB3ZSBtYWtlIHRoZSBjb250cm9sbGVyIGNhbGwgaW50ZXJmYWNlcyBpbmNsdWRlICJwcm9ncmVzcworY291bnRlcnMiIHdoaWNoIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZGF0YSBjaHVua3Mgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgYW5kCit3ZSByZXF1aXJlIGNhbGxlcnMgdG8gdGVzdCB0aGUgY291bnRlciByYXRoZXIgdGhhbiBqdXN0IGFzc3VtZSBhbGwgb2YgdGhlIGRhdGEKK3dhcyBwcm9jZXNzZWQuCisKK1JhdGhlciB0aGFuIHRyeWluZyB0byByZXN0YXJ0IGF0IGFuIGFyYml0cmFyeSBwb2ludCwgdGhlIGN1cnJlbnQgSHVmZm1hbgorY29kZWNzIGFyZSBkZXNpZ25lZCB0byByZXN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgTUNVIGFmdGVyIGEKK3N1c3BlbnNpb24gZHVlIHRvIGJ1ZmZlciBvdmVyZmxvdy91bmRlcnJ1bi4gIEF0IHRoZSBzdGFydCBvZiBlYWNoIGNhbGwsIHRoZQorY29kZWMncyBpbnRlcm5hbCBzdGF0ZSBpcyBsb2FkZWQgZnJvbSBwZXJtYW5lbnQgc3RvcmFnZSAoaW4gdGhlIEpQRUcgb2JqZWN0CitzdHJ1Y3R1cmVzKSBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gIE9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgTUNVLCB0aGUKK3Blcm1hbmVudCBzdGF0ZSBpcyB1cGRhdGVkLiAgKFRoaXMgY29weWluZyBpcyBub3QgdmVyeSBleHBlbnNpdmUsIGFuZCBtYXkgZXZlbgorbGVhZCB0byAqaW1wcm92ZWQqIHBlcmZvcm1hbmNlIGlmIHRoZSBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIHJlZ2lzdGVyaXplZC4pCitJZiBhIHN1c3BlbnNpb24gb2NjdXJzLCB0aGUgY29kZWMgc2ltcGx5IHJldHVybnMgd2l0aG91dCB1cGRhdGluZyB0aGUgc3RhdGUsCit0aHVzIGVmZmVjdGl2ZWx5IHJldmVydGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIE1DVS4gIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMKK2xlYXZpbmcgc29tZSBkYXRhIHVucHJvY2Vzc2VkIGluIHRoZSBzb3VyY2UvZGVzdGluYXRpb24gYnVmZmVyIChpZSwgdGhlCitjb21wcmVzc2VkIHBhcnRpYWwgTUNVKS4gIFRoZSBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGUgaW50ZXJmYWNlcyBhcmUKK3NwZWNpZmllZCBzbyBhcyB0byBtYWtlIHRoaXMgcG9zc2libGUuICBUaGlzIGFsc28gaW1wbGllcyB0aGF0IHRoZSBkYXRhIGJ1ZmZlcgorbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHdvcnN0LWNhc2UgY29tcHJlc3NlZCBNQ1U7IGEgY291cGxlIHRob3VzYW5kCitieXRlcyBzaG91bGQgYmUgZW5vdWdoLgorCitJbiBhIHN1Y2Nlc3NpdmUtYXBwcm94aW1hdGlvbiBBQyByZWZpbmVtZW50IHNjYW4sIHRoZSBwcm9ncmVzc2l2ZSBIdWZmbWFuCitkZWNvZGVyIGhhcyB0byBiZSBhYmxlIHRvIHVuZG8gYXNzaWdubWVudHMgb2YgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudHMgaWYgaXQKK3N1c3BlbmRzIGJlZm9yZSB0aGUgTUNVIGlzIGNvbXBsZXRlLCBzaW5jZSBkZWNvZGluZyByZXF1aXJlcyBkaXN0aW5ndWlzaGluZworcHJldmlvdXNseS16ZXJvIGFuZCBwcmV2aW91c2x5LW5vbnplcm8gY29lZmZpY2llbnRzLiAgVGhpcyBpcyBhIGJpdCB0ZWRpb3VzCitidXQgcHJvYmFibHkgd29uJ3QgaGF2ZSBtdWNoIGVmZmVjdCBvbiBwZXJmb3JtYW5jZS4gIE90aGVyIHZhcmlhbnRzIG9mIEh1ZmZtYW4KK2RlY29kaW5nIG5lZWQgbm90IHdvcnJ5IGFib3V0IHRoaXMsIHNpbmNlIHRoZXkgd2lsbCBqdXN0IHN0b3JlIHRoZSBzYW1lIHZhbHVlcworYWdhaW4gaWYgZm9yY2VkIHRvIHJlcGVhdCB0aGUgTUNVLgorCitUaGlzIGFwcHJvYWNoIHdvdWxkIHByb2JhYmx5IG5vdCB3b3JrIGZvciBhbiBhcml0aG1ldGljIGNvZGVjLCBzaW5jZSBpdHMKK21vZGlmaWFibGUgc3RhdGUgaXMgcXVpdGUgbGFyZ2UgYW5kIGNvdWxkbid0IGJlIGNvcGllZCBjaGVhcGx5LiAgSW5zdGVhZCBpdAord291bGQgaGF2ZSB0byBzdXNwZW5kIGFuZCByZXN1bWUgZXhhY3RseSBhdCB0aGUgcG9pbnQgb2YgdGhlIGJ1ZmZlciBlbmQuCisKK1RoZSBKUEVHIG1hcmtlciByZWFkZXIgaXMgZGVzaWduZWQgdG8gY29wZSB3aXRoIHN1c3BlbnNpb24gYXQgYW4gYXJiaXRyYXJ5Citwb2ludC4gIEl0IGRvZXMgc28gYnkgYmFja2luZyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hcmtlciBwYXJhbWV0ZXIgc2VnbWVudCwKK3NvIHRoZSBkYXRhIGJ1ZmZlciBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgbGFyZ2VzdCBtYXJrZXIgb2YgaW50ZXJlc3QuCitBZ2FpbiwgYSBjb3VwbGUgS0Igc2hvdWxkIGJlIGFkZXF1YXRlLiAgKEEgc3BlY2lhbCAic2tpcCIgY29udmVudGlvbiBpcyB1c2VkCit0byBieXBhc3MgQ09NIGFuZCBBUFBuIG1hcmtlcnMsIHNvIHRoZXNlIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyIHNpemUKK3dpdGhvdXQgY2F1c2luZyBwcm9ibGVtczsgb3RoZXJ3aXNlIGEgNjRLIGJ1ZmZlciB3b3VsZCBiZSBuZWVkZWQgaW4gdGhlIHdvcnN0CitjYXNlLikKKworVGhlIEpQRUcgbWFya2VyIHdyaXRlciBjdXJyZW50bHkgZG9lcyAqbm90KiBjb3BlIHdpdGggc3VzcGVuc2lvbi4gIEkgZmVlbCB0aGF0Cit0aGlzIGlzIG5vdCBuZWNlc3Nhcnk7IGl0IGlzIG11Y2ggZWFzaWVyIHNpbXBseSB0byByZXF1aXJlIHRoZSBhcHBsaWNhdGlvbiB0bworZW5zdXJlIHRoZXJlIGlzIGVub3VnaCBidWZmZXIgc3BhY2UgYmVmb3JlIHN0YXJ0aW5nLiAgKEFuIGVtcHR5IDJLIGJ1ZmZlciBpcworbW9yZSB0aGFuIHN1ZmZpY2llbnQgZm9yIHRoZSBoZWFkZXIgbWFya2VyczsgYW5kIGVuc3VyaW5nIHRoZXJlIGFyZSBhIGRvemVuIG9yCit0d28gYnl0ZXMgYXZhaWxhYmxlIGJlZm9yZSBjYWxsaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgd2lsbCBzdWZmaWNlIGZvciB0aGUKK3RyYWlsZXIuKSAgVGhpcyB3b3VsZCBub3Qgd29yayBmb3Igd3JpdGluZyBtdWx0aS1zY2FuIEpQRUcgZmlsZXMsIGJ1dAord2Ugc2ltcGx5IGRvIG5vdCBpbnRlbmQgdG8gc3VwcG9ydCB0aGF0IGNhcGFiaWxpdHkgd2l0aCBzdXNwZW5zaW9uLgorCisKKyoqKiBNZW1vcnkgbWFuYWdlciBzZXJ2aWNlcyAqKioKKworVGhlIEpQRUcgbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyIGNvbnRyb2xzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBvZgorbWVtb3J5LCBhbmQgaXQgbWFuYWdlcyBsYXJnZSAidmlydHVhbCIgZGF0YSBhcnJheXMgb24gbWFjaGluZXMgd2hlcmUgdGhlCitvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdmlydHVhbCBtZW1vcnkuICBOb3RlIHRoYXQgdGhlIHNhbWUKK21lbW9yeSBtYW5hZ2VyIHNlcnZlcyBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbnMuCisKK0luIGFsbCBjYXNlcywgYWxsb2NhdGVkIG9iamVjdHMgYXJlIHRpZWQgdG8gYSBwYXJ0aWN1bGFyIGNvbXByZXNzaW9uIG9yCitkZWNvbXByZXNzaW9uIG1hc3RlciByZWNvcmQsIGFuZCB0aGV5IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiB0aGF0IG1hc3RlcgorcmVjb3JkIGlzIGRlc3Ryb3llZC4KKworVGhlIG1lbW9yeSBtYW5hZ2VyIGRvZXMgbm90IHByb3ZpZGUgZXhwbGljaXQgZGVhbGxvY2F0aW9uIG9mIG9iamVjdHMuCitJbnN0ZWFkLCBvYmplY3RzIGFyZSBjcmVhdGVkIGluICJwb29scyIgb2YgZnJlZSBzdG9yYWdlLCBhbmQgYSB3aG9sZSBwb29sCitjYW4gYmUgZnJlZWQgYXQgb25jZS4gIFRoaXMgYXBwcm9hY2ggaGVscHMgcHJldmVudCBzdG9yYWdlLWxlYWsgYnVncywgYW5kCitpdCBzcGVlZHMgdXAgb3BlcmF0aW9ucyB3aGVuZXZlciBtYWxsb2MvZnJlZSBhcmUgc2xvdyAoYXMgdGhleSBvZnRlbiBhcmUpLgorVGhlIHBvb2xzIGNhbiBiZSByZWdhcmRlZCBhcyBsaWZldGltZSBpZGVudGlmaWVycyBmb3Igb2JqZWN0cy4gIFR3bworcG9vbHMvbGlmZXRpbWVzIGFyZSBkZWZpbmVkOgorICAqIEpQT09MX1BFUk1BTkVOVAlsYXN0cyB1bnRpbCBtYXN0ZXIgcmVjb3JkIGlzIGRlc3Ryb3llZAorICAqIEpQT09MX0lNQUdFCQlsYXN0cyB1bnRpbCBkb25lIHdpdGggaW1hZ2UgKEpQRUcgZGF0YXN0cmVhbSkKK1Blcm1hbmVudCBsaWZldGltZSBpcyB1c2VkIGZvciBwYXJhbWV0ZXJzIGFuZCB0YWJsZXMgdGhhdCBzaG91bGQgYmUgY2FycmllZAorYWNyb3NzIGZyb20gb25lIGRhdGFzdHJlYW0gdG8gYW5vdGhlcjsgdGhpcyBpbmNsdWRlcyBhbGwgYXBwbGljYXRpb24tdmlzaWJsZQorcGFyYW1ldGVycy4gIEltYWdlIGxpZmV0aW1lIGlzIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gIChBIHRoaXJkIGxpZmV0aW1lLAorSlBPT0xfUEFTUyA9IG9uZSBwcm9jZXNzaW5nIHBhc3MsIHdhcyBvcmlnaW5hbGx5IHBsYW5uZWQuICBIb3dldmVyIGl0IHdhcworZHJvcHBlZCBhcyBub3QgYmVpbmcgd29ydGh3aGlsZS4gIFRoZSBhY3R1YWwgdXNhZ2UgcGF0dGVybnMgYXJlIHN1Y2ggdGhhdCB0aGUKK3BlYWsgbWVtb3J5IHVzYWdlIHdvdWxkIGJlIGFib3V0IHRoZSBzYW1lIGFueXdheTsgYW5kIGhhdmluZyBwZXItcGFzcyBzdG9yYWdlCitzdWJzdGFudGlhbGx5IGNvbXBsaWNhdGVzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhbGxvY2F0aW9uIHJ1bGVzIC0tLSBzZWUgYmVsb3cuKQorCitUaGUgbWVtb3J5IG1hbmFnZXIgZGVhbHMgd2l0aCB0aHJlZSBraW5kcyBvZiBvYmplY3Q6CisxLiAiU21hbGwiIG9iamVjdHMuICBUeXBpY2FsbHkgdGhlc2UgcmVxdWlyZSBubyBtb3JlIHRoYW4gMTBLLTIwSyB0b3RhbC4KKzIuICJMYXJnZSIgb2JqZWN0cy4gIFRoZXNlIG1heSByZXF1aXJlIHRlbnMgdG8gaHVuZHJlZHMgb2YgSyBkZXBlbmRpbmcgb24KKyAgIGltYWdlIHNpemUuICBTZW1hbnRpY2FsbHkgdGhleSBiZWhhdmUgdGhlIHNhbWUgYXMgc21hbGwgb2JqZWN0cywgYnV0IHdlCisgICBkaXN0aW5ndWlzaCB0aGVtIGZvciB0d28gcmVhc29uczoKKyAgICAgKiBPbiBNUy1ET1MgbWFjaGluZXMsIGxhcmdlIG9iamVjdHMgYXJlIHJlZmVyZW5jZWQgYnkgRkFSIHBvaW50ZXJzLAorICAgICAgIHNtYWxsIG9iamVjdHMgYnkgTkVBUiBwb2ludGVycy4KKyAgICAgKiBQb29sIGFsbG9jYXRpb24gaGV1cmlzdGljcyBtYXkgZGlmZmVyIGZvciBsYXJnZSBhbmQgc21hbGwgb2JqZWN0cy4KKyAgIE5vdGUgdGhhdCBpbmRpdmlkdWFsICJsYXJnZSIgb2JqZWN0cyBjYW5ub3QgZXhjZWVkIHRoZSBzaXplIGFsbG93ZWQgYnkKKyAgIHR5cGUgc2l6ZV90LCB3aGljaCBtYXkgYmUgNjRLIG9yIGxlc3Mgb24gc29tZSBtYWNoaW5lcy4KKzMuICJWaXJ0dWFsIiBvYmplY3RzLiAgVGhlc2UgYXJlIGxhcmdlIDItRCBhcnJheXMgb2YgSlNBTVBMRXMgb3IgSkJMT0NLcworICAgKHR5cGljYWxseSBsYXJnZSBlbm91Z2ggZm9yIHRoZSBlbnRpcmUgaW1hZ2UgYmVpbmcgcHJvY2Vzc2VkKS4gIFRoZQorICAgbWVtb3J5IG1hbmFnZXIgcHJvdmlkZXMgc3RyaXB3aXNlIGFjY2VzcyB0byB0aGVzZSBhcnJheXMuICBPbiBtYWNoaW5lcworICAgd2l0aG91dCB2aXJ0dWFsIG1lbW9yeSwgdGhlIHJlc3Qgb2YgdGhlIGFycmF5IG1heSBiZSBzd2FwcGVkIG91dCB0byBhCisgICB0ZW1wb3JhcnkgZmlsZS4KKworKE5vdGU6IEpTQU1QQVJSQVkgYW5kIEpCTE9DS0FSUkFZIGRhdGEgc3RydWN0dXJlcyBhcmUgYSBjb21iaW5hdGlvbiBvZiBsYXJnZQorb2JqZWN0cyBmb3IgdGhlIGRhdGEgcHJvcGVyIGFuZCBzbWFsbCBvYmplY3RzIGZvciB0aGUgcm93IHBvaW50ZXJzLiAgRm9yCitjb252ZW5pZW5jZSBhbmQgc3BlZWQsIHRoZSBtZW1vcnkgbWFuYWdlciBwcm92aWRlcyBzaW5nbGUgcm91dGluZXMgdG8gY3JlYXRlCit0aGVzZSBzdHJ1Y3R1cmVzLiAgU2ltaWxhcmx5LCB2aXJ0dWFsIGFycmF5cyBpbmNsdWRlIGEgc21hbGwgY29udHJvbCBibG9jaworYW5kIGEgSlNBTVBBUlJBWSBvciBKQkxPQ0tBUlJBWSB3b3JraW5nIGJ1ZmZlciwgYWxsIGNyZWF0ZWQgd2l0aCBvbmUgY2FsbC4pCisKK0luIHRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uLCB2aXJ0dWFsIGFycmF5cyBhcmUgb25seSBwZXJtaXR0ZWQgdG8gaGF2ZSBpbWFnZQorbGlmZXNwYW4uICAoUGVybWFuZW50IGxpZmVzcGFuIHdvdWxkIG5vdCBiZSByZWFzb25hYmxlLCBhbmQgcGFzcyBsaWZlc3BhbiBpcworbm90IHZlcnkgdXNlZnVsIHNpbmNlIGEgdmlydHVhbCBhcnJheSdzIHJhaXNvbiBkJ2V0cmUgaXMgdG8gc3RvcmUgZGF0YSBmb3IKK211bHRpcGxlIHBhc3NlcyB0aHJvdWdoIHRoZSBpbWFnZS4pICBXZSBhbHNvIGV4cGVjdCB0aGF0IG9ubHkgInNtYWxsIiBvYmplY3RzCit3aWxsIGJlIGdpdmVuIHBlcm1hbmVudCBsaWZlc3BhbiwgdGhvdWdoIHRoaXMgcmVzdHJpY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5Cit0aGUgbWVtb3J5IG1hbmFnZXIuCisKK0luIGEgbm9uLXZpcnR1YWwtbWVtb3J5IG1hY2hpbmUsIHNvbWUgcGVyZm9ybWFuY2UgYmVuZWZpdCBjYW4gYmUgZ2FpbmVkIGJ5CittYWtpbmcgdGhlIGluLW1lbW9yeSBidWZmZXJzIGZvciB2aXJ0dWFsIGFycmF5cyBiZSBhcyBsYXJnZSBhcyBwb3NzaWJsZS4KKyhGb3Igc21hbGwgaW1hZ2VzLCB0aGUgYnVmZmVycyBtaWdodCBmaXQgZW50aXJlbHkgaW4gbWVtb3J5LCBzbyBibGluZAorc3dhcHBpbmcgd291bGQgYmUgdmVyeSB3YXN0ZWZ1bC4pICBUaGUgbWVtb3J5IG1hbmFnZXIgd2lsbCBhZGp1c3QgdGhlIGhlaWdodAorb2YgdGhlIGJ1ZmZlcnMgdG8gZml0IHdpdGhpbiBhIHByZXNwZWNpZmllZCBtYXhpbXVtIG1lbW9yeSB1c2FnZS4gIEluIG9yZGVyCit0byBkbyB0aGlzIGluIGEgcmVhc29uYWJseSBvcHRpbWFsIGZhc2hpb24sIHRoZSBtYW5hZ2VyIG5lZWRzIHRvIGFsbG9jYXRlIGFsbAorb2YgdGhlIHZpcnR1YWwgYXJyYXlzIGF0IG9uY2UuICBUaGVyZWZvcmUsIHRoZXJlIGlzbid0IGEgb25lLXN0ZXAgYWxsb2NhdGlvbgorcm91dGluZSBmb3IgdmlydHVhbCBhcnJheXM7IGluc3RlYWQsIHRoZXJlIGlzIGEgInJlcXVlc3QiIHJvdXRpbmUgdGhhdCBzaW1wbHkKK2FsbG9jYXRlcyB0aGUgY29udHJvbCBibG9jaywgYW5kIGEgInJlYWxpemUiIHJvdXRpbmUgKGNhbGxlZCBqdXN0IG9uY2UpIHRoYXQKK2RldGVybWluZXMgc3BhY2UgYWxsb2NhdGlvbiBhbmQgY3JlYXRlcyBhbGwgb2YgdGhlIGFjdHVhbCBidWZmZXJzLiAgVGhlCityZWFsaXplIHJvdXRpbmUgbXVzdCBhbGxvdyBmb3Igc3BhY2Ugb2NjdXBpZWQgYnkgbm9uLXZpcnR1YWwgbGFyZ2Ugb2JqZWN0cy4KKyhXZSBkb24ndCBib3RoZXIgdG8gZmFjdG9yIGluIHRoZSBzcGFjZSBuZWVkZWQgZm9yIHNtYWxsIG9iamVjdHMsIG9uIHRoZQorZ3JvdW5kcyB0aGF0IGl0IGlzbid0IHdvcnRoIHRoZSB0cm91YmxlLikKKworVG8gc3VwcG9ydCBhbGwgdGhpcywgd2UgZXN0YWJsaXNoIHRoZSBmb2xsb3dpbmcgcHJvdG9jb2wgZm9yIGRvaW5nIGJ1c2luZXNzCit3aXRoIHRoZSBtZW1vcnkgbWFuYWdlcjoKKyAgMS4gTW9kdWxlcyBtdXN0IHJlcXVlc3QgdmlydHVhbCBhcnJheXMgKHdoaWNoIG1heSBoYXZlIG9ubHkgaW1hZ2UgbGlmZXNwYW4pCisgICAgIGR1cmluZyB0aGUgaW5pdGlhbCBzZXR1cCBwaGFzZSwgaS5lLiwgaW4gdGhlaXIgamluaXRfeHh4IHJvdXRpbmVzLgorICAyLiBBbGwgImxhcmdlIiBvYmplY3RzIChpbmNsdWRpbmcgSlNBTVBBUlJBWXMgYW5kIEpCTE9DS0FSUkFZcykgbXVzdCBhbHNvIGJlCisgICAgIGFsbG9jYXRlZCBkdXJpbmcgaW5pdGlhbCBzZXR1cC4KKyAgMy4gcmVhbGl6ZV92aXJ0X2FycmF5cyB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgY29tcGxldGlvbiBvZiBpbml0aWFsIHNldHVwLgorICAgICBUaGUgYWJvdmUgY29udmVudGlvbnMgZW5zdXJlIHRoYXQgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKyAgICAgZm9yIGl0IHRvIGNob29zZSBhIGdvb2Qgc2l6ZSBmb3IgdmlydHVhbCBhcnJheSBidWZmZXJzLgorU21hbGwgb2JqZWN0cyBvZiBhbnkgbGlmZXNwYW4gbWF5IGJlIGFsbG9jYXRlZCBhdCBhbnkgdGltZS4gIFdlIGV4cGVjdCB0aGF0Cit0aGUgdG90YWwgc3BhY2UgdXNlZCBmb3Igc21hbGwgb2JqZWN0cyB3aWxsIGJlIHNtYWxsIGVub3VnaCB0byBiZSBuZWdsaWdpYmxlCitpbiB0aGUgcmVhbGl6ZV92aXJ0X2FycmF5cyBjb21wdXRhdGlvbi4KKworSW4gYSB2aXJ0dWFsLW1lbW9yeSBtYWNoaW5lLCB3ZSBzaW1wbHkgcHJldGVuZCB0aGF0IHRoZSBhdmFpbGFibGUgc3BhY2UgaXMKK2luZmluaXRlLCB0aHVzIGNhdXNpbmcgcmVhbGl6ZV92aXJ0X2FycmF5cyB0byBkZWNpZGUgdGhhdCBpdCBjYW4gYWxsb2NhdGUgYWxsCit0aGUgdmlydHVhbCBhcnJheXMgYXMgZnVsbC1zaXplIGluLW1lbW9yeSBidWZmZXJzLiAgVGhlIG92ZXJoZWFkIG9mIHRoZQordmlydHVhbC1hcnJheSBhY2Nlc3MgcHJvdG9jb2wgaXMgdmVyeSBzbWFsbCB3aGVuIG5vIHN3YXBwaW5nIG9jY3Vycy4KKworQSB2aXJ0dWFsIGFycmF5IGNhbiBiZSBzcGVjaWZpZWQgdG8gYmUgInByZS16ZXJvZWQiOyB3aGVuIHRoaXMgZmxhZyBpcyBzZXQsCituZXZlci15ZXQtd3JpdHRlbiBzZWN0aW9ucyBvZiB0aGUgYXJyYXkgYXJlIHNldCB0byB6ZXJvIGJlZm9yZSBiZWluZyBtYWRlCithdmFpbGFibGUgdG8gdGhlIGNhbGxlci4gIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBuZXZlci13cml0dGVuIHNlY3Rpb25zCitvZiB0aGUgYXJyYXkgY29udGFpbiBnYXJiYWdlLiAgKFRoaXMgZmVhdHVyZSBleGlzdHMgcHJpbWFyaWx5IGJlY2F1c2UgdGhlCitlcXVpdmFsZW50IGxvZ2ljIHdvdWxkIG90aGVyd2lzZSBiZSBuZWVkZWQgaW4gamRjb2VmY3QuYyBmb3IgcHJvZ3Jlc3NpdmUKK0pQRUcgbW9kZTsgd2UgbWF5IGFzIHdlbGwgbWFrZSBpdCBhdmFpbGFibGUgZm9yIHBvc3NpYmxlIG90aGVyIHVzZXMuKQorCitUaGUgZmlyc3Qgd3JpdGUgcGFzcyBvbiBhIHZpcnR1YWwgYXJyYXkgaXMgcmVxdWlyZWQgdG8gb2NjdXIgaW4gdG9wLXRvLWJvdHRvbQorb3JkZXI7IHJlYWQgcGFzc2VzLCBhcyB3ZWxsIGFzIGFueSB3cml0ZSBwYXNzZXMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSwgbWF5CithY2Nlc3MgdGhlIGFycmF5IGluIGFueSBvcmRlci4gIFRoaXMgcmVzdHJpY3Rpb24gZXhpc3RzIHBhcnRseSB0byBzaW1wbGlmeQordGhlIHZpcnR1YWwgYXJyYXkgY29udHJvbCBsb2dpYywgYW5kIHBhcnRseSBiZWNhdXNlIHNvbWUgZmlsZSBzeXN0ZW1zIG1heSBub3QKK3N1cHBvcnQgc2Vla2luZyBiZXlvbmQgdGhlIGN1cnJlbnQgZW5kLW9mLWZpbGUgaW4gYSB0ZW1wb3JhcnkgZmlsZS4gIFRoZSBtYWluCitpbXBsaWNhdGlvbiBvZiB0aGlzIHJlc3RyaWN0aW9uIGlzIHRoYXQgcmVhcnJhbmdlbWVudCBvZiByb3dzIChzdWNoIGFzCitjb252ZXJ0aW5nIHRvcC10by1ib3R0b20gZGF0YSBvcmRlciB0byBib3R0b20tdG8tdG9wKSBtdXN0IGJlIGhhbmRsZWQgd2hpbGUKK3JlYWRpbmcgZGF0YSBvdXQgb2YgdGhlIHZpcnR1YWwgYXJyYXksIG5vdCB3aGlsZSBwdXR0aW5nIGl0IGluLgorCisKKyoqKiBNZW1vcnkgbWFuYWdlciBpbnRlcm5hbCBzdHJ1Y3R1cmUgKioqCisKK1RvIGlzb2xhdGUgc3lzdGVtIGRlcGVuZGVuY2llcyBhcyBtdWNoIGFzIHBvc3NpYmxlLCB3ZSBoYXZlIGJyb2tlbiB0aGUKK21lbW9yeSBtYW5hZ2VyIGludG8gdHdvIHBhcnRzLiAgVGhlcmUgaXMgYSByZWFzb25hYmx5IHN5c3RlbS1pbmRlcGVuZGVudAorImZyb250IGVuZCIgKGptZW1tZ3IuYykgYW5kIGEgImJhY2sgZW5kIiB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGNvZGUKK2xpa2VseSB0byBjaGFuZ2UgYWNyb3NzIHN5c3RlbXMuICBBbGwgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IG1ldGhvZHMKK291dGxpbmVkIGFib3ZlIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgZnJvbnQgZW5kLiAgVGhlIGJhY2sgZW5kIHByb3ZpZGVzCit0aGUgZm9sbG93aW5nIHJvdXRpbmVzIGZvciB1c2UgYnkgdGhlIGZyb250IGVuZCAobm9uZSBvZiB0aGVzZSByb3V0aW5lcworYXJlIGtub3duIHRvIHRoZSByZXN0IG9mIHRoZSBKUEVHIGNvZGUpOgorCitqcGVnX21lbV9pbml0LCBqcGVnX21lbV90ZXJtCXN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24vc2h1dGRvd24KKworanBlZ19nZXRfc21hbGwsIGpwZWdfZnJlZV9zbWFsbAlpbnRlcmZhY2UgdG8gbWFsbG9jIGFuZCBmcmVlIGxpYnJhcnkgcm91dGluZXMKKwkJCQkob3IgdGhlaXIgZXF1aXZhbGVudHMpCisKK2pwZWdfZ2V0X2xhcmdlLCBqcGVnX2ZyZWVfbGFyZ2UJaW50ZXJmYWNlIHRvIEZBUiBtYWxsb2MvZnJlZSBpbiBNU0RPUyBtYWNoaW5lczsKKwkJCQllbHNlIHVzdWFsbHkgdGhlIHNhbWUgYXMKKwkJCQlqcGVnX2dldF9zbWFsbC9qcGVnX2ZyZWVfc21hbGwKKworanBlZ19tZW1fYXZhaWxhYmxlCQllc3RpbWF0ZSBhdmFpbGFibGUgbWVtb3J5CisKK2pwZWdfb3Blbl9iYWNraW5nX3N0b3JlCQljcmVhdGUgYSBiYWNraW5nLXN0b3JlIG9iamVjdAorCityZWFkX2JhY2tpbmdfc3RvcmUsCQltYW5pcHVsYXRlIGEgYmFja2luZy1zdG9yZSBvYmplY3QKK3dyaXRlX2JhY2tpbmdfc3RvcmUsCitjbG9zZV9iYWNraW5nX3N0b3JlCisKK09uIHNvbWUgc3lzdGVtcyB0aGVyZSB3aWxsIGJlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBiYWNraW5nLXN0b3JlIG9iamVjdAorKHNwZWNpZmljYWxseSwgaW4gTVMtRE9TIGEgYmFja2luZyBzdG9yZSBmaWxlIG1pZ2h0IGJlIGFuIGFyZWEgb2YgZXh0ZW5kZWQKK21lbW9yeSBhcyB3ZWxsIGFzIGEgZGlzayBmaWxlKS4gIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIGlzIHJlc3BvbnNpYmxlIGZvcgorY2hvb3NpbmcgaG93IHRvIGltcGxlbWVudCBhIGdpdmVuIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlL2Nsb3NlIHJvdXRpbmVzCithcmUgbWV0aG9kIHBvaW50ZXJzIGluIHRoZSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYSBnaXZlbiBvYmplY3Q7IHRoaXMKK2xldHMgdGhlbSBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBvYmplY3QgdHlwZXMuCisKK0l0IG1heSBiZSBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgYmFja2luZyBzdG9yZSBvYmplY3RzIGFyZSBleHBsaWNpdGx5CityZWxlYXNlZCB1cG9uIGFibm9ybWFsIHByb2dyYW0gdGVybWluYXRpb24uICBGb3IgZXhhbXBsZSwgTVMtRE9TIHdvbid0IGZyZWUKK2V4dGVuZGVkIG1lbW9yeSBieSBpdHNlbGYuICBUbyBzdXBwb3J0IHRoaXMsIHdlIHdpbGwgZXhwZWN0IHRoZSBtYWluIHByb2dyYW0KK29yIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIHRvIGFycmFuZ2UgdG8gY2FsbCBzZWxmX2Rlc3RydWN0ICh0eXBpY2FsbHkgdmlhCitqcGVnX2Rlc3Ryb3kpIHVwb24gYWJub3JtYWwgdGVybWluYXRpb24uICBUaGlzIG1heSByZXF1aXJlIGEgU0lHSU5UIHNpZ25hbAoraGFuZGxlciBvciBlcXVpdmFsZW50LiAgV2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRoZSBiYWNrIGVuZCBtb2R1bGUgaW5zdGFsbCBpdHMKK293biBzaWduYWwgaGFuZGxlciwgYmVjYXVzZSB0aGF0IHdvdWxkIHByZS1lbXB0IHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbidzCithYmlsaXR5IHRvIGNvbnRyb2wgc2lnbmFsIGhhbmRsaW5nLgorCitUaGUgSUpHIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBzZXZlcmFsIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kIGltcGxlbWVudGF0aW9ucy4KK1VzdWFsbHkgdGhlIHNhbWUgYmFjayBlbmQgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBhbGwgYXBwbGljYXRpb25zIG9uIGEgZ2l2ZW4KK3N5c3RlbSwgYnV0IGl0IGlzIHBvc3NpYmxlIGZvciBhbiBhcHBsaWNhdGlvbiB0byBzdXBwbHkgaXRzIG93biBiYWNrIGVuZCBhdAorbmVlZC4KKworCisqKiogSW1wbGljYXRpb25zIG9mIEROTCBtYXJrZXIgKioqCisKK1NvbWUgSlBFRyBmaWxlcyBtYXkgdXNlIGEgRE5MIG1hcmtlciB0byBwb3N0cG9uZSBkZWZpbml0aW9uIG9mIHRoZSBpbWFnZQoraGVpZ2h0ICh0aGlzIHdvdWxkIGJlIHVzZWZ1bCBmb3IgYSBmYXgtbGlrZSBzY2FubmVyJ3Mgb3V0cHV0LCBmb3IgaW5zdGFuY2UpLgorSW4gdGhlc2UgZmlsZXMgdGhlIFNPRiBtYXJrZXIgY2xhaW1zIHRoZSBpbWFnZSBoZWlnaHQgaXMgMCwgYW5kIHlvdSBvbmx5CitmaW5kIG91dCB0aGUgdHJ1ZSBpbWFnZSBoZWlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc2Nhbi4KKworV2UgY291bGQgcmVhZCB0aGVzZSBmaWxlcyBhcyBmb2xsb3dzOgorMS4gVXBvbiBzZWVpbmcgemVybyBpbWFnZSBoZWlnaHQsIHJlcGxhY2UgaXQgYnkgNjU1MzUgKHRoZSBtYXhpbXVtIGFsbG93ZWQpLgorMi4gV2hlbiB0aGUgRE5MIGlzIGZvdW5kLCB1cGRhdGUgdGhlIGltYWdlIGhlaWdodCBpbiB0aGUgZ2xvYmFsIGltYWdlCisgICBkZXNjcmlwdG9yLgorVGhpcyBpbXBsaWVzIHRoYXQgY29udHJvbCBtb2R1bGVzIG11c3QgYXZvaWQgbWFraW5nIGNvcGllcyBvZiB0aGUgaW1hZ2UKK2hlaWdodCwgYW5kIG11c3QgcmUtdGVzdCBmb3IgdGVybWluYXRpb24gYWZ0ZXIgZWFjaCBNQ1Ugcm93LiAgVGhpcyB3b3VsZAorYmUgZWFzeSBlbm91Z2ggdG8gZG8uCisKK0luIGNhc2VzIHdoZXJlIGltYWdlLXNpemUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIHRoaXMgYXBwcm9hY2ggd2lsbAorcmVzdWx0IGluIHZlcnkgaW5lZmZpY2llbnQgdXNlIG9mIHZpcnR1YWwgbWVtb3J5IG9yIG11Y2gtbGFyZ2VyLXRoYW4tbmVjZXNzYXJ5Cit0ZW1wb3JhcnkgZmlsZXMuICBUaGlzIHNlZW1zIGFjY2VwdGFibGUgZm9yIHNvbWV0aGluZyB0aGF0IHByb2JhYmx5IHdvbid0IGJlIGEKK21haW5zdHJlYW0gdXNhZ2UuICBQZW9wbGUgbWlnaHQgaGF2ZSB0byBmb3JnbyB1c2Ugb2YgbWVtb3J5LWhvZ2dpbmcgb3B0aW9ucworKHN1Y2ggYXMgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIG9yIG5vbmludGVybGVhdmVkIEpQRUcgZmlsZXMpIGlmIHRoZXkKK3dhbnQgZWZmaWNpZW50IGNvbnZlcnNpb24gb2Ygc3VjaCBmaWxlcy4gIChPbmUgY291bGQgaW1wcm92ZSBlZmZpY2llbmN5IGJ5CitkZW1hbmRpbmcgYSB1c2VyLXN1cHBsaWVkIHVwcGVyIGJvdW5kIGZvciB0aGUgaGVpZ2h0LCBsZXNzIHRoYW4gNjU1MzY7IGluIG1vc3QKK2Nhc2VzIGl0IGNvdWxkIGJlIG11Y2ggbGVzcy4pCisKK1RoZSBzdGFuZGFyZCBhbHNvIHBlcm1pdHMgdGhlIFNPRiBtYXJrZXIgdG8gb3ZlcmVzdGltYXRlIHRoZSBpbWFnZSBoZWlnaHQsCit3aXRoIGEgRE5MIHRvIGdpdmUgdGhlIHRydWUsIHNtYWxsZXIgaGVpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IHNjYW4uCitUaGlzIHdvdWxkIHNvbHZlIHRoZSBzcGFjZSBwcm9ibGVtcyBpZiB0aGUgb3ZlcmVzdGltYXRlIHdhc24ndCB0b28gZ3JlYXQuCitIb3dldmVyLCBpdCBpbXBsaWVzIHRoYXQgeW91IGRvbid0IGV2ZW4ga25vdyB3aGV0aGVyIEROTCB3aWxsIGJlIHVzZWQuCisKK1RoaXMgbGVhZHMgdG8gYSBjb3VwbGUgb2YgdmVyeSBzZXJpb3VzIG9iamVjdGlvbnM6CisxLiBUZXN0aW5nIGZvciBhIEROTCBtYXJrZXIgbXVzdCBvY2N1ciBpbiB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZGVjb21wcmVzc29yJ3MKKyAgIEh1ZmZtYW4gZGVjb2RlcjsgdGhpcyBpbXBsaWVzIGEgc3BlZWQgcGVuYWx0eSB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIHVzZWQKKyAgIG9yIG5vdC4KKzIuIFRoZXJlIGlzIG5vIHdheSB0byBoaWRlIHRoZSBsYXN0LW1pbnV0ZSBjaGFuZ2UgaW4gaW1hZ2UgaGVpZ2h0IGZyb20gYW4KKyAgIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBkZWNvZGVyLiAgVGh1cyAqZXZlcnkqIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBJSkcKKyAgIGxpYnJhcnkgd291bGQgc3VmZmVyIGEgY29tcGxleGl0eSBwZW5hbHR5IHdoZXRoZXIgaXQgY2FyZWQgYWJvdXQgRE5MIG9yCisgICBub3QuCitXZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgRE5MIGJlY2F1c2Ugb2YgdGhlc2UgcHJvYmxlbXMuCisKK0EgZGlmZmVyZW50IGFwcHJvYWNoIGlzIHRvIGluc2lzdCB0aGF0IEROTC11c2luZyBmaWxlcyBiZSBwcmVwcm9jZXNzZWQgYnkgYQorc2VwYXJhdGUgcHJvZ3JhbSB0aGF0IHJlYWRzIGFoZWFkIHRvIHRoZSBETkwsIHRoZW4gZ29lcyBiYWNrIGFuZCBmaXhlcyB0aGUgU09GCittYXJrZXIuICBUaGlzIGlzIGEgbXVjaCBzaW1wbGVyIHNvbHV0aW9uIGFuZCBpcyBwcm9iYWJseSBmYXIgbW9yZSBlZmZpY2llbnQuCitFdmVuIGlmIG9uZSB3YW50cyBwaXBlZCBpbnB1dCwgYnVmZmVyaW5nIHRoZSBmaXJzdCBzY2FuIG9mIHRoZSBKUEVHIGZpbGUgbmVlZHMKK2EgbG90IHNtYWxsZXIgdGVtcCBmaWxlIHRoYW4gaXMgaW1wbGllZCBieSB0aGUgbWF4aW11bS1oZWlnaHQgbWV0aG9kLiAgRm9yCit0aGlzIGFwcHJvYWNoIHdlJ2Qgc2ltcGx5IHRyZWF0IEROTCBhcyBhIG5vLW9wIGluIHRoZSBkZWNvbXByZXNzb3IgKGF0IG1vc3QsCitjaGVjayB0aGF0IGl0IG1hdGNoZXMgdGhlIFNPRiBpbWFnZSBoZWlnaHQpLgorCitXZSB3aWxsIG5vdCB3b3JyeSBhYm91dCBtYWtpbmcgdGhlIGNvbXByZXNzb3IgY2FwYWJsZSBvZiBvdXRwdXR0aW5nIEROTC4KK1NvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBmaXJzdCBzY2hlbWUgYWJvdmUgY291bGQgYmUgYXBwbGllZCBpZiBhbnlvbmUgZXZlcgord2FudHMgdG8gbWFrZSB0aGF0IHdvcmsuCmRpZmYgLS1naXQgYS90ZXN0aW1nLmJtcCBiL3Rlc3RpbWcuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDNkMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW1nLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW1nLmpwZyBiL3Rlc3RpbWcuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNGNhNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW1nLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW1nLnBwbSBiL3Rlc3RpbWcucHBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODFjZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW1nLnBwbQpAQCAtMCwwICsxLDQgQEAKK1A2CisyMjcgMTQ5CisyNTUKKzAvLTAvLTEwLjIxLzUxLjUxLjYyLzYyLzgzLzgzLzozLTozLTozLTozLTozLTozLToyLzkxLjkxLjgwLTgwLTkxLjkxLjoyLzgwLTgwLTgwLTgwLTgwLTgwLTgwLTgwLTYuKzYuKzYuKzUtKjUtKjQsKTQsKTQsKTQsKTQsKTQsKTQsKTQsKTQsKTQsKTItKS8qJC8sJS8sJTAtJjEuJzIvKDMwKTMwKTYzLDYzLDc0LTg1Ljg1Ljk2Lzo3MDo3LkE6MEI8MEQ+MkZANElBNEpCNUtDNktDNk1ENU1ENU9DM05CMk9DM09DM1BENFJFNVI/MVk/MmJANG5CNX1FNotIOJlHOaNGN69HOrhHOb5FOsVHO8dHPspHP8tIQNBFQOdGTO1DTOtES+tFSe5DSe9CRPE+QvQ9Qfg7Qfc6QPQ6P/A8P+k/QOJAPtc/PMtBN7s9L7VALrVALrQ/LbQ/LbNALbI/La9ALa1ALKpBLKZBLaJCLJ9AKptBKZhAKpZBLJQ+LZI/L5I/L5E+LpE+LJA9K5I8K5I8K5Q/K5Q/K5Q9KpQ9KpQ9KpU+K5Y/LJZAL5Y/NpU+NZc9Mp8/MalCM7NEM7xENL9ENLk/MLVBMqxGOJ5IO4dIOW9BMlQ4KkMzJj01Mjk1NDk1NDczMjcxMTYwMDUwLTUwLTcyLzcyLzcyLzYxLjYxLTUwLDUwLDQxLC8vLS4wLS8vLS8vLTAvLTAvLTIuLTIuLTUsLTQrLDQqKzMpKjcoKz0uMUU2OVA6PGpCQ3xJSI1NTZVPT59XW6pkbqpvg590kJR7o4d/roCGun6IvXN5rWBhkVRLdlBEaFNKZ09HXk1IXlRRYmZkb3x9go2RkJmemKOpn6Komp6gk4+SgXt8bGZnVVhXRVFORVVSW1VRYlVRYjAvLTAvLTEwLjEwLjQwLTUxLjYyLzYyLzgzLzgzLzozLTozLTozLTozLTozLTozLTkxLjkxLjgwLTgwLTgwLTgwLTkxLjkxLjgwLTgwLTgwLTgwLTgwLTgwLTgwLTgwLTYuKzYuKzUtKjUtKjUtKjQsKTQsKTQsKTUtKjUtKjUtKjUtKjUtKjUtKjUtKjMuKjArJTAtJjAtJjEuJzIvKDMwKTQxKjQxKjYzLDYzLDc0LTc0LTg1Ljk2Lzo3MDo3LkA5L0E7L0M9MUU/M0hAM0lBNEpCNUpCNUxDNExDNE1BMU1BMU1BMU5CMk9DM1FENFA+MFU/MV5BM2pDNHhENoRFNJJFNZxDM6dDNK9BNLVBNLxCN8BEOsRFPMVGPc1DQOFFSedCSehDSepESO1ER+9CRPNAQ/Y/Q/g7Qfc6QPQ6P/A8P+k/QOBBPtVAPMpANrk+L7VALrQ/LbQ/LbQ/LbI/LLA/La9ALa1ALKlAK6ZBLaFBK59AKptBKZhAKpZBLJQ+LZI/L5E+LpE+LpE+LJA9K5I8K5I8K5Q/K5M+KpQ9KpQ9KpQ9KpU+K5Y/LJZAL5RANZU+NZg+M6A+MatBM7VENL1DNL9ENbtBMrdDNqxGOJxJO4VHOmxAM1M5KkI0KT42Mzo2NTk1NDg0MzgyMjcxMTYxLjYxLjcyLzcyLzcyLzYxLjYxLTUwLDUwLDQxLC8vLS4wLS8vLS8vLTAvLTAvLTIuLTIuLTMtLTUsLTQqKzMpKjUpKzwtMEM0N044OmQ+PXZFQYZKSY9OTJpUVqRhaqVsfZ1yjpF7ooaArn+FuXuEu291qVtbjVFIdU9DaU9GZU9HX1BIX1JOX1tZZm5vdIOHiJSZlZmel5qglJmdj4+Rg35/b2prWV1bTFZTSlhTWlZSYVhRYS8uLC8uLDAvLTEwLjQwLTQwLTUxLjUxLjcyLjcyLjcyLjcyLjkyLDkyLDkyLDkyLDkxLjgwLjcvLTcvLTcvLTcvLTgwLjkxLzgwLjgwLjgwLjgwLjgwLjgwLjgwLjgwLjYuLDUtKzUtKzUtKzQsKjQsKjQsKjQsKjUtKzUtKzUtKzUtKzUtKzUtKzUtKzMuKjItJzEuJzIvKDMwKTMwKTQxKjQxKjUyKzYzLDYzLDYzLDc0LTg1Ljk2Lzk2Lzo3Lj84LkA6LkI8MEQ+Mkc/NEhANUhAM0hAM0lAMUlAMUs/MUs/MUs/L0xAME1BMU5CMk1BMVFBMVlCMmRDMnFDM3xDModCMpJBMJg8LaA6K6c7Lq89MrVANrpEOr9GPcVEPtlDReFARuNCR+dCRupERvBDRfRBRPg/RPo7QPk6P/U7QPA9QOhAQNxBPdFAO8ZANbc9LrNALbNALbI/LLI/LbA/La8+LK1ALKo/LadALaVALKFBK51BLJo/KphAKpVAK5Q+LZE+LpE+LpE+LpA9K5A9K5A9K5A9K5E+LJE+LJI8K5I8K5M9LJM9LJQ/K5U/LpVBNpY/NZo+M6M+Mq9BNLlDNb9ENcFDNcBEOLhGO65JPZlKPYFHO2hANFE6LEI1LD83ND03Nzw2Njo0NDk0MTgzMDcyLzcyLzYyLzYyLzYyLzUxLjUyLTQxLDQxLDIxLC4wLSwxLS4wLS4wLS8vLS8vLTAvLTIuLTUvLzQuLjUsLTQqKzQqKzktLz4yNEk1Nls5N2w/OXxFQIZJRJBPTZhbYJtmdpRtiIx3noN9rX2CuXV+t2ZtpFRWiU1FdkxBa01BZU9GY1FIY01IXk5LXFtbZXF0eYWJiIeMhoqPiI2QhYaKfHh6bGZpWFpbTVZTTFpVW1pUYFtTYC4tKy8uLC8uLDAvLTMvLDQwLTQwLTQwLTYxLTYxLTYxLTYxLTgxKzgxKzgxKzgxKzcvLTcvLTYuLDYuLDYuLDYuLDcvLTcvLTgwLjgwLjgwLjgwLjgwLjgwLjgwLjgwLjUtKzUtKzUtKzQsKjQsKjQsKjMrKTMrKTYuLDYuLDYuLDYuLDYuLDYuLDYuLDQvLDMwKzMwKTMwKTQxKjQxKjUyKzUyKzUyKzUyKzUyKzYzLDc0LTg1Ljg1Ljk2Lzk2LT43LT85LUA6LkI8MEU9MkU9MkY+MUY+MUc9MUc+L0g8Lkk9L0k9L0o+LkxAMEpBMEtEMk5FNFVENF5EM2lEMnNCMX5BL4Y/LYw5KZQ5J505KqM8LaxAM7NFOLhIPMFGPtJEQ9pBQ95CQ+JEQ+dDROxCQ/NAQ/c/Qfo7QPk6P/U7QO4+QOVBQNpCPc1AOcJAM7U9LbBALLBALLBALK8+LK4/LK4/LKw/K6lALaY/LKNAK6BAKpxAK5hAKpZAKZQ/KpE+LJE+LpE+LpA9LZA9K5A9K488Ko88KpA9K5A9K488Ko88KpI8K5E+LJQ+LZI/LZVBNpY/NZw+MqZANLJCNrxDOMFDN8JCN8JGPLpKP6xMQJdLPnxGOmJANEw6LkE3LUA4NT45Nj03Nzw3NDo1Mjk0MTgzMDgzMDYyLzYyLzYyLzMyLjUyLTIxLDIxLDEyLS0yLi0yLi8xLi8xLjAwLjAwLjEwLjEwLjUxMDYwMDUvLzUsLTQrLDYsLTowMUQyMlQ3MWM7M3FBN3tFO4JIRIlSVY1fbItpgoNzmH15q3h9tW93tWBmolFSi0xFeUxAcExAaFBFZ1FGZkxDXkdCVk1MWl5eZmpucXV5eHh9d3qAdnd6b2tvYWBiVFdZTFRUTF1XWV1WXV1WXi0tLS0tLS4tKy8uLDAvLTEwLjMvLDQwLTMvLDMvLDQvKzQvKzQvKzQvKzYvKTYvKTQvLDQvLDMuKzMuKzMuKzMuKzQvLDQvLDUwLTUwLTUwLTUwLTUwLTUwLTUwLTUwLTMuKzMuKzItKjItKjItKjEsKTEsKTEsKTQvLDQvLDQvLDQvLDQvLDQvLDQvLDQvLDQxLDQxLDQxLDQxLDQxLDUyLTUyLTUyLTUyLTUyLTYzLjYzLjc0Lzg1MDk2MTk2Lzw1LT02LD84LkA5L0I6L0M7MEM7MEM7LkQ6LkQ6LkY6Lkc7LUg8Lkk9L0o+MElAMUpHNk1INVJHNVlGNWJFM2pEMXVCL30+LII7KYs6KZM6Kpo9LKNCMqxGOLJKPbtJP8xHQtREQ9hEQt1FQuJCQulBQfA9QPQ8Pvk6P/g6PPQ8Pu0/PuFCPtNDOsVBNbk/MLI/La4/LK4/LK4/LK0+Law+Law+Lao/Lag+LqQ/LaA/LJ4/K5o/LJc/K5U+KpM+KpE+LJA/Lo8+LY8+LY8+LY49LI49LI49LI49LI49LI49LI49LI88LI8+LZE+LpA/LpRCNJdBNJ1AMahAM7ZBN79DOcVCOMRBN75DO7dIP6ZMQ5BKQHRFO1o+MkU5LTw1K0A5M0A4NT83NT42Mz01Mjw0MTk0MDgzLzYyLzQzLzQzLzIzLjMyLjEyLTEyLTAyLS0yLiwyLi0yLi0yLi8xLi8xLjAwLjEwLjMyMDUxMDUxMDQuLjIsLDQrLDcuLz0vLk41Llk5LmU9MW5AM3NCO3lLS4BaZYNngH9wl3p4qnV7t2tztF9kplRUlE9Hg0xCd05BbU5CaE1BZUpBYEdCWUdGWEtLV01QVV1jY2BmYmJpYWBmXFpgVFdbTVVYTVhYUF5ZVmBXWGBXWiwsLCwsLC4tKy4tKy8uLDAvLTMvLDMvLDIuKzIuKzMuKjMuKjMuKjMuKjUuKDUtKjMuKzMuKzItKjEsKTEsKTItKjMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzItKjItKjItKjItKjEsKTEsKTEsKTArKDMuKzMuKzMuKzMuKzMuKzMuKzMuKzMuKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDUyLTUyLTYzLjc0Lzg1MDg1MDg1Ljs0LDw1Kz02LD43LUA3LkE5LkE5LkE5LkM5L0M5LUU5LUY6Lkc7L0g8Lko+MEhBMUpHNklINk5HNVZGNlxFM2RDMm5AMHY+LXs8K4I7KYw7KpQ9LJxAMaNGNapKOrRKPcRIQMxFQdFGQdZFQN5DQeRAPuw+P/E6PPc7PPQ6O/A8PelAPdxDPc1DOL5AMrE+LK4/LKtALKo/K6o/K6o/Lak+LKk+LKg/LKU+LaI/LKA/LJs+LJc/K5U+KpM+KZE/Ko8+K48+LY8+LY8+LY49LI49LI49LI08K449LIs8K408K4s8K4s8LYw9LI0+L44/LpRCNJdBMqBAMqxCNblDOcJDOsVCOsJBO7pBObFJQKNOR41ORW9HPVM/NEE7Lzk2LUA5M0E3NT83ND42Mzw0MTk0MDgzLzc0LzQzLzQzLzM0LzIzLjIzLjAyLTAyLS4zLS0zLy0zLy4zLy4zLzAyLzAyLzExLzExLzIxLzMyMDMyMDQwLzIuLTEtLDQuLjguLEc0LU80KVg4K2A8MGU/Nm1HRnlZZIJrhYB1n3x8snd8vG51u2Ror1tboVJNj0xCfk9BckxAaEk9Y0g+YEhCXkVDWEBCTztARkJHSkRNSkpRSkpRSUlRRktRRU9VSVZXT15ZU2BZU2BYVSsrKysrKywsLC0tLS8uLC8uLDAvLTAvLTEtKjEtKjEtKjEtKjItKTItKTItKTItKTItKjIsLDErKzErKzErKzErKzIsLDIsLDErKzErKzErKzErKzErKzErKzErKzErKzIsLDIsLDIsLDErKzErKzErKzAqKjAqKjMtLTMtLTMtLTMtLTMtLTMtLTMtLTMuKzQxLDQxLDQxLDMwKzMwKzMwKzMwKzMwKzQxLDQxLDUyLTYzLjc0Lzc0Lzg1MDg1LjozKzs0LDw1LT02Lj82Lz82LT82LT83LEI4LkI4LkU4L0U5LUc7L0g8MEo+MkhAM0hFNkdGNEtFNVFENFhDMl9CMmY/Lm49LHY9LHw6KoU5KYw7KpM9LptCMqJGN6xGOLtGPMJGPslGPtBFPtlEQOJDP+pAQPA+PvI6OvE7Ouw8PORBPNZDO8ZENrVAL6o9Kao/LalALalALag/LKg+Lqg+Lqc9LaU+LaM9LqA/Lp4/LZo/LZY/LJM+KpE/Ko8+KY8+K40+LY0+LYw9LIw9Low9Los8LYs8LYs8LYo9LYo7LIk8LIo8L4s+Los9MIw/L5JDMphCMaFBMa5CNrxDOsJDPMRDPcBDPblGQbJRSqVYUo9YUXNSSVdJPkNDNzw/Nj45M0A3Mj43MT02MDo1Lzk0LjgzLzYzLjQzLjQzLjM0LzEzLjEzLi4zLS4zLS4zLS0zLy0zLy0zLy0zLy4zLy4zLzAyLzAyLzAwLjExLzIyMDIxLzAvLS8uLDIuLTQvLD8wK0QwKUszKVQ4LVo8NGRGRnVdaoNzjYmAq4WEvn6Dx3R6xm1wvWNlr1ZTmkxDgks/cUk8Z0c7Y0U+X0ZCXURCVz9BTjs/SDpCRT5IR0RNSEdRSUdRSEpSR05WS1VYTV5aT2FZTmFYTysrKysrKywsLCwsLC4sLS8uLDAvLTAvLTEtKjEtKjEtKjEtKjItKTItKTItKTItKjIsLDErKzErKzAqKjAqKjErKzErKzIsLDAqKjAqKjAqKjAqKjAqKjAqKjAqKjAqKjIsLDIsLDIsLDErKzErKzAqKjAqKjAqKjIsLDIsLDIsLDIsLDIsLDIsLDIsLDIsLDMvLDMwKzMwKzMwKzMwKzMwKzMwKzMwKzQxLDQxLDUyLTYzLjYzLjc0Lzg1MDg1MDkyLDozKzs0LDw1LT41Lj41Lj41Lj41LEI4L0I4LkU4L0U4L0c6MUk9MUo+Mkk/M0ZDNEZDNEpCNU9BNFRBMlxAMmI+MGo8LXE8Lnc5Kn04KYU4KIw6LJU9L5tCNKRCNbJGOrpFO8FGPspHP9RHQN5GQedDQe5CQO07O+s7O+c+O99CO9FEOr9ENK9ALaQ+KKZBLaZBLaVALKVALqVALqQ/LaQ/LaQ+L6I+Lp9ALpw/Lpg/LZU+K5E/Ko8+KY8+K40+LY0+LY0+LYw9LIw9Los8LYs8LYo9LYo9LYg8Log8Log8Log8L4c+L4g+MYs/MZFEMpZDMaJCNK1DNrpDO8FEPsFEPrtFQblQTLJbVKVlXJFmXXVfVFtVSUdNQUNJPzw5Mj84Mj43MTs2MDk0Ljc0LTYzLjQzLjQzLjM0LjI0LzEzLi80Li4zLS4zLS4zLS0zLy0zLy0zLy0zLy4zLy4zLzAyLzAyLy8vLTAwLjIyMDIyMDEwLjAvLTAvLTMvLDgsLDssKUMwKks3MFM8Nl5JSHRibod6lJCKtoyNxoSIz3qAzHJ4xmlrtldXn0lEhEU9bkc8ZEQ8YUM+XkNBWUBDVkBEUD5FS0dRUktXVVFeV1VgWFNfVVJeVFReU1lfU15bTGFaSmFaSiwtLywtLywtLywuLS0tLS0tLS4tKy4tKy8uLC8uLDEtKjAsKTAsKTAsKS8rKC8rKC8rKi8rKi8rKi8rKi8rKi8rKi8rKjAsKy8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKjAsKzAsKzEtLDEtLDIuLTEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDAsKTEtKjIuKzMvLDMvLDMvLDMvLDMvLDMvLDMvLDMvLDMvLDQwLTUxLjYyLzc0LzgwLTkyLDozLTs0Lj00Lz41Lj41Lj41Lj80Lj81LEI1LUM2LkQ3L0Y5MEc6MUY8Mkc/NEhANUpANlA/NVQ+M1g8MV45MGI2K205LnQ4LXw4K4M5LI07L5M9MJg/MZ4+MKdBM61BNLVDOL5FOspHPdRHPt5FP+VDQOhAP+pCQeZEQdpFPshEOLdCMapBLqJCLKJBLqFALaI/LKI+LqE9LaE9LaI+LqA/L5w8LJo9LJg8LZU+LZM9LJA9K449Kow+Kos8K4s8K4o9LYk8LIk8LIk8LIg6LYc7LYk9L4Y8L4Y8L4c9MIg+M4hAMolBNYtBNJFFNZdENKNFObFJPrpHQLtEPrtFQbhNR7RaUq9mX6NxZpFzaH5yZGpqXlZeU0lRRkxMQkpGPUI+NTw4Lzk1LDc0KzYzLDMzKzQzLjM0LjE0LTE0LTAyLS8xLCwxKywxKy0yLi0yLi0yLi0yLi8xLi8xLi8xLi8xLjAyLzAyLzExLzExLzExLzExLzExLzQwLzQrMDsvM0EzMkM0L0o7Nl1PT3lteYuFn5OQu5SWz5CV2YOJ03R6xmput19ip1pblExJdEhCZEE+XT4+WD9CVUFJVkxVXFVgYmJxbm59eHaGfHJ/dWx5b2d1aF9rX1dfUF1cSGJcRmNdRywtLywtLywtLywtLy0tLS0tLS4sLS4tKy8uLC4tKzAsKTAsKS8rKC8rKC8rKC8rKC4qKS4qKS4qKS4qKS8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKi8rKjAsKzAsKzAsKzEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDEtLDAsKzAsKTEtKjIuKzMvLDMvLDIuKzIuKzIuKzIuKzIuKzIuKzMvLDQwLTUxLjYyLzgwLjkxLjoyLzs0Lj00Lz41MD41MD00LT80Lj80LkE0LkI1LUM2LkU4MEc6Mkg7M0g+NUg+NUw9Nk8+NlE9NFY7Mlo5MF83L2g3MHA3Lnc3LYE5LYk5LpA8MZY8MZs9MaJAM6dBM6xCNbREOL5FOslGPNRFPdtEPd9EQOBFQN5GQdRHPsRGOLJDMqVCLZ5CLZ9DLp5CLZ9ALp4/LZ4/LZ4/LZ4+Lp4+Lpo9LJk+LJY9LZQ9LJA9K48+K4w+Kow9LIs8K4o9K4k8LIk8LIk8LIc7K4c7LYU8LYY8L4U9L4U9MYM9MYQ+MoZANodBN4hCNpNHOZdFN6NHPK9KQLhJQrhHQbdMRrNUTrFkXKpxZp9+b5B/b398bW1zZVpmWk5YTUxOQUtJPUVDN0A9ND06MTg4LjQ0LDExKTIzLTIzLTAzLC8yKy8xLC4wKy4wKy4wKy8xLi0yLi8xLi8xLi8xLi8xLi8xLi8xLjAyLzAyLzExLzExLzExLzExLzExLzIwMTUrNDktNzwyMz81M0g/Ol5WVHhyfIqInpOTuZSXypCW1ISLz3mBwnF5uGt0rWhunlxfgFhacVNValJXalReaFpnbWZ2dnKCf3SIf36Sh4OViX6OgXaGeXKAcWZ0ZVplVFtaRWBaQGJcRCwtLywtLywtLywtLywtLywuLS0tLS0tLS4tKy4tKy4tKy0sKi8rKC4qJy4qJy4qJywrKSwqKywqKywqKyspKispKispKispKi0rLC0rLC0rLC0rLC0rLC0rLC0rLC0rLCwqKywqKy0rLC0rLC0rLC4sLS4sLS4sLS4sLS4sLS4sLS8tLi8tLi8tLi8tLi8uLDAsKzAsKzEtLDIuLTIuLTIuLTIuLTEtLDEtLDEtLDEtLDEtLDIuLTMvLjQwLzUxLjgwLjkxLjoyLzszMD0zMT00Lz00Lz00Lz80MD80LkE0LkE0LkM2MEQ3MUY5M0c6NEg7NUo7Nks8N049NlA7NlM6NVY3Mls2LmM2MGs2LnQ1LH03L4c5L407MJQ8MJY8MZ0/M6BANKJAM6hAM7FDNrpEOMVFOs1EOtVGQNdIQNRJQsxJP75FOq5DM6FCLpxBLp1CL5xBLpw/Lps+LZs+LZs+LZs+L5s/MJg8LZY9LZQ8LpM9Lo8+LYw9LIs8K4o9K4k8Kok8Kok8LIc7K4c7LYU8LYQ6LYM7LYQ8MII8MII8MoI+M4M/NIVBOIdDOohEOZRKPZdIO6BIPqxLRLJLRrNMR7JTTa5gVq1zZ6aBcZ2MepGOe4KJd3OAb2NxYlhjVU5SRE1OQEhJO0REOEBANDk7LjQ2Ky8xJjAxKTAxKS8wKi8wKi4vKi4vKi8vLS8vLS8vLS4wLS8vLS8vLS8vLS8vLS8vLS8vLTAwLjAwLjAwLjAwLjAwLjAwLjAwLjEvMjYrOTcrOTgvNDs2M0hFPl9eWXp6fIuNmpCUsZKXv4+Vx4SOw32Ju3uJtnyLsn2Mq32ImneDj3F+h259gm5+fm+CfnmOhYOZjYuhlJGomJCllIidioOWg3yNe2p7aVxoVFhYQF1ZPF9bQC0uMC0uMC0uMC0uMC0uMC0uMC4uLi4uLi4tKy4tKy0sKi0sKi4qJy4qJy4qJy4qKSwqKyspKispKispKispKiooKSooKSooKSwqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKy0rLC0rLC0rLC0rLC4sLS4sLS4sLS4sLS8tLi8tLi8tLi8rKjAsKzEtLDEtLDEtLDEtLDAsKzAsKzAsKzAsKzAsKzAsKzEtLDIuLTMvLjQwLzkxLzoyMDszMTw0MT0zMT0zMT0zMT00Lz4zLz4zL0AyL0AzLUE0LkM2MEQ3MUU4MkY5M0g5NEk6NUo7Nkw6Nk45NFE4M1Q1MF43MmU2MG82L3g4L4I5MIo6L5A8MZQ+MZk/NJs/NJs/Mp8/MaVBMq5CNbhEN79FOsdHPstIQMpKQcNJPrZGOqpCNZ5BMJlALplBLZlBLZg/LZc+LJc+LJk+LJk9Lpc+LpU8LJQ9LJM9LpA9LY49LIo9K4o9LYk8LIg7KYg7KYc7K4c7K4Q7LIQ7LIM7LYA7LIE7L4A8MYA8MYE+NYNAN4NDOodEPIhFPJRMQJZIPJ5HPqdKQ65MSa5RTK1dVqpqXqeAb6GPeZqago+bg4aVgHqLeG17amJtXVNaSlFVRktPQEVJOkBENjs9MDU3LDEzKDAxKS8wKC4vKS4tKC4tKS4tKS8uLDAvLS8uLC8uLC8uLC8uLC8uLC4uLC8uLC4uLDAvLS8vLTAvLS8vLS8vLS8vLS8vLTItMTcsOjYqODMtMTk2MUhKP2JmWHuAeouQk42To4+WsIyVtoOQsoGQr4WZso2ktpKos5Ooq5Cko4ygnoeemIKZj32YiYGci4ijkJSwmpixm5Stl4ujjYWbhH+SfGt8aVhmT1NWO1pWOV5aPSsvMisvMisvMisvMi0uMC0uMC4uLi4uLi0tLS0tLS4tKy0sKi0sKiwrKSwrKSwrKSwqKywqKywqKyspKispKiooKSooKSooKSwqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKywqKyspKispKispKiwqKy0rLC0rLC4sLS4sLS8tLi8tLi8tLi8rKjAsKzAsKzAsKzAsKzAsKy8rKi4qKS8rKi8rKi8rKi8rKjAsKzEtLDMvLjQwLzkwMToyMDszMTw0Mj0zMj0zMTwyMDwyMD0yMD0yLj8xLj8xLkAyL0EzMEI1L0M2MEQ2M0M4NEQ5NUU6Nkc5Nkg5NEs4NE41MFg3Ml82MGk3MHI3L306MYY8MYw+MpA+MpdANpc/NZc/NZc/M5xAM6NDNatDNrNFOLpFO71HPb5IPrlHPbBEOKZBNZs/MJdAL5dALZdALZY/LpU+LZQ9LJU8LJY9L5Y9L5U8LpM7LZI8L448Los8LYk8LIk8LIg8LIc7K4Y6KoY6KoY6KoM6K4M6K4I6LIA6LoA6MIA8MYA9NH8/NoJCOYNEPYdGQIhIP5FLQZJIPZpHP6NMRahQTKhYUalmXaZ2aKKMd5uZgJWkh4yjh4adg36RfXSCcWp1ZVxlUlZfTE5VQ0VMOj9GNjxAMjc6LzY4LTAxKTAwKC4tKC8sJy8rKC8rKjEtLDIuLTEtLDEtLDEtLDEtLDEtLC8uLDEtLC8uLDIuLTAvLTIuLTAvLTAvLTAvLTAvLTItMTgsOjUpNTErKzY2LEdMOGBoUXqDcIiSh42Xlo+aoI2ZpYaWo4ebopCqqZu5saDAs5i3qJq2p5u3qJi3pZGxnImrkomrkJCxlJKzlpW0lZCtj4iihYSbgXuSeGd6ZFRiSVFUOVZVOVhXOywwMywwMywwMywwMy4vMS4vMS8vLy8vLy4uLi4uLi8uLC4tKy4tKy4tKy0sKi0sKi0rLC0rLC0rLCwqKyspKiooKSooKSooKSspKispKispKispKispKispKispKispKiwqKywqKyspKispKispKiooKSooKSooKSwqKywqKywqKy0rLC4sLS4sLS8tLi8tLi8rKi8rKjAsKzAsKy8rKi8rKi4qKS0pKDAsKzAsKy8rKjAsKzEtLDIuLTMvLjQwLzoxMjoxMjszMTw0Mj0zMjwyMTwyMDsxLz0yMDwxLz4wLT4wLT8xLkAyL0E0Lj80LkA1MUA3MkA5M0E6NEI5NEM4NEY3NEg1L1E1MVg1L2E2L2w4LXU5LoA8L4Y+MIs9MZM/NZU+NZM/NZM/NJVCNJpCNKBDNKVENKxCNbBEOLRFOrFFO6pCN6E/NJo+MZY+MJU/LpQ/K5M9LJM9LJM8K5M8K5Q8LpQ8LpM7LZI8LY88Lo07LYo7LIk8LIc7K4c7K4Y6KoY6KoU5KYM6KYM6K4E5Kn85LX85LYA8MX88M38/NoBBOIJDPIVGP4hJQopJQ45KQZBHPpdIQ59OSqdWUqdgWqlwZaSDcpyUfZahg4+oioiniIOghH6WfnmIdXB7amRwXF1pU1JeSkpTQEJLOj5FNTpAMjk8MTM0LDIyKjEuKS8sJy8pKTAqKjErKzIsLDErKzErKzErKzErKzErKzAsKzAsKzAsKzEtLDEtLDEtLDEtLC8uLC8uLC8uLDIsLjgqNzUoMTMrKDU2JkVLMVxnR3WCZIaTeY6bipGelJCfmouemI2ll5e0nqLFpanOraXJrabKsKfLsaTIrJe+n4uzkYiwjY2ykI6yjpCyj42sioShgoCZe3eOcmR4XVFfRU5SN1FRNVNSNiwwMywwMywwMywwMy4vMS4vMS4vMS4vMS8vLy8vLy8vLy8vLy8uLC8uLC4tKy4tKy8tLi4sLS4sLS0rLCwqKyspKispKiooKSspKispKispKispKispKispKispKispKispKispKispKiooKSooKSooKSknKCknKCspKispKiwqKy0rLC4sLS4sLS8tLi8tLi8rKi8rKi8rKi8rKi8rKi4qKS0pKCwoJzAsKzAsKzAsKzAsKzEtLDIuLTQwLzQwLzoxMjsyMzsyMzwzND0zMjwyMTwyMTsxMDwxLzwxLz4wLz0vLj4wLT4wLT8xLj4zLz02MDs2MDs4Mzw5ND06NT45M0A3MkM2MEc0Lk80K1k0K2Q1K244LHg6LX87LoU7Lo88NJE8NZA+M49AM5BBMpNCMZdBMplAMKA+MaZANKpCN6pCOaVANp8+NZc9MpU/MpI/LZI/LZE+LJA9K5E7KpE7KpI8LZI8LZE7LpE7Lo47LY07LYo7Log6LYY6LIQ7LIU5KYU5KYM6KYI5KII5KoE5Kn44LH44LIA8MYA9NIBAN4FCOYRFPoVJQYhLRoxNRoxJQY5IQJhKRqFTT6hdWKloYql7bqSOeZmcgZKnhomsi4KqiIChhH+ZgH6Ld3iBbmp4YWRyW1poUVFdSUlUQ0NMOz5ENjw/NDY3LzQ0LDMwKzArJzEoKTEoKTIpKjQrLDIpKjIpKjIpKjIpKjIpKjAqKjAqKjAqKjErKzErKzAsKzAsKzAsKzAsKzAsKzErLTYpMjUpLTQtJTQ2IUFIJldjO3GAV4KSbY2cfZCghpCijIuhio2oiZW4jqDIlKTQnanTq6jSrqfRraHLpZO9l4Wvh4KshIewhoiuhYyxiIurhoGfe3uUdHGIa19zV01dQklPM0pNMEtLLy4vMSwwMS4vMS4vMS4wLy4wLy4wLy8vLzAwLjAwLjAwLjAvLTAvLTAvKy8uLDEtLDIuLTEtLDEtLDAsKy8rLCwqKyspKispKispKispKispKispKispKispKispLCspKispLCspKi0oLCooKSwoKSknKCknKCgmJyooKSspKiwqKywrKS0rLC4tKy8uLC8uLC0sKi0sKi8rKi8rKi4qKS0pKCwoJywoJzEtLDItKjItKjItKjMuKzQvLDUwLTYxLjszMTszMTw0Mjw0Mj0zMTwyMDsxLzsxLzwxLzwxLz0vLj0vLj0vLD4wLT8xLj0yLj00LT02Ljs4MTk5MTk6Mjk6Mjs4MT82L0MyK0oxLFQyKV4zKmc3K285LXU9Lno8L4c9Mos9M4s/MoxAMo5AM49AMZI/MZU9L5g8L5w+MqJCNqFDN55CN5k/NJY+MpQ+MZQ+L5M9LpA9LY88LI49LIw9LIw9Lo0+L448Lo48Los8L4o7Log6LYg6LYY6LIQ7LII6K4I6K386Kn47Kn47K3w6Kn05LHw6LoA+MoE+NYBANoJDOoNHPYVKQodORYtPR4xJQ45JRJNQSphcVJ5nYJ11aZ6HdZ6YgJShhY+qiYmsi4Ooh4ChhH6bf3qQeXSIb2l9YmJ5XVxwVVVnT09cSEdSQUFIOD1BMzg4Ljg1LjcvLDMrKTIoKTIoKTMpKjQqKzAqLC8rKjAqLDAqKjAqLDAqLDIpLDIpLDMqLTErLTErLTErLTAsLTAsLTAsLTErLzQpLzQqKzQtJTQ2IT9GJVRgOG18UYGQZ4mZdI2eeo2hfoiheoqne5G2gpvEiJ/LkJ/JmZ7HnZ3GmpjBlYy3ioKtgIWugoy1iYSrf4muhYmpgn6ceHaPb2yDZlpuU0paP0dNM0ZKMURGLi8wKy4wKy8wKzAxLDAxLDAxLDEyLTIxLTMyLjQzLzQzLzYyLzUxLjQxLDMvLDQvLDUwLTUwLTQvLDMuKzIsLDEtLDAsKzAsKy4sLS4sLS0tLy0tLywsLisrLSopLikpKy4pLy4pLS8oLy4pLS8pLS4pLS4qKy4qKy8rKi8rKi0sKi4tKS0tKy0uKS4vKi4vKi0tLS0tLS4sLS8tLi8uLDAvLTIuKzIuKzItKjQsKTUtKjYuKzgvKjoxLDoxKjsyKz00LT00LT41MD41MD41MD00LzwzLjsyLT0yLjwxLTwxLzswLj0vLj4wLz4wL0AxLkEwKUAyKTs0Kjc3LTM5LTI4LjU2LjozLT8tKUYqJ0wpJ1MqJlovKGA1LGQ8MGtAMHlBMH9AL4ZBMYtCM49AM5M9MJM7L5I4LZM7L5M9LpRBMZVCMpRDMpJBMJE+LpE7LJc7MJc6MpI7MYw9MIg/MIQ/L4I/LoM+LohAMYg/MIo+MYo8MIk7L4g6LoY6LYM7LXs5K35AM3c8LnE3KXc+LXc+LXY7LX0/Mns7L4JANIdFOYlJP4hMQYZNQoRQQ4dORZFLSZdTUJRiWZFwYYx9aomJcYmWfIqego2kh42miY6nio2njIekiH6fgnWae2+XdWmNaWKEX1t6WFpzVVpuU1dlTlBXRUpLPUM/NkA5MzswLjYqKjMnKTMnKzMnKzEmKiwqLSkrKioqLCooKSwnKy4oLDEoLTInLTMoLjMoLjMoMDIoMDApMTApMS8qMS8qMC8pLTErKzAtKC8vIzw/KlZcQHB6WH+LZ42cdYudc4yhdoymd4qodomqdY60e5m/hp/Bj52+j5a6io+zg4iufYWrfIOqe4WqfoOofYOmfoCefHmUdXKJbWh8Y1lrVU1aRklRPENIND9CLy8wKjAxKzAxKzAxKzEyLDEyLDIxLDMyLTQzLjQzLjc0Lzc0LzYzLjUyLTUwLDUwLDcvLDcvLDYuLDYuLDMuKzItKjAsKzAsKzAsLS8tLi8tMC0tLy0sMSsqLykqLikoLS4pLy8oLy8oLy8oLy8pLS8pLS4qKy4qKy8rKi8rKi4tKS4tKS4vKi4vKi4vKS4vKi4uLi4uMC4uLi4uLi8uLC8uLDEtKjMuKzUtKjUuKDcuKTgvKDovKTswKjwyKT0zKj41LD41LD41Lj41Lj41Lj00LTwzLjwzLj0yLjwxLTswLjswLj0vLj0vLj4wL0AxLkMwKkMwKUEyKz40Kzo2LTk1LDozLTwxLT8tK0QqKUkqKE4rJ1QvKVo1LV86MWU+L3BBL3hBLYBBMIhAMo8/NJE9M5M6MpM7MY05Los8L4s+LoxAMI1BMY1BMY5BL5E/MZU7MpU7MpA8Mos9MIY+MINAL4E/L4I/LoVAMYY+L4k9MIg8Loc7LoQ7LII6LIA7LHg4LHg8MXM5LW45K3M+LnM+LnI4KnU6LH09MYNBNYlFOotJPYlLQIZOQYRQQ4dORZFKSJdTUpJmXYx3ZoSGcICTd4Gef4SlhoiniI2nipCnjZCnjYqkiYGfg3ecfW+YdmWSaWCLYFmCWll7WFx3WFpuU1NhSk5VQ0ZIO0NANzw3MzcvLTMqKzIpKjEoKy4oKiwqKyoqLCspLCspLC0oLC8pLTIoMDIoMDIoMDIoMDIoMTApMS8qMS0qMy0qMy0qMTItMTIuLTAsKS0tJTg6LFNYQm94XYCLaYeWb4aZbIaeboijcIakcISlcIqtd5O2gJm5h5a2hJOzgYyue4areIKod4KoeYOofIOmfIKkf3+de3iSdXGIbmh7ZVlqV01aSEVMPEBENTs9LzEyLDEyLDEyLDEyLDIzLTIzLTQzLjQzLjU0LzU0Lzg1MDg1MDg1MDc0LzcyLjYxLTgwLTgwLTcvLDYuKzQvLDMuKzIsLDEtLDEtLi8tLjAuMS8tMC0tLywsLisqLyspLi8oLzEnLy8pLS8pLS8pLS8pLS4qKy4qKzAsKzAsKy8uKi8uKi8uKTAvKjAvKjAvKy8vLS8vLzAuLzAuLzAvLS8uLDEtKjItKjYuKzcwKjkwKzoxKjwxKz0zKj40Kz81LD82LT82LUA3LkA3Lj82Lz41Lj00LT00LT0yLjwxLTswLjswLjswLjswLjwxLz8xLkMyK0UwK0gvK0stLUwsL0srLkkqL0UrLkEtLEAuKkEuKEUuKE0uKVgxKmIzLWc1LGo6LG87LXc7MIE9NIc8Now8NY06NI06NIo8Moc9MoY+MoU/M4ZBMolBM4xCNY9DNY4/Mo89L4w+MYo+Loc+L4U+LIY9Log8LIk7Lok8LIg6LYY6KoM7LH88KX49K3s8K309MXo8MXY6L3U7L3hAMXhAMXY8LnY7LX8/NYJCOIlGPYtIP4lKQYdLQYdOQ4pORpFKSJhUUZZmXJB2ZYeFboKRdH+de4Gkg4Woh4iqiY2qjJCpjI6liYifg4GafXmYeGmWbWGSZVyLYVyGYF2CYFt8XVVyVlBoUEZZRUJQPzpEOTM6Mi4zLCovKSosKSoqKDAnKDEmKjEmKjEmKjAnKjEoKzAqLjArLy8qLi0rLiwrMCssMCktMCgtMSgtMSktMDEvMjMvLi4qJyoqIjU3KlBVQW12W3yKaYCQa36Tan+ZaoOfboCgbn6gbYClcYeseI2vfIuteoiqeISpdoGndn+ndX+md3+meX+keYCifX2beXeRdHCHbWh8Y1lrVU1aSERIOT0/Mjk5LTIzLTIzLTM0LjM0LjM0LjQ1LzU0LzU0LzY1MDc2MTk2MTo3Mjo3Mjk2MTk0MDk0MDoyLzkxLjkxLjgwLTUwLTQvLDQuLjQuLjMvMDMvMDEvMDEvMjAuMS4uMC0tLy0rLjApMDIpLjAqLjAqLjAqLjAqLC8rLC8rKjEtLDEtLDAvKzAvKzEwKzEwKzEwKzEwLDExLzExMTEvMDEwLjEwLjIuKzMuKzMuKjkyLDkyLDsyKzwzLD40K0A2LUA2LUE3LkI4L0E4L0I5MEE4L0E4MUA3MD41Lj41Lj0yLj0yLjwxLzswLjswLjwxLz0yMD0yLkIzLkUyLkwuLlIrMFYnL1UmLlAnL0kpLkMvLjwxKzsyKT8yKUcwKFIvKV8uKmQvKWk5L2s7L3U8M308NoU7OIk7OYo7N4g6Nok+OIZAOIZCOYVCOYVDN4ZCN4dBN4lBNYhAMYhBL4dALodALoc+LYg8LIg7K4k6K4o4Kog5Koc6KoM6KX88KXs9KHg+KHg+KoI+MXs3Lno3Lno8MXY7LXc9L3xBM3tAMoBCN4NFOoZIPYhKP4ZKQIdNQohPRIpRSIxTSo5cUY5oW4t0YoV/Z4CLbX6Wdn+efIOng4Sph4eqiYuqioumh4eggoOafn2YeXGVb2mUaWaPZ2aMZWeLZ2SGZV9+X1p3W1BoUEteSkJQPzhENjI6Ly40KiwvKCsqJTImJjUlKDQlKDImKDEnKC8pKy8rLC4sLSsrKyorLSorLSgsLSgsLycsLycsLyorLS4qKzErKzArJy4rIjg4LFBVQWlxWXaEY3uMaHmPaHyWaX+cbH2fbXmea3qgbX+lcoKndIClcX2jcH2jcH2lc36ldn6leH2keHyheH2fenqZd3WQcW6HamV8YldrUk5bR0RGOT89MTo4LDQ1LzQ1LzQ1LzU2MDU2MDU2MDc2MTc2MTg3Mjg3Mjs4Mzw5NDw5NDw5NDw3Mzw3Mzw0MTw0MTszMDszMDgzMDcyLzYxLjYxLjUxMDYyMTYyMTMxMjIwMTEvMDAuLzEtLjIsMDQrLjQrLjQrLjIsLjIsLDIsLDIsLDMvLjMvLDMvLDMvLDIxLDIxLDMyLTMyLjMyMDMyMDMyMDMyMDUxMDUxLjYxLjYxLTs0Ljw1Lz00LT82LUE3LkI4L0U4L0M5L0Q6MUQ6MUU7MkQ6MUM5MEI4L0A1L0A1Lz4zLz4zLz0yLj0yLj0yMD0yMD4zMT4zMUA1MUUzMU0wMlQsNFgpM1coMlIpMUssMUIzMDo2LTc3Kzo2KkI0KU0yKVgvKV4vKWY6MWo7M3M8N3o9OoI8OoY8O4c7O4Y6OoI7N4E+OIFBOIFCOYNDOoNDOoVAOYRAN4JDMoJDMYNCMIQ/L4Y9Log8Lok6LYs5LYk3K4c4K4U5K4I6K349K3g+KnY/Kng+KoE5LXwvJ4I4L4Q+NHc0K3M1Kn1BNn1DN39FOoBHPIJJPoNKP4RLQoZNRIdRR4VXSnxhTnpqUYBwWYF1XYJ8YoOGaYaTdYidfIOjfoGngoKqhYKshoGphH+lgHuefXqZd3qScHqQbHiNbHeMa3WNbXKJbG2EZ2t/ZGByWFtpUlJbSEhMPUBANDs3LDcwJjUqJDYoJzUnJzMnJzEnJi4pJisqKCsrKSstKicsKCcrKikrKikrKioqLCspLCspLC0pKiwjJDIqJzUwKjg2KkJDNVVaRmZwV259XnSIZXGKYnWQZXiYaXeba3OZaHSaaXefa3qibnigbHefbXigbnmjc3uldXuld3yjd3medXqcd3eWdHOOb22GaGR7X1drUE5bR0NDNz46MTk1LDU2MDU2MDY3MTY3MTc4Mjc4Mjg3Mjg3Mjk4Mzo5ND06NT47Nj47Nj47Nj45NT45NT83ND83ND42Mz01Mjs2Mzo1Mjk0MTk0MTg0MTg0Mzk1NDg0MzczMjQzMTUxMjQwLzYtMDYtLjYtMDYtLjQuLjQuLjQuLjQvLDQwLTQwLTQwLTUxLjMyLTMyLTQzLjQzLjQzLzQzMTU0MjU0MDg0MTg1MDk0MDo1Lz02MD43L0A3LkE4L0M5MEQ6MEc6MUg7MkY8M0Y8M0Y8M0Y8M0U7MkM5MEI3MUE2MEA1MUA1MT80MD4zLz4zMT80MkA1Mz81M0A3MkM1MkkzNVAxNlQvNlMuNVAwNUoyMkM1Mj05MDw6LT06K0M3KUk2KFEzKVcyKV0yK2QzLGw1MHY2NH03N4I4N4M3N4I2Nn43NX06NH08Nn0+NYA/OYNAOIY/OYVBOIBCM4BDMYFCMYNAMIU9L4c7Log6Loc5LYU5LIM5LII6LH88LHw9LHk+LHg/LHw9LIc1KosyLKFMRadYUYtBOHw5MIJGO4BLPXlIOnpKPHtNPnxOP31PQoFRRYdVSoJfTHJrT29zUnx1WId3XY95Yph/aZ+Lc6CUepaWeo+dfIujf4iogYWngoCkfnufeX6ZdoORcIWOb4OOcICPcH+QcHuOcHeMbXOHa2p+YmZ2XF9oU1ZbR09NPkdBM0A2Kj0wJzssJzkrKDYrJzMrKC8sJywtJysuJykuKCkuKCstKC0sKi8rKjMpKjQoKjcnKjcnKDMoJDwzLEU+NElHOFFSQF1iS2dxVmp5Wm6CXWuEXGyJXXCRYnGVZW+VZG+XZXKaZnWfbXKcanGbaXSebniicnqkdnmidnmfdnaadHeZdnWUcm+Na2qFZmN8XlVsT05cRUNDN0A5MTs0LDY3MTc4Mjc4Mjc4Mjg5Mzg5Mzk4Mzo5NDo5NDs6NT47Nj88Nz88Nz88N0A7N0A7N0I6N0I6N0E5NkA4NT04ND04NDw3Mzw3Mzw3Mzw3NDw3NDw3NDs2Mzk1MjkzMzgzMDgvMDkvLjgvMDgwLjgwLjgwLjYxLjYxLTYxLTYxLTUyLTUyLTYzLjYzLjc0Lzc0LzU0MDU0MDg0MTk1Mjo2Mzw5ND04NEA5M0A3MEE4L0M5MEQ6MEc6MUg8MEk9MUk9MUo9NEo9NEo9NEk8M0Y8M0Q6MUI4L0E3LkE4MUA3MEA3Mj82MT82MUA3MkA3MkE4Mz83NEA4NUI4NkQ5N0c5Nkg5Nkg5Nkg5NEU4MEU4L0U5LUU5K0c5LEk5Kks5K1E3KlovJmQvJ24zLXo2M4M5OIk7OYs7Oos9O4tBPodAOoI9Nn88M386M4I8NIg9N4lAN4NBNYFCM4JAMoM/MoM9MYQ8MIE7L4A8L348Lnw9Lns9Lnw+L3w+L30+L389L4Y5L5AxK6I8OM1sZtl+ea1aVIxDPIhMQX9OQHRKPHFNPXBRP3FSQHRTQHpXRIJbSn5lT21zT297VYR5W5h1X6lvY7ZtZr5xa713b7uCd7GMeqeXfp6fgJahgY2hfoWdeYWZdoiRcouQcoiRcoSTcoCWcnyWc3iTcHSScG2LaWmEZWR4XF1rUVZeR01QO0VEMEI7K0AzKz8yLDswKjcwKjMwKTAwKC4vJy4vKS8wKjIvKjYsKzoqKz4oK0MmK0UkK0MmKEY1LUxDNFZRPltZRGBiSmdtUWl3Vmp7V2yCW2eCV2aGV2yOXG+UYW6UYW6WYnKaZnOda2+bam+ZaXKcbnegdHmieHied3WbdnOXc3WXdnOScm6LbGmEY2J7W1RtTU1dQ0dIOkU8NUA3MDc4Mjc4Mjg5Mzg5Mzg5Mzk6NDo5NDo5NDs6NTw7Nj88N0A9OEA9OEA9OEE8OEE8OEM7OEM7OEM7OEI6Nz86Nj45NT45NT04ND45NT45NT45NT45NT04NTw3Mzo1MTszMDowLjowLjkxLjkxLjkxLzkxLjkxLjcyLjYxLTYxLTYzLjYzLjYzLjc0Lzc0Lzc0LzU0MDY1MTk1Mjs4Mzw5ND86NEI7NUI7M0E4L0I6L0M5L0U7L0g8MEk9MUo+Mko+Mks+NUs+NUo9NEo9NEY8M0U7MkM5MEI4L0I5MkI5MkE4M0A3MkA3MkE4M0I5NEE6ND84MkA5M0I7NUQ9N0Y9Nkc8Nks8NU47NE02Lk42LFE2K1E2K1E3KlA5K1A5KVY2J2Y2KnI2LH47M4lAOZVEQJtIRJ9KR59MRqBRSplMRI5EO4U7MIQ3LYU3LYw5MY09NIg+NYc+N4Y9NoU8NYU8NYE9NH09M3o+M3hAM3ZBM3hAM3o+M388M4M6M4g3M5EzMZgoJrM9O+x8ev2VksVoY5ZHQIlLQHhIOm5NPGpRPWZUPmhWPmxYQHRbRX9gTIBoUHlzUYR3VZ50XLRsXslfX9NWXNlRW9dUXORvddl6eMyGfMCPfrWVgKuVfaOSeJ+PdpyKcpyKdJmNdZWPdZGRdYuSc4aRc4KRcnyLbnmGanV7YW1vV2diTl9UQlVFNVI8L080LU0xLUkwLEQvKj4vKDkvJjcuJzYvJzgxKTovKT0uK0EsK0YpK0goK0snK0gpJ1RCNFlRPGReRmdlTGlsT251Vm17WGx+WGuEWmeEVmeHVm2PXXCVYnGWYnKZZHWdaXSbbG+Za2+WanKZbXeddnmfeHeaeXSWdXOUdXWUdXOQcW+Ka2mEZWF8W1RtTU1dQk1OQEtCOUY9Njk6NDk6NDk6NDk6NDk6NDo7NT08Nz08Nz08Nz08N0A9OEA9OEE+OUI/OkQ/O0Q/O0VAPEVAPEVAOkQ/OUQ/OUM+OEU+OEQ9N0I7NUI7NUI7NUI7NUI6N0I7NUE6NEE6NEE4M0E4M0E4M0A3MkA2ND43MT43MT43MTw3MTw3MTs2MDo1Lzg1Ljg1Ljc0Lzc0Lzk2MTk2MTk2MTo3MDw3MT04MkE6MkI7MUM6MUQ8MUY8Mko+Mks/M0xAMk5AM05ANU5AN05AN0w/Nks+NUk8M0g7MkU7MkU7MkI5MEE4L0A5MT84MD84MD84MEA5M0A5Mzw1L01EPU1AOks6M1RAOVI2Mk8wK2E8NlwzLWA1LmA0K14vJ14vJWY2LG09MXE9MIlJPY9HO5dJP59LQZ9GPps+N5o9Np5EO6ZORKRQRahWSqtZS6VPQplBNZc7MJs+NpM5OJE5OIw2NYY1MoY4NIQ/OHxANnI+MXJCNG9BMnE9MHY6MII3Mow0M5ItMZonLMhISehiYcVFRM1XVeF5dqtWT4ZGPIRWRm1SPWlbQWliRmplSGpgRW5eRHxkTI1qVJJiTLJtXdFuaNtYXeA7TOctRfIrSPUwTPZAWexJXORbZeVucuJ7fNuAfduDf9iJgsN/dr2Bd7qEeLaGeLKIeK2Kd6iLeaWMeJqAb5l+bZh4aZNvYY1iWYRVTXtJQnhBPnU6PGkuMmQwMmExMVAmJ0clI0wwLU01MUc0LkUyLEQxLUYxLkYuLEcrKkstLVE2L1lINGBXOmZfQmdkRWtvTnV8WnWEXW+BWWyDV2yHWnCNXXKSYXOVYnWXZHeZZnabaHKWanOYb3OXcXGVb3OVdHeZeHqYfHmWeniVeXONcm2HamuEZmmCZGF6WlRtTU9fRE5PP1NLQFBHPjk6NDk6NDk6NDk6NDo7NTs8Nj49OD8+OT49OD49OEE+OUE+OUI/OkNAO0Q/O0Q/O0ZBPUVAPEVAOkVAOkQ/OUQ/OUU+OEU+OEU+OEU+OEU+OEQ9NUM8NkM8NEQ7NEM6MUI5MkI5MkI5MkI5MkE4M0E4M0A5M0A5Mz43MTw3MTs2MDs2MDk2Lzg1Ljc0Lzc0Lzk2MTk2Lzk2Lzo3MDw3MT46MUE6MEI8MEM7MEU7L0k9MUo+MExAMkxAMk5AM05AM05ANU5AN00/Nko9NEk8M0g7MkU7MkU7MkM6MUI5MEA5MUA5MUA5MUA5MUE6NEI5MkQ5M0k4MUwvK1YuLGo3NnU5OXs7O4VFQ4NEP4RIQIVJQYZHPo5JQplOSKFQTKJPR5NEN5RCNJpCNp9DOKA+M5w3LZw3LZ89MKNDNZs/MJlAMKBFM6RHNqdGNq5IOrZORbRMTa9ITKVARJk5O5E5OI0+OoNAOHg+M28+MHpJO4VMQYQ/OIQsK5IpLrM5RNJMV9xLTt9NTco+PcBAP9BgXLNZUYRANYJURHlhSWVbQF5dP2loSXNsT3ZnSn5kS5ZjTrxkWNZfW+ZVWutBTvIsRf4lRP8mSP8nSf8uTvkzTvI8UvBJWutQXuVRXeNTXeBYYttiadVmbNRqbtJtcc9xcs11dMl4d8d5d8p8fMl5esh2eMdxdMZrcsVmbsVha8Nfa8VgbrNTX6VLVZpHUY1ES4ZFSW02OUgcG1QxLU0wKkgxK0o2L0s4MUs6Mk8+NlVFOFtPNWNaOWdhQWlmRW5yT3qCXXqJYnSGXnKJX3CJX3CLYHGOYHWSZHeUZHeUZHeUZnOSaXiWcnqXeHmWeH6YfYOdhIWdh4ObhYGZg3qSenKJb22EaGiBZGB5W1RtTU5hRVJTQVZQQlVPQzg5Mzg5Mzg5Mzk6NDs8Njw9Nz8+OUA/OkA/OkA/OkNAO0NAO0NAO0NAO0Q/O0Q/O0ZBO0ZBO0ZBO0VAOkVAOkVAOkdAOEY/N0pBOklAOUg/OEc+NUY9NkU8M0Y8M0U7MUQ6MUQ6MUQ6MUQ6MUQ7NEQ7NEQ7NEM8ND84MD84MDw3MTs2MDo1Lzo1Lzk0Ljk0Ljk2Lzk2Lzo1Lzs3Lj43L0A5L0I5MEM7MEU7MUY8MEk9MUs/MU0/Mk1AME5BMU1AMFA/NU0/NEw+M0s9Mkk8M0g7MkU7MUQ6MEM6MUM6MUE6MEE6MD87MkA8M0A8M0Q7NFVEPFIzLmoyM45BR61MV8NVYMtdZsZfYptCPpdJP5ZMQZxOQqxSSr5VUsxPU8RMS6VANJ1CMKBAMKU/MaU7LqM3K6Q4K6c9L6tFNqE+K5g3JJ06J6U+LaxBL7JDMrZEOqcwMq86QrlETL1MUrpNUq1LTJZBPoI3MXs4L3Y2LHgyKoQxLZwzN7k9R9VHV+hNW+JGSc81M9A6Ob0zMchOS8ZjXZRKP4xbSn1jTGpfQ2dkRXRvT39wUYFoSo1oTrBoWeRiYvVRWvREUfY3Sf0xSv8yTv8vTf8qSP8yT/wwS/cxSvU1TPI0TfAyS/MzTPM3UPJAWO9DW+5GXe1JYetOY+pRZehVaOhWa+VTauRSaeNPaeROaedObOtQb/JTc/NWdf5ohfFhfOVbdNVVbM1ZbMlkcqhSXXItMl4mJ1kwLFc6NFE/NUI6LTo4KT5CMUxOOVZPM2FWNmVfP2hlRHF1VH+GZX6MaXeIZHiMaXWLZXKLZHKLY3aMZXmPaHqQaXqQaoCVdoSbfoqehY2gipKjkJeolpipmZammZGikoeYhnqNeXCDbWd+Yl53WVRtTVBjR1NYRFhVRFlWRzc4Mjc4Mjg5Mzk6NDs8Nj0+OEA/OkFAO0JBPEJBPERBPERBPERBPERBPEVAPEVAPEdCPEdCPEdCPEZBO0ZBO0ZCOUhBOUhBOUxDPEtCOUpBOElAN0g+NUc9M0Y8MkU7MUQ6MEQ6MEU7MUU7MkQ7MkU8M0U8NUU8NUA5MT84MD04Mjw3MTs2MDo1Lzo1Lzo1Lzk2Lzk2LTs3Ljs3LD84LkA6LkM7MEQ8L0Y8MEY9Lko+MEs/L01AME1AME1AL01AME8/Mk8+NEw+M0s9Mko8M0c6MUU7MUQ6MEQ7MkQ7MkI7MUA8MUA8M0E9NEI+NUY8M1M4MVsqJok6P75UYNlUZeZVZuNVY8tKT58zMJY6L5E+MJlBM65GPcVJR9VCSM0+QLFCN6dGNalCM6xAM68/M7A+M7NCNLRENrJHNalCL6M8KaQ7KKk8KKs6KK42Jq0zKLY5N7o5Pb03Prw3PL88QsZKTMRUU75YU5k/N4w0KoksJZ02McNIS9xPV+JBUdszQN46Oc0uKtM4NMg3NMZFQMhdValXS5BXRndXQHZlSX5wU39wUYRmSpBkS6lvW9V1ae5TV/xEUPc7Svg5Sf49Tv9AUf86TPk0SP8/U/45Tfo0S/0zS/0xSv8vSf8wTv82U/8zVP00Vv02V/o3V/g5Wvg9XPc+XvVAYfhDZvZAZvU/ZfU/Z/g/aPxDbf9Fcv9Jc/9Pdf9Rdf5VdvJTcedUbuVheNZmdrdXYn0xNWowL1gxKlA4LEc+Lz5BLjtELz9HL1BLLl9UOGdgQ29rTnx8YIiOcoeRdn2LcXqNcXyPc3yPc3qNb3qKbX2Mb4OSdYiXepWjipyplaOunaaxoay0p7G5rrC3sKu1raGropSglIORgnOEcWh8Y110WFNsTlBkSFJaQ1dZRFlaSDY3MTY3MTc4Mjg5Mzo7NTw9Nz8+OUA/OkJBPEJBPERBPERBPERBPEVCPUZBPUZBPUZDPEZDPEdCPEhDPUhEO0hEO0pDO0pDOUxDOktCOUtBOEpANko9NEk9MUg8MEc7L0U7L0U7L0U7L0U7MUU7MUU7MUQ7MkQ7MkA5L0A5L0A5MT84MDw3MTs2MDs2MDo1Lzs3Ljs3Ljs3Ljw4LT84LkE7L0M7MEQ8L0c9MUc+L0s/MU1AME1AME5BME8/L08/ME8/Mk49M049M0o8MUk7MEc7L0Q6MEQ6MEQ8MUQ8MUI7MUA8MUE9MkE/M0I/Nks9NFw1LnczMq1MU9tdaeZNX+VAUdc2RbcmK6gxKZ03KJI6Jpc8KaxAM8NEPdQ+P807O7E/NahCNKpAMq0/MrJANbhDObxIO7tKPKw+L6o/L6g9K6Y7Kao5KbA6LLc7L7w8McpGQc5EQdA+P9A3OdY3PN5CReJMTt1ST8RDPsZLQ81UTNRTTdlLSts/QuA1PuEyN9s0Lto3LtAxK886NL84NLNAObVbUJZVQ3tOOYJiSYZrUIRgRpJbRq1mVMtyZOdtaOpFS/I6ROo5Q+c8ROdCSOdGS+hHTOpGTfRKU/JCTfI5SfY1SPkyR/0vRv8yTP84Uv85Vv85WP86WP06Wv47Xf89X/9AYv9BZf9Daf5Ea/5Ebf1CbfxDb/xDb/xCcf1Cb/9HcP9AaP9Hbf9NcPJJaOlPa+Vbctljc71ZY44/RGAmJFErIlZAM1ZPPUlMN0BELVJKM2VZQ3VqVoB7Z46NeZmci5WcjIiTg4KOgImXiI+bjYyZiIeSgoqTgpeejqSombK2p7i8rr/BtsDBucLDvcXGwcPDw76+vrC1saKpoo2XjHmHdml7ZVxzWVRtT1JmSlFbQlVaQ1dcRjU2MDU2MDY3MTc4Mjg5Mzo7NT08Nz49OEA/OkA/OkNAO0RBPEVCPUVCPUdCPkdCPkdEPUdEPUhDPUlEPklFPElFPEtEOkxFO0xDOktDOExCOEtBNUxANEs/M0o+Mkk9MUc9MUc9MUY8MEY8MEU7MUU7MUQ7MkM6MUE6MEE6MEA5MUA5MT04Mjw3MTs2MDs2MDs3Ljs3Ljs3LDw4LT85LUE7L0Q8L0U9MEg/MEo+MEw/L01AME5BME5BME8/L08/L08/Mk49M008Mkw7MUk7MEc7L0Y5MEM5L0M7MEI8MEI7MUA8MUA+MkE/M0I/Nk47NG04NJdGRcRZX9tXYt9DUd44RtQzO70rK60xJ6E4JZg6IZc5IKQ7JrY+LsM6Mr43Mac3LKI6LaU5Lac3LK86MbhCOLpFO7dFOq4+Mq0/MKc8LKQ2J6o2KbY+MMNEO8pHPb44Lc5ANuFEP+xCQvQ9QfM5PusyN94uMNs3NeJHQuhTTOVOR9w9OdkxMOMvMuo2N9kxKN48L80sItA3Mb4zLLA3L8lnXLhsXI5XQ4daQ4NWP4lSPalcTM5sYeFnYuRUVPBFS/E9RuQ7QNk9PtJBPtJHQt1PTetXV+1OUu9ETfA6R/Y1RvcyRvguRPsxR/43Tv44U/04VP04Vv45V/87XP8+Yf9BZf9Da/47Zf08aP0+av0/bfo+bvg+b/Q9bfY6av9Icv87Yf8/ZP9Lbv9LbvdObe9Vb+NabuhygsJhaphJTHQ6OFw2LVA5K1BDMlVNOl5RQXJlVYh8bpWNgp+dkaann6Gmn5acmJWem56npKavrKasqKKno6aoo7W0sMLBvMzJwNHOxdXQzNXQzdTOztXP0dHLz8vGyr+9wLCyr5ifmICMfm1+a2B0W1duUlZqTlNgRlZgRVhgSDU2MDU2MDU2MDU2MDY3MTg5Mzo5NDs6NT08Nz49OEE+OUNAO0RBPEZDPkhDP0hDP0dEPUhFPklEPklEPkpGPUpGPU1GPE1GPE1FOkxEOU1DOU1DN05CNk1BM05AM01BM0pBMkpBMklAMUg/MEc9MUY8MEQ8MUQ8MUM6MUM6MUE6MkA5MT84Mj84Mjw3MTw3MTw4Lzw4LTw4LTw4LUA6LkE7L0Q8L0U9MEg/MEs/MU1AME5BMFBAMFBAME9ALU8/L089MU89MU09MEw8L0k7MEY6LkU4L0M5L0I6L0E7L0E6MD87MD89MUA+MkBANFA5MXIxL6hKS8FTVrs+RL0wNsIwM8EvL7oxKakxIaM5I5w9IZk7H5s8IKE9I6U7JaQ2JZ42KaA4LaI2LKU0LK04MbdAOrhDPLJANrFCN61BNKg8L6Y4K686MLxDOMNEPcVAN8M+Lc8+Ldk1K+EqJu0iJfolK/8qMf8uNO0pKucuK+EzLN80LOAzLOMyLOkwLecyK9oyJdY2JtAyJs83LMU2Lr0+N8hgVdJ/caZlU49WQopNOqNXSchmW99kX+dSVOhDSfVGTe1ARN8/P9RAPMlAOMZAN9FGQeNNTO9KTvRAS/k5SP03SPw1SPgzRfc2R/o7Tfo4UPw3Uvs2Uv02Vf82WP85Xf87Yf88Z/8+a/8/bf9Acf9CdP9Cdf5CdfxCdPlCcP9GbfpBYf5FZf9Lav5La/9WdP9fevVddPJqfuZwftNvd65eYYNDQWc2L2hCN3NVSnllXIx9dqOWkK2jobKuq7a2trK2uaqvs7C3vba9xb3BysDDysPCysnGzdXO1t3X2+La2Ofd2+nd3eba3OXY3+TX4ODU3tnP2MrFy7q6uqKno4iSh3SCcWV4YlxzV1tvU1tqTVxpS11nTDU2MTU2MTU2MTU2MDU2MTY3MTg3Mjk4Mzw7Nj08N0A9OEI/OkRBPEZDPEdEPUhFPkhFPkhFPkhFPEpGPUpGO0tHO0tHO05IOk1HO01HO01FOk1EO01EO01EPU5DP05DPU1DN01ENUtCM0pBMkg+Mkc9MUU9MkQ7MkM6MUM6M0E6MkE6NEA5Mz83NDw3Mzw3MT43Lz43Lzw4Lz05MD46MUE6MkM8MkQ9M0hANUk/M0xAMk1BMU5BMFBAME9ALU9ALUw/L0w+MU09MEw7MUo5MUk4MUU4MEM5MEA5Lz46Lzs7Lzw8MD0+MD4/MUE/MFM4LYc8N8RcW8paWa44NqsuKrIxK64uJa0yI6w5JqxCKqpGLKZEJ6NBJqNBJqI8I585I6A5KqM7MKY6MKY3Lq08NLZDPLdFO7BANas9MKg8L6k7Lqw8MLtFOcZMQcVFPLw4LL82JM06KN07LuYzLPErKvkoK/0mK/slJ/gqKvUuK+8yLOs0LOgzKuUzKeQyKOAzJeA6KtEyH9w/MM42Kcg4LcI/NbNBNtFsYL9nWaVSQqhPQctjWudoYuZSUupBRvNCSus+ROE7PdY8PM1AOcE+NLY4LLk2LsQ5NOJISOlARfA7RPY6SPo6Sfg4R/c7Sfs/Tv5BVf8/Vv48VP45VP84Vf85Wv86Xv87Y/8+af8+bP8+b/8+cP0+cfpAcvhAdPdBcfdDav9Nbf9Tc/dKaOtAYP1Uc/9nhf9lgvddd+9feOdoe9xwfcZxeKdnZ41eWHtaUZd+d6qZkr6wrcS8usbCw8jHzMfHz8PDz8vK2MzK2NHK2tfO39/U5Obb6erg6+3j6+/l5vLo5vTo6PDk5u7h6O3g6erd5+TY4tHK0cG/wqurqZGWj3qGeGx7aGJ1X2ByWGJwVmJvU2NtVDIxLzMyMDQzMTY1MTg3NTk4NDk4NDk4NDs6NTw7Nj09NT8/N0FBOUNDOUVFO0VFO0hIQEhIPkhIPEpIO0tKOExLN01MOE5LOE1KOUpGOkdEO0pGQ05JTU5JUEdET0Q/RU5FPkxDNEpANEtBNU1DOUxCOEY9NEI5MEU8NUM6NUA5Mz83NEA4NT83NTw3NDw0MkM6NUI5NEE5Nj45NT86Nz46Nz87OEA8OUI/OkRAN0dANkpANExAME9ALU9AK0w/LEdALkY/L0k7MEs4MU01M0s2NUo4OEY7OUI/OjY5MDQ8LzlENDpBLzY5JD89KGJDMbxqXrlKQaY3LKU1Kac3K6U1J6U3Jqg9K6M4JKU8JqpAKq1AKaw9Kaw5Jq42Jas2JaQ2J6E3KaI4KqY8LqpAMqxCNKxCMqxBMak+LKs9LK08LLM9L71DNMRGOMA+MboyJsc5K8w4KtA4K9Y4Lds3LeI1LukzL+4xLfEuLPQuLfMwLPExLOo1KuM3Kd06Kds6KNw5JtQzH9AzIM84J8Y3J742KMJCNc9TSchOQ89TS+FcV+5dWvBQUu0+Q/I5P/c/R+pBRt9DRNVBQcg/Obs8M7E7L7A8L7I8MMpMQNRLQ9xHQ+E+P+s8Qfc/R/0/Sfk7R/5EUfxDUf5EUv9EVf1AVvw8Vf88Wv9CZP9Ga/9Bavo7Z/U6Z/Y8bflDc/1Jef9Lev9Nef9NdPhQc/BPcOdNaepNavxZeP9niP9fg/VHbPZXd+hfecNebr17f4dhXo94cKeRhLunnNHEu93W0N3c2tzb4N7c5+Lb6+bX7OvY7vHZ8fbd8/fi8/fn9PXr9PTu8vn08fn08Pnx7/bt7vPo7O7j6ene5Obd4tbQ1M3Jyru6uKOloIuQiXmDeHJ9b3B7a32Gc3iBbHZ9azAuLzEvMDMyMDU0MjY1Mzc2Mjg3Mzg3Mjo5NDs6NT09NT8/N0FBN0NDOUREOEVFO0hIPkhIPkhIPEpIOUtKNkxLNk1NNU5NOEtKOEtJPUtKRVBQUldVYFlYalZUalJPYE9JS01EP0g/OkY9OEc+OUg/OkY9OEI7NUQ6OEE5Nj83ND83NEA4NUA4NT04NTs2Mj00Lz00Lz01Mjw3ND05Nj46OT08Oj49OUI/OkQ/OUdANkpANE1AME9ALVA/K0xAKkI/LEI/LkY8MEg6MUo2NUk1NkYzNUA2NUA8OTo9Njs+NUBANEU8LUo5KV5CNIBMPq5RQqs7LaAyI6E2JqM6J543JJ45JaM+KqE7Jac8KK4/K7NALbY9LLc5Krg2KLU3Kao5KaU6KqQ5KaU7K6g+LqtBMatCL6tALq4/LKs6KLE8K79FNsZIOcE/Mbw4K8A2Kcs3K883LNA5LtE7LdQ8L9g6LuA4L+c0Le4xLfQuK/QuK/EwK+o0KeE3KNc6J9U6JN48J9k2I9U4JdQ9Ksw7KsE1JsQ6L89GPNFGP9pJROlPTfNQUfRHSfA7QPU6QfhDSOVCRdpEQ9JCQcU+OLc7Ma46Lao8Las9LrZFNcZMP9RORdxHQ+M/Pu8/Qvo/Rv5ASvhDSvdDTPpEUP9GVP1CU/k+U/w+WP9CYf9GaP9Dafw/aflAavlCcPxGdv5Kev9Le/9Kev9IdPVLcPFRc/Vcevlfe/tYd/xOcf1Fa/pEbO9FadpLZ8hfcLFudWtMSZB+dLCWicyypeTTyezj3Ovn5urp7urn8u3i8/bj+fvh+v/i/f/n///s///y/v/2/v/5+/769/369fz39Pr18vjv8PTr7vHo7e/m6+bd4NzW2MrGxbOyrp6hmo6TjImPhYiQg4+Vh4mQgIaMfi8uLDAvLTEwLjIxLzQzLzU0MDc2Mjc2MTo5NDo6Mjw8ND4+NkBANkJCOENDOUREOklGPUlHO0pIO0xJOE1KN05MN05MN09MOUtJOk5LQlRSU19eZmloeG1thWxrimtog2BZaVlRXE9HUkhAS0g+R0c9RUU8QUA6PEM6Oz86Nzw3NDw3Mz04Mj45Mz46MT05MDgzLTk0Ljs2MDw5Mj06Mz47ND88NUA8M0U+NEc/NEk/M0xAME8/MFA/L1A/LUw/LDw7Jjo9KD88K0E7LUI3MUE2Mj40MjszMD04NEI7NUg5NE4yLlksKWwvLoc7PaBGRaM7MKIyJJ8xIKQ5J6U8KZ43JJ44IqI8JqQ7Jqo9KbFBLbZBL7k+Lrs8Lb46Lb48L7I8Lqw8Lqk5K6k5K6s8K60+La0+La08LLI/LbA4KLk+LstMPctHOrw2KroyJsk5LtA2LNQ2K9Q4LNY6Ltg6L9w4LuM2L+gzLPAwLfQuK/QuK/AxKecyJ902JtQ4ItI3Id04JNw1I9o5J9o+L9M9Lsg2KcU5LMtBN8k8Nc0+ONlFQeVLSepKSulDQ+w/QetDQ95DQdVEP81CPcI9NLY6Lq44Kqs6Kqw7K6w4KcBEONRORd1JReBAQOg+QfdCSf9IUPRBR/RASflDT/1HVP5FVfpAVfs/WP5BX/9EZv9Daf9Da/9GcP9Jd/9Le/9MfP9Kev9GeP9Id/9LdPpOdP9afP9hgP1VdvFDZPtJa/9Udtw/XM1JYNh7hbh8fGFDO498bq6OgdWzp/Pb0fvs5fry8Pn3+vf0/fTs+/rr///q///s///u///z///3///7///9/P/++//9+f/6+P/49v/19v3z9Pvw9Pnw8/Dn6uXf4dPPzr69ua2uqKKlnp2jmZ2jl6Ornp6ml5ujli8uLC8uLDAvLTEwLDIxLTMyLjU0LzY1MDg4MDk5MTs7Mz09NT8/NUFBN0JCOENDOUhFPEpGO0tIOU1KOVBLOE9NOFFMOE9MO0xKPlFQTF5dYm1senp6koGCoYCCqICApnt1l3JrimVfe1lTbVRMZE1FWkdAUEI8SEQ/RkA7Pzw4Nzs2Mzs2MDw4Lz05Ljs4Lzo3MDk5MTs7Mz47Mj89MUA8MT87L0E7LUY/L0g/Lks/L01AL08/ME8/L1A+MEw/L0A9Kj8+LEA9Lj87Lz87Mj45Mz06NTo5NDw5NEQ5NU01MVYtK2opLYQyOJ44Q6s+Q6Y3LqU3KKU6KKo/Lag/LKA5JqE4I6Q7JqU6Jqs8KbM+LLlAL70+L8E9MMU9McQ+Mr0/M7Y9MrI5Lq44Kq85K7A6LLI6LLM5KrY7LLk7LcRCNMtFOcg+M74xJ8AyKM05L9Y1K9g0Kto2Lds3Ld43LuE2LOYzLOwxKvMwLPQuK/QvKe8wKOQyJts0JNI2INA1H9cyHtowH9o0JNw8LtY9L9A5Ls09MtJEOsQ1LcU2MMo7NdhEQOJNSeVLSd5DP9Y9ONNAOc5BOMc+NL48L7U6K7A4Kq85K7E7Law0Jr0/M9FIQNlIQ91CQOVARPNGTP1OVfA/RfA/RfZCTf5IVf5IV/xCV/pAWPxBXv9BY/9DZv9Gbf9Jcv9Nef9PfP9Me/9Jef9Edv9Ofv9Sff5LcvhNb/9Wdf9VdfdNavBGY+9LZtI+VuFkdP6fp9OPjmQ5MmxKPqV5btClnPXUy//p4//08v/9///8//nz//zv///v///w///y///0///3///7/f/8+//9+v/8+P/6+P/59//29//19v/0+P7z9/br7+zj5NrV0snGwbq5tLO0rLG0qbC2qra+s7C4ray0qTEwLDEwLDAvKzAvKzEwLDIxLDQzLjU0Lzc3Lzg4MDk5MTs7Mz09Mz8/NUFBN0RBOElFOkxGOk5IOlBKOlJLOVJNOlNMOlFLPU9KRFZUVWZkcXd4jYaGqI2QuY+Tw4+Qxo6LwIeDtnt3qXBtmmlkjV9bflVQbk5KYUtHWEVCTT89Qjs3ODk1Mjk2Lzg1LDg1LDY3MTc4Mzg5MTs7MT48Lz88K0I9KkM8KUc/LEo/K0tALExBL01AME0/MkxANEs+NUw/Nks+NUY8M0I5Mj04Mjo5NDY7NDc8NTk8NT46MUg0LVkyLXc3OJQ/RKY+Rac5PKo7MKo8K6tALqxBL6lALaU8KaY7J6s+Kqc4JK06J7U8K7w9LsE8LcU7Lso8MMo9M8U/Nr4+M7o6L7c3LLc3LLg4K7o4K7o4K7s3K8dBNc1DOMU4LsExJsYzKcs3Lc81K9s0K98zKeE0LeI2LOM1LOc1K+wxKvAvKvUvLPYvKvIvKewwJ+IyI9k0IdA1H880HtYxHtkvHtgyItg2Kdc5LdQ6MNY/NthFPdZGPs1AN8k8NctAOdZLRNlOR9JFPsU7McU9McI8MMA8L7o7LLc5KrQ6K7Y8Lbk/MLU5Lb88MslAOtJDP9tDQuNESO1KT/ZPVuw/Re0+Q/JCTPtJVf9KWf1GWPpDWftDXftAX/tCZP9FbP9Kc/9Oev9PfP9Mef5Jdv9Kd/9Ugf9Uff1KcflJbf9TdP9WdPhOaetEXuRGXepYa/+Wov+1vPOdno5IRmsuKaZrY82Wj/PIwf/j3v/x8P/8/f/9//z3/v72///2///3///4///6///8///9/f/9+v/8+P/7+P/5+P/49//2+P/19//0+P/0+P3x8/Pp6uTc2tbRzc3Kw8nJv8rKwMrNwsnQyL7Iv7fBuDY1MTQzLjMyLjEwKzEwKzIxLDMyLTQzLjY2Ljc3Lzg4MDo6Mjw8Mj4+NEBANkJANEpEOE1FOE9IOFJLO1RLOlRNO1NMPFJLQVFMSVpXXmxpfH9+nYyPuJaZzJme2Jqe3pmY2pSR1IyKyYaFv4F+tXh2p25rlmZlh11ad1ZUaU1LWURBSj48Pzs6ODs3NDc2MjU1NTQ1NzY2NDg3Mjw6Lj88K0M+KkZAKkc/KkhAK0lBLElCMElBNEhCNkhBOUdAOks9PEk7O0M5Oj03Nzg3NTM4NC84My85MTc8NTc0K0MxJ104MH5DPZZHQ54+P541Mac7L6o8K6o/Lao/Lak+LKk+Kqw/K7A/Las4JbI5KLk6K785LcM5LMg6Ls06MM88NMs+NcY7NMI5McE4LsE4LsI5L8I4LsM2LMU3LdFDOdBAN8MwJsMsI9A3L9Y8NNMyKuAzLOQyKOcyK+gzKuozK+0yK/AvKvMtKvYvKvUuKfEwKewxKOE0JNo1ItE2INA1H9g3I9kzI9YzJNUzJtU1KdQ4LNQ8MdY/NuxZUeFSStNIQcxDO8pFPMxJP8hFO8A+Mbw6Krw7KLw6Krk6Kbc6KLg6K7w+ML9BM8FBNsE8M8U8Ns9BPddFRd1HSORJTetMUOhCRupAQ/BDSflLVP5OWfxKWvxGXPxGX/hBX/lCYf1Faf9KcP9Od/9Pev9OeP9Mdv9Re/9Sef5Pdv1PdP9Wef9de/9Tb+5EXvpUbO5RZPdkdP+Snv+LlfSDicdgZKdNTbVqZ86Piu+8uP/e2f/v7v/6+f/8/v37//36//77///7///7///8///7/f/7+//7+P/7+P/8+f/7+v/7+v/4+v/2+P/z9/3x8/nt7/Lm5ufd29/Y0tvXzt3bz+De0t/h1tzj28/Y08XOyTw5NDs4MTg1MDUyKzQxKjQxKjUyKzYzLDc0LTg1Ljk2Lzs4MT06MT88M0E+NUM/NEpCN01DN1BHOFNKO1dLO1VMPVVLP1NKQ1NKS11XY25sgoKCppGVxZqg2p+m6qKp8aGl756g65mb5ZWY3ZSV1pCRyomJvYKDsXp5oXJxkWZjflhWa1BOXElHUkZDTENCSj8/Sz09Rzs6QDs5Ojw5ND87L0M9LUVALEZAKkZBK0VCL0VDNENDN0JDO0FDPkBBQ0I8RkQ+TENBTkVFT0NITkFJTD5IST5HRENIQUE9Mkw6LmdGN4NPQY1JPI4/MpQ4KaU+L6k+LKs+Kqw/K61ALK9ALbA/LbE8KrE4J7Y4Kb05KsM5LMg4Lcw4LtI5MdQ7Nc86NM06M8s4Mcs4Mcw5Ms06Msw3MMs2L9M8NdU+NdI5McwyKM40Ktg7Mto8M9czKuQxKukxJ+wxKu4yKfAxKfIvKfQtKPYsKPctKfQvKfAxKekzKOI1J9k2JdI3Ic83INQ5JdU4JdM2JdE0JdI0KNM3K9I4LtA3L+NOR+hYUOdaU9pRScxHPsREOb9AN7k+L7k8Krk8Jrk8KLk6J7g5KLo7KsA+MMNBNMlEO8ZAN8lAOtFGQ9VJSNZIR9hHSt9JS+ZGSOhCRO1ESfVMU/xRWvtPXftMXftLYPZEXvdEYflGZv1JbP9Odf9PeP9PeP9Qd/dWePNVdvRUdvxZeP9de/9ad/tRa/JJYP1Xa/ZVZ+pNXvZebeJLWuZUYeVUYddYYcFlZsiDfuWrp//U0f/r6P/z8v/4+f/+//v8//v8//v8//z8/vz6/f35+v339/z39P/69//7+P/8+//7+v/4+P/z8/3u8frr7vDh5Ond3eTZ1eLZ0ubf1evn2/Ht4fHx5ezz7Nvm4s7Z1UA9Nj06Mzo3MDc0LTUyKzUyKzUyKzYzLDc0LTc0LTk2Lzs4MT06MT88M0A9NEI+M0pCN01DN1JGOFZKOldLO1hMPFdLP1RJQ1NKTV5YZnBtiIKEq5GXy5yk46Ot9aew/aqx/6as+qGn86Ck7p+j6p2h4Zmb1pWWzJKSxImItHl5n2ppi2BdfFhVcFJQaE9NZU5KY0tHXkZCU0A9SD86Pj86NkA8MUE+L0NAL0NCMEJDM0JENz9EPT5EQDxFRDtCSj5DVkNJYUxSaFVcb1xicmBkb2JiamRgYWZYV2FKRGxHPoNTRZVYRpNKN5FAK5k+K6hBLq5AL65BLa9ALbBBLrRBL7I9K7A3JrU3KLw4K8I4K8g4Lc02LdE3L9U4Mdg7NNI3MtA3MtA3MtE4MtQ5NNQ5NNM4M9M2L95BOtU4L9EzKtY4L949Nd49Ndo5Mdw1LOcyKeswJ+8wKPEwKfQvKfctKfcsKPcsKPctKfQvKe4yKek0KeE1J9o3JtQ3JM84I843Is84Jc43JM82JtA3KdI5K9E3K840Kss0K+NOR/NkXOtgWdVPRsRBN7o7MrU5Lbg+Kbg+J7k8Jrk7Jbo5Jr05KsA8L8Q+MspEOcpBOc5FP9VLSNNMSc5HRM1FRdZIR+NJSeZDROhFSPJNU/hTWvlSXPdPXvpPYfRIXvVHYPhHZPtJaf9Ocv9ReP9Sef9UevBVde9ad/leff1efPlVcPVNZ/lPaf9Zbv9bbf9jdPBNXvdUZfRPYPxVZ/VMX+RSX8BeX7t2cdecmPrJxf/l4//t6//09P///fz///v///v///v//v39/f38+v759v349f/49f/59v/6+f/6+f/29vzw8Pjp7PTm5uvd3eja2eTZ0+je1fDo3fnz5f/67P7+8vT69uHr6tPd3EI+NUE9NEA8Mz46MTw4Lzo2LTg0KzczKjYyKTYyKTczKjg0Kzs2MD45M0E8NkU+NklAN01DN1JGOFVJOVdKOlhLO1pMQVtOSFRJTVhSYGdkgXx+p42Sypeg456q9qWw/6qz/6uy/6y0/6yy/Kqx+aqv86is7Kmr6J+h2pma0o2NwYF/sXRyoWhlkl1ah1hSflhRellRdlZPbk1IX0M/TT86QD87OkI/OD4+NEBCNUJFOj9EPTxCPjpDQj5GSD9MVURWblFmg2FyjmlzjnR2j4F4jYRvgIBebIpbY5JXWZ5XVaZWTaZNP59ALpw5JKA6JKc8KKw9Kq4/LLFALrNALbQ/LbY9LLk7LLo2J742KMQ2Kss3LdE3LdY4L9o5Mdo4M9c4NNg5Ndk6Ntg5M9g2Mdg2Mdo4M906M+ZDPOA9Nto3MONAN/5bUv9sY/9dVOc/NuUzKe0yKfEyKvQvKfQqJvUoJfgoJvgrKPctK/MwLO0yK+MxJ9owI9QxItQ0JNM6KMw7Jso8KM08Kc88KtI6LNI5K9I4LNE3LdpAOM84MdxHQfRjXuVYUctCPMVAO7c0Krc6JrY8JLk8Jro8Jr06KL86K8Q8MMY+Msc+NMxDO9lQSt9YUtRPSsM/OsA/Os9IRN5IR+JHReZKS+9QVPFSV+9OVu1LWPFMXPlSZvhPZvdLZfdKZvxNbP9Rc/9Sdv1SdvRXdu5YdfVYdftbd/9ceP9ac/9Xbv9Wa/9idf1WZ/9cbf9bbPFGWPREWP9RZe5WZcZmZ6ppZcqPi+e2svjSz//r5/3v7vz49/n9/Pn///n///r//vz+/f/+/P/7+P729P759f/79//59v/29P/29v/19fbo6ObY2OPV1N7QzeHW0PHn3vz05/746P/86f//8/r/+ejx8Njh4EM/NkI+M0E9ND87Mj05MDs3Ljo2LTk1LDczKjczKjczKjg0Kzo1Lz04MkA7NUQ9NUg/NkxCNlFFN1RIOFZJOFdKOVlLPlpNRVVKTldRX2Vif3l7pIqPyZSd4pum9aOu/qu0/6y1/662/6+3/7C3/6+2/K+0+K+y9amq66Kj45iY2IyKyYB/u3VxrmlloGNemGBXjmBWiF1Uf1ZQdE1JYkZDVEJBSUFBQzw8OkFCPUZFQUNEP0E/QERCRU9NUldWZGNohnF1mn99ood9n5J9nKB7mqVwiqRgdaxZabZWYbpRVbhIRrBANKw7Kaw8Jq09J6g4JKg3Jas4Jq45KLA4J7I5KLU3KLg2KLszJcI0KMo3LdM6Mtk8M949Nd88Nd88NeE+Od88N988N+E+OeVCPehDPedCPOZBO+VAOuZCOeRAN9w4L9UxKNg2K+tJPv9bT/FANu42LOorI+4pI/gtKf8vLf4sK/YoKPowLvU0L+82Mec2Lt4zKdYyJtQyJc82Jss6J8g7J8o8KM06KM85KtA3KdE1KdA0KNM5L881LdQ9NuVQSuVUUdtMSM1CP7cxKLw7KLs9Jr08J747J745KMA4KMI6LMQ6L8g+NMtCONVPRtxXUNJSScNEPb9DO8xIQ9tMSN9KRuVNTOtTUu1UV+tQVulOVuxPWvdWZvhVaPlTafpSa/xSbf9Tcf9TdP9SdfJNbfhVdP9cev9fe/9cdv9Vb/tSaftSZfxVZvdSYv9aaP9aaPNOXvhTY/5Zad9TXrZgX5deV7aBfdmppe7Ixf3h3vnp6f349fr8+fn///j///f//fr+/f///f/7+//39f349P759f759f728//39v/19fbq6urc2+TW093Qyt/VzO/l2/z15f/55//96f//7/r/+Ojx7tvh30VBNkVBNUM/NEE9Mj87MD05Ljw4LTs3LDg0Kzg0KzczKjg0Kzo1Lz04Mj86NEM8NEc+NUpCN05EOFJGNlRHNldHN1lJPFlKQ1dLS1hQXWJeeXN1nIWKwpCZ3Jik8KCr+qqz/q21/q+3/7G5/7O6/7S7/7W5/7W5/6+y+ays9KOj65mX4I6N04OAx3h1vHNts2tgomldm2NakV1XhVZSd05LaEVEVkBATDg1PEE8QEtBQkxAQlE+QlpFSnBXXYJjc5hyl6V6p65/q7J7o7h2nMBwk8Jjg8BUbsJHXNBLXNFIUMQ8PLo1Lrg5KrU8J7A8JbA7J7A7KbI6KbQ7Krc8LLs8LcA8LcQ8LsQ2Kss4LtM8Mdk/Nd9BOOE+N+A8M986NNw3Mdk0LtgzLd45M+ZBO+xFP+lCPOQ9NeM8NNs0LNg0K9s3LdQyJ8wsINY2KulHOvVLPvJANu80LfAtKfYsKvosLPwsLPgqLPAqKewvK+gyLuM1Ltw0K9gxKNUxJ9EzJ803KMs6Kc06KNA6KdI7KtM6KtQ4K9Q4LNE0K9Y8NNU6NdU8N+VPTu1ZV9lFRcIzL8A7LL88KMA7Kr86KcE5KcA4KMA4KsA4LMY9M8dBNs9KQdhVS9JSR8ZHPsBEOsdHPtZLRNhJQ91MSeRTUOVTVOJQU+JNU+VOV/JYZPZaaP1bcP5acvxWbvpSbPtRbP9RcP1Hbf9Qdv9aff9be/9Wcv1Ua/5Xa/9cbftZaPhaaPthbfZga+1dZ+9mbuxmbclcX6BdV3tPRphtZsGYlN26tvDU0fTg3//19Pn59/n//fn///f//fr+/f/////9///4+fz59Pz58vz59P349P/59v/49vnu7O/k4uXa1tvQytzSyO7k2P325P/76P/95///7fr99Orw7N7j30lFOUhEOEZCNkRANEI+M0A8MT87MD46Lzo2LTk1LDk1LDk1LDo1Lzw3MT45M0A7NUU+NklAN0xEN09GNVJFNFVFNVdHOFdJPlhNS1hOV15acXBwloCGuoyW1JWh6Z2p9aiw+amx+a2z/bC3/7G3/7K5/7S4/7S4/6+x/Kut+KWn8p+e6peW4oyL14KBzX15xXVttnBnqmZgnl9akFlYhFFRdUdHY0E+UT01REg4QlQ9Q2BARW5DSoBPVZZdZKtmeL9rj8lumstvmMlpj8hgg8lXeMZJZ8Q7VcYySNlBUOBFTdE7PMY3McQ/ML1ALLE6JK02Iq01JK41JLM1JrY3KLw4K8M7Lcg8L9NANtdAN9pANtw/Nt49Nd45M902Lts0LNMuKNItJ9MuKNgzLeE6NOM8NOE4Mdw1Ldw1LdAsIs0pH9k3LOJCNtw/MNA0JcsuH+lGN/NJPP1IP/w8N/QtKvEjJfUnKfsvMvEtLusvLuQyLt4zLNoxKtcwKtYvKdMwJ9M3KtI5K9Y6K9g8Ldo+L9s/MNxAM9xAM9I2KuZMQuVKRc41MN9HRvNaXN9JS9VBP8g8L8Q7K8M6KsM6KsI6KsI6KsE5K745KsI8MMI+MshGOc9PQs5QRMZIPL9DN8FDN85IP9FGP9VKRdtQS91ST9lNTNpLTdxLUOtYYPNbZ/xhcf9hdfpYbfVPZ/VNZ/9Oa/9Pdf9Sef9Vd/9UcfxUbf1bcP9jdf9qeP9ndfpib/Vhbe1kbONmbNloas5naLVmYY1eVGVHPH9eVamIgc2rqeXHxe/a2f/z8/n49vn9/Pj///f///v////+///8///5+v779vv78/v69f779v/9+f/7+P708vjt6erf2d7Uy93Tye3m1v/45f/+6P//5v//6/j67+rv6OPm305IOk1HOUxGOEpENkhCNkZANEQ9M0M8Mj84MD43Lz02Lj02Lj02MD43MUA5Mz86NEM+OEVBOEtDOE5FNlFEM1JFMlZGNlZIO1pNR1ZNUltXaGxri36CsYqTzpKf45qm7qau96mv+a2w/a+z/bCz/7C0/rCz/6+z/auu+6ir+KSn9KCi75qc6ZOV4oqM2YaF0YN/yXt1u21rrGRlnl9hkllbhFJRc05IYldGWV9DUW1CTIFFTZhNVKxVXbxbYspaaNlScOJSdd9UddlQbNJKYs1CV8c4SsUuP9Q4ReNDS+ZHS9g+Ps0+NsxGOsNINrY/K7c+Lbg9Lbo8Lb0+L8M/MMpCNNBEN9VFOtlFOdpCN9s+Ndk7Mtk2Ldk1LNozK9czKtQxKtc0Ldo3Lt05MN84MN43L902Ltw1LNYvJtk1K9c3K88yI80xItI5KdU+LdQ7Kdg8LeZEN/hKQf1EP/k2NPUqLfYqLfcvMvc2N+01NeIzMNoxLNcwKtcvLNkwLdkwK+M4MeQ5MeI6MeI7MuA8MN89MNw/MNo+MdE3K+9XTPhhWtM7NtE7OuZQUdxGSOZQUc88NMo6L8Y4LMU5LMQ6LcQ8LsM7LcA7LL46Lb48LsNBM8dIOcdJO8JENr5AMrw+MMlGPMpFPM5JQtVQSddSTdVOS9NLS9dMT+laYPBeaPxmcv9oePxdcfJQZfNNZf1Oa/9Wev9UeP9ScvhUbfZdcftoePtqd/dlcvxldPNfbexga+prct9ydcNqZqpkXJ5sYX1mVlhIOWtYSpR8cr2gnN7Cwe7W1v7u7/v19fv7+/v///n///3+///+///7///6/f/++fv+9fv89v/++f//+v/++v/79f/38vHo4eTc0eHZzPDp1//65P//5v/+5f//6vf56+3w5+jp4VFLPVBKPE9JO01HOUtFOUlDN0dANkdANkI7M0E6MkA5MT84MD84Mj84MkE6NEA7NUI/OEVCOUtFOU1GNlBFM1JFMlVGM1VIN1lMQ1VLTFpTY2lphXyBq4mTyJOe3pqk66as+Kms+6yt/a2w/66x/66x/q2w/a2w/ams+aeq96So8qKm8J+j7Zqe6JWZ45KU3pKS2omKzXyAwHN4sm91qW1wnWlnjmpffXlfeIJXao5QX6NPXLtTXM1UXdZQV9tIUuVAUeg/UuRDUtxEUNZDS89ARMo5PMk0NuRKTOdJSuFBQdU3NM45Nc5BOMhEOL4+McNFNsNFNsVGN8lFOM5GONFHOtdHPNpHPdY+M9U7MdY4L9U0LNYzKtg0K9s0LNo2Lds4Md08NOA9NN88M905MNw1Ldw1LNs3LdIuJN07MNo9Ls0xIsYtHc43JtI9Kc06Jsw5J9Q4KeI6L/M9Of9AQP88Pv4zN/MsL+osLuErKtgqKdQrKNcvLN40NOQ4OOk5Oe83NfA3NO43M+g3MeM3Ldw2Ktc1KNE1Js01KOdQRf9tY9tIQcg0MtdDQ9M+QupWVtlBPNI+NMs4LsY2K8Y6LcY8L8M+L8E9Lrs5K7s8Lb4/MMBBMr9BMr1ALrw9Lrs8LcNDNsREOchIP9BQR9NSTNBPSdJOTNVPTuleY+5hZ/tpdP9uev9kdfVWavVRaf9Vb/9Xdv9WdPpYcPFecPRuefZ3gO1rc95YYfFgbfFgbexib+9zfeyIisyBfKp0aJl5anNrWE9OOl9WR4NxZ6+WktzAv+/V2Pzp6/709f37/P3+//r+//79///9///7///5/v//+/n/9fr99v//+v//+v//+P/99//+9vnw5+3l2unh1PTv3P/75f/+5f//4///6Pn66vL05+7w5VNNPVJMPFFLPU9JO01HOUtFN0pEOElDN0U+NEQ9M0I7M0E6MkA5M0E6NEE5NkA7N0FAO0NDO0lFOU1HN09HMlJGMFVGMVVINVdLP1JIRlhSXmpngn2Bp4mTxJKe2pii56Sn9qan+qup/Kus/qyt/62u/qyu+6yu+6is9qaq9KSo8aOn8KGo7qCn7Z2k6Jui5pme4pKa24uT0oaPyoONwoSIt4OBqIh5mo9tiJpjeqlYabtRX89NWeBJUuhBSeo9Qek9O+M+ON1DOdZIOs5JOMVGM8JDMMVAMeRUSeBHP9o7N9g2NNg4ONg6O9E5OMg3NMA6L748Lr87LsA6LsI4K8M3KsY0J8YyJs40KtAzKtEzKNQzKdYzKtk1LN02Ltw4L949M9s9Mtw7Mds4L9s3Ldo2LNg0KtczKdUzJtMzJdA0Jc82JtI9KdE+Kso5JMAyHMg6Jso0JdUxJ+c1Mfo8PP89QP83PfczN+otMeEtLtktLdcvLtw0M+M5Ouk7PfA5PfYyNvgwM/QwMe0xL+QxKt4yKNUxJc8zJMkxJNE9MfpqX+RUTMg5NdBAP8s6PeRSU+RKSNxDPdE6M8k2LsY4LsU7MMI8ML89L7o7Krw/Lb1ALrw/Lbo7Kro7KL07K748LLw+MLw+MsBEOMhMQsxQSMpORsxMSdBOTOhhZexhZvhocv9ve/9oePdaa/dVav5acv9Zc/tddO5hcuZqdOt9gPGHieh3edpfZPFndP5tfPNldetsd/aRleyin8SUiqKNfGhqVUhRPFdVRnRoXKSMiNu/vvLV2fnj5v/z9v/6/P7+//z9//77///8///6///4/f//+/n/9ff98/3/9///+P/99v/99///9v/57/Xv4fLs3Pr14f/95//95P/+4v//5/3+7Pn67Pf361ZPP1ROPlNLPlBKPE9HOkxGOExEN0pEOEhANUZANEU8M0I7MUI5MkE6MkM6M0E8NkNAOUREOkpGOk1HN09HMlFGMFRIMlVINVVJPVFHRVdRXWpogH6CqIyUxZOd2Jmi55+g8qOg96aj+qen/aiq/6mr/qms/aet+6Wr9aOq8qOn7qKn66Sp7aap7qWo7aOn7pig6JSh5ZSf35Sf15WbzZqVvqCMr6qDoKVlf7RdcMJRY9BJV9xCTuU+Rus8Qew8POo/OONBNNxFNNRJNMpJM8JGLr9CLMI/LeJTRd5EPN05N+Y+PupERuVARNk4Pc42Nc1CO8hEOMlDOMdBNcY+MsM5LMI2KcIyJ8YyKMszKM40KtM1LNg1Ltk0Lts0Lts0LORCN909Mdk3LNo2LN85Ld85Lds1KdUxJdg4KM0yIMoxIc85KM44J8c0Iso3JdRDMMg3Js44Ktc2LN41LuYzL+41M/Y6Ofs/Pv9MS/pIRvJCQuw+Peo8Pec3OuUyNuYsMfQrMfgpL/QsLu8vLugxK+A0Ktk1KdM3KMYwIcAuH/RkWetdU89AOtREQ8s7O99NTepSUeBIRdM7Nsk2L8Y4LsY5L8M7Lb46K748LMFALcBBLrs8Kbc4Jbg5Jr08Kb4/LrU3KbM3K7g+McFHOsVLQMVJQchJQstKReVhX+ZeYPFkav5ud/5rdfNdafBYZfhdbfpec/VidOhkb+Nscux+f/mNi/aGhelxc/hyef95hvVhceBYZvaIkf+0tNCuoqCbh11qUERSOVFUP2piVZuIgdrAv/LY2fbg4//09//6/f/+//38//78///9///7//75/fv/+vT/8vL+8vn/9Pz/9vv98v/99P//9P//8/v15/fx4f755f/95/784/794f//6v//8f398/z88lhPQFdQQFdOP1VOPlRLPFJLO1JJOlBIO01DN0tDNktBNUhAM0g+Mkc/Mkg+MkZANEdDOkdFOUpHOE5JNlJKNVVKNFVKNFZLOVhORFVMTVpUYmtog3t+p4mPw5GZ15if56Ok9qWi+aKi/KGi/KCk/6Ko/6Or/6St/KGq9aGp8aGo7KWo7aqp762p87Gp9qyp+KCp+Jen8pKh4paf1qajzraevrmFnLhner9MXdFFUt8+Tec7R+c8ROY9QuBAQOBAQOI+P988Pd1FQsk6NMpEOcpGOroxKdtKRehKSelDRes+Qug7P+Y8P+E9Pto8PdQ8O89CO8g/N8pEO9FNQc1LPr89MLg2Kb05LL83K8M2LMg1LcsyKtEvKtQvK9syL941LudBNd85K9kxJN0zJuU5K+c7Ld84JtUyH88yH8w0H8o1Icc0Isc0Iso0Jc01J881KcowJs8yKdE1KdI2KtI0KNUzJtczJ9w0KeAyKeYzLus1MuszM+kvMuctMugtNO0uNfYtM/YrL+8rLOwvLeo1LuM5LNk3KNA0JcMtHMQzIudYSOlZTss7M99OScU0MdpISOFPUNxKStRDQMw7Nsg4MMY4LMc5K8g8K8U8KsI7KL45Jrw7KLs8Kbo9Kbo9K7c8LLQ4LLU7MLk9Mbs/M7s/M75ANMBANcRBN+9qYfVwaepjX/RtavtxcexhZPRnbf9wef9sevtoePBkb+liaetkau5sbu5xb+5xb/t5e/99hflabPxjd99icPusr7aqmn2RdV1yUUpZOkxSOHNuWqWViMu3sO3V0//u8P/29//3+/34/Pz8/v7///7////+//v//vD/9OX+6eb76u//7vj/9vz/9P7/8//+8f/98f/77v/66v/55v/54//54f/54fz65f//9f//+///+1lQQVhPQFhPQFZNPlVMPVRLPFNKO1JJOk5FNk1ENUxDNEtCM0pBMkpBMkpBMklBNEdDOEhEOUxGOE9INlJKNVNLNFZLN1RLOlhORVVMTVlVY2tog3t9poaMwI2V05aa4Z+e7J+d8Z6e9J6f+Z2i/Z+m/6Cq/6Gs+6Cs9KCr7Z+n6KKl6KWk6qmj7aug7qSf76Cn95qm8Jyh4aOc0LGYwL+NqsJxhMRUYtFDT+I8Ruw4Qe83P+o6PeU8P9xAQdtBQ+A8Q9o5P9pBRMs7O8xCP8pAPcEzMeVPUOZDRug/ROo7Quc4P+I4O9s4OdU6OM87N9RFP8Y9NcU8NMxHPsxMQcFDNbg6LLc5K7k3Kr83K8Y2Lcs0LdEyLtgzL+E1M+Q4NOQ+MuE7Ld42Kd81JuE1J+E1J9o1ItM0H9E5JMs5Isc5Jcc6Jsk8K8s8LMw4LM40KtUzLtY1LdM3K883Kck2Jsc0Iss0Ic80ItgyJN4yJuMwK+YuLOYsLeYsL+YtMuguM+wrLu0sLewwLugyLuA0Kts1J9U4J9I5J9U/LrsqGdZENdA+MdlGPutWUNpCP9hCQedVVuJSUtxLSNRDPs09Nck5Lsg5K8c4KMg7KsQ7KL86J708Kb0+K7o/LblAL7Y+LrI6LLQ7MLc9MLg+Mbo/ML0/McFCM8VDNetpXPJtZOdiW/BrZvVvbOhiYfFrbPx0eP9xfv9vfPZpcu1dZupZYPFiZvdxcP56ePt2d/94fvlSZP5bcORdbvamqammk2qMa1p0T05fO1NaO3VzXKmdjdbEuPbh3P/18f/6+v/6+//7/Pz8/Pr+/fv//vr+//X/+u3/8+H/6eH95un/6/P/8fj/8v3/8v//8f/97//97f/66f/25fvz4Pry3fz03/z35P368/z8+v///VxQQltPQVtPQVlNP1hMPldLPVZKPFZKPFNHOVJGOFFFN09DNU9DNU9DNU9DNU1DN0pDOUpGO01HOVBJN1NLNlZLNVZLN1RLOldNQ1ZNTlpXYmtpgXl7oYWJuYuRy5GW1piY3pmZ45iZ6Zqd7pug9J2j95+n+KCp9KCq752o6Jyk45yi4J6f4J6d4Z2Z45uZ4pab35qa2qSV0LGMwL+CrMdyk8lZccdCU9dBTN8+ROM9P+U9PeU8P+M9P+E+QeE+Q+A8Q9c4PdU/Qc9BQMpDP8M8OMQ5NulXV+BCQ+Q+Qug7P+M5PNw2ONY2NtE5Nsw7NtVIQcQ7Mb41K8VBNc1LPsZIOrs9L7c4Kbo2Kb83Kcc3LM82Ltc1MN43MeY5Nek9OdczKtc1Kto2Ktw2Kt01Kt03Kdo6Ktc+LMU0Ib80H7k0Ibk2Irw4Kb04Kb0zKMAtJeNAO+U+ON49M9U8Lsw5Kcg3JMg3Isw3I9I3JdUzJNcvJtkuJ9suKtwuLdsvL9wuL9ssKd8wK+A1Ldw1LNUzJtA0JdA5JtE+KtRBL8IxIOdTRdI7MNpBO95DP+hKSfBUVe1VVOdTUeNPTd1KQ9ZDO888Mso4K8U2JsQ3JsA3Jbw3Jrk6J7k8Krc+LbU9LLI9LLA6LLE7L7Q8LrU9L7c9Lrk/ML5DNMNFN9xcUepnXeRhWfBsZ/ZwbedhYOxmZ/NqceBSXu9ea/VocfJlbfFgZ/Rlaflxcf54d/p0df9udfNKXfhSaORbbfGcoaOcimGAYFVvSE9kPVdgQXd3Xa2lkuHRwv/u5v/48f/8+P/++v7/+vv//Pv//fv//fn/+/P/9uj/7tz+49r43uH54ej75e/86Pb96/3+7P366f/66v/35vrx4PTo2PLn1fbr2fjx4f768f38+P/++1xQQlxQQltPQVpOQFlNP1lNP1hMPlhMPlVJO1RIOlNHOVJGOFJGOFJGOFJGOFBGOkxFO0tHPE9JO1JLOVRMN1dMNldMOFdLO1ZMQlVNS1xWYGpofnl5m4KFsoqNwo+UzpOV0pWU1pWV25aY45ib6Jie7Jqi7Zuj65yl6Jii35af2pWb1ZSY1ZOX1pKT1pGQ0oWEvZGDtqV9sbdzoshmj9JWetVHYdQ8S95BSuBCQ95DQeBCP+FBQeQ/Q+c+Rec9RuM/RtY6PtE/QNFFRMZBPLo2McU+OupaWd1BQuNAQ+Y9QOM6Pds4OdM5N9A8OM5BOM9FO8I6LrsyKMA8L8dFN8RFNr0+L7g5KL04KcI5Kcs4LtI6L9k4MOA5Meg7N+s+ONgxK9kyKtwzLN01LOA1Ld83Lts5LtY9L8k3KMY6KcE8K748LL87LsE7MMU8Ns45NetDQO1APORAN9k9Mc85Ksc5Jcg6Jsk7Jc88KNA3J88xJdExJdQxKNYzLNQxLNEvKtMyKtM1LNM3K9A3Kc01J8o3Jcw7KMw+Ksw7KM88LPReUOBGPNIzL9IuLOZAQPtXWP91c/9yb/9qZ/ZeWedQR9VBN8c1KL0uIMQ4J8A4KLs4Jrg7Kbc8LLU9LbI9LLA8La87Lq08LrA8L7A8LbE7LbY+LrxCM8BGN8tNQd9gV+JhW/RwbPh0cuZgYeRdYeZdZNZIVOdZZfNncvRnb/ZlbPxrcP5zdv52dvtwc/tlbvFEWPRLYuVYa+uSlqCVg196WVFsQ1NoP1xnRXl8X7CqlOfcyv/16P/58P/78f7+9P3/9/v/+vn/+vb/+PL88+r769r43s7z0srrzM/sztfu0uDw1unz2/L34fb14fv24/z14/Xs2+3h0endze3h0fHo2fz17fz38f7581xQQlxQQltPQVtPQVpOQFlNP1lNP1lNP1dLPVZKPFVJO1VJO1RIOlVJO1VJO1NJPU9HPE9JPVFJPFNMOlVNOFhNN1lMOVhMPFVLQVVLSVxVXWhleHV0k3x+pYWHt4yPwo6Qw4+QyJCSz5CU1JKV3JOX4JSY35Wa3pWd3JKb1o6UzomQx4WLxYGHw32DwX5/uH10n45wlKhnj8FchNZOduJBY+g6Veo5S+ZBR+BFQ9xHQdtHQ99FReZBR+48Su09SuZCSdc+QNBAP9BJRb8+OLMyLMhDPOBVUNxEQ+FBQ+M/QOE+P9o/PdRAPNFEO89GPMc9MsA4Kr01Kb05Kr89Lb89Lb07K708KcI6Ksc7Ks87L9U7L9s4L+A4L+c4M+k6NeY5NeQ1MuQyMOYyMeczMuY0MN0yK9QwJ8sxJ8s3Lcg6MMQ3LsE0LcM0MMw6O90/QOs4O+03NuQ3Mdg1LMw0JsY1IsQ3I8U6Jcs9Kcs4Jsw0Js41J9Q4LNQ6MNM5L9A4LdA+Mco7LcU4J8Q3JcY5J8c8Kcc8Kcc6KM0+Lc06Ktg+MuFDOtQvLeQ6OuAyNN81Ntc1M9Y7Nt5DPuVLQ+pRSepTSOhUSORVR8s/MMQ/Lr48LLg9Lbc+LbQ/LrA/L64+MKw8Lqw8Lqw8Lqw9LK08LLE9LrdBM7pENsZMQd5iWOJjXfBubPRycuVgY+VgZedgZ/drdvtvevdrdu1gaPBfZv1scf94e/95fPptc/heavNBV/RDXehVaOaHjaOTg2d/XVl0SV51SWh3UIGIZrOylujizP/66f/97f/+7/3/8vv/9Pj/9PT/8e376uTy4dju18Xox7vkvLreur/evMfgwM3iw9jmzOPr0+zu2PTx3vfy3/Pq2ezg0ujazercz+/h1vLo3/Ho4fLp4ltPQVtPQVtPQVpOQFpOQFlNP1lNP1lNP1hMPlhMPldLPVZKPFZKPFdLPVdLPVhMPlFJPlFJPlNLPlVMO1hNOVhNN1lMOVhNO1dLP1VMR1lTV2Vebm5qg3V0ln59pYSFsYaJtIeJuYqLwYuNyI2Oz46O1I+P1Y+Q05CU04uQyoOIwHyBuHV8sm92rWlvq2xqnIBsiJNjea5ZdstQb+NCZPA3VvY0TPc4SO9AReVGQt1KQ9tKReFHR+hDSvI9TvA+TORDSddDQ8xBPs5JRLo7NLA0LMlJQNVMRthCQdo/Pds7O9o8O9hAPdRFP81HPMtHOsA4KsE4KMA4Kr45KLw5J7s4Jr06KMA7KMQ7Kco9LNI8Ltc7Ltw4LuE2LuQ2L+g1MOkzMuguL+ksMO4wMvU0N/U3N+40NeYyMdouKtc0L9U2MtEzMs8vMdIvNNs2Peo6RO0wNu4wMuYzL9wzLNE1Kco3J8g5KMk8KMY4JMk2JM42KNM6LNo+Mt1BNd1BNdhBNtNHOMlBMcI7KMA5JsM8KcY9KsU8KsU4Jsw6K803Kc0wJ+ZDPNsyL+8/QeMvMtoqLNUxL9I1LtU4MdY5MNI4Lsw1KsYyJsAxI85FNcZBMrw9LrU6KrE5Ka85K6s6LKo6LKs7L6s9MKw+L6w8Lqs8K608LLI+L7VBMslTR+BnXuBjX+pqae5ub+ZjaPBqcfVvePpxe/10fvZtde5ia/Zkbv9yev94fv9xdfppcPhXZvlBWfRAW+pRZuF+g6yXhnmPa22IXW+JWnmKYI2Xcra3mN/ewvn03vz65f//7/v/7/X/7+//6+f65Nzv2dDjzcXewbDWrajTpqrQp7DTq7bUrrzWscfautLfweDmzOjq1PLt2vLp2O7i1Ozb0erZz+zb0+na0+bZ0eXY0FtOPltOPltOPltOPlpNPVpNPVpNPVpNPVlMPFlMPFhLO1hLO1hLO1lMPFlMPFlNP1NJP1RKPlVMPVhMPFlOOlpNOlpNOllOPFlNP1VMRVhPUl9XYmRfc2pmgXNvkHl5nXx+pH6AqYGCsoOEvIaGxoiHy4mIzImIyoiIyIODv3x9tXZ3rXBxp2tspGZnoGxgjoJgcZVWXrNOXtJKXuxAWPc2S/4zRv45Q/M/QulEQOFIQt5JQ+JGSelCSvI9Tu8+Tt1BRdRGRMhBPclIQrQ6L7E3LM5PRslCPM49ONA2NM8xMNA1MdM+OM9FO8hGOcNENb45KMM6KMI6Kr86J704Jb45Jr86J8E6JsQ5Jss6KdM6LNk5K903K+E1K+QzK+ozLesqK/EqLfgtM/wvNP8xN/8zN/8zOP01OPk4O/U4PPI5PvI5QfQ5RPc3Rvs2SP41RfQrNfQtMu0xMuM0L9k2LdA4Ks47K849LMs1JtE4Ktk7L989MuI+NOQ9NOU+Nd9BNtlKPM9HN8lBMcQ8LMI5KcI5J8Y4Ksg5KckyJ9M5L+FAOOtEPt4wL+AuLus0Nug2NtgzLdU3Ltc5MNc6MdU7MdI7MM06MMk7L9ZMP8xGOr9AMbQ5KrA2Kaw2KKs3Kqk4Kqw7La09L64+MK09L6s8K6s8K608LrE9MMBLQdpkWt5jXuhrafBvc+ppbvVyevx2f+5mcPdveflyefZqc/5sdv93f/92fflob/ljbvdSYv5CW/c8WepLYd10e7WaiY2een2Ya3uXZoKVaJGddayyjsvMreDgxOns0e723uXz2dnt0c/mycXewLzVt7TLrqrIpJrBlJbCj5nDk6HImafLnazLobXOp8HSsM7Zu9ndxOXjzuzl1e/h1uva0ufSzePQyuDPyNrMw9XHvltOPlpNPVpNPVpNPVpNPVpNPVlMPFlMPFpNPVlMPFlMPFhLO1hLO1lMPFpNPVpMP1ZKPlZKPlhMPllOPFpNPFpNOlpNOlpNPFtPQVdNRFdNTFxSWl5YZmJdcWpmf3NwjXd2lnh4nHx7p4F+tYR/v4WCxYiCyImEx4J9v395t3p1rXhxp3ZvpXRronBnoHphi4RRWplIRbNFSNNIT+5CTvg6Rv42Qf45QPU9Pe5BPeZEP+NFQuRDSOhBS+49Tes/Tdg/QtFHRMVBPMNHP7I5LrM6L9FVS8M+Nck4M8cvLMUqJsgvKs06M8xDOcNDNrw+L8A7KsQ7KcM8KcE6J8I7KMM8KcI7J8M4JcQ1JMo3JdQ4Kdk3Kt01KuEzKuUzKeoyKvUzM/81OP84PP80Ov8tMv8oLf8oLf4rMfwtM/YpMPImMfcpNv8sP/8qQfwgOfMaL/YiMPMoLu0sMeYwL9oxLNQzK9E1KdA2KtQ2K905MOY9Nus+N+s6NOg3Meg1MOI5Mt9IPddLPNNFN8s9L8Q2KMIzJcg2Kc84Lc40KtQ2LeZDPN84MuAyMdIgIOw4OeU2M9UxKNI0KdI0Kc81Kc42K8o2Ksg1K8U3K+NZTthSRspIO75AMrc7L7U7LrU8MbU8Ma85LbE7L7E9MLE9Lq87LK05Kq05LK46LbE8MtBZUdxiXexwcPR2ee5tcvVxfPZyff96g/9/if95gPRocfdlcP9xfP91f/9rdPheavZPYf9BXvc4V+lHXttudLqdi5mphIKebn6aZ4GXaI2ccaGpgrS6lsjNrdXcvczZu8HUtLLMqafCn568mJq2kJayjJCxhomzgYa1fo25hJXAi5zCj5/EkajFmbLIob7OqsnStdrZxObfzere0unWz+HMydvGw9TBu869tci3sFpNPVpNPVpNPVpNPVpNPVpNPVpNPVpNPVhLO1hLO1hLO1lMPFlMPFpNPVpNPVpNPVpMP1pMP1pNPVtOPV1NPV5PPFxPPFxPPllNPVdNQ1dMSFhOT1pQWF1VYmBZaWFccmpmgW9rjnNwm3Zxp3t1s4N+wYqDyYqDx4h/wIp+vIh5soNyqIZyp410q4dso4ZchJBITKRCObZBOs1DQN5AP+g6O/Q8Pv9ERfc+PPM9POw+PepAQetCSepDTetBTuNBTNA+PsVAOb4/Nrc+M7A8L7I8MMBEONJNRMc2MdQ7Ns0yLswzLtZDO8c/M7U2J7s+LLo3JcE6J8M8KcI7KMA5JcI5JsU6J8c6KMs6J9A5KNY2KNgyJNouIuAvJew3LvU9NfU4Mvc0MPcwLfgqKvsmKPslJ/slJ/slJ/smKvchKfgiLv8nN/8oPv8hO/8YNv0XMf8nOO8jLOYjK+MrLd0tLdQrKNItKdw0MeI2Mug2NO42NvI2NfIxMu8uL+4sLOUvLNw5MtE6MdI5MexTS7siGsQrI99GPsguJs0uKN48N+hFQOI6N9gvKtouKuI1MeU8N98+NNU8Ls81KcszJsw1Ks07Lss7MMU4LuxiWOBaT8hDOrk2LLo6L7g4LbEzJ7Q2KrAwJbAyJq4yJq80JbA2J7I6KrQ8LrM9MbA6MLpDO9ZcV+xwcPFzdvZ4fPt5g/VxfP98hP13gPp0ffxze/9yfv9yff9teP9nc/xgbvRJXP8+XP8+W+RBVtRla7SVgJKheoOdbX2ZZn6UY4eXapSfd56mgaCog5yohJKjf4qjfICfdnqacXmab3ydcoGgdoOkdYKtd4OzeYu4f5G8hJO+hpe+h5y+jKK9kKe8k6+9mr7Cp8/Mud/Tx+PSytzHxNS/vMy6tsGyq7mqpVpNPVpNPVpNPVpNPVpNPVpNPVpNPVpNPVhLO1hLO1hLO1lMPFlMPFpNPVpNPVpNPVpMP1pNPVxMPV1NPV1OO15PPFxPPFxPPl1QQFtPQ1tORllOSlpQUVxTWF9VXl9XZmRcdGlig25nkXFqnXhwrIB5vIeAxIqBxI+AwZB+uo10q4xuopdxpKF1qJpqnplXe509Qao1K7E1K8I8M9NAON0+OOg/OvNBPfU9O/U7PPQ7QPE+Qu5ASehBSeJAS9pBRsc8Ob09NLY8MbE7L6s6LK46K71BNdBKQdpHQNxBPdQ2M9A1MdVAOc1DOLs5K7I1I704J8I7KMQ9KsQ9KsQ7KMY7KMc6KMo5KM85KM82JtQyJdoyJeM1Kuo4Lu84MPA5MecxJucvJeouJe8sJvYrJ/srKf4sK/8tLvwqLfolK/okLv8nN/8kO/8cN/8UM/wTMPUeMPYuOfUzPOUqMdsoLNwuMN4wMtsrLvE6PvQ3Pfc0OvYyNvYvNPgwM/kyNfQ4N9syLdo7Ndc4MuRFP+RFP84vK9EyLsEiHtQ1MeE/OuhFQOA9ONgzLdkyLN02MN06MdQ6Ls85Ksk1J8c1KMg5K8o8MMo8MsY5L+1jWeFYTslAOLo0K8I5McM6ML82LMI5L781K740Kr00Krs1Kbg2KbU1KLQ2KLA2KbQ7MLtCOdNZVOhsau9xdPZ4fP58hPh2gP58hPx5gfl2fv51f/9zf/9wff9rd/xkcf1fbvZJXf8+XP8+XOlDWdNlaK6Od4mYb3qVYnWSXHiOXX+QY4qVa42YcIuVcIWUbXCHXWyJXWiJXGeNXmuPX3GVZXmbaXqfa4GsdISxdoq3fI27fZC8f5O8gpa9hpu7iZu1hqGzi622l769qM/Gt9jHv9bBvM+8uMa3tLqsqbKko1xMPFxMPFxMPFxMPFxMPFxMPFxMPFxMPFpKOlpKOlpKOltLO1tLO1xMPFxMPFxMPFxMPVxMPV1LPV1NPV1OO15PPF5PPFxPPF9SQV1RQVxQRFtORlpPS1tQTl1RU11SWl9TZ2NYdmhdhWtikXNrpH92tYZ9vol9vZeFwZmAt5t2qZ5wnq51orp2pbVpmLFSdLg8RL41Lbo0K8A8MMtDN9NFOdtDOOQ/OfE9PPc6Pvk6QfY9Re9AR+ZBSNlARc9AQsA7Nrg5MLE5K605Kqk4KK05Krs/M89GPNlEPtc5Ntk3NNo7N9xDPd1PRc5IPLUzI745KME6J8Q7KcY9K8k9LMg8K8k6Kcw5Kc83Kc8yI9MvI980Ku49M/Q/NvE5Mek0K+A0Jt81JuIyJeUvJOssJO4rJfErKPIrKPMrLfAoK/ImL/goNv4lOv0dN/wWM/gYM/QlN/IwO/M1QfI4Q/A7RPA8Rek1PuQsNvAyPPMvO/YuOfYtN/UuM/UuMfMvMe00MtwwLOI9Odo2NN87Of9tauVDQdEvLc4vLNk6N99APOBBO9s8NtU3LtY1LdY1K9I2Ksg2J8M2JcI2J8Q4KcU7LsY8McY8McU7MetgWeFUTck8M78wKMs7M9E+Ns47M9I9Ntg9ONc8N9Q9Ns88Msk7McM5Lrw2KrY2Kbk7L7xANs9UTeNnZe1vcvh6fv+BiPt8g/t8g/t5gft4gP93gf9zgf9uff9ndvtgcPxbbfVHXv88Wv8+XOxGWs5gYZ5+ZXaFWmmEUWiFT22DUnSFWHuIXX2IXniEXHGCWGB6TV9/UGGFVWWNWW6VYHWcZ32gan6jbYOscoSydIi2eIu5eYu5eY25epG6fpS6gZOxf5WsgJuphqmtkrq1ose5rsu4ssi2tLisrKqhoqCXmltLO1tLO1tLO1tLO1tLO1tLO1tLO1tLO1pKOlpKOlpKOltLO1tLO1xMPFxMPFxMPF1LPV1LPV1MPF5NPV5NO15PPF5PPF5PPF5RQF5RQF1PQltPQ1xORVtORlxPSV1PT15QX2JUbWRZe2leiXBnnHx0rYV7t4h7s5mFuqWFtK+Aqrh6ocZ4n9F1nMxjjMhNbNxGUt9BQNVBPc9FO8xIO81HO9NFOd5BOu5AQfU8Qfo9RPg/R/BBSOJBRtJAQcY/PL8/NrY8Ma85K6s6Kqo5Ka44Krw+MM5EOtU8N9UzMeA7OeVBP+FEP+hTTN9VSr86K8E5Kb43JMA3JcQ7Kck9LMo9LMs5Ks44Kc00JtIyJtkyKeU5L/E+N/U+NvA1LuQvJuA2Kd42KeA0KuMxJ+cuKeotKewqKOwqKuopLOgnLOsnMfIpOfYmPPchO/sePfslQfs2SOQoNucuPP9QXP9gbP9QXPI8SfM5R+gpOO0qOPEtOfQwOvEyN+owMeErKtcoJdgwLdo3MtQyL+VDQP9zcPVWU90+O+VHRNs9Oto8OdU6NdI4MNE3LdA2Ks00JsYzI741I7k2JLs4Jr87LMA8L785LcA6L8U8MuVYUdxNR8o3MMcwKdc8N95BOto7Nd88Nec+Oek9OeY/OeFAONk/NdA8Msg6LsE5Lbs5LLs9MctOSOBjX+xub/p8f/+EiP1+hfh5gPh5gPx5gf94gv90gv9uff1ldPlebvdWaPNFXP04Vv88Wu5IXMdZWopsUmNyR1x0Qlx5Q2R6SWx9UHSBVnaDWHKBWG+BV22HWmyOXG+VYnWdaHukbIGob4SqcYWrcIWtcYWxdIi0dYm3dom3dom3dou4d4+5epG0fI+re5KkfJukha2rlr6ypMi3r8e4tbSrrqGepZeSmVtLO1tLO1tLO1tLO1tLO1tLO1tLO1tLO1pKOlpKOlpKOltLO1tLO1xMPFxMPFxMPF1MPF5LPF5LPF5NPV5NO19OPF5PPF5PPF5PPF5OPl5OPlxPP15OQV1PQl5QRV5PSmJOWWJRZGNUcWRafWxlkXhyon93qIN2pJR9p6yGq8KJqc6Cntp3lOFsidtYd9pEX/NCVPpEUO9KUOFJSNBFPstFPNBGPNlEPuhCQvBAQ/VAR/VCSO1ER99DRM9BPcI/N79AN7U9L646K6s6Kqo5Ka44Krs7Lsw/NuFGQeI9O+5CQutBQd47NuNKQuZYTNVLPshAMsA4KLwzI8E4KMg8Lck6Kss3KdA4K84wJdczKeA4L+k7NO06Ne02MOswK+UsJ+MwLOMxLecxMOwzMfMyNfYzN/c0OPc2O+wtNeosNu0uPfEwQ/MtRvYpR/0rTv8zUvQ5TOUzP/BATf9fbP9sev9XZvVDU/U+UO4zRO0zQe0zPuk2POM5Ods4M840KscvJMsyKscuKNA3MvJZVPZcWvJYVttBP+JIRtxCQNQ8N843MM02Lc84Lc85K8o3J8I1I7k4I7M5JLU6KLg9Lbk7LLY2Kbw3LsY9NdtOR9lFQc41MNAxLeE+OedAOuM4Mec1MesyMO4yMes1Muc4M+E6Mtg6L9A5Lsg6Lr42Kro4K8hJQtxfWetubPt9gP+Fif1/g/V2ffZ3fvx5gf94gv9zg/9rff1kdvlecPRTZfRGXf04Vv49Wu9MXcBUUnpfQldoPFlxP1t2Q2Z5S25+UXSBVniFWnmIX3eMYXmVZXiaaHqgbXyncYGqcoSrcoWrcIapb4etcoiwdImzdIi1dIe1dIW3com4dIu4d5C2e46seI6jeJmkgq2tlcC5p87AtdLEwby5wKiqtpycqFpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOlpKOltLO1tLO1xMPFxMPF1MPF5LPF5LPF5LPF9MPV5NO19OPF5PPF5PPF1OO11OO15PPF9PP19PP2BQQGFRQWJQRmJOUGNOXV9QZWBVc2dhhXRvl3t0nX1xl492lq6Dn8yLoduCluZyhetkdelQZOk7UvkzTP88UftFUulES9U/QM5APtFDP9ZFQuNFRuhCRO5BRe1DRudERdpFQctCOr8/NLs/M7E7Lak4KKg5KKo5KbA4Krw6Lco7M+hJRek/P+s9PuU3ONoyL95BOu5aUPRoW9pQQ8lBM741JcI2J8c5K8g5K8s3K9I4LNEwJto2LeY7NOk7NOo0MOgvLOotK+stLfM0OfUzO/gzPfwzPf8xPv4wPf0xPfkxPvUwQfIxQvQ0S/U1TvUwTvYtT/8xWP8+X+YzSPlPXP9hbv9fbv9XZvtQYPREWOk4SvNBUeo6R90yOtIvMsoyLcI4Lb07K7w6KsQ6L8AyKNlKQvprY91MR+FQS887Oc87OeBMStRAPMo3MMo3Lc48L808K8s6KcQ7KLQ7Jq06Ja88KbM+LbE5Ka8zJ7o6L8pEO9ZHQdhDPdQ3MtcyLuc7N+w6NugyLu0yLfIsLfQsLPIuL+8zMeg3MeI6Mdo8MdI+MsI2Kbo0KcVCOtdYUudqaPp8ff+Gif6AhPV2ffd4f/16gv94gv9xgf9pe/tidPhdb/JRY/dJYP86WP0/W/BPX7pRTnFYOlNmOF11RWF8SW6BU3aGWXuIXX6LYIGQZ4KXbICcbH2fbXykb32ocICpb4KqboOpbIWpbIircYiucYiwcoazcoSzb4O1cIW3com4dIu1domsdI6ld5qohLC0mcjDr9jMvtrRzMLCzKuxwZuhsVpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFpLOFtMOVtMOVxNOlxNOl1MOl5LPGBKPF5LPF9MPV5NO19OPF5PPF5PPF5POl9QO2BPO2FQPmFQPmFQPmFQPGJPQWVNTWRNV2BPX2FVbWdigHVxknx2mIBzkY91jq2AlM2GlN9+h+5xefljbPpQW/o7Tf8qRv8yUf88U/E8TeA8RddARdVDRNRCQ9xDReBCQ+RBROJCRN5EQtRDPslAOL4+M7g+Ma85K6g3J6k6Ka08KrQ8LME9Mc8/N989OuU5OeMwM+IvMuA0Mts5NOZNRfxsYfJoW9lRQ8Y8L8Y6Lcg6Lsk3Ks02K9U4L9U0LN43L+Y5M+g2MukxL+gvLO4xL/UxNf8yQ/8wRf8tRv8qQv8lQP8jPfwgOfYgOPcnQfUrRfUuTfUvUPMrUPQpVP8yYP9BaPNDWP9gbf9odfhWZe1LWvFMXOtCVdoyQ+tAUt03Q8ktMbooKLEuJKs4JqU/JqhAJ7g/Lrw6LN1ZTeFdUc1HPs1EPsE2M8k7N+RVUdVGQMk5Mcg4Lck6LMg5KMg5KMQ9KbE/J6Y8Jqg7Jqw9Kqs3KKwzKLw9NNNMRtZHQd1FQNs5NtwzMOk3M+w1MeswK/QxLf0sL/8rLfouL/QxL+00L+Y4Md87Mdg+Msk5Lr0zKMA7Ms9OSOFhXvd5ev+Iiv+Dh/l6gft8g/97hv94hP9ufv5ld/decPVabOtMYPVJYfw5V/s9We5NXbJKR2hRMVFkNlx0RGZ+TnWIW3+OY4SQaIaSaoiXbomec4ikdISmdH+ncn2ocH+oboGpbYOpbIWpbIWoboerboWtb4Wvb4GwbICya4K2boW3coezdIetdI2nd5yshbK5msjGr9fOvdnSzLu/yqSsv5KarVtKOFpLOFtKOFpLOFtKOFpLOFtKOFpLOFtKOFpLOFtKOFtMOVxLOVxNOl1MOl1MOl5LPF5LPF5LPF5NPV5NPV5PPF5PPFxPPGBRPmFSPWFSP2JRP2JRP2FQPmFPO2JMPmhPS2dOUmJQXGNXa2pmf3V2lH18nH94l5F6lquBlcaEktp9hfB1ev5sbf9ZW/1ETP4vSf81Uv88VfM8Tuk/TONDS91CSNY9QNtBQ9xAQd5AQdtBP9hDP9BBOcc+NL09MLU/Maw7K6k4KK08LLQ/LrtAMcpBN9hDPdk3NOE4Nd4uLuIzMOY6NtMwJ881KetVR/93autbUNFDN8o8MMs7MMk3Ks02K9Q6MNo3MN84MuU2M+czMuowMe0xMvQzNv00PP4lNv8jOf8iOf8iOf8hOP8fNv0dNfgeNu8bMu4fOfAlQu8oR+4mSvEnTf8zXP9FaP9idf9gbPdXY/FRXfJQXe9NWuJATdQyPdo9Rsw3O7svLq4vKKY1J6I7KJs/Jpw+Jao5J7I4K9JWSrs7MsQ/OL40Mb0yL85DQOVXU9VIQcg5McQ2KsU2KMQ1JcY1JMM6KLE8KKc6Jqg3Ja05Kqw0Jq8xJcI/NdtSStlJQeFIQt47Nt4yLuo0Me0xL+8tK/wyMv4sL/0rLvkrLfMrK+0tKuYxKt80LNY4LNE9Mb8yKLw3LshJQtlcWPN3d/+Ji/+HivuAhf5/hv99iP92hP9qfP5fc/dYbPZUaepEXPVEXvU2VfE6VuBMWqVIQ15LLU1jNVVvP2J9SnSMXICWZ4eYbIibboqgcouldoyseoard4Gqcn6nbXylaX2lZ4GlZ4KmaYKla4KobYOrbYKsbH+uaH6waYGzaoS2b4m2c4mvco6seJmwhK27mL/FqcvKtcvNwra9xZ6quouXp11LN1xLN11LN1xLN11LN1xLN11LN1xLN15MOF1MOF5MOF1MOF5MOF1MOF5MOF1MOl1KPF1LPV5MPlxMPFxMPFtOPV1QP15TQWBTQl9SP2BQQGJRQWNSQmRRQmROQWRMQmpNSWhLTWRQWWZbbG5rhnd7noCFrYmIso+DqaWHqb6IoNCCkuJ5fvBzcfpqYv9hXvlKV/E+Ues6TO4/Tu9DUepAS+Y8R+U+RuE8Qt88P9o8PdY8Os8+Oco9NME7MLg6LKc2Jq9BMK08LKw2KL9BNcxGPcw9NdA3Mto4Ndw3Md41Lt42Ld44Kt08Ktc6J9M2Jdk7MPBTTPJaT9lFOcc4Ks0+LtRCM9I6LdQzK/BHQuEvL+41OvM2Pe4sN/9CTfEnM/omMv8pMv8oMvkdJ/0iKv8nL/4nL/AdJvAeKfkrN+ogLuwmN/EtQecjO/9YcuctRP9dbP9faf5aY/lVXPVQV+tITd0/QM04NMs+N8RBN7c/MaY3JpkyIZk2I5o7J588Kac4La43L8JFP787N70zMcQ2NMU1NNREQ9tMSNpLRdFEO8g6MMQ0Kcc1KMs0KcU1Krw8L7M5LK0vI6soHrMtJMM5L9JDO9hIP+RQRt9FPdo3MN0wKucwLPIyMfkxM/0xNPcvMfYwMfYwMfMwLvIwLu0yLeY1Ld05L9U9ML4yJcA+Mbk9M9ZfWelzcf+Pj/uEhvuHiv+EjP94iP9off9fd/9bdf9Vb/hMZvhFY/E6WfQ7W+Y/WdtdaYtAO1ZGLUxeNll1QmeGTXeWXX2cY3+dZ4ChaoOmboKob4Cnbn+mbX6lbH2laXykaH2jZn+jZX+jZn+lbH+mbYGrbH+sa36tZ3+uZoGxZ4OzaYe1bYu0co2wdo6ufJm0iae9mbHBpLLBrqaysI2YnnqFi11LN11LN11LN11LN11LN11LN11LN11LN15MOF5MOF5MOF5MOF5MOF5MOF5MOF5LOlxLO15MPl9NP15OPltOPVtOPVxRP15SQl9TQ11RQV1PQl9PQmBORGJQRmNPSGVOSGlNSmdOUWVTX2dfdG5ukHl+qICHu4eKwZ6VyqOLu6t/o7l4kNN5g+p8e/R2avZpYPhdYfNPWuxGUvJIU/hJVvVFUO8/Sus7ReQ5P+A6PNo6OtU9OM4/N8c+NMA8L7c8LKs8K6o/Lak4KLI6LMFBNsU8NMc2MdQ8N9I1MNY1Ldc1Ktg0KNk4Jts6Jts7Jdo5J902LuZBO+tNROFJPNA+L8c4KMo4KdM7Lt47NPZKRuQwMfA2O/Y2QfEuPP9ATu8nNPMkLPclKPspLP0rLPwqK/goKPYoKPcrLO8kJ+0lKOolLP07RNkbJ/A0Q/xBUtgmNv9qdf9iav5aYfxXXfRPU+VCQ9c8ONE+Nr44LL9ENblINqk+LJkvH5ApGo8oGZIoG54tJbA6NtFUUM5IR8M1NMY0NdE9PetXVdhHQtZHP9BBOcc5L8YzKco2LNA3L843MMc9M8I5McI1LsMyLck0LtE4M9g/Od5FPeRKQN5BONo2Ld0wKucwLPIyMfswM/swM/QwMvMxMvQwMfMvMPMwLu4xLec0Ld85Ldc9Mb8zJL48L7c9MtNeV+l2c/+QkPmFiPiFiv+Civ90hf9mfP9cdv9YdP9Rb/5JaPxAYfM6WvE/X+FJYMFTXHs/N1JGLk1fOVp2Q2WHS3OVWXicX3edYnuhZn2laX2manylaXylaXykaHujZXuhZHuhZH2hY36iZXyjan2mbH2pbH2qaXyrZX2tY3+vY4KxY4WwaIeya4ivcIirc4urfJCshJCqh4yii3iHgGRwcFJeXl1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF1MOF5LOl9OPmFQQGBQQF1QP1xPPltPP1tSQ1tRRVtRR1xPR1xPSV9QTWNRT2ZUVGdVVWdVVWdWXGhdbmxphnN2o3yDuoKKy4qN1JiR16CKyqqCtLl9n8+Ak+SEhu5/dvNzavtlZ/dTXO1HUfBGT/ZIUvdFUfJBS+49ReQ3PeA3Otk5OdQ8N81AN8VBNL4/MLY+La0+Lao8K6s6LLhCNsdIP8A7MrswKco6Ms02L9A2LtU3LNg4LNk3KNk4Jtw5JuA6Kt00Lds0LuJBOelPQ95IOsg1JcgyI9lAMuI+NfVIROgxM/I1O/k3QPg0QP9FU/gyP/ApMOsjJuwkJ/kxM/UtL+8nJ+wmJfUxMuspKvY4OugrMeIpMeszPf9SXu89S/9bZ/5eZvFWXO5PVPBNUupFSd06O9U3NNQ/OcA2LME/MrxCNbM9Maw3LaUzKaEsI5wnIJolHqkvKsdFQ8I6OrwsLMgzNddBQvReXdA/OtJDO9BBOcs9M8w5L9Q9NNpAONtAO9tAPNg9O90+O+NBP+Q+PuA6OuM/PetJROBCOd08NNk1LN0yK+cxLfAzMfUxMvgwMvQwMvQwMvQwMfMvMPMwLu4xLec0Ld85Ldg+MsA0Jbo4K7U7MNBbVO16d/+TkvuHivqDif1+if9ygv9kef9bdP9Ucf9Obf9GZ/s9X/Q9XO5FYt9UZ6JBSHA7M1NIMlFhPF14RWaHTnKTWnWYXnSaX3ieY3ujZ3ujZ3miZnmiZnmhY3igYnmfYnmgYXygYnqgY3qiZnukaHunaHuoZXupYXupYH2rYH+uYIeyaoq1bouyc4msdIamd4KedXmTbm+GbFNlWUFQTTJBPl5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5NOV5MOGBOOmFQPGBRPl1QP1pOPllPQ1hQRVhPSFtRT19VVGJYWWVYX2lZY2xcZmteZ2xhaWxkcW9rgnJ0mnl+tX+GyoWM2oyO4Y6H15+L062KxLOAqb15jsx7gd6BevKCd/9zcv9jZ/lVXPRNVPVHUPRDTfI+R+88QuU2O+A4ONs5N9Q8N81ANsVBNLxBMbc/Lqs6Kq0+LbE9MLxGOsxSR8dIP7o1LroxKcg5Mc04MdM7MNk9Mds7Ldk2J9w2JuA4K+A1LdsyK+A9NOxOQuNLPdI6LNE4KuBCNt83LvA+OukvMPAxNvc0PPw4Qv9OWv9MVf0+RfIzOOIkJu0vMeosLPAyMugqKusvLvI6OtEaHOYzN90sMug5QPBFTf9YY/NNV9g9Q9pBROFCRuE+Qd45Pdw4Odg4ONM5N8k4M8I5Mb06MsBBOs1OSNZWU9BOTsNDQLI3MrY5Nc9LSdlNTONRUu9ZWupSUfFZVsk1Mc4+NtJCOdBAN9M/NdlCOeBDPOJAO+k/QOc4Pew5PfI/Q+86P+g1OOw+PfZNSt45M9s2MNozK94zLOU0LuwzMPIyMfQwMfQwMvYvMvYwMfUvMPUvLvAwLek0LeA4Ldk/M8I2J7c1KLM5LstWT+98ef+TkvyIi/2Bif56h/1vf/xjd/9Ycf9PbP9GaP9AY/s5XPQ/XulLZNhaaIUzNWc7MFdPOFdnQ2F7S2qJUHOSWXSVXHWYXnedYnmhZXqiZnegZHagYXefYXaeYHifYHifYHufYXqgY3qiZnqjZ3qnZnqnYnqoYHqoXXyrXX6tX4ayZ4u0boyzdIqtc4amdYCdcXSOaWmAZFFjVURTTDhHQF5NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NO15NOV1LNV9NNWBQOV9QO1xPPlpOQFhPRlhRS1lQUWBXXGdgaG5mc3NoeXNne3NnfXFofW9sfXBxhnJ3l3Z9q3qCwX+H0oSK4IqL5ZON452M2qCEv551n6Bsgqxucbx2bNJ2afJzbf9sbP9naf5eYPtSV/VGTe88Quo3PeY1O+E3ON05ONY9N85BN8ZCNb1CMLhAL603KbRAM686MLA7MchSSNVcUclNQ7s7ML45MME3Lcw5L9Y+M9s9Mdo2Ktw0J+I2KuAzLOI3MOQ9NeVFOeJGOd5CM95BMuI+MtswJuo3MuwwL+8uMfEuNPo3P/9QWP9dZP9aX/9PU+EuMeMwM+AsLfdFReg2NtwsLNstLus+QNwyNdkzN/9iaOA9QssqMsotNMEmKtU7PeFARds2OtkzN985Pdw3O80vMMw0M807O9VHRt5SU+xgY/VpbPRla+peYcRAPsZFQOVeW/hoZ/9vcP9qauVLS9c9O8k0MNE+N9dEPNZDO9U+NdU8NNg6Mdw0Me41O/EtN/AsNvIuOO8sNOssM/M5PP5KS98zL9wzLtozK9wzLOM1Luo0MO80L/IyMfQwMvYvMvcvMfYuMPUvLvAwLeozLeI3Ldk/M8Y4KrQyJbI4LcNOR+98ef+Skf+IjP9/if93hfpsfPhhdPtUbv1IZ/8+Yv86X/o2XPNBYeBOZcJXYXAvK18/MFtXPl5sSWV9TWuJU3SSXHWWX3aZX3ieY3mhY3igYnWfYHWfYHWdX3aeX3eeX3ifYHufYXqhYnqiZHulZXymZHynYHmnXnmoWnuqXH2sXoCsYYWvZ4eubYeqcIWlc4OgcnuVbnKKamV4ZVtrXlJiVV9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OPF9OOl5MNF9ONGBOOF5POltOPllPRVpTTVpUVF9aYWhicHJtgXp1jHt1kXtxk3pwk3ZwknF0k3J4mnR9qHeBtnqDxH6Gz4SJ2ouM3paP3JmKzZuFtqKDo6qEkat+eZ9sW5pRPrxNQtRRSeJXUutXVfFTUvFLTe0+Q+U0Ouk5POY5O+A7Odg9ONNAOMpCNsBBMLo/L7M5LLpBNqs1K6MuJL5JP9lnXNlkWstVSbg8Mrg2KcAzKc46MNk7MNo2LN4zKeQ2Ld8xKuQ3MeM7Mt05L94+MONGNeRCM985K98xKOk0LfAzMe8tLu0qLvQxN/9FSv9WW/9dYv9cYeI5POM5PNUrLPRKS+I4OdcvL9s1N8woKcwnK/hYWt0+QtU5PdE2OrofI8QoK9w8PuZBRd00OdksMt4xN9kwNc0oLtIzN+RLTvZhZftobvljbPdgafpgbPhia9ZMTNVOSupcWupWVOdNTeNIRs80Ms4zL9lBPOBLRORPSN9KQ9lAONc6M9c2LtwuLfUyOvstOvgqN/UnNPUpNPgwOv8+Q/9KSuAxLt4zLNwzLN01LOE0Lec0L+00L/AzL/QwMvcvMvkuMfgtMPYuLvEvLesyLeI3Ldk9Mck7LbMxJLE3LLpDPex5dv+Njf+Ijf98iP9xgfZoePZfcvlSbPtEY/85Xv82Xfo2XPBGY9FOYKJJTWU1K1ZEMFtZQF5sSWV8TmuIUnSRW3eVX3iZYHueZHqgY3aeYHObXXKcXHObXHScXXadXneeX3ufYXqhYnmhYnqkYnynYnumX3imW3inWXqpWXuqWn6qX4OtZYWsa4epbYmnc4mldYSdc3yUcnWJcG5/bGZ3ZV9QPV9QPV9QPV9QPV9QPV9QPV9QPV9QPV5PPF5PPF5PPF5PPF5PPF5PPF5PPF9OOmFQNmFQNmFPOV5PPFtPQVtSS1xWVl9aYWtndnNvhn16l4J+oYF8pX13o3t1pXh2p3N5qXN9sHiBuHuEv36GxISJyY2OzpSTzZqTx6CVvaubtbymssmtqcWmlKqIbZxmSpxFMq9BNLZANMJCOdZIROhOTu5KS+w/Q+s9P+k7PeQ8O989OtlAONBANcg+McE9ML06ML4/Nq80LKcxJ7tJP9FjVtZoW9VlV8NPQro+Mro0Kcc3LNY5MNk1LN8yK+c2MOIwLOM0L+I3L943LuA+MeVDNOQ+MN40JeY0KukwK/AzL/AuLu8tLvIxNPM3OPZCRfZNUvxZXulGS/ZRV9gzN+tGSt04POZBRdo3Os4uMNEwNeRIS9I3O9A3OrkjJdU7Pds4O+U7Pus8Qec2POItNt0pMuExO+c8RPBMU/1dZf9rc/9qc/pgavZaZ/lYaPdbZvRkZOhaVuhXVNhAPc8xMNQ0NNMzM+FDQONKRelSS+pTTOFKQdk/N9g5M9s4MeMzM/MuN/8wPv8wPfoqN/wuOv87Rf9DSPtBQuMxL980Ld00Ld01LOI0LeYzLO00L/E0MPQwMvcvMvkuMfgtMPYuLvEvLesyLeM3Ldg6L80+MLUxJbE3LLI7Nelzcf+Kiv+Hjf92hv5pffNhdPNbcPdQavpDYv83YP83Yfk7X+xMZr9PW344Nl09ME5GMVZYQFplRWN4TWqFUnKOW3aUXnmaYXueZHieYXObXXCYWXCZV3GaWHGaWHSbXHWcXXmdX3ifYHihX3miXnqlXnmkXHikWXikV3mlVnunWH+pX4KsZISraIaobIelb4aicYCabXiRanGFaWp+Y2J2XV9QPV9QPV9QPV9QPV9QPV9QPV9QPV9QPV5PPF5PPF5PPF5PPF5PPF5PPF5PPF9OOmNROWNROWFQPF1QQFpQR1xUUl9aYWFfbXRyinl4mIGAqIOBsH5+sHl5r3l1sHd3tXd8vniAwX2FxIKIxIWKwY2Pv5eWvqCdvKynu7astb6zsci4q9C+ptbBotG7ltCsiK9vVK5cR6RHNag+MMJHP+BXUe9XVvFOT+lAQ+o9P+Y8PeI9O989Otc9NdE6Mck5MME4MME8Nbk6M7g9NcFPRcdYTcddT9FlWNNjVcJMPrw6LcU4LtI5Mdc0Ld8yLOc2MOY0MOEyLeA1LuM8M+dDN+ZDNOI6Ld8zJeo1LOYuJvAwLe8vLPAzMfE1NOctLuIyNOdCRvdYXfZXXP9vdeVESutITeA8Q/5bYP9vdd49Qv99gv9tcepRVNQ+QMYwMtY6PfJIS+45PvA3P/g9RvI3QugtOPQ+Sv9dZ/9td/9qcv9jbvddZ/pea/9hb/9dbvlZZfJcXeNQSeJKR9U3NNIvMNk1NNIwLtg5Nd9EP+NKROJJQdlAONM2L9Y0L9w3Meg2NuonL/wwPP4yPfcrNvkwOv8+Rf0/Qew0NOIzLuA1Lt42Ld80LOEzKugzLO80L/Q0MfYwMfcvMvkuMfgtMPguLvIvLesyLeM3Ldc5LtE/MrYwJbI2LLA2Mehwb/+HiP+Gjv9wgvxjePFccPRYbvdPaftCYv85Yf88ZPZBYuRSZ7BRV2QvJ1dEM0dHL1JUPFVeP2J0TGmBUXGLW3aSX3qYYnydZHicX3KZWm6XVW6XVW6XVW+YVnKZWnSbXHebXXeeXXeeW3ihW3mjW3ejWHaiV3aiVXejVHmlWHqkWn6mX4GmY3+hZH6cZnuXZnKMXWmCWGB2UlpvUFJnSFxMPF5OPmBQQGBQQF9PP19PP19PP2FRQWJSQl9PP11NPV1NPWFRQWNTQ2JSQmBRPmRTP2FQPl1QQF5RSVtRUFpTWmVhcHNxiXl4mnp8pX6AsYCBuX1/unh6t3JztGxvtnR3yHZ7zICDyouNxpaXw6SkvrKwu7y5tMvGs9PMsNnPrNvPp9zPo93Qo9nLnNnCmNGoiLiAZ6BeRst6Z9Z1Zb1IP9dRTvdjY+lLTOU/QeI4OeQ6OuI6Odw3Ndk2MdY7Nss4McA1LsdCO7s8M79JP8ZYS7lPQc5kVtFjVMxYScVHOcQ6L802Ldg3L+E2L+M0L98wLd8yLOA3MOQ9NOA8MN03Kd81KOU3LOQvJOovJuwvKe4xLe4yMOs0MOg1MeI2NNc3OeZKTvVZXe1OU9c4Pdc2PPlYYP9+hP9+hv9vdf9nb/9pcP9mbPVcYfFYW/taX/9VWv9ES/w4Qvs3QfYyPu4rOewwPvE9SP9TX/9gaf9ncv9lcP5ibf9jbv9gb/1dZ+1TU99GQNY4NdY0MdcxMdcvLtgzMds5NOFEPdxCOtk/N9Y8NNc5MNs4MeA5M+Y2NvA3PPM0O/M0O/Y0PPU2O/I1OeszM+MxL94zLN41Lt83LuA1K+QzK+kyLO8yLPUyMPcxMvgwM/ovMvkuMfkvL/MwLuwzLuU3LuA/Ncw4LL82LK8vJrg7N9JYV/+Ymv57g/9tgP9lfPhccvBQaPRHZfxDZf87ZPk5YPVObNNSZIk9P1AsIEM7JkNHLktNNVlfQ1pqRWN4TXGIWniSYniWYHSVXHKWWXGYWWyVU22WUm6XU2+YVHKZWHSbWnWcXXWcW3SbWHSdV3agWHehV3aiV3aiVXWhVHSgU3ulW3ujXXqeXnWXW22LVWJ+TVhyQ1NqPkFXMD9VLzxSLFtLO15OPmBQQGBQQGBQQF9PP2BQQGFRQWJSQmBQQF9PP2BQQGJSQmNTQ2JSQmBQQGZWR19RRlxPR15UU2FaYWRgb21rg3Z3lnd5ont9rn1/uHh8uXF1tWtwtGxvtm5xvnV20Hx+1YmJ05iYzqinx7i2wcnFutPOsdvXquLbpefepebdouTbpOLYo9vRoNTHm9O8mrucgKl9ZMWLd8p9bbRWStJhW/ZycOxaW+dLTOM/QOc9Pus+QOc7O+I2Nts2NNY9OMk4M8o/OLk2Lrg+M71LQLZIO8hdTd1vYNRgUcZIOr01KcQwJtQ2Ldw1LdswKeI1MeU5NeQ9N+A8M9w4Lts1Kd80KuM1Kuw3Lu01K+0yK+swK+cwLOMyLOE0Lt01MtY4N9g+QORKTPNXW/peYvxcZP5dZf9hafRTW+9OVvFRWf9fZ/9qcf9mbPVaYPNOVO00OvEsNfQqNvctOfEnNeUhLeYnNu03Q/5QWv9aZP9ibP9kbf9lbv9jbf1baPVRWuVFRd48N9s2NN42M981NdwzMNoyL9s2MuA+Ods+N9g7NNc6M9s4Md84MuU5Nec6Nuk5O+o3Ous3Ou43Oe43Oew2NeUzMd8yLNwzLN02Ld83LOI2LOUyK+oxLPIxLPUyMPcxMvcwM/ovMvkuMfcvL/MwLuwzLuU3Lt88M9Q9MsI4LrYxKrc3NNhaW/+Qk/tzff9mev9edvlXb/dPaflGZvs/Yvw8Y/RAY+VPaLlLVng7OEwyIzw6IzxCKEVHL09TOFZkQWBySm6DWHWPX3aTXXSTWHGTVnCUVGuST2uUUGyVUW2WUnCXVnKZWHOaW3OaWXSbWHWdV3WfV3WfV3SeVHKeUXGdUnCcUW6YUGyUTmiMTGKBRlh1P05pNkZdL0BXK0BXLUBXLUFYLllMPFtOPl5RQV5RQV5RQV5RQV9SQmBTQ2FURGBTQ19SQmBTQ2FURGFURGBTQ15QQ2JVTVxRTVtRUmNZYmtkdHFthHZ1lXl7pHl7rHl+tnh8u25ztWVpsGBnr2puuHJ1xn1914eE3ZeU26mn2Lu5z8vKyNzYv+XhtOnkqu3opvDppe3lpOfhp+Lbp9fPocvDnLivkKmbgZuDa6iDcKdvYJxSR7pdVd1tafd1de9fX+RKTOVAROtBROw+QOg4OuI2Nt89OtQ7NtRBOsI3MLc3LLc+M649L7ZGONtqXN9pW9lbTcpCNsUyKNE0K9k2LdkyLN41MulBPuxHQ+A9NtUyKdUxJ9oyJ94wJeY0KugxKecuKeYvKeMyLOI3L+E9NOBCOcYtKMo0M9xEQ/BWWPpeYvdaYfNTW/FRW+hGUepIU+9PWfxcZv9tdv9udPRZX+M+ROkuNfQtNPsyPPwyPvUrOe0nNPY2Rf9LV/dJU/VQV/hXX/5eZv9ja/9gafdSWelCSd45N943MeM3Nek8OOs7O+Y5NeE1Md02MN06M9k7Mtc5MNc5MNw3MeE4M+c6Nuk8OOM5OeM5OeU5N+c5OOg4OOY3NOE0MNsyK9o2Lds3Ld44LOI2LOcyKeswKfMwLPcxMPUxMvUxM/gwMvcvMfcvL/IwLu4zLuc2Lt05MNxEOcc4MLs0LrUvLuRfYv+DiPhsd/5ieP5Xc/pQbf5MbP9DZvY6XfM7X+xJZtRTZ51ESmw7NE8+LD08Jzo/KEVEL0ZIMFFcPFlrRWd8UXKJW3SPWnGQVW2PUmuPT2mQTWmRS2mSTGuUUG2WVG6XVXCXWHGYV3WcWXWdV3ScVXKcVHCaUm2XTWuVTWqUTGWNR2GIRVt/QVV0O0xpM0VgLUFYKj5VJ0JcL0VfMkljNldKOlpNPVxPP15RQV1QQF5RQV9SQmFURGBTQ2BTQ2BTQ2FURGFURGBTQ19SQlxQRFpPTVpRVmJYY2pjc3FthnZ1lXh6o3p8rXd8tHN5t21ytGJpr11krGFnsWxyvnh7yomJ35WR5aSh5La14cfE2dXRzuHdxOfkuevmr+7qre7orOniq+PbqtrTqcvCobu2maWljZuZhJOIdpiBcZlyY5tiV7NpYM9ybfuLifV1dOpbXeZMTuhDR+1AROw8P+k7PN86ONs8ON5FP9NDO8M6MLo6L7A2KacxI79JO9thUuprXNtTRck6LMw0J9Q2K9c0Ldk0MvFNS/5aWO1LRtk4MNYzKts0K94yKN8uJuEsJeEsJd4tJdwxKdo2LNk7MNc/NMIvJ8Q0LM46NtlDQt9GSOBFSeRHTupNVvFRXfZWYvhYYvlcZf9ncP9tdfRZYd47QOoxN/EuNPItNvArNOslMuwoNPs9Sf9TX+0/SehBSepHTPRRVv9ZYP9YXfRHTeQ2OOE1M+Q3M+o7OPJAPvRAP+89O+Y5NeA3Mt04Mto5Mdk4MNk4MNw3MeM3M+g5Nuk6N+I6N+A7OeM6N+Y6OOc6NuU4NOA1LtozK9o2LNs3Ld44LOI2LOcyKeswKfIvK/YwL/QyMvQyM/cxMvYwMfYwL/IwLu4zLuc2Ltw4L+BGPMk5Mb4zLrYsLO5mav95gPhndP9ief1Ucf5La/9Hav8+Y/I2Wes9XuNRaMRYZYhCQmdDN1tOO0dGMUFDLUpIM0VFLUxVNlNjPmJ0TGyDVXCLWG6NUmuNUGmOS2ePSWiQSmiRS2qTTWuUUG2WVG+WV3CXVnSbWHObVXGZU2+XUGqTTWeQSmWOSGSNR2CHRF2BQVd5PVJxOE1pNkxmNk5lN09mOExmN09pOVNtPlVIOFdKOltOPlxPP11QQF1QQF9SQmFURF9SQmBTQ2FURGFURGBTQ19SQl9SQl5RSVZNUl9YaG5me3RwiXh0l3h3oXh6q3l7tHN5t2pys2BnrVtjq19nsGpyu3Z8xoCEzpOV4J6e5K2u57u95svJ39TT2N3bzuHfxuXhvubivOTfueDXttrQtc7Gsb61pq2nm5iajIyOgImFeYp8cZF2a5tzaahtZbpvaeaJhO6BfvNzcvFlZPFXWfBNTu5ERexAQOM6N+A7N+RCPd5FP8w8M8Y9M8RCNa8xI64wIsdJO9xYS9ZOQMw9L844KtA2KtEzKtY0MvVVVf9raPpdWONEPtw7M987MuM4MOI0LeMyLOIxK90wKdQwJ80vJMYvJMIwI8U5LMA0J8EzKcs6NddDQdtFR9tCR9pASOBET+tPWvJWYfJWYfpeaf9nb/NZYeFCR+o6PO01N+0zOO8yOPEzPfc5Q/9IU/9WX+Q2P900O982O+tBRPlKT/xJTfQ7QekxM+g1Mes5Ne88OPI8OfM7OfA6N+k3M+I3MN87Mtw7Mds6MNw5MN84MuQ3M+g2NOk3NeY6OOQ7OOY6OOg6Oeg7N+Y5NeE2L9wzLNs3Ldw4Lt85LeE3KuUzKekxKfEwKfQxLfMzMvEzM/QyMvQwMfQxL/IwLu4zLuc2Lt43L+BDOso3MMAxLcAxM/dqcP9xevpmdPtddPpQbf9DZv89ZP85Y/U4XuZFZNlabatWW3dFPmRKPWFZRlRPO0tJNFBJNkdFLkdQM0xcOFpsRmZ8Tm2FU22KUmyMTWiNSmaOSGePSGeRSWmSTGqTT2yVU26VVm+WVXSZVnOYVW6VUmqSTGaPS2OMSGGKRl+IRlqBQlh8P1N0O1BuOE9rOlJsPVduQFpxQ1VvP1ZxPldxQVJFNVVIOFhLO1pNPVtOPlxPP15RQWBTQ2BTQ2FURGFURGFURGBTQ2BTQ2JVRWFWUF5WY2plfHl1kH15mnp5oXh5qXZ5sHN3tGpys2NqsFtjq11lrmhwuXZ+x4GH0YiM05md3aOl4K+z47u/5cbH48/O3tTT2NfW0dnXy9nWx9fRxdLJwMzDvsW5ubSorKOanYqLhnh7dHl2cXVsZX9sZY1vZ45hW51gW8Bzbdh5dfB/e/x8ef9ycP1jY/ZTVPBIR+9DP+o+OuE8NuBBO9E6MdNDOt1USsI+Mrg2Kb05LMI9Lsg/L89CMddDNdZAMdE3LdAyL+pMTfpfXfJXU99EP9k6NNs4MeA3MOY5M+c5Muc5MuI6Mdo5L9E5LMo4K8Q4KbAoGLgzIshAMtNJPtJEQMs7Osw3O886QNE3QeJIUu1WX/BZYvVeZ/dgaepVW9xBReVAPuw/O/FBQ/pHSv9MVP9RWf9UXf9WXuE0OtovNdwvM+c3OvQ9Qfg7P/c0OPMxMu00Mu85NfA4Nu00MusyMOoyMOc0MOE0LuM8NOA9NN88M947MuE4M+Q3M+g0M+g0M+g4OOc5OOg4OOs5Oes5N+k3NeI1L94zLNs3Ldw4LN06K983KuMyKOcwKO8wKPIxLPE0MvA0M/MzMvMxMfMxL/ExLuwzLuc2LuA5Mdk8M8w3McEwLdFAQ/9udf1rdflicfBSafVIZv87Yf80Xv82Yvs+ZOROacpcaYtHRmpGOl1MPF1WQ1hRPlJKN09HNElELkRKLkdVMlNjPl5zSGd/TWqHT2qKS2eMR2eMRmaOR2aQSGeQSmmSTmuUUm2UVW2UVXGVVW+UUWqRTmeOS2OMSGCJRV+IRl6GR1yCRVt+RFd4QVZyP1VvQFlwQl1yR151R1tzQ1l0QVhzQE5CMlFFNVVJOVdLO1hMPFpOPlxQQF5SQmFVRWJWRmJWRmFVRV9TQ2FVRWZaSmhdWW5nd3Vwjnx4mXt5oHd4pnZ3rXB1r2pvr2ForF5mrl9nsGVttnB4wH2FzYmQ2I+X2Jmg1qGo1qqx27S537q/38DB3cPD28fG2MbD1MXB0MG7ybyzxLuwwbWovKaYr5aLnIiFjHFxcXRwb3BmZXdoZYZuaoRfWZVkX5taVLlmYNlzbvB6dv97d/93c/9oZvxaV/5STvVIQuY9NudEPdg7NNtHPepcUsU7MMQ8ML03K742KMc+LtFEM9RCM9RBMddBM9I4Ntg+Pt1DQ9xCQNY9N9U4Mdg3L943L+U6M+Y5M+U6M+I7M9s+NdVBNdFFOMxHNq4tGLw7Jc1KONFMPcY9NbswK8AwMMo5PtdBSuFLVOtVYPBaZfBdZexZYd9MUtQ+QM80L9g3L+A7OepAQPJDSPVESvFCSe4/RuI1O98yNuMzNu84PPU3OfgxNPsvMvwxNO8yMPA5NfA3NOwwLugsKucwLOYzLuAzLOQ9NeA9NOA9NOA8M+M6NeY5Neo2New2New1N+w1N+01N+42OO42Nus1NOQyLt4xK943Lt05Ld06K983KuE0JuYxJu0xKPExLPA0Mu41M/E0MvIyMfMxL/ExLuwzLuc2LuI7M9I0K9I6NcYyMOdVWP9wePljbvJaaedJYPNFZv84Yv8vXf81Yv9CaNxMZbFQWWo1L15HN1hLOlVOO1tQPlZJOE1AMEpDMEBGLEFPLktbNlhqQGJ4R2aBSmiISWaLRmWKRGOLQmONRWWOSGeQTGiRT2mRUmuSU26SUmyQUGiPTmSLSmGKSF+IRl+HSF+HSF+FSF+CSF1+R115Rl13SGB3S2N4T2N6Tl11Q1t2QVp1QEpDM01GNlFIOVRLPFdLPVlNP1xPP15RQWRXRmVYR2RYSGJWRl9VSWFXTWdeVWxjZndyiXl1mnh2nnRzn3JypHR1rWxwr2JnqVphqV9lr2ZsuG1zv3Z8yIGH04+T3Zec3puh1aCn06mt2q6z3bG03bK027S02ra027Wx1rOt0a6nyauhxKqewqSYvJmLr4h+mXx4hmRiZ2llZmNZWmpbWHtjX3lWUJJjXYpORqJVTb1gWNZrY/F3cv9/ev96d/9uav5hXPdUT+lHQu5PSd1CPd5HQOpXT7osIr4xJ740J8c+LtFFNss+LcEyIso3J9tFN95FP9M5N8wzLs01MNQ7Ndc9Nd08NOE9NOQ7NOQ5Mt41Ltc0K881Kco4K8U8LMI/LdRTPshHMr08Kb46LcM9MsQ7NcI3NMI0M9xLTt5NUuFQVeVUWehZXeVWWNxNT9NEQMk1K9E3K9g3L901MuIyNOUyNuYxOOYuNuw0PuwzO/M1P/s5Qv00PvorNf8oM/8vOfgtM/k1N/k1OfAuL+sqK+kwLug1MeI1L+M8NOA9NOA9NOE9NOQ7Nuc6Nus3Nu42Nuw0NuszNewyNe0zNO01Neo0MeMxLdswKN44LN06K906K944KOA0JuMzJOkzJuw0Ku41MO41MvA0MvAzL/IyL+8yLOw0LOc2LuQ9NM0vJtc+OcwzNfliZ/9vefdbafBOY+pDXflFaP86Zf8wXf82YfZHaMlKXZNDRlIsI1ZJOFNMOk9INltPP1VJOUY/LUhGMT5CJ0BKKElVMVNkOl9yRWV9SWeESmWISGOIQ2GJQmKKQ2ONRWWOSGaPTWiPUGmQUWyQUGuQTWaNSmOKSWGIR2CHRmCHSGCGSV6BR15/Rl99R2B8SWF7S2R7TWZ8TmZ+Tl14Q116QF57Q0RCNkZEOEpGO1BHPlJIPldJPl1NPl9PP2BRPmFSP2BTQl9WR2JZUmdiX29qbnNvfndxk3p0oHx5qHl3qXBwpmdno2BholxfpGBirWZotW9wwHl6zISC1o2L35aS55yZ5qCe3aGh16Oj2aSk2qaj2KWi16Wh1KSg06We0aOdzaKayaKZyJ+Ww5mNu46CsIN8nnJufWlnbGReYGZaWmtZVXJXUH1XToxXT5VSSahaULVYUMFaU9hrZOx5cvmCfP+Lhvl1cf91c+1fXd9QTNlFQe9aVMw3McUyKsQ2KsM3KMA3J8M3JsY5KMo7K9A8LtU/MdI4LtY8Mtc/NNM7MM01KM0zJ9g6L+JANeA5MOE5MN43Ltc3K883Kck6KsY/LMRBL8I9LsZANMtFOs1HPMxDO8U8NLsyLLYrJsc8N9BFQtlPTOBWU+NZVuFYUthPSdBDOsw7KtM6KNw4LOI1LuguL+wqMvAoM/QnNvotPvorP/sqP/0pP/8oP/8mP/8kPP8kPP8kOP8nOf8rPP4sOfMrNe0uNeg0Nec7Od04NN06M947NOA7NeM6NeY5Nek3M+s1NOszNew0Nus1NOk1NOc1M+I1L901LNs1Kdw4LNs5Ktw5KN45Jt84JuI3JeM2JeY0Juw1Le00L/A1MPE0LvE1LO01K+o1KuU3LOA5MNg3L9U6Nts/Qv9td/9ic/tTavVJY/9LavY2W/82X/88Z/g+Y+dOaq9JVl4kIkQsID86J0hFNFBNPFBJOUVCMT5DLz9HL0JIJkVLJUtTLlNdOFtrRGF2S2R+TmSDSmKGRmCIQmGJQGOLQmWNRmiQSmyQUG2RUWyRTGmOSGeMR2aLSGaKSmWJSWOFSGGDR2SDSmSBSWJ/R2N+R2R/SmR/SGV+R2F9Q1t7PFx/PV+CQj0/ND9BNkZDPEpFP1BFP1RHPltLPl1NPWBPO2BRPF5TQV5WSWNbWGhjaW5seXNvhnRwlXZwnnRwonBtomdmn2Fhn11eoVxcpGVksGtqunRyxX17z4aC2Y2J4JSO5piT5ZuW2ZyY1Z2Z1p6a156Y1p2X1ZyW1JuV0Z6W0ZyUzZyTypuSx5qQxJOJu4h/roJ4nXRrfG1kaWZdXmZbWWlaU29XTXtVSopWS5pWS7BcUrpZUsFYUtNmYeBxauN2b+1+d/2Hhf+Hhfd1c+5nZONVU+taVccyLMIvJcU3KcM3JsA3JcE4JsQ4J8g7Ks87LdM9L9U5LNU5LNM6LNI6LNE5K9E5K9Q4K9g4LN87MeA5MNw4LtY4LM85Ksg5KME6Jr45Jr42KsE4MMY9NclAOMpBOcg/N8U8NMI5Mb80Lcc+NtFIQNhPR9pRSddORsxDO8M3Kso3JdM4JN03KeU0LO0vL/QrM/kpN/0oOv8rQP8qQf8pQf8mQf8jQP8hPP8ePf8dOv8fOv8gOf8lO/8pO/ctOfAxOeo3OuU7O9w5NNw6Nd47NOA7NeM6NeY5Nek3M+s1MuszNew0Nus1NOg2NOQ3Md82L9w1LNk1Kds5Kts5Ktw5KNw5Jt45Jt84JeE4JeM2Jec1K+ozK+s0LOs1Kus1Kuo2KOQ3KeE3Kt87MdU0LNM1NPNUWf9lc/9bcPVHYv9JaP9BZP87YP0zW/k7YfJNbc1MYok4P1MqJEE1JzY5KDs8LEJAMURBMEA/LT1CLj5HLD1DHUtQJ1xiPGVvSmh2UmV6UWR+T2SCTGGDRmGGQWGJQGOMQGeNRGmOSGuQTWyRTmyRS2qQR2iNSGaLRmeKSmaJSWaFSmSDSGaDS2SBSWR/SGSARmWBR2WBR2Z/RWJ+QV2APl+EP2KHQjY5Ljo8MT8/N0RBOktCO09FPFZIPVlMPF5PPFxPPFxTQl5XTWNdXWhlbG9te3NxiXNvlHFrmWpmmGNglVxblFpamFxdoFxfpmhqtW5vv3d4yn+A0oaE2IqI3I+L4JGO3ZOQ05OR0JOR0JOR0pSP0ZOO0ZOM0JKLzpWMzZOLx5SLxJSLwJOLvoyEs4N6pYBylXxld3VeZmlbW2RbVmRbUmZYS3JWSIRUSKNaUb1gWclcWc9ZV9tjYuFrad9va+N2cfuKhP+Khv+Fgf99efduaO5hWMQ0K8AyJsQ4KcE6J8A5JsA5JcI5JsY7KMw6K9A6LNY6LdM1Kc41J9A4KtQ+L9Q+L842KMsvIto6Lto4Ldk3LNY4LNA6K8k6KcI5Jr43JL01KcA2LMI4LsQ6MMc9M8pANstBN8xCOMc6McpANs9FO9BGPNJIPtFHPcpANsU3K8w2JdY2Jt83LOc0L/EwM/YtNfsrOf8qPPwnO/wnPfslPfkjO/shOvoeN/wcN/4bNv8eOP8fNv8kOP0qO/cyPPE2Pes4O+Q6Otw5NNw6Nd47NOA7NeU5Nec4Nek3M+s1Mu0zNu40N+01Neo2NeU2MeE2L9w1LNg0KNo4Kdk5Kdo5J9s4Jd04Jd43JOA3JOE2JeE1J+I0KeM1KuM2KOM2KOE3KN42Kds3K908MtAxK9g4OP9rcv9dbv5QafE8W/9IbP83Xf8+Zfk1W+4+YuZWcao/UWEjKEwvKTs3KzA3JzM3Jjk8KUA9KkE8KEA+KUJCJj9GHVhhNHN+VICMZHeHYGh/U2F9TGGAR2CDQ2CFP2GJQGOMQGiORWqPSmuQTWyRTm6TTWuRSGiNSGeMR2iLS2iLS2aITGSGSmWES2SDSmOARmSBR2aCSGaCR2WBRmKAQmOGRGWKRWiNSDI1KjU4LTs8NEE+N0dAOktCO1JFPFZKPFhMPFlNPVlRRF5XT2NeYmlncm9ugHJvjHJtlWpnlGBej1dXi1RVjldYmFxfomFjrWxuu3Jzw3t8zoKD1YiG2YqI24yI3I2K14+O0o+Nzo+Mz46L0I+J0Y6I0I6Gz42Fzo+Fyo6Fxo+FwZCHvI+HtomCrIB4nX9vjIBfcHxZYGxYWWRbVF5fUV9cSWpXRn1TRZ5VTL5cWdBZW9lYXORjZ+dra+FwbOV4c+x9du16c/6Dfv+Ggf+Be/VrYck8MsQ4KcI7KL86J787Jr46JcE6JsU6J8g5Kc44Ktg6LtQ2Ks41J844KdE+LtE+Lss4KMcvIdI2KdM1KdI0KNI2KdE5K808K8g9KsQ7KcQ6LcQ6L8Y5MMY5L8c6Mcg7Mck8M8s9M9NEPNNFO9BBOcs9M8s8NM9BN89AOM47Mc41J9k1KeI1LuszMfIvNfcrNvkpN/wpOvkmOfcmO/cmO/gnPPsmPP0lOv8kOv8jOv8iN/4jN/olN/ksO/c1PvI5P+g4OuA4N9w5NNw6Nd47NOA7NeU5Nec4Nek3M+s1NO40N+40N+42Nuo2NeY3MuE2L9w1LNc1Ktg4Ktg4KNg4KNk4Jto3Jtw3JN02JN02JNs1Jdw2KN03J9w5KNw5KNs6KNk5Kdc6K9c6MdAzLutIS/9vef9WavhEX/g8X/9BZ/8zXP84Yvg+Y+hNbMVPZYAwPUodIEMxLTExJy42JzQ9LD1CLkJAK0I8JEU+JEhFJFVcMHB+TY+fcpeofIOYbWqEV197Sl1+RV+DQ2GGQGKKQWaPQ2uQSmyRTG2ST22ST2+UTmySSWmOSWiNSGmMTGmMTGiKTmeJTWaFTGSDSmSBR2WCSGeDSGiESWaCR2SCRGeKSGmOSWyRTC0zJzM2Kzg5MTw7NkI9OUdAOk1EPVFHPVNJPVNLPlVORFpVUWFeZWlndW1rgWxrimpokGJgj1hWiFBQhlFRjVhZmmBjqmZqtG9ywXV4yXx/0IKF1oaH2YeI2IqJ2YuK1ouMz4uKzIqJzYmH0ImF0YiE0YqD0YmC0IyEz4uEyI2FwY2Guo2GsIeBpX53ln9thYRZaoBTWm5WVGNcUlphT1pfSGVaRHhVQpJMRLhUUtBTV9tSWeVeZOhlauNrbOZ1ceR1buJvaPd+dv+Ce/+HfvRsYMk/MsE4KMA7KL89J789J8A8J8I7J8U6J8c4KM03Kdg6L9k4LtI4LM85K8w6K8k6Ksg5Kck3KM85K9E3K9I4LNE3K883Ksw4Kss8LMs+Lco8MMk9MMo8Msk7L8g6MMY4LMU3LcU1KtBAN9BANc09NMk5Lss4MM47Mc06Msw1LNAvJdkwKeQyMOwyNfQvOPktOfsrO/wsPPwtP/suP/wvQPwvQP4vQf8vP/8tP/8uQP8pOfwpOPcrN/UwOvE2Pe04PeM3N9w0M9w5NNw6Nd47NuI6N+U5Nec4Neo2New0NPE0OPE0OO81Nu03NuY3MuE2L9o2LNc1Ktg4KtY5KNY5KNg5Jtg5Jtk4Jto3Jtk4JtU4JdU6JtY7J9U9KNQ9KNQ9KtQ9LNQ8LtE3L9o7OP9eZf9hcf9Qafc8W/9Baf80X/80YPsxWfRLbNtZcZU+TlolLUMpLDoyLy0wKTA4KzdALzpCKzw8IkE8HlVIKGBbNXuFU5CjbKq+i6i+jY6ld2+LW2F/S15/RmCERGOIQmWNRGqTR2+UTnCVUG+TU2+TU2+UTmySSWmOSWeMR2mMTGmMTGmLT2iKTmaFSmWESWSDSGWESWeFSWiGSGeFR2WFRGmOSWmRS2yUTisxJS40KjQ3MDg5Mz46N0I9OkhBO0tEPE5IPE5HPU9KRFdTUl9eZmZldWdnf2dmhmJhiVtZilFRhU5Ph1JTk1teo2Vps2xvvnV3ynp80X+B1oOF2IaH2YaH14iH1YmJ04eIy4aHyIaFy4WDzoWA0IWA0od/0oeA0I2F0oyFy42FwYyFuIuFq4R/nXt2jXxqeoRWY4FQVm5VUWReUFtlTVhiSWJeRXNYQ49PRbRXUtBVWtpTWudcY+hhZ+Vnauhwb+x5cuZxaPd8dPNzav54beZcUcQ7K741I8I7J8E9KME9KMM8KMQ7KMg7Kcs5Ks83KtY1K9g3LdQ6Ls46LMc6KcQ4J8Y6Kco9LM89LtZAMtlBNNY+Mc44Ksg0Jso4Kcs8LMk6LMg6LMk7L8k7Lco6L8g5K8g1K8c1KMo2LM87L9I+NNM/M9Y/NtU+M843LsksI9IrJdwtKucwMvAzOfYxO/owPP0wP/0wP/kwQPcxQPcxQPYwPfcvPPctOfosOfoqN/0vPPkvO/UwOvAzOu02O+Y2Od81Ndk0Mtw5NN06Nd86NuI6N+U5Nec4Neo2New0NPI1OfI1OfA2N+03NuY3NN82L9o2LdY2KtU3K9Q4KdQ4KdQ5J9U4J9U4Jdc3J9Q5JdA5JM48Jc89Js8/J85AKM5AKtA/LtI7MNE2MetISf9mcv9PZP9IZvs3W/9Bbf0vXf83YfI0WONQarxVZm0xOUUoKkU2OTczMjU0MDY5MDY9LTM7IzM4GENDHWphOoWBVJ+ud6nBh7XOl6/Hk5KufXaUYmWGUWCCRmCFQmOIQmePRm2WSnKYT3KXUnGVVXCUVG+UTmyRS2iNSGaLRmiLS2mMTGmLTmmLT2eGS2aFSmWESWaFSWiISWmJSGmHR2aGQ2qPSmuTTW6WUCgwIysxJy80LTM1MDc2NDw4NUA9OEM+OElFPEhFPEtIQ1JQUVtbZWFidGJifGBggl9eiFpYilRUilRUkFxdoGdps3BzxHZ4zXt/2H6C24OE3oSG3YSF2IOE1oWE1IaF0YOGy4KFyIODy4KBzYOA0YWA1IiA1YiA042F0ouEyIuDvouDsomCpIF8k3dwgHZlb35VW3xQUW5VTmZfT11lTVpkSWFhR3FdRYlURq1dVMhaW9RWWuJbYeZdZOlhZe5sbPV6c+1yavd4b95ZUOVbUNJEOMM1J8c6KcU6J8Q8JsU9J8g9KMo7Ks06KtA4KtQ2KtMwJ9QzKdI4LM07LMc7KsI7KMA7KMM8Kcg7KtVDNOFLPd5IOtM9L8o0Jsk1J807LMg5Kcg5Kcg5K8g5Kco4K8o4Kcs3K8s3Kc02K9I8Ltc/NNhAM9pANttBNdc6MdIxKdwwLuUxNO40OfU2Pvk0PvkxPvowQPgvP/IuPO8vPO0vOe0wN+8tNe8sMvIrMvEqMfUyOvUzO/I1O+w1OeU1N+E1Nd42Ndw3Ndw4Nt05N986NuM6N+Y4N+k3N+o2N+w0NvQ1OvQ1OvE3Ou44N+Y3NOA3MNo2LdQ2KtM3KtE4KtA4KtA5KNA5KNA5JtE4KNA5Jss5Isg6Isg+JMc/JchAKMhAKsw9Lc87Mdc5NvxVXP9ecf9HY/8/Yf86Yf83Z/4zYvs4YO1GZMVOYYlASVMxMkE2NEA6PDo0Nj81Njw3MTc5KzQ9IjlDHlNaLoKCUKKncbHFiq/LjrDMkqbDjZKufXuZZWeIUV+BRV6DQGOJQGmPRG+VSnOZUHOYU3GVVW+TU26TTmuQSmeMR2WKRWeKSmiLS2mLTmmLTmaIS2SGSWSGSWWISGeKSmiLSWmJSGaJRWqSTGyWTm+ZUSYuISgwJS0yKzEzLjMzMTc2NDo5NTw7NkdEPUREPEdGQk9PUVpaZF9hcF5geVxcfmBfiVxajFlYkVxcmmdnrXFzwHp80X+A3IGE4YKF5IWG44SF4YOD24GC1YOC0oOCzoSHzIOGyYSEzIOCzoWC04eC1oqC14yD1I2F0IyDxIuCt4qCq4V/m394iHNudXFiZXZXVXRTTGpWS2ZfTWJmTV9lSWNiRnBeRnpRP51bTbdaU8VTUtdWWuJXXOpZYPJjZfdybfFuZvdxaNFEO9RBN8UxJcg0JtRDMsc5Jcc6Jsk7J808KdA6K9M6LNg4LNk3LM8sI84wJc42Kcs8LMdALcE+Kr47J7w3JMA0I9FCMuNPQeROQNhCNMs3Kcs3KdA+L8o7K8k6Ksc4KMY3J8g2J8o2KM44KtA4K9M7LtU7L9U5LdI2KtU3LNo8Md08Mtw3Meg4OPE4Pfc6Qfs5Qvo0QfUvPPIsO+8sOu0vO+oxOeozOOs0OO01N/E1NvQzNvM1N/AzN+82O+05POk2OeI0Nd0zM983NuA7Od04Nt45N+E5NuM6N+Y4N+k3N+o2N+w0NvQ1OvQ1OvE3Ouw4OeY5Nd84Mtg3L9M3K9A4K806Ks05K8w7Ks06Ks06KM06Ksw7KMU5IsI6IsM9JMI+JcM/KMY/K8o8Ls84Md88P/9cZv9RaP9JZv85Xf89aPkuXf08aOk7XOVccKZMVl4uLkc4M0JDPjw4OT80OEUyNkM0MT06KT5FJkZVKmJzP5CbYa29f7HLjKvJi6bDi526hI6senuZZWaHUFp8QF6BP2GHPmiOQ2+VSnKYT3KXUnCUVG6SUm6TTmqPSWaLRmSJRGaJSWiLS2mLTmmLTmaIS2WHSmSHR2WIRmeKSGiLR2iLR2WKRGuTTG2XT3CaUigwIScvIigtJikuKC4wLTMzMTc4Mzk6ND09NT9AOERFQEpMS09SWVZYZVpcc11efVlYgltZi15dlmVlo25utnd4yH+B2ISF4oyM7oyM8IqK7IaH5IKC3ICA1oKA04OCzoCDyIGEx4ODy4SEzoaD0IiD04uE0oyEz4qAxYqAvImAr4d9n4B4jXdvemtlZ2ZdWG1bUW1bTWlcTGZeS2RfSWVhSGhhR29fRm9QO4VVQaVdT79hWdFZWN1RVO5TW/hcYPloZeZZUNREPM43MNE3L9c6MdY9L9Q7K885KM06Js85KNE6KdQ4Kdg4Ktw1LNw1LNAvJc0zKcw4LMo+L8VAL8FALb49Krw5J8I5Kb4wIulXSt9LP8MvI9E9Mc48L8c4KMo7K8k6Kcg5KMc4J8g3Jsk2Jss1Jsw0JtA3Kdc7Ltw+Mtw8MNk3LNo4LeI+NOxDPPVCRfI5P/AyPPY0P/YyQPEtO+0tOu0yPew3PuY1O+Q2OOU3OOs5OfA6OfE3OO83N/I7Pe48POo6OuY4N+E4Nd83NNw3Ndw3Nd45N+E5OOM5OeY6Ouk5O+w5PO05PO84PPQ3O/M2OvA4Ou05Ouc7OeA7Ndc5MM83LMo4K8g5Kcc5K8Y6Kcc6Kcc6KMg7Ksc8KcE5I8Q9J746I7Y0Hrw5JclEM88/NsoxLP9eZf9WZ/9JYv88XPgxWPcwWfs2Y/VCaedZb6xGUW8zM04zLEI/Nj5DPEA3OEAtMUwvM0syLkE5JkRKKFpuPX6aX564d6jFgqzKjJ++gpi2gJSyfoKgbmaEUlh2Qll7P12APmOHQWmPRG6USW2VTGyUTmuST2yRTmmOSWaKRGOGQmOGQmaJSWiLS2aKTGSISmeLTWiMTmeLS2aLSGWKRWaLRWqPSWuTSnGbUXKeU3SgVSowIikvIykuJykuKC0vLDEzMDU2MTc4Mjs8ND4/N0FEPUhKR09QVFNVYVhZa1pcdVxaf15diWRilGtqpHV0un9+zoeH34uM6Y2N74yM8ImJ64WE4oCA2IB+0oB/z4KCzIWGyYaHyIeIy4mIzouIz4yGzo2GzI6FyIqAvIl/sYZ8oYJ4kXtzgHRrbmxiYGVdUmVgTWVeS2ZeS2hdS2lcSWpeSGtfR25eRXdfR39bQ5JZRq1aTMdWUN5SU/VRWP9YX/BVU+NMRdk+OdU2MNk2L9w5MNs5LNY5KNM4JtE4JtE4KNQ4Kdc3Kdw2Kt80LN01LM4wJ8k1Kcg5K8Y9LcRBL8FALb88Kr45KMQ4Kcs8LuRSRdxIPMg0KMw6Lcg6LMI0Jso9LMs8K8o7Kso7Kss6Kcw5Kc44Kc82KNM3KtY4LNk3LNczKdUxJ9gxKN43Luc8NfhER/E4Pu0vOe8vOvAwPe4uO+sxPOs2P+Q1OtwzNtgyMt86OO5FQvhJRvhEQ/M/Puk6N+c5OOU5N+I5NuE4NeA4NeE5OOE5OOA4N+I4OOU5Oec5Ouk5O+w5PO05PO43O/M2OvI1Oe42OOo4OOQ7ONw6NdM5L8s3K8Y4KsM6KsI6KsA7KsA7KsE8KcE8K8E8Kb05JME/Kbs6JbM1H7k6J8E7L8o6Mtg8Pf9eZ/9QZP9BW/k4V/Y2W/U7YPQ+ZONJZas/TIM/Pl86Mkc7Lzo+MDg+MkY8OlI+PU4wLlM4L1ZLNWNpRXiPW42wcJ3CfaHGgZq5fZq5gJq2g42peHKOXll1RVRwPVx7Ql9/QGKGQGmNQ22TSGyUS2uTTGmQTWmQTWeMR2WJQ2OGQmOGRGeKSmmMTGiMTmeLTWmNT2mNTWmOS2eMR2eMRmaORWySSW2VTHCcUW+dUnSgVS0xIi0xIywvJiwuKS8vLTExLzM0LzQ1LTk7MDw+MUBCN0VIQUtNTFFSV1VVYVZXaVxZdF5df2ZkjHBuoHp4t4WDzo2L35CQ6pCO746M7YqJ54eE34F/0398y399yIB/w4aFx4iIxoqKyoyKyYyKyYyIxYyEv4uCt4mArYZ8oYB2j3twgHVqcG5kYmlfVmNdTV9hTF9hS2NeSmdcSmxbSW5cSG9dR3FdRXdhSXhYP4dTPaNWRMdYT+NVU/hPVP5NU+I+PN48N904NN43MeE2L+E2Lt03K9o3KNQ3JtM4JNM4JtU4J9g2Kd01KuAzLN01LMszKMQ2KMI5KcE8K8I/LcI/LcE8K8A4KMM1J9xKPdpGOtVBNc48L8Q2KMQ7K742JsY6Kcc6Kcc6Kck6Kso4Kcs3Kcw2KM0zJ9U5LdU3LNYzKtczKtozK982L+U6M+k8OPA8Pe00OeswN+wxOO4zPO00POs3QOo9Q903O+FBQexOS/hZVf1aVfpRTO9CPuU4NOI2MuA3MuA3MuA3MuE4NeI5NuQ7OOQ7OOE3N+Q4OOY4Oug4O+s4POs4POs4POw4O+81OO40N+w1N+c3N+I6N9k6NM84L8c3LMI4K786K707K7s8K7s8K7s8Kbs8K7s8Kbg5Jr1AKrM5JLE2JLY7K7UwJ8M0MOxQVP9baf9KYPU6VfA3VvFAXe9IZudIZM1OYYI4OWU/NlJAMkRBMDk9LDU3KT42K0s5L0UtI1I9LGddQoGIX5KrdJe7e5bBepa/e5SzeJy4hZq0hYCabVx1S0hiNU5oOFt4Ql99P2ODQGiMRGySR2qSSWiSSmeQTGaPS2SJRGSHQ2OGRGWIRmiLS2uOTmuPT2qOTmmQT2mQT2mQTWiQSmePSGiSSGyUS2+ZTXOhVnOjV3akWTI0JjA0JjAxKTAxKzEyLTIzLjM0LjQ2Kzk7LTs+LT9BM0RGOUlKRE1PTlJRV1NTXVhWZFxab2Rhfm5slHp3rISCw4yJ1pGP45SR6pOQ646L4omF2YJ/zH98w398v4B+vYSCwYaFwYmIwo2Kw4uIv4mFuId/roV9pIV7nYB2jnlufnJnbW1hYWteVmlbUGNcSl1gS11hSmNeSmhbSm1aS3FaSnRaSXZbRnNXQXhSO4pRPapZRs1bUONUUPBGSfE+QdsyL9w1L+E1MeM2MOM1LuE1K+A2Kds4KdY3JNM4JNE4JtQ5J9g2Kdw2KuAzLNo2Lcg2Kb04J7w3Jr06KL8+K8I/LcM7K8Q4KcY0J+lVSdM8Mcw4LNFCNL41JcA9K8A9K8A4KMQ4J8U5KMc6Kcg5Kcs3Kcw2KM0zJ9I2KtQzKdUyKds0LOM6M+k+N+w/Oew9Oug0New1Oe82O+41O+oyOuYzOeQ3PeI8QPNVVvxiYv9tav9pZPNWUeRBPN82M900L982Md43Md43Md84MuE4NeI5NuU5N+Y6OOU3OOY4Oeg4O+k5POs4POs4POs4POw3PO41Ou42OOo2N+U5N988N9Y8NMw5L8U5LL45Kro7KrY7KbU8KbU8K7Q9KbM7KrM8KLM6J7dALK04Jq04J7M7LasrIsM1NP1gZ/9UZPpHXPA8Ves9WOdHX+FPZNJPX7RTWnZHQVhIOUtEMkZFMUJFMD0/Kjo4IzszHj8zHVBHKm5rSIqTZpWsdJG0dI63c5G6eJ67haG4ipCnfWyCW0tfOkFXMExjN1dyP197QGSDQGmKQ2uRRmmRSGeRR2SPSGWOSmKHQmOGQmSHRWeKSGqNTWyPT22RUW6SUmqRUGqRTmqSTGiSSmeRR2mTR22XS3CcT3alV3amWnioXDc4KDY4KjY2LDU2LjU2MDU2MDY3LzY4Kzs+LT1ALUBDLkRHNElLPk1ORlFQTlJSUlZVU1lYXWFfbGtpgXVzm4B9soiGx4yK05WS4ZSR4pCN3IuH04SBxIF9un98tX98s4F+t4SBuoeEuYmFt4qEsoZ/qIF6m4B4kH9zh3puenJmam1fXmpbVGlbUGpaS2ZaSmJfTGJfTGVeTGlcS25bTHJbS3dcS3taR35VQYZSPZtSQbZWRs5SSNpHQOI4OOUzM90xLd8zL+I1L+M1LuEzLN8zKd01KNw5KNM4JNA5JM86JtE6J9Q4Kdk3Kt01LNg3LcQ7K7k6KbU2Jbc4J707K8I9Lsc7Lsc3LNA5MPVcVNY9Nck1K89BNbgzJLc6KLw/K786KcM6KsY6K8g6LMo7Lcw6Lc84LdE3LdAzKtIxKdYxK943MeU8N+o+Oug7N+Y3NOk3Ne87PPA8P+o2OeQxNeQ1OuhCRu1NT/94d/9xbvFgW91KQ9E4M9EyLtw3M+dAOuA5M+A5MeA3MuA3MuI2MuM3M+U3NuU3NuY2OOc3Oeo3O+s4POs4Pus4Pug3Peo3O+43O+43Oeo3OuQ6Ot89OtY9N8s7MsM7L7o4KrU6KrM7Kq88Ka88Kqw8KKw7Kaw7Kao7KKw9KqY4J6c5Kqo4LawvKctAQ/9ocvRNXvNIW+1EWeVIW9lPXslUXbdUV5xYVWRNP09MOUxHNEpFMUZELT9CJz1EIz5II0tWLlxnPHiBVIuZZpGkbY2pbo+ycpe5fZ+2iJKngHWGZFJjQz9QMEJTMU9hOVZsPWJ7QmWCQmmKQ2qQRWmSRmWRRmKQSGOOR2KHQmaGQ2eKSGmMSmuOTm2QUG6SUm+TU2qRTmuST2qTTWmTS2mTSWqWSW6aS3KeT3alV3anWHeoWT89Lj0+Lj09MT09Mz09NTs8NDs9Mjs9Lz9CL0BELUNHLkZKM0tMOk5PQVFRSVJSSFlXSlpaTl9eXGdlcnFuiXt5oYOAt4eFxI+M0Y+M042Kz4qFx4N/un55r3p3pnl2pXt2rHx5roB8roN9qYN9o394l3x0i3pygXZrc3JmZm1fXGpcU2tbTmxaTGxbS2tbS2ldTWdeTWldTWpdTW5dTXNeTXpdTYFaSZNgT5tWR6dOQLhKPcVAN882LtgxK94xK+E1MeE2L+I1LuI0LeAyKd40J9w2Jto7KNE5JM07JMw7Js47J9E6KdU5Ktk3LNM5LcE+LLQ7KLA1I7I1I7s5KcQ8Lsk7L8s3Ldk/N/hbVONJQc46MMxAM7g2JqwzILU8Kbw5J783J8A3J8M3KMU3Kck3Ks43LNE3Ldk8M9s6Mt45M+U8N+o+Ouo9Oec4NeM0Meg5Nus8Oew6Oug4Ouw+QPhQUP9iY/9wcPloZeJUUMo9NsAxK8k0MNY7N989OuA7N+I7NeE6MuI5NOE4M+M3M+Q3M+U1NeY2Nuk2Oek2Oeo3O+s4POs4Puo3Peg3Pek2Ou84POw4Oeg4OuM7Ot0+OtM+N8k8MsA8L7Y4KbI6Ka47Kao7KKk8KKg7J6U6JqU6KKU8KaA5KKA7KaA5KqI2KrU+ONtUWPtlcO5LXO9JXelKXNtNW8lRWrRWVqBaUopgUlBJN0hNOU5JNUhAKzs1GzY3Fz5PJUxmNmyKVHeUXISbZYmaZI2bZpCja5StdJiwfIOVbW59XFFgQzxKMDlGLEFQMU9fO1dqPWN6RGWCQmqLRGuRRmmSRmWRRmGPRmOOR2OIQ2mJRmqNS2yPTWyPT2yPT22RUW6SUm2UUW2VT22WUGyWTGuXSm2ZSnKfTnOiUXusXXusXXqrXERBMERCM0RCNkNDOUNDO0NDO0JCNkJDM0RGMEVILUdKLUpNMk9OOVJRP1RSRVVTRFxaQ1xcRFxdT2FhYWloeHJxkHt6poF+tYaCv4iDw4iEwYSBun97rnlzoXRvl29tlXBsnnJuoXZwnndymndyknRvhXNrenJpbm1iYGxfV2pcUWtbTG1cTG9cTW9cS3FbTXFbTm9cTm1dTmxfT21gT3NgT3pfToZaTZ9fU6RQRa5COLo7MsY2Lc4xKNYyKd01LOI3MOE2L+E0LeAzLOA0Kt01KNg3JdQ5Jc86Iso9Isk9JMo+J808KdI7KtU5LM87Lb9ALbE8KKw1Ia4zIbo4KMQ8Lso6L841Ldg5M/BOSfFUTdlCOcxCNb4/LqYxHbM8KL48LME5K8E3KsI2KcU3K8k5Ls87MdQ7M+FEPeNBPOQ/O+c+O+k9O+k7Oug4OOc4Nec4NeY5NeY3NOk7OvRKSv9cW/9kY/hjX8w9OcE4Mr00LsM4MdVBPd5FQN89O9k0MuI7NeI7M+I5NOI5NOQ4NOU4NOc3N+k3N+o2Oes3Ous2O+s4POs4Pug3Peg3Pek2Ous3Ouk2OeY4OeA7Ods+OdE+NsY8Mb48LrM4Ka47Kao7KKY7J6Q7KKM6J6M6J6A5JqE+K5Y3JZw9K5o5KZoyJ8NQS+1rbe5cZuxQXulKXN9IV81LU7lSU6RbUpJjUYBqVUpNOERMN0pCL0g5JEI3G0ZII1VwPWeTVn6zb4KzcYOlaH2SWYONWY6WY4mXZHyMX1hmQ0dUODlFLTZCKjpELD1KMEpYN1doPmV8RmiCQ2yLRWyQRmmTR2ORRmGRR2GPR2aLRmyMSW2QTm6RT2yPT2uOTmuPT22RUXCXVHGZU3CZU3CaUG+bTnGdTnSjUnemVXytXnqtXnmsXUlDM0pENklFOUlFOklHO0lHO0hGOUhHNUlIM0pKMkxMMk5ONFJQO1RRPlhSRFlUQV1ZPltaPlxZSF5bVGRhaG5rfnhzk314oIF7p4N9q4V/rYN8pn13nXVuj29phWtngmlliGpmi21oiG1pgm1ofGxmcmtiZ2pgXmddVGhcTmhbS2tcSW5dS3FfS3FfS3BdTHBdTnBdT3BdTnNdT3ddTn5dTodcTJJYTKFVSKRGPKs5L7o3Lco3L9M2Ldo2Ld42Ld82L980Ld80LN80LN83LN03Kdg2J9E2JM86JMw8JMo8Jss9J847KdE7KtM6LM48Lb5BL688J6gzIawzILY5J8E9Lsk7L8w4LswyKuBBO/hbVOBJQNBEN8pGN6syH7k+LMpGN8xCNcpAM8s/Ms0/M9RBN9xFPONGP+JAO+I9OeM6N+I2NOM1NOQ2NeU5N+U8OeQ/OeA9Ntw6Nd9AOupNSOpRTNNAObgpI7gtJr41Lck+N9FAO9Y+Odo7OOM7O+c9PeI5NuI5NuI5NuQ4NuU5Nec6Nuk5Oeo6Ouo4OOo4OOs4O+s4O+k5POg4O+c3Ouc3Ouk2OuY2OOI4ON46ONY9OMw9NcI8Mbk7La45KKo7KqY7KaI7KKA7J547Jp86KJs6J5g/LYw1Ipk9Lpg4KpcvJs1cWPd5fN9YX+ZYZNpRW8pLUrlMT6lWUJ5gVZBnVYBuVlBXOD9KKjw7HEM9G1VRK2x2RIOiZpTBfoe8doa4c3yeYW6CTXV+UYKHXnV9VltiQDtEKTQ8JTU9KD1EMjxFMjlDK0NQMlVlPmd7SGmDRmyLR22RR2qTR2aSR2KQR2OOR2iNSmyPTW+SUG6TUGyPTWmOS2qPSmqSTHObVHOdVXOdU3KeUXKeT3OiUnemVXqrWnamWnWlW3OjWVJLO1JLO1JKPVJKPVJKPVJKPVJKPVJLO1VOPFZPPVdQPlhRP1lSQFtURFxVRVxVRWJbSGFaSGFZTGJZUmVdW2thaXFmdHVqe3puhHxwiH9zi39ziXxwhHVqe21icmVdamNga2BfZ19cY19aXl5aWV5ZVWFaUmJaT2VbT2dbS2lcS2tcSWtcR21dRm1dRmpeSGljTXFmVHFaSnVPQotXSpxcUKNZTKxaTKVOPaZFNKc8LLE3KMI4LdE4MNw0Md0xLd82L943Lt43Lt43Lt43Lts3K9g2Kdc3KdU4KdQ4KdI5KdI5KdI5K9I5K9Q4K807LL07K7Y+La45KKkxIKsyIbc5KsA8L8M5Lsg1K841LdQ6MNtDON1LPtRIOcI9LLcyI91QRthKQNRGPNREO9pHP95HQOBDPuA8OuA3NOY4N+w6Ouw6Ouc3N+I2NOA5M9w9N9lGPs9COcQ6L7w0KLcxJrk1Kb87L8M/M8M6MMk8M9I/N9o/OuI9O+c7Oew4Oe05Ouc3OuU4OuU4OuU5OeU5N+U5N+U5NeU5NeA0MOE1MeQ2NeU3NuY4Oec5Ouc5Ouc5O+s7PuY5O985Odw9OtZBPc1CO8FBNrc/Mak6KaM8K6A9Kps8KJk6JpY6JZc4JpE4JpBBMIs8LYcvI5EvJrxMSuRtb+dsb81WWr1MTrVOT6pRTaJVT5tYT5ddUpVhVIpqU1daLzpNFjdGD1RhKX6OUJuwb5+8eZy9eJK1c36dYWiATFxtQ1lkQlRdQkhQOT9EMDo9LEBDMjxAMTo+MDxDMzpDMEFOMlJkPl1zQmeDSHCPS2+TS2ySR2qSSWmTS2eQSmyQUG2RU2+TU2yTUG2STWuTSm2WSm2YSXGcTHGeTXKfTnKhUHSjUnanVXmqWXqqXnmmY22ZWmKOT1dOP1dOP1dOP1dOP1dOP1dOP1dOP1dOP1hPQFlQQVlQQVtSQ1xTRF1URV5VRl9WR2RbSmNaSWNZTWNZT2ZbVWpfXW5iZHBkaHJlbHRncHZpcnZpcnNmbW1gZ2dbX2JYWV5bVlpaUllWT1dUS1hUSVhUSFxWSF5XR2NaS2NaSWZbSWdcSGldR2peRmtfR2hgSWNiTW5nVHZcTYFTRppWTatWT7BSSrdRRa9IOaxDMKw9LLE5Kb44LMs4MNU2Mtk0MN02Ltw4Ltw4Ltw4Lts3Ldo4Ldk3LNc3K9c3K9U3K9U3K9U3K9Q4K9Q4K9Q4K846LL48LrY+Lq45KKYxIKcyILI6Kbk+Lr48LsY6Lcc0Kss0KdI7MNxFOuFPQt9RQ91PQ9tGP9hAO9M8NdI7NNY9N9o9ONw4Nt0zM+c3N+s3OO43Oes3OOc3N+U5N+I9OdtCOspBN78/NLg6LLE2J681JrI4Kbg9Lb9AMcVBNM1ANtdAN989OOM6N+k3N+81NvE3Ouk2Ouc2POc3OuY4OeY4N+U5NeU5NeM6NeI5MuM6M+M6NeQ7NuQ7OOQ7OOU5OeU5OeQ6O+M7O988Pdk/PdBBO8Q/Nrc9Mqw7LaU7K6A9Kpw9K5c8KZY7KJI6JpM4JYw6JYA5J4A4KYk1Kp08Nb9RUNdlZdFeYbdNTaxOTKRUTZ1ZUJhcUZdeU5deU5hfVoxmUWBfL1NnKl5yM3qQT5mvbqW+fJmycIigYmqCSGF1QlRlO0pYN0ZQNz9INTk/MTU4LTo8L0FCND0/NDo9Mj1BMzpDMEBNM1JkPl50RWeDSHGQTXCUTG6SSGuUSGuTTGiRS22RUW6SVG2UU22UUWuTTGuUSGyXSG2YSHCdSnCdSnCgTHOiUXWmVHipWHipWHioXm2XWGKLUVmCSF1URV1URV1URV1URV1URV1URV1URV1URVtSQ1xTRF1URV5VRl9WR2BXSGFYSWFYR2VdSmVdSGRbSmRbTGVbUWZbVWhdWWhdW2ldXWpeXmtfX2tfX2leXGZbWWJXU19WUVpWTVdUS1VRSFJOQ1FNQlNPQ1dRQ1hSQl5XR15XRWFZRmNbRmdcSGleSGtgSmhiTGJhTW5nVXlfUIhYTqJbVbFWUbJJRbhFQLlAN7g+Mbc7L7g4K7w4K8M5LMk7L9E6L9k4Lts3Lds3Lds5Lto4Ldk3LNk3LNc3K9c3K9U3K9U3K9Q4K9Q4K9Q4K9I5K807LMA+MLY+Lq06KKMyIKMzH6o6JrM+LLk+LsQ/MMQ4K8UyKMg0KtA8MNhGOdxNP+JORNk6Ntg0M9QyMNY0Mts5N+E9POY8POk7PO05PO41OusyN+kyNug1OOU5OeE8OtlAOr44LbU6K7E2J640Ja01JbA4KLU8K7s9LshENc9DNtZCONw9N+I5NOg2NO01Ne83Oeo2Oek2Oek2Oec3N+c3N+Y5NeU5NeU6M+M6M+Q7NOQ7NuM8NuM7OOI6OeE5Od44ON05Otw8PNpAPtNCPcg/Obk6Ma03K6U3KKE7LJ08K5k8K5Q7KZM6KJA5JpA3JYo5Jno2I3k2JYg5LKBGPblTT8BXVLhQT6tJRqJNSJxTTJlZUJdeU5dhV5dhV5hfVotlUHNyRnqNVpOmbqS5gKvAh56ze3yQW1tvPD9SJEFTK0FQLz9MMjpDMDY8LjY5MDU4Lzk7LkBBMz0/NDk8MT1BMzlCL0BNM1FjPWB2R2mFSnOST3KWTnCUSm2WSm2VTmuUTnCUVHGVVW+WU26WUGyUS2yVSWyXSG6ZSXCdTHCdTHCfTnWkU3ipWHmqW3WmV3GgWF+JSlZ/RU94PmFYSWFYSWFYSWFYSWFYSWFYSWFYSWFYSV9WR2BXSGBXSGFYSWJZSmNaS2RbTGRbSmVdSGZeR2ZeSWdfTGdeT2ZcUGZcUmZcU2hdV2hdV2hdV2heVWddVGVbUWRaUGNbTl1ZTVpWSlZSRlJOQlBMQFBNPlROQFVPP1dRQVlUQVtWQ11YRGFaR2RdSmZfTGZhTWRjUWxlVXZcT4pbUaliXLhaWLZGRLk8OsM8OMY7NsQ6MMI4Lb04Kbw6Kr4/Lsc/L9M5Ldk3LNo4Ldk5Ldo4Ldg4LNg4LNU3K9U3K9Q4K9Q4K9Q4K9Q4K9Q4K9I5K807LME/MbY+Lqw5J6IzIJ0zHaI4Iqw9KbVALrw/Lb86K8M3KsU1Kss3K846Ls48L9M6Mt42NeAyNNsxMt0zNOA4OOU7POo9P+w8Pu43POwzOOkwNuYyNeU1OOE3N9o2Nc42Mbc1KK83J642Jqw3Jqw3Jq45KLI6KbU6KsNBMcpCNNRBN9w/OOI7NeY5Nes3Nu44N+02OOs3OOs3OOo4Nuo4Nug5NOc6NOY7NOI5MuE6Mt86NOA7N946ONw6ONs5N9k5OdY8OtVAPNJDPcpBO7s7Mq82K6Q2J543KJw7Kpg7KZQ7KZI7KI86Jo04JIw3I4c5JYA9KnY1I4E1J5lFOqpQSKxNR6lMR6ZRTJ1QSphVTJRaT5ReUpVhVpVhVpdhV41nVImFX5mpeK29jqa4iJChdHOGWU5gOC9BGy0+HDNCJTpGLj1GMztBMzo9Mjo9NDw9NTk5LT9AMjw+Mzk8MTxAMjlCLz9MMlBiPGF3SGqGS3STUHOXT3KWTG+YTG+XUG2XT3CXVHOYVXCYUm+XUG2WSm2WSG6ZSnCbS3GeTXKfTnSjU3moWHusXXenW22dU2WSTVuFRlN8Qk53PWNaS2NaS2NaS2NaS2NaS2NaS2NaS2NaS2NaS2NaS2RbTGRbTGVcTWZdTmZdTmZdTGZeR2dfSGhgSWlhTGlhTmlgT2hfUGdeT2pgVGlgUWlgUWhfTmhfTmhgTWhgTWhhTmReTmBaTFtVR1ZQQlBNPk5LOk5LOk5LOlBNPFJPPlRRQFZTQFhXQ1taRl1cSF5dS2JgUWZeUW1XSoZbUqxpY75jYMFNTchCQ9A7PdQ4OdM4NMw3MME5K7o9KbVDK7xCK847K9c3Kdg4Ktc6K9k5K9Y5KtY5KtQ4KdQ4KdQ4KdQ4KdI5KdI5KdI5KdI5Kc07LME/MbY+MKs6KKE2Ipo0Hps3IKM9Jq9CLbM7Kro7LMI6LMc5Lcs4Ls46MNA8MNk6NOk5POw0POYzOeMyOOIzOOE0OOIzOOIyNek2POk0Oec0Ouc3OuM5PNs3NtAyMcAwKLQ2KK06KK06KKs6KKs6KKs6KKw5Jq83Jrg6K8E7L84+M9g/N+A9OOQ7OOg5Nuw4N+42Nu42Nu42Nu03NOo4NOg6M+c6M+Q8M+E6Mt87Mt88Ndw9N9s9Otk+PNc9O9Q+Pc9APMtCPMVCOrk9Na03LaM1KJ43KJo6KpY7KZM8KZE7Ko06KIo5Jok4JYg3JIM4JYNALXU0InszJZNHOqRRSaFORp5OR6FXTphVTJJYTJBaTo1cTo9dUpRgVZdhV49oV42JZpilep2pgYCOal1rSERTNDJAJiQyGS06JjA7KjU9Ljk/Mzw/ND0/NDo7Mzo6MDk5LT4/MTs9Mjg7MDs/MThBLj5LMVBiPGJ4SWuHTHWUUXSYUHOXTXGaTnGZUm+ZUXKaU3KaU3KaUXCZTW2XS22YSXCbTHOeT3SgUXaiU3inWXupXnqoX3GfVmSSSlmGQ12GSld+R1J5QmVcTWVcTWVcTWVcTWVcTWVcTWVcTWVcTWVcTWZdTmZdTmZdTmdeT2deT2hfUGhfTmdfSmhgSWlhTGpiTWpiT2piT2phUGphUGphUGlhTmhgTWhgS2hgS2hgSWlhSmpiS2ZfTWJdSl5YSFhSQlNNPU1KOUtIN0lINktKOExLOUxNO05PPVBRP1FUQVNWRVNWRVtZTF5WSWNRRXpYTqFoYbZlYcRWVdZRUtlAQ986Ptw4N9Q3MMc7Lrw/K7FDKrVBKMo7KtQ3KNU4KdU5KtY5KtU5KtU5KtQ4KdQ4KdI5KdI5KdI5KdI5KdI5KdI5Kc07LME/MbU9L6s8KaI5JJk2H5U1HZs7IqdBKrJCLrlAL787LMM3KsUyKMs0K9I7MN89OOo1Ou4zPOs2Pek4Puc6PuQ7PuM6PeI5PN81OOE3OuI5PuE9Pts9PtE5NsMyL7YwJ685K6s+Kqs+Kqk+Kqo9Kak8KKk6J6s4Ja82Jbk3KcU7MNA9M9k8Nd88N+Q7OOg7N+44N+83Ne83Ne44Nes6NOk7NOc8NOQ9NOI+NeA/N95BOtpBO9lBPtVBP9FAPc1CP8M/OrtAOLM9M6o4LaE1KJs1J5g4KJU8KpE8KI08KYo8KIg6JoY5J4Q3JYM2JH82JX06KXQzIX45KpdPQaNZTpxSR5VPRZhWSpVZTpBbTY5aTYxbTY5cUZNfVJlgV5FnV354WHmDXnJ8WlVgQjtFLC87JTA7KjA8LjM9MjQ8MTY8Mjw/NkBBOT9BNjw8MDc3Kzg5Kz4/MTo8MTc6Lzo+MDdALT1KME9hO2J4SWuHTHWUUXWZUXSYTnGaTnKaU3CaUnKaUXOcUHKbT3CZS26ZSnCbTHOeT3ahUnmlWHunWnqoXXimXXGfV2eUT12KRViCQmCHTlmASVN6Q2deT2deT2deT2deT2deT2deT2deT2deT2deT2deT2deT2hfUGhfUGhfUGhfUGlgT2phUGpiT2piT2piT2lgT2lgT2lhTmlhTmlhTmhgS2hgS2hgSWhgSWhhR2hhR2hhR2ZfTGVeS2JbSVxXRFdSP1BNOkxJOElINklINkdINkdKOUdLOkhMO0lNPEhPP0pOP1BRQ1hSRltPQ2lSRINZTZZWTLBTTNRaWdtJSuI/QuE5Odo3Ms87McI/LbRCKrM8JMk6KdM3KNQ4KdM6KtU5KtM6KtM6KtM6KtI5KdE6KdE6KdE6KdE6KdE6KdE6Kc07LME9MLU9L6w9LKM8KZg4IJA0G5U5IKFBKa1DLbZBL789L8A2K8IvJccwJ9A2Lt46OOg1Oe42Puw7QepAQ+ZBReBCQ9xAQdk/P80xMtA2NtM6PNE9O8k7Ob43MbU0Lq00Kao8LaU+K6U+K6VALKU+K6Q+KKY7J6k6J6o3JbI3J7w4K8U4Lsw3MNQ5NNw9OeY+O+k6N+w5New5Nes6NOk7NOg7NOU9NOI+NOBCN91DOdpDPNVCO89BPco/PMc9O78+ObE8M6k6L6I4K5w2KJg3J5Q4KZE6KY06KIs9KYk8Koc8KYM6J4I5KIA3Jn82JX02JHgzI3g1JYVCMphVRZ1XS5RQQ5BQRJVaTJNZTZBaTpBcUZBcUZJbVJVcVZhbVo5iVWtiRVZgPUpTND1HLDY/KjI9LDQ+MzU/NjY9Njg/OD1CO0NGPUVHPENENkA+Lzs5Kjc4Kj0+MDo8MTc6Lzo+MDY/LD1KME5gOmF3SGuHTHWUUXWZUXSYTnKbT3KaU3CaUHGbT3KdTnGcTXCbTG+aS3KdTnWhVHmlWH+rYH6pYXqlXXGcVWaRTF+JR12HRV6ISWKJUFmASVN6Q2hfUGhfUGhfUGhfUGhfUGhfUGhfUGhfUGdeT2hfUGhfUGhfUGhfUGhfUGlgUWlgUW1kVWxjVGphUmlgUWhfUGdeT2deTWhgTWlhTmlhTGlhTGlhTGhgSWhgSWhhR2hgSWdhS2ZfTGVeS2JbSFxXRFVSP1BNPE1MOkVGNERHNERIN0RIN0JJOUJLOkJLOkNKOklLPlNRRFNQQVhMPGVLOnRFNZVIPsJZU9lST+BEReA6Otw3NdU7M8o+L7o9KbU4Isk6Kc84J9A5KNI7KtI7KtI7KtI7KtI7KtE6KdE6KdE6KdE6KdE6KdE6KdE6Kc07LME7MLY6Lq08LKc+K5k5I48zGpM3Hp8/J6M5I7A7KcA+MMY8Mcw4LtA3L9k8NeM/Pew9Qu4/ROlDReJEQ9hAP8o7N8A1MLsxLrkvLLw1Mb46Nrs8NrM6Mqo4LqQ4LKE6K6E9LZ8+K6A/LKFALaFALaFBK6M+KqY9Kqk7Kq06KLI3KLk1Kb81K8k5MNQ/OeBDPuQ9N+g7Neg7Nec8NOU8NeQ9NOE+Nd5ANdxEOdhEOtJDO8pBOcQ/Orw7Nrg4NbA5M6I3LZk4KJU1J5M2J5E6KY88Kos6KYU4Jog9KoU8K4M8KoA8KX46J3w4JXs2Jns2JnkxI4A4KoxHOJZTQ5JQQotMPZBSRZlfU5FXTJJZTpRbUpZdVJZdVpdcVpZZVIxeUWFYO0VNKDZAHjhBJj5HMjxFNDM9Mi03LjE4MTc+NkJFPEdKP0hJO0JDMT8+Kjs6Jjc4KD0+MDk7MDY5Ljo+MDY/LDxJL05gOmF3SGqGS3WUUXSYUHSYTnKbT3KaU3CaUHGcTXGcTHGcTHCbS3CbTHOeT3ejVnunXIKtZYCrZHijXGqVUF2HRVmDQV6ISGWPUGOKUVqBSlN6Q2lgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlfU2pgV2pgV2pgV2pgV2pgVmpgVmpgVGphUmphUmphUGphUGpiT2piT2piT2piTWpiTWdfSmdfSmZeSWVfSWJdSVpYQ1NQPU1MOkhJN0VIN0FFNkBENT9FNz9HOD9HOD5GN0dLPUlLPUFFNEtKNlxRO2FFL4NKOcBqXdxnYONVU+RGReVBQOBBPdU+Nck9MMY9LcY0Jcs1Jsw2J803KM03KM44KdE7LNM9LtI8LdI8LdI8LdI8LdE7LNE7LNE7LM48LbsyKLY3LrE7L6g6KZo3IpQ1H5U3Hpw5Iq5BLbM7K7o2KcE0Ks02L9c8N+JDP+pIRehERehFSN1DQ8k6Nrs2MbQ4MK44Lqk0K6s5L6k5LqQ4LqA4LZs5LJY6K5M8K5I8K5Y9K5g9Kpk+K5o/LJtALZ1BLKBBLaNALaI7KqU6KKs3KLA2KbY2K744LcQ7M8w8NNo9NuA9NuI/OOJBN+JBOd5CNtpANtdANdhIPdJFO8dBOLs7MrI1L6ozLaYxKp8yK5k5LZI7KpE5K406Kos6KYg7KYc7K4U8K4A5J304KHw5KHw5KHw5KHs4J3k2JngzJHctIItBNJdPQ5NNQY5MQJFRRZNVSo5SR5hcUphcUpFVTZBUTJdaVZVYU5RXVJNnWl1UNUlRKkFLKEJLLD5ILzdAKzI9LTQ/MTQ8MUhQQ1peUFdbSk1POkRGLkFBJz09JTo7KT4/MTs9Mjo9Mjs/MTQ9KjtILlBiPGN5SmyITXWUUXOXT3KWTHCZTXKaU3GbUXCdTHGeS3KfTnKfTnOfUHaiVXunXH+qYoKtZnijXmqTT2CJR16HRWGJSmaOUGiQVGSJU1uATFR5RWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlfU2pfWWpfW2pfW2pfWWpfWWpgV2pgVmpgVGpgVGphUmphUmphUmphUmphUmphUGphUGhgTWhgS2dfSmdfSmRdSl5ZRVVSP09OOklKOkVIN0JENkBENT9FNz5GNz5GNz1FNkBGOD5FNT5GMUhMNU1JMFU/J39ROrxzYstjWOBfWutVVOdHR+JAPuBBPdg/Oc46MM05K849LM89Ls8+Lc87Lc47K805K806Ks46LNA6K9A6LNA6K9A6LNA6K9A6LM07Lsk/NcVCOrxCN649L582I5YxHZYxHZsyHag1I7Q2KMM7L9FBON5FP+ZJROlKRupLSN5DQdtFRNBCPrw8M685L6k9MKU/MZ89MJ8/MZw+Mpc+MJQ+L489L4o+LodALog/LI49KpE7KpI8K5M9LJQ/K5U+K5c+LJk+LJ9ALqE9LaQ6LKg4LKw4K7E4LbY6MLw5L8o8MtA8MtM/NdVBN9dDOdZDOdREOdFFOMpCNsNBNLk9M7A6MKk2L6Q1Lp80LJk3LJI6Low9LIo7LIg7K4Y6KoQ7KoM8KoE8LH47Knw7KXs5KXk6KXg5KHc4J3U2J3c0JIA0J5BEN5hOQ5FLP4xKPo9RRJJUSZBSR5NTSphYT5hVT5dWUJxdWJRXUo5TT4pjVF1XNVhjOV9qQlpmQklUNjZDKTRAKjxINE9YR1liUV9mVFdcRkpON0JFKj8/Izw8Ijk6KD0+MDo8MTk8MTxAMjU+KztILlBiPGR6S2yITXWUUXSYUHKWTHGaTnKaU3GbUXOgT3KfTHCdTHGeTXSgUXikV3ynX3+qY3umYW+aVWOMSl2GRGGJSmWNTmWNTmOLT2SJU1uATFR5RWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlfVWpfW2peXmpeXmpfXWpfWWpgV2pgVmpgVGpgVGpgVGpgVGpgVGpgVGpgVGpgVmpgVGxhT2tgTGlhTmlhTmZfTGFcSFlWQ1NSPk1LPEhJOURGOEFFNkFFNj9GNj5ENjxENT1GNTdALUBIMUlLM0Y/JVc/J4daQ7dzYLZWStliWvBlYuxUU+ZGSOtHSOZDRNg7Nss3K8k6Ksk6LMk6Kss5LMo4Kcg2Kcg2J8o4K8s3Kcs3K8s3Kcs3K8w4Ksw4LMs4LsIzLb41L7Y2La0zKKEwIp4vHqAxIKczJLxBMsdDN9ZHP+FMRudMR+lKRuVGQt9EQNdDQc9EQcFAOrE7MaQ8L6FBMZxFNJhFM5NEM5FENI9CMopBMIVAMIJBL35BLn9ALoY6Kos5K4s6KYo7Kos8K408K449Ko88KpY/LpY9LZs7K505KqA4K6U5Lak7Lq45L7g6Lr45MME7MMQ+M8U/M8VBNMNBM8FBNLY7LLI6LKo4LaM3K542K5s2LJg3LpQ6L407L4g8LIc7LYQ7LII6K4A7K4A7K388LH07K3o7Kno7LHc5KnY4KXU3KHQ2KXY0Jog7MZRGPJZOQo5KPYhIPI1PQpFTSJJSSZJPSZlUT5lTUZpWU5pdWpNZVY1bVI1sW4F9WH6JXoCLYWx4UkxYNDZEIz1KLkxaQGVxWWVvV11lTVBVPkVJMD9DKD1AIzo8JDg5Jzs8Ljg6Lzk8MT1BMzY/LDxJL1BiPGR6S22JTnaVUnSYUHOXTXGaTnKaU3CaUHWiUXCgTG6dTHCfT3WkVnmnXH2oYHynYHCZVWaPTVyERVyERWWMTWmQUWaNTl+FSGOIUlp/TFN4RWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWphUmphUmphUmphUmphUmphUmphUmpgVmtgXGtfX2tgXmtgXGtgWmthWGthV2thVWthVWthVWthVWthVWthV2thV2thWGthV25iUm1iUGpiT2piT2hhTmVeS19aR1lWRVJPPk1LPEdIOkRGOENFN0JENkBENTxDMzxINDlCLUZKM0xGME86JXFMOZpjT6peTqFBNcZTTOdjX/BeXu1TVetKT+lESOFBQcw5Mcc5LcU3K8U3K8g4Lco6L8s7MM06MNE+NNE+NNI+NNI+NNM/NdM/NdM/NdM+N9M/O9FCPstEPsZGPcJGPMNJPsdNQM5QRNlTSN1QR+JNR+RJReRHQuJDP+BBPdtCPdVGQslEP7o/N6s9MJ8+LppDMJVHM5RJNo1GNIxFM4hDM4VCMYBBMH1ALnpBLnw/LYI6LIY4LIU5K4Y6LIY6LIc7LYc7K4g7K4k6K4s6KY44KZA4KpU5LJk7L509L6I8MKo6L604Lq85L7A6LrA6LrA6LK85K644Kqg3KaU3KJ42KZs2KpU3K5I4LZE5L448MIg8LoU8LYM7LIE5Kn86Kn45Kn06Kn07K3w6LHo7LHk7LHc5KnM4KnE2KHI3KXU1KYxEOJJIPZFLP4pIOodJPItPRJNUS5dUTJZRTJtUUJhRT5RTT5ZcWJBfWJBoXpd+apSUcIWSZnWCV1loP0NSKz9PKlBgPGNyUWV0VVxpS05YPUNMMT9FKz5CKT1BKDs9Jzc4KDo7LTc5Ljk8MT1BMzdALTxJL09hO2J4SWyITXaVUnWZUXSYTnKbT3KaU2+bUHGgT2+eTW+eTXOiUnqoXXyqYXqlXnWgW2OMSl6HRVuDRF+HSGeOT2qRUGaNTGCHSGKHUVl+S1J3RGlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWphUmphUmphUmphUmphUmphUmphUmpgVGtgWmtgXGtgWmthWGthV2thVWtiU2tiU2tiU2tiU2tiU2thVWthV2thV2thWGthV29jVW5iUmtiUWtiUWtiUWhhT2RdTWBaSlhSQlJPPk5LPElHOEdFNkRFNUJDMz5CMT1JMT9HL0xHMVM+K2c9LZVaTK1fU5w+NJ4zK7Y/OdhYVfNpZ/ZkZetSVeZKTuhOUNlJQdNGPM1ANss+NM5ANtJEOtVHPddHPtpKQdpKQd1KQt1KQt5LQ95LQ+BLROBLRetTUuhUVONTUtxST9hTTNhTTNtVTOBVTuBMSOFJRuNFQuJDQORCQOJDQORFQuBGRNlKRspFQLk+N6w9MqE/MphCMZJFM5BHNIxFM4hDM4dCM4NAMIE/MX4/MHo/L3w+L4A6LoM5LoM5LoM5LoM7LYM7LYM7LYM7LYE5KoI5KoU5K4c6Kok6K407LY88LpM7L5s7L545LZ85LaA6LKE5LKI4K6I4KqI4Kp84KZw4KZg4KJQ4KY85Kow6LIk6LYc7LYQ6LYI6LIE5K4A4Kn04KX03K3w4K3s5K3o4LHk5LXg6LXY4K3E1Km81KXE3K3Q5K4xIO41JPIlJPYRJO4VLP4xSRpNXTZhYT5hRTZxVUZhSUJNWUZJgWYhiV4NnW4Z6ZG5yUVppQEpZMEFSKElaMFdpP2R2Tmp8VlhpRUxbOj9MLjpEKTxELD5DLTxBLTo9LDg5Kzo7LTY4LTg7MD5CNDdALTtILkxeOF91RmmFSnSTUHSYUHSYTnKbT3ObVHCcUW6dTW2eTHChUHeoWXyqYXqoYHKdWGmTUVqDQVyERWGISWWMTWeOTWeOS2iNSmaKTGOGUFl7SVJ0QmlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWtiU2tiU2tiU2tiU2tiU2tiU2tiU2thVWxiWWxiWWxiWWxiVmxiVmxjUmxjUmxkUWxkUWxkUWxjUmxjVGxiVmxiWGxiWGxiWG9jVW5iUmtiUWxjUmxjUmtiUWdgUGRdTV5XR1lTQ1NNP01KO0tIOUdFNkVCMz9CLztILj9ILU9DLWE9LYNFOqtYUrROSp4sK7I6Obk9O9NTUvJwbv52dvFlaOtYXvBeX+NVUdpQRtRHQNBDOtFEPdRHPtZHQdZHP9lIQ9pKQtxIRN1KQ95KRt5LROBLR+BLR+JISOFHSdxISNlHR9ZIRNdIRNhHQttGQuBCQeRBQuZCQehCQudDQuRCQN9BPttBP9tKR8pDP7k8Nq4+M6JAM5hBMJBBMI9DM4pBMohAMYc/MYU9MYI8MIA8MX89MX89MYE7MYE7MYM6M4E7MYE7MYA8L4A8MX89L4A8L4A9LYE8LYA7LII6LIE5KoI4K4M3KYw6Lo84LpE5LZQ6L5c7Lpo9Lp48L58+Lpk5KZY5KJM6KpA6K4o7LIc7K4Q7LII6K4I6LIE5K383KX42KHs1KXs1KXs1KXo2KXg2Kng4LHc5LHM4KnA0KW81KXI6LXY8MItNQIlLPIRKPIJNPYVRQ4tWSJJYTZdXTpNOSZlUT5dWUpVcVZBlXHteUGZWRmBeR0VPLT5OKT9PKEpcMl9yRWt+UWV4S1hqQE1fN0BRLTZFJjdEKj1GMT1ENDo+MDc7LTg6LDo7LTY4LTg7MD5CNDdALTlGLElbNVtxQmWBRnKRTnOXT3OXTXKbT3ObVHCcUW2cTG+gT3OkVXioXHqoYHOgW2mTUWCKSFmBQl6GR2WMTWeOTWaNSmWNR2eMR2iMTGGETlh6SFFzQWlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xiWGxiVmxiVmxjUmxjUmxkT2xkT2xkTWxkTWxkTWxkT2xkUWxjUmxjVGxiVmxiVm9jVW1hU2tiU2xjVG1kVWxjVGlgUWZfT2JbS15XR1hRQVJMPE9JOUpHNklDM0FDLjpHK0BGKlVAK3hHOaNQTLRISLY4PLozOchBRcQ/QMpKSd9iYPFxcPBucOdiZeJaXNtRTtVMRM9EP81CO89EP9BFPtBCPs1AOdJDP9JDPdRDQNVEP9dDQdhEQNlFQ9pEQ91BRN1BRN5ERt1HSN9JSOBKSeNJSeVHSOdBQ+pBROxCRexCRedBQeJAPts9OtU9OtpGRsk9PLk4M7A7MqZANJg/MZE+MI9AMYo8L4o8MIk7MYg6MIc4MYY5M4U6NIQ7NIE7M4A8M4E6NIA8M388M309MX09M3w8MHw8MHw9Lnw9Lns8LXw6LHs5KXo4Kns3KoI6LoM5Loc5LYk5Lo05LpE7LpU8LpY9LZI5KZE6KY06Koo7Koc7K4M8KoA7K347KoA4KoA4LH42Kn01KXw0KHo0KHo0Knk1KnUyKXY2LHY4LXI2K28zKW81KnM6L3hAM4pQQoZOP4FOPYJRQIVWRolYSY5VSpFSSZJPSZdUTpNUT5FcVopmWm5bSlBLN0VLMUFOMEtaOVdnQ2BySmd5T2R6TFZsPkddL0FWLTdIJDFAITZCKj1GNTxEOTg9Njc6Mzk7Ljs8LjY4LTk8MT9DNTdALTdEKkZYMlZsPWF9Qm+OS3GVTXOXTXKbT3ScVXGdUm+eUHGiUXWmV3amWnOhWWqXUmKMSluFRV6GSGCISWOKS2WMS2aNSmaOSGaLRmWJSWCDTVd5R1ByQGlgUWlgUWlgUWlgUWlgUWlgUWlgUWlgUWtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xiVmxjVGxjVGxjUmxkUWxkT2xkT2xkTWxkTWxkT2xkT2xkUWxjUmxjVGxjVGxjVG5iVG1hU21hU21hU21kVWxjVGphUmdgUGRdTWBZSVpTQ1VOPlBLOE1INUlEMURDLkBGKkREKFtCLIhUR69cWKs+QawvM85JTsY/RcA7Prs7PMRGR9haW+NlZttZW8xHSNFKR9BFQs1CP9BCPtRGQtRGQtBCPsk+N89EPc9EPdJEQNRFQdZFQtlFQ9pERd1ERt4/Q99ARN5CRd9FReFHR+BGRuBCQ+E+P+hCROlAQ+g+Qec9PuQ+PuNBP+FDQN9FQ9ZCQsU5OLY1MLA7NKY/Npo+M5A9L40/Mog8L4c6MIc6MIc4MYc4M4c4M4g5NIg7NYI5MoA6MoA6Mn87Mn48MH48MHw8MHw8MHg4LHk5LXo6Lno6Lns8LXs8LXo7LHo7LH07L385L4A3LoE3LIQ2KoU1KoY3KoY3KIo4Kog5Kog7K4U8LYQ8LYA9LH48LH07K305LH03LXw2LHk1Kno0Kng0KXg0KXg1LHIyKHU1K3Y4LXI2K240KW41KnQ7MHhCNopVR4RQQoBPQIRTRIhXSYxWSoxSR41OR5VUTpRVTotSS4RYTX9kU2VaREdLMj1KLElYOVprSWd4VGN4UVluRVNoPU5jOEpfNDpMJjA/Hiw5HTU+KT1DNTxCODo8Nzk8NTs9Mjs9MDc5Ljk8MT9DNTg/LThCKUVVMVVoO2F6Q26KTXKTTnKWTnKaUXOdU3GdUnKgVXWjWHakW3SiWm+aVWaQTl6ISFuDRGSMTmGJS2CHSGOKSWaNSmeOS2WKRWGFRWCDTVd5R1ByQGlgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiUWtiUWtiUWtiUWxjUmxjUmxjUmxjUmxjVGxjVGxjVG5iVGtdUHBgUXRkV3JkV25iVmpgVGhgU2hiVGdhU2dhUWNdTVtWQ1ZRPVNOOE5IMkdBKUtHLEk/JGJJM5FnV7Z4bbtsZbhZV7lPT7ZCRb1CRcJER8hGSM1IS9BKS9JMTdNLTc9FRdBERdNFRNZGRdVGQtJDPc5DPM9GPMhEOMlFOcpFPMxFP9JEQNdDQ9pBRNs/Q+FCRuJCROFDROBEReBEReFGRONFRORERONDQ+RCQORAP+M/PuM/PuJAPeJAPd5DP9NCP8U+OrY5M6o3MJ86MJc9Mo4+M4Y+MoM/MoE/M4E9MoE7M4Q5M4Y5M4g4MYg5MoU7MIQ8LoQ8LoM7LYE7L4A6LoA6LoA6Ln46LX46LX46LX46LX07L307L307L307L305MH05MH44MH44LoA3LoA3LoA3Ln44LIA4LH44LH05LHw4LXs5LXo4LHg4LHg4LHg4Lng4Lnc3LXY4LXY2LHQ2K3M1KnE1K20xJ3I2LG40KW0zKG82K200KXE4LX9JPYVTSIVTSoZSR4hSSItQSJBRSpRRS5VSTJNUTY1US4lbToJjUW9fSFlVOk1WN09fO2p+WWJ4UVlvSFVqQ1JnQE1iO0lZNUNSMTdEJjQ+IzI6IzY7Jzw+MEBCNUBANjw+MzU4LTM5LTQ6Ljc6Lzk9Lzs/Lj1CLDxFKFNfO2FyRm6GUnORVXKVUXKaU3OdU3KdVXWeWn6nZX6nZXCYWWKKS16GR16GSF6ER2CGSWKIS2SKTWaNTmWMTWOKS2CHSF6ER1+CTFR2REttO2lgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVG5iVHJiU3FhUnJiVXFjVnJmWm9nWm1lWGpkVmdjV2toWW9pWWxnVGhjT2NeSFtVPVJMNFBKMEg+JVE/KWtQPX9YR4ROQohFPZNEP7FXVrhUVLtRUcBQT8BOTcFNTcJMSsNLStBUVMhIR8I9PsQ9OtBCQNNFQc9CO8c+NMpEOclFOctGPc1HPtRGQthERNxBRd1BReFCRuFDROFDROJEReJEQ+FGROFGROFGROBFQd9EQOBCP99BPuBBPeBBPeBBPd5DP9RFP8hDPLo+Nqw6MKA5MJQ6L4o8MII8MIBBMn5AM34+NH88M4M6M4Y5MYg4MYk5MIc7LoU8LYQ7LIQ7LIM7LYI6LII6LII6LH85LX85LX85LX85LX46L346L346L346L305MH05MH05MH05MH05MH05MHw5MHw5MHw5MHo6MHo6MHk5L3k5L3k5L3c5Lnc5Lnc4L3c4L3Q4LnM3LXI2LHI2LHA2K3A2K2sxJnE3LG00KWwzKG82K2wzKHA3LH5IPoRSSYVTTIhRSotQSpBRTJRQTZVRTpRTT4pPR4VTSIBbS3tlUHNpUGhrTGZxUWd4VF50TVhuR1BmP0xhOktfOktcOkdWN0NQNDxGLThAKTY7Jzc6KTw9Lz9AMj4+Mjs9MDQ6MDM7MDU7MTY8MDo8Lzw/Lj5BLD5EKlFbOV5tRGuBUnCMUnCTU3GZUnOdU3OeVnifXnyiZXieYWuRVGCGSV2DRl2DRlyCRWCGSWGHSmOJTGWLTmSKTWKIS2CGSV6ESV1/TFJ0QklrOWlgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVG5iVHFkVG9fUG1dUG1fUnFlWW9nXGxkWWhiVmZiV3BsYHt4aX57an95aXp1YnBpVmVgSlRUPEZGLkM+KE1CLlNAL1U4KF03Kmw9M243MHU5MX47NYdAOpJJQptQSqVYUK1aUrteWbpTTrdHRbxCP8hEQtFGQ9NEQM9AOtBBO9BDPNJFPtRHQNZHQ9pGRttFRt5ERt9DRN9DRN9DRN9DROBERd9FRd9FQ99FQ95EQt5EQtxEP9tDPtxDPdxDPdxDPdtDPtZFQM5FP8NCPLM+NaI6MZQ4LYg5LIM7LYJAMn9AMX4+Mn89MYM6MYY5MYc4MYg6MIc7LoQ7LIQ7LIQ7LII6LII6LIA6LoA6Ln85LX85LX46L346L346L346L346L346L305MH05MH05MH05MHw5MHs4L3s4L3s4L3s7MXs7MXo6MHk7MHg6L3g6L3g6L3g6L3Q4LnQ4LnM3LXM3LXI2LHE1K281Km81KmoxJm82K200KWsyJ2w2KmkzJ203K31HPYdQSYdQSYtQSo5RTJFSTZJTTpRVUJFWUIxXT4dbUH5eT3RiTm9pUW9yVWx3WWZ3VVFlQktfOkVZNkRVM0VWNkdWOUdUOEVSOD9JMDxELTk+Kjc7Kjo8Ljw+MDs9Lzk7LjY8MjU9MjY8MjY8MDo8Lzw+MD1ALT1DKU1XNVppQGZ8TWyITm6RUXGZUnWfVXSfV3qhYHedYG6UV2OJTFyCRVyCRVyCRVqAQ1+FSGGHSmKIS2SKTWOJTGGHSl+FSF2DSFt9SlByQEdpN2lgUWlgUWlgUWphUmphUmtiU2tiU2tiU2phUmphUmphUmphUmphUmphUmphUmphUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVG5iVHJkV29hVG1fUmtfU2thV2xjWmxlW2pmXWpmXXh0aYiEeJGNgZWPgZKMfomCcn16Z2BjTk9UPkRHMkZFMUhDMEY9LEw8LFZDNFA5K1I2KlY0Klk1KVw2K2E5L2U9MW09MYpLQp1TSq5VT7ZOS7xGRMZBQtJEQ9hGRtRAPtVBP9ZCPtZFQNlFQ9pGRNtFRN1FRN5ERN9DRN9DRN5ERN5ERN1FRN1FQt5GQ9tGQtpFQdlEPthFPtdEPNdEPNlEPdhFPtREPNNGP8lGPrpBOKc7MZg4LIw5K4U8LYNAMH9AMX4/MH89L4M6MYQ6L4c5L4g6LoQ6LYQ7LIQ7LIM6K4I6LII6LH85LX85LX85LX85LX46L346L346L346L346L346L305MHw5MH05MHs4L3s4L3s4L3s4L3g4Lns7MXk7MHk7MHk7MHg6L3g6L3g6L3Y6L3M3LXM3LXM3LXI2LHE1K281Km81Km00KWoxJm82K2wzKGgyJms1KWgyJmw2KnxGPIpPR4xPSo1QS49STZBTTpFWUJBXUIxaUYldUoVhVXlfUGlaR2RfSWRoT1xmS05dQEVVOEFRND1NMDxLLj9NM0NRN0ZSOkdTO0JMND5HMjpBLzk9LDk9Ljk9Ljg8LTc7LTc9MzY9NTY7NDY8Mjo8MTs9Lzw/LDxBKkpTNFZlPmJ4SWqGTG6RUXObVHehV3iiWnuiYXKYW2WLTlyCRVqAQ1yCRVyCRVqAQ1+FSGCGSWGHSmKIS2GHSmCGSV6ER12DSFl7SE5wPkVnNWhhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxjVHJmWHRoXHNnW21jWWphWGxlXXNuaHp3cIF+d5CNhqCdlKilnKunnKikmaOdkZmWh3p7a2NmU09SP0dKN0VINUJFMkJFMkVINUtMPEpIOUdENUQ+MEE5LEE3K0A2KkY0KFM1KnFCOIxQSJ9QS69JR79HScxFSdNCRdZAQtlAQtpCQdtDQtpFQdpFQdxEQdxEQd5ERN5ERt5ERt5ERt5ERN1FRN1FRNpEQ9pGQtdGQdZGPtRFPdRFPdNGPdRFPdVGPtRBOtNDO85FPcFCOa4+M545LZE7Loo8L4Q/MIE/L4A+LoA9LYE7L4Q6LYY6LYc7LoQ6LYM7LYI6LII6LII6LIE5K385LX85LX46L346L346L346L306MX06MX06MX06MXw5MXo6MXw5MXk5MHk5MHg4L3g4L3Y3Lnk6MXk6MXg5MHY6MHY6MHU5L3U5L3Q6L3I3L3E2LnE2LnA1LW80LG4zK24zK200K2oxKG03LWo0KmgyKGo0KmYyJ2o2K31EO41OR49OSJBRSpBUTJBVT45XUIpZUoNbUXtZTXZcT2taSl1VQllYRFleSE9ZQT9LMzpILzdFLjRCKzVBKzhELj1JM0NMN0VOOUJLNj9INTxFMjpBLzg/Lzc+LjU8LDQ6LDU8NDU8NTY7NTY7NDk7MDo8Lzs+LTtAKUdQMVJhOmB2R2mFS2+SUnWdVnmjWXmjW3ifYG6RV2CDSVp9Q1t+RF6BR16BR12ARmCDSWGESmKFS2KFS2GESmCDSV+CSF6BSVd8SUxwQEJmNmhhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxjVGthVW5kWnBmXGxjWmtkXHJtZ4SBfJGQjKejoLWxrsTBvMnGwcnEvsXAusC5sbmyqKScj4iCcmZjVFBRP0ZJOD5FMztEMTpGMjhFMzhFMzhDMjpCMzxCNEBDOENFOkdFOT40KFA6L2U/NoBFQaFQT79YW8pRVspDSdVGStdFRtpGRttFRN1FQt5EQt1EP95DQd5ERN5ERt5ERt5ERtxEQ9xEQ9xEQ9pEQ9lFQddGQdVGQNNGPdJFPNBGPNFHPdRFPdQ/ONVAOdBDOsZDObZBN6U9MJY9L4w9LoY+L4I/L4E+LoA9LYE8LYM7LYQ6LYU7LoI6LII6LII6LII6LIE5K386K385LX44LH46L346L346L346L306MX06MX06MX06MXo6MXo6MXk5MHk5MHg4L3Y3LnY3LnQ4Lnc4L3U5L3U5L3M5LnQ4LnM5LnI4LXI4LXE2LnE2LnA1LW80LG4zK200K2wzKmo0KmgyKGw2LGkzKWYyJ2g0KWUxJmk1KntCOY5NR5JNSJFQSo9UTI1WT4dYToFZT3xcUXNcTmtbTGBXRlZTQlBTQkpRP0BJNjRALDM8KzI7KjA5KDA5KDI7KjU+LTlCMTxFND9INz9INT5HNDpGMjpDMjVALzM+LTE8LDM6MzM5NTQ5NTQ5Mjg5MTk7Ljs+LTtAKkNML09eN11zRGmETXCTU3efWXmjWXehWXGYWWaJT1p9Q1h7QVx/RV2ARl2ARl6BR2CDSWCDSWCDSWCDSWCDSV+CSF6BR12ASlZ7SEpuQEFlN2hhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxiVmpgVmphWGtkWmtnXnVwaoiFgJ+emrCwrsPCwNPS0OLh3+fm5Ofj4OPe2t7W09nOyM68srill5eHenltXV9ZSUtMOkBFMTtELz5KNj1INz1GNTtDNDs+NTo7Mzk4Mzg4MD09M0M8Mk43MWE4NIhISK9dX8VgZMpXWs1RU9NOT9dNS9tLSt5IR+FGRONEQeJCQt9DRN5ERt5ERt1DRd1DRdxCRNxCQttDQtpEQ9hEQNVEP9NGP9JFPNBGPNBHPdRFPdlAOtlAOtFCOshDOrxDOqxANJk7L4w5K4k9L4M+LoE+LYA9LIE8LIM7LIM7LIQ8LYI6LII6LII6LIE5K385LX85LX44Ln05Ln46L346L306MX06MX06MX06MX06MX06MXo6MXk6MXg5MHg5MHc4L3Q4LnM3LXI4LXQ4LnM5LnI4LXE4LXI4LXA3LHA3LHA3LG82LW82LW41LG41LG00K2wzKmsyKWkzKWcxJ2s3LGg0KWUxJmg0KWIwJWY0KXpBOJBNR5JNSJFQSo5VTIhYToFZT3haT3JcTmteTl5XR1JQQUtOPUNKOjlCMTI6KzA4KTE3KzE3LTA2LC81Ky81KTA4KzI6KzQ8LTlENDtGNT1INzxJNztGNTZDMTNALDE+LS44MDA2MjE2MjI3MTc4Mjk7MDo8Ljo/KT9IK0tZNVtxQ2iDTHGTVneeW3ehWXOcVmeNUF6BSVV4QFd6Qlt+Rlt+Rlt+Rl2ASF+CSl+CSl+CSl+CSl6BSV6BSV2ASF2ASlV2SUprQEBhNmhhUWhhUWhhUWliUmliUmpjU2pjU2pjU2liUmliUmliUmliUmliUmliUmliUmliUmtiU2tiU2tiU2tiU2tiU2tiU2tiU2tiU2xjVGxjVGxjVGxjVGxjVGxjVGxjVGxiVnBnXm5nX2xnYXRxaoeEf6GgnLy8us7Qz8/Pz+Dg4PLy8vr4+fv39vfz8PHs6fDi3+jQxt3BtcGrnaKRgX11Yl5cR0tNN0NIMkFJMkFJNEBHNUJEN0FBN0I9OUM5Nz86Njk8NT4/N0I3MUouK2Q2No9RUrNnacZubcBcXMdaV9BWU9dRTtxMS+JISOZDROVCQ99DRt1ERt1ERt1DRd1DRdxCRNxCQtxCQtxEQ9lDQtdDP9NEPtJFPtBGPNBGPNRFPdxDPdtBOdJCOspEO79FOrBBNpw6LYs1Joo8L4U9LoI9LYA9LIE8LIE8LIM8KoQ8LYI6LII6LII6LH86K385LX44LH05Ln05Ln46L346L306MX06MX06MX06MX06MXs7MXk6MXc7MXg5MHU5L3Q4LnM5LnI4LXE3LHI4LXE4LXA3LG44LHA3LG03K282K282K282LW82LW41LG00K2wzKmo0KmkzKWg0KWYyJ2s3LGg0KWMxJmUzKGIwJWUzKHhCOI5NR5JPSY5SSopVTYNYT3paT3FbTWhcTFpURElKOj9DND5ENjlBMjA4Ky83KjY8MjQ3MDU4MTU3MjQ3MDI1LjA2LDA4LTE5LDZBMzpFNT1KOT5LOTxJNzdGMzJBLDE+LSw2Li40MDA1MTE2MDY3MTg6Lzo8Ljo/KzxFKklXNFlvQWeCTXCSVnadXHWeWHCZVWCGSVh7Q1N2Pld6Qlt+Rll8RFl8RFx/R1+CSl+CSl6BSV6BSV6BSV2ASF2ASF1/TFN0SUhoQT9dN2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2pjU2tiU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVWxkV2liWmdkXXZzbpOSjq+vrcTGxdrc2+ru7/P09vb3+fz8/v///////f/7+vz39P3y7Pfh1PLYx+DKtca2n6qgh4iEaWJiRkVILURIL0NHMEZFMUdENUY8M0M2MEY0Mkg6OT49OT4/OkI6N0k3NWNHRpJqasWTkuitqdKLh8d0bsBdWMZTUNVPTt9KTOdGS+lGS99FR99JS9pERtQ7Ptg+QOFHSeBER9Y6PdpAQNpAQNlBQNZCPtRDPtFCPNBBO9FBOd5DPttBOdNAOcpBOb5COLBANZ86LpA4Kow9MIc+L4M+LoE+LYA9LH88K4E9KoE8LH86K385LX85LX44LH44Lnw4LXw4LXw4LXw5MHw5MHw5MHw5MHo6MXo6MXo6MXo6MXk9NXc8NHc7M3U6MnQ5MXE4L3A3LnA3Lm82LW03LW03LWw4LW03LWw4LW03LW03LWkyK202L3A5Mm84MWs0LWcyKmcyKmgzK2UwKGk3LmQyKV0tI2AwJl8vJWIyKHM+NoxPSo9QS4hRSoFSSn1ZTXZfUWZZSVROPkRFNT5FNTpDMjVAMDQ8LzM7MDQ6MDQ6MDY4Mzc4MzY2NDQ2MTM1MDE2Ly82Li42Ky45KzI9LTZDMjpHNjpJNjhHNDRDLjE/Lio0KywyLi0yLi4zLTQ1Lzc5Ljo8Lzo/KzY+JkRSMVdsQ2iCUnOUXXeeX3KbV2uUUlt+RFh5RFR1QFR1QFd4Q1p7Rlt8R1p7Rl5/SmKDTmKDTl5/Slx9SF+AS2CBTF5+TVRzSkZkQDxXNGljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2tiU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVWxkWWdkXW9uaoaFg6SkosHDwtba2+ru7/f7/Pf7/vj8//z9//7+/v///f/++v/8+f/68//w4Pvr1O3fxdfNssC7naSjhIKDY2dqS0xRM0dKL0VDLkdCL0g+Mkk6M0w5NUs8OT86N0JBP01IRV1SUHlqZ6OOi86yrujFv//X0eyzqs2CfMBjXspWVthSU99ITdpBRNZERdVFRdhISNxKS9tFRtU8PtY8PttBQ9k/P9k/P9lBQNdBQNZCPtNCPdJBPNNAOdxBPNtAO9NAOctCOr9DO7FBNqA7MZI4LYw9MIc+L4M+LoE+LYA9LH88K4E8LIE8LH86K385LX85LX44LH05Lnw4LXw4LXw4LXw5MHw5MHw5MHw5MHo6MXs7Mns7Mno7Mnc8NHU8M3U6MnM6MXI5MG44Lm82LW03LW03LWw4LWw4LWw4LWw4LWo4LWw4LWw4LWs2Lm43MG84MW45MWw3L2k0LGcyKmUzKmMxKGQ0Kl8vJV4uJGIyKF4uJGAwJnA+NYFKRYdSTIdYUn5YT3JWS2RSRFFKOj4/LzpBMTZBMDVAMDM+MDQ8MTQ8MTU7MTc6Mzc5NDc3NTc3NTU3MjQ2MTE2Ly82Li83LC45KzE8LjRBMDhFNDlINThHNDRFMjRCMS44Ly41Li4zLS0yKzIzKzQ2Kzg6LTk9LDc/KERRM1dsRWiCVXSVYHedYnCYWWePUFl8RFd4Q1R1QFR1QFZ3Qll6RVl6RVl6RVt8R1+AS1+AS1x9SFt8R15/Sl5/Sl57TVNuS0ZfQTlSNGljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2tiU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW1kVW1kVW5lVm5lVmxmWmVkX3l7eJeZmLK2t83R0uTp7PT5/Pr///v///z///3+//7+/v/+/P//+///+v//9P785/r53e/w0eHlxNLYtLzEn6Cog4eRbGBnRVFYN0RHLERDLkpENExEN0tBOEk+OkM7OVNKS2lhX4F3dpySkL6zr9nOyOrc0/7o3f/z6f/k2/Cpo8NlY7VCRcdESdpSVttVVNFNS8pEQc1DQdRGRddFRthERNlDRNY9P9c+QNhAP9ZAP9ZCQNNCP9NCPdRBOtlAOtlAOtJCOstFPMBEPLJCN6E8MpM5Lo48MIk9MIM+L4E+Ln89LX48LIA9LYA9LX85LX85LX46L305Ln05Lnw4LXs4L3s4L306MX06MXs7Mns7Mns7Mns7Mno7NHg8NHQ7MnE7MXI5MG85L244Lmw4LWw2LGs3LGw4LWo4LWo4LWo4LWo4LWk5LWo4LWo4LW45MW04MG04MG04MG04MGk3LmY0K2MxKGQyKWExJ10tI18wJmM0KlwtI18wJnNEPH1QSoFWUH5ZUXBUSV5KP09DNz88LTQ2KDI7KjA7KzE8LjI9LzQ8MTQ8MTU7MTc6Mzc5NDc5NjY4MzU3MjU3MjI3MDA3LzA4LS45KzA7LTI/LjZDMjdFNDhHNDhHNDlGNTQ+MzM6Mi80LSwyKC8wKDEzKDU3KjY6KTY+J0RRNVltSmuEWneXZnecZmyTWl+HS1d4Q1d1Q1RyQFRyQFZ0Qlh2RFl3RVl3RVp4Rl17SV99S117SV17SV99S158Slp3S1BnSkFXQDNJMmljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW5lVm5lVm5lVm5lVm1nW2prZoOHiKOnqLm+wdDV2OXt7/P7/fX9//v///v///z///z++/3++f79+P/+9///8/j95vT93u732Obyzt3pw87atLbBmaGrhoCHZWZtTE1RNkZIMEhKNUtJOkhEOURAN09HRGpgX4uBgKSambevrMvGwt7b1Orm3frx6P/78f/37f/d1fu2seWPjspjZLBAP8NQS8lUTclQSMNGQMhHQtRNStZLSNBAP9I+PtM/P9U/PtVBP9VBP9NCP9NCPdNCPdY+OdVAOtJDPcxFP8BFPrJBOaI9NZU7Mo48MYk9MIM+L4E+Ln89L348LIA9LYA9LX85LX85LX46L305Ln05Lnw4LXs4L3s4L347Mn47Mnw8M3s7Mns7Mns7Mno7NHg8NHI5MG85L285L205Lmw4LWs3LGo2K2g2K2k3LGk3LGk3LGg4LGg4LGg4LGg4LGg4LG07Mmw3L2o1LWk3Lmo4L2o4L2Y0K2ExJ2U1K2EyKF0uJGEyKGIzKVkqIGEyKHlORYFcVnZXUmlOR1dDOkk8M0A6Ljo7LTg8LjA4KS86KjM7LjQ8LzU9MjU7MTY5MDY5MDc5NDY4MzY4MzQ5MjM4MTM5LzE5LjE5Li45Ky86LDA9LDI/LjVCMTdFNDtINjxJODlDODc/NDI4Li0zJy4wJS8xJDI0JjQ4JzQ8J0VSOF1wUHKLZHuabnecaWaNWFV8RVNzQVRyQFNxP1NxP1RyQFVzQVZ0QlZ0Qld1Q1t5R117SVx6SF58Sl99S1x6SFdySUpeRTxNOy4/LWdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW1kVW5lVm5lVm9mV29mV25nXXFxb4eMj6SprLe/ws3V2OPt7/L8/vT+//j///r///v//P3/+vz99fr88fn57fb46vb/6PP/5PD94e752en00t7oxcrSrba+mZ2jgX2CYlldQkdMNUZLN0ZKOUNHOUFDOGNeWIV9equhn8G3tczCwdfPzebh3fHu6fr38Pz16//x5v/y6f/07P/l3+mopLdoY6ZMQbVQRMFZTsdbUcZRSL9EPcJBPMtEQctAPc5APtBAP9FBQNJDP9FDP9FDP9JDPdM/O9JBPNBFQMlFQL1DPq9AOaA+NZU9M448MYk8MoM9MYE9MH89MX48Ln89L389L346L346L346L305Lnw5MHs4L3s4L3s4L3w8M3w8M3w8M3s7Mno7NHk6M3k6M3c7M243MG04MGw3L2w3L2s2Lmg2LWg2LWg2LWk3Lmg4Lmg4Lmc4Lmc4Lmc4Lmc4Lmg4Lms5Mmg2L2Y0LWc1Lmk3MGg3MGU0LWIxKmMyK2IzK18wKF0xKF0xKFYqIWI2LXtVTHRZUmFOSE4/OEE3Lj02LDs5LTk7Ljk8MTM5LTM7LjU7LzY8MDY8MDc6LzU4LTQ3LjY5MDQ5MjM4MTM5LzM5LzI6LzE5LjE5LC45Ky45Ky86LDA7LTM+LjZDMjpFNTxHNz1FODpCNTU7LzA2KDAyJS8xJDEzJTE1JDI6JUdTO2J1V3ePa3ybcnGVZ1yCUUpwPU9vPlFuPlFuPlFuPlFuPlFuPlNwQFNwQFd0RFt4SF16Sl16Sl98TF98TFp3R1JsRUNVPzZENyg2KWdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW5lVm5lVm9mV3BnWHBnWG5nXWxubXqChZOaoKu1t8TO0Nzm6O33+fT+//X+/fb//Pr/+vv/+fv+8/j67fX26PH04/T96vT96PT85fP53/L22+nszdjXucXEpbGwko+OcmVnT01QO0dLOkZNPUdPQktRR3t7c5+alMW+uNjOzN/T0+fb2/Pr6fz39PDv6vz89P//9v/98//57//z6v/n3v/Xy9iTg7hlU6NKOrRURr1XSbVGO7dAOMhLRcdDPspDP8xCP85DQM5DPs5DPs1EPs1CPdFCPNJDP85EQcVEP7hBPao9OJ47NZU8NI47M4k8MoM9M4E9Mn89MX48MH89MX89L346L346L346L305Lnw5MHs4L3s4L3s4L3w8M3s7Mns7Mno6MXk6M3g5Mnc4MXU5MW43MGw3L2w3L2o4L2k3Lmk3Lmg2LWc3LWc3LWc3LWY3LWY3LWY3LWY3LWY3LWY3LWg3MGg2L2c1Lmc1Lmc2L2g3MGc2L2Y1LmEyKmU2Ll4yKVwwJ2A0K2E1LGk9NHVTSlhHQEU+Njw1Lzk1LDs4Lzg6LzU3LDM2KzY5LjU7Lzc6LzY5LjY5LjU4LTU3LDM2KzI4LDE5LDI4LjE5LDE5LjE5LDE5LDE5LC45Ky45Ky45Ky86LDA7KzM+LjZBMTdCMjxENTpDMjg/LzU7LTQ2KTI0JzEzJTA0JTA3JUhUPmV4XHWNbXSSbGaJX1J3S0JoOUtrPE5rO1BtPVBtPU5rO05rO09sPFFuPlZzQ1p3R116Sl57S198TF98TFZzQ05nQDxKOS86MiQuJmdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2tiU2tiU2xjVGxjVG1kVW1kVW1kVW1kVW1kVW5lVm5lVm9mV3BnWHFoWW9oXmhpa210eoWMlKOssb/IzdPe4uXw8vD8/PL8+/X++fj/9/r/9vz/8vr97Pj55/b35/b26vf36/r36Pz25v314vfs1ufYw9XGr8Cxmp6TfXVuW1pXRlBRQ1NWS1tiWmVsZJWYjbKyqNXOxujd2fPj4/rq6//x9P/3+f/++/79+fn69Pj67/z88P//8///8f/76v/m0fGqlLxvW6lWRK5SQ7VQRLtMQb9KQcJHP8ZFP8lFQMpFQMpFPslEPchDPMlCPNFDP9BFQMxFQcJDPbM9OaY7NZw7NZU8Now8M4c9NIU8NYE9NH88M348MH89MX89MX46L346L346L305Lnw5MHs4L3s4L3s4L3s7Mns7Mnk6M3g5Mnc4MXY3MHY3MHM3L243MGo4L2o4L2o4L2o4L2g4Lmg4Lmg4Lmc3LWY3LWY3LWY3LWQ4LWQ4LWQ4LWY3LWc2L2g3MGk4MWk4MWg3MGk4MWo7M2w9NWc4MGs8NGI2LWE1LG9DOnhMQ3RJQG5NREM5MDU2LjQ1Lzg5MTg7MjQ3LjE0KzI1LDU4LTU4LTU3LDQ2KzQ2KzQ2KzQ2KTM3KS83KC45KTA4Ky45KS45Ky45KTA4KTA4KTE5KjA4KTA4Ky83KjA4KzE5LDM7LjQ8LTlCMTpDMDtCMDpBMTo8LjY4KjI0Ji8zJDI5J0lVP2N1W22EZ2aEYld5VEluRT9kOEhnO0xpO05rPU5rPUxpO0xpO01qPE9sPlVyRFl2SFt4Sl16TF57TVx5S1FuQEdfOzZCNCs0LyMpJWdkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2dkU2ljU2pjU2pjU2piVWxiVmxiVm1jV21kVW1kVW1kVWxlVW1mVm5nV29nWm5oXG9oXm1qZWtvcm10eoOKkKWus8PM0dXf4ebu8fT8/vT9+vf9+fn+9/r/9Pz/8vz/8fz/7v3+8Pv47/768f/57//67f/56f/y3+/gy93Ot8Gym6KXgXx1YmJfTlhaTF1jV213bnyGfaasor7AtdrVz+7k4vzu7v/09P/09/709f/5+fv6+Pv9+Pz/+vj/9fT88ff98f//8f/56P/04//Mu71/cJtRRKlTRrVTSLJDOsBKQMRIQMdHPslGPshFPcdEPMZDO8ZDO81HPsxHPsdHPrxDO60+NZ86Mpc6M5E+Noo9NYY9NIM9NYE9NIA8M387MIE7MYE7MX46L346L346MX05MHw5MHs4L3s4L3s4L3o6MXo6MXg5Mnc4MXY3MHU2L3U2L3E2Lm04MGs5MGo4L2o4L2k5L2k5L2k5L2g4Lmc3LWY3LWc3LWY3LWY3LWY3LWY3LWY3LWY1Lmo4MW07NGs6M2o5Mmo6MG0+NG9DOGxANW9EO2Q8MmM9MnpWSoZkWnlXTWJMQT46MTM4MTQ5Mjc8NTQ6MC81KzI1LDk8MzM2KzI1KjI0KTAzKDEzKDI1KjQ2KzQ3LC42KSw3KS83Ki04Ki83Ki83Ki83Ki83KjE5LDA4KzA4LS83LC83LC83LDA4LTA4Kzc/MDlCMTxFND1ENDtBMzg8LjI2Jy00JDI7KkpWQmNyW2h8YV12WE9tS0ZmQUFhOkhkO0toPE5rP05rP0toPEpnOUxpPU5rPVRxRVd0SFp3S1t4TF16Tlp2TU5qQUNbOzI+NCowMCEnJ2hlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpkVmpkVmpkWGxkWWxjWm1lWm1lWG1mVmdgTmplUm5rWG9sXWhlXGZlYXNxcoGChoqPk5aeoauztsPIy9jd4Oru7/b3+fn7+vz+/f7+/P//+v3+9vr98vn88fr98vv+8/n68vr68vn57fz66/785/n33unlytXUtrq5m5iYfHF0WV9kTWJrWHJ9bISQgpGbkLS5ssvMx+Pi3vLu6/fz8vv39v35+Pz49//+/P7+/P7+/P3/+v3/+v3/+v3/+v3/+vr89///+v/79v/q5dinoKNgWJtEPbVORb9NQ8JGPMREOcpFPM5JQM5LQctIQMdHPMZHOMNIOL1KOLNIOKZFNZpCNJFCNYtDNYZCNYRCNoJANII+M4I8MoQ6MYY5MYY5MX85MX46MXw5MXs4MHo3L3o3L3c3LnY2LXc3Lnc3Lnc4L3c4L3Y3LnU2LXE1K24zK2w3L2k4MWk4MWg3MGg3MGc2L2c2L2c2L2Y1Lmc2L2k3MGk4MWg3MGc2L2U0LWUzLGgzLWo1L204MGs5MGo6MGk7Lmk9MGtBM2dCMmpJOmRIOnZfT35rXIp4aox/b1JKPTc5LjQ6MDQ6MDM5LzM5LzM5LzI4LjI4LjE3LTE3LTM2LTA2LDI1LC81KzE0Ky81Ky80LS41LS80LS41LS80LS80LS80LS80LTA1Li80LS80LS4zLC4zLC80LS80LS82LjE7MjM9MjZANThCNzlENjdCNDVAMDM+LTQ/LkRRPVdlTltrUVBiSEVYPEBUOEJXNkljPktlPktmPUtmPUplPEplOkxnPk9qP1VwR1l0S1x2T113UF13UldxTkhiPztPNiYxKyYrLiQpLGhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVmlkUWpoU21qV2prW2dnX2xsbH5/hJCTmqivtbjCxNHW2eLn6vLz9fv8/v/+///+//79+//++v//+v7/+fv89Pj78vb88vf98/f68fj67/j67ff66fn75fL12t/iw8zQr7S4l5GWdmtxVVlhSV9rVXSBb4yYip2nnL/BvNPT0efn5fPz8ff39fv7+fz8+vv7+f7+/P7+/P7+/P7+/P7+/P7+/P7+/Pv//vX///X///7////7+v/t6vC/usJ+dZ9LQa9NQLlLPsJMQMVLPsNFObw9NL4/NsNFOcRGN8NKN71MOrNKN6ZGNplDMpFDNo1FN4VDN4JCOIFBN4E+NYI8NIM6M4Y5MYQ5M345Mn06Mno6MXo6MXk5MHg4L3Y3LnY3LnU2LXY3LnQ4LnQ4LnQ4LnI2LG81Km00K2w3L2k4MWo4MWg3MGk3MGg3MGc2L2c2L2UzLGUzLGc1Lmg2L2o4MWo4MWo4MWs5Mms2MGw3MWs5MGs7MWs7L2o+MWpAMGlEMmdINmtQPWdSQXVmU4F1ZYyFc4aDcktMPDY5LjM5LzM5LzM5LzI4LjI4LjI4LjE3LTE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky80Li80Li80Li80Li80Li80Li80Li80LjA1Ly80Li4zLS4zLS4zLS4zLS80Li82Ly44MC86MjE9MzRANjZCNjZCNjZCNDVCMTZDMUNQPlBdSVJgSUlXQEFPNkJQN0VVOkpiQEpkP0tlQEtlPkljPEhjOklkO0plPFNuRVhyS1x2UV13VFt0VFRtT0NcPjZJNSYxLScsMCQpLWhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVm1oVWtpVG1qV2prW2trY3d3d5GSl6essr/GzNLc3uzx9Pf8//7///7////+///+//79+//++v//+v3++Pr78/X47/H36/H36/T37PX56/b46vX45fX34e7u1Nvbv8nKq7CxkpOWeXV5YGtwWnR7aYiQgZ+nnK61rc3Pyt7e3O/v7fj49vv7+f7+/P7+/P39+/7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//vv///v////////7+f/69P/37f3RxtiekJRMPaVSQqlMO6dAMbdHO89ZTc9VSrxANMREN8ZIOsNLPblJO6pCN50/M5dAN5NFO4lAOYRBOYFBOH8/Nn4+NX09NH88NH09NHo7NHg8NHc7M3c7M3U6MnQ5MXQ5MXQ5MXI5MHI5MHI5MHI5MG85L244Lmw2LGs1K2w3L2o4MWw3MWo4MWs2MGk3MGk3MGg2L2c1Lmc1LmY1Lmc2L2g3MGk4MWs6M2s6M2w7NGo7M2k6MGg8MWs/MmpDNGlEMmZFMmZJN2xWQWpZR3VqVoZ/bZGOe4B/bUVGNjU4LTI4LjI4LjI4LjE3LTE3LTE3LTA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky80Li80Li80Li80Li80Li80Li80Li80Li80Li80Li4zLS0yLC0yLC4zLS80Li41Lis1LSs2Li05Ly87MTI+MjRANDZCNDdEMzhFMz9MOkVSPkNROjtJMjhGLT5MM0RUOUpfQEpiQExkQktjP0lhPUdgOUZfOEdgOVJrRFhwTF11U152VlpxVFBnSz1UOC5BLiYxLScsMCUqLmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVm5pVmxqVWxrV2xtXXBxaYCCgZ6hprm+xMTL0dvl5/X6/fv///z9//z9//78/fz7+f/+/P//+//++fv89PX27u7x5unv4+ft3+3x4vD05fH04/H03/Lx3Orq0NjYvMfHq7KxlaGhiZGTfZCTgJyekaqtora7tMDFv9zc2unp5/b29Pv7+f39+////f///f39+/7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/vv7/f/+///+//fy7/zz7P/88//77f/05OzDsbmBcJVQQKJPP7hYSrdNP7VFOcBHPMFBNshFO8VJP71HPa9AOaE8NJo9NpZBPI0/O4dAPIFAOn1AO3o/OXlAOXg/OHg/OHY9NHY9NHY9NHU8M3M9M3I8MnI8MnE7MW87MG87MG87MG46L2s5Lmo4LWo4LWk3Lm04Mm43Mm02MWw3MWw3MWs2MGk3MGk3MGw6M2o5Mmg3MGY3L2Y3L2Y3L2g5MWY6MWo/NmY+NGU9MWY+MmhDM2lFNWZHM2NHMmNKNmhWQGlcSXNrVoWCb4+OenBxXzk9LDQ3LDI4LjE3LTE3LTE3LTA2LDA2LDA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS0yLC0yLC0yLC0yLC4zLS00LSo0LCk0LCo2LCs3LS46LjE9MTRAMjVBMzZDMjpHNTxJNzhFMTI/KzJAKThGLz5ONERYPEVdPUtgQUpiQEtgP0dfO0heOkZeOlNpRVhwTmB1Vl51WFpuU0xjSTlNNCk6KCUuKyUqLiQpLWhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWm1mVmxnVGtpVG5tWW9wYHR1bYWHhqSnrL/Eys7V2+bw8vv///v///v8/v3+///+//79+////f//+/79+Pf48O/w6Ofq3+Dm2t7l1efr2urv2+3w2+zw2e7u1ujo0NrYv8zKscK9p7e1oLGunba0p8G+tcnIw9LTztnZ1+jo5vLy8Pr6+Pz8+v39+////f///fz8+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P/+/P/8///8///7+vz79/3/+f7/+P7/9P//7f/+7Pjfy8Wcip1iUJZKOqVMPLRQQLxMPr9AN8ZDO8VGP79EPbE+O6Y6N546OJk+O5E9O4o/PIRAPX1APXhBPHRCO3JDO3JDO3E/NnM+NnM+NnI9NXI9NXI9NXA+NW89NG4+NG09M2w8Mms7MWo7MWk6MGk6MGo6MG43MnA2MnA2Mm02MW02MWw3MWk3MGk3MGw7NGs6M2g5MWU5MGU5MGU5MGU6MWQ8MmZCNmNBNWNDNGRENWRHNWRJNmJJM19JMl5MNmVWP2piTXJtV4SDb4SHcltgTDM6KDI4LDI4LjE3LTE3LTE3LTA2LDA2LDA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky4zLS4zLS4zLS4zLS4zLS4zLS4zLS4zLS0yLC0yLCwxKywxKywxKywxKy0yLCwzLCw2Lis1LSo0Kyo0Kys1LC44LTA7LTI9LzI9LTVALzZBMDVBLTE9KTE9KTVBLThGLz1PNUBUOEZZPUhcQEpdP0lePUtePktgP1RnR1twUWN2WmF1WllrU0pdRzZHNCY0JSQtKiQpLCInKmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpjWWtkWmxjXG1kW21lWmxmVmpnVGtqVWxuWW9yYXN2bYGFhJ+kqLi/x9bf5O33+fv///v///v8//7////+//79+///+///+vz89PP16uvt4uPn2d3j1dzj0eTp0+fs1ent1urs1Ovr0+jmz9/axNPOuNPOuszGtsvDuNDJwdfSzuDb2Orm5fDv7fPy8Pn59/39+/39+/39+////f7+/Pz8+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P/9/P/7/P/4+f/+/f7//fn//fT/+O//9ff/9vD35///7f/u282nlKRrWKJbR6pXRa1MO7lEOsBEPMBFPrxFP7RBPqo9OqI6OZo7OZU9PI0/PYU/PX1AO3dCPHJDO29EO29EO3A/OHE/NnE/NnE/NnE/NnA+NW8/NW8/NW9ANm4/NW0+NGs8Mmg8MWg8MWg8MWw8Mm84M3E2MnA2MnA2Mm02MWw3MWo4MWk4MWg3MGc4MGU5MGU6MWQ8MmU/NGZANWRCNl5CNGFHOGNMOmRNO2NNOGBLNl1LM11NNF1ROWJYP21oUnNzW4CDbnZ7ZUZPOjQ9KjM5LTI4LjI4LjI4LjE3LTE3LTE3LTA2LDE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLCwxKyswKiswKiswKiswKiwxKywzLC41Liw2Lio0Kyo0Kyo0Kys1LC03LC45Ky04KjA7KzQ/LzVALzQ/LjM/KzM+LTNALDdGLzlLM0BPOEJUOkdXPEhbP01dQk1gRFVlSlxvU2R0WmByWlhnUkdYRTRCMSQyJSQtKiQpLCInKmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpkVmpkVmpjWWtkWmxjXG1kW2xmWmxmVmxpVmxrVmttWGtuXWxyaHl/fZWdoK63vtLb4Orz+Pv///n+//n6/v7////+//r59///+/79+Pn58fHz6Onr3uPn2N/m1uDo0+Tp0uft0+js0+fp0ejo0OflzuDbx9fQvtrTw9nRxt7Uy+bd2O7k4/Pp6vrx9P/5+/r59/7+/P///f39+/39+////f///fz8+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P/9/P/5+P/6+f/+/fz//ff//u7/+fH///L//fX/+vP56//97f/66PTOu6t3Yo9ROqpcSLJOPrhKPblJPrhJQLRHQK9EPqU9Opw6N5Y9OY8+Oog/OYBBOnhBOnREOnBGOnBFPHA/OHE/OHE/OHE/OHE/OHE/OHA/OHA/OHFCOnBBOW4/N2w9NWk9NGo+NWo+NW49Nm84M3I3M3A2MnA2Mm43Mmw3MWo4MWk4MWQ4L2Q5MGM7MWQ+M2RANGNBNWNBNV9DNVpFNF9OPGdWQmhXQ2NTPF5POFtPNVxSN11WPF1ZPm5sVXR2XnyBa2NtVTI+KDZCLjM7LjM5LzM5LzM5LzI4LjI4LjI4LjE3LTE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLCwxKywxKyswKiovKSovKSswKiwxKysyKy00LSs1LSo0LCo0LCs1LCs1LCw2Ky03LCw2Ky86LDI9LzZBMTdCMjdCMTVAMDQ/LjI/LTRDLjpHMz1MNUFPOERUOkpYP0xcQlRiSVxrVGNxWl5tWFViUERSQTI+MCMvJSYvLCYsLCQqKmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmpkVmpkVmpjWWtkWmxjXG1kW2xmWmxmVm9sWW1sV2psV2drWmZsYnJ7eI6YmqixuMrT2OPs8fj9//f8//r7//7////+//r59f//+v399fj47vDy5enr3eXp2OPq2OXt1ubs0unt0urt0ujozujmz+jjz+HayNjQw9jOxN3SzOrf2/jt6//09v/1+f/1+//5/P78/f///f///f7+/P7+/P///f///f39+/7+/P7+/P7+/P7+/P7+/P7+/P7+/P/++v/9+//9+/38+vn9/Pj///X///P//+39+vP/+/v/+v//9P/25v/z3//jzdetlalvWahXRK5RQKxPPq9PQbFPQq1LQKRDPJk8NZU+N48/Nog/OIFBN3tCN3VENnFFOHFFOHA/OHE/OHM+OHE/OHE/OHE/OHE/OHA/OHNCO3FCOm9AOG0+Nmw9NWo+NW0+Nm8+N284M3E3M284M204Mm04Mmk4MWg5MWY6MWY7MmQ+M2RANGJCNWBDNV1BM1xAMldCMVRHNFtTPmZeR2leSGJYP1pTOVpTN1xXOlpWO1hXO2ttVXN3XnV9ZlVhSSYyHDhEMDM7LjQ6MDQ6MDM5LzM5LzM5LzI4LjI4LjE3LTE3LTE3LTA2LDA2LC81Ky81Ky81Ky0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLCwxKyswKiswKiovKSovKSswKiswKiwxKysyKykzKyo0LCs1LSs1LCw2LS03Li03LCw2Ky44LTI8MTZBMzlENjlENDdCNDZBMTA7KzI/LTVCMDlGMjxJNUBON0ZUPUpYP1JgSVtoVGFuWlxpV1FeTUJOQC87LyIsIysxLSguLCYsLGhlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2tkWmxlW21kXW5lXG1nW21nV3FuW2ttV2tuWWtyYGpyZ3B5doeRk5+qsLvEydDZ3urv8/b7/vz9//7////+//79+f//+v7+9vr68Pb46/T26PD04+rx3+fv2PD22u3y1Ovu0ezs0ujm0eHcyd3VyN7UyuHUzuja2fLk5Prr7v7y9P/3+//5///8///9/v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7/+v/++v/++v7+/P3//vv///r///r///v///7//////f/79f/78f/87P/75f/z2//q0bqCaaZiS5dPOZ9UP6haRqNSQZ1KOqBNP448MIs9MIY+Mn89L3g9L3Q/L3NCM3RENnI9NXI9N3Q9OHM+OHVAOnVAOnQ/OXE/OHNBOnFAOXFAOXFAOXA/OG4/N28+N28+N2s5Mm04Mmw6M2w7NGw7NGg8M2c8M2M9MmM/M14+MWRHOWNHOVQ9LU45KE04J0AxHldRO1BON0tJME9LMl1ZPmllSmVhRFZVN1hYPF1gQ29zWnqAZmRsVT1JMS05IzI+KjQ8LzU7MTQ6MDQ6MDQ6MDM5LzM5LzM5LzM5LzM5LzM5LzI4LjE3LTE3LTE3LTA2LDE2MDE2MDA1LzA1Ly80Li80Li80Li80LiwxKywxKywxKywxKywxKywxKyswKiswKi41Li00LS00LSwzLC00LS00LC41LS41LSsyKi00LDA3LzU9MjlBNj1FOD9HPD9KPDdCMjVALzM+LTE9KTI+KjlFL0JOOElVP09bR1ZiTl1oV1lkVExXSTxGOy85LikzKikvKyguKictK2hlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2tkWmxlW21kXW5lXG1nW2toV29uWmpsVmtuWWtyYGp0aXF8eImUlqOutL7HzNLb4Ovw9Pf8//3+//7////+/P79+f//+v7+9Pv77/f56/T35vD14ery3ejt1urv0ebry+TnyubmzOPhzN/Zyd7Uyt/UzufZ2O3f3/bn6vvv8//0+P/3+//6/v/8///+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//Pv/+vv/+v3//P3+//79///8///8///7///8///8///7+f/89f/+8f//7f/75f/y2f/r0eCxl6d1XJFbQ5ZaQppZQ5pWQ5lSQI5HNYtGNohFNINEM3xDMndCMHNAL28+L3VAOHM+OHU+OXVAOnQ/OW89NnA+N3NBOnE/OHA/OHA/OG4/N28+N20+Nm49Nm0+Nms8NGw9NW0+Nms/Nmo/NmdBNmVBNWJCNWRHOVtBMl5HN15JOE49K0Y3JEc4JT42IUxMNEdLMkRHLEREKk1NMVxbP2JhQ2BhQllZPWRnSnN3XnN5X1hgSTpELC87JTdDLzY+MTY8MjY8MjY8MjU7MTU7MTU7MTU7MTU7MTU7MTU7MTQ6MDQ6MDM5LzM5LzM5LzI3MTI3MTI3MTE2MDE2MDE2MDA1LzA1Ly4zLS4zLS0yLC0yLCwxKywxKyswKiswKioxKioxKikwKSkwKSkwKSoxKisyKiwzKy41LS00LC41LTA3LzQ7MzlBNj9GPkJKPztGODpFNTdCMTQ/LjM/KzZCLjxIMkBMNkxYRFNfS1lkVFdiUkxWSz1HPDE7Mis1LCsyKyowLCkvK2hlVmhlVmhlVmhlVmhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2xjWm1kW21kXW5lXG1nW2toV21sWGltVmpvWWt0YWl1aXF9eYqYmaWyuL/K0NTd4u3y9vf8//z9//3//v/+/P79+P//9/398/r77ff66fT35O/03ufv2OXr0eLnyd7hwt3dwd7ext7byN3Xy+DVz+TZ1+7i4vPn6/ru8v/0+P/3+//5/P/6/f/9/f/+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//Pj//Pj//Pv//v7+/v/8///6///5///4///5///6///6+v/9+P//9v//8/3/7//65v/03P/44P/s0+O/p6yCaodZQoVRO5JbRpddSY1TP39GMnU+KXI+KXNAK3REMHZFNHE/NG48M3E8NHRCOXNBOG8/NXFBN3hIPm4+NG0+NG0+NGs/NGw9M2o+M2w9M2o+M2c/NWdBNmdBNmdDN2VDN2NDNmBDNV5ENWJLO1VCMVpJN2BTQFJHM0M7JkU9KEZBK0FFLEJILkFFKjxAJT9CJU5OMl9gQWlqS2FhRW5xVHZ6YWdtU0pPOTQ8JTQ9KD1GMzg+Mjg+NDg+NDg+NDc9Mzc9Mzc9MzY8Mjg+NDg+NDc9Mzc9Mzc9MzY8MjY8MjY8MjU6NDQ5MzQ5MzQ5MzM4MjM4MjM4MjI3MTA1LzA1Ly80Li4zLS0yLCwxKyswKiswKikuKCkuKCkuKCkuKCkuKCovKSswKiwxKzE2MC80LiwxKywxKy80LjY7ND1CPEFIQEBLPT5LOjxJNzhFMzRBLTI/KzNBKjVDLERRPUtYRFFeTVFeTUhUSDxIPDI+NC44Ly00LS00LSwzLGdkVWdkVWhlVmhlVmhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2xjWm1kW21kXW1mXG1nW2ppV2ttWGltVmpvWWpzYGh0aG18d4iYmKazub/K0NPc4+vw9vb7//z9//3//v///f/++f7+9v398fr77ff65/T34u7z3OXt1eLoztvgwNfau9bWvNnXwt3Xx97XzeXb2ezg4Pjs8Pvw9v/1+//5/v/6/f/7+//7+//9/P/+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//Pj//vj//vv//v7+/v/8/v/6///5///4/v/6/f/5/P/5+f/9+v//+P//+Pv/9fz+8P//7f/86f/x3//w3f/v2vHSvbSQentSPnRKNHVIM3ZJNHpNOH1QO3lMN25BLmU3J3tNQHNEOnFCOHNEOm9DOGc7MGQ4LWc9MWk/M2k/M2k/M2c/M2Y+MmY+MmY+MmU/MmJANGJCNWBDNV9DNV9DNVtENFpFNFdEM1hJNk9CL1xUP29pU2NeSE1LNElHMElLMz5EKj9ILUBGKjxCJjxBI0ZJLFhZOmRlRm1tUXh4XHR2XltfRkBDLjY7JThAKzxDMTk/Mzk/NTk/NTg+NDg+NDc9Mzc9Mzc9Mzk/NTg+NDg+NDg+NDg+NDg+NDg+NDg+NDc8Njc8Njc8NjY7NTY7NTY7NTU6NDU6NDM4MjM4MjE2MDA1Ly80Li0yLCwxKywxKyswKiswKiovKSovKSswKiwxKy0yLC0yLDA1Ly4zLSswKiswKi0yLjI3MTg9OTtCOkBLPUBNO0BNOz1KNjhFMTNALDE/KDA+JzxJNUJPO0hVQ0lWRURQQjtHOzI+NC46MCw2Li41Li00LWdkVWdkVWdkVWhlVmhlVmlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2xkV2xjWm1kW21kXW1mXG1nW2ppV2ttWGluV2lxWmdzX2RyZWp5dIWVlaOyt73IztLb4urv9fT5/fv8//3//v///f//+v//+P//8/7/8fv+6/f65fD13ubu1uLozNncv9XVudLQudTRvtrUyODZ0erg3/Tp7f7z+f/3/P/7///9///+///+/P/++v/++v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P3//vr///r///v///7+/v/9/v/8/P/7/P/7+v/6+P/59//69//9+P//+///+/3/+v3++fn07v/+9v/99P/88//77v/35/vm1enSwM+0obaahZR1YXdWQ2pJNmxJNnJNO3VQPm1GN2lCM2dCMmpFNW5JOW5KOm9LO29LO2VBMWNCMWNCMWNCMWNCMWNCMWJDMWBDM11GNlxHNlxHNlpHNlpHNldINVRHNFJHM1BIM05IMmZkTX5+ZnJyWlZYQEpMNEdNMzxFKjxGKz9IK0FHK0FGKERHKk1OL1RVNnh3W3t6Xm5uVlVVPUNCLj9BLD5BLjo+LTs+Mzk/NTk/NTg+NDg+NDc9Mzc9Mzc9Mzg+NDg+NDg+NDg+NDg+NDg+NDg+NDg+NDk+ODk+ODk+ODg9Nzg9Nzg9Nzc8Njc8NjY7NTU6NDQ5MzM4MjI3MTA1Ly80Li80Li0yLi0yLiwxLSswLCswLCwxLS0yLi0yLiwxLSwxLSwxLSwxLS4yMTA1MTM3NjQ7NDtHOT1MOUBPPEBPOjxLNjdGLzRDLDJBKjZFLjpJNEBPPEJQPz9NPjhGNzE/Mi05LSw2LS00LCwzK2ZjVGZjVGdkVWhlVmhlVmlmV2pnWGpnWGlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2xkV2xkV2xjWm1kW21kXW1mXG1nW2ppV2ttWGluV2lxWmdzX2JwY2d4coKUlKOyt8DL0dTd5Ovw9vX6/vv8//3//v///f//+v//+P//9P//8///7/r96PL34Ofw1eLozNfavdHRtc3LtM7LutbPxd7X0ezi4/fu8//2/v/6///9///+/////f7/+v7/+f7/+v7/+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/v3+//3+//3+//3//v3//P7/+v7/+f//9/398/399f79+P79+f/+/P7+/v/9///+//75///8///7/Pv28//48v/99P/+8f/97f/66f/y4Pfk0+fSv9K7qbmfjp+Ec49yYnxdS31eTHRVQ2FEMlc6KFk8Kls+LFg9KmBFMmBFMmBFMl9GMmBHM2BHM2BHM11IM1xLN1xNOlxNOllMOVhNOVVNOFJMNlFMNk5MNVFROWlrU3yAZ21xWFNZP0ZMMj5HLDxGKzxGKz9IK0RKLkVKLERHKkhJKkxNLnl4XHRzV2ZkTVRSO0xJNktKNkZFMzw9LTw/NDk/NTk/NTk/NTg+NDg+NDg+NDg+NDc9Mzc9Mzg+NDg+NDg+NDg+NDk/NTk/NTo/OTo/OTo/OTo/OTk+ODk+ODk+ODg9Nzg9Nzg9Nzc8NjY7NTU6NDQ5MzM4MjM4Mi80MC4zLy0yLiwxLSswLCswLCswLCswLCswLCwxLS0xMC4yMS8zMi8zMi8zMi00LTM/MTdGMz1MN0BPOj9ONzxLNDlIMThHMDVELThHMDxLNj5NOjxKOTdFNjE/Mi05LSs1LC00LCwzK2ZjVGZjVGdkVWhlVmhlVmlmV2pnWGpnWGlmV2lmV2lmV2lmV2lmV2lmV2lmV2lmV2xkV2xkV2xjWm1kW21kXW1mXG1nW2ppV2psV2htVmhyWmZzX2NxZGh5c4WXl6W3u8fS2Nrj6vD1+/j9//z9//3//v///f/++f//9f//8v//8Pz/7Pj75u/03eLr0N3jx9XVuc7Ms8nEsMrEtNDJv9rSz+ng4/bt8v/3///6///9///+/////f3/+vz/+Pz/+P3/+v7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/v/8///8//79//3//vr/+vj/+fj/9fj/8/j/8/j/9fz/+P3/+v/9/v/8///8///7//33///6///8///9///+//79+/v78/r47P//8f//7///7f/+7f/97f/25//u4P3q2/rj0f/m0OPKtKWPeHReR2VPOGJMNVxIMF5KMlxKMlxKMl1LM11LM15MNF5MNFxNNllOOFdPOldPOlZQOlVPOVNOOFBON05ONk1PN1BUO2BmTGZvVFVeQ0VPNEFLMDxGKz9JLj9JLkNML0hOMkhNL0ZJLE9QMVlYOnFtUmpmS2FcRltWQFlUQVRRPk1KOUJDMz1ANTtBNztBNztBNzpANjpANjpANjk/NTg+NDg+NDg+NDk/NTk/NTpANjpANjpANjtAOjtAOjtAOjo/OTo/OTk+ODk+ODk+ODo/OTo/OTk+ODk+ODg9Nzg9Nzc8Njc8NjQ5NTI3MzE2Mi80MC0yLiwxLSsvLisvLiwwLywwLy0xMC4yMS4yMy4yMy0xMisxLSs5Ki9ALTZIMjtNNz1PNzxONDpMMjpMMjVHLzdJMTpMNjxNOjpLOTZHNzBAMy07Liw2LS00LCwzK2NkUmNkUmRlU2VmVGdlVmhmV2lnWGlnWGhmV2lmV2lmV2lmV2lmV2lmV2lmV2tlV2tlV2tlV2xkWWxlW21kXW1mXGtnW2ppV2lrVmhtV2hyWmd0YGRxZ2p7dYmbnaq8wM3Y3uDn7fT5//r///v///3//P7/+v7+9vr67vr77fr76fj65fP24eru19/jytncwdPRuMzHscW+rMa+sczDvNbOy+bd4PTq8v73///6///+//////7+/v3/+vz/+vz/+v3//P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P7+/P/+/P/+/P/+/P/9/v/8///8///9//3//vv//Pj/+ff/9/f/9fj/9vn/9vz/+P//+//+/f/8///7///6///6///7///8///+//79//v9/Pz++/7/+vn68vr88f377/767v/57P/77P/97//97P/w2//74uzcw56OdWBQN1JCKVhIL1hILltNM1tNM1pONFpONFtPNVtPNVxQNltROFVPN1RPOVRPOVFPOFBON05ONktNNUlNNEpONUxSOFNcQVBZPEBJLDtGKEFMLj9KLERNMEVOMUpRMk1SNEpNMExMMFlZPWtqTmhkSWJeRV5aQV9aRGBbR1pVQVFPOktKOEFCNEBCNUBCNT5BNj5BNj5BNj1ANz1ANzk/NTk/NTk/NTpANjpANjpCNzpCNzpCNztAOTtAOTtAOjo/ODo/OTk+Nzk+ODk+NztAOjtAOTtAOjtAOTo/OTo/ODo/OTo/OTg/ODc9OTQ7NDM4MjE2MC80Li4zLy4zLy4yMS4yMSwyLiwyLisyKysyKiw0KSk2JSQ2Hik9ITJGKzhMMTtPNjtNNTtNNTtNNThKMjlLMztNNTxONjxOODdINTFCMC48LS03LC41LS00LF1lTl5mT19nUGBoUWRpVWZpVmdqV2lqWGZnVWhnVWhlVmhlVmpkVmtlV2tlWWxmWGxmWGtoWW1nW2tnXG1mXmpmW2llWWdlVmdoVmZrVWVuWWJvXWRxaHODgJaorLnIz9Lb4uLp7/L3+/f8//n9/Pz++fz/9vz+8ff46vn66vj35fLx3e7t2evq1uDfytfSvtfPvMvArr20pb2zqcK3sczCwdvS1+rg6Prz+/z2//77///+//79//z9//z+/fz+/f7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P/+/P/+/P79+f79+f/8+f/9+v/++//++//+///9/v/8/f/9/v////7//f3//Pv9+P//+/z99//9+P/++v/9+P/69v/39P/5+f/6///8///9//////////3//P3//vz+/f7////////+/P/++f/+8//+7v/96v/95vr03P/64Ofgxo+IbFVOMldOMVRLLlNKK1dOMVdOMVVOMVVOMVRPMlRPMlRONFNPNFFNMlJONVFPNlBQNk1PN0tPNkhNNkdMNUpQNkZPNEFKLT1GJz5IJkRLKkZNK0VMKlBWNFBUM0tOL0hLLFRUOGJiRmNjSVpaQFtZQFxaQV1bQl1bQltZQFhWPVVTOlNROEhGMUdEMURBMEE/MEA+MT4+Mj8/NT5ANTs+NTk/NTk/NTlBNjlBNDhDNThDNThDNTpCNzlBNjlAODhANTg/NzlBNjlAODpCNzpBOTpCNzlAODpCNztCOjxEOT1EPD5FPThCOjhCOjdBODhANTY+MTQ8LzM5LzI3MS40MC81MS03Ly05LS47KTBAJjZHJzdNJztWKzpXKztVMDtUNDtSOD1QOj5PPD5QOjpMNkBSOEVXPUZZPURYPUBUOzVIMis8KSw2KywzKysyKlpnTVtoTlxoUF1pUWJqU2NrVGdsWGhrWGdoVmdoVmlmV2lmV2tlV2xmWG1lWm1nWW1nWWtoWWtnW2tnXGpmXWpmW2hmWmVmVmhpV2dsVmZvXGVyYWp3bnqKiZyrsrrI0dDZ4OHp7PL3+/j+/vn++vr/+Pv+8/n97/j56/f45vX04u3s2Onm0+Xiz9zXxNLLucq/rcG0pLmtobyvpsG2ssvBwNvQ1ubf5vvz/v33//77///+//79//z9//z9//z9//7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P/+/P/+/P/9+v/8+f/8+f/9+v/9+f/++v/+/f/9/P/8/f/9/v/+///+///9/v37/P/+/f/++//8+v/48/jt5/Ll3fbo3/vw6v/6/f/8///9/v///f//+/3//P3//vz9//3+//3+///9///+/P/+9f//7v/+6P//5Pr23f374uTgx4uHbFJNMFNOMFFLK1FLK1VPL1VPL1RPMVRPMVNPMlNPMlFQNFFQNFFNMlBPM1BONU5RNk1PN0pQNkhNNkVNNUhRNkVOMUJLLj9JJ0JJKEZNK0pQLEtRLU5SL1BUMVZaN15iQV9iQ1lcP1RXPFVVPVZWPldVPlhWPVlXPlhWPVhXO1dWOlhUOVFLM09JM0xHNElEMURBMkJAM0E/Mz5ANTw9NTk/NTk/NTlBNjdCNDhDNTdEMzdEMzpCNzlBNjlBNjhANThANTlBNjlBNjpCNzpCNzpCNzpCNzpCNztDODxEOT1FOjxGOz1HPzxIPjxGOztGNjxENTpCMzk/Mzg9Njc+NzQ+NjM9NDA+LTNDKTlNKkJZL0dhMU9wO0xuO0xpPUZhPkJZPzxSPTtMOjpLOD1POURWPEteQk1gQkxgREhcQDpRNzFELis1KisyKikwKFpnTVtoTlxoUF5qUmJqU2RsVWdsWGlsWWlqWGlqWGtoWWtoWWxmWG1nWW5mW25oWm1nWWtoWWtnW2pmW2pmXWllWmhmWmZnV2hpV2VqVGRtWmd0Y298c3+Pjp2ss7bEzc3W3d7m6fH2+vj+/vr+/fn++Pj78vT46vP05vDx3+rp1+HgzNzZxtfUwdDLuMfArr+zo72woLywpMO2rsvAvNXLyuPY3uvk6/z0//33//77///+//79//z9//z9//3//v7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P/+/P/+/P/9+v/9+v/8+f/8+f/8+P/8+P/9/P/8+//7/P/8/f/+///+///9/v78/f/+/f/++//9+/zz7urf2eLVzevd1Pfs5v/6/f/8///9/v///f//+/3//P3//vz9//3+//3+///+/////f/+9f/+7f/95//+4/v33v784+PfxomFalBLLlFMLlFLK1FLK1ROLlVPL1RPMVVQMlRQM1NPMlFQNFBPM1FNMk9OMlBONU1QNU1PN0pQNklON0ZONkhRNkZPMkNML0NNK0ZNLEpRL09VMVNZNVFZMldfOGpwSnl/W3F2VlleQEtPNE1QNVFROVFROVJQOVNROFRSOVVUOFlVOlpWO1hSOlZQOlJNOk5JNkhFNkRCNUNBNT9BNjw9NTk/NTpANjlBNjdCNDdCNDdEMzdEMzpCNzpCNzlBNjlBNjlBNjlBNjpCNzpCNzpCNzpCNzpCNzpCNztDODxEOT5GOzxGOz9JQT5KQD9JPj5JOT9HOD5GNz5EOD1COz5FPjlDOzZANzRCMTlJL0JWM1BnPVhyQl5/Slt9Slh1SU1oRUNaQDlPOjZHNTRFMjxOOEVXPU5hRVNmSFNnS05iRkBXPTZJMy85Li82Li00LFpnTVtoTlxoUF5qUmJsVGVtVmhtWWluWmtsWmtsWmxqW2xpWm5oWm5oWm9nXG9pW2xpWmtoWWpmWmpmW2llXGllWmhmWmZnV2ZnVWJnUWFqV2VyYW98c36OjZalrKu5wsfQ19rh5+7z9/b8/Pj8+/X69PP27e7y5Onq3OPk0tzbydPSvs7LuMnGs8O+q722pMO3p8e5rM3BtdbJwd/U0Onf3vPo7vjx+P31//74///8//79//38//z9//z+/f3//v7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P79+//+/P/9+v/9+v/9+v/8+f/79//79//9/P/8+/76+//7/P/9/v/+///9/v78/f/8+//++//9+/307+3i3ObZ0fDi2fzx6//6/f/8///9/v///f//+/3/+v3//vz9//3+//3+///+/////f/+9f/+7f/85v/84f754//+5+TfyYqGbVBKMFJNMFNML1NNLVROLlVPL1VQMlVQMlRQM1NPMlBPM09OMlBMMU5NMU9NNExPNExONkpQNkpPOEhQOEpTOEdQM0dQM0lTMU1UM09WNFZcOFxkPWdySHSBVYiTaZCbc4WPbG51VFphQlJWO0xONk5ONk1NNU5MNU9NNlJQN1dTOllVPFpUPlhSPFRPPFFMOUtIOUdFOEVDN0BCNz0+NjpANjpANjlBNjdCNDdCNDZDMjZDMjtDODpCNzlBNjlBNjlBNjlBNjpCNztDODtDODpCNzpCNztDODtDOD1FOj5GOz1HPD1HPzxIPj5IPT5JOT9HOD5GNz5EOD1COz1EPTlDOzZANzRCMTlJL0RYNVJpP1t1RVp7Rld5RlRxRUlkQT1UOjJIMy9ALi0+KzZIMkBSOExfQ1JlR1NnS09jR0BXPTZJMzA6LzA3Ly00LFlnTVpoTlxoUF5qUmJsVGVtVmluWmpvW21uXGxtW21rXG1qW25oWm5oWm9pXW9pW2xpWmtoWWpmWmllWmllXGllWmlnW2doWGdoVmNoUmFqV2VyYW98c3uLipCfpqKwucHL1NTd5Onx9PL6/PT6+PH28O3w5+js3uLj1drbydLRv8zJtsnEscO+q7+4pryzosq+rtPFuNzQxObZ0e3i4Pbs7f/0+v/5///3///6///8//79//38//v8/vz+/f7///7+/v7+/v7+/v7+/v7+/v7+/v/+/P/+/P79+/79+//9+v/9+v/9+v/7+P/69v759f/9/P/7+v35+v76+/78/f/9/v/+///9/v/8+//9+v/8+v/48/fs5vLl3fjq4f/07v/6/f/8///9/v///f//+/3/+v3//vz9//z9//3+///+/////f/+9f/97P/74/763//85v//6efizIyIb1JMMlRPMlRNMFVOMVROLlVPL1ZRM1ZRM1VRNFNPMk9OMk5NMVBMMU5NMU5MM0tOM0xONktRN0tQOUpSOkxVOklSNUpTNk9ZN1NaOVRbOV1jP2ZuR4KSY5Kmc5+xgZuqf5KheoiUcHJ7XFxiRkxQN0tNNUxLNktJNExKNVBLNVROOFZQOldRO1ZQOlNOO1FMOUxJOklHOkdFOUNFOj0+NjpANjpANjlBNjdCNDdCNDZDMjZDMjtDODtDODpCNzlBNjlBNjpCNztDODtDODtDODtDODtDODtDODxEOT1FOj5GOz1HPD1HPzxIPj1HPD1IOD5GNz1FNj1DNz1COzpBOjdBOTU/NjRCMTlJL0JWM05lO1VvP1R1QFJ0QVBtQUVgPTlQNi1DLis8Kis8KTFDLTxONEhbP1BjRVJmSk5iRkBXPTVIMiw2KysyKicuJgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RpbWdwLmpwZyBiL3Rlc3RpbWdwLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JiNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGltZ3AuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RvcmlnLmpwZyBiL3Rlc3RvcmlnLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE2YTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdG9yaWcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Rwcm9nLmpwZyBiL3Rlc3Rwcm9nLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjBmZWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHByb2cuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RyYW5zdXBwLmMgYi90cmFuc3VwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWM1NjQKLS0tIC9kZXYvbnVsbAorKysgYi90cmFuc3VwcC5jCkBAIC0wLDAgKzEsOTI4IEBACisvKgorICogdHJhbnN1cHAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbWFnZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyBhbmQgb3RoZXIgdXRpbGl0eSBjb2RlCisgKiB1c2VkIGJ5IHRoZSBqcGVndHJhbiBzYW1wbGUgYXBwbGljYXRpb24uICBUaGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGNvcmUKKyAqIEpQRUcgbGlicmFyeS4gIEJ1dCB3ZSBrZWVwIHRoZXNlIHJvdXRpbmVzIHNlcGFyYXRlIGZyb20ganBlZ3RyYW4uYyB0bworICogZWFzZSB0aGUgdGFzayBvZiBtYWludGFpbmluZyBqcGVndHJhbi1saWtlIHByb2dyYW1zIHRoYXQgaGF2ZSBvdGhlciB1c2VyCisgKiBpbnRlcmZhY2VzLgorICovCisKKy8qIEFsdGhvdWdoIHRoaXMgZmlsZSByZWFsbHkgc2hvdWxkbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBsaWJyYXJ5IGludGVybmFscywKKyAqIGl0J3MgaGVscGZ1bCB0byBsZXQgaXQgY2FsbCBqcm91bmRfdXAoKSBhbmQgamNvcHlfYmxvY2tfcm93KCkuCisgKi8KKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgInRyYW5zdXBwLmgiCQkvKiBNeSBvd24gZXh0ZXJuYWwgaW50ZXJmYWNlICovCisKKworI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECisKKy8qCisgKiBMb3NzbGVzcyBpbWFnZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcy4gIFRoZXNlIHJvdXRpbmVzIHdvcmsgb24gRENUCisgKiBjb2VmZmljaWVudCBhcnJheXMgYW5kIHRodXMgZG8gbm90IHJlcXVpcmUgYW55IGxvc3N5IGRlY29tcHJlc3Npb24KKyAqIG9yIHJlY29tcHJlc3Npb24gb2YgdGhlIGltYWdlLgorICogVGhhbmtzIHRvIEd1aWRvIFZvbGxiZWRpbmcgZm9yIHRoZSBpbml0aWFsIGRlc2lnbiBhbmQgY29kZSBvZiB0aGlzIGZlYXR1cmUuCisgKgorICogSG9yaXpvbnRhbCBmbGlwcGluZyBpcyBkb25lIGluLXBsYWNlLCB1c2luZyBhIHNpbmdsZSB0b3AtdG8tYm90dG9tCisgKiBwYXNzIHRocm91Z2ggdGhlIHZpcnR1YWwgc291cmNlIGFycmF5LiAgSXQgd2lsbCB0aHVzIGJlIG11Y2ggdGhlCisgKiBmYXN0ZXN0IG9wdGlvbiBmb3IgaW1hZ2VzIGxhcmdlciB0aGFuIG1haW4gbWVtb3J5LgorICoKKyAqIFRoZSBvdGhlciByb3V0aW5lcyByZXF1aXJlIGEgc2V0IG9mIGRlc3RpbmF0aW9uIHZpcnR1YWwgYXJyYXlzLCBzbyB0aGV5CisgKiBuZWVkIHR3aWNlIGFzIG11Y2ggbWVtb3J5IGFzIGpwZWd0cmFuIG5vcm1hbGx5IGRvZXMuICBUaGUgZGVzdGluYXRpb24KKyAqIGFycmF5cyBhcmUgYWx3YXlzIHdyaXR0ZW4gaW4gbm9ybWFsIHNjYW4gb3JkZXIgKHRvcCB0byBib3R0b20pIGJlY2F1c2UKKyAqIHRoZSB2aXJ0dWFsIGFycmF5IG1hbmFnZXIgZXhwZWN0cyB0aGlzLiAgVGhlIHNvdXJjZSBhcnJheXMgd2lsbCBiZSBzY2FubmVkCisgKiBpbiB0aGUgY29ycmVzcG9uZGluZyBvcmRlciwgd2hpY2ggbWVhbnMgbXVsdGlwbGUgcGFzc2VzIHRocm91Z2ggdGhlIHNvdXJjZQorICogYXJyYXlzIGZvciBtb3N0IG9mIHRoZSB0cmFuc2Zvcm1zLiAgVGhhdCBjb3VsZCByZXN1bHQgaW4gbXVjaCB0aHJhc2hpbmcKKyAqIGlmIHRoZSBpbWFnZSBpcyBsYXJnZXIgdGhhbiBtYWluIG1lbW9yeS4KKyAqCisgKiBTb21lIG5vdGVzIGFib3V0IHRoZSBvcGVyYXRpbmcgZW52aXJvbm1lbnQgb2YgdGhlIGluZGl2aWR1YWwgdHJhbnNmb3JtCisgKiByb3V0aW5lczoKKyAqIDEuIEJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdmlydHVhbCBhcnJheXMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZQorICogICAgc291cmNlIEpQRUcgb2JqZWN0LCBhbmQgdGhlcmVmb3JlIHNob3VsZCBiZSBtYW5pcHVsYXRlZCBieSBjYWxsaW5nIHRoZQorICogICAgc291cmNlJ3MgbWVtb3J5IG1hbmFnZXIuCisgKiAyLiBUaGUgZGVzdGluYXRpb24ncyBjb21wb25lbnQgY291bnQgc2hvdWxkIGJlIHVzZWQuICBJdCBtYXkgYmUgc21hbGxlcgorICogICAgdGhhbiB0aGUgc291cmNlJ3Mgd2hlbiBmb3JjaW5nIHRvIGdyYXlzY2FsZS4KKyAqIDMuIExpa2V3aXNlIHRoZSBkZXN0aW5hdGlvbidzIHNhbXBsaW5nIGZhY3RvcnMgc2hvdWxkIGJlIHVzZWQuICBXaGVuCisgKiAgICBmb3JjaW5nIHRvIGdyYXlzY2FsZSB0aGUgZGVzdGluYXRpb24ncyBzYW1wbGluZyBmYWN0b3JzIHdpbGwgYmUgYWxsIDEsCisgKiAgICBhbmQgd2UgbWF5IGFzIHdlbGwgdGFrZSB0aGF0IGFzIHRoZSBlZmZlY3RpdmUgaU1DVSBzaXplLgorICogNC4gV2hlbiAidHJpbSIgaXMgaW4gZWZmZWN0LCB0aGUgZGVzdGluYXRpb24ncyBkaW1lbnNpb25zIHdpbGwgYmUgdGhlCisgKiAgICB0cmltbWVkIHZhbHVlcyBidXQgdGhlIHNvdXJjZSdzIHdpbGwgYmUgdW50cmltbWVkLgorICogNS4gQWxsIHRoZSByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXJzIGFyZQorICogICAgcGFkZGVkIG91dCB0byBhIGZ1bGwgaU1DVSBib3VuZGFyeS4gIFRoaXMgaXMgdHJ1ZSwgYWx0aG91Z2ggZm9yIHRoZQorICogICAgc291cmNlIGJ1ZmZlciBpdCBpcyBhbiB1bmRvY3VtZW50ZWQgcHJvcGVydHkgb2YgamRjb2VmY3QuYy4KKyAqIE5vdGVzIDIsMyw0IGJvaWwgZG93biB0byB0aGlzOiBnZW5lcmFsbHkgd2Ugc2hvdWxkIHVzZSB0aGUgZGVzdGluYXRpb24ncworICogZGltZW5zaW9ucyBhbmQgaWdub3JlIHRoZSBzb3VyY2Uncy4KKyAqLworCisKK0xPQ0FMKHZvaWQpCitkb19mbGlwX2ggKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMpCisvKiBIb3Jpem9udGFsIGZsaXA7IGRvbmUgaW4tcGxhY2UsIHNvIG5vIHNlcGFyYXRlIGRlc3QgYXJyYXkgaXMgcmVxdWlyZWQgKi8KK3sKKyAgSkRJTUVOU0lPTiBNQ1VfY29scywgY29tcF93aWR0aCwgYmxrX3gsIGJsa195OworICBpbnQgY2ksIGssIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpDT0VGUFRSIHB0cjEsIHB0cjI7CisgIEpDT0VGIHRlbXAxLCB0ZW1wMjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBIb3Jpem9udGFsIG1pcnJvcmluZyBvZiBEQ1QgYmxvY2tzIGlzIGFjY29tcGxpc2hlZCBieSBzd2FwcGluZworICAgKiBwYWlycyBvZiBibG9ja3MgaW4tcGxhY2UuICBXaXRoaW4gYSBEQ1QgYmxvY2ssIHdlIHBlcmZvcm0gaG9yaXpvbnRhbAorICAgKiBtaXJyb3JpbmcgYnkgY2hhbmdpbmcgdGhlIHNpZ25zIG9mIG9kZC1udW1iZXJlZCBjb2x1bW5zLgorICAgKiBQYXJ0aWFsIGlNQ1VzIGF0IHRoZSByaWdodCBlZGdlIGFyZSBsZWZ0IHVudG91Y2hlZC4KKyAgICovCisgIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIGZvciAoYmxrX3kgPSAwOyBibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisJIGJsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKKyAgICAgIGJ1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGJsa195LAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJZm9yIChibGtfeCA9IDA7IGJsa194ICogMiA8IGNvbXBfd2lkdGg7IGJsa194KyspIHsKKwkgIHB0cjEgPSBidWZmZXJbb2Zmc2V0X3ldW2Jsa194XTsKKwkgIHB0cjIgPSBidWZmZXJbb2Zmc2V0X3ldW2NvbXBfd2lkdGggLSBibGtfeCAtIDFdOworCSAgLyogdGhpcyB1bnJvbGxlZCBsb29wIGRvZXNuJ3QgbmVlZCB0byBrbm93IHdoaWNoIHJvdyBpdCdzIG9uLi4uICovCisJICBmb3IgKGsgPSAwOyBrIDwgRENUU0laRTI7IGsgKz0gMikgeworCSAgICB0ZW1wMSA9ICpwdHIxOwkvKiBzd2FwIGV2ZW4gY29sdW1uICovCisJICAgIHRlbXAyID0gKnB0cjI7CisJICAgICpwdHIxKysgPSB0ZW1wMjsKKwkgICAgKnB0cjIrKyA9IHRlbXAxOworCSAgICB0ZW1wMSA9ICpwdHIxOwkvKiBzd2FwIG9kZCBjb2x1bW4gd2l0aCBzaWduIGNoYW5nZSAqLworCSAgICB0ZW1wMiA9ICpwdHIyOworCSAgICAqcHRyMSsrID0gLXRlbXAyOworCSAgICAqcHRyMisrID0gLXRlbXAxOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fZmxpcF92IChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKKy8qIFZlcnRpY2FsIGZsaXAgKi8KK3sKKyAgSkRJTUVOU0lPTiBNQ1Vfcm93cywgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBpbnQgY2ksIGksIGosIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOworICBKQkxPQ0tST1cgc3JjX3Jvd19wdHIsIGRzdF9yb3dfcHRyOworICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIFdlIG91dHB1dCBpbnRvIGEgc2VwYXJhdGUgYXJyYXkgYmVjYXVzZSB3ZSBjYW4ndCB0b3VjaCBkaWZmZXJlbnQKKyAgICogcm93cyBvZiB0aGUgc291cmNlIHZpcnR1YWwgYXJyYXkgc2ltdWx0YW5lb3VzbHkuICBPdGhlcndpc2UsIHRoaXMKKyAgICogaXMgYSBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkIGFuYWxvZyBvZiBob3Jpem9udGFsIGZsaXAuCisgICAqIFdpdGhpbiBhIERDVCBibG9jaywgdmVydGljYWwgbWlycm9yaW5nIGlzIGRvbmUgYnkgY2hhbmdpbmcgdGhlIHNpZ25zCisgICAqIG9mIG9kZC1udW1iZXJlZCByb3dzLgorICAgKiBQYXJ0aWFsIGlNQ1VzIGF0IHRoZSBib3R0b20gZWRnZSBhcmUgY29waWVkIHZlcmJhdGltLgorICAgKi8KKyAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisJIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7CisgICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkvKiBSb3cgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCisJc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwKKwkgICBjb21wX2hlaWdodCAtIGRzdF9ibGtfeSAtIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgICB9IGVsc2UgeworCS8qIEJvdHRvbS1lZGdlIGJsb2NrcyB3aWxsIGJlIGNvcGllZCB2ZXJiYXRpbS4gKi8KKwlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKKwlpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkgIC8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KKwkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07CisJICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAtIG9mZnNldF95IC0gMV07CisJICBmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKwkgICAgICAgZHN0X2Jsa194KyspIHsKKwkgICAgZHN0X3B0ciA9IGRzdF9yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSArPSAyKSB7CisJICAgICAgLyogY29weSBldmVuIHJvdyAqLworCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCSAgICAgIC8qIGNvcHkgb2RkIHJvdyB3aXRoIHNpZ24gY2hhbmdlICovCisJICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKKwkgICAgfQorCSAgfQorCX0gZWxzZSB7CisJICAvKiBKdXN0IGNvcHkgcm93IHZlcmJhdGltLiAqLworCSAgamNvcHlfYmxvY2tfcm93KHNyY19idWZmZXJbb2Zmc2V0X3ldLCBkc3RfYnVmZmVyW29mZnNldF95XSwKKwkJCSAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzKTsKKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX3RyYW5zcG9zZSAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCisvKiBUcmFuc3Bvc2Ugc291cmNlIGludG8gZGVzdGluYXRpb24gKi8KK3sKKyAgSkRJTUVOU0lPTiBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CisgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogVHJhbnNwb3NpbmcgcGl4ZWxzIHdpdGhpbiBhIGJsb2NrIGp1c3QgcmVxdWlyZXMgdHJhbnNwb3NpbmcgdGhlCisgICAqIERDVCBjb2VmZmljaWVudHMuCisgICAqIFBhcnRpYWwgaU1DVXMgYXQgdGhlIGVkZ2VzIHJlcXVpcmUgbm8gc3BlY2lhbCB0cmVhdG1lbnQ7IHdlIHNpbXBseQorICAgKiBwcm9jZXNzIGFsbCB0aGUgYXZhaWxhYmxlIERDVCBibG9ja3MgZm9yIGV2ZXJ5IGNvbXBvbmVudC4KKyAgICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKwkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKKyAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKKwlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKwkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7CisJICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKKwkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7CisJICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7CisJICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XVtkc3RfYmxrX3kgKyBvZmZzZXRfeV07CisJICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07CisJICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCisJICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX3JvdF85MCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCisvKiA5MCBkZWdyZWUgcm90YXRpb24gaXMgZXF1aXZhbGVudCB0bworICogICAxLiBUcmFuc3Bvc2luZyB0aGUgaW1hZ2U7CisgKiAgIDIuIEhvcml6b250YWwgbWlycm9yaW5nLgorICogVGhlc2UgdHdvIHN0ZXBzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBwcm9jZXNzaW5nIHJvdXRpbmUuCisgKi8KK3sKKyAgSkRJTUVOU0lPTiBNQ1VfY29scywgY29tcF93aWR0aCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOworICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIEJlY2F1c2Ugb2YgdGhlIGhvcml6b250YWwgbWlycm9yIHN0ZXAsIHdlIGNhbid0IHByb2Nlc3MgcGFydGlhbCBpTUNVcworICAgKiBhdCB0aGUgKG91dHB1dCkgcmlnaHQgZWRnZSBwcm9wZXJseS4gIFRoZXkganVzdCBnZXQgdHJhbnNwb3NlZCBhbmQKKyAgICogbm90IG1pcnJvcmVkLgorICAgKi8KKyAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgeworCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKKwkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAorCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKwkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKKwkgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKKwkgICAgaWYgKGRzdF9ibGtfeCA8IGNvbXBfd2lkdGgpIHsKKwkgICAgICAvKiBCbG9jayBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KKwkgICAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV0KKwkJW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSBvZmZzZXRfeCAtIDFdOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQlpKys7CisJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07CisJICAgICAgfQorCSAgICB9IGVsc2UgeworCSAgICAgIC8qIEVkZ2UgYmxvY2tzIGFyZSB0cmFuc3Bvc2VkIGJ1dCBub3QgbWlycm9yZWQuICovCisJICAgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX3JvdF8yNzAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCisvKiAyNzAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgMS4gSG9yaXpvbnRhbCBtaXJyb3Jpbmc7CisgKiAgIDIuIFRyYW5zcG9zaW5nIHRoZSBpbWFnZS4KKyAqIFRoZXNlIHR3byBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgorICovCit7CisgIEpESU1FTlNJT04gTUNVX3Jvd3MsIGNvbXBfaGVpZ2h0LCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CisgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogQmVjYXVzZSBvZiB0aGUgaG9yaXpvbnRhbCBtaXJyb3Igc3RlcCwgd2UgY2FuJ3QgcHJvY2VzcyBwYXJ0aWFsIGlNQ1VzCisgICAqIGF0IHRoZSAob3V0cHV0KSBib3R0b20gZWRnZSBwcm9wZXJseS4gIFRoZXkganVzdCBnZXQgdHJhbnNwb3NlZCBhbmQKKyAgICogbm90IG1pcnJvcmVkLgorICAgKi8KKyAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisJIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7CisgICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisJICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgeworCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCisJICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOworCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgeworCSAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOworCSAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkgICAgICAvKiBCbG9jayBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KKwkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF0KKwkJW2NvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gb2Zmc2V0X3kgLSAxXTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKKwkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgIGorKzsKKwkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKKwkJfQorCSAgICAgIH0KKwkgICAgfSBlbHNlIHsKKwkgICAgICAvKiBFZGdlIGJsb2NrcyBhcmUgdHJhbnNwb3NlZCBidXQgbm90IG1pcnJvcmVkLiAqLworCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XVtkc3RfYmxrX3kgKyBvZmZzZXRfeV07CisJICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19yb3RfMTgwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogMTgwIGRlZ3JlZSByb3RhdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgKiAgIDEuIFZlcnRpY2FsIG1pcnJvcmluZzsKKyAqICAgMi4gSG9yaXpvbnRhbCBtaXJyb3JpbmcuCisgKiBUaGVzZSB0d28gc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KKyAqLworeworICBKRElNRU5TSU9OIE1DVV9jb2xzLCBNQ1Vfcm93cywgY29tcF93aWR0aCwgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBpbnQgY2ksIGksIGosIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOworICBKQkxPQ0tST1cgc3JjX3Jvd19wdHIsIGRzdF9yb3dfcHRyOworICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKwkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKKyAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworCS8qIFJvdyBpcyB3aXRoaW4gdGhlIHZlcnRpY2FsbHkgbWlycm9yYWJsZSBhcmVhLiAqLworCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCisJICAgY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOworICAgICAgfSBlbHNlIHsKKwkvKiBCb3R0b20tZWRnZSByb3dzIGFyZSBvbmx5IG1pcnJvcmVkIGhvcml6b250YWxseS4gKi8KKwlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKKwlpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkgIC8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KKwkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07CisJICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAtIG9mZnNldF95IC0gMV07CisJICAvKiBQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBjYW4gYmUgbWlycm9yZWQgYm90aCB3YXlzLiAqLworCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoOyBkc3RfYmxrX3grKykgeworCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSAxXTsKKwkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkgKz0gMikgeworCSAgICAgIC8qIEZvciBldmVuIHJvdywgbmVnYXRlIGV2ZXJ5IG9kZCBjb2x1bW4uICovCisJICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGogKz0gMikgeworCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKKwkJKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKKwkgICAgICB9CisJICAgICAgLyogRm9yIG9kZCByb3csIG5lZ2F0ZSBldmVyeSBldmVuIGNvbHVtbi4gKi8KKwkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaiArPSAyKSB7CisJCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CisJCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgLyogQW55IHJlbWFpbmluZyByaWdodC1lZGdlIGJsb2NrcyBhcmUgb25seSBtaXJyb3JlZCB2ZXJ0aWNhbGx5LiAqLworCSAgZm9yICg7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsgZHN0X2Jsa194KyspIHsKKwkgICAgZHN0X3B0ciA9IGRzdF9yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSArPSAyKSB7CisJICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7CisJICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKKwkgICAgfQorCSAgfQorCX0gZWxzZSB7CisJICAvKiBSZW1haW5pbmcgcm93cyBhcmUganVzdCBtaXJyb3JlZCBob3Jpem9udGFsbHkuICovCisJICBkc3Rfcm93X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldOworCSAgc3JjX3Jvd19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF95XTsKKwkgIC8qIFByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGNhbiBiZSBtaXJyb3JlZC4gKi8KKwkgIGZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcF93aWR0aDsgZHN0X2Jsa194KyspIHsKKwkgICAgZHN0X3B0ciA9IGRzdF9yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gMV07CisJICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSArPSAyKSB7CisJICAgICAgKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7CisJICAgICAgKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKKwkgICAgfQorCSAgfQorCSAgLyogQW55IHJlbWFpbmluZyByaWdodC1lZGdlIGJsb2NrcyBhcmUgb25seSBjb3BpZWQuICovCisJICBmb3IgKDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBkc3RfYmxrX3grKykgeworCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKQorCSAgICAgICpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fdHJhbnN2ZXJzZSAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKKy8qIFRyYW5zdmVyc2UgdHJhbnNwb3NlIGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgMS4gMTgwIGRlZ3JlZSByb3RhdGlvbjsKKyAqICAgMi4gVHJhbnNwb3NpdGlvbjsKKyAqIG9yCisgKiAgIDEuIEhvcml6b250YWwgbWlycm9yaW5nOworICogICAyLiBUcmFuc3Bvc2l0aW9uOworICogICAzLiBIb3Jpem9udGFsIG1pcnJvcmluZy4KKyAqIFRoZXNlIHN0ZXBzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBwcm9jZXNzaW5nIHJvdXRpbmUuCisgKi8KK3sKKyAgSkRJTUVOU0lPTiBNQ1VfY29scywgTUNVX3Jvd3MsIGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0LCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CisgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgeworCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKKwkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAorCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKwkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKKwkgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7CisJICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdCisJCVtjb21wX2hlaWdodCAtIGRzdF9ibGtfeSAtIG9mZnNldF95IC0gMV07CisJICAgICAgaWYgKGRzdF9ibGtfeCA8IGNvbXBfd2lkdGgpIHsKKwkJLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCisJCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQorCQkgIFtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKKwkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgeworCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgICBqKys7CisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICB9CisJCSAgaSsrOworCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgICAgaisrOworCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICB9CisJCX0KKwkgICAgICB9IGVsc2UgeworCQkvKiBSaWdodC1lZGdlIGJsb2NrcyBhcmUgbWlycm9yZWQgaW4geSBvbmx5ICovCisJCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07CisJCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKKwkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7CisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgICAgaisrOworCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgfQorCQl9CisJICAgICAgfQorCSAgICB9IGVsc2UgeworCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XVtkc3RfYmxrX3kgKyBvZmZzZXRfeV07CisJICAgICAgaWYgKGRzdF9ibGtfeCA8IGNvbXBfd2lkdGgpIHsKKwkJLyogQm90dG9tLWVkZ2UgYmxvY2tzIGFyZSBtaXJyb3JlZCBpbiB4IG9ubHkgKi8KKwkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldCisJCSAgW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSBvZmZzZXRfeCAtIDFdOworCQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CisJCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgaSsrOworCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKKwkJfQorCSAgICAgIH0gZWxzZSB7CisJCS8qIEF0IGxvd2VyIHJpZ2h0IGNvcm5lciwganVzdCB0cmFuc3Bvc2UsIG5vIG1pcnJvcmluZyAqLworCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOworCQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKQorCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKiBSZXF1ZXN0IGFueSByZXF1aXJlZCB3b3Jrc3BhY2UuCisgKgorICogV2UgYWxsb2NhdGUgdGhlIHdvcmtzcGFjZSB2aXJ0dWFsIGFycmF5cyBmcm9tIHRoZSBzb3VyY2UgZGVjb21wcmVzc2lvbgorICogb2JqZWN0LCBzbyB0aGF0IGFsbCB0aGUgYXJyYXlzIChib3RoIHRoZSBvcmlnaW5hbCBkYXRhIGFuZCB0aGUgd29ya3NwYWNlKQorICogd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hpbGUgbWFraW5nIG1lbW9yeSBtYW5hZ2VtZW50IGRlY2lzaW9ucy4KKyAqIEhlbmNlLCB0aGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19yZWFkX2hlYWRlciAod2hpY2ggcmVhZHMKKyAqIHRoZSBpbWFnZSBkaW1lbnNpb25zKSBhbmQgYmVmb3JlIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgKHdoaWNoIHJlYWxpemVzCisgKiB0aGUgc291cmNlJ3MgdmlydHVhbCBhcnJheXMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranRyYW5zZm9ybV9yZXF1ZXN0X3dvcmtzcGFjZSAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAorCQkJICAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykKK3sKKyAganZpcnRfYmFycmF5X3B0ciAqY29lZl9hcnJheXMgPSBOVUxMOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBpbnQgY2k7CisKKyAgaWYgKGluZm8tPmZvcmNlX2dyYXlzY2FsZSAmJgorICAgICAgc3JjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgJiYKKyAgICAgIHNyY2luZm8tPm51bV9jb21wb25lbnRzID09IDMpIHsKKyAgICAvKiBXZSdsbCBvbmx5IHByb2Nlc3MgdGhlIGZpcnN0IGNvbXBvbmVudCAqLworICAgIGluZm8tPm51bV9jb21wb25lbnRzID0gMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBQcm9jZXNzIGFsbCB0aGUgY29tcG9uZW50cyAqLworICAgIGluZm8tPm51bV9jb21wb25lbnRzID0gc3JjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgIH0KKworICBzd2l0Y2ggKGluZm8tPnRyYW5zZm9ybSkgeworICBjYXNlIEpYRk9STV9OT05FOgorICBjYXNlIEpYRk9STV9GTElQX0g6CisgICAgLyogRG9uJ3QgbmVlZCBhIHdvcmtzcGFjZSBhcnJheSAqLworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9GTElQX1Y6CisgIGNhc2UgSlhGT1JNX1JPVF8xODA6CisgICAgLyogTmVlZCB3b3Jrc3BhY2UgYXJyYXlzIGhhdmluZyBzYW1lIGRpbWVuc2lvbnMgYXMgc291cmNlIGltYWdlLgorICAgICAqIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBhcnJheXMgcGFkZGVkIG91dCB0byB0aGUgbmV4dCBpTUNVIGJvdW5kYXJ5LAorICAgICAqIHNvIHRoYXQgdHJhbnNmb3JtIHJvdXRpbmVzIG5lZWQgbm90IHdvcnJ5IGFib3V0IG1pc3NpbmcgZWRnZSBibG9ja3MuCisgICAgICovCisgICAgY29lZl9hcnJheXMgPSAoanZpcnRfYmFycmF5X3B0ciAqKQorICAgICAgKCpzcmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsCisJU0laRU9GKGp2aXJ0X2JhcnJheV9wdHIpICogaW5mby0+bnVtX2NvbXBvbmVudHMpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gc3JjaW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgICBjb2VmX2FycmF5c1tjaV0gPSAoKnNyY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fVFJBTlNQT1NFOgorICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgorICBjYXNlIEpYRk9STV9ST1RfOTA6CisgIGNhc2UgSlhGT1JNX1JPVF8yNzA6CisgICAgLyogTmVlZCB3b3Jrc3BhY2UgYXJyYXlzIGhhdmluZyB0cmFuc3Bvc2VkIGRpbWVuc2lvbnMuCisgICAgICogTm90ZSB0aGF0IHdlIGFsbG9jYXRlIGFycmF5cyBwYWRkZWQgb3V0IHRvIHRoZSBuZXh0IGlNQ1UgYm91bmRhcnksCisgICAgICogc28gdGhhdCB0cmFuc2Zvcm0gcm91dGluZXMgbmVlZCBub3Qgd29ycnkgYWJvdXQgbWlzc2luZyBlZGdlIGJsb2Nrcy4KKyAgICAgKi8KKyAgICBjb2VmX2FycmF5cyA9IChqdmlydF9iYXJyYXlfcHRyICopCisgICAgICAoKnNyY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwKKwlTSVpFT0YoanZpcnRfYmFycmF5X3B0cikgKiBpbmZvLT5udW1fY29tcG9uZW50cyk7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBzcmNpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICAgIGNvZWZfYXJyYXlzW2NpXSA9ICgqc3JjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGluZm8tPndvcmtzcGFjZV9jb2VmX2FycmF5cyA9IGNvZWZfYXJyYXlzOworfQorCisKKy8qIFRyYW5zcG9zZSBkZXN0aW5hdGlvbiBpbWFnZSBwYXJhbWV0ZXJzICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyAoal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgaW50IHRibG5vLCBpLCBqLCBjaSwgaXRlbXA7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpRVUFOVF9UQkwgKnF0YmxwdHI7CisgIEpESU1FTlNJT04gZHRlbXA7CisgIFVJTlQxNiBxdGVtcDsKKworICAvKiBUcmFuc3Bvc2UgYmFzaWMgaW1hZ2UgZGltZW5zaW9ucyAqLworICBkdGVtcCA9IGRzdGluZm8tPmltYWdlX3dpZHRoOworICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IGRzdGluZm8tPmltYWdlX2hlaWdodDsKKyAgZHN0aW5mby0+aW1hZ2VfaGVpZ2h0ID0gZHRlbXA7CisKKyAgLyogVHJhbnNwb3NlIHNhbXBsaW5nIGZhY3RvcnMgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgaXRlbXAgPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPSBpdGVtcDsKKyAgfQorCisgIC8qIFRyYW5zcG9zZSBxdWFudGl6YXRpb24gdGFibGVzICovCisgIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7CisgICAgcXRibHB0ciA9IGRzdGluZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXTsKKyAgICBpZiAocXRibHB0ciAhPSBOVUxMKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CisJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCSAgcXRlbXAgPSBxdGJscHRyLT5xdWFudHZhbFtpKkRDVFNJWkUral07CisJICBxdGJscHRyLT5xdWFudHZhbFtpKkRDVFNJWkUral0gPSBxdGJscHRyLT5xdWFudHZhbFtqKkRDVFNJWkUraV07CisJICBxdGJscHRyLT5xdWFudHZhbFtqKkRDVFNJWkUraV0gPSBxdGVtcDsKKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyogVHJpbSBvZmYgYW55IHBhcnRpYWwgaU1DVXMgb24gdGhlIGluZGljYXRlZCBkZXN0aW5hdGlvbiBlZGdlICovCisKK0xPQ0FMKHZvaWQpCit0cmltX3JpZ2h0X2VkZ2UgKGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCit7CisgIGludCBjaSwgbWF4X2hfc2FtcF9mYWN0b3I7CisgIEpESU1FTlNJT04gTUNVX2NvbHM7CisKKyAgLyogV2UgaGF2ZSB0byBjb21wdXRlIG1heF9oX3NhbXBfZmFjdG9yIG91cnNlbHZlcywKKyAgICogYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBzZXQgeWV0IGluIHRoZSBkZXN0aW5hdGlvbgorICAgKiAoYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBzb3VyY2UncyB2YWx1ZSkuCisgICAqLworICBtYXhfaF9zYW1wX2ZhY3RvciA9IDE7CisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgaW50IGhfc2FtcF9mYWN0b3IgPSBkc3RpbmZvLT5jb21wX2luZm9bY2ldLmhfc2FtcF9mYWN0b3I7CisgICAgbWF4X2hfc2FtcF9mYWN0b3IgPSBNQVgobWF4X2hfc2FtcF9mYWN0b3IsIGhfc2FtcF9mYWN0b3IpOworICB9CisgIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAobWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgaWYgKE1DVV9jb2xzID4gMCkJCS8qIGNhbid0IHRyaW0gdG8gMCBwaXhlbHMgKi8KKyAgICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IE1DVV9jb2xzICogKG1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Cit9CisKK0xPQ0FMKHZvaWQpCit0cmltX2JvdHRvbV9lZGdlIChqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQoreworICBpbnQgY2ksIG1heF92X3NhbXBfZmFjdG9yOworICBKRElNRU5TSU9OIE1DVV9yb3dzOworCisgIC8qIFdlIGhhdmUgdG8gY29tcHV0ZSBtYXhfdl9zYW1wX2ZhY3RvciBvdXJzZWx2ZXMsCisgICAqIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gc2V0IHlldCBpbiB0aGUgZGVzdGluYXRpb24KKyAgICogKGFuZCB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc291cmNlJ3MgdmFsdWUpLgorICAgKi8KKyAgbWF4X3Zfc2FtcF9mYWN0b3IgPSAxOworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGludCB2X3NhbXBfZmFjdG9yID0gZHN0aW5mby0+Y29tcF9pbmZvW2NpXS52X3NhbXBfZmFjdG9yOworICAgIG1heF92X3NhbXBfZmFjdG9yID0gTUFYKG1heF92X3NhbXBfZmFjdG9yLCB2X3NhbXBfZmFjdG9yKTsKKyAgfQorICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChtYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICBpZiAoTUNVX3Jvd3MgPiAwKQkJLyogY2FuJ3QgdHJpbSB0byAwIHBpeGVscyAqLworICAgIGRzdGluZm8tPmltYWdlX2hlaWdodCA9IE1DVV9yb3dzICogKG1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Cit9CisKKworLyogQWRqdXN0IG91dHB1dCBpbWFnZSBwYXJhbWV0ZXJzIGFzIG5lZWRlZC4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzKCkKKyAqIGFuZCBiZWZvcmUganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzZXQgb2YgdmlydHVhbCBjb2VmZmljaWVudCBhcnJheXMgdG8gYmUgd3JpdHRlbgorICogKGVpdGhlciB0aGUgb25lcyBhbGxvY2F0ZWQgYnkganRyYW5zZm9ybV9yZXF1ZXN0X3dvcmtzcGFjZSwgb3IgdGhlCisgKiBvcmlnaW5hbCBzb3VyY2UgZGF0YSBhcnJheXMpLiAgVGhlIGNhbGxlciB3aWxsIG5lZWQgdG8gcGFzcyB0aGlzIHZhbHVlCisgKiB0byBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgorICovCisKK0dMT0JBTChqdmlydF9iYXJyYXlfcHRyICopCitqdHJhbnNmb3JtX2FkanVzdF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkgICAgICBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCQkJICAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykKK3sKKyAgLyogSWYgZm9yY2UtdG8tZ3JheXNjYWxlIGlzIHJlcXVlc3RlZCwgYWRqdXN0IGRlc3RpbmF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKGluZm8tPmZvcmNlX2dyYXlzY2FsZSkgeworICAgIC8qIFdlIHVzZSBqcGVnX3NldF9jb2xvcnNwYWNlIHRvIG1ha2Ugc3VyZSBzdWJzaWRpYXJ5IHNldHRpbmdzIGdldCBmaXhlZAorICAgICAqIHByb3Blcmx5LiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgdGFyZ2V0IGhfc2FtcF9mYWN0b3IgJiB2X3NhbXBfZmFjdG9yCisgICAgICogd2lsbCBnZXQgc2V0IHRvIDEsIHdoaWNoIHR5cGljYWxseSB3b24ndCBtYXRjaCB0aGUgc291cmNlLgorICAgICAqIEluIGZhY3Qgd2UgZG8gdGhpcyBldmVuIGlmIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSBncmF5c2NhbGU7IHRoYXQKKyAgICAgKiBwcm92aWRlcyBhbiBlYXN5IHdheSBvZiBjb2VyY2luZyBhIGdyYXlzY2FsZSBKUEVHIHdpdGggZnVubnkgc2FtcGxpbmcKKyAgICAgKiBmYWN0b3JzIHRvIHRoZSBjdXN0b21hcnkgMSwxLiAgKFNvbWUgZGVjb2RlcnMgZmFpbCBvbiBvdGhlciBmYWN0b3JzLikKKyAgICAgKi8KKyAgICBpZiAoKGRzdGluZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyICYmCisJIGRzdGluZm8tPm51bV9jb21wb25lbnRzID09IDMpIHx8CisJKGRzdGluZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSAmJgorCSBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9PSAxKSkgeworICAgICAgLyogV2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgc291cmNlJ3MgcXVhbnRpemF0aW9uIHRhYmxlIG51bWJlci4gKi8KKyAgICAgIGludCBzdl9xdWFudF90Ymxfbm8gPSBkc3RpbmZvLT5jb21wX2luZm9bMF0ucXVhbnRfdGJsX25vOworICAgICAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKKyAgICAgIGRzdGluZm8tPmNvbXBfaW5mb1swXS5xdWFudF90Ymxfbm8gPSBzdl9xdWFudF90Ymxfbm87CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNvcnJ5LCBjYW4ndCBkbyBpdCAqLworICAgICAgRVJSRVhJVChkc3RpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgfQorICB9CisKKyAgLyogQ29ycmVjdCB0aGUgZGVzdGluYXRpb24ncyBpbWFnZSBkaW1lbnNpb25zIGV0YyBpZiBuZWNlc3NhcnkgKi8KKyAgc3dpdGNoIChpbmZvLT50cmFuc2Zvcm0pIHsKKyAgY2FzZSBKWEZPUk1fTk9ORToKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX0ZMSVBfSDoKKyAgICBpZiAoaW5mby0+dHJpbSkKKyAgICAgIHRyaW1fcmlnaHRfZWRnZShkc3RpbmZvKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fRkxJUF9WOgorICAgIGlmIChpbmZvLT50cmltKQorICAgICAgdHJpbV9ib3R0b21fZWRnZShkc3RpbmZvKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fVFJBTlNQT1NFOgorICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOworICAgIC8qIHRyYW5zcG9zZSBkb2VzIE5PVCBoYXZlIHRvIHRyaW0gYW55dGhpbmcgKi8KKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fVFJBTlNWRVJTRToKKyAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKKyAgICBpZiAoaW5mby0+dHJpbSkgeworICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOworICAgICAgdHJpbV9ib3R0b21fZWRnZShkc3RpbmZvKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF85MDoKKyAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKKyAgICBpZiAoaW5mby0+dHJpbSkKKyAgICAgIHRyaW1fcmlnaHRfZWRnZShkc3RpbmZvKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fUk9UXzE4MDoKKyAgICBpZiAoaW5mby0+dHJpbSkgeworICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOworICAgICAgdHJpbV9ib3R0b21fZWRnZShkc3RpbmZvKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF8yNzA6CisgICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7CisgICAgaWYgKGluZm8tPnRyaW0pCisgICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOworICAgIGJyZWFrOworICB9CisKKyAgLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgZGF0YSBzZXQgKi8KKyAgaWYgKGluZm8tPndvcmtzcGFjZV9jb2VmX2FycmF5cyAhPSBOVUxMKQorICAgIHJldHVybiBpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXM7CisgIHJldHVybiBzcmNfY29lZl9hcnJheXM7Cit9CisKKworLyogRXhlY3V0ZSB0aGUgYWN0dWFsIHRyYW5zZm9ybWF0aW9uLCBpZiBhbnkuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzLCBiZWNhdXNlIGl0IGRlcGVuZHMKKyAqIG9uIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzIHRvIGhhdmUgY29tcHV0ZWQgc3Vic2lkaWFyeSB2YWx1ZXMgc3VjaCBhcworICogdGhlIHBlci1jb21wb25lbnQgd2lkdGggYW5kIGhlaWdodCBmaWVsZHMgaW4gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAqCisgKiBOb3RlIHRoYXQgc29tZSB0cmFuc2Zvcm1hdGlvbnMgd2lsbCBtb2RpZnkgdGhlIHNvdXJjZSBkYXRhIGFycmF5cyEKKyAqLworCitHTE9CQUwodm9pZCkKK2p0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbiAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAorCQkJCSAgIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJCQkJICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCQkJCSAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pCit7CisgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cyA9IGluZm8tPndvcmtzcGFjZV9jb2VmX2FycmF5czsKKworICBzd2l0Y2ggKGluZm8tPnRyYW5zZm9ybSkgeworICBjYXNlIEpYRk9STV9OT05FOgorICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9GTElQX0g6CisgICAgZG9fZmxpcF9oKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX0ZMSVBfVjoKKyAgICBkb19mbGlwX3Yoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6CisgICAgZG9fdHJhbnNwb3NlKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fVFJBTlNWRVJTRToKKyAgICBkb190cmFuc3ZlcnNlKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fUk9UXzkwOgorICAgIGRvX3JvdF85MChzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF8xODA6CisgICAgZG9fcm90XzE4MChzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF8yNzA6CisgICAgZG9fcm90XzI3MChzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgYnJlYWs7CisgIH0KK30KKworI2VuZGlmIC8qIFRSQU5TRk9STVNfU1VQUE9SVEVEICovCisKKworLyogU2V0dXAgZGVjb21wcmVzc2lvbiBvYmplY3QgdG8gc2F2ZSBkZXNpcmVkIG1hcmtlcnMgaW4gbWVtb3J5LgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUganBlZ19yZWFkX2hlYWRlcigpIHRvIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LgorICovCisKK0dMT0JBTCh2b2lkKQoramNvcHlfbWFya2Vyc19zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBKQ09QWV9PUFRJT04gb3B0aW9uKQoreworI2lmZGVmIFNBVkVfTUFSS0VSU19TVVBQT1JURUQKKyAgaW50IG07CisKKyAgLyogU2F2ZSBjb21tZW50cyBleGNlcHQgdW5kZXIgTk9ORSBvcHRpb24gKi8KKyAgaWYgKG9wdGlvbiAhPSBKQ09QWU9QVF9OT05FKSB7CisgICAganBlZ19zYXZlX21hcmtlcnMoc3JjaW5mbywgSlBFR19DT00sIDB4RkZGRik7CisgIH0KKyAgLyogU2F2ZSBhbGwgdHlwZXMgb2YgQVBQbiBtYXJrZXJzIGlmZiBBTEwgb3B0aW9uICovCisgIGlmIChvcHRpb24gPT0gSkNPUFlPUFRfQUxMKSB7CisgICAgZm9yIChtID0gMDsgbSA8IDE2OyBtKyspCisgICAgICBqcGVnX3NhdmVfbWFya2VycyhzcmNpbmZvLCBKUEVHX0FQUDAgKyBtLCAweEZGRkYpOworICB9CisjZW5kaWYgLyogU0FWRV9NQVJLRVJTX1NVUFBPUlRFRCAqLworfQorCisvKiBDb3B5IG1hcmtlcnMgc2F2ZWQgaW4gdGhlIGdpdmVuIHNvdXJjZSBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBqdXN0IGFmdGVyIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBvcgorICoganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKyAqIE5vdGUgdGhhdCB0aG9zZSByb3V0aW5lcyB3aWxsIGhhdmUgd3JpdHRlbiB0aGUgU09JLCBhbmQgYWxzbyB0aGUKKyAqIEpGSUYgQVBQMCBvciBBZG9iZSBBUFAxNCBtYXJrZXJzIGlmIHNlbGVjdGVkLgorICovCisKK0dMT0JBTCh2b2lkKQoramNvcHlfbWFya2Vyc19leGVjdXRlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJCSAgICAgICBKQ09QWV9PUFRJT04gb3B0aW9uKQoreworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyOworCisgIC8qIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGV4YW1pbmUgdGhlCisgICAqIG9wdGlvbiBmbGFnIGhlcmU7IHdlIGp1c3QgY29weSBldmVyeXRoaW5nIHRoYXQgZ290IHNhdmVkLgorICAgKiBCdXQgdG8gYXZvaWQgY29uZnVzaW9uLCB3ZSBkbyBub3Qgb3V0cHV0IEpGSUYgYW5kIEFkb2JlIEFQUDE0IG1hcmtlcnMKKyAgICogaWYgdGhlIGVuY29kZXIgbGlicmFyeSBhbHJlYWR5IHdyb3RlIG9uZS4KKyAgICovCisgIGZvciAobWFya2VyID0gc3JjaW5mby0+bWFya2VyX2xpc3Q7IG1hcmtlciAhPSBOVUxMOyBtYXJrZXIgPSBtYXJrZXItPm5leHQpIHsKKyAgICBpZiAoZHN0aW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgJiYKKwltYXJrZXItPm1hcmtlciA9PSBKUEVHX0FQUDAgJiYKKwltYXJrZXItPmRhdGFfbGVuZ3RoID49IDUgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzBdKSA9PSAweDRBICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsxXSkgPT0gMHg0NiAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMl0pID09IDB4NDkgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzNdKSA9PSAweDQ2ICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVs0XSkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOwkJCS8qIHJlamVjdCBkdXBsaWNhdGUgSkZJRiAqLworICAgIGlmIChkc3RpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgJiYKKwltYXJrZXItPm1hcmtlciA9PSBKUEVHX0FQUDArMTQgJiYKKwltYXJrZXItPmRhdGFfbGVuZ3RoID49IDUgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzBdKSA9PSAweDQxICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsxXSkgPT0gMHg2NCAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMl0pID09IDB4NkYgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzNdKSA9PSAweDYyICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVs0XSkgPT0gMHg2NSkKKyAgICAgIGNvbnRpbnVlOwkJCS8qIHJlamVjdCBkdXBsaWNhdGUgQWRvYmUgKi8KKyNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUworICAgIC8qIFdlIGNvdWxkIHVzZSBqcGVnX3dyaXRlX21hcmtlciBpZiB0aGUgZGF0YSB3ZXJlbid0IEZBUi4uLiAqLworICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAganBlZ193cml0ZV9tX2hlYWRlcihkc3RpbmZvLCBtYXJrZXItPm1hcmtlciwgbWFya2VyLT5kYXRhX2xlbmd0aCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbWFya2VyLT5kYXRhX2xlbmd0aDsgaSsrKQorCWpwZWdfd3JpdGVfbV9ieXRlKGRzdGluZm8sIG1hcmtlci0+ZGF0YVtpXSk7CisgICAgfQorI2Vsc2UKKyAgICBqcGVnX3dyaXRlX21hcmtlcihkc3RpbmZvLCBtYXJrZXItPm1hcmtlciwKKwkJICAgICAgbWFya2VyLT5kYXRhLCBtYXJrZXItPmRhdGFfbGVuZ3RoKTsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS90cmFuc3VwcC5oIGIvdHJhbnN1cHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzJkMzJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJhbnN1cHAuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIHRyYW5zdXBwLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBpbWFnZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyBhbmQKKyAqIG90aGVyIHV0aWxpdHkgY29kZSB1c2VkIGJ5IHRoZSBqcGVndHJhbiBzYW1wbGUgYXBwbGljYXRpb24uICBUaGVzZSBhcmUKKyAqIE5PVCBwYXJ0IG9mIHRoZSBjb3JlIEpQRUcgbGlicmFyeS4gIEJ1dCB3ZSBrZWVwIHRoZXNlIHJvdXRpbmVzIHNlcGFyYXRlCisgKiBmcm9tIGpwZWd0cmFuLmMgdG8gZWFzZSB0aGUgdGFzayBvZiBtYWludGFpbmluZyBqcGVndHJhbi1saWtlIHByb2dyYW1zCisgKiB0aGF0IGhhdmUgb3RoZXIgdXNlciBpbnRlcmZhY2VzLgorICoKKyAqIE5PVEU6IGFsbCB0aGUgcm91dGluZXMgZGVjbGFyZWQgaGVyZSBoYXZlIHZlcnkgc3BlY2lmaWMgcmVxdWlyZW1lbnRzCisgKiBhYm91dCB3aGVuIHRoZXkgYXJlIHRvIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiB0aGUKKyAqIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZmlsZXMuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRyYW5zdXBwLmMsIG9yIHNlZQorICoganBlZ3RyYW4uYyBmb3IgYW4gZXhhbXBsZSBvZiBjb3JyZWN0IHVzYWdlLgorICovCisKKy8qIElmIHlvdSBoYXBwZW4gbm90IHRvIHdhbnQgdGhlIGltYWdlIHRyYW5zZm9ybSBzdXBwb3J0LCBkaXNhYmxlIGl0IGhlcmUgKi8KKyNpZm5kZWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyNkZWZpbmUgVFJBTlNGT1JNU19TVVBQT1JURUQgMQkJLyogMCBkaXNhYmxlcyB0cmFuc2Zvcm0gY29kZSAqLworI2VuZGlmCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCQlqVHJSZXF1ZXN0CisjZGVmaW5lIGp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMJCWpUckFkanVzdAorI2RlZmluZSBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24JalRyRXhlYworI2RlZmluZSBqY29weV9tYXJrZXJzX3NldHVwCQkJakNNcmtTZXR1cAorI2RlZmluZSBqY29weV9tYXJrZXJzX2V4ZWN1dGUJCQlqQ01ya0V4ZWMKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKworLyoKKyAqIENvZGVzIGZvciBzdXBwb3J0ZWQgdHlwZXMgb2YgaW1hZ2UgdHJhbnNmb3JtYXRpb25zLgorICovCisKK3R5cGVkZWYgZW51bSB7CisJSlhGT1JNX05PTkUsCQkvKiBubyB0cmFuc2Zvcm1hdGlvbiAqLworCUpYRk9STV9GTElQX0gsCQkvKiBob3Jpem9udGFsIGZsaXAgKi8KKwlKWEZPUk1fRkxJUF9WLAkJLyogdmVydGljYWwgZmxpcCAqLworCUpYRk9STV9UUkFOU1BPU0UsCS8qIHRyYW5zcG9zZSBhY3Jvc3MgVUwtdG8tTFIgYXhpcyAqLworCUpYRk9STV9UUkFOU1ZFUlNFLAkvKiB0cmFuc3Bvc2UgYWNyb3NzIFVSLXRvLUxMIGF4aXMgKi8KKwlKWEZPUk1fUk9UXzkwLAkJLyogOTAtZGVncmVlIGNsb2Nrd2lzZSByb3RhdGlvbiAqLworCUpYRk9STV9ST1RfMTgwLAkJLyogMTgwLWRlZ3JlZSByb3RhdGlvbiAqLworCUpYRk9STV9ST1RfMjcwCQkvKiAyNzAtZGVncmVlIGNsb2Nrd2lzZSAob3IgOTAgY2N3KSAqLworfSBKWEZPUk1fQ09ERTsKKworLyoKKyAqIEFsdGhvdWdoIHJvdGF0aW5nIGFuZCBmbGlwcGluZyBkYXRhIGV4cHJlc3NlZCBhcyBEQ1QgY29lZmZpY2llbnRzIGlzIG5vdAorICogaGFyZCwgdGhlcmUgaXMgYW4gYXN5bW1ldHJ5IGluIHRoZSBKUEVHIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciBpbWFnZXMKKyAqIHdob3NlIGRpbWVuc2lvbnMgYXJlbid0IG11bHRpcGxlcyBvZiB0aGUgaU1DVSBzaXplLiAgVGhlIHJpZ2h0IGFuZCBib3R0b20KKyAqIGltYWdlIGVkZ2VzIGFyZSBwYWRkZWQgb3V0IHRvIHRoZSBuZXh0IGlNQ1UgYm91bmRhcnkgd2l0aCBqdW5rIGRhdGE7IGJ1dAorICogbm8gcGFkZGluZyBpcyBwb3NzaWJsZSBhdCB0aGUgdG9wIGFuZCBsZWZ0IGVkZ2VzLiAgSWYgd2Ugd2VyZSB0byBmbGlwCisgKiB0aGUgd2hvbGUgaW1hZ2UgaW5jbHVkaW5nIHRoZSBwYWQgZGF0YSwgdGhlbiBwYWQgZ2FyYmFnZSB3b3VsZCBiZWNvbWUKKyAqIHZpc2libGUgYXQgdGhlIHRvcCBhbmQvb3IgbGVmdCwgYW5kIHJlYWwgcGl4ZWxzIHdvdWxkIGRpc2FwcGVhciBpbnRvIHRoZQorICogcGFkIG1hcmdpbnMgLS0tIHBlcmhhcHMgcGVybWFuZW50bHksIHNpbmNlIGVuY29kZXJzICYgZGVjb2RlcnMgbWF5IG5vdAorICogYm90aGVyIHRvIHByZXNlcnZlIERDVCBibG9ja3MgdGhhdCBhcHBlYXIgdG8gYmUgY29tcGxldGVseSBvdXRzaWRlIHRoZQorICogbm9taW5hbCBpbWFnZSBhcmVhLiAgU28sIHdlIGhhdmUgdG8gZXhjbHVkZSBhbnkgcGFydGlhbCBpTUNVcyBmcm9tIHRoZQorICogYmFzaWMgdHJhbnNmb3JtYXRpb24uCisgKgorICogVHJhbnNwb3NlIGlzIHRoZSBvbmx5IHRyYW5zZm9ybWF0aW9uIHRoYXQgY2FuIGhhbmRsZSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZQorICogcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyBjb21wbGV0ZWx5IGNsZWFubHkuICBmbGlwX2ggY2FuIGZsaXAgcGFydGlhbCBpTUNVcworICogYXQgdGhlIGJvdHRvbSwgYnV0IGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVcyBhdCB0aGUgcmlnaHQgZWRnZSB1bnRvdWNoZWQuCisgKiBTaW1pbGFybHkgZmxpcF92IGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVcyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLgorICogVGhlIG90aGVyIHRyYW5zZm9ybXMgYXJlIGRlZmluZWQgYXMgY29tYmluYXRpb25zIG9mIHRoZXNlIGJhc2ljIHRyYW5zZm9ybXMKKyAqIGFuZCBwcm9jZXNzIGVkZ2UgYmxvY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIHRoZSBlcXVpdmFsZW5jZS4KKyAqCisgKiBUaGUgInRyaW0iIG9wdGlvbiBjYXVzZXMgdW50cmFuc2Zvcm1hYmxlIHBhcnRpYWwgaU1DVXMgdG8gYmUgZHJvcHBlZDsKKyAqIHRoaXMgaXMgbm90IHN0cmljdGx5IGxvc3NsZXNzLCBidXQgaXQgdXN1YWxseSBnaXZlcyB0aGUgYmVzdC1sb29raW5nCisgKiByZXN1bHQgZm9yIG9kZC1zaXplIGltYWdlcy4gIE5vdGUgdGhhdCB3aGVuIHRoaXMgb3B0aW9uIGlzIGFjdGl2ZSwKKyAqIHRoZSBleHBlY3RlZCBtYXRoZW1hdGljYWwgZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybXMgbWF5IG5vdCBob2xkLgorICogKEZvciBleGFtcGxlLCAtcm90IDI3MCAtdHJpbSB0cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0IC1yb3QgOTAgLXRyaW0KKyAqIGZvbGxvd2VkIGJ5IC1yb3QgMTgwIC10cmltIHRyaW1zIGJvdGggZWRnZXMuKQorICoKKyAqIFdlIGFsc28gb2ZmZXIgYSAiZm9yY2UgdG8gZ3JheXNjYWxlIiBvcHRpb24sIHdoaWNoIHNpbXBseSBkaXNjYXJkcyB0aGUKKyAqIGNocm9taW5hbmNlIGNoYW5uZWxzIG9mIGEgWUNiQ3IgaW1hZ2UuICBUaGlzIGlzIGxvc3NsZXNzIGluIHRoZSBzZW5zZSB0aGF0CisgKiB0aGUgbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHkuICBJdCdzIG5vdCB0aGUgc2FtZSBraW5kIG9mCisgKiB0aGluZyBhcyB0aGUgcm90YXRlL2ZsaXAgdHJhbnNmb3JtYXRpb25zLCBidXQgaXQncyBjb252ZW5pZW50IHRvIGhhbmRsZSBpdAorICogYXMgcGFydCBvZiB0aGlzIHBhY2thZ2UsIG1haW5seSBiZWNhdXNlIHRoZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyBoYXZlIHRvCisgKiBiZSBhd2FyZSBvZiB0aGUgb3B0aW9uIHRvIGtub3cgaG93IG1hbnkgY29tcG9uZW50cyB0byB3b3JrIG9uLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogT3B0aW9uczogc2V0IGJ5IGNhbGxlciAqLworICBKWEZPUk1fQ09ERSB0cmFuc2Zvcm07CS8qIGltYWdlIHRyYW5zZm9ybSBvcGVyYXRvciAqLworICBib29sZWFuIHRyaW07CQkJLyogaWYgVFJVRSwgdHJpbSBwYXJ0aWFsIE1DVXMgYXMgbmVlZGVkICovCisgIGJvb2xlYW4gZm9yY2VfZ3JheXNjYWxlOwkvKiBpZiBUUlVFLCBjb252ZXJ0IGNvbG9yIGltYWdlIHRvIGdyYXlzY2FsZSAqLworCisgIC8qIEludGVybmFsIHdvcmtzcGFjZTogY2FsbGVyIHNob3VsZCBub3QgdG91Y2ggdGhlc2UgKi8KKyAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb21wb25lbnRzIGluIHdvcmtzcGFjZSAqLworICBqdmlydF9iYXJyYXlfcHRyICogd29ya3NwYWNlX2NvZWZfYXJyYXlzOyAvKiB3b3Jrc3BhY2UgZm9yIHRyYW5zZm9ybWF0aW9ucyAqLworfSBqcGVnX3RyYW5zZm9ybV9pbmZvOworCisKKyNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorCisvKiBSZXF1ZXN0IGFueSByZXF1aXJlZCB3b3Jrc3BhY2UgKi8KK0VYVEVSTih2b2lkKSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKKy8qIEFkanVzdCBvdXRwdXQgaW1hZ2UgcGFyYW1ldGVycyAqLworRVhURVJOKGp2aXJ0X2JhcnJheV9wdHIgKikganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOworLyogRXhlY3V0ZSB0aGUgYWN0dWFsIHRyYW5zZm9ybWF0aW9uLCBpZiBhbnkgKi8KK0VYVEVSTih2b2lkKSBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24KKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKKworI2VuZGlmIC8qIFRSQU5TRk9STVNfU1VQUE9SVEVEICovCisKKworLyoKKyAqIFN1cHBvcnQgZm9yIGNvcHlpbmcgb3B0aW9uYWwgbWFya2VycyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBmaWxlLgorICovCisKK3R5cGVkZWYgZW51bSB7CisJSkNPUFlPUFRfTk9ORSwJCS8qIGNvcHkgbm8gb3B0aW9uYWwgbWFya2VycyAqLworCUpDT1BZT1BUX0NPTU1FTlRTLAkvKiBjb3B5IG9ubHkgY29tbWVudCAoQ09NKSBtYXJrZXJzICovCisJSkNPUFlPUFRfQUxMCQkvKiBjb3B5IGFsbCBvcHRpb25hbCBtYXJrZXJzICovCit9IEpDT1BZX09QVElPTjsKKworI2RlZmluZSBKQ09QWU9QVF9ERUZBVUxUICBKQ09QWU9QVF9DT01NRU5UUwkvKiByZWNvbW1lbmRlZCBkZWZhdWx0ICovCisKKy8qIFNldHVwIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIHNhdmUgZGVzaXJlZCBtYXJrZXJzIGluIG1lbW9yeSAqLworRVhURVJOKHZvaWQpIGpjb3B5X21hcmtlcnNfc2V0dXAKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgSkNPUFlfT1BUSU9OIG9wdGlvbikpOworLyogQ29weSBtYXJrZXJzIHNhdmVkIGluIHRoZSBnaXZlbiBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KK0VYVEVSTih2b2lkKSBqY29weV9tYXJrZXJzX2V4ZWN1dGUKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICAgIEpDT1BZX09QVElPTiBvcHRpb24pKTsKZGlmZiAtLWdpdCBhL3VzYWdlLmRvYyBiL3VzYWdlLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQ5NzBhCi0tLSAvZGV2L251bGwKKysrIGIvdXNhZ2UuZG9jCkBAIC0wLDAgKzEsNTYyIEBACitVU0FHRSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBmaWxlIGRlc2NyaWJlcyB1c2FnZSBvZiB0aGUgSlBFRyBjb252ZXJzaW9uIHByb2dyYW1zIGNqcGVnIGFuZCBkanBlZywKK2FzIHdlbGwgYXMgdGhlIHV0aWxpdHkgcHJvZ3JhbXMganBlZ3RyYW4sIHJkanBnY29tIGFuZCB3cmpwZ2NvbS4gIChTZWUKK3RoZSBvdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IHdpdGhpbgoreW91ciBvd24gcHJvZ3JhbXMuKQorCitJZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lIHlvdSBtYXkgcHJlZmVyIHRvIHJlYWQgdGhlIFVuaXgtc3R5bGUgbWFudWFsCitwYWdlcyBpbiBmaWxlcyBjanBlZy4xLCBkanBlZy4xLCBqcGVndHJhbi4xLCByZGpwZ2NvbS4xLCB3cmpwZ2NvbS4xLgorCisKK0lOVFJPRFVDVElPTgorCitUaGVzZSBwcm9ncmFtcyBpbXBsZW1lbnQgSlBFRyBpbWFnZSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4gIEpQRUcKKyhwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24gbWV0aG9kIGZvciBmdWxsLWNvbG9yCithbmQgZ3JheS1zY2FsZSBpbWFnZXMuICBKUEVHIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSAicmVhbC13b3JsZCIgc2NlbmVzLAorZm9yIGV4YW1wbGUgc2Nhbm5lZCBwaG90b2dyYXBocy4gIENhcnRvb25zLCBsaW5lIGRyYXdpbmdzLCBhbmQgb3RoZXIKK25vbi1yZWFsaXN0aWMgaW1hZ2VzIGFyZSBub3QgSlBFRydzIHN0cm9uZyBzdWl0OyBvbiB0aGF0IHNvcnQgb2YgbWF0ZXJpYWwKK3lvdSBtYXkgZ2V0IHBvb3IgaW1hZ2UgcXVhbGl0eSBhbmQvb3IgbGl0dGxlIGNvbXByZXNzaW9uLgorCitKUEVHIGlzIGxvc3N5LCBtZWFuaW5nIHRoYXQgdGhlIG91dHB1dCBpbWFnZSBpcyBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIHRvCit0aGUgaW5wdXQgaW1hZ2UuICBIZW5jZSB5b3Ugc2hvdWxkIG5vdCB1c2UgSlBFRyBpZiB5b3UgaGF2ZSB0byBoYXZlIGlkZW50aWNhbAorb3V0cHV0IGJpdHMuICBIb3dldmVyLCBvbiB0eXBpY2FsIHJlYWwtd29ybGQgaW1hZ2VzLCB2ZXJ5IGdvb2QgY29tcHJlc3Npb24KK2xldmVscyBjYW4gYmUgb2J0YWluZWQgd2l0aCBubyB2aXNpYmxlIGNoYW5nZSwgYW5kIGFtYXppbmdseSBoaWdoIGNvbXByZXNzaW9uCitpcyBwb3NzaWJsZSBpZiB5b3UgY2FuIHRvbGVyYXRlIGEgbG93LXF1YWxpdHkgaW1hZ2UuICBZb3UgY2FuIHRyYWRlIG9mZiBpbWFnZQorcXVhbGl0eSBhZ2FpbnN0IGZpbGUgc2l6ZSBieSBhZGp1c3RpbmcgdGhlIGNvbXByZXNzb3IncyAicXVhbGl0eSIgc2V0dGluZy4KKworCitHRU5FUkFMIFVTQUdFCisKK1dlIHByb3ZpZGUgdHdvIHByb2dyYW1zLCBjanBlZyB0byBjb21wcmVzcyBhbiBpbWFnZSBmaWxlIGludG8gSlBFRyBmb3JtYXQsCithbmQgZGpwZWcgdG8gZGVjb21wcmVzcyBhIEpQRUcgZmlsZSBiYWNrIGludG8gYSBjb252ZW50aW9uYWwgaW1hZ2UgZm9ybWF0LgorCitPbiBVbml4LWxpa2Ugc3lzdGVtcywgeW91IHNheToKKwljanBlZyBbc3dpdGNoZXNdIFtpbWFnZWZpbGVdID5qcGVnZmlsZQorb3IKKwlkanBlZyBbc3dpdGNoZXNdIFtqcGVnZmlsZV0gID5pbWFnZWZpbGUKK1RoZSBwcm9ncmFtcyByZWFkIHRoZSBzcGVjaWZpZWQgaW5wdXQgZmlsZSwgb3Igc3RhbmRhcmQgaW5wdXQgaWYgbm9uZSBpcworbmFtZWQuICBUaGV5IGFsd2F5cyB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQgKHdpdGggdHJhY2UvZXJyb3IgbWVzc2FnZXMgdG8KK3N0YW5kYXJkIGVycm9yKS4gIFRoZXNlIGNvbnZlbnRpb25zIGFyZSBoYW5keSBmb3IgcGlwaW5nIGltYWdlcyBiZXR3ZWVuCitwcm9ncmFtcy4KKworT24gbW9zdCBub24tVW5peCBzeXN0ZW1zLCB5b3Ugc2F5OgorCWNqcGVnIFtzd2l0Y2hlc10gaW1hZ2VmaWxlIGpwZWdmaWxlCitvcgorCWRqcGVnIFtzd2l0Y2hlc10ganBlZ2ZpbGUgIGltYWdlZmlsZQoraS5lLiwgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBhcmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoaXMKK3N0eWxlIGlzIGEgbGl0dGxlIG1vcmUgZm9vbHByb29mLCBhbmQgaXQgbG9zZXMgbm8gZnVuY3Rpb25hbGl0eSBpZiB5b3UgZG9uJ3QKK2hhdmUgcGlwZXMuICAoWW91IGNhbiBnZXQgdGhpcyBzdHlsZSBvbiBVbml4IHRvbywgaWYgeW91IHByZWZlciwgYnkgZGVmaW5pbmcKK1RXT19GSUxFX0NPTU1BTkRMSU5FIHdoZW4geW91IGNvbXBpbGUgdGhlIHByb2dyYW1zOyBzZWUgaW5zdGFsbC5kb2MuKQorCitZb3UgY2FuIGFsc28gc2F5OgorCWNqcGVnIFtzd2l0Y2hlc10gLW91dGZpbGUganBlZ2ZpbGUgIGltYWdlZmlsZQorb3IKKwlkanBlZyBbc3dpdGNoZXNdIC1vdXRmaWxlIGltYWdlZmlsZSAganBlZ2ZpbGUKK1RoaXMgc3ludGF4IHdvcmtzIG9uIGFsbCBzeXN0ZW1zLCBzbyBpdCBpcyB1c2VmdWwgZm9yIHNjcmlwdHMuCisKK1RoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGltYWdlIGZpbGUgZm9ybWF0cyBhcmU6IFBQTSAoUEJNUExVUyBjb2xvciBmb3JtYXQpLAorUEdNIChQQk1QTFVTIGdyYXktc2NhbGUgZm9ybWF0KSwgQk1QLCBUYXJnYSwgYW5kIFJMRSAoVXRhaCBSYXN0ZXIgVG9vbGtpdAorZm9ybWF0KS4gIChSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCitjanBlZyByZWNvZ25pemVzIHRoZSBpbnB1dCBpbWFnZSBmb3JtYXQgYXV0b21hdGljYWxseSwgd2l0aCB0aGUgZXhjZXB0aW9uCitvZiBzb21lIFRhcmdhLWZvcm1hdCBmaWxlcy4gIFlvdSBoYXZlIHRvIHRlbGwgZGpwZWcgd2hpY2ggZm9ybWF0IHRvIGdlbmVyYXRlLgorCitKUEVHIGZpbGVzIGFyZSBpbiB0aGUgZGVmYWN0byBzdGFuZGFyZCBKRklGIGZpbGUgZm9ybWF0LiAgVGhlcmUgYXJlIG90aGVyLAorbGVzcyB3aWRlbHkgdXNlZCBKUEVHLWJhc2VkIGZpbGUgZm9ybWF0cywgYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhlbS4KKworQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLCAtZ3JheXNjYWxlIG1heSBiZSB3cml0dGVuCistZ3JheSBvciAtZ3IuICBNb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMKK29uZSBsZXR0ZXIuICBVcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudCAoLUJNUCBpcyB0aGUgc2FtZSBhcyAtYm1wKS4KK0JyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLCAtZ3JleXNjYWxlKSwgdGhvdWdoIGZvciBicmV2aXR5Cit0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KKworCitDSlBFRyBERVRBSUxTCisKK1RoZSBiYXNpYyBjb21tYW5kIGxpbmUgc3dpdGNoZXMgZm9yIGNqcGVnIGFyZToKKworCS1xdWFsaXR5IE4JU2NhbGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBhZGp1c3QgaW1hZ2UgcXVhbGl0eS4KKwkJCVF1YWxpdHkgaXMgMCAod29yc3QpIHRvIDEwMCAoYmVzdCk7IGRlZmF1bHQgaXMgNzUuCisJCQkoU2VlIGJlbG93IGZvciBtb3JlIGluZm8uKQorCisJLWdyYXlzY2FsZQlDcmVhdGUgbW9ub2Nocm9tZSBKUEVHIGZpbGUgZnJvbSBjb2xvciBpbnB1dC4KKwkJCUJlIHN1cmUgdG8gdXNlIHRoaXMgc3dpdGNoIHdoZW4gY29tcHJlc3NpbmcgYSBncmF5c2NhbGUKKwkJCUJNUCBmaWxlLCBiZWNhdXNlIGNqcGVnIGlzbid0IGJyaWdodCBlbm91Z2ggdG8gbm90aWNlCisJCQl3aGV0aGVyIGEgQk1QIGZpbGUgdXNlcyBvbmx5IHNoYWRlcyBvZiBncmF5LiAgQnkKKwkJCXNheWluZyAtZ3JheXNjYWxlLCB5b3UnbGwgZ2V0IGEgc21hbGxlciBKUEVHIGZpbGUgdGhhdAorCQkJdGFrZXMgbGVzcyB0aW1lIHRvIHByb2Nlc3MuCisKKwktb3B0aW1pemUJUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLgorCQkJV2l0aG91dCB0aGlzLCBkZWZhdWx0IGVuY29kaW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQuCisJCQktb3B0aW1pemUgdXN1YWxseSBtYWtlcyB0aGUgSlBFRyBmaWxlIGEgbGl0dGxlIHNtYWxsZXIsCisJCQlidXQgY2pwZWcgcnVucyBzb21ld2hhdCBzbG93ZXIgYW5kIG5lZWRzIG11Y2ggbW9yZQorCQkJbWVtb3J5LiAgSW1hZ2UgcXVhbGl0eSBhbmQgc3BlZWQgb2YgZGVjb21wcmVzc2lvbiBhcmUKKwkJCXVuYWZmZWN0ZWQgYnkgLW9wdGltaXplLgorCisJLXByb2dyZXNzaXZlCUNyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKHNlZSBiZWxvdykuCisKKwktdGFyZ2EJCUlucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAgVGFyZ2EgZmlsZXMgdGhhdCBjb250YWluCisJCQlhbiAiaWRlbnRpZmljYXRpb24iIGZpZWxkIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkKKwkJCXJlY29nbml6ZWQgYnkgY2pwZWc7IGZvciBzdWNoIGZpbGVzIHlvdSBtdXN0IHNwZWNpZnkKKwkJCS10YXJnYSB0byBtYWtlIGNqcGVnIHRyZWF0IHRoZSBpbnB1dCBhcyBUYXJnYSBmb3JtYXQuCisJCQlGb3IgbW9zdCBUYXJnYSBmaWxlcywgeW91IHdvbid0IG5lZWQgdGhpcyBzd2l0Y2guCisKK1RoZSAtcXVhbGl0eSBzd2l0Y2ggbGV0cyB5b3UgdHJhZGUgb2ZmIGNvbXByZXNzZWQgZmlsZSBzaXplIGFnYWluc3QgcXVhbGl0eSBvZgordGhlIHJlY29uc3RydWN0ZWQgaW1hZ2U6IHRoZSBoaWdoZXIgdGhlIHF1YWxpdHkgc2V0dGluZywgdGhlIGxhcmdlciB0aGUgSlBFRworZmlsZSwgYW5kIHRoZSBjbG9zZXIgdGhlIG91dHB1dCBpbWFnZSB3aWxsIGJlIHRvIHRoZSBvcmlnaW5hbCBpbnB1dC4gIE5vcm1hbGx5Cit5b3Ugd2FudCB0byB1c2UgdGhlIGxvd2VzdCBxdWFsaXR5IHNldHRpbmcgKHNtYWxsZXN0IGZpbGUpIHRoYXQgZGVjb21wcmVzc2VzCitpbnRvIHNvbWV0aGluZyB2aXN1YWxseSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBvcmlnaW5hbCBpbWFnZS4gIEZvciB0aGlzCitwdXJwb3NlIHRoZSBxdWFsaXR5IHNldHRpbmcgc2hvdWxkIGJlIGJldHdlZW4gNTAgYW5kIDk1OyB0aGUgZGVmYXVsdCBvZiA3NSBpcworb2Z0ZW4gYWJvdXQgcmlnaHQuICBJZiB5b3Ugc2VlIGRlZmVjdHMgYXQgLXF1YWxpdHkgNzUsIHRoZW4gZ28gdXAgNSBvciAxMAorY291bnRzIGF0IGEgdGltZSB1bnRpbCB5b3UgYXJlIGhhcHB5IHdpdGggdGhlIG91dHB1dCBpbWFnZS4gIChUaGUgb3B0aW1hbAorc2V0dGluZyB3aWxsIHZhcnkgZnJvbSBvbmUgaW1hZ2UgdG8gYW5vdGhlci4pCisKKy1xdWFsaXR5IDEwMCB3aWxsIGdlbmVyYXRlIGEgcXVhbnRpemF0aW9uIHRhYmxlIG9mIGFsbCAxJ3MsIG1pbmltaXppbmcgbG9zcworaW4gdGhlIHF1YW50aXphdGlvbiBzdGVwIChidXQgdGhlcmUgaXMgc3RpbGwgaW5mb3JtYXRpb24gbG9zcyBpbiBzdWJzYW1wbGluZywKK2FzIHdlbGwgYXMgcm91bmRvZmYgZXJyb3IpLiAgVGhpcyBzZXR0aW5nIGlzIG1haW5seSBvZiBpbnRlcmVzdCBmb3IKK2V4cGVyaW1lbnRhbCBwdXJwb3Nlcy4gIFF1YWxpdHkgdmFsdWVzIGFib3ZlIGFib3V0IDk1IGFyZSBOT1QgcmVjb21tZW5kZWQgZm9yCitub3JtYWwgdXNlOyB0aGUgY29tcHJlc3NlZCBmaWxlIHNpemUgZ29lcyB1cCBkcmFtYXRpY2FsbHkgZm9yIGhhcmRseSBhbnkgZ2FpbgoraW4gb3V0cHV0IGltYWdlIHF1YWxpdHkuCisKK0luIHRoZSBvdGhlciBkaXJlY3Rpb24sIHF1YWxpdHkgdmFsdWVzIGJlbG93IDUwIHdpbGwgcHJvZHVjZSB2ZXJ5IHNtYWxsIGZpbGVzCitvZiBsb3cgaW1hZ2UgcXVhbGl0eS4gIFNldHRpbmdzIGFyb3VuZCA1IHRvIDEwIG1pZ2h0IGJlIHVzZWZ1bCBpbiBwcmVwYXJpbmcgYW4KK2luZGV4IG9mIGEgbGFyZ2UgaW1hZ2UgbGlicmFyeSwgZm9yIGV4YW1wbGUuICBUcnkgLXF1YWxpdHkgMiAob3Igc28pIGZvciBzb21lCithbXVzaW5nIEN1YmlzdCBlZmZlY3RzLiAgKE5vdGU6IHF1YWxpdHkgdmFsdWVzIGJlbG93IGFib3V0IDI1IGdlbmVyYXRlIDItYnl0ZQorcXVhbnRpemF0aW9uIHRhYmxlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgb3B0aW9uYWwgaW4gdGhlIEpQRUcgc3RhbmRhcmQuCitjanBlZyBlbWl0cyBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHlvdSBnaXZlIHN1Y2ggYSBxdWFsaXR5IHZhbHVlLCBiZWNhdXNlIHNvbWUKK290aGVyIEpQRUcgcHJvZ3JhbXMgbWF5IGJlIHVuYWJsZSB0byBkZWNvZGUgdGhlIHJlc3VsdGluZyBmaWxlLiAgVXNlIC1iYXNlbGluZQoraWYgeW91IG5lZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYXQgbG93IHF1YWxpdHkgdmFsdWVzLikKKworVGhlIC1wcm9ncmVzc2l2ZSBzd2l0Y2ggY3JlYXRlcyBhICJwcm9ncmVzc2l2ZSBKUEVHIiBmaWxlLiAgSW4gdGhpcyB0eXBlIG9mCitKUEVHIGZpbGUsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiBtdWx0aXBsZSBzY2FucyBvZiBpbmNyZWFzaW5nIHF1YWxpdHkuICBJZiB0aGUKK2ZpbGUgaXMgYmVpbmcgdHJhbnNtaXR0ZWQgb3ZlciBhIHNsb3cgY29tbXVuaWNhdGlvbnMgbGluaywgdGhlIGRlY29kZXIgY2FuIHVzZQordGhlIGZpcnN0IHNjYW4gdG8gZGlzcGxheSBhIGxvdy1xdWFsaXR5IGltYWdlIHZlcnkgcXVpY2tseSwgYW5kIGNhbiB0aGVuCitpbXByb3ZlIHRoZSBkaXNwbGF5IHdpdGggZWFjaCBzdWJzZXF1ZW50IHNjYW4uICBUaGUgZmluYWwgaW1hZ2UgaXMgZXhhY3RseQorZXF1aXZhbGVudCB0byBhIHN0YW5kYXJkIEpQRUcgZmlsZSBvZiB0aGUgc2FtZSBxdWFsaXR5IHNldHRpbmcsIGFuZCB0aGUgdG90YWwKK2ZpbGUgc2l6ZSBpcyBhYm91dCB0aGUgc2FtZSAtLS0gb2Z0ZW4gYSBsaXR0bGUgc21hbGxlci4gIENBVVRJT046IHByb2dyZXNzaXZlCitKUEVHIGlzIG5vdCB5ZXQgd2lkZWx5IGltcGxlbWVudGVkLCBzbyBtYW55IGRlY29kZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHZpZXcgYQorcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIGF0IGFsbC4KKworU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgorCisJLWRjdCBpbnQJVXNlIGludGVnZXIgRENUIG1ldGhvZCAoZGVmYXVsdCkuCisJLWRjdCBmYXN0CVVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKS4KKwktZGN0IGZsb2F0CVVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kLgorCQkJVGhlIGZsb2F0IG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbgorCQkJdGhlIGludCBtZXRob2QsIGJ1dCBpcyBtdWNoIHNsb3dlciB1bmxlc3MgeW91ciBtYWNoaW5lCisJCQloYXMgdmVyeSBmYXN0IGZsb2F0aW5nLXBvaW50IGhhcmR3YXJlLiAgQWxzbyBub3RlIHRoYXQKKwkJCXJlc3VsdHMgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgdmFyeSBzbGlnaHRseQorCQkJYWNyb3NzIG1hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlCisJCQl0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuICBUaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZAorCQkJaXMgbXVjaCBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3by4KKworCS1yZXN0YXJ0IE4JRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkKKwkJCU4gTUNVIGJsb2NrcyBpZiAiQiIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KKwkJCS1yZXN0YXJ0IDAgKHRoZSBkZWZhdWx0KSBtZWFucyBubyByZXN0YXJ0IG1hcmtlcnMuCisKKwktc21vb3RoIE4JU21vb3RoIHRoZSBpbnB1dCBpbWFnZSB0byBlbGltaW5hdGUgZGl0aGVyaW5nIG5vaXNlLgorCQkJTiwgcmFuZ2luZyBmcm9tIDEgdG8gMTAwLCBpbmRpY2F0ZXMgdGhlIHN0cmVuZ3RoIG9mCisJCQlzbW9vdGhpbmcuICAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gc21vb3RoaW5nLgorCisJLW1heG1lbW9yeSBOCVNldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZworCQkJbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMgaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvcgorCQkJbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCisJCQlGb3IgZXhhbXBsZSwgLW1heCA0bSBzZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlCisJCQlzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCisKKwktdmVyYm9zZQlFbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlIC12J3MgZ2l2ZSBtb3JlIHByaW50b3V0LgorCW9yICAtZGVidWcJQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCisKK1RoZSAtcmVzdGFydCBvcHRpb24gaW5zZXJ0cyBleHRyYSBtYXJrZXJzIHRoYXQgYWxsb3cgYSBKUEVHIGRlY29kZXIgdG8KK3Jlc3luY2hyb25pemUgYWZ0ZXIgYSB0cmFuc21pc3Npb24gZXJyb3IuICBXaXRob3V0IHJlc3RhcnQgbWFya2VycywgYW55IGRhbWFnZQordG8gYSBjb21wcmVzc2VkIGZpbGUgd2lsbCB1c3VhbGx5IHJ1aW4gdGhlIGltYWdlIGZyb20gdGhlIHBvaW50IG9mIHRoZSBlcnJvcgordG8gdGhlIGVuZCBvZiB0aGUgaW1hZ2U7IHdpdGggcmVzdGFydCBtYXJrZXJzLCB0aGUgZGFtYWdlIGlzIHVzdWFsbHkgY29uZmluZWQKK3RvIHRoZSBwb3J0aW9uIG9mIHRoZSBpbWFnZSB1cCB0byB0aGUgbmV4dCByZXN0YXJ0IG1hcmtlci4gIE9mIGNvdXJzZSwgdGhlCityZXN0YXJ0IG1hcmtlcnMgb2NjdXB5IGV4dHJhIHNwYWNlLiAgV2UgcmVjb21tZW5kIC1yZXN0YXJ0IDEgZm9yIGltYWdlcyB0aGF0Cit3aWxsIGJlIHRyYW5zbWl0dGVkIGFjcm9zcyB1bnJlbGlhYmxlIG5ldHdvcmtzIHN1Y2ggYXMgVXNlbmV0LgorCitUaGUgLXNtb290aCBvcHRpb24gZmlsdGVycyB0aGUgaW5wdXQgdG8gZWxpbWluYXRlIGZpbmUtc2NhbGUgbm9pc2UuICBUaGlzIGlzCitvZnRlbiB1c2VmdWwgd2hlbiBjb252ZXJ0aW5nIGRpdGhlcmVkIGltYWdlcyB0byBKUEVHOiBhIG1vZGVyYXRlIHNtb290aGluZworZmFjdG9yIG9mIDEwIHRvIDUwIGdldHMgcmlkIG9mIGRpdGhlcmluZyBwYXR0ZXJucyBpbiB0aGUgaW5wdXQgZmlsZSwgcmVzdWx0aW5nCitpbiBhIHNtYWxsZXIgSlBFRyBmaWxlIGFuZCBhIGJldHRlci1sb29raW5nIGltYWdlLiAgVG9vIGxhcmdlIGEgc21vb3RoaW5nCitmYWN0b3Igd2lsbCB2aXNpYmx5IGJsdXIgdGhlIGltYWdlLCBob3dldmVyLgorCitTd2l0Y2hlcyBmb3Igd2l6YXJkczoKKworCS1iYXNlbGluZQlGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYmUKKwkJCWdlbmVyYXRlZC4gIFRoaXMgY2xhbXBzIHF1YW50aXphdGlvbiB2YWx1ZXMgdG8gOCBiaXRzCisJCQlldmVuIGF0IGxvdyBxdWFsaXR5IHNldHRpbmdzLiAgKFRoaXMgc3dpdGNoIGlzIHBvb3JseQorCQkJbmFtZWQsIHNpbmNlIGl0IGRvZXMgbm90IGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgaXMKKwkJCWFjdHVhbGx5IGJhc2VsaW5lIEpQRUcuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UKKwkJCS1iYXNlbGluZSBhbmQgLXByb2dyZXNzaXZlIHRvZ2V0aGVyLikKKworCS1xdGFibGVzIGZpbGUJVXNlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIHRoZSBzcGVjaWZpZWQKKwkJCXRleHQgZmlsZS4KKworCS1xc2xvdHMgTlssLi4uXSBTZWxlY3Qgd2hpY2ggcXVhbnRpemF0aW9uIHRhYmxlIHRvIHVzZSBmb3IgZWFjaCBjb2xvcgorCQkJY29tcG9uZW50LgorCisJLXNhbXBsZSBIeFZbLC4uLl0gIFNldCBKUEVHIHNhbXBsaW5nIGZhY3RvcnMgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgorCisJLXNjYW5zIGZpbGUJVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KKworVGhlICJ3aXphcmQiIHN3aXRjaGVzIGFyZSBpbnRlbmRlZCBmb3IgZXhwZXJpbWVudGF0aW9uIHdpdGggSlBFRy4gIElmIHlvdQorZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcsIERPTidUIFVTRSBUSEVNLiAgVGhlc2Ugc3dpdGNoZXMgYXJlIGRvY3VtZW50ZWQKK2Z1cnRoZXIgaW4gdGhlIGZpbGUgd2l6YXJkLmRvYy4KKworCitESlBFRyBERVRBSUxTCisKK1RoZSBiYXNpYyBjb21tYW5kIGxpbmUgc3dpdGNoZXMgZm9yIGRqcGVnIGFyZToKKworCS1jb2xvcnMgTglSZWR1Y2UgaW1hZ2UgdG8gYXQgbW9zdCBOIGNvbG9ycy4gIFRoaXMgcmVkdWNlcyB0aGUKKwlvciAtcXVhbnRpemUgTgludW1iZXIgb2YgY29sb3JzIHVzZWQgaW4gdGhlIG91dHB1dCBpbWFnZSwgc28gdGhhdCBpdAorCQkJY2FuIGJlIGRpc3BsYXllZCBvbiBhIGNvbG9ybWFwcGVkIGRpc3BsYXkgb3Igc3RvcmVkIGluCisJCQlhIGNvbG9ybWFwcGVkIGZpbGUgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCisJCQlhbiA4LWJpdCBkaXNwbGF5LCB5b3UnZCBuZWVkIHRvIHJlZHVjZSB0byAyNTYgb3IgZmV3ZXIKKwkJCWNvbG9ycy4gICgtY29sb3JzIGlzIHRoZSByZWNvbW1lbmRlZCBuYW1lLCAtcXVhbnRpemUKKwkJCWlzIHByb3ZpZGVkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LikKKworCS1mYXN0CQlTZWxlY3QgcmVjb21tZW5kZWQgcHJvY2Vzc2luZyBvcHRpb25zIGZvciBmYXN0LCBsb3cKKwkJCXF1YWxpdHkgb3V0cHV0LiAgKFRoZSBkZWZhdWx0IG9wdGlvbnMgYXJlIGNob3NlbiBmb3IKKwkJCWhpZ2hlc3QgcXVhbGl0eSBvdXRwdXQuKSAgQ3VycmVudGx5LCB0aGlzIGlzIGVxdWl2YWxlbnQKKwkJCXRvICItZGN0IGZhc3QgLW5vc21vb3RoIC1vbmVwYXNzIC1kaXRoZXIgb3JkZXJlZCIuCisKKwktZ3JheXNjYWxlCUZvcmNlIGdyYXktc2NhbGUgb3V0cHV0IGV2ZW4gaWYgSlBFRyBmaWxlIGlzIGNvbG9yLgorCQkJVXNlZnVsIGZvciB2aWV3aW5nIG9uIG1vbm9jaHJvbWUgZGlzcGxheXM7IGFsc28sCisJCQlkanBlZyBydW5zIG5vdGljZWFibHkgZmFzdGVyIGluIHRoaXMgbW9kZS4KKworCS1zY2FsZSBNL04JU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZhY3RvciBNL04uICBDdXJyZW50bHkKKwkJCXRoZSBzY2FsZSBmYWN0b3IgbXVzdCBiZSAxLzEsIDEvMiwgMS80LCBvciAxLzguCisJCQlTY2FsaW5nIGlzIGhhbmR5IGlmIHRoZSBpbWFnZSBpcyBsYXJnZXIgdGhhbiB5b3VyCisJCQlzY3JlZW47IGFsc28sIGRqcGVnIHJ1bnMgbXVjaCBmYXN0ZXIgd2hlbiBzY2FsaW5nCisJCQlkb3duIHRoZSBvdXRwdXQuCisKKwktYm1wCQlTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKFdpbmRvd3MgZmxhdm9yKS4gIDgtYml0CisJCQljb2xvcm1hcHBlZCBmb3JtYXQgaXMgZW1pdHRlZCBpZiAtY29sb3JzIG9yIC1ncmF5c2NhbGUKKwkJCWlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIEpQRUcgZmlsZSBpcyBncmF5LXNjYWxlOworCQkJb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvciBmb3JtYXQgaXMgZW1pdHRlZC4KKworCS1naWYJCVNlbGVjdCBHSUYgb3V0cHV0IGZvcm1hdC4gIFNpbmNlIEdJRiBkb2VzIG5vdCBzdXBwb3J0CisJCQltb3JlIHRoYW4gMjU2IGNvbG9ycywgLWNvbG9ycyAyNTYgaXMgYXNzdW1lZCAodW5sZXNzCisJCQl5b3Ugc3BlY2lmeSBhIHNtYWxsZXIgbnVtYmVyIG9mIGNvbG9ycykuICBJZiB5b3UKKwkJCXNwZWNpZnkgLWZhc3QsIHRoZSBkZWZhdWx0IG51bWJlciBvZiBjb2xvcnMgaXMgMjE2LgorCisJLW9zMgkJU2VsZWN0IEJNUCBvdXRwdXQgZm9ybWF0IChPUy8yIDEueCBmbGF2b3IpLiAgOC1iaXQKKwkJCWNvbG9ybWFwcGVkIGZvcm1hdCBpcyBlbWl0dGVkIGlmIC1jb2xvcnMgb3IgLWdyYXlzY2FsZQorCQkJaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7CisJCQlvdGhlcndpc2UsIDI0LWJpdCBmdWxsLWNvbG9yIGZvcm1hdCBpcyBlbWl0dGVkLgorCisJLXBubQkJU2VsZWN0IFBCTVBMVVMgKFBQTS9QR00pIG91dHB1dCBmb3JtYXQgKHRoaXMgaXMgdGhlCisJCQlkZWZhdWx0IGZvcm1hdCkuICBQR00gaXMgZW1pdHRlZCBpZiB0aGUgSlBFRyBmaWxlIGlzCisJCQlncmF5LXNjYWxlIG9yIGlmIC1ncmF5c2NhbGUgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UKKwkJCVBQTSBpcyBlbWl0dGVkLgorCisJLXJsZQkJU2VsZWN0IFJMRSBvdXRwdXQgZm9ybWF0LiAgKFJlcXVpcmVzIFVSVCBsaWJyYXJ5LikKKworCS10YXJnYQkJU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQuICBHcmF5LXNjYWxlIGZvcm1hdCBpcworCQkJZW1pdHRlZCBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGUgb3IgaWYKKwkJCS1ncmF5c2NhbGUgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UsIGNvbG9ybWFwcGVkIGZvcm1hdAorCQkJaXMgZW1pdHRlZCBpZiAtY29sb3JzIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlLCAyNC1iaXQKKwkJCWZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCisKK1N3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKKworCS1kY3QgaW50CVVzZSBpbnRlZ2VyIERDVCBtZXRob2QgKGRlZmF1bHQpLgorCS1kY3QgZmFzdAlVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSkuCisJLWRjdCBmbG9hdAlVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZC4KKwkJCVRoZSBmbG9hdCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4KKwkJCXRoZSBpbnQgbWV0aG9kLCBidXQgaXMgbXVjaCBzbG93ZXIgdW5sZXNzIHlvdXIgbWFjaGluZQorCQkJaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28gbm90ZSB0aGF0CisJCQlyZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkKKwkJCWFjcm9zcyBtYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZQorCQkJdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLiAgVGhlIGZhc3QgaW50ZWdlciBtZXRob2QKKwkJCWlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCisKKwktZGl0aGVyIGZzCVVzZSBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KKwktZGl0aGVyIG9yZGVyZWQJVXNlIG9yZGVyZWQgZGl0aGVyaW5nIGluIGNvbG9yIHF1YW50aXphdGlvbi4KKwktZGl0aGVyIG5vbmUJRG8gbm90IHVzZSBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorCQkJQnkgZGVmYXVsdCwgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyBpcyBhcHBsaWVkIHdoZW4KKwkJCXF1YW50aXppbmcgY29sb3JzOyB0aGlzIGlzIHNsb3cgYnV0IHVzdWFsbHkgcHJvZHVjZXMKKwkJCXRoZSBiZXN0IHJlc3VsdHMuICBPcmRlcmVkIGRpdGhlciBpcyBhIGNvbXByb21pc2UKKwkJCWJldHdlZW4gc3BlZWQgYW5kIHF1YWxpdHk7IG5vIGRpdGhlcmluZyBpcyBmYXN0IGJ1dAorCQkJdXN1YWxseSBsb29rcyBhd2Z1bC4gIE5vdGUgdGhhdCB0aGVzZSBzd2l0Y2hlcyBoYXZlCisJCQlubyBlZmZlY3QgdW5sZXNzIGNvbG9yIHF1YW50aXphdGlvbiBpcyBiZWluZyBkb25lLgorCQkJT3JkZXJlZCBkaXRoZXIgaXMgb25seSBhdmFpbGFibGUgaW4gLW9uZXBhc3MgbW9kZS4KKworCS1tYXAgRklMRQlRdWFudGl6ZSB0byB0aGUgY29sb3JzIHVzZWQgaW4gdGhlIHNwZWNpZmllZCBpbWFnZQorCQkJZmlsZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBwcm9kdWNpbmcgbXVsdGlwbGUgZmlsZXMKKwkJCXdpdGggaWRlbnRpY2FsIGNvbG9yIG1hcHMsIG9yIGZvciBmb3JjaW5nIGEgcHJlZGVmaW5lZAorCQkJc2V0IG9mIGNvbG9ycyB0byBiZSB1c2VkLiAgVGhlIEZJTEUgbXVzdCBiZSBhIEdJRgorCQkJb3IgUFBNIGZpbGUuICBUaGlzIG9wdGlvbiBvdmVycmlkZXMgLWNvbG9ycyBhbmQKKwkJCS1vbmVwYXNzLgorCisJLW5vc21vb3RoCVVzZSBhIGZhc3RlciwgbG93ZXItcXVhbGl0eSB1cHNhbXBsaW5nIHJvdXRpbmUuCisKKwktb25lcGFzcwlVc2Ugb25lLXBhc3MgaW5zdGVhZCBvZiB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisJCQlUaGUgb25lLXBhc3MgbWV0aG9kIGlzIGZhc3RlciBhbmQgbmVlZHMgbGVzcyBtZW1vcnksCisJCQlidXQgaXQgcHJvZHVjZXMgYSBsb3dlci1xdWFsaXR5IGltYWdlLiAgLW9uZXBhc3MgaXMKKwkJCWlnbm9yZWQgdW5sZXNzIHlvdSBhbHNvIHNheSAtY29sb3JzIE4uICBBbHNvLAorCQkJdGhlIG9uZS1wYXNzIG1ldGhvZCBpcyBhbHdheXMgdXNlZCBmb3IgZ3JheS1zY2FsZQorCQkJb3V0cHV0ICh0aGUgdHdvLXBhc3MgbWV0aG9kIGlzIG5vIGltcHJvdmVtZW50IHRoZW4pLgorCisJLW1heG1lbW9yeSBOCVNldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZworCQkJbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMgaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvcgorCQkJbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCisJCQlGb3IgZXhhbXBsZSwgLW1heCA0bSBzZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlCisJCQlzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCisKKwktdmVyYm9zZQlFbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlIC12J3MgZ2l2ZSBtb3JlIHByaW50b3V0LgorCW9yICAtZGVidWcJQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCisKKworSElOVFMgRk9SIENKUEVHCisKK0NvbG9yIEdJRiBmaWxlcyBhcmUgbm90IHRoZSBpZGVhbCBpbnB1dCBmb3IgSlBFRzsgSlBFRyBpcyByZWFsbHkgaW50ZW5kZWQgZm9yCitjb21wcmVzc2luZyBmdWxsLWNvbG9yICgyNC1iaXQpIGltYWdlcy4gIEluIHBhcnRpY3VsYXIsIGRvbid0IHRyeSB0byBjb252ZXJ0CitjYXJ0b29ucywgbGluZSBkcmF3aW5ncywgYW5kIG90aGVyIGltYWdlcyB0aGF0IGhhdmUgb25seSBhIGZldyBkaXN0aW5jdAorY29sb3JzLiAgR0lGIHdvcmtzIGdyZWF0IG9uIHRoZXNlLCBKUEVHIGRvZXMgbm90LiAgSWYgeW91IHdhbnQgdG8gY29udmVydCBhCitHSUYgdG8gSlBFRywgeW91IHNob3VsZCBleHBlcmltZW50IHdpdGggY2pwZWcncyAtcXVhbGl0eSBhbmQgLXNtb290aCBvcHRpb25zCit0byBnZXQgYSBzYXRpc2ZhY3RvcnkgY29udmVyc2lvbi4gIC1zbW9vdGggMTAgb3Igc28gaXMgb2Z0ZW4gaGVscGZ1bC4KKworQXZvaWQgcnVubmluZyBhbiBpbWFnZSB0aHJvdWdoIGEgc2VyaWVzIG9mIEpQRUcgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbgorY3ljbGVzLiAgSW1hZ2UgcXVhbGl0eSBsb3NzIHdpbGwgYWNjdW11bGF0ZTsgYWZ0ZXIgdGVuIG9yIHNvIGN5Y2xlcyB0aGUgaW1hZ2UKK21heSBiZSBub3RpY2VhYmx5IHdvcnNlIHRoYW4gaXQgd2FzIGFmdGVyIG9uZSBjeWNsZS4gIEl0J3MgYmVzdCB0byB1c2UgYQorbG9zc2xlc3MgZm9ybWF0IHdoaWxlIG1hbmlwdWxhdGluZyBhbiBpbWFnZSwgdGhlbiBjb252ZXJ0IHRvIEpQRUcgZm9ybWF0IHdoZW4KK3lvdSBhcmUgcmVhZHkgdG8gZmlsZSB0aGUgaW1hZ2UgYXdheS4KKworVGhlIC1vcHRpbWl6ZSBvcHRpb24gdG8gY2pwZWcgaXMgd29ydGggdXNpbmcgd2hlbiB5b3UgYXJlIG1ha2luZyBhICJmaW5hbCIKK3ZlcnNpb24gZm9yIHBvc3Rpbmcgb3IgYXJjaGl2aW5nLiAgSXQncyBhbHNvIGEgd2luIHdoZW4geW91IGFyZSB1c2luZyBsb3cKK3F1YWxpdHkgc2V0dGluZ3MgdG8gbWFrZSB2ZXJ5IHNtYWxsIEpQRUcgZmlsZXM7IHRoZSBwZXJjZW50YWdlIGltcHJvdmVtZW50CitpcyBvZnRlbiBhIGxvdCBtb3JlIHRoYW4gaXQgaXMgb24gbGFyZ2VyIGZpbGVzLiAgKEF0IHByZXNlbnQsIC1vcHRpbWl6ZQorbW9kZSBpcyBhbHdheXMgc2VsZWN0ZWQgd2hlbiBnZW5lcmF0aW5nIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMuKQorCitHSUYgaW5wdXQgZmlsZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHRvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudC4KK1VzZSBhIFVuaXN5cy1saWNlbnNlZCBwcm9ncmFtIGlmIHlvdSBuZWVkIHRvIHJlYWQgYSBHSUYgZmlsZS4gIChDb252ZXJzaW9uCitvZiBHSUYgZmlsZXMgdG8gSlBFRyBpcyB1c3VhbGx5IGEgYmFkIGlkZWEgYW55d2F5LikKKworCitISU5UUyBGT1IgREpQRUcKKworVG8gZ2V0IGEgcXVpY2sgcHJldmlldyBvZiBhbiBpbWFnZSwgdXNlIHRoZSAtZ3JheXNjYWxlIGFuZC9vciAtc2NhbGUgc3dpdGNoZXMuCisiLWdyYXlzY2FsZSAtc2NhbGUgMS84IiBpcyB0aGUgZmFzdGVzdCBjYXNlLgorCitTZXZlcmFsIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB0aGF0IHRyYWRlIG9mZiBpbWFnZSBxdWFsaXR5IHRvIGdhaW4gc3BlZWQuCisiLWZhc3QiIHR1cm5zIG9uIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5ncy4KKworIi1kY3QgZmFzdCIgYW5kL29yICItbm9zbW9vdGgiIGdhaW4gc3BlZWQgYXQgYSBzbWFsbCBzYWNyaWZpY2UgaW4gcXVhbGl0eS4KK1doZW4gcHJvZHVjaW5nIGEgY29sb3ItcXVhbnRpemVkIGltYWdlLCAiLW9uZXBhc3MgLWRpdGhlciBvcmRlcmVkIiBpcyBmYXN0IGJ1dAorbXVjaCBsb3dlciBxdWFsaXR5IHRoYW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IuICAiLWRpdGhlciBub25lIiBtYXkgZ2l2ZQorYWNjZXB0YWJsZSByZXN1bHRzIGluIHR3by1wYXNzIG1vZGUsIGJ1dCBpcyBzZWxkb20gdG9sZXJhYmxlIGluIG9uZS1wYXNzIG1vZGUuCisKK0lmIHlvdSBhcmUgZm9ydHVuYXRlIGVub3VnaCB0byBoYXZlIHZlcnkgZmFzdCBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSwKKyItZGN0IGZsb2F0IiBtYXkgYmUgZXZlbiBmYXN0ZXIgdGhhbiAiLWRjdCBmYXN0Ii4gIEJ1dCBvbiBtb3N0IG1hY2hpbmVzCisiLWRjdCBmbG9hdCIgaXMgc2xvd2VyIHRoYW4gIi1kY3QgaW50IjsgaW4gdGhpcyBjYXNlIGl0IGlzIG5vdCB3b3J0aCB1c2luZywKK2JlY2F1c2UgaXRzIHRoZW9yZXRpY2FsIGFjY3VyYWN5IGFkdmFudGFnZSBpcyB0b28gc21hbGwgdG8gYmUgc2lnbmlmaWNhbnQKK2luIHByYWN0aWNlLgorCitUd28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gcmVxdWlyZXMgYSBnb29kIGRlYWwgb2YgbWVtb3J5OyBvbiBNUy1ET1MgbWFjaGluZXMKK2l0IG1heSBydW4gb3V0IG9mIG1lbW9yeSBldmVuIHdpdGggLW1heG1lbW9yeSAwLiAgSW4gdGhhdCBjYXNlIHlvdSBjYW4gc3RpbGwKK2RlY29tcHJlc3MsIHdpdGggc29tZSBsb3NzIG9mIGltYWdlIHF1YWxpdHksIGJ5IHNwZWNpZnlpbmcgLW9uZXBhc3MgZm9yCitvbmUtcGFzcyBxdWFudGl6YXRpb24uCisKK1RvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudCwgZGpwZWcgcHJvZHVjZXMgdW5jb21wcmVzc2VkIEdJRiBmaWxlcy4gIFRoZXNlCithcmUgbGFyZ2VyIHRoYW4gdGhleSBzaG91bGQgYmUsIGJ1dCBhcmUgcmVhZGFibGUgYnkgc3RhbmRhcmQgR0lGIGRlY29kZXJzLgorCisKK0hJTlRTIEZPUiBCT1RIIFBST0dSQU1TCisKK0lmIG1vcmUgc3BhY2UgaXMgbmVlZGVkIHRoYW4gd2lsbCBmaXQgaW4gdGhlIGF2YWlsYWJsZSBtYWluIG1lbW9yeSAoYXMKK2RldGVybWluZWQgYnkgLW1heG1lbW9yeSksIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuICAoTVMtRE9TIHZlcnNpb25zCit3aWxsIHRyeSB0byBnZXQgZXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGZpcnN0LikgIFRoZSB0ZW1wb3JhcnkgZmlsZXMgYXJlCitvZnRlbiByYXRoZXIgbGFyZ2U6IGluIHR5cGljYWwgY2FzZXMgdGhleSBvY2N1cHkgdGhyZWUgYnl0ZXMgcGVyIHBpeGVsLCBmb3IKK2V4YW1wbGUgMyo4MDAqNjAwID0gMS40NE1iIGZvciBhbiA4MDB4NjAwIGltYWdlLiAgSWYgeW91IGRvbid0IGhhdmUgZW5vdWdoCitmcmVlIGRpc2sgc3BhY2UsIGxlYXZlIG91dCAtcHJvZ3Jlc3NpdmUgYW5kIC1vcHRpbWl6ZSAoZm9yIGNqcGVnKSBvciBzcGVjaWZ5Cistb25lcGFzcyAoZm9yIGRqcGVnKS4KKworT24gTVMtRE9TLCB0aGUgdGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIFRNUAorb3IgVEVNUCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5laXRoZXIgb2YgdGhvc2UKK2V4aXN0LiAgQW1pZ2EgaW1wbGVtZW50YXRpb25zIHB1dCB0aGUgdGVtcCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5CitKUEVHVE1QOiwgc28gYmUgc3VyZSB0byBhc3NpZ24gSlBFR1RNUDogdG8gYSBkaXNrIHBhcnRpdGlvbiB3aXRoIGFkZXF1YXRlIGZyZWUKK3NwYWNlLgorCitUaGUgZGVmYXVsdCBtZW1vcnkgdXNhZ2UgbGltaXQgKC1tYXhtZW1vcnkpIGlzIHNldCB3aGVuIHRoZSBzb2Z0d2FyZSBpcworY29tcGlsZWQuICBJZiB5b3UgZ2V0IGFuICJpbnN1ZmZpY2llbnQgbWVtb3J5IiBlcnJvciwgdHJ5IHNwZWNpZnlpbmcgYSBzbWFsbGVyCistbWF4bWVtb3J5IHZhbHVlLCBldmVuIC1tYXhtZW1vcnkgMCB0byB1c2UgdGhlIGFic29sdXRlIG1pbmltdW0gc3BhY2UuICBZb3UKK21heSB3YW50IHRvIHJlY29tcGlsZSB3aXRoIGEgc21hbGxlciBkZWZhdWx0IHZhbHVlIGlmIHRoaXMgaGFwcGVucyBvZnRlbi4KKworT24gbWFjaGluZXMgdGhhdCBoYXZlICJlbnZpcm9ubWVudCIgdmFyaWFibGVzLCB5b3UgY2FuIGRlZmluZSB0aGUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIEpQRUdNRU0gdG8gc2V0IHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4gIFRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMKK2Rlc2NyaWJlZCBmb3IgdGhlIC1tYXhtZW1vcnkgc3dpdGNoLiAgSlBFR01FTSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUKK3NwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kIGl0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuCitleHBsaWNpdCAtbWF4bWVtb3J5IHN3aXRjaC4KKworT24gTVMtRE9TIG1hY2hpbmVzLCAtbWF4bWVtb3J5IGlzIHRoZSBhbW91bnQgb2YgbWFpbiAoY29udmVudGlvbmFsKSBtZW1vcnkgdG8KK3VzZS4gIChFeHRlbmRlZCBvciBleHBhbmRlZCBtZW1vcnkgaXMgYWxzbyB1c2VkIGlmIGF2YWlsYWJsZS4pICBNb3N0CitET1Mtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhpcyBzb2Z0d2FyZSBkbyB0aGVpciBvd24gbWVtb3J5IHNwYWNlIGVzdGltYXRpb24KK2FuZCBkbyBub3QgbmVlZCB5b3UgdG8gc3BlY2lmeSAtbWF4bWVtb3J5LgorCisKK0pQRUdUUkFOCisKK2pwZWd0cmFuIHBlcmZvcm1zIHZhcmlvdXMgdXNlZnVsIHRyYW5zZm9ybWF0aW9ucyBvZiBKUEVHIGZpbGVzLgorSXQgY2FuIHRyYW5zbGF0ZSB0aGUgY29kZWQgcmVwcmVzZW50YXRpb24gZnJvbSBvbmUgdmFyaWFudCBvZiBKUEVHIHRvIGFub3RoZXIsCitmb3IgZXhhbXBsZSBmcm9tIGJhc2VsaW5lIEpQRUcgdG8gcHJvZ3Jlc3NpdmUgSlBFRyBvciB2aWNlIHZlcnNhLiAgSXQgY2FuIGFsc28KK3BlcmZvcm0gc29tZSByZWFycmFuZ2VtZW50cyBvZiB0aGUgaW1hZ2UgZGF0YSwgZm9yIGV4YW1wbGUgdHVybmluZyBhbiBpbWFnZQorZnJvbSBsYW5kc2NhcGUgdG8gcG9ydHJhaXQgZm9ybWF0IGJ5IHJvdGF0aW9uLgorCitqcGVndHJhbiB3b3JrcyBieSByZWFycmFuZ2luZyB0aGUgY29tcHJlc3NlZCBkYXRhIChEQ1QgY29lZmZpY2llbnRzKSwgd2l0aG91dAorZXZlciBmdWxseSBkZWNvZGluZyB0aGUgaW1hZ2UuICBUaGVyZWZvcmUsIGl0cyB0cmFuc2Zvcm1hdGlvbnMgYXJlIGxvc3NsZXNzOgordGhlcmUgaXMgbm8gaW1hZ2UgZGVncmFkYXRpb24gYXQgYWxsLCB3aGljaCB3b3VsZCBub3QgYmUgdHJ1ZSBpZiB5b3UgdXNlZAorZGpwZWcgZm9sbG93ZWQgYnkgY2pwZWcgdG8gYWNjb21wbGlzaCB0aGUgc2FtZSBjb252ZXJzaW9uLiAgQnV0IGJ5IHRoZSBzYW1lCit0b2tlbiwganBlZ3RyYW4gY2Fubm90IHBlcmZvcm0gbG9zc3kgb3BlcmF0aW9ucyBzdWNoIGFzIGNoYW5naW5nIHRoZSBpbWFnZQorcXVhbGl0eS4KKworanBlZ3RyYW4gdXNlcyBhIGNvbW1hbmQgbGluZSBzeW50YXggc2ltaWxhciB0byBjanBlZyBvciBkanBlZy4KK09uIFVuaXgtbGlrZSBzeXN0ZW1zLCB5b3Ugc2F5OgorCWpwZWd0cmFuIFtzd2l0Y2hlc10gW2lucHV0ZmlsZV0gPm91dHB1dGZpbGUKK09uIG1vc3Qgbm9uLVVuaXggc3lzdGVtcywgeW91IHNheToKKwlqcGVndHJhbiBbc3dpdGNoZXNdIGlucHV0ZmlsZSBvdXRwdXRmaWxlCit3aGVyZSBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIGFyZSBKUEVHIGZpbGVzLgorCitUbyBzcGVjaWZ5IHRoZSBjb2RlZCBKUEVHIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlLAoranBlZ3RyYW4gYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgc3dpdGNoZXMgcmVjb2duaXplZCBieSBjanBlZzoKKwktb3B0aW1pemUJUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLgorCS1wcm9ncmVzc2l2ZQlDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLgorCS1yZXN0YXJ0IE4JRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkKKwkJCU4gTUNVIGJsb2NrcyBpZiAiQiIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KKwktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgorU2VlIHRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mIGNqcGVnIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2Ugc3dpdGNoZXMuCitJZiB5b3Ugc3BlY2lmeSBub25lIG9mIHRoZXNlIHN3aXRjaGVzLCB5b3UgZ2V0IGEgcGxhaW4gYmFzZWxpbmUtSlBFRyBvdXRwdXQKK2ZpbGUuICBUaGUgcXVhbGl0eSBzZXR0aW5nIGFuZCBzbyBmb3J0aCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5wdXQgZmlsZS4KKworVGhlIGltYWdlIGNhbiBiZSBsb3NzbGVzc2x5IHRyYW5zZm9ybWVkIGJ5IGdpdmluZyBvbmUgb2YgdGhlc2Ugc3dpdGNoZXM6CisJLWZsaXAgaG9yaXpvbnRhbAlNaXJyb3IgaW1hZ2UgaG9yaXpvbnRhbGx5IChsZWZ0LXJpZ2h0KS4KKwktZmxpcCB2ZXJ0aWNhbAkJTWlycm9yIGltYWdlIHZlcnRpY2FsbHkgKHRvcC1ib3R0b20pLgorCS1yb3RhdGUgOTAJCVJvdGF0ZSBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZS4KKwktcm90YXRlIDE4MAkJUm90YXRlIGltYWdlIDE4MCBkZWdyZWVzLgorCS1yb3RhdGUgMjcwCQlSb3RhdGUgaW1hZ2UgMjcwIGRlZ3JlZXMgY2xvY2t3aXNlIChvciA5MCBjY3cpLgorCS10cmFuc3Bvc2UJCVRyYW5zcG9zZSBpbWFnZSAoYWNyb3NzIFVMLXRvLUxSIGF4aXMpLgorCS10cmFuc3ZlcnNlCQlUcmFuc3ZlcnNlIHRyYW5zcG9zZSAoYWNyb3NzIFVSLXRvLUxMIGF4aXMpLgorCitUaGUgdHJhbnNwb3NlIHRyYW5zZm9ybWF0aW9uIGhhcyBubyByZXN0cmljdGlvbnMgcmVnYXJkaW5nIGltYWdlIGRpbWVuc2lvbnMuCitUaGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIG9wZXJhdGUgcmF0aGVyIG9kZGx5IGlmIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSBub3QKK2EgbXVsdGlwbGUgb2YgdGhlIGlNQ1Ugc2l6ZSAodXN1YWxseSA4IG9yIDE2IHBpeGVscyksIGJlY2F1c2UgdGhleSBjYW4gb25seQordHJhbnNmb3JtIGNvbXBsZXRlIGJsb2NrcyBvZiBEQ1QgY29lZmZpY2llbnQgZGF0YSBpbiB0aGUgZGVzaXJlZCB3YXkuCisKK2pwZWd0cmFuJ3MgZGVmYXVsdCBiZWhhdmlvciB3aGVuIHRyYW5zZm9ybWluZyBhbiBvZGQtc2l6ZSBpbWFnZSBpcyBkZXNpZ25lZAordG8gcHJlc2VydmUgZXhhY3QgcmV2ZXJzaWJpbGl0eSBhbmQgbWF0aGVtYXRpY2FsIGNvbnNpc3RlbmN5IG9mIHRoZQordHJhbnNmb3JtYXRpb24gc2V0LiAgQXMgc3RhdGVkLCB0cmFuc3Bvc2UgaXMgYWJsZSB0byBmbGlwIHRoZSBlbnRpcmUgaW1hZ2UKK2FyZWEuICBIb3Jpem9udGFsIG1pcnJvcmluZyBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVSBjb2x1bW4gYXQgdGhlIHJpZ2h0IGVkZ2UKK3VudG91Y2hlZCwgYnV0IGlzIGFibGUgdG8gZmxpcCBhbGwgcm93cyBvZiB0aGUgaW1hZ2UuICBTaW1pbGFybHksIHZlcnRpY2FsCittaXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1Ugcm93IGF0IHRoZSBib3R0b20gZWRnZSB1bnRvdWNoZWQsIGJ1dCBpcworYWJsZSB0byBmbGlwIGFsbCBjb2x1bW5zLiAgVGhlIG90aGVyIHRyYW5zZm9ybXMgY2FuIGJlIGJ1aWx0IHVwIGFzIHNlcXVlbmNlcworb2YgdHJhbnNwb3NlIGFuZCBmbGlwIG9wZXJhdGlvbnM7IGZvciBjb25zaXN0ZW5jeSwgdGhlaXIgYWN0aW9ucyBvbiBlZGdlCitwaXhlbHMgYXJlIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGVuZCByZXN1bHQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKK3RyYW5zcG9zZS1hbmQtZmxpcCBzZXF1ZW5jZS4KKworRm9yIHByYWN0aWNhbCB1c2UsIHlvdSBtYXkgcHJlZmVyIHRvIGRpc2NhcmQgYW55IHVudHJhbnNmb3JtYWJsZSBlZGdlIHBpeGVscworcmF0aGVyIHRoYW4gaGF2aW5nIGEgc3RyYW5nZS1sb29raW5nIHN0cmlwIGFsb25nIHRoZSByaWdodCBhbmQvb3IgYm90dG9tIGVkZ2VzCitvZiBhIHRyYW5zZm9ybWVkIGltYWdlLiAgVG8gZG8gdGhpcywgYWRkIHRoZSAtdHJpbSBzd2l0Y2g6CisJLXRyaW0JCURyb3Agbm9uLXRyYW5zZm9ybWFibGUgZWRnZSBibG9ja3MuCitPYnZpb3VzbHksIGEgdHJhbnNmb3JtYXRpb24gd2l0aCAtdHJpbSBpcyBub3QgcmV2ZXJzaWJsZSwgc28gc3RyaWN0bHkgc3BlYWtpbmcKK2pwZWd0cmFuIHdpdGggdGhpcyBzd2l0Y2ggaXMgbm90IGxvc3NsZXNzLiAgQWxzbywgdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbAorZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybWF0aW9ucyBubyBsb25nZXIgaG9sZC4gIEZvciBleGFtcGxlLAorIi1yb3QgMjcwIC10cmltIiB0cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0ICItcm90IDkwIC10cmltIiBmb2xsb3dlZCBieQorIi1yb3QgMTgwIC10cmltIiB0cmltcyBib3RoIGVkZ2VzLgorCitBbm90aGVyIG5vdC1zdHJpY3RseS1sb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbiBzd2l0Y2ggaXM6CisJLWdyYXlzY2FsZQlGb3JjZSBncmF5c2NhbGUgb3V0cHV0LgorVGhpcyBvcHRpb24gZGlzY2FyZHMgdGhlIGNocm9taW5hbmNlIGNoYW5uZWxzIGlmIHRoZSBpbnB1dCBpbWFnZSBpcyBZQ2JDcgorKGllLCBhIHN0YW5kYXJkIGNvbG9yIEpQRUcpLCByZXN1bHRpbmcgaW4gYSBncmF5c2NhbGUgSlBFRyBmaWxlLiAgVGhlCitsdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseSwgc28gdGhpcyBpcyBhIGJldHRlciBtZXRob2Qgb2YgcmVkdWNpbmcKK3RvIGdyYXlzY2FsZSB0aGFuIGRlY29tcHJlc3Npb24sIGNvbnZlcnNpb24sIGFuZCByZWNvbXByZXNzaW9uLiAgVGhpcyBzd2l0Y2gKK2lzIHBhcnRpY3VsYXJseSBoYW5keSBmb3IgZml4aW5nIGEgbW9ub2Nocm9tZSBwaWN0dXJlIHRoYXQgd2FzIG1pc3Rha2VubHkKK2VuY29kZWQgYXMgYSBjb2xvciBKUEVHLiAgKEluIHN1Y2ggYSBjYXNlLCB0aGUgc3BhY2Ugc2F2aW5ncyBmcm9tIGdldHRpbmcgcmlkCitvZiB0aGUgbmVhci1lbXB0eSBjaHJvbWEgY2hhbm5lbHMgd29uJ3QgYmUgbGFyZ2U7IGJ1dCB0aGUgZGVjb2RpbmcgdGltZSBmb3IKK2EgZ3JheXNjYWxlIEpQRUcgaXMgc3Vic3RhbnRpYWxseSBsZXNzIHRoYW4gdGhhdCBmb3IgYSBjb2xvciBKUEVHLikKKworanBlZ3RyYW4gYWxzbyByZWNvZ25pemVzIHRoZXNlIHN3aXRjaGVzIHRoYXQgY29udHJvbCB3aGF0IHRvIGRvIHdpdGggImV4dHJhIgorbWFya2Vycywgc3VjaCBhcyBjb21tZW50IGJsb2NrczoKKwktY29weSBub25lCUNvcHkgbm8gZXh0cmEgbWFya2VycyBmcm9tIHNvdXJjZSBmaWxlLiAgVGhpcyBzZXR0aW5nCisJCQlzdXBwcmVzc2VzIGFsbCBjb21tZW50cyBhbmQgb3RoZXIgZXhjZXNzIGJhZ2dhZ2UKKwkJCXByZXNlbnQgaW4gdGhlIHNvdXJjZSBmaWxlLgorCS1jb3B5IGNvbW1lbnRzCUNvcHkgb25seSBjb21tZW50IG1hcmtlcnMuICBUaGlzIHNldHRpbmcgY29waWVzCisJCQljb21tZW50cyBmcm9tIHRoZSBzb3VyY2UgZmlsZSwgYnV0IGRpc2NhcmRzCisJCQlhbnkgb3RoZXIgaW5lc3NlbnRpYWwgZGF0YS4gCisJLWNvcHkgYWxsCUNvcHkgYWxsIGV4dHJhIG1hcmtlcnMuICBUaGlzIHNldHRpbmcgcHJlc2VydmVzCisJCQltaXNjZWxsYW5lb3VzIG1hcmtlcnMgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLCBzdWNoCisJCQlhcyBKRklGIHRodW1ibmFpbHMgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4gIEluIHNvbWUKKwkJCWZpbGVzIHRoZXNlIGV4dHJhIG1hcmtlcnMgY2FuIGJlIHNpemFibGUuCitUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyAtY29weSBjb21tZW50cy4gIChOb3RlOiBpbiBJSkcgcmVsZWFzZXMgdjYgYW5kIHY2YSwKK2pwZWd0cmFuIGFsd2F5cyBkaWQgdGhlIGVxdWl2YWxlbnQgb2YgLWNvcHkgbm9uZS4pCisKK0FkZGl0aW9uYWwgc3dpdGNoZXMgcmVjb2duaXplZCBieSBqcGVndHJhbiBhcmU6CisJLW91dGZpbGUgZmlsZW5hbWUKKwktbWF4bWVtb3J5IE4KKwktdmVyYm9zZQorCS1kZWJ1ZworVGhlc2Ugd29yayB0aGUgc2FtZSBhcyBpbiBjanBlZyBvciBkanBlZy4KKworCitUSEUgQ09NTUVOVCBVVElMSVRJRVMKKworVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzICJjb21tZW50IiAoQ09NKSBibG9ja3MgdG8gb2NjdXIgd2l0aGluIGEgSlBFRyBmaWxlLgorQWx0aG91Z2ggdGhlIHN0YW5kYXJkIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHdoYXQgQ09NIGJsb2NrcyBhcmUgZm9yLCB0aGV5CithcmUgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQgc3RyaW5ncy4gIFRoaXMgbGV0cyB5b3UgYWRkCithbm5vdGF0aW9ucywgdGl0bGVzLCBpbmRleCB0ZXJtcywgZXRjIHRvIHlvdXIgSlBFRyBmaWxlcywgYW5kIGxhdGVyIHJldHJpZXZlCit0aGVtIGFzIHRleHQuICBDT00gYmxvY2tzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgaW1hZ2Ugc3RvcmVkIGluIHRoZSBKUEVHCitmaWxlLiAgVGhlIG1heGltdW0gc2l6ZSBvZiBhIENPTSBibG9jayBpcyA2NEssIGJ1dCB5b3UgY2FuIGhhdmUgYXMgbWFueSBvZgordGhlbSBhcyB5b3UgbGlrZSBpbiBvbmUgSlBFRyBmaWxlLgorCitXZSBwcm92aWRlIHR3byB1dGlsaXR5IHByb2dyYW1zIHRvIGRpc3BsYXkgQ09NIGJsb2NrIGNvbnRlbnRzIGFuZCBhZGQgQ09NCitibG9ja3MgdG8gYSBKUEVHIGZpbGUuCisKK3JkanBnY29tIHNlYXJjaGVzIGEgSlBFRyBmaWxlIGFuZCBwcmludHMgdGhlIGNvbnRlbnRzIG9mIGFueSBDT00gYmxvY2tzIG9uCitzdGFuZGFyZCBvdXRwdXQuICBUaGUgY29tbWFuZCBsaW5lIHN5bnRheCBpcworCXJkanBnY29tIFstdmVyYm9zZV0gW2lucHV0ZmlsZW5hbWVdCitUaGUgc3dpdGNoICItdmVyYm9zZSIgKG9yIGp1c3QgIi12IikgY2F1c2VzIHJkanBnY29tIHRvIGFsc28gZGlzcGxheSB0aGUgSlBFRworaW1hZ2UgZGltZW5zaW9ucy4gIElmIHlvdSBvbWl0IHRoZSBpbnB1dCBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAordGhlIEpQRUcgZmlsZSBpcyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBtYXkgbm90IHdvcmsgb24gc29tZQorb3BlcmF0aW5nIHN5c3RlbXMsIGlmIGJpbmFyeSBkYXRhIGNhbid0IGJlIHJlYWQgZnJvbSBzdGRpbi4pCisKK3dyanBnY29tIGFkZHMgYSBDT00gYmxvY2ssIGNvbnRhaW5pbmcgdGV4dCB5b3UgcHJvdmlkZSwgdG8gYSBKUEVHIGZpbGUuCitPcmRpbmFyaWx5LCB0aGUgQ09NIGJsb2NrIGlzIGFkZGVkIGFmdGVyIGFueSBleGlzdGluZyBDT00gYmxvY2tzLCBidXQgeW91CitjYW4gZGVsZXRlIHRoZSBvbGQgQ09NIGJsb2NrcyBpZiB5b3Ugd2lzaC4gIHdyanBnY29tIHByb2R1Y2VzIGEgbmV3IEpQRUcKK2ZpbGU7IGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgaW5wdXQgZmlsZS4gIERPIE5PVCB0cnkgdG8gb3ZlcndyaXRlIHRoZSBpbnB1dAorZmlsZSBieSBkaXJlY3Rpbmcgd3JqcGdjb20ncyBvdXRwdXQgYmFjayBpbnRvIGl0OyBvbiBtb3N0IHN5c3RlbXMgdGhpcyB3aWxsCitqdXN0IGRlc3Ryb3kgeW91ciBmaWxlLgorCitUaGUgY29tbWFuZCBsaW5lIHN5bnRheCBmb3Igd3JqcGdjb20gaXMgc2ltaWxhciB0byBjanBlZydzLiAgT24gVW5peC1saWtlCitzeXN0ZW1zLCBpdCBpcworCXdyanBnY29tIFtzd2l0Y2hlc10gW2lucHV0ZmlsZW5hbWVdCitUaGUgb3V0cHV0IGZpbGUgaXMgd3JpdHRlbiB0byBzdGFuZGFyZCBvdXRwdXQuICBUaGUgaW5wdXQgZmlsZSBjb21lcyBmcm9tCit0aGUgbmFtZWQgZmlsZSwgb3IgZnJvbSBzdGFuZGFyZCBpbnB1dCBpZiBubyBpbnB1dCBmaWxlIGlzIG5hbWVkLgorCitPbiBtb3N0IG5vbi1Vbml4IHN5c3RlbXMsIHRoZSBzeW50YXggaXMKKwl3cmpwZ2NvbSBbc3dpdGNoZXNdIGlucHV0ZmlsZW5hbWUgb3V0cHV0ZmlsZW5hbWUKK3doZXJlIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlIG5hbWVzIG11c3QgYmUgZ2l2ZW4gZXhwbGljaXRseS4KKword3JqcGdjb20gdW5kZXJzdGFuZHMgdGhyZWUgc3dpdGNoZXM6CisJLXJlcGxhY2UJCSBEZWxldGUgYW55IGV4aXN0aW5nIENPTSBibG9ja3MgZnJvbSB0aGUgZmlsZS4KKwktY29tbWVudCAiQ29tbWVudCB0ZXh0IgkgU3VwcGx5IG5ldyBDT00gdGV4dCBvbiBjb21tYW5kIGxpbmUuCisJLWNmaWxlIG5hbWUJCSBSZWFkIHRleHQgZm9yIG5ldyBDT00gYmxvY2sgZnJvbSBuYW1lZCBmaWxlLgorKFN3aXRjaCBuYW1lcyBjYW4gYmUgYWJicmV2aWF0ZWQuKSAgSWYgeW91IGhhdmUgb25seSBvbmUgbGluZSBvZiBjb21tZW50IHRleHQKK3RvIGFkZCwgeW91IGNhbiBwcm92aWRlIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCAtY29tbWVudC4gIFRoZSBjb21tZW50Cit0ZXh0IG11c3QgYmUgc3Vycm91bmRlZCB3aXRoIHF1b3RlcyBzbyB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUKK2FyZ3VtZW50LiAgTG9uZ2VyIGNvbW1lbnRzIGNhbiBiZSByZWFkIGZyb20gYSB0ZXh0IGZpbGUuCisKK0lmIHlvdSBnaXZlIG5laXRoZXIgLWNvbW1lbnQgbm9yIC1jZmlsZSwgdGhlbiB3cmpwZ2NvbSB3aWxsIHJlYWQgdGhlIGNvbW1lbnQKK3RleHQgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChJbiB0aGlzIGNhc2UgYW4gaW5wdXQgaW1hZ2UgZmlsZSBuYW1lIE1VU1QgYmUKK3N1cHBsaWVkLCBzbyB0aGF0IHRoZSBzb3VyY2UgSlBFRyBmaWxlIGNvbWVzIGZyb20gc29tZXdoZXJlIGVsc2UuKSAgWW91IGNhbgorZW50ZXIgbXVsdGlwbGUgbGluZXMsIHVwIHRvIDY0S0Igd29ydGguICBUeXBlIGFuIGVuZC1vZi1maWxlIGluZGljYXRvcgorKHVzdWFsbHkgY29udHJvbC1EIG9yIGNvbnRyb2wtWikgdG8gdGVybWluYXRlIHRoZSBjb21tZW50IHRleHQgZW50cnkuCisKK3dyanBnY29tIHdpbGwgbm90IGFkZCBhIENPTSBibG9jayBpZiB0aGUgcHJvdmlkZWQgY29tbWVudCBzdHJpbmcgaXMgZW1wdHkuCitUaGVyZWZvcmUgLXJlcGxhY2UgLWNvbW1lbnQgIiIgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIGFsbCBDT00gYmxvY2tzIGZyb20gYQorZmlsZS4KKworVGhlc2UgdXRpbGl0eSBwcm9ncmFtcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBJSkcgSlBFRyBsaWJyYXJ5LiAgSW4KK3BhcnRpY3VsYXIsIHRoZSBzb3VyY2UgY29kZSBmb3IgcmRqcGdjb20gaXMgaW50ZW5kZWQgYXMgYW4gaWxsdXN0cmF0aW9uIG9mCit0aGUgbWluaW11bSBhbW91bnQgb2YgY29kZSByZXF1aXJlZCB0byBwYXJzZSBhIEpQRUcgZmlsZSBoZWFkZXIgY29ycmVjdGx5LgpkaWZmIC0tZ2l0IGEvd2l6YXJkLmRvYyBiL3dpemFyZC5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxNzBiMgotLS0gL2Rldi9udWxsCisrKyBiL3dpemFyZC5kb2MKQEAgLTAsMCArMSwyMTEgQEAKK0FkdmFuY2VkIHVzYWdlIGluc3RydWN0aW9ucyBmb3IgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZpbGUgZGVzY3JpYmVzIGNqcGVnJ3MgInN3aXRjaGVzIGZvciB3aXphcmRzIi4KKworVGhlICJ3aXphcmQiIHN3aXRjaGVzIGFyZSBpbnRlbmRlZCBmb3IgZXhwZXJpbWVudGF0aW9uIHdpdGggSlBFRyBieSBwZXJzb25zCit3aG8gYXJlIHJlYXNvbmFibHkga25vd2xlZGdlYWJsZSBhYm91dCB0aGUgSlBFRyBzdGFuZGFyZC4gIElmIHlvdSBkb24ndCBrbm93Cit3aGF0IHlvdSBhcmUgZG9pbmcsIERPTidUIFVTRSBUSEVTRSBTV0lUQ0hFUy4gIFlvdSdsbCBsaWtlbHkgcHJvZHVjZSBmaWxlcword2l0aCB3b3JzZSBpbWFnZSBxdWFsaXR5IGFuZC9vciBwb29yZXIgY29tcHJlc3Npb24gdGhhbiB5b3UnZCBnZXQgZnJvbSB0aGUKK2RlZmF1bHQgc2V0dGluZ3MuICBGdXJ0aGVybW9yZSwgdGhlc2Ugc3dpdGNoZXMgbXVzdCBiZSB1c2VkIHdpdGggY2F1dGlvbgord2hlbiBtYWtpbmcgZmlsZXMgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLCBiZWNhdXNlIG5vdCBhbGwgSlBFRyBkZWNvZGVycword2lsbCBzdXBwb3J0IHVudXN1YWwgSlBFRyBwYXJhbWV0ZXIgc2V0dGluZ3MuCisKKworUXVhbnRpemF0aW9uIFRhYmxlIEFkanVzdG1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09yZGluYXJpbHksIGNqcGVnIHN0YXJ0cyB3aXRoIGEgZGVmYXVsdCBzZXQgb2YgdGFibGVzICh0aGUgc2FtZSBvbmVzIGdpdmVuCithcyBleGFtcGxlcyBpbiB0aGUgSlBFRyBzdGFuZGFyZCkgYW5kIHNjYWxlcyB0aGVtIHVwIG9yIGRvd24gYWNjb3JkaW5nIHRvCit0aGUgLXF1YWxpdHkgc2V0dGluZy4gIFRoZSBkZXRhaWxzIG9mIHRoZSBzY2FsaW5nIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgaW4KK2pjcGFyYW0uYy4gIEF0IHZlcnkgbG93IHF1YWxpdHkgc2V0dGluZ3MsIHNvbWUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJpZXMKK2NhbiBnZXQgc2NhbGVkIHVwIHRvIHZhbHVlcyBleGNlZWRpbmcgMjU1LiAgQWx0aG91Z2ggMi1ieXRlIHF1YW50aXphdGlvbgordmFsdWVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIElKRyBzb2Z0d2FyZSwgdGhpcyBmZWF0dXJlIGlzIG5vdCBpbiBiYXNlbGluZQorSlBFRyBhbmQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLiAgSWYgeW91IG5lZWQgdG8gZW5zdXJlCit3aWRlIGNvbXBhdGliaWxpdHkgb2YgbG93LXF1YWxpdHkgZmlsZXMsIHlvdSBjYW4gY29uc3RyYWluIHRoZSBzY2FsZWQKK3F1YW50aXphdGlvbiB2YWx1ZXMgdG8gbm8gbW9yZSB0aGFuIDI1NSBieSBnaXZpbmcgdGhlIC1iYXNlbGluZSBzd2l0Y2guCitOb3RlIHRoYXQgdXNlIG9mIC1iYXNlbGluZSB3aWxsIHJlc3VsdCBpbiBwb29yZXIgcXVhbGl0eSBmb3IgdGhlIHNhbWUgZmlsZQorc2l6ZSwgc2luY2UgbW9yZSBiaXRzIHRoYW4gbmVjZXNzYXJ5IGFyZSBleHBlbmRlZCBvbiBoaWdoZXIgQUMgY29lZmZpY2llbnRzLgorCitZb3UgY2FuIHN1YnN0aXR1dGUgYSBkaWZmZXJlbnQgc2V0IG9mIHF1YW50aXphdGlvbiB2YWx1ZXMgYnkgdXNpbmcgdGhlCistcXRhYmxlcyBzd2l0Y2g6CisKKwktcXRhYmxlcyBmaWxlCVVzZSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiB0aGUgbmFtZWQgZmlsZS4KKworVGhlIHNwZWNpZmllZCBmaWxlIHNob3VsZCBiZSBhIHRleHQgZmlsZSBjb250YWluaW5nIGRlY2ltYWwgcXVhbnRpemF0aW9uCit2YWx1ZXMuICBUaGUgZmlsZSBzaG91bGQgY29udGFpbiBvbmUgdG8gZm91ciB0YWJsZXMsIGVhY2ggb2YgNjQgZWxlbWVudHMuCitUaGUgdGFibGVzIGFyZSBpbXBsaWNpdGx5IG51bWJlcmVkIDAsMSxldGMuIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UuICBUYWJsZQorZW50cmllcyBhcHBlYXIgaW4gbm9ybWFsIGFycmF5IG9yZGVyIChOT1QgaW4gdGhlIHppZ3phZyBvcmRlciBpbiB3aGljaCB0aGV5Cit3aWxsIGJlIHN0b3JlZCBpbiB0aGUgSlBFRyBmaWxlKS4KKworUXVhbnRpemF0aW9uIHRhYmxlIGZpbGVzIGFyZSBmcmVlIGZvcm1hdCwgaW4gdGhhdCBhcmJpdHJhcnkgd2hpdGVzcGFjZSBjYW4KK2FwcGVhciBiZXR3ZWVuIG51bWJlcnMuICBBbHNvLCBjb21tZW50cyBjYW4gYmUgaW5jbHVkZWQ6IGEgY29tbWVudCBzdGFydHMKK3dpdGggJyMnIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBIZXJlIGlzIGFuIGV4YW1wbGUgZmlsZSB0aGF0CitkdXBsaWNhdGVzIHRoZSBkZWZhdWx0IHF1YW50aXphdGlvbiB0YWJsZXM6CisKKwkjIFF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjLCBzZWN0aW9uIEsuMQorCisJIyBUaGlzIGlzIHRhYmxlIDAgKHRoZSBsdW1pbmFuY2UgdGFibGUpOgorCSAgMTYgIDExICAxMCAgMTYgIDI0ICA0MCAgNTEgIDYxCisJICAxMiAgMTIgIDE0ICAxOSAgMjYgIDU4ICA2MCAgNTUKKwkgIDE0ICAxMyAgMTYgIDI0ICA0MCAgNTcgIDY5ICA1NgorCSAgMTQgIDE3ICAyMiAgMjkgIDUxICA4NyAgODAgIDYyCisJICAxOCAgMjIgIDM3ICA1NiAgNjggMTA5IDEwMyAgNzcKKwkgIDI0ICAzNSAgNTUgIDY0ICA4MSAxMDQgMTEzICA5MgorCSAgNDkgIDY0ICA3OCAgODcgMTAzIDEyMSAxMjAgMTAxCisJICA3MiAgOTIgIDk1ICA5OCAxMTIgMTAwIDEwMyAgOTkKKworCSMgVGhpcyBpcyB0YWJsZSAxICh0aGUgY2hyb21pbmFuY2UgdGFibGUpOgorCSAgMTcgIDE4ICAyNCAgNDcgIDk5ICA5OSAgOTkgIDk5CisJICAxOCAgMjEgIDI2ICA2NiAgOTkgIDk5ICA5OSAgOTkKKwkgIDI0ICAyNiAgNTYgIDk5ICA5OSAgOTkgIDk5ICA5OQorCSAgNDcgIDY2ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5CisJICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKKwkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQorCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5CisJICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKKworSWYgdGhlIC1xdGFibGVzIHN3aXRjaCBpcyB1c2VkIHdpdGhvdXQgLXF1YWxpdHksIHRoZW4gdGhlIHNwZWNpZmllZCB0YWJsZXMKK2FyZSB1c2VkIGV4YWN0bHkgYXMtaXMuICBJZiBib3RoIC1xdGFibGVzIGFuZCAtcXVhbGl0eSBhcmUgdXNlZCwgdGhlbiB0aGUKK3RhYmxlcyB0YWtlbiBmcm9tIHRoZSBmaWxlIGFyZSBzY2FsZWQgaW4gdGhlIHNhbWUgZmFzaGlvbiB0aGF0IHRoZSBkZWZhdWx0Cit0YWJsZXMgd291bGQgYmUgc2NhbGVkIGZvciB0aGF0IHF1YWxpdHkgc2V0dGluZy4gIElmIC1iYXNlbGluZSBhcHBlYXJzLCB0aGVuCit0aGUgcXVhbnRpemF0aW9uIHZhbHVlcyBhcmUgY29uc3RyYWluZWQgdG8gdGhlIHJhbmdlIDEtMjU1LgorCitCeSBkZWZhdWx0LCBjanBlZyB3aWxsIHVzZSBxdWFudGl6YXRpb24gdGFibGUgMCBmb3IgbHVtaW5hbmNlIGNvbXBvbmVudHMgYW5kCit0YWJsZSAxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLiAgVG8gb3ZlcnJpZGUgdGhpcyBjaG9pY2UsIHVzZSB0aGUgLXFzbG90cworc3dpdGNoOgorCisJLXFzbG90cyBOWywuLi5dCQlTZWxlY3Qgd2hpY2ggcXVhbnRpemF0aW9uIHRhYmxlIHRvIHVzZSBmb3IKKwkJCQllYWNoIGNvbG9yIGNvbXBvbmVudC4KKworVGhlIC1xc2xvdHMgc3dpdGNoIHNwZWNpZmllcyBhIHF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIgZm9yIGVhY2ggY29sb3IKK2NvbXBvbmVudCwgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjb21wb25lbnRzIGFwcGVhciBpbiB0aGUgSlBFRyBTT0YgbWFya2VyLgorRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIHRhYmxlIGZvciBlYWNoIG9mIFksQ2IsQ3IsIHlvdSBjb3VsZAorcHJvdmlkZSBhIC1xdGFibGVzIGZpbGUgdGhhdCBkZWZpbmVzIHRocmVlIHF1YW50aXphdGlvbiB0YWJsZXMgYW5kIHNheQorIi1xc2xvdHMgMCwxLDIiLiAgSWYgLXFzbG90cyBnaXZlcyBmZXdlciB0YWJsZSBudW1iZXJzIHRoYW4gdGhlcmUgYXJlIGNvbG9yCitjb21wb25lbnRzLCB0aGVuIHRoZSBsYXN0IHRhYmxlIG51bWJlciBpcyByZXBlYXRlZCBhcyBuZWNlc3NhcnkuCisKKworU2FtcGxpbmcgRmFjdG9yIEFkanVzdG1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0J5IGRlZmF1bHQsIGNqcGVnIHVzZXMgMjoxIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRvd25zYW1wbGluZyB3aGVuCitjb21wcmVzc2luZyBZQ2JDciBkYXRhLCBhbmQgbm8gZG93bnNhbXBsaW5nIGZvciBhbGwgb3RoZXIgY29sb3Igc3BhY2VzLgorWW91IGNhbiBvdmVycmlkZSB0aGlzIGRlZmF1bHQgd2l0aCB0aGUgLXNhbXBsZSBzd2l0Y2g6CisKKwktc2FtcGxlIEh4VlssLi4uXQlTZXQgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yCisJCQkJY29tcG9uZW50LgorCitUaGUgLXNhbXBsZSBzd2l0Y2ggc3BlY2lmaWVzIHRoZSBKUEVHIHNhbXBsaW5nIGZhY3RvcnMgZm9yIGVhY2ggY29sb3IKK2NvbXBvbmVudCwgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBKUEVHIFNPRiBtYXJrZXIuCitJZiB5b3Ugc3BlY2lmeSBmZXdlciBIeFYgcGFpcnMgdGhhbiB0aGVyZSBhcmUgY29tcG9uZW50cywgdGhlIHJlbWFpbmluZworY29tcG9uZW50cyBhcmUgc2V0IHRvIDF4MSBzYW1wbGluZy4gIEZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBZQ2JDciBzZXR0aW5nCitpcyBlcXVpdmFsZW50IHRvICItc2FtcGxlIDJ4MiwxeDEsMXgxIiwgd2hpY2ggY2FuIGJlIGFiYnJldmlhdGVkIHRvCisiLXNhbXBsZSAyeDIiLgorCitUaGVyZSBhcmUgc3RpbGwgc29tZSBKUEVHIGRlY29kZXJzIGluIGV4aXN0ZW5jZSB0aGF0IHN1cHBvcnQgb25seSAyeDEKK3NhbXBsaW5nIChhbHNvIGNhbGxlZCA0OjI6MiBzYW1wbGluZykuICBDb21wYXRpYmlsaXR5IHdpdGggc3VjaCBkZWNvZGVycyBjYW4KK2JlIGFjaGlldmVkIGJ5IHNwZWNpZnlpbmcgIi1zYW1wbGUgMngxIi4gIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIHVubGVzcworcmVhbGx5IG5lY2Vzc2FyeSwgc2luY2UgaXQgaW5jcmVhc2VzIGZpbGUgc2l6ZSBhbmQgZW5jb2RpbmcvZGVjb2RpbmcgdGltZQord2l0aCB2ZXJ5IGxpdHRsZSBxdWFsaXR5IGdhaW4uCisKKworTXVsdGlwbGUgU2NhbiAvIFByb2dyZXNzaW9uIENvbnRyb2wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0J5IGRlZmF1bHQsIGNqcGVnIGVtaXRzIGEgc2luZ2xlLXNjYW4gc2VxdWVudGlhbCBKUEVHIGZpbGUuICBUaGUKKy1wcm9ncmVzc2l2ZSBzd2l0Y2ggZ2VuZXJhdGVzIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIHVzaW5nIGEgZGVmYXVsdCBzZXJpZXMKK29mIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMuICBZb3UgY2FuIGNyZWF0ZSBtdWx0aXBsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRworZmlsZXMgb3IgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyB3aXRoIGN1c3RvbSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHVzaW5nCit0aGUgLXNjYW5zIHN3aXRjaDoKKworCS1zY2FucyBmaWxlCVVzZSB0aGUgc2NhbiBzZXF1ZW5jZSBnaXZlbiBpbiB0aGUgbmFtZWQgZmlsZS4KKworVGhlIHNwZWNpZmllZCBmaWxlIHNob3VsZCBiZSBhIHRleHQgZmlsZSBjb250YWluaW5nIGEgInNjYW4gc2NyaXB0Ii4KK1RoZSBzY3JpcHQgc3BlY2lmaWVzIHRoZSBjb250ZW50cyBhbmQgb3JkZXJpbmcgb2YgdGhlIHNjYW5zIHRvIGJlIGVtaXR0ZWQuCitFYWNoIGVudHJ5IGluIHRoZSBzY3JpcHQgZGVmaW5lcyBvbmUgc2Nhbi4gIEEgc2NhbiBkZWZpbml0aW9uIHNwZWNpZmllcwordGhlIGNvbXBvbmVudHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNjYW4sIGFuZCBmb3IgcHJvZ3Jlc3NpdmUgSlBFRyBpdCBhbHNvCitzcGVjaWZpZXMgdGhlIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgU3MsU2UsQWgsQWwgZm9yIHRoZSBzY2FuLiAgU2NhbgorZGVmaW5pdGlvbnMgYXJlIHNlcGFyYXRlZCBieSBzZW1pY29sb25zICgnOycpLiAgQSBzZW1pY29sb24gYWZ0ZXIgdGhlIGxhc3QKK3NjYW4gZGVmaW5pdGlvbiBpcyBvcHRpb25hbC4KKworRWFjaCBzY2FuIGRlZmluaXRpb24gY29udGFpbnMgb25lIHRvIGZvdXIgY29tcG9uZW50IGluZGV4ZXMsIG9wdGlvbmFsbHkKK2ZvbGxvd2VkIGJ5IGEgY29sb24gKCc6JykgYW5kIHRoZSBmb3VyIHByb2dyZXNzaXZlLUpQRUcgcGFyYW1ldGVycy4gIFRoZQorY29tcG9uZW50IGluZGV4ZXMgZGVub3RlIHdoaWNoIGNvbG9yIGNvbXBvbmVudChzKSBhcmUgdG8gYmUgdHJhbnNtaXR0ZWQgaW4KK3RoZSBzY2FuLiAgQ29tcG9uZW50cyBhcmUgbnVtYmVyZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZQorSlBFRyBTT0YgbWFya2VyLCB3aXRoIHRoZSBmaXJzdCBjb21wb25lbnQgYmVpbmcgbnVtYmVyZWQgMC4gIChOb3RlIHRoYXQgdGhlc2UKK2luZGV4ZXMgYXJlIG5vdCB0aGUgImNvbXBvbmVudCBJRCIgY29kZXMgYXNzaWduZWQgdG8gdGhlIGNvbXBvbmVudHMsIGp1c3QKK3Bvc2l0aW9uYWwgaW5kZXhlcy4pCisKK1RoZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIGZvciBlYWNoIHNjYW4gYXJlOgorCVNzCVppZ3phZyBpbmRleCBvZiBmaXJzdCBjb2VmZmljaWVudCBpbmNsdWRlZCBpbiBzY2FuCisJU2UJWmlnemFnIGluZGV4IG9mIGxhc3QgY29lZmZpY2llbnQgaW5jbHVkZWQgaW4gc2NhbgorCUFoCVplcm8gZm9yIGZpcnN0IHNjYW4gb2YgYSBjb2VmZmljaWVudCwgZWxzZSBBbCBvZiBwcmlvciBzY2FuCisJQWwJU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIGxvdyBiaXQgcG9zaXRpb24gZm9yIHNjYW4KK0lmIHRoZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIGFyZSBvbWl0dGVkLCB0aGUgdmFsdWVzIDAsNjMsMCwwIGFyZSB1c2VkLAorcHJvZHVjaW5nIGEgc2VxdWVudGlhbCBKUEVHIGZpbGUuICBjanBlZyBhdXRvbWF0aWNhbGx5IGRldGVybWluZXMgd2hldGhlcgordGhlIHNjcmlwdCByZXByZXNlbnRzIGEgcHJvZ3Jlc3NpdmUgb3Igc2VxdWVudGlhbCBmaWxlLCBieSBvYnNlcnZpbmcgd2hldGhlcgorU3MgYW5kIFNlIHZhbHVlcyBvdGhlciB0aGFuIDAgYW5kIDYzIGFwcGVhci4gIChUaGUgLXByb2dyZXNzaXZlIHN3aXRjaCBpcworbm90IG5lZWRlZCB0byBzcGVjaWZ5IHRoaXM7IGluIGZhY3QsIGl0IGlzIGlnbm9yZWQgd2hlbiAtc2NhbnMgYXBwZWFycy4pCitUaGUgc2NhbiBzY3JpcHQgbXVzdCBtZWV0IHRoZSBKUEVHIHJlc3RyaWN0aW9ucyBvbiBwcm9ncmVzc2lvbiBzZXF1ZW5jZXMuCisoY2pwZWcgY2hlY2tzIHRoYXQgdGhlIHNwZWMncyByZXF1aXJlbWVudHMgYXJlIG9iZXllZC4pCisKK1NjYW4gc2NyaXB0IGZpbGVzIGFyZSBmcmVlIGZvcm1hdCwgaW4gdGhhdCBhcmJpdHJhcnkgd2hpdGVzcGFjZSBjYW4gYXBwZWFyCitiZXR3ZWVuIG51bWJlcnMgYW5kIGFyb3VuZCBwdW5jdHVhdGlvbi4gIEFsc28sIGNvbW1lbnRzIGNhbiBiZSBpbmNsdWRlZDogYQorY29tbWVudCBzdGFydHMgd2l0aCAnIycgYW5kIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gIEZvciBhZGRpdGlvbmFsCitsZWdpYmlsaXR5LCBjb21tYXMgb3IgZGFzaGVzIGNhbiBiZSBwbGFjZWQgYmV0d2VlbiB2YWx1ZXMuICAoQWN0dWFsbHksIGFueQorc2luZ2xlIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBvdGhlciB0aGFuICc6JyBvciAnOycgY2FuIGJlIGluc2VydGVkLikgIEZvcgorZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0d28gc2NhbiBkZWZpbml0aW9ucyBhcmUgZXF1aXZhbGVudDoKKwkwIDEgMjogMCA2MyAwIDA7CisJMCwxLDIgOiAwLTYzLCAwLDAgOworCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBzY2FuIHNjcmlwdCB0aGF0IGdlbmVyYXRlcyBhIHBhcnRpYWxseSBpbnRlcmxlYXZlZAorc2VxdWVudGlhbCBKUEVHIGZpbGU6CisKKwkwOwkJCSMgWSBvbmx5IGluIGZpcnN0IHNjYW4KKwkxIDI7CQkJIyBDYiBhbmQgQ3IgaW4gc2Vjb25kIHNjYW4KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgcHJvZ3Jlc3NpdmUgc2NhbiBzY3JpcHQgdXNpbmcgb25seSBzcGVjdHJhbCBzZWxlY3Rpb24KKyhubyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pOgorCisJIyBJbnRlcmxlYXZlZCBEQyBzY2FuIGZvciBZLENiLENyOgorCTAsMSwyOiAwLTAsICAgMCwgMCA7CisJIyBBQyBzY2FuczoKKwkwOiAgICAgMS0yLCAgIDAsIDAgOwkjIEZpcnN0IHR3byBZIEFDIGNvZWZmaWNpZW50cworCTA6ICAgICAzLTUsICAgMCwgMCA7CSMgVGhyZWUgbW9yZQorCTE6ICAgICAxLTYzLCAgMCwgMCA7CSMgQWxsIEFDIGNvZWZmaWNpZW50cyBmb3IgQ2IKKwkyOiAgICAgMS02MywgIDAsIDAgOwkjIEFsbCBBQyBjb2VmZmljaWVudHMgZm9yIENyCisJMDogICAgIDYtOSwgICAwLCAwIDsJIyBNb3JlIFkgY29lZmZpY2llbnRzCisJMDogICAgIDEwLTYzLCAwLCAwIDsJIyBSZW1haW5pbmcgWSBjb2VmZmljaWVudHMKKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgc3VjY2Vzc2l2ZS1hcHByb3hpbWF0aW9uIHNjcmlwdC4gIFRoaXMgaXMgZXF1aXZhbGVudAordG8gdGhlIGRlZmF1bHQgc2NyaXB0IHVzZWQgYnkgImNqcGVnIC1wcm9ncmVzc2l2ZSIgZm9yIFlDYkNyIGltYWdlczoKKworCSMgSW5pdGlhbCBEQyBzY2FuIGZvciBZLENiLENyIChsb3dlc3QgYml0IG5vdCBzZW50KQorCTAsMSwyOiAwLTAsICAgMCwgMSA7CisJIyBGaXJzdCBBQyBzY2FuOiBzZW5kIGZpcnN0IDUgWSBBQyBjb2VmZmljaWVudHMsIG1pbnVzIDIgbG93ZXN0IGJpdHM6CisJMDogICAgIDEtNSwgICAwLCAyIDsKKwkjIFNlbmQgYWxsIENyLENiIEFDIGNvZWZmaWNpZW50cywgbWludXMgbG93ZXN0IGJpdDoKKwkjIChjaHJvbWEgZGF0YSBpcyB1c3VhbGx5IHRvbyBzbWFsbCB0byBiZSB3b3J0aCBzdWJkaXZpZGluZyBmdXJ0aGVyOworCSMgIGJ1dCBub3RlIHdlIHNlbmQgQ3IgZmlyc3Qgc2luY2UgZXllIGlzIGxlYXN0IHNlbnNpdGl2ZSB0byBDYikKKwkyOiAgICAgMS02MywgIDAsIDEgOworCTE6ICAgICAxLTYzLCAgMCwgMSA7CisJIyBTZW5kIHJlbWFpbmluZyBZIEFDIGNvZWZmaWNpZW50cywgbWludXMgMiBsb3dlc3QgYml0czoKKwkwOiAgICAgNi02MywgIDAsIDIgOworCSMgU2VuZCBuZXh0LXRvLWxvd2VzdCBiaXQgb2YgYWxsIFkgQUMgY29lZmZpY2llbnRzOgorCTA6ICAgICAxLTYzLCAgMiwgMSA7CisJIyBBdCB0aGlzIHBvaW50IHdlJ3ZlIHNlbnQgYWxsIGJ1dCB0aGUgbG93ZXN0IGJpdCBvZiBhbGwgY29lZmZpY2llbnRzLgorCSMgU2VuZCBsb3dlc3QgYml0IG9mIERDIGNvZWZmaWNpZW50cworCTAsMSwyOiAwLTAsICAgMSwgMCA7CisJIyBTZW5kIGxvd2VzdCBiaXQgb2YgQUMgY29lZmZpY2llbnRzCisJMjogICAgIDEtNjMsICAxLCAwIDsKKwkxOiAgICAgMS02MywgIDEsIDAgOworCSMgWSBBQyBsb3dlc3QgYml0IHNjYW4gaXMgbGFzdDsgaXQncyB1c3VhbGx5IHRoZSBsYXJnZXN0IHNjYW4KKwkwOiAgICAgMS02MywgIDEsIDAgOworCitJdCBtYXkgYmUgd29ydGggcG9pbnRpbmcgb3V0IHRoYXQgdGhpcyBzY3JpcHQgaXMgdHVuZWQgZm9yIHF1YWxpdHkgc2V0dGluZ3MKK29mIGFyb3VuZCA1MCB0byA3NS4gIEZvciBsb3dlciBxdWFsaXR5IHNldHRpbmdzLCB5b3UnZCBwcm9iYWJseSB3YW50IHRvIHVzZQorYSBzY3JpcHQgd2l0aCBmZXdlciBzdGFnZXMgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIChvdGhlcndpc2UgdGhlCitpbml0aWFsIHNjYW5zIHdpbGwgYmUgcmVhbGx5IGJhZCkuICBGb3IgaGlnaGVyIHF1YWxpdHkgc2V0dGluZ3MsIHlvdSBtaWdodAord2FudCB0byB1c2UgbW9yZSBzdGFnZXMgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIChzbyB0aGF0IHRoZSBpbml0aWFsCitzY2FucyBhcmUgbm90IHRvbyBsYXJnZSkuCmRpZmYgLS1naXQgYS93cmJtcC5jIGIvd3JibXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjgzYjBmCi0tLSAvZGV2L251bGwKKysrIGIvd3JibXAuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIHdyYm1wLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIE1pY3Jvc29mdCAiQk1QIgorICogZm9ybWF0IChNUyBXaW5kb3dzIDMueCBhbmQgT1MvMiAxLnggZmxhdm9ycykuCisgKiBFaXRoZXIgOC1iaXQgY29sb3JtYXBwZWQgb3IgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGNhbiBiZSB3cml0dGVuLgorICogTm8gY29tcHJlc3Npb24gaXMgc3VwcG9ydGVkLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KKyAqCisgKiBUaGlzIGNvZGUgY29udHJpYnV0ZWQgYnkgSmFtZXMgQXJ0aHVyIEJvdWNoZXIuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIEJNUF9TVVBQT1JURUQKKworCisvKgorICogVG8gc3VwcG9ydCAxMi1iaXQgSlBFRyBkYXRhLCB3ZSdkIGhhdmUgdG8gc2NhbGUgb3V0cHV0IGRvd24gdG8gOCBiaXRzLgorICogVGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworLyoKKyAqIFNpbmNlIEJNUCBzdG9yZXMgc2NhbmxpbmVzIGJvdHRvbS10by10b3AsIHdlIGhhdmUgdG8gaW52ZXJ0IHRoZSBpbWFnZQorICogZnJvbSBKUEVHJ3MgdG9wLXRvLWJvdHRvbSBvcmRlci4gIFRvIGRvIHRoaXMsIHdlIHNhdmUgdGhlIG91dGdvaW5nIGRhdGEKKyAqIGluIGEgdmlydHVhbCBhcnJheSBkdXJpbmcgcHV0X3BpeGVsX3JvdyBjYWxscywgdGhlbiBhY3R1YWxseSBlbWl0IHRoZQorICogQk1QIGZpbGUgZHVyaW5nIGZpbmlzaF9vdXRwdXQuICBUaGUgdmlydHVhbCBhcnJheSBjb250YWlucyBvbmUgSlNBTVBMRSBwZXIKKyAqIHBpeGVsIGlmIHRoZSBvdXRwdXQgaXMgZ3JheXNjYWxlIG9yIGNvbG9ybWFwcGVkLCB0aHJlZSBpZiBpdCBpcyBmdWxsIGNvbG9yLgorICovCisKKy8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBib29sZWFuIGlzX29zMjsJCS8qIHNhdmVzIHRoZSBPUzIgZm9ybWF0IHJlcXVlc3QgZmxhZyAqLworCisgIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIG5lZWRlZCB0byByZXZlcnNlIHJvdyBvcmRlciAqLworICBKRElNRU5TSU9OIGRhdGFfd2lkdGg7CS8qIEpTQU1QTEVzIHBlciByb3cgKi8KKyAgSkRJTUVOU0lPTiByb3dfd2lkdGg7CQkvKiBwaHlzaWNhbCB3aWR0aCBvZiBvbmUgcm93IGluIHRoZSBCTVAgZmlsZSAqLworICBpbnQgcGFkX2J5dGVzOwkJLyogbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgbmVlZGVkIHBlciByb3cgKi8KKyAgSkRJTUVOU0lPTiBjdXJfb3V0cHV0X3JvdzsJLyogbmV4dCByb3cjIHRvIHdyaXRlIHRvIHZpcnR1YWwgYXJyYXkgKi8KK30gYm1wX2Rlc3Rfc3RydWN0OworCit0eXBlZGVmIGJtcF9kZXN0X3N0cnVjdCAqIGJtcF9kZXN0X3B0cjsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTE9DQUwodm9pZCkgd3JpdGVfY29sb3JtYXAKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0LAorCSAgICAgaW50IG1hcF9jb2xvcnMsIGludCBtYXBfZW50cnlfc2l6ZSkpOworCisKKy8qCisgKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCisgKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3Igd3JpdGluZyAyNC1iaXQgcGl4ZWxzICovCit7CisgIGJtcF9kZXN0X3B0ciBkZXN0ID0gKGJtcF9kZXN0X3B0cikgZGluZm87CisgIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgaW50IHBhZDsKKworICAvKiBBY2Nlc3MgbmV4dCByb3cgaW4gdmlydHVhbCBhcnJheSAqLworICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPndob2xlX2ltYWdlLAorICAgICBkZXN0LT5jdXJfb3V0cHV0X3JvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICBkZXN0LT5jdXJfb3V0cHV0X3JvdysrOworCisgIC8qIFRyYW5zZmVyIGRhdGEuICBOb3RlIGRlc3RpbmF0aW9uIHZhbHVlcyBtdXN0IGJlIGluIEJHUiBvcmRlcgorICAgKiAoZXZlbiB0aG91Z2ggTWljcm9zb2Z0J3Mgb3duIGRvY3VtZW50cyBzYXkgdGhlIG9wcG9zaXRlKS4KKyAgICovCisgIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgb3V0cHRyID0gaW1hZ2VfcHRyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgb3V0cHRyWzJdID0gKmlucHRyKys7CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KKyAgICBvdXRwdHJbMV0gPSAqaW5wdHIrKzsKKyAgICBvdXRwdHJbMF0gPSAqaW5wdHIrKzsKKyAgICBvdXRwdHIgKz0gMzsKKyAgfQorCisgIC8qIFplcm8gb3V0IHRoZSBwYWQgYnl0ZXMuICovCisgIHBhZCA9IGRlc3QtPnBhZF9ieXRlczsKKyAgd2hpbGUgKC0tcGFkID49IDApCisgICAgKm91dHB0cisrID0gMDsKK30KKworTUVUSE9EREVGKHZvaWQpCitwdXRfZ3JheV9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkgICAgICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciBncmF5c2NhbGUgT1IgcXVhbnRpemVkIGNvbG9yIG91dHB1dCAqLworeworICBibXBfZGVzdF9wdHIgZGVzdCA9IChibXBfZGVzdF9wdHIpIGRpbmZvOworICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIGludCBwYWQ7CisKKyAgLyogQWNjZXNzIG5leHQgcm93IGluIHZpcnR1YWwgYXJyYXkgKi8KKyAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT53aG9sZV9pbWFnZSwKKyAgICAgZGVzdC0+Y3VyX291dHB1dF9yb3csIChKRElNRU5TSU9OKSAxLCBUUlVFKTsKKyAgZGVzdC0+Y3VyX291dHB1dF9yb3crKzsKKworICAvKiBUcmFuc2ZlciBkYXRhLiAqLworICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIG91dHB0ciA9IGltYWdlX3B0clswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICpvdXRwdHIrKyA9ICppbnB0cisrOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCisgIH0KKworICAvKiBaZXJvIG91dCB0aGUgcGFkIGJ5dGVzLiAqLworICBwYWQgPSBkZXN0LT5wYWRfYnl0ZXM7CisgIHdoaWxlICgtLXBhZCA+PSAwKQorICAgICpvdXRwdHIrKyA9IDA7Cit9CisKKworLyoKKyAqIFN0YXJ0dXA6IG5vcm1hbGx5IHdyaXRlcyB0aGUgZmlsZSBoZWFkZXIuCisgKiBJbiB0aGlzIG1vZHVsZSB3ZSBtYXkgYXMgd2VsbCBwb3N0cG9uZSBldmVyeXRoaW5nIHVudGlsIGZpbmlzaF9vdXRwdXQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9vdXRwdXRfYm1wIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgLyogbm8gd29yayBoZXJlICovCit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICoKKyAqIEhlcmUgaXMgd2hlcmUgd2UgcmVhbGx5IG91dHB1dCB0aGUgQk1QIGZpbGUuCisgKgorICogRmlyc3QsIHJvdXRpbmVzIHRvIHdyaXRlIHRoZSBXaW5kb3dzIGFuZCBPUy8yIHZhcmlhbnRzIG9mIHRoZSBmaWxlIGhlYWRlci4KKyAqLworCitMT0NBTCh2b2lkKQord3JpdGVfYm1wX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QpCisvKiBXcml0ZSBhIFdpbmRvd3Mtc3R5bGUgQk1QIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgY29sb3JtYXAgaWYgbmVlZGVkICovCit7CisgIGNoYXIgYm1wZmlsZWhlYWRlclsxNF07CisgIGNoYXIgYm1waW5mb2hlYWRlcls0MF07CisjZGVmaW5lIFBVVF8yQihhcnJheSxvZmZzZXQsdmFsdWUpICBcCisJKGFycmF5W29mZnNldF0gPSAoY2hhcikgKCh2YWx1ZSkgJiAweEZGKSwgXAorCSBhcnJheVtvZmZzZXQrMV0gPSAoY2hhcikgKCgodmFsdWUpID4+IDgpICYgMHhGRikpCisjZGVmaW5lIFBVVF80QihhcnJheSxvZmZzZXQsdmFsdWUpICBcCisJKGFycmF5W29mZnNldF0gPSAoY2hhcikgKCh2YWx1ZSkgJiAweEZGKSwgXAorCSBhcnJheVtvZmZzZXQrMV0gPSAoY2hhcikgKCgodmFsdWUpID4+IDgpICYgMHhGRiksIFwKKwkgYXJyYXlbb2Zmc2V0KzJdID0gKGNoYXIpICgoKHZhbHVlKSA+PiAxNikgJiAweEZGKSwgXAorCSBhcnJheVtvZmZzZXQrM10gPSAoY2hhcikgKCgodmFsdWUpID4+IDI0KSAmIDB4RkYpKQorICBJTlQzMiBoZWFkZXJzaXplLCBiZlNpemU7CisgIGludCBiaXRzX3Blcl9waXhlbCwgY21hcF9lbnRyaWVzOworCisgIC8qIENvbXB1dGUgY29sb3JtYXAgc2l6ZSBhbmQgdG90YWwgZmlsZSBzaXplICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgICAgLyogQ29sb3JtYXBwZWQgUkdCICovCisgICAgICBiaXRzX3Blcl9waXhlbCA9IDg7CisgICAgICBjbWFwX2VudHJpZXMgPSAyNTY7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFVucXVhbnRpemVkLCBmdWxsIGNvbG9yIFJHQiAqLworICAgICAgYml0c19wZXJfcGl4ZWwgPSAyNDsKKyAgICAgIGNtYXBfZW50cmllcyA9IDA7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIEdyYXlzY2FsZSBvdXRwdXQuICBXZSBuZWVkIHRvIGZha2UgYSAyNTYtZW50cnkgY29sb3JtYXAuICovCisgICAgYml0c19wZXJfcGl4ZWwgPSA4OworICAgIGNtYXBfZW50cmllcyA9IDI1NjsKKyAgfQorICAvKiBGaWxlIHNpemUgKi8KKyAgaGVhZGVyc2l6ZSA9IDE0ICsgNDAgKyBjbWFwX2VudHJpZXMgKiA0OyAvKiBIZWFkZXIgYW5kIGNvbG9ybWFwICovCisgIGJmU2l6ZSA9IGhlYWRlcnNpemUgKyAoSU5UMzIpIGRlc3QtPnJvd193aWR0aCAqIChJTlQzMikgY2luZm8tPm91dHB1dF9oZWlnaHQ7CisgIAorICAvKiBTZXQgdW51c2VkIGZpZWxkcyBvZiBoZWFkZXIgdG8gMCAqLworICBNRU1aRVJPKGJtcGZpbGVoZWFkZXIsIFNJWkVPRihibXBmaWxlaGVhZGVyKSk7CisgIE1FTVpFUk8oYm1waW5mb2hlYWRlciwgU0laRU9GKGJtcGluZm9oZWFkZXIpKTsKKworICAvKiBGaWxsIHRoZSBmaWxlIGhlYWRlciAqLworICBibXBmaWxlaGVhZGVyWzBdID0gMHg0MjsJLyogZmlyc3QgMiBieXRlcyBhcmUgQVNDSUkgJ0InLCAnTScgKi8KKyAgYm1wZmlsZWhlYWRlclsxXSA9IDB4NEQ7CisgIFBVVF80QihibXBmaWxlaGVhZGVyLCAyLCBiZlNpemUpOyAvKiBiZlNpemUgKi8KKyAgLyogd2UgbGVhdmUgYmZSZXNlcnZlZDEgJiBiZlJlc2VydmVkMiA9IDAgKi8KKyAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDEwLCBoZWFkZXJzaXplKTsgLyogYmZPZmZCaXRzICovCisKKyAgLyogRmlsbCB0aGUgaW5mbyBoZWFkZXIgKE1pY3Jvc29mdCBjYWxscyB0aGlzIGEgQklUTUFQSU5GT0hFQURFUikgKi8KKyAgUFVUXzJCKGJtcGluZm9oZWFkZXIsIDAsIDQwKTsJLyogYmlTaXplICovCisgIFBVVF80QihibXBpbmZvaGVhZGVyLCA0LCBjaW5mby0+b3V0cHV0X3dpZHRoKTsgLyogYmlXaWR0aCAqLworICBQVVRfNEIoYm1waW5mb2hlYWRlciwgOCwgY2luZm8tPm91dHB1dF9oZWlnaHQpOyAvKiBiaUhlaWdodCAqLworICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMTIsIDEpOwkvKiBiaVBsYW5lcyAtIG11c3QgYmUgMSAqLworICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMTQsIGJpdHNfcGVyX3BpeGVsKTsgLyogYmlCaXRDb3VudCAqLworICAvKiB3ZSBsZWF2ZSBiaUNvbXByZXNzaW9uID0gMCwgZm9yIG5vbmUgKi8KKyAgLyogd2UgbGVhdmUgYmlTaXplSW1hZ2UgPSAwOyB0aGlzIGlzIGNvcnJlY3QgZm9yIHVuY29tcHJlc3NlZCBkYXRhICovCisgIGlmIChjaW5mby0+ZGVuc2l0eV91bml0ID09IDIpIHsgLyogaWYgaGF2ZSBkZW5zaXR5IGluIGRvdHMvY20sIHRoZW4gKi8KKyAgICBQVVRfNEIoYm1waW5mb2hlYWRlciwgMjQsIChJTlQzMikgKGNpbmZvLT5YX2RlbnNpdHkqMTAwKSk7IC8qIFhQZWxzL00gKi8KKyAgICBQVVRfNEIoYm1waW5mb2hlYWRlciwgMjgsIChJTlQzMikgKGNpbmZvLT5ZX2RlbnNpdHkqMTAwKSk7IC8qIFhQZWxzL00gKi8KKyAgfQorICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMzIsIGNtYXBfZW50cmllcyk7IC8qIGJpQ2xyVXNlZCAqLworICAvKiB3ZSBsZWF2ZSBiaUNsckltcG9ydGFudCA9IDAgKi8KKworICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGZpbGVoZWFkZXIsIDE0KSAhPSAoc2l6ZV90KSAxNCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworICBpZiAoSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGJtcGluZm9oZWFkZXIsIDQwKSAhPSAoc2l6ZV90KSA0MCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworCisgIGlmIChjbWFwX2VudHJpZXMgPiAwKQorICAgIHdyaXRlX2NvbG9ybWFwKGNpbmZvLCBkZXN0LCBjbWFwX2VudHJpZXMsIDQpOworfQorCisKK0xPQ0FMKHZvaWQpCit3cml0ZV9vczJfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCkKKy8qIFdyaXRlIGFuIE9TMi1zdHlsZSBCTVAgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyBjb2xvcm1hcCBpZiBuZWVkZWQgKi8KK3sKKyAgY2hhciBibXBmaWxlaGVhZGVyWzE0XTsKKyAgY2hhciBibXBjb3JlaGVhZGVyWzEyXTsKKyAgSU5UMzIgaGVhZGVyc2l6ZSwgYmZTaXplOworICBpbnQgYml0c19wZXJfcGl4ZWwsIGNtYXBfZW50cmllczsKKworICAvKiBDb21wdXRlIGNvbG9ybWFwIHNpemUgYW5kIHRvdGFsIGZpbGUgc2l6ZSAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICAgIC8qIENvbG9ybWFwcGVkIFJHQiAqLworICAgICAgYml0c19wZXJfcGl4ZWwgPSA4OworICAgICAgY21hcF9lbnRyaWVzID0gMjU2OworICAgIH0gZWxzZSB7CisgICAgICAvKiBVbnF1YW50aXplZCwgZnVsbCBjb2xvciBSR0IgKi8KKyAgICAgIGJpdHNfcGVyX3BpeGVsID0gMjQ7CisgICAgICBjbWFwX2VudHJpZXMgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBHcmF5c2NhbGUgb3V0cHV0LiAgV2UgbmVlZCB0byBmYWtlIGEgMjU2LWVudHJ5IGNvbG9ybWFwLiAqLworICAgIGJpdHNfcGVyX3BpeGVsID0gODsKKyAgICBjbWFwX2VudHJpZXMgPSAyNTY7CisgIH0KKyAgLyogRmlsZSBzaXplICovCisgIGhlYWRlcnNpemUgPSAxNCArIDEyICsgY21hcF9lbnRyaWVzICogMzsgLyogSGVhZGVyIGFuZCBjb2xvcm1hcCAqLworICBiZlNpemUgPSBoZWFkZXJzaXplICsgKElOVDMyKSBkZXN0LT5yb3dfd2lkdGggKiAoSU5UMzIpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAKKyAgLyogU2V0IHVudXNlZCBmaWVsZHMgb2YgaGVhZGVyIHRvIDAgKi8KKyAgTUVNWkVSTyhibXBmaWxlaGVhZGVyLCBTSVpFT0YoYm1wZmlsZWhlYWRlcikpOworICBNRU1aRVJPKGJtcGNvcmVoZWFkZXIsIFNJWkVPRihibXBjb3JlaGVhZGVyKSk7CisKKyAgLyogRmlsbCB0aGUgZmlsZSBoZWFkZXIgKi8KKyAgYm1wZmlsZWhlYWRlclswXSA9IDB4NDI7CS8qIGZpcnN0IDIgYnl0ZXMgYXJlIEFTQ0lJICdCJywgJ00nICovCisgIGJtcGZpbGVoZWFkZXJbMV0gPSAweDREOworICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMiwgYmZTaXplKTsgLyogYmZTaXplICovCisgIC8qIHdlIGxlYXZlIGJmUmVzZXJ2ZWQxICYgYmZSZXNlcnZlZDIgPSAwICovCisgIFBVVF80QihibXBmaWxlaGVhZGVyLCAxMCwgaGVhZGVyc2l6ZSk7IC8qIGJmT2ZmQml0cyAqLworCisgIC8qIEZpbGwgdGhlIGluZm8gaGVhZGVyIChNaWNyb3NvZnQgY2FsbHMgdGhpcyBhIEJJVE1BUENPUkVIRUFERVIpICovCisgIFBVVF8yQihibXBjb3JlaGVhZGVyLCAwLCAxMik7CS8qIGJjU2l6ZSAqLworICBQVVRfMkIoYm1wY29yZWhlYWRlciwgNCwgY2luZm8tPm91dHB1dF93aWR0aCk7IC8qIGJjV2lkdGggKi8KKyAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDYsIGNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsgLyogYmNIZWlnaHQgKi8KKyAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDgsIDEpOwkvKiBiY1BsYW5lcyAtIG11c3QgYmUgMSAqLworICBQVVRfMkIoYm1wY29yZWhlYWRlciwgMTAsIGJpdHNfcGVyX3BpeGVsKTsgLyogYmNCaXRDb3VudCAqLworCisgIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1wZmlsZWhlYWRlciwgMTQpICE9IChzaXplX3QpIDE0KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisgIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1wY29yZWhlYWRlciwgMTIpICE9IChzaXplX3QpIDEyKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisKKyAgaWYgKGNtYXBfZW50cmllcyA+IDApCisgICAgd3JpdGVfY29sb3JtYXAoY2luZm8sIGRlc3QsIGNtYXBfZW50cmllcywgMyk7Cit9CisKKworLyoKKyAqIFdyaXRlIHRoZSBjb2xvcm1hcC4KKyAqIFdpbmRvd3MgdXNlcyBCR1IwIG1hcCBlbnRyaWVzOyBPUy8yIHVzZXMgQkdSIGVudHJpZXMuCisgKi8KKworTE9DQUwodm9pZCkKK3dyaXRlX2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCwKKwkJaW50IG1hcF9jb2xvcnMsIGludCBtYXBfZW50cnlfc2l6ZSkKK3sKKyAgSlNBTVBBUlJBWSBjb2xvcm1hcCA9IGNpbmZvLT5jb2xvcm1hcDsKKyAgaW50IG51bV9jb2xvcnMgPSBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnM7CisgIEZJTEUgKiBvdXRmaWxlID0gZGVzdC0+cHViLm91dHB1dF9maWxlOworICBpbnQgaTsKKworICBpZiAoY29sb3JtYXAgIT0gTlVMTCkgeworICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykgeworICAgICAgLyogTm9ybWFsIGNhc2Ugd2l0aCBSR0IgY29sb3JtYXAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyBpKyspIHsKKwlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMl1baV0pLCBvdXRmaWxlKTsKKwlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMV1baV0pLCBvdXRmaWxlKTsKKwlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKKwlpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKKwkgIHB1dGMoMCwgb3V0ZmlsZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEdyYXlzY2FsZSBjb2xvcm1hcCAob25seSBoYXBwZW5zIHdpdGggZ3JheXNjYWxlIHF1YW50aXphdGlvbikgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyBpKyspIHsKKwlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKKwlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKKwlwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKKwlpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKKwkgIHB1dGMoMCwgb3V0ZmlsZSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIElmIG5vIGNvbG9ybWFwLCBtdXN0IGJlIGdyYXlzY2FsZSBkYXRhLiAgR2VuZXJhdGUgYSBsaW5lYXIgIm1hcCIuICovCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBwdXRjKGksIG91dGZpbGUpOworICAgICAgcHV0YyhpLCBvdXRmaWxlKTsKKyAgICAgIHB1dGMoaSwgb3V0ZmlsZSk7CisgICAgICBpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKKwlwdXRjKDAsIG91dGZpbGUpOworICAgIH0KKyAgfQorICAvKiBQYWQgY29sb3JtYXAgd2l0aCB6ZXJvcyB0byBlbnN1cmUgc3BlY2lmaWVkIG51bWJlciBvZiBjb2xvcm1hcCBlbnRyaWVzICovIAorICBpZiAoaSA+IG1hcF9jb2xvcnMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVE9PX01BTllfQ09MT1JTLCBpKTsKKyAgZm9yICg7IGkgPCBtYXBfY29sb3JzOyBpKyspIHsKKyAgICBwdXRjKDAsIG91dGZpbGUpOworICAgIHB1dGMoMCwgb3V0ZmlsZSk7CisgICAgcHV0YygwLCBvdXRmaWxlKTsKKyAgICBpZiAobWFwX2VudHJ5X3NpemUgPT0gNCkKKyAgICAgIHB1dGMoMCwgb3V0ZmlsZSk7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9vdXRwdXRfYm1wIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgYm1wX2Rlc3RfcHRyIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgRklMRSAqIG91dGZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7CisgIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBkYXRhX3B0cjsKKyAgSkRJTUVOU0lPTiByb3c7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisKKyAgLyogV3JpdGUgdGhlIGhlYWRlciBhbmQgY29sb3JtYXAgKi8KKyAgaWYgKGRlc3QtPmlzX29zMikKKyAgICB3cml0ZV9vczJfaGVhZGVyKGNpbmZvLCBkZXN0KTsKKyAgZWxzZQorICAgIHdyaXRlX2JtcF9oZWFkZXIoY2luZm8sIGRlc3QpOworCisgIC8qIFdyaXRlIHRoZSBmaWxlIGJvZHkgZnJvbSBvdXIgdmlydHVhbCBhcnJheSAqLworICBmb3IgKHJvdyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OyByb3cgPiAwOyByb3ctLSkgeworICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IChsb25nKSAoY2luZm8tPm91dHB1dF9oZWlnaHQgLSByb3cpOworICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgfQorICAgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT53aG9sZV9pbWFnZSwgcm93LTEsIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisgICAgZGF0YV9wdHIgPSBpbWFnZV9wdHJbMF07CisgICAgZm9yIChjb2wgPSBkZXN0LT5yb3dfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICBwdXRjKEdFVEpTQU1QTEUoKmRhdGFfcHRyKSwgb3V0ZmlsZSk7CisgICAgICBkYXRhX3B0cisrOworICAgIH0KKyAgfQorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOworCisgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KKyAgZmZsdXNoKG91dGZpbGUpOworICBpZiAoZmVycm9yKG91dGZpbGUpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Cit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEJNUCBmb3JtYXQgb3V0cHV0LgorICovCisKK0dMT0JBTChkanBlZ19kZXN0X3B0cikKK2ppbml0X3dyaXRlX2JtcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19vczIpCit7CisgIGJtcF9kZXN0X3B0ciBkZXN0OworICBKRElNRU5TSU9OIHJvd193aWR0aDsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCisgIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihibXBfZGVzdF9zdHJ1Y3QpKTsKKyAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9ibXA7CisgIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9ibXA7CisgIGRlc3QtPmlzX29zMiA9IGlzX29zMjsKKworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKKyAgfSBlbHNlIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7CisgICAgZWxzZQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7CisgIH0gZWxzZSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQ09MT1JTUEFDRSk7CisgIH0KKworICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCisgIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7CisKKyAgLyogRGV0ZXJtaW5lIHdpZHRoIG9mIHJvd3MgaW4gdGhlIEJNUCBmaWxlIChwYWRkZWQgdG8gNC1ieXRlIGJvdW5kYXJ5KS4gKi8KKyAgcm93X3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKKyAgZGVzdC0+ZGF0YV93aWR0aCA9IHJvd193aWR0aDsKKyAgd2hpbGUgKChyb3dfd2lkdGggJiAzKSAhPSAwKSByb3dfd2lkdGgrKzsKKyAgZGVzdC0+cm93X3dpZHRoID0gcm93X3dpZHRoOworICBkZXN0LT5wYWRfYnl0ZXMgPSAoaW50KSAocm93X3dpZHRoIC0gZGVzdC0+ZGF0YV93aWR0aCk7CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGludmVyc2lvbiBhcnJheSwgcHJlcGFyZSBmb3Igd3JpdGUgcGFzcyAqLworICBkZXN0LT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKyAgICAgcm93X3dpZHRoLCBjaW5mby0+b3V0cHV0X2hlaWdodCwgKEpESU1FTlNJT04pIDEpOworICBkZXN0LT5jdXJfb3V0cHV0X3JvdyA9IDA7CisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7IC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLworICB9CisKKyAgLyogQ3JlYXRlIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLworICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgcm93X3dpZHRoLCAoSkRJTUVOU0lPTikgMSk7CisgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKworICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OworfQorCisjZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvd3JnaWYuYyBiL3dyZ2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlODMyOAotLS0gL2Rldi9udWxsCisrKyBiL3dyZ2lmLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiB3cmdpZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBHSUYgZm9ybWF0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogdG8gYXZvaWQgZW50YW5nbGVtZW50cyB3aXRoIFVuaXN5cycgcGF0ZW50IG9uIExaVyBjb21wcmVzc2lvbiwgICAqCisgKiB0aGlzIGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gb3V0cHV0ICJ1bmNvbXByZXNzZWQgR0lGIiBmaWxlcy4gICAgICAgICoKKyAqIFRoZXJlIGlzIG5vIHRyYWNlIG9mIHRoZSBMWlcgYWxnb3JpdGhtIGluIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bworICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgorICovCisKKy8qCisgKiBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiBwcG10b2dpZiBmcm9tIHRoZSBQQk1QTFVTIGRpc3RyaWJ1dGlvbgorICogb2YgRmViLiAxOTkxLiAgVGhhdCBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IG5vdGljZToKKyAqICAgIEJhc2VkIG9uIEdJRkVOQ09ERSBieSBEYXZpZCBSb3dsZXkgPG1nYXJkaUB3YXRkc2N1LndhdGVybG9vLmVkdT4uCisgKiAgICBMZW1wZWwtWml2IGNvbXByZXNzaW9uIGJhc2VkIG9uICJjb21wcmVzcyIgYnkgU3BlbmNlciBXLiBUaG9tYXMgZXQgYWwuCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5ODkgYnkgSmVmIFBvc2thbnplci4KKyAqICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogICAgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAorICogICAgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqICAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqICAgIGRvY3VtZW50YXRpb24uICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCisgKiAgICBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFdlIGFyZSBhbHNvIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKKyAqICAgICJUaGUgR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0KGMpIGlzIHRoZSBDb3B5cmlnaHQgcHJvcGVydHkgb2YKKyAqICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCisgKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4iCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIEdJRl9TVVBQT1JURUQKKworCisvKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgal9kZWNvbXByZXNzX3B0ciBjaW5mbzsJLyogYmFjayBsaW5rIHNhdmVzIHBhc3Npbmcgc2VwYXJhdGUgcGFybSAqLworCisgIC8qIFN0YXRlIGZvciBwYWNraW5nIHZhcmlhYmxlLXdpZHRoIGNvZGVzIGludG8gYSBiaXRzdHJlYW0gKi8KKyAgaW50IG5fYml0czsJCQkvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzL2NvZGUgKi8KKyAgaW50IG1heGNvZGU7CQkJLyogbWF4aW11bSBjb2RlLCBnaXZlbiBuX2JpdHMgKi8KKyAgSU5UMzIgY3VyX2FjY3VtOwkJLyogaG9sZHMgYml0cyBub3QgeWV0IG91dHB1dCAqLworICBpbnQgY3VyX2JpdHM7CQkJLyogIyBvZiBiaXRzIGluIGN1cl9hY2N1bSAqLworCisgIC8qIFN0YXRlIGZvciBHSUYgY29kZSBhc3NpZ25tZW50ICovCisgIGludCBDbGVhckNvZGU7CQkvKiBjbGVhciBjb2RlIChkb2Vzbid0IGNoYW5nZSkgKi8KKyAgaW50IEVPRkNvZGU7CQkJLyogRU9GIGNvZGUgKGRpdHRvKSAqLworICBpbnQgY29kZV9jb3VudGVyOwkJLyogY291bnRzIG91dHB1dCBzeW1ib2xzICovCisKKyAgLyogR0lGIGRhdGEgcGFja2V0IGNvbnN0cnVjdGlvbiBidWZmZXIgKi8KKyAgaW50IGJ5dGVzaW5wa3Q7CQkvKiAjIG9mIGJ5dGVzIGluIGN1cnJlbnQgcGFja2V0ICovCisgIGNoYXIgcGFja2V0YnVmWzI1Nl07CQkvKiB3b3Jrc3BhY2UgZm9yIGFjY3VtdWxhdGluZyBwYWNrZXQgKi8KKworfSBnaWZfZGVzdF9zdHJ1Y3Q7CisKK3R5cGVkZWYgZ2lmX2Rlc3Rfc3RydWN0ICogZ2lmX2Rlc3RfcHRyOworCisvKiBMYXJnZXN0IHZhbHVlIHRoYXQgd2lsbCBmaXQgaW4gTiBiaXRzICovCisjZGVmaW5lIE1BWENPREUobl9iaXRzKQkoKDEgPDwgKG5fYml0cykpIC0gMSkKKworCisvKgorICogUm91dGluZXMgdG8gcGFja2FnZSBmaW5pc2hlZCBkYXRhIGJ5dGVzIGludG8gR0lGIGRhdGEgYmxvY2tzLgorICogQSBkYXRhIGJsb2NrIGNvbnNpc3RzIG9mIGEgY291bnQgYnl0ZSAoMS4uMjU1KSBhbmQgdGhhdCBtYW55IGRhdGEgYnl0ZXMuCisgKi8KKworTE9DQUwodm9pZCkKK2ZsdXNoX3BhY2tldCAoZ2lmX2Rlc3RfcHRyIGRpbmZvKQorLyogZmx1c2ggYW55IGFjY3VtdWxhdGVkIGRhdGEgKi8KK3sKKyAgaWYgKGRpbmZvLT5ieXRlc2lucGt0ID4gMCkgewkvKiBuZXZlciB3cml0ZSB6ZXJvLWxlbmd0aCBwYWNrZXQgKi8KKyAgICBkaW5mby0+cGFja2V0YnVmWzBdID0gKGNoYXIpIGRpbmZvLT5ieXRlc2lucGt0Kys7CisgICAgaWYgKEpGV1JJVEUoZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSwgZGluZm8tPnBhY2tldGJ1ZiwgZGluZm8tPmJ5dGVzaW5wa3QpCisJIT0gKHNpemVfdCkgZGluZm8tPmJ5dGVzaW5wa3QpCisgICAgICBFUlJFWElUKGRpbmZvLT5jaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKKyAgICBkaW5mby0+Ynl0ZXNpbnBrdCA9IDA7CisgIH0KK30KKworCisvKiBBZGQgYSBjaGFyYWN0ZXIgdG8gY3VycmVudCBwYWNrZXQ7IGZsdXNoIHRvIGRpc2sgaWYgbmVjZXNzYXJ5ICovCisjZGVmaW5lIENIQVJfT1VUKGRpbmZvLGMpICBcCisJeyAoZGluZm8pLT5wYWNrZXRidWZbKysoZGluZm8pLT5ieXRlc2lucGt0XSA9IChjaGFyKSAoYyk7ICBcCisJICAgIGlmICgoZGluZm8pLT5ieXRlc2lucGt0ID49IDI1NSkgIFwKKwkgICAgICBmbHVzaF9wYWNrZXQoZGluZm8pOyAgXAorCX0KKworCisvKiBSb3V0aW5lIHRvIGNvbnZlcnQgdmFyaWFibGUtd2lkdGggY29kZXMgaW50byBhIGJ5dGUgc3RyZWFtICovCisKK0xPQ0FMKHZvaWQpCitvdXRwdXQgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGNvZGUpCisvKiBFbWl0IGEgY29kZSBvZiBuX2JpdHMgYml0cyAqLworLyogVXNlcyBjdXJfYWNjdW0gYW5kIGN1cl9iaXRzIHRvIHJlYmxvY2sgaW50byA4LWJpdCBieXRlcyAqLworeworICBkaW5mby0+Y3VyX2FjY3VtIHw9ICgoSU5UMzIpIGNvZGUpIDw8IGRpbmZvLT5jdXJfYml0czsKKyAgZGluZm8tPmN1cl9iaXRzICs9IGRpbmZvLT5uX2JpdHM7CisKKyAgd2hpbGUgKGRpbmZvLT5jdXJfYml0cyA+PSA4KSB7CisgICAgQ0hBUl9PVVQoZGluZm8sIGRpbmZvLT5jdXJfYWNjdW0gJiAweEZGKTsKKyAgICBkaW5mby0+Y3VyX2FjY3VtID4+PSA4OworICAgIGRpbmZvLT5jdXJfYml0cyAtPSA4OworICB9Cit9CisKKworLyogVGhlIHBzZXVkby1jb21wcmVzc2lvbiBhbGdvcml0aG0uCisgKgorICogSW4gdGhpcyBtb2R1bGUgd2Ugc2ltcGx5IG91dHB1dCBlYWNoIHBpeGVsIHZhbHVlIGFzIGEgc2VwYXJhdGUgc3ltYm9sOworICogdGh1cywgbm8gY29tcHJlc3Npb24gb2NjdXJzLiAgSW4gZmFjdCwgdGhlcmUgaXMgZXhwYW5zaW9uIG9mIG9uZSBiaXQgcGVyCisgKiBwaXhlbCwgYmVjYXVzZSB3ZSB1c2UgYSBzeW1ib2wgd2lkdGggb25lIGJpdCB3aWRlciB0aGFuIHRoZSBwaXhlbCB3aWR0aC4KKyAqCisgKiBHSUYgb3JkaW5hcmlseSB1c2VzIHZhcmlhYmxlLXdpZHRoIHN5bWJvbHMsIGFuZCB0aGUgZGVjb2RlciB3aWxsIGV4cGVjdAorICogdG8gcmF0Y2hldCB1cCB0aGUgc3ltYm9sIHdpZHRoIGFmdGVyIGEgZml4ZWQgbnVtYmVyIG9mIHN5bWJvbHMuCisgKiBUbyBzaW1wbGlmeSB0aGUgbG9naWMgYW5kIGtlZXAgdGhlIGV4cGFuc2lvbiBwZW5hbHR5IGRvd24sIHdlIGVtaXQgYQorICogR0lGIENsZWFyIGNvZGUgdG8gcmVzZXQgdGhlIGRlY29kZXIganVzdCBiZWZvcmUgdGhlIHdpZHRoIHdvdWxkIHJhdGNoZXQgdXAuCisgKiBUaHVzLCBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIG91dHB1dCBmaWxlIHdpbGwgaGF2ZSB0aGUgc2FtZSBiaXQgd2lkdGguCisgKiBOb3RlIHRoYXQgZW1pdHRpbmcgdGhlIENsZWFyIGNvZGVzIGF0IHRoZSByaWdodCB0aW1lcyBpcyBhIG1lcmUgbWF0dGVyIG9mCisgKiBjb3VudGluZyBvdXRwdXQgc3ltYm9scyBhbmQgaXMgaW4gbm8gd2F5IGRlcGVuZGVudCBvbiB0aGUgTFpXIHBhdGVudC4KKyAqCisgKiBXaXRoIGEgc21hbGwgYmFzaWMgcGl4ZWwgd2lkdGggKGxvdyBjb2xvciBjb3VudCksIENsZWFyIGNvZGVzIHdpbGwgYmUKKyAqIG5lZWRlZCB2ZXJ5IGZyZXF1ZW50bHksIGNhdXNpbmcgdGhlIGZpbGUgdG8gZXhwYW5kIGV2ZW4gbW9yZS4gIFNvIHRoaXMKKyAqIHNpbXBsaXN0aWMgYXBwcm9hY2ggd291bGRuJ3Qgd29yayB0b28gd2VsbCBvbiBiaWxldmVsIGltYWdlcywgZm9yIGV4YW1wbGUuCisgKiBCdXQgZm9yIG91dHB1dCBvZiBKUEVHIGNvbnZlcnNpb25zIHRoZSBwaXhlbCB3aWR0aCB3aWxsIHVzdWFsbHkgYmUgOCBiaXRzCisgKiAoMTI5IHRvIDI1NiBjb2xvcnMpLCBzbyB0aGUgb3ZlcmhlYWQgYWRkZWQgYnkgQ2xlYXIgc3ltYm9scyBpcyBvbmx5IGFib3V0CisgKiBvbmUgc3ltYm9sIGluIGV2ZXJ5IDI1Ni4KKyAqLworCitMT0NBTCh2b2lkKQorY29tcHJlc3NfaW5pdCAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgaV9iaXRzKQorLyogSW5pdGlhbGl6ZSBwc2V1ZG8tY29tcHJlc3NvciAqLworeworICAvKiBpbml0IGFsbCB0aGUgc3RhdGUgdmFyaWFibGVzICovCisgIGRpbmZvLT5uX2JpdHMgPSBpX2JpdHM7CisgIGRpbmZvLT5tYXhjb2RlID0gTUFYQ09ERShkaW5mby0+bl9iaXRzKTsKKyAgZGluZm8tPkNsZWFyQ29kZSA9ICgxIDw8IChpX2JpdHMgLSAxKSk7CisgIGRpbmZvLT5FT0ZDb2RlID0gZGluZm8tPkNsZWFyQ29kZSArIDE7CisgIGRpbmZvLT5jb2RlX2NvdW50ZXIgPSBkaW5mby0+Q2xlYXJDb2RlICsgMjsKKyAgLyogaW5pdCBvdXRwdXQgYnVmZmVyaW5nIHZhcnMgKi8KKyAgZGluZm8tPmJ5dGVzaW5wa3QgPSAwOworICBkaW5mby0+Y3VyX2FjY3VtID0gMDsKKyAgZGluZm8tPmN1cl9iaXRzID0gMDsKKyAgLyogR0lGIHNwZWNpZmllcyBhbiBpbml0aWFsIENsZWFyIGNvZGUgKi8KKyAgb3V0cHV0KGRpbmZvLCBkaW5mby0+Q2xlYXJDb2RlKTsKK30KKworCitMT0NBTCh2b2lkKQorY29tcHJlc3NfcGl4ZWwgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IGMpCisvKiBBY2NlcHQgYW5kICJjb21wcmVzcyIgb25lIHBpeGVsIHZhbHVlLgorICogVGhlIGdpdmVuIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG5fYml0cyB3aWRlLgorICovCit7CisgIC8qIE91dHB1dCB0aGUgZ2l2ZW4gcGl4ZWwgdmFsdWUgYXMgYSBzeW1ib2wuICovCisgIG91dHB1dChkaW5mbywgYyk7CisgIC8qIElzc3VlIENsZWFyIGNvZGVzIG9mdGVuIGVub3VnaCB0byBrZWVwIHRoZSByZWFkZXIgZnJvbSByYXRjaGV0aW5nIHVwCisgICAqIGl0cyBzeW1ib2wgc2l6ZS4KKyAgICovCisgIGlmIChkaW5mby0+Y29kZV9jb3VudGVyIDwgZGluZm8tPm1heGNvZGUpIHsKKyAgICBkaW5mby0+Y29kZV9jb3VudGVyKys7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0KGRpbmZvLCBkaW5mby0+Q2xlYXJDb2RlKTsKKyAgICBkaW5mby0+Y29kZV9jb3VudGVyID0gZGluZm8tPkNsZWFyQ29kZSArIDI7CS8qIHJlc2V0IHRoZSBjb3VudGVyICovCisgIH0KK30KKworCitMT0NBTCh2b2lkKQorY29tcHJlc3NfdGVybSAoZ2lmX2Rlc3RfcHRyIGRpbmZvKQorLyogQ2xlYW4gdXAgYXQgZW5kICovCit7CisgIC8qIFNlbmQgYW4gRU9GIGNvZGUgKi8KKyAgb3V0cHV0KGRpbmZvLCBkaW5mby0+RU9GQ29kZSk7CisgIC8qIEZsdXNoIHRoZSBiaXQtcGFja2luZyBidWZmZXIgKi8KKyAgaWYgKGRpbmZvLT5jdXJfYml0cyA+IDApIHsKKyAgICBDSEFSX09VVChkaW5mbywgZGluZm8tPmN1cl9hY2N1bSAmIDB4RkYpOworICB9CisgIC8qIEZsdXNoIHRoZSBwYWNrZXQgYnVmZmVyICovCisgIGZsdXNoX3BhY2tldChkaW5mbyk7Cit9CisKKworLyogR0lGIGhlYWRlciBjb25zdHJ1Y3Rpb24gKi8KKworCitMT0NBTCh2b2lkKQorcHV0X3dvcmQgKGdpZl9kZXN0X3B0ciBkaW5mbywgdW5zaWduZWQgaW50IHcpCisvKiBFbWl0IGEgMTYtYml0IHdvcmQsIExTQiBmaXJzdCAqLworeworICBwdXRjKHcgJiAweEZGLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0YygodyA+PiA4KSAmIDB4RkYsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworfQorCisKK0xPQ0FMKHZvaWQpCitwdXRfM2J5dGVzIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCB2YWwpCisvKiBFbWl0IDMgY29waWVzIG9mIHNhbWUgYnl0ZSB2YWx1ZSAtLS0gaGFuZHkgc3ViciBmb3IgY29sb3JtYXAgY29uc3RydWN0aW9uICovCit7CisgIHB1dGModmFsLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0Yyh2YWwsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKHZhbCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfaGVhZGVyIChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBudW1fY29sb3JzLCBKU0FNUEFSUkFZIGNvbG9ybWFwKQorLyogT3V0cHV0IHRoZSBHSUYgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyBjb2xvciBtYXAgKi8KKy8qIElmIGNvbG9ybWFwPT1OVUxMLCBzeW50aGVzaXplIGEgZ3JheS1zY2FsZSBjb2xvcm1hcCAqLworeworICBpbnQgQml0c1BlclBpeGVsLCBDb2xvck1hcFNpemUsIEluaXRDb2RlU2l6ZSwgRmxhZ0J5dGU7CisgIGludCBjc2hpZnQgPSBkaW5mby0+Y2luZm8tPmRhdGFfcHJlY2lzaW9uIC0gODsKKyAgaW50IGk7CisKKyAgaWYgKG51bV9jb2xvcnMgPiAyNTYpCisgICAgRVJSRVhJVDEoZGluZm8tPmNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgbnVtX2NvbG9ycyk7CisgIC8qIENvbXB1dGUgYml0cy9waXhlbCBhbmQgcmVsYXRlZCB2YWx1ZXMgKi8KKyAgQml0c1BlclBpeGVsID0gMTsKKyAgd2hpbGUgKG51bV9jb2xvcnMgPiAoMSA8PCBCaXRzUGVyUGl4ZWwpKQorICAgIEJpdHNQZXJQaXhlbCsrOworICBDb2xvck1hcFNpemUgPSAxIDw8IEJpdHNQZXJQaXhlbDsKKyAgaWYgKEJpdHNQZXJQaXhlbCA8PSAxKQorICAgIEluaXRDb2RlU2l6ZSA9IDI7CisgIGVsc2UKKyAgICBJbml0Q29kZVNpemUgPSBCaXRzUGVyUGl4ZWw7CisgIC8qCisgICAqIFdyaXRlIHRoZSBHSUYgaGVhZGVyLgorICAgKiBOb3RlIHRoYXQgd2UgZ2VuZXJhdGUgYSBwbGFpbiBHSUY4NyBoZWFkZXIgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eS4KKyAgICovCisgIHB1dGMoJ0cnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0YygnSScsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKCdGJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGMoJzgnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0YygnNycsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKCdhJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIC8qIFdyaXRlIHRoZSBMb2dpY2FsIFNjcmVlbiBEZXNjcmlwdG9yICovCisgIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF93aWR0aCk7CisgIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF9oZWlnaHQpOworICBGbGFnQnl0ZSA9IDB4ODA7CQkvKiBZZXMsIHRoZXJlIGlzIGEgZ2xvYmFsIGNvbG9yIHRhYmxlICovCisgIEZsYWdCeXRlIHw9IChCaXRzUGVyUGl4ZWwtMSkgPDwgNDsgLyogY29sb3IgcmVzb2x1dGlvbiAqLworICBGbGFnQnl0ZSB8PSAoQml0c1BlclBpeGVsLTEpOwkvKiBzaXplIG9mIGdsb2JhbCBjb2xvciB0YWJsZSAqLworICBwdXRjKEZsYWdCeXRlLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0YygwLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsgLyogQmFja2dyb3VuZCBjb2xvciBpbmRleCAqLworICBwdXRjKDAsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOyAvKiBSZXNlcnZlZCAoYXNwZWN0IHJhdGlvIGluIEdJRjg5KSAqLworICAvKiBXcml0ZSB0aGUgR2xvYmFsIENvbG9yIE1hcCAqLworICAvKiBJZiB0aGUgY29sb3IgbWFwIGlzIG1vcmUgdGhhbiA4IGJpdHMgcHJlY2lzaW9uLCAqLworICAvKiB3ZSByZWR1Y2UgaXQgdG8gOCBiaXRzIGJ5IHNoaWZ0aW5nICovCisgIGZvciAoaT0wOyBpIDwgQ29sb3JNYXBTaXplOyBpKyspIHsKKyAgICBpZiAoaSA8IG51bV9jb2xvcnMpIHsKKyAgICAgIGlmIChjb2xvcm1hcCAhPSBOVUxMKSB7CisJaWYgKGRpbmZvLT5jaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKwkgIC8qIE5vcm1hbCBjYXNlOiBSR0IgY29sb3IgbWFwICovCisJICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisJICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMV1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisJICBwdXRjKEdFVEpTQU1QTEUoY29sb3JtYXBbMl1baV0pID4+IGNzaGlmdCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisJfSBlbHNlIHsKKwkgIC8qIEdyYXlzY2FsZSAiY29sb3IgbWFwIjogcG9zc2libGUgaWYgcXVhbnRpemluZyBncmF5c2NhbGUgaW1hZ2UgKi8KKwkgIHB1dF8zYnl0ZXMoZGluZm8sIEdFVEpTQU1QTEUoY29sb3JtYXBbMF1baV0pID4+IGNzaGlmdCk7CisJfQorICAgICAgfSBlbHNlIHsKKwkvKiBDcmVhdGUgYSBncmF5LXNjYWxlIG1hcCBvZiBudW1fY29sb3JzIHZhbHVlcywgcmFuZ2UgMC4uMjU1ICovCisJcHV0XzNieXRlcyhkaW5mbywgKGkgKiAyNTUgKyAobnVtX2NvbG9ycy0xKS8yKSAvIChudW1fY29sb3JzLTEpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogZmlsbCBvdXQgdGhlIG1hcCB0byBhIHBvd2VyIG9mIDIgKi8KKyAgICAgIHB1dF8zYnl0ZXMoZGluZm8sIDApOworICAgIH0KKyAgfQorICAvKiBXcml0ZSBpbWFnZSBzZXBhcmF0b3IgYW5kIEltYWdlIERlc2NyaXB0b3IgKi8KKyAgcHV0YygnLCcsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOyAvKiBzZXBhcmF0b3IgKi8KKyAgcHV0X3dvcmQoZGluZm8sIDApOwkJLyogbGVmdC90b3Agb2Zmc2V0ICovCisgIHB1dF93b3JkKGRpbmZvLCAwKTsKKyAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X3dpZHRoKTsgLyogaW1hZ2Ugc2l6ZSAqLworICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsKKyAgLyogZmxhZyBieXRlOiBub3QgaW50ZXJsYWNlZCwgbm8gbG9jYWwgY29sb3IgbWFwICovCisgIHB1dGMoMHgwMCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIC8qIFdyaXRlIEluaXRpYWwgQ29kZSBTaXplIGJ5dGUgKi8KKyAgcHV0YyhJbml0Q29kZVNpemUsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworCisgIC8qIEluaXRpYWxpemUgZm9yICJjb21wcmVzc2lvbiIgb2YgaW1hZ2UgZGF0YSAqLworICBjb21wcmVzc19pbml0KGRpbmZvLCBJbml0Q29kZVNpemUrMSk7Cit9CisKKworLyoKKyAqIFN0YXJ0dXA6IHdyaXRlIHRoZSBmaWxlIGhlYWRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X291dHB1dF9naWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICBnaWZfZGVzdF9wdHIgZGVzdCA9IChnaWZfZGVzdF9wdHIpIGRpbmZvOworCisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorICAgIGVtaXRfaGVhZGVyKGRlc3QsIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycywgY2luZm8tPmNvbG9ybWFwKTsKKyAgZWxzZQorICAgIGVtaXRfaGVhZGVyKGRlc3QsIDI1NiwgKEpTQU1QQVJSQVkpIE5VTEwpOworfQorCisKKy8qCisgKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCisgKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKK3sKKyAgZ2lmX2Rlc3RfcHRyIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgY29tcHJlc3NfcGl4ZWwoZGVzdCwgR0VUSlNBTVBMRSgqcHRyKyspKTsKKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9vdXRwdXRfZ2lmIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgZ2lmX2Rlc3RfcHRyIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKSBkaW5mbzsKKworICAvKiBGbHVzaCAiY29tcHJlc3Npb24iIG1lY2hhbmlzbSAqLworICBjb21wcmVzc190ZXJtKGRlc3QpOworICAvKiBXcml0ZSBhIHplcm8tbGVuZ3RoIGRhdGEgYmxvY2sgdG8gZW5kIHRoZSBzZXJpZXMgKi8KKyAgcHV0YygwLCBkZXN0LT5wdWIub3V0cHV0X2ZpbGUpOworICAvKiBXcml0ZSB0aGUgR0lGIHRlcm1pbmF0b3IgbWFyayAqLworICBwdXRjKCc7JywgZGVzdC0+cHViLm91dHB1dF9maWxlKTsKKyAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLworICBmZmx1c2goZGVzdC0+cHViLm91dHB1dF9maWxlKTsKKyAgaWYgKGZlcnJvcihkZXN0LT5wdWIub3V0cHV0X2ZpbGUpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Cit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIEdJRiBmb3JtYXQgb3V0cHV0LgorICovCisKK0dMT0JBTChkanBlZ19kZXN0X3B0cikKK2ppbml0X3dyaXRlX2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgZ2lmX2Rlc3RfcHRyIGRlc3Q7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLworICBkZXN0ID0gKGdpZl9kZXN0X3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YoZ2lmX2Rlc3Rfc3RydWN0KSk7CisgIGRlc3QtPmNpbmZvID0gY2luZm87CQkvKiBtYWtlIGJhY2sgbGluayBmb3Igc3Vicm91dGluZXMgKi8KKyAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9naWY7CisgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOworICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfZ2lmOworCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgJiYKKyAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0dJRl9DT0xPUlNQQUNFKTsKKworICAvKiBGb3JjZSBxdWFudGl6YXRpb24gaWYgY29sb3Igb3IgaWYgPiA4IGJpdHMgaW5wdXQgKi8KKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX0dSQVlTQ0FMRSB8fCBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KSB7CisgICAgLyogRm9yY2UgcXVhbnRpemF0aW9uIHRvIGF0IG1vc3QgMjU2IGNvbG9ycyAqLworICAgIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOworICAgIGlmIChjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID4gMjU2KQorICAgICAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KKyAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKKworICBpZiAoY2luZm8tPm91dHB1dF9jb21wb25lbnRzICE9IDEpIC8qIHNhZmV0eSBjaGVjazoganVzdCBvbmUgY29tcG9uZW50PyAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfR0lGX0JVRyk7CisKKyAgLyogQ3JlYXRlIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLworICBkZXN0LT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgY2luZm8tPm91dHB1dF93aWR0aCwgKEpESU1FTlNJT04pIDEpOworICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisKKyAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKK30KKworI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3dyanBnY29tLjEgYi93cmpwZ2NvbS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTlhOTkKLS0tIC9kZXYvbnVsbAorKysgYi93cmpwZ2NvbS4xCkBAIC0wLDAgKzEsMTAzIEBACisuVEggV1JKUEdDT00gMSAiMTUgSnVuZSAxOTk1IgorLlNIIE5BTUUKK3dyanBnY29tIFwtIGluc2VydCB0ZXh0IGNvbW1lbnRzIGludG8gYSBKUEVHIGZpbGUKKy5TSCBTWU5PUFNJUworLkIgd3JqcGdjb20KK1sKKy5CIFwtcmVwbGFjZQorXQorWworLkJJIFwtY29tbWVudCAiIHRleHQiCitdCitbCisuQkkgXC1jZmlsZSAiIG5hbWUiCitdCitbCisuSSBmaWxlbmFtZQorXQorLkxQCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgd3JqcGdjb20KK3JlYWRzIHRoZSBuYW1lZCBKUEVHL0pGSUYgZmlsZSwgb3IgdGhlIHN0YW5kYXJkIGlucHV0IGlmIG5vIGZpbGUgaXMgbmFtZWQsCithbmQgZ2VuZXJhdGVzIGEgbmV3IEpQRUcvSkZJRiBmaWxlIG9uIHN0YW5kYXJkIG91dHB1dC4gIEEgY29tbWVudCBibG9jayBpcworYWRkZWQgdG8gdGhlIGZpbGUuCisuUFAKK1RoZSBKUEVHIHN0YW5kYXJkIGFsbG93cyAiY29tbWVudCIgKENPTSkgYmxvY2tzIHRvIG9jY3VyIHdpdGhpbiBhIEpQRUcgZmlsZS4KK0FsdGhvdWdoIHRoZSBzdGFuZGFyZCBkb2Vzbid0IGFjdHVhbGx5IGRlZmluZSB3aGF0IENPTSBibG9ja3MgYXJlIGZvciwgdGhleQorYXJlIHdpZGVseSB1c2VkIHRvIGhvbGQgdXNlci1zdXBwbGllZCB0ZXh0IHN0cmluZ3MuICBUaGlzIGxldHMgeW91IGFkZAorYW5ub3RhdGlvbnMsIHRpdGxlcywgaW5kZXggdGVybXMsIGV0YyB0byB5b3VyIEpQRUcgZmlsZXMsIGFuZCBsYXRlciByZXRyaWV2ZQordGhlbSBhcyB0ZXh0LiAgQ09NIGJsb2NrcyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIGltYWdlIHN0b3JlZCBpbiB0aGUgSlBFRworZmlsZS4gIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBDT00gYmxvY2sgaXMgNjRLLCBidXQgeW91IGNhbiBoYXZlIGFzIG1hbnkgb2YKK3RoZW0gYXMgeW91IGxpa2UgaW4gb25lIEpQRUcgZmlsZS4KKy5QUAorLkIgd3JqcGdjb20KK2FkZHMgYSBDT00gYmxvY2ssIGNvbnRhaW5pbmcgdGV4dCB5b3UgcHJvdmlkZSwgdG8gYSBKUEVHIGZpbGUuCitPcmRpbmFyaWx5LCB0aGUgQ09NIGJsb2NrIGlzIGFkZGVkIGFmdGVyIGFueSBleGlzdGluZyBDT00gYmxvY2tzOyBidXQgeW91CitjYW4gZGVsZXRlIHRoZSBvbGQgQ09NIGJsb2NrcyBpZiB5b3Ugd2lzaC4KKy5TSCBPUFRJT05TCitTd2l0Y2ggbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkLCBhbmQgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4KKy5UUAorLkIgXC1yZXBsYWNlCitEZWxldGUgYW55IGV4aXN0aW5nIENPTSBibG9ja3MgZnJvbSB0aGUgZmlsZS4KKy5UUAorLkJJIFwtY29tbWVudCAiIHRleHQiCitTdXBwbHkgdGV4dCBmb3IgbmV3IENPTSBibG9jayBvbiBjb21tYW5kIGxpbmUuCisuVFAKKy5CSSBcLWNmaWxlICIgbmFtZSIKK1JlYWQgdGV4dCBmb3IgbmV3IENPTSBibG9jayBmcm9tIG5hbWVkIGZpbGUuCisuUFAKK0lmIHlvdSBoYXZlIG9ubHkgb25lIGxpbmUgb2YgY29tbWVudCB0ZXh0IHRvIGFkZCwgeW91IGNhbiBwcm92aWRlIGl0IG9uIHRoZQorY29tbWFuZCBsaW5lIHdpdGgKKy5CUiBcLWNvbW1lbnQgLgorVGhlIGNvbW1lbnQgdGV4dCBtdXN0IGJlIHN1cnJvdW5kZWQgd2l0aCBxdW90ZXMgc28gdGhhdCBpdCBpcyB0cmVhdGVkIGFzIGEKK3NpbmdsZSBhcmd1bWVudC4gIExvbmdlciBjb21tZW50cyBjYW4gYmUgcmVhZCBmcm9tIGEgdGV4dCBmaWxlLgorLlBQCitJZiB5b3UgZ2l2ZSBuZWl0aGVyCisuQiBcLWNvbW1lbnQKK25vcgorLkJSIFwtY2ZpbGUgLAordGhlbgorLkIgd3JqcGdjb20KK3dpbGwgcmVhZCB0aGUgY29tbWVudCB0ZXh0IGZyb20gc3RhbmRhcmQgaW5wdXQuICAoSW4gdGhpcyBjYXNlIGFuIGlucHV0IGltYWdlCitmaWxlIG5hbWUgTVVTVCBiZSBzdXBwbGllZCwgc28gdGhhdCB0aGUgc291cmNlIEpQRUcgZmlsZSBjb21lcyBmcm9tIHNvbWV3aGVyZQorZWxzZS4pICBZb3UgY2FuIGVudGVyIG11bHRpcGxlIGxpbmVzLCB1cCB0byA2NEtCIHdvcnRoLiAgVHlwZSBhbiBlbmQtb2YtZmlsZQoraW5kaWNhdG9yICh1c3VhbGx5IGNvbnRyb2wtRCkgdG8gdGVybWluYXRlIHRoZSBjb21tZW50IHRleHQgZW50cnkuCisuUFAKKy5CIHdyanBnY29tCit3aWxsIG5vdCBhZGQgYSBDT00gYmxvY2sgaWYgdGhlIHByb3ZpZGVkIGNvbW1lbnQgc3RyaW5nIGlzIGVtcHR5LiAgVGhlcmVmb3JlCitcZkJcLXJlcGxhY2UgXC1jb21tZW50ICIiXGZSIGNhbiBiZSB1c2VkIHRvIGRlbGV0ZSBhbGwgQ09NIGJsb2NrcyBmcm9tIGEgZmlsZS4KKy5TSCBFWEFNUExFUworLkxQCitBZGQgYSBzaG9ydCBjb21tZW50IHRvIGluLmpwZywgcHJvZHVjaW5nIG91dC5qcGc6CisuSVAKKy5CIHdyanBnY29tIFwtYworXGZJIlZpZXcgb2YgbXkgYmFjayB5YXJkIiBpbi5qcGcKKy5CID4KKy5JIG91dC5qcGcKKy5QUAorQXR0YWNoIGEgbG9uZyBjb21tZW50IHByZXZpb3VzbHkgc3RvcmVkIGluIGNvbW1lbnQudHh0OgorLklQCisuQiB3cmpwZ2NvbQorLkkgaW4uanBnCisuQiA8CisuSSBjb21tZW50LnR4dAorLkIgPgorLkkgb3V0LmpwZworLlBQCitvciBlcXVpdmFsZW50bHkKKy5JUAorLkIgd3JqcGdjb20KKy5CIC1jZmlsZQorLkkgY29tbWVudC50eHQKKy5CIDwKKy5JIGluLmpwZworLkIgPgorLkkgb3V0LmpwZworLlNIIFNFRSBBTFNPCisuQlIgY2pwZWcgKDEpLAorLkJSIGRqcGVnICgxKSwKKy5CUiBqcGVndHJhbiAoMSksCisuQlIgcmRqcGdjb20gKDEpCisuU0ggQVVUSE9SCitJbmRlcGVuZGVudCBKUEVHIEdyb3VwCmRpZmYgLS1naXQgYS93cmpwZ2NvbS5jIGIvd3JqcGdjb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA0YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvd3JqcGdjb20uYwpAQCAtMCwwICsxLDU4MyBAQAorLyoKKyAqIHdyanBnY29tLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIHZlcnkgc2ltcGxlIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9uIHRoYXQgaW5zZXJ0cworICogdXNlci1zdXBwbGllZCB0ZXh0IGFzIGEgQ09NIChjb21tZW50KSBtYXJrZXIgaW4gYSBKRklGIGZpbGUuCisgKiBUaGlzIG1heSBiZSB1c2VmdWwgYXMgYW4gZXhhbXBsZSBvZiB0aGUgbWluaW11bSBsb2dpYyBuZWVkZWQgdG8gcGFyc2UKKyAqIEpQRUcgbWFya2Vycy4KKyAqLworCisjZGVmaW5lIEpQRUdfQ0pQRUdfREpQRUcJLyogdG8gZ2V0IHRoZSBjb21tYW5kLWxpbmUgY29uZmlnIHN5bWJvbHMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgkJLyogZ2V0IGF1dG8tY29uZmlnIHN5bWJvbHMsIDxzdGRpby5oPiAqLworCisjaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCkgKi8KK2V4dGVybiB2b2lkICogbWFsbG9jICgpOworI2VuZGlmCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXN1cHBlcigpLCB0b2xvd2VyKCkgKi8KKyNpZmRlZiBVU0VfU0VUTU9ERQorI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSdzIHBhcmFtZXRlciBtYWNyb3MgKi8KKy8qIElmIHlvdSBoYXZlIHNldG1vZGUoKSBidXQgbm90IDxpby5oPiwganVzdCBkZWxldGUgdGhpcyBsaW5lOiAqLworI2luY2x1ZGUgPGlvLmg+CQkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkgKi8KKyNlbmRpZgorCisjaWZkZWYgVVNFX0NDT01NQU5ECQkvKiBjb21tYW5kLWxpbmUgcmVhZGVyIGZvciBNYWNpbnRvc2ggKi8KKyNpZmRlZiBfX01XRVJLU19fCisjaW5jbHVkZSA8U0lPVVguaD4gICAgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgbmVlZHMgdGhpcyAqLworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIC4uLiBhbmQgdGhpcyAqLworI2VuZGlmCisjaWZkZWYgVEhJTktfQworI2luY2x1ZGUgPGNvbnNvbGUuaD4JCS8qIFRoaW5rIGRlY2xhcmVzIGl0IGhlcmUgKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCisjZGVmaW5lIFdSSVRFX0JJTkFSWQkidyIKKyNlbHNlCisjaWZkZWYgVk1TCQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIiwgImN0eD1zdG0iCisjZGVmaW5lIFdSSVRFX0JJTkFSWQkid2IiLCAiY3R4PXN0bSIKKyNlbHNlCQkJCS8qIHN0YW5kYXJkIEFOU0ktY29tcGxpYW50IGNhc2UgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIgorI2RlZmluZSBXUklURV9CSU5BUlkJIndiIgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCisjZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQorI2VuZGlmCisjaWZuZGVmIEVYSVRfU1VDQ0VTUworI2lmZGVmIFZNUworI2RlZmluZSBFWElUX1NVQ0NFU1MgIDEJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZWxzZQorI2RlZmluZSBFWElUX1NVQ0NFU1MgIDAKKyNlbmRpZgorI2VuZGlmCisKKy8qIFJlZHVjZSB0aGlzIHZhbHVlIGlmIHlvdXIgbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgYmxvY2tzIHVwIHRvIDY0Sy4KKyAqIE9uIERPUywgY29tcGlsaW5nIGluIGxhcmdlIG1vZGVsIGlzIHVzdWFsbHkgYSBiZXR0ZXIgc29sdXRpb24uCisgKi8KKworI2lmbmRlZiBNQVhfQ09NX0xFTkdUSAorI2RlZmluZSBNQVhfQ09NX0xFTkdUSCA2NTAwMEwJLyogbXVzdCBiZSA8PSA2NTUzMyBpbiBhbnkgY2FzZSAqLworI2VuZGlmCisKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byByZWFkIHRoZSBpbnB1dCBmaWxlIGFuZCB3cml0ZSB0aGUgb3V0cHV0IGZpbGUuCisgKiBUbyByZXVzZSB0aGlzIGNvZGUgaW4gYW5vdGhlciBhcHBsaWNhdGlvbiwgeW91IG1pZ2h0IG5lZWQgdG8gY2hhbmdlIHRoZXNlLgorICovCisKK3N0YXRpYyBGSUxFICogaW5maWxlOwkJLyogaW5wdXQgSlBFRyBmaWxlICovCisKKy8qIFJldHVybiBuZXh0IGlucHV0IGJ5dGUsIG9yIEVPRiBpZiBubyBtb3JlICovCisjZGVmaW5lIE5FWFRCWVRFKCkgIGdldGMoaW5maWxlKQorCitzdGF0aWMgRklMRSAqIG91dGZpbGU7CQkvKiBvdXRwdXQgSlBFRyBmaWxlICovCisKKy8qIEVtaXQgYW4gb3V0cHV0IGJ5dGUgKi8KKyNkZWZpbmUgUFVUQllURSh4KSAgcHV0YygoeCksIG91dGZpbGUpCisKKworLyogRXJyb3IgZXhpdCBoYW5kbGVyICovCisjZGVmaW5lIEVSUkVYSVQobXNnKSAgKGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyksIGV4aXQoRVhJVF9GQUlMVVJFKSkKKworCisvKiBSZWFkIG9uZSBieXRlLCB0ZXN0aW5nIGZvciBFT0YgKi8KK3N0YXRpYyBpbnQKK3JlYWRfMV9ieXRlICh2b2lkKQoreworICBpbnQgYzsKKworICBjID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMgPT0gRU9GKQorICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7CisgIHJldHVybiBjOworfQorCisvKiBSZWFkIDIgYnl0ZXMsIGNvbnZlcnQgdG8gdW5zaWduZWQgaW50ICovCisvKiBBbGwgMi1ieXRlIHF1YW50aXRpZXMgaW4gSlBFRyBtYXJrZXJzIGFyZSBNU0IgZmlyc3QgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3JlYWRfMl9ieXRlcyAodm9pZCkKK3sKKyAgaW50IGMxLCBjMjsKKworICBjMSA9IE5FWFRCWVRFKCk7CisgIGlmIChjMSA9PSBFT0YpCisgICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKKyAgYzIgPSBORVhUQllURSgpOworICBpZiAoYzIgPT0gRU9GKQorICAgIEVSUkVYSVQoIlByZW1hdHVyZSBFT0YgaW4gSlBFRyBmaWxlIik7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpIGMxKSA8PCA4KSArICgodW5zaWduZWQgaW50KSBjMik7Cit9CisKKworLyogUm91dGluZXMgdG8gd3JpdGUgZGF0YSB0byBvdXRwdXQgZmlsZSAqLworCitzdGF0aWMgdm9pZAord3JpdGVfMV9ieXRlIChpbnQgYykKK3sKKyAgUFVUQllURShjKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlXzJfYnl0ZXMgKHVuc2lnbmVkIGludCB2YWwpCit7CisgIFBVVEJZVEUoKHZhbCA+PiA4KSAmIDB4RkYpOworICBQVVRCWVRFKHZhbCAmIDB4RkYpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfbWFya2VyIChpbnQgbWFya2VyKQoreworICBQVVRCWVRFKDB4RkYpOworICBQVVRCWVRFKG1hcmtlcik7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3Jlc3Rfb2ZfZmlsZSAodm9pZCkKK3sKKyAgaW50IGM7CisKKyAgd2hpbGUgKChjID0gTkVYVEJZVEUoKSkgIT0gRU9GKQorICAgIFBVVEJZVEUoYyk7Cit9CisKKworLyoKKyAqIEpQRUcgbWFya2VycyBjb25zaXN0IG9mIG9uZSBvciBtb3JlIDB4RkYgYnl0ZXMsIGZvbGxvd2VkIGJ5IGEgbWFya2VyCisgKiBjb2RlIGJ5dGUgKHdoaWNoIGlzIG5vdCBhbiBGRikuICBIZXJlIGFyZSB0aGUgbWFya2VyIGNvZGVzIG9mIGludGVyZXN0CisgKiBpbiB0aGlzIHByb2dyYW0uICAoU2VlIGpkbWFya2VyLmMgZm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0LikKKyAqLworCisjZGVmaW5lIE1fU09GMCAgMHhDMAkJLyogU3RhcnQgT2YgRnJhbWUgTiAqLworI2RlZmluZSBNX1NPRjEgIDB4QzEJCS8qIE4gaW5kaWNhdGVzIHdoaWNoIGNvbXByZXNzaW9uIHByb2Nlc3MgKi8KKyNkZWZpbmUgTV9TT0YyICAweEMyCQkvKiBPbmx5IFNPRjAtU09GMiBhcmUgbm93IGluIGNvbW1vbiB1c2UgKi8KKyNkZWZpbmUgTV9TT0YzICAweEMzCisjZGVmaW5lIE1fU09GNSAgMHhDNQkJLyogTkI6IGNvZGVzIEM0IGFuZCBDQyBhcmUgTk9UIFNPRiBtYXJrZXJzICovCisjZGVmaW5lIE1fU09GNiAgMHhDNgorI2RlZmluZSBNX1NPRjcgIDB4QzcKKyNkZWZpbmUgTV9TT0Y5ICAweEM5CisjZGVmaW5lIE1fU09GMTAgMHhDQQorI2RlZmluZSBNX1NPRjExIDB4Q0IKKyNkZWZpbmUgTV9TT0YxMyAweENECisjZGVmaW5lIE1fU09GMTQgMHhDRQorI2RlZmluZSBNX1NPRjE1IDB4Q0YKKyNkZWZpbmUgTV9TT0kgICAweEQ4CQkvKiBTdGFydCBPZiBJbWFnZSAoYmVnaW5uaW5nIG9mIGRhdGFzdHJlYW0pICovCisjZGVmaW5lIE1fRU9JICAgMHhEOQkJLyogRW5kIE9mIEltYWdlIChlbmQgb2YgZGF0YXN0cmVhbSkgKi8KKyNkZWZpbmUgTV9TT1MgICAweERBCQkvKiBTdGFydCBPZiBTY2FuIChiZWdpbnMgY29tcHJlc3NlZCBkYXRhKSAqLworI2RlZmluZSBNX0NPTSAgIDB4RkUJCS8qIENPTW1lbnQgKi8KKworCisvKgorICogRmluZCB0aGUgbmV4dCBKUEVHIG1hcmtlciBhbmQgcmV0dXJuIGl0cyBtYXJrZXIgY29kZS4KKyAqIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgRkYgYnl0ZSwgcG9zc2libHkgbW9yZSBpZiB0aGUgY29tcHJlc3NvciB1c2VkIEZGcworICogdG8gcGFkIHRoZSBmaWxlLiAgKFBhZGRpbmcgRkZzIHdpbGwgTk9UIGJlIHJlcGxpY2F0ZWQgaW4gdGhlIG91dHB1dCBmaWxlLikKKyAqIFRoZXJlIGNvdWxkIGFsc28gYmUgbm9uLUZGIGdhcmJhZ2UgYmV0d2VlbiBtYXJrZXJzLiAgVGhlIHRyZWF0bWVudCBvZiBzdWNoCisgKiBnYXJiYWdlIGlzIHVuc3BlY2lmaWVkOyB3ZSBjaG9vc2UgdG8gc2tpcCBvdmVyIGl0IGJ1dCBlbWl0IGEgd2FybmluZyBtc2cuCisgKiBOQjogdGhpcyByb3V0aW5lIG11c3Qgbm90IGJlIHVzZWQgYWZ0ZXIgc2VlaW5nIFNPUyBtYXJrZXIsIHNpbmNlIGl0IHdpbGwKKyAqIG5vdCBkZWFsIGNvcnJlY3RseSB3aXRoIEZGLzAwIHNlcXVlbmNlcyBpbiB0aGUgY29tcHJlc3NlZCBpbWFnZSBkYXRhLi4uCisgKi8KKworc3RhdGljIGludAorbmV4dF9tYXJrZXIgKHZvaWQpCit7CisgIGludCBjOworICBpbnQgZGlzY2FyZGVkX2J5dGVzID0gMDsKKworICAvKiBGaW5kIDB4RkYgYnl0ZTsgY291bnQgYW5kIHNraXAgYW55IG5vbi1GRnMuICovCisgIGMgPSByZWFkXzFfYnl0ZSgpOworICB3aGlsZSAoYyAhPSAweEZGKSB7CisgICAgZGlzY2FyZGVkX2J5dGVzKys7CisgICAgYyA9IHJlYWRfMV9ieXRlKCk7CisgIH0KKyAgLyogR2V0IG1hcmtlciBjb2RlIGJ5dGUsIHN3YWxsb3dpbmcgYW55IGR1cGxpY2F0ZSBGRiBieXRlcy4gIEV4dHJhIEZGcworICAgKiBhcmUgbGVnYWwgYXMgcGFkIGJ5dGVzLCBzbyBkb24ndCBjb3VudCB0aGVtIGluIGRpc2NhcmRlZF9ieXRlcy4KKyAgICovCisgIGRvIHsKKyAgICBjID0gcmVhZF8xX2J5dGUoKTsKKyAgfSB3aGlsZSAoYyA9PSAweEZGKTsKKworICBpZiAoZGlzY2FyZGVkX2J5dGVzICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGdhcmJhZ2UgZGF0YSBmb3VuZCBpbiBKUEVHIGZpbGVcbiIpOworICB9CisKKyAgcmV0dXJuIGM7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGluaXRpYWwgbWFya2VyLCB3aGljaCBzaG91bGQgYmUgU09JLgorICogRm9yIGEgSkZJRiBmaWxlLCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBmaWxlIHNob3VsZCBiZSBsaXRlcmFsbHkKKyAqIDB4RkYgTV9TT0kuICBUbyBiZSBtb3JlIGdlbmVyYWwsIHdlIGNvdWxkIHVzZSBuZXh0X21hcmtlciwgYnV0IGlmIHRoZQorICogaW5wdXQgZmlsZSB3ZXJlbid0IGFjdHVhbGx5IEpQRUcgYXQgYWxsLCBuZXh0X21hcmtlciBtaWdodCByZWFkIHRoZSB3aG9sZQorICogZmlsZSBhbmQgdGhlbiByZXR1cm4gYSBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2UuLi4KKyAqLworCitzdGF0aWMgaW50CitmaXJzdF9tYXJrZXIgKHZvaWQpCit7CisgIGludCBjMSwgYzI7CisKKyAgYzEgPSBORVhUQllURSgpOworICBjMiA9IE5FWFRCWVRFKCk7CisgIGlmIChjMSAhPSAweEZGIHx8IGMyICE9IE1fU09JKQorICAgIEVSUkVYSVQoIk5vdCBhIEpQRUcgZmlsZSIpOworICByZXR1cm4gYzI7Cit9CisKKworLyoKKyAqIE1vc3QgdHlwZXMgb2YgbWFya2VyIGFyZSBmb2xsb3dlZCBieSBhIHZhcmlhYmxlLWxlbmd0aCBwYXJhbWV0ZXIgc2VnbWVudC4KKyAqIFRoaXMgcm91dGluZSBza2lwcyBvdmVyIHRoZSBwYXJhbWV0ZXJzIGZvciBhbnkgbWFya2VyIHdlIGRvbid0IG90aGVyd2lzZQorICogd2FudCB0byBwcm9jZXNzLgorICogTm90ZSB0aGF0IHdlIE1VU1Qgc2tpcCB0aGUgcGFyYW1ldGVyIHNlZ21lbnQgZXhwbGljaXRseSBpbiBvcmRlciBub3QgdG8KKyAqIGJlIGZvb2xlZCBieSAweEZGIGJ5dGVzIHRoYXQgbWlnaHQgYXBwZWFyIHdpdGhpbiB0aGUgcGFyYW1ldGVyIHNlZ21lbnQ7CisgKiBzdWNoIGJ5dGVzIGRvIE5PVCBpbnRyb2R1Y2UgbmV3IG1hcmtlcnMuCisgKi8KKworc3RhdGljIHZvaWQKK2NvcHlfdmFyaWFibGUgKHZvaWQpCisvKiBDb3B5IGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCit7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisKKyAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLworICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKKyAgd3JpdGVfMl9ieXRlcyhsZW5ndGgpOworICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KKyAgaWYgKGxlbmd0aCA8IDIpCisgICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOworICBsZW5ndGggLT0gMjsKKyAgLyogU2tpcCBvdmVyIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICB3cml0ZV8xX2J5dGUocmVhZF8xX2J5dGUoKSk7CisgICAgbGVuZ3RoLS07CisgIH0KK30KKworc3RhdGljIHZvaWQKK3NraXBfdmFyaWFibGUgKHZvaWQpCisvKiBTa2lwIG92ZXIgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KK3sKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKworICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCisgIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOworICAvKiBMZW5ndGggaW5jbHVkZXMgaXRzZWxmLCBzbyBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KKyAgaWYgKGxlbmd0aCA8IDIpCisgICAgRVJSRVhJVCgiRXJyb25lb3VzIEpQRUcgbWFya2VyIGxlbmd0aCIpOworICBsZW5ndGggLT0gMjsKKyAgLyogU2tpcCBvdmVyIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAodm9pZCkgcmVhZF8xX2J5dGUoKTsKKyAgICBsZW5ndGgtLTsKKyAgfQorfQorCisKKy8qCisgKiBQYXJzZSB0aGUgbWFya2VyIHN0cmVhbSB1bnRpbCBTT0ZuIG9yIEVPSSBpcyBzZWVuOworICogY29weSBkYXRhIHRvIG91dHB1dCwgYnV0IGRpc2NhcmQgQ09NIG1hcmtlcnMgdW5sZXNzIGtlZXBfQ09NIGlzIHRydWUuCisgKi8KKworc3RhdGljIGludAorc2Nhbl9KUEVHX2hlYWRlciAoaW50IGtlZXBfQ09NKQoreworICBpbnQgbWFya2VyOworCisgIC8qIEV4cGVjdCBTT0kgYXQgc3RhcnQgb2YgZmlsZSAqLworICBpZiAoZmlyc3RfbWFya2VyKCkgIT0gTV9TT0kpCisgICAgRVJSRVhJVCgiRXhwZWN0ZWQgU09JIG1hcmtlciBmaXJzdCIpOworICB3cml0ZV9tYXJrZXIoTV9TT0kpOworCisgIC8qIFNjYW4gbWlzY2VsbGFuZW91cyBtYXJrZXJzIHVudGlsIHdlIHJlYWNoIFNPRm4uICovCisgIGZvciAoOzspIHsKKyAgICBtYXJrZXIgPSBuZXh0X21hcmtlcigpOworICAgIHN3aXRjaCAobWFya2VyKSB7CisgICAgICAvKiBOb3RlIHRoYXQgbWFya2VyIGNvZGVzIDB4QzQsIDB4QzgsIDB4Q0MgYXJlIG5vdCwgYW5kIG11c3Qgbm90IGJlLAorICAgICAgICogdHJlYXRlZCBhcyBTT0ZuLiAgQzQgaW4gcGFydGljdWxhciBpcyBhY3R1YWxseSBESFQuCisgICAgICAgKi8KKyAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCisgICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0YzOgkJLyogTG9zc2xlc3MsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNToJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjY6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNzoJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y5OgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxMDoJCS8qIFByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjExOgkJLyogTG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTM6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNDoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNToJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLworICAgICAgcmV0dXJuIG1hcmtlcjsKKworICAgIGNhc2UgTV9TT1M6CQkJLyogc2hvdWxkIG5vdCBzZWUgY29tcHJlc3NlZCBkYXRhIGJlZm9yZSBTT0YgKi8KKyAgICAgIEVSUkVYSVQoIlNPUyB3aXRob3V0IHByaW9yIFNPRm4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0VPSToJCQkvKiBpbiBjYXNlIGl0J3MgYSB0YWJsZXMtb25seSBKUEVHIHN0cmVhbSAqLworICAgICAgcmV0dXJuIG1hcmtlcjsKKworICAgIGNhc2UgTV9DT006CQkJLyogRXhpc3RpbmcgQ09NOiBjb25kaXRpb25hbGx5IGRpc2NhcmQgKi8KKyAgICAgIGlmIChrZWVwX0NPTSkgeworCXdyaXRlX21hcmtlcihtYXJrZXIpOworCWNvcHlfdmFyaWFibGUoKTsKKyAgICAgIH0gZWxzZSB7CisJc2tpcF92YXJpYWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgkJCS8qIEFueXRoaW5nIGVsc2UganVzdCBnZXRzIGNvcGllZCAqLworICAgICAgd3JpdGVfbWFya2VyKG1hcmtlcik7CisgICAgICBjb3B5X3ZhcmlhYmxlKCk7CQkvKiB3ZSBhc3N1bWUgaXQgaGFzIGEgcGFyYW1ldGVyIGNvdW50Li4uICovCisgICAgICBicmVhazsKKyAgICB9CisgIH0gLyogZW5kIGxvb3AgKi8KK30KKworCisvKiBDb21tYW5kIGxpbmUgcGFyc2luZyBjb2RlICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKworCitzdGF0aWMgdm9pZAordXNhZ2UgKHZvaWQpCisvKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCit7CisgIGZwcmludGYoc3RkZXJyLCAid3JqcGdjb20gaW5zZXJ0cyBhIHRleHR1YWwgY29tbWVudCBpbiBhIEpQRUcgZmlsZS5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIllvdSBjYW4gYWRkIHRvIG9yIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNvbW1lbnQocykuXG4iKTsKKworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbc3dpdGNoZXNdICIsIHByb2duYW1lKTsKKyNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQorICBmcHJpbnRmKHN0ZGVyciwgImlucHV0ZmlsZSBvdXRwdXRmaWxlXG4iKTsKKyNlbHNlCisgIGZwcmludGYoc3RkZXJyLCAiW2lucHV0ZmlsZV1cbiIpOworI2VuZGlmCisKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyAobmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkKTpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlcGxhY2UgICAgICAgICBEZWxldGUgYW55IGV4aXN0aW5nIGNvbW1lbnRzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jb21tZW50IFwidGV4dFwiICBJbnNlcnQgY29tbWVudCB3aXRoIGdpdmVuIHRleHRcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNmaWxlIG5hbWUgICAgICBSZWFkIGNvbW1lbnQgZnJvbSBuYW1lZCBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJOb3RpY2UgdGhhdCB5b3UgbXVzdCBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgY29tbWVudCB0ZXh0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJ3aGVuIHlvdSB1c2UgLWNvbW1lbnQuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJJZiB5b3UgZG8gbm90IGdpdmUgZWl0aGVyIC1jb21tZW50IG9yIC1jZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lLFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAidGhlbiB0aGUgY29tbWVudCB0ZXh0IGlzIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIkl0IGNhbiBiZSBtdWx0aXBsZSBsaW5lcywgdXAgdG8gJXUgY2hhcmFjdGVycyB0b3RhbC5cbiIsCisJICAodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCk7CisjaWZuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIGZwcmludGYoc3RkZXJyLCAiWW91IG11c3Qgc3BlY2lmeSBhbiBpbnB1dCBKUEVHIGZpbGUgbmFtZSB3aGVuIHN1cHBseWluZ1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiY29tbWVudCB0ZXh0IGZyb20gc3RhbmRhcmQgaW5wdXQuXG4iKTsKKyNlbmRpZgorCisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCitzdGF0aWMgaW50CitrZXltYXRjaCAoY2hhciAqIGFyZywgY29uc3QgY2hhciAqIGtleXdvcmQsIGludCBtaW5jaGFycykKKy8qIENhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb2YgKHBvc3NpYmx5IGFiYnJldmlhdGVkKSBrZXl3b3JkIHN3aXRjaGVzLiAqLworLyoga2V5d29yZCBpcyB0aGUgY29uc3RhbnQga2V5d29yZCAobXVzdCBiZSBsb3dlciBjYXNlIGFscmVhZHkpLCAqLworLyogbWluY2hhcnMgaXMgbGVuZ3RoIG9mIG1pbmltdW0gbGVnYWwgYWJicmV2aWF0aW9uLiAqLworeworICByZWdpc3RlciBpbnQgY2EsIGNrOworICByZWdpc3RlciBpbnQgbm1hdGNoZWQgPSAwOworCisgIHdoaWxlICgoY2EgPSAqYXJnKyspICE9ICdcMCcpIHsKKyAgICBpZiAoKGNrID0gKmtleXdvcmQrKykgPT0gJ1wwJykKKyAgICAgIHJldHVybiAwOwkJCS8qIGFyZyBsb25nZXIgdGhhbiBrZXl3b3JkLCBubyBnb29kICovCisgICAgaWYgKGlzdXBwZXIoY2EpKQkJLyogZm9yY2UgYXJnIHRvIGxjYXNlIChhc3N1bWUgY2sgaXMgYWxyZWFkeSkgKi8KKyAgICAgIGNhID0gdG9sb3dlcihjYSk7CisgICAgaWYgKGNhICE9IGNrKQorICAgICAgcmV0dXJuIDA7CQkJLyogbm8gZ29vZCAqLworICAgIG5tYXRjaGVkKys7CQkJLyogY291bnQgbWF0Y2hlZCBjaGFyYWN0ZXJzICovCisgIH0KKyAgLyogcmVhY2hlZCBlbmQgb2YgYXJndW1lbnQ7IGZhaWwgaWYgaXQncyB0b28gc2hvcnQgZm9yIHVuaXF1ZSBhYmJyZXYgKi8KKyAgaWYgKG5tYXRjaGVkIDwgbWluY2hhcnMpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOwkJCS8qIEEtT0sgKi8KK30KKworCisvKgorICogVGhlIG1haW4gcHJvZ3JhbS4KKyAqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisgIGludCBrZWVwX0NPTSA9IDE7CisgIGNoYXIgKiBjb21tZW50X2FyZyA9IE5VTEw7CisgIEZJTEUgKiBjb21tZW50X2ZpbGUgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgY29tbWVudF9sZW5ndGggPSAwOworICBpbnQgbWFya2VyOworCisgIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCisjaWZkZWYgVVNFX0NDT01NQU5ECisgIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7CisjZW5kaWYKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisgIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCisgICAgcHJvZ25hbWUgPSAid3JqcGdjb20iOwkvKiBpbiBjYXNlIEMgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgaXQgKi8KKworICAvKiBQYXJzZSBzd2l0Y2hlcywgaWYgYW55ICovCisgIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKKyAgICBhcmcgPSBhcmd2W2FyZ25dOworICAgIGlmIChhcmdbMF0gIT0gJy0nKQorICAgICAgYnJlYWs7CQkJLyogbm90IHN3aXRjaCwgbXVzdCBiZSBmaWxlIG5hbWUgKi8KKyAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIG92ZXIgJy0nICovCisgICAgaWYgKGtleW1hdGNoKGFyZywgInJlcGxhY2UiLCAxKSkgeworICAgICAga2VlcF9DT00gPSAwOworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY2ZpbGUiLCAyKSkgeworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKSB1c2FnZSgpOworICAgICAgaWYgKChjb21tZW50X2ZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCAiciIpKSA9PSBOVUxMKSB7CisJZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvbW1lbnQiLCAxKSkgeworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKSB1c2FnZSgpOworICAgICAgY29tbWVudF9hcmcgPSBhcmd2W2FyZ25dOworICAgICAgLyogSWYgdGhlIGNvbW1lbnQgdGV4dCBzdGFydHMgd2l0aCAnIicsIHRoZW4gd2UgYXJlIHByb2JhYmx5IHJ1bm5pbmcKKyAgICAgICAqIHVuZGVyIE1TLURPRyBhbmQgbXVzdCBwYXJzZSBvdXQgdGhlIHF1b3RlZCBzdHJpbmcgb3Vyc2VsdmVzLiAgU2lnaC4KKyAgICAgICAqLworICAgICAgaWYgKGNvbW1lbnRfYXJnWzBdID09ICciJykgeworCWNvbW1lbnRfYXJnID0gKGNoYXIgKikgbWFsbG9jKChzaXplX3QpIE1BWF9DT01fTEVOR1RIKTsKKwlpZiAoY29tbWVudF9hcmcgPT0gTlVMTCkKKwkgIEVSUkVYSVQoIkluc3VmZmljaWVudCBtZW1vcnkiKTsKKwlzdHJjcHkoY29tbWVudF9hcmcsIGFyZ3ZbYXJnbl0rMSk7CisJZm9yICg7OykgeworCSAgY29tbWVudF9sZW5ndGggPSAodW5zaWduZWQgaW50KSBzdHJsZW4oY29tbWVudF9hcmcpOworCSAgaWYgKGNvbW1lbnRfbGVuZ3RoID4gMCAmJiBjb21tZW50X2FyZ1tjb21tZW50X2xlbmd0aC0xXSA9PSAnIicpIHsKKwkgICAgY29tbWVudF9hcmdbY29tbWVudF9sZW5ndGgtMV0gPSAnXDAnOyAvKiB6YXAgdGVybWluYXRpbmcgcXVvdGUgKi8KKwkgICAgYnJlYWs7CisJICB9CisJICBpZiAoKythcmduID49IGFyZ2MpCisJICAgIEVSUkVYSVQoIk1pc3NpbmcgZW5kaW5nIHF1b3RlIG1hcmsiKTsKKwkgIHN0cmNhdChjb21tZW50X2FyZywgIiAiKTsKKwkgIHN0cmNhdChjb21tZW50X2FyZywgYXJndlthcmduXSk7CisJfQorICAgICAgfQorICAgICAgY29tbWVudF9sZW5ndGggPSAodW5zaWduZWQgaW50KSBzdHJsZW4oY29tbWVudF9hcmcpOworICAgIH0gZWxzZQorICAgICAgdXNhZ2UoKTsKKyAgfQorCisgIC8qIENhbm5vdCB1c2UgYm90aCAtY29tbWVudCBhbmQgLWNmaWxlLiAqLworICBpZiAoY29tbWVudF9hcmcgIT0gTlVMTCAmJiBjb21tZW50X2ZpbGUgIT0gTlVMTCkKKyAgICB1c2FnZSgpOworICAvKiBJZiB0aGVyZSBpcyBuZWl0aGVyIC1jb21tZW50IG5vciAtY2ZpbGUsIHdlIHdpbGwgcmVhZCB0aGUgY29tbWVudCB0ZXh0CisgICAqIGZyb20gc3RkaW47IGluIHRoaXMgY2FzZSB0aGVyZSBNVVNUIGJlIGFuIGlucHV0IEpQRUcgZmlsZSBuYW1lLgorICAgKi8KKyAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwgJiYgY29tbWVudF9maWxlID09IE5VTEwgJiYgYXJnbiA+PSBhcmdjKQorICAgIHVzYWdlKCk7CisKKyAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZS4gKi8KKyAgaWYgKGFyZ24gPCBhcmdjKSB7CisgICAgaWYgKChpbmZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCisjaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCisgICAgc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCisgICAgaWYgKChpbmZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIHN0ZGluXG4iLCBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorI2Vsc2UKKyAgICBpbmZpbGUgPSBzdGRpbjsKKyNlbmRpZgorICB9CisKKyAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgLyogTXVzdCBoYXZlIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KKyAgaWYgKGFyZ24gIT0gYXJnYy0yKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICBwcm9nbmFtZSk7CisgICAgdXNhZ2UoKTsKKyAgfQorICBpZiAoKG91dGZpbGUgPSBmb3Blbihhcmd2W2FyZ24rMV0sIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduKzFdKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyNlbHNlCisgIC8qIFVuaXggc3R5bGU6IGV4cGVjdCB6ZXJvIG9yIG9uZSBmaWxlIG5hbWUgKi8KKyAgaWYgKGFyZ24gPCBhcmdjLTEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvbmx5IG9uZSBpbnB1dCBmaWxlXG4iLCBwcm9nbmFtZSk7CisgICAgdXNhZ2UoKTsKKyAgfQorICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLworI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLworICBzZXRtb2RlKGZpbGVubyhzdGRvdXQpLCBPX0JJTkFSWSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCisgIGlmICgob3V0ZmlsZSA9IGZkb3BlbihmaWxlbm8oc3Rkb3V0KSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3Rkb3V0XG4iLCBwcm9nbmFtZSk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisjZWxzZQorICBvdXRmaWxlID0gc3Rkb3V0OworI2VuZGlmCisjZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KKworICAvKiBDb2xsZWN0IGNvbW1lbnQgdGV4dCBmcm9tIGNvbW1lbnRfZmlsZSBvciBzdGRpbiwgaWYgbmVjZXNzYXJ5ICovCisgIGlmIChjb21tZW50X2FyZyA9PSBOVUxMKSB7CisgICAgRklMRSAqIHNyY19maWxlOworICAgIGludCBjOworCisgICAgY29tbWVudF9hcmcgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgTUFYX0NPTV9MRU5HVEgpOworICAgIGlmIChjb21tZW50X2FyZyA9PSBOVUxMKQorICAgICAgRVJSRVhJVCgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOworICAgIGNvbW1lbnRfbGVuZ3RoID0gMDsKKyAgICBzcmNfZmlsZSA9IChjb21tZW50X2ZpbGUgIT0gTlVMTCA/IGNvbW1lbnRfZmlsZSA6IHN0ZGluKTsKKyAgICB3aGlsZSAoKGMgPSBnZXRjKHNyY19maWxlKSkgIT0gRU9GKSB7CisgICAgICBpZiAoY29tbWVudF9sZW5ndGggPj0gKHVuc2lnbmVkIGludCkgTUFYX0NPTV9MRU5HVEgpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbW1lbnQgdGV4dCBtYXkgbm90IGV4Y2VlZCAldSBieXRlc1xuIiwKKwkJKHVuc2lnbmVkIGludCkgTUFYX0NPTV9MRU5HVEgpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKyAgICAgIGNvbW1lbnRfYXJnW2NvbW1lbnRfbGVuZ3RoKytdID0gKGNoYXIpIGM7CisgICAgfQorICAgIGlmIChjb21tZW50X2ZpbGUgIT0gTlVMTCkKKyAgICAgIGZjbG9zZShjb21tZW50X2ZpbGUpOworICB9CisKKyAgLyogQ29weSBKUEVHIGhlYWRlcnMgdW50aWwgU09GbiBtYXJrZXI7CisgICAqIHdlIHdpbGwgaW5zZXJ0IHRoZSBuZXcgY29tbWVudCBtYXJrZXIganVzdCBiZWZvcmUgU09Gbi4KKyAgICogVGhpcyAoYSkgY2F1c2VzIHRoZSBuZXcgY29tbWVudCB0byBhcHBlYXIgYWZ0ZXIsIHJhdGhlciB0aGFuIGJlZm9yZSwKKyAgICogZXhpc3RpbmcgY29tbWVudHM7IGFuZCAoYikgZW5zdXJlcyB0aGF0IGNvbW1lbnRzIGNvbWUgYWZ0ZXIgYW55IEpGSUYKKyAgICogb3IgSkZYWCBtYXJrZXJzLCBhcyByZXF1aXJlZCBieSB0aGUgSkZJRiBzcGVjaWZpY2F0aW9uLgorICAgKi8KKyAgbWFya2VyID0gc2Nhbl9KUEVHX2hlYWRlcihrZWVwX0NPTSk7CisgIC8qIEluc2VydCB0aGUgbmV3IENPTSBtYXJrZXIsIGJ1dCBvbmx5IGlmIG5vbmVtcHR5IHRleHQgaGFzIGJlZW4gc3VwcGxpZWQgKi8KKyAgaWYgKGNvbW1lbnRfbGVuZ3RoID4gMCkgeworICAgIHdyaXRlX21hcmtlcihNX0NPTSk7CisgICAgd3JpdGVfMl9ieXRlcyhjb21tZW50X2xlbmd0aCArIDIpOworICAgIHdoaWxlIChjb21tZW50X2xlbmd0aCA+IDApIHsKKyAgICAgIHdyaXRlXzFfYnl0ZSgqY29tbWVudF9hcmcrKyk7CisgICAgICBjb21tZW50X2xlbmd0aC0tOworICAgIH0KKyAgfQorICAvKiBEdXBsaWNhdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgc291cmNlIGZpbGUuCisgICAqIE5vdGUgdGhhdCBhbnkgQ09NIG1hcmtlcnMgb2NjdXJpbmcgYWZ0ZXIgU09GIHdpbGwgbm90IGJlIHRvdWNoZWQuCisgICAqLworICB3cml0ZV9tYXJrZXIobWFya2VyKTsKKyAgY29weV9yZXN0X29mX2ZpbGUoKTsKKworICAvKiBBbGwgZG9uZS4gKi8KKyAgZXhpdChFWElUX1NVQ0NFU1MpOworICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KK30KZGlmZiAtLWdpdCBhL3dycHBtLmMgYi93cnBwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmQ5MDgKLS0tIC9kZXYvbnVsbAorKysgYi93cnBwbS5jCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogd3JwcG0uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gUFBNL1BHTSBmb3JtYXQuCisgKiBUaGUgZXh0ZW5kZWQgMi1ieXRlLXBlci1zYW1wbGUgcmF3IFBQTS9QR00gZm9ybWF0cyBhcmUgc3VwcG9ydGVkLgorICogVGhlIFBCTVBMVVMgbGlicmFyeSBpcyBOT1QgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGlzIHNvZnR3YXJlCisgKiAoYnV0IGl0IGlzIGhpZ2hseSB1c2VmdWwgYXMgYSBzZXQgb2YgUFBNIGltYWdlIG1hbmlwdWxhdGlvbiBwcm9ncmFtcykuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bworICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBQUE1fU1VQUE9SVEVECisKKworLyoKKyAqIEZvciAxMi1iaXQgSlBFRyBkYXRhLCB3ZSBlaXRoZXIgZG93bnNjYWxlIHRoZSB2YWx1ZXMgdG8gOCBiaXRzCisgKiAodG8gd3JpdGUgc3RhbmRhcmQgYnl0ZS1wZXItc2FtcGxlIFBQTS9QR00gZmlsZXMpLCBvciBvdXRwdXQKKyAqIG5vbnN0YW5kYXJkIHdvcmQtcGVyLXNhbXBsZSBQUE0vUEdNIGZpbGVzLiAgRG93bnNjYWxpbmcgaXMgZG9uZQorICogaWYgUFBNX05PUkFXV09SRCBpcyBkZWZpbmVkICh0aGlzIGNhbiBiZSBkb25lIGluIHRoZSBNYWtlZmlsZQorICogb3IgaW4gamNvbmZpZy5oKS4KKyAqIChXaGVuIHRoZSBjb3JlIGxpYnJhcnkgc3VwcG9ydHMgZGF0YSBwcmVjaXNpb24gcmVkdWN0aW9uLCBhIGNsZWFuZXIKKyAqIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdG8gYXNrIGZvciB0aGF0IGluc3RlYWQuKQorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBQVVRQUE1TQU1QTEUocHRyLHYpICAqcHRyKysgPSAoY2hhcikgKHYpCisjZGVmaW5lIEJZVEVTUEVSU0FNUExFIDEKKyNkZWZpbmUgUFBNX01BWFZBTCAyNTUKKyNlbHNlCisjaWZkZWYgUFBNX05PUkFXV09SRAorI2RlZmluZSBQVVRQUE1TQU1QTEUocHRyLHYpICAqcHRyKysgPSAoY2hhcikgKCh2KSA+PiAoQklUU19JTl9KU0FNUExFLTgpKQorI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAxCisjZGVmaW5lIFBQTV9NQVhWQUwgMjU1CisjZWxzZQorLyogVGhlIHdvcmQtcGVyLXNhbXBsZSBmb3JtYXQgYWx3YXlzIHB1dHMgdGhlIExTQiBmaXJzdC4gKi8KKyNkZWZpbmUgUFVUUFBNU0FNUExFKHB0cix2KQkJCVwKKwl7IHJlZ2lzdGVyIGludCB2YWxfID0gdjsJCVwKKwkgICpwdHIrKyA9IChjaGFyKSAodmFsXyAmIDB4RkYpOwlcCisJICAqcHRyKysgPSAoY2hhcikgKCh2YWxfID4+IDgpICYgMHhGRik7CVwKKwl9CisjZGVmaW5lIEJZVEVTUEVSU0FNUExFIDIKKyNkZWZpbmUgUFBNX01BWFZBTCAoKDE8PEJJVFNfSU5fSlNBTVBMRSktMSkKKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIFdoZW4gSlNBTVBMRSBpcyB0aGUgc2FtZSBzaXplIGFzIGNoYXIsIHdlIGNhbiBqdXN0IGZ3cml0ZSgpIHRoZQorICogZGVjb21wcmVzc2VkIGRhdGEgdG8gdGhlIFBQTSBvciBQR00gZmlsZS4gIE9uIFBDcywgaW4gb3JkZXIgdG8gbWFrZSB0aGlzCisgKiB3b3JrIHRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUKKyAqIGFzc3VtaW5nIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsIHdoZXJlaW4gZndyaXRlKCkgY2FuJ3QgcmVhY2ggZmFyIG1lbW9yeS4KKyAqIElmIHlvdSBuZWVkIHRvIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlCisgKiBpbiBsYXJnZS1tZW1vcnkgbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmd3JpdGUoKSB3aXRoIGEgcHV0YygpIGxvb3AgLS0tCisgKiB3aGljaCB3aWxsIGJlIG11Y2ggc2xvd2VyLgorICovCisKKworLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFVzdWFsbHkgdGhlc2UgdHdvIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIHBsYWNlOiAqLworICBjaGFyICppb2J1ZmZlcjsJCS8qIGZ3cml0ZSdzIEkvTyBidWZmZXIgKi8KKyAgSlNBTVBST1cgcGl4cm93OwkJLyogZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIgKi8KKyAgc2l6ZV90IGJ1ZmZlcl93aWR0aDsJCS8qIHdpZHRoIG9mIEkvTyBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBzYW1wbGVzX3Blcl9yb3c7CS8qIEpTQU1QTEVzIHBlciBvdXRwdXQgcm93ICovCit9IHBwbV9kZXN0X3N0cnVjdDsKKwordHlwZWRlZiBwcG1fZGVzdF9zdHJ1Y3QgKiBwcG1fZGVzdF9wdHI7CisKKworLyoKKyAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KKyAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KKyAqCisgKiBwdXRfcGl4ZWxfcm93cyBoYW5kbGVzIHRoZSAibm9ybWFsIiA4LWJpdCBjYXNlIHdoZXJlIHRoZSBkZWNvbXByZXNzb3IKKyAqIG91dHB1dCBidWZmZXIgaXMgcGh5c2ljYWxseSB0aGUgc2FtZSBhcyB0aGUgZndyaXRlIGJ1ZmZlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3B1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQoreworICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOworCisgICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Cit9CisKKworLyoKKyAqIFRoaXMgY29kZSBpcyB1c2VkIHdoZW4gd2UgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIGFuZCBhcHBseSBhIHBpeGVsCisgKiBmb3JtYXQgdHJhbnNsYXRpb24uICBUeXBpY2FsbHkgdGhpcyBvbmx5IGhhcHBlbnMgaW4gMTItYml0IG1vZGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitjb3B5X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQoreworICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBjaGFyICogYnVmZmVycHRyOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIHB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIGJ1ZmZlcnB0ciA9IGRlc3QtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGRlc3QtPnNhbXBsZXNfcGVyX3JvdzsgY29sID4gMDsgY29sLS0pIHsKKyAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKCpwdHIrKykpOworICB9CisgICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Cit9CisKKworLyoKKyAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YSB3aGVuIGNvbG9yIHF1YW50aXphdGlvbiBpcyBpbiBlZmZlY3QuCisgKiBXZSBoYXZlIHRvIGRlbWFwIHRoZSBjb2xvciBpbmRleCB2YWx1ZXMgdG8gc3RyYWlnaHQgZGF0YS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3B1dF9kZW1hcHBlZF9yZ2IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQkgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKK3sKKyAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgY2hhciAqIGJ1ZmZlcnB0cjsKKyAgcmVnaXN0ZXIgaW50IHBpeHZhbDsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOworICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOworICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAyID0gY2luZm8tPmNvbG9ybWFwWzJdOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIHBpeHZhbCA9IEdFVEpTQU1QTEUoKnB0cisrKTsKKyAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcDBbcGl4dmFsXSkpOworICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwMVtwaXh2YWxdKSk7CisgICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRShjb2xvcl9tYXAyW3BpeHZhbF0pKTsKKyAgfQorICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOworfQorCisKK01FVEhPRERFRih2b2lkKQorcHV0X2RlbWFwcGVkX2dyYXkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQkgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCit7CisgIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIGNoYXIgKiBidWZmZXJwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwID0gY2luZm8tPmNvbG9ybWFwWzBdOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICBwdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBidWZmZXJwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwW0dFVEpTQU1QTEUoKnB0cisrKV0pKTsKKyAgfQorICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOworfQorCisKKy8qCisgKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9vdXRwdXRfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKKworICAvKiBFbWl0IGZpbGUgaGVhZGVyICovCisgIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgLyogZW1pdCBoZWFkZXIgZm9yIHJhdyBQR00gZm9ybWF0ICovCisgICAgZnByaW50ZihkZXN0LT5wdWIub3V0cHV0X2ZpbGUsICJQNVxuJWxkICVsZFxuJWRcbiIsCisJICAgIChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLCAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCisJICAgIFBQTV9NQVhWQUwpOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisgICAgLyogZW1pdCBoZWFkZXIgZm9yIHJhdyBQUE0gZm9ybWF0ICovCisgICAgZnByaW50ZihkZXN0LT5wdWIub3V0cHV0X2ZpbGUsICJQNlxuJWxkICVsZFxuJWRcbiIsCisJICAgIChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoLCAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCisJICAgIFBQTV9NQVhWQUwpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUFBNX0NPTE9SU1BBQ0UpOworICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX291dHB1dF9wcG0gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGZmbHVzaChkaW5mby0+b3V0cHV0X2ZpbGUpOworICBpZiAoZmVycm9yKGRpbmZvLT5vdXRwdXRfZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUFBNIGZvcm1hdCBvdXRwdXQuCisgKi8KKworR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQoramluaXRfd3JpdGVfcHBtIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBwcG1fZGVzdF9wdHIgZGVzdDsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCisgIGRlc3QgPSAocHBtX2Rlc3RfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihwcG1fZGVzdF9zdHJ1Y3QpKTsKKyAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9wcG07CisgIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9wcG07CisKKyAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworCisgIC8qIENyZWF0ZSBwaHlzaWNhbCBJL08gYnVmZmVyLiAgTm90ZSB3ZSBtYWtlIHRoaXMgbmVhciBvbiBhIFBDLiAqLworICBkZXN0LT5zYW1wbGVzX3Blcl9yb3cgPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOworICBkZXN0LT5idWZmZXJfd2lkdGggPSBkZXN0LT5zYW1wbGVzX3Blcl9yb3cgKiAoQllURVNQRVJTQU1QTEUgKiBTSVpFT0YoY2hhcikpOworICBkZXN0LT5pb2J1ZmZlciA9IChjaGFyICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCBCSVRTX0lOX0pTQU1QTEUgIT0gOCB8fAorICAgICAgU0laRU9GKEpTQU1QTEUpICE9IFNJWkVPRihjaGFyKSkgeworICAgIC8qIFdoZW4gcXVhbnRpemluZywgd2UgbmVlZCBhbiBvdXRwdXQgYnVmZmVyIGZvciBjb2xvcm1hcCBpbmRleGVzCisgICAgICogdGhhdCdzIHNlcGFyYXRlIGZyb20gdGhlIHBoeXNpY2FsIEkvTyBidWZmZXIuICBXZSBhbHNvIG5lZWQgYQorICAgICAqIHNlcGFyYXRlIGJ1ZmZlciBpZiBwaXhlbCBmb3JtYXQgdHJhbnNsYXRpb24gbXVzdCB0YWtlIHBsYWNlLgorICAgICAqLworICAgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOworICAgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKyAgICBpZiAoISBjaW5mby0+cXVhbnRpemVfY29sb3JzKQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gY29weV9waXhlbF9yb3dzOworICAgIGVsc2UgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9ncmF5OworICAgIGVsc2UKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9yZ2I7CisgIH0gZWxzZSB7CisgICAgLyogV2Ugd2lsbCBmd3JpdGUoKSBkaXJlY3RseSBmcm9tIGRlY29tcHJlc3NvciBvdXRwdXQgYnVmZmVyLiAqLworICAgIC8qIFN5bnRoZXNpemUgYSBKU0FNUEFSUkFZIHBvaW50ZXIgc3RydWN0dXJlICovCisgICAgLyogQ2FzdCBoZXJlIGltcGxpZXMgbmVhci0+ZmFyIHBvaW50ZXIgY29udmVyc2lvbiBvbiBQQ3MgKi8KKyAgICBkZXN0LT5waXhyb3cgPSAoSlNBTVBST1cpIGRlc3QtPmlvYnVmZmVyOworICAgIGRlc3QtPnB1Yi5idWZmZXIgPSAmIGRlc3QtPnBpeHJvdzsKKyAgICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7CisgIH0KKworICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OworfQorCisjZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvd3JybGUuYyBiL3dycmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNzMzNwotLS0gL2Rldi9udWxsCisrKyBiL3dycmxlLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiB3cnJsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBSTEUgZm9ybWF0LgorICogVGhlIFV0YWggUmFzdGVyIFRvb2xraXQgbGlicmFyeSBpcyByZXF1aXJlZCAodmVyc2lvbiAzLjEgb3IgbGF0ZXIpLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgTGlqZXdza2ksCisgKiB3aXRoIHVwZGF0ZXMgZnJvbSBSb2JlcnQgSHV0Y2hpbnNvbi4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgUkxFX1NVUFBPUlRFRAorCisvKiBybGUuaCBpcyBwcm92aWRlZCBieSB0aGUgVXRhaCBSYXN0ZXIgVG9vbGtpdC4gKi8KKworI2luY2x1ZGUgPHJsZS5oPgorCisvKgorICogV2UgYXNzdW1lIHRoYXQgSlNBTVBMRSBoYXMgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYXMgcmxlX3BpeGVsLAorICogdG8gd2l0LCAidW5zaWduZWQgY2hhciIuICBIZW5jZSB3ZSBjYW4ndCBjb3BlIHdpdGggMTItIG9yIDE2LWJpdCBzYW1wbGVzLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKgorICogU2luY2UgUkxFIHN0b3JlcyBzY2FubGluZXMgYm90dG9tLXRvLXRvcCwgd2UgaGF2ZSB0byBpbnZlcnQgdGhlIGltYWdlCisgKiBmcm9tIEpQRUcncyB0b3AtdG8tYm90dG9tIG9yZGVyLiAgVG8gZG8gdGhpcywgd2Ugc2F2ZSB0aGUgb3V0Z29pbmcgZGF0YQorICogaW4gYSB2aXJ0dWFsIGFycmF5IGR1cmluZyBwdXRfcGl4ZWxfcm93IGNhbGxzLCB0aGVuIGFjdHVhbGx5IGVtaXQgdGhlCisgKiBSTEUgZmlsZSBkdXJpbmcgZmluaXNoX291dHB1dC4KKyAqLworCisKKy8qCisgKiBGb3Igbm93LCBpZiB3ZSBlbWl0IGFuIFJMRSBjb2xvciBtYXAgdGhlbiBpdCBpcyBhbHdheXMgMjU2IGVudHJpZXMgbG9uZywKKyAqIHRob3VnaCBub3QgYWxsIG9mIHRoZSBlbnRyaWVzIG5lZWQgYmUgdXNlZC4KKyAqLworCisjZGVmaW5lIENNQVBCSVRTCTgKKyNkZWZpbmUgQ01BUExFTkdUSAkoMTw8KENNQVBCSVRTKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAganZpcnRfc2FycmF5X3B0ciBpbWFnZTsJLyogdmlydHVhbCBhcnJheSB0byBzdG9yZSB0aGUgb3V0cHV0IGltYWdlICovCisgIHJsZV9tYXAgKmNvbG9ybWFwOwkgCS8qIFJMRS1zdHlsZSBjb2xvciBtYXAsIG9yIE5VTEwgaWYgbm9uZSAqLworICBybGVfcGl4ZWwgKipybGVfcm93OwkJLyogVG8gcGFzcyByb3dzIHRvIHJsZV9wdXRyb3coKSAqLworCit9IHJsZV9kZXN0X3N0cnVjdDsKKwordHlwZWRlZiBybGVfZGVzdF9zdHJ1Y3QgKiBybGVfZGVzdF9wdHI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcmxlX3B1dF9waXhlbF9yb3dzCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKSk7CisKKworLyoKKyAqIFdyaXRlIHRoZSBmaWxlIGhlYWRlci4KKyAqCisgKiBJbiB0aGlzIG1vZHVsZSBpdCdzIGVhc2llciB0byB3YWl0IHRpbGwgZmluaXNoX291dHB1dCB0byB3cml0ZSBhbnl0aGluZy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X291dHB1dF9ybGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICBybGVfZGVzdF9wdHIgZGVzdCA9IChybGVfZGVzdF9wdHIpIGRpbmZvOworICBzaXplX3QgY21hcHNpemU7CisgIGludCBpLCBjaTsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworI2VuZGlmCisKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoZSBpbWFnZSBjYW4gYmUgc3RvcmVkIGluIFJMRSBmb3JtYXQuCisgICAqCisgICAqIC0gUkxFIHN0b3JlcyBpbWFnZSBkaW1lbnNpb25zIGFzICpzaWduZWQqIDE2IGJpdCBpbnRlZ2Vycy4gIEpQRUcKKyAgICogICB1c2VzIHVuc2lnbmVkLCBzbyB3ZSBoYXZlIHRvIGNoZWNrIHRoZSB3aWR0aC4KKyAgICoKKyAgICogLSBDb2xvcnNwYWNlIGlzIGV4cGVjdGVkIHRvIGJlIGdyYXlzY2FsZSBvciBSR0IuCisgICAqCisgICAqIC0gVGhlIG51bWJlciBvZiBjaGFubmVscyAoY29tcG9uZW50cykgaXMgZXhwZWN0ZWQgdG8gYmUgMSAoZ3JheXNjYWxlLworICAgKiAgIHBzZXVkb2NvbG9yKSBvciAzICh0cnVlY29sb3IvZGlyZWN0Y29sb3IpLgorICAgKiAgIChjb3VsZCBiZSAyIG9yIDQgaWYgdXNpbmcgYW4gYWxwaGEgY2hhbm5lbCwgYnV0IHdlIGFyZW4ndCkKKyAgICovCisKKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggPiAzMjc2NyB8fCBjaW5mby0+b3V0cHV0X2hlaWdodCA+IDMyNzY3KQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX1JMRV9ESU1FTlNJT05TLCBjaW5mby0+b3V0cHV0X3dpZHRoLCAKKwkgICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0KTsKKworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfR1JBWVNDQUxFICYmCisgICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfQ09MT1JTUEFDRSk7CisKKyAgaWYgKGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyAhPSAxICYmIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyAhPSAzKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1JMRV9UT09NQU5ZQ0hBTk5FTFMsIGNpbmZvLT5udW1fY29tcG9uZW50cyk7CisKKyAgLyogQ29udmVydCBjb2xvcm1hcCwgaWYgYW55LCB0byBSTEUgZm9ybWF0LiAqLworCisgIGRlc3QtPmNvbG9ybWFwID0gTlVMTDsKKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgIC8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIFJMRS1zdHlsZSBjbWFwLCB6ZXJvIGFueSBleHRyYSBlbnRyaWVzICovCisgICAgY21hcHNpemUgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgKiBDTUFQTEVOR1RIICogU0laRU9GKHJsZV9tYXApOworICAgIGRlc3QtPmNvbG9ybWFwID0gKHJsZV9tYXAgKikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGNtYXBzaXplKTsKKyAgICBNRU1aRVJPKGRlc3QtPmNvbG9ybWFwLCBjbWFwc2l6ZSk7CisKKyAgICAvKiBTYXZlIGF3YXkgZGF0YSBpbiBSTEUgZm9ybWF0IC0tLSBub3RlIDgtYml0IGxlZnQgc2hpZnQhICovCisgICAgLyogU2hpZnRpbmcgd291bGQgbmVlZCBhZGp1c3RtZW50IGZvciBKU0FNUExFcyB3aWRlciB0aGFuIDggYml0cy4gKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnM7IGkrKykgeworICAgICAgICBkZXN0LT5jb2xvcm1hcFtjaSAqIENNQVBMRU5HVEggKyBpXSA9CisgICAgICAgICAgR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbY2ldW2ldKSA8PCA4OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNldCB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgZmlyc3Qgcm93ICovCisgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPmltYWdlLCAoSkRJTUVOU0lPTikgMCwgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisKKyAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcmxlX3B1dF9waXhlbF9yb3dzOworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgcHJvZ3Jlc3MtPnRvdGFsX2V4dHJhX3Bhc3NlcysrOyAgLyogY291bnQgZmlsZSB3cml0aW5nIGFzIHNlcGFyYXRlIHBhc3MgKi8KKyAgfQorI2VuZGlmCit9CisKKworLyoKKyAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KKyAqCisgKiBUaGlzIHJvdXRpbmUganVzdCBzYXZlcyB0aGUgZGF0YSBhd2F5IGluIGEgdmlydHVhbCBhcnJheS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3JsZV9wdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCSAgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCit7CisgIHJsZV9kZXN0X3B0ciBkZXN0ID0gKHJsZV9kZXN0X3B0cikgZGluZm87CisKKyAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkgeworICAgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+aW1hZ2UsCisgICAgICAgY2luZm8tPm91dHB1dF9zY2FubGluZSwgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICB9Cit9CisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqCisgKiBIZXJlIGlzIHdoZXJlIHdlIHJlYWxseSBvdXRwdXQgdGhlIFJMRSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX291dHB1dF9ybGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICBybGVfZGVzdF9wdHIgZGVzdCA9IChybGVfZGVzdF9wdHIpIGRpbmZvOworICBybGVfaGRyIGhlYWRlcjsJCS8qIE91dHB1dCBmaWxlIGluZm9ybWF0aW9uICovCisgIHJsZV9waXhlbCAqKnJsZV9yb3csICpyZWQsICpncmVlbiwgKmJsdWU7CisgIEpTQU1QUk9XIG91dHB1dF9yb3c7CisgIGNoYXIgY21hcGNvbW1lbnRbODBdOworICBpbnQgcm93LCBjb2w7CisgIGludCBjaTsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworI2VuZGlmCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgaGVhZGVyIGluZm8gKi8KKyAgaGVhZGVyID0gKnJsZV9oZHJfaW5pdChOVUxMKTsKKyAgaGVhZGVyLnJsZV9maWxlID0gZGVzdC0+cHViLm91dHB1dF9maWxlOworICBoZWFkZXIueG1pbiAgICAgPSAwOworICBoZWFkZXIueG1heCAgICAgPSBjaW5mby0+b3V0cHV0X3dpZHRoICAtIDE7CisgIGhlYWRlci55bWluICAgICA9IDA7CisgIGhlYWRlci55bWF4ICAgICA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gMTsKKyAgaGVhZGVyLmFscGhhICAgID0gMDsKKyAgaGVhZGVyLm5jb2xvcnMgID0gY2luZm8tPm91dHB1dF9jb21wb25lbnRzOworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBSTEVfU0VUX0JJVChoZWFkZXIsIGNpKTsKKyAgfQorICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgIGhlYWRlci5uY21hcCAgID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOworICAgIGhlYWRlci5jbWFwbGVuID0gQ01BUEJJVFM7CisgICAgaGVhZGVyLmNtYXAgICAgPSBkZXN0LT5jb2xvcm1hcDsKKyAgICAvKiBBZGQgYSBjb21tZW50IHRvIHRoZSBvdXRwdXQgaW1hZ2Ugd2l0aCB0aGUgdHJ1ZSBjb2xvcm1hcCBsZW5ndGguICovCisgICAgc3ByaW50ZihjbWFwY29tbWVudCwgImNvbG9yX21hcF9sZW5ndGg9JWQiLCBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnMpOworICAgIHJsZV9wdXRjb20oY21hcGNvbW1lbnQsICZoZWFkZXIpOworICB9CisKKyAgLyogRW1pdCB0aGUgUkxFIGhlYWRlciBhbmQgY29sb3IgbWFwIChpZiBhbnkpICovCisgIHJsZV9wdXRfc2V0dXAoJmhlYWRlcik7CisKKyAgLyogTm93IG91dHB1dCB0aGUgUkxFIGRhdGEgZnJvbSBvdXIgdmlydHVhbCBhcnJheS4KKyAgICogV2UgYXNzdW1lIGhlcmUgdGhhdCAoYSkgcmxlX3BpeGVsIGlzIHJlcHJlc2VudGVkIHRoZSBzYW1lIGFzIEpTQU1QTEUsCisgICAqIGFuZCAoYikgd2UgYXJlIG5vdCBvbiBhIG1hY2hpbmUgd2hlcmUgRkFSIHBvaW50ZXJzIGRpZmZlciBmcm9tIHJlZ3VsYXIuCisgICAqLworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7CisgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAwOworICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisjZW5kaWYKKworICBpZiAoY2luZm8tPm91dHB1dF9jb21wb25lbnRzID09IDEpIHsKKyAgICBmb3IgKHJvdyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0LTE7IHJvdyA+PSAwOyByb3ctLSkgeworICAgICAgcmxlX3JvdyA9IChybGVfcGl4ZWwgKiopICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPmltYWdlLAorCSAoSkRJTUVOU0lPTikgcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworICAgICAgcmxlX3B1dHJvdyhybGVfcm93LCAoaW50KSBjaW5mby0+b3V0cHV0X3dpZHRoLCAmaGVhZGVyKTsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7CisgICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorI2VuZGlmCisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAocm93ID0gY2luZm8tPm91dHB1dF9oZWlnaHQtMTsgcm93ID49IDA7IHJvdy0tKSB7CisgICAgICBybGVfcm93ID0gKHJsZV9waXhlbCAqKikgZGVzdC0+cmxlX3JvdzsKKyAgICAgIG91dHB1dF9yb3cgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPmltYWdlLAorCSAoSkRJTUVOU0lPTikgcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworICAgICAgcmVkID0gcmxlX3Jvd1swXTsKKyAgICAgIGdyZWVuID0gcmxlX3Jvd1sxXTsKKyAgICAgIGJsdWUgPSBybGVfcm93WzJdOworICAgICAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgICAqcmVkKysgPSBHRVRKU0FNUExFKCpvdXRwdXRfcm93KyspOworICAgICAgICAqZ3JlZW4rKyA9IEdFVEpTQU1QTEUoKm91dHB1dF9yb3crKyk7CisgICAgICAgICpibHVlKysgPSBHRVRKU0FNUExFKCpvdXRwdXRfcm93KyspOworICAgICAgfQorICAgICAgcmxlX3B1dHJvdyhybGVfcm93LCAoaW50KSBjaW5mby0+b3V0cHV0X3dpZHRoLCAmaGVhZGVyKTsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7CisgICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpCisgICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKKyNlbmRpZgorCisgIC8qIEVtaXQgZmlsZSB0cmFpbGVyICovCisgIHJsZV9wdXRlb2YoJmhlYWRlcik7CisgIGZmbHVzaChkZXN0LT5wdWIub3V0cHV0X2ZpbGUpOworICBpZiAoZmVycm9yKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUkxFIGZvcm1hdCBvdXRwdXQuCisgKi8KKworR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQoramluaXRfd3JpdGVfcmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBybGVfZGVzdF9wdHIgZGVzdDsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCisgIGRlc3QgPSAocmxlX2Rlc3RfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0YocmxlX2Rlc3Rfc3RydWN0KSk7CisgIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfcmxlOworICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfcmxlOworCisgIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KKyAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKKworICAvKiBBbGxvY2F0ZSBhIHdvcmsgYXJyYXkgZm9yIG91dHB1dCB0byB0aGUgUkxFIGxpYnJhcnkuICovCisgIGRlc3QtPnJsZV9yb3cgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICBjaW5mby0+b3V0cHV0X3dpZHRoLCAoSkRJTUVOU0lPTikgY2luZm8tPm91dHB1dF9jb21wb25lbnRzKTsKKworICAvKiBBbGxvY2F0ZSBhIHZpcnR1YWwgYXJyYXkgdG8gaG9sZCB0aGUgaW1hZ2UuICovCisgIGRlc3QtPmltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorICAgICAoSkRJTUVOU0lPTikgKGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMpLAorICAgICBjaW5mby0+b3V0cHV0X2hlaWdodCwgKEpESU1FTlNJT04pIDEpOworCisgIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Cit9CisKKyNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS93cnRhcmdhLmMgYi93cnRhcmdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxMDRkMgotLS0gL2Rldi9udWxsCisrKyBiL3dydGFyZ2EuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIHdydGFyZ2EuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gVGFyZ2EgZm9ybWF0LgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBvdXRwdXQgdG8KKyAqIGFuIG9yZGluYXJ5IHN0ZGlvIHN0cmVhbS4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IExlZSBEYW5pZWwgQ3JvY2tlci4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisKKworLyoKKyAqIFRvIHN1cHBvcnQgMTItYml0IEpQRUcgZGF0YSwgd2UnZCBoYXZlIHRvIHNjYWxlIG91dHB1dCBkb3duIHRvIDggYml0cy4KKyAqIFRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOC1iaXQgSlNBTVBMRXMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKy8qCisgKiBUaGUgb3V0cHV0IGJ1ZmZlciBuZWVkcyB0byBiZSB3cml0YWJsZSBieSBmd3JpdGUoKS4gIE9uIFBDcywgd2UgbXVzdAorICogYWxsb2NhdGUgdGhlIGJ1ZmZlciBpbiBuZWFyIGRhdGEgc3BhY2UsIGJlY2F1c2Ugd2UgYXJlIGFzc3VtaW5nIHNtYWxsLWRhdGEKKyAqIG1lbW9yeSBtb2RlbCwgd2hlcmVpbiBmd3JpdGUoKSBjYW4ndCByZWFjaCBmYXIgbWVtb3J5LiAgSWYgeW91IG5lZWQgdG8KKyAqIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlIGluIGxhcmdlLW1lbW9yeQorICogbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmd3JpdGUoKSB3aXRoIGEgcHV0YygpIGxvb3AgLS0tIHdoaWNoIHdpbGwgYmUgbXVjaAorICogc2xvd2VyLgorICovCisKKworLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIGNoYXIgKmlvYnVmZmVyOwkJLyogcGh5c2ljYWwgSS9PIGJ1ZmZlciAqLworICBKRElNRU5TSU9OIGJ1ZmZlcl93aWR0aDsJLyogd2lkdGggb2Ygb25lIHJvdyAqLworfSB0Z2FfZGVzdF9zdHJ1Y3Q7CisKK3R5cGVkZWYgdGdhX2Rlc3Rfc3RydWN0ICogdGdhX2Rlc3RfcHRyOworCisKK0xPQ0FMKHZvaWQpCit3cml0ZV9oZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLCBpbnQgbnVtX2NvbG9ycykKKy8qIENyZWF0ZSBhbmQgd3JpdGUgYSBUYXJnYSBoZWFkZXIgKi8KK3sKKyAgY2hhciB0YXJnYWhlYWRlclsxOF07CisKKyAgLyogU2V0IHVudXNlZCBmaWVsZHMgb2YgaGVhZGVyIHRvIDAgKi8KKyAgTUVNWkVSTyh0YXJnYWhlYWRlciwgU0laRU9GKHRhcmdhaGVhZGVyKSk7CisKKyAgaWYgKG51bV9jb2xvcnMgPiAwKSB7CisgICAgdGFyZ2FoZWFkZXJbMV0gPSAxOwkJLyogY29sb3IgbWFwIHR5cGUgMSAqLworICAgIHRhcmdhaGVhZGVyWzVdID0gKGNoYXIpIChudW1fY29sb3JzICYgMHhGRik7CisgICAgdGFyZ2FoZWFkZXJbNl0gPSAoY2hhcikgKG51bV9jb2xvcnMgPj4gOCk7CisgICAgdGFyZ2FoZWFkZXJbN10gPSAyNDsJLyogMjQgYml0cyBwZXIgY21hcCBlbnRyeSAqLworICB9CisKKyAgdGFyZ2FoZWFkZXJbMTJdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMHhGRik7CisgIHRhcmdhaGVhZGVyWzEzXSA9IChjaGFyKSAoY2luZm8tPm91dHB1dF93aWR0aCA+PiA4KTsKKyAgdGFyZ2FoZWFkZXJbMTRdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X2hlaWdodCAmIDB4RkYpOworICB0YXJnYWhlYWRlclsxNV0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID4+IDgpOworICB0YXJnYWhlYWRlclsxN10gPSAweDIwOwkvKiBUb3AtZG93biwgbm9uLWludGVybGFjZWQgKi8KKworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgdGFyZ2FoZWFkZXJbMl0gPSAzOwkJLyogaW1hZ2UgdHlwZSA9IHVuY29tcHJlc3NlZCBncmF5LXNjYWxlICovCisgICAgdGFyZ2FoZWFkZXJbMTZdID0gODsJLyogYml0cyBwZXIgcGl4ZWwgKi8KKyAgfSBlbHNlIHsJCQkvKiBtdXN0IGJlIFJHQiAqLworICAgIGlmIChudW1fY29sb3JzID4gMCkgeworICAgICAgdGFyZ2FoZWFkZXJbMl0gPSAxOwkvKiBpbWFnZSB0eXBlID0gY29sb3JtYXBwZWQgUkdCICovCisgICAgICB0YXJnYWhlYWRlclsxNl0gPSA4OworICAgIH0gZWxzZSB7CisgICAgICB0YXJnYWhlYWRlclsyXSA9IDI7CS8qIGltYWdlIHR5cGUgPSB1bmNvbXByZXNzZWQgUkdCICovCisgICAgICB0YXJnYWhlYWRlclsxNl0gPSAyNDsKKyAgICB9CisgIH0KKworICBpZiAoSkZXUklURShkaW5mby0+b3V0cHV0X2ZpbGUsIHRhcmdhaGVhZGVyLCAxOCkgIT0gKHNpemVfdCkgMTgpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgorICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCisvKiB1c2VkIGZvciB1bnF1YW50aXplZCBmdWxsLWNvbG9yIG91dHB1dCAqLworeworICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIG91dHB0clswXSA9IChjaGFyKSBHRVRKU0FNUExFKGlucHRyWzJdKTsgLyogUkdCIHRvIEJHUiBvcmRlciAqLworICAgIG91dHB0clsxXSA9IChjaGFyKSBHRVRKU0FNUExFKGlucHRyWzFdKTsKKyAgICBvdXRwdHJbMl0gPSAoY2hhcikgR0VUSlNBTVBMRShpbnB0clswXSk7CisgICAgaW5wdHIgKz0gMywgb3V0cHRyICs9IDM7CisgIH0KKyAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKK30KKworTUVUSE9EREVGKHZvaWQpCitwdXRfZ3JheV9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkgICAgICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQorLyogdXNlZCBmb3IgZ3JheXNjYWxlIE9SIHF1YW50aXplZCBjb2xvciBvdXRwdXQgKi8KK3sKKyAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIGNoYXIgKiBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgb3V0cHRyID0gZGVzdC0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAqb3V0cHRyKysgPSAoY2hhcikgR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgIH0KKyAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKK30KKworCisvKgorICogV3JpdGUgc29tZSBkZW1hcHBlZCBwaXhlbCBkYXRhIHdoZW4gY29sb3IgcXVhbnRpemF0aW9uIGlzIGluIGVmZmVjdC4KKyAqIEZvciBUYXJnYSwgdGhpcyBpcyBvbmx5IGFwcGxpZWQgdG8gZ3JheXNjYWxlIGRhdGEuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwdXRfZGVtYXBwZWRfZ3JheSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCSAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKK3sKKyAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIGNoYXIgKiBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGNvbG9yX21hcDAgPSBjaW5mby0+Y29sb3JtYXBbMF07CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgb3V0cHRyID0gZGVzdC0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAqb3V0cHRyKysgPSAoY2hhcikgR0VUSlNBTVBMRShjb2xvcl9tYXAwW0dFVEpTQU1QTEUoKmlucHRyKyspXSk7CisgIH0KKyAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKK30KKworCisvKgorICogU3RhcnR1cDogd3JpdGUgdGhlIGZpbGUgaGVhZGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfb3V0cHV0X3RnYSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIHRnYV9kZXN0X3B0ciBkZXN0ID0gKHRnYV9kZXN0X3B0cikgZGluZm87CisgIGludCBudW1fY29sb3JzLCBpOworICBGSUxFICpvdXRmaWxlOworCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICAvKiBUYXJnYSBkb2Vzbid0IGhhdmUgYSBtYXBwZWQgZ3JheXNjYWxlIGZvcm1hdCwgc28gd2Ugd2lsbCAqLworICAgIC8qIGRlbWFwIHF1YW50aXplZCBncmF5IG91dHB1dC4gIE5ldmVyIGVtaXQgYSBjb2xvcm1hcC4gKi8KKyAgICB3cml0ZV9oZWFkZXIoY2luZm8sIGRpbmZvLCAwKTsKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9kZW1hcHBlZF9ncmF5OworICAgIGVsc2UKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7CisgIH0gZWxzZSBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICAgIC8qIFdlIG9ubHkgc3VwcG9ydCA4LWJpdCBjb2xvcm1hcCBpbmRleGVzLCBzbyBvbmx5IDI1NiBjb2xvcnMgKi8KKyAgICAgIG51bV9jb2xvcnMgPSBjaW5mby0+YWN0dWFsX251bWJlcl9vZl9jb2xvcnM7CisgICAgICBpZiAobnVtX2NvbG9ycyA+IDI1NikKKwlFUlJFWElUMShjaW5mbywgSkVSUl9UT09fTUFOWV9DT0xPUlMsIG51bV9jb2xvcnMpOworICAgICAgd3JpdGVfaGVhZGVyKGNpbmZvLCBkaW5mbywgbnVtX2NvbG9ycyk7CisgICAgICAvKiBXcml0ZSB0aGUgY29sb3JtYXAuICBOb3RlIFRhcmdhIHVzZXMgQkdSIGJ5dGUgb3JkZXIgKi8KKyAgICAgIG91dGZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgaSsrKSB7CisJcHV0YyhHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpXSksIG91dGZpbGUpOworCXB1dGMoR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMV1baV0pLCBvdXRmaWxlKTsKKwlwdXRjKEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzBdW2ldKSwgb3V0ZmlsZSk7CisgICAgICB9CisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZ3JheV9yb3dzOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9oZWFkZXIoY2luZm8sIGRpbmZvLCAwKTsKKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9waXhlbF9yb3dzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9DT0xPUlNQQUNFKTsKKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9vdXRwdXRfdGdhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLworICBmZmx1c2goZGluZm8tPm91dHB1dF9maWxlKTsKKyAgaWYgKGZlcnJvcihkaW5mby0+b3V0cHV0X2ZpbGUpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7Cit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFRhcmdhIGZvcm1hdCBvdXRwdXQuCisgKi8KKworR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQoramluaXRfd3JpdGVfdGFyZ2EgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHRnYV9kZXN0X3B0ciBkZXN0OworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KKyAgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKHRnYV9kZXN0X3N0cnVjdCkpOworICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X3RnYTsKKyAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X3RnYTsKKworICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCisgIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7CisKKyAgLyogQ3JlYXRlIEkvTyBidWZmZXIuICBOb3RlIHdlIG1ha2UgdGhpcyBuZWFyIG9uIGEgUEMuICovCisgIGRlc3QtPmJ1ZmZlcl93aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHM7CisgIGRlc3QtPmlvYnVmZmVyID0gKGNoYXIgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShzaXplX3QpIChkZXN0LT5idWZmZXJfd2lkdGggKiBTSVpFT0YoY2hhcikpKTsKKworICAvKiBDcmVhdGUgZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIuICovCisgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBkZXN0LT5idWZmZXJfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKKyAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworCisgIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Cit9CisKKyNlbmRpZiAvKiBUQVJHQV9TVVBQT1JURUQgKi8K