ZGlmZiAtLWdpdCBhL0xJQ0VOU0UudHh0IGIvTElDRU5TRS50eHQKaW5kZXggOTQ2YTZkZi4uOTk5ODlmMSAxMDA2NDQKLS0tIGEvTElDRU5TRS50eHQKKysrIGIvTElDRU5TRS50eHQKQEAgLTI4OCwzICsyODgsMzYgQEAKICAgIC0gTFo0IGhvbWVwYWdlIDogaHR0cDovL2Zhc3Rjb21wcmVzc2lvbi5ibG9nc3BvdC5jb20vcC9sejQuaHRtbAogICAgLSBMWjQgc291cmNlIHJlcG9zaXRvcnkgOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvbHo0LwogKi8KKworCitGb3IgaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL2d0ZXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCitkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQordGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwpkaWZmIC0tZ2l0IGEvaGFkb29wLWFzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvaGFkb29wLW1hcHJlZHVjZS1kaXN0LnhtbCBiL2hhZG9vcC1hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL2hhZG9vcC1tYXByZWR1Y2UtZGlzdC54bWwKaW5kZXggMGNiMDFlYS4uNzQ5ZTE2YSAxMDA2NDQKLS0tIGEvaGFkb29wLWFzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvaGFkb29wLW1hcHJlZHVjZS1kaXN0LnhtbAorKysgYi9oYWRvb3AtYXNzZW1ibGllcy9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibGllcy9oYWRvb3AtbWFwcmVkdWNlLWRpc3QueG1sCkBAIC0xMzYsNiArMTM2LDEzIEBACiAgICAgICA8L2luY2x1ZGVzPgogICAgIDwvZmlsZVNldD4KICAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+aGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay90YXJnZXQ8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L3NoYXJlL2hhZG9vcC8ke2hhZG9vcC5jb21wb25lbnR9L3NvdXJjZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+Ki1zb3VyY2VzLmphcjwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0PgogICAgICAgPGRpcmVjdG9yeT5oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1zaHVmZmxlL3RhcmdldDwvZGlyZWN0b3J5PgogICAgICAgPG91dHB1dERpcmVjdG9yeT4vc2hhcmUvaGFkb29wLyR7aGFkb29wLmNvbXBvbmVudH0vc291cmNlczwvb3V0cHV0RGlyZWN0b3J5PgogICAgICAgPGluY2x1ZGVzPgpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L0NIQU5HRVMuTUFQUkVEVUNFLTI4NDEudHh0IGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L0NIQU5HRVMuTUFQUkVEVUNFLTI4NDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzk0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvQ0hBTkdFUy5NQVBSRURVQ0UtMjg0MS50eHQKQEAgLTAsMCArMSwyNiBAQAorQ2hhbmdlcyBmb3IgSGFkb29wIE5hdGl2ZSBNYXAgT3V0cHV0IENvbGxlY3RvcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01BUFJFRFVDRS01OTg1LiBuYXRpdmUtdGFzazogRml4IGJ1aWxkIG9uIG1hY29zeC4gQ29udHJpYnV0ZWQgYnkgQmluZ2xpbiBDaGFuZworTUFQUkVEVUNFLTU5OTQuIFNpbXBsaWZ5IEJ5dGVVdGlscyBhbmQgZml4IGZhaWxpbmcgdGVzdC4gKHRvZGQpCitNQVBSRURVQ0UtNTk5Ni4gbmF0aXZlLXRhc2s6IFJlbmFtZSBzeXN0ZW0gdGVzdHMgaW50byBzdGFuZGFyZCBkaXJlY3RvcnkgbGF5b3V0ICh0b2RkKQorTUFQUkVEVUNFLTU5OTcuIG5hdGl2ZS10YXNrOiBVc2UgRGlyZWN0QnVmZmVyUG9vbCBmcm9tIEhhZG9vcCBDb21tb24gKHRvZGQpCitNQVBSRURVQ0UtNjAwMC4gbmF0aXZlLXRhc2s6IFNpbXBsaWZ5IEJ5dGVCdWZmZXJEYXRhUmVhZGVyL1dyaXRlciAodG9kZCkKK01BUFJFRFVDRS01OTkxLiBuYXRpdmUtdGFzayBzaG91bGQgbm90IHJ1biB1bml0IHRlc3RzIGlmIG5hdGl2ZSBwcm9maWxlIGlzIG5vdCBlbmFibGVkLiAoQmluZ2xpbiBDaGFuZykKK01BUFJFRFVDRS01OTk1LiBuYXRpdmUtdGFzazogUmV2ZXJ0IGNoYW5nZXMgdG8gVGV4dCBpbnRlcm5hbHMgKHRvZGQpCitNQVBSRURVQ0UtNjAwNS4gbmF0aXZlLXRhc2s6IEZpeCBzb21lIHZhbGdyaW5kIGVycm9ycyAoQmluZ2xpbiBDaGFuZykKK01BUFJFRFVDRS01OTg0LiBuYXRpdmUtdGFzazogUmV1c2UgbHo0IHNvdXJjZXMgaW4gaGFkb29wLWNvbW1vbiAoQmluZ2xpbiBDaGFuZykKK01BUFJFRFVDRS01OTc2LiBuYXRpdmUtdGFzazogc2hvdWxkIG5vdCBmYWlsIHRvIGJ1aWxkIGlmIHNuYXBweSBpcyBtaXNzaW5nIChNYW51IFpoYW5nKQorTUFQUkVEVUNFLTU5NzguIG5hdGl2ZS10YXNrOiByZW1vdmUgdGVzdCBjYXNlIGZvciBub3Qgc3VwcG9ydGVkIGNvZGVjIEJ6aXAyQ29kZWMgYW5kIERlZmF1bHRDb2RlYyAoTWFudSBaaGFuZykKK01BUFJFRFVDRS02MDA2LiBuYXRpdmUtdGFzazogYWRkIG5hdGl2ZSB0ZXN0cyB0byBtYXZlbiBhbmQgZml4IGJ1ZyBpbiBwb20ueG1sIChCaW5nbGluIENoYW5nIHZpYSB0b2RkKQorTUFQUkVEVUNFLTYwMjYuIG5hdGl2ZS10YXNrOiBmaXggbG9nZ2luZyAoTWFudSBaaGFuZyB2aWEgdG9kZCkKK01BUFJFRFVDRS02MDM1LiBuYXRpdmUtdGFzazogc291cmNlcy90ZXN0LXNvdXJjZXMgamFyIGRpc3RyaWJ1dGlvbiAoTWFudSBaaGFuZyB2aWEgdG9kZCkKK01BUFJFRFVDRS01OTc3LiBGaXggb3Igc3VwcHJlc3MgbmF0aXZlLXRhc2sgZ2NjIHdhcm5pbmdzIChNYW51IFpoYW5nIHZpYSB0b2RkKQorTUFQUkVEVUNFLTYwNTQuIG5hdGl2ZS10YXNrOiBTcGVlZCB1cCB0ZXN0cyAodG9kZCkKK01BUFJFRFVDRS02MDU4LiBuYXRpdmUtdGFzazogS1ZUZXN0IGFuZCBMYXJnZUtWVGVzdCBzaG91bGQgY2hlY2sgbXIgam9iIGlzIHN1Y2Vzc2Z1bCAoQmluZ2xpbiBDaGFuZykKK01BUFJFRFVDRS02MDU2LiBuYXRpdmUtdGFzazogbW92ZSBzeXN0ZW0gdGVzdCB3b3JraW5nIGRpciB0byB0YXJnZXQgZGlyIGFuZCBjbGVhbnVwIHRlc3QgY29uZmlnIHhtbCBmaWxlcyAoTWFudSBaaGFuZyB2aWEgYmNoYW5nKQorTUFQUkVEVUNFLTYwNTUuIG5hdGl2ZS10YXNrOiBmaW5kYnVncywgaW50ZXJmYWNlIGFubm90YXRpb25zLCBhbmQgb3RoZXIgbWlzYyBjbGVhbnVwICh0b2RkKQorTUFQUkVEVUNFLTYwNjcuIG5hdGl2ZS10YXNrOiBmaXggc29tZSBjb3VudGVyIGlzc3VlcyAoQmluZ2xpbiBDaGFuZykKK01BUFJFRFVDRS02MDY5LiBuYXRpdmUtdGFzazogTGludC9zdHlsZSBmaXhlcyBhbmQgcmVtb3ZhbCBvZiB1bnVzZWQgY29kZSAodG9kZCkKK01BUFJFRFVDRS02MDc0LiBuYXRpdmUtdGFzazogZml4IHJlbGVhc2UgYXVkaXQsIGphdmFkb2MsIGphdmFjIHdhcm5pbmdzICh0b2RkKQorTUFQUkVEVUNFLTYwNzcuIG5hdGl2ZS10YXNrOiBSZW1vdmUgQ3VzdG9tTW9kdWxlIGV4YW1wbGVzIGluIG5hdGl2ZXRhc2sgKHNlYW56aG9uZykKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3BvbS54bWwgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxODk0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9wb20ueG1sCkBAIC0wLDAgKzEsMjE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIFNlZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMAorICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8cGFyZW50PgorICAgIDxhcnRpZmFjdElkPmhhZG9vcC1tYXByZWR1Y2UtY2xpZW50PC9hcnRpZmFjdElkPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgIDx2ZXJzaW9uPjMuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+aGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzazwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+My4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDxuYW1lPmhhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2s8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPCEtLSBOZWVkZWQgZm9yIGdlbmVyYXRpbmcgRmluZEJ1Z3Mgd2FybmluZ3MgdXNpbmcgcGFyZW50IHBvbSAtLT4KKyAgICA8bXIuYmFzZWRpcj4ke3Byb2plY3QucGFyZW50LmJhc2VkaXJ9Ly4uLzwvbXIuYmFzZWRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhhZG9vcDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmhhZG9vcC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5oYWRvb3A8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXZybzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmF2cm88L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLW1hcHJlZHVjZS1jbGllbnQtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICA8bmFtZT5saXN0ZW5lcjwvbmFtZT4KKyAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuaGFkb29wLnRlc3QuVGltZWRPdXRUZXN0c0xpc3RlbmVyPC92YWx1ZT4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT4qKi9UZXN0Ki5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5yYXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1yYXQtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvbWFpbi9uYXRpdmUvdGVzdERhdGEvKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwhLS0gZ3Rlc3QgaGFzIGEgY29tcGF0aWJsZSBsaWNlbnNlIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL21haW4vbmF0aXZlL2d0ZXN0LyoqLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5uYXRpdmU8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c25hcHB5LnByZWZpeD48L3NuYXBweS5wcmVmaXg+CisgICAgICAgIDxzbmFwcHkubGliPjwvc25hcHB5LmxpYj4KKyAgICAgICAgPHNuYXBweS5pbmNsdWRlPjwvc25hcHB5LmluY2x1ZGU+CisgICAgICAgIDxyZXF1aXJlLnNuYXBweT5mYWxzZTwvcmVxdWlyZS5zbmFwcHk+CisgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS1vczwvaWQ+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+ZW5mb3JjZTwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPHJ1bGVzPgorICAgICAgICAgICAgICAgICAgICA8cmVxdWlyZU9TPgorICAgICAgICAgICAgICAgICAgICAgIDxmYW1pbHk+bWFjPC9mYW1pbHk+CisgICAgICAgICAgICAgICAgICAgICAgPGZhbWlseT51bml4PC9mYW1pbHk+CisgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+bmF0aXZlIGJ1aWxkIG9ubHkgc3VwcG9ydGVkIG9uIE1hYyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgVW5peDwvbWVzc2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9yZXF1aXJlT1M+CisgICAgICAgICAgICAgICAgICA8L3J1bGVzPgorICAgICAgICAgICAgICAgICAgPGZhaWw+dHJ1ZTwvZmFpbD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm5hdGl2ZS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+amF2YWg8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxqYXZhaFBhdGg+JHtlbnYuSkFWQV9IT01FfS9iaW4vamF2YWg8L2phdmFoUGF0aD4KKyAgICAgICAgICAgICAgICAgIDxqYXZhaENsYXNzTmFtZXM+CisgICAgICAgICAgICAgICAgICAgIDxqYXZhQ2xhc3NOYW1lPm9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLk5hdGl2ZUJhdGNoUHJvY2Vzc29yPC9qYXZhQ2xhc3NOYW1lPgorICAgICAgICAgICAgICAgICAgICA8amF2YUNsYXNzTmFtZT5vcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVSdW50aW1lPC9qYXZhQ2xhc3NOYW1lPgorICAgICAgICAgICAgICAgICAgPC9qYXZhaENsYXNzTmFtZXM+CisgICAgICAgICAgICAgICAgICA8amF2YWhPdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbmF0aXZlL2phdmFoPC9qYXZhaE91dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPGlkPm1ha2U8L2lkPgorICAgICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vLi4vLi4vLi4vaGFkb29wLWNvbW1vbi1wcm9qZWN0L2hhZG9vcC1jb21tb24vc3JjL21haW4vbmF0aXZlL3NyYy9vcmcvYXBhY2hlL2hhZG9vcC9pby9jb21wcmVzcy9sejQvbHo0LmgiCisgICAgICAgICAgICAgICAgICAgICAgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L25hdGl2ZS8iIC8+CisgICAgICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vLi4vLi4vLi4vaGFkb29wLWNvbW1vbi1wcm9qZWN0L2hhZG9vcC1jb21tb24vc3JjL21haW4vbmF0aXZlL3NyYy9vcmcvYXBhY2hlL2hhZG9vcC9pby9jb21wcmVzcy9sejQvbHo0X2VuY29kZXIuaCIKKyAgICAgICAgICAgICAgICAgICAgICB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbmF0aXZlLyIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS8uLi8uLi8uLi9oYWRvb3AtY29tbW9uLXByb2plY3QvaGFkb29wLWNvbW1vbi9zcmMvbWFpbi9uYXRpdmUvc3JjL29yZy9hcGFjaGUvaGFkb29wL2lvL2NvbXByZXNzL2x6NC9sejQuYyIKKyAgICAgICAgICAgICAgICAgICAgICB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbmF0aXZlLyIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L25hdGl2ZS90ZXN0L3Rlc3REYXRhIgorICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NyYy9tYWluL25hdGl2ZS90ZXN0RGF0YSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgorICAgICAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJjbWFrZSIgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9uYXRpdmUiCisgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iJHtiYXNlZGlyfS9zcmMvIC1ER0VORVJBVEVEX0pBVkFIPSR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L25hdGl2ZS9qYXZhaCAtREpWTV9BUkNIX0RBVEFfTU9ERUw9JHtzdW4uYXJjaC5kYXRhLm1vZGVsfSAtRFJFUVVJUkVfU05BUFBZPSR7cmVxdWlyZS5zbmFwcHl9IC1EQ1VTVE9NX1NOQVBQWV9QUkVGSVg9JHtzbmFwcHkucHJlZml4fSAtRENVU1RPTV9TTkFQUFlfTElCPSR7c25hcHB5LmxpYn0gLURDVVNUT01fU05BUFBZX0lOQ0xVREU9JHtzbmFwcHkuaW5jbHVkZX0iIC8+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ibWFrZSIgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9uYXRpdmUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9IlZFUkJPU0U9MSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjPgorICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBzZWNvbmQgbWFrZSBpcyBhIHdvcmthcm91bmQgZm9yIEhBRE9PUC05MjE1LiBJdCBjYW4gYmUgCisgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCB3aGVuIHZlcnNpb24gMi42IG9mIGNtYWtlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgLiAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ibWFrZSIgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9uYXRpdmUiIGZhaWxvbmVycm9yPSJ0cnVlIj48L2V4ZWM+CisgICAgICAgICAgICAgICAgICA8L3RhcmdldD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5uYXRpdmVfdGVzdHM8L2lkPgorICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+PGdvYWw+cnVuPC9nb2FsPjwvZ29hbHM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8dGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJzaCIgZmFpbG9uZXJyb3I9InRydWUiIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbmF0aXZlL3Rlc3QiPgorICAgICAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1jIi8+CisgICAgICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iWyB4JFNLSVBURVNUUyA9IHh0cnVlIF0gfHwgc2ggdGVzdC5zaCIvPgorICAgICAgICAgICAgICAgICAgICAgIDxlbnYga2V5PSJTS0lQVEVTVFMiIHZhbHVlPSIke3NraXBUZXN0c30iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjPgorICAgICAgICAgICAgICAgICAgPC90YXJnZXQ+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvQ01ha2VMaXN0cy50eHQgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlZDE3NgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI3NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNiBGQVRBTF9FUlJPUikKKworIyBEZWZhdWx0IHRvIHJlbGVhc2UgYnVpbGRzCitzZXQoQ01BS0VfQlVJTERfVFlQRSwgUmVsZWFzZSkKKworaW5jbHVkZShKTklGbGFncy5jbWFrZSBOT19QT0xJQ1lfU0NPUEUpCisKKyMgQ29tcGlsZSBhIGxpYnJhcnkgd2l0aCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIHZhcmlhbnRzCitmdW5jdGlvbihhZGRfZHVhbF9saWJyYXJ5IExJQk5BTUUpCisgICAgYWRkX2xpYnJhcnkoJHtMSUJOQU1FfSBTSEFSRUQgJHtBUkdOfSkKKyAgICBhZGRfbGlicmFyeSgke0xJQk5BTUV9X3N0YXRpYyBTVEFUSUMgJHtBUkdOfSkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtMSUJOQU1FfV9zdGF0aWMgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSAke0xJQk5BTUV9KQorZW5kZnVuY3Rpb24oYWRkX2R1YWxfbGlicmFyeSkKKworIyBMaW5rIGJvdGggYSBzdGF0aWMgYW5kIGEgZHluYW1pYyB0YXJnZXQgYWdhaW5zdCBzb21lIGxpYnJhcmllcworZnVuY3Rpb24odGFyZ2V0X2xpbmtfZHVhbF9saWJyYXJpZXMgTElCTkFNRSkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtMSUJOQU1FfSAke0FSR059KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke0xJQk5BTUV9X3N0YXRpYyAke0FSR059KQorZW5kZnVuY3Rpb24odGFyZ2V0X2xpbmtfZHVhbF9saWJyYXJpZXMpCisKK2Z1bmN0aW9uKG91dHB1dF9kaXJlY3RvcnkgVEdUIERJUikKKyAgICBTRVRfVEFSR0VUX1BST1BFUlRJRVMoJHtUR1R9IFBST1BFUlRJRVMKKyAgICAgICAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICIke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfSIpCisgICAgU0VUX1RBUkdFVF9QUk9QRVJUSUVTKCR7VEdUfSBQUk9QRVJUSUVTCisgICAgICAgIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0iKQorICAgIFNFVF9UQVJHRVRfUFJPUEVSVElFUygke1RHVH0gUFJPUEVSVElFUworICAgICAgICBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgIiR7Q01BS0VfQklOQVJZX0RJUn0vJHtESVJ9IikKK2VuZGZ1bmN0aW9uKG91dHB1dF9kaXJlY3RvcnkgVEdUIERJUikKKworZnVuY3Rpb24oZHVhbF9vdXRwdXRfZGlyZWN0b3J5IFRHVCBESVIpCisgICAgb3V0cHV0X2RpcmVjdG9yeSgke1RHVH0gIiR7RElSfSIpCisgICAgb3V0cHV0X2RpcmVjdG9yeSgke1RHVH1fc3RhdGljICIke0RJUn0iKQorZW5kZnVuY3Rpb24oZHVhbF9vdXRwdXRfZGlyZWN0b3J5IFRHVCBESVIpCisKKyMKKyMgVGhpcyBtYWNybyBhbHRlcnMgdGhlIGJlaGF2aW9yIG9mIGZpbmRfcGFja2FnZSBhbmQgZmluZF9saWJyYXJ5LgorIyBJdCBkb2VzIHRoaXMgYnkgc2V0dGluZyB0aGUgQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTIGdsb2JhbCB2YXJpYWJsZS4KKyMgWW91IHNob3VsZCBzYXZlIHRoYXQgdmFyaWFibGUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgcmVzdG9yZSBpdAorIyBhZnRlciB5b3UgaGF2ZSBhY2NvbXBsaXNoZWQgeW91ciBnb2FsLgorIworIyBUaGUgYmVoYXZpb3IgaXMgYWx0ZXJlZCBpbiB0d28gd2F5czoKKyMgMS4gV2UgYWx3YXlzIGZpbmQgc2hhcmVkIGxpYnJhcmllcywgbmV2ZXIgc3RhdGljOworIyAyLiBXZSBmaW5kIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUgZ2l2ZW4gdmVyc2lvbiBudW1iZXIuCisjCisjIE9uIFdpbmRvd3MgdGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wLiAgV2luZG93cyBkb2VzIG5vdCBlbmNvZGUKKyMgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gaW5mb3JtYXRpb24gaW50byBsaWJyYXJ5IHBhdGggbmFtZXMuCisjCittYWNybyhzZXRfZmluZF9zaGFyZWRfbGlicmFyeV92ZXJzaW9uIExWRVJTKQorICAgIElGKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIpCisgICAgICAgICMgTWFjIE9TIHVzZXMgLmR5bGliCisgICAgICAgIFNFVChDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVMgIi4ke0xWRVJTfS5keWxpYiIpCisgICAgRUxTRUlGKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkZyZWVCU0QiKQorICAgICAgICAjIEZyZWVCU0QgaGFzIGFsd2F5cyAuc28gaW5zdGFsbGVkLgorICAgICAgICBTRVQoQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTICIuc28iKQorICAgIEVMU0VJRigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJXaW5kb3dzIikKKyAgICAgICAgIyBXaW5kb3dzIGRvZXNuJ3Qgc3VwcG9ydCBmaW5kaW5nIHNoYXJlZCBsaWJyYXJpZXMgYnkgdmVyc2lvbi4KKyAgICBFTFNFKCkKKyAgICAgICAgIyBNb3N0IFVOSVggdmFyaWFudHMgdXNlIC5zbworICAgICAgICBTRVQoQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTICIuc28uJHtMVkVSU30iKQorICAgIEVORElGKCkKK2VuZG1hY3JvKHNldF9maW5kX3NoYXJlZF9saWJyYXJ5X3ZlcnNpb24gTFZFUlMpCisKK2lmIChOT1QgR0VORVJBVEVEX0pBVkFIKQorICAgICNNdXN0IGlkZW50aWZ5IHdoZXJlIHRoZSBnZW5lcmF0ZWQgaGVhZGVycyBoYXZlIGJlZW4gcGxhY2VkCisgICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiWW91IG11c3Qgc2V0IHRoZSBjbWFrZSB2YXJpYWJsZSBHRU5FUkFURURfSkFWQUgiKQorZW5kaWYgKE5PVCBHRU5FUkFURURfSkFWQUgpCitmaW5kX3BhY2thZ2UoSk5JIFJFUVVJUkVEKQorCitTRVQoU1RPUkVEX0NNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyBDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVMpCitzZXRfZmluZF9zaGFyZWRfbGlicmFyeV92ZXJzaW9uKCIxIikKK1NFVChDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVMgU1RPUkVEX0NNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUykKKworIyBwcmltaXRpdmUgY29uZmlncworc2V0KFBSRkxBR1MgIi1EU0lNUExFX01FTUNQWSIpCitzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAke1BSRkxBR1N9IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1XYWxsIC1Xbm8tc2lnbi1jb21wYXJlIikKK3NldChDTUFLRV9MRF9GTEFHUyAiJHtDTUFLRV9MRF9GTEFHU30gLW5vLXVuZGVmaW5lZCAtdmVyc2lvbi1pbmZvIDA6MTowCisgICAgLUwke19KQVZBX0hPTUV9L2pyZS9saWIvYW1kNjQvc2VydmVyIC1sanZtIikKK3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke0NNQUtFX0NfRkxBR1N9IC1nIC1PMiAtRE5ERUJVRyAtZlBJQyIpCitzZXQoRCBtYWluL25hdGl2ZS8pCisKK1NFVChTVE9SRURfQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTIENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUykKK3NldF9maW5kX3NoYXJlZF9saWJyYXJ5X3ZlcnNpb24oIjEiKQorU0VUKENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyBTVE9SRURfQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTKQorCitJTkNMVURFKENoZWNrRnVuY3Rpb25FeGlzdHMpCitJTkNMVURFKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQorI0lOQ0xVREUoQ2hlY2tMaWJyYXJ5RXhpc3RzKQorSU5DTFVERShDaGVja0luY2x1ZGVGaWxlcykKKyNDSEVDS19GVU5DVElPTl9FWElTVFMoc3luY19maWxlX3JhbmdlIEhBVkVfU1lOQ19GSUxFX1JBTkdFKQorI0NIRUNLX0ZVTkNUSU9OX0VYSVNUUyhwb3NpeF9mYWR2aXNlIEhBVkVfUE9TSVhfRkFEVklTRSkKKyNDSEVDS19MSUJSQVJZX0VYSVNUUyhkbCBkbG9wZW4gIiIgTkVFRF9MSU5LX0RMKQorQ0hFQ0tfSU5DTFVERV9GSUxFUyhmY250bC5oIEhBVkVfRkNOVExfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVMobWFsbG9jLmggSEFWRV9NQUxMT0NfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVMobWFjaC9tYWNoLmggSEFWRV9NQUNIX01BQ0hfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVMobWVtb3J5LmggSEFWRV9NRU1PUllfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVMoc3RkZGVmLmggSEFWRV9TVERERUZfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVMoc3RkaW50LmggSEFWRV9TVERJTlRfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVMoc3RkbGliLmggSEFWRV9TVERMSUJfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVMoc3RyaW5nLmggSEFWRV9TVFJJTkdfSCkKK0NIRUNLX0lOQ0xVREVfRklMRVModW5pc3RkLmggSEFWRV9VTklUU1REX0gpCitDSEVDS19GVU5DVElPTl9FWElTVFMoY2xvY2tfZ2V0dGltZSBIQVZFX0NMT0NLX0dFVFRJTUUpCitDSEVDS19GVU5DVElPTl9FWElTVFMobG9jYWx0aW1lX3IgSEFWRV9MT0NBTFRJTUVfUikKK0NIRUNLX0ZVTkNUSU9OX0VYSVNUUyhtZW1zZXQgSEFWRV9NRU1TRVQpCitDSEVDS19GVU5DVElPTl9FWElTVFMoc3RyY2hyIEhBVkVfU1RSQ0hSKQorQ0hFQ0tfRlVOQ1RJT05fRVhJU1RTKHN0cnRvdWwgSEFWRV9TVFJUT1VMKQorCitTRVQoU1RPUkVEX0NNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyBDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVMpCitzZXRfZmluZF9zaGFyZWRfbGlicmFyeV92ZXJzaW9uKCIxIikKK2ZpbmRfbGlicmFyeShTTkFQUFlfTElCUkFSWQorICAgIE5BTUVTIHNuYXBweQorICAgIFBBVEhTICR7Q1VTVE9NX1NOQVBQWV9QUkVGSVh9ICR7Q1VTVE9NX1NOQVBQWV9QUkVGSVh9L2xpYgorICAgICAgICAgICR7Q1VTVE9NX1NOQVBQWV9QUkVGSVh9L2xpYjY0ICR7Q1VTVE9NX1NOQVBQWV9MSUJ9KQorU0VUKENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyBTVE9SRURfQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTKQorZmluZF9wYXRoKFNOQVBQWV9JTkNMVURFX0RJUgorICAgIE5BTUVTIHNuYXBweS5oCisgICAgUEFUSFMgJHtDVVNUT01fU05BUFBZX1BSRUZJWH0gJHtDVVNUT01fU05BUFBZX1BSRUZJWH0vaW5jbHVkZQorICAgICAgICAgICR7Q1VTVE9NX1NOQVBQWV9JTkNMVURFfSkKK2lmIChTTkFQUFlfTElCUkFSWSBBTkQgU05BUFBZX0lOQ0xVREVfRElSKQorICAgIEdFVF9GSUxFTkFNRV9DT01QT05FTlQoSEFET09QX1NOQVBQWV9MSUJSQVJZICR7U05BUFBZX0xJQlJBUll9IE5BTUUpCisgICAgc2V0KFNOQVBQWV9TT1VSQ0VfRklMRVMKKyAgICAgICAgIiR7RH0vc3JjL2NvZGVjL1NuYXBweUNvZGVjLmNjIikKK2Vsc2UgKFNOQVBQWV9MSUJSQVJZIEFORCBTTkFQUFlfSU5DTFVERV9ESVIpCisgICAgc2V0KFNOQVBQWV9MSUJSQVJZICIiKQorICAgIHNldChTTkFQUFlfSU5DTFVERV9ESVIgIiIpCisgICAgc2V0KFNOQVBQWV9TT1VSQ0VfRklMRVMgIiIpCisgICAgSUYoUkVRVUlSRV9TTkFQUFkpCisgICAgICAgIE1FU1NBR0UoRkFUQUxfRVJST1IgIlJlcXVpcmVkIHNuYXBweSBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBmb3VuZC4gIFNOQVBQWV9MSUJSQVJZPSR7U05BUFBZX0xJQlJBUll9LCBTTkFQUFlfSU5DTFVERV9ESVI9JHtTTkFQUFlfSU5DTFVERV9ESVJ9LCBDVVNUT01fU05BUFBZX0lOQ0xVREVfRElSPSR7Q1VTVE9NX1NOQVBQWV9JTkNMVURFX0RJUn0sIENVU1RPTV9TTkFQUFlfUFJFRklYPSR7Q1VTVE9NX1NOQVBQWV9QUkVGSVh9LCBDVVNUT01fU05BUFBZX0lOQ0xVREU9JHtDVVNUT01fU05BUFBZX0lOQ0xVREV9IikKKyAgICBFTkRJRihSRVFVSVJFX1NOQVBQWSkKK2VuZGlmIChTTkFQUFlfTElCUkFSWSBBTkQgU05BUFBZX0lOQ0xVREVfRElSKQorCitDT05GSUdVUkVfRklMRSgke0NNQUtFX1NPVVJDRV9ESVJ9L2NvbmZpZy5oLmNtYWtlICR7Q01BS0VfQklOQVJZX0RJUn0vY29uZmlnLmgpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtHRU5FUkFURURfSkFWQUh9CisgICAgJHtEfS9zcmMKKyAgICAke0R9L3NyYy91dGlsCisgICAgJHtEfS9zcmMvbGliCisgICAgJHtEfS90ZXN0CisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgJHtDTUFLRV9CSU5BUllfRElSfQorICAgICR7Sk5JX0lOQ0xVREVfRElSU30KKyAgICAke1NOQVBQWV9JTkNMVURFX0RJUn0KKykKKyMgYWRkIGd0ZXN0IGFzIHN5c3RlbSBsaWJyYXJ5IHRvIHN1cHByZXNzIGdjYyB3YXJuaW5ncworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtEfS9ndGVzdC9pbmNsdWRlKQorCisKK1NFVChDTUFLRV9CVUlMRF9XSVRIX0lOU1RBTExfUlBBVEggVFJVRSkKKworaWYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIpCisgICAgIyBtYWNvc3ggZG9lcyBub3QgaGF2ZSAtbHJ0CisgICAgc2V0KE5UX0RFUEVORF9MSUJSQVJZIGRsIHB0aHJlYWQgeiAke1NOQVBQWV9MSUJSQVJZfSAke0pBVkFfSlZNX0xJQlJBUll9KQorICAgIHNldChTWVNURU1fTUFDIFRSVUUpCitlbHNlICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iKQorICAgIHNldChOVF9ERVBFTkRfTElCUkFSWSBkbCBydCBwdGhyZWFkIHogJHtTTkFQUFlfTElCUkFSWX0gJHtKQVZBX0pWTV9MSUJSQVJZfSkKKyAgICBzZXQoU1lTVEVNX01BQyBGQUxTRSkKK2VuZGlmICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iKQorCitjb25maWd1cmVfZmlsZShtYWluL25hdGl2ZS90ZXN0LnNoIHRlc3QvdGVzdC5zaCkKKworYWRkX2R1YWxfbGlicmFyeShuYXRpdmV0YXNrCisgICAgJHtDTUFLRV9CSU5BUllfRElSfS9sejQuYworICAgICR7RH0vc3JjL2NvZGVjL0Jsb2NrQ29kZWMuY2MKKyAgICAke0R9L3NyYy9jb2RlYy9HemlwQ29kZWMuY2MKKyAgICAke0R9L3NyYy9jb2RlYy9MejRDb2RlYy5jYworICAgICR7U05BUFBZX1NPVVJDRV9GSUxFU30KKyAgICAke0R9L3NyYy9oYW5kbGVyL0JhdGNoSGFuZGxlci5jYworICAgICR7RH0vc3JjL2hhbmRsZXIvTUNvbGxlY3Rvck91dHB1dEhhbmRsZXIuY2MKKyAgICAke0R9L3NyYy9oYW5kbGVyL0Fic3RyYWN0TWFwSGFuZGxlci5jYworICAgICR7RH0vc3JjL2hhbmRsZXIvQ29tYmluZUhhbmRsZXIuY2MKKyAgICAke0R9L3NyYy9saWIvQnVmZmVycy5jYworICAgICR7RH0vc3JjL2xpYi9CdWZmZXJTdHJlYW0uY2MKKyAgICAke0R9L3NyYy9saWIvQ29tcHJlc3Npb25zLmNjCisgICAgJHtEfS9zcmMvbGliL1BhcnRpdGlvbkJ1Y2tldC5jYworICAgICR7RH0vc3JjL2xpYi9QYXJ0aXRpb25CdWNrZXRJdGVyYXRvci5jYworICAgICR7RH0vc3JjL2xpYi9GaWxlU3lzdGVtLmNjCisgICAgJHtEfS9zcmMvbGliL0lGaWxlLmNjCisgICAgJHtEfS9zcmMvbGliL2puaXV0aWxzLmNjCisgICAgJHtEfS9zcmMvbGliL0xvZy5jYworICAgICR7RH0vc3JjL2xpYi9NYXBPdXRwdXRDb2xsZWN0b3IuY2MKKyAgICAke0R9L3NyYy9saWIvTWFwT3V0cHV0U3BlYy5jYworICAgICR7RH0vc3JjL2xpYi9NZW1vcnlCbG9jay5jYworICAgICR7RH0vc3JjL2xpYi9NZXJnZS5jYworICAgICR7RH0vc3JjL2xpYi9OYXRpdmVMaWJyYXJ5LmNjCisgICAgJHtEfS9zcmMvbGliL0l0ZXJhdG9yLmNjCisgICAgJHtEfS9zcmMvbGliL05hdGl2ZU9iamVjdEZhY3RvcnkuY2MKKyAgICAke0R9L3NyYy9saWIvTmF0aXZlUnVudGltZUpuaUltcGwuY2MKKyAgICAke0R9L3NyYy9saWIvTmF0aXZlVGFzay5jYworICAgICR7RH0vc3JjL2xpYi9TcGlsbEluZm8uY2MKKyAgICAke0R9L3NyYy9saWIvUGF0aC5jYworICAgICR7RH0vc3JjL2xpYi9TdHJlYW1zLmNjCisgICAgJHtEfS9zcmMvbGliL1Rhc2tDb3VudGVycy5jYworICAgICR7RH0vc3JjL3V0aWwvQ2hlY2tzdW0uY2MKKyAgICAke0R9L3NyYy91dGlsL1JhbmRvbS5jYworICAgICR7RH0vc3JjL3V0aWwvU3RyaW5nVXRpbC5jYworICAgICR7RH0vc3JjL3V0aWwvU3luY1V0aWxzLmNjCisgICAgJHtEfS9zcmMvdXRpbC9UaW1lci5jYworICAgICR7RH0vc3JjL3V0aWwvV3JpdGFibGVVdGlscy5jYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMobmF0aXZldGFzayAke05UX0RFUEVORF9MSUJSQVJZfSkKKworYWRkX2xpYnJhcnkoZ3Rlc3QgJHtEfS9ndGVzdC9ndGVzdC1hbGwuY2MpCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ3Rlc3QgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItdyIpCithZGRfZXhlY3V0YWJsZShudHRlc3QKKyAgICAke0R9L3Rlc3QvbGliL1Rlc3RCeXRlQXJyYXkuY2MKKyAgICAke0R9L3Rlc3QvbGliL1Rlc3RCeXRlQnVmZmVyLmNjCisgICAgJHtEfS90ZXN0L2xpYi9UZXN0Q29tcGFyYXRvckZvckR1YWxQaXZvdFF1aWNrU29ydC5jYworICAgICR7RH0vdGVzdC9saWIvVGVzdENvbXBhcmF0b3JGb3JTdGRTb3J0LmNjCisgICAgJHtEfS90ZXN0L2xpYi9UZXN0Rml4U2l6ZUNvbnRhaW5lci5jYworICAgICR7RH0vdGVzdC9saWIvVGVzdE1lbW9yeVBvb2wuY2MKKyAgICAke0R9L3Rlc3QvbGliL1Rlc3RJdGVyYXRvci5jYworICAgICR7RH0vdGVzdC9saWIvVGVzdEtWQnVmZmVyLmNjCisgICAgJHtEfS90ZXN0L2xpYi9UZXN0TWVtQmxvY2tJdGVyYXRvci5jYworICAgICR7RH0vdGVzdC9saWIvVGVzdE1lbW9yeUJsb2NrLmNjCisgICAgJHtEfS90ZXN0L2xpYi9UZXN0UGFydGl0aW9uQnVja2V0LmNjCisgICAgJHtEfS90ZXN0L2xpYi9UZXN0UmVhZEJ1ZmZlci5jYworICAgICR7RH0vdGVzdC9saWIvVGVzdFJlYWRXcml0ZUJ1ZmZlci5jYworICAgICR7RH0vdGVzdC91dGlsL1Rlc3RDaGVja3N1bS5jYworICAgICR7RH0vdGVzdC91dGlsL1Rlc3RTdHJpbmdVdGlsLmNjCisgICAgJHtEfS90ZXN0L3V0aWwvVGVzdFdyaXRhYmxlVXRpbHMuY2MKKyAgICAke0R9L3Rlc3QvVGVzdENvbW1hbmQuY2MKKyAgICAke0R9L3Rlc3QvVGVzdENvbmZpZy5jYworICAgICR7RH0vdGVzdC9UZXN0Q291bnRlci5jYworICAgICR7RH0vdGVzdC9UZXN0Q29tcHJlc3Npb25zLmNjCisgICAgJHtEfS90ZXN0L1Rlc3RGaWxlU3lzdGVtLmNjCisgICAgJHtEfS90ZXN0L1Rlc3RJRmlsZS5jYworICAgICR7RH0vdGVzdC9UZXN0UHJpbWl0aXZlcy5jYworICAgICR7RH0vdGVzdC9UZXN0U29ydC5jYworICAgICR7RH0vdGVzdC9UZXN0TWFpbi5jYworICAgICR7RH0vdGVzdC90ZXN0X2NvbW1vbnMuY2MpCisKKworSUYgKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIpCisgICAgIyBtYWNvcyBjbGFuZyB3aXRoIGxpYmMrKyBkb2VzIG5vdCBoYXZlIHRyMS90dXBsZSwganVzdCB0dXBsZQorICAgIFNFVF9UQVJHRVRfUFJPUEVSVElFUyhudHRlc3QgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItREdURVNUX1VTRV9PV05fVFIxX1RVUExFPTEiKQorRU5ESUYoKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMobnR0ZXN0CisgICAgIG5hdGl2ZXRhc2tfc3RhdGljCisgICAgIGd0ZXN0CisgICAgICR7TlRfREVQRU5EX0xJQlJBUll9CispCisKK0lGICgke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJMaW51eCIpCisgICAgIworICAgICMgQnkgZW1iZWRkaW5nICckT1JJR0lOJyBpbnRvIHRoZSBSUEFUSCBvZiBsaWJuYXRpdmV0YXNrLnNvLAorICAgICMgZGxvcGVuIHdpbGwgbG9vayBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbGlibmF0aXZldGFzay5zby4KKyAgICAjIEhvd2V2ZXIsICRPUklHSU4gaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgb3BlcmF0aW5nIHN5c3RlbXMuCisgICAgIworICAgIFNFVF9UQVJHRVRfUFJPUEVSVElFUyhuYXRpdmV0YXNrCisgICAgICAgIFBST1BFUlRJRVMgSU5TVEFMTF9SUEFUSCAiXCRPUklHSU4vIikKK0VORElGKCkKKworU0VUKExJQk5BVElWRVRBU0tfVkVSU0lPTiAiMS4wLjAiKQorU0VUX1RBUkdFVF9QUk9QRVJUSUVTKG5hdGl2ZXRhc2sgUFJPUEVSVElFUyBTT1ZFUlNJT04gJHtMSUJOQVRJVkVUQVNLX1ZFUlNJT059KQorZHVhbF9vdXRwdXRfZGlyZWN0b3J5KG5hdGl2ZXRhc2sgdGFyZ2V0L3Vzci9sb2NhbC9saWIpCitvdXRwdXRfZGlyZWN0b3J5KG50dGVzdCB0ZXN0KQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL0pOSUZsYWdzLmNtYWtlIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL0pOSUZsYWdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDBiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvSk5JRmxhZ3MuY21ha2UKQEAgLTAsMCArMSwxMTggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYgRkFUQUxfRVJST1IpCisKKyMgSWYgSlZNX0FSQ0hfREFUQV9NT0RFTCBpcyAzMiwgY29tcGlsZSBhbGwgYmluYXJpZXMgYXMgMzItYml0LgorIyBUaGlzIHZhcmlhYmxlIGlzIHNldCBieSBtYXZlbi4KK2lmIChKVk1fQVJDSF9EQVRBX01PREVMIEVRVUFMIDMyKQorICAgICMgRm9yY2UgMzItYml0IGNvZGUgZ2VuZXJhdGlvbiBvbiBhbWQ2NC94ODZfNjQsIHBwYzY0LCBzcGFyYzY0CisgICAgaWYgKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBDTUFLRV9TWVNURU1fUFJPQ0VTU09SIE1BVENIRVMgIi4qNjQiKQorICAgICAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtbTMyIikKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1tMzIiKQorICAgICAgICBzZXQoQ01BS0VfTERfRkxBR1MgIiR7Q01BS0VfTERfRkxBR1N9IC1tMzIiKQorICAgIGVuZGlmICgpCisgICAgaWYgKENNQUtFX1NZU1RFTV9QUk9DRVNTT1IgU1RSRVFVQUwgIng4Nl82NCIgT1IgQ01BS0VfU1lTVEVNX1BST0NFU1NPUiBTVFJFUVVBTCAiYW1kNjQiKQorICAgICAgICAjIFNldCBDTUFLRV9TWVNURU1fUFJPQ0VTU09SIHRvIGVuc3VyZSB0aGF0IGZpbmRfcGFja2FnZShKTkkpIHdpbGwgdXNlCisgICAgICAgICMgdGhlIDMyLWJpdCB2ZXJzaW9uIG9mIGxpYmp2bS5zby4KKyAgICAgICAgc2V0KENNQUtFX1NZU1RFTV9QUk9DRVNTT1IgImk2ODYiKQorICAgIGVuZGlmICgpCitlbmRpZiAoSlZNX0FSQ0hfREFUQV9NT0RFTCBFUVVBTCAzMikKKworIyBEZXRlcm1pbmUgZmxvYXQgQUJJIG9mIEpWTSBvbiBBUk0gTGludXgKK2lmIChDTUFLRV9TWVNURU1fUFJPQ0VTU09SIE1BVENIRVMgIl5hcm0iIEFORCBDTUFLRV9TWVNURU1fTkFNRSBTVFJFUVVBTCAiTGludXgiKQorICAgIGZpbmRfcHJvZ3JhbShSRUFERUxGIHJlYWRlbGYpCisgICAgaWYgKFJFQURFTEYgTUFUQ0hFUyAiTk9URk9VTkQiKQorICAgICAgICBtZXNzYWdlKFdBUk5JTkcgInJlYWRlbGYgbm90IGZvdW5kOyBKVk0gZmxvYXQgQUJJIGRldGVjdGlvbiBkaXNhYmxlZCIpCisgICAgZWxzZSAoUkVBREVMRiBNQVRDSEVTICJOT1RGT1VORCIpCisgICAgICAgIGV4ZWN1dGVfcHJvY2VzcygKKyAgICAgICAgICAgIENPTU1BTkQgJHtSRUFERUxGfSAtQSAke0pBVkFfSlZNX0xJQlJBUll9CisgICAgICAgICAgICBPVVRQVVRfVkFSSUFCTEUgSlZNX0VMRl9BUkNICisgICAgICAgICAgICBFUlJPUl9RVUlFVCkKKyAgICAgICAgaWYgKE5PVCBKVk1fRUxGX0FSQ0ggTUFUQ0hFUyAiVGFnX0FCSV9WRlBfYXJnczogVkZQIHJlZ2lzdGVycyIpCisgICAgICAgICAgICBtZXNzYWdlKCJTb2Z0LWZsb2F0IEpWTSBkZXRlY3RlZCIpCisKKyAgICAgICAgICAgICMgVGVzdCBjb21waWxhdGlvbiB3aXRoIC1tZmxvYXQtYWJpPXNvZnRmcCB1c2luZyBhbiBhcmJpdHJhcnkgbGliYyBmdW5jdGlvbgorICAgICAgICAgICAgIyAodHlwaWNhbGx5IGZhaWxzIHdpdGggImZhdGFsIGVycm9yOiBiaXRzL3ByZWRlZnMuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIKKyAgICAgICAgICAgICMgaWYgc29mdC1mbG9hdCBkZXYgbGlicmFyaWVzIGFyZSBub3QgaW5zdGFsbGVkKQorICAgICAgICAgICAgaW5jbHVkZShDTWFrZVB1c2hDaGVja1N0YXRlKQorICAgICAgICAgICAgY21ha2VfcHVzaF9jaGVja19zdGF0ZSgpCisgICAgICAgICAgICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7Q01BS0VfUkVRVUlSRURfRkxBR1N9IC1tZmxvYXQtYWJpPXNvZnRmcCIpCisgICAgICAgICAgICBpbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQorICAgICAgICAgICAgY2hlY2tfc3ltYm9sX2V4aXN0cyhleGl0IHN0ZGxpYi5oIFNPRlRGUF9BVkFJTEFCTEUpCisgICAgICAgICAgICBpZiAoTk9UIFNPRlRGUF9BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiU29mdC1mbG9hdCBkZXYgbGlicmFyaWVzIHJlcXVpcmVkIChlLmcuICdhcHQtZ2V0IGluc3RhbGwgbGliYzYtZGV2LWFybWVsJyBvbiBEZWJpYW4vVWJ1bnR1KSIpCisgICAgICAgICAgICBlbmRpZiAoTk9UIFNPRlRGUF9BVkFJTEFCTEUpCisgICAgICAgICAgICBjbWFrZV9wb3BfY2hlY2tfc3RhdGUoKQorCisgICAgICAgICAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtbWZsb2F0LWFiaT1zb2Z0ZnAiKQorICAgICAgICBlbmRpZiAoKQorICAgIGVuZGlmIChSRUFERUxGIE1BVENIRVMgIk5PVEZPVU5EIikKK2VuZGlmIChDTUFLRV9TWVNURU1fUFJPQ0VTU09SIE1BVENIRVMgIl5hcm0iIEFORCBDTUFLRV9TWVNURU1fTkFNRSBTVFJFUVVBTCAiTGludXgiKQorCitJRigiJHtDTUFLRV9TWVNURU19IiBNQVRDSEVTICJMaW51eCIpCisgICAgIworICAgICMgTG9jYXRlIEpOSV9JTkNMVURFX0RJUlMgYW5kIEpOSV9MSUJSQVJJRVMuCisgICAgIyBTaW5jZSB3ZSB3ZXJlIGludm9rZWQgZnJvbSBNYXZlbiwgd2Uga25vdyB0aGF0IHRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQKKyAgICAjIHZhcmlhYmxlIGlzIHZhbGlkLiAgU28gd2UgaWdub3JlIHN5c3RlbSBwYXRocyBoZXJlIGFuZCBqdXN0IHVzZSBKQVZBX0hPTUUuCisgICAgIworICAgIEZJTEUoVE9fQ01BS0VfUEFUSCAiJEVOVntKQVZBX0hPTUV9IiBfSkFWQV9IT01FKQorICAgIElGKENNQUtFX1NZU1RFTV9QUk9DRVNTT1IgTUFUQ0hFUyAiXmkuODYkIikKKyAgICAgICAgU0VUKF9qYXZhX2xpYmFyY2ggImkzODYiKQorICAgIEVMU0VJRiAoQ01BS0VfU1lTVEVNX1BST0NFU1NPUiBTVFJFUVVBTCAieDg2XzY0IiBPUiBDTUFLRV9TWVNURU1fUFJPQ0VTU09SIFNUUkVRVUFMICJhbWQ2NCIpCisgICAgICAgIFNFVChfamF2YV9saWJhcmNoICJhbWQ2NCIpCisgICAgRUxTRUlGIChDTUFLRV9TWVNURU1fUFJPQ0VTU09SIE1BVENIRVMgIl5hcm0iKQorICAgICAgICBTRVQoX2phdmFfbGliYXJjaCAiYXJtIikKKyAgICBFTFNFKCkKKyAgICAgICAgU0VUKF9qYXZhX2xpYmFyY2ggJHtDTUFLRV9TWVNURU1fUFJPQ0VTU09SfSkKKyAgICBFTkRJRigpCisgICAgU0VUKF9KREtfRElSUyAiJHtfSkFWQV9IT01FfS9qcmUvbGliLyR7X2phdmFfbGliYXJjaH0vKiIKKyAgICAgICAgICAgICAgICAgICIke19KQVZBX0hPTUV9L2pyZS9saWIvJHtfamF2YV9saWJhcmNofSIKKyAgICAgICAgICAgICAgICAgICIke19KQVZBX0hPTUV9L2pyZS9saWIvKiIKKyAgICAgICAgICAgICAgICAgICIke19KQVZBX0hPTUV9L2pyZS9saWIiCisgICAgICAgICAgICAgICAgICAiJHtfSkFWQV9IT01FfS9saWIvKiIKKyAgICAgICAgICAgICAgICAgICIke19KQVZBX0hPTUV9L2xpYiIKKyAgICAgICAgICAgICAgICAgICIke19KQVZBX0hPTUV9L2luY2x1ZGUvKiIKKyAgICAgICAgICAgICAgICAgICIke19KQVZBX0hPTUV9L2luY2x1ZGUiCisgICAgICAgICAgICAgICAgICAiJHtfSkFWQV9IT01FfSIKKyAgICApCisgICAgRklORF9QQVRIKEpBVkFfSU5DTFVERV9QQVRICisgICAgICAgIE5BTUVTIGpuaS5oIAorICAgICAgICBQQVRIUyAke19KREtfRElSU30KKyAgICAgICAgTk9fREVGQVVMVF9QQVRIKQorICAgICNJbiBJQk0gamF2YSwgaXQncyBqbmlwb3J0LmggaW5zdGVhZCBvZiBqbmlfbWQuaAorICAgIEZJTkRfUEFUSChKQVZBX0lOQ0xVREVfUEFUSDIgCisgICAgICAgIE5BTUVTIGpuaV9tZC5oIGpuaXBvcnQuaAorICAgICAgICBQQVRIUyAke19KREtfRElSU30KKyAgICAgICAgTk9fREVGQVVMVF9QQVRIKQorICAgIFNFVChKTklfSU5DTFVERV9ESVJTICR7SkFWQV9JTkNMVURFX1BBVEh9ICR7SkFWQV9JTkNMVURFX1BBVEgyfSkKKyAgICBGSU5EX0xJQlJBUlkoSkFWQV9KVk1fTElCUkFSWQorICAgICAgICBOQU1FUyBydCBqdm0gCisgICAgICAgIFBBVEhTICR7X0pES19ESVJTfQorICAgICAgICBOT19ERUZBVUxUX1BBVEgpCisgICAgU0VUKEpOSV9MSUJSQVJJRVMgJHtKQVZBX0pWTV9MSUJSQVJZfSkKKyAgICBNRVNTQUdFKCJKQVZBX0hPTUU9JHtKQVZBX0hPTUV9LCBKQVZBX0pWTV9MSUJSQVJZPSR7SkFWQV9KVk1fTElCUkFSWX0iKQorICAgIE1FU1NBR0UoIkpBVkFfSU5DTFVERV9QQVRIPSR7SkFWQV9JTkNMVURFX1BBVEh9LCBKQVZBX0lOQ0xVREVfUEFUSDI9JHtKQVZBX0lOQ0xVREVfUEFUSDJ9IikKKyAgICBJRihKQVZBX0pWTV9MSUJSQVJZIEFORCBKQVZBX0lOQ0xVREVfUEFUSCBBTkQgSkFWQV9JTkNMVURFX1BBVEgyKQorICAgICAgICBNRVNTQUdFKCJMb2NhdGVkIGFsbCBKTkkgY29tcG9uZW50cyBzdWNjZXNzZnVsbHkuIikKKyAgICBFTFNFKCkKKyAgICAgICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiRmFpbGVkIHRvIGZpbmQgYSB2aWFibGUgSlZNIGluc3RhbGxhdGlvbiB1bmRlciBKQVZBX0hPTUUuIikKKyAgICBFTkRJRigpCitFTFNFKCkKKyAgICBmaW5kX3BhY2thZ2UoSk5JIFJFUVVJUkVEKQorRU5ESUYoKQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL2NvbmZpZy5oLmNtYWtlIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL2NvbmZpZy5oLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvY29uZmlnLmguY21ha2UKQEAgLTAsMCArMSwyMyBAQAorLyoqCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgQ09ORklHX0gKKyNkZWZpbmUgQ09ORklHX0gKKworI2NtYWtlZGVmaW5lIEhBRE9PUF9TTkFQUFlfTElCUkFSWSAiQEhBRE9PUF9TTkFQUFlfTElCUkFSWUAiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9Db21tYW5kLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL0NvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjU2ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9Db21tYW5kLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgQ29tbWFuZCB7CisKKyAgcHJpdmF0ZSBpbnQgaWQ7CisgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgIHB1YmxpYyBDb21tYW5kKGludCBpZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgfQorICAKKyAgcHVibGljIENvbW1hbmQoaW50IGlkLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICB0aGlzLmlkID0gaWQ7CisgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICB9CisgIAorICBwdWJsaWMgaW50IGlkKCkgeworICAgIHJldHVybiB0aGlzLmlkOworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBDb21tYW5kKSB7CisgICAgICByZXR1cm4gdGhpcy5pZCA9PSAoKENvbW1hbmQpb3RoZXIpLmlkOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBpZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9Db21tYW5kRGlzcGF0Y2hlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9Db21tYW5kRGlzcGF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODQ3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL0NvbW1hbmREaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2s7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5SZWFkV3JpdGVCdWZmZXI7CisKKy8qKgorICogYSBDb21tYW5kRGlzcGF0Y2hlciByZWNlaXZlcyB7QGxpbmsgQ29tbWFuZH0gZnJvbSB1cHN0cmVhbQorICogYW5kIHBlcmZvcm1zIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9ucworICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGludGVyZmFjZSBDb21tYW5kRGlzcGF0Y2hlciB7CisgIHB1YmxpYyBSZWFkV3JpdGVCdWZmZXIgb25DYWxsKENvbW1hbmQgY29tbWFuZCwgUmVhZFdyaXRlQnVmZmVyIHBhcmFtZXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9Db25zdGFudHMuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfU09SVF9DTEFTUyA9ICJtYXAuc29ydC5jbGFzcyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFJFRF9DT01CSU5FUl9DTEFTUyA9ICJtYXByZWQuY29tYmluZXIuY2xhc3MiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9MT0dfREVWSUNFID0gIm5hdGl2ZS5sb2cuZGV2aWNlIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX0hBRE9PUF9WRVJTSU9OID0gIm5hdGl2ZS5oYWRvb3AudmVyc2lvbiI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX1BST0NFU1NPUl9CVUZGRVJfS0IgPSAibmF0aXZlLnByb2Nlc3Nvci5idWZmZXIua2IiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVRJVkVfUFJPQ0VTU09SX0JVRkZFUl9LQl9ERUZBVUxUID0gNjQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVElWRV9BU1lOQ19QUk9DRVNTT1JfQlVGRkVSX0tCX0RFRkFVTFQgPSAxMDI0OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9TVEFUVVNfVVBEQVRFX0lOVEVSVkFMID0gIm5hdGl2ZS51cGRhdGUuaW50ZXJ2YWwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVRJVkVfU1RBVFVTX1VQREFURV9JTlRFUlZBTF9ERUZWQUwgPSAzMDAwOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUklBTElaQVRJT05fRlJBTUVXT1JLID0gIlNlcmlhbGl6YXRpb25GcmFtZXdvcmsiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfUEFSVElUSU9OX0xFTkdUSCA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9LRVlfTEVOR1RIID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX1ZBTFVFX0xFTkdUSCA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9LVl9MRU5HVEggPSBTSVpFT0ZfS0VZX0xFTkdUSCArIFNJWkVPRl9WQUxVRV9MRU5HVEg7CisgIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfQ0xBU1NfTElCUkFSWSA9ICJuYXRpdmUuY2xhc3MubGlicmFyeSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9DTEFTU19MSUJSQVJZX0NVU1RPTSA9ICJuYXRpdmUuY2xhc3MubGlicmFyeS5jdXN0b20iOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfQ0xBU1NfTElCUkFSWV9CVUlMRElOID0gIm5hdGl2ZS5jbGFzcy5saWJyYXJ5LmJ1aWxkaW4iOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfTUFQT1VUX0tFWV9DT01QQVJBVE9SID0gIm5hdGl2ZS5tYXAub3V0cHV0LmtleS5jb21wYXJhdG9yIjsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svRGF0YUNoYW5uZWwuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svRGF0YUNoYW5uZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ2OWVlCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9EYXRhQ2hhbm5lbC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgZW51bSBEYXRhQ2hhbm5lbCB7CisgIC8qKgorICAgKiBXZSB3aWxsIG9ubHkgcmVhZCBkYXRhIGZyb20gdGhpcyBjaGFubmVsCisgICAqLworICBJTiwKKyAgLyoqCisgICAqIFdlIHdpbGwgb25seSB3cml0ZSBkYXRhIGZyb20gdGhpcyBjaGFubmVsCisgICAqLworICBPVVQsCisgIC8qKgorICAgKiBXZSB3aWxsIGRvIGJvdGggcmVhZCBhbmQgd3JpdGUgZm9yIHRoaXMgY2hhbm5lbAorICAgKi8KKyAgSU5PVVQsCisgIC8qKgorICAgKiBUaGVyZSBpcyBubyBkYXRhIGV4Y2hhbmdlCisgICAqLworICBOT05FCit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL0RhdGFSZWNlaXZlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9EYXRhUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2JkZjUzCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9EYXRhUmVjZWl2ZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKKworLyoqCisgKiBhIERhdGFSZWNlaXZlciBwdWxscyBpbiBhcnJpdmluZyBkYXRhLCBhbiBleGFtcGxlCisgKiBpcyB7QGxpbmsgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suaGFuZGxlcnMuQnVmZmVyUHVsbGVyfQorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGludGVyZmFjZSBEYXRhUmVjZWl2ZXIgeworCisgIC8qKgorICAgKiBTZW5kIGEgc2lnbmFsIHRvIHRoZSByZWNlaXZlciB0aGF0IHRoZSBkYXRhIGFycml2ZXMuCisgICAqIFRoZSBkYXRhIGlzIHRyYW5zZmVycmVkIGluIGFub3RoZXIgYmFuZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIHJlY2VpdmVEYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9IYWRvb3BQbGF0Zm9ybS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9IYWRvb3BQbGF0Zm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNmYyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL0hhZG9vcFBsYXRmb3JtLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJvb2xlYW5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZXNXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Eb3VibGVXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5GbG9hdFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkludFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkxvbmdXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5OdWxsV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5WSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVkxvbmdXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSm9iQ29uZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZS4qOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIEhhZG9vcFBsYXRmb3JtIGV4dGVuZHMgUGxhdGZvcm0geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coSGFkb29wUGxhdGZvcm0uY2xhc3MpOworCisgIHB1YmxpYyBIYWRvb3BQbGF0Zm9ybSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmVnaXN0ZXJLZXkoTnVsbFdyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgTnVsbFdyaXRhYmxlU2VyaWFsaXplci5jbGFzcyk7CisgICAgcmVnaXN0ZXJLZXkoVGV4dC5jbGFzcy5nZXROYW1lKCksIFRleHRTZXJpYWxpemVyLmNsYXNzKTsKKyAgICByZWdpc3RlcktleShMb25nV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBMb25nV3JpdGFibGVTZXJpYWxpemVyLmNsYXNzKTsKKyAgICByZWdpc3RlcktleShJbnRXcml0YWJsZS5jbGFzcy5nZXROYW1lKCksIEludFdyaXRhYmxlU2VyaWFsaXplci5jbGFzcyk7CisgICAgcmVnaXN0ZXJLZXkoV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBEZWZhdWx0U2VyaWFsaXplci5jbGFzcyk7CisgICAgcmVnaXN0ZXJLZXkoQnl0ZXNXcml0YWJsZS5jbGFzcy5nZXROYW1lKCksIEJ5dGVzV3JpdGFibGVTZXJpYWxpemVyLmNsYXNzKTsKKyAgICByZWdpc3RlcktleShCb29sZWFuV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBCb29sV3JpdGFibGVTZXJpYWxpemVyLmNsYXNzKTsKKyAgICByZWdpc3RlcktleShCeXRlV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBCeXRlV3JpdGFibGVTZXJpYWxpemVyLmNsYXNzKTsKKyAgICByZWdpc3RlcktleShGbG9hdFdyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgRmxvYXRXcml0YWJsZVNlcmlhbGl6ZXIuY2xhc3MpOworICAgIHJlZ2lzdGVyS2V5KERvdWJsZVdyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgRG91YmxlV3JpdGFibGVTZXJpYWxpemVyLmNsYXNzKTsKKyAgICByZWdpc3RlcktleShWSW50V3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBWSW50V3JpdGFibGVTZXJpYWxpemVyLmNsYXNzKTsKKyAgICByZWdpc3RlcktleShWTG9uZ1dyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgVkxvbmdXcml0YWJsZVNlcmlhbGl6ZXIuY2xhc3MpOworCisgICAgTE9HLmluZm8oIkhhZG9vcCBwbGF0Zm9ybSBpbml0ZWQiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0KFN0cmluZyBrZXlDbGFzc05hbWUsIElOYXRpdmVTZXJpYWxpemVyPD8+IHNlcmlhbGl6ZXIsIEpvYkNvbmYgam9iKSB7CisgICAgaWYgKGtleUNsYXNzTmFtZXMuY29udGFpbnMoa2V5Q2xhc3NOYW1lKQorICAgICAgJiYgc2VyaWFsaXplciBpbnN0YW5jZW9mIElOYXRpdmVDb21wYXJhYmxlKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBkZWZpbmUoQ2xhc3M8Pz4gY29tcGFyYXRvckNsYXNzKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICByZXR1cm4gIkhhZG9vcCI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svSUNvbWJpbmVIYW5kbGVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL0lDb21iaW5lSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOGI4ODNjCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9JQ29tYmluZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2s7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKKy8qKgorICogaW50ZXJhY3RzIHdpdGggbmF0aXZlIHNpZGUgdG8gc3VwcG9ydCBKYXZhIENvbWJpbmVyCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgaW50ZXJmYWNlIElDb21iaW5lSGFuZGxlciB7CisKKyAgLyoqCisgICAqIHJ1biBjb21iaW5lcgorICAgKi8KKyAgcHVibGljIHZvaWQgY29tYmluZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogQHJldHVybiBpZCBvZiB0aGlzIGhhbmRsZXIKKyAgICovCisgIHB1YmxpYyBsb25nIGdldElkKCk7CisKKyAgLyoqCisgICAqIGNsb3NlIGhhbmRsZXJzLCBidWZmZXIgcHVsbGVycyBhbmQgcHVzaGVycworICAgKi8KKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL0lOYXRpdmVDb21wYXJhYmxlLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL0lOYXRpdmVDb21wYXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMDVkYgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svSU5hdGl2ZUNvbXBhcmFibGUuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZVN0YWJpbGl0eTsKKworLyoqCisgKiBBbnkga2V5IHR5cGUgdGhhdCBpcyBjb21wYXJhYmxlIGF0IG5hdGl2ZSBzaWRlIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgorICoKKyAqIEEgbmF0aXZlIGNvbXBhcmF0b3IgZnVuY3Rpb24gc2hvdWxkIGhhdmUgdGhlIENvbXBhcmF0b3JQdHIgdHlwZToKKyAqIDxjb2RlPgorICogICB0eXBlZGVmIGludCAoKkNvbXBhcmF0b3JQdHIpKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwKKyAqICAgY29uc3QgY2hhciAqIGRlc3QsICB1aW50MzJfdCBkZXN0TGVuZ3RoKTsKKyAqIDwvY29kZT4KKyAqIEtleXMgYXJlIGluIHNlcmlhbGl6ZWQgZm9ybWF0IGF0IG5hdGl2ZSBzaWRlLiBUaGUgZnVuY3Rpb24gaGFzIHBhc3NlZCBpbgorICogdGhlIGtleXMnIGxvY2F0aW9ucyBhbmQgbGVuZ3RocyBzdWNoIHRoYXQgd2UgY2FuIGNvbXBhcmUgdGhlbSBpbiB0aGUgc2FtZQorICogbG9naWMgYXMgdGhlaXIgSmF2YSBjb21wYXJhdG9yLgorICoKKyAqIEZvciBleGFtcGxlLCBhIEhpdmVLZXkgc2VyaWFsaXplZCBhcyBhbiBpbnQgZmllbGQgKGNvbnRhaW5pbmcgdGhlIGxlbmd0aCBvZgorICogcmF3IGJ5dGVzKSArIHJhdyBieXRlcy4KKyAqIFdoZW4gY29tcGFyaW5nIHR3byBIaXZlS2V5cywgd2UgZmlyc3QgcmVhZCB0aGUgbGVuZ3RoIGZpZWxkIGFuZCB0aGVuCisgKiBjb21wYXJlIHRoZSByYXcgYnl0ZXMgYnkgaW52b2tpbmcgdGhlIEJ5dGVzQ29tcGFyYXRvciBwcm92aWRlZCBieSBvdXIgbGlicmFyeS4KKyAqIFdlIHBhc3MgdGhlIGxvY2F0aW9uIGFuZCBsZW5ndGggb2YgcmF3IGJ5dGVzIGludG8gQnl0ZXNDb21wYXJhdG9yLgorICoKKyAqIDxjb2RlPgorICogICBpbnQgSGl2ZVBsYXRmb3JtOjpIaXZlS2V5Q29tcGFyYXRvcihjb25zdCBjaGFyICogc3JjLCB1aW50MzJfdCBzcmNMZW5ndGgsCisgKiAgIGNvbnN0IGNoYXIgKiBkZXN0LCB1aW50MzJfdCBkZXN0TGVuZ3RoKSB7CisgKiAgICAgdWludDMyX3Qgc2wgPSBic3dhcCgqKHVpbnQzMl90KilzcmMpOworICogICAgIHVpbnQzMl90IGRsID0gYnN3YXAoKih1aW50MzJfdCopZGVzdCk7CisgKiAgICAgcmV0dXJuIE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkJ5dGVzQ29tcGFyYXRvcihzcmMgKyA0LCBzbCwgZGVzdCArIDQsIGRsKTsKKyAqICAgfQorICogPC9jb2RlPgorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHVibGljCitASW50ZXJmYWNlU3RhYmlsaXR5LkV2b2x2aW5nCitwdWJsaWMgaW50ZXJmYWNlIElOYXRpdmVDb21wYXJhYmxlIHsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svSU5hdGl2ZUhhbmRsZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svSU5hdGl2ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWY1NmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9JTmF0aXZlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5SZWFkV3JpdGVCdWZmZXI7CisKKy8qKgorICogQSBIYW5kbGVyIGFjY2VwdCBpbnB1dCwgYW5kIGdpdmUgb3V0cHV0IGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIGNvbW1hbmQgYW5kIGRhdGEKKyAqLworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBpbnRlcmZhY2UgSU5hdGl2ZUhhbmRsZXIgZXh0ZW5kcyBOYXRpdmVEYXRhVGFyZ2V0LCBOYXRpdmVEYXRhU291cmNlIHsKKworICBwdWJsaWMgU3RyaW5nIG5hbWUoKTsKKworICBwdWJsaWMgbG9uZyBnZXROYXRpdmVIYW5kbGVyKCk7CisKKyAgLyoqCisgICAqIGluaXQgdGhlIG5hdGl2ZSBoYW5kbGVyCisgICAqLworICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBjbG9zZSB0aGUgbmF0aXZlIGhhbmRsZXIKKyAgICovCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBjYWxsIGNvbW1hbmQgdG8gZG93bnN0cmVhbQorICAgKi8KKyAgcHVibGljIFJlYWRXcml0ZUJ1ZmZlciBjYWxsKENvbW1hbmQgY29tbWFuZCwgUmVhZFdyaXRlQnVmZmVyIHBhcmFtZXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIHZvaWQgc2V0Q29tbWFuZERpc3BhdGNoZXIoQ29tbWFuZERpc3BhdGNoZXIgaGFuZGxlcik7CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svTmF0aXZlQmF0Y2hQcm9jZXNzb3IuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svTmF0aXZlQmF0Y2hQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU4YzZiCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9OYXRpdmVCYXRjaFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5CdWZmZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5JbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXIuT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWwuUmVhZFdyaXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWwuQ29uZmlnVXRpbDsKKworLyoqCisgKiB1c2VkIHRvIGNyZWF0ZSBjaGFubmVsLCB0cmFuc2ZlciBkYXRhIGFuZCBjb21tYW5kIGJldHdlZW4gSmF2YSBhbmQgbmF0aXZlCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgTmF0aXZlQmF0Y2hQcm9jZXNzb3IgaW1wbGVtZW50cyBJTmF0aXZlSGFuZGxlciB7CisgIHByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhOYXRpdmVCYXRjaFByb2Nlc3Nvci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmF0aXZlSGFuZGxlck5hbWU7CisgIHByaXZhdGUgbG9uZyBuYXRpdmVIYW5kbGVyQWRkcjsKKworICBwcml2YXRlIGJvb2xlYW4gaXNJbnB1dEZpbmlzaGVkID0gZmFsc2U7CisKKyAgLy8gPDwgRmllbGQgdXNlZCBkaXJlY3RseSBpbiBOYXRpdmUsIHRoZSBuYW1lIG11c3QgTk9UIGJlIGNoYW5nZWQKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHJhd091dHB1dEJ1ZmZlcjsKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHJhd0lucHV0QnVmZmVyOworICAvLyA+PgorCisgIHByaXZhdGUgSW5wdXRCdWZmZXIgaW47CisgIHByaXZhdGUgT3V0cHV0QnVmZmVyIG91dDsKKworICBwcml2YXRlIENvbW1hbmREaXNwYXRjaGVyIGNvbW1hbmREaXNwYXRjaGVyOworICBwcml2YXRlIERhdGFSZWNlaXZlciBkYXRhUmVjZWl2ZXI7CisKKyAgc3RhdGljIHsKKyAgICBpZiAoTmF0aXZlUnVudGltZS5pc05hdGl2ZUxpYnJhcnlMb2FkZWQoKSkgeworICAgICAgSW5pdElEcygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSU5hdGl2ZUhhbmRsZXIgY3JlYXRlKFN0cmluZyBuYXRpdmVIYW5kbGVyTmFtZSwKKyAgICAgIENvbmZpZ3VyYXRpb24gY29uZiwgRGF0YUNoYW5uZWwgY2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIGludCBidWZmZXJTaXplID0gY29uZi5nZXRJbnQoQ29uc3RhbnRzLk5BVElWRV9QUk9DRVNTT1JfQlVGRkVSX0tCLAorICAgICAgICAxMDI0KSAqIDEwMjQ7CisKKyAgICBMT0cuaW5mbygiTmF0aXZlSGFuZGxlcjogZGlyZWN0IGJ1ZmZlciBzaXplOiAiICsgYnVmZmVyU2l6ZSk7CisKKyAgICBPdXRwdXRCdWZmZXIgb3V0ID0gbnVsbDsKKyAgICBJbnB1dEJ1ZmZlciBpbiA9IG51bGw7CisKKyAgICBzd2l0Y2ggKGNoYW5uZWwpIHsKKyAgICBjYXNlIElOOgorICAgICAgaW4gPSBuZXcgSW5wdXRCdWZmZXIoQnVmZmVyVHlwZS5ESVJFQ1RfQlVGRkVSLCBidWZmZXJTaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1VUOgorICAgICAgb3V0ID0gbmV3IE91dHB1dEJ1ZmZlcihCdWZmZXJUeXBlLkRJUkVDVF9CVUZGRVIsIGJ1ZmZlclNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJTk9VVDoKKyAgICAgIGluID0gbmV3IElucHV0QnVmZmVyKEJ1ZmZlclR5cGUuRElSRUNUX0JVRkZFUiwgYnVmZmVyU2l6ZSk7CisgICAgICBvdXQgPSBuZXcgT3V0cHV0QnVmZmVyKEJ1ZmZlclR5cGUuRElSRUNUX0JVRkZFUiwgYnVmZmVyU2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5PTkU6CisgICAgfQorCisgICAgZmluYWwgSU5hdGl2ZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBOYXRpdmVCYXRjaFByb2Nlc3NvcihuYXRpdmVIYW5kbGVyTmFtZSwKKyAgICAgICAgaW4sIG91dCk7CisgICAgaGFuZGxlci5pbml0KGNvbmYpOworICAgIHJldHVybiBoYW5kbGVyOworICB9CisKKyAgcHJvdGVjdGVkIE5hdGl2ZUJhdGNoUHJvY2Vzc29yKFN0cmluZyBuYXRpdmVIYW5kbGVyTmFtZSwgSW5wdXRCdWZmZXIgaW5wdXQsCisgICAgICBPdXRwdXRCdWZmZXIgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMubmF0aXZlSGFuZGxlck5hbWUgPSBuYXRpdmVIYW5kbGVyTmFtZTsKKworICAgIGlmIChudWxsICE9IGlucHV0KSB7CisgICAgICB0aGlzLmluID0gaW5wdXQ7CisgICAgICB0aGlzLnJhd0lucHV0QnVmZmVyID0gaW5wdXQuZ2V0Qnl0ZUJ1ZmZlcigpOworICAgIH0KKyAgICBpZiAobnVsbCAhPSBvdXRwdXQpIHsKKyAgICAgIHRoaXMub3V0ID0gb3V0cHV0OworICAgICAgdGhpcy5yYXdPdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0Qnl0ZUJ1ZmZlcigpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kRGlzcGF0Y2hlcihDb21tYW5kRGlzcGF0Y2hlciBoYW5kbGVyKSB7CisgICAgdGhpcy5jb21tYW5kRGlzcGF0Y2hlciA9IGhhbmRsZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uIGNvbmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5uYXRpdmVIYW5kbGVyQWRkciA9IE5hdGl2ZVJ1bnRpbWUKKyAgICAgICAgLmNyZWF0ZU5hdGl2ZU9iamVjdChuYXRpdmVIYW5kbGVyTmFtZSk7CisgICAgaWYgKHRoaXMubmF0aXZlSGFuZGxlckFkZHIgPT0gMCkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5hdGl2ZSBvYmplY3QgY3JlYXRlIGZhaWxlZCwgY2xhc3M6ICIKKyAgICAgICAgICArIG5hdGl2ZUhhbmRsZXJOYW1lKTsKKyAgICB9CisgICAgc2V0dXBIYW5kbGVyKG5hdGl2ZUhhbmRsZXJBZGRyLCBDb25maWdVdGlsLnRvQnl0ZXMoY29uZikpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKG5hdGl2ZUhhbmRsZXJBZGRyICE9IDApIHsKKyAgICAgIE5hdGl2ZVJ1bnRpbWUucmVsZWFzZU5hdGl2ZU9iamVjdChuYXRpdmVIYW5kbGVyQWRkcik7CisgICAgICBuYXRpdmVIYW5kbGVyQWRkciA9IDA7CisgICAgfQorICAgIElPVXRpbHMuY2xlYW51cChMT0csIGluKTsKKyAgICBpbiA9IG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0TmF0aXZlSGFuZGxlcigpIHsKKyAgICByZXR1cm4gbmF0aXZlSGFuZGxlckFkZHI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlYWRXcml0ZUJ1ZmZlciBjYWxsKENvbW1hbmQgY29tbWFuZCwgUmVhZFdyaXRlQnVmZmVyIHBhcmFtZXRlcikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmF0aXZlQ29tbWFuZChuYXRpdmVIYW5kbGVyQWRkciwgY29tbWFuZC5pZCgpLAorICAgICAgICBudWxsID09IHBhcmFtZXRlciA/IG51bGwgOiBwYXJhbWV0ZXIuZ2V0QnVmZigpKTsKKworICAgIGZpbmFsIFJlYWRXcml0ZUJ1ZmZlciByZXN1bHQgPSBuZXcgUmVhZFdyaXRlQnVmZmVyKGJ5dGVzKTsKKyAgICByZXN1bHQuc2V0V3JpdGVQb2ludChieXRlcy5sZW5ndGgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIG5hdGl2ZVByb2Nlc3NJbnB1dChuYXRpdmVIYW5kbGVyQWRkciwgcmF3T3V0cHV0QnVmZmVyLnBvc2l0aW9uKCkpOworICAgIHJhd091dHB1dEJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmaW5pc2hTZW5kRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKG51bGwgPT0gcmF3T3V0cHV0QnVmZmVyIHx8IGlzSW5wdXRGaW5pc2hlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNlbmREYXRhKCk7CisgICAgbmF0aXZlRmluaXNoKG5hdGl2ZUhhbmRsZXJBZGRyKTsKKyAgICBpc0lucHV0RmluaXNoZWQgPSB0cnVlOworICB9CisKKyAgcHJpdmF0ZSBieXRlW10gc2VuZENvbW1hbmRUb0phdmEoaW50IGNvbW1hbmQsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisKKyAgICAgIGZpbmFsIENvbW1hbmQgY21kID0gbmV3IENvbW1hbmQoY29tbWFuZCk7CisgICAgICBSZWFkV3JpdGVCdWZmZXIgcGFyYW0gPSBudWxsOworCisgICAgICBpZiAobnVsbCAhPSBkYXRhKSB7CisgICAgICAgIHBhcmFtID0gbmV3IFJlYWRXcml0ZUJ1ZmZlcigpOworICAgICAgICBwYXJhbS5yZXNldChkYXRhKTsKKyAgICAgICAgcGFyYW0uc2V0V3JpdGVQb2ludChkYXRhLmxlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGlmIChudWxsICE9IGNvbW1hbmREaXNwYXRjaGVyKSB7CisgICAgICAgIFJlYWRXcml0ZUJ1ZmZlciByZXN1bHQgPSBudWxsOworCisgICAgICAgIHJlc3VsdCA9IGNvbW1hbmREaXNwYXRjaGVyLm9uQ2FsbChjbWQsIHBhcmFtKTsKKyAgICAgICAgaWYgKG51bGwgIT0gcmVzdWx0KSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRCdWZmKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBieSBuYXRpdmUgc2lkZSwgY2xlYW4gb3V0cHV0IGJ1ZmZlciBzbyBuYXRpdmUgc2lkZSBjYW4gY29udGludWUKKyAgICogcHJvY2Vzc2luZworICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZsdXNoT3V0cHV0KGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBpZiAobnVsbCAhPSByYXdJbnB1dEJ1ZmZlcikgeworICAgICAgcmF3SW5wdXRCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICByYXdJbnB1dEJ1ZmZlci5saW1pdChsZW5ndGgpOworCisgICAgICBpZiAobnVsbCAhPSBkYXRhUmVjZWl2ZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkYXRhUmVjZWl2ZXIucmVjZWl2ZURhdGEoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDYWNoZSBKTkkgZmllbGQgJiBtZXRob2QgaWRzCisgICAqLworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBJbml0SURzKCk7CisKKyAgLyoqCisgICAqIFNldHVwIG5hdGl2ZSBzaWRlIEJhdGNoSGFuZGxlcgorICAgKi8KKyAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXR1cEhhbmRsZXIobG9uZyBuYXRpdmVIYW5kbGVyQWRkciwgYnl0ZVtdW10gY29uZmlncyk7CisKKyAgLyoqCisgICAqIExldCBuYXRpdmUgc2lkZSB0byBwcm9jZXNzIGRhdGEgaW4gaW5wdXRCdWZmZXIKKyAgICovCisgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUHJvY2Vzc0lucHV0KGxvbmcgaGFuZGxlciwgaW50IGxlbmd0aCk7CisKKyAgLyoqCisgICAqIE5vdGljZSBuYXRpdmUgc2lkZSBpbnB1dCBpcyBmaW5pc2hlZAorICAgKi8KKyAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGaW5pc2gobG9uZyBoYW5kbGVyKTsKKworICAvKioKKyAgICogU2VuZCBjb250cm9sIG1lc3NhZ2UgdG8gbmF0aXZlIHNpZGUKKyAgICovCisgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBuYXRpdmVDb21tYW5kKGxvbmcgaGFuZGxlciwgaW50IGNtZCwgYnl0ZVtdIHBhcmFtZXRlcik7CisKKyAgLyoqCisgICAqIExvYWQgZGF0YSBmcm9tIG5hdGl2ZQorICAgKi8KKyAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVMb2FkRGF0YShsb25nIGhhbmRsZXIpOworCisgIHByb3RlY3RlZCB2b2lkIGZpbmlzaE91dHB1dCgpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW5wdXRCdWZmZXIgZ2V0SW5wdXRCdWZmZXIoKSB7CisgICAgcmV0dXJuIHRoaXMuaW47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE91dHB1dEJ1ZmZlciBnZXRPdXRwdXRCdWZmZXIoKSB7CisgICAgcmV0dXJuIHRoaXMub3V0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGxvYWREYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBuYXRpdmVMb2FkRGF0YShuYXRpdmVIYW5kbGVyQWRkcik7CisgICAgLy8KKyAgICAvLyByZXR1cm4gY2FsbChDb21tYW5kLkNNRF9MT0FELCBwYXJhbSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0RGF0YVJlY2VpdmVyKERhdGFSZWNlaXZlciBoYW5kbGVyKSB7CisgICAgdGhpcy5kYXRhUmVjZWl2ZXIgPSBoYW5kbGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICByZXR1cm4gbmF0aXZlSGFuZGxlck5hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svTmF0aXZlRGF0YVNvdXJjZS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9OYXRpdmVEYXRhU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwMmIzZgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svTmF0aXZlRGF0YVNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5JbnB1dEJ1ZmZlcjsKKworLyoqCisgKiBOYXRpdmVEYXRhU291cmNlIGxvYWRzIGRhdGEgZnJvbSB1cHN0cmVhbQorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGludGVyZmFjZSBOYXRpdmVEYXRhU291cmNlIHsKKworICAvKioKKyAgICogZ2V0IGlucHV0IGJ1ZmZlcgorICAgKi8KKyAgcHVibGljIElucHV0QnVmZmVyIGdldElucHV0QnVmZmVyKCk7CisKKyAgLyoqCisgICAqIHNldCBsaXN0ZW5lci4gV2hlbiBkYXRhIGZyb20gdXBzdHJlYW0gYXJyaXZlcywgdGhlIGxpc3RlbmVyIHdpbGwgYmUgYWN0aXZhdGVkLgorICAgKi8KKyAgdm9pZCBzZXREYXRhUmVjZWl2ZXIoRGF0YVJlY2VpdmVyIGhhbmRsZXIpOworCisgIC8qKgorICAgKiBsb2FkIGRhdGEgZnJvbSB1cHN0cmVhbQorICAgKi8KKyAgcHVibGljIHZvaWQgbG9hZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svTmF0aXZlRGF0YVRhcmdldC5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9OYXRpdmVEYXRhVGFyZ2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svTmF0aXZlRGF0YVRhcmdldC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5PdXRwdXRCdWZmZXI7CisKKy8qKgorICogTmF0aXZlRGF0YVRhcmdlIHNlbmRzIGRhdGEgdG8gZG93bnN0cmVhbQorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGludGVyZmFjZSBOYXRpdmVEYXRhVGFyZ2V0IHsKKworICAvKioKKyAgICogU2VuZHMgYSBzaWduYWwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBoYXMgYmVlbiBzdG9yZWQgaW4gb3V0cHV0IGJ1ZmZlcgorICAgKi8KKyAgcHVibGljIHZvaWQgc2VuZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIFNlbmRzIGEgc2lnbmFsIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSBkYXRhCisgICAqLworICBwdWJsaWMgdm9pZCBmaW5pc2hTZW5kRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogR2V0cyB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBPdXRwdXRCdWZmZXIgZ2V0T3V0cHV0QnVmZmVyKCk7CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svTmF0aXZlTWFwT3V0cHV0Q29sbGVjdG9yRGVsZWdhdG9yLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL05hdGl2ZU1hcE91dHB1dENvbGxlY3RvckRlbGVnYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTE2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL05hdGl2ZU1hcE91dHB1dENvbGxlY3RvckRlbGVnYXRvci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2s7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLlJhd0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkludmFsaWRKb2JDb25mRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5NYXBPdXRwdXRDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlRhc2tBdHRlbXB0SUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suaGFuZGxlcnMuTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGUuSU5hdGl2ZVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGUuTmF0aXZlU2VyaWFsaXphdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuTVJDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk1SSm9iQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQ291bnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLlF1aWNrU29ydDsKKworLyoqCisgKiBuYXRpdmUgbWFwIG91dHB1dCBjb2xsZWN0b3Igd3JhcHBlZCBpbiBKYXZhIGludGVyZmFjZQorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIE5hdGl2ZU1hcE91dHB1dENvbGxlY3RvckRlbGVnYXRvcjxLLCBWPiBpbXBsZW1lbnRzIE1hcE91dHB1dENvbGxlY3RvcjxLLCBWPiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE5hdGl2ZU1hcE91dHB1dENvbGxlY3RvckRlbGVnYXRvci5jbGFzcyk7CisgIHByaXZhdGUgSm9iQ29uZiBqb2I7CisgIHByaXZhdGUgTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXI8SywgVj4gaGFuZGxlcjsKKworICBwcml2YXRlIENvbnRleHQgY29udGV4dDsKKyAgcHJpdmF0ZSBTdGF0dXNSZXBvcnRDaGVja2VyIHVwZGF0ZXI7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvbGxlY3QoSyBrZXksIFYgdmFsdWUsIGludCBwYXJ0aXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIGhhbmRsZXIuY29sbGVjdChrZXksIHZhbHVlLCBwYXJ0aXRpb24pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgaGFuZGxlci5jbG9zZSgpOworICAgIGlmIChudWxsICE9IHVwZGF0ZXIpIHsKKyAgICAgIHVwZGF0ZXIuc3RvcCgpOworICAgICAgTmF0aXZlUnVudGltZS5yZXBvcnRTdGF0dXMoY29udGV4dC5nZXRSZXBvcnRlcigpKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBoYW5kbGVyLmZsdXNoKCk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgdGhpcy5qb2IgPSBjb250ZXh0LmdldEpvYkNvbmYoKTsKKworICAgIFBsYXRmb3Jtcy5pbml0KGpvYik7CisKKyAgICBpZiAoam9iLmdldE51bVJlZHVjZVRhc2tzKCkgPT0gMCkgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVGhlcmUgaXMgbm8gcmVkdWNlciwgbm8gbmVlZCB0byB1c2UgbmF0aXZlIG91dHB1dCBjb2xsZWN0b3IiOworICAgICAgTE9HLmVycm9yKG1lc3NhZ2UpOworICAgICAgdGhyb3cgbmV3IEludmFsaWRKb2JDb25mRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKworICAgIENsYXNzPD8+IGNvbXBhcmF0b3JDbGFzcyA9IGpvYi5nZXRDbGFzcyhNUkpvYkNvbmZpZy5LRVlfQ09NUEFSQVRPUiwgbnVsbCwKKyAgICAgICAgUmF3Q29tcGFyYXRvci5jbGFzcyk7CisgICAgaWYgKGNvbXBhcmF0b3JDbGFzcyAhPSBudWxsICYmICFQbGF0Zm9ybXMuZGVmaW5lKGNvbXBhcmF0b3JDbGFzcykpIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gIk5hdGl2ZSBvdXRwdXQgY29sbGVjdG9yIGRvZXNuJ3Qgc3VwcG9ydCBjdXN0b21pemVkIGphdmEgY29tcGFyYXRvciAiCisgICAgICAgICsgam9iLmdldChNUkpvYkNvbmZpZy5LRVlfQ09NUEFSQVRPUik7CisgICAgICBMT0cuZXJyb3IobWVzc2FnZSk7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEpvYkNvbmZFeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQorCisKKworICAgIGlmICghUXVpY2tTb3J0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoam9iLmdldChDb25zdGFudHMuTUFQX1NPUlRfQ0xBU1MpKSkgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTmF0aXZlLVRhc2sgZG9lc24ndCBzdXBwb3J0IHNvcnQgY2xhc3MgIiArCisgICAgICAgIGpvYi5nZXQoQ29uc3RhbnRzLk1BUF9TT1JUX0NMQVNTKTsKKyAgICAgIExPRy5lcnJvcihtZXNzYWdlKTsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkSm9iQ29uZkV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICB9CisKKyAgICBpZiAoam9iLmdldEJvb2xlYW4oTVJDb25maWcuU0hVRkZMRV9TU0xfRU5BQkxFRF9LRVksIGZhbHNlKSA9PSB0cnVlKSB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJOYXRpdmUtVGFzayBkb2Vzbid0IHN1cHBvcnQgc2VjdXJlIHNodWZmbGUiOworICAgICAgTE9HLmVycm9yKG1lc3NhZ2UpOworICAgICAgdGhyb3cgbmV3IEludmFsaWRKb2JDb25mRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKworICAgIGZpbmFsIENsYXNzPD8+IGtleUNscyA9IGpvYi5nZXRNYXBPdXRwdXRLZXlDbGFzcygpOworICAgIHRyeSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgICAgZmluYWwgSU5hdGl2ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IE5hdGl2ZVNlcmlhbGl6YXRpb24uZ2V0SW5zdGFuY2UoKS5nZXRTZXJpYWxpemVyKGtleUNscyk7CisgICAgICBpZiAobnVsbCA9PSBzZXJpYWxpemVyKSB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIktleSB0eXBlIG5vdCBzdXBwb3J0ZWQuIENhbm5vdCBmaW5kIHNlcmlhbGl6ZXIgZm9yICIgKyBrZXlDbHMuZ2V0TmFtZSgpOworICAgICAgICBMT0cuZXJyb3IobWVzc2FnZSk7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSm9iQ29uZkV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgIH0gZWxzZSBpZiAoIVBsYXRmb3Jtcy5zdXBwb3J0KGtleUNscy5nZXROYW1lKCksIHNlcmlhbGl6ZXIsIGpvYikpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTmF0aXZlIG91dHB1dCBjb2xsZWN0b3IgZG9lc24ndCBzdXBwb3J0IHRoaXMga2V5LCAiICsKKyAgICAgICAgICAidGhpcyBrZXkgaXMgbm90IGNvbXBhcmFibGUgaW4gbmF0aXZlOiAiICsga2V5Q2xzLmdldE5hbWUoKTsKKyAgICAgICAgTE9HLmVycm9yKG1lc3NhZ2UpOworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEpvYkNvbmZFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ2Fubm90IGZpbmQgc2VyaWFsaXplciBmb3IgIiArIGtleUNscy5nZXROYW1lKCk7CisgICAgICBMT0cuZXJyb3IobWVzc2FnZSk7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQorCisgICAgZmluYWwgYm9vbGVhbiByZXQgPSBOYXRpdmVSdW50aW1lLmlzTmF0aXZlTGlicmFyeUxvYWRlZCgpOworICAgIGlmIChyZXQpIHsKKyAgICAgIGlmIChqb2IuZ2V0Qm9vbGVhbihNUkpvYkNvbmZpZy5NQVBfT1VUUFVUX0NPTVBSRVNTLCBmYWxzZSkpIHsKKyAgICAgICAgU3RyaW5nIGNvZGVjID0gam9iLmdldChNUkpvYkNvbmZpZy5NQVBfT1VUUFVUX0NPTVBSRVNTX0NPREVDKTsKKyAgICAgICAgaWYgKCFOYXRpdmVSdW50aW1lLnN1cHBvcnRzQ29tcHJlc3Npb25Db2RlYyhjb2RlYy5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpKSB7CisgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTmF0aXZlIG91dHB1dCBjb2xsZWN0b3IgZG9lc24ndCBzdXBwb3J0IGNvbXByZXNzaW9uIGNvZGVjICIgKyBjb2RlYzsKKyAgICAgICAgICBMT0cuZXJyb3IobWVzc2FnZSk7CisgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRKb2JDb25mRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICB9CisgICAgICBOYXRpdmVSdW50aW1lLmNvbmZpZ3VyZShqb2IpOworCisgICAgICBmaW5hbCBsb25nIHVwZGF0ZUludGVydmFsID0gam9iLmdldExvbmcoQ29uc3RhbnRzLk5BVElWRV9TVEFUVVNfVVBEQVRFX0lOVEVSVkFMLAorICAgICAgICAgIENvbnN0YW50cy5OQVRJVkVfU1RBVFVTX1VQREFURV9JTlRFUlZBTF9ERUZWQUwpOworICAgICAgdXBkYXRlciA9IG5ldyBTdGF0dXNSZXBvcnRDaGVja2VyKGNvbnRleHQuZ2V0UmVwb3J0ZXIoKSwgdXBkYXRlSW50ZXJ2YWwpOworICAgICAgdXBkYXRlci5zdGFydCgpOworCisgICAgfSBlbHNlIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gIk5hdGl2ZVJ1bnRpbWUgY2Fubm90IGJlIGxvYWRlZCwgcGxlYXNlIGNoZWNrIHRoYXQgIiArCisgICAgICAgICJsaWJuYXRpdmV0YXNrLnNvIGlzIGluIGhhZG9vcCBsaWJyYXJ5IGRpciI7CisgICAgICBMT0cuZXJyb3IobWVzc2FnZSk7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEpvYkNvbmZFeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQorCisgICAgdGhpcy5oYW5kbGVyID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgZmluYWwgQ2xhc3M8Sz4gb0tDbGFzcyA9IChDbGFzczxLPikgam9iLmdldE1hcE91dHB1dEtleUNsYXNzKCk7CisgICAgICBmaW5hbCBDbGFzczxLPiBvVkNsYXNzID0gKENsYXNzPEs+KSBqb2IuZ2V0TWFwT3V0cHV0VmFsdWVDbGFzcygpOworICAgICAgZmluYWwgVGFza0F0dGVtcHRJRCBpZCA9IGNvbnRleHQuZ2V0TWFwVGFzaygpLmdldFRhc2tJRCgpOworICAgICAgZmluYWwgVGFza0NvbnRleHQgdGFza0NvbnRleHQgPSBuZXcgVGFza0NvbnRleHQoam9iLCBudWxsLCBudWxsLCBvS0NsYXNzLCBvVkNsYXNzLAorICAgICAgICAgIGNvbnRleHQuZ2V0UmVwb3J0ZXIoKSwgaWQpOworICAgICAgaGFuZGxlciA9IE5hdGl2ZUNvbGxlY3Rvck9ubHlIYW5kbGVyLmNyZWF0ZSh0YXNrQ29udGV4dCk7CisgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTmF0aXZlIG91dHB1dCBjb2xsZWN0b3IgY2Fubm90IGJlIGxvYWRlZDsiOworICAgICAgTE9HLmVycm9yKG1lc3NhZ2UpOworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOworICAgIH0KKworICAgIExPRy5pbmZvKCJOYXRpdmUgb3V0cHV0IGNvbGxlY3RvciBjYW4gYmUgc3VjY2Vzc2Z1bGx5IGVuYWJsZWQhIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9OYXRpdmVSdW50aW1lLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL05hdGl2ZVJ1bnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGU4OGJkCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9OYXRpdmVSdW50aW1lLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkRhdGFJbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5GbG9hdFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkludFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkxvbmdXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5UZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5UYXNrLlRhc2tSZXBvcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLkNvbmZpZ1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5WZXJzaW9uSW5mbzsKKworLyoqCisgKiBUaGlzIGNsYXNzIHN0YW5kcyBmb3IgdGhlIG5hdGl2ZSBydW50aW1lIEl0IGhhcyB0aHJlZSBmdW5jdGlvbnM6CisgKiAxLiBDcmVhdGUgbmF0aXZlIGhhbmRsZXJzIGZvciBtYXAsIHJlZHVjZSwgb3V0cHV0Y29sbGVjdG9yLCBldGMKKyAqIDIuIENvbmZpZ3VyZSBuYXRpdmUgdGFzayB3aXRoIHByb3ZpZGVkIE1SIGNvbmZpZ3MKKyAqIDMuIFByb3ZpZGUgZmlsZSBzeXN0ZW0gYXBpIHRvIG5hdGl2ZSBzcGFjZSwgc28gdGhhdCBpdCBjYW4gdXNlIEZpbGUgc3lzdGVtIGxpa2UgSERGUy4KKyAqLworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBOYXRpdmVSdW50aW1lIHsKKyAgcHJpdmF0ZSBzdGF0aWMgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE5hdGl2ZVJ1bnRpbWUuY2xhc3MpOworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5hdGl2ZUxpYnJhcnlMb2FkZWQgPSBmYWxzZTsKKworICBwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworCisgIHN0YXRpYyB7CisgICAgdHJ5IHsKKyAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgibmF0aXZldGFzayIpOworICAgICAgTE9HLmluZm8oIk5hdGl2ZXRhc2sgSk5JIGxpYnJhcnkgbG9hZGVkLiIpOworICAgICAgbmF0aXZlTGlicmFyeUxvYWRlZCA9IHRydWU7CisgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgIC8vIElnbm9yZSBmYWlsdXJlcworICAgICAgTE9HLmVycm9yKCJGYWlsZWQgdG8gbG9hZCBuYXRpdmV0YXNrIEpOSSBsaWJyYXJ5IHdpdGggZXJyb3I6ICIgKyB0KTsKKyAgICAgIExPRy5pbmZvKCJqYXZhLmxpYnJhcnkucGF0aD0iICsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmxpYnJhcnkucGF0aCIpKTsKKyAgICAgIExPRy5pbmZvKCJMRF9MSUJSQVJZX1BBVEg9IiArIFN5c3RlbS5nZXRlbnYoIkxEX0xJQlJBUllfUEFUSCIpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE5hdGl2ZUxpYnJhcnlMb2FkZWQoKSB7CisgICAgaWYgKCFuYXRpdmVMaWJyYXJ5TG9hZGVkKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTmF0aXZlIHJ1bnRpbWUgbGlicmFyeSBub3QgbG9hZGVkIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmF0aXZlTGlicmFyeUxvYWRlZCgpIHsKKyAgICByZXR1cm4gbmF0aXZlTGlicmFyeUxvYWRlZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvbiBqb2JDb25mKSB7CisgICAgYXNzZXJ0TmF0aXZlTGlicmFyeUxvYWRlZCgpOworICAgIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbihqb2JDb25mKTsKKyAgICBjb25mLnNldChDb25zdGFudHMuTkFUSVZFX0hBRE9PUF9WRVJTSU9OLCBWZXJzaW9uSW5mby5nZXRWZXJzaW9uKCkpOworICAgIEpOSUNvbmZpZ3VyZShDb25maWdVdGlsLnRvQnl0ZXMoY29uZikpOworICB9CisKKyAgLyoqCisgICAqIGNyZWF0ZSBuYXRpdmUgb2JqZWN0IFdlIHVzZSBpdCB0byBjcmVhdGUgbmF0aXZlIGhhbmRsZXJzCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBsb25nIGNyZWF0ZU5hdGl2ZU9iamVjdChTdHJpbmcgY2xhenopIHsKKyAgICBhc3NlcnROYXRpdmVMaWJyYXJ5TG9hZGVkKCk7CisgICAgZmluYWwgbG9uZyByZXQgPSBKTklDcmVhdGVOYXRpdmVPYmplY3QoY2xhenouZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgIExPRy53YXJuKCJDYW4ndCBjcmVhdGUgTmF0aXZlT2JqZWN0IGZvciBjbGFzcyAiICsgY2xhenogKyAiLCBwcm9iYWJseSBub3QgZXhpc3QuIik7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKioKKyAgICogUmVnaXN0ZXIgYSBjdXN0b21pemVkIGxpYnJhcnkKKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGxvbmcgcmVnaXN0ZXJMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TmFtZSwgU3RyaW5nIGNsYXp6KSB7CisgICAgYXNzZXJ0TmF0aXZlTGlicmFyeUxvYWRlZCgpOworICAgIGZpbmFsIGxvbmcgcmV0ID0gSk5JUmVnaXN0ZXJNb2R1bGUobGlicmFyeU5hbWUuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenouZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIExPRy53YXJuKCJDYW4ndCBjcmVhdGUgTmF0aXZlT2JqZWN0IGZvciBjbGFzcyAiICsgY2xhenogKyAiLCBwcm9iYWJseSBub3QgZXhpc3QuIik7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKioKKyAgICogZGVzdHJveSBuYXRpdmUgb2JqZWN0IFdlIHVzZSB0byBkZXN0b3J5IG5hdGl2ZSBoYW5kbGVycworICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCByZWxlYXNlTmF0aXZlT2JqZWN0KGxvbmcgYWRkcikgeworICAgIGFzc2VydE5hdGl2ZUxpYnJhcnlMb2FkZWQoKTsKKyAgICBKTklSZWxlYXNlTmF0aXZlT2JqZWN0KGFkZHIpOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgc3RhdHVzIHJlcG9ydCBmcm9tIG5hdGl2ZSBzcGFjZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydFN0YXR1cyhUYXNrUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYXNzZXJ0TmF0aXZlTGlicmFyeUxvYWRlZCgpOworICAgIHN5bmNocm9uaXplZCAocmVwb3J0ZXIpIHsKKyAgICAgIGZpbmFsIGJ5dGVbXSBzdGF0dXNCeXRlcyA9IEpOSVVwZGF0ZVN0YXR1cygpOworICAgICAgZmluYWwgRGF0YUlucHV0QnVmZmVyIGliID0gbmV3IERhdGFJbnB1dEJ1ZmZlcigpOworICAgICAgaWIucmVzZXQoc3RhdHVzQnl0ZXMsIHN0YXR1c0J5dGVzLmxlbmd0aCk7CisgICAgICBmaW5hbCBGbG9hdFdyaXRhYmxlIHByb2dyZXNzID0gbmV3IEZsb2F0V3JpdGFibGUoKTsKKyAgICAgIHByb2dyZXNzLnJlYWRGaWVsZHMoaWIpOworICAgICAgcmVwb3J0ZXIuc2V0UHJvZ3Jlc3MocHJvZ3Jlc3MuZ2V0KCkpOworICAgICAgZmluYWwgVGV4dCBzdGF0dXMgPSBuZXcgVGV4dCgpOworICAgICAgc3RhdHVzLnJlYWRGaWVsZHMoaWIpOworICAgICAgaWYgKHN0YXR1cy5nZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgcmVwb3J0ZXIuc2V0U3RhdHVzKHN0YXR1cy50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIEludFdyaXRhYmxlIG51bUNvdW50ZXJzID0gbmV3IEludFdyaXRhYmxlKCk7CisgICAgICBudW1Db3VudGVycy5yZWFkRmllbGRzKGliKTsKKyAgICAgIGlmIChudW1Db3VudGVycy5nZXQoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZpbmFsIFRleHQgZ3JvdXAgPSBuZXcgVGV4dCgpOworICAgICAgZmluYWwgVGV4dCBuYW1lID0gbmV3IFRleHQoKTsKKyAgICAgIGZpbmFsIExvbmdXcml0YWJsZSBhbW91bnQgPSBuZXcgTG9uZ1dyaXRhYmxlKCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvdW50ZXJzLmdldCgpOyBpKyspIHsKKyAgICAgICAgZ3JvdXAucmVhZEZpZWxkcyhpYik7CisgICAgICAgIG5hbWUucmVhZEZpZWxkcyhpYik7CisgICAgICAgIGFtb3VudC5yZWFkRmllbGRzKGliKTsKKyAgICAgICAgcmVwb3J0ZXIuaW5jckNvdW50ZXIoZ3JvdXAudG9TdHJpbmcoKSwgbmFtZS50b1N0cmluZygpLCBhbW91bnQuZ2V0KCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoqKiBUaGUgZm9sbG93aW5nIGFyZSBKTkkgQXBpcworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqCisgICAqIENoZWNrIHdoZXRoZXIgdGhlIG5hdGl2ZSBzaWRlIGhhcyBjb21wcmVzc2lvbiBjb2RlYyBzdXBwb3J0IGJ1aWx0IGluCisgICAqLworICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzQ29tcHJlc3Npb25Db2RlYyhieXRlW10gY29kZWMpOworCisgIC8qKgorICAgKiBDb25maWcgdGhlIG5hdGl2ZSBydW50aW1lIHdpdGggbWFwcmVkdWNlIGpvYiBjb25maWd1cmF0aW9ucy4KKyAgICovCisgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyB2b2lkIEpOSUNvbmZpZ3VyZShieXRlW11bXSBjb25maWdzKTsKKworICAvKioKKyAgICogY3JlYXRlIGEgbmF0aXZlIG9iamVjdCBpbiBuYXRpdmUgc3BhY2UKKyAgICovCisgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBsb25nIEpOSUNyZWF0ZU5hdGl2ZU9iamVjdChieXRlW10gY2xhenopOworCisgIC8qKgorICAgKiBjcmVhdGUgdGhlIGRlZmF1bHQgbmF0aXZlIG9iamVjdCBmb3IgY2VydGFpbiB0eXBlCisgICAqLworICBARGVwcmVjYXRlZAorICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgbG9uZyBKTklDcmVhdGVEZWZhdWx0TmF0aXZlT2JqZWN0KGJ5dGVbXSB0eXBlKTsKKworICAvKioKKyAgICogZGVzdHJveSBuYXRpdmUgb2JqZWN0IGluIG5hdGl2ZSBzcGFjZQorICAgKi8KKyAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIHZvaWQgSk5JUmVsZWFzZU5hdGl2ZU9iamVjdChsb25nIGFkZHIpOworCisgIC8qKgorICAgKiBHZXQgc3RhdHVzIHVwZGF0ZSBmcm9tIG5hdGl2ZSBzaWRlCisgICAqIEVuY29kaW5nOgorICAgKiAgcHJvZ3Jlc3M6ZmxvYXQKKyAgICogIHN0YXR1czpUZXh0CisgICAqICBudW1iZXI6IGludCB0aGUgY291bnQgb2YgdGhlIGNvdW50ZXJzCisgICAqICBDb3VudGVyczogYXJyYXkgW2dyb3VwOlRleHQsIG5hbWU6VGV4dCwgaW5jckNvdW50OkxvbmddCisgICAqLworICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgYnl0ZVtdIEpOSVVwZGF0ZVN0YXR1cygpOworCisgIC8qKgorICAgKiBOb3QgdXNlZC4KKyAgICovCisgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyB2b2lkIEpOSVJlbGVhc2UoKTsKKworICAvKioKKyAgICogTm90IHVzZWQuCisgICAqLworICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IEpOSVJlZ2lzdGVyTW9kdWxlKGJ5dGVbXSBwYXRoLCBieXRlW10gbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL1BsYXRmb3JtLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL1BsYXRmb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlYzI2YwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svUGxhdGZvcm0uamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlU3RhYmlsaXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlLklOYXRpdmVTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlLk5hdGl2ZVNlcmlhbGl6YXRpb247CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgcGxhdGZvcm1zLiBBIHBsYXRmb3JtIGlzIGEgZnJhbWV3b3JrIHJ1bm5pbmcgb24gdG9wIG9mCisgKiBNYXBSZWR1Y2UsIGxpa2UgSGFkb29wLCBIaXZlLCBQaWcsIE1haG91dC4gRWFjaCBmcmFtZXdvcmsgZGVmaW5lcyBpdHMKKyAqIG93biBrZXkgdHlwZSBhbmQgdmFsdWUgdHlwZSBhY3Jvc3MgYSBNYXBSZWR1Y2Ugam9iLiBGb3IgZWFjaCBwbGF0Zm9ybSwKKyAqIHdlIHNob3VsZCBpbXBsZW1lbnQgc2VyaWFsaXplcnMgc3VjaCB0aGF0IHdlIGNvdWxkIGNvbW11bmljYXRlIGRhdGEgd2l0aAorICogbmF0aXZlIHNpZGUgYW5kIG5hdGl2ZSBjb21wYXJhdG9ycyBzbyBvdXIgbmF0aXZlIG91dHB1dCBjb2xsZWN0b3JzIGNvdWxkCisgKiBzb3J0IHRoZW0gYW5kIHdyaXRlIG91dC4gV2UndmUgYWxyZWFkeSBwcm92aWRlZCB0aGUge0BsaW5rIEhhZG9vcFBsYXRmb3JtfQorICogdGhhdCBzdXBwb3J0cyBhbGwga2V5IHR5cGVzIG9mIEhhZG9vcCBhbmQgdXNlcnMgY291bGQgaW1wbGVtZW50IHRoZWlyIGN1c3RvbQorICogcGxhdGZvcm0uCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5QdWJsaWMKK0BJbnRlcmZhY2VTdGFiaWxpdHkuRXZvbHZpbmcKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQbGF0Zm9ybSB7CisgIHByaXZhdGUgZmluYWwgTmF0aXZlU2VyaWFsaXphdGlvbiBzZXJpYWxpemF0aW9uOworICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4ga2V5Q2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICBwdWJsaWMgUGxhdGZvcm0oKSB7CisgICAgdGhpcy5zZXJpYWxpemF0aW9uID0gTmF0aXZlU2VyaWFsaXphdGlvbi5nZXRJbnN0YW5jZSgpOworICB9CisKKyAgLyoqCisgICAqIGluaXRpYWxpemUgYSBwbGF0Zm9ybSwgd2hlcmUgd2Ugc2hvdWxkIGNhbGwgcmVnaXN0ZXJLZXkKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIEByZXR1cm4gbmFtZSBvZiBhIFBsYXRmb3JtLCB1c2VmdWwgZm9yIGxvZ3MgYW5kIGRlYnVnCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIG5hbWUoKTsKKworCisgIC8qKgorICAgKiBhc3NvY2lhdGUgYSBrZXkgY2xhc3Mgd2l0aCBpdHMgc2VyaWFsaXplciBhbmQgcGxhdGZvcm0KKyAgICoKKyAgICogQHBhcmFtIGtleUNsYXNzTmFtZSBtYXAgb3V0IGtleSBjbGFzcyBuYW1lCisgICAqIEBwYXJhbSBrZXkgICAgICAgICAga2V5IHNlcmlhbGl6ZXIgY2xhc3MKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyS2V5KFN0cmluZyBrZXlDbGFzc05hbWUsIENsYXNzPD8+IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzZXJpYWxpemF0aW9uLnJlZ2lzdGVyKGtleUNsYXNzTmFtZSwga2V5KTsKKyAgICBrZXlDbGFzc05hbWVzLmFkZChrZXlDbGFzc05hbWUpOworICB9CisKKyAgLyoqCisgICAqIHdoZXRoZXIgYSBwbGF0Zm9ybSBzdXBwb3J0cyBhIHNwZWNpZmljIGtleSBzaG91bGQgYXQgbGVhc3Qgc2F0aXNmeSB0d28gY29uZGl0aW9ucworICAgKgorICAgKiAxLiB0aGUga2V5IGJlbG9uZ3MgdG8gdGhlIHBsYXRmb3JtCisgICAqIDIuIHRoZSBhc3NvY2lhdGVkIHNlcmlhbGl6ZXIgbXVzdCBpbXBsZW1lbnQge0BsaW5rIElOYXRpdmVDb21wYXJhYmxlfSBpbnRlcmZhY2UKKyAgICoKKyAgICoKKyAgICogQHBhcmFtIGtleUNsYXNzTmFtZSBtYXAgb3V0IHB1dCBrZXkgY2xhc3MgbmFtZQorICAgKiBAcGFyYW0gc2VyaWFsaXplciAgIHNlcmlhbGl6ZXIgYXNzb2NpYXRlZCB3aXRoIGtleSB2aWEgcmVnaXN0ZXJLZXkKKyAgICogQHBhcmFtIGpvYiAgICAgICAgICBqb2IgY29uZmlndXJhdGlvbgorICAgKiBAcmV0dXJuICAgICAgICAgICAgIHRydWUgaWYgdGhlIHBsYXRmb3JtIGhhcyBpbXBsZW1lbnRlZCBuYXRpdmUgY29tcGFyYXRvcnMgb2YgdGhlIGtleSBhbmQKKyAgICogICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnQoU3RyaW5nIGtleUNsYXNzTmFtZSwKKyAgICAgIElOYXRpdmVTZXJpYWxpemVyPD8+IHNlcmlhbGl6ZXIsIEpvYkNvbmYgam9iKTsKKworCisgIC8qKgorICAgKiB3aGV0aGVyIGl0J3MgdGhlIHBsYXRmb3JtIHRoYXQgaGFzIGRlZmluZWQgYSBjdXN0b20gSmF2YSBjb21wYXJhdG9yCisgICAqCisgICAqIE5hdGl2ZVRhc2sgZG9lc24ndCBzdXBwb3J0IGN1c3RvbSBKYXZhIGNvbXBhcmF0b3JzCisgICAqIChzZXQgd2l0aCBtYXByZWR1Y2Uuam9iLm91dHB1dC5rZXkuY29tcGFyYXRvci5jbGFzcykKKyAgICogYnV0IGEgcGxhdGZvcm0gKGUuZyBQaWcpIGNvdWxkIGFsc28gc2V0IHRoYXQgY29uZiBhbmQgaW1wbGVtZW50IG5hdGl2ZQorICAgKiBjb21wYXJhdG9ycyBzbyB3ZSBzaG91bGRuJ3QgYmFpbCBvdXQuCisgICAqCisgICAqIEBwYXJhbSBrZXlDb21wYXJhdG9yIGNvbXBhcmF0b3Igc2V0IHdpdGggbWFwcmVkdWNlLmpvYi5vdXRwdXQua2V5LmNvbXBhcmF0b3IuY2xhc3MKKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGRlZmluZShDbGFzczw/PiBrZXlDb21wYXJhdG9yKTsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svUGxhdGZvcm1zLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL1BsYXRmb3Jtcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWQzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL1BsYXRmb3Jtcy5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNlcnZpY2VMb2FkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmY7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGUuSU5hdGl2ZVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGUuTmF0aXZlU2VyaWFsaXphdGlvbjsKKworCisvKioKKyAqIHRoaXMgY2xhc3Mgd2lsbCBsb2FkIGluIGFuZCBpbml0IGFsbCBwbGF0Zm9ybXMgb24gY2xhc3NwYXRoCisgKiBpdCBpcyBhbHNvIHRoZSBmYWNhZGUgdG8gY2hlY2sgZm9yIGtleSB0eXBlIHN1cHBvcnQgYW5kIG90aGVyCisgKiBwbGF0Zm9ybSBtZXRob2RzCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1zIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coUGxhdGZvcm1zLmNsYXNzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VydmljZUxvYWRlcjxQbGF0Zm9ybT4gcGxhdGZvcm1zID0gU2VydmljZUxvYWRlci5sb2FkKFBsYXRmb3JtLmNsYXNzKTsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIE5hdGl2ZVNlcmlhbGl6YXRpb24uZ2V0SW5zdGFuY2UoKS5yZXNldCgpOworICAgIHN5bmNocm9uaXplZCAocGxhdGZvcm1zKSB7CisgICAgICBmb3IgKFBsYXRmb3JtIHBsYXRmb3JtIDogcGxhdGZvcm1zKSB7CisgICAgICAgIHBsYXRmb3JtLmluaXQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3VwcG9ydChTdHJpbmcga2V5Q2xhc3NOYW1lLAorICAgICAgSU5hdGl2ZVNlcmlhbGl6ZXI8Pz4gc2VyaWFsaXplciwgSm9iQ29uZiBqb2IpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHBsYXRmb3JtcykgeworICAgICAgZm9yIChQbGF0Zm9ybSBwbGF0Zm9ybSA6IHBsYXRmb3JtcykgeworICAgICAgICBpZiAocGxhdGZvcm0uc3VwcG9ydChrZXlDbGFzc05hbWUsIHNlcmlhbGl6ZXIsIGpvYikpIHsKKyAgICAgICAgICBMT0cuZGVidWcoInBsYXRmb3JtICIgKyBwbGF0Zm9ybS5uYW1lKCkgKyAiIHN1cHBvcnQga2V5IGNsYXNzIgorICAgICAgICAgICAgKyBrZXlDbGFzc05hbWUpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWZpbmUoQ2xhc3M8Pz4ga2V5Q29tcGFyYXRvcikgeworICAgIHN5bmNocm9uaXplZCAocGxhdGZvcm1zKSB7CisgICAgICBmb3IgKFBsYXRmb3JtIHBsYXRmb3JtIDogcGxhdGZvcm1zKSB7CisgICAgICAgIGlmIChwbGF0Zm9ybS5kZWZpbmUoa2V5Q29tcGFyYXRvcikpIHsKKyAgICAgICAgICBMT0cuZGVidWcoInBsYXRmb3JtICIgKyBwbGF0Zm9ybS5uYW1lKCkgKyAiIGRlZmluZSBjb21wYXJhdG9yICIKKyAgICAgICAgICAgICsga2V5Q29tcGFyYXRvci5nZXROYW1lKCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9TdGF0dXNSZXBvcnRDaGVja2VyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL1N0YXR1c1JlcG9ydENoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc2ZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9TdGF0dXNSZXBvcnRDaGVja2VyLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5UYXNrLlRhc2tSZXBvcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0NvdW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5pbnB1dC5GaWxlSW5wdXRGb3JtYXRDb3VudGVyOworCisvKioKKyAqIFdpbGwgcGVyaW9kaWNhbGx5IGNoZWNrIHN0YXR1cyBmcm9tIG5hdGl2ZSBhbmQgcmVwb3J0IHRvIE1SIGZyYW1ld29yay4KKyAqIAorICovCitjbGFzcyBTdGF0dXNSZXBvcnRDaGVja2VyIGltcGxlbWVudHMgUnVubmFibGUgeworCisgIHByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhTdGF0dXNSZXBvcnRDaGVja2VyLmNsYXNzKTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJWQUwgPSAxMDAwOyAvLyBtaWxsaXNlY29uZHMKKworICBwcml2YXRlIFRocmVhZCBjaGVja2VyOworICBwcml2YXRlIGZpbmFsIFRhc2tSZXBvcnRlciByZXBvcnRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGludGVydmFsOworCisgIHB1YmxpYyBTdGF0dXNSZXBvcnRDaGVja2VyKFRhc2tSZXBvcnRlciByZXBvcnRlcikgeworICAgIHRoaXMocmVwb3J0ZXIsIElOVEVSVkFMKTsKKyAgfQorCisgIHB1YmxpYyBTdGF0dXNSZXBvcnRDaGVja2VyKFRhc2tSZXBvcnRlciByZXBvcnRlciwgbG9uZyBpbnRlcnZhbCkgeworICAgIHRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKKyAgICB0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB0cnkgeworICAgICAgICBUaHJlYWQuc2xlZXAoaW50ZXJ2YWwpOworICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICBMT0cuZGVidWcoIlN0YXR1c1VwZGF0ZXIgdGhyZWFkIGV4aXRpbmcgIiArICJzaW5jZSBpdCBnb3QgaW50ZXJydXB0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIE5hdGl2ZVJ1bnRpbWUucmVwb3J0U3RhdHVzKHJlcG9ydGVyKTsKKyAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HLndhcm4oIlVwZGF0ZSBuYXRpdmUgc3RhdHVzIGdvdCBleGNlcHRpb24iLCBlKTsKKyAgICAgICAgcmVwb3J0ZXIuc2V0U3RhdHVzKGUudG9TdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGluaXRVc2VkQ291bnRlcnMoKSB7CisgICAgcmVwb3J0ZXIuZ2V0Q291bnRlcihUYXNrQ291bnRlci5NQVBfSU5QVVRfUkVDT1JEUyk7CisgICAgcmVwb3J0ZXIuZ2V0Q291bnRlcihUYXNrQ291bnRlci5NQVBfT1VUUFVUX1JFQ09SRFMpOworICAgIHJlcG9ydGVyLmdldENvdW50ZXIoRmlsZUlucHV0Rm9ybWF0Q291bnRlci5CWVRFU19SRUFEKTsKKyAgICByZXBvcnRlci5nZXRDb3VudGVyKFRhc2tDb3VudGVyLk1BUF9PVVRQVVRfQllURVMpOworICAgIHJlcG9ydGVyLmdldENvdW50ZXIoVGFza0NvdW50ZXIuTUFQX09VVFBVVF9NQVRFUklBTElaRURfQllURVMpOworICAgIHJlcG9ydGVyLmdldENvdW50ZXIoVGFza0NvdW50ZXIuQ09NQklORV9JTlBVVF9SRUNPUkRTKTsKKyAgICByZXBvcnRlci5nZXRDb3VudGVyKFRhc2tDb3VudGVyLkNPTUJJTkVfT1VUUFVUX1JFQ09SRFMpOworICAgIHJlcG9ydGVyLmdldENvdW50ZXIoVGFza0NvdW50ZXIuU1BJTExFRF9SRUNPUkRTKTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKyAgICBpZiAoY2hlY2tlciA9PSBudWxsKSB7CisgICAgICAvLyBpbml0IGNvdW50ZXJzIHVzZWQgYnkgbmF0aXZlIHNpZGUsCisgICAgICAvLyBzbyB0aGV5IHdpbGwgaGF2ZSBjb3JyZWN0IGRpc3BsYXkgbmFtZQorICAgICAgaW5pdFVzZWRDb3VudGVycygpOworICAgICAgY2hlY2tlciA9IG5ldyBUaHJlYWQodGhpcyk7CisgICAgICBjaGVja2VyLnNldERhZW1vbih0cnVlKTsKKyAgICAgIGNoZWNrZXIuc3RhcnQoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgaWYgKGNoZWNrZXIgIT0gbnVsbCkgeworICAgICAgY2hlY2tlci5pbnRlcnJ1cHQoKTsKKyAgICAgIGNoZWNrZXIuam9pbigpOworICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svVGFza0NvbnRleHQuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svVGFza0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTVjZWQxCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9UYXNrQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5UYXNrLlRhc2tSZXBvcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGFza0F0dGVtcHRJRDsKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBUYXNrQ29udGV4dCB7CisgIHByaXZhdGUgZmluYWwgSm9iQ29uZiBjb25mOworICBwcml2YXRlIENsYXNzPD8+IGlLQ2xhc3M7CisgIHByaXZhdGUgQ2xhc3M8Pz4gaVZDbGFzczsKKyAgcHJpdmF0ZSBDbGFzczw/PiBvS0NsYXNzOworICBwcml2YXRlIENsYXNzPD8+IG9WQ2xhc3M7CisgIHByaXZhdGUgZmluYWwgVGFza1JlcG9ydGVyIHJlcG9ydGVyOworICBwcml2YXRlIGZpbmFsIFRhc2tBdHRlbXB0SUQgdGFza0F0dGVtcHRJRDsKKworICBwdWJsaWMgVGFza0NvbnRleHQoSm9iQ29uZiBjb25mLCBDbGFzczw/PiBpS0NsYXNzLCBDbGFzczw/PiBpVkNsYXNzLAorICAgICAgQ2xhc3M8Pz4gb0tDbGFzcywgQ2xhc3M8Pz4gb1ZDbGFzcywgVGFza1JlcG9ydGVyIHJlcG9ydGVyLAorICAgICAgVGFza0F0dGVtcHRJRCBpZCkgeworICAgIHRoaXMuY29uZiA9IGNvbmY7CisgICAgdGhpcy5pS0NsYXNzID0gaUtDbGFzczsKKyAgICB0aGlzLmlWQ2xhc3MgPSBpVkNsYXNzOworICAgIHRoaXMub0tDbGFzcyA9IG9LQ2xhc3M7CisgICAgdGhpcy5vVkNsYXNzID0gb1ZDbGFzczsKKyAgICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7CisgICAgdGhpcy50YXNrQXR0ZW1wdElEID0gaWQ7CisgIH0KKworICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0SW5wdXRLZXlDbGFzcygpIHsKKyAgICByZXR1cm4gaUtDbGFzczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldElucHV0S2V5Q2xhc3MoQ2xhc3M8Pz4ga2xhc3MpIHsKKyAgICB0aGlzLmlLQ2xhc3MgPSBrbGFzczsKKyAgfQorCisgIHB1YmxpYyBDbGFzczw/PiBnZXRJbnB1dFZhbHVlQ2xhc3MoKSB7CisgICAgcmV0dXJuIGlWQ2xhc3M7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRJbnB1dFZhbHVlQ2xhc3MoQ2xhc3M8Pz4ga2xhc3MpIHsKKyAgICB0aGlzLmlWQ2xhc3MgPSBrbGFzczsKKyAgfQorCisgIHB1YmxpYyBDbGFzczw/PiBnZXRPdXRwdXRLZXlDbGFzcygpIHsKKyAgICByZXR1cm4gdGhpcy5vS0NsYXNzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0T3V0cHV0S2V5Q2xhc3MoQ2xhc3M8Pz4ga2xhc3MpIHsKKyAgICB0aGlzLm9LQ2xhc3MgPSBrbGFzczsKKyAgfQorCisgIHB1YmxpYyBDbGFzczw/PiBnZXRPdXRwdXRWYWx1ZUNsYXNzKCkgeworICAgIHJldHVybiB0aGlzLm9WQ2xhc3M7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRWYWx1ZUNsYXNzKENsYXNzPD8+IGtsYXNzKSB7CisgICAgdGhpcy5vVkNsYXNzID0ga2xhc3M7CisgIH0KKworICBwdWJsaWMgVGFza1JlcG9ydGVyIGdldFRhc2tSZXBvcnRlcigpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBvcnRlcjsKKyAgfQorCisgIHB1YmxpYyBUYXNrQXR0ZW1wdElEIGdldFRhc2tBdHRlbXB0SWQoKSB7CisgICAgcmV0dXJuIHRoaXMudGFza0F0dGVtcHRJRDsKKyAgfQorCisgIHB1YmxpYyBKb2JDb25mIGdldENvbmYoKSB7CisgICAgcmV0dXJuIHRoaXMuY29uZjsKKyAgfQorCisgIHB1YmxpYyBUYXNrQ29udGV4dCBjb3B5T2YoKSB7CisgICAgcmV0dXJuIG5ldyBUYXNrQ29udGV4dChjb25mLCBpS0NsYXNzLCBpVkNsYXNzLCBvS0NsYXNzLCBvVkNsYXNzLCByZXBvcnRlciwgdGFza0F0dGVtcHRJRCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0J1ZmZlclR5cGUuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0J1ZmZlclR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRjZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvQnVmZmVyVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGVudW0gQnVmZmVyVHlwZSB7CisgIERJUkVDVF9CVUZGRVIsCisgIEhFQVBfQlVGRkVSCit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0J5dGVCdWZmZXJEYXRhUmVhZGVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9CeXRlQnVmZmVyRGF0YVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzY1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9CeXRlQnVmZmVyRGF0YVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworCisvKioKKyAqIHJlYWQgZGF0YSBmcm9tIGEgaW5wdXQgYnVmZmVyCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgQnl0ZUJ1ZmZlckRhdGFSZWFkZXIgZXh0ZW5kcyBEYXRhSW5wdXRTdHJlYW0geworICBwcml2YXRlIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcjsKKyAgcHJpdmF0ZSBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbSBqYXZhUmVhZGVyOworCisgIHB1YmxpYyBCeXRlQnVmZmVyRGF0YVJlYWRlcihJbnB1dEJ1ZmZlciBidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyICE9IG51bGwpIHsKKyAgICAgIHJlc2V0KGJ1ZmZlcik7CisgICAgfQorICAgIGphdmFSZWFkZXIgPSBuZXcgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0odGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZXNldChJbnB1dEJ1ZmZlciBidWZmZXIpIHsKKyAgICB0aGlzLmJ5dGVCdWZmZXIgPSBidWZmZXIuZ2V0Qnl0ZUJ1ZmZlcigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVCdWZmZXIuZ2V0KGIsIG9mZiwgbGVuKTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlQnVmZmVyLmdldChiLCAwLCBiLmxlbmd0aCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVCdWZmZXIuZ2V0KGIsIG9mZiwgbGVuKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHNraXBCeXRlcyhpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgcmVtYWlucyA9IGJ5dGVCdWZmZXIucmVtYWluaW5nKCk7CisgICAgZmluYWwgaW50IHNraXAgPSAocmVtYWlucyA8IG4pID8gcmVtYWlucyA6IG47CisgICAgZmluYWwgaW50IGN1cnJlbnQgPSBieXRlQnVmZmVyLnBvc2l0aW9uKCk7CisgICAgYnl0ZUJ1ZmZlci5wb3NpdGlvbihjdXJyZW50ICsgc2tpcCk7CisgICAgcmV0dXJuIHNraXA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2xlYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiAoYnl0ZUJ1ZmZlci5nZXQoKSA9PSAxKSA/IHRydWUgOiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkVW5zaWduZWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgY2ggPSBieXRlQnVmZmVyLmdldCgpOworICAgIGlmIChjaCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKKyAgICB9CisgICAgcmV0dXJuIGNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBieXRlQnVmZmVyLmdldFNob3J0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkVW5zaWduZWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0U2hvcnQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0Q2hhcigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0SW50KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgcmVhZExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBieXRlQnVmZmVyLmdldExvbmcoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlci5nZXRGbG9hdCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIuZ2V0RG91YmxlKCk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGphdmFSZWFkZXIucmVhZExpbmUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlYWRVVEYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBqYXZhUmVhZGVyLnJlYWRVVEYoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3VwZXIuY2xvc2UoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBoYXNVblJlYWREYXRhKCkgeworICAgIHJldHVybiBudWxsICE9IGJ5dGVCdWZmZXIgJiYgYnl0ZUJ1ZmZlci5oYXNSZW1haW5pbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvQnl0ZUJ1ZmZlckRhdGFXcml0ZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0J5dGVCdWZmZXJEYXRhV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4Zjc4YgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0J5dGVCdWZmZXJEYXRhV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVEYXRhVGFyZ2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCisvKioKKyAqIERhdGFPdXRwdXRTdHJlYW0gaW1wbGVtZW50YXRpb24gd2hpY2ggYnVmZmVycyBkYXRhIGluIGEgZml4ZWQtc2l6ZQorICogQnl0ZUJ1ZmZlci4KKyAqIFdoZW4gdGhlIGJ5dGUgYnVmZmVyIGhhcyBmaWxsZWQgdXAsIHN5bmNocm9ub3VzbHkgcGFzc2VzIHRoZSBidWZmZXIKKyAqIHRvIGEgZG93bnN0cmVhbSBOYXRpdmVEYXRhVGFyZ2V0LgorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJEYXRhV3JpdGVyIGV4dGVuZHMgRGF0YU91dHB1dFN0cmVhbSB7CisgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7CisgIHByaXZhdGUgZmluYWwgTmF0aXZlRGF0YVRhcmdldCB0YXJnZXQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBUUlVFID0gKGJ5dGUpIDE7CisgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgRkFMU0UgPSAoYnl0ZSkgMDsKKyAgcHJpdmF0ZSBmaW5hbCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW0gamF2YVdyaXRlcjsKKworICBwcml2YXRlIHZvaWQgY2hlY2tTaXplQW5kRmx1c2hJZk5lY2Vzc2FyeShpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChidWZmZXIucG9zaXRpb24oKSA+IDAgJiYgYnVmZmVyLnJlbWFpbmluZygpIDwgbGVuZ3RoKSB7CisgICAgICBmbHVzaCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBCeXRlQnVmZmVyRGF0YVdyaXRlcihOYXRpdmVEYXRhVGFyZ2V0IGhhbmRsZXIpIHsKKyAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChoYW5kbGVyKTsKKyAgICB0aGlzLmJ1ZmZlciA9IGhhbmRsZXIuZ2V0T3V0cHV0QnVmZmVyKCkuZ2V0Qnl0ZUJ1ZmZlcigpOworICAgIHRoaXMudGFyZ2V0ID0gaGFuZGxlcjsKKyAgICB0aGlzLmphdmFXcml0ZXIgPSBuZXcgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtKHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBjaGVja1NpemVBbmRGbHVzaElmTmVjZXNzYXJ5KDEpOworICAgIGJ1ZmZlci5wdXQoKGJ5dGUpIHYpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHNob3J0T2ZTcGFjZShpbnQgZGF0YUxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgZGF0YUxlbmd0aCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHJlbWFpbiA9IGxlbjsKKyAgICBpbnQgb2Zmc2V0ID0gb2ZmOworICAgIHdoaWxlIChyZW1haW4gPiAwKSB7CisgICAgICBpbnQgY3VycmVudEZsdXNoID0gMDsKKyAgICAgIGlmIChidWZmZXIucmVtYWluaW5nKCkgPiAwKSB7CisgICAgICAgIGN1cnJlbnRGbHVzaCA9IE1hdGgubWluKGJ1ZmZlci5yZW1haW5pbmcoKSwgcmVtYWluKTsKKyAgICAgICAgYnVmZmVyLnB1dChiLCBvZmZzZXQsIGN1cnJlbnRGbHVzaCk7CisgICAgICAgIHJlbWFpbiAtPSBjdXJyZW50Rmx1c2g7CisgICAgICAgIG9mZnNldCArPSBjdXJyZW50Rmx1c2g7CisgICAgICB9IGVsc2UgeworICAgICAgICBmbHVzaCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGFyZ2V0LnNlbmREYXRhKCk7CisgICAgYnVmZmVyLnBvc2l0aW9uKDApOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoaGFzVW5GbHVzaGVkRGF0YSgpKSB7CisgICAgICBmbHVzaCgpOworICAgIH0KKyAgICB0YXJnZXQuZmluaXNoU2VuZERhdGEoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJvb2xlYW4oYm9vbGVhbiB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU2l6ZUFuZEZsdXNoSWZOZWNlc3NhcnkoMSk7CisgICAgYnVmZmVyLnB1dCh2ID8gVFJVRSA6IEZBTFNFKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGUoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY2hlY2tTaXplQW5kRmx1c2hJZk5lY2Vzc2FyeSgxKTsKKyAgICBidWZmZXIucHV0KChieXRlKSB2KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNob3J0KGludCB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU2l6ZUFuZEZsdXNoSWZOZWNlc3NhcnkoMik7CisgICAgYnVmZmVyLnB1dFNob3J0KChzaG9ydCkgdik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVDaGFyKGludCB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU2l6ZUFuZEZsdXNoSWZOZWNlc3NhcnkoMik7CisgICAgYnVmZmVyLnB1dCgoYnl0ZSkgKCh2ID4+PiA4KSAmIDB4RkYpKTsKKyAgICBidWZmZXIucHV0KChieXRlKSAoKHYgPj4+IDApICYgMHhGRikpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlSW50KGludCB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU2l6ZUFuZEZsdXNoSWZOZWNlc3NhcnkoNCk7CisgICAgYnVmZmVyLnB1dEludCh2KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUxvbmcobG9uZyB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU2l6ZUFuZEZsdXNoSWZOZWNlc3NhcnkoOCk7CisgICAgYnVmZmVyLnB1dExvbmcodik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVGbG9hdChmbG9hdCB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU2l6ZUFuZEZsdXNoSWZOZWNlc3NhcnkoNCk7CisgICAgd3JpdGVJbnQoRmxvYXQuZmxvYXRUb0ludEJpdHModikpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU2l6ZUFuZEZsdXNoSWZOZWNlc3NhcnkoOCk7CisgICAgd3JpdGVMb25nKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHYpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGVzKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGphdmFXcml0ZXIud3JpdGVCeXRlcyhzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUNoYXJzKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGphdmFXcml0ZXIud3JpdGVDaGFycyhzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVURihTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGphdmFXcml0ZXIud3JpdGVVVEYoc3RyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBoYXNVbkZsdXNoZWREYXRhKCkgeworICAgIHJldHVybiBidWZmZXIucG9zaXRpb24oKSA+IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0RhdGFJbnB1dFN0cmVhbS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvRGF0YUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxN2VmNAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0RhdGFJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXI7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIGltcGxlbWVudHMgRGF0YUlucHV0IHsKKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzVW5SZWFkRGF0YSgpOworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvRGF0YU91dHB1dFN0cmVhbS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvRGF0YU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjlkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9EYXRhT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlcjsKKworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIERhdGFPdXRwdXQgeworICAvKioKKyAgICogQ2hlY2sgd2hldGhlciB0aGlzIGJ1ZmZlciBoYXMgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIGxlbmd0aCBvZiBieXRlcworICAgKiAKKyAgICogQHBhcmFtIGxlbmd0aCBsZW5ndGggb2YgYnl0ZXMKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNob3J0T2ZTcGFjZShpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgdW5mbHVzaGVkIGRhdGEgc3RvcmVkIGluIHRoZSBzdHJlYW0KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1VuRmx1c2hlZERhdGEoKTsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL0lucHV0QnVmZmVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9JbnB1dEJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjBjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9JbnB1dEJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLkRpcmVjdEJ1ZmZlclBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIElucHV0QnVmZmVyIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICBzdGF0aWMgRGlyZWN0QnVmZmVyUG9vbCBidWZmZXJQb29sID0gbmV3IERpcmVjdEJ1ZmZlclBvb2woKTsKKworICBwcml2YXRlIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcjsKKyAgcHJpdmF0ZSBmaW5hbCBCdWZmZXJUeXBlIHR5cGU7CisKKyAgcHVibGljIElucHV0QnVmZmVyKEJ1ZmZlclR5cGUgdHlwZSwgaW50IGlucHV0U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIGludCBjYXBhY2l0eSA9IGlucHV0U2l6ZTsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworCisgICAgaWYgKGNhcGFjaXR5ID4gMCkgeworCisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgRElSRUNUX0JVRkZFUjoKKyAgICAgICAgdGhpcy5ieXRlQnVmZmVyID0gYnVmZmVyUG9vbC5nZXRCdWZmZXIoY2FwYWNpdHkpOworICAgICAgICB0aGlzLmJ5dGVCdWZmZXIub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEVBUF9CVUZGRVI6CisgICAgICAgIHRoaXMuYnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoY2FwYWNpdHkpOworICAgICAgICB0aGlzLmJ5dGVCdWZmZXIub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICBieXRlQnVmZmVyLmxpbWl0KDApOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBCdWZmZXJUeXBlIGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHRoaXMudHlwZTsKKyAgfQorCisgIHB1YmxpYyBJbnB1dEJ1ZmZlcihieXRlW10gYnl0ZXMpIHsKKyAgICB0aGlzLnR5cGUgPSBCdWZmZXJUeXBlLkhFQVBfQlVGRkVSOworICAgIGlmIChieXRlcy5sZW5ndGggPiAwKSB7CisgICAgICB0aGlzLmJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgICAgdGhpcy5ieXRlQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKKyAgICAgIGJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICBieXRlQnVmZmVyLmxpbWl0KDApOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEJ5dGVCdWZmZXIoKSB7CisgICAgcmV0dXJuIHRoaXMuYnl0ZUJ1ZmZlcjsKKyAgfQorCisgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgeworICAgIGlmIChudWxsID09IGJ5dGVCdWZmZXIpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYnl0ZUJ1ZmZlci5saW1pdCgpOworICB9CisKKyAgcHVibGljIHZvaWQgcmV3aW5kKGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChudWxsID09IGJ5dGVCdWZmZXIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnl0ZUJ1ZmZlci5wb3NpdGlvbihzdGFydE9mZnNldCk7CisgICAgYnl0ZUJ1ZmZlci5saW1pdChsZW5ndGgpOworICB9CisKKyAgcHVibGljIGludCByZW1haW5pbmcoKSB7CisgICAgaWYgKG51bGwgPT0gYnl0ZUJ1ZmZlcikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBieXRlQnVmZmVyLnJlbWFpbmluZygpOworICB9CisKKyAgcHVibGljIGludCBwb3NpdGlvbigpIHsKKyAgICBpZiAobnVsbCA9PSBieXRlQnVmZmVyKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIucG9zaXRpb24oKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgcG9zaXRpb24oaW50IHBvcykgeworICAgIGlmIChudWxsID09IGJ5dGVCdWZmZXIpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJ5dGVCdWZmZXIucG9zaXRpb24ocG9zKTsKKyAgICByZXR1cm4gcG9zOworICB9CisKKyAgcHVibGljIGludCBjYXBhY2l0eSgpIHsKKyAgICBpZiAobnVsbCA9PSBieXRlQnVmZmVyKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVCdWZmZXIuY2FwYWNpdHkoKTsKKyAgfQorCisgIHB1YmxpYyBieXRlW10gYXJyYXkoKSB7CisgICAgaWYgKG51bGwgPT0gYnl0ZUJ1ZmZlcikgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBieXRlQnVmZmVyLmFycmF5KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKGJ5dGVCdWZmZXIgIT0gbnVsbCAmJiBieXRlQnVmZmVyLmlzRGlyZWN0KCkpIHsKKyAgICAgIGJ1ZmZlclBvb2wucmV0dXJuQnVmZmVyKGJ5dGVCdWZmZXIpOworICAgICAgYnl0ZUJ1ZmZlciA9IG51bGw7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9PdXRwdXRCdWZmZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL091dHB1dEJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzM5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9PdXRwdXRCdWZmZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXI7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBPdXRwdXRCdWZmZXIgeworICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyOworICBwcml2YXRlIGZpbmFsIEJ1ZmZlclR5cGUgdHlwZTsKKworICBwdWJsaWMgT3V0cHV0QnVmZmVyKEJ1ZmZlclR5cGUgdHlwZSwgaW50IG91dHB1dEJ1ZmZlckNhcGFjaXR5KSB7CisKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIGlmIChvdXRwdXRCdWZmZXJDYXBhY2l0eSA+IDApIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBESVJFQ1RfQlVGRkVSOgorICAgICAgICB0aGlzLmJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KG91dHB1dEJ1ZmZlckNhcGFjaXR5KTsKKyAgICAgICAgdGhpcy5ieXRlQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhFQVBfQlVGRkVSOgorICAgICAgICB0aGlzLmJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKG91dHB1dEJ1ZmZlckNhcGFjaXR5KTsKKyAgICAgICAgdGhpcy5ieXRlQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIE91dHB1dEJ1ZmZlcihieXRlW10gYnl0ZXMpIHsKKyAgICB0aGlzLnR5cGUgPSBCdWZmZXJUeXBlLkhFQVBfQlVGRkVSOworICAgIGZpbmFsIGludCBvdXRwdXRCdWZmZXJDYXBhY2l0eSA9IGJ5dGVzLmxlbmd0aDsKKyAgICBpZiAob3V0cHV0QnVmZmVyQ2FwYWNpdHkgPiAwKSB7CisgICAgICB0aGlzLmJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgICAgdGhpcy5ieXRlQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKKyAgICAgIHRoaXMuYnl0ZUJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgQnVmZmVyVHlwZSBnZXRUeXBlKCkgeworICAgIHJldHVybiB0aGlzLnR5cGU7CisgIH0KKworICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlQnVmZmVyKCkgeworICAgIHJldHVybiB0aGlzLmJ5dGVCdWZmZXI7CisgIH0KKworICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlci5wb3NpdGlvbigpOworICB9CisKKyAgcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgIGJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgIH0KKworICBwdWJsaWMgaW50IGxpbWl0KCkgeworICAgIHJldHVybiBieXRlQnVmZmVyLmxpbWl0KCk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL0J1ZmZlclB1bGxlZS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdWxsZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmQ3YTA0Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdWxsZWUuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmhhbmRsZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5SYXdLZXlWYWx1ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVEYXRhVGFyZ2V0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5CeXRlQnVmZmVyRGF0YVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXIuT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlLktWU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLlNpemVkV3JpdGFibGU7CisKKy8qKgorICogbG9hZCBkYXRhIGludG8gYSBidWZmZXIgc2lnbmFsZWQgYnkgYSB7QGxpbmsgQnVmZmVyUHVsbGVyfQorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIEJ1ZmZlclB1bGxlZTxJSywgSVY+IGltcGxlbWVudHMgSURhdGFMb2FkZXIgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtWX0hFQURFUl9MRU5HVEggPSBDb25zdGFudHMuU0laRU9GX0tWX0xFTkdUSDsKKworICBwcml2YXRlIGZpbmFsIFNpemVkV3JpdGFibGU8SUs+IHRtcElucHV0S2V5OworICBwcml2YXRlIGZpbmFsIFNpemVkV3JpdGFibGU8SVY+IHRtcElucHV0VmFsdWU7CisgIHByaXZhdGUgYm9vbGVhbiBpbnB1dEtWQnVmZmVyZCA9IGZhbHNlOworICBwcml2YXRlIFJhd0tleVZhbHVlSXRlcmF0b3Igckl0ZXI7CisgIHByaXZhdGUgQnl0ZUJ1ZmZlckRhdGFXcml0ZXIgbmF0aXZlV3JpdGVyOworICBwcm90ZWN0ZWQgS1ZTZXJpYWxpemVyPElLLCBJVj4gc2VyaWFsaXplcjsKKyAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRCdWZmZXIgb3V0cHV0QnVmZmVyOworICBwcml2YXRlIGZpbmFsIE5hdGl2ZURhdGFUYXJnZXQgdGFyZ2V0OworICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisgIAorICBwdWJsaWMgQnVmZmVyUHVsbGVlKENsYXNzPElLPiBpS0NsYXNzLCBDbGFzczxJVj4gaVZDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICBSYXdLZXlWYWx1ZUl0ZXJhdG9yIHJJdGVyLCBOYXRpdmVEYXRhVGFyZ2V0IHRhcmdldCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5ySXRlciA9IHJJdGVyOworICAgIHRtcElucHV0S2V5ID0gbmV3IFNpemVkV3JpdGFibGU8SUs+KGlLQ2xhc3MpOworICAgIHRtcElucHV0VmFsdWUgPSBuZXcgU2l6ZWRXcml0YWJsZTxJVj4oaVZDbGFzcyk7CisKKyAgICBpZiAobnVsbCAhPSBpS0NsYXNzICYmIG51bGwgIT0gaVZDbGFzcykgeworICAgICAgdGhpcy5zZXJpYWxpemVyID0gbmV3IEtWU2VyaWFsaXplcjxJSywgSVY+KGlLQ2xhc3MsIGlWQ2xhc3MpOworICAgIH0KKyAgICB0aGlzLm91dHB1dEJ1ZmZlciA9IHRhcmdldC5nZXRPdXRwdXRCdWZmZXIoKTsKKyAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChjbG9zZWQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBpZiAobnVsbCA9PSBvdXRwdXRCdWZmZXIpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigib3V0cHV0IGJ1ZmZlciBub3Qgc2V0Iik7CisgICAgfQorCisgICAgdGhpcy5uYXRpdmVXcml0ZXIgPSBuZXcgQnl0ZUJ1ZmZlckRhdGFXcml0ZXIodGFyZ2V0KTsKKyAgICBvdXRwdXRCdWZmZXIucmV3aW5kKCk7CisKKyAgICBpbnQgd3JpdHRlbiA9IDA7CisgICAgYm9vbGVhbiBmaXJzdEtWID0gdHJ1ZTsKKworICAgIGlmIChpbnB1dEtWQnVmZmVyZCkgeworICAgICAgd3JpdHRlbiArPSBzZXJpYWxpemVyLnNlcmlhbGl6ZUtWKG5hdGl2ZVdyaXRlciwgdG1wSW5wdXRLZXksIHRtcElucHV0VmFsdWUpOworICAgICAgaW5wdXRLVkJ1ZmZlcmQgPSBmYWxzZTsKKyAgICAgIGZpcnN0S1YgPSBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAockl0ZXIubmV4dCgpKSB7CisgICAgICBpbnB1dEtWQnVmZmVyZCA9IGZhbHNlOworICAgICAgdG1wSW5wdXRLZXkucmVhZEZpZWxkcyhySXRlci5nZXRLZXkoKSk7CisgICAgICB0bXBJbnB1dFZhbHVlLnJlYWRGaWVsZHMockl0ZXIuZ2V0VmFsdWUoKSk7CisgICAgICBzZXJpYWxpemVyLnVwZGF0ZUxlbmd0aCh0bXBJbnB1dEtleSwgdG1wSW5wdXRWYWx1ZSk7CisKKyAgICAgIGZpbmFsIGludCBrdlNpemUgPSB0bXBJbnB1dEtleS5sZW5ndGggKyB0bXBJbnB1dFZhbHVlLmxlbmd0aCArIEtWX0hFQURFUl9MRU5HVEg7CisKKyAgICAgIGlmICghZmlyc3RLViAmJiBuYXRpdmVXcml0ZXIuc2hvcnRPZlNwYWNlKGt2U2l6ZSkpIHsKKyAgICAgICAgaW5wdXRLVkJ1ZmZlcmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXR0ZW4gKz0gc2VyaWFsaXplci5zZXJpYWxpemVLVihuYXRpdmVXcml0ZXIsIHRtcElucHV0S2V5LCB0bXBJbnB1dFZhbHVlKTsKKyAgICAgICAgZmlyc3RLViA9IGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChuYXRpdmVXcml0ZXIuaGFzVW5GbHVzaGVkRGF0YSgpKSB7CisgICAgICBuYXRpdmVXcml0ZXIuZmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIHdyaXR0ZW47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChjbG9zZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG51bGwgIT0gckl0ZXIpIHsKKyAgICAgIHJJdGVyLmNsb3NlKCk7CisgICAgfQorICAgIGlmIChudWxsICE9IG5hdGl2ZVdyaXRlcikgeworICAgICAgbmF0aXZlV3JpdGVyLmNsb3NlKCk7CisgICAgfQorICAgIGNsb3NlZCA9IHRydWU7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL0J1ZmZlclB1bGxlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdWxsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWRmZjkyCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdWxsZXIuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmhhbmRsZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uRGF0YUlucHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5SYXdLZXlWYWx1ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5EYXRhUmVjZWl2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suTmF0aXZlRGF0YVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXIuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXIuQnl0ZUJ1ZmZlckRhdGFSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyLklucHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLnV0aWwuUHJvZ3Jlc3M7CisKKy8qKgorICogYWN0aXZlbHkgc2lnbmFsIGEge0BsaW5rIEJ1ZmZlclB1bGxlZX0gdG8gbG9hZCBkYXRhIGludG8gYnVmZmVyIGFuZCByZWNlaXZlCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgQnVmZmVyUHVsbGVyIGltcGxlbWVudHMgUmF3S2V5VmFsdWVJdGVyYXRvciwgRGF0YVJlY2VpdmVyIHsKKyAgCisgIHByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhCdWZmZXJQdWxsZXIuY2xhc3MpOworCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEtWX0hFQURFUl9MRU5HVEggPSBDb25zdGFudHMuU0laRU9GX0tWX0xFTkdUSDsKKworICBieXRlW10ga2V5Qnl0ZXMgPSBuZXcgYnl0ZVswXTsKKyAgYnl0ZVtdIHZhbHVlQnl0ZXMgPSBuZXcgYnl0ZVswXTsKKworICBwcml2YXRlIElucHV0QnVmZmVyIGlucHV0QnVmZmVyOworICBwcml2YXRlIElucHV0QnVmZmVyIGFzaWRlQnVmZmVyOworCisgIGludCByZW1haW4gPSAwOworCisgIHByaXZhdGUgQnl0ZUJ1ZmZlckRhdGFSZWFkZXIgbmF0aXZlUmVhZGVyOworCisgIERhdGFJbnB1dEJ1ZmZlciBrZXlCdWZmZXIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKCk7CisgIERhdGFJbnB1dEJ1ZmZlciB2YWx1ZUJ1ZmZlciA9IG5ldyBEYXRhSW5wdXRCdWZmZXIoKTsKKworICBwcml2YXRlIGJvb2xlYW4gbm9Nb3JlRGF0YSA9IGZhbHNlOworCisgIHByaXZhdGUgTmF0aXZlRGF0YVNvdXJjZSBpbnB1dDsKKyAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgIHB1YmxpYyBCdWZmZXJQdWxsZXIoTmF0aXZlRGF0YVNvdXJjZSBoYW5kbGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMuaW5wdXQgPSBoYW5kbGVyOworICAgIHRoaXMuaW5wdXRCdWZmZXIgPSBoYW5kbGVyLmdldElucHV0QnVmZmVyKCk7CisgICAgbmF0aXZlUmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJEYXRhUmVhZGVyKG51bGwpOworICAgIHRoaXMuYXNpZGVCdWZmZXIgPSBuZXcgSW5wdXRCdWZmZXIoQnVmZmVyVHlwZS5IRUFQX0JVRkZFUiwgaW5wdXRCdWZmZXIuY2FwYWNpdHkoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFJbnB1dEJ1ZmZlciBnZXRLZXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBrZXlCdWZmZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFJbnB1dEJ1ZmZlciBnZXRWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHZhbHVlQnVmZmVyOworICB9CisgIAorICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICBub01vcmVEYXRhID0gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGNsb3NlZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBpZiAobm9Nb3JlRGF0YSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmaW5hbCBpbnQgYXNpZGVSZW1haW4gPSBhc2lkZUJ1ZmZlci5yZW1haW5pbmcoKTsKKyAgICBmaW5hbCBpbnQgaW5wdXRSZW1haW4gPSBpbnB1dEJ1ZmZlci5yZW1haW5pbmcoKTsKKworICAgIGlmIChhc2lkZVJlbWFpbiA9PSAwICYmIGlucHV0UmVtYWluID09IDApIHsKKyAgICAgIGlucHV0LmxvYWREYXRhKCk7CisgICAgfQorCisgICAgaWYgKGFzaWRlQnVmZmVyLnJlbWFpbmluZygpID4gMCkgeworICAgICAgcmV0dXJuIG5leHRLZXlWYWx1ZShhc2lkZUJ1ZmZlcik7CisgICAgfSBlbHNlIGlmIChpbnB1dEJ1ZmZlci5yZW1haW5pbmcoKSA+IDApIHsKKyAgICAgIHJldHVybiBuZXh0S2V5VmFsdWUoaW5wdXRCdWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICBub01vcmVEYXRhID0gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gbmV4dEtleVZhbHVlKElucHV0QnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoY2xvc2VkKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIG5hdGl2ZVJlYWRlci5yZXNldChidWZmZXIpOworCisgICAgZmluYWwgaW50IGtleUxlbmd0aCA9IG5hdGl2ZVJlYWRlci5yZWFkSW50KCk7CisgICAgaWYgKGtleUJ5dGVzLmxlbmd0aCA8IGtleUxlbmd0aCkgeworICAgICAga2V5Qnl0ZXMgPSBuZXcgYnl0ZVtrZXlMZW5ndGhdOworICAgIH0KKworICAgIGZpbmFsIGludCB2YWx1ZUxlbmd0aCA9IG5hdGl2ZVJlYWRlci5yZWFkSW50KCk7CisgICAgaWYgKHZhbHVlQnl0ZXMubGVuZ3RoIDwgdmFsdWVMZW5ndGgpIHsKKyAgICAgIHZhbHVlQnl0ZXMgPSBuZXcgYnl0ZVt2YWx1ZUxlbmd0aF07CisgICAgfQorICAgIAorICAgIElPVXRpbHMucmVhZEZ1bGx5KG5hdGl2ZVJlYWRlciwga2V5Qnl0ZXMsIDAsIGtleUxlbmd0aCk7CisgICAgSU9VdGlscy5yZWFkRnVsbHkobmF0aXZlUmVhZGVyLCB2YWx1ZUJ5dGVzLCAwLCB2YWx1ZUxlbmd0aCk7CisKKyAgICBrZXlCdWZmZXIucmVzZXQoa2V5Qnl0ZXMsIGtleUxlbmd0aCk7CisgICAgdmFsdWVCdWZmZXIucmVzZXQodmFsdWVCeXRlcywgdmFsdWVMZW5ndGgpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gcmVjZWl2ZURhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChjbG9zZWQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCA9IGlucHV0QnVmZmVyLmdldEJ5dGVCdWZmZXIoKTsKKyAgICAKKyAgICBpZiAobnVsbCAhPSBhc2lkZUJ1ZmZlciAmJiBhc2lkZUJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgIGlmIChhc2lkZUJ1ZmZlci5yZW1haW5pbmcoKSA+IDApIHsKKyAgICAgICAgZmluYWwgYnl0ZVtdIG91dHB1dCA9IGFzaWRlQnVmZmVyLmdldEJ5dGVCdWZmZXIoKS5hcnJheSgpOworICAgICAgICBmaW5hbCBpbnQgd3JpdGUgPSBNYXRoLm1pbihhc2lkZUJ1ZmZlci5yZW1haW5pbmcoKSwgaW5wdXQucmVtYWluaW5nKCkpOworICAgICAgICBpbnB1dC5nZXQob3V0cHV0LCBhc2lkZUJ1ZmZlci5wb3NpdGlvbigpLCB3cml0ZSk7CisgICAgICAgIGFzaWRlQnVmZmVyLnBvc2l0aW9uKGFzaWRlQnVmZmVyLnBvc2l0aW9uKCkgKyB3cml0ZSk7CisgICAgICB9CisKKyAgICAgIGlmIChhc2lkZUJ1ZmZlci5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgIGFzaWRlQnVmZmVyLnBvc2l0aW9uKDApOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dC5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQucmVtYWluaW5nKCkgPCBLVl9IRUFERVJfTEVOR1RIKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImluY29tcGxldGUgZGF0YSwgaW5wdXQgbGVuZ3RoIGlzOiAiICsgaW5wdXQucmVtYWluaW5nKCkpOworICAgIH0KKyAgICBmaW5hbCBpbnQgcG9zaXRpb24gPSBpbnB1dC5wb3NpdGlvbigpOworICAgIGZpbmFsIGludCBrZXlMZW5ndGggPSBpbnB1dC5nZXRJbnQoKTsKKyAgICBmaW5hbCBpbnQgdmFsdWVMZW5ndGggPSBpbnB1dC5nZXRJbnQoKTsKKyAgICBpbnB1dC5wb3NpdGlvbihwb3NpdGlvbik7CisgICAgZmluYWwgaW50IGt2TGVuZ3RoID0ga2V5TGVuZ3RoICsgdmFsdWVMZW5ndGggKyBLVl9IRUFERVJfTEVOR1RIOworICAgIGZpbmFsIGludCByZW1haW5pbmcgPSBpbnB1dC5yZW1haW5pbmcoKTsKKworICAgIGlmIChrdkxlbmd0aCA+IHJlbWFpbmluZykgeworICAgICAgaWYgKG51bGwgPT0gYXNpZGVCdWZmZXIgfHwgYXNpZGVCdWZmZXIuY2FwYWNpdHkoKSA8IGt2TGVuZ3RoKSB7CisgICAgICAgIGFzaWRlQnVmZmVyID0gbmV3IElucHV0QnVmZmVyKEJ1ZmZlclR5cGUuSEVBUF9CVUZGRVIsIGt2TGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGFzaWRlQnVmZmVyLnJld2luZCgwLCBrdkxlbmd0aCk7CisKKyAgICAgIGlucHV0LmdldChhc2lkZUJ1ZmZlci5hcnJheSgpLCAwLCByZW1haW5pbmcpOworICAgICAgYXNpZGVCdWZmZXIucG9zaXRpb24ocmVtYWluaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByb2dyZXNzIGdldFByb2dyZXNzKCkgeworICAgIHJldHVybiBudWxsOworICB9CisgIAorICAvKioKKyAgICogQ2xvc2VzIHRoZSBpdGVyYXRvciBzbyB0aGF0IHRoZSB1bmRlcmx5aW5nIHN0cmVhbXMgY2FuIGJlIGNsb3NlZC4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGNsb3NlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobnVsbCAhPSBuYXRpdmVSZWFkZXIpIHsKKyAgICAgIG5hdGl2ZVJlYWRlci5jbG9zZSgpOworICAgIH0KKyAgICBjbG9zZWQgPSB0cnVlOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL0J1ZmZlclB1c2hlZS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdXNoZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA4ODJkCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdXNoZWUuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmhhbmRsZXJzOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlY29yZFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyLkJ1ZmZlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyLkJ5dGVCdWZmZXJEYXRhUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5JbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZS5LVlNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5TaXplZFdyaXRhYmxlOworCisvKioKKyAqIGNvbGxlY3QgZGF0YSB3aGVuIHNpZ25hbGVkCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgQnVmZmVyUHVzaGVlPE9LLCBPVj4gaW1wbGVtZW50cyBDbG9zZWFibGUgeworCisgIHByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhCdWZmZXJQdXNoZWUuY2xhc3MpOworICAKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgS1ZfSEVBREVSX0xFTkdUSCA9IENvbnN0YW50cy5TSVpFT0ZfS1ZfTEVOR1RIOworCisgIHByaXZhdGUgSW5wdXRCdWZmZXIgYXNpZGVCdWZmZXI7CisgIHByaXZhdGUgZmluYWwgU2l6ZWRXcml0YWJsZTxPSz4gdG1wT3V0cHV0S2V5OworICBwcml2YXRlIGZpbmFsIFNpemVkV3JpdGFibGU8T1Y+IHRtcE91dHB1dFZhbHVlOworICBwcml2YXRlIFJlY29yZFdyaXRlcjxPSywgT1Y+IHdyaXRlcjsKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyRGF0YVJlYWRlciBuYXRpdmVSZWFkZXI7CisKKyAgcHJpdmF0ZSBLVlNlcmlhbGl6ZXI8T0ssIE9WPiBkZXNlcmlhbGl6ZXI7CisgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICBwdWJsaWMgQnVmZmVyUHVzaGVlKENsYXNzPE9LPiBvS0NsYXNzLCBDbGFzczxPVj4gb1ZDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRXcml0ZXI8T0ssIE9WPiB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdG1wT3V0cHV0S2V5ID0gbmV3IFNpemVkV3JpdGFibGU8T0s+KG9LQ2xhc3MpOworICAgIHRtcE91dHB1dFZhbHVlID0gbmV3IFNpemVkV3JpdGFibGU8T1Y+KG9WQ2xhc3MpOworCisgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisKKyAgICBpZiAobnVsbCAhPSBvS0NsYXNzICYmIG51bGwgIT0gb1ZDbGFzcykgeworICAgICAgdGhpcy5kZXNlcmlhbGl6ZXIgPSBuZXcgS1ZTZXJpYWxpemVyPE9LLCBPVj4ob0tDbGFzcywgb1ZDbGFzcyk7CisgICAgfQorICAgIHRoaXMubmF0aXZlUmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJEYXRhUmVhZGVyKG51bGwpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY29sbGVjdChJbnB1dEJ1ZmZlciBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGNsb3NlZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBCeXRlQnVmZmVyIGlucHV0ID0gYnVmZmVyLmdldEJ5dGVCdWZmZXIoKTsKKyAgICBpZiAobnVsbCAhPSBhc2lkZUJ1ZmZlciAmJiBhc2lkZUJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgIGlmIChhc2lkZUJ1ZmZlci5yZW1haW5pbmcoKSA+IDApIHsKKyAgICAgICAgZmluYWwgYnl0ZVtdIG91dHB1dCA9IGFzaWRlQnVmZmVyLmdldEJ5dGVCdWZmZXIoKS5hcnJheSgpOworICAgICAgICBmaW5hbCBpbnQgd3JpdGUgPSBNYXRoLm1pbihhc2lkZUJ1ZmZlci5yZW1haW5pbmcoKSwgaW5wdXQucmVtYWluaW5nKCkpOworICAgICAgICBpbnB1dC5nZXQob3V0cHV0LCBhc2lkZUJ1ZmZlci5wb3NpdGlvbigpLCB3cml0ZSk7CisgICAgICAgIGFzaWRlQnVmZmVyLnBvc2l0aW9uKGFzaWRlQnVmZmVyLnBvc2l0aW9uKCkgKyB3cml0ZSk7CisgICAgICB9CisKKyAgICAgIGlmIChhc2lkZUJ1ZmZlci5yZW1haW5pbmcoKSA9PSAwICYmIGFzaWRlQnVmZmVyLnBvc2l0aW9uKCkgPiAwKSB7CisgICAgICAgIGFzaWRlQnVmZmVyLnBvc2l0aW9uKDApOworICAgICAgICB3cml0ZShhc2lkZUJ1ZmZlcik7CisgICAgICAgIGFzaWRlQnVmZmVyLnJld2luZCgwLCAwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5wdXQucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGlucHV0LnJlbWFpbmluZygpIDwgS1ZfSEVBREVSX0xFTkdUSCkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJpbmNvbXBsZXRlIGRhdGEsIGlucHV0IGxlbmd0aCBpczogIiArIGlucHV0LnJlbWFpbmluZygpKTsKKyAgICB9CisgICAgZmluYWwgaW50IHBvc2l0aW9uID0gaW5wdXQucG9zaXRpb24oKTsKKyAgICBmaW5hbCBpbnQga2V5TGVuZ3RoID0gaW5wdXQuZ2V0SW50KCk7CisgICAgZmluYWwgaW50IHZhbHVlTGVuZ3RoID0gaW5wdXQuZ2V0SW50KCk7CisgICAgaW5wdXQucG9zaXRpb24ocG9zaXRpb24pOworICAgIGZpbmFsIGludCBrdkxlbmd0aCA9IGtleUxlbmd0aCArIHZhbHVlTGVuZ3RoICsgS1ZfSEVBREVSX0xFTkdUSDsKKyAgICBmaW5hbCBpbnQgcmVtYWluaW5nID0gaW5wdXQucmVtYWluaW5nKCk7CisKKyAgICBpZiAoa3ZMZW5ndGggPiByZW1haW5pbmcpIHsKKyAgICAgIGlmIChudWxsID09IGFzaWRlQnVmZmVyIHx8IGFzaWRlQnVmZmVyLmNhcGFjaXR5KCkgPCBrdkxlbmd0aCkgeworICAgICAgICBhc2lkZUJ1ZmZlciA9IG5ldyBJbnB1dEJ1ZmZlcihCdWZmZXJUeXBlLkhFQVBfQlVGRkVSLCBrdkxlbmd0aCk7CisgICAgICB9CisgICAgICBhc2lkZUJ1ZmZlci5yZXdpbmQoMCwga3ZMZW5ndGgpOworCisgICAgICBpbnB1dC5nZXQoYXNpZGVCdWZmZXIuYXJyYXkoKSwgMCwgcmVtYWluaW5nKTsKKyAgICAgIGFzaWRlQnVmZmVyLnBvc2l0aW9uKHJlbWFpbmluZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlKGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgYm9vbGVhbiB3cml0ZShJbnB1dEJ1ZmZlciBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoY2xvc2VkKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCB0b3RhbFJlYWQgPSAwOworICAgIGZpbmFsIGludCByZW1haW4gPSBpbnB1dC5yZW1haW5pbmcoKTsKKyAgICB0aGlzLm5hdGl2ZVJlYWRlci5yZXNldChpbnB1dCk7CisgICAgd2hpbGUgKHJlbWFpbiA+IHRvdGFsUmVhZCkgeworICAgICAgZmluYWwgaW50IHJlYWQgPSBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemVLVihuYXRpdmVSZWFkZXIsIHRtcE91dHB1dEtleSwgdG1wT3V0cHV0VmFsdWUpOworICAgICAgaWYgKHJlYWQgIT0gMCkgeworICAgICAgICB0b3RhbFJlYWQgKz0gcmVhZDsKKyAgICAgICAgd3JpdGVyLndyaXRlKChPSykgKHRtcE91dHB1dEtleS52KSwgKE9WKSAodG1wT3V0cHV0VmFsdWUudikpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVtYWluICE9IHRvdGFsUmVhZCkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJXZSBleHBlY3QgdG8gcmVhZCAiICsgcmVtYWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBidXQgd2UgYWN0dWFsbHkgcmVhZDogIiArIHRvdGFsUmVhZCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoY2xvc2VkKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChudWxsICE9IHdyaXRlcikgeworICAgICAgd3JpdGVyLmNsb3NlKG51bGwpOworICAgIH0KKyAgICBpZiAobnVsbCAhPSBuYXRpdmVSZWFkZXIpIHsKKyAgICAgIG5hdGl2ZVJlYWRlci5jbG9zZSgpOworICAgIH0KKyAgICBjbG9zZWQgPSB0cnVlOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL0J1ZmZlclB1c2hlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdXNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQxMjdjCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9CdWZmZXJQdXNoZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5oYW5kbGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLk5hdGl2ZURhdGFUYXJnZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyLkJ5dGVCdWZmZXJEYXRhV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlLklLVlNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGUuS1ZTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWwuU2l6ZWRXcml0YWJsZTsKKworLyoqCisgKiBhY3RpdmVseSBwdXNoIGRhdGEgaW50byBhIGJ1ZmZlciBhbmQgc2lnbmFsIGEge0BsaW5rIEJ1ZmZlclB1c2hlZX0gdG8gY29sbGVjdCBpdAorICovCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIEJ1ZmZlclB1c2hlcjxLLCBWPiBpbXBsZW1lbnRzIE91dHB1dENvbGxlY3RvcjxLLCBWPiB7CisgIAorICBwcml2YXRlIHN0YXRpYyBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQnVmZmVyUHVzaGVyLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFNpemVkV3JpdGFibGU8Sz4gdG1wSW5wdXRLZXk7CisgIHByaXZhdGUgZmluYWwgU2l6ZWRXcml0YWJsZTxWPiB0bXBJbnB1dFZhbHVlOworICBwcml2YXRlIEJ5dGVCdWZmZXJEYXRhV3JpdGVyIG91dDsKKyAgSUtWU2VyaWFsaXplciBzZXJpYWxpemVyOworICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgcHVibGljIEJ1ZmZlclB1c2hlcihDbGFzczxLPiBpS0NsYXNzLCBDbGFzczxWPiBpVkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZURhdGFUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRtcElucHV0S2V5ID0gbmV3IFNpemVkV3JpdGFibGU8Sz4oaUtDbGFzcyk7CisgICAgdG1wSW5wdXRWYWx1ZSA9IG5ldyBTaXplZFdyaXRhYmxlPFY+KGlWQ2xhc3MpOworCisgICAgaWYgKG51bGwgIT0gaUtDbGFzcyAmJiBudWxsICE9IGlWQ2xhc3MpIHsKKyAgICAgIHRoaXMuc2VyaWFsaXplciA9IG5ldyBLVlNlcmlhbGl6ZXI8SywgVj4oaUtDbGFzcywgaVZDbGFzcyk7CisgICAgfQorICAgIHRoaXMub3V0ID0gbmV3IEJ5dGVCdWZmZXJEYXRhV3JpdGVyKHRhcmdldCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjb2xsZWN0KEsga2V5LCBWIHZhbHVlLCBpbnQgcGFydGl0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRtcElucHV0S2V5LnJlc2V0KGtleSk7CisgICAgdG1wSW5wdXRWYWx1ZS5yZXNldCh2YWx1ZSk7CisgICAgc2VyaWFsaXplci5zZXJpYWxpemVQYXJ0aXRpb25LVihvdXQsIHBhcnRpdGlvbiwgdG1wSW5wdXRLZXksIHRtcElucHV0VmFsdWUpOworICB9OworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjb2xsZWN0KEsga2V5LCBWIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChjbG9zZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdG1wSW5wdXRLZXkucmVzZXQoa2V5KTsKKyAgICB0bXBJbnB1dFZhbHVlLnJlc2V0KHZhbHVlKTsKKyAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZUtWKG91dCwgdG1wSW5wdXRLZXksIHRtcElucHV0VmFsdWUpOworICB9OworCisgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAobnVsbCAhPSBvdXQpIHsKKyAgICAgIGlmIChvdXQuaGFzVW5GbHVzaGVkRGF0YSgpKSB7CisgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChjbG9zZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG51bGwgIT0gb3V0KSB7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisgICAgY2xvc2VkID0gdHJ1ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9Db21iaW5lckhhbmRsZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svaGFuZGxlcnMvQ29tYmluZXJIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhZWNhMQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svaGFuZGxlcnMvQ29tYmluZXJIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5oYW5kbGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuQ291bnRlcnMuQ291bnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSm9iQ29uZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGFzay5Db21iaW5lclJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5Db21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkNvbW1hbmREaXNwYXRjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5EYXRhQ2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5JQ29tYmluZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suSU5hdGl2ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suTmF0aXZlQmF0Y2hQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suVGFza0NvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGUuU2VyaWFsaXphdGlvbkZyYW1ld29yazsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLlJlYWRXcml0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuTVJKb2JDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tDb3VudGVyOworCitjbGFzcyBDb21iaW5lckhhbmRsZXI8SywgVj4gaW1wbGVtZW50cyBJQ29tYmluZUhhbmRsZXIsIENvbW1hbmREaXNwYXRjaGVyIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJOYXRpdmVUYXNrLkNvbWJpbmVIYW5kbGVyIjsKKyAgcHJpdmF0ZSBzdGF0aWMgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE5hdGl2ZUNvbGxlY3Rvck9ubHlIYW5kbGVyLmNsYXNzKTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIExPQUQgPSBuZXcgQ29tbWFuZCgxLCAiTG9hZCIpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgQ09NQklORSA9IG5ldyBDb21tYW5kKDQsICJDb21iaW5lIik7CisgIHB1YmxpYyBmaW5hbCBDb21iaW5lclJ1bm5lcjxLLCBWPiBjb21iaW5lclJ1bm5lcjsKKworICBwcml2YXRlIGZpbmFsIElOYXRpdmVIYW5kbGVyIG5hdGl2ZUhhbmRsZXI7CisgIHByaXZhdGUgZmluYWwgQnVmZmVyUHVsbGVyIHB1bGxlcjsKKyAgcHJpdmF0ZSBmaW5hbCBCdWZmZXJQdXNoZXI8SywgVj4ga3ZQdXNoZXI7CisgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICBwdWJsaWMgc3RhdGljIDxLLCBWPiBJQ29tYmluZUhhbmRsZXIgY3JlYXRlKFRhc2tDb250ZXh0IGNvbnRleHQpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBKb2JDb25mIGNvbmYgPSBuZXcgSm9iQ29uZihjb250ZXh0LmdldENvbmYoKSk7CisgICAgY29uZi5zZXQoQ29uc3RhbnRzLlNFUklBTElaQVRJT05fRlJBTUVXT1JLLAorICAgICAgICBTdHJpbmcudmFsdWVPZihTZXJpYWxpemF0aW9uRnJhbWV3b3JrLldSSVRBQkxFX1NFUklBTElaQVRJT04uZ2V0VHlwZSgpKSk7CisgICAgU3RyaW5nIGNvbWJpbmVyQ2xhenogPSBjb25mLmdldChDb25zdGFudHMuTUFQUkVEX0NPTUJJTkVSX0NMQVNTKTsKKyAgICBpZiAobnVsbCA9PSBjb21iaW5lckNsYXp6KSB7CisgICAgICBjb21iaW5lckNsYXp6ID0gY29uZi5nZXQoTVJKb2JDb25maWcuQ09NQklORV9DTEFTU19BVFRSKTsKKyAgICB9CisKKyAgICBpZiAobnVsbCA9PSBjb21iaW5lckNsYXp6KSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgTE9HLmluZm8oIk5hdGl2ZVRhc2sgQ29tYmluZXIgaXMgZW5hYmxlZCwgY2xhc3MgPSAiICsgY29tYmluZXJDbGF6eik7CisgICAgfQorCisgICAgZmluYWwgQ291bnRlciBjb21iaW5lSW5wdXRDb3VudGVyID0gY29udGV4dC5nZXRUYXNrUmVwb3J0ZXIoKS5nZXRDb3VudGVyKAorICAgICAgICBUYXNrQ291bnRlci5DT01CSU5FX0lOUFVUX1JFQ09SRFMpOworCisgICAgZmluYWwgQ29tYmluZXJSdW5uZXI8SywgVj4gY29tYmluZXJSdW5uZXIgPSBDb21iaW5lclJ1bm5lci5jcmVhdGUoCisgICAgICAgIGNvbmYsIGNvbnRleHQuZ2V0VGFza0F0dGVtcHRJZCgpLAorICAgICAgICBjb21iaW5lSW5wdXRDb3VudGVyLCBjb250ZXh0LmdldFRhc2tSZXBvcnRlcigpLCBudWxsKTsKKworICAgIGZpbmFsIElOYXRpdmVIYW5kbGVyIG5hdGl2ZUhhbmRsZXIgPSBOYXRpdmVCYXRjaFByb2Nlc3Nvci5jcmVhdGUoCisgICAgICBOQU1FLCBjb25mLCBEYXRhQ2hhbm5lbC5JTk9VVCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZmluYWwgQnVmZmVyUHVzaGVyPEssIFY+IHB1c2hlciA9IG5ldyBCdWZmZXJQdXNoZXI8SywgVj4oKENsYXNzPEs+KWNvbnRleHQuZ2V0SW5wdXRLZXlDbGFzcygpLAorICAgICAgICAoQ2xhc3M8Vj4pY29udGV4dC5nZXRJbnB1dFZhbHVlQ2xhc3MoKSwKKyAgICAgICAgbmF0aXZlSGFuZGxlcik7CisgICAgZmluYWwgQnVmZmVyUHVsbGVyIHB1bGxlciA9IG5ldyBCdWZmZXJQdWxsZXIobmF0aXZlSGFuZGxlcik7CisgICAgcmV0dXJuIG5ldyBDb21iaW5lckhhbmRsZXI8SywgVj4obmF0aXZlSGFuZGxlciwgY29tYmluZXJSdW5uZXIsIHB1bGxlciwgcHVzaGVyKTsKKyAgfQorCisgIHB1YmxpYyBDb21iaW5lckhhbmRsZXIoSU5hdGl2ZUhhbmRsZXIgbmF0aXZlSGFuZGxlciwgQ29tYmluZXJSdW5uZXI8SywgVj4gY29tYmluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyUHVsbGVyIHB1bGxlciwgQnVmZmVyUHVzaGVyPEssIFY+IGt2UHVzaGVyKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5uYXRpdmVIYW5kbGVyID0gbmF0aXZlSGFuZGxlcjsKKyAgICB0aGlzLmNvbWJpbmVyUnVubmVyID0gY29tYmluZXI7CisgICAgdGhpcy5wdWxsZXIgPSBwdWxsZXI7CisgICAgdGhpcy5rdlB1c2hlciA9IGt2UHVzaGVyOworICAgIG5hdGl2ZUhhbmRsZXIuc2V0Q29tbWFuZERpc3BhdGNoZXIodGhpcyk7CisgICAgbmF0aXZlSGFuZGxlci5zZXREYXRhUmVjZWl2ZXIocHVsbGVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVhZFdyaXRlQnVmZmVyIG9uQ2FsbChDb21tYW5kIGNvbW1hbmQsIFJlYWRXcml0ZUJ1ZmZlciBwYXJhbWV0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgaWYgKG51bGwgPT0gY29tbWFuZCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIGlmIChjb21tYW5kLmVxdWFscyhDT01CSU5FKSkgeworICAgICAgY29tYmluZSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvbWJpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgdHJ5IHsKKyAgICAgIHB1bGxlci5yZXNldCgpOworICAgICAgY29tYmluZXJSdW5uZXIuY29tYmluZShwdWxsZXIsIGt2UHVzaGVyKTsKKyAgICAgIGt2UHVzaGVyLmZsdXNoKCk7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgcmV0dXJuIG5hdGl2ZUhhbmRsZXIuZ2V0TmF0aXZlSGFuZGxlcigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGlmIChjbG9zZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobnVsbCAhPSBwdWxsZXIpIHsKKyAgICAgIHB1bGxlci5jbG9zZSgpOworICAgIH0KKworICAgIGlmIChudWxsICE9IGt2UHVzaGVyKSB7CisgICAgICBrdlB1c2hlci5jbG9zZSgpOworICAgIH0KKworICAgIGlmIChudWxsICE9IG5hdGl2ZUhhbmRsZXIpIHsKKyAgICAgIG5hdGl2ZUhhbmRsZXIuY2xvc2UoKTsKKyAgICB9CisgICAgY2xvc2VkID0gdHJ1ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9JRGF0YUxvYWRlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9JRGF0YUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYWYyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL0lEYXRhTG9hZGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suaGFuZGxlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKKy8qKgorICogYW4gSURhdGFMb2FkZXIgbG9hZHMgZGF0YSBvbiBkZW1hbmQKKyAqLworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBpbnRlcmZhY2UgSURhdGFMb2FkZXIgeworCisgIC8qKgorICAgKiBAcmV0dXJuIHNpemUgb2YgZGF0YSBsb2FkZWQKKyAgICovCisgIHB1YmxpYyBpbnQgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svaGFuZGxlcnMvTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svaGFuZGxlcnMvTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDIzOGFlCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9oYW5kbGVycy9OYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5oYW5kbGVyczsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGFza0F0dGVtcHRJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5Db21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkNvbW1hbmREaXNwYXRjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkRhdGFDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLklDb21iaW5lSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5JTmF0aXZlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVCYXRjaFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5UYXNrQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLk5hdGl2ZVRhc2tPdXRwdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5PdXRwdXRVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWwuUmVhZFdyaXRlQnVmZmVyOworCisvKioKKyAqIEphdmEgUmVjb3JkIFJlYWRlciArIEphdmEgTWFwcGVyICsgTmF0aXZlIENvbGxlY3RvcgorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXI8SywgVj4gaW1wbGVtZW50cyBDb21tYW5kRGlzcGF0Y2hlciwgQ2xvc2VhYmxlIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIk5hdGl2ZVRhc2suTUNvbGxlY3Rvck91dHB1dEhhbmRsZXIiOworICBwcml2YXRlIHN0YXRpYyBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIuY2xhc3MpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgR0VUX09VVFBVVF9QQVRIID0KKyAgICAgIG5ldyBDb21tYW5kKDEwMCwgIkdFVF9PVVRQVVRfUEFUSCIpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgR0VUX09VVFBVVF9JTkRFWF9QQVRIID0KKyAgICAgIG5ldyBDb21tYW5kKDEwMSwgIkdFVF9PVVRQVVRfSU5ERVhfUEFUSCIpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgR0VUX1NQSUxMX1BBVEggPQorICAgICAgbmV3IENvbW1hbmQoMTAyLCAiR0VUX1NQSUxMX1BBVEgiKTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIEdFVF9DT01CSU5FX0hBTkRMRVIgPQorICAgICAgbmV3IENvbW1hbmQoMTAzLCAiR0VUX0NPTUJJTkVfSEFORExFUiIpOworICAKKyAgcHJpdmF0ZSBOYXRpdmVUYXNrT3V0cHV0IG91dHB1dDsKKyAgcHJpdmF0ZSBpbnQgc3BpbGxOdW1iZXIgPSAwOworICBwcml2YXRlIElDb21iaW5lSGFuZGxlciBjb21iaW5lckhhbmRsZXIgPSBudWxsOworICBwcml2YXRlIGZpbmFsIEJ1ZmZlclB1c2hlcjxLLCBWPiBrdlB1c2hlcjsKKyAgcHJpdmF0ZSBmaW5hbCBJTmF0aXZlSGFuZGxlciBuYXRpdmVIYW5kbGVyOworICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgcHVibGljIHN0YXRpYyA8SywgVj4gTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXI8SywgVj4gY3JlYXRlKFRhc2tDb250ZXh0IGNvbnRleHQpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIAorICAgIElDb21iaW5lSGFuZGxlciBjb21iaW5lckhhbmRsZXIgPSBudWxsOworICAgIHRyeSB7CisgICAgICBmaW5hbCBUYXNrQ29udGV4dCBjb21iaW5lQ29udGV4dCA9IGNvbnRleHQuY29weU9mKCk7CisgICAgICBjb21iaW5lQ29udGV4dC5zZXRJbnB1dEtleUNsYXNzKGNvbnRleHQuZ2V0T3V0cHV0S2V5Q2xhc3MoKSk7CisgICAgICBjb21iaW5lQ29udGV4dC5zZXRJbnB1dFZhbHVlQ2xhc3MoY29udGV4dC5nZXRPdXRwdXRWYWx1ZUNsYXNzKCkpOworCisgICAgICBjb21iaW5lckhhbmRsZXIgPSBDb21iaW5lckhhbmRsZXIuY3JlYXRlKGNvbWJpbmVDb250ZXh0KTsKKyAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgCisgICAgaWYgKG51bGwgIT0gY29tYmluZXJIYW5kbGVyKSB7CisgICAgICBMT0cuaW5mbygiW05hdGl2ZUNvbGxlY3Rvck9ubHlIYW5kbGVyXSBjb21iaW5lciBpcyBub3QgbnVsbCIpOworICAgIH0KKworICAgIGZpbmFsIElOYXRpdmVIYW5kbGVyIG5hdGl2ZUhhbmRsZXIgPSBOYXRpdmVCYXRjaFByb2Nlc3Nvci5jcmVhdGUoCisgICAgICBOQU1FLCBjb250ZXh0LmdldENvbmYoKSwgRGF0YUNoYW5uZWwuT1VUKTsKKyAgICBmaW5hbCBCdWZmZXJQdXNoZXI8SywgVj4ga3ZQdXNoZXIgPSBuZXcgQnVmZmVyUHVzaGVyPEssIFY+KAorICAgICAgICAoQ2xhc3M8Sz4pY29udGV4dC5nZXRPdXRwdXRLZXlDbGFzcygpLAorICAgICAgICAoQ2xhc3M8Vj4pY29udGV4dC5nZXRPdXRwdXRWYWx1ZUNsYXNzKCksCisgICAgICAgIG5hdGl2ZUhhbmRsZXIpOworCisgICAgcmV0dXJuIG5ldyBOYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlcjxLLCBWPihjb250ZXh0LCBuYXRpdmVIYW5kbGVyLCBrdlB1c2hlciwgY29tYmluZXJIYW5kbGVyKTsKKyAgfQorCisgIHByb3RlY3RlZCBOYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlcihUYXNrQ29udGV4dCBjb250ZXh0LCBJTmF0aXZlSGFuZGxlciBuYXRpdmVIYW5kbGVyLAorICAgICAgQnVmZmVyUHVzaGVyPEssIFY+IGt2UHVzaGVyLCBJQ29tYmluZUhhbmRsZXIgY29tYmluZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQ29uZmlndXJhdGlvbiBjb25mID0gY29udGV4dC5nZXRDb25mKCk7CisgICAgVGFza0F0dGVtcHRJRCBpZCA9IGNvbnRleHQuZ2V0VGFza0F0dGVtcHRJZCgpOworICAgIGlmIChudWxsID09IGlkKSB7CisgICAgICB0aGlzLm91dHB1dCA9IE91dHB1dFV0aWwuY3JlYXRlTmF0aXZlVGFza091dHB1dChjb25mLCAiIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMub3V0cHV0ID0gT3V0cHV0VXRpbC5jcmVhdGVOYXRpdmVUYXNrT3V0cHV0KGNvbnRleHQuZ2V0Q29uZigpLCBjb250ZXh0LmdldFRhc2tBdHRlbXB0SWQoKQorICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgfQorICAgIHRoaXMuY29tYmluZXJIYW5kbGVyID0gY29tYmluZXI7CisgICAgdGhpcy5rdlB1c2hlciA9IGt2UHVzaGVyOworICAgIHRoaXMubmF0aXZlSGFuZGxlciA9IG5hdGl2ZUhhbmRsZXI7CisgICAgbmF0aXZlSGFuZGxlci5zZXRDb21tYW5kRGlzcGF0Y2hlcih0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNvbGxlY3QoSyBrZXksIFYgdmFsdWUsIGludCBwYXJ0aXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAga3ZQdXNoZXIuY29sbGVjdChrZXksIHZhbHVlLCBwYXJ0aXRpb24pOworICB9OworCisgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGNsb3NlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChudWxsICE9IGt2UHVzaGVyKSB7CisgICAgICBrdlB1c2hlci5jbG9zZSgpOworICAgIH0KKworICAgIGlmIChudWxsICE9IGNvbWJpbmVySGFuZGxlcikgeworICAgICAgY29tYmluZXJIYW5kbGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgaWYgKG51bGwgIT0gbmF0aXZlSGFuZGxlcikgeworICAgICAgbmF0aXZlSGFuZGxlci5jbG9zZSgpOworICAgIH0KKyAgICBjbG9zZWQgPSB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZWFkV3JpdGVCdWZmZXIgb25DYWxsKENvbW1hbmQgY29tbWFuZCwgUmVhZFdyaXRlQnVmZmVyIHBhcmFtZXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBQYXRoIHAgPSBudWxsOworICAgIGlmIChudWxsID09IGNvbW1hbmQpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAgICAgCisgICAgaWYgKGNvbW1hbmQuZXF1YWxzKEdFVF9PVVRQVVRfUEFUSCkpIHsKKyAgICAgIHAgPSBvdXRwdXQuZ2V0T3V0cHV0RmlsZUZvcldyaXRlKC0xKTsKKyAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKEdFVF9PVVRQVVRfSU5ERVhfUEFUSCkpIHsKKyAgICAgIHAgPSBvdXRwdXQuZ2V0T3V0cHV0SW5kZXhGaWxlRm9yV3JpdGUoLTEpOworICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoR0VUX1NQSUxMX1BBVEgpKSB7CisgICAgICBwID0gb3V0cHV0LmdldFNwaWxsRmlsZUZvcldyaXRlKHNwaWxsTnVtYmVyKyssIC0xKTsKKyAgICAgIAorICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoR0VUX0NPTUJJTkVfSEFORExFUikpIHsKKyAgICAgIGlmIChudWxsID09IGNvbWJpbmVySGFuZGxlcikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGZpbmFsIFJlYWRXcml0ZUJ1ZmZlciByZXN1bHQgPSBuZXcgUmVhZFdyaXRlQnVmZmVyKDgpOworICAgICAgCisgICAgICByZXN1bHQud3JpdGVMb25nKGNvbWJpbmVySGFuZGxlci5nZXRJZCgpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSWxsZWdhbCBjb21tYW5kOiAiICsgY29tbWFuZC50b1N0cmluZygpKTsKKyAgICB9CisgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgZmluYWwgUmVhZFdyaXRlQnVmZmVyIHJlc3VsdCA9IG5ldyBSZWFkV3JpdGVCdWZmZXIoKTsKKyAgICAgIHJlc3VsdC53cml0ZVN0cmluZyhwLnRvVXJpKCkuZ2V0UGF0aCgpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTWFwT3V0cHV0RmlsZSBjYW4ndCBhbGxvY2F0ZSBzcGlsbC9vdXRwdXQgZmlsZSIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9Cb29sV3JpdGFibGVTZXJpYWxpemVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0Jvb2xXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU4YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9Cb29sV3JpdGFibGVTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suSU5hdGl2ZUNvbXBhcmFibGU7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgQm9vbFdyaXRhYmxlU2VyaWFsaXplciBleHRlbmRzIERlZmF1bHRTZXJpYWxpemVyIGltcGxlbWVudHMKKyAgICBJTmF0aXZlQ29tcGFyYWJsZSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKFdyaXRhYmxlIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIDE7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0J5dGVXcml0YWJsZVNlcmlhbGl6ZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvQnl0ZVdyaXRhYmxlU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjllNjcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0J5dGVXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5JTmF0aXZlQ29tcGFyYWJsZTsKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBCeXRlV3JpdGFibGVTZXJpYWxpemVyIGV4dGVuZHMgRGVmYXVsdFNlcmlhbGl6ZXIgaW1wbGVtZW50cworICAgIElOYXRpdmVDb21wYXJhYmxlIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRMZW5ndGgoV3JpdGFibGUgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvQnl0ZXNXcml0YWJsZVNlcmlhbGl6ZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvQnl0ZXNXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRjY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9CeXRlc1dyaXRhYmxlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLklOYXRpdmVDb21wYXJhYmxlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIEJ5dGVzV3JpdGFibGVTZXJpYWxpemVyCisgIGltcGxlbWVudHMgSU5hdGl2ZUNvbXBhcmFibGUsIElOYXRpdmVTZXJpYWxpemVyPEJ5dGVzV3JpdGFibGU+IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRMZW5ndGgoQnl0ZXNXcml0YWJsZSB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiB3LmdldExlbmd0aCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShCeXRlc1dyaXRhYmxlIHcsIERhdGFPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIG91dC53cml0ZSh3LmdldEJ5dGVzKCksIDAsIHcuZ2V0TGVuZ3RoKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKERhdGFJbnB1dCBpbiwgaW50IGxlbmd0aCwgQnl0ZXNXcml0YWJsZSB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHcuc2V0U2l6ZShsZW5ndGgpOworICAgIGluLnJlYWRGdWxseSh3LmdldEJ5dGVzKCksIDAsIGxlbmd0aCk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0RlZmF1bHRTZXJpYWxpemVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0RlZmF1bHRTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlZjc3OQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvRGVmYXVsdFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZVN0YWJpbGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKKworQEludGVyZmFjZUF1ZGllbmNlLlB1YmxpYworQEludGVyZmFjZVN0YWJpbGl0eS5Fdm9sdmluZworcHVibGljIGNsYXNzIERlZmF1bHRTZXJpYWxpemVyIGltcGxlbWVudHMgSU5hdGl2ZVNlcmlhbGl6ZXI8V3JpdGFibGU+IHsKKworICBzdGF0aWMgY2xhc3MgTW9kaWZpZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0geworCisgICAgcHVibGljIGJ5dGVbXSBnZXRCdWZmZXIoKSB7CisgICAgICByZXR1cm4gdGhpcy5idWY7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBNb2RpZmllZEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRCdWZmZXIgPSBuZXcgTW9kaWZpZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgcHJpdmF0ZSBmaW5hbCBEYXRhT3V0cHV0U3RyZWFtIG91dERhdGEgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXRCdWZmZXIpOworICBwcml2YXRlIFdyaXRhYmxlIGJ1ZmZlcmVkID0gbnVsbDsKKyAgcHJpdmF0ZSBpbnQgYnVmZmVyZWRMZW5ndGggPSAtMTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRMZW5ndGgoV3JpdGFibGUgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBpZiAodyA9PSBidWZmZXJlZCkgeworICAgIC8vIHJldHVybiBidWZmZXJlZExlbmd0aDsKKyAgICAvLyB9CisgICAgYnVmZmVyZWQgPSBudWxsOworICAgIGJ1ZmZlcmVkTGVuZ3RoID0gLTE7CisKKyAgICBvdXRCdWZmZXIucmVzZXQoKTsKKyAgICB3LndyaXRlKG91dERhdGEpOworICAgIGJ1ZmZlcmVkTGVuZ3RoID0gb3V0QnVmZmVyLnNpemUoKTsKKyAgICBidWZmZXJlZCA9IHc7CisgICAgcmV0dXJuIGJ1ZmZlcmVkTGVuZ3RoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0YWJsZSB3LCBEYXRhT3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3LndyaXRlKG91dCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoRGF0YUlucHV0IGluLCBpbnQgbGVuZ3RoLCBXcml0YWJsZSB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHcucmVhZEZpZWxkcyhpbik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvRG91YmxlV3JpdGFibGVTZXJpYWxpemVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0RvdWJsZVdyaXRhYmxlU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzFmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0RvdWJsZVdyaXRhYmxlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLldyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLklOYXRpdmVDb21wYXJhYmxlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIERvdWJsZVdyaXRhYmxlU2VyaWFsaXplciBleHRlbmRzIERlZmF1bHRTZXJpYWxpemVyIGltcGxlbWVudHMKKyAgICBJTmF0aXZlQ29tcGFyYWJsZSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKFdyaXRhYmxlIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIDg7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0Zsb2F0V3JpdGFibGVTZXJpYWxpemVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0Zsb2F0V3JpdGFibGVTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyYzk1OQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvRmxvYXRXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5JTmF0aXZlQ29tcGFyYWJsZTsKKworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIEZsb2F0V3JpdGFibGVTZXJpYWxpemVyIGV4dGVuZHMgRGVmYXVsdFNlcmlhbGl6ZXIgaW1wbGVtZW50cworICAgIElOYXRpdmVDb21wYXJhYmxlIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRMZW5ndGgoV3JpdGFibGUgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gNDsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvSUtWU2VyaWFsaXplci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9JS1ZTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhMmVmNwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvSUtWU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5TaXplZFdyaXRhYmxlOworCisvKioKKyAqIHNlcmlhbGl6ZXMga2V5LXZhbHVlIHBhaXIKKyAqLworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBpbnRlcmZhY2UgSUtWU2VyaWFsaXplciB7CisKKyAgLyoqCisgICAqIHVwZGF0ZSB0aGUgbGVuZ3RoIGZpZWxkIG9mIFNpemVkV3JpdGFibGUKKyAgICovCisgIHB1YmxpYyB2b2lkIHVwZGF0ZUxlbmd0aChTaXplZFdyaXRhYmxlPD8+IGtleSwgU2l6ZWRXcml0YWJsZTw/PiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIHB1YmxpYyBpbnQgc2VyaWFsaXplS1YoRGF0YU91dHB1dFN0cmVhbSBvdXQsIFNpemVkV3JpdGFibGU8Pz4ga2V5LAorICAgICAgU2l6ZWRXcml0YWJsZTw/PiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIHB1YmxpYyBpbnQgc2VyaWFsaXplUGFydGl0aW9uS1YoRGF0YU91dHB1dFN0cmVhbSBvdXQsIGludCBwYXJ0aXRpb25JZCwKKyAgICAgIFNpemVkV3JpdGFibGU8Pz4ga2V5LCBTaXplZFdyaXRhYmxlPD8+IHZhbHVlKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIHB1YmxpYyBpbnQgZGVzZXJpYWxpemVLVihEYXRhSW5wdXRTdHJlYW0gaW4sIFNpemVkV3JpdGFibGU8Pz4ga2V5LCBTaXplZFdyaXRhYmxlPD8+IHZhbHVlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvSU5hdGl2ZVNlcmlhbGl6ZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvSU5hdGl2ZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTcwMzk0Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9JTmF0aXZlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlU3RhYmlsaXR5OworCisvKioKKyAqIGFuIElOYXRpdmVTZXJpYWxpemVyIHNlcmlhbGl6ZXMgYW5kIGRlc2VyaWFsaXplcyBkYXRhIHRyYW5zZmVycmVkIGJldHdlZW4KKyAqIEphdmEgYW5kIG5hdGl2ZS4ge0BsaW5rIERlZmF1bHRTZXJpYWxpemVyfSBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBOb3RlOiBpZiB5b3UgaW1wbGVtZW50ZWQgeW91ciBjdXN0b21pemVkIE5hdGl2ZVNlcmlhbGl6ZXIgaW5zdGVhZCBvZiBEZWZhdWx0U2VyaWFsaXplciwKKyAqIHlvdSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgbmF0aXZlIHNpZGUgY2FuIHNlcmlhbGl6ZSBpdCBjb3JyZWN0bHkuCisgKiAKKyAqLworQEludGVyZmFjZUF1ZGllbmNlLlB1YmxpYworQEludGVyZmFjZVN0YWJpbGl0eS5Fdm9sdmluZworcHVibGljIGludGVyZmFjZSBJTmF0aXZlU2VyaWFsaXplcjxUPiB7CisKKyAgLyoqCisgICAqIGdldCBsZW5ndGggb2YgZGF0YSB0byBiZSBzZXJpYWxpemVkLiBJZiB0aGUgZGF0YSBsZW5ndGggaXMgYWxyZWFkeSBrbm93biAobGlrZSBJbnRXcml0YWJsZSkKKyAgICogYW5kIGNvdWxkIGltbWVkaWF0ZWx5IGJlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QsIGl0IGlzIGdvb2QgY2hhbmNlIHRvIGltcGxlbWVudCBjdXN0b21pemVkCisgICAqIE5hdGl2ZVNlcmlhbGl6ZXIgZm9yIGVmZmljaWVuY3kKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKFQgdykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShUIHcsIERhdGFPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoRGF0YUlucHV0IGluLCBpbnQgbGVuZ3RoLCBUIHcpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvSW50V3JpdGFibGVTZXJpYWxpemVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0ludFdyaXRhYmxlU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWQxODIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0ludFdyaXRhYmxlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLldyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLklOYXRpdmVDb21wYXJhYmxlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIEludFdyaXRhYmxlU2VyaWFsaXplciBleHRlbmRzIERlZmF1bHRTZXJpYWxpemVyIGltcGxlbWVudHMKKyAgICBJTmF0aXZlQ29tcGFyYWJsZSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKFdyaXRhYmxlIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIDQ7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0tWU2VyaWFsaXplci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9LVlNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYwOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9LVlNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5TaXplZFdyaXRhYmxlOworCisKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBLVlNlcmlhbGl6ZXI8SywgVj4gaW1wbGVtZW50cyBJS1ZTZXJpYWxpemVyIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coS1ZTZXJpYWxpemVyLmNsYXNzKTsKKyAgCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtWX0hFQURfTEVOR1RIID0gQ29uc3RhbnRzLlNJWkVPRl9LVl9MRU5HVEg7CisKKyAgcHJpdmF0ZSBmaW5hbCBJTmF0aXZlU2VyaWFsaXplcjxXcml0YWJsZT4ga2V5U2VyaWFsaXplcjsKKyAgcHJpdmF0ZSBmaW5hbCBJTmF0aXZlU2VyaWFsaXplcjxXcml0YWJsZT4gdmFsdWVTZXJpYWxpemVyOworCisgIHB1YmxpYyBLVlNlcmlhbGl6ZXIoQ2xhc3M8Sz4ga2NsYXNzLCBDbGFzczxWPiB2Y2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgCisgICAgdGhpcy5rZXlTZXJpYWxpemVyID0gTmF0aXZlU2VyaWFsaXphdGlvbi5nZXRJbnN0YW5jZSgpLmdldFNlcmlhbGl6ZXIoa2NsYXNzKTsKKyAgICB0aGlzLnZhbHVlU2VyaWFsaXplciA9IE5hdGl2ZVNlcmlhbGl6YXRpb24uZ2V0SW5zdGFuY2UoKS5nZXRTZXJpYWxpemVyKHZjbGFzcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdXBkYXRlTGVuZ3RoKFNpemVkV3JpdGFibGU8Pz4ga2V5LCBTaXplZFdyaXRhYmxlPD8+IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGtleS5sZW5ndGggPSBrZXlTZXJpYWxpemVyLmdldExlbmd0aChrZXkudik7CisgICAgdmFsdWUubGVuZ3RoID0gdmFsdWVTZXJpYWxpemVyLmdldExlbmd0aCh2YWx1ZS52KTsKKyAgICByZXR1cm47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBzZXJpYWxpemVLVihEYXRhT3V0cHV0U3RyZWFtIG91dCwgU2l6ZWRXcml0YWJsZTw/PiBrZXksIFNpemVkV3JpdGFibGU8Pz4gdmFsdWUpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gc2VyaWFsaXplUGFydGl0aW9uS1Yob3V0LCAtMSwga2V5LCB2YWx1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBzZXJpYWxpemVQYXJ0aXRpb25LVihEYXRhT3V0cHV0U3RyZWFtIG91dCwgaW50IHBhcnRpdGlvbklkLAorICAgICAgU2l6ZWRXcml0YWJsZTw/PiBrZXksIFNpemVkV3JpdGFibGU8Pz4gdmFsdWUpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgaWYgKGtleS5sZW5ndGggPT0gU2l6ZWRXcml0YWJsZS5JTlZBTElEX0xFTkdUSCB8fAorICAgICAgICB2YWx1ZS5sZW5ndGggPT0gU2l6ZWRXcml0YWJsZS5JTlZBTElEX0xFTkdUSCkgeworICAgICAgdXBkYXRlTGVuZ3RoKGtleSwgdmFsdWUpOworICAgIH0KKworICAgIGZpbmFsIGludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOworICAgIGZpbmFsIGludCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aDsKKworICAgIGludCBieXRlc1dyaXR0ZW4gPSBLVl9IRUFEX0xFTkdUSCArIGtleUxlbmd0aCArIHZhbHVlTGVuZ3RoOworICAgIGlmIChwYXJ0aXRpb25JZCAhPSAtMSkgeworICAgICAgYnl0ZXNXcml0dGVuICs9IENvbnN0YW50cy5TSVpFT0ZfUEFSVElUSU9OX0xFTkdUSDsKKyAgICB9CisKKyAgICBpZiAob3V0Lmhhc1VuRmx1c2hlZERhdGEoKSAmJiBvdXQuc2hvcnRPZlNwYWNlKGJ5dGVzV3JpdHRlbikpIHsKKyAgICAgIG91dC5mbHVzaCgpOworICAgIH0KKworICAgIGlmIChwYXJ0aXRpb25JZCAhPSAtMSkgeworICAgICAgb3V0LndyaXRlSW50KHBhcnRpdGlvbklkKTsKKyAgICB9CisgICAgICAgIAorICAgIG91dC53cml0ZUludChrZXlMZW5ndGgpOworICAgIG91dC53cml0ZUludCh2YWx1ZUxlbmd0aCk7CisgICAgCisgICAga2V5U2VyaWFsaXplci5zZXJpYWxpemUoa2V5LnYsIG91dCk7CisgICAgdmFsdWVTZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZS52LCBvdXQpOworCisgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGRlc2VyaWFsaXplS1YoRGF0YUlucHV0U3RyZWFtIGluLCBTaXplZFdyaXRhYmxlPD8+IGtleSwKKyAgICAgIFNpemVkV3JpdGFibGU8Pz4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBpZiAoIWluLmhhc1VuUmVhZERhdGEoKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAga2V5Lmxlbmd0aCA9IGluLnJlYWRJbnQoKTsKKyAgICB2YWx1ZS5sZW5ndGggPSBpbi5yZWFkSW50KCk7CisKKyAgICBrZXlTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBrZXkubGVuZ3RoLCBrZXkudik7CisgICAgdmFsdWVTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2YWx1ZS5sZW5ndGgsIHZhbHVlLnYpOworCisgICAgcmV0dXJuIGtleS5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyBLVl9IRUFEX0xFTkdUSDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0xvbmdXcml0YWJsZVNlcmlhbGl6ZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvTG9uZ1dyaXRhYmxlU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTY1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL0xvbmdXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5JTmF0aXZlQ29tcGFyYWJsZTsKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBMb25nV3JpdGFibGVTZXJpYWxpemVyIGV4dGVuZHMgRGVmYXVsdFNlcmlhbGl6ZXIgaW1wbGVtZW50cworICAgIElOYXRpdmVDb21wYXJhYmxlIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKFdyaXRhYmxlIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIDg7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL05hdGl2ZVNlcmlhbGl6YXRpb24uamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvTmF0aXZlU2VyaWFsaXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmRlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL05hdGl2ZVNlcmlhbGl6YXRpb24uamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBOYXRpdmVTZXJpYWxpemF0aW9uIHsKKworICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1hcCA9CisgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisKKyAgcHVibGljIGJvb2xlYW4gYWNjZXB0KENsYXNzPD8+IGMpIHsKKyAgICByZXR1cm4gV3JpdGFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgSU5hdGl2ZVNlcmlhbGl6ZXI8V3JpdGFibGU+IGdldFNlcmlhbGl6ZXIoQ2xhc3M8Pz4gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGlmIChudWxsID09IGMpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBpZiAoIVdyaXRhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYykpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IHNlcmlhbGl6ZSB0eXBlICIgKyBjLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgd2Ugb25seSBhY2NlcHQgc3ViY2xhc3Mgb2YgV3JpdGFibGUiKTsKKyAgICB9CisgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBjLmdldE5hbWUoKTsKKyAgICBmaW5hbCBDbGFzczw/PiBzZXJpYWxpemVyID0gbWFwLmdldChuYW1lKTsKKworICAgIGlmIChudWxsICE9IHNlcmlhbGl6ZXIpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiAoSU5hdGl2ZVNlcmlhbGl6ZXI8V3JpdGFibGU+KSBzZXJpYWxpemVyLm5ld0luc3RhbmNlKCk7CisgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgRGVmYXVsdFNlcmlhbGl6ZXIoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyBrbGFzcywgQ2xhc3M8Pz4gc2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAobnVsbCA9PSBrbGFzcyB8fCBudWxsID09IHNlcmlhbGl6ZXIpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiaW52YWxpZCBhcmd1bWVudHMsIGtsYXNzIG9yIHNlcmlhbGl6ZXIgaXMgbnVsbCIpOworICAgIH0KKworICAgIGlmICghSU5hdGl2ZVNlcmlhbGl6ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzZXJpYWxpemVyKSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTZXJpYWxpemVyIGlzIG5vdCBhc3NpZ2FibGUgZnJvbSBJTmF0aXZlU2VyaWFsaXplciIpOworICAgIH0KKworICAgIGZpbmFsIENsYXNzPD8+IHN0b3JlZFNlcmlhbGl6ZXIgPSBtYXAuZ2V0KGtsYXNzKTsKKyAgICBpZiAobnVsbCA9PSBzdG9yZWRTZXJpYWxpemVyKSB7CisgICAgICBtYXAucHV0KGtsYXNzLCBzZXJpYWxpemVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFzdG9yZWRTZXJpYWxpemVyLmdldE5hbWUoKS5lcXVhbHMoc2VyaWFsaXplci5nZXROYW1lKCkpKSB7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IhIFNlcmlhbGl6ZXIgYWxyZWFkeSByZWdpc3RlcmVkLCBleGlzdGluZzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRTZXJpYWxpemVyLmdldE5hbWUoKSArICIsIG5ldzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmdldE5hbWUoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgbWFwLmNsZWFyKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBOYXRpdmVTZXJpYWxpemF0aW9uIGluc3RhbmNlID0gbmV3IE5hdGl2ZVNlcmlhbGl6YXRpb24oKTsKKworICBwdWJsaWMgc3RhdGljIE5hdGl2ZVNlcmlhbGl6YXRpb24gZ2V0SW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIGluc3RhbmNlOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9OdWxsV3JpdGFibGVTZXJpYWxpemVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL051bGxXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmU3Y2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9OdWxsV3JpdGFibGVTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suSU5hdGl2ZUNvbXBhcmFibGU7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgTnVsbFdyaXRhYmxlU2VyaWFsaXplciBleHRlbmRzIERlZmF1bHRTZXJpYWxpemVyIGltcGxlbWVudHMKKyAgICBJTmF0aXZlQ29tcGFyYWJsZSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKFdyaXRhYmxlIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvU2VyaWFsaXphdGlvbkZyYW1ld29yay5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9TZXJpYWxpemF0aW9uRnJhbWV3b3JrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlZTU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvU2VyaWFsaXphdGlvbkZyYW1ld29yay5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGVudW0gU2VyaWFsaXphdGlvbkZyYW1ld29yayB7CisgIFdSSVRBQkxFX1NFUklBTElaQVRJT04oMCksIE5BVElWRV9TRVJJQUxJWkFUSU9OKDEpOworCisgIHByaXZhdGUgaW50IHR5cGU7CisKKyAgU2VyaWFsaXphdGlvbkZyYW1ld29yayhpbnQgdHlwZSkgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KK307CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL1RleHRTZXJpYWxpemVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL1RleHRTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwMmRmZQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvVGV4dFNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5JTmF0aXZlQ29tcGFyYWJsZTsKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBUZXh0U2VyaWFsaXplciBpbXBsZW1lbnRzIElOYXRpdmVTZXJpYWxpemVyPFRleHQ+LCBJTmF0aXZlQ29tcGFyYWJsZSB7CisKKyAgcHVibGljIFRleHRTZXJpYWxpemVyKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKFRleHQgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdy5nZXRMZW5ndGgoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoVGV4dCB3LCBEYXRhT3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgb3V0LndyaXRlKHcuZ2V0Qnl0ZXMoKSwgMCwgdy5nZXRMZW5ndGgoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoRGF0YUlucHV0IGluLCBpbnQgbGVuZ3RoLCBUZXh0IHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdy5yZWFkV2l0aEtub3duTGVuZ3RoKGluLCBsZW5ndGgpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL1ZJbnRXcml0YWJsZVNlcmlhbGl6ZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvVkludFdyaXRhYmxlU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYmI5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL1ZJbnRXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLklOYXRpdmVDb21wYXJhYmxlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIFZJbnRXcml0YWJsZVNlcmlhbGl6ZXIgZXh0ZW5kcyBEZWZhdWx0U2VyaWFsaXplciBpbXBsZW1lbnRzCisgICAgSU5hdGl2ZUNvbXBhcmFibGUgeworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvVkxvbmdXcml0YWJsZVNlcmlhbGl6ZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvVkxvbmdXcml0YWJsZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQwYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9WTG9uZ1dyaXRhYmxlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnNlcmRlOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suSU5hdGl2ZUNvbXBhcmFibGU7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgVkxvbmdXcml0YWJsZVNlcmlhbGl6ZXIgZXh0ZW5kcyBEZWZhdWx0U2VyaWFsaXplciBpbXBsZW1lbnRzCisgICAgSU5hdGl2ZUNvbXBhcmFibGUgeworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbC9CeXRlc1V0aWwuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbC9CeXRlc1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY2OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlsL0J5dGVzVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgQnl0ZXNVdGlsIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0NIQVJTID0KKyAgICAgICIwMTIzNDU2Nzg5YWJjZGVmIi50b0NoYXJBcnJheSgpOworCisgIC8qKgorICAgKiBDb252ZXJ0cyBhIGJpZy1lbmRpYW4gYnl0ZSBhcnJheSB0byBhIGxvbmcgdmFsdWUuCisgICAqCisgICAqIEBwYXJhbSBieXRlcyBhcnJheSBvZiBieXRlcworICAgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCBpbnRvIGFycmF5CisgICAqLworICBwdWJsaWMgc3RhdGljIGxvbmcgdG9Mb25nKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCkgeworICAgIHJldHVybiBMb25ncy5mcm9tQnl0ZXMoYnl0ZXNbb2Zmc2V0XSwKKyAgICAgIGJ5dGVzW29mZnNldCArIDFdLAorICAgICAgYnl0ZXNbb2Zmc2V0ICsgMl0sCisgICAgICBieXRlc1tvZmZzZXQgKyAzXSwKKyAgICAgIGJ5dGVzW29mZnNldCArIDRdLAorICAgICAgYnl0ZXNbb2Zmc2V0ICsgNV0sCisgICAgICBieXRlc1tvZmZzZXQgKyA2XSwKKyAgICAgIGJ5dGVzW29mZnNldCArIDddKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0IGEgYmlnLWVuZGlhbiBpbnRlZ2VyIGZyb20gYSBieXRlIGFycmF5IHRvIGEgcHJpbWl0aXZlIHZhbHVlLgorICAgKiBAcGFyYW0gYnl0ZXMgdGhlIGFycmF5IHRvIHBhcnNlIGZyb20KKyAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgdG9JbnQoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0KSB7CisgICAgcmV0dXJuIEludHMuZnJvbUJ5dGVzKGJ5dGVzW29mZnNldF0sCisgICAgICBieXRlc1tvZmZzZXQgKyAxXSwKKyAgICAgIGJ5dGVzW29mZnNldCArIDJdLAorICAgICAgYnl0ZXNbb2Zmc2V0ICsgM10pOworICB9CisKKyAgLyoqCisgICAqIFByZXN1bWVzIGZsb2F0IGVuY29kZWQgYXMgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgInNpbmdsZSBmb3JtYXQiCisgICAqIEBwYXJhbSBieXRlcyBieXRlIGFycmF5CisgICAqIEByZXR1cm4gRmxvYXQgbWFkZSBmcm9tIHBhc3NlZCBieXRlIGFycmF5LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmbG9hdCB0b0Zsb2F0KGJ5dGUgW10gYnl0ZXMpIHsKKyAgICByZXR1cm4gdG9GbG9hdChieXRlcywgMCk7CisgIH0KKworICAvKioKKyAgICogUHJlc3VtZXMgZmxvYXQgZW5jb2RlZCBhcyBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCAic2luZ2xlIGZvcm1hdCIKKyAgICogQHBhcmFtIGJ5dGVzIGFycmF5IHRvIGNvbnZlcnQKKyAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW50byBhcnJheQorICAgKiBAcmV0dXJuIEZsb2F0IG1hZGUgZnJvbSBwYXNzZWQgYnl0ZSBhcnJheS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmxvYXQgdG9GbG9hdChieXRlIFtdIGJ5dGVzLCBpbnQgb2Zmc2V0KSB7CisgICAgcmV0dXJuIEZsb2F0LmludEJpdHNUb0Zsb2F0KHRvSW50KGJ5dGVzLCBvZmZzZXQpKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYnl0ZXMgYnl0ZSBhcnJheQorICAgKiBAcmV0dXJuIFJldHVybiBkb3VibGUgbWFkZSBmcm9tIHBhc3NlZCBieXRlcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHRvRG91YmxlKGZpbmFsIGJ5dGUgW10gYnl0ZXMpIHsKKyAgICByZXR1cm4gdG9Eb3VibGUoYnl0ZXMsIDApOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBieXRlcyBieXRlIGFycmF5CisgICAqIEBwYXJhbSBvZmZzZXQgb2Zmc2V0IHdoZXJlIGRvdWJsZSBpcworICAgKiBAcmV0dXJuIFJldHVybiBkb3VibGUgbWFkZSBmcm9tIHBhc3NlZCBieXRlcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHRvRG91YmxlKGZpbmFsIGJ5dGUgW10gYnl0ZXMsIGZpbmFsIGludCBvZmZzZXQpIHsKKyAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUodG9Mb25nKGJ5dGVzLCBvZmZzZXQpKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIGJ5dGUgYXJyYXkuCisgICAqCisgICAqIEBwYXJhbSBiIGJ5dGUgYXJyYXkKKyAgICogQHJldHVybiB0aGUgcHJpbnRhYmxlIHByZXNlbnRhdGlvbgorICAgKiBAc2VlICN0b1N0cmluZ0JpbmFyeShieXRlW10sIGludCwgaW50KQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdCaW5hcnkoZmluYWwgYnl0ZSBbXSBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkKKyAgICAgIHJldHVybiAibnVsbCI7CisgICAgcmV0dXJuIHRvU3RyaW5nQmluYXJ5KGIsIDAsIGIubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIGJ5dGUgYXJyYXkuIE5vbi1wcmludGFibGUKKyAgICogY2hhcmFjdGVycyBhcmUgaGV4IGVzY2FwZWQgaW4gdGhlIGZvcm1hdCBcXHglMDJYLCBlZzoKKyAgICogXHgwMCBceDA1IGV0YworICAgKgorICAgKiBAcGFyYW0gYiBhcnJheSB0byB3cml0ZSBvdXQKKyAgICogQHBhcmFtIG9mZiBvZmZzZXQgdG8gc3RhcnQgYXQKKyAgICogQHBhcmFtIGxlbiBsZW5ndGggdG8gd3JpdGUKKyAgICogQHJldHVybiBzdHJpbmcgb3V0cHV0CisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0JpbmFyeShmaW5hbCBieXRlIFtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgLy8gSnVzdCBpbiBjYXNlIHdlIGFyZSBwYXNzZWQgYSAnbGVuJyB0aGF0IGlzID4gYnVmZmVyIGxlbmd0aC4uLgorICAgIGlmIChvZmYgPj0gYi5sZW5ndGgpIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICBpZiAob2ZmICsgbGVuID4gYi5sZW5ndGgpIGxlbiA9IGIubGVuZ3RoIC0gb2ZmOworICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCBvZmYgKyBsZW4gOyArK2kgKSB7CisgICAgICBpbnQgY2ggPSBiW2ldICYgMHhGRjsKKyAgICAgIGlmICggKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKQorICAgICAgICB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykKKyAgICAgICAgfHwgIiBgfiFAIyQlXiYqKCktXz0rW117fXw7OidcIiwuPD4vPyIuaW5kZXhPZihjaCkgPj0gMCApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhciljaCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcXHgiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChIRVhfQ0hBUlNbKGNoID4+IDQpICYgMHgwRl0pOworICAgICAgICByZXN1bHQuYXBwZW5kKEhFWF9DSEFSU1tjaCAmIDB4MEZdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnQgYSBib29sZWFuIHRvIGEgYnl0ZSBhcnJheS4gVHJ1ZSBiZWNvbWVzIC0xCisgICAqIGFuZCBmYWxzZSBiZWNvbWVzIDAuCisgICAqCisgICAqIEBwYXJhbSBiIHZhbHVlCisgICAqIEByZXR1cm4gPGNvZGU+YjwvY29kZT4gZW5jb2RlZCBpbiBhIGJ5dGUgYXJyYXkuCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGUgW10gdG9CeXRlcyhmaW5hbCBib29sZWFuIGIpIHsKKyAgICByZXR1cm4gbmV3IGJ5dGVbXSB7IGIgPyAoYnl0ZSkgLTEgOiAoYnl0ZSkgMCB9OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBmIGZsb2F0IHZhbHVlCisgICAqIEByZXR1cm4gdGhlIGZsb2F0IHJlcHJlc2VudGVkIGFzIGJ5dGUgW10KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgYnl0ZSBbXSB0b0J5dGVzKGZpbmFsIGZsb2F0IGYpIHsKKyAgICAvLyBFbmNvZGUgaXQgYXMgaW50CisgICAgcmV0dXJuIEludHMudG9CeXRlQXJyYXkoRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHMoZikpOworICB9CisKKyAgLyoqCisgICAqIFNlcmlhbGl6ZSBhIGRvdWJsZSBhcyB0aGUgSUVFRSA3NTQgZG91YmxlIGZvcm1hdCBvdXRwdXQuIFRoZSByZXN1bHRhbnQKKyAgICogYXJyYXkgd2lsbCBiZSA4IGJ5dGVzIGxvbmcuCisgICAqCisgICAqIEBwYXJhbSBkIHZhbHVlCisgICAqIEByZXR1cm4gdGhlIGRvdWJsZSByZXByZXNlbnRlZCBhcyBieXRlIFtdCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGUgW10gdG9CeXRlcyhmaW5hbCBkb3VibGUgZCkgeworICAgIC8vIEVuY29kZSBpdCBhcyBhIGxvbmcKKyAgICByZXR1cm4gTG9uZ3MudG9CeXRlQXJyYXkoRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHMoZCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbC9Db25maWdVdGlsLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvQ29uZmlnVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzBhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvQ29uZmlnVXRpbC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKKworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWdVdGlsIHsKKyAgcHVibGljIHN0YXRpYyBieXRlW11bXSB0b0J5dGVzKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgIExpc3Q8Ynl0ZVtdPiBuYXRpdmVDb25maWdzID0gbmV3IEFycmF5TGlzdDxieXRlW10+KCk7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBjb25mKSB7CisgICAgICBuYXRpdmVDb25maWdzLmFkZChlLmdldEtleSgpLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgICBuYXRpdmVDb25maWdzLmFkZChlLmdldFZhbHVlKCkuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICB9CisgICAgcmV0dXJuIG5hdGl2ZUNvbmZpZ3MudG9BcnJheShuZXcgYnl0ZVtuYXRpdmVDb25maWdzLnNpemUoKV1bXSk7CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJvb2xlYW5zVG9TdHJpbmcoYm9vbGVhbltdIHZhbHVlKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZm9yIChib29sZWFuIGI6IHZhbHVlKSB7CisgICAgICBzYi5hcHBlbmQoYiA/IDEgOiAwKTsKKyAgICB9CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbC9Mb2NhbEpvYk91dHB1dEZpbGVzLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvTG9jYWxKb2JPdXRwdXRGaWxlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTc3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvTG9jYWxKb2JPdXRwdXRGaWxlcy5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuTG9jYWxEaXJBbGxvY2F0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSm9iQ29uZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGFza0lEOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIExvY2FsSm9iT3V0cHV0RmlsZXMgaW1wbGVtZW50cyBOYXRpdmVUYXNrT3V0cHV0IHsKKworICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tUUkFDS0VSX09VVFBVVCA9ICJvdXRwdXQiOworICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRFVDRV9JTlBVVF9GSUxFX0ZPUk1BVF9TVFJJTkcgPSAiJXMvbWFwXyVkLm91dCI7CisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BJTExfRklMRV9GT1JNQVRfU1RSSU5HID0gIiVzL3NwaWxsJWQub3V0IjsKKyAgc3RhdGljIGZpbmFsIFN0cmluZyBTUElMTF9JTkRFWF9GSUxFX0ZPUk1BVF9TVFJJTkcgPSAiJXMvc3BpbGwlZC5vdXQuaW5kZXgiOworICBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GSUxFX0ZPUk1BVF9TVFJJTkcgPSAiJXMvZmlsZS5vdXQiOworICBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GSUxFX0lOREVYX0ZPUk1BVF9TVFJJTkcgPSAiJXMvZmlsZS5vdXQuaW5kZXgiOworCisgIHByaXZhdGUgSm9iQ29uZiBjb25mOworICBwcml2YXRlIExvY2FsRGlyQWxsb2NhdG9yIGxEaXJBbGxvYyA9IG5ldyBMb2NhbERpckFsbG9jYXRvcigibWFwcmVkLmxvY2FsLmRpciIpOworCisgIHB1YmxpYyBMb2NhbEpvYk91dHB1dEZpbGVzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGlkKSB7CisgICAgdGhpcy5jb25mID0gbmV3IEpvYkNvbmYoY29uZik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBwYXRoIHRvIGxvY2FsIG1hcCBvdXRwdXQgZmlsZSBjcmVhdGVkIGVhcmxpZXIKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldE91dHB1dEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBwYXRoID0gU3RyaW5nLmZvcm1hdChPVVRQVVRfRklMRV9GT1JNQVRfU1RSSU5HLCBUQVNLVFJBQ0tFUl9PVVRQVVQpOworICAgIHJldHVybiBsRGlyQWxsb2MuZ2V0TG9jYWxQYXRoVG9SZWFkKHBhdGgsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIGxvY2FsIG1hcCBvdXRwdXQgZmlsZSBuYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldE91dHB1dEZpbGVGb3JXcml0ZShsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHBhdGggPSBTdHJpbmcuZm9ybWF0KE9VVFBVVF9GSUxFX0ZPUk1BVF9TVFJJTkcsIFRBU0tUUkFDS0VSX09VVFBVVCk7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhGb3JXcml0ZShwYXRoLCBzaXplLCBjb25mKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gYSBsb2NhbCBtYXAgb3V0cHV0IGluZGV4IGZpbGUgY3JlYXRlZCBlYXJsaWVyCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRPdXRwdXRJbmRleEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBwYXRoID0gU3RyaW5nLmZvcm1hdChPVVRQVVRfRklMRV9JTkRFWF9GT1JNQVRfU1RSSU5HLCBUQVNLVFJBQ0tFUl9PVVRQVVQpOworICAgIHJldHVybiBsRGlyQWxsb2MuZ2V0TG9jYWxQYXRoVG9SZWFkKHBhdGgsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIGxvY2FsIG1hcCBvdXRwdXQgaW5kZXggZmlsZSBuYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldE91dHB1dEluZGV4RmlsZUZvcldyaXRlKGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcGF0aCA9IFN0cmluZy5mb3JtYXQoT1VUUFVUX0ZJTEVfSU5ERVhfRk9STUFUX1NUUklORywgVEFTS1RSQUNLRVJfT1VUUFVUKTsKKyAgICByZXR1cm4gbERpckFsbG9jLmdldExvY2FsUGF0aEZvcldyaXRlKHBhdGgsIHNpemUsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBhIGxvY2FsIG1hcCBzcGlsbCBmaWxlIGNyZWF0ZWQgZWFybGllci4KKyAgICogCisgICAqIEBwYXJhbSBzcGlsbE51bWJlciB0aGUgbnVtYmVyCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRTcGlsbEZpbGUoaW50IHNwaWxsTnVtYmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBwYXRoID0gU3RyaW5nLmZvcm1hdChTUElMTF9GSUxFX0ZPUk1BVF9TVFJJTkcsIFRBU0tUUkFDS0VSX09VVFBVVCwgc3BpbGxOdW1iZXIpOworICAgIHJldHVybiBsRGlyQWxsb2MuZ2V0TG9jYWxQYXRoVG9SZWFkKHBhdGgsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIGxvY2FsIG1hcCBzcGlsbCBmaWxlIG5hbWUuCisgICAqIAorICAgKiBAcGFyYW0gc3BpbGxOdW1iZXIgdGhlIG51bWJlcgorICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZQorICAgKi8KKyAgcHVibGljIFBhdGggZ2V0U3BpbGxGaWxlRm9yV3JpdGUoaW50IHNwaWxsTnVtYmVyLCBsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHBhdGggPSBTdHJpbmcuZm9ybWF0KFNQSUxMX0ZJTEVfRk9STUFUX1NUUklORywgVEFTS1RSQUNLRVJfT1VUUFVULCBzcGlsbE51bWJlcik7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhGb3JXcml0ZShwYXRoLCBzaXplLCBjb25mKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBsb2NhbCBtYXAgc3BpbGwgaW5kZXggZmlsZSBjcmVhdGVkIGVhcmxpZXIKKyAgICogCisgICAqIEBwYXJhbSBzcGlsbE51bWJlciB0aGUgbnVtYmVyCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRTcGlsbEluZGV4RmlsZShpbnQgc3BpbGxOdW1iZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHBhdGggPSBTdHJpbmcKKy5mb3JtYXQoU1BJTExfSU5ERVhfRklMRV9GT1JNQVRfU1RSSU5HLCBUQVNLVFJBQ0tFUl9PVVRQVVQsIHNwaWxsTnVtYmVyKTsKKyAgICByZXR1cm4gbERpckFsbG9jLmdldExvY2FsUGF0aFRvUmVhZChwYXRoLCBjb25mKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBsb2NhbCBtYXAgc3BpbGwgaW5kZXggZmlsZSBuYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHNwaWxsTnVtYmVyIHRoZSBudW1iZXIKKyAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldFNwaWxsSW5kZXhGaWxlRm9yV3JpdGUoaW50IHNwaWxsTnVtYmVyLCBsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHBhdGggPSBTdHJpbmcKKy5mb3JtYXQoU1BJTExfSU5ERVhfRklMRV9GT1JNQVRfU1RSSU5HLCBUQVNLVFJBQ0tFUl9PVVRQVVQsIHNwaWxsTnVtYmVyKTsKKyAgICByZXR1cm4gbERpckFsbG9jLmdldExvY2FsUGF0aEZvcldyaXRlKHBhdGgsIHNpemUsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBhIGxvY2FsIHJlZHVjZSBpbnB1dCBmaWxlIGNyZWF0ZWQgZWFybGllcgorICAgKiAKKyAgICogQHBhcmFtIG1hcElkIGEgbWFwIHRhc2sgaWQKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldElucHV0RmlsZShpbnQgbWFwSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhUb1JlYWQoCisgICAgICAgIFN0cmluZy5mb3JtYXQoUkVEVUNFX0lOUFVUX0ZJTEVfRk9STUFUX1NUUklORywgVEFTS1RSQUNLRVJfT1VUUFVULCBJbnRlZ2VyLnZhbHVlT2YobWFwSWQpKSwKKyAgICAgICAgY29uZik7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbG9jYWwgcmVkdWNlIGlucHV0IGZpbGUgbmFtZS4KKyAgICogCisgICAqIEBwYXJhbSBtYXBJZCBhIG1hcCB0YXNrIGlkCisgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBmaWxlCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRJbnB1dEZpbGVGb3JXcml0ZShUYXNrSUQgbWFwSWQsIGxvbmcgc2l6ZSwgQ29uZmlndXJhdGlvbiBjb25mKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhGb3JXcml0ZSgKKyAgICAgICAgU3RyaW5nLmZvcm1hdChSRURVQ0VfSU5QVVRfRklMRV9GT1JNQVRfU1RSSU5HLCBUQVNLVFJBQ0tFUl9PVVRQVVQsIG1hcElkLmdldElkKCkpLCBzaXplLAorICAgICAgICBjb25mKTsKKyAgfQorCisgIC8qKiBSZW1vdmVzIGFsbCBvZiB0aGUgZmlsZXMgcmVsYXRlZCB0byBhIHRhc2suICovCisgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY29uZi5kZWxldGVMb2NhbEZpbGVzKFRBU0tUUkFDS0VSX09VVFBVVCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE5hbWUoaW50IHBhcnRpdGlvbikgeworICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJwYXJ0LSUwNWQiLCBwYXJ0aXRpb24pOworICB9CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbC9OYXRpdmVUYXNrT3V0cHV0LmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvTmF0aXZlVGFza091dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWY0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvTmF0aXZlVGFza091dHB1dC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGFza0lEOworCisvKioKKyAqIGJhc2UgY2xhc3Mgb2Ygb3V0cHV0IGZpbGVzIG1hbmFnZXIuCisgKi8KK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgaW50ZXJmYWNlIE5hdGl2ZVRhc2tPdXRwdXQgeworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gbG9jYWwgbWFwIG91dHB1dCBmaWxlIGNyZWF0ZWQgZWFybGllcgorICAgKi8KKyAgcHVibGljIFBhdGggZ2V0T3V0cHV0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogQ3JlYXRlIGEgbG9jYWwgbWFwIG91dHB1dCBmaWxlIG5hbWUuCisgICAqIAorICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZQorICAgKi8KKyAgcHVibGljIFBhdGggZ2V0T3V0cHV0RmlsZUZvcldyaXRlKGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gYSBsb2NhbCBtYXAgb3V0cHV0IGluZGV4IGZpbGUgY3JlYXRlZCBlYXJsaWVyCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRPdXRwdXRJbmRleEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIGxvY2FsIG1hcCBvdXRwdXQgaW5kZXggZmlsZSBuYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldE91dHB1dEluZGV4RmlsZUZvcldyaXRlKGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBSZXR1cm4gYSBsb2NhbCBtYXAgc3BpbGwgZmlsZSBjcmVhdGVkIGVhcmxpZXIuCisgICAqIAorICAgKiBAcGFyYW0gc3BpbGxOdW1iZXIgdGhlIG51bWJlcgorICAgKi8KKyAgcHVibGljIFBhdGggZ2V0U3BpbGxGaWxlKGludCBzcGlsbE51bWJlcikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBsb2NhbCBtYXAgc3BpbGwgZmlsZSBuYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHNwaWxsTnVtYmVyIHRoZSBudW1iZXIKKyAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldFNwaWxsRmlsZUZvcldyaXRlKGludCBzcGlsbE51bWJlciwgbG9uZyBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIFJldHVybiBhIGxvY2FsIG1hcCBzcGlsbCBpbmRleCBmaWxlIGNyZWF0ZWQgZWFybGllcgorICAgKiAKKyAgICogQHBhcmFtIHNwaWxsTnVtYmVyIHRoZSBudW1iZXIKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldFNwaWxsSW5kZXhGaWxlKGludCBzcGlsbE51bWJlcikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBsb2NhbCBtYXAgc3BpbGwgaW5kZXggZmlsZSBuYW1lLgorICAgKiAKKyAgICByKiBAcGFyYW0gc3BpbGxOdW1iZXIgdGhlIG51bWJlcgorICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZQorICAgKi8KKyAgcHVibGljIFBhdGggZ2V0U3BpbGxJbmRleEZpbGVGb3JXcml0ZShpbnQgc3BpbGxOdW1iZXIsIGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBSZXR1cm4gYSBsb2NhbCByZWR1Y2UgaW5wdXQgZmlsZSBjcmVhdGVkIGVhcmxpZXIKKyAgICogCisgICAqIEBwYXJhbSBtYXBJZCBhIG1hcCB0YXNrIGlkCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRJbnB1dEZpbGUoaW50IG1hcElkKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIGxvY2FsIHJlZHVjZSBpbnB1dCBmaWxlIG5hbWUuCisgICAqIAorICAgKiBAcGFyYW0gbWFwSWQgYSBtYXAgdGFzayBpZAorICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZQorICAgKi8KKyAgcHVibGljIFBhdGggZ2V0SW5wdXRGaWxlRm9yV3JpdGUoVGFza0lEIG1hcElkLCBsb25nIHNpemUsIENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKiBSZW1vdmVzIGFsbCBvZiB0aGUgZmlsZXMgcmVsYXRlZCB0byBhIHRhc2suICovCisgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE5hbWUoaW50IHBhcnRpdGlvbik7Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvTmF0aXZlVGFza091dHB1dEZpbGVzLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvTmF0aXZlVGFza091dHB1dEZpbGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyZWUxYwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbC9OYXRpdmVUYXNrT3V0cHV0RmlsZXMuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY2xhc3NpZmljYXRpb24uSW50ZXJmYWNlQXVkaWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkxvY2FsRGlyQWxsb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmY7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlRhc2tJRDsKKworLyoqCisgKiBNYW5pcHVsYXRlIHRoZSB3b3JraW5nIGFyZWEgZm9yIHRoZSB0cmFuc2llbnQgc3RvcmUgZm9yIG1hcHMgYW5kIHJlZHVjZXMuCisgKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IG1hcCBhbmQgcmVkdWNlIHRhc2tzIHRvIGlkZW50aWZ5IHRoZSBkaXJlY3RvcmllcyB0aGF0IHRoZXkgbmVlZAorICogdG8gd3JpdGUgdG8vcmVhZCBmcm9tIGZvciBpbnRlcm1lZGlhdGUgZmlsZXMuIFRoZSBjYWxsZXJzIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGZyb20KKyAqIGNoaWxkIHNwYWNlIGFuZCBzZWUgbWFwcmVkdWNlLmNsdXN0ZXIubG9jYWwuZGlyIGFzCisgKiB0YXNrVHJhY2tlci9qb2JDYWNoZS9qb2JJZC9hdHRlbXB0SWQuCisgKgorICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZnJvbSBUYXNrVHJhY2tlciBzcGFjZS4KKyAqLworQEludGVyZmFjZUF1ZGllbmNlLlByaXZhdGUKK3B1YmxpYyBjbGFzcyBOYXRpdmVUYXNrT3V0cHV0RmlsZXMgaW1wbGVtZW50cyBOYXRpdmVUYXNrT3V0cHV0IHsKKworICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tUUkFDS0VSX09VVFBVVCA9ICJvdXRwdXQiOworICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRFVDRV9JTlBVVF9GSUxFX0ZPUk1BVF9TVFJJTkcgPSAiJXMvbWFwXyVkLm91dCI7CisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BJTExfRklMRV9GT1JNQVRfU1RSSU5HID0gIiVzLyVzL3NwaWxsJWQub3V0IjsKKyAgc3RhdGljIGZpbmFsIFN0cmluZyBTUElMTF9JTkRFWF9GSUxFX0ZPUk1BVF9TVFJJTkcgPSAiJXMvJXMvc3BpbGwlZC5vdXQuaW5kZXgiOworICBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GSUxFX0ZPUk1BVF9TVFJJTkcgPSAiJXMvJXMvZmlsZS5vdXQiOworICBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GSUxFX0lOREVYX0ZPUk1BVF9TVFJJTkcgPSAiJXMvJXMvZmlsZS5vdXQuaW5kZXgiOworCisgIHByaXZhdGUgU3RyaW5nIGlkOworICBwcml2YXRlIEpvYkNvbmYgY29uZjsKKyAgcHJpdmF0ZSBMb2NhbERpckFsbG9jYXRvciBsRGlyQWxsb2MgPSBuZXcgTG9jYWxEaXJBbGxvY2F0b3IoIm1hcHJlZC5sb2NhbC5kaXIiKTsKKworICBwdWJsaWMgTmF0aXZlVGFza091dHB1dEZpbGVzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGlkKSB7CisgICAgdGhpcy5jb25mID0gbmV3IEpvYkNvbmYoY29uZik7CisgICAgdGhpcy5pZCA9IGlkOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgcGF0aCB0byBsb2NhbCBtYXAgb3V0cHV0IGZpbGUgY3JlYXRlZCBlYXJsaWVyCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRPdXRwdXRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcGF0aCA9IFN0cmluZy5mb3JtYXQoT1VUUFVUX0ZJTEVfRk9STUFUX1NUUklORywgVEFTS1RSQUNLRVJfT1VUUFVULCBpZCk7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhUb1JlYWQocGF0aCwgY29uZik7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbG9jYWwgbWFwIG91dHB1dCBmaWxlIG5hbWUuCisgICAqCisgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBmaWxlCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRPdXRwdXRGaWxlRm9yV3JpdGUobG9uZyBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBwYXRoID0gU3RyaW5nLmZvcm1hdChPVVRQVVRfRklMRV9GT1JNQVRfU1RSSU5HLCBUQVNLVFJBQ0tFUl9PVVRQVVQsIGlkKTsKKyAgICByZXR1cm4gbERpckFsbG9jLmdldExvY2FsUGF0aEZvcldyaXRlKHBhdGgsIHNpemUsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgcGF0aCB0byBhIGxvY2FsIG1hcCBvdXRwdXQgaW5kZXggZmlsZSBjcmVhdGVkIGVhcmxpZXIKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldE91dHB1dEluZGV4RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHBhdGggPSBTdHJpbmcuZm9ybWF0KE9VVFBVVF9GSUxFX0lOREVYX0ZPUk1BVF9TVFJJTkcsIFRBU0tUUkFDS0VSX09VVFBVVCwgaWQpOworICAgIHJldHVybiBsRGlyQWxsb2MuZ2V0TG9jYWxQYXRoVG9SZWFkKHBhdGgsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIGxvY2FsIG1hcCBvdXRwdXQgaW5kZXggZmlsZSBuYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldE91dHB1dEluZGV4RmlsZUZvcldyaXRlKGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcGF0aCA9IFN0cmluZy5mb3JtYXQoT1VUUFVUX0ZJTEVfSU5ERVhfRk9STUFUX1NUUklORywgVEFTS1RSQUNLRVJfT1VUUFVULCBpZCk7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhGb3JXcml0ZShwYXRoLCBzaXplLCBjb25mKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBsb2NhbCBtYXAgc3BpbGwgZmlsZSBjcmVhdGVkIGVhcmxpZXIuCisgICAqIAorICAgKiBAcGFyYW0gc3BpbGxOdW1iZXIgdGhlIG51bWJlcgorICAgKi8KKyAgcHVibGljIFBhdGggZ2V0U3BpbGxGaWxlKGludCBzcGlsbE51bWJlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcGF0aCA9IFN0cmluZy5mb3JtYXQoU1BJTExfRklMRV9GT1JNQVRfU1RSSU5HLCBpZCwgVEFTS1RSQUNLRVJfT1VUUFVULCBzcGlsbE51bWJlcik7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhUb1JlYWQocGF0aCwgY29uZik7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbG9jYWwgbWFwIHNwaWxsIGZpbGUgbmFtZS4KKyAgICogCisgICAqIEBwYXJhbSBzcGlsbE51bWJlciB0aGUgbnVtYmVyCisgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBmaWxlCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRTcGlsbEZpbGVGb3JXcml0ZShpbnQgc3BpbGxOdW1iZXIsIGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcGF0aCA9IFN0cmluZy5mb3JtYXQoU1BJTExfRklMRV9GT1JNQVRfU1RSSU5HLCBpZCwgVEFTS1RSQUNLRVJfT1VUUFVULCBzcGlsbE51bWJlcik7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhGb3JXcml0ZShwYXRoLCBzaXplLCBjb25mKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBsb2NhbCBtYXAgc3BpbGwgaW5kZXggZmlsZSBjcmVhdGVkIGVhcmxpZXIKKyAgICogCisgICAqIEBwYXJhbSBzcGlsbE51bWJlciB0aGUgbnVtYmVyCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRTcGlsbEluZGV4RmlsZShpbnQgc3BpbGxOdW1iZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHBhdGggPSBTdHJpbmcKKyAgICAgICAgLmZvcm1hdChTUElMTF9JTkRFWF9GSUxFX0ZPUk1BVF9TVFJJTkcsIGlkLCBUQVNLVFJBQ0tFUl9PVVRQVVQsIHNwaWxsTnVtYmVyKTsKKyAgICByZXR1cm4gbERpckFsbG9jLmdldExvY2FsUGF0aFRvUmVhZChwYXRoLCBjb25mKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBsb2NhbCBtYXAgc3BpbGwgaW5kZXggZmlsZSBuYW1lLgorICAgKiAKKyAgICogQHBhcmFtIHNwaWxsTnVtYmVyIHRoZSBudW1iZXIKKyAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZpbGUKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldFNwaWxsSW5kZXhGaWxlRm9yV3JpdGUoaW50IHNwaWxsTnVtYmVyLCBsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHBhdGggPSBTdHJpbmcKKyAgICAgICAgLmZvcm1hdChTUElMTF9JTkRFWF9GSUxFX0ZPUk1BVF9TVFJJTkcsIGlkLCBUQVNLVFJBQ0tFUl9PVVRQVVQsIHNwaWxsTnVtYmVyKTsKKyAgICByZXR1cm4gbERpckFsbG9jLmdldExvY2FsUGF0aEZvcldyaXRlKHBhdGgsIHNpemUsIGNvbmYpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBhIGxvY2FsIHJlZHVjZSBpbnB1dCBmaWxlIGNyZWF0ZWQgZWFybGllcgorICAgKiAKKyAgICogQHBhcmFtIG1hcElkIGEgbWFwIHRhc2sgaWQKKyAgICovCisgIHB1YmxpYyBQYXRoIGdldElucHV0RmlsZShpbnQgbWFwSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhUb1JlYWQoCisgICAgICAgIFN0cmluZy5mb3JtYXQoUkVEVUNFX0lOUFVUX0ZJTEVfRk9STUFUX1NUUklORywgVEFTS1RSQUNLRVJfT1VUUFVULCBJbnRlZ2VyLnZhbHVlT2YobWFwSWQpKSwKKyAgICAgICAgY29uZik7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbG9jYWwgcmVkdWNlIGlucHV0IGZpbGUgbmFtZS4KKyAgICogCisgICAqIEBwYXJhbSBtYXBJZCBhIG1hcCB0YXNrIGlkCisgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBmaWxlCisgICAqLworICBwdWJsaWMgUGF0aCBnZXRJbnB1dEZpbGVGb3JXcml0ZShUYXNrSUQgbWFwSWQsIGxvbmcgc2l6ZSwgQ29uZmlndXJhdGlvbiBjb25mKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGxEaXJBbGxvYy5nZXRMb2NhbFBhdGhGb3JXcml0ZSgKKyAgICAgICAgU3RyaW5nLmZvcm1hdChSRURVQ0VfSU5QVVRfRklMRV9GT1JNQVRfU1RSSU5HLCBUQVNLVFJBQ0tFUl9PVVRQVVQsIG1hcElkLmdldElkKCkpLCBzaXplLAorICAgICAgICBjb25mKTsKKyAgfQorCisgIC8qKiBSZW1vdmVzIGFsbCBvZiB0aGUgZmlsZXMgcmVsYXRlZCB0byBhIHRhc2suICovCisgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY29uZi5kZWxldGVMb2NhbEZpbGVzKFRBU0tUUkFDS0VSX09VVFBVVCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE5hbWUoaW50IHBhcnRpdGlvbikgeworICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJwYXJ0LSUwNWQiLCBwYXJ0aXRpb24pOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvT3V0cHV0VXRpbC5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlsL091dHB1dFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlsL091dHB1dFV0aWwuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgT3V0cHV0VXRpbCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE91dHB1dFV0aWwuY2xhc3MpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfVEFTS19PVVRQVVRfTUFOQUdFUiA9ICJuYXRpdmV0YXNrLm91dHB1dC5tYW5hZ2VyIjsKKworICBwdWJsaWMgc3RhdGljIE5hdGl2ZVRhc2tPdXRwdXQgY3JlYXRlTmF0aXZlVGFza091dHB1dChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBpZCkgeworICAgIENsYXNzPD8+IGNsYXp6ID0gY29uZi5nZXRDbGFzcyhPdXRwdXRVdGlsLk5BVElWRV9UQVNLX09VVFBVVF9NQU5BR0VSLAorICAgICAgICBOYXRpdmVUYXNrT3V0cHV0RmlsZXMuY2xhc3MpOworICAgIExPRy5pbmZvKE91dHB1dFV0aWwuTkFUSVZFX1RBU0tfT1VUUFVUX01BTkFHRVIgKyAiID0gIiArIGNsYXp6LmdldE5hbWUoKSk7CisgICAgdHJ5IHsKKyAgICAgIENvbnN0cnVjdG9yPD8+IGN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihDb25maWd1cmF0aW9uLmNsYXNzLCBTdHJpbmcuY2xhc3MpOworICAgICAgY3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgTmF0aXZlVGFza091dHB1dCBpbnN0YW5jZSA9IChOYXRpdmVUYXNrT3V0cHV0KSBjdG9yLm5ld0luc3RhbmNlKGNvbmYsIGlkKTsKKyAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvUmVhZFdyaXRlQnVmZmVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvUmVhZFdyaXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkZjAxNgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbC9SZWFkV3JpdGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNsYXNzaWZpY2F0aW9uLkludGVyZmFjZUF1ZGllbmNlOworCitASW50ZXJmYWNlQXVkaWVuY2UuUHJpdmF0ZQorcHVibGljIGNsYXNzIFJlYWRXcml0ZUJ1ZmZlciB7CisgIHByaXZhdGUgYnl0ZVtdIF9idWZmOworICBwcml2YXRlIGludCBfd3JpdGVQb2ludDsKKyAgcHJpdmF0ZSBpbnQgX3JlYWRQb2ludDsKKyAgZmluYWwgc3RhdGljIGludCBDQUNIRV9MSU5FX1NJWkUgPSAxNjsKKworICBwdWJsaWMgUmVhZFdyaXRlQnVmZmVyKGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgX2J1ZmYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBSZWFkV3JpdGVCdWZmZXIoKSB7CisgICAgX2J1ZmYgPSBuZXcgYnl0ZVtDQUNIRV9MSU5FX1NJWkVdOworICB9CisKKyAgcHVibGljIFJlYWRXcml0ZUJ1ZmZlcihieXRlW10gYnl0ZXMpIHsKKyAgICBfYnVmZiA9IGJ5dGVzOworICAgIF93cml0ZVBvaW50ID0gMDsKKyAgICBfcmVhZFBvaW50ID0gMDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlc2V0KGJ5dGVbXSBuZXdCdWZmKSB7CisgICAgX2J1ZmYgPSBuZXdCdWZmOworICAgIF93cml0ZVBvaW50ID0gMDsKKyAgICBfcmVhZFBvaW50ID0gMDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFJlYWRQb2ludChpbnQgcG9zKSB7CisgICAgX3JlYWRQb2ludCA9IHBvczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFdyaXRlUG9pbnQoaW50IHBvcykgeworICAgIF93cml0ZVBvaW50ID0gcG9zOworICB9CisKKyAgcHVibGljIGJ5dGVbXSBnZXRCdWZmKCkgeworICAgIHJldHVybiBfYnVmZjsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0V3JpdGVQb2ludCgpIHsKKyAgICByZXR1cm4gX3dyaXRlUG9pbnQ7CisgIH0KKworICBwdWJsaWMgaW50IGdldFJlYWRQb2ludCgpIHsKKyAgICByZXR1cm4gX3JlYWRQb2ludDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50KGludCB2KSB7CisgICAgY2hlY2tXcml0ZVNwYWNlQW5kUmVzaXplSWZOZWNlc3NhcnkoNCk7CisKKyAgICBfYnVmZltfd3JpdGVQb2ludCArIDBdID0gKGJ5dGUpICgodiA+Pj4gMCkgJiAweEZGKTsKKyAgICBfYnVmZltfd3JpdGVQb2ludCArIDFdID0gKGJ5dGUpICgodiA+Pj4gOCkgJiAweEZGKTsKKyAgICBfYnVmZltfd3JpdGVQb2ludCArIDJdID0gKGJ5dGUpICgodiA+Pj4gMTYpICYgMHhGRik7CisgICAgX2J1ZmZbX3dyaXRlUG9pbnQgKyAzXSA9IChieXRlKSAoKHYgPj4+IDI0KSAmIDB4RkYpOworCisgICAgX3dyaXRlUG9pbnQgKz0gNDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTG9uZyhsb25nIHYpIHsKKyAgICBjaGVja1dyaXRlU3BhY2VBbmRSZXNpemVJZk5lY2Vzc2FyeSg4KTsKKworICAgIF9idWZmW193cml0ZVBvaW50ICsgMF0gPSAoYnl0ZSkgKHYgPj4+IDApOworICAgIF9idWZmW193cml0ZVBvaW50ICsgMV0gPSAoYnl0ZSkgKHYgPj4+IDgpOworICAgIF9idWZmW193cml0ZVBvaW50ICsgMl0gPSAoYnl0ZSkgKHYgPj4+IDE2KTsKKyAgICBfYnVmZltfd3JpdGVQb2ludCArIDNdID0gKGJ5dGUpICh2ID4+PiAyNCk7CisgICAgX2J1ZmZbX3dyaXRlUG9pbnQgKyA0XSA9IChieXRlKSAodiA+Pj4gMzIpOworICAgIF9idWZmW193cml0ZVBvaW50ICsgNV0gPSAoYnl0ZSkgKHYgPj4+IDQwKTsKKyAgICBfYnVmZltfd3JpdGVQb2ludCArIDZdID0gKGJ5dGUpICh2ID4+PiA0OCk7CisgICAgX2J1ZmZbX3dyaXRlUG9pbnQgKyA3XSA9IChieXRlKSAodiA+Pj4gNTYpOworCisgICAgX3dyaXRlUG9pbnQgKz0gODsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHsKKyAgICB3cml0ZUludChsZW4pOworICAgIGNoZWNrV3JpdGVTcGFjZUFuZFJlc2l6ZUlmTmVjZXNzYXJ5KGxlbik7CisgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIF9idWZmLCBfd3JpdGVQb2ludCwgbGVuKTsKKyAgICBfd3JpdGVQb2ludCArPSBsZW47CisgIH0KKworICBwdWJsaWMgaW50IHJlYWRJbnQoKSB7CisgICAgZmluYWwgaW50IGNoNCA9IDB4ZmYgJiAoX2J1ZmZbX3JlYWRQb2ludCArIDBdKTsKKyAgICBmaW5hbCBpbnQgY2gzID0gMHhmZiAmIChfYnVmZltfcmVhZFBvaW50ICsgMV0pOworICAgIGZpbmFsIGludCBjaDIgPSAweGZmICYgKF9idWZmW19yZWFkUG9pbnQgKyAyXSk7CisgICAgZmluYWwgaW50IGNoMSA9IDB4ZmYgJiAoX2J1ZmZbX3JlYWRQb2ludCArIDNdKTsKKyAgICBfcmVhZFBvaW50ICs9IDQ7CisgICAgcmV0dXJuICgoY2gxIDw8IDI0KSArIChjaDIgPDwgMTYpICsgKGNoMyA8PCA4KSArIChjaDQgPDwgMCkpOworICB9CisKKyAgcHVibGljIGxvbmcgcmVhZExvbmcoKSB7CisgICAgZmluYWwgbG9uZyByZXN1bHQgPQorICAgICAgKChfYnVmZltfcmVhZFBvaW50ICsgMF0gJiAyNTUpIDw8IDApICsKKyAgICAgICgoX2J1ZmZbX3JlYWRQb2ludCArIDFdICYgMjU1KSA8PCA4KSArCisgICAgICAoKF9idWZmW19yZWFkUG9pbnQgKyAyXSAmIDI1NSkgPDwgMTYpICsKKyAgICAgICgobG9uZykgKF9idWZmW19yZWFkUG9pbnQgKyAzXSAmIDI1NSkgPDwgMjQpICsKKyAgICAgICgobG9uZykgKF9idWZmW19yZWFkUG9pbnQgKyA0XSAmIDI1NSkgPDwgMzIpICsKKyAgICAgICgobG9uZykgKF9idWZmW19yZWFkUG9pbnQgKyA1XSAmIDI1NSkgPDwgNDApICsKKyAgICAgICgobG9uZykgKF9idWZmW19yZWFkUG9pbnQgKyA2XSAmIDI1NSkgPDwgNDgpICsKKyAgICAgICgoKGxvbmcpIF9idWZmW19yZWFkUG9pbnQgKyA3XSA8PCA1NikpOworCisgICAgX3JlYWRQb2ludCArPSA4OworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIHJlYWRCeXRlcygpIHsKKyAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcmVhZEludCgpOworICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgIFN5c3RlbS5hcnJheWNvcHkoX2J1ZmYsIF9yZWFkUG9pbnQsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKKyAgICBfcmVhZFBvaW50ICs9IGxlbmd0aDsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgeworICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVCeXRlcyhieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSByZWFkQnl0ZXMoKTsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgQ2hhcnNldHMuVVRGXzgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrV3JpdGVTcGFjZUFuZFJlc2l6ZUlmTmVjZXNzYXJ5KGludCB0b0JlV3JpdHRlbikgeworCisgICAgaWYgKF9idWZmLmxlbmd0aCAtIF93cml0ZVBvaW50ID49IHRvQmVXcml0dGVuKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZpbmFsIGludCBuZXdMZW5ndGggPSAodG9CZVdyaXR0ZW4gKyBfd3JpdGVQb2ludCA+IENBQ0hFX0xJTkVfU0laRSkgPworICAgICAgKHRvQmVXcml0dGVuICsgX3dyaXRlUG9pbnQpIDogQ0FDSEVfTElORV9TSVpFOworICAgIGZpbmFsIGJ5dGVbXSBuZXdCdWZmID0gbmV3IGJ5dGVbbmV3TGVuZ3RoXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KF9idWZmLCAwLCBuZXdCdWZmLCAwLCBfd3JpdGVQb2ludCk7CisgICAgX2J1ZmYgPSBuZXdCdWZmOworICB9CisKK307CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWwvU2l6ZWRXcml0YWJsZS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlsL1NpemVkV3JpdGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQ2NjFmCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlsL1NpemVkV3JpdGFibGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jbGFzc2lmaWNhdGlvbi5JbnRlcmZhY2VBdWRpZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5EYXRhSW5wdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5SZWZsZWN0aW9uVXRpbHM7CisKK0BJbnRlcmZhY2VBdWRpZW5jZS5Qcml2YXRlCitwdWJsaWMgY2xhc3MgU2l6ZWRXcml0YWJsZTxUPiB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTEVOR1RIID0gLTE7CisKKyAgcHVibGljIGludCBsZW5ndGggPSBJTlZBTElEX0xFTkdUSDsKKyAgcHVibGljIFdyaXRhYmxlIHY7CisKKyAgcHVibGljIFNpemVkV3JpdGFibGUoQ2xhc3M8Pz4ga2xhc3MpIHsKKyAgICBpZiAobnVsbCAhPSBrbGFzcykgeworICAgICAgdiA9IChXcml0YWJsZSkgUmVmbGVjdGlvblV0aWxzLm5ld0luc3RhbmNlKGtsYXNzLCBudWxsKTsKKyAgICB9CisgICAgbGVuZ3RoID0gSU5WQUxJRF9MRU5HVEg7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRmllbGRzKERhdGFJbnB1dEJ1ZmZlciBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKG51bGwgIT0ga2V5KSB7CisgICAgICB0aGlzLnYucmVhZEZpZWxkcyhrZXkpOworICAgICAgdGhpcy5sZW5ndGggPSBJTlZBTElEX0xFTkdUSDsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJpbnB1dCBrZXkgaXMgbnVsbCIpOworICAgIH0KKworICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXQoVCB3KSB7CisgICAgdGhpcy52ID0gKFdyaXRhYmxlKSB3OworICAgIHRoaXMubGVuZ3RoID0gSU5WQUxJRF9MRU5HVEg7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9ndGVzdC9ndGVzdC1hbGwuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxN2YxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvZ3Rlc3QvZ3Rlc3QtYWxsLmNjCkBAIC0wLDAgKzEsOTEyMCBAQAorLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBTb21ldGltZXMgaXQncyBkZXNpcmFibGUgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYnkgY29tcGlsaW5nIGEgc2luZ2xlIGZpbGUuCisvLyBUaGlzIGZpbGUgc2VydmVzIHRoaXMgcHVycG9zZS4KKworLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBndGVzdC5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuCisvLyB3aGVuIGl0J3MgZnVzZWQuCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwdWxsIGluIHRoZSByZWFsIGd0ZXN0ICouY2MgZmlsZXMuCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKworLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBVdGlsaXRpZXMgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmIGFuZCBjb2RlIHRoYXQgdXNlcyBHb29nbGUgVGVzdAorLy8gKGUuZy4gZnJhbWV3b3JrcyBidWlsdCBvbiB0b3Agb2YgR29vZ2xlIFRlc3QpLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBjYW4gYmUgdXNlZCB0byBtb2NrIG91dCBHb29nbGUgVGVzdCBmYWlsdXJlIHJlcG9ydGluZworLy8gc28gdGhhdCB3ZSBjYW4gdGVzdCBHb29nbGUgVGVzdCBvciBjb2RlIHRoYXQgYnVpbGRzIG9uIEdvb2dsZSBUZXN0LgorLy8KKy8vIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QgdG8gdGhlCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IG9iamVjdCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3Igd2hlbmV2ZXIgYSBHb29nbGUgVGVzdAorLy8gZmFpbHVyZSBpcyByZXBvcnRlZC4gSXQgY2FuIGVpdGhlciBpbnRlcmNlcHQgb25seSBmYWlsdXJlcyB0aGF0IGFyZQorLy8gZ2VuZXJhdGVkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhpcyBvYmplY3Qgb3IgaXQgY2FuIGludGVyY2VwdAorLy8gYWxsIGdlbmVyYXRlZCBmYWlsdXJlcy4gVGhlIHNjb3BlIG9mIHRoaXMgbW9jayBvYmplY3QgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aAorLy8gdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgdHdvIGFyZ3VtZW50cyBjb25zdHJ1Y3Rvci4KK2NsYXNzIEdURVNUX0FQSV8gU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSB0d28gcG9zc2libGUgbW9ja2luZyBtb2RlcyBvZiB0aGlzIG9iamVjdC4KKyAgZW51bSBJbnRlcmNlcHRNb2RlIHsKKyAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgIC8vIEludGVyY2VwdHMgb25seSB0aHJlYWQgbG9jYWwgZmFpbHVyZXMuCisgICAgSU5URVJDRVBUX0FMTF9USFJFQURTICAgICAgICAgICAvLyBJbnRlcmNlcHRzIGFsbCBmYWlsdXJlcy4KKyAgfTsKKworICAvLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkCisgIC8vIGJ5IEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorICAvLyByZXN1bHRzLiBUaGlzIHJlcG9ydGVyIHdpbGwgb25seSBjYXRjaCBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQKKyAgLy8gdGhyZWFkLiBERVBSRUNBVEVECisgIGV4cGxpY2l0IFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHlvdSBjYW4gY2hvb3NlIHRoZSBpbnRlcmNlcHRpb24gc2NvcGUgb2YgdGhpcyBvYmplY3QuCisgIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7CisKKyAgLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICB2aXJ0dWFsIH5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOworCisgIC8vIEFwcGVuZHMgdGhlIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUgVGVzdFBhcnRSZXN1bHRBcnJheQorICAvLyByZWNlaXZlZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UKKyAgLy8gaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgcHJpdmF0ZToKKyAgdm9pZCBJbml0KCk7CisKKyAgY29uc3QgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZV87CisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIG9sZF9yZXBvcnRlcl87CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIGNvbnN0IHJlc3VsdF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgYW5kCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpLiAgSXRzIGRlc3RydWN0b3IgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KKy8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgZXhhY3RseSBvbmUgZmFpbHVyZSB0aGF0IGhhcyB0aGUgZ2l2ZW4KKy8vIHR5cGUgYW5kIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuICBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBhCisvLyBub24tZmF0YWwgZmFpbHVyZSB3aWxsIGJlIGdlbmVyYXRlZC4KK2NsYXNzIEdURVNUX0FQSV8gU2luZ2xlRmFpbHVyZUNoZWNrZXIgeworIHB1YmxpYzoKKyAgLy8gVGhlIGNvbnN0cnVjdG9yIHJlbWVtYmVycyB0aGUgYXJndW1lbnRzLgorICBTaW5nbGVGYWlsdXJlQ2hlY2tlcihjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1YnN0cik7CisgIH5TaW5nbGVGYWlsdXJlQ2hlY2tlcigpOworIHByaXZhdGU6CisgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIGNvbnN0IHJlc3VsdHNfOworICBjb25zdCBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlXzsKKyAgY29uc3Qgc3RyaW5nIHN1YnN0cl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTaW5nbGVGYWlsdXJlQ2hlY2tlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gQSBzZXQgb2YgbWFjcm9zIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgb3IgY29kZSB0aGF0J3MgZXhwZWN0ZWQKKy8vIHRvIGdlbmVyYXRlIEdvb2dsZSBUZXN0IGZhdGFsIGZhaWx1cmVzLiAgSXQgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KKy8vIHN0YXRlbWVudCB3aWxsIGNhdXNlIGV4YWN0bHkgb25lIGZhdGFsIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2l0aCAnc3Vic3RyJworLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgbWFjcm8uIEVYUEVDVF9GQVRBTF9GQUlMVVJFIG9ubHkKKy8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZAorLy8gRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLgorLy8KKy8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudAorLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisvLworLy8gS25vd24gcmVzdHJpY3Rpb25zOgorLy8gICAtICdzdGF0ZW1lbnQnIGNhbm5vdCByZWZlcmVuY2UgbG9jYWwgbm9uLXN0YXRpYyB2YXJpYWJsZXMgb3IKKy8vICAgICBub24tc3RhdGljIG1lbWJlcnMgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgorLy8gICAtICdzdGF0ZW1lbnQnIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS4KKy8vICAgLSBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byB0aGlzIG1hY3JvLgorLy8KKy8vIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvCisvLyBtYWNyb3MgYXJlIG11Y2ggYWxpa2UsIHdlIGNhbm5vdCByZWZhY3RvciB0aGVtIHRvIHVzZSBhIGNvbW1vbgorLy8gaGVscGVyIG1hY3JvLCBkdWUgdG8gc29tZSBwZWN1bGlhcml0eSBpbiBob3cgdGhlIHByZXByb2Nlc3NvcgorLy8gd29ya3MuICBUaGUgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbgorLy8gZ3Rlc3RfdW5pdHRlc3QuY2Mgd2lsbCBmYWlsIHRvIGNvbXBpbGUgaWYgd2UgZG8gdGhhdC4KKyNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8geyBcCisgICAgY2xhc3MgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXIge1wKKyAgICAgcHVibGljOlwKKyAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9O1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCisgICAgICAgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXI6OkV4ZWN1dGUoKTtcCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworI2RlZmluZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXAorICBkbyB7IFwKKyAgICBjbGFzcyBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlciB7XAorICAgICBwdWJsaWM6XAorICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZSgpIHsgc3RhdGVtZW50OyB9XAorICAgIH07XAorICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCisgICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKKyAgICAgICAgICBJTlRFUkNFUFRfQUxMX1RIUkVBRFMsICZndGVzdF9mYWlsdXJlcyk7XAorICAgICAgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXI6OkV4ZWN1dGUoKTtcCisgICAgfVwKKyAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworLy8gQSBtYWNybyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkIHRvCisvLyBnZW5lcmF0ZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMuICBJdCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuCisvLyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSBleGFjdGx5IG9uZSBub24tZmF0YWwgR29vZ2xlIFRlc3QgZmFpbHVyZSB3aXRoICdzdWJzdHInCisvLyBiZWluZyBwYXJ0IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCisvLworLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhpcyBtYWNyby4gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUgb25seQorLy8gYWZmZWN0cyBhbmQgY29uc2lkZXJzIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgYW5kCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyBkb2VzIHRoZSBzYW1lIGJ1dCBmb3IgYWxsIHRocmVhZHMuCisvLworLy8gJ3N0YXRlbWVudCcgaXMgYWxsb3dlZCB0byByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzIGFuZCBtZW1iZXJzIG9mCisvLyB0aGUgY3VycmVudCBvYmplY3QuCisvLworLy8gVGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIGlzIGRvbmUgY29ycmVjdGx5IGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50CisvLyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9yIGFib3J0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KKy8vCisvLyBLbm93biByZXN0cmljdGlvbnM6CisvLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4KKy8vCisvLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bworLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24KKy8vIGhlbHBlciBtYWNybywgZHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgaW4gaG93IHRoZSBwcmVwcm9jZXNzb3IKKy8vIHdvcmtzLiAgSWYgd2UgZG8gdGhhdCwgdGhlIGNvZGUgd29uJ3QgY29tcGlsZSB3aGVuIHRoZSB1c2VyIGdpdmVzCisvLyBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSgpIGEgc3RhdGVtZW50IHRoYXQgY29udGFpbnMgYSBtYWNybyB0aGF0CisvLyBleHBhbmRzIHRvIGNvZGUgY29udGFpbmluZyBhbiB1bnByb3RlY3RlZCBjb21tYS4gIFRoZQorLy8gQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbiBndGVzdF91bml0dGVzdC5jYworLy8gY2F0Y2hlcyB0aGF0LgorLy8KKy8vIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIGhhdmUgdG8gd3JpdGUKKy8vICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH0KKy8vIGluc3RlYWQgb2YKKy8vICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpCisvLyB0byBhdm9pZCBhbiBNU1ZDIHdhcm5pbmcgb24gdW5yZWFjaGFibGUgY29kZS4KKyNkZWZpbmUgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50LCBzdWJzdHIpIFwKKyAgZG8ge1wKKyAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAorICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwKKyAgICAgICAgKHN1YnN0cikpO1wKKyAgICB7XAorICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCisgICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKKyAgICAgICAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgJmd0ZXN0X2ZhaWx1cmVzKTtcCisgICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjZGVmaW5lIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHN0YXRlbWVudCwgc3Vic3RyKSBcCisgIGRvIHtcCisgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKKyAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCBcCisgICAgICAgIChzdWJzdHIpKTtcCisgICAge1wKKyAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAorICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9BTExfVEhSRUFEUyxcCisgICAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzKTtcCisgICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwKKyAgICB9XAorICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHdjaGFyLmg+CisjaW5jbHVkZSA8d2N0eXBlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWYgR1RFU1RfT1NfTElOVVgKKworLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCisvLyBnZXR0aW1lb2ZkYXkoKS4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKworIyBpbmNsdWRlIDxmY250bC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPGxpbWl0cy5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHNjaGVkLmg+ICAvLyBOT0xJTlQKKy8vIERlY2xhcmVzIHZzbnByaW50ZigpLiAgVGhpcyBoZWFkZXIgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPHN0cmluZz4KKworI2VsaWYgR1RFU1RfT1NfU1lNQklBTgorIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisKKyNlbGlmIEdURVNUX09TX1pPUworIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCisKKy8vIE9uIHovT1Mgd2UgYWRkaXRpb25hbGx5IG5lZWQgc3RyaW5ncy5oIGZvciBzdHJjYXNlY21wLgorIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKKworI2VsaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLgorCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAorCisjZWxpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cyBwcm9wZXIuCisKKyMgaW5jbHVkZSA8aW8uaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdGltZWIuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8vIE5PTElOVAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPiAgLy8gTk9MSU5UCisKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NSU5HVworLy8gTWluR1cgaGFzIGdldHRpbWVvZmRheSgpIGJ1dCBub3QgX2Z0aW1lNjQoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gICBnZXR0aW1lb2ZkYXkoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBUaGVyZSBhcmUgb3RoZXIgd2F5cyB0byBnZXQgdGhlIHRpbWUgb24KKy8vICAgV2luZG93cywgbGlrZSBHZXRUaWNrQ291bnQoKSBvciBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpLiAgTWluR1cKKy8vICAgc3VwcG9ydHMgdGhlc2UuICBjb25zaWRlciB1c2luZyB0aGVtIGluc3RlYWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NSU5HVworCisvLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bworLy8gc2lsZW5jZSBpdC4KKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCisKKyNlbHNlCisKKy8vIEFzc3VtZSBvdGhlciBwbGF0Zm9ybXMgaGF2ZSBnZXR0aW1lb2ZkYXkoKS4KKy8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgorLy8gICBnZXR0aW1lb2ZkYXkoKS4KKyMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKKworLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KKy8vIHNpbGVuY2UgaXQuCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyMgaW5jbHVkZSA8c3RkZXhjZXB0PgorI2VuZGlmCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCisjIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisvLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCisvLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKKy8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCisvLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KKy8vIGhpcyBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB1c2VkIGJ5IHRoZSBHb29nbGUgQysrIHRlc3RpbmcgZnJhbWV3b3JrLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgcHVyZWx5IEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uICBQbGVhc2UKKy8vIERPIE5PVCAjSU5DTFVERSBJVCBJTiBBIFVTRVIgUFJPR1JBTS4KKworI2lmbmRlZiBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisjZGVmaW5lIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KKworLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fIGlzIGRlZmluZWQgdG8gMSBpZmYgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCBpcworLy8gcGFydCBvZiBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uOyBvdGhlcndpc2UgaXQncyB1bmRlZmluZWQuCisjaWYgIUdURVNUX0lNUExFTUVOVEFUSU9OXworLy8gQSB1c2VyIGlzIHRyeWluZyB0byBpbmNsdWRlIHRoaXMgZnJvbSBoaXMgY29kZSAtIGp1c3Qgc2F5IG5vLgorIyBlcnJvciAiZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiIKKyMgZXJyb3IgIkl0IG11c3Qgbm90IGJlIGluY2x1ZGVkIGV4Y2VwdCBieSBHb29nbGUgVGVzdCBpdHNlbGYuIgorI2VuZGlmICAvLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworI2lmbmRlZiBfV0lOMzJfV0NFCisjIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3Igc3RydG9sbC9fc3RydG91bDY0L21hbGxvYy9mcmVlLgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIG1lbW1vdmUuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworCisjaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVjbGFyZXMgdGhlIGZsYWdzLgorLy8KKy8vIFdlIGRvbid0IHdhbnQgdGhlIHVzZXJzIHRvIG1vZGlmeSB0aGlzIGZsYWcgaW4gdGhlIGNvZGUsIGJ1dCB3YW50CisvLyBHb29nbGUgVGVzdCdzIG93biB1bml0IHRlc3RzIHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0LiBUaGVyZWZvcmUgd2UKKy8vIGRlY2xhcmUgaXQgaGVyZSBhcyBvcHBvc2VkIHRvIGluIGd0ZXN0LmguCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgdmFsdWUgb2YgR2V0VGVzdFR5cGVJZCgpIGFzIHNlZW4gZnJvbSB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0CisvLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLgorR1RFU1RfQVBJXyBleHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0OworCisvLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuCitjb25zdCBjaGFyIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWdbXSA9ICJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyI7Citjb25zdCBjaGFyIGtCcmVha09uRmFpbHVyZUZsYWdbXSA9ICJicmVha19vbl9mYWlsdXJlIjsKK2NvbnN0IGNoYXIga0NhdGNoRXhjZXB0aW9uc0ZsYWdbXSA9ICJjYXRjaF9leGNlcHRpb25zIjsKK2NvbnN0IGNoYXIga0NvbG9yRmxhZ1tdID0gImNvbG9yIjsKK2NvbnN0IGNoYXIga0ZpbHRlckZsYWdbXSA9ICJmaWx0ZXIiOworY29uc3QgY2hhciBrTGlzdFRlc3RzRmxhZ1tdID0gImxpc3RfdGVzdHMiOworY29uc3QgY2hhciBrT3V0cHV0RmxhZ1tdID0gIm91dHB1dCI7Citjb25zdCBjaGFyIGtQcmludFRpbWVGbGFnW10gPSAicHJpbnRfdGltZSI7Citjb25zdCBjaGFyIGtSYW5kb21TZWVkRmxhZ1tdID0gInJhbmRvbV9zZWVkIjsKK2NvbnN0IGNoYXIga1JlcGVhdEZsYWdbXSA9ICJyZXBlYXQiOworY29uc3QgY2hhciBrU2h1ZmZsZUZsYWdbXSA9ICJzaHVmZmxlIjsKK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VEZXB0aEZsYWdbXSA9ICJzdGFja190cmFjZV9kZXB0aCI7Citjb25zdCBjaGFyIGtTdHJlYW1SZXN1bHRUb0ZsYWdbXSA9ICJzdHJlYW1fcmVzdWx0X3RvIjsKK2NvbnN0IGNoYXIga1Rocm93T25GYWlsdXJlRmxhZ1tdID0gInRocm93X29uX2ZhaWx1cmUiOworCisvLyBBIHZhbGlkIHJhbmRvbSBzZWVkIG11c3QgYmUgaW4gWzEsIGtNYXhSYW5kb21TZWVkXS4KK2NvbnN0IGludCBrTWF4UmFuZG9tU2VlZCA9IDk5OTk5OworCisvLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCisvLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGJvb2wgZ19oZWxwX2ZsYWc7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitHVEVTVF9BUElfIFRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgorR1RFU1RfQVBJXyBib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSk7CisKKy8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCitHVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpOworCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitHVEVTVF9BUElfIGJvb2wgUGFyc2VJbnQzMkZsYWcoCisgICAgY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpOworCisvLyBSZXR1cm5zIGEgcmFuZG9tIHNlZWQgaW4gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBiYXNlZCBvbiB0aGUKKy8vIGdpdmVuIC0tZ3Rlc3RfcmFuZG9tX3NlZWQgZmxhZyB2YWx1ZS4KK2lubGluZSBpbnQgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEludDMyIHJhbmRvbV9zZWVkX2ZsYWcpIHsKKyAgY29uc3QgdW5zaWduZWQgaW50IHJhd19zZWVkID0gKHJhbmRvbV9zZWVkX2ZsYWcgPT0gMCkgPworICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihHZXRUaW1lSW5NaWxsaXMoKSkgOgorICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyYW5kb21fc2VlZF9mbGFnKTsKKworICAvLyBOb3JtYWxpemVzIHRoZSBhY3R1YWwgc2VlZCB0byByYW5nZSBbMSwga01heFJhbmRvbVNlZWRdIHN1Y2ggdGhhdAorICAvLyBpdCdzIGVhc3kgdG8gdHlwZS4KKyAgY29uc3QgaW50IG5vcm1hbGl6ZWRfc2VlZCA9CisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KChyYXdfc2VlZCAtIDFVKSAlCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oa01heFJhbmRvbVNlZWQpKSArIDE7CisgIHJldHVybiBub3JtYWxpemVkX3NlZWQ7Cit9CisKKy8vIFJldHVybnMgdGhlIGZpcnN0IHZhbGlkIHJhbmRvbSBzZWVkIGFmdGVyICdzZWVkJy4gIFRoZSBiZWhhdmlvciBpcworLy8gdW5kZWZpbmVkIGlmICdzZWVkJyBpcyBpbnZhbGlkLiAgVGhlIHNlZWQgYWZ0ZXIga01heFJhbmRvbVNlZWQgaXMKKy8vIGNvbnNpZGVyZWQgdG8gYmUgMS4KK2lubGluZSBpbnQgR2V0TmV4dFJhbmRvbVNlZWQoaW50IHNlZWQpIHsKKyAgR1RFU1RfQ0hFQ0tfKDEgPD0gc2VlZCAmJiBzZWVkIDw9IGtNYXhSYW5kb21TZWVkKQorICAgICAgPDwgIkludmFsaWQgcmFuZG9tIHNlZWQgIiA8PCBzZWVkIDw8ICIgLSBtdXN0IGJlIGluIFsxLCAiCisgICAgICA8PCBrTWF4UmFuZG9tU2VlZCA8PCAiXS4iOworICBjb25zdCBpbnQgbmV4dF9zZWVkID0gc2VlZCArIDE7CisgIHJldHVybiAobmV4dF9zZWVkID4ga01heFJhbmRvbVNlZWQpID8gMSA6IG5leHRfc2VlZDsKK30KKworLy8gVGhpcyBjbGFzcyBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncyBpbiBpdHMgYyd0b3IsIGFuZAorLy8gcmVzdG9yZXMgdGhlbSBpbiBpdHMgZCd0b3IuCitjbGFzcyBHVGVzdEZsYWdTYXZlciB7CisgcHVibGljOgorICAvLyBUaGUgYyd0b3IuCisgIEdUZXN0RmxhZ1NhdmVyKCkgeworICAgIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXyA9IEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOworICAgIGJyZWFrX29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKTsKKyAgICBjYXRjaF9leGNlcHRpb25zXyA9IEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyk7CisgICAgY29sb3JfID0gR1RFU1RfRkxBRyhjb2xvcik7CisgICAgZGVhdGhfdGVzdF9zdHlsZV8gPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpOworICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmtfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKKyAgICBmaWx0ZXJfID0gR1RFU1RfRkxBRyhmaWx0ZXIpOworICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0XyA9IEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpOworICAgIGxpc3RfdGVzdHNfID0gR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKTsKKyAgICBvdXRwdXRfID0gR1RFU1RfRkxBRyhvdXRwdXQpOworICAgIHByaW50X3RpbWVfID0gR1RFU1RfRkxBRyhwcmludF90aW1lKTsKKyAgICByYW5kb21fc2VlZF8gPSBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKKyAgICByZXBlYXRfID0gR1RFU1RfRkxBRyhyZXBlYXQpOworICAgIHNodWZmbGVfID0gR1RFU1RfRkxBRyhzaHVmZmxlKTsKKyAgICBzdGFja190cmFjZV9kZXB0aF8gPSBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKTsKKyAgICBzdHJlYW1fcmVzdWx0X3RvXyA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7CisgICAgdGhyb3dfb25fZmFpbHVyZV8gPSBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpOworICB9CisKKyAgLy8gVGhlIGQndG9yIGlzIG5vdCB2aXJ0dWFsLiAgRE8gTk9UIElOSEVSSVQgRlJPTSBUSElTIENMQVNTLgorICB+R1Rlc3RGbGFnU2F2ZXIoKSB7CisgICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187CisgICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IGJyZWFrX29uX2ZhaWx1cmVfOworICAgIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBjYXRjaF9leGNlcHRpb25zXzsKKyAgICBHVEVTVF9GTEFHKGNvbG9yKSA9IGNvbG9yXzsKKyAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gZGVhdGhfdGVzdF9zdHlsZV87CisgICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IGRlYXRoX3Rlc3RfdXNlX2ZvcmtfOworICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9IGZpbHRlcl87CisgICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgPSBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF87CisgICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IGxpc3RfdGVzdHNfOworICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9IG91dHB1dF87CisgICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IHByaW50X3RpbWVfOworICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gcmFuZG9tX3NlZWRfOworICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IHJlcGVhdF87CisgICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IHNodWZmbGVfOworICAgIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID0gc3RhY2tfdHJhY2VfZGVwdGhfOworICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSBzdHJlYW1fcmVzdWx0X3RvXzsKKyAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdGhyb3dfb25fZmFpbHVyZV87CisgIH0KKyBwcml2YXRlOgorICAvLyBGaWVsZHMgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzIG9mIGZsYWdzLgorICBib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKKyAgYm9vbCBicmVha19vbl9mYWlsdXJlXzsKKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKKyAgU3RyaW5nIGNvbG9yXzsKKyAgU3RyaW5nIGRlYXRoX3Rlc3Rfc3R5bGVfOworICBib29sIGRlYXRoX3Rlc3RfdXNlX2ZvcmtfOworICBTdHJpbmcgZmlsdGVyXzsKKyAgU3RyaW5nIGludGVybmFsX3J1bl9kZWF0aF90ZXN0XzsKKyAgYm9vbCBsaXN0X3Rlc3RzXzsKKyAgU3RyaW5nIG91dHB1dF87CisgIGJvb2wgcHJpbnRfdGltZV87CisgIGJvb2wgcHJldHR5XzsKKyAgaW50ZXJuYWw6OkludDMyIHJhbmRvbV9zZWVkXzsKKyAgaW50ZXJuYWw6OkludDMyIHJlcGVhdF87CisgIGJvb2wgc2h1ZmZsZV87CisgIGludGVybmFsOjpJbnQzMiBzdGFja190cmFjZV9kZXB0aF87CisgIFN0cmluZyBzdHJlYW1fcmVzdWx0X3RvXzsKKyAgYm9vbCB0aHJvd19vbl9mYWlsdXJlXzsKK30gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87CisKKy8vIENvbnZlcnRzIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIGNvZGVfcG9pbnQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgVUludDMyIGJlY2F1c2Ugd2NoYXJfdCBtYXkgbm90IGJlCisvLyB3aWRlIGVub3VnaCB0byBjb250YWluIGEgY29kZSBwb2ludC4KKy8vIFRoZSBvdXRwdXQgYnVmZmVyIHN0ciBtdXN0IGNvbnRhaW50IGF0IGxlYXN0IDMyIGNoYXJhY3RlcnMuCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKy8vIElmIHRoZSBjb2RlX3BvaW50IGlzIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludAorLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgaXQgd2lsbCBiZSBvdXRwdXQKKy8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4KK0dURVNUX0FQSV8gY2hhciogQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50LCBjaGFyKiBzdHIpOworCisvLyBDb252ZXJ0cyBhIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KKy8vIFRoZSB3aWRlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKKy8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpCisvLyAgIFVURi0zMiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gNCAob24gTGludXgpCisvLyBQYXJhbWV0ZXIgc3RyIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4KKy8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyCisvLyBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLiAtMSBpcyB1c2VkIHdoZW4gdGhlIGVudGlyZSBzdHJpbmcKKy8vIHNob3VsZCBiZSBwcm9jZXNzZWQuCisvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzCisvLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSB0aGV5IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuIElmIHRoZSBzdHJpbmcgaXMgaW4gVVRGMTYgZW5jb2RpbmcKKy8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycworLy8gd2lsbCBiZSBlbmNvZGVkIGFzIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gQmFzaWMgTm9ybWFsIFBsYW5lLgorR1RFU1RfQVBJXyBTdHJpbmcgV2lkZVN0cmluZ1RvVXRmOChjb25zdCB3Y2hhcl90KiBzdHIsIGludCBudW1fY2hhcnMpOworCisvLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlCisvLyBpZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudC4gSWYgYSBmaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24sIHRoaXMKKy8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QKKy8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuCit2b2lkIFdyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpOworCisvLyBDaGVja3Mgd2hldGhlciBzaGFyZGluZyBpcyBlbmFibGVkIGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcy4gSWYgdGhlIHZhcmlhYmxlcyBhcmUgcHJlc2VudCwKKy8vIGJ1dCBpbmNvbnNpc3RlbnQgKGUuZy4sIHNoYXJkX2luZGV4ID49IHRvdGFsX3NoYXJkcyksIHByaW50cworLy8gYW4gZXJyb3IgYW5kIGV4aXRzLiBJZiBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0LCBzaGFyZGluZyBpcworLy8gZGlzYWJsZWQgYmVjYXVzZSBpdCBtdXN0IG9ubHkgYmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgdGVzdAorLy8gcHJvY2Vzcy4gT3RoZXJ3aXNlLCB3ZSBjb3VsZCBmaWx0ZXIgb3V0IGRlYXRoIHRlc3RzIHdlIGludGVuZGVkIHRvIGV4ZWN1dGUuCitHVEVTVF9BUElfIGJvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFyZF9pbmRleF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KTsKKworLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YXIgYXMgYW4gSW50MzIuIElmIGl0IGlzIHVuc2V0LAorLy8gcmV0dXJucyBkZWZhdWx0X3ZhbC4gSWYgaXQgaXMgbm90IGFuIEludDMyLCBwcmludHMgYW4gZXJyb3IgYW5kCisvLyBhbmQgYWJvcnRzLgorR1RFU1RfQVBJXyBJbnQzMiBJbnQzMkZyb21FbnZPckRpZShjb25zdCBjaGFyKiBlbnZfdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCk7CisKKy8vIEdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzLCB0aGUgc2hhcmQgaW5kZXgsIGFuZCB0aGUgdGVzdCBpZCwKKy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biBvbiB0aGlzIHNoYXJkLiBUaGUgdGVzdCBpZCBpcworLy8gc29tZSBhcmJpdHJhcnkgYnV0IHVuaXF1ZSBub24tbmVnYXRpdmUgaW50ZWdlciBhc3NpZ25lZCB0byBlYWNoIHRlc3QKKy8vIG1ldGhvZC4gQXNzdW1lcyB0aGF0IDAgPD0gc2hhcmRfaW5kZXggPCB0b3RhbF9zaGFyZHMuCitHVEVTVF9BUElfIGJvb2wgU2hvdWxkUnVuVGVzdE9uU2hhcmQoCisgICAgaW50IHRvdGFsX3NoYXJkcywgaW50IHNoYXJkX2luZGV4LCBpbnQgdGVzdF9pZCk7CisKKy8vIFNUTCBjb250YWluZXIgdXRpbGl0aWVzLgorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGNvbnRhaW5lciB0aGF0IHNhdGlzZnkKKy8vIHRoZSBnaXZlbiBwcmVkaWNhdGUuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyLCB0eXBlbmFtZSBQcmVkaWNhdGU+CitpbmxpbmUgaW50IENvdW50SWYoY29uc3QgQ29udGFpbmVyJiBjLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7CisgIC8vIEltcGxlbWVudGVkIGFzIGFuIGV4cGxpY2l0IGxvb3Agc2luY2Ugc3RkOjpjb3VudF9pZigpIGluIGxpYkNzdGQgb24KKyAgLy8gU29sYXJpcyBoYXMgYSBub24tc3RhbmRhcmQgc2lnbmF0dXJlLgorICBpbnQgY291bnQgPSAwOworICBmb3IgKHR5cGVuYW1lIENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjLmJlZ2luKCk7IGl0ICE9IGMuZW5kKCk7ICsraXQpIHsKKyAgICBpZiAocHJlZGljYXRlKCppdCkpCisgICAgICArK2NvdW50OworICB9CisgIHJldHVybiBjb3VudDsKK30KKworLy8gQXBwbGllcyBhIGZ1bmN0aW9uL2Z1bmN0b3IgdG8gZWFjaCBlbGVtZW50IGluIHRoZSBjb250YWluZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyLCB0eXBlbmFtZSBGdW5jdG9yPgordm9pZCBGb3JFYWNoKGNvbnN0IENvbnRhaW5lciYgYywgRnVuY3RvciBmdW5jdG9yKSB7CisgIHN0ZDo6Zm9yX2VhY2goYy5iZWdpbigpLCBjLmVuZCgpLCBmdW5jdG9yKTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IsIG9yIGRlZmF1bHRfdmFsdWUgaWYgaSBpcyBub3QKKy8vIGluIHJhbmdlIFswLCB2LnNpemUoKSkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KK2lubGluZSBFIEdldEVsZW1lbnRPcihjb25zdCBzdGQ6OnZlY3RvcjxFPiYgdiwgaW50IGksIEUgZGVmYXVsdF92YWx1ZSkgeworICByZXR1cm4gKGkgPCAwIHx8IGkgPj0gc3RhdGljX2Nhc3Q8aW50Pih2LnNpemUoKSkpID8gZGVmYXVsdF92YWx1ZSA6IHZbaV07Cit9CisKKy8vIFBlcmZvcm1zIGFuIGluLXBsYWNlIHNodWZmbGUgb2YgYSByYW5nZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuCisvLyAnYmVnaW4nIGFuZCAnZW5kJyBhcmUgZWxlbWVudCBpbmRpY2VzIGFzIGFuIFNUTC1zdHlsZSByYW5nZTsKKy8vIGkuZS4gW2JlZ2luLCBlbmQpIGFyZSBzaHVmZmxlZCwgd2hlcmUgJ2VuZCcgPT0gc2l6ZSgpIG1lYW5zIHRvCisvLyBzaHVmZmxlIHRvIHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPgordm9pZCBTaHVmZmxlUmFuZ2UoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tLCBpbnQgYmVnaW4sIGludCBlbmQsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxFPiogdikgeworICBjb25zdCBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PGludD4odi0+c2l6ZSgpKTsKKyAgR1RFU1RfQ0hFQ0tfKDAgPD0gYmVnaW4gJiYgYmVnaW4gPD0gc2l6ZSkKKyAgICAgIDw8ICJJbnZhbGlkIHNodWZmbGUgcmFuZ2Ugc3RhcnQgIiA8PCBiZWdpbiA8PCAiOiBtdXN0IGJlIGluIHJhbmdlIFswLCAiCisgICAgICA8PCBzaXplIDw8ICJdLiI7CisgIEdURVNUX0NIRUNLXyhiZWdpbiA8PSBlbmQgJiYgZW5kIDw9IHNpemUpCisgICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIGZpbmlzaCAiIDw8IGVuZCA8PCAiOiBtdXN0IGJlIGluIHJhbmdlIFsiCisgICAgICA8PCBiZWdpbiA8PCAiLCAiIDw8IHNpemUgPDwgIl0uIjsKKworICAvLyBGaXNoZXItWWF0ZXMgc2h1ZmZsZSwgZnJvbQorICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlci1ZYXRlc19zaHVmZmxlCisgIGZvciAoaW50IHJhbmdlX3dpZHRoID0gZW5kIC0gYmVnaW47IHJhbmdlX3dpZHRoID49IDI7IHJhbmdlX3dpZHRoLS0pIHsKKyAgICBjb25zdCBpbnQgbGFzdF9pbl9yYW5nZSA9IGJlZ2luICsgcmFuZ2Vfd2lkdGggLSAxOworICAgIGNvbnN0IGludCBzZWxlY3RlZCA9IGJlZ2luICsgcmFuZG9tLT5HZW5lcmF0ZShyYW5nZV93aWR0aCk7CisgICAgc3RkOjpzd2FwKCgqdilbc2VsZWN0ZWRdLCAoKnYpW2xhc3RfaW5fcmFuZ2VdKTsKKyAgfQorfQorCisvLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIHRoZSB2ZWN0b3IncyBlbGVtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPgoraW5saW5lIHZvaWQgU2h1ZmZsZShpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20sIHN0ZDo6dmVjdG9yPEU+KiB2KSB7CisgIFNodWZmbGVSYW5nZShyYW5kb20sIDAsIHN0YXRpY19jYXN0PGludD4odi0+c2l6ZSgpKSwgdik7Cit9CisKKy8vIEEgZnVuY3Rpb24gZm9yIGRlbGV0aW5nIGFuIG9iamVjdC4gIEhhbmR5IGZvciBiZWluZyB1c2VkIGFzIGEKKy8vIGZ1bmN0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIERlbGV0ZShUKiB4KSB7CisgIGRlbGV0ZSB4OworfQorCisvLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUga2V5IG9mIGEgVGVzdFByb3BlcnR5IGFnYWluc3QgYSBrbm93biBrZXkuCisvLworLy8gVGVzdFByb3BlcnR5S2V5SXMgaXMgY29weWFibGUuCitjbGFzcyBUZXN0UHJvcGVydHlLZXlJcyB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgLy8KKyAgLy8gVGVzdFByb3BlcnR5S2V5SXMgaGFzIE5PIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIGV4cGxpY2l0IFRlc3RQcm9wZXJ0eUtleUlzKGNvbnN0IGNoYXIqIGtleSkKKyAgICAgIDoga2V5XyhrZXkpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBuYW1lIG9mIHRlc3QgcHJvcGVydHkgbWF0Y2hlcyBvbiBrZXlfLgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZyh0ZXN0X3Byb3BlcnR5LmtleSgpKS5Db21wYXJlKGtleV8pID09IDA7CisgIH0KKworIHByaXZhdGU6CisgIFN0cmluZyBrZXlfOworfTsKKworLy8gQ2xhc3MgVW5pdFRlc3RPcHRpb25zLgorLy8KKy8vIFRoaXMgY2xhc3MgY29udGFpbnMgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIG9wdGlvbnMgdGhlIHVzZXIKKy8vIHNwZWNpZmllcyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLiAgSXQgaGFzIG9ubHkgc3RhdGljIG1lbWJlcnMuCisvLworLy8gSW4gbW9zdCBjYXNlcywgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYW4gb3B0aW9uIHVzaW5nIGVpdGhlciBhbgorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYSBjb21tYW5kIGxpbmUgZmxhZy4gIEUuZy4geW91IGNhbiBzZXQgdGhlCisvLyB0ZXN0IGZpbHRlciB1c2luZyBlaXRoZXIgR1RFU1RfRklMVEVSIG9yIC0tZ3Rlc3RfZmlsdGVyLiAgSWYgYm90aAorLy8gdGhlIHZhcmlhYmxlIGFuZCB0aGUgZmxhZyBhcmUgcHJlc2VudCwgdGhlIGxhdHRlciBvdmVycmlkZXMgdGhlCisvLyBmb3JtZXIuCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0T3B0aW9ucyB7CisgcHVibGljOgorICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLgorCisgIC8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuCisgIHN0YXRpYyBTdHJpbmcgR2V0T3V0cHV0Rm9ybWF0KCk7CisKKyAgLy8gUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIG91dHB1dCBmaWxlLCBvciB0aGUKKyAgLy8gZGVmYXVsdCAodGVzdF9kZXRhaWwueG1sIGluIHRoZSBvcmlnaW5hbCB3b3JraW5nIGRpcmVjdG9yeSkgaWYKKyAgLy8gbm9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCisgIHN0YXRpYyBTdHJpbmcgR2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7CisKKyAgLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9maWx0ZXIgZmxhZy4KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB3aWxkY2FyZCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHN0cmluZy4gIFRoZQorICAvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgorICAvLworICAvLyBUaGlzIHJlY3Vyc2l2ZSBhbGdvcml0aG0gaXNuJ3QgdmVyeSBlZmZpY2llbnQsIGJ1dCBpcyBjbGVhciBhbmQKKyAgLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KKyAgc3RhdGljIGJvb2wgUGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCisgIC8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCisgIHN0YXRpYyBib29sIEZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IFN0cmluZyAmdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyAmdGVzdF9uYW1lKTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gRnVuY3Rpb24gZm9yIHN1cHBvcnRpbmcgdGhlIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbiBmbGFnLgorCisgIC8vIFJldHVybnMgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiBpZiBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIHRoZQorICAvLyBnaXZlbiBTRUggZXhjZXB0aW9uLCBvciBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIIG90aGVyd2lzZS4KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgYXMgYW4gX19leGNlcHQgY29uZGl0aW9uLgorICBzdGF0aWMgaW50IEdUZXN0U2hvdWxkUHJvY2Vzc1NFSChEV09SRCBleGNlcHRpb25fY29kZSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICAvLyBSZXR1cm5zIHRydWUgaWYgIm5hbWUiIG1hdGNoZXMgdGhlICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBnbG9iLXN0eWxlCisgIC8vIGZpbHRlcnMgaW4gImZpbHRlciIuCisgIHN0YXRpYyBib29sIE1hdGNoZXNGaWx0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpOworfTsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKKy8vIGlzIHByZXNlbnQuICBVc2VkIGJ5IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0RmlsZS4KK0dURVNUX0FQSV8gRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCk7CisKKy8vIFRoZSByb2xlIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgT1Mgc3RhY2sgdHJhY2UgYXMgYSBzdHJpbmcuCitjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KKyAgdmlydHVhbCB+T3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KKworICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGEgU3RyaW5nLiAgUGFyYW1ldGVyczoKKyAgLy8KKyAgLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAorICAvLyAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UuCisgIC8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50CisgIC8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgorICB2aXJ0dWFsIFN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCkgPSAwOworCisgIC8vIFVwb25MZWF2aW5nR1Rlc3QoKSBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBHb29nbGUgVGVzdCBjYWxscworICAvLyB1c2VyIGNvZGUuIEl0IHNhdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhY2sgdGhhdAorICAvLyBDdXJyZW50U3RhY2tUcmFjZSgpIHdpbGwgdXNlIHRvIGZpbmQgYW5kIGhpZGUgR29vZ2xlIFRlc3Qgc3RhY2sgZnJhbWVzLgorICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpID0gMDsKKworIHByaXZhdGU6CisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKTsKK307CisKKy8vIEEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIGludGVyZmFjZS4KK2NsYXNzIE9zU3RhY2tUcmFjZUdldHRlciA6IHB1YmxpYyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgT3NTdGFja1RyYWNlR2V0dGVyKCkgOiBjYWxsZXJfZnJhbWVfKE5VTEwpIHt9CisgIHZpcnR1YWwgU3RyaW5nIEN1cnJlbnRTdGFja1RyYWNlKGludCBtYXhfZGVwdGgsIGludCBza2lwX2NvdW50KTsKKyAgdmlydHVhbCB2b2lkIFVwb25MZWF2aW5nR1Rlc3QoKTsKKworICAvLyBUaGlzIHN0cmluZyBpcyBpbnNlcnRlZCBpbiBwbGFjZSBvZiBzdGFjayBmcmFtZXMgdGhhdCBhcmUgcGFydCBvZgorICAvLyBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uLgorICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0VsaWRlZEZyYW1lc01hcmtlcjsKKworIHByaXZhdGU6CisgIE11dGV4IG11dGV4XzsgIC8vIHByb3RlY3RzIGFsbCBpbnRlcm5hbCBzdGF0ZQorCisgIC8vIFdlIHNhdmUgdGhlIHN0YWNrIGZyYW1lIGJlbG93IHRoZSBmcmFtZSB0aGF0IGNhbGxzIHVzZXIgY29kZS4KKyAgLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBpbW1lZGlhdGVseSBiZWxvdworICAvLyB0aGUgdXNlciBjb2RlIGNoYW5nZXMgYmV0d2VlbiB0aGUgY2FsbCB0byBVcG9uTGVhdmluZ0dUZXN0KCkKKyAgLy8gYW5kIGFueSBjYWxscyB0byBDdXJyZW50U3RhY2tUcmFjZSgpIGZyb20gd2l0aGluIHRoZSB1c2VyIGNvZGUuCisgIHZvaWQqIGNhbGxlcl9mcmFtZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhPc1N0YWNrVHJhY2VHZXR0ZXIpOworfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBHb29nbGUgVGVzdCB0cmFjZSBwb2ludC4KK3N0cnVjdCBUcmFjZUluZm8geworICBjb25zdCBjaGFyKiBmaWxlOworICBpbnQgbGluZTsKKyAgU3RyaW5nIG1lc3NhZ2U7Cit9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4gVW5pdFRlc3RJbXBsLgorLy8gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KK2NsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpOworICAvLyBJbXBsZW1lbnRzIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlLiBSZXBvcnRzIHRoZSB0ZXN0IHBhcnQKKyAgLy8gcmVzdWx0IGluIHRoZSBjdXJyZW50IHRlc3QuCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKworIHByaXZhdGU6CisgIFVuaXRUZXN0SW1wbCogY29uc3QgdW5pdF90ZXN0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKK307CisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGVyIHRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4KKy8vIFVuaXRUZXN0SW1wbC4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KK2NsYXNzIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7CisgIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBqdXN0CisgIC8vIGRlbGVnYXRlcyB0byB0aGUgY3VycmVudCBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBvZiAqdW5pdF90ZXN0Xy4KKyAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOworCisgcHJpdmF0ZToKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOworfTsKKworLy8gVGhlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzLiAgV2UgZG9uJ3QgcHJvdGVjdAorLy8gdGhlIG1ldGhvZHMgdW5kZXIgYSBtdXRleCwgYXMgdGhpcyBjbGFzcyBpcyBub3QgYWNjZXNzaWJsZSBieSBhCisvLyB1c2VyIGFuZCB0aGUgVW5pdFRlc3QgY2xhc3MgdGhhdCBkZWxlZ2F0ZXMgd29yayB0byB0aGlzIGNsYXNzIGRvZXMKKy8vIHByb3BlciBsb2NraW5nLgorY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdEltcGwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVW5pdFRlc3RJbXBsKFVuaXRUZXN0KiBwYXJlbnQpOworICB2aXJ0dWFsIH5Vbml0VGVzdEltcGwoKTsKKworICAvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIHJlZ2lzdGVyIHlvdXIgb3duIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIuCisgIC8vIFlvdSBjYW4gcmVnaXN0ZXIgeW91ciBvd24gcmVwb3RlciB0byBsaXN0ZW4gZWl0aGVyIG9ubHkgZm9yIHRlc3QgcmVzdWx0cworICAvLyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZCBvciBmb3IgcmVzdWx0cyBmcm9tIGFsbCB0aHJlYWRzLgorICAvLyBCeSBkZWZhdWx0LCBlYWNoIHBlci10aHJlYWQgdGVzdCByZXN1bHQgcmVwb3RlciBqdXN0IHBhc3NlcyBhIG5ldworICAvLyBUZXN0UGFydFJlc3VsdCB0byB0aGUgZ2xvYmFsIHRlc3QgcmVzdWx0IHJlcG9ydGVyLCB3aGljaCByZWdpc3RlcnMgdGhlCisgIC8vIHRlc3QgcGFydCByZXN1bHQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LgorCisgIC8vIFJldHVybnMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7CisKKyAgLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCisgIHZvaWQgU2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKTsKKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7CisKKyAgLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICB2b2lkIFNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAorICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KKyAgaW50IGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCisgIGludCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisgIC8vIHRoYXQgc2hvdWxkIHJ1bi4KKyAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgorICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAorICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSA+IDAgfHwgYWRfaG9jX3Rlc3RfcmVzdWx0KCktPkZhaWxlZCgpOworICB9CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIGNvbnN0IFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3QgeworICAgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2Nhc2VfaW5kaWNlc18sIGksIC0xKTsKKyAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2ldOworICB9CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpIHsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7CisgICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2Nhc2VzX1tpbmRleF07CisgIH0KKworICAvLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVyIGxpc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzKCkgeyByZXR1cm4gJmxpc3RlbmVyc187IH0KKworICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsIG9yCisgIC8vIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorICBUZXN0UmVzdWx0KiBjdXJyZW50X3Rlc3RfcmVzdWx0KCk7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0LgorICBjb25zdCBUZXN0UmVzdWx0KiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsgfQorCisgIC8vIFNldHMgdGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4KKyAgLy8KKyAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyCisgIC8vIGFyZSB0aGUgc2FtZTsgb3RoZXJ3aXNlLCBkZWxldGVzIHRoZSBvbGQgZ2V0dGVyIGFuZCBtYWtlcyB0aGUKKyAgLy8gaW5wdXQgdGhlIGN1cnJlbnQgZ2V0dGVyLgorICB2b2lkIHNldF9vc19zdGFja190cmFjZV9nZXR0ZXIoT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBnZXR0ZXIpOworCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOworICAvLyBvdGhlcndpc2UsIGNyZWF0ZXMgYW4gT3NTdGFja1RyYWNlR2V0dGVyLCBtYWtlcyBpdCB0aGUgY3VycmVudAorICAvLyBnZXR0ZXIsIGFuZCByZXR1cm5zIGl0LgorICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIG9zX3N0YWNrX3RyYWNlX2dldHRlcigpOworCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYSBTdHJpbmcuCisgIC8vCisgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisgIC8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisgIC8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorICAvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorICAvLworICAvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKyAgLy8gQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgLy8gdHJhY2UgYnV0IEJhcigpIGFuZCBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCisgIFN0cmluZyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKGludCBza2lwX2NvdW50KTsKKworICAvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAorICAvLyBleGlzdCwgY3JlYXRlcyBvbmUgYW5kIHJldHVybnMgaXQuCisgIC8vCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gICB0ZXN0X2Nhc2VfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgIC8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKyAgLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICAvLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorICBUZXN0Q2FzZSogR2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKKworICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhlIHVuaXQgdGVzdC4KKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisgIC8vICAgdGVzdF9pbmZvOiAgICB0aGUgVGVzdEluZm8gb2JqZWN0CisgIHZvaWQgQWRkVGVzdEluZm8oVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0cywgd2UgbmVlZCB0bworICAgIC8vIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSB0ZXN0IHByb2dyYW0KKyAgICAvLyB3YXMgZmlyc3QgaW52b2tlZC4gIFdlIGNhbm5vdCBkbyB0aGlzIGluIFJVTl9BTExfVEVTVFMoKSwgYXMKKyAgICAvLyB0aGUgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgY2FsbGluZworICAgIC8vIFJVTl9BTExfVEVTVFMoKS4gIFRoZXJlZm9yZSB3ZSBjYXB0dXJlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbgorICAgIC8vIEFkZFRlc3RJbmZvKCksIHdoaWNoIGlzIGNhbGxlZCB0byByZWdpc3RlciBhIFRFU1Qgb3IgVEVTVF9GCisgICAgLy8gYmVmb3JlIG1haW4oKSBpcyByZWFjaGVkLgorICAgIGlmIChvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKSB7CisgICAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8uU2V0KEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkpOworICAgICAgR1RFU1RfQ0hFQ0tfKCFvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKQorICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiI7CisgICAgfQorCisgICAgR2V0VGVzdENhc2UodGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpLAorICAgICAgICAgICAgICAgIHRlc3RfaW5mby0+dHlwZV9wYXJhbSgpLAorICAgICAgICAgICAgICAgIHNldF91cF90YywKKyAgICAgICAgICAgICAgICB0ZWFyX2Rvd25fdGMpLT5BZGRUZXN0SW5mbyh0ZXN0X2luZm8pOworICB9CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkgeworICAgIHJldHVybiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworICB9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKyAgLy8gU2V0cyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9jYXNlKFRlc3RDYXNlKiBhX2N1cnJlbnRfdGVzdF9jYXNlKSB7CisgICAgY3VycmVudF90ZXN0X2Nhc2VfID0gYV9jdXJyZW50X3Rlc3RfY2FzZTsKKyAgfQorCisgIC8vIFNldHMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLiAgSWYKKyAgLy8gY3VycmVudF90ZXN0X2luZm8gaXMgTlVMTCwgdGhlIGFzc2VydGlvbiByZXN1bHRzIHdpbGwgYmUgc3RvcmVkIGluCisgIC8vIGFkX2hvY190ZXN0X3Jlc3VsdF8uCisgIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9pbmZvKFRlc3RJbmZvKiBhX2N1cnJlbnRfdGVzdF9pbmZvKSB7CisgICAgY3VycmVudF90ZXN0X2luZm9fID0gYV9jdXJyZW50X3Rlc3RfaW5mbzsKKyAgfQorCisgIC8vIFJlZ2lzdGVycyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyBkZWZpbmVkIHVzaW5nIFRFU1RfUCBhbmQKKyAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AsIGNyZWF0aW5nIHJlZ3VsYXIgdGVzdHMgZm9yIGVhY2ggdGVzdC9wYXJhbWV0ZXIKKyAgLy8gY29tYmluYXRpb24uIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2U7IGl0IGhhcyBndWFyZHMKKyAgLy8gcHJvdGVjdGluZyBmcm9tIHJlZ2lzdGVyaW5nIHRoZSB0ZXN0cyBtb3JlIHRoZW4gb25jZS4gIElmCisgIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGRpc2FibGVkLCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cyBpcworICAvLyBwcmVzZW50IGJ1dCBkb2VzIG5vdGhpbmcuCisgIHZvaWQgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKKworICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAorICAvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcworICAvLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhpcyB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQKKyAgLy8gdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLgorICBib29sIFJ1bkFsbFRlc3RzKCk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cywgZXhjZXB0IHRoZSBhZCBob2MgdGVzdHMuCisgIHZvaWQgQ2xlYXJOb25BZEhvY1Rlc3RSZXN1bHQoKSB7CisgICAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgVGVzdENhc2U6OkNsZWFyVGVzdENhc2VSZXN1bHQpOworICB9CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFkLWhvYyB0ZXN0IGFzc2VydGlvbnMuCisgIHZvaWQgQ2xlYXJBZEhvY1Rlc3RSZXN1bHQoKSB7CisgICAgYWRfaG9jX3Rlc3RfcmVzdWx0Xy5DbGVhcigpOworICB9CisKKyAgZW51bSBSZWFjdGlvblRvU2hhcmRpbmcgeworICAgIEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLAorICAgIElHTk9SRV9TSEFSRElOR19QUk9UT0NPTAorICB9OworCisgIC8vIE1hdGNoZXMgdGhlIGZ1bGwgbmFtZSBvZiBlYWNoIHRlc3QgYWdhaW5zdCB0aGUgdXNlci1zcGVjaWZpZWQKKyAgLy8gZmlsdGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBydW4sIHRoZW4gcmVjb3JkcyB0aGUKKyAgLy8gcmVzdWx0IGluIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KKyAgLy8gSWYgc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cworICAvLyBiYXNlZCBvbiBzaGFyZGluZyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50LgorICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgRmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKTsKKworICAvLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCisgIHZvaWQgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKKworICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfY2FzZV87IH0KKyAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9CisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KKyAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgorICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+JiBlbnZpcm9ubWVudHMoKSB7IHJldHVybiBlbnZpcm9ubWVudHNfOyB9CisKKyAgLy8gR2V0dGVycyBmb3IgdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgeworICAgIHJldHVybiAqKGd0ZXN0X3RyYWNlX3N0YWNrXy5wb2ludGVyKCkpOworICB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgY29uc3QgeworICAgIHJldHVybiBndGVzdF90cmFjZV9zdGFja18uZ2V0KCk7CisgIH0KKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIHZvaWQgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpIHsKKyAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5yZXNldChQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpKTsKKyAgfQorICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QKKyAgLy8gZmxhZywgb3IgTlVMTCBpZiB0aGF0IGZsYWcgd2FzIG5vdCBzcGVjaWZpZWQuCisgIC8vIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisgIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIHRvIEluaXRHb29nbGVUZXN0LgorICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpOworICB9CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVhdGggdGVzdCBmYWN0b3J5LgorICBpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeSogZGVhdGhfdGVzdF9mYWN0b3J5KCkgeworICAgIHJldHVybiBkZWF0aF90ZXN0X2ZhY3RvcnlfLmdldCgpOworICB9CisKKyAgdm9pZCBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOworCisgIGZyaWVuZCBjbGFzcyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQorICAvLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCisgIHZvaWQgQ29uZmlndXJlWG1sT3V0cHV0KCk7CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byBhIHNvY2tldC4KKyAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KKyAgdm9pZCBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKKyNlbmRpZgorCisgIC8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCisgIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvCisgIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAgLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4KKyAgdm9pZCBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7CisKKyAgLy8gR2V0cyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBpdGVyYXRpb24uCisgIGludCByYW5kb21fc2VlZCgpIGNvbnN0IHsgcmV0dXJuIHJhbmRvbV9zZWVkXzsgfQorCisgIC8vIEdldHMgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICBpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20oKSB7IHJldHVybiAmcmFuZG9tXzsgfQorCisgIC8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKKyAgLy8gbWFraW5nIHN1cmUgdGhhdCBkZWF0aCB0ZXN0cyBhcmUgc3RpbGwgcnVuIGZpcnN0LgorICB2b2lkIFNodWZmbGVUZXN0cygpOworCisgIC8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCisgIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKKworICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQKKyAgLy8gVW5pdFRlc3Q6OlJ1bigpIHN0YXJ0cy4KKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4gY2F0Y2hfZXhjZXB0aW9uc187IH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OlVuaXRUZXN0OworCisgIC8vIFVzZWQgYnkgVW5pdFRlc3Q6OlJ1bigpIHRvIGNhcHR1cmUgdGhlIHN0YXRlIG9mCisgIC8vIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBpdCBzdGFydHMuCisgIHZvaWQgc2V0X2NhdGNoX2V4Y2VwdGlvbnMoYm9vbCB2YWx1ZSkgeyBjYXRjaF9leGNlcHRpb25zXyA9IHZhbHVlOyB9CisKKyAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0aGF0IG93bnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCisgIFVuaXRUZXN0KiBjb25zdCBwYXJlbnRfOworCisgIC8vIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCisgIC8vIGV4ZWN1dGVkLgorICBpbnRlcm5hbDo6RmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOworCisgIC8vIFRoZSBkZWZhdWx0IHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXJzLgorICBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKyAgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKKworICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKKworICAvLyBQcm90ZWN0cyByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLgorICBpbnRlcm5hbDo6TXV0ZXggZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfOworCisgIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgcGVyLXRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgorICBpbnRlcm5hbDo6VGhyZWFkTG9jYWw8VGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSo+CisgICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCisgIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KKyAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiBlbnZpcm9ubWVudHNfOworCisgIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdENhc2VzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUKKyAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiB0ZXN0X2Nhc2VzXzsKKworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBjYXNlIGxpc3QgdG8gYWxsb3cKKyAgLy8gZWFzeSBzaHVmZmxpbmcgYW5kIHJlc3RvcmluZyB0aGUgdGVzdCBjYXNlIG9yZGVyLiAgVGhlIGktdGgKKyAgLy8gZWxlbWVudCBvZiB0aGlzIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBjYXNlIGluIHRoZQorICAvLyBzaHVmZmxlZCBvcmRlci4KKyAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2Nhc2VfaW5kaWNlc187CisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAvLyBQYXJhbWV0ZXJpemVkVGVzdFJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIHJlZ2lzdGVyIHZhbHVlLXBhcmFtZXRlcml6ZWQKKyAgLy8gdGVzdHMuCisgIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOworCisgIC8vIEluZGljYXRlcyB3aGV0aGVyIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkIGFscmVhZHkuCisgIGJvb2wgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXzsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBJbmRleCBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UgcmVnaXN0ZXJlZC4gIEluaXRpYWxseSAtMS4KKyAgaW50IGxhc3RfZGVhdGhfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdENhc2UgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgY2FzZSBhZnRlciBhbm90aGVyLgorICAvLyBXaGVuIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3QKKyAgLy8gc3RvcmVzIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KKyAgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlXzsKKworICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdEluZm8gZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKKyAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgYWZ0ZXIgYW5vdGhlci4gIFdoZW4KKyAgLy8gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdCBzdG9yZXMKKyAgLy8gYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgorICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm9fOworCisgIC8vIE5vcm1hbGx5LCBhIHVzZXIgb25seSB3cml0ZXMgYXNzZXJ0aW9ucyBpbnNpZGUgYSBURVNUIG9yIFRFU1RfRiwKKyAgLy8gb3IgaW5zaWRlIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IGEgVEVTVCBvciBURVNUX0YuICBTaW5jZSBHb29nbGUKKyAgLy8gVGVzdCBrZWVwcyB0cmFjayBvZiB3aGljaCB0ZXN0IGlzIGN1cnJlbnQgcnVubmluZywgaXQgY2FuCisgIC8vIGFzc29jaWF0ZSBzdWNoIGFuIGFzc2VydGlvbiB3aXRoIHRoZSB0ZXN0IGl0IGJlbG9uZ3MgdG8uCisgIC8vCisgIC8vIElmIGFuIGFzc2VydGlvbiBpcyBlbmNvdW50ZXJlZCB3aGVuIG5vIFRFU1Qgb3IgVEVTVF9GIGlzIHJ1bm5pbmcsCisgIC8vIEdvb2dsZSBUZXN0IGF0dHJpYnV0ZXMgdGhlIGFzc2VydGlvbiByZXN1bHQgdG8gYW4gaW1hZ2luYXJ5ICJhZCBob2MiCisgIC8vIHRlc3QsIGFuZCByZWNvcmRzIHRoZSByZXN1bHQgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KKyAgVGVzdFJlc3VsdCBhZF9ob2NfdGVzdF9yZXN1bHRfOworCisgIC8vIFRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cyBpbnNpZGUKKyAgLy8gR29vZ2xlIFRlc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnNfOworCisgIC8vIFRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuICBXaWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgVW5pdFRlc3QKKyAgLy8gb2JqZWN0IGlzIGRlc3RydWN0ZWQuICBCeSBkZWZhdWx0LCBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIgaXMgdXNlZCwKKyAgLy8gYnV0IHRoZSB1c2VyIGNhbiBzZXQgdGhpcyBmaWVsZCB0byB1c2UgYSBjdXN0b20gZ2V0dGVyIGlmIHRoYXQgaXMKKyAgLy8gZGVzaXJlZC4KKyAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXJfOworCisgIC8vIFRydWUgaWZmIFBvc3RGbGFnUGFyc2luZ0luaXQoKSBoYXMgYmVlbiBjYWxsZWQuCisgIGJvb2wgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXzsKKworICAvLyBUaGUgcmFuZG9tIG51bWJlciBzZWVkIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVzdCBydW4uCisgIGludCByYW5kb21fc2VlZF87CisKKyAgLy8gT3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICBpbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87CisKKyAgLy8gSG93IGxvbmcgdGhlIHRlc3QgdG9vayB0byBydW4sIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAvLyBUaGUgZGVjb21wb3NlZCBjb21wb25lbnRzIG9mIHRoZSBndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLAorICAvLyBwYXJzZWQgd2hlbiBSVU5fQUxMX1RFU1RTIGlzIGNhbGxlZC4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnPiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXzsKKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8aW50ZXJuYWw6OkRlYXRoVGVzdEZhY3Rvcnk+IGRlYXRoX3Rlc3RfZmFjdG9yeV87CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgLy8gQSBwZXItdGhyZWFkIHN0YWNrIG9mIHRyYWNlcyBjcmVhdGVkIGJ5IHRoZSBTQ09QRURfVFJBQ0UoKSBtYWNyby4KKyAgaW50ZXJuYWw6OlRocmVhZExvY2FsPHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4gPiBndGVzdF90cmFjZV9zdGFja187CisKKyAgLy8gVGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBSdW5BbGxUZXN0cygpCisgIC8vIHN0YXJ0cy4KKyAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0SW1wbCk7Cit9OyAgLy8gY2xhc3MgVW5pdFRlc3RJbXBsCisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcgdGhlIGdsb2JhbCBVbml0VGVzdAorLy8gaW1wbGVtZW50YXRpb24gb2JqZWN0LgoraW5saW5lIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCkgeworICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKTsKK30KKworI2lmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyB0aGUgc2ltcGxlIHJlZ3VsYXIKKy8vIGV4cHJlc3Npb24gbWF0Y2hlci4KK0dURVNUX0FQSV8gYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgSXNBc2NpaURpZ2l0KGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc1JlcGVhdChjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV2hpdGVTcGFjZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBJc0FzY2lpV29yZENoYXIoY2hhciBjaCk7CitHVEVTVF9BUElfIGJvb2wgSXNWYWxpZEVzY2FwZShjaGFyIGNoKTsKK0dURVNUX0FQSV8gYm9vbCBBdG9tTWF0Y2hlc0NoYXIoYm9vbCBlc2NhcGVkLCBjaGFyIHBhdHRlcm4sIGNoYXIgY2gpOworR1RFU1RfQVBJXyBib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpOworR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBdEhlYWQoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgYm9vbCBlc2NhcGVkLCBjaGFyIGNoLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7CitHVEVTVF9BUElfIGJvb2wgTWF0Y2hSZWdleEFueXdoZXJlKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOworCisjZW5kaWYgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKKy8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0LgorR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKK0dURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yLCByZWdhcmRsZXNzIG9mIHRoZQorLy8gcGxhdGZvcm0uCitHVEVTVF9BUElfIFN0cmluZyBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKy8vIFByb3ZpZGVzIGxlYWstc2FmZSBXaW5kb3dzIGtlcm5lbCBoYW5kbGUgb3duZXJzaGlwLgorY2xhc3MgQXV0b0hhbmRsZSB7CisgcHVibGljOgorICBBdXRvSGFuZGxlKCkgOiBoYW5kbGVfKElOVkFMSURfSEFORExFX1ZBTFVFKSB7fQorICBleHBsaWNpdCBBdXRvSGFuZGxlKEhBTkRMRSBoYW5kbGUpIDogaGFuZGxlXyhoYW5kbGUpIHt9CisKKyAgfkF1dG9IYW5kbGUoKSB7IFJlc2V0KCk7IH0KKworICBIQU5ETEUgR2V0KCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQorICB2b2lkIFJlc2V0KCkgeyBSZXNldChJTlZBTElEX0hBTkRMRV9WQUxVRSk7IH0KKyAgdm9pZCBSZXNldChIQU5ETEUgaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSAhPSBoYW5kbGVfKSB7CisgICAgICBpZiAoaGFuZGxlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgOjpDbG9zZUhhbmRsZShoYW5kbGVfKTsKKyAgICAgIGhhbmRsZV8gPSBoYW5kbGU7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBIQU5ETEUgaGFuZGxlXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEF1dG9IYW5kbGUpOworfTsKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gQXR0ZW1wdHMgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBhIHBvc2l0aXZlIGludGVnZXIgcG9pbnRlZCB0byBieSB0aGUKKy8vIG51bWJlciBwYXJhbWV0ZXIuICBSZXR1cm5zIHRydWUgaWYgdGhhdCBpcyBwb3NzaWJsZS4KKy8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UKKy8vIGl0IGhlcmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZWdlcj4KK2Jvb2wgUGFyc2VOYXR1cmFsTnVtYmVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgSW50ZWdlciogbnVtYmVyKSB7CisgIC8vIEZhaWwgZmFzdCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGRvZXMgbm90IGJlZ2luIHdpdGggYSBkaWdpdDsKKyAgLy8gdGhpcyBieXBhc3NlcyBzdHJ0b1hYWCdzICJvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHBsdXMKKyAgLy8gb3IgbWludXMgc2lnbiIgc2VtYW50aWNzLCB3aGljaCBhcmUgdW5kZXNpcmFibGUgaGVyZS4KKyAgaWYgKHN0ci5lbXB0eSgpIHx8ICFJc0RpZ2l0KHN0clswXSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZXJybm8gPSAwOworCisgIGNoYXIqIGVuZDsKKyAgLy8gQmlnZ2VzdENvbnZlcnRpYmxlIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZSB0aGF0IHN5c3RlbS1wcm92aWRlZAorICAvLyBzdHJpbmctdG8tbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMgY2FuIHJldHVybi4KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQorCisgIC8vIE1TVkMgYW5kIEMrKyBCdWlsZGVyIGRlZmluZSBfX2ludDY0IGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGxvbmcgbG9uZy4KKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IEJpZ2dlc3RDb252ZXJ0aWJsZTsKKyAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IF9zdHJ0b3VpNjQoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsKKworIyBlbHNlCisKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdENvbnZlcnRpYmxlOyAgLy8gTk9MSU5UCisgIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBzdHJ0b3VsbChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworCisjIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQorCisgIGNvbnN0IGJvb2wgcGFyc2Vfc3VjY2VzcyA9ICplbmQgPT0gJ1wwJyAmJiBlcnJubyA9PSAwOworCisgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IENvbnZlcnQgdGhpcyB0byBjb21waWxlIHRpbWUgYXNzZXJ0aW9uIHdoZW4gaXQgaXMKKyAgLy8gYXZhaWxhYmxlLgorICBHVEVTVF9DSEVDS18oc2l6ZW9mKEludGVnZXIpIDw9IHNpemVvZihwYXJzZWQpKTsKKworICBjb25zdCBJbnRlZ2VyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludGVnZXI+KHBhcnNlZCk7CisgIGlmIChwYXJzZV9zdWNjZXNzICYmIHN0YXRpY19jYXN0PEJpZ2dlc3RDb252ZXJ0aWJsZT4ocmVzdWx0KSA9PSBwYXJzZWQpIHsKKyAgICAqbnVtYmVyID0gcmVzdWx0OworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGVzdFJlc3VsdCBjb250YWlucyBzb21lIHByaXZhdGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gZnJvbQorLy8gR29vZ2xlIFRlc3QgdXNlciBidXQgYXJlIHJlcXVpcmVkIGZvciB0ZXN0aW5nLiBUaGlzIGNsYXNzIGFsbG93IG91ciB0ZXN0cworLy8gdG8gYWNjZXNzIHRoZW0uCisvLworLy8gVGhpcyBjbGFzcyBpcyBzdXBwbGllZCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duCisvLyBjb25zdHJ1Y3RzLiBEbyBub3QgdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5KSB7CisgICAgdGVzdF9yZXN1bHQtPlJlY29yZFByb3BlcnR5KHByb3BlcnR5KTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0KSB7CisgICAgdGVzdF9yZXN1bHQtPkNsZWFyVGVzdFBhcnRSZXN1bHRzKCk7CisgIH0KKworICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygKKyAgICAgIGNvbnN0IFRlc3RSZXN1bHQmIHRlc3RfcmVzdWx0KSB7CisgICAgcmV0dXJuIHRlc3RfcmVzdWx0LnRlc3RfcGFydF9yZXN1bHRzKCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkNvdW50SWY7Cit1c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsKK3VzaW5nIGludGVybmFsOjpHZXRFbGVtZW50T3I7Cit1c2luZyBpbnRlcm5hbDo6U2h1ZmZsZTsKKworLy8gQ29uc3RhbnRzLgorCisvLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMKKy8vIGRpc2FibGVkIGFuZCBub3QgcnVuLgorc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVUZXN0RmlsdGVyW10gPSAiRElTQUJMRURfKjoqL0RJU0FCTEVEXyoiOworCisvLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMgY29uc2lkZXJlZCBhIGRlYXRoCisvLyB0ZXN0IGNhc2UgYW5kIHdpbGwgYmUgcnVuIGJlZm9yZSB0ZXN0IGNhc2VzIHdob3NlIG5hbWUgZG9lc24ndAorLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuCitzdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0Q2FzZUZpbHRlcltdID0gIipEZWF0aFRlc3Q6KkRlYXRoVGVzdC8qIjsKKworLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4KK3N0YXRpYyBjb25zdCBjaGFyIGtVbml2ZXJzYWxGaWx0ZXJbXSA9ICIqIjsKKworLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuCitzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE91dHB1dEZpbGVbXSA9ICJ0ZXN0X2RldGFpbC54bWwiOworCisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguCitzdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkSW5kZXhbXSA9ICJHVEVTVF9TSEFSRF9JTkRFWCI7CisvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0IHNoYXJkcy4KK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOworLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlLgorc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZFN0YXR1c0ZpbGVbXSA9ICJHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK2NvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXSA9ICJcblN0YWNrIHRyYWNlOlxuIjsKKworLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcworLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCitib29sIGdfaGVscF9mbGFnID0gZmFsc2U7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwgZmFsc2UpLAorICAgICJSdW4gZGlzYWJsZWQgdGVzdHMgdG9vLCBpbiBhZGRpdGlvbiB0byB0aGUgdGVzdHMgbm9ybWFsbHkgYmVpbmcgcnVuLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgYnJlYWtfb25fZmFpbHVyZSwKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYnJlYWtfb25fZmFpbHVyZSIsIGZhbHNlKSwKKyAgICAiVHJ1ZSBpZmYgYSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCBiZSBhIGRlYnVnZ2VyIGJyZWFrLXBvaW50LiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8oCisgICAgY2F0Y2hfZXhjZXB0aW9ucywKKyAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiY2F0Y2hfZXhjZXB0aW9ucyIsIHRydWUpLAorICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCisgICAgIiBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyB0ZXN0IGZhaWx1cmVzLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBjb2xvciwKKyAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJjb2xvciIsICJhdXRvIiksCisgICAgIldoZXRoZXIgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LiAgVmFsaWQgdmFsdWVzOiB5ZXMsIG5vLCAiCisgICAgImFuZCBhdXRvLiAgJ2F1dG8nIG1lYW5zIHRvIHVzZSBjb2xvcnMgaWYgdGhlIG91dHB1dCBpcyAiCisgICAgImJlaW5nIHNlbnQgdG8gYSB0ZXJtaW5hbCBhbmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgIgorICAgICJpcyBzZXQgdG8geHRlcm0sIHh0ZXJtLWNvbG9yLCB4dGVybS0yNTZjb2xvciwgbGludXggb3IgY3lnd2luLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBmaWx0ZXIsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZmlsdGVyIiwga1VuaXZlcnNhbEZpbHRlciksCisgICAgIkEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYiAobm90IHJlZ2V4KSBwYXR0ZXJucyAiCisgICAgImZvciBmaWx0ZXJpbmcgdGhlIHRlc3RzIHRvIHJ1biwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICIKKyAgICAiJy0nIGFuZCBhIDogc2VwYXJhdGVkIGxpc3Qgb2YgbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvICIKKyAgICAiZXhjbHVkZSkuICBBIHRlc3QgaXMgcnVuIGlmIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSAiCisgICAgInBhdHRlcm5zIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLiIpOworCitHVEVTVF9ERUZJTkVfYm9vbF8obGlzdF90ZXN0cywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIkxpc3QgYWxsIHRlc3RzIHdpdGhvdXQgcnVubmluZyB0aGVtLiIpOworCitHVEVTVF9ERUZJTkVfc3RyaW5nXygKKyAgICBvdXRwdXQsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigib3V0cHV0IiwgIiIpLAorICAgICJBIGZvcm1hdCAoY3VycmVudGx5IG11c3QgYmUgXCJ4bWxcIiksIG9wdGlvbmFsbHkgZm9sbG93ZWQgIgorICAgICJieSBhIGNvbG9uIGFuZCBhbiBvdXRwdXQgZmlsZSBuYW1lIG9yIGRpcmVjdG9yeS4gQSBkaXJlY3RvcnkgIgorICAgICJpcyBpbmRpY2F0ZWQgYnkgYSB0cmFpbGluZyBwYXRobmFtZSBzZXBhcmF0b3IuICIKKyAgICAiRXhhbXBsZXM6IFwieG1sOmZpbGVuYW1lLnhtbFwiLCBcInhtbDo6ZGlyZWN0b3J5bmFtZS9cIi4gIgorICAgICJJZiBhIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQsIG91dHB1dCBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQgIgorICAgICJ3aXRoaW4gdGhhdCBkaXJlY3RvcnksIHdpdGggZmlsZS1uYW1lcyBiYXNlZCBvbiB0aGUgdGVzdCAiCisgICAgImV4ZWN1dGFibGUncyBuYW1lIGFuZCwgaWYgbmVjZXNzYXJ5LCBtYWRlIHVuaXF1ZSBieSBhZGRpbmcgIgorICAgICJkaWdpdHMuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBwcmludF90aW1lLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJwcmludF90aW1lIiwgdHJ1ZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCBkaXNwbGF5IGVsYXBzZWQgdGltZSBpbiB0ZXh0IG91dHB1dC4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICByYW5kb21fc2VlZCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInJhbmRvbV9zZWVkIiwgMCksCisgICAgIlJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2Ugd2hlbiBzaHVmZmxpbmcgdGVzdCBvcmRlcnMuICBNdXN0IGJlIGluIHJhbmdlICIKKyAgICAiWzEsIDk5OTk5XSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUuIik7CisKK0dURVNUX0RFRklORV9pbnQzMl8oCisgICAgcmVwZWF0LAorICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmVwZWF0IiwgMSksCisgICAgIkhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCBlYWNoIHRlc3QuICBTcGVjaWZ5IGEgbmVnYXRpdmUgbnVtYmVyICIKKyAgICAiZm9yIHJlcGVhdGluZyBmb3JldmVyLiAgVXNlZnVsIGZvciBzaGFraW5nIG91dCBmbGFreSB0ZXN0cy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzLCBmYWxzZSwKKyAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXyAiIHNob3VsZCBpbmNsdWRlIGludGVybmFsIHN0YWNrIGZyYW1lcyB3aGVuICIKKyAgICAicHJpbnRpbmcgdGVzdCBmYWlsdXJlIHN0YWNrIHRyYWNlcy4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHNodWZmbGUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInNodWZmbGUiLCBmYWxzZSksCisgICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KKyAgICAiIHNob3VsZCByYW5kb21pemUgdGVzdHMnIG9yZGVyIG9uIGV2ZXJ5IHJ1bi4iKTsKKworR1RFU1RfREVGSU5FX2ludDMyXygKKyAgICBzdGFja190cmFjZV9kZXB0aCwKKyAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInN0YWNrX3RyYWNlX2RlcHRoIiwga01heFN0YWNrVHJhY2VEZXB0aCksCisgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gcHJpbnQgd2hlbiBhbiAiCisgICAgImFzc2VydGlvbiBmYWlscy4gIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRocm91Z2ggMTAwLCBpbmNsdXNpdmUuIik7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIHN0cmVhbV9yZXN1bHRfdG8sCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigic3RyZWFtX3Jlc3VsdF90byIsICIiKSwKKyAgICAiVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgaG9zdCBuYW1lIGFuZCB0aGUgcG9ydCBudW1iZXIgb24gd2hpY2ggdG8gc3RyZWFtICIKKyAgICAidGVzdCByZXN1bHRzLiBFeGFtcGxlOiBcImxvY2FsaG9zdDo1NTVcIi4gVGhlIGZsYWcgaXMgZWZmZWN0aXZlIG9ubHkgb24gIgorICAgICJMaW51eC4iKTsKKworR1RFU1RfREVGSU5FX2Jvb2xfKAorICAgIHRocm93X29uX2ZhaWx1cmUsCisgICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInRocm93X29uX2ZhaWx1cmUiLCBmYWxzZSksCisgICAgIldoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uICIKKyAgICAiaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBvciBleGl0IHRoZSBwcm9ncmFtIHdpdGggYSBub24temVybyBjb2RlICIKKyAgICAib3RoZXJ3aXNlLiIpOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKSwgdXNpbmcgYSBMaW5lYXIKKy8vIENvbmdydWVudGlhbCBHZW5lcmF0b3IgKExDRykuICBDcmFzaGVzIGlmICdyYW5nZScgaXMgMCBvciBncmVhdGVyCisvLyB0aGFuIGtNYXhSYW5nZS4KK1VJbnQzMiBSYW5kb206OkdlbmVyYXRlKFVJbnQzMiByYW5nZSkgeworICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRoZSBzYW1lIGFzIGFyZSB1c2VkIGluIGdsaWJjJ3MgcmFuZCgzKS4KKyAgc3RhdGVfID0gKDExMDM1MTUyNDVVKnN0YXRlXyArIDEyMzQ1VSkgJSBrTWF4UmFuZ2U7CisKKyAgR1RFU1RfQ0hFQ0tfKHJhbmdlID4gMCkKKyAgICAgIDw8ICJDYW5ub3QgZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLCAwKS4iOworICBHVEVTVF9DSEVDS18ocmFuZ2UgPD0ga01heFJhbmdlKQorICAgICAgPDwgIkdlbmVyYXRpb24gb2YgYSBudW1iZXIgaW4gWzAsICIgPDwgcmFuZ2UgPDwgIikgd2FzIHJlcXVlc3RlZCwgIgorICAgICAgPDwgImJ1dCB0aGlzIGNhbiBvbmx5IGdlbmVyYXRlIG51bWJlcnMgaW4gWzAsICIgPDwga01heFJhbmdlIDw8ICIpLiI7CisKKyAgLy8gQ29udmVydGluZyB2aWEgbW9kdWx1cyBpbnRyb2R1Y2VzIGEgYml0IG9mIGRvd253YXJkIGJpYXMsIGJ1dAorICAvLyBpdCdzIHNpbXBsZSwgYW5kIGEgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgaXNuJ3QgdG9vIGdvb2QKKyAgLy8gdG8gYmVnaW4gd2l0aC4KKyAgcmV0dXJuIHN0YXRlXyAlIHJhbmdlOworfQorCisvLyBHVGVzdElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBpbml0aWFsaXplZAorLy8gR29vZ2xlIFRlc3QuICBVc2VmdWwgZm9yIGNhdGNoaW5nIHRoZSB1c2VyIG1pc3Rha2Ugb2Ygbm90IGluaXRpYWxpemluZworLy8gR29vZ2xlIFRlc3QgYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLgorLy8KKy8vIEEgdXNlciBtdXN0IGNhbGwgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKSB0byBpbml0aWFsaXplIEdvb2dsZQorLy8gVGVzdC4gIGdfaW5pdF9ndGVzdF9jb3VudCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0aW1lcworLy8gSW5pdEdvb2dsZVRlc3QoKSBoYXMgYmVlbiBjYWxsZWQuICBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdmFyaWFibGUKKy8vIHVuZGVyIGEgbXV0ZXggYXMgaXQgaXMgb25seSBhY2Nlc3NlZCBpbiB0aGUgbWFpbiB0aHJlYWQuCitpbnQgZ19pbml0X2d0ZXN0X2NvdW50ID0gMDsKK3N0YXRpYyBib29sIEdUZXN0SXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIGdfaW5pdF9ndGVzdF9jb3VudCAhPSAwOyB9CisKKy8vIEl0ZXJhdGVzIG92ZXIgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLCBrZWVwaW5nIGEgcnVubmluZyBzdW0gb2YgdGhlCisvLyByZXN1bHRzIG9mIGNhbGxpbmcgYSBnaXZlbiBpbnQtcmV0dXJuaW5nIG1ldGhvZCBvbiBlYWNoLgorLy8gUmV0dXJucyB0aGUgc3VtLgorc3RhdGljIGludCBTdW1PdmVyVGVzdENhc2VMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4mIGNhc2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKFRlc3RDYXNlOjoqbWV0aG9kKSgpIGNvbnN0KSB7CisgIGludCBzdW0gPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhc2VfbGlzdC5zaXplKCk7IGkrKykgeworICAgIHN1bSArPSAoY2FzZV9saXN0W2ldLT4qbWV0aG9kKSgpOworICB9CisgIHJldHVybiBzdW07Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCitzdGF0aWMgYm9vbCBUZXN0Q2FzZVBhc3NlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7CisgIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPlBhc3NlZCgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgorc3RhdGljIGJvb2wgVGVzdENhc2VGYWlsZWQoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgeworICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5GYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0X2Nhc2UgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRlc3QgdGhhdCBzaG91bGQKKy8vIHJ1bi4KK3N0YXRpYyBib29sIFNob3VsZFJ1blRlc3RDYXNlKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpOworfQorCisvLyBBc3NlcnRIZWxwZXIgY29uc3RydWN0b3IuCitBc3NlcnRIZWxwZXI6OkFzc2VydEhlbHBlcihUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSkKKyAgICA6IGRhdGFfKG5ldyBBc3NlcnRIZWxwZXJEYXRhKHR5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpKSB7Cit9CisKK0Fzc2VydEhlbHBlcjo6fkFzc2VydEhlbHBlcigpIHsKKyAgZGVsZXRlIGRhdGFfOworfQorCisvLyBNZXNzYWdlIGFzc2lnbm1lbnQsIGZvciBhc3NlcnRpb24gc3RyZWFtaW5nIHN1cHBvcnQuCit2b2lkIEFzc2VydEhlbHBlcjo6b3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPgorICAgIEFkZFRlc3RQYXJ0UmVzdWx0KGRhdGFfLT50eXBlLCBkYXRhXy0+ZmlsZSwgZGF0YV8tPmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgQXBwZW5kVXNlck1lc3NhZ2UoZGF0YV8tPm1lc3NhZ2UsIG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCkKKyAgICAgICAgICAgICAgICAgICAgICAtPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSkKKyAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgorICAgICAgICAgICAgICAgICAgICAgICk7ICAvLyBOT0xJTlQKK30KKworLy8gTXV0ZXggZm9yIGxpbmtlZCBwb2ludGVycy4KK0dURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKGdfbGlua2VkX3B0cl9tdXRleCk7CisKKy8vIEFwcGxpY2F0aW9uIHBhdGhuYW1lIGdvdHRlbiBpbiBJbml0R29vZ2xlVGVzdC4KK1N0cmluZyBnX2V4ZWN1dGFibGVfcGF0aDsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKKy8vIGlzIHByZXNlbnQuCitGaWxlUGF0aCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSB7CisgIEZpbGVQYXRoIHJlc3VsdDsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmVzdWx0LlNldChGaWxlUGF0aChnX2V4ZWN1dGFibGVfcGF0aCkuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKSk7CisjZWxzZQorICByZXN1bHQuU2V0KEZpbGVQYXRoKGdfZXhlY3V0YWJsZV9wYXRoKSk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gcmVzdWx0LlJlbW92ZURpcmVjdG9yeU5hbWUoKTsKK30KKworLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9vdXRwdXQgZmxhZy4KKworLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KK1N0cmluZyBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpIHsKKyAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3Rfb3V0cHV0X2ZsYWcgPSBHVEVTVF9GTEFHKG91dHB1dCkuY19zdHIoKTsKKyAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpIHJldHVybiBTdHJpbmcoIiIpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGNvbG9uID0gc3RyY2hyKGd0ZXN0X291dHB1dF9mbGFnLCAnOicpOworICByZXR1cm4gKGNvbG9uID09IE5VTEwpID8KKyAgICAgIFN0cmluZyhndGVzdF9vdXRwdXRfZmxhZykgOgorICAgICAgU3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnLCBjb2xvbiAtIGd0ZXN0X291dHB1dF9mbGFnKTsKK30KKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIG91dHB1dCBmaWxlLCBvciB0aGUgZGVmYXVsdCBpZiBub25lCisvLyB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCitTdHJpbmcgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X291dHB1dF9mbGFnID0gR1RFU1RfRkxBRyhvdXRwdXQpLmNfc3RyKCk7CisgIGlmIChndGVzdF9vdXRwdXRfZmxhZyA9PSBOVUxMKQorICAgIHJldHVybiBTdHJpbmcoIiIpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGNvbG9uID0gc3RyY2hyKGd0ZXN0X291dHB1dF9mbGFnLCAnOicpOworICBpZiAoY29sb24gPT0gTlVMTCkKKyAgICByZXR1cm4gU3RyaW5nKGludGVybmFsOjpGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICAgICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoCisgICAgICAgICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCkpLAorICAgICAgICAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKGtEZWZhdWx0T3V0cHV0RmlsZSkpLlRvU3RyaW5nKCkgKTsKKworICBpbnRlcm5hbDo6RmlsZVBhdGggb3V0cHV0X25hbWUoY29sb24gKyAxKTsKKyAgaWYgKCFvdXRwdXRfbmFtZS5Jc0Fic29sdXRlUGF0aCgpKQorICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIFxzb21lXHBhdGggaXMgbm90IGFuIGFic29sdXRlCisgICAgLy8gcGF0aCAoYXMgaXRzIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBkcml2ZSksIHlldCB0aGUKKyAgICAvLyBmb2xsb3dpbmcgbG9naWMgZm9yIHR1cm5pbmcgaXQgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlzIHdyb25nLgorICAgIC8vIEZpeCBpdC4KKyAgICBvdXRwdXRfbmFtZSA9IGludGVybmFsOjpGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCisgICAgICAgIGludGVybmFsOjpGaWxlUGF0aChjb2xvbiArIDEpKTsKKworICBpZiAoIW91dHB1dF9uYW1lLklzRGlyZWN0b3J5KCkpCisgICAgcmV0dXJuIG91dHB1dF9uYW1lLlRvU3RyaW5nKCk7CisKKyAgaW50ZXJuYWw6OkZpbGVQYXRoIHJlc3VsdChpbnRlcm5hbDo6RmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoCisgICAgICBvdXRwdXRfbmFtZSwgaW50ZXJuYWw6OkdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLAorICAgICAgR2V0T3V0cHV0Rm9ybWF0KCkuY19zdHIoKSkpOworICByZXR1cm4gcmVzdWx0LlRvU3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHdpbGRjYXJkIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLiAgVGhlCisvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgorLy8KKy8vIFRoaXMgcmVjdXJzaXZlIGFsZ29yaXRobSBpc24ndCB2ZXJ5IGVmZmljaWVudCwgYnV0IGlzIGNsZWFyIGFuZAorLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjb25zdCBjaGFyICpwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cikgeworICBzd2l0Y2ggKCpwYXR0ZXJuKSB7CisgICAgY2FzZSAnXDAnOgorICAgIGNhc2UgJzonOiAgLy8gRWl0aGVyICc6JyBvciAnXDAnIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uCisgICAgICByZXR1cm4gKnN0ciA9PSAnXDAnOworICAgIGNhc2UgJz8nOiAgLy8gTWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICAgIHJldHVybiAqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOworICAgIGNhc2UgJyonOiAgLy8gTWF0Y2hlcyBhbnkgc3RyaW5nIChwb3NzaWJseSBlbXB0eSkgb2YgY2hhcmFjdGVycy4KKyAgICAgIHJldHVybiAoKnN0ciAhPSAnXDAnICYmIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4sIHN0ciArIDEpKSB8fAorICAgICAgICAgIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4gKyAxLCBzdHIpOworICAgIGRlZmF1bHQ6ICAvLyBOb24tc3BlY2lhbCBjaGFyYWN0ZXIuICBNYXRjaGVzIGl0c2VsZi4KKyAgICAgIHJldHVybiAqcGF0dGVybiA9PSAqc3RyICYmCisgICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0ciArIDEpOworICB9Cit9CisKK2Jvb2wgVW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogZmlsdGVyKSB7CisgIGNvbnN0IGNoYXIgKmN1cl9wYXR0ZXJuID0gZmlsdGVyOworICBmb3IgKDs7KSB7CisgICAgaWYgKFBhdHRlcm5NYXRjaGVzU3RyaW5nKGN1cl9wYXR0ZXJuLCBuYW1lLmNfc3RyKCkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBGaW5kcyB0aGUgbmV4dCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXIuCisgICAgY3VyX3BhdHRlcm4gPSBzdHJjaHIoY3VyX3BhdHRlcm4sICc6Jyk7CisKKyAgICAvLyBSZXR1cm5zIGlmIG5vIG1vcmUgcGF0dGVybiBjYW4gYmUgZm91bmQuCisgICAgaWYgKGN1cl9wYXR0ZXJuID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTa2lwcyB0aGUgcGF0dGVybiBzZXBhcmF0ZXIgKHRoZSAnOicgY2hhcmFjdGVyKS4KKyAgICBjdXJfcGF0dGVybisrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gVE9ETyhrZWl0aHJheSk6IG1vdmUgU3RyaW5nIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyB0byBndGVzdC1zdHJpbmcuY2MuCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBtYXRjaGVzIHRoZSB0ZXN0IGNhc2UKKy8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCitib29sIFVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoY29uc3QgU3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcgJnRlc3RfbmFtZSkgeworICBjb25zdCBTdHJpbmcmIGZ1bGxfbmFtZSA9IFN0cmluZzo6Rm9ybWF0KCIlcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUuY19zdHIoKSk7CisKKyAgLy8gU3BsaXQgLS1ndGVzdF9maWx0ZXIgYXQgJy0nLCBpZiB0aGVyZSBpcyBvbmUsIHRvIHNlcGFyYXRlIGludG8KKyAgLy8gcG9zaXRpdmUgZmlsdGVyIGFuZCBuZWdhdGl2ZSBmaWx0ZXIgcG9ydGlvbnMKKyAgY29uc3QgY2hhciogY29uc3QgcCA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOworICBjb25zdCBjaGFyKiBjb25zdCBkYXNoID0gc3RyY2hyKHAsICctJyk7CisgIFN0cmluZyBwb3NpdGl2ZTsKKyAgU3RyaW5nIG5lZ2F0aXZlOworICBpZiAoZGFzaCA9PSBOVUxMKSB7CisgICAgcG9zaXRpdmUgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsgIC8vIFdob2xlIHN0cmluZyBpcyBhIHBvc2l0aXZlIGZpbHRlcgorICAgIG5lZ2F0aXZlID0gU3RyaW5nKCIiKTsKKyAgfSBlbHNlIHsKKyAgICBwb3NpdGl2ZSA9IFN0cmluZyhwLCBkYXNoIC0gcCk7ICAvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBkYXNoCisgICAgbmVnYXRpdmUgPSBTdHJpbmcoZGFzaCsxKTsgICAgICAgLy8gRXZlcnl0aGluZyBhZnRlciB0aGUgZGFzaAorICAgIGlmIChwb3NpdGl2ZS5lbXB0eSgpKSB7CisgICAgICAvLyBUcmVhdCAnLXRlc3QxJyBhcyB0aGUgc2FtZSBhcyAnKi10ZXN0MScKKyAgICAgIHBvc2l0aXZlID0ga1VuaXZlcnNhbEZpbHRlcjsKKyAgICB9CisgIH0KKworICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zLiAgSXQgbWF0Y2hlcyBhCisgIC8vIHRlc3QgaWYgYW55IHBhdHRlcm4gaW4gaXQgbWF0Y2hlcyB0aGUgdGVzdC4KKyAgcmV0dXJuIChNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgcG9zaXRpdmUuY19zdHIoKSkgJiYKKyAgICAgICAgICAhTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIG5lZ2F0aXZlLmNfc3RyKCkpKTsKK30KKworI2lmIEdURVNUX0hBU19TRUgKKy8vIFJldHVybnMgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiBpZiBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIHRoZQorLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCitpbnQgVW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpIHsKKyAgLy8gR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSBhIFNFSCBleGNlcHRpb24gaWY6CisgIC8vICAgMS4gdGhlIHVzZXIgd2FudHMgaXQgdG8sIEFORAorICAvLyAgIDIuIHRoaXMgaXMgbm90IGEgYnJlYWtwb2ludCBleGNlcHRpb24sIEFORAorICAvLyAgIDMuIHRoaXMgaXMgbm90IGEgQysrIGV4Y2VwdGlvbiAoVkMrKyBpbXBsZW1lbnRzIHRoZW0gdmlhIFNFSCwKKyAgLy8gICAgICBhcHBhcmVudGx5KS4KKyAgLy8KKyAgLy8gU0VIIGV4Y2VwdGlvbiBjb2RlIGZvciBDKysgZXhjZXB0aW9ucy4KKyAgLy8gKHNlZSBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzE4NTI5NCBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisgIGNvbnN0IERXT1JEIGtDeHhFeGNlcHRpb25Db2RlID0gMHhlMDZkNzM2MzsKKworICBib29sIHNob3VsZF9oYW5kbGUgPSB0cnVlOworCisgIGlmICghR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkKKyAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7CisgIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IEVYQ0VQVElPTl9CUkVBS1BPSU5UKQorICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKKyAgZWxzZSBpZiAoZXhjZXB0aW9uX2NvZGUgPT0ga0N4eEV4Y2VwdGlvbkNvZGUpCisgICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOworCisgIHJldHVybiBzaG91bGRfaGFuZGxlID8gRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6IEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorLy8gcmVzdWx0cy4gSW50ZXJjZXB0cyBvbmx5IGZhaWx1cmVzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkKKyAgICA6IGludGVyY2VwdF9tb2RlXyhJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCksCisgICAgICByZXN1bHRfKHJlc3VsdCkgeworICBJbml0KCk7Cit9CisKKy8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQorLy8gcmVzdWx0cy4KK1Njb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKKyAgICBJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlLCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCisgICAgOiBpbnRlcmNlcHRfbW9kZV8oaW50ZXJjZXB0X21vZGUpLAorICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKKyAgSW5pdCgpOworfQorCit2b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJbml0KCkgeworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgeworICAgIG9sZF9yZXBvcnRlcl8gPSBpbXBsLT5HZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7CisgICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcih0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKKyAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsKKyAgfQorfQorCisvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgVGVzdAorLy8gYmVmb3JlLgorU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6On5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpIHsKKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKKyAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKKyAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKG9sZF9yZXBvcnRlcl8pOworICB9IGVsc2UgeworICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKG9sZF9yZXBvcnRlcl8pOworICB9Cit9CisKKy8vIEluY3JlbWVudHMgdGhlIHRlc3QgcGFydCByZXN1bHQgY291bnQgYW5kIHJlbWVtYmVycyB0aGUgcmVzdWx0LgorLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSBpbnRlcmZhY2UuCit2b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJlc3VsdF8tPkFwcGVuZChyZXN1bHQpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBSZXR1cm5zIHRoZSB0eXBlIElEIG9mIDo6dGVzdGluZzo6VGVzdC4gIFdlIHNob3VsZCBhbHdheXMgY2FsbCB0aGlzCisvLyBpbnN0ZWFkIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgorLy8gdGVzdGluZzo6VGVzdC4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgYSBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuCisvLyB1c2luZyBHb29nbGUgVGVzdCBhcyBhIGZyYW1ld29yayBvbiBNYWMgT1MgWC4gIFRoZSBidWcgY2F1c2VzCisvLyBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcKKy8vIG9uIHdoZXRoZXIgdGhlIGNhbGwgaXMgZnJvbSB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrIGl0c2VsZiBvcgorLy8gZnJvbSB1c2VyIHRlc3QgY29kZS4gIEdldFRlc3RUeXBlSWQoKSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cworLy8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZQorLy8gZ3Rlc3QuY2MsIHdoaWNoIGlzIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrLgorVHlwZUlkIEdldFRlc3RUeXBlSWQoKSB7CisgIHJldHVybiBHZXRUeXBlSWQ8VGVzdD4oKTsKK30KKworLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdAorLy8gbGlicmFyeS4gIFRoaXMgaXMgc29sZWx5IGZvciB0ZXN0aW5nIEdldFRlc3RUeXBlSWQoKS4KK2V4dGVybiBjb25zdCBUeXBlSWQga1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3QgPSBHZXRUZXN0VHlwZUlkKCk7CisKKy8vIFRoaXMgcHJlZGljYXRlLWZvcm1hdHRlciBjaGVja3MgdGhhdCAncmVzdWx0cycgY29udGFpbnMgYSB0ZXN0IHBhcnQKKy8vIGZhaWx1cmUgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHRoYXQgdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUKKy8vIGdpdmVuIHN1YnN0cmluZy4KK0Fzc2VydGlvblJlc3VsdCBIYXNPbmVGYWlsdXJlKGNvbnN0IGNoYXIqIC8qIHJlc3VsdHNfZXhwciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHR5cGVfZXhwciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHN1YnN0cl9leHByICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSYgcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1YnN0cikgeworICBjb25zdCBTdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBmYXRhbCBmYWlsdXJlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiMSBub24tZmF0YWwgZmFpbHVyZSIpOworICBNZXNzYWdlIG1zZzsKKyAgaWYgKHJlc3VsdHMuc2l6ZSgpICE9IDEpIHsKKyAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKKyAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgbXNnIDw8ICJcbiIgPDwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdChpKTsKKyAgICB9CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7CisgIH0KKworICBjb25zdCBUZXN0UGFydFJlc3VsdCYgciA9IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCk7CisgIGlmIChyLnR5cGUoKSAhPSB0eXBlKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIGlmIChzdHJzdHIoci5tZXNzYWdlKCksIHN1YnN0ci5jX3N0cigpKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBjb250YWluaW5nIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3Vic3RyIDw8ICJcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKKyAgfQorCisgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Cit9CisKKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cAorLy8gdGVzdCBwYXJ0IHJlc3VsdHMsIHdoYXQgdHlwZSBvZiBmYWlsdXJlIHdlIGV4cGVjdCwgYW5kIHdoYXQKKy8vIHN1YnN0cmluZyB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBjb250YWluLgorU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAorICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpCisgICAgOiByZXN1bHRzXyhyZXN1bHRzKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgc3Vic3RyXyhzdWJzdHIpIHt9CisKKy8vIFRoZSBkZXN0cnVjdG9yIG9mIFNpbmdsZUZhaWx1cmVDaGVja2VyIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCisvLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCisvLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQorLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCitTaW5nbGVGYWlsdXJlQ2hlY2tlcjo6flNpbmdsZUZhaWx1cmVDaGVja2VyKCkgeworICBFWFBFQ1RfUFJFRF9GT1JNQVQzKEhhc09uZUZhaWx1cmUsICpyZXN1bHRzXywgdHlwZV8sIHN1YnN0cl8pOworfQorCitEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworICB1bml0X3Rlc3RfLT5saXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKS0+T25UZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCitEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCisgICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9CisKK3ZvaWQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK1Rlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCitVbml0VGVzdEltcGw6OkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgcmV0dXJuIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOworfQorCisvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAorICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKKyAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8gPSByZXBvcnRlcjsKK30KKworLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKK1VuaXRUZXN0SW1wbDo6R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSB7CisgIHJldHVybiBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLmdldCgpOworfQorCisvLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCit2b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKKyAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5zZXQocmVwb3J0ZXIpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZVBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorLy8gdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFNob3VsZFJ1blRlc3RDYXNlKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3RJbXBsOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRvdGFsX3Rlc3RfY291bnQpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgoraW50IFVuaXRUZXN0SW1wbDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KTsKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4KKy8vCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQorLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKKy8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAorLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKKy8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK1N0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsKKyAgKHZvaWQpc2tpcF9jb3VudDsKKyAgcmV0dXJuIFN0cmluZygiIik7Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCitUaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCkgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gMTk3MC0wMS0wMSBhbmQgMTYwMS0wMS0wMSBpbiBtaWxsaXNlY29uZHMuCisgIC8vIGh0dHA6Ly9hbmFsb2dvdXMuYmxvZ3Nwb3QuY29tLzIwMDUvMDQvZXBvY2guaHRtbAorICBjb25zdCBUaW1lSW5NaWxsaXMga0phdmFFcG9jaFRvV2luRmlsZVRpbWVEZWx0YSA9CisgICAgc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPigxMTY0NDQ3MzZVTCkgKiAxMDAwMDBVTDsKKyAgY29uc3QgRFdPUkQga1RlbnRoTWljcm9zSW5NaWxsaVNlY29uZCA9IDEwMDAwOworCisgIFNZU1RFTVRJTUUgbm93X3N5c3RpbWU7CisgIEZJTEVUSU1FIG5vd19maWxldGltZTsKKyAgVUxBUkdFX0lOVEVHRVIgbm93X2ludDY0OworICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogU2hvdWxkbid0IHRoaXMganVzdCB1c2UKKyAgLy8gICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpPworICBHZXRTeXN0ZW1UaW1lKCZub3dfc3lzdGltZSk7CisgIGlmIChTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93X3N5c3RpbWUsICZub3dfZmlsZXRpbWUpKSB7CisgICAgbm93X2ludDY0Lkxvd1BhcnQgPSBub3dfZmlsZXRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICBub3dfaW50NjQuSGlnaFBhcnQgPSBub3dfZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgbm93X2ludDY0LlF1YWRQYXJ0ID0gKG5vd19pbnQ2NC5RdWFkUGFydCAvIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQpIC0KKyAgICAgIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGE7CisgICAgcmV0dXJuIG5vd19pbnQ2NC5RdWFkUGFydDsKKyAgfQorICByZXR1cm4gMDsKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCisgIF9fdGltZWI2NCBub3c7CisKKyMgaWZkZWYgX01TQ19WRVIKKworICAvLyBNU1ZDIDggZGVwcmVjYXRlcyBfZnRpbWU2NCgpLCBzbyB3ZSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmcgNDk5NgorICAvLyAoZGVwcmVjYXRlZCBmdW5jdGlvbikgdGhlcmUuCisgIC8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgR2V0VGlja0NvdW50KCk/ICBPciB1c2UKKyAgLy8gICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgpCisjICBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2LgorICBfZnRpbWU2NCgmbm93KTsKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorIyBlbHNlCisKKyAgX2Z0aW1lNjQoJm5vdyk7CisKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnRpbWUpICogMTAwMCArIG5vdy5taWxsaXRtOworI2VsaWYgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8KKyAgc3RydWN0IHRpbWV2YWwgbm93OworICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50dl9zZWMpICogMTAwMCArIG5vdy50dl91c2VjIC8gMTAwMDsKKyNlbHNlCisjIGVycm9yICJEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBvbiB5b3VyIHN5c3RlbS4iCisjZW5kaWYKK30KKworLy8gVXRpbGl0aWVzCisKKy8vIGNsYXNzIFN0cmluZworCisvLyBSZXR1cm5zIHRoZSBpbnB1dCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIGlmIGl0J3Mgbm90IE5VTEw7CisvLyBvdGhlcndpc2UgcmV0dXJucyAiKG51bGwpIi4gIEZvciBleGFtcGxlLCAiXCJIZWxsb1wiIiBpcyByZXR1cm5lZAorLy8gZm9yIGlucHV0ICJIZWxsbyIuCisvLworLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHByaW50aW5nIGEgQyBzdHJpbmcgaW4gdGhlIHN5bnRheCBvZiBhIGxpdGVyYWwuCisvLworLy8gS25vd24gaXNzdWU6IGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdCBoYW5kbGVkIHlldC4KK1N0cmluZyBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGNvbnN0IGNoYXIqIGNfc3RyKSB7CisgIHJldHVybiBjX3N0ciA/IFN0cmluZzo6Rm9ybWF0KCJcIiVzXCIiLCBjX3N0cikgOiBTdHJpbmcoIihudWxsKSIpOworfQorCisvLyBDb3BpZXMgYXQgbW9zdCBsZW5ndGggY2hhcmFjdGVycyBmcm9tIHN0ciBpbnRvIGEgbmV3bHktYWxsb2NhdGVkCisvLyBwaWVjZSBvZiBtZW1vcnkgb2Ygc2l6ZSBsZW5ndGgrMS4gIFRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIHdpdGggbmV3W10uCisvLyBBIHRlcm1pbmF0aW5nIG51bGwgYnl0ZSBpcyB3cml0dGVuIHRvIHRoZSBtZW1vcnksIGFuZCBhIHBvaW50ZXIgdG8gaXQKKy8vIGlzIHJldHVybmVkLiAgSWYgc3RyIGlzIE5VTEwsIE5VTEwgaXMgcmV0dXJuZWQuCitzdGF0aWMgY2hhciogQ2xvbmVTdHJpbmcoY29uc3QgY2hhciogc3RyLCBzaXplX3QgbGVuZ3RoKSB7CisgIGlmIChzdHIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIGNoYXIqIGNvbnN0IGNsb25lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV07CisgICAgcG9zaXg6OlN0ck5DcHkoY2xvbmUsIHN0ciwgbGVuZ3RoKTsKKyAgICBjbG9uZVtsZW5ndGhdID0gJ1wwJzsKKyAgICByZXR1cm4gY2xvbmU7CisgIH0KK30KKworLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuICBUaGUKKy8vIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmdbXSB0aGUgcmV0dXJuIHZhbHVlLiAgUmV0dXJucyB0aGUKKy8vIGNsb25lZCBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlIGlucHV0IGlzIE5VTEwuCitjb25zdCBjaGFyICogU3RyaW5nOjpDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogY19zdHIpIHsKKyAgcmV0dXJuIChjX3N0ciA9PSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgIE5VTEwgOiBDbG9uZVN0cmluZyhjX3N0ciwgc3RybGVuKGNfc3RyKSk7Cit9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZworLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgorLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorLy8gaW5wdXQgaXMgTlVMTC4KK0xQQ1dTVFIgU3RyaW5nOjpBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBhbnNpKSB7CisgIGlmICghYW5zaSkgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYW5zaSk7CisgIGNvbnN0IGludCB1bmljb2RlX2xlbmd0aCA9CisgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKyAgV0NIQVIqIHVuaWNvZGUgPSBuZXcgV0NIQVJbdW5pY29kZV9sZW5ndGggKyAxXTsKKyAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCB1bmljb2RlX2xlbmd0aCk7CisgIHVuaWNvZGVbdW5pY29kZV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIHVuaWNvZGU7Cit9CisKKy8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKKy8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKy8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKy8vIGlucHV0IGlzIE5VTEwuCitjb25zdCBjaGFyKiBTdHJpbmc6OlV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKSAgeworICBpZiAoIXV0ZjE2X3N0cikgcmV0dXJuIE5VTEw7CisgIGNvbnN0IGludCBhbnNpX2xlbmd0aCA9CisgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgIGNoYXIqIGFuc2kgPSBuZXcgY2hhclthbnNpX2xlbmd0aCArIDFdOworICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICBhbnNpLCBhbnNpX2xlbmd0aCwgTlVMTCwgTlVMTCk7CisgIGFuc2lbYW5zaV9sZW5ndGhdID0gMDsKKyAgcmV0dXJuIGFuc2k7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisvLworLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAorLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmICggbGhzID09IE5VTEwgKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKCByaHMgPT0gTlVMTCApIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RyY21wKGxocywgcmhzKSA9PSAwOworfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBDb252ZXJ0cyBhbiBhcnJheSBvZiB3aWRlIGNoYXJzIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKy8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoZSBnaXZlbiBNZXNzYWdlIG9iamVjdC4KK3N0YXRpYyB2b2lkIFN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZShjb25zdCB3Y2hhcl90KiB3c3RyLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1zZykgeworICAvLyBUT0RPKHdhbik6IGNvbnNpZGVyIGFsbG93aW5nIGEgdGVzdGluZzo6U3RyaW5nIG9iamVjdCB0bworICAvLyBjb250YWluICdcMCcuICBUaGlzIHdpbGwgbWFrZSBpdCBiZWhhdmUgbW9yZSBsaWtlIHN0ZDo6c3RyaW5nLAorICAvLyBhbmQgd2lsbCBhbGxvdyBUb1V0ZjhTdHJpbmcoKSB0byByZXR1cm4gdGhlIGNvcnJlY3QgZW5jb2RpbmcKKyAgLy8gZm9yICdcMCcgcy50LiB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGUgY29uZGl0aW9uYWwgaGVyZSAoYW5kIGluCisgIC8vIHNldmVyYWwgb3RoZXIgcGxhY2VzKS4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbGVuZ3RoOyApIHsgIC8vIE5PTElOVAorICAgIGlmICh3c3RyW2ldICE9IEwnXDAnKSB7CisgICAgICAqbXNnIDw8IFdpZGVTdHJpbmdUb1V0Zjgod3N0ciArIGksIHN0YXRpY19jYXN0PGludD4obGVuZ3RoIC0gaSkpOworICAgICAgd2hpbGUgKGkgIT0gbGVuZ3RoICYmIHdzdHJbaV0gIT0gTCdcMCcpCisgICAgICAgIGkrKzsKKyAgICB9IGVsc2UgeworICAgICAgKm1zZyA8PCAnXDAnOworICAgICAgaSsrOworICAgIH0KKyAgfQorfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORyB8fCBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKy8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgorTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpIHsKKyAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOworICByZXR1cm4gKnRoaXM7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAorLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KK01lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6d3N0cmluZyYgd3N0cikgeworICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7CisgIHJldHVybiAqdGhpczsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKy8vIEFzc2VydGlvblJlc3VsdCBjb25zdHJ1Y3RvcnMuCisvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgorQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcikKKyAgICA6IHN1Y2Nlc3NfKG90aGVyLnN1Y2Nlc3NfKSwKKyAgICAgIG1lc3NhZ2VfKG90aGVyLm1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPworICAgICAgICAgICAgICAgbmV3IDo6c3RkOjpzdHJpbmcoKm90aGVyLm1lc3NhZ2VfKSA6CisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KE5VTEwpKSB7Cit9CisKKy8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25SZXN1bHQ6Om9wZXJhdG9yISgpIGNvbnN0IHsKKyAgQXNzZXJ0aW9uUmVzdWx0IG5lZ2F0aW9uKCFzdWNjZXNzXyk7CisgIGlmIChtZXNzYWdlXy5nZXQoKSAhPSBOVUxMKQorICAgIG5lZ2F0aW9uIDw8ICptZXNzYWdlXzsKKyAgcmV0dXJuIG5lZ2F0aW9uOworfQorCisvLyBNYWtlcyBhIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHJlc3VsdC4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCkgeworICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KHRydWUpOworfQorCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0LgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoKSB7CisgIHJldHVybiBBc3NlcnRpb25SZXN1bHQoZmFsc2UpOworfQorCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4KKy8vIERlcHJlY2F0ZWQ7IHVzZSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbWVzc2FnZS4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KKy8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCisvLworLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgorLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQorLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgorLy8KKy8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyIKKy8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciIKKy8vICAgZXhwZWN0ZWRfdmFsdWU6ICAgICAgIjUiCisvLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2IgorLy8KKy8vIFRoZSBpZ25vcmluZ19jYXNlIHBhcmFtZXRlciBpcyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEKKy8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsCisvLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorQXNzZXJ0aW9uUmVzdWx0IEVxRmFpbHVyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBleHBlY3RlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBhY3R1YWxfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JpbmdfY2FzZSkgeworICBNZXNzYWdlIG1zZzsKKyAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBhY3R1YWxfZXhwcmVzc2lvbjsKKyAgaWYgKGFjdHVhbF92YWx1ZSAhPSBhY3R1YWxfZXhwcmVzc2lvbikgeworICAgIG1zZyA8PCAiXG4gIEFjdHVhbDogIiA8PCBhY3R1YWxfdmFsdWU7CisgIH0KKworICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfZXhwcmVzc2lvbjsKKyAgaWYgKGlnbm9yaW5nX2Nhc2UpIHsKKyAgICBtc2cgPDwgIiAoaWdub3JpbmcgY2FzZSkiOworICB9CisgIGlmIChleHBlY3RlZF92YWx1ZSAhPSBleHBlY3RlZF9leHByZXNzaW9uKSB7CisgICAgbXNnIDw8ICJcbldoaWNoIGlzOiAiIDw8IGV4cGVjdGVkX3ZhbHVlOworICB9CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7Cit9CisKKy8vIENvbnN0cnVjdHMgYSBmYWlsdXJlIG1lc3NhZ2UgZm9yIEJvb2xlYW4gYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLgorU3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZShjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHJlc3Npb25fdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKSB7CisgIGNvbnN0IGNoYXIqIGFjdHVhbF9tZXNzYWdlID0gYXNzZXJ0aW9uX3Jlc3VsdC5tZXNzYWdlKCk7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGV4cHJlc3Npb25fdGV4dAorICAgICAgPDwgIlxuICBBY3R1YWw6ICIgPDwgYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZTsKKyAgaWYgKGFjdHVhbF9tZXNzYWdlWzBdICE9ICdcMCcpCisgICAgbXNnIDw8ICIgKCIgPDwgYWN0dWFsX21lc3NhZ2UgPDwgIikiOworICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlOworICByZXR1cm4gbXNnLkdldFN0cmluZygpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KK0Fzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhYnNfZXJyb3JfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzX2Vycm9yKSB7CisgIGNvbnN0IGRvdWJsZSBkaWZmID0gZmFicyh2YWwxIC0gdmFsMik7CisgIGlmIChkaWZmIDw9IGFic19lcnJvcikgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICAvLyBUT0RPKHdhbik6IGRvIG5vdCBwcmludCB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBpZiBpdCdzCisgIC8vIGFscmVhZHkgYSBsaXRlcmFsLgorICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiIDw8IGV4cHIxIDw8ICIgYW5kICIgPDwgZXhwcjIKKyAgICAgIDw8ICIgaXMgIiA8PCBkaWZmIDw8ICIsIHdoaWNoIGV4Y2VlZHMgIiA8PCBhYnNfZXJyb3JfZXhwciA8PCAiLCB3aGVyZVxuIgorICAgICAgPDwgZXhwcjEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwxIDw8ICIsXG4iCisgICAgICA8PCBleHByMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDIgPDwgIiwgYW5kXG4iCisgICAgICA8PCBhYnNfZXJyb3JfZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IGFic19lcnJvciA8PCAiLiI7Cit9CisKKworLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgRmxvYXRMRSgpIGFuZCBEb3VibGVMRSgpLgordGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+CitBc3NlcnRpb25SZXN1bHQgRmxvYXRpbmdQb2ludExFKGNvbnN0IGNoYXIqIGV4cHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDIpIHsKKyAgLy8gUmV0dXJucyBzdWNjZXNzIGlmIHZhbDEgaXMgbGVzcyB0aGFuIHZhbDIsCisgIGlmICh2YWwxIDwgdmFsMikgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICAvLyBvciBpZiB2YWwxIGlzIGFsbW9zdCBlcXVhbCB0byB2YWwyLgorICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyh2YWwxKSwgcmhzKHZhbDIpOworICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB0aGUgYWJvdmUgdHdvIGNoZWNrcyB3aWxsIGJvdGggZmFpbCBpZiBlaXRoZXIgdmFsMSBvcgorICAvLyB2YWwyIGlzIE5hTiwgYXMgdGhlIElFRUUgZmxvYXRpbmctcG9pbnQgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdAorICAvLyBhbnkgcHJlZGljYXRlIGludm9sdmluZyBhIE5hTiBtdXN0IHJldHVybiBmYWxzZS4KKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDFfc3M7CisgIHZhbDFfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgIDw8IHZhbDE7CisKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwyX3NzOworICB2YWwyX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKKyAgICAgICAgICA8PCB2YWwyOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgPD0gKCIgPDwgZXhwcjIgPDwgIilcbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMV9zcykgPDwgIiB2cyAiCisgICAgICA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMl9zcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCisvLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KK0Fzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbDEsIGZsb2F0IHZhbDIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZmxvYXQ+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Cit9CisKKy8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKKy8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgorQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZG91YmxlPihleHByMSwgZXhwcjIsIHZhbDEsIHZhbDIpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEgd2l0aCBpbnQgb3IgZW51bQorLy8gYXJndW1lbnRzLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGFjdHVhbCkgeworICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gQSBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHRoZSBoZWxwZXIgZnVuY3Rpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKKy8vIEFTU0VSVF8/PyBhbmQgRVhQRUNUXz8/IHdpdGggaW50ZWdlciBvciBlbnVtIGFyZ3VtZW50cy4gIEl0IGlzIGhlcmUKKy8vIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUgb2Ygc2ltaWxhciBjb2RlLgorI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKSB7XAorICBpZiAodmFsMSBvcCB2YWwyKSB7XAorICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAorICB9IGVsc2Uge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIFwKKyAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAorICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKKyAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCisgIH1cCit9CisKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVCB3aXRoIGludCBvcgorLy8gZW51bSBhcmd1bWVudHMuCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExULCA8ICkKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFIHdpdGggaW50IG9yCisvLyBlbnVtIGFyZ3VtZW50cy4KK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KQorLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1Qgd2l0aCBpbnQgb3IKKy8vIGVudW0gYXJndW1lbnRzLgorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPiApCisKKyN1bmRlZiBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfCisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJFUS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Cit9CisKKy8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKKyAgaWYgKCFTdHJpbmc6OkNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7CisgIH0KK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORS4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKSB7CisgIGlmICghU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9IGVsc2UgeworICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCisgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIikgKGlnbm9yaW5nIGNhc2UpLCBhY3R1YWw6IFwiIgorICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBJc1N1YlN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpLgorCisvLyBUaGlzIGdyb3VwIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHJldHVybiB0cnVlIGlmZiBuZWVkbGUgaXMgYQorLy8gc3Vic3RyaW5nIG9mIGhheXN0YWNrLiAgTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgorLy8gb25seS4KKworYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgeworICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOworCisgIHJldHVybiBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKK30KKworYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgeworICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gbmVlZGxlID09IGhheXN0YWNrOworCisgIHJldHVybiB3Y3NzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsKK30KKworLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBlaXRoZXIgOjpzdGQ6OnN0cmluZyBvciA6OnN0ZDo6d3N0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIGhheXN0YWNrLmZpbmQobmVlZGxlKSAhPSBTdHJpbmdUeXBlOjpucG9zOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgZWl0aGVyIElzU3Vic3RyaW5nKCkgb3IgSXNOb3RTdWJzdHJpbmcoKSwKKy8vIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyBwYXJhbWV0ZXIuCisvLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGNvbnN0IGNoYXIqLCBjb25zdCB3Y2hhcl90KiwgOjpzdGQ6OnN0cmluZywKKy8vIG9yIDo6c3RkOjp3c3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+CitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmdJbXBsKAorICAgIGJvb2wgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IFN0cmluZ1R5cGUmIG5lZWRsZSwgY29uc3QgU3RyaW5nVHlwZSYgaGF5c3RhY2spIHsKKyAgaWYgKElzU3Vic3RyaW5nUHJlZChuZWVkbGUsIGhheXN0YWNrKSA9PSBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcpCisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKworICBjb25zdCBib29sIGlzX3dpZGVfc3RyaW5nID0gc2l6ZW9mKG5lZWRsZVswXSkgPiAxOworICBjb25zdCBjaGFyKiBjb25zdCBiZWdpbl9zdHJpbmdfcXVvdGUgPSBpc193aWRlX3N0cmluZyA/ICJMXCIiIDogIlwiIjsKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgPDwgIlZhbHVlIG9mOiAiIDw8IG5lZWRsZV9leHByIDw8ICJcbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgbmVlZGxlIDw8ICJcIlxuIgorICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IChleHBlY3RlZF90b19iZV9zdWJzdHJpbmcgPyAiIiA6ICJub3QgIikKKyAgICAgIDw8ICJhIHN1YnN0cmluZyBvZiAiIDw8IGhheXN0YWNrX2V4cHIgPDwgIlxuIgorICAgICAgPDwgIldoaWNoIGlzOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBoYXlzdGFjayA8PCAiXCIiOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gSXNTdWJzdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKSBjaGVjayB3aGV0aGVyIG5lZWRsZSBpcyBhCisvLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2sgKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYKKy8vIG9ubHkpLCBhbmQgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuCisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7CisgIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjaykgeworICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK0Fzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Cit9CisKK0Fzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsKKyAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBJc0hSRVNVTFR7U3VjY2Vzc0ZhaWx1cmV9IHByZWRpY2F0ZXMKK0Fzc2VydGlvblJlc3VsdCBIUkVTVUxURmFpbHVyZUhlbHBlcihjb25zdCBjaGFyKiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaHIpIHsgIC8vIE5PTElOVAorIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBzdXBwb3J0IEZvcm1hdE1lc3NhZ2UuCisgIGNvbnN0IGNoYXIgZXJyb3JfdGV4dFtdID0gIiI7CisKKyMgZWxzZQorCisgIC8vIExvb2tzIHVwIHRoZSBodW1hbi1yZWFkYWJsZSBzeXN0ZW0gbWVzc2FnZSBmb3IgdGhlIEhSRVNVTFQgY29kZQorICAvLyBhbmQgc2luY2Ugd2UncmUgbm90IHBhc3NpbmcgYW55IHBhcmFtcyB0byBGb3JtYXRNZXNzYWdlLCB3ZSBkb24ndAorICAvLyB3YW50IGluc2VydHMgZXhwYW5kZWQuCisgIGNvbnN0IERXT1JEIGtGbGFncyA9IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFM7CisgIGNvbnN0IERXT1JEIGtCdWZTaXplID0gNDA5NjsgIC8vIFN0cmluZzo6Rm9ybWF0IGNhbid0IGV4Y2VlZCB0aGlzIGxlbmd0aC4KKyAgLy8gR2V0cyB0aGUgc3lzdGVtJ3MgaHVtYW4gcmVhZGFibGUgbWVzc2FnZSBzdHJpbmcgZm9yIHRoaXMgSFJFU1VMVC4KKyAgY2hhciBlcnJvcl90ZXh0W2tCdWZTaXplXSA9IHsgJ1wwJyB9OworICBEV09SRCBtZXNzYWdlX2xlbmd0aCA9IDo6Rm9ybWF0TWVzc2FnZUEoa0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIHNvdXJjZSwgd2UncmUgYXNraW5nIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHIsICAvLyB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBsaW5lIHdpZHRoIHJlc3RyaWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGV4dCwgIC8vIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCdWZTaXplLCAgLy8gYnVmIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLy8gbm8gYXJndW1lbnRzIGZvciBpbnNlcnRzCisgIC8vIFRyaW1zIHRhaWxpbmcgd2hpdGUgc3BhY2UgKEZvcm1hdE1lc3NhZ2UgbGVhdmVzIGEgdHJhaWxpbmcgY3ItbGYpCisgIGZvciAoOyBtZXNzYWdlX2xlbmd0aCAmJiBJc1NwYWNlKGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSk7CisgICAgICAgICAgLS1tZXNzYWdlX2xlbmd0aCkgeworICAgIGVycm9yX3RleHRbbWVzc2FnZV9sZW5ndGggLSAxXSA9ICdcMCc7CisgIH0KKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICBjb25zdCBTdHJpbmcgZXJyb3JfaGV4KFN0cmluZzo6Rm9ybWF0KCIweCUwOFggIiwgaHIpKTsKKyAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiIKKyAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBlcnJvcl9oZXggPDwgZXJyb3JfdGV4dCA8PCAiXG4iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgfQorICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgInN1Y2NlZWRzIiwgaHIpOworfQorCitBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLCBsb25nIGhyKSB7ICAvLyBOT0xJTlQKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisgIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAiZmFpbHMiLCBocik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgVW5pY29kZSB0ZXh0ICh3aWRlIHN0cmluZ3MpIGluCisvLyBVVEYtOC4KKworLy8gQSBVbmljb2RlIGNvZGUtcG9pbnQgY2FuIGhhdmUgdXB0byAyMSBiaXRzLCBhbmQgaXMgZW5jb2RlZCBpbiBVVEYtOAorLy8gbGlrZSB0aGlzOgorLy8KKy8vIENvZGUtcG9pbnQgbGVuZ3RoICAgRW5jb2RpbmcKKy8vICAgMCAtICA3IGJpdHMgICAgICAgMHh4eHh4eHgKKy8vICAgOCAtIDExIGJpdHMgICAgICAgMTEweHh4eHggMTB4eHh4eHgKKy8vICAxMiAtIDE2IGJpdHMgICAgICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKy8vICAxNyAtIDIxIGJpdHMgICAgICAgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIG9uZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDEgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAgNykgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgdHdvLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MiA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg1ICsgNikpIC0gMTsKKworLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHRocmVlLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KK2NvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MyA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg0ICsgMio2KSkgLSAxOworCisvLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgZm91ci1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCitjb25zdCBVSW50MzIga01heENvZGVQb2ludDQgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoMyArIDMqNikpIC0gMTsKKworLy8gQ2hvcHMgb2ZmIHRoZSBuIGxvd2VzdCBiaXRzIGZyb20gYSBiaXQgcGF0dGVybi4gIFJldHVybnMgdGhlIG4KKy8vIGxvd2VzdCBiaXRzLiAgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIG9yaWdpbmFsIGJpdCBwYXR0ZXJuIHdpbGwgYmUKKy8vIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IG4gYml0cy4KK2lubGluZSBVSW50MzIgQ2hvcExvd0JpdHMoVUludDMyKiBiaXRzLCBpbnQgbikgeworICBjb25zdCBVSW50MzIgbG93X2JpdHMgPSAqYml0cyAmICgoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCBuKSAtIDEpOworICAqYml0cyA+Pj0gbjsKKyAgcmV0dXJuIGxvd19iaXRzOworfQorCisvLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQorLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCisvLyBUaGUgb3V0cHV0IGJ1ZmZlciBzdHIgbXVzdCBjb250YWludCBhdCBsZWFzdCAzMiBjaGFyYWN0ZXJzLgorLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBidWZmZXIuCisvLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgb3V0cHV0CisvLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuCitjaGFyKiBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQsIGNoYXIqIHN0cikgeworICBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MSkgeworICAgIHN0clsxXSA9ICdcMCc7CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweHh4eHh4eAorICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDIpIHsKKyAgICBzdHJbMl0gPSAnXDAnOworICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEMwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMHh4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MykgeworICAgIHN0clszXSA9ICdcMCc7CisgICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEUwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMTB4eHh4CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50NCkgeworICAgIHN0cls0XSA9ICdcMCc7CisgICAgc3RyWzNdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAorICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKKyAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4CisgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhGMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTExMHh4eAorICB9IGVsc2UgeworICAgIC8vIFRoZSBsb25nZXN0IHN0cmluZyBTdHJpbmc6OkZvcm1hdCBjYW4gcHJvZHVjZSB3aGVuIGludm9rZWQKKyAgICAvLyB3aXRoIHRoZXNlIHBhcmFtZXRlcnMgaXMgMjggY2hhcmFjdGVyIGxvbmcgKG5vdCBpbmNsdWRpbmcKKyAgICAvLyB0aGUgdGVybWluYXRpbmcgbnVsIGNoYXJhY3RlcikuIFdlIGFyZSBhc2tpbmcgZm9yIDMyIGNoYXJhY3RlcgorICAgIC8vIGJ1ZmZlciBqdXN0IGluIGNhc2UuIFRoaXMgaXMgYWxzbyBlbm91Z2ggZm9yIHN0cm5jcHkgdG8KKyAgICAvLyBudWxsLXRlcm1pbmF0ZSB0aGUgZGVzdGluYXRpb24gc3RyaW5nLgorICAgIHBvc2l4OjpTdHJOQ3B5KAorICAgICAgICBzdHIsIFN0cmluZzo6Rm9ybWF0KCIoSW52YWxpZCBVbmljb2RlIDB4JVgpIiwgY29kZV9wb2ludCkuY19zdHIoKSwgMzIpOworICAgIHN0clszMV0gPSAnXDAnOyAgLy8gTWFrZXMgc3VyZSBubyBjaGFuZ2UgaW4gdGhlIGZvcm1hdCB0byBzdHJuY3B5IGxlYXZlcworICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3VsdCB1bnRlcm1pbmF0ZWQuCisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGUgdGhlIHN5c3RlbQorLy8gdXNlcyBVVEYtMTYgZm9yIHdpZGUgc3RyaW5nIGVuY29kaW5nLiBBbGwgc3VwcG9ydGVkIHN5c3RlbXMKKy8vIHdpdGggMTYgYml0IHdjaGFyX3QgKFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykgZG8gdXNlIFVURi0xNi4KKworLy8gRGV0ZXJtaW5lcyBpZiB0aGUgYXJndW1lbnRzIGNvbnN0aXR1dGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisvLyBhbmQgdGh1cyBzaG91bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQKKy8vIHVzaW5nIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIuCitpbmxpbmUgYm9vbCBJc1V0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LCB3Y2hhcl90IHNlY29uZCkgeworICByZXR1cm4gc2l6ZW9mKHdjaGFyX3QpID09IDIgJiYKKyAgICAgIChmaXJzdCAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChzZWNvbmQgJiAweEZDMDApID09IDB4REMwMDsKK30KKworLy8gQ3JlYXRlcyBhIFVuaWNvZGUgY29kZSBwb2ludCBmcm9tIFVURjE2IHN1cnJvZ2F0ZSBwYWlyLgoraW5saW5lIFVJbnQzMiBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCBzZWNvbmQpIHsKKyAgY29uc3QgVUludDMyIG1hc2sgPSAoMSA8PCAxMCkgLSAxOworICByZXR1cm4gKHNpemVvZih3Y2hhcl90KSA9PSAyKSA/CisgICAgICAoKChmaXJzdCAmIG1hc2spIDw8IDEwKSB8IChzZWNvbmQgJiBtYXNrKSkgKyAweDEwMDAwIDoKKyAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgY29uZGl0aW9uIGlzCisgICAgICAvLyBmYWxzZSwgYnV0IHdlIHByb3ZpZGUgYSBzZW5zaWJsZSBkZWZhdWx0IGluIGNhc2UgaXQgaXMuCisgICAgICBzdGF0aWNfY2FzdDxVSW50MzI+KGZpcnN0KTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCisvLyBUaGUgd2lkZSBzdHJpbmcgaXMgYXNzdW1lZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZW5jb2Rpbmc6CisvLyAgIFVURi0xNiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gMiAob24gV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKQorLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQorLy8gUGFyYW1ldGVyIHN0ciBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuCisvLyBQYXJhbWV0ZXIgbnVtX2NoYXJzIG1heSBhZGRpdGlvbmFsbHkgbGltaXQgdGhlIG51bWJlcgorLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nCisvLyBzaG91bGQgYmUgcHJvY2Vzc2VkLgorLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50cworLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dAorLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLiBJZiB0aGUgc3RyaW5nIGlzIGluIFVURjE2IGVuY29kaW5nCisvLyBhbmQgY29udGFpbnMgaW52YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLCB2YWx1ZXMgaW4gdGhvc2UgcGFpcnMKKy8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4KK1N0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycykgeworICBpZiAobnVtX2NoYXJzID09IC0xKQorICAgIG51bV9jaGFycyA9IHN0YXRpY19jYXN0PGludD4od2NzbGVuKHN0cikpOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7CisgICAgVUludDMyIHVuaWNvZGVfY29kZV9wb2ludDsKKworICAgIGlmIChzdHJbaV0gPT0gTCdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoaSArIDEgPCBudW1fY2hhcnMgJiYgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLCBzdHJbaSArIDFdKSkgeworICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpICsgMV0pOworICAgICAgaSsrOworICAgIH0gZWxzZSB7CisgICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHN0cltpXSk7CisgICAgfQorCisgICAgY2hhciBidWZmZXJbMzJdOyAgLy8gQ29kZVBvaW50VG9VdGY4IHJlcXVpcmVzIGEgYnVmZmVyIHRoaXMgYmlnLgorICAgIHN0cmVhbSA8PCBDb2RlUG9pbnRUb1V0ZjgodW5pY29kZV9jb2RlX3BvaW50LCBidWZmZXIpOworICB9CisgIHJldHVybiBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKTsKK30KKworLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGEgU3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KKy8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuCitTdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCAqIHdpZGVfY19zdHIpIHsKKyAgaWYgKHdpZGVfY19zdHIgPT0gTlVMTCkgcmV0dXJuIFN0cmluZygiKG51bGwpIik7CisKKyAgcmV0dXJuIFN0cmluZyhpbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmOCh3aWRlX2Nfc3RyLCAtMSkuY19zdHIoKSk7Cit9CisKKy8vIFNpbWlsYXIgdG8gU2hvd1dpZGVDU3RyaW5nKCksIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gZW5jbG9zZXMKKy8vIHRoZSBjb252ZXJ0ZWQgc3RyaW5nIGluIGRvdWJsZSBxdW90ZXMuCitTdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cikgeworICBpZiAod2lkZV9jX3N0ciA9PSBOVUxMKSByZXR1cm4gU3RyaW5nKCIobnVsbCkiKTsKKworICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIkxcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cikuY19zdHIoKSk7Cit9CisKKy8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCisvLyBjb250ZW50LgorLy8KKy8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKKy8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKy8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorYm9vbCBTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QgKiBsaHMsIGNvbnN0IHdjaGFyX3QgKiByaHMpIHsKKyAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7CisKKyAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHdjc2NtcChsaHMsIHJocykgPT0gMDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGFjdHVhbCkgeworICBpZiAoU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgIFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nUXVvdGVkKGFjdHVhbCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgorQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMikgeworICBpZiAoIVN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFN0cmluZzo6U2hvd1dpZGVDU3RyaW5nUXVvdGVkKHMxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZChzMik7Cit9CisKKy8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZQorLy8gdGhlIHNhbWUgY29udGVudC4KKy8vCisvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKy8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAorLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7CisgIGlmIChsaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gcmhzID09IE5VTEw7CisgIGlmIChyaHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwb3NpeDo6U3RyQ2FzZUNtcChsaHMsIHJocykgPT0gMDsKK30KKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKKyAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KKyAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLAorICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KKyAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuCisgIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFCisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBPbiBHTlUgcGxhdGZvcm0gdGhpcyBtZXRob2QgdXNlcyB3Y3NjYXNlY21wCisgIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisgIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUKKyAgLy8gY3VycmVudCBsb2NhbGUuCitib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgeworICBpZiAobGhzID09IE5VTEwpIHJldHVybiByaHMgPT0gTlVMTDsKKworICBpZiAocmhzID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgcmV0dXJuIF93Y3NpY21wKGxocywgcmhzKSA9PSAwOworI2VsaWYgR1RFU1RfT1NfTElOVVggJiYgIUdURVNUX09TX0xJTlVYX0FORFJPSUQKKyAgcmV0dXJuIHdjc2Nhc2VjbXAobGhzLCByaHMpID09IDA7CisjZWxzZQorICAvLyBBbmRyb2lkLCBNYWMgT1MgWCBhbmQgQ3lnd2luIGRvbid0IGRlZmluZSB3Y3NjYXNlY21wLgorICAvLyBPdGhlciB1bmtub3duIE9TZXMgbWF5IG5vdCBkZWZpbmUgaXQgZWl0aGVyLgorICB3aW50X3QgbGVmdCwgcmlnaHQ7CisgIGRvIHsKKyAgICBsZWZ0ID0gdG93bG93ZXIoKmxocysrKTsKKyAgICByaWdodCA9IHRvd2xvd2VyKCpyaHMrKyk7CisgIH0gd2hpbGUgKGxlZnQgJiYgbGVmdCA9PSByaWdodCk7CisgIHJldHVybiBsZWZ0ID09IHJpZ2h0OworI2VuZGlmICAvLyBPUyBzZWxlY3RvcgorfQorCisvLyBDb21wYXJlcyB0aGlzIHdpdGggYW5vdGhlciBTdHJpbmcuCisvLyBSZXR1cm5zIDwgMCBpZiB0aGlzIGlzIGxlc3MgdGhhbiByaHMsIDAgaWYgdGhpcyBpcyBlcXVhbCB0byByaHMsIG9yID4gMAorLy8gaWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gcmhzLgoraW50IFN0cmluZzo6Q29tcGFyZShjb25zdCBTdHJpbmcgJiByaHMpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGhzX2Nfc3RyID0gY19zdHIoKTsKKyAgY29uc3QgY2hhciogY29uc3QgcmhzX2Nfc3RyID0gcmhzLmNfc3RyKCk7CisKKyAgaWYgKGxoc19jX3N0ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHJoc19jX3N0ciA9PSBOVUxMID8gMCA6IC0xOyAgLy8gTlVMTCA8IGFueXRoaW5nIGV4Y2VwdCBOVUxMCisgIH0gZWxzZSBpZiAocmhzX2Nfc3RyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGNvbnN0IHNpemVfdCBzaG9ydGVyX3N0cl9sZW4gPQorICAgICAgbGVuZ3RoKCkgPD0gcmhzLmxlbmd0aCgpID8gbGVuZ3RoKCkgOiByaHMubGVuZ3RoKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNob3J0ZXJfc3RyX2xlbjsgaSsrKSB7CisgICAgaWYgKGxoc19jX3N0cltpXSA8IHJoc19jX3N0cltpXSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAobGhzX2Nfc3RyW2ldID4gcmhzX2Nfc3RyW2ldKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChsZW5ndGgoKSA8IHJocy5sZW5ndGgoKSkgPyAtMSA6CisgICAgICAobGVuZ3RoKCkgPiByaHMubGVuZ3RoKCkpID8gMSA6IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBTdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXguICAqQW55KgorLy8gU3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYSBOVUxMIG9yIGVtcHR5IHN1ZmZpeC4KK2Jvb2wgU3RyaW5nOjpFbmRzV2l0aChjb25zdCBjaGFyKiBzdWZmaXgpIGNvbnN0IHsKKyAgaWYgKHN1ZmZpeCA9PSBOVUxMIHx8IENTdHJpbmdFcXVhbHMoc3VmZml4LCAiIikpIHJldHVybiB0cnVlOworCisgIGlmIChjX3N0cigpID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICBjb25zdCBzaXplX3QgdGhpc19sZW4gPSBzdHJsZW4oY19zdHIoKSk7CisgIGNvbnN0IHNpemVfdCBzdWZmaXhfbGVuID0gc3RybGVuKHN1ZmZpeCk7CisgIHJldHVybiAodGhpc19sZW4gPj0gc3VmZml4X2xlbikgJiYKKyAgICAgICAgIENTdHJpbmdFcXVhbHMoY19zdHIoKSArIHRoaXNfbGVuIC0gc3VmZml4X2xlbiwgc3VmZml4KTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcgY2FzZS4KKy8vIEFueSBTdHJpbmcgaXMgY29uc2lkZXJlZCB0byBlbmQgd2l0aCBhIE5VTEwgb3IgZW1wdHkgc3VmZml4LgorYm9vbCBTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKGNvbnN0IGNoYXIqIHN1ZmZpeCkgY29uc3QgeworICBpZiAoc3VmZml4ID09IE5VTEwgfHwgQ1N0cmluZ0VxdWFscyhzdWZmaXgsICIiKSkgcmV0dXJuIHRydWU7CisKKyAgaWYgKGNfc3RyKCkgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IHNpemVfdCB0aGlzX2xlbiA9IHN0cmxlbihjX3N0cigpKTsKKyAgY29uc3Qgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgcmV0dXJuICh0aGlzX2xlbiA+PSBzdWZmaXhfbGVuKSAmJgorICAgICAgICAgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjX3N0cigpICsgdGhpc19sZW4gLSBzdWZmaXhfbGVuLCBzdWZmaXgpOworfQorCisvLyBGb3JtYXRzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYSBTdHJpbmcsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdAorLy8gc3BlYyBzdHJpbmcgYXMgZm9yIHByaW50Zi4KKy8vCisvLyBXZSBkbyBub3QgdXNlIHRoZSBTdHJpbmdQcmludGYgY2xhc3MgYXMgaXQgaXMgbm90IHVuaXZlcnNhbGx5CisvLyBhdmFpbGFibGUuCisvLworLy8gVGhlIHJlc3VsdCBpcyBsaW1pdGVkIHRvIDQwOTYgY2hhcmFjdGVycyAoaW5jbHVkaW5nIHRoZSB0YWlsaW5nIDApLgorLy8gSWYgNDA5NiBjaGFyYWN0ZXJzIGFyZSBub3QgZW5vdWdoIHRvIGZvcm1hdCB0aGUgaW5wdXQsIG9yIGlmCisvLyB0aGVyZSdzIGFuIGVycm9yLCAiPGZvcm1hdHRpbmcgZXJyb3Igb3IgYnVmZmVyIGV4Y2VlZGVkPiIgaXMKKy8vIHJldHVybmVkLgorU3RyaW5nIFN0cmluZzo6Rm9ybWF0KGNvbnN0IGNoYXIgKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgY2hhciBidWZmZXJbNDA5Nl07CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IHNpemVvZihidWZmZXIpL3NpemVvZihidWZmZXJbMF0pOworCisgIC8vIE1TVkMgOCBkZXByZWNhdGVzIHZzbnByaW50ZigpLCBzbyB3ZSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmcKKyAgLy8gNDk5NiAoZGVwcmVjYXRlZCBmdW5jdGlvbikgdGhlcmUuCisjaWZkZWYgX01TQ19WRVIgIC8vIFdlIGFyZSB1c2luZyBNU1ZDLgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLgorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYuCisKKyAgY29uc3QgaW50IHNpemUgPSB2c25wcmludGYoYnVmZmVyLCBrQnVmZmVyU2l6ZSwgZm9ybWF0LCBhcmdzKTsKKworIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbHNlICAvLyBXZSBhcmUgbm90IHVzaW5nIE1TVkMuCisgIGNvbnN0IGludCBzaXplID0gdnNucHJpbnRmKGJ1ZmZlciwga0J1ZmZlclNpemUsIGZvcm1hdCwgYXJncyk7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisgIHZhX2VuZChhcmdzKTsKKworICAvLyB2c25wcmludGYoKSdzIGJlaGF2aW9yIGlzIG5vdCBwb3J0YWJsZS4gIFdoZW4gdGhlIGJ1ZmZlciBpcyBub3QKKyAgLy8gYmlnIGVub3VnaCwgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGluIE1TVkMsIGFuZCByZXR1cm5zIHRoZQorICAvLyBuZWVkZWQgYnVmZmVyIHNpemUgb24gTGludXguICBXaGVuIHRoZXJlIGlzIGFuIG91dHB1dCBlcnJvciwgaXQKKyAgLy8gYWx3YXlzIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4gIEZvciBzaW1wbGljaXR5LCB3ZSBsdW1wIHRoZSB0d28KKyAgLy8gZXJyb3IgY2FzZXMgdG9nZXRoZXIuCisgIGlmIChzaXplIDwgMCB8fCBzaXplID49IGtCdWZmZXJTaXplKSB7CisgICAgcmV0dXJuIFN0cmluZygiPGZvcm1hdHRpbmcgZXJyb3Igb3IgYnVmZmVyIGV4Y2VlZGVkPiIpOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpbmcoYnVmZmVyLCBzaXplKTsKKyAgfQorfQorCisvLyBDb252ZXJ0cyB0aGUgYnVmZmVyIGluIGEgc3RyaW5nc3RyZWFtIHRvIGEgU3RyaW5nLCBjb252ZXJ0aW5nIE5VTAorLy8gYnl0ZXMgdG8gIlxcMCIgYWxvbmcgdGhlIHdheS4KK1N0cmluZyBTdHJpbmdTdHJlYW1Ub1N0cmluZyg6OnN0ZDo6c3RyaW5nc3RyZWFtKiBzcykgeworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIgPSBzcy0+c3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXJ0ID0gc3RyLmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyLmxlbmd0aCgpOworCisgIC8vIFdlIG5lZWQgdG8gdXNlIGEgaGVscGVyIHN0cmluZ3N0cmVhbSB0byBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uCisgIC8vIGJlY2F1c2UgU3RyaW5nIGRvZXNuJ3Qgc3VwcG9ydCBwdXNoX2JhY2soKS4KKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBoZWxwZXI7CisgIGZvciAoY29uc3QgY2hhciogY2ggPSBzdGFydDsgY2ggIT0gZW5kOyArK2NoKSB7CisgICAgaWYgKCpjaCA9PSAnXDAnKSB7CisgICAgICBoZWxwZXIgPDwgIlxcMCI7ICAvLyBSZXBsYWNlcyBOVUwgd2l0aCAiXFwwIjsKKyAgICB9IGVsc2UgeworICAgICAgaGVscGVyLnB1dCgqY2gpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTdHJpbmcoaGVscGVyLnN0cigpLmNfc3RyKCkpOworfQorCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorU3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKGNvbnN0IFN0cmluZyYgZ3Rlc3RfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKSB7CisgIC8vIEFwcGVuZHMgdGhlIHVzZXIgbWVzc2FnZSBpZiBpdCdzIG5vbi1lbXB0eS4KKyAgY29uc3QgU3RyaW5nIHVzZXJfbXNnX3N0cmluZyA9IHVzZXJfbXNnLkdldFN0cmluZygpOworICBpZiAodXNlcl9tc2dfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gZ3Rlc3RfbXNnOworICB9CisKKyAgTWVzc2FnZSBtc2c7CisgIG1zZyA8PCBndGVzdF9tc2cgPDwgIlxuIiA8PCB1c2VyX21zZ19zdHJpbmc7CisKKyAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGNsYXNzIFRlc3RSZXN1bHQKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgorVGVzdFJlc3VsdDo6VGVzdFJlc3VsdCgpCisgICAgOiBkZWF0aF90ZXN0X2NvdW50XygwKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEJ3Rvci4KK1Rlc3RSZXN1bHQ6On5UZXN0UmVzdWx0KCkgeworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbgorLy8gcmFuZ2UgZnJvbSAwIHRvIHRvdGFsX3BhcnRfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsCisvLyBhYm9ydHMgdGhlIHByb2dyYW0uCitjb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0IHsKKyAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxfcGFydF9jb3VudCgpKQorICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXy5hdChpKTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKKy8vIHByb2dyYW0uCitjb25zdCBUZXN0UHJvcGVydHkmIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3QgeworICBpZiAoaSA8IDAgfHwgaSA+PSB0ZXN0X3Byb3BlcnR5X2NvdW50KCkpCisgICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOworICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXy5hdChpKTsKK30KKworLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KK3ZvaWQgVGVzdFJlc3VsdDo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoKSB7CisgIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOworfQorCisvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KK3ZvaWQgVGVzdFJlc3VsdDo6QWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKKyAgdGVzdF9wYXJ0X3Jlc3VsdHNfLnB1c2hfYmFjayh0ZXN0X3BhcnRfcmVzdWx0KTsKK30KKworLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIElmIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXkgYXMgdGhlCisvLyBzdXBwbGllZCBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlcHJlc2VudGVkLCB0aGUgdmFsdWUgb2YgdGhpcyB0ZXN0X3Byb3BlcnR5CisvLyByZXBsYWNlcyB0aGUgb2xkIHZhbHVlIGZvciB0aGF0IGtleS4KK3ZvaWQgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7CisgIGlmICghVmFsaWRhdGVUZXN0UHJvcGVydHkodGVzdF9wcm9wZXJ0eSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZ0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6aXRlcmF0b3IgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPQorICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfcHJvcGVydGllc18uYmVnaW4oKSwgdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdFByb3BlcnR5S2V5SXModGVzdF9wcm9wZXJ0eS5rZXkoKSkpOworICBpZiAocHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPT0gdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSkgeworICAgIHRlc3RfcHJvcGVydGllc18ucHVzaF9iYWNrKHRlc3RfcHJvcGVydHkpOworICAgIHJldHVybjsKKyAgfQorICBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleS0+U2V0VmFsdWUodGVzdF9wcm9wZXJ0eS52YWx1ZSgpKTsKK30KKworLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiBHb29nbGUgVGVzdAorLy8gdGVzdGNhc2UgdGFncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCitib29sIFRlc3RSZXN1bHQ6OlZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgeworICBpbnRlcm5hbDo6U3RyaW5nIGtleSh0ZXN0X3Byb3BlcnR5LmtleSgpKTsKKyAgaWYgKGtleSA9PSAibmFtZSIgfHwga2V5ID09ICJzdGF0dXMiIHx8IGtleSA9PSAidGltZSIgfHwga2V5ID09ICJjbGFzc25hbWUiKSB7CisgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICA8PCAiUmVzZXJ2ZWQga2V5IHVzZWQgaW4gUmVjb3JkUHJvcGVydHkoKTogIgorICAgICAgICA8PCBrZXkKKyAgICAgICAgPDwgIiAoJ25hbWUnLCAnc3RhdHVzJywgJ3RpbWUnLCBhbmQgJ2NsYXNzbmFtZScgYXJlIHJlc2VydmVkIGJ5ICIKKyAgICAgICAgPDwgR1RFU1RfTkFNRV8gPDwgIikiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ2xlYXJzIHRoZSBvYmplY3QuCit2b2lkIFRlc3RSZXN1bHQ6OkNsZWFyKCkgeworICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsKKyAgdGVzdF9wcm9wZXJ0aWVzXy5jbGVhcigpOworICBkZWF0aF90ZXN0X2NvdW50XyA9IDA7CisgIGVsYXBzZWRfdGltZV8gPSAwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KK2Jvb2wgVGVzdFJlc3VsdDo6RmFpbGVkKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEdldFRlc3RQYXJ0UmVzdWx0KGkpLmZhaWxlZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmF0YWxseSBmYWlsZWQuCitzdGF0aWMgYm9vbCBUZXN0UGFydEZhdGFsbHlGYWlsZWQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICByZXR1cm4gcmVzdWx0LmZhdGFsbHlfZmFpbGVkKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCitib29sIFRlc3RSZXN1bHQ6Okhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9wYXJ0X3Jlc3VsdHNfLCBUZXN0UGFydEZhdGFsbHlGYWlsZWQpID4gMDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IG5vbi1mYXRhbGx5IGZhaWxlZC4KK3N0YXRpYyBib29sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiByZXN1bHQubm9uZmF0YWxseV9mYWlsZWQoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdFJlc3VsdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0Tm9uZmF0YWxseUZhaWxlZCkgPiAwOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcgorLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgoraW50IFRlc3RSZXN1bHQ6OnRvdGFsX3BhcnRfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcGFydF9yZXN1bHRzXy5zaXplKCkpOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KK2ludCBUZXN0UmVzdWx0Ojp0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X3Byb3BlcnRpZXNfLnNpemUoKSk7Cit9CisKKy8vIGNsYXNzIFRlc3QKKworLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0LgorCisvLyBUaGUgYyd0b3Igc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MuCitUZXN0OjpUZXN0KCkKKyAgICA6IGd0ZXN0X2ZsYWdfc2F2ZXJfKG5ldyBpbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIpIHsKK30KKworLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorVGVzdDo6flRlc3QoKSB7CisgIGRlbGV0ZSBndGVzdF9mbGFnX3NhdmVyXzsKK30KKworLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpTZXRVcCgpIHsKK30KKworLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgorLy8KKy8vIEEgc3ViLWNsYXNzIG1heSBvdmVycmlkZSB0aGlzLgordm9pZCBUZXN0OjpUZWFyRG93bigpIHsKK30KKworLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCit2b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJlY29yZFByb3BlcnR5Rm9yQ3VycmVudFRlc3Qoa2V5LCB2YWx1ZSk7Cit9CisKKy8vIEFsbG93cyB1c2VyIHN1cHBsaWVkIGtleSB2YWx1ZSBwYWlycyB0byBiZSByZWNvcmRlZCBmb3IgbGF0ZXIgb3V0cHV0Lgordm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSkgeworICBNZXNzYWdlIHZhbHVlX21lc3NhZ2U7CisgIHZhbHVlX21lc3NhZ2UgPDwgdmFsdWU7CisgIFJlY29yZFByb3BlcnR5KGtleSwgdmFsdWVfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIGZyaWVuZCBvZiBVbml0VGVzdCBhbmQgYXMgc3VjaCBoYXMgYWNjZXNzIHRvCisgIC8vIEFkZFRlc3RQYXJ0UmVzdWx0LgorICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkVGVzdFBhcnRSZXN1bHQoCisgICAgICByZXN1bHRfdHlwZSwKKyAgICAgIE5VTEwsICAvLyBObyBpbmZvIGFib3V0IHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAgLTEsICAgIC8vIFdlIGhhdmUgbm8gaW5mbyBvbiB3aGljaCBsaW5lIGNhdXNlZCB0aGUgZXhjZXB0aW9uLgorICAgICAgbWVzc2FnZSwKKyAgICAgIFN0cmluZygpKTsgIC8vIE5vIHN0YWNrIHRyYWNlLCBlaXRoZXIuCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBHb29nbGUgVGVzdCByZXF1aXJlcyBhbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIHRvIHVzZSB0aGUgc2FtZSB0ZXN0CisvLyBmaXh0dXJlIGNsYXNzLiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlCisvLyBzYW1lIGZpeHR1cmUgY2xhc3MgYXMgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLiAgSWYKKy8vIHllcywgaXQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgaXQgZ2VuZXJhdGVzIGEgR29vZ2xlIFRlc3QgZmFpbHVyZSBhbmQKKy8vIHJldHVybnMgZmFsc2UuCitib29sIFRlc3Q6Okhhc1NhbWVGaXh0dXJlQ2xhc3MoKSB7CisgIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBpbXBsLT5jdXJyZW50X3Rlc3RfY2FzZSgpOworCisgIC8vIEluZm8gYWJvdXQgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgorICBjb25zdCBUZXN0SW5mbyogY29uc3QgZmlyc3RfdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpWzBdOworICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpcnN0X2ZpeHR1cmVfaWQgPSBmaXJzdF90ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCBmaXJzdF90ZXN0X25hbWUgPSBmaXJzdF90ZXN0X2luZm8tPm5hbWUoKTsKKworICAvLyBJbmZvIGFib3V0IHRoZSBjdXJyZW50IHRlc3QuCisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0aGlzX3Rlc3RfaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGNvbnN0IGludGVybmFsOjpUeXBlSWQgdGhpc19maXh0dXJlX2lkID0gdGhpc190ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOworICBjb25zdCBjaGFyKiBjb25zdCB0aGlzX3Rlc3RfbmFtZSA9IHRoaXNfdGVzdF9pbmZvLT5uYW1lKCk7CisKKyAgaWYgKHRoaXNfZml4dHVyZV9pZCAhPSBmaXJzdF9maXh0dXJlX2lkKSB7CisgICAgLy8gSXMgdGhlIGZpcnN0IHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgZmlyc3RfaXNfVEVTVCA9IGZpcnN0X2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKKyAgICAvLyBJcyB0aGlzIHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPworICAgIGNvbnN0IGJvb2wgdGhpc19pc19URVNUID0gdGhpc19maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7CisKKyAgICBpZiAoZmlyc3RfaXNfVEVTVCB8fCB0aGlzX2lzX1RFU1QpIHsKKyAgICAgIC8vIFRoZSB1c2VyIG1peGVkIFRFU1QgYW5kIFRFU1RfRiBpbiB0aGlzIHRlc3QgY2FzZSAtIHdlJ2xsIHRlbGwKKyAgICAgIC8vIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKworICAgICAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVEVTVCBhbmQgdGhlIG5hbWUgb2YgdGhlIFRFU1RfRi4gIE5vdGUKKyAgICAgIC8vIHRoYXQgZmlyc3RfaXNfVEVTVCBhbmQgdGhpc19pc19URVNUIGNhbm5vdCBib3RoIGJlIHRydWUsIGFzCisgICAgICAvLyB0aGUgZml4dHVyZSBJRHMgYXJlIGRpZmZlcmVudCBmb3IgdGhlIHR3byB0ZXN0cy4KKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfbmFtZSA9CisgICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IGZpcnN0X3Rlc3RfbmFtZSA6IHRoaXNfdGVzdF9uYW1lOworICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9GX25hbWUgPQorICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyB0aGlzX3Rlc3RfbmFtZSA6IGZpcnN0X3Rlc3RfbmFtZTsKKworICAgICAgQUREX0ZBSUxVUkUoKQorICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgorICAgICAgICAgIDw8ICJjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXNcbiIKKyAgICAgICAgICA8PCAiaWxsZWdhbC4gIEluIHRlc3QgY2FzZSAiIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpCisgICAgICAgICAgPDwgIixcbiIKKyAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfRl9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0XG4iCisgICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHlcbiIKKyAgICAgICAgICA8PCAid2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0XG4iCisgICAgICAgICAgPDwgImNhc2UuIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhlIHVzZXIgZGVmaW5lZCB0d28gZml4dHVyZSBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBpbgorICAgICAgLy8gdHdvIG5hbWVzcGFjZXMgLSB3ZSdsbCB0ZWxsIGhpbS9oZXIgaG93IHRvIGZpeCBpdC4KKyAgICAgIEFERF9GQUlMVVJFKCkKKyAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKKyAgICAgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIgorICAgICAgICAgIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIsXG4iCisgICAgICAgICAgPDwgInlvdSBkZWZpbmVkIHRlc3QgIiA8PCBmaXJzdF90ZXN0X25hbWUKKyAgICAgICAgICA8PCAiIGFuZCB0ZXN0ICIgPDwgdGhpc190ZXN0X25hbWUgPDwgIlxuIgorICAgICAgICAgIDw8ICJ1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmXG4iCisgICAgICAgICAgPDwgInRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvblxuIgorICAgICAgICAgIDw8ICJ1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lXG4iCisgICAgICAgICAgPDwgIm9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4iOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEdURVNUX0hBU19TRUgKKworLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LiAgVGhpcworLy8gZnVuY3Rpb24gcmV0dXJucyBpdHMgcmVzdWx0IHZpYSBhbiBvdXRwdXQgcGFyYW1ldGVyIHBvaW50ZXIgYmVjYXVzZSBWQysrCisvLyBwcm9oaWJpdHMgY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucworLy8gdXNpbmcgX190cnkgKHNlZSBlcnJvciBDMjcxMikuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyogRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZShEV09SRCBleGNlcHRpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7CisgIE1lc3NhZ2UgbWVzc2FnZTsKKyAgbWVzc2FnZSA8PCAiU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgiIDw8IHN0ZDo6c2V0YmFzZSgxNikgPDwKKyAgICBleGNlcHRpb25fY29kZSA8PCBzdGQ6OnNldGJhc2UoMTApIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOworCisgIHJldHVybiBuZXcgaW50ZXJuYWw6OlN0cmluZyhtZXNzYWdlLkdldFN0cmluZygpKTsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworCisvLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICBNZXNzYWdlIG1lc3NhZ2U7CisgIGlmIChkZXNjcmlwdGlvbiAhPSBOVUxMKSB7CisgICAgbWVzc2FnZSA8PCAiQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uIFwiIiA8PCBkZXNjcmlwdGlvbiA8PCAiXCIiOworICB9IGVsc2UgeworICAgIG1lc3NhZ2UgPDwgIlVua25vd24gQysrIGV4Y2VwdGlvbiI7CisgIH0KKyAgbWVzc2FnZSA8PCAiIHRocm93biBpbiAiIDw8IGxvY2F0aW9uIDw8ICIuIjsKKworICByZXR1cm4gbWVzc2FnZS5HZXRTdHJpbmcoKTsKK30KKworc3RhdGljIGludGVybmFsOjpTdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKKworLy8gQSBmYWlsZWQgR29vZ2xlIFRlc3QgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9mIHRoaXMgdHlwZSB3aGVuCisvLyBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpIGlzIHRydWUgKGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQpLiAgV2UKKy8vIGRlcml2ZSBpdCBmcm9tIHN0ZDo6cnVudGltZV9lcnJvciwgd2hpY2ggaXMgZm9yIGVycm9ycyBwcmVzdW1hYmx5CisvLyBkZXRlY3RhYmxlIG9ubHkgYXQgcnVuIHRpbWUuICBTaW5jZSBzdGQ6OnJ1bnRpbWVfZXJyb3IgaW5oZXJpdHMgZnJvbQorLy8gc3RkOjpleGNlcHRpb24sIG1hbnkgdGVzdGluZyBmcmFtZXdvcmtzIGtub3cgaG93IHRvIGV4dHJhY3QgYW5kIHByaW50IHRoZQorLy8gbWVzc2FnZSBpbnNpZGUgaXQuCitjbGFzcyBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiA6IHB1YmxpYyA6OnN0ZDo6cnVudGltZV9lcnJvciB7CisgcHVibGljOgorICBleHBsaWNpdCBHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihjb25zdCBUZXN0UGFydFJlc3VsdCYgZmFpbHVyZSkKKyAgICAgIDogOjpzdGQ6OnJ1bnRpbWVfZXJyb3IoUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKGZhaWx1cmUpLmNfc3RyKCkpIHt9Cit9OworI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUworCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gV2UgcHV0IHRoZXNlIGhlbHBlciBmdW5jdGlvbnMgaW4gdGhlIGludGVybmFsIG5hbWVzcGFjZSBhcyBJQk0ncyB4bEMKKy8vIGNvbXBpbGVyIHJlamVjdHMgdGhlIGNvZGUgaWYgdGhleSB3ZXJlIGRlY2xhcmVkIHN0YXRpYy4KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBoYW5kbGVzIFNFSCBleGNlcHRpb25zIGl0IHRocm93cywgd2hlbgorLy8gU0VIIGlzIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZSBSZXN1bHQgaW4gY2FzZSBvZiBhbgorLy8gU0VIIGV4Y2VwdGlvbi4gIChNaWNyb3NvZnQgY29tcGlsZXJzIGNhbm5vdCBoYW5kbGUgU0VIIGFuZCBDKysKKy8vIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUaGVyZWZvcmUsIHdlIHByb3ZpZGUgYSBzZXBhcmF0ZQorLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgU0VIIGV4Y2VwdGlvbnMuKQordGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KK1Jlc3VsdCBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKKyNpZiBHVEVTVF9IQVNfU0VICisgIF9fdHJ5IHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfSBfX2V4Y2VwdCAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKCAgLy8gTk9MSU5UCisgICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7CisgICAgLy8gV2UgY3JlYXRlIHRoZSBleGNlcHRpb24gbWVzc2FnZSBvbiB0aGUgaGVhcCBiZWNhdXNlIFZDKysgcHJvaGliaXRzCisgICAgLy8gY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucyB1c2luZyBfX3RyeQorICAgIC8vIChzZWUgZXJyb3IgQzI3MTIpLgorICAgIGludGVybmFsOjpTdHJpbmcqIGV4Y2VwdGlvbl9tZXNzYWdlID0gRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZSgKKyAgICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpLCBsb2NhdGlvbik7CisgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleGNlcHRpb25fbWVzc2FnZSk7CisgICAgZGVsZXRlIGV4Y2VwdGlvbl9tZXNzYWdlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworICB9CisjZWxzZQorICAodm9pZClsb2NhdGlvbjsKKyAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKK30KKworLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBjYXRjaGVzIGFuZCByZXBvcnRzIEMrKyBhbmQvb3IgU0VILXN0eWxlCisvLyBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQ7IHJldHVybnMgdGhlIDAtdmFsdWUgZm9yIHR5cGUKKy8vIFJlc3VsdCBpbiBjYXNlIG9mIGFuIFNFSCBleGNlcHRpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgUmVzdWx0PgorUmVzdWx0IEhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgeworICAvLyBOT1RFOiBUaGUgdXNlciBjb2RlIGNhbiBhZmZlY3QgdGhlIHdheSBpbiB3aGljaCBHb29nbGUgVGVzdCBoYW5kbGVzCisgIC8vIGV4Y2VwdGlvbnMgYnkgc2V0dGluZyBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpLCBidXQgb25seSBiZWZvcmUKKyAgLy8gUlVOX0FMTF9URVNUUygpIHN0YXJ0cy4gSXQgaXMgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8gY2hlY2sgdGhlIGZsYWcKKyAgLy8gYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYW5kIGVpdGhlciByZXBvcnQgb3IgcmUtdGhyb3cgdGhlCisgIC8vIGV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgZmxhZydzIHZhbHVlOgorICAvLworICAvLyB0cnkgeworICAvLyAgIC8vIFBlcmZvcm0gdGhlIHRlc3QgbWV0aG9kLgorICAvLyB9IGNhdGNoICguLi4pIHsKKyAgLy8gICBpZiAoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkKKyAgLy8gICAgIC8vIFJlcG9ydCB0aGUgZXhjZXB0aW9uIGFzIGZhaWx1cmUuCisgIC8vICAgZWxzZQorICAvLyAgICAgdGhyb3c7ICAvLyBSZS10aHJvd3MgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4KKyAgLy8gfQorICAvLworICAvLyBIb3dldmVyLCB0aGUgcHVycG9zZSBvZiB0aGlzIGZsYWcgaXMgdG8gYWxsb3cgdGhlIHByb2dyYW0gdG8gZHJvcCBpbnRvCisgIC8vIHRoZSBkZWJ1Z2dlciB3aGVuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBPbiBtb3N0IHBsYXRmb3Jtcywgb25jZSB0aGUKKyAgLy8gY29udHJvbCBlbnRlcnMgdGhlIGNhdGNoIGJsb2NrLCB0aGUgZXhjZXB0aW9uIG9yaWdpbiBpbmZvcm1hdGlvbiBpcworICAvLyBsb3N0IGFuZCB0aGUgZGVidWdnZXIgd2lsbCBzdG9wIHRoZSBwcm9ncmFtIGF0IHRoZSBwb2ludCBvZiB0aGUKKyAgLy8gcmUtdGhyb3cgaW4gdGhpcyBmdW5jdGlvbiAtLSBpbnN0ZWFkIG9mIGF0IHRoZSBwb2ludCBvZiB0aGUgb3JpZ2luYWwKKyAgLy8gdGhyb3cgc3RhdGVtZW50IGluIHRoZSBjb2RlIHVuZGVyIHRlc3QuICBGb3IgdGhpcyByZWFzb24sIHdlIHBlcmZvcm0KKyAgLy8gdGhlIGNoZWNrIGVhcmx5LCBzYWNyaWZpY2luZyB0aGUgYWJpbGl0eSB0byBhZmZlY3QgR29vZ2xlIFRlc3QncworICAvLyBleGNlcHRpb24gaGFuZGxpbmcgaW4gdGhlIG1ldGhvZCB3aGVyZSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgaWYgKGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgICB0cnkgeworICAgICAgcmV0dXJuIEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKG9iamVjdCwgbWV0aG9kLCBsb2NhdGlvbik7CisgICAgfSBjYXRjaCAoY29uc3QgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24mKSB7ICAvLyBOT0xJTlQKKyAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIGRvZXNuJ3Qgb3JpZ2luYXRlIGluIGNvZGUgdW5kZXIgdGVzdC4gSXQgbWFrZXMgbm8KKyAgICAgIC8vIHNlbnNlIHRvIHJlcG9ydCBpdCBhcyBhIHRlc3QgZmFpbHVyZS4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7ICAvLyBOT0xJTlQKKyAgICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCisgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCisgICAgICAgICAgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShlLndoYXQoKSwgbG9jYXRpb24pKTsKKyAgICB9IGNhdGNoICguLi4pIHsgIC8vIE5PTElOVAorICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKKyAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKKyAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKE5VTEwsIGxvY2F0aW9uKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOworI2Vsc2UKKyAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gUnVucyB0aGUgdGVzdCBhbmQgdXBkYXRlcyB0aGUgdGVzdCByZXN1bHQuCit2b2lkIFRlc3Q6OlJ1bigpIHsKKyAgaWYgKCFIYXNTYW1lRml4dHVyZUNsYXNzKCkpIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQodGhpcywgJlRlc3Q6OlNldFVwLCAiU2V0VXAoKSIpOworICAvLyBXZSB3aWxsIHJ1biB0aGUgdGVzdCBvbmx5IGlmIFNldFVwKCkgd2FzIHN1Y2Nlc3NmdWwuCisgIGlmICghSGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICAgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgICAgdGhpcywgJlRlc3Q6OlRlc3RCb2R5LCAidGhlIHRlc3QgYm9keSIpOworICB9CisKKyAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSGVuY2Ugd2Ugd2lsbAorICAvLyBhbHdheXMgY2FsbCBUZWFyRG93bigpLCBldmVuIGlmIFNldFVwKCkgb3IgdGhlIHRlc3QgYm9keSBoYXMKKyAgLy8gZmFpbGVkLgorICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdDo6VGVhckRvd24sICJUZWFyRG93bigpIik7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgorYm9vbCBUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSB7CisgIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+SGFzRmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KK2Jvb2wgVGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgeworICByZXR1cm4gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPgorICAgICAgSGFzTm9uZmF0YWxGYWlsdXJlKCk7Cit9CisKKy8vIGNsYXNzIFRlc3RJbmZvCisKKy8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIEl0IGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSB0ZXN0IGZhY3RvcnkKKy8vIG9iamVjdC4KKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IE1ha2UgYV90ZXN0X2Nhc2VfbmFtZSBhbmQgYV9uYW1lIGNvbnN0IHN0cmluZyYncworLy8gdG8gc2lnbmlmeSB0aGV5IGNhbm5vdCBiZSBOVUxMcy4KK1Rlc3RJbmZvOjpUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkKKyAgICA6IHRlc3RfY2FzZV9uYW1lXyhhX3Rlc3RfY2FzZV9uYW1lKSwKKyAgICAgIG5hbWVfKGFfbmFtZSksCisgICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLAorICAgICAgdmFsdWVfcGFyYW1fKGFfdmFsdWVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV92YWx1ZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIGZpeHR1cmVfY2xhc3NfaWRfKGZpeHR1cmVfY2xhc3NfaWQpLAorICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAorICAgICAgaXNfZGlzYWJsZWRfKGZhbHNlKSwKKyAgICAgIG1hdGNoZXNfZmlsdGVyXyhmYWxzZSksCisgICAgICBmYWN0b3J5XyhmYWN0b3J5KSwKKyAgICAgIHJlc3VsdF8oKSB7fQorCisvLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuCitUZXN0SW5mbzo6flRlc3RJbmZvKCkgeyBkZWxldGUgZmFjdG9yeV87IH0KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OworLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCisvLworLy8gQXJndW1lbnRzOgorLy8KKy8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKKy8vICAgdHlwZV9wYXJhbTogICAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorLy8gICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIHZhbHVlX3BhcmFtOiAgICAgIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlc3QncyB2YWx1ZSBwYXJhbWV0ZXIsCisvLyAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisvLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKKy8vICAgc2V0X3VwX3RjOiAgICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKy8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIG5ld2x5IGNyZWF0ZWQgVGVzdEluZm8gaW5zdGFuY2Ugd2lsbCBhc3N1bWUKKy8vICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KK1Rlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KSB7CisgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQorICAgICAgbmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLCBuYW1lLCB0eXBlX3BhcmFtLCB2YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICBmaXh0dXJlX2NsYXNzX2lkLCBmYWN0b3J5KTsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPkFkZFRlc3RJbmZvKHNldF91cF90YywgdGVhcl9kb3duX3RjLCB0ZXN0X2luZm8pOworICByZXR1cm4gdGVzdF9pbmZvOworfQorCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKK3ZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgeworICBNZXNzYWdlIGVycm9yczsKKyAgZXJyb3JzCisgICAgICA8PCAiQXR0ZW1wdGVkIHJlZGVmaW5pdGlvbiBvZiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLlxuIgorICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCisgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLCB5b3UgdHJpZWRcbiIKKyAgICAgIDw8ICJ0byBkZWZpbmUgYSB0ZXN0IHVzaW5nIGEgZml4dHVyZSBjbGFzcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lXG4iCisgICAgICA8PCAidXNlZCBlYXJsaWVyLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHR3byBmaXh0dXJlIGNsYXNzZXMgYXJlXG4iCisgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiBZb3Ugc2hvdWxkXG4iCisgICAgICA8PCAicHJvYmFibHkgcmVuYW1lIG9uZSBvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50XG4iCisgICAgICA8PCAidGVzdCBjYXNlcy4iOworCisgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICBlcnJvcnMuR2V0U3RyaW5nKCkuY19zdHIoKSk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgeworCisvLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgdGVzdCBuYW1lIG9mIGEgVGVzdEluZm8gYWdhaW5zdCBhIGtub3duCisvLyB2YWx1ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZXN0Q2FzZSBjbGFzcyBvbmx5LiAgV2UgcHV0CisvLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKKy8vIG5hbWVzcGFjZS4KKy8vCisvLyBUZXN0TmFtZUlzIGlzIGNvcHlhYmxlLgorY2xhc3MgVGVzdE5hbWVJcyB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgLy8KKyAgLy8gVGVzdE5hbWVJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdE5hbWVJcyhjb25zdCBjaGFyKiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0X2luZm8gbWF0Y2hlcyBuYW1lXy4KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfaW5mbyAmJiBpbnRlcm5hbDo6U3RyaW5nKHRlc3RfaW5mby0+bmFtZSgpKS5Db21wYXJlKG5hbWVfKSA9PSAwOworICB9CisKKyBwcml2YXRlOgorICBpbnRlcm5hbDo6U3RyaW5nIG5hbWVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoaXMgbWV0aG9kIGV4cGFuZHMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgcmVnaXN0ZXJlZCB3aXRoIG1hY3JvcyBURVNUX1AKKy8vIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBpbnRvIHJlZ3VsYXIgdGVzdHMgYW5kIHJlZ2lzdGVycyB0aG9zZS4KKy8vIFRoaXMgd2lsbCBiZSBkb25lIGp1c3Qgb25jZSBkdXJpbmcgdGhlIHByb2dyYW0gcnVudGltZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIHsKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICBpZiAoIXBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8pIHsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfLlJlZ2lzdGVyVGVzdHMoKTsKKyAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfID0gdHJ1ZTsKKyAgfQorI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgorLy8gZGVsZXRlcyBpdC4KK3ZvaWQgVGVzdEluZm86OlJ1bigpIHsKKyAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHdoZXJlIHRvIHN0b3JlIHRlc3QgcmVzdWx0LgorICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8odGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHRlc3QgaXMgYWJvdXQgdG8gc3RhcnQuCisgIHJlcGVhdGVyLT5PblRlc3RTdGFydCgqdGhpcyk7CisKKyAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpOworCisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisKKyAgLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QuCisgIFRlc3QqIGNvbnN0IHRlc3QgPSBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICBmYWN0b3J5XywgJmludGVybmFsOjpUZXN0RmFjdG9yeUJhc2U6OkNyZWF0ZVRlc3QsCisgICAgICAidGhlIHRlc3QgZml4dHVyZSdzIGNvbnN0cnVjdG9yIik7CisKKyAgLy8gUnVucyB0aGUgdGVzdCBvbmx5IGlmIHRoZSB0ZXN0IG9iamVjdCB3YXMgY3JlYXRlZCBhbmQgaXRzCisgIC8vIGNvbnN0cnVjdG9yIGRpZG4ndCBnZW5lcmF0ZSBhIGZhdGFsIGZhaWx1cmUuCisgIGlmICgodGVzdCAhPSBOVUxMKSAmJiAhVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsKKyAgICAvLyBUaGlzIGRvZXNuJ3QgdGhyb3cgYXMgYWxsIHVzZXIgY29kZSB0aGF0IGNhbiB0aHJvdyBhcmUgd3JhcHBlZCBpbnRvCisgICAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUuCisgICAgdGVzdC0+UnVuKCk7CisgIH0KKworICAvLyBEZWxldGVzIHRoZSB0ZXN0IG9iamVjdC4KKyAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKKyAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAorICAgICAgdGVzdCwgJlRlc3Q6OkRlbGV0ZVNlbGZfLCAidGhlIHRlc3QgZml4dHVyZSdzIGRlc3RydWN0b3IiKTsKKworICByZXN1bHRfLnNldF9lbGFwc2VkX3RpbWUoaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQpOworCisgIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCBhIHRlc3QgaGFzIGp1c3QgZmluaXNoZWQuCisgIHJlcGVhdGVyLT5PblRlc3RFbmQoKnRoaXMpOworCisgIC8vIFRlbGxzIFVuaXRUZXN0IHRvIHN0b3AgYXNzb2NpYXRpbmcgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhpcworICAvLyB0ZXN0LgorICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7Cit9CisKKy8vIGNsYXNzIFRlc3RDYXNlCisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgoraW50IFRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFBhc3NlZCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCitpbnQgVGVzdENhc2U6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeworICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RGYWlsZWQpOworfQorCitpbnQgVGVzdENhc2U6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdERpc2FibGVkKTsKK30KKworLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgoraW50IFRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBTaG91bGRSdW5UZXN0KTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KK2ludCBUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9pbmZvX2xpc3RfLnNpemUoKSk7Cit9CisKKy8vIENyZWF0ZXMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisvLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCisvLyAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKKy8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQorVGVzdENhc2U6OlRlc3RDYXNlKGNvbnN0IGNoYXIqIGFfbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpCisgICAgOiBuYW1lXyhhX25hbWUpLAorICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKKyAgICAgIHNldF91cF90Y18oc2V0X3VwX3RjKSwKKyAgICAgIHRlYXJfZG93bl90Y18odGVhcl9kb3duX3RjKSwKKyAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKKyAgICAgIGVsYXBzZWRfdGltZV8oMCkgeworfQorCisvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLgorVGVzdENhc2U6On5UZXN0Q2FzZSgpIHsKKyAgLy8gRGVsZXRlcyBldmVyeSBUZXN0IGluIHRoZSBjb2xsZWN0aW9uLgorICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0SW5mbz4pOworfQorCisvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCitjb25zdCBUZXN0SW5mbyogVGVzdENhc2U6OkdldFRlc3RJbmZvKGludCBpKSBjb25zdCB7CisgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7CisgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKK30KKworLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpIHsKKyAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKKyAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOworfQorCisvLyBBZGRzIGEgdGVzdCB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSB0ZXN0IHVwb24KKy8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCit2b2lkIFRlc3RDYXNlOjpBZGRUZXN0SW5mbyhUZXN0SW5mbyAqIHRlc3RfaW5mbykgeworICB0ZXN0X2luZm9fbGlzdF8ucHVzaF9iYWNrKHRlc3RfaW5mbyk7CisgIHRlc3RfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9pbmRpY2VzXy5zaXplKCkpKTsKK30KKworLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuCit2b2lkIFRlc3RDYXNlOjpSdW4oKSB7CisgIGlmICghc2hvdWxkX3J1bl8pIHJldHVybjsKKworICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UodGhpcyk7CisKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyID0gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmxpc3RlbmVycygpLnJlcGVhdGVyKCk7CisKKyAgcmVwZWF0ZXItPk9uVGVzdENhc2VTdGFydCgqdGhpcyk7CisgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7CisgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuU2V0VXBUZXN0Q2FzZSwgIlNldFVwVGVzdENhc2UoKSIpOworCisgIGNvbnN0IGludGVybmFsOjpUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfdGVzdF9jb3VudCgpOyBpKyspIHsKKyAgICBHZXRNdXRhYmxlVGVzdEluZm8oaSktPlJ1bigpOworICB9CisgIGVsYXBzZWRfdGltZV8gPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKKworICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOworICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCisgICAgICB0aGlzLCAmVGVzdENhc2U6OlJ1blRlYXJEb3duVGVzdENhc2UsICJUZWFyRG93blRlc3RDYXNlKCkiKTsKKworICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7CisgIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZShOVUxMKTsKK30KKworLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OkNsZWFyUmVzdWx0KCkgeworICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgVGVzdEluZm86OkNsZWFyVGVzdFJlc3VsdCk7Cit9CisKKy8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KK3ZvaWQgVGVzdENhc2U6OlNodWZmbGVUZXN0cyhpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20pIHsKKyAgU2h1ZmZsZShyYW5kb20sICZ0ZXN0X2luZGljZXNfKTsKK30KKworLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgordm9pZCBUZXN0Q2FzZTo6VW5zaHVmZmxlVGVzdHMoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9pbmRpY2VzXy5zaXplKCk7IGkrKykgeworICAgIHRlc3RfaW5kaWNlc19baV0gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOworICB9Cit9CisKKy8vIEZvcm1hdHMgYSBjb3VudGFibGUgbm91bi4gIERlcGVuZGluZyBvbiBpdHMgcXVhbnRpdHksIGVpdGhlciB0aGUKKy8vIHNpbmd1bGFyIGZvcm0gb3IgdGhlIHBsdXJhbCBmb3JtIGlzIHVzZWQuIGUuZy4KKy8vCisvLyBGb3JtYXRDb3VudGFibGVOb3VuKDEsICJmb3JtdWxhIiwgImZvcm11bGkiKSByZXR1cm5zICIxIGZvcm11bGEiLgorLy8gRm9ybWF0Q291bnRhYmxlTm91big1LCAiYm9vayIsICJib29rcyIpIHJldHVybnMgIjUgYm9va3MiLgorc3RhdGljIGludGVybmFsOjpTdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBzaW5ndWxhcl9mb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogcGx1cmFsX2Zvcm0pIHsKKyAgcmV0dXJuIGludGVybmFsOjpTdHJpbmc6OkZvcm1hdCgiJWQgJXMiLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9PSAxID8gc2luZ3VsYXJfZm9ybSA6IHBsdXJhbF9mb3JtKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdHMuCitzdGF0aWMgaW50ZXJuYWw6OlN0cmluZyBGb3JtYXRUZXN0Q291bnQoaW50IHRlc3RfY291bnQpIHsKKyAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsKK30KKworLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4KK3N0YXRpYyBpbnRlcm5hbDo6U3RyaW5nIEZvcm1hdFRlc3RDYXNlQ291bnQoaW50IHRlc3RfY2FzZV9jb3VudCkgeworICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2VfY291bnQsICJ0ZXN0IGNhc2UiLCAidGVzdCBjYXNlcyIpOworfQorCisvLyBDb252ZXJ0cyBhIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGVudW0gdG8gaHVtYW4tZnJpZW5kbHkgc3RyaW5nCisvLyByZXByZXNlbnRhdGlvbi4gIEJvdGgga05vbkZhdGFsRmFpbHVyZSBhbmQga0ZhdGFsRmFpbHVyZSBhcmUgdHJhbnNsYXRlZAorLy8gdG8gIkZhaWx1cmUiLCBhcyB0aGUgdXNlciB1c3VhbGx5IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZGlmZmVyZW5jZQorLy8gYmV0d2VlbiB0aGUgdHdvIHdoZW4gdmlld2luZyB0aGUgdGVzdCByZXN1bHQuCitzdGF0aWMgY29uc3QgY2hhciAqIFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3M6CisgICAgICByZXR1cm4gIlN1Y2Nlc3MiOworCisgICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZToKKyAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlOgorI2lmZGVmIF9NU0NfVkVSCisgICAgICByZXR1cm4gImVycm9yOiAiOworI2Vsc2UKKyAgICAgIHJldHVybiAiRmFpbHVyZVxuIjsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIlVua25vd24gcmVzdWx0IHR5cGUiOworICB9Cit9CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IHRvIGEgU3RyaW5nLgorc3RhdGljIGludGVybmFsOjpTdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAorICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7CisgIHJldHVybiAoTWVzc2FnZSgpCisgICAgICAgICAgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbih0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpKQorICAgICAgICAgIDw8ICIgIiA8PCBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LnR5cGUoKSkKKyAgICAgICAgICA8PCB0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0Lgorc3RhdGljIHZvaWQgUHJpbnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICBjb25zdCBpbnRlcm5hbDo6U3RyaW5nJiByZXN1bHQgPQorICAgICAgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKHRlc3RfcGFydF9yZXN1bHQpOworICBwcmludGYoIiVzXG4iLCByZXN1bHQuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworICAvLyBJZiB0aGUgdGVzdCBwcm9ncmFtIHJ1bnMgaW4gVmlzdWFsIFN0dWRpbyBvciBhIGRlYnVnZ2VyLCB0aGUKKyAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dAorICAvLyB3aW5kb3cgc3VjaCB0aGF0IHRoZSB1c2VyIGNhbiBkb3VibGUtY2xpY2sgb24gaXQgdG8ganVtcCB0byB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBsb2NhdGlvbjsgb3RoZXJ3aXNlIHRoZXkgZG8gbm90aGluZy4KKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICAvLyBXZSBkb24ndCBjYWxsIE91dHB1dERlYnVnU3RyaW5nKigpIG9uIFdpbmRvd3MgTW9iaWxlLCBhcyBwcmludGluZworICAvLyB0byBzdGRvdXQgaXMgZG9uZSBieSBPdXRwdXREZWJ1Z1N0cmluZygpIHRoZXJlIGFscmVhZHkgLSB3ZSBkb24ndAorICAvLyB3YW50IHRoZSBzYW1lIG1lc3NhZ2UgcHJpbnRlZCB0d2ljZS4KKyAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EocmVzdWx0LmNfc3RyKCkpOworICA6Ok91dHB1dERlYnVnU3RyaW5nQSgiXG4iKTsKKyNlbmRpZgorfQorCisvLyBjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworZW51bSBHVGVzdENvbG9yIHsKKyAgQ09MT1JfREVGQVVMVCwKKyAgQ09MT1JfUkVELAorICBDT0xPUl9HUkVFTiwKKyAgQ09MT1JfWUVMTE9XCit9OworCisjaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yLgorV09SRCBHZXRDb2xvckF0dHJpYnV0ZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgcmV0dXJuIEZPUkVHUk9VTkRfUkVEOworICAgIGNhc2UgQ09MT1JfR1JFRU46ICByZXR1cm4gRk9SRUdST1VORF9HUkVFTjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzogcmV0dXJuIEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9HUkVFTjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworI2Vsc2UKKworLy8gUmV0dXJucyB0aGUgQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gY29sb3IuICBDT0xPUl9ERUZBVUxUIGlzCisvLyBhbiBpbnZhbGlkIGlucHV0LgorY2hhciogR2V0QW5zaUNvbG9yQ29kZShHVGVzdENvbG9yIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDogICAgIHJldHVybiAiMSI7CisgICAgY2FzZSBDT0xPUl9HUkVFTjogICByZXR1cm4gIjIiOworICAgIGNhc2UgQ09MT1JfWUVMTE9XOiAgcmV0dXJuICIzIjsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBOVUxMOworICB9OworICByZXR1cm4gTlVMTDsKK30KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBSZXR1cm5zIHRydWUgaWZmIEdvb2dsZSBUZXN0IHNob3VsZCB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCitib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSkgeworICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9jb2xvciA9IEdURVNUX0ZMQUcoY29sb3IpLmNfc3RyKCk7CisKKyAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgImF1dG8iKSkgeworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgICAvLyBPbiBXaW5kb3dzIHRoZSBURVJNIHZhcmlhYmxlIGlzIHVzdWFsbHkgbm90IHNldCwgYnV0IHRoZQorICAgIC8vIGNvbnNvbGUgdGhlcmUgZG9lcyBzdXBwb3J0IGNvbG9ycy4KKyAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eTsKKyNlbHNlCisgICAgLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBURVJNIHZhcmlhYmxlLgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IHRlcm0gPSBwb3NpeDo6R2V0RW52KCJURVJNIik7CisgICAgY29uc3QgYm9vbCB0ZXJtX3N1cHBvcnRzX2NvbG9yID0KKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybSIpIHx8CisgICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tY29sb3IiKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLTI1NmNvbG9yIikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4iKSB8fAorICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImxpbnV4IikgfHwKKyAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJjeWd3aW4iKTsKKyAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eSAmJiB0ZXJtX3N1cHBvcnRzX2NvbG9yOworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisgIH0KKworICByZXR1cm4gU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAieWVzIikgfHwKKyAgICAgIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInRydWUiKSB8fAorICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidCIpIHx8CisgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICIxIik7CisgIC8vIFdlIHRha2UgInllcyIsICJ0cnVlIiwgInQiLCBhbmQgIjEiIGFzIG1lYW5pbmcgInllcyIuICBJZiB0aGUKKyAgLy8gdmFsdWUgaXMgbmVpdGhlciBvbmUgb2YgdGhlc2Ugbm9yICJhdXRvIiwgd2UgdHJlYXQgaXQgYXMgIm5vIiB0bworICAvLyBiZSBjb25zZXJ2YXRpdmUuCit9CisKKy8vIEhlbHBlcnMgZm9yIHByaW50aW5nIGNvbG9yZWQgc3RyaW5ncyB0byBzdGRvdXQuIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCB3ZQorLy8gY2Fubm90IHNpbXBseSBlbWl0IHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgaGF2ZSB0aGUgdGVybWluYWwgY2hhbmdlIGNvbG9ycy4KKy8vIFRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5IGVtaXQgdGhlIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gcmV0dXJuIGEgc3RyaW5nCisvLyB0aGF0IHdvdWxkIGJlIGNvbG9yZWQgd2hlbiBwcmludGVkLCBhcyBjYW4gYmUgZG9uZSBvbiBMaW51eC4KK3ZvaWQgQ29sb3JlZFByaW50ZihHVGVzdENvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUworICBjb25zdCBib29sIHVzZV9jb2xvciA9IGZhbHNlOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgaW5fY29sb3JfbW9kZSA9CisgICAgICBTaG91bGRVc2VDb2xvcihwb3NpeDo6SXNBVFRZKHBvc2l4OjpGaWxlTm8oc3Rkb3V0KSkgIT0gMCk7CisgIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gaW5fY29sb3JfbW9kZSAmJiAoY29sb3IgIT0gQ09MT1JfREVGQVVMVCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfWk9TCisgIC8vIFRoZSAnIT0gMCcgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkgdG8gc2F0aXNmeSBNU1ZDIDcuMS4KKworICBpZiAoIXVzZV9jb2xvcikgeworICAgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuOworICB9CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQorICBjb25zdCBIQU5ETEUgc3Rkb3V0X2hhbmRsZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisKKyAgLy8gR2V0cyB0aGUgY3VycmVudCB0ZXh0IGNvbG9yLgorICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBidWZmZXJfaW5mbzsKKyAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3Rkb3V0X2hhbmRsZSwgJmJ1ZmZlcl9pbmZvKTsKKyAgY29uc3QgV09SRCBvbGRfY29sb3JfYXR0cnMgPSBidWZmZXJfaW5mby53QXR0cmlidXRlczsKKworICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoCisgIC8vIFNldENvbnNvbGVUZXh0QXR0cmlidXRlIGNhbGwgbGVzdCBpdCBhZmZlY3QgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5CisgIC8vIHByaW50ZWQgYnV0IGhhcyBub3QgeWV0IHJlYWNoZWQgdGhlIGNvbnNvbGUuCisgIGZmbHVzaChzdGRvdXQpOworICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb2xvckF0dHJpYnV0ZShjb2xvcikgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKworICBmZmx1c2goc3Rkb3V0KTsKKyAgLy8gUmVzdG9yZXMgdGhlIHRleHQgY29sb3IuCisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsIG9sZF9jb2xvcl9hdHRycyk7CisjZWxzZQorICBwcmludGYoIlwwMzNbMDszJXNtIiwgR2V0QW5zaUNvbG9yQ29kZShjb2xvcikpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHByaW50ZigiXDAzM1ttIik7ICAvLyBSZXNldHMgdGhlIHRlcm1pbmFsIHRvIGRlZmF1bHQuCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfcGFyYW0gPSB0ZXN0X2luZm8udHlwZV9wYXJhbSgpOworICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9wYXJhbSA9IHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpOworCisgIGlmICh0eXBlX3BhcmFtICE9IE5VTEwgfHwgdmFsdWVfcGFyYW0gIT0gTlVMTCkgeworICAgIHByaW50ZigiLCB3aGVyZSAiKTsKKyAgICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMKSB7CisgICAgICBwcmludGYoIlR5cGVQYXJhbSA9ICVzIiwgdHlwZV9wYXJhbSk7CisgICAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkKKyAgICAgICAgcHJpbnRmKCIgYW5kICIpOworICAgIH0KKyAgICBpZiAodmFsdWVfcGFyYW0gIT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJHZXRQYXJhbSgpID0gJXMiLCB2YWx1ZV9wYXJhbSk7CisgICAgfQorICB9Cit9CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlLgorLy8KKy8vIENsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciBpcyBjb3B5YWJsZS4KK2NsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIoKSB7fQorICBzdGF0aWMgdm9pZCBQcmludFRlc3ROYW1lKGNvbnN0IGNoYXIgKiB0ZXN0X2Nhc2UsIGNvbnN0IGNoYXIgKiB0ZXN0KSB7CisgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZSwgdGVzdCk7CisgIH0KKworICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgb3ZlcnJpZGUgd2hhdCdzIGluIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOworICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIFByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisKKyAgaW50ZXJuYWw6OlN0cmluZyB0ZXN0X2Nhc2VfbmFtZV87Cit9OworCisgIC8vIEZpcmVkIGJlZm9yZSBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoCisgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbikgeworICBpZiAoR1RFU1RfRkxBRyhyZXBlYXQpICE9IDEpCisgICAgcHJpbnRmKCJcblJlcGVhdGluZyBhbGwgdGVzdHMgKGl0ZXJhdGlvbiAlZCkgLiAuIC5cblxuIiwgaXRlcmF0aW9uICsgMSk7CisKKyAgY29uc3QgY2hhciogY29uc3QgZmlsdGVyID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7CisKKyAgLy8gUHJpbnRzIHRoZSBmaWx0ZXIgaWYgaXQncyBub3QgKi4gIFRoaXMgcmVtaW5kcyB0aGUgdXNlciB0aGF0IHNvbWUKKyAgLy8gdGVzdHMgbWF5IGJlIHNraXBwZWQuCisgIGlmICghaW50ZXJuYWw6OlN0cmluZzo6Q1N0cmluZ0VxdWFscyhmaWx0ZXIsIGtVbml2ZXJzYWxGaWx0ZXIpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogJXMgZmlsdGVyID0gJXNcbiIsIEdURVNUX05BTUVfLCBmaWx0ZXIpOworICB9CisKKyAgaWYgKGludGVybmFsOjpTaG91bGRTaGFyZChrVGVzdFRvdGFsU2hhcmRzLCBrVGVzdFNoYXJkSW5kZXgsIGZhbHNlKSkgeworICAgIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoa1Rlc3RTaGFyZEluZGV4LCAtMSk7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogVGhpcyBpcyB0ZXN0IHNoYXJkICVkIG9mICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2hhcmRfaW5kZXgpICsgMSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6R2V0RW52KGtUZXN0VG90YWxTaGFyZHMpKTsKKyAgfQorCisgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCisgICAgICAgICAgICAgICAgICAiTm90ZTogUmFuZG9taXppbmcgdGVzdHMnIG9yZGVycyB3aXRoIGEgc2VlZCBvZiAlZCAuXG4iLAorICAgICAgICAgICAgICAgICAgdW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpOworICB9CisKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbPT09PT09PT09PV0gIik7CisgIHByaW50ZigiUnVubmluZyAlcyBmcm9tICVzLlxuIiwKKyAgICAgICAgIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3QudGVzdF90b19ydW5fY291bnQoKSkuY19zdHIoKSwKKyAgICAgICAgIEZvcm1hdFRlc3RDYXNlQ291bnQodW5pdF90ZXN0LnRlc3RfY2FzZV90b19ydW5fY291bnQoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHNldC11cC5cbiIpOworICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIHRlc3RfY2FzZV9uYW1lXyA9IHRlc3RfY2FzZS5uYW1lKCk7CisgIGNvbnN0IGludGVybmFsOjpTdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKSk7CisgIGlmICh0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpID09IE5VTEwpIHsKKyAgICBwcmludGYoIlxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCIsIHdoZXJlIFR5cGVQYXJhbSA9ICVzXG4iLCB0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpKTsKKyAgfQorICBmZmx1c2goc3Rkb3V0KTsKK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbIFJVTiAgICAgIF0gIik7CisgIFByaW50VGVzdE5hbWUodGVzdF9jYXNlX25hbWVfLmNfc3RyKCksIHRlc3RfaW5mby5uYW1lKCkpOworICBwcmludGYoIlxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBDYWxsZWQgYWZ0ZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0UGFydFJlc3VsdCgKKyAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIC8vIElmIHRoZSB0ZXN0IHBhcnQgc3VjY2VlZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorICBpZiAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpCisgICAgcmV0dXJuOworCisgIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBhc3NlcnRpb24gKGUuZy4gZXhwZWN0ZWQgdGhpcyBhbmQgZ290IHRoYXQpLgorICBQcmludFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+UGFzc2VkKCkpIHsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWyAgICAgICBPSyBdICIpOworICB9IGVsc2UgeworICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOworICB9CisgIFByaW50VGVzdE5hbWUodGVzdF9jYXNlX25hbWVfLmNfc3RyKCksIHRlc3RfaW5mby5uYW1lKCkpOworICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5GYWlsZWQoKSkKKyAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOworCisgIGlmIChHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7CisgICAgcHJpbnRmKCIgKCVzIG1zKVxuIiwgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZygKKyAgICAgICAgICAgdGVzdF9pbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgIGlmICghR1RFU1RfRkxBRyhwcmludF90aW1lKSkgcmV0dXJuOworCisgIHRlc3RfY2FzZV9uYW1lXyA9IHRlc3RfY2FzZS5uYW1lKCk7CisgIGNvbnN0IGludGVybmFsOjpTdHJpbmcgY291bnRzID0KKyAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7CisgIHByaW50ZigiJXMgZnJvbSAlcyAoJXMgbXMgdG90YWwpXG5cbiIsCisgICAgICAgICBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlX25hbWVfLmNfc3RyKCksCisgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGZmbHVzaChzdGRvdXQpOworfQorCit2b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KAorICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7CisgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOworICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93blxuIik7CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIHByaW50aW5nIHRoZSBsaXN0IG9mIGZhaWxlZCB0ZXN0cy4KK3ZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKKyAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmIChmYWlsZWRfdGVzdF9jb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOworICAgIGlmICghdGVzdF9jYXNlLnNob3VsZF9ydW4oKSB8fCAodGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCkgPT0gMCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraikgeworICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7CisgICAgICBpZiAoIXRlc3RfaW5mby5zaG91bGRfcnVuKCkgfHwgdGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOworICAgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZS5uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOworICAgICAgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQodGVzdF9pbmZvKTsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgeworICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKKyAgcHJpbnRmKCIlcyBmcm9tICVzIHJhbi4iLAorICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAorICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKKyAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKKyAgICBwcmludGYoIiAoJXMgbXMgdG90YWwpIiwKKyAgICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOworICB9CisgIHByaW50ZigiXG4iKTsKKyAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbICBQQVNTRUQgIF0gIik7CisgIHByaW50ZigiJXMuXG4iLCBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKS5jX3N0cigpKTsKKworICBpbnQgbnVtX2ZhaWx1cmVzID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgIGlmICghdW5pdF90ZXN0LlBhc3NlZCgpKSB7CisgICAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7CisgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICAiWyAgRkFJTEVEICBdICIpOworICAgIHByaW50ZigiJXMsIGxpc3RlZCBiZWxvdzpcbiIsIEZvcm1hdFRlc3RDb3VudChmYWlsZWRfdGVzdF9jb3VudCkuY19zdHIoKSk7CisgICAgUHJpbnRGYWlsZWRUZXN0cyh1bml0X3Rlc3QpOworICAgIHByaW50ZigiXG4lMmQgRkFJTEVEICVzXG4iLCBudW1fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fZmFpbHVyZXMgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpOworICB9CisKKyAgaW50IG51bV9kaXNhYmxlZCA9IHVuaXRfdGVzdC5kaXNhYmxlZF90ZXN0X2NvdW50KCk7CisgIGlmIChudW1fZGlzYWJsZWQgJiYgIUdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB7CisgICAgaWYgKCFudW1fZmFpbHVyZXMpIHsKKyAgICAgIHByaW50ZigiXG4iKTsgIC8vIEFkZCBhIHNwYWNlciBpZiBubyBGQUlMVVJFIGJhbm5lciBpcyBkaXNwbGF5ZWQuCisgICAgfQorICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAorICAgICAgICAgICAgICAgICAgIiAgWU9VIEhBVkUgJWQgRElTQUJMRUQgJXNcblxuIiwKKyAgICAgICAgICAgICAgICAgIG51bV9kaXNhYmxlZCwKKyAgICAgICAgICAgICAgICAgIG51bV9kaXNhYmxlZCA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7CisgIH0KKyAgLy8gRW5zdXJlIHRoYXQgR29vZ2xlIFRlc3Qgb3V0cHV0IGlzIHByaW50ZWQgYmVmb3JlLCBlLmcuLCBoZWFwY2hlY2tlciBvdXRwdXQuCisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBFbmQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyCisKKy8vIGNsYXNzIFRlc3RFdmVudFJlcGVhdGVyCisvLworLy8gVGhpcyBjbGFzcyBmb3J3YXJkcyBldmVudHMgdG8gb3RoZXIgZXZlbnQgbGlzdGVuZXJzLgorY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgeworIHB1YmxpYzoKKyAgVGVzdEV2ZW50UmVwZWF0ZXIoKSA6IGZvcndhcmRpbmdfZW5hYmxlZF8odHJ1ZSkge30KKyAgdmlydHVhbCB+VGVzdEV2ZW50UmVwZWF0ZXIoKTsKKyAgdm9pZCBBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKTsKKyAgVGVzdEV2ZW50TGlzdGVuZXIqIFJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCB0byBsaXN0ZW5lcnNfLiBTZXQgdG8gZmFsc2UKKyAgLy8gaW4gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzZXMuCisgIGJvb2wgZm9yd2FyZGluZ19lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZm9yd2FyZGluZ19lbmFibGVkXzsgfQorICB2b2lkIHNldF9mb3J3YXJkaW5nX2VuYWJsZWQoYm9vbCBlbmFibGUpIHsgZm9yd2FyZGluZ19lbmFibGVkXyA9IGVuYWJsZTsgfQorCisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7CisKKyBwcml2YXRlOgorICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCB0byBsaXN0ZW5lcnNfLiBTZXQgdG8gZmFsc2UKKyAgLy8gaW4gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzZXMuCisgIGJvb2wgZm9yd2FyZGluZ19lbmFibGVkXzsKKyAgLy8gVGhlIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgcmVjZWl2ZSBldmVudHMuCisgIHN0ZDo6dmVjdG9yPFRlc3RFdmVudExpc3RlbmVyKj4gbGlzdGVuZXJzXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudFJlcGVhdGVyKTsKK307CisKK1Rlc3RFdmVudFJlcGVhdGVyOjp+VGVzdEV2ZW50UmVwZWF0ZXIoKSB7CisgIEZvckVhY2gobGlzdGVuZXJzXywgRGVsZXRlPFRlc3RFdmVudExpc3RlbmVyPik7Cit9CisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpIHsKKyAgbGlzdGVuZXJzXy5wdXNoX2JhY2sobGlzdGVuZXIpOworfQorCisvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBGYWN0b3IgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGludG8gVmVjdG9yOjpGaW5kLgorVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudFJlcGVhdGVyOjpSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobGlzdGVuZXJzX1tpXSA9PSBsaXN0ZW5lcikgeworICAgICAgbGlzdGVuZXJzXy5lcmFzZShsaXN0ZW5lcnNfLmJlZ2luKCkgKyBpKTsKKyAgICAgIHJldHVybiBsaXN0ZW5lcjsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLy8gU2luY2UgbW9zdCBtZXRob2RzIGFyZSB2ZXJ5IHNpbWlsYXIsIHVzZSBtYWNyb3MgdG8gcmVkdWNlIGJvaWxlcnBsYXRlLgorLy8gVGhpcyBkZWZpbmVzIGEgbWVtYmVyIHRoYXQgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYWxsIGxpc3RlbmVycy4KKyNkZWZpbmUgR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcCit2b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpOYW1lKGNvbnN0IFR5cGUmIHBhcmFtZXRlcikgeyBcCisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7IFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsgXAorICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCisgICAgfSBcCisgIH0gXAorfQorLy8gVGhpcyBkZWZpbmVzIGEgbWVtYmVyIHRoYXQgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYWxsIGxpc3RlbmVycyBpbiByZXZlcnNlCisvLyBvcmRlci4KKyNkZWZpbmUgR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAorICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7IFwKKyAgICAgIGxpc3RlbmVyc19baV0tPk5hbWUocGFyYW1ldGVyKTsgXAorICAgIH0gXAorICB9IFwKK30KKworR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1NldFVwU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlU3RhcnQsIFRlc3RDYXNlKQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RTdGFydCwgVGVzdEluZm8pCitHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFBhcnRSZXN1bHQsIFRlc3RQYXJ0UmVzdWx0KQorR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBFbmQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQsIFVuaXRUZXN0KQorR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdEVuZCwgVGVzdEluZm8pCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0Q2FzZUVuZCwgVGVzdENhc2UpCitHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UHJvZ3JhbUVuZCwgVW5pdFRlc3QpCisKKyN1bmRlZiBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfCisjdW5kZWYgR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfCisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7CisgIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgaSsrKSB7CisgICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25TdGFydCh1bml0X3Rlc3QsIGl0ZXJhdGlvbik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKKyAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKKyAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihsaXN0ZW5lcnNfLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgbGlzdGVuZXJzX1tpXS0+T25UZXN0SXRlcmF0aW9uRW5kKHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKworLy8gRW5kIFRlc3RFdmVudFJlcGVhdGVyCisKKy8vIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIGFuIFhNTCBvdXRwdXQgZmlsZS4KK2NsYXNzIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSk7CisKKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsKKworIHByaXZhdGU6CisgIC8vIElzIGMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciB0aGF0IGlzIG5vcm1hbGl6ZWQgdG8gYSBzcGFjZSBjaGFyYWN0ZXIKKyAgLy8gd2hlbiBpdCBhcHBlYXJzIGluIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWU/CisgIHN0YXRpYyBib29sIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAweDkgfHwgYyA9PSAweEEgfHwgYyA9PSAweEQ7CisgIH0KKworICAvLyBNYXkgYyBhcHBlYXIgaW4gYSB3ZWxsLWZvcm1lZCBYTUwgZG9jdW1lbnQ/CisgIHN0YXRpYyBib29sIElzVmFsaWRYbWxDaGFyYWN0ZXIoY2hhciBjKSB7CisgICAgcmV0dXJuIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjKSB8fCBjID49IDB4MjA7CisgIH0KKworICAvLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZgorICAvLyBpc19hdHRyaWJ1dGUgaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZQorICAvLyB2YWx1ZSwgYW5kIG5vcm1hbGl6YWJsZSB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBieSByZXBsYWNpbmcgaXQKKyAgLy8gd2l0aCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKyAgc3RhdGljIFN0cmluZyBFc2NhcGVYbWwoY29uc3QgY2hhciogc3RyLCBib29sIGlzX2F0dHJpYnV0ZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMgaW52YWxpZCBpbiBYTUwgcmVtb3ZlZC4KKyAgc3RhdGljIHN0cmluZyBSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhjb25zdCBzdHJpbmcmIHN0cik7CisKKyAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgc3RhdGljIFN0cmluZyBFc2NhcGVYbWxBdHRyaWJ1dGUoY29uc3QgY2hhciogc3RyKSB7CisgICAgcmV0dXJuIEVzY2FwZVhtbChzdHIsIHRydWUpOworICB9CisKKyAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIG5vdCBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgIHN0YXRpYyBTdHJpbmcgRXNjYXBlWG1sVGV4dChjb25zdCBjaGFyKiBzdHIpIHsgcmV0dXJuIEVzY2FwZVhtbChzdHIsIGZhbHNlKTsgfQorCisgIC8vIFN0cmVhbXMgYW4gWE1MIENEQVRBIHNlY3Rpb24sIGVzY2FwaW5nIGludmFsaWQgQ0RBVEEgc2VxdWVuY2VzIGFzIG5lZWRlZC4KKyAgc3RhdGljIHZvaWQgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGRhdGEpOworCisgIC8vIFN0cmVhbXMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgorICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7CisKKyAgLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAorICBzdGF0aWMgdm9pZCBQcmludFhtbFRlc3RDYXNlKEZJTEUqIG91dCwgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7CisKKyAgLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KKyAgc3RhdGljIHZvaWQgUHJpbnRYbWxVbml0VGVzdChGSUxFKiBvdXQsIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOworCisgIC8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCisgIC8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCisgIC8vIFdoZW4gdGhlIFN0cmluZyBpcyBub3QgZW1wdHksIGl0IGluY2x1ZGVzIGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZywKKyAgLy8gdG8gZGVsaW1pdCB0aGlzIGF0dHJpYnV0ZSBmcm9tIHByaW9yIGF0dHJpYnV0ZXMuCisgIHN0YXRpYyBTdHJpbmcgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMoY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0KTsKKworICAvLyBUaGUgb3V0cHV0IGZpbGUuCisgIGNvbnN0IFN0cmluZyBvdXRwdXRfZmlsZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIpOworfTsKKworLy8gQ3JlYXRlcyBhIG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIuCitYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSkKKyAgICA6IG91dHB1dF9maWxlXyhvdXRwdXRfZmlsZSkgeworICBpZiAob3V0cHV0X2ZpbGVfLmNfc3RyKCkgPT0gTlVMTCB8fCBvdXRwdXRfZmlsZV8uZW1wdHkoKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiWE1MIG91dHB1dCBmaWxlIG1heSBub3QgYmUgbnVsbFxuIik7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9Cit9CisKKy8vIENhbGxlZCBhZnRlciB0aGUgdW5pdCB0ZXN0IGVuZHMuCit2b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7CisgIEZJTEUqIHhtbG91dCA9IE5VTEw7CisgIEZpbGVQYXRoIG91dHB1dF9maWxlKG91dHB1dF9maWxlXyk7CisgIEZpbGVQYXRoIG91dHB1dF9kaXIob3V0cHV0X2ZpbGUuUmVtb3ZlRmlsZU5hbWUoKSk7CisKKyAgaWYgKG91dHB1dF9kaXIuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKSB7CisgICAgeG1sb3V0ID0gcG9zaXg6OkZPcGVuKG91dHB1dF9maWxlXy5jX3N0cigpLCAidyIpOworICB9CisgIGlmICh4bWxvdXQgPT0gTlVMTCkgeworICAgIC8vIFRPRE8od2FuKTogcmVwb3J0IHRoZSByZWFzb24gb2YgdGhlIGZhaWx1cmUuCisgICAgLy8KKyAgICAvLyBXZSBkb24ndCBkbyBpdCBmb3Igbm93IGFzOgorICAgIC8vCisgICAgLy8gICAxLiBUaGVyZSBpcyBubyB1cmdlbnQgbmVlZCBmb3IgaXQuCisgICAgLy8gICAyLiBJdCdzIGEgYml0IGludm9sdmVkIHRvIG1ha2UgdGhlIGVycm5vIHZhcmlhYmxlIHRocmVhZC1zYWZlIG9uCisgICAgLy8gICAgICBhbGwgdGhyZWUgb3BlcmF0aW5nIHN5c3RlbXMgKExpbnV4LCBXaW5kb3dzLCBhbmQgTWFjIE9TKS4KKyAgICAvLyAgIDMuIFRvIGludGVycHJldCB0aGUgbWVhbmluZyBvZiBlcnJubyBpbiBhIHRocmVhZC1zYWZlIHdheSwKKyAgICAvLyAgICAgIHdlIG5lZWQgdGhlIHN0cmVycm9yX3IoKSBmdW5jdGlvbiwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbgorICAgIC8vICAgICAgV2luZG93cy4KKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwKKyAgICAgICAgICAgIG91dHB1dF9maWxlXy5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgUHJpbnRYbWxVbml0VGVzdCh4bWxvdXQsIHVuaXRfdGVzdCk7CisgIGZjbG9zZSh4bWxvdXQpOworfQorCisvLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZiBpc19hdHRyaWJ1dGUKKy8vIGlzIHRydWUsIHRoZSB0ZXh0IGlzIG1lYW50IHRvIGFwcGVhciBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUsIGFuZAorLy8gbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdCB3aXRoIGNoYXJhY3RlcgorLy8gcmVmZXJlbmNlcy4KKy8vCisvLyBJbnZhbGlkIFhNTCBjaGFyYWN0ZXJzIGluIHN0ciwgaWYgYW55LCBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0LgorLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aGUgdGV4dCBwcm9jZXNzZWQgYnkgdGhpcworLy8gbW9kdWxlIHdpbGwgY29uc2lzdCBvZiBvcmRpbmFyeSBFbmdsaXNoIHRleHQuCisvLyBJZiB0aGlzIG1vZHVsZSBpcyBldmVyIG1vZGlmaWVkIHRvIHByb2R1Y2UgdmVyc2lvbiAxLjEgWE1MIG91dHB1dCwKKy8vIG1vc3QgaW52YWxpZCBjaGFyYWN0ZXJzIGNhbiBiZSByZXRhaW5lZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KKy8vIFRPRE8od2FuKTogSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgbWluaW1hbGx5IGludmFzaXZlLCBodW1hbi1yZWFkYWJsZQorLy8gZXNjYXBpbmcgc2NoZW1lIGZvciBpbnZhbGlkIGNoYXJhY3RlcnMsIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZW0uCitTdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpFc2NhcGVYbWwoY29uc3QgY2hhciogc3RyLCBib29sIGlzX2F0dHJpYnV0ZSkgeworICBNZXNzYWdlIG07CisKKyAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgZm9yIChjb25zdCBjaGFyKiBzcmMgPSBzdHI7ICpzcmM7ICsrc3JjKSB7CisgICAgICBzd2l0Y2ggKCpzcmMpIHsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgbSA8PCAiJmx0OyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgIG0gPDwgIiZndDsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICBtIDw8ICImYW1wOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQorICAgICAgICAgICAgbSA8PCAiJmFwb3M7IjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtIDw8ICdcJyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCisgICAgICAgICAgICBtIDw8ICImcXVvdDsiOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG0gPDwgJyInOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKCpzcmMpKSB7CisgICAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlICYmIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZSgqc3JjKSkKKyAgICAgICAgICAgICAgbSA8PCBTdHJpbmc6OkZvcm1hdCgiJiN4JTAyWDsiLCB1bnNpZ25lZCgqc3JjKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG0gPDwgKnNyYzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG0uR2V0U3RyaW5nKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuCisvLyBDdXJyZW50bHkgaW52YWxpZCBjaGFyYWN0ZXJzIGFyZSBkcm9wcGVkIGZyb20gdGhlIHN0cmluZy4gQW4KKy8vIGFsdGVybmF0aXZlIGlzIHRvIHJlcGxhY2UgdGhlbSB3aXRoIGNlcnRhaW4gY2hhcmFjdGVycyBzdWNoIGFzIC4gb3IgPy4KK3N0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHN0cmluZyBvdXRwdXQ7CisgIG91dHB1dC5yZXNlcnZlKHN0ci5zaXplKCkpOworICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHIuYmVnaW4oKTsgaXQgIT0gc3RyLmVuZCgpOyArK2l0KQorICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKCppdCkpCisgICAgICBvdXRwdXQucHVzaF9iYWNrKCppdCk7CisKKyAgcmV0dXJuIG91dHB1dDsKK30KKworLy8gVGhlIGZvbGxvd2luZyByb3V0aW5lcyBnZW5lcmF0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBVbml0VGVzdAorLy8gb2JqZWN0LgorLy8KKy8vIFRoaXMgaXMgaG93IEdvb2dsZSBUZXN0IGNvbmNlcHRzIG1hcCB0byB0aGUgRFREOgorLy8KKy8vIDx0ZXN0c3VpdGVzIG5hbWU9IkFsbFRlc3RzIj4gICAgICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFVuaXRUZXN0IG9iamVjdAorLy8gICA8dGVzdHN1aXRlIG5hbWU9InRlc3RjYXNlLW5hbWUiPiAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdENhc2Ugb2JqZWN0CisvLyAgICAgPHRlc3RjYXNlIG5hbWU9InRlc3QtbmFtZSI+ICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBUZXN0SW5mbyBvYmplY3QKKy8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgorLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+CisvLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLSBpbmRpdmlkdWFsIGFzc2VydGlvbiBmYWlsdXJlcworLy8gICAgIDwvdGVzdGNhc2U+CisvLyAgIDwvdGVzdHN1aXRlPgorLy8gPC90ZXN0c3VpdGVzPgorCisvLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgorc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcykgeworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBtcy8xMDAwLjA7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhKSB7CisgIGNvbnN0IGNoYXIqIHNlZ21lbnQgPSBkYXRhOworICAqc3RyZWFtIDw8ICI8IVtDREFUQVsiOworICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciogY29uc3QgbmV4dF9zZWdtZW50ID0gc3Ryc3RyKHNlZ21lbnQsICJdXT4iKTsKKyAgICBpZiAobmV4dF9zZWdtZW50ICE9IE5VTEwpIHsKKyAgICAgIHN0cmVhbS0+d3JpdGUoCisgICAgICAgICAgc2VnbWVudCwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihuZXh0X3NlZ21lbnQgLSBzZWdtZW50KSk7CisgICAgICAqc3RyZWFtIDw8ICJdXT5dXSZndDs8IVtDREFUQVsiOworICAgICAgc2VnbWVudCA9IG5leHRfc2VnbWVudCArIHN0cmxlbigiXV0+Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICpzdHJlYW0gPDwgc2VnbWVudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAqc3RyZWFtIDw8ICJdXT4iOworfQorCisvLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgorLy8gVE9ETyh3YW4pOiBUaGVyZSBpcyBhbHNvIHZhbHVlIGluIHByaW50aW5nIHByb3BlcnRpZXMgd2l0aCB0aGUgcGxhaW4gcHJpbnRlci4KK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKKyAgY29uc3QgVGVzdFJlc3VsdCYgcmVzdWx0ID0gKnRlc3RfaW5mby5yZXN1bHQoKTsKKyAgKnN0cmVhbSA8PCAiICAgIDx0ZXN0Y2FzZSBuYW1lPVwiIgorICAgICAgICAgIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2luZm8ubmFtZSgpKS5jX3N0cigpIDw8ICJcIiI7CisKKyAgaWYgKHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsKKyAgICAqc3RyZWFtIDw8ICIgdmFsdWVfcGFyYW09XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2luZm8udmFsdWVfcGFyYW0oKSkKKyAgICAgICAgICAgIDw8ICJcIiI7CisgIH0KKyAgaWYgKHRlc3RfaW5mby50eXBlX3BhcmFtKCkgIT0gTlVMTCkgeworICAgICpzdHJlYW0gPDwgIiB0eXBlX3BhcmFtPVwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUodGVzdF9pbmZvLnR5cGVfcGFyYW0oKSkKKyAgICAgICAgICAgIDw8ICJcIiI7CisgIH0KKworICAqc3RyZWFtIDw8ICIgc3RhdHVzPVwiIgorICAgICAgICAgIDw8ICh0ZXN0X2luZm8uc2hvdWxkX3J1bigpID8gInJ1biIgOiAibm90cnVuIikKKyAgICAgICAgICA8PCAiXCIgdGltZT1cIiIKKyAgICAgICAgICA8PCBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMocmVzdWx0LmVsYXBzZWRfdGltZSgpKQorICAgICAgICAgIDw8ICJcIiBjbGFzc25hbWU9XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh0ZXN0X2Nhc2VfbmFtZSkuY19zdHIoKQorICAgICAgICAgIDw8ICJcIiIgPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMocmVzdWx0KS5jX3N0cigpOworCisgIGludCBmYWlsdXJlcyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHBhcnQgPSByZXN1bHQuR2V0VGVzdFBhcnRSZXN1bHQoaSk7CisgICAgaWYgKHBhcnQuZmFpbGVkKCkpIHsKKyAgICAgIGlmICgrK2ZhaWx1cmVzID09IDEpCisgICAgICAgICpzdHJlYW0gPDwgIj5cbiI7CisgICAgICAqc3RyZWFtIDw8ICIgICAgICA8ZmFpbHVyZSBtZXNzYWdlPVwiIgorICAgICAgICAgICAgICA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUocGFydC5zdW1tYXJ5KCkpLmNfc3RyKCkKKyAgICAgICAgICAgICAgPDwgIlwiIHR5cGU9XCJcIj4iOworICAgICAgY29uc3Qgc3RyaW5nIGxvY2F0aW9uID0gaW50ZXJuYWw6OkZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oCisgICAgICAgICAgcGFydC5maWxlX25hbWUoKSwgcGFydC5saW5lX251bWJlcigpKTsKKyAgICAgIGNvbnN0IHN0cmluZyBtZXNzYWdlID0gbG9jYXRpb24gKyAiXG4iICsgcGFydC5tZXNzYWdlKCk7CisgICAgICBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKG1lc3NhZ2UpLmNfc3RyKCkpOworICAgICAgKnN0cmVhbSA8PCAiPC9mYWlsdXJlPlxuIjsKKyAgICB9CisgIH0KKworICBpZiAoZmFpbHVyZXMgPT0gMCkKKyAgICAqc3RyZWFtIDw8ICIgLz5cbiI7CisgIGVsc2UKKyAgICAqc3RyZWFtIDw8ICIgICAgPC90ZXN0Y2FzZT5cbiI7Cit9CisKKy8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QKK3ZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFRlc3RDYXNlKEZJTEUqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgZnByaW50ZihvdXQsCisgICAgICAgICAgIiAgPHRlc3RzdWl0ZSBuYW1lPVwiJXNcIiB0ZXN0cz1cIiVkXCIgZmFpbHVyZXM9XCIlZFwiICIKKyAgICAgICAgICAiZGlzYWJsZWQ9XCIlZFwiICIsCisgICAgICAgICAgRXNjYXBlWG1sQXR0cmlidXRlKHRlc3RfY2FzZS5uYW1lKCkpLmNfc3RyKCksCisgICAgICAgICAgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICB0ZXN0X2Nhc2UuZGlzYWJsZWRfdGVzdF9jb3VudCgpKTsKKyAgZnByaW50ZihvdXQsCisgICAgICAgICAgImVycm9ycz1cIjBcIiB0aW1lPVwiJXNcIj5cbiIsCisgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytpKSB7CisgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgT3V0cHV0WG1sVGVzdEluZm8oJnN0cmVhbSwgdGVzdF9jYXNlLm5hbWUoKSwgKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhpKSk7CisgICAgZnByaW50ZihvdXQsICIlcyIsIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pLmNfc3RyKCkpOworICB9CisgIGZwcmludGYob3V0LCAiICA8L3Rlc3RzdWl0ZT5cbiIpOworfQorCisvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0Lgordm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVW5pdFRlc3QoRklMRSogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICBmcHJpbnRmKG91dCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIik7CisgIGZwcmludGYob3V0LAorICAgICAgICAgICI8dGVzdHN1aXRlcyB0ZXN0cz1cIiVkXCIgZmFpbHVyZXM9XCIlZFwiIGRpc2FibGVkPVwiJWRcIiAiCisgICAgICAgICAgImVycm9ycz1cIjBcIiB0aW1lPVwiJXNcIiAiLAorICAgICAgICAgIHVuaXRfdGVzdC50b3RhbF90ZXN0X2NvdW50KCksCisgICAgICAgICAgdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCksCisgICAgICAgICAgdW5pdF90ZXN0LmRpc2FibGVkX3Rlc3RfY291bnQoKSwKKyAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKKyAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKKyAgICBmcHJpbnRmKG91dCwgInJhbmRvbV9zZWVkPVwiJWRcIiAiLCB1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSk7CisgIH0KKyAgZnByaW50ZihvdXQsICJuYW1lPVwiQWxsVGVzdHNcIj5cbiIpOworICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKQorICAgIFByaW50WG1sVGVzdENhc2Uob3V0LCAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpKTsKKyAgZnByaW50ZihvdXQsICI8L3Rlc3RzdWl0ZXM+XG4iKTsKK30KKworLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKKy8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCitTdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcygKKyAgICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpIHsKKyAgTWVzc2FnZSBhdHRyaWJ1dGVzOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkgPSByZXN1bHQuR2V0VGVzdFByb3BlcnR5KGkpOworICAgIGF0dHJpYnV0ZXMgPDwgIiAiIDw8IHByb3BlcnR5LmtleSgpIDw8ICI9IgorICAgICAgICA8PCAiXCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZShwcm9wZXJ0eS52YWx1ZSgpKSA8PCAiXCIiOworICB9CisgIHJldHVybiBhdHRyaWJ1dGVzLkdldFN0cmluZygpOworfQorCisvLyBFbmQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyCisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKKy8vIFN0cmVhbXMgdGVzdCByZXN1bHRzIHRvIHRoZSBnaXZlbiBwb3J0IG9uIHRoZSBnaXZlbiBob3N0IG1hY2hpbmUuCitjbGFzcyBTdHJlYW1pbmdMaXN0ZW5lciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIC8vIEVzY2FwZXMgJz0nLCAnJicsICclJywgYW5kICdcbicgY2hhcmFjdGVycyBpbiBzdHIgYXMgIiV4eCIuCisgIHN0YXRpYyBzdHJpbmcgVXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cik7CisKKyAgU3RyZWFtaW5nTGlzdGVuZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpCisgICAgICA6IHNvY2tmZF8oLTEpLCBob3N0X25hbWVfKGhvc3QpLCBwb3J0X251bV8ocG9ydCkgeworICAgIE1ha2VDb25uZWN0aW9uKCk7CisgICAgU2VuZCgiZ3Rlc3Rfc3RyZWFtaW5nX3Byb3RvY29sX3ZlcnNpb249MS4wXG4iKTsKKyAgfQorCisgIHZpcnR1YWwgflN0cmVhbWluZ0xpc3RlbmVyKCkgeworICAgIGlmIChzb2NrZmRfICE9IC0xKQorICAgICAgQ2xvc2VDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovKSB7CisgICAgU2VuZCgiZXZlbnQ9VGVzdFByb2dyYW1TdGFydFxuIik7CisgIH0KKworICB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgeworICAgIC8vIE5vdGUgdGhhdCBHb29nbGUgVGVzdCBjdXJyZW50IG9ubHkgcmVwb3J0IGVsYXBzZWQgdGltZSBmb3IgZWFjaAorICAgIC8vIHRlc3QgaXRlcmF0aW9uLCBub3QgZm9yIHRoZSBlbnRpcmUgdGVzdCBwcm9ncmFtLgorICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RQcm9ncmFtRW5kJnBhc3NlZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdGVzdC5QYXNzZWQoKSkpOworCisgICAgLy8gTm90aWZ5IHRoZSBzdHJlYW1pbmcgc2VydmVyIHRvIHN0b3AuCisgICAgQ2xvc2VDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8sIGludCBpdGVyYXRpb24pIHsKKyAgICBTZW5kKFN0cmluZzo6Rm9ybWF0KCJldmVudD1UZXN0SXRlcmF0aW9uU3RhcnQmaXRlcmF0aW9uPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uKSk7CisgIH0KKworICB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgLyogaXRlcmF0aW9uICovKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdEl0ZXJhdGlvbkVuZCZwYXNzZWQ9JWQmZWxhcHNlZF90aW1lPSVzbXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0X3Rlc3QuUGFzc2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKSk7CisgIH0KKworICB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdENhc2VTdGFydCZuYW1lPSVzXG4iLCB0ZXN0X2Nhc2UubmFtZSgpKSk7CisgIH0KKworICB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgeworICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RDYXNlRW5kJnBhc3NlZD0lZCZlbGFwc2VkX3RpbWU9JXNtc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2FzZS5QYXNzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgeworICAgIFNlbmQoU3RyaW5nOjpGb3JtYXQoImV2ZW50PVRlc3RTdGFydCZuYW1lPSVzXG4iLCB0ZXN0X2luZm8ubmFtZSgpKSk7CisgIH0KKworICB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgImV2ZW50PVRlc3RFbmQmcGFzc2VkPSVkJmVsYXBzZWRfdGltZT0lc21zXG4iLAorICAgICAgICAodGVzdF9pbmZvLnJlc3VsdCgpKS0+UGFzc2VkKCksCisgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZygodGVzdF9pbmZvLnJlc3VsdCgpKS0+ZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpKTsKKyAgfQorCisgIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgeworICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSA9IHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCk7CisgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKQorICAgICAgZmlsZV9uYW1lID0gIiI7CisgICAgU2VuZChTdHJpbmc6OkZvcm1hdCgiZXZlbnQ9VGVzdFBhcnRSZXN1bHQmZmlsZT0lcyZsaW5lPSVkJm1lc3NhZ2U9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVybEVuY29kZShmaWxlX25hbWUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpKTsKKyAgICBTZW5kKFVybEVuY29kZSh0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkgKyAiXG4iKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gQ3JlYXRlcyBhIGNsaWVudCBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIuCisgIHZvaWQgTWFrZUNvbm5lY3Rpb24oKTsKKworICAvLyBDbG9zZXMgdGhlIHNvY2tldC4KKyAgdm9pZCBDbG9zZUNvbm5lY3Rpb24oKSB7CisgICAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gIT0gLTEpCisgICAgICAgIDw8ICJDbG9zZUNvbm5lY3Rpb24oKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKKworICAgIGNsb3NlKHNvY2tmZF8pOworICAgIHNvY2tmZF8gPSAtMTsKKyAgfQorCisgIC8vIFNlbmRzIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCisgIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkKKyAgICAgICAgPDwgIlNlbmQoKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKKworICAgIGNvbnN0IGludCBsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2UubGVuZ3RoKCkpOworICAgIGlmICh3cml0ZShzb2NrZmRfLCBtZXNzYWdlLmNfc3RyKCksIGxlbikgIT0gbGVuKSB7CisgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpCisgICAgICAgICAgPDwgInN0cmVhbV9yZXN1bHRfdG86IGZhaWxlZCB0byBzdHJlYW0gdG8gIgorICAgICAgICAgIDw8IGhvc3RfbmFtZV8gPDwgIjoiIDw8IHBvcnRfbnVtXzsKKyAgICB9CisgIH0KKworICBpbnQgc29ja2ZkXzsgICAvLyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgIGNvbnN0IHN0cmluZyBob3N0X25hbWVfOworICBjb25zdCBzdHJpbmcgcG9ydF9udW1fOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyZWFtaW5nTGlzdGVuZXIpOworfTsgIC8vIGNsYXNzIFN0cmVhbWluZ0xpc3RlbmVyCisKKy8vIENoZWNrcyBpZiBzdHIgY29udGFpbnMgJz0nLCAnJicsICclJyBvciAnXG4nIGNoYXJhY3RlcnMuIElmIHllcywKKy8vIHJlcGxhY2VzIHRoZW0gYnkgIiV4eCIgd2hlcmUgeHggaXMgdGhlaXIgaGV4YWRlY2ltYWwgdmFsdWUuIEZvcgorLy8gZXhhbXBsZSwgcmVwbGFjZXMgIj0iIHdpdGggIiUzRCIuICBUaGlzIGFsZ29yaXRobSBpcyBPKHN0cmxlbihzdHIpKQorLy8gaW4gYm90aCB0aW1lIGFuZCBzcGFjZSAtLSBpbXBvcnRhbnQgYXMgdGhlIGlucHV0IHN0ciBtYXkgY29udGFpbiBhbgorLy8gYXJiaXRyYXJpbHkgbG9uZyB0ZXN0IGZhaWx1cmUgbWVzc2FnZSBhbmQgc3RhY2sgdHJhY2UuCitzdHJpbmcgU3RyZWFtaW5nTGlzdGVuZXI6OlVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoc3RybGVuKHN0cikgKyAxKTsKKyAgZm9yIChjaGFyIGNoID0gKnN0cjsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHIpIHsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlICclJzoKKyAgICAgIGNhc2UgJz0nOgorICAgICAgY2FzZSAnJic6CisgICAgICBjYXNlICdcbic6CisgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nOjpGb3JtYXQoIiUlJTAyeCIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTdHJlYW1pbmdMaXN0ZW5lcjo6TWFrZUNvbm5lY3Rpb24oKSB7CisgIEdURVNUX0NIRUNLXyhzb2NrZmRfID09IC0xKQorICAgICAgPDwgIk1ha2VDb25uZWN0aW9uKCkgY2FuJ3QgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24uIjsKKworICBhZGRyaW5mbyBoaW50czsKKyAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgICAgLy8gVG8gYWxsb3cgYm90aCBJUHY0IGFuZCBJUHY2IGFkZHJlc3Nlcy4KKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgYWRkcmluZm8qIHNlcnZpbmZvID0gTlVMTDsKKworICAvLyBVc2UgdGhlIGdldGFkZHJpbmZvKCkgdG8gZ2V0IGEgbGlua2VkIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIGZvcgorICAvLyB0aGUgZ2l2ZW4gaG9zdCBuYW1lLgorICBjb25zdCBpbnQgZXJyb3JfbnVtID0gZ2V0YWRkcmluZm8oCisgICAgICBob3N0X25hbWVfLmNfc3RyKCksIHBvcnRfbnVtXy5jX3N0cigpLCAmaGludHMsICZzZXJ2aW5mbyk7CisgIGlmIChlcnJvcl9udW0gIT0gMCkgeworICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgInN0cmVhbV9yZXN1bHRfdG86IGdldGFkZHJpbmZvKCkgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBnYWlfc3RyZXJyb3IoZXJyb3JfbnVtKTsKKyAgfQorCisgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHJlc3VsdHMgYW5kIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHdlIGNhbi4KKyAgZm9yIChhZGRyaW5mbyogY3VyX2FkZHIgPSBzZXJ2aW5mbzsgc29ja2ZkXyA9PSAtMSAmJiBjdXJfYWRkciAhPSBOVUxMOworICAgICAgIGN1cl9hZGRyID0gY3VyX2FkZHItPmFpX25leHQpIHsKKyAgICBzb2NrZmRfID0gc29ja2V0KAorICAgICAgICBjdXJfYWRkci0+YWlfZmFtaWx5LCBjdXJfYWRkci0+YWlfc29ja3R5cGUsIGN1cl9hZGRyLT5haV9wcm90b2NvbCk7CisgICAgaWYgKHNvY2tmZF8gIT0gLTEpIHsKKyAgICAgIC8vIENvbm5lY3QgdGhlIGNsaWVudCBzb2NrZXQgdG8gdGhlIHNlcnZlciBzb2NrZXQuCisgICAgICBpZiAoY29ubmVjdChzb2NrZmRfLCBjdXJfYWRkci0+YWlfYWRkciwgY3VyX2FkZHItPmFpX2FkZHJsZW4pID09IC0xKSB7CisgICAgICAgIGNsb3NlKHNvY2tmZF8pOworICAgICAgICBzb2NrZmRfID0gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnJlZWFkZHJpbmZvKHNlcnZpbmZvKTsgIC8vIGFsbCBkb25lIHdpdGggdGhpcyBzdHJ1Y3R1cmUKKworICBpZiAoc29ja2ZkXyA9PSAtMSkgeworICAgIEdURVNUX0xPR18oV0FSTklORykgPDwgInN0cmVhbV9yZXN1bHRfdG86IGZhaWxlZCB0byBjb25uZWN0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGhvc3RfbmFtZV8gPDwgIjoiIDw8IHBvcnRfbnVtXzsKKyAgfQorfQorCisvLyBFbmQgb2YgY2xhc3MgU3RyZWFtaW5nIExpc3RlbmVyCisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU19fCisKKy8vIENsYXNzIFNjb3BlZFRyYWNlCisKKy8vIFB1c2hlcyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gYW5kIG1lc3NhZ2Ugb250byBhIHBlci10aHJlYWQKKy8vIHRyYWNlIHN0YWNrIG1haW50YWluZWQgYnkgR29vZ2xlIFRlc3QuCisvLyBMIDwgVW5pdFRlc3Q6Om11dGV4XworU2NvcGVkVHJhY2U6OlNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIFRyYWNlSW5mbyB0cmFjZTsKKyAgdHJhY2UuZmlsZSA9IGZpbGU7CisgIHRyYWNlLmxpbmUgPSBsaW5lOworICB0cmFjZS5tZXNzYWdlID0gbWVzc2FnZS5HZXRTdHJpbmcoKTsKKworICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UHVzaEdUZXN0VHJhY2UodHJhY2UpOworfQorCisvLyBQb3BzIHRoZSBpbmZvIHB1c2hlZCBieSB0aGUgYyd0b3IuCisvLyBMIDwgVW5pdFRlc3Q6Om11dGV4XworU2NvcGVkVHJhY2U6On5TY29wZWRUcmFjZSgpIHsKKyAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlBvcEdUZXN0VHJhY2UoKTsKK30KKworCisvLyBjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhIFN0cmluZy4gIFBhcmFtZXRlcnM6CisvLworLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAorLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLgorLy8gICBza2lwX2NvdW50IC0gdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQ7IGRvZXNuJ3QgY291bnQKKy8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgorLy8KKy8vIEwgPCBtdXRleF8KKy8vIFdlIHVzZSAiTCA8IG11dGV4XyIgdG8gZGVub3RlIHRoYXQgdGhlIGZ1bmN0aW9uIG1heSBhY3F1aXJlIG11dGV4Xy4KK1N0cmluZyBPc1N0YWNrVHJhY2VHZXR0ZXI6OkN1cnJlbnRTdGFja1RyYWNlKGludCwgaW50KSB7CisgIHJldHVybiBTdHJpbmcoIiIpOworfQorCisvLyBMIDwgbXV0ZXhfCit2b2lkIE9zU3RhY2tUcmFjZUdldHRlcjo6VXBvbkxlYXZpbmdHVGVzdCgpIHsKK30KKworY29uc3QgY2hhciogY29uc3QKK09zU3RhY2tUcmFjZUdldHRlcjo6a0VsaWRlZEZyYW1lc01hcmtlciA9CisgICAgIi4uLiAiIEdURVNUX05BTUVfICIgaW50ZXJuYWwgZnJhbWVzIC4uLiI7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnMKKworVGVzdEV2ZW50TGlzdGVuZXJzOjpUZXN0RXZlbnRMaXN0ZW5lcnMoKQorICAgIDogcmVwZWF0ZXJfKG5ldyBpbnRlcm5hbDo6VGVzdEV2ZW50UmVwZWF0ZXIoKSksCisgICAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyhOVUxMKSwKKyAgICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8oTlVMTCkgeworfQorCitUZXN0RXZlbnRMaXN0ZW5lcnM6On5UZXN0RXZlbnRMaXN0ZW5lcnMoKSB7IGRlbGV0ZSByZXBlYXRlcl87IH0KKworLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IGNvbnNvbGUKKy8vIG91dHB1dC4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3RlbmVycyBsaXN0IHRvIHNodXQgZG93biBkZWZhdWx0CisvLyBjb25zb2xlIG91dHB1dC4gIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0CisvLyB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cyBvd25lcnNoaXAgdG8gdGhlIHVzZXIuCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6QXBwZW5kKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICByZXBlYXRlcl8tPkFwcGVuZChsaXN0ZW5lcik7Cit9CisKKy8vIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBJdCB0aGVuCisvLyBiZWNvbWVzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBkZWxldGUgdGhlIGxpc3RlbmVyLiBSZXR1cm5zCisvLyBOVUxMIGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCitUZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50TGlzdGVuZXJzOjpSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgeworICBpZiAobGlzdGVuZXIgPT0gZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8pCisgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBOVUxMOworICBlbHNlIGlmIChsaXN0ZW5lciA9PSBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKQorICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gPSBOVUxMOworICByZXR1cm4gcmVwZWF0ZXJfLT5SZWxlYXNlKGxpc3RlbmVyKTsKK30KKworLy8gUmV0dXJucyByZXBlYXRlciB0aGF0IGJyb2FkY2FzdHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGV2ZW50cyB0byBhbGwKKy8vIHN1YnNjcmliZXJzLgorVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudExpc3RlbmVyczo6cmVwZWF0ZXIoKSB7IHJldHVybiByZXBlYXRlcl87IH0KKworLy8gU2V0cyB0aGUgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLgorLy8gVGhlIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCisvLyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKKy8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgaWYgKGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfICE9IGxpc3RlbmVyKSB7CisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyB0aGlzIG1ldGhvZCBhIGxpc3RlbmVyIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUKKyAgICAvLyBsaXN0LgorICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKTsKKyAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyA9IGxpc3RlbmVyOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKQorICAgICAgQXBwZW5kKGxpc3RlbmVyKTsKKyAgfQorfQorCisvLyBTZXRzIHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4gIFRoZQorLy8gbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKKy8vIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KKy8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCit2b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKKyAgaWYgKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gIT0gbGlzdGVuZXIpIHsKKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBwYXNzIHRoaXMgbWV0aG9kIGEgbGlzdGVuZXIgdGhhdCBpcyBhbHJlYWR5IGluIHRoZQorICAgIC8vIGxpc3QuCisgICAgZGVsZXRlIFJlbGVhc2UoZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyk7CisgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyA9IGxpc3RlbmVyOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKQorICAgICAgQXBwZW5kKGxpc3RlbmVyKTsKKyAgfQorfQorCisvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCBieSB0aGUgcmVwZWF0ZXIgdG8gdGhlCisvLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuCitib29sIFRlc3RFdmVudExpc3RlbmVyczo6RXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlcGVhdGVyXy0+Zm9yd2FyZGluZ19lbmFibGVkKCk7Cit9CisKK3ZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpIHsKKyAgcmVwZWF0ZXJfLT5zZXRfZm9yd2FyZGluZ19lbmFibGVkKGZhbHNlKTsKK30KKworLy8gY2xhc3MgVW5pdFRlc3QKKworLy8gR2V0cyB0aGUgc2luZ2xldG9uIFVuaXRUZXN0IG9iamVjdC4gIFRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzCisvLyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4gIENvbnNlY3V0aXZlCisvLyBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QuCisvLworLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XyBhcyBhIHVzZXIgaXMgbm90IHN1cHBvc2VkIHRvCisvLyBjYWxsIHRoaXMgYmVmb3JlIG1haW4oKSBzdGFydHMsIGZyb20gd2hpY2ggcG9pbnQgb24gdGhlIHJldHVybgorLy8gdmFsdWUgd2lsbCBuZXZlciBjaGFuZ2UuCitVbml0VGVzdCAqIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpIHsKKyAgLy8gV2hlbiBjb21waWxlZCB3aXRoIE1TVkMgNy4xIGluIG9wdGltaXplZCBtb2RlLCBkZXN0cm95aW5nIHRoZQorICAvLyBVbml0VGVzdCBvYmplY3QgdXBvbiBleGl0aW5nIHRoZSBwcm9ncmFtIG1lc3NlcyB1cCB0aGUgZXhpdCBjb2RlLAorICAvLyBjYXVzaW5nIHN1Y2Nlc3NmdWwgdGVzdHMgdG8gYXBwZWFyIGZhaWxlZC4gIFdlIGhhdmUgdG8gdXNlIGEKKyAgLy8gZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZSB0byBieXBhc3MgdGhlIGNvbXBpbGVyIGJ1Zy4KKyAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB0aGUgY29tcGlsZXIgaGFwcHksIGF0IHRoZSBjb3N0IG9mCisgIC8vIGxlYWtpbmcgdGhlIFVuaXRUZXN0IG9iamVjdC4KKworICAvLyBDb2RlR2VhciBDKytCdWlsZGVyIGluc2lzdHMgb24gYSBwdWJsaWMgZGVzdHJ1Y3RvciBmb3IgdGhlCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uICBVc2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB0byBrZWVwIGdvb2QgT08KKyAgLy8gZGVzaWduIHdpdGggcHJpdmF0ZSBkZXN0cnVjdG9yLgorCisjaWYgKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisgIHN0YXRpYyBVbml0VGVzdCogY29uc3QgaW5zdGFuY2UgPSBuZXcgVW5pdFRlc3Q7CisgIHJldHVybiBpbnN0YW5jZTsKKyNlbHNlCisgIHN0YXRpYyBVbml0VGVzdCBpbnN0YW5jZTsKKyAgcmV0dXJuICZpbnN0YW5jZTsKKyNlbmRpZiAgLy8gKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5zdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCitpbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgoraW50IFVuaXRUZXN0Ojp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0CisvLyB0aGF0IHNob3VsZCBydW4uCitpbnQgVW5pdFRlc3Q6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPnRlc3RfY2FzZV90b19ydW5fY291bnQoKTsKK30KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCk7Cit9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCitpbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jb3VudCgpOyB9CisKKy8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KK2ludCBVbml0VGVzdDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGwoKS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpOworfQorCisvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgoraW50IFVuaXRUZXN0Ojp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50b3RhbF90ZXN0X2NvdW50KCk7IH0KKworLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPnRlc3RfdG9fcnVuX2NvdW50KCk7IH0KKworLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCitpbnRlcm5hbDo6VGltZUluTWlsbGlzIFVuaXRUZXN0OjplbGFwc2VkX3RpbWUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsKCktPmVsYXBzZWRfdGltZSgpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCitib29sIFVuaXRUZXN0OjpQYXNzZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPlBhc3NlZCgpOyB9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCisvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KK2Jvb2wgVW5pdFRlc3Q6OkZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+RmFpbGVkKCk7IH0KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3QgeworICByZXR1cm4gaW1wbCgpLT5HZXRUZXN0Q2FzZShpKTsKK30KKworLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKy8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgorVGVzdENhc2UqIFVuaXRUZXN0OjpHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpIHsKKyAgcmV0dXJuIGltcGwoKS0+R2V0TXV0YWJsZVRlc3RDYXNlKGkpOworfQorCisvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cworLy8gaW5zaWRlIEdvb2dsZSBUZXN0LgorVGVzdEV2ZW50TGlzdGVuZXJzJiBVbml0VGVzdDo6bGlzdGVuZXJzKCkgeworICByZXR1cm4gKmltcGwoKS0+bGlzdGVuZXJzKCk7Cit9CisKKy8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QKKy8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluIHRoZQorLy8gb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuICBBZnRlciBhbGwgdGVzdHMgaW4gdGhlIHByb2dyYW0gaGF2ZQorLy8gZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4gdGhlCisvLyAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisvLworLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50LgorLy8KKy8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8sIGFzIHdlIG9ubHkgc3VwcG9ydCBjYWxsaW5nIGl0CisvLyBmcm9tIHRoZSBtYWluIHRocmVhZC4KK0Vudmlyb25tZW50KiBVbml0VGVzdDo6QWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeworICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGltcGxfLT5lbnZpcm9ubWVudHMoKS5wdXNoX2JhY2soZW52KTsKKyAgcmV0dXJuIGVudjsKK30KKworLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsIEdvb2dsZSBUZXN0CisvLyBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykgZXZlbnR1YWxseSBjYWxsCisvLyB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZSBzaG91bGQgdXNlIHRoZQorLy8gYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KKy8vIEwgPCBtdXRleF8KK3ZvaWQgVW5pdFRlc3Q6OkFkZFRlc3RQYXJ0UmVzdWx0KFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpTdHJpbmcmIG9zX3N0YWNrX3RyYWNlKSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgbWVzc2FnZTsKKworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIGlmIChpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkgPiAwKSB7CisgICAgbXNnIDw8ICJcbiIgPDwgR1RFU1RfTkFNRV8gPDwgIiB0cmFjZToiOworCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkuc2l6ZSgpKTsKKyAgICAgICAgIGkgPiAwOyAtLWkpIHsKKyAgICAgIGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlID0gaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKClbaSAtIDFdOworICAgICAgbXNnIDw8ICJcbiIgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbih0cmFjZS5maWxlLCB0cmFjZS5saW5lKQorICAgICAgICAgIDw8ICIgIiA8PCB0cmFjZS5tZXNzYWdlOworICAgIH0KKyAgfQorCisgIGlmIChvc19zdGFja190cmFjZS5jX3N0cigpICE9IE5VTEwgJiYgIW9zX3N0YWNrX3RyYWNlLmVtcHR5KCkpIHsKKyAgICBtc2cgPDwgaW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyIDw8IG9zX3N0YWNrX3RyYWNlOworICB9CisKKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQgcmVzdWx0ID0KKyAgICBUZXN0UGFydFJlc3VsdChyZXN1bHRfdHlwZSwgZmlsZV9uYW1lLCBsaW5lX251bWJlciwKKyAgICAgICAgICAgICAgICAgICBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7CisgIGltcGxfLT5HZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpLT4KKyAgICAgIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7CisKKyAgaWYgKHJlc3VsdF90eXBlICE9IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykgeworICAgIC8vIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyCisgICAgLy8gZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZS4gIFRoaXMgYWxsb3dzIGEgdXNlciB0byBzZXQgdGhlIGxhdHRlcgorICAgIC8vIGluIHRoZSBjb2RlIChwZXJoYXBzIGluIG9yZGVyIHRvIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zCisgICAgLy8gd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrKSBhbmQgc3BlY2lmeSB0aGUgZm9ybWVyIG9uIHRoZQorICAgIC8vIGNvbW1hbmQgbGluZSBmb3IgZGVidWdnaW5nLgorICAgIGlmIChHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAgICAgLy8gVXNpbmcgRGVidWdCcmVhayBvbiBXaW5kb3dzIGFsbG93cyBndGVzdCB0byBzdGlsbCBicmVhayBpbnRvIGEgZGVidWdnZXIKKyAgICAgIC8vIHdoZW4gYSBmYWlsdXJlIGhhcHBlbnMgYW5kIGJvdGggdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBhbmQKKyAgICAgIC8vIHRoZSAtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMgZmxhZ3MgYXJlIHNwZWNpZmllZC4KKyAgICAgIERlYnVnQnJlYWsoKTsKKyNlbHNlCisgICAgICAvLyBEZXJlZmVyZW5jZSBOVUxMIHRocm91Z2ggYSB2b2xhdGlsZSBwb2ludGVyIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCisgICAgICAvLyBmcm9tIHJlbW92aW5nLiBXZSB1c2UgdGhpcyByYXRoZXIgdGhhbiBhYm9ydCgpIG9yIF9fYnVpbHRpbl90cmFwKCkgZm9yCisgICAgICAvLyBwb3J0YWJpbGl0eTogU3ltYmlhbiBkb2Vzbid0IGltcGxlbWVudCBhYm9ydCgpIHdlbGwsIGFuZCBzb21lIGRlYnVnZ2VycworICAgICAgLy8gZG9uJ3QgY29ycmVjdGx5IHRyYXAgYWJvcnQoKS4KKyAgICAgICpzdGF0aWNfY2FzdDx2b2xhdGlsZSBpbnQqPihOVUxMKSA9IDE7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKyAgICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpIHsKKyNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUworICAgICAgdGhyb3cgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24ocmVzdWx0KTsKKyNlbHNlCisgICAgICAvLyBXZSBjYW5ub3QgY2FsbCBhYm9ydCgpIGFzIGl0IGdlbmVyYXRlcyBhIHBvcC11cCBpbiBkZWJ1ZyBtb2RlCisgICAgICAvLyB0aGF0IGNhbm5vdCBiZSBzdXBwcmVzc2VkIGluIFZDIDcuMSBvciBiZWxvdy4KKyAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICB9CisgIH0KK30KKworLy8gQ3JlYXRlcyBhbmQgYWRkcyBhIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQuIElmIGEgcHJvcGVydHkgbWF0Y2hpbmcKKy8vIHRoZSBzdXBwbGllZCB2YWx1ZSBhbHJlYWR5IGV4aXN0cywgdXBkYXRlcyBpdHMgdmFsdWUgaW5zdGVhZC4KK3ZvaWQgVW5pdFRlc3Q6OlJlY29yZFByb3BlcnR5Rm9yQ3VycmVudFRlc3QoY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBjb25zdCBUZXN0UHJvcGVydHkgdGVzdF9wcm9wZXJ0eShrZXksIHZhbHVlKTsKKyAgaW1wbF8tPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+UmVjb3JkUHJvcGVydHkodGVzdF9wcm9wZXJ0eSk7Cit9CisKKy8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0IGFuZCBwcmludHMgdGhlIHJlc3VsdC4KKy8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KKy8vCisvLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfLCBhcyB3ZSBvbmx5IHN1cHBvcnQgY2FsbGluZyBpdAorLy8gZnJvbSB0aGUgbWFpbiB0aHJlYWQuCitpbnQgVW5pdFRlc3Q6OlJ1bigpIHsKKyAgLy8gQ2FwdHVyZXMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykuICBUaGlzIHZhbHVlIHdpbGwgYmUKKyAgLy8gdXNlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcm9ncmFtLgorICBpbXBsKCktPnNldF9jYXRjaF9leGNlcHRpb25zKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpOworCisjaWYgR1RFU1RfSEFTX1NFSAorICBjb25zdCBib29sIGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcyA9CisgICAgICBpbnRlcm5hbDo6R1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkubGVuZ3RoKCkgPiAwOworCisgIC8vIEVpdGhlciB0aGUgdXNlciB3YW50cyBHb29nbGUgVGVzdCB0byBjYXRjaCBleGNlcHRpb25zIHRocm93biBieSB0aGUKKyAgLy8gdGVzdHMgb3IgdGhpcyBpcyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgZGVhdGggdGVzdCBjaGlsZAorICAvLyBwcm9jZXNzLiBJbiBlaXRoZXIgY2FzZSB0aGUgdXNlciBkb2VzIG5vdCB3YW50IHRvIHNlZSBwb3AtdXAgZGlhbG9ncworICAvLyBhYm91dCBjcmFzaGVzIC0gdGhleSBhcmUgZXhwZWN0ZWQuCisgIGlmIChpbXBsKCktPmNhdGNoX2V4Y2VwdGlvbnMoKSB8fCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MpIHsKKworIyBpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgICAvLyBTZXRFcnJvck1vZGUgZG9lc24ndCBleGlzdCBvbiBDRS4KKyAgICBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyB8IFNFTV9OT0FMSUdOTUVOVEZBVUxURVhDRVBUIHwKKyAgICAgICAgICAgICAgICAgU0VNX05PR1BGQVVMVEVSUk9SQk9YIHwgU0VNX05PT1BFTkZJTEVFUlJPUkJPWCk7CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworIyBpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgR1RFU1RfT1NfV0lORE9XU19NSU5HVykgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgICAgLy8gRGVhdGggdGVzdCBjaGlsZHJlbiBjYW4gYmUgdGVybWluYXRlZCB3aXRoIF9hYm9ydCgpLiAgT24gV2luZG93cywKKyAgICAvLyBfYWJvcnQoKSBjYW4gc2hvdyBhIGRpYWxvZyB3aXRoIGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBmb3JjZXMgdGhlCisgICAgLy8gYWJvcnQgbWVzc2FnZSB0byBnbyB0byBzdGRlcnIgaW5zdGVhZC4KKyAgICBfc2V0X2Vycm9yX21vZGUoX09VVF9UT19TVERFUlIpOworIyBlbmRpZgorCisjIGlmIF9NU0NfVkVSID49IDE0MDAgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgICAgLy8gSW4gdGhlIGRlYnVnIHZlcnNpb24sIFZpc3VhbCBTdHVkaW8gcG9wcyB1cCBhIHNlcGFyYXRlIGRpYWxvZworICAgIC8vIG9mZmVyaW5nIGEgY2hvaWNlIHRvIGRlYnVnIHRoZSBhYm9ydGVkIHByb2dyYW0uIFdlIG5lZWQgdG8gc3VwcHJlc3MKKyAgICAvLyB0aGlzIGRpYWxvZyBvciBpdCB3aWxsIHBvcCB1cCBmb3IgZXZlcnkgRVhQRUNUL0FTU0VSVF9ERUFUSCBzdGF0ZW1lbnQKKyAgICAvLyBleGVjdXRlZC4gR29vZ2xlIFRlc3Qgd2lsbCBub3RpZnkgdGhlIHVzZXIgb2YgYW55IHVuZXhwZWN0ZWQKKyAgICAvLyBmYWlsdXJlIHZpYSBzdGRlcnIuCisgICAgLy8KKyAgICAvLyBWQysrIGRvZXNuJ3QgZGVmaW5lIF9zZXRfYWJvcnRfYmVoYXZpb3IoKSBwcmlvciB0byB0aGUgdmVyc2lvbiA4LjAuCisgICAgLy8gVXNlcnMgb2YgcHJpb3IgVkMgdmVyc2lvbnMgc2hhbGwgc3VmZmVyIHRoZSBhZ29ueSBhbmQgcGFpbiBvZgorICAgIC8vIGNsaWNraW5nIHRocm91Z2ggdGhlIGNvdW50bGVzcyBkZWJ1ZyBkaWFsb2dzLgorICAgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IGZpbmQgYSB3YXkgdG8gc3VwcHJlc3MgdGhlIGFib3J0IGRpYWxvZygpIGluIHRoZQorICAgIC8vIGRlYnVnIG1vZGUgd2hlbiBjb21waWxlZCB3aXRoIFZDIDcuMSBvciBsb3dlci4KKyAgICBpZiAoIUdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpCisgICAgICBfc2V0X2Fib3J0X2JlaGF2aW9yKAorICAgICAgICAgIDB4MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgZm9sbG93aW5nIGZsYWdzOgorICAgICAgICAgIF9XUklURV9BQk9SVF9NU0cgfCBfQ0FMTF9SRVBPUlRGQVVMVCk7ICAvLyBwb3AtdXAgd2luZG93LCBjb3JlIGR1bXAuCisjIGVuZGlmCisKKyAgfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyAgcmV0dXJuIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKKyAgICAgIGltcGwoKSwKKyAgICAgICZpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cywKKyAgICAgICJhdXhpbGlhcnkgdGVzdCBjb2RlIChlbnZpcm9ubWVudHMgb3IgZXZlbnQgbGlzdGVuZXJzKSIpID8gMCA6IDE7Cit9CisKKy8vIFJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGZpcnN0IFRFU1QoKSBvciBURVNUX0YoKSB3YXMKKy8vIGV4ZWN1dGVkLgorY29uc3QgY2hhciogVW5pdFRlc3Q6Om9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPm9yaWdpbmFsX3dvcmtpbmdfZGlyXy5jX3N0cigpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKy8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorLy8gTCA8IG11dGV4XworY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0IHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICByZXR1cm4gaW1wbF8tPmN1cnJlbnRfdGVzdF9jYXNlKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAorLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisvLyBMIDwgbXV0ZXhfCitjb25zdCBUZXN0SW5mbyogVW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QgeworICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgIHJldHVybiBpbXBsXy0+Y3VycmVudF90ZXN0X2luZm8oKTsKK30KKworLy8gUmV0dXJucyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBydW4uCitpbnQgVW5pdFRlc3Q6OnJhbmRvbV9zZWVkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnJhbmRvbV9zZWVkKCk7IH0KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgorLy8gTCA8IG11dGV4XworaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JgorICAgIFVuaXRUZXN0OjpwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKSB7CisgIHJldHVybiBpbXBsXy0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIENyZWF0ZXMgYW4gZW1wdHkgVW5pdFRlc3QuCitVbml0VGVzdDo6VW5pdFRlc3QoKSB7CisgIGltcGxfID0gbmV3IGludGVybmFsOjpVbml0VGVzdEltcGwodGhpcyk7Cit9CisKKy8vIERlc3RydWN0b3Igb2YgVW5pdFRlc3QuCitVbml0VGVzdDo6flVuaXRUZXN0KCkgeworICBkZWxldGUgaW1wbF87Cit9CisKKy8vIFB1c2hlcyBhIHRyYWNlIGRlZmluZWQgYnkgU0NPUEVEX1RSQUNFKCkgb24gdG8gdGhlIHBlci10aHJlYWQKKy8vIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgorLy8gTCA8IG11dGV4Xwordm9pZCBVbml0VGVzdDo6UHVzaEdUZXN0VHJhY2UoY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UpIHsKKyAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5wdXNoX2JhY2sodHJhY2UpOworfQorCisvLyBQb3BzIGEgdHJhY2UgZnJvbSB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKy8vIEwgPCBtdXRleF8KK3ZvaWQgVW5pdFRlc3Q6OlBvcEdUZXN0VHJhY2UoKSB7CisgIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKKyAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucG9wX2JhY2soKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworVW5pdFRlc3RJbXBsOjpVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCkKKyAgICA6IHBhcmVudF8ocGFyZW50KSwKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzU1KSAgICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDM1NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNpbmcgdGhpcyBpbiBpbml0aWFsaXplcikuCisgICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlIGFnYWluLgorI2Vsc2UKKyAgICAgIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorICAgICAgZGVmYXVsdF9wZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKHRoaXMpLAorI2VuZGlmICAvLyBfTVNDX1ZFUgorICAgICAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8oCisgICAgICAgICAgJmRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKKyAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8oCisgICAgICAgICAgJmRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyksCisjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKyAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8oKSwKKyAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8oZmFsc2UpLAorI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorICAgICAgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfKC0xKSwKKyAgICAgIGN1cnJlbnRfdGVzdF9jYXNlXyhOVUxMKSwKKyAgICAgIGN1cnJlbnRfdGVzdF9pbmZvXyhOVUxMKSwKKyAgICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8oKSwKKyAgICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8oTlVMTCksCisgICAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKGZhbHNlKSwKKyAgICAgIHJhbmRvbV9zZWVkXygwKSwgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgorICAgICAgcmFuZG9tXygwKSwgIC8vIFdpbGwgYmUgcmVzZWVkZWQgYmVmb3JlIGZpcnN0IHVzZS4KKyAgICAgIGVsYXBzZWRfdGltZV8oMCksCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfKE5VTEwpLAorICAgICAgZGVhdGhfdGVzdF9mYWN0b3J5XyhuZXcgRGVmYXVsdERlYXRoVGVzdEZhY3RvcnkpLAorI2VuZGlmCisgICAgICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZsYWcgYmVmb3JlIGZpcnN0IHVzZS4KKyAgICAgIGNhdGNoX2V4Y2VwdGlvbnNfKGZhbHNlKSB7CisgIGxpc3RlbmVycygpLT5TZXREZWZhdWx0UmVzdWx0UHJpbnRlcihuZXcgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyKTsKK30KKworVW5pdFRlc3RJbXBsOjp+VW5pdFRlc3RJbXBsKCkgeworICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3RDYXNlLgorICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBpbnRlcm5hbDo6RGVsZXRlPFRlc3RDYXNlPik7CisKKyAgLy8gRGVsZXRlcyBldmVyeSBFbnZpcm9ubWVudC4KKyAgRm9yRWFjaChlbnZpcm9ubWVudHNfLCBpbnRlcm5hbDo6RGVsZXRlPEVudmlyb25tZW50Pik7CisKKyAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Cit9CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorLy8gRGlzYWJsZXMgZXZlbnQgZm9yd2FyZGluZyBpZiB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgaW4gYSBkZWF0aCB0ZXN0CisvLyBzdWJwcm9jZXNzLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OlN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCkgeworICBpZiAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCkKKyAgICBsaXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKKy8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVYbWxPdXRwdXQoKSB7CisgIGNvbnN0IFN0cmluZyYgb3V0cHV0X2Zvcm1hdCA9IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCk7CisgIGlmIChvdXRwdXRfZm9ybWF0ID09ICJ4bWwiKSB7CisgICAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRYbWxHZW5lcmF0b3IobmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcigKKyAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKS5jX3N0cigpKSk7CisgIH0gZWxzZSBpZiAob3V0cHV0X2Zvcm1hdCAhPSAiIikgeworICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIG91dHB1dCBmb3JtYXQgXCIlc1wiIGlnbm9yZWQuXG4iLAorICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9Cit9CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisvLyBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnMgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgaW4gU3RyaW5nIGZvcm0uCisvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgordm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpIHsKKyAgY29uc3Qgc3RyaW5nJiB0YXJnZXQgPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOworICBpZiAoIXRhcmdldC5lbXB0eSgpKSB7CisgICAgY29uc3Qgc2l6ZV90IHBvcyA9IHRhcmdldC5maW5kKCc6Jyk7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGxpc3RlbmVycygpLT5BcHBlbmQobmV3IFN0cmVhbWluZ0xpc3RlbmVyKHRhcmdldC5zdWJzdHIoMCwgcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdWJzdHIocG9zKzEpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIHN0cmVhbWluZyB0YXJnZXQgXCIlc1wiIGlnbm9yZWQuXG4iLAorICAgICAgICAgICAgIHRhcmdldC5jX3N0cigpKTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KKyAgfQorfQorI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisKKy8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCisvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJcyBjYWxsZWQgZnJvbSBJbml0R29vZ2xlVGVzdCBhZnRlciB0aGUgY2FsbCB0bworLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSW4gY2FzZSBhIHVzZXIgbmVnbGVjdHMgdG8gY2FsbCBJbml0R29vZ2xlVGVzdAorLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKy8vIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgaGFzIHRvIGJlIGlkZW1wb3RlbnQuCit2b2lkIFVuaXRUZXN0SW1wbDo6UG9zdEZsYWdQYXJzaW5nSW5pdCgpIHsKKyAgLy8gRW5zdXJlcyB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhlY3V0ZSBtb3JlIHRoYW4gb25jZS4KKyAgaWYgKCFwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKSB7CisgICAgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXyA9IHRydWU7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICAgIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKTsKKyAgICBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgICAgLy8gUmVnaXN0ZXJzIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFRoaXMgbWFrZXMgcGFyYW1ldGVyaXplZCB0ZXN0cworICAgIC8vIGF2YWlsYWJsZSB0byB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkgd2l0aG91dCBydW5uaW5nCisgICAgLy8gUlVOX0FMTF9URVNUUy4KKyAgICBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOworCisgICAgLy8gQ29uZmlndXJlcyBsaXN0ZW5lcnMgZm9yIFhNTCBvdXRwdXQuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzCisgICAgLy8gdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQgYmVmb3JlIGludm9raW5nIFJVTl9BTExfVEVTVFMuCisgICAgQ29uZmlndXJlWG1sT3V0cHV0KCk7CisKKyNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCisgICAgLy8gQ29uZmlndXJlcyBsaXN0ZW5lcnMgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCisgICAgQ29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCk7CisjZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyAgfQorfQorCisvLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgbmFtZSBvZiBhIFRlc3RDYXNlIGFnYWluc3QgYSBrbm93bgorLy8gdmFsdWUuCisvLworLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdFRlc3QgY2xhc3Mgb25seS4gIFdlIHB1dAorLy8gaXQgaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UgdG8gcHJldmVudCBwb2xsdXRpbmcgdGhlIG91dGVyCisvLyBuYW1lc3BhY2UuCisvLworLy8gVGVzdENhc2VOYW1lSXMgaXMgY29weWFibGUuCitjbGFzcyBUZXN0Q2FzZU5hbWVJcyB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgZXhwbGljaXQgVGVzdENhc2VOYW1lSXMoY29uc3QgU3RyaW5nJiBuYW1lKQorICAgICAgOiBuYW1lXyhuYW1lKSB7fQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG5hbWUgb2YgdGVzdF9jYXNlIG1hdGNoZXMgbmFtZV8uCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfY2FzZSAhPSBOVUxMICYmIHN0cmNtcCh0ZXN0X2Nhc2UtPm5hbWUoKSwgbmFtZV8uY19zdHIoKSkgPT0gMDsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3RyaW5nIG5hbWVfOworfTsKKworLy8gRmluZHMgYW5kIHJldHVybnMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgb25lIGRvZXNuJ3QKKy8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4gIEl0J3MgdGhlIENBTExFUidTCisvLyBSRVNQT05TSUJJTElUWSB0byBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIFdIRU4gVEhFCisvLyBURVNUUyBBUkUgTk9UIFNIVUZGTEVELgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKy8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgorLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKK1Rlc3RDYXNlKiBVbml0VGVzdEltcGw6OkdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykgeworICAvLyBDYW4gd2UgZmluZCBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWU/CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj46OmNvbnN0X2l0ZXJhdG9yIHRlc3RfY2FzZSA9CisgICAgICBzdGQ6OmZpbmRfaWYodGVzdF9jYXNlc18uYmVnaW4oKSwgdGVzdF9jYXNlc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgVGVzdENhc2VOYW1lSXModGVzdF9jYXNlX25hbWUpKTsKKworICBpZiAodGVzdF9jYXNlICE9IHRlc3RfY2FzZXNfLmVuZCgpKQorICAgIHJldHVybiAqdGVzdF9jYXNlOworCisgIC8vIE5vLiAgTGV0J3MgY3JlYXRlIG9uZS4KKyAgVGVzdENhc2UqIGNvbnN0IG5ld190ZXN0X2Nhc2UgPQorICAgICAgbmV3IFRlc3RDYXNlKHRlc3RfY2FzZV9uYW1lLCB0eXBlX3BhcmFtLCBzZXRfdXBfdGMsIHRlYXJfZG93bl90Yyk7CisKKyAgLy8gSXMgdGhpcyBhIGRlYXRoIHRlc3QgY2FzZT8KKyAgaWYgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoU3RyaW5nKHRlc3RfY2FzZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlYXRoVGVzdENhc2VGaWx0ZXIpKSB7CisgICAgLy8gWWVzLiAgSW5zZXJ0cyB0aGUgdGVzdCBjYXNlIGFmdGVyIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZQorICAgIC8vIGRlZmluZWQgc28gZmFyLiAgVGhpcyBvbmx5IHdvcmtzIHdoZW4gdGhlIHRlc3QgY2FzZXMgaGF2ZW4ndAorICAgIC8vIGJlZW4gc2h1ZmZsZWQuICBPdGhlcndpc2Ugd2UgbWF5IGVuZCB1cCBydW5uaW5nIGEgZGVhdGggdGVzdAorICAgIC8vIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QuCisgICAgKytsYXN0X2RlYXRoX3Rlc3RfY2FzZV87CisgICAgdGVzdF9jYXNlc18uaW5zZXJ0KHRlc3RfY2FzZXNfLmJlZ2luKCkgKyBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8sCisgICAgICAgICAgICAgICAgICAgICAgIG5ld190ZXN0X2Nhc2UpOworICB9IGVsc2UgeworICAgIC8vIE5vLiAgQXBwZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgIHRlc3RfY2FzZXNfLnB1c2hfYmFjayhuZXdfdGVzdF9jYXNlKTsKKyAgfQorCisgIHRlc3RfY2FzZV9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VfaW5kaWNlc18uc2l6ZSgpKSk7CisgIHJldHVybiBuZXdfdGVzdF9jYXNlOworfQorCisvLyBIZWxwZXJzIGZvciBzZXR0aW5nIHVwIC8gdGVhcmluZyBkb3duIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4gIFRoZXkKKy8vIGFyZSBmb3IgdXNlIGluIHRoZSBGb3JFYWNoKCkgZnVuY3Rpb24uCitzdGF0aWMgdm9pZCBTZXRVcEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5TZXRVcCgpOyB9CitzdGF0aWMgdm9pZCBUZWFyRG93bkVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5UZWFyRG93bigpOyB9CisKKy8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kCisvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcworLy8gdGhyb3duIGR1cmluZyBhIHRlc3QsIHRoZSB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQgdGhlCisvLyByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4KKy8vCisvLyBXaGVuIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQsIGl0IGV4cGFuZHMgYW5kIHJlZ2lzdGVycworLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBmaXJzdCBpbiBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpLgorLy8gQWxsIG90aGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cygpIG1heSBzYWZlbHkgYXNzdW1lIHRoYXQKKy8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIHJlYWR5IHRvIGJlIGNvdW50ZWQgYW5kIHJ1bi4KK2Jvb2wgVW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cygpIHsKKyAgLy8gTWFrZXMgc3VyZSBJbml0R29vZ2xlVGVzdCgpIHdhcyBjYWxsZWQuCisgIGlmICghR1Rlc3RJc0luaXRpYWxpemVkKCkpIHsKKyAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgIlxuVGhpcyB0ZXN0IHByb2dyYW0gZGlkIE5PVCBjYWxsIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QgIgorICAgICAgICAgICAiYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLiAgUGxlYXNlIGZpeCBpdC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIERvIG5vdCBydW4gYW55IHRlc3QgaWYgdGhlIC0taGVscCBmbGFnIHdhcyBzcGVjaWZpZWQuCisgIGlmIChnX2hlbHBfZmxhZykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBSZXBlYXRzIHRoZSBjYWxsIHRvIHRoZSBwb3N0LWZsYWcgcGFyc2luZyBpbml0aWFsaXphdGlvbiBpbiBjYXNlIHRoZQorICAvLyB1c2VyIGRpZG4ndCBjYWxsIEluaXRHb29nbGVUZXN0LgorICBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7CisKKyAgLy8gRXZlbiBpZiBzaGFyZGluZyBpcyBub3Qgb24sIHRlc3QgcnVubmVycyBtYXkgd2FudCB0byB1c2UgdGhlCisgIC8vIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIHRvIHF1ZXJ5IHdoZXRoZXIgdGhlIHRlc3Qgc3VwcG9ydHMgdGhlIHNoYXJkaW5nCisgIC8vIHByb3RvY29sLgorICBpbnRlcm5hbDo6V3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCk7CisKKyAgLy8gVHJ1ZSBpZmYgd2UgYXJlIGluIGEgc3VicHJvY2VzcyBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QuCisgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IGZhbHNlOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworICBjb25zdCBib29sIHNob3VsZF9zaGFyZCA9IFNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KTsKKworICAvLyBDb21wYXJlcyB0aGUgZnVsbCB0ZXN0IG5hbWVzIHdpdGggdGhlIGZpbHRlciB0byBkZWNpZGUgd2hpY2gKKyAgLy8gdGVzdHMgdG8gcnVuLgorICBjb25zdCBib29sIGhhc190ZXN0c190b19ydW4gPSBGaWx0ZXJUZXN0cyhzaG91bGRfc2hhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wpID4gMDsKKworICAvLyBMaXN0cyB0aGUgdGVzdHMgYW5kIGV4aXRzIGlmIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3YXMgc3BlY2lmaWVkLgorICBpZiAoR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgeworICAgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiBGaWx0ZXJUZXN0cygpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhzaHVmZmxlKSA/CisgICAgICBHZXRSYW5kb21TZWVkRnJvbUZsYWcoR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIDogMDsKKworICAvLyBUcnVlIGlmZiBhdCBsZWFzdCBvbmUgdGVzdCBoYXMgZmFpbGVkLgorICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IGxpc3RlbmVycygpLT5yZXBlYXRlcigpOworCisgIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtU3RhcnQoKnBhcmVudF8pOworCisgIC8vIEhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgdGVzdHM/ICBXZSBkb24ndCB3YW50IHRvIHJlcGVhdCB0aGVtCisgIC8vIHdoZW4gd2UgYXJlIGluc2lkZSB0aGUgc3VicHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QuCisgIGNvbnN0IGludCByZXBlYXQgPSBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID8gMSA6IEdURVNUX0ZMQUcocmVwZWF0KTsKKyAgLy8gUmVwZWF0cyBmb3JldmVyIGlmIHRoZSByZXBlYXQgY291bnQgaXMgbmVnYXRpdmUuCisgIGNvbnN0IGJvb2wgZm9yZXZlciA9IHJlcGVhdCA8IDA7CisgIGZvciAoaW50IGkgPSAwOyBmb3JldmVyIHx8IGkgIT0gcmVwZWF0OyBpKyspIHsKKyAgICAvLyBXZSB3YW50IHRvIHByZXNlcnZlIGZhaWx1cmVzIGdlbmVyYXRlZCBieSBhZC1ob2MgdGVzdAorICAgIC8vIGFzc2VydGlvbnMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKS4KKyAgICBDbGVhck5vbkFkSG9jVGVzdFJlc3VsdCgpOworCisgICAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gR2V0VGltZUluTWlsbGlzKCk7CisKKyAgICAvLyBTaHVmZmxlcyB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyBpZiByZXF1ZXN0ZWQuCisgICAgaWYgKGhhc190ZXN0c190b19ydW4gJiYgR1RFU1RfRkxBRyhzaHVmZmxlKSkgeworICAgICAgcmFuZG9tKCktPlJlc2VlZChyYW5kb21fc2VlZF8pOworICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBPblRlc3RJdGVyYXRpb25TdGFydCgpLAorICAgICAgLy8gc3VjaCB0aGF0IGEgdGVzdCBldmVudCBsaXN0ZW5lciBjYW4gc2VlIHRoZSBhY3R1YWwgdGVzdCBvcmRlcgorICAgICAgLy8gaW4gdGhlIGV2ZW50LgorICAgICAgU2h1ZmZsZVRlc3RzKCk7CisgICAgfQorCisgICAgLy8gVGVsbHMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCB0aGUgdGVzdHMgYXJlIGFib3V0IHRvIHN0YXJ0LgorICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25TdGFydCgqcGFyZW50XywgaSk7CisKKyAgICAvLyBSdW5zIGVhY2ggdGVzdCBjYXNlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB0ZXN0IHRvIHJ1bi4KKyAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1bikgeworICAgICAgLy8gU2V0cyB1cCBhbGwgZW52aXJvbm1lbnRzIGJlZm9yZWhhbmQuCisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KCpwYXJlbnRfKTsKKyAgICAgIEZvckVhY2goZW52aXJvbm1lbnRzXywgU2V0VXBFbnZpcm9ubWVudCk7CisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcEVuZCgqcGFyZW50Xyk7CisKKyAgICAgIC8vIFJ1bnMgdGhlIHRlc3RzIG9ubHkgaWYgdGhlcmUgd2FzIG5vIGZhdGFsIGZhaWx1cmUgZHVyaW5nIGdsb2JhbAorICAgICAgLy8gc2V0LXVwLgorICAgICAgaWYgKCFUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgeworICAgICAgICBmb3IgKGludCB0ZXN0X2luZGV4ID0gMDsgdGVzdF9pbmRleCA8IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOworICAgICAgICAgICAgIHRlc3RfaW5kZXgrKykgeworICAgICAgICAgIEdldE11dGFibGVUZXN0Q2FzZSh0ZXN0X2luZGV4KS0+UnVuKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVGVhcnMgZG93biBhbGwgZW52aXJvbm1lbnRzIGluIHJldmVyc2Ugb3JkZXIgYWZ0ZXJ3YXJkcy4KKyAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoKnBhcmVudF8pOworICAgICAgc3RkOjpmb3JfZWFjaChlbnZpcm9ubWVudHNfLnJiZWdpbigpLCBlbnZpcm9ubWVudHNfLnJlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgVGVhckRvd25FbnZpcm9ubWVudCk7CisgICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCgqcGFyZW50Xyk7CisgICAgfQorCisgICAgZWxhcHNlZF90aW1lXyA9IEdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQ7CisKKyAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVyIHRoYXQgdGhlIHRlc3RzIGhhdmUganVzdCBmaW5pc2hlZC4KKyAgICByZXBlYXRlci0+T25UZXN0SXRlcmF0aW9uRW5kKCpwYXJlbnRfLCBpKTsKKworICAgIC8vIEdldHMgdGhlIHJlc3VsdCBhbmQgY2xlYXJzIGl0LgorICAgIGlmICghUGFzc2VkKCkpIHsKKyAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHRlc3Qgb3JkZXIgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi4gIFRoaXMKKyAgICAvLyBhbGxvd3MgdGhlIHVzZXIgdG8gcXVpY2tseSByZXBybyBhIGZhaWx1cmUgdGhhdCBoYXBwZW5zIGluIHRoZQorICAgIC8vIE4tdGggaXRlcmF0aW9uIHdpdGhvdXQgcmVwZWF0aW5nIHRoZSBmaXJzdCAoTiAtIDEpIGl0ZXJhdGlvbnMuCisgICAgLy8gVGhpcyBpcyBub3QgZW5jbG9zZWQgaW4gImlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7IC4uLiB9IiwgaW4KKyAgICAvLyBjYXNlIHRoZSB1c2VyIHNvbWVob3cgY2hhbmdlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgc29tZXdoZXJlCisgICAgLy8gKGl0J3MgYWx3YXlzIHNhZmUgdG8gdW5zaHVmZmxlIHRoZSB0ZXN0cykuCisgICAgVW5zaHVmZmxlVGVzdHMoKTsKKworICAgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7CisgICAgICAvLyBQaWNrcyBhIG5ldyByYW5kb20gc2VlZCBmb3IgZWFjaCBpdGVyYXRpb24uCisgICAgICByYW5kb21fc2VlZF8gPSBHZXROZXh0UmFuZG9tU2VlZChyYW5kb21fc2VlZF8pOworICAgIH0KKyAgfQorCisgIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtRW5kKCpwYXJlbnRfKTsKKworICByZXR1cm4gIWZhaWxlZDsKK30KKworLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQorLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCisvLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90CisvLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgordm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHRlc3Rfc2hhcmRfZmlsZSA9IHBvc2l4OjpHZXRFbnYoa1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOworICBpZiAodGVzdF9zaGFyZF9maWxlICE9IE5VTEwpIHsKKyAgICBGSUxFKiBjb25zdCBmaWxlID0gcG9zaXg6OkZPcGVuKHRlc3Rfc2hhcmRfZmlsZSwgInciKTsKKyAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CisgICAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byB0aGUgdGVzdCBzaGFyZCBzdGF0dXMgZmlsZSBcIiVzXCIgIgorICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIGJ5IHRoZSAlcyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiIsCisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc2hhcmRfZmlsZSwga1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICAgIGZjbG9zZShmaWxlKTsKKyAgfQorfQorCisvLyBDaGVja3Mgd2hldGhlciBzaGFyZGluZyBpcyBlbmFibGVkIGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcy4gSWYgdGhlIHZhcmlhYmxlcyBhcmUgcHJlc2VudCwKKy8vIGJ1dCBpbmNvbnNpc3RlbnQgKGkuZS4sIHNoYXJkX2luZGV4ID49IHRvdGFsX3NoYXJkcyksIHByaW50cworLy8gYW4gZXJyb3IgYW5kIGV4aXRzLiBJZiBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0LCBzaGFyZGluZyBpcworLy8gZGlzYWJsZWQgYmVjYXVzZSBpdCBtdXN0IG9ubHkgYmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgdGVzdAorLy8gcHJvY2Vzcy4gT3RoZXJ3aXNlLCB3ZSBjb3VsZCBmaWx0ZXIgb3V0IGRlYXRoIHRlc3RzIHdlIGludGVuZGVkIHRvIGV4ZWN1dGUuCitib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19lbnYsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X2VudiwKKyAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KSB7CisgIGlmIChpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gSW50MzJGcm9tRW52T3JEaWUodG90YWxfc2hhcmRzX2VudiwgLTEpOworICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKHNoYXJkX2luZGV4X2VudiwgLTEpOworCisgIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodG90YWxfc2hhcmRzID09IC0xICYmIHNoYXJkX2luZGV4ICE9IC0xKSB7CisgICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKKyAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogeW91IGhhdmUgIgorICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPSAiIDw8IHNoYXJkX2luZGV4CisgICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiIHVuc2V0LlxuIjsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgIT0gLTEgJiYgc2hhcmRfaW5kZXggPT0gLTEpIHsKKyAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCisgICAgICA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgPSAiIDw8IHRvdGFsX3NoYXJkcworICAgICAgPDwgIiwgYnV0IGhhdmUgbGVmdCAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIHVuc2V0LlxuIjsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfSBlbHNlIGlmIChzaGFyZF9pbmRleCA8IDAgfHwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSB7CisgICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKKyAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogd2UgcmVxdWlyZSAwIDw9ICIKKyAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIDwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzCisgICAgICA8PCAiLCBidXQgeW91IGhhdmUgIiA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIj0iIDw8IHNoYXJkX2luZGV4CisgICAgICA8PCAiLCAiIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIj0iIDw8IHRvdGFsX3NoYXJkcyA8PCAiLlxuIjsKKyAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorCisgIHJldHVybiB0b3RhbF9zaGFyZHMgPiAxOworfQorCisvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHZhciBhcyBhbiBJbnQzMi4gSWYgaXQgaXMgdW5zZXQsCisvLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvcgorLy8gYW5kIGFib3J0cy4KK0ludDMyIEludDMyRnJvbUVudk9yRGllKGNvbnN0IGNoYXIqIHZhciwgSW50MzIgZGVmYXVsdF92YWwpIHsKKyAgY29uc3QgY2hhciogc3RyX3ZhbCA9IHBvc2l4OjpHZXRFbnYodmFyKTsKKyAgaWYgKHN0cl92YWwgPT0gTlVMTCkgeworICAgIHJldHVybiBkZWZhdWx0X3ZhbDsKKyAgfQorCisgIEludDMyIHJlc3VsdDsKKyAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiVGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgdmFyLAorICAgICAgICAgICAgICAgICAgc3RyX3ZhbCwgJnJlc3VsdCkpIHsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gR2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMsIHRoZSBzaGFyZCBpbmRleCwgYW5kIHRoZSB0ZXN0IGlkLAorLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBzaG91bGQgYmUgcnVuIG9uIHRoaXMgc2hhcmQuIFRoZSB0ZXN0IGlkIGlzCisvLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdAorLy8gbWV0aG9kLiBBc3N1bWVzIHRoYXQgMCA8PSBzaGFyZF9pbmRleCA8IHRvdGFsX3NoYXJkcy4KK2Jvb2wgU2hvdWxkUnVuVGVzdE9uU2hhcmQoaW50IHRvdGFsX3NoYXJkcywgaW50IHNoYXJkX2luZGV4LCBpbnQgdGVzdF9pZCkgeworICByZXR1cm4gKHRlc3RfaWQgJSB0b3RhbF9zaGFyZHMpID09IHNoYXJkX2luZGV4OworfQorCisvLyBDb21wYXJlcyB0aGUgbmFtZSBvZiBlYWNoIHRlc3Qgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIHRvCisvLyBkZWNpZGUgd2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgcnVuLCB0aGVuIHJlY29yZHMgdGhlIHJlc3VsdCBpbgorLy8gZWFjaCBUZXN0Q2FzZSBhbmQgVGVzdEluZm8gb2JqZWN0LgorLy8gSWYgc2hhcmRfdGVzdHMgPT0gdHJ1ZSwgZnVydGhlciBmaWx0ZXJzIHRlc3RzIGJhc2VkIG9uIHNoYXJkaW5nCisvLyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50IC0gc2VlCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3RBZHZhbmNlZEd1aWRlLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KK2ludCBVbml0VGVzdEltcGw6OkZpbHRlclRlc3RzKFJlYWN0aW9uVG9TaGFyZGluZyBzaGFyZF90ZXN0cykgeworICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCA/CisgICAgICBJbnQzMkZyb21FbnZPckRpZShrVGVzdFRvdGFsU2hhcmRzLCAtMSkgOiAtMTsKKyAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCA/CisgICAgICBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKSA6IC0xOworCisgIC8vIG51bV9ydW5uYWJsZV90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHdpbGwKKyAgLy8gcnVuIGFjcm9zcyBhbGwgc2hhcmRzIChpLmUuLCBtYXRjaCBmaWx0ZXIgYW5kIGFyZSBub3QgZGlzYWJsZWQpLgorICAvLyBudW1fc2VsZWN0ZWRfdGVzdHMgYXJlIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcnVuIG9uCisgIC8vIHRoaXMgc2hhcmQuCisgIGludCBudW1fcnVubmFibGVfdGVzdHMgPSAwOworICBpbnQgbnVtX3NlbGVjdGVkX3Rlc3RzID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VzX1tpXTsKKyAgICBjb25zdCBTdHJpbmcgJnRlc3RfY2FzZV9uYW1lID0gdGVzdF9jYXNlLT5uYW1lKCk7CisgICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bihmYWxzZSk7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgeworICAgICAgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsKKyAgICAgIGNvbnN0IFN0cmluZyB0ZXN0X25hbWUodGVzdF9pbmZvLT5uYW1lKCkpOworICAgICAgLy8gQSB0ZXN0IGlzIGRpc2FibGVkIGlmIHRlc3QgY2FzZSBuYW1lIG9yIHRlc3QgbmFtZSBtYXRjaGVzCisgICAgICAvLyBrRGlzYWJsZVRlc3RGaWx0ZXIuCisgICAgICBjb25zdCBib29sIGlzX2Rpc2FibGVkID0KKyAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKSB8fAorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKTsKKyAgICAgIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfID0gaXNfZGlzYWJsZWQ7CisKKyAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlc19maWx0ZXIgPQorICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk7CisgICAgICB0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXyA9IG1hdGNoZXNfZmlsdGVyOworCisgICAgICBjb25zdCBib29sIGlzX3J1bm5hYmxlID0KKyAgICAgICAgICAoR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgfHwgIWlzX2Rpc2FibGVkKSAmJgorICAgICAgICAgIG1hdGNoZXNfZmlsdGVyOworCisgICAgICBjb25zdCBib29sIGlzX3NlbGVjdGVkID0gaXNfcnVubmFibGUgJiYKKyAgICAgICAgICAoc2hhcmRfdGVzdHMgPT0gSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MIHx8CisgICAgICAgICAgIFNob3VsZFJ1blRlc3RPblNoYXJkKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ydW5uYWJsZV90ZXN0cykpOworCisgICAgICBudW1fcnVubmFibGVfdGVzdHMgKz0gaXNfcnVubmFibGU7CisgICAgICBudW1fc2VsZWN0ZWRfdGVzdHMgKz0gaXNfc2VsZWN0ZWQ7CisKKyAgICAgIHRlc3RfaW5mby0+c2hvdWxkX3J1bl8gPSBpc19zZWxlY3RlZDsKKyAgICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4odGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgfHwgaXNfc2VsZWN0ZWQpOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX3NlbGVjdGVkX3Rlc3RzOworfQorCisvLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCit2b2lkIFVuaXRUZXN0SW1wbDo6TGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gdGVzdF9jYXNlc19baV07CisgICAgYm9vbCBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgeworICAgICAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9CisgICAgICAgICAgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOworICAgICAgaWYgKHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfKSB7CisgICAgICAgIGlmICghcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSkgeworICAgICAgICAgIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSB0cnVlOworICAgICAgICAgIHByaW50ZigiJXMuXG4iLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCIgICVzXG4iLCB0ZXN0X2luZm8tPm5hbWUoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZmbHVzaChzdGRvdXQpOworfQorCisvLyBTZXRzIHRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuCisvLworLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGFyZQorLy8gdGhlIHNhbWU7IG90aGVyd2lzZSwgZGVsZXRlcyB0aGUgb2xkIGdldHRlciBhbmQgbWFrZXMgdGhlIGlucHV0IHRoZQorLy8gY3VycmVudCBnZXR0ZXIuCit2b2lkIFVuaXRUZXN0SW1wbDo6c2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcigKKyAgICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcikgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyAhPSBnZXR0ZXIpIHsKKyAgICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKKyAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gZ2V0dGVyOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOworLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQKKy8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCitPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIFVuaXRUZXN0SW1wbDo6b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCkgeworICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9PSBOVUxMKSB7CisgICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IG5ldyBPc1N0YWNrVHJhY2VHZXR0ZXI7CisgIH0KKworICByZXR1cm4gb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKK30KKworLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgorLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCitUZXN0UmVzdWx0KiBVbml0VGVzdEltcGw6OmN1cnJlbnRfdGVzdF9yZXN1bHQoKSB7CisgIHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb18gPworICAgICAgJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pIDogJmFkX2hvY190ZXN0X3Jlc3VsdF87Cit9CisKKy8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKKy8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpTaHVmZmxlVGVzdHMoKSB7CisgIC8vIFNodWZmbGVzIHRoZSBkZWF0aCB0ZXN0IGNhc2VzLgorICBTaHVmZmxlUmFuZ2UocmFuZG9tKCksIDAsIGxhc3RfZGVhdGhfdGVzdF9jYXNlXyArIDEsICZ0ZXN0X2Nhc2VfaW5kaWNlc18pOworCisgIC8vIFNodWZmbGVzIHRoZSBub24tZGVhdGggdGVzdCBjYXNlcy4KKyAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VzXy5zaXplKCkpLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKKworICAvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW5zaWRlIGVhY2ggdGVzdCBjYXNlLgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7CisgICAgdGVzdF9jYXNlc19baV0tPlNodWZmbGVUZXN0cyhyYW5kb20oKSk7CisgIH0KK30KKworLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KK3ZvaWQgVW5pdFRlc3RJbXBsOjpVbnNodWZmbGVUZXN0cygpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgeworICAgIC8vIFVuc2h1ZmZsZXMgdGhlIHRlc3RzIGluIGVhY2ggdGVzdCBjYXNlLgorICAgIHRlc3RfY2FzZXNfW2ldLT5VbnNodWZmbGVUZXN0cygpOworICAgIC8vIFJlc2V0cyB0aGUgaW5kZXggb2YgZWFjaCB0ZXN0IGNhc2UuCisgICAgdGVzdF9jYXNlX2luZGljZXNfW2ldID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGEgU3RyaW5nLgorLy8KKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5CisvLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgorLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0CisvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscworLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCisvLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCitTdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChVbml0VGVzdCogLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lwX2NvdW50KSB7CisgIC8vIFdlIHBhc3Mgc2tpcF9jb3VudCArIDEgdG8gc2tpcCB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gaW4gYWRkaXRpb24KKyAgLy8gdG8gd2hhdCB0aGUgdXNlciByZWFsbHkgd2FudHMgdG8gc2tpcC4KKyAgcmV0dXJuIEdldFVuaXRUZXN0SW1wbCgpLT5DdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKHNraXBfY291bnQgKyAxKTsKK30KKworLy8gVXNlZCBieSB0aGUgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyBtYWNybyB0bworLy8gc3VwcHJlc3MgdW5yZWFjaGFibGUgY29kZSB3YXJuaW5ncy4KK25hbWVzcGFjZSB7CitjbGFzcyBDbGFzc1VuaXF1ZVRvQWx3YXlzVHJ1ZSB7fTsKK30KKworYm9vbCBJc1RydWUoYm9vbCBjb25kaXRpb24pIHsgcmV0dXJuIGNvbmRpdGlvbjsgfQorCitib29sIEFsd2F5c1RydWUoKSB7CisjaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKyAgLy8gVGhpcyBjb25kaXRpb24gaXMgYWx3YXlzIGZhbHNlIHNvIEFsd2F5c1RydWUoKSBuZXZlciBhY3R1YWxseSB0aHJvd3MsCisgIC8vIGJ1dCBpdCBtYWtlcyB0aGUgY29tcGlsZXIgdGhpbmsgdGhhdCBpdCBtYXkgdGhyb3cuCisgIGlmIChJc1RydWUoZmFsc2UpKQorICAgIHRocm93IENsYXNzVW5pcXVlVG9BbHdheXNUcnVlKCk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisgIHJldHVybiB0cnVlOworfQorCisvLyBJZiAqcHN0ciBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBtb2RpZmllcyAqcHN0ciB0byBiZSByaWdodAorLy8gcGFzdCB0aGUgcHJlZml4IGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnBzdHIgdW5jaGFuZ2VkCisvLyBhbmQgcmV0dXJucyBmYWxzZS4gIE5vbmUgb2YgcHN0ciwgKnBzdHIsIGFuZCBwcmVmaXggY2FuIGJlIE5VTEwuCitib29sIFNraXBQcmVmaXgoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiogcHN0cikgeworICBjb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOworICBpZiAoc3RybmNtcCgqcHN0ciwgcHJlZml4LCBwcmVmaXhfbGVuKSA9PSAwKSB7CisgICAgKnBzdHIgKz0gcHJlZml4X2xlbjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBhcyBhIGNvbW1hbmQgbGluZSBmbGFnLiAgVGhlIHN0cmluZyBzaG91bGQgaGF2ZQorLy8gdGhlIGZvcm1hdCAiLS1mbGFnPXZhbHVlIi4gIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIHRoZSAiPXZhbHVlIgorLy8gcGFydCBjYW4gYmUgb21pdHRlZC4KKy8vCisvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZywgb3IgTlVMTCBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCitjb25zdCBjaGFyKiBQYXJzZUZsYWdWYWx1ZShjb25zdCBjaGFyKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZfb3B0aW9uYWwpIHsKKyAgLy8gc3RyIGFuZCBmbGFnIG11c3Qgbm90IGJlIE5VTEwuCisgIGlmIChzdHIgPT0gTlVMTCB8fCBmbGFnID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIC8vIFRoZSBmbGFnIG11c3Qgc3RhcnQgd2l0aCAiLS0iIGZvbGxvd2VkIGJ5IEdURVNUX0ZMQUdfUFJFRklYXy4KKyAgY29uc3QgU3RyaW5nIGZsYWdfc3RyID0gU3RyaW5nOjpGb3JtYXQoIi0tJXMlcyIsIEdURVNUX0ZMQUdfUFJFRklYXywgZmxhZyk7CisgIGNvbnN0IHNpemVfdCBmbGFnX2xlbiA9IGZsYWdfc3RyLmxlbmd0aCgpOworICBpZiAoc3RybmNtcChzdHIsIGZsYWdfc3RyLmNfc3RyKCksIGZsYWdfbGVuKSAhPSAwKSByZXR1cm4gTlVMTDsKKworICAvLyBTa2lwcyB0aGUgZmxhZyBuYW1lLgorICBjb25zdCBjaGFyKiBmbGFnX2VuZCA9IHN0ciArIGZsYWdfbGVuOworCisgIC8vIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIGl0J3MgT0sgdG8gbm90IGhhdmUgYSAiPXZhbHVlIiBwYXJ0LgorICBpZiAoZGVmX29wdGlvbmFsICYmIChmbGFnX2VuZFswXSA9PSAnXDAnKSkgeworICAgIHJldHVybiBmbGFnX2VuZDsKKyAgfQorCisgIC8vIElmIGRlZl9vcHRpb25hbCBpcyB0cnVlIGFuZCB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZQorICAvLyBmbGFnIG5hbWUsIG9yIGlmIGRlZl9vcHRpb25hbCBpcyBmYWxzZSwgdGhlcmUgbXVzdCBiZSBhICc9JyBhZnRlcgorICAvLyB0aGUgZmxhZyBuYW1lLgorICBpZiAoZmxhZ19lbmRbMF0gIT0gJz0nKSByZXR1cm4gTlVMTDsKKworICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgYWZ0ZXIgIj0iLgorICByZXR1cm4gZmxhZ19lbmQgKyAxOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGEgYm9vbCBmbGFnLCBpbiB0aGUgZm9ybSBvZiBlaXRoZXIKKy8vICItLWZsYWc9dmFsdWUiIG9yICItLWZsYWciLgorLy8KKy8vIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIHZhbHVlIGlzIHRha2VuIGFzIHRydWUgYXMgbG9uZyBhcyBpdCBkb2VzCisvLyBub3Qgc3RhcnQgd2l0aCAnMCcsICdmJywgb3IgJ0YnLgorLy8KKy8vIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHZhbHVlIGlzIHRha2VuIGFzIHRydWUuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VCb29sRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIHRydWUpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdmFsdWUgdG8gYSBib29sLgorICAqdmFsdWUgPSAhKCp2YWx1ZV9zdHIgPT0gJzAnIHx8ICp2YWx1ZV9zdHIgPT0gJ2YnIHx8ICp2YWx1ZV9zdHIgPT0gJ0YnKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYW4gSW50MzIgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlSW50MzJGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgSW50MzIqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgIHJldHVybiBQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiVGhlIHZhbHVlIG9mIGZsYWcgLS0iIDw8IGZsYWcsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0ciwgdmFsdWUpOworfQorCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGEgc3RyaW5nIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZVN0cmluZ0ZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBTdHJpbmcqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgICp2YWx1ZSA9IHZhbHVlX3N0cjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBoYXMgYSBwcmVmaXggdGhhdCBHb29nbGUgVGVzdCB1c2VzIGZvciBpdHMKKy8vIGZsYWdzLCBpLmUuLCBzdGFydHMgd2l0aCBHVEVTVF9GTEFHX1BSRUZJWF8gb3IgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8uCisvLyBJZiBHb29nbGUgVGVzdCBkZXRlY3RzIHRoYXQgYSBjb21tYW5kIGxpbmUgZmxhZyBoYXMgaXRzIHByZWZpeCBidXQgaXMgbm90CisvLyByZWNvZ25pemVkLCBpdCB3aWxsIHByaW50IGl0cyBoZWxwIG1lc3NhZ2UuIEZsYWdzIHN0YXJ0aW5nIHdpdGgKKy8vIEdURVNUX0lOVEVSTkFMX1BSRUZJWF8gZm9sbG93ZWQgYnkgImludGVybmFsXyIgYXJlIGNvbnNpZGVyZWQgR29vZ2xlIFRlc3QKKy8vIGludGVybmFsIGZsYWdzIGFuZCBkbyBub3QgdHJpZ2dlciB0aGUgaGVscCBtZXNzYWdlLgorc3RhdGljIGJvb2wgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiAoU2tpcFByZWZpeCgiLS0iLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoIi0iLCAmc3RyKSB8fAorICAgICAgICAgIFNraXBQcmVmaXgoIi8iLCAmc3RyKSkgJiYKKyAgICAgICAgICFTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXyAiaW50ZXJuYWxfIiwgJnN0cikgJiYKKyAgICAgICAgIChTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXywgJnN0cikgfHwKKyAgICAgICAgICBTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLCAmc3RyKSk7Cit9CisKKy8vIFByaW50cyBhIHN0cmluZyBjb250YWluaW5nIGNvZGUtZW5jb2RlZCB0ZXh0LiAgVGhlIGZvbGxvd2luZyBlc2NhcGUKKy8vIHNlcXVlbmNlcyBjYW4gYmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNvbnRyb2wgdGhlIHRleHQgY29sb3I6CisvLworLy8gICBAQCAgICBwcmludHMgYSBzaW5nbGUgJ0AnIGNoYXJhY3Rlci4KKy8vICAgQFIgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gcmVkLgorLy8gICBARyAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byBncmVlbi4KKy8vICAgQFkgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8geWVsbG93LgorLy8gICBARCAgICBjaGFuZ2VzIHRvIHRoZSBkZWZhdWx0IHRlcm1pbmFsIHRleHQgY29sb3IuCisvLworLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFdyaXRlIHRlc3RzIGZvciB0aGlzIG9uY2Ugd2UgYWRkIHN0ZG91dAorLy8gY2FwdHVyaW5nIHRvIEdvb2dsZSBUZXN0Lgorc3RhdGljIHZvaWQgUHJpbnRDb2xvckVuY29kZWQoY29uc3QgY2hhciogc3RyKSB7CisgIEdUZXN0Q29sb3IgY29sb3IgPSBDT0xPUl9ERUZBVUxUOyAgLy8gVGhlIGN1cnJlbnQgY29sb3IuCisKKyAgLy8gQ29uY2VwdHVhbGx5LCB3ZSBzcGxpdCB0aGUgc3RyaW5nIGludG8gc2VnbWVudHMgZGl2aWRlZCBieSBlc2NhcGUKKyAgLy8gc2VxdWVuY2VzLiAgVGhlbiB3ZSBwcmludCBvbmUgc2VnbWVudCBhdCBhIHRpbWUuICBBdCB0aGUgZW5kIG9mCisgIC8vIGVhY2ggaXRlcmF0aW9uLCB0aGUgc3RyIHBvaW50ZXIgYWR2YW5jZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgLy8gbmV4dCBzZWdtZW50LgorICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciogcCA9IHN0cmNocihzdHIsICdAJyk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiJXMiLCBTdHJpbmcoc3RyLCBwIC0gc3RyKS5jX3N0cigpKTsKKworICAgIGNvbnN0IGNoYXIgY2ggPSBwWzFdOworICAgIHN0ciA9IHAgKyAyOworICAgIGlmIChjaCA9PSAnQCcpIHsKKyAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICJAIik7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnRCcpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfREVGQVVMVDsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdSJykgeworICAgICAgY29sb3IgPSBDT0xPUl9SRUQ7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnRycpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfR1JFRU47CisgICAgfSBlbHNlIGlmIChjaCA9PSAnWScpIHsKKyAgICAgIGNvbG9yID0gQ09MT1JfWUVMTE9XOworICAgIH0gZWxzZSB7CisgICAgICAtLXN0cjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIga0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlW10gPQorIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nICIgR1RFU1RfTkFNRV8gIi4gWW91IGNhbiB1c2UgdGhlXG4iCisiZm9sbG93aW5nIGNvbW1hbmQgbGluZSBmbGFncyB0byBjb250cm9sIGl0cyBiZWhhdmlvcjpcbiIKKyJcbiIKKyJUZXN0IFNlbGVjdGlvbjpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAibGlzdF90ZXN0c0BEXG4iCisiICAgICAgTGlzdCB0aGUgbmFtZXMgb2YgYWxsIHRlc3RzIGluc3RlYWQgb2YgcnVubmluZyB0aGVtLiBUaGUgbmFtZSBvZlxuIgorIiAgICAgIFRFU1QoRm9vLCBCYXIpIGlzIFwiRm9vLkJhclwiLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJmaWx0ZXI9QFlQT1NUSVZFX1BBVFRFUk5TIgorICAgICJbQEctQFlORUdBVElWRV9QQVRURVJOU11ARFxuIgorIiAgICAgIFJ1biBvbmx5IHRoZSB0ZXN0cyB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBidXRcbiIKKyIgICAgICBub25lIG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4gJz8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXI7ICcqJ1xuIgorIiAgICAgIG1hdGNoZXMgYW55IHN1YnN0cmluZzsgJzonIHNlcGFyYXRlcyB0d28gcGF0dGVybnMuXG4iCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzQERcbiIKKyIgICAgICBSdW4gYWxsIGRpc2FibGVkIHRlc3RzIHRvby5cbiIKKyJcbiIKKyJUZXN0IEV4ZWN1dGlvbjpcbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAicmVwZWF0PUBZW0NPVU5UXUBEXG4iCisiICAgICAgUnVuIHRoZSB0ZXN0cyByZXBlYXRlZGx5OyB1c2UgYSBuZWdhdGl2ZSBjb3VudCB0byByZXBlYXQgZm9yZXZlci5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic2h1ZmZsZUBEXG4iCisiICAgICAgUmFuZG9taXplIHRlc3RzJyBvcmRlcnMgb24gZXZlcnkgaXRlcmF0aW9uLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyYW5kb21fc2VlZD1AWVtOVU1CRVJdQERcbiIKKyIgICAgICBSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIGZvciBzaHVmZmxpbmcgdGVzdCBvcmRlcnMgKGJldHdlZW4gMSBhbmRcbiIKKyIgICAgICA5OTk5OSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUpLlxuIgorIlxuIgorIlRlc3QgT3V0cHV0OlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjb2xvcj1AWShAR3llc0BZfEBHbm9AWXxAR2F1dG9AWSlARFxuIgorIiAgICAgIEVuYWJsZS9kaXNhYmxlIGNvbG9yZWQgb3V0cHV0LiBUaGUgZGVmYXVsdCBpcyBAR2F1dG9ARC5cbiIKKyIgIC1ARy0iIEdURVNUX0ZMQUdfUFJFRklYXyAicHJpbnRfdGltZT0wQERcbiIKKyIgICAgICBEb24ndCBwcmludCB0aGUgZWxhcHNlZCB0aW1lIG9mIGVhY2ggdGVzdC5cbiIKKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAib3V0cHV0PXhtbEBZW0BHOkBZRElSRUNUT1JZX1BBVEhARyIKKyAgICBHVEVTVF9QQVRIX1NFUF8gIkBZfEBHOkBZRklMRV9QQVRIXUBEXG4iCisiICAgICAgR2VuZXJhdGUgYW4gWE1MIHJlcG9ydCBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IG9yIHdpdGggdGhlIGdpdmVuIGZpbGVcbiIKKyIgICAgICBuYW1lLiBAWUZJTEVfUEFUSEBEIGRlZmF1bHRzIHRvIEBHdGVzdF9kZXRhaWxzLnhtbEBELlxuIgorI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KKyIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic3RyZWFtX3Jlc3VsdF90bz1AWUhPU1RARzpAWVBPUlRARFxuIgorIiAgICAgIFN0cmVhbSB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHNlcnZlci5cbiIKKyNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXworIlxuIgorIkFzc2VydGlvbiBCZWhhdmlvcjpcbiIKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUworIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJkZWF0aF90ZXN0X3N0eWxlPUBZKEBHZmFzdEBZfEBHdGhyZWFkc2FmZUBZKUBEXG4iCisiICAgICAgU2V0IHRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuXG4iCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCisiICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImJyZWFrX29uX2ZhaWx1cmVARFxuIgorIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gZGVidWdnZXIgYnJlYWstcG9pbnRzLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJ0aHJvd19vbl9mYWlsdXJlQERcbiIKKyIgICAgICBUdXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvIEMrKyBleGNlcHRpb25zLlxuIgorIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjYXRjaF9leGNlcHRpb25zPTBARFxuIgorIiAgICAgIERvIG5vdCByZXBvcnQgZXhjZXB0aW9ucyBhcyB0ZXN0IGZhaWx1cmVzLiBJbnN0ZWFkLCBhbGxvdyB0aGVtXG4iCisiICAgICAgdG8gY3Jhc2ggdGhlIHByb2dyYW0gb3IgdGhyb3cgYSBwb3AtdXAgKG9uIFdpbmRvd3MpLlxuIgorIlxuIgorIkV4Y2VwdCBmb3IgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQEQsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQgIgorICAgICJ0aGUgY29ycmVzcG9uZGluZ1xuIgorImVudmlyb25tZW50IHZhcmlhYmxlIG9mIGEgZmxhZyAoYWxsIGxldHRlcnMgaW4gdXBwZXItY2FzZSkuIEZvciBleGFtcGxlLCB0b1xuIgorImRpc2FibGUgY29sb3JlZCB0ZXh0IG91dHB1dCwgeW91IGNhbiBlaXRoZXIgc3BlY2lmeSBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8KKyAgICAiY29sb3I9bm9ARCBvciBzZXRcbiIKKyJ0aGUgQEciIEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiQ09MT1JARCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBAR25vQEQuXG4iCisiXG4iCisiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkIHRoZSAiIEdURVNUX05BTUVfICIgZG9jdW1lbnRhdGlvbiBhdFxuIgorIkBHIiBHVEVTVF9QUk9KRUNUX1VSTF8gIkBELiBJZiB5b3UgZmluZCBhIGJ1ZyBpbiAiIEdURVNUX05BTUVfICJcbiIKKyIobm90IG9uZSBpbiB5b3VyIG93biBjb2RlIG9yIHRlc3RzKSwgcGxlYXNlIHJlcG9ydCBpdCB0b1xuIgorIkBHPCIgR1RFU1RfREVWX0VNQUlMXyAiPkBELlxuIjsKKworLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZworLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuICBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlCisvLyBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3ZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgeworICBmb3IgKGludCBpID0gMTsgaSA8ICphcmdjOyBpKyspIHsKKyAgICBjb25zdCBTdHJpbmcgYXJnX3N0cmluZyA9IFN0cmVhbWFibGVUb1N0cmluZyhhcmd2W2ldKTsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBhcmcgPSBhcmdfc3RyaW5nLmNfc3RyKCk7CisKKyAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VCb29sRmxhZzsKKyAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VJbnQzMkZsYWc7CisgICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlU3RyaW5nRmxhZzsKKworICAgIC8vIERvIHdlIHNlZSBhIEdvb2dsZSBUZXN0IGZsYWc/CisgICAgaWYgKFBhcnNlQm9vbEZsYWcoYXJnLCBrQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSkgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtCcmVha09uRmFpbHVyZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQ2F0Y2hFeGNlcHRpb25zRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0NvbG9yRmxhZywgJkdURVNUX0ZMQUcoY29sb3IpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRGVhdGhUZXN0U3R5bGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrRGVhdGhUZXN0VXNlRm9yaywKKyAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ZpbHRlckZsYWcsICZHVEVTVF9GTEFHKGZpbHRlcikpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrTGlzdFRlc3RzRmxhZywgJkdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtPdXRwdXRGbGFnLCAmR1RFU1RfRkxBRyhvdXRwdXQpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1ByaW50VGltZUZsYWcsICZHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB8fAorICAgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtSYW5kb21TZWVkRmxhZywgJkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKSB8fAorICAgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtSZXBlYXRGbGFnLCAmR1RFU1RfRkxBRyhyZXBlYXQpKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1NodWZmbGVGbGFnLCAmR1RFU1RfRkxBRyhzaHVmZmxlKSkgfHwKKyAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrU3RhY2tUcmFjZURlcHRoRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpKSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrU3RyZWFtUmVzdWx0VG9GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykpIHx8CisgICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrVGhyb3dPbkZhaWx1cmVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKQorICAgICAgICApIHsKKyAgICAgIC8vIFllcy4gIFNoaWZ0IHRoZSByZW1haW5kZXIgb2YgdGhlIGFyZ3YgbGlzdCBsZWZ0IGJ5IG9uZS4gIE5vdGUKKyAgICAgIC8vIHRoYXQgYXJndiBoYXMgKCphcmdjICsgMSkgZWxlbWVudHMsIHRoZSBsYXN0IG9uZSBhbHdheXMgYmVpbmcKKyAgICAgIC8vIE5VTEwuICBUaGUgZm9sbG93aW5nIGxvb3AgbW92ZXMgdGhlIHRyYWlsaW5nIE5VTEwgZWxlbWVudCBhcworICAgICAgLy8gd2VsbC4KKyAgICAgIGZvciAoaW50IGogPSBpOyBqICE9ICphcmdjOyBqKyspIHsKKyAgICAgICAgYXJndltqXSA9IGFyZ3ZbaiArIDFdOworICAgICAgfQorCisgICAgICAvLyBEZWNyZW1lbnRzIHRoZSBhcmd1bWVudCBjb3VudC4KKyAgICAgICgqYXJnYyktLTsKKworICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGRlY3JlbWVudCB0aGUgaXRlcmF0b3IgYXMgd2UganVzdCByZW1vdmVkCisgICAgICAvLyBhbiBlbGVtZW50LgorICAgICAgaS0tOworICAgIH0gZWxzZSBpZiAoYXJnX3N0cmluZyA9PSAiLS1oZWxwIiB8fCBhcmdfc3RyaW5nID09ICItaCIgfHwKKyAgICAgICAgICAgICAgIGFyZ19zdHJpbmcgPT0gIi0/IiB8fCBhcmdfc3RyaW5nID09ICIvPyIgfHwKKyAgICAgICAgICAgICAgIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGFyZykpIHsKKyAgICAgIC8vIEJvdGggaGVscCBmbGFnIGFuZCB1bnJlY29nbml6ZWQgR29vZ2xlIFRlc3QgZmxhZ3MgKGV4Y2x1ZGluZworICAgICAgLy8gaW50ZXJuYWwgb25lcykgdHJpZ2dlciBoZWxwIGRpc3BsYXkuCisgICAgICBnX2hlbHBfZmxhZyA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKGdfaGVscF9mbGFnKSB7CisgICAgLy8gV2UgcHJpbnQgdGhlIGhlbHAgaGVyZSBpbnN0ZWFkIG9mIGluIFJVTl9BTExfVEVTVFMoKSwgYXMgdGhlCisgICAgLy8gbGF0dGVyIG1heSBub3QgYmUgY2FsbGVkIGF0IGFsbCBpZiB0aGUgdXNlciBpcyB1c2luZyBHb29nbGUKKyAgICAvLyBUZXN0IHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yay4KKyAgICBQcmludENvbG9yRW5jb2RlZChrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2UpOworICB9Cit9CisKKy8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKKy8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0Lgordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndikgeworICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOworfQordm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgeworICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOworfQorCisvLyBUaGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgSW5pdEdvb2dsZVRlc3QoKS4KKy8vCisvLyBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvcgorLy8gd2NoYXJfdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK3ZvaWQgSW5pdEdvb2dsZVRlc3RJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7CisgIGdfaW5pdF9ndGVzdF9jb3VudCsrOworCisgIC8vIFdlIGRvbid0IHdhbnQgdG8gcnVuIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHR3aWNlLgorICBpZiAoZ19pbml0X2d0ZXN0X2NvdW50ICE9IDEpIHJldHVybjsKKworICBpZiAoKmFyZ2MgPD0gMCkgcmV0dXJuOworCisgIGludGVybmFsOjpnX2V4ZWN1dGFibGVfcGF0aCA9IGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoYXJndlswXSk7CisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIGdfYXJndnMuY2xlYXIoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgIT0gKmFyZ2M7IGkrKykgeworICAgIGdfYXJndnMucHVzaF9iYWNrKFN0cmVhbWFibGVUb1N0cmluZyhhcmd2W2ldKSk7CisgIH0KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisgIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShhcmdjLCBhcmd2KTsKKyAgR2V0VW5pdFRlc3RJbXBsKCktPlBvc3RGbGFnUGFyc2luZ0luaXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEluaXRpYWxpemVzIEdvb2dsZSBUZXN0LiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZworLy8gUlVOX0FMTF9URVNUUygpLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUKKy8vIGZsYWdzIHRoYXQgR29vZ2xlIFRlc3QgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIFRlc3QgZmxhZyBpcworLy8gc2VlbiwgaXQgaXMgcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KKy8vCisvLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgVGVzdCBmbGFnIHZhcmlhYmxlcyBhcmUKKy8vIHVwZGF0ZWQuCisvLworLy8gQ2FsbGluZyB0aGUgZnVuY3Rpb24gZm9yIHRoZSBzZWNvbmQgdGltZSBoYXMgbm8gdXNlci12aXNpYmxlIGVmZmVjdC4KK3ZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCBjaGFyKiogYXJndikgeworICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOworfQorCisvLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCisvLyBVTklDT0RFIG1vZGUuCit2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsKKyAgaW50ZXJuYWw6OkluaXRHb29nbGVUZXN0SW1wbChhcmdjLCBhcmd2KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRlYXRoIHRlc3RzLgorCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisjIGlmIEdURVNUX09TX01BQworIyAgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZW5kaWYgIC8vIEdURVNUX09TX01BQworCisjIGluY2x1ZGUgPGVycm5vLmg+CisjIGluY2x1ZGUgPGZjbnRsLmg+CisjIGluY2x1ZGUgPGxpbWl0cy5oPgorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTCisjICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjICBpbmNsdWRlIDxzeXMvd2FpdC5oPgorIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKworLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncworLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCisvLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bworLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCisvLyBoaXMgY29kZS4KKyNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKKyN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBDb25zdGFudHMuCisKKy8vIFRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuCitzdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdERlYXRoVGVzdFN0eWxlW10gPSAiZmFzdCI7CisKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGRlYXRoX3Rlc3Rfc3R5bGUsCisgICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZGVhdGhfdGVzdF9zdHlsZSIsIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGUpLAorICAgICJJbmRpY2F0ZXMgaG93IHRvIHJ1biBhIGRlYXRoIHRlc3QgaW4gYSBmb3JrZWQgY2hpbGQgcHJvY2VzczogIgorICAgICJcInRocmVhZHNhZmVcIiAoY2hpbGQgcHJvY2VzcyByZS1leGVjdXRlcyB0aGUgdGVzdCBiaW5hcnkgIgorICAgICJmcm9tIHRoZSBiZWdpbm5pbmcsIHJ1bm5pbmcgb25seSB0aGUgc3BlY2lmaWMgZGVhdGggdGVzdCkgb3IgIgorICAgICJcImZhc3RcIiAoY2hpbGQgcHJvY2VzcyBydW5zIHRoZSBkZWF0aCB0ZXN0IGltbWVkaWF0ZWx5ICIKKyAgICAiYWZ0ZXIgZm9ya2luZykuIik7CisKK0dURVNUX0RFRklORV9ib29sXygKKyAgICBkZWF0aF90ZXN0X3VzZV9mb3JrLAorICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3VzZV9mb3JrIiwgZmFsc2UpLAorICAgICJJbnN0cnVjdHMgdG8gdXNlIGZvcmsoKS9fZXhpdCgpIGluc3RlYWQgb2YgY2xvbmUoKSBpbiBkZWF0aCB0ZXN0cy4gIgorICAgICJJZ25vcmVkIGFuZCBhbHdheXMgdXNlcyBmb3JrKCkgb24gUE9TSVggc3lzdGVtcyB3aGVyZSBjbG9uZSgpIGlzIG5vdCAiCisgICAgImltcGxlbWVudGVkLiBVc2VmdWwgd2hlbiBydW5uaW5nIHVuZGVyIHZhbGdyaW5kIG9yIHNpbWlsYXIgdG9vbHMgaWYgIgorICAgICJ0aG9zZSBkbyBub3Qgc3VwcG9ydCBjbG9uZSgpLiBWYWxncmluZCAzLjMuMSB3aWxsIGp1c3QgZmFpbCBpZiAiCisgICAgIml0IHNlZXMgYW4gdW5zdXBwb3J0ZWQgY29tYmluYXRpb24gb2YgY2xvbmUoKSBmbGFncy4gIgorICAgICJJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmxhZyB3L28gdmFsZ3JpbmQgdGhvdWdoIGl0IHdpbGwgIgorICAgICJ3b3JrIGluIDk5JSBvZiB0aGUgY2FzZXMuIE9uY2UgdmFsZ3JpbmQgaXMgZml4ZWQsIHRoaXMgZmxhZyB3aWxsICIKKyAgICAibW9zdCBsaWtlbHkgYmUgcmVtb3ZlZC4iKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK0dURVNUX0RFRklORV9zdHJpbmdfKAorICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0LCAiIiwKKyAgICAiSW5kaWNhdGVzIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgdGVtcG9yYWwgaW5kZXggb2YgIgorICAgICJ0aGUgc2luZ2xlIGRlYXRoIHRlc3QgdG8gcnVuLCBhbmQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gIgorICAgICJ3aGljaCBhIHN1Y2Nlc3MgY29kZSBtYXkgYmUgc2VudCwgYWxsIHNlcGFyYXRlZCBieSAiCisgICAgImNvbG9ucy4gIFRoaXMgZmxhZyBpcyBzcGVjaWZpZWQgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cnJlbnQgIgorICAgICJwcm9jZXNzIGlzIGEgc3ViLXByb2Nlc3MgbGF1bmNoZWQgZm9yIHJ1bm5pbmcgYSB0aHJlYWQtc2FmZSAiCisgICAgImRlYXRoIHRlc3QuICBGT1IgSU5URVJOQUwgVVNFIE9OTFkuIik7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEV4aXRlZFdpdGhDb2RlIGNvbnN0cnVjdG9yLgorRXhpdGVkV2l0aENvZGU6OkV4aXRlZFdpdGhDb2RlKGludCBleGl0X2NvZGUpIDogZXhpdF9jb2RlXyhleGl0X2NvZGUpIHsKK30KKworLy8gRXhpdGVkV2l0aENvZGUgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KK2Jvb2wgRXhpdGVkV2l0aENvZGU6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7CisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gZXhpdF9zdGF0dXMgPT0gZXhpdF9jb2RlXzsKKworIyBlbHNlCisKKyAgcmV0dXJuIFdJRkVYSVRFRChleGl0X3N0YXR1cykgJiYgV0VYSVRTVEFUVVMoZXhpdF9zdGF0dXMpID09IGV4aXRfY29kZV87CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gS2lsbGVkQnlTaWduYWwgY29uc3RydWN0b3IuCitLaWxsZWRCeVNpZ25hbDo6S2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSkgOiBzaWdudW1fKHNpZ251bSkgeworfQorCisvLyBLaWxsZWRCeVNpZ25hbCBmdW5jdGlvbi1jYWxsIG9wZXJhdG9yLgorYm9vbCBLaWxsZWRCeVNpZ25hbDo6b3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0IHsKKyAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfc3RhdHVzKSAmJiBXVEVSTVNJRyhleGl0X3N0YXR1cykgPT0gc2lnbnVtXzsKK30KKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFV0aWxpdGllcyBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgorCisvLyBHZW5lcmF0ZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gZXhpdCBjb2RlLCBpbiB0aGUgZm9ybWF0CisvLyBzcGVjaWZpZWQgYnkgd2FpdCgyKS4KK3N0YXRpYyBTdHJpbmcgRXhpdFN1bW1hcnkoaW50IGV4aXRfY29kZSkgeworICBNZXNzYWdlIG07CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworCisgIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgZXhpdF9jb2RlOworCisjIGVsc2UKKworICBpZiAoV0lGRVhJVEVEKGV4aXRfY29kZSkpIHsKKyAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7CisgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIlRlcm1pbmF0ZWQgYnkgc2lnbmFsICIgPDwgV1RFUk1TSUcoZXhpdF9jb2RlKTsKKyAgfQorIyAgaWZkZWYgV0NPUkVEVU1QCisgIGlmIChXQ09SRURVTVAoZXhpdF9jb2RlKSkgeworICAgIG0gPDwgIiAoY29yZSBkdW1wZWQpIjsKKyAgfQorIyAgZW5kaWYKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAorLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCitib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cykgeworICByZXR1cm4gIUV4aXRlZFdpdGhDb2RlKDApKGV4aXRfc3RhdHVzKTsKK30KKworIyBpZiAhR1RFU1RfT1NfV0lORE9XUworLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiBhIGRlYXRoIHRlc3QgZmluZHMgbW9yZSB0aGFuCisvLyBvbmUgdGhyZWFkIHJ1bm5pbmcsIG9yIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBwcmlvcgorLy8gdG8gZXhlY3V0aW5nIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisvLyBjYWxsZXIgbm90IHRvIHBhc3MgYSB0aHJlYWRfY291bnQgb2YgMS4KK3N0YXRpYyBTdHJpbmcgRGVhdGhUZXN0VGhyZWFkV2FybmluZyhzaXplX3QgdGhyZWFkX2NvdW50KSB7CisgIE1lc3NhZ2UgbXNnOworICBtc2cgPDwgIkRlYXRoIHRlc3RzIHVzZSBmb3JrKCksIHdoaWNoIGlzIHVuc2FmZSBwYXJ0aWN1bGFybHkiCisgICAgICA8PCAiIGluIGEgdGhyZWFkZWQgY29udGV4dC4gRm9yIHRoaXMgdGVzdCwgIiA8PCBHVEVTVF9OQU1FXyA8PCAiICI7CisgIGlmICh0aHJlYWRfY291bnQgPT0gMCkKKyAgICBtc2cgPDwgImNvdWxkbid0IGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIjsKKyAgZWxzZQorICAgIG1zZyA8PCAiZGV0ZWN0ZWQgIiA8PCB0aHJlYWRfY291bnQgPDwgIiB0aHJlYWRzLiI7CisgIHJldHVybiBtc2cuR2V0U3RyaW5nKCk7Cit9CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBGbGFnIGNoYXJhY3RlcnMgZm9yIHJlcG9ydGluZyBhIGRlYXRoIHRlc3QgdGhhdCBkaWQgbm90IGRpZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RMaXZlZCA9ICdMJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RSZXR1cm5lZCA9ICdSJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RUaHJldyA9ICdUJzsKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yID0gJ0knOworCisvLyBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgd2F5cyB0aGF0IGEgZGVhdGggdGVzdCBjYW4KKy8vIGNvbmNsdWRlLiAgRElFRCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGRpZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0CisvLyBjb2RlOyBMSVZFRCBtZWFucyB0aGF0IHByb2Nlc3MgbGl2ZWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHRlc3QgY29kZTsKKy8vIFJFVFVSTkVEIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50IGF0dGVtcHRlZCB0byBleGVjdXRlIGEgcmV0dXJuCisvLyBzdGF0ZW1lbnQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkOyBUSFJFVyBtZWFucyB0aGF0IHRoZSB0ZXN0IHN0YXRlbWVudAorLy8gcmV0dXJuZWQgY29udHJvbCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24uICBJTl9QUk9HUkVTUyBtZWFucyB0aGUgdGVzdAorLy8gaGFzIG5vdCB5ZXQgY29uY2x1ZGVkLgorLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogVW5pZnkgbmFtZXMgYW5kIHBvc3NpYmx5IHZhbHVlcyBmb3IKKy8vIEFib3J0UmVhc29uLCBEZWF0aFRlc3RPdXRjb21lLCBhbmQgZmxhZyBjaGFyYWN0ZXJzIGFib3ZlLgorZW51bSBEZWF0aFRlc3RPdXRjb21lIHsgSU5fUFJPR1JFU1MsIERJRUQsIExJVkVELCBSRVRVUk5FRCwgVEhSRVcgfTsKKworLy8gUm91dGluZSBmb3IgYWJvcnRpbmcgdGhlIHByb2dyYW0gd2hpY2ggaXMgc2FmZSB0byBjYWxsIGZyb20gYW4KKy8vIGV4ZWMtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBlcnJvcgorLy8gbWVzc2FnZSBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCB0aGUKKy8vIG1lc3NhZ2UgaXMgc2ltcGx5IHByaW50ZWQgdG8gc3RkZXJyLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwcm9ncmFtCisvLyB0aGVuIGV4aXRzIHdpdGggc3RhdHVzIDEuCit2b2lkIERlYXRoVGVzdEFib3J0KGNvbnN0IFN0cmluZyYgbWVzc2FnZSkgeworICAvLyBPbiBhIFBPU0lYIHN5c3RlbSwgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gYSB0aHJlYWRzYWZlLXN0eWxlCisgIC8vIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcywgd2hpY2ggb3BlcmF0ZXMgb24gYSB2ZXJ5IHNtYWxsIHN0YWNrLiAgVXNlCisgIC8vIHRoZSBoZWFwIGZvciBhbnkgYWRkaXRpb25hbCBub24tbWludXNjdWxlIG1lbW9yeSByZXF1aXJlbWVudHMuCisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBHZXRVbml0VGVzdEltcGwoKS0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOworICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgRklMRSogcGFyZW50ID0gcG9zaXg6OkZET3BlbihmbGFnLT53cml0ZV9mZCgpLCAidyIpOworICAgIGZwdXRjKGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yLCBwYXJlbnQpOworICAgIGZwcmludGYocGFyZW50LCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChwYXJlbnQpOworICAgIF9leGl0KDEpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHBvc2l4OjpBYm9ydCgpOworICB9Cit9CisKKy8vIEEgcmVwbGFjZW1lbnQgZm9yIENIRUNLIHRoYXQgY2FsbHMgRGVhdGhUZXN0QWJvcnQgaWYgdGhlIGFzc2VydGlvbgorLy8gZmFpbHMuCisjIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhleHByZXNzaW9uKSBcCisgIGRvIHsgXAorICAgIGlmICghOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGV4cHJlc3Npb24pKSB7IFwKKyAgICAgIERlYXRoVGVzdEFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzo6Rm9ybWF0KCBcCisgICAgICAgICAgIkNIRUNLIGZhaWxlZDogRmlsZSAlcywgbGluZSAlZDogJXMiLCBcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjZXhwcmVzc2lvbikpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIFRoaXMgbWFjcm8gaXMgc2ltaWxhciB0byBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXywgYnV0IGl0IGlzIG1lYW50IGZvcgorLy8gZXZhbHVhdGluZyBhbnkgc3lzdGVtIGNhbGwgdGhhdCBmdWxmaWxscyB0d28gY29uZGl0aW9uczogaXQgbXVzdCByZXR1cm4KKy8vIC0xIG9uIGZhaWx1cmUsIGFuZCBzZXQgZXJybm8gdG8gRUlOVFIgd2hlbiBpdCBpcyBpbnRlcnJ1cHRlZCBhbmQKKy8vIHNob3VsZCBiZSB0cmllZCBhZ2Fpbi4gIFRoZSBtYWNybyBleHBhbmRzIHRvIGEgbG9vcCB0aGF0IHJlcGVhdGVkbHkKKy8vIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhcyBsb25nIGFzIGl0IGV2YWx1YXRlcyB0byAtMSBhbmQgc2V0cworLy8gZXJybm8gdG8gRUlOVFIuICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gLTEgYnV0IGVycm5vIGlzCisvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBFSU5UUiwgRGVhdGhUZXN0QWJvcnQgaXMgY2FsbGVkLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhleHByZXNzaW9uKSBcCisgIGRvIHsgXAorICAgIGludCBndGVzdF9yZXR2YWw7IFwKKyAgICBkbyB7IFwKKyAgICAgIGd0ZXN0X3JldHZhbCA9IChleHByZXNzaW9uKTsgXAorICAgIH0gd2hpbGUgKGd0ZXN0X3JldHZhbCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKKyAgICBpZiAoZ3Rlc3RfcmV0dmFsID09IC0xKSB7IFwKKyAgICAgIERlYXRoVGVzdEFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZzo6Rm9ybWF0KCBcCisgICAgICAgICAgIkNIRUNLIGZhaWxlZDogRmlsZSAlcywgbGluZSAlZDogJXMgIT0gLTEiLCBcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjZXhwcmVzc2lvbikpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCisKKy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaW4gZXJybm8uCitTdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIFN0cmluZyhlcnJubyA9PSAwID8gIiIgOiBwb3NpeDo6U3RyRXJyb3IoZXJybm8pKTsKK30KKworLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIGRlYXRoIHRlc3QgcGFyZW50IHByb2Nlc3MgdG8gcmVhZCBhIGZhaWx1cmUKKy8vIG1lc3NhZ2UgZnJvbSB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGFuZCBsb2cgaXQgd2l0aCB0aGUgRkFUQUwKKy8vIHNldmVyaXR5LiBPbiBXaW5kb3dzLCB0aGUgbWVzc2FnZSBpcyByZWFkIGZyb20gYSBwaXBlIGhhbmRsZS4gT24gb3RoZXIKKy8vIHBsYXRmb3JtcywgaXQgaXMgcmVhZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLgorc3RhdGljIHZvaWQgRmFpbEZyb21JbnRlcm5hbEVycm9yKGludCBmZCkgeworICBNZXNzYWdlIGVycm9yOworICBjaGFyIGJ1ZmZlclsyNTZdOworICBpbnQgbnVtX3JlYWQ7CisKKyAgZG8geworICAgIHdoaWxlICgobnVtX3JlYWQgPSBwb3NpeDo6UmVhZChmZCwgYnVmZmVyLCAyNTUpKSA+IDApIHsKKyAgICAgIGJ1ZmZlcltudW1fcmVhZF0gPSAnXDAnOworICAgICAgZXJyb3IgPDwgYnVmZmVyOworICAgIH0KKyAgfSB3aGlsZSAobnVtX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChudW1fcmVhZCA9PSAwKSB7CisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgZXJyb3IuR2V0U3RyaW5nKCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGxhc3RfZXJyb3IgPSBlcnJubzsKKyAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWF0aCB0ZXN0IGludGVybmFsOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSA8PCAiIFsiIDw8IGxhc3RfZXJyb3IgPDwgIl0iOworICB9Cit9CisKKy8vIERlYXRoIHRlc3QgY29uc3RydWN0b3IuICBJbmNyZW1lbnRzIHRoZSBydW5uaW5nIGRlYXRoIHRlc3QgY291bnQKKy8vIGZvciB0aGUgY3VycmVudCB0ZXN0LgorRGVhdGhUZXN0OjpEZWF0aFRlc3QoKSB7CisgIFRlc3RJbmZvKiBjb25zdCBpbmZvID0gR2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7CisgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICBEZWF0aFRlc3RBYm9ydCgiQ2Fubm90IHJ1biBhIGRlYXRoIHRlc3Qgb3V0c2lkZSBvZiBhIFRFU1Qgb3IgIgorICAgICAgICAgICAgICAgICAgICJURVNUX0YgY29uc3RydWN0Iik7CisgIH0KK30KKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGRlYXRoIHRlc3QgYnkgZGlzcGF0Y2hpbmcgdG8gdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgZmFjdG9yeS4KK2Jvb2wgRGVhdGhUZXN0OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSB7CisgIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+ZGVhdGhfdGVzdF9mYWN0b3J5KCktPkNyZWF0ZSgKKyAgICAgIHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUsIHRlc3QpOworfQorCitjb25zdCBjaGFyKiBEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkgeworICByZXR1cm4gbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfLmNfc3RyKCk7Cit9CisKK3ZvaWQgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3QgU3RyaW5nJiBtZXNzYWdlKSB7CisgIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXyA9IG1lc3NhZ2U7Cit9CisKK1N0cmluZyBEZWF0aFRlc3Q6Omxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKKworLy8gUHJvdmlkZXMgY3Jvc3MgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgZGVhdGggZnVuY3Rpb25hbGl0eS4KK2NsYXNzIERlYXRoVGVzdEltcGwgOiBwdWJsaWMgRGVhdGhUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIERlYXRoVGVzdEltcGwoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQorICAgICAgOiBzdGF0ZW1lbnRfKGFfc3RhdGVtZW50KSwKKyAgICAgICAgcmVnZXhfKGFfcmVnZXgpLAorICAgICAgICBzcGF3bmVkXyhmYWxzZSksCisgICAgICAgIHN0YXR1c18oLTEpLAorICAgICAgICBvdXRjb21lXyhJTl9QUk9HUkVTUyksCisgICAgICAgIHJlYWRfZmRfKC0xKSwKKyAgICAgICAgd3JpdGVfZmRfKC0xKSB7fQorCisgIC8vIHJlYWRfZmRfIGlzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZCBhbmQgY2xlYXJlZCBieSBhIGRlcml2ZWQgY2xhc3MuCisgIH5EZWF0aFRlc3RJbXBsKCkgeyBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhyZWFkX2ZkXyA9PSAtMSk7IH0KKworICB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbik7CisgIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBzdGF0dXNfb2spOworCisgIGNvbnN0IGNoYXIqIHN0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlbWVudF87IH0KKyAgY29uc3QgUkUqIHJlZ2V4KCkgY29uc3QgeyByZXR1cm4gcmVnZXhfOyB9CisgIGJvb2wgc3Bhd25lZCgpIGNvbnN0IHsgcmV0dXJuIHNwYXduZWRfOyB9CisgIHZvaWQgc2V0X3NwYXduZWQoYm9vbCBpc19zcGF3bmVkKSB7IHNwYXduZWRfID0gaXNfc3Bhd25lZDsgfQorICBpbnQgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gc3RhdHVzXzsgfQorICB2b2lkIHNldF9zdGF0dXMoaW50IGFfc3RhdHVzKSB7IHN0YXR1c18gPSBhX3N0YXR1czsgfQorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWUoKSBjb25zdCB7IHJldHVybiBvdXRjb21lXzsgfQorICB2b2lkIHNldF9vdXRjb21lKERlYXRoVGVzdE91dGNvbWUgYW5fb3V0Y29tZSkgeyBvdXRjb21lXyA9IGFuX291dGNvbWU7IH0KKyAgaW50IHJlYWRfZmQoKSBjb25zdCB7IHJldHVybiByZWFkX2ZkXzsgfQorICB2b2lkIHNldF9yZWFkX2ZkKGludCBmZCkgeyByZWFkX2ZkXyA9IGZkOyB9CisgIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQorICB2b2lkIHNldF93cml0ZV9mZChpbnQgZmQpIHsgd3JpdGVfZmRfID0gZmQ7IH0KKworICAvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKyAgLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXworICAvLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluCisgIC8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KKyAgdm9pZCBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY29kZSB0aGlzIG9iamVjdCBpcyB0ZXN0aW5nLiAgVGhpcyBjbGFzcworICAvLyBkb2Vzbid0IG93biB0aGlzIHN0cmluZyBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgY2hhciogY29uc3Qgc3RhdGVtZW50XzsKKyAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCB0ZXN0IG91dHB1dCBtdXN0IG1hdGNoLiAgRGVhdGhUZXN0SW1wbAorICAvLyBkb2Vzbid0IG93biB0aGlzIG9iamVjdCBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KKyAgY29uc3QgUkUqIGNvbnN0IHJlZ2V4XzsKKyAgLy8gVHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLgorICBib29sIHNwYXduZWRfOworICAvLyBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuCisgIGludCBzdGF0dXNfOworICAvLyBIb3cgdGhlIGRlYXRoIHRlc3QgY29uY2x1ZGVkLgorICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWVfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSByZWFkIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gIEl0IGlzCisgIC8vIGFsd2F5cyAtMSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFRoZSBjaGlsZCBrZWVwcyBpdHMgd3JpdGUgZW5kIG9mIHRoZQorICAvLyBwaXBlIGluIHdyaXRlX2ZkXy4KKyAgaW50IHJlYWRfZmRfOworICAvLyBEZXNjcmlwdG9yIHRvIHRoZSBjaGlsZCdzIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgcGFyZW50IHByb2Nlc3MuCisgIC8vIEl0IGlzIGFsd2F5cyAtMSBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICBUaGUgcGFyZW50IGtlZXBzIGl0cyBlbmQgb2YgdGhlCisgIC8vIHBpcGUgaW4gcmVhZF9mZF8uCisgIGludCB3cml0ZV9mZF87Cit9OworCisvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKKy8vIHRlc3QgY2hpbGQgcHJvY2VzcyB2aWEgYSBwaXBlLCBpbnRlcnByZXRzIGl0IHRvIHNldCB0aGUgb3V0Y29tZV8KKy8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KKy8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KK3ZvaWQgRGVhdGhUZXN0SW1wbDo6UmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKSB7CisgIGNoYXIgZmxhZzsKKyAgaW50IGJ5dGVzX3JlYWQ7CisKKyAgLy8gVGhlIHJlYWQoKSBoZXJlIGJsb2NrcyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSAoc2lnbmlmeWluZyB0aGUKKyAgLy8gZmFpbHVyZSBvZiB0aGUgZGVhdGggdGVzdCkgb3IgdW50aWwgdGhlIHBpcGUgaXMgY2xvc2VkIChzaWduaWZ5aW5nCisgIC8vIGl0cyBzdWNjZXNzKSwgc28gaXQncyBva2F5IHRvIGNhbGwgdGhpcyBpbiB0aGUgcGFyZW50IGJlZm9yZQorICAvLyB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgZXhpdGVkLgorICBkbyB7CisgICAgYnl0ZXNfcmVhZCA9IHBvc2l4OjpSZWFkKHJlYWRfZmQoKSwgJmZsYWcsIDEpOworICB9IHdoaWxlIChieXRlc19yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgc2V0X291dGNvbWUoRElFRCk7CisgIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAxKSB7CisgICAgc3dpdGNoIChmbGFnKSB7CisgICAgICBjYXNlIGtEZWF0aFRlc3RSZXR1cm5lZDoKKyAgICAgICAgc2V0X291dGNvbWUoUkVUVVJORUQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0RlYXRoVGVzdFRocmV3OgorICAgICAgICBzZXRfb3V0Y29tZShUSFJFVyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrRGVhdGhUZXN0TGl2ZWQ6CisgICAgICAgIHNldF9vdXRjb21lKExJVkVEKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yOgorICAgICAgICBGYWlsRnJvbUludGVybmFsRXJyb3IocmVhZF9mZCgpKTsgIC8vIERvZXMgbm90IHJldHVybi4KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHJlcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInVuZXhwZWN0ZWQgc3RhdHVzIGJ5dGUgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihmbGFnKSA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJSZWFkIGZyb20gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7CisgIH0KKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhwb3NpeDo6Q2xvc2UocmVhZF9mZCgpKSk7CisgIHNldF9yZWFkX2ZkKC0xKTsKK30KKworLy8gU2lnbmFscyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNvZGUgd2hpY2ggc2hvdWxkIGhhdmUgZXhpdGVkLCBkaWRuJ3QuCisvLyBTaG91bGQgYmUgY2FsbGVkIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCisvLyBXcml0ZXMgYSBzdGF0dXMgYnl0ZSB0byB0aGUgY2hpbGQncyBzdGF0dXMgZmlsZSBkZXNjcmlwdG9yLCB0aGVuCisvLyBjYWxscyBfZXhpdCgxKS4KK3ZvaWQgRGVhdGhUZXN0SW1wbDo6QWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSB7CisgIC8vIFRoZSBwYXJlbnQgcHJvY2VzcyBjb25zaWRlcnMgdGhlIGRlYXRoIHRlc3QgdG8gYmUgYSBmYWlsdXJlIGlmCisgIC8vIGl0IGZpbmRzIGFueSBkYXRhIGluIG91ciBwaXBlLiAgU28sIGhlcmUgd2Ugd3JpdGUgYSBzaW5nbGUgZmxhZyBieXRlCisgIC8vIHRvIHRoZSBwaXBlLCB0aGVuIGV4aXQuCisgIGNvbnN0IGNoYXIgc3RhdHVzX2NoID0KKyAgICAgIHJlYXNvbiA9PSBURVNUX0RJRF9OT1RfRElFID8ga0RlYXRoVGVzdExpdmVkIDoKKyAgICAgIHJlYXNvbiA9PSBURVNUX1RIUkVXX0VYQ0VQVElPTiA/IGtEZWF0aFRlc3RUaHJldyA6IGtEZWF0aFRlc3RSZXR1cm5lZDsKKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpXcml0ZSh3cml0ZV9mZCgpLCAmc3RhdHVzX2NoLCAxKSk7CisgIC8vIFdlIGFyZSBsZWFraW5nIHRoZSBkZXNjcmlwdG9yIGhlcmUgYmVjYXVzZSBvbiBzb21lIHBsYXRmb3JtcyAoaS5lLiwKKyAgLy8gd2hlbiBidWlsdCBhcyBXaW5kb3dzIERMTCksIGRlc3RydWN0b3JzIG9mIGdsb2JhbCBvYmplY3RzIHdpbGwgc3RpbGwKKyAgLy8gcnVuIGFmdGVyIGNhbGxpbmcgX2V4aXQoKS4gT24gc3VjaCBzeXN0ZW1zLCB3cml0ZV9mZF8gd2lsbCBiZQorICAvLyBpbmRpcmVjdGx5IGNsb3NlZCBmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFVuaXRUZXN0SW1wbCwgY2F1c2luZyBkb3VibGUKKyAgLy8gY2xvc2UgaWYgaXQgaXMgYWxzbyBjbG9zZWQgaGVyZS4gT24gZGVidWcgY29uZmlndXJhdGlvbnMsIGRvdWJsZSBjbG9zZQorICAvLyBtYXkgYXNzZXJ0LiBBcyB0aGVyZSBhcmUgbm8gaW4tcHJvY2VzcyBidWZmZXJzIHRvIGZsdXNoIGhlcmUsIHdlIGFyZQorICAvLyByZWx5aW5nIG9uIHRoZSBPUyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciBhZnRlciB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzCisgIC8vIHdoZW4gdGhlIGRlc3RydWN0b3JzIGFyZSBub3QgcnVuLgorICBfZXhpdCgxKTsgIC8vIEV4aXRzIHcvbyBhbnkgbm9ybWFsIGV4aXQgaG9va3MgKHdlIHdlcmUgc3VwcG9zZWQgdG8gY3Jhc2gpCit9CisKKy8vIFJldHVybnMgYW4gaW5kZW50ZWQgY29weSBvZiBzdGRlcnIgb3V0cHV0IGZvciBhIGRlYXRoIHRlc3QuCisvLyBUaGlzIG1ha2VzIGRpc3Rpbmd1aXNoaW5nIGRlYXRoIHRlc3Qgb3V0cHV0IGxpbmVzIGZyb20gcmVndWxhciBsb2cgbGluZXMKKy8vIG11Y2ggZWFzaWVyLgorc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIG91dHB1dCkgeworICA6OnN0ZDo6c3RyaW5nIHJldDsKKyAgZm9yIChzaXplX3QgYXQgPSAwOyA7ICkgeworICAgIGNvbnN0IHNpemVfdCBsaW5lX2VuZCA9IG91dHB1dC5maW5kKCdcbicsIGF0KTsKKyAgICByZXQgKz0gIlsgIERFQVRIICAgXSAiOworICAgIGlmIChsaW5lX2VuZCA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0ICs9IG91dHB1dC5zdWJzdHIoYXQsIGxpbmVfZW5kICsgMSAtIGF0KTsKKyAgICBhdCA9IGxpbmVfZW5kICsgMTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBBc3Nlc3NlcyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIGEgZGVhdGggdGVzdCwgdXNpbmcgYm90aCBwcml2YXRlCisvLyBtZW1iZXJzIHdoaWNoIGhhdmUgcHJldmlvdXNseSBiZWVuIHNldCwgYW5kIG9uZSBhcmd1bWVudDoKKy8vCisvLyBQcml2YXRlIGRhdGEgbWVtYmVyczoKKy8vICAgb3V0Y29tZTogIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBkZWF0aCB0ZXN0CisvLyAgICAgICAgICAgICBjb25jbHVkZWQ6IERJRUQsIExJVkVELCBUSFJFVywgb3IgUkVUVVJORUQuICBUaGUgZGVhdGggdGVzdAorLy8gICAgICAgICAgICAgZmFpbHMgaW4gdGhlIGxhdHRlciB0aHJlZSBjYXNlcy4KKy8vICAgc3RhdHVzOiAgIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4gT24gKm5peCwgaXQgaXMgaW4gdGhlCisvLyAgICAgICAgICAgICBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB3YWl0KDIpLiBPbiBXaW5kb3dzLCB0aGlzIGlzIHRoZQorLy8gICAgICAgICAgICAgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIEV4aXRQcm9jZXNzKCkgQVBJIG9yIGEgbnVtZXJpYyBjb2RlCisvLyAgICAgICAgICAgICBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgdGVybWluYXRlZCB0aGUgcHJvZ3JhbS4KKy8vICAgcmVnZXg6ICAgIEEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCB0byBiZSBhcHBsaWVkIHRvCisvLyAgICAgICAgICAgICB0aGUgdGVzdCdzIGNhcHR1cmVkIHN0YW5kYXJkIGVycm9yIG91dHB1dDsgdGhlIGRlYXRoIHRlc3QKKy8vICAgICAgICAgICAgIGZhaWxzIGlmIGl0IGRvZXMgbm90IG1hdGNoLgorLy8KKy8vIEFyZ3VtZW50OgorLy8gICBzdGF0dXNfb2s6IHRydWUgaWYgZXhpdF9zdGF0dXMgaXMgYWNjZXB0YWJsZSBpbiB0aGUgY29udGV4dCBvZgorLy8gICAgICAgICAgICAgIHRoaXMgcGFydGljdWxhciBkZWF0aCB0ZXN0LCB3aGljaCBmYWlscyBpZiBpdCBpcyBmYWxzZQorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBtZXQuICBPdGhlcndpc2UsIHRoZQorLy8gZmlyc3QgZmFpbGluZyBjb25kaXRpb24sIGluIHRoZSBvcmRlciBnaXZlbiBhYm92ZSwgaXMgdGhlIG9uZSB0aGF0IGlzCisvLyByZXBvcnRlZC4gQWxzbyBzZXRzIHRoZSBsYXN0IGRlYXRoIHRlc3QgbWVzc2FnZSBzdHJpbmcuCitib29sIERlYXRoVGVzdEltcGw6OlBhc3NlZChib29sIHN0YXR1c19vaykgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgU3RyaW5nIGVycm9yX21lc3NhZ2UgPSBHZXRDYXB0dXJlZFN0ZGVycigpOworCisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICBNZXNzYWdlIGJ1ZmZlcjsKKworICBidWZmZXIgPDwgIkRlYXRoIHRlc3Q6ICIgPDwgc3RhdGVtZW50KCkgPDwgIlxuIjsKKyAgc3dpdGNoIChvdXRjb21lKCkpIHsKKyAgICBjYXNlIExJVkVEOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBmYWlsZWQgdG8gZGllLlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVXOgorICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiB0aHJldyBhbiBleGNlcHRpb24uXG4iCisgICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVUVVJORUQ6CisgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGlsbGVnYWwgcmV0dXJuIGluIHRlc3Qgc3RhdGVtZW50LlxuIgorICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJRUQ6CisgICAgICBpZiAoc3RhdHVzX29rKSB7CisgICAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlZCA9IFJFOjpQYXJ0aWFsTWF0Y2goZXJyb3JfbWVzc2FnZS5jX3N0cigpLCAqcmVnZXgoKSk7CisgICAgICAgIGlmIChtYXRjaGVkKSB7CisgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBlcnJvci5cbiIKKyAgICAgICAgICAgICAgICAgPDwgIiAgRXhwZWN0ZWQ6ICIgPDwgcmVnZXgoKS0+cGF0dGVybigpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBkaWVkIGJ1dCBub3Qgd2l0aCBleHBlY3RlZCBleGl0IGNvZGU6XG4iCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgIiA8PCBFeGl0U3VtbWFyeShzdGF0dXMoKSkgPDwgIlxuIgorICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU5fUFJPR1JFU1M6CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0xPR18oRkFUQUwpCisgICAgICAgICAgPDwgIkRlYXRoVGVzdDo6UGFzc2VkIHNvbWVob3cgY2FsbGVkIGJlZm9yZSBjb25jbHVzaW9uIG9mIHRlc3QiOworICB9CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoYnVmZmVyLkdldFN0cmluZygpKTsKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworLy8gV2luZG93c0RlYXRoVGVzdCBpbXBsZW1lbnRzIGRlYXRoIHRlc3RzIG9uIFdpbmRvd3MuIER1ZSB0byB0aGUKKy8vIHNwZWNpZmljcyBvZiBzdGFydGluZyBuZXcgcHJvY2Vzc2VzIG9uIFdpbmRvd3MsIGRlYXRoIHRlc3RzIHRoZXJlIGFyZQorLy8gYWx3YXlzIHRocmVhZHNhZmUsIGFuZCBHb29nbGUgVGVzdCBjb25zaWRlcnMgdGhlCisvLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9ZmFzdCBzZXR0aW5nIHRvIGJlIGVxdWl2YWxlbnQgdG8KKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT10aHJlYWRzYWZlIHRoZXJlLgorLy8KKy8vIEEgZmV3IGltcGxlbWVudGF0aW9uIG5vdGVzOiAgTGlrZSB0aGUgTGludXggdmVyc2lvbiwgdGhlIFdpbmRvd3MKKy8vIGltcGxlbWVudGF0aW9uIHVzZXMgcGlwZXMgZm9yIGNoaWxkLXRvLXBhcmVudCBjb21tdW5pY2F0aW9uLiBCdXQgZHVlIHRvCisvLyB0aGUgc3BlY2lmaWNzIG9mIHBpcGVzIG9uIFdpbmRvd3MsIHNvbWUgZXh0cmEgc3RlcHMgYXJlIHJlcXVpcmVkOgorLy8KKy8vIDEuIFRoZSBwYXJlbnQgY3JlYXRlcyBhIGNvbW11bmljYXRpb24gcGlwZSBhbmQgc3RvcmVzIGhhbmRsZXMgdG8gYm90aAorLy8gICAgZW5kcyBvZiBpdC4KKy8vIDIuIFRoZSBwYXJlbnQgc3RhcnRzIHRoZSBjaGlsZCBhbmQgcHJvdmlkZXMgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24KKy8vICAgIG5lY2Vzc2FyeSB0byBhY3F1aXJlIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4KKy8vIDMuIFRoZSBjaGlsZCBhY3F1aXJlcyB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIGFuZCBzaWduYWxzIHRoZSBwYXJlbnQKKy8vICAgIHVzaW5nIGEgV2luZG93cyBldmVudC4KKy8vIDQuIE5vdyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb24gaXRzIHNpZGUuIElmCisvLyAgICB0aGlzIGlzIGRvbmUgYmVmb3JlIHN0ZXAgMywgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBnb2VzIGRvd24gdG8KKy8vICAgIDAgYW5kIGl0IGlzIGRlc3Ryb3llZCwgcHJldmVudGluZyB0aGUgY2hpbGQgZnJvbSBhY3F1aXJpbmcgaXQuIFRoZQorLy8gICAgcGFyZW50IG5vdyBoYXMgdG8gcmVsZWFzZSBpdCwgb3IgcmVhZCBvcGVyYXRpb25zIG9uIHRoZSByZWFkIGVuZCBvZgorLy8gICAgdGhlIHBpcGUgd2lsbCBub3QgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCisvLyA1LiBUaGUgcGFyZW50IHJlYWRzIGNoaWxkJ3Mgb3V0cHV0IHRocm91Z2ggdGhlIHBpcGUgKG91dGNvbWUgY29kZSBhbmQKKy8vICAgIGFueSBwb3NzaWJsZSBlcnJvciBtZXNzYWdlcykgZnJvbSB0aGUgcGlwZSwgYW5kIGl0cyBzdGRlcnIgYW5kIHRoZW4KKy8vICAgIGRldGVybWluZXMgd2hldGhlciB0byBmYWlsIHRoZSB0ZXN0LgorLy8KKy8vIE5vdGU6IHRvIGRpc3Rpbmd1aXNoIFdpbjMyIEFQSSBjYWxscyBmcm9tIHRoZSBsb2NhbCBtZXRob2QgYW5kIGZ1bmN0aW9uCisvLyBjYWxscywgdGhlIGZvcm1lciBhcmUgZXhwbGljaXRseSByZXNvbHZlZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKy8vCitjbGFzcyBXaW5kb3dzRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgeworIHB1YmxpYzoKKyAgV2luZG93c0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQorICAgICAgOiBEZWF0aFRlc3RJbXBsKGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHt9CisKKyAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCisgIHZpcnR1YWwgaW50IFdhaXQoKTsKKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKKyAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCisgIGNvbnN0IGludCBsaW5lXzsKKyAgLy8gSGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MuCisgIEF1dG9IYW5kbGUgd3JpdGVfaGFuZGxlXzsKKyAgLy8gQ2hpbGQgcHJvY2VzcyBoYW5kbGUuCisgIEF1dG9IYW5kbGUgY2hpbGRfaGFuZGxlXzsKKyAgLy8gRXZlbnQgdGhlIGNoaWxkIHByb2Nlc3MgdXNlcyB0byBzaWduYWwgdGhlIHBhcmVudCB0aGF0IGl0IGhhcworICAvLyBhY3F1aXJlZCB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuIEFmdGVyIHNlZWluZyB0aGlzCisgIC8vIGV2ZW50IHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgaXRzIG93biBoYW5kbGVzIHRvIG1ha2Ugc3VyZSBpdHMKKyAgLy8gUmVhZEZpbGUoKSBjYWxscyByZXR1cm4gd2hlbiB0aGUgY2hpbGQgdGVybWluYXRlcy4KKyAgQXV0b0hhbmRsZSBldmVudF9oYW5kbGVfOworfTsKKworLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0CisvLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQorLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KK2ludCBXaW5kb3dzRGVhdGhUZXN0OjpXYWl0KCkgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBXYWl0IHVudGlsIHRoZSBjaGlsZCBlaXRoZXIgc2lnbmFscyB0aGF0IGl0IGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kCisgIC8vIG9mIHRoZSBwaXBlIG9yIGl0IGRpZXMuCisgIGNvbnN0IEhBTkRMRSB3YWl0X2hhbmRsZXNbMl0gPSB7IGNoaWxkX2hhbmRsZV8uR2V0KCksIGV2ZW50X2hhbmRsZV8uR2V0KCkgfTsKKyAgc3dpdGNoICg6OldhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9oYW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIFdhaXRzIGZvciBhbnkgb2YgdGhlIGhhbmRsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSkgeworICAgIGNhc2UgV0FJVF9PQkpFQ1RfMDoKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzAgKyAxOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZhbHNlKTsgIC8vIFNob3VsZCBub3QgZ2V0IGhlcmUuCisgIH0KKworICAvLyBUaGUgY2hpbGQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb3IgZXhpdGVkLgorICAvLyBXZSByZWxlYXNlIHRoZSBoYW5kbGUgb24gb3VyIHNpZGUgYW5kIGNvbnRpbnVlLgorICB3cml0ZV9oYW5kbGVfLlJlc2V0KCk7CisgIGV2ZW50X2hhbmRsZV8uUmVzZXQoKTsKKworICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgIC8vIFdhaXRzIGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBleGl0IGlmIGl0IGhhdmVuJ3QgYWxyZWFkeS4gVGhpcworICAvLyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjaGlsZCBoYXMgYWxyZWFkeSBleGl0ZWQsIHJlZ2FyZGxlc3Mgb2YKKyAgLy8gd2hldGhlciBwcmV2aW91cyBjYWxscyB0byBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIHN5bmNocm9uaXplZCBvbiB0aGlzCisgIC8vIGhhbmRsZSBvciBub3QuCisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAorICAgICAgV0FJVF9PQkpFQ1RfMCA9PSA6OldhaXRGb3JTaW5nbGVPYmplY3QoY2hpbGRfaGFuZGxlXy5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKSk7CisgIERXT1JEIHN0YXR1c19jb2RlOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIDo6R2V0RXhpdENvZGVQcm9jZXNzKGNoaWxkX2hhbmRsZV8uR2V0KCksICZzdGF0dXNfY29kZSkgIT0gRkFMU0UpOworICBjaGlsZF9oYW5kbGVfLlJlc2V0KCk7CisgIHNldF9zdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXNfY29kZSkpOworICByZXR1cm4gc3RhdHVzKCk7Cit9CisKKy8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgV2luZG93cyBkZWF0aCB0ZXN0LiAgSXQgY3JlYXRlcyBhIGNoaWxkCisvLyBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHJ1biB0aGUKKy8vIGRlYXRoIHRlc3QuICBUaGUgY2hpbGQgcHJvY2VzcyBpcyBnaXZlbiB0aGUgLS1ndGVzdF9maWx0ZXIgYW5kCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHN1Y2ggdGhhdCBpdCBrbm93cyB0byBydW4gdGhlCisvLyBjdXJyZW50IGRlYXRoIHRlc3Qgb25seS4KK0RlYXRoVGVzdDo6VGVzdFJvbGUgV2luZG93c0RlYXRoVGVzdDo6QXNzdW1lUm9sZSgpIHsKKyAgY29uc3QgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBpbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKKyAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICAvLyBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIGhhcyBwZXJmb3JtZWQgYWxsIHRoZSBuZWNlc3NhcnkKKyAgICAvLyBwcm9jZXNzaW5nLgorICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgLy8gV2luZG93c0RlYXRoVGVzdCB1c2VzIGFuIGFub255bW91cyBwaXBlIHRvIGNvbW11bmljYXRlIHJlc3VsdHMgb2YKKyAgLy8gYSBkZWF0aCB0ZXN0LgorICBTRUNVUklUWV9BVFRSSUJVVEVTIGhhbmRsZXNfYXJlX2luaGVyaXRhYmxlID0geworICAgIHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKSwgTlVMTCwgVFJVRSB9OworICBIQU5ETEUgcmVhZF9oYW5kbGUsIHdyaXRlX2hhbmRsZTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCisgICAgICA6OkNyZWF0ZVBpcGUoJnJlYWRfaGFuZGxlLCAmd3JpdGVfaGFuZGxlLCAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgMCkgIC8vIERlZmF1bHQgYnVmZmVyIHNpemUuCisgICAgICAhPSBGQUxTRSk7CisgIHNldF9yZWFkX2ZkKDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHJlYWRfaGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRE9OTFkpKTsKKyAgd3JpdGVfaGFuZGxlXy5SZXNldCh3cml0ZV9oYW5kbGUpOworICBldmVudF9oYW5kbGVfLlJlc2V0KDo6Q3JlYXRlRXZlbnQoCisgICAgICAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsCisgICAgICBUUlVFLCAgICAvLyBUaGUgZXZlbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIG5vbi1zaWduYWxlZCBzdGF0ZS4KKyAgICAgIEZBTFNFLCAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIGlzIG5vbi1zaWduYWxsZWQuCisgICAgICBOVUxMKSk7ICAvLyBUaGUgZXZlbiBpcyB1bm5hbWVkLgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhldmVudF9oYW5kbGVfLkdldCgpICE9IE5VTEwpOworICBjb25zdCBTdHJpbmcgZmlsdGVyX2ZsYWcgPSBTdHJpbmc6OkZvcm1hdCgiLS0lcyVzPSVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrRmlsdGVyRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bmFtZSgpKTsKKyAgY29uc3QgU3RyaW5nIGludGVybmFsX2ZsYWcgPSBTdHJpbmc6OkZvcm1hdCgKKyAgICAiLS0lcyVzPSVzfCVkfCVkfCV1fCVJdXwlSXUiLAorICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLAorICAgICAga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKKyAgICAgIGZpbGVfLCBsaW5lXywKKyAgICAgIGRlYXRoX3Rlc3RfaW5kZXgsCisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDo6R2V0Q3VycmVudFByb2Nlc3NJZCgpKSwKKyAgICAgIC8vIHNpemVfdCBoYXMgdGhlIHNhbWUgd2l0aCBhcyBwb2ludGVycyBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0CisgICAgICAvLyBXaW5kb3dzIHBsYXRmb3Jtcy4KKyAgICAgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvdGN4ZjFkdzYuYXNweC4KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih3cml0ZV9oYW5kbGUpLAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGV2ZW50X2hhbmRsZV8uR2V0KCkpKTsKKworICBjaGFyIGV4ZWN1dGFibGVfcGF0aFtfTUFYX1BBVEggKyAxXTsgIC8vIE5PTElOVAorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKKyAgICAgIF9NQVhfUEFUSCArIDEgIT0gOjpHZXRNb2R1bGVGaWxlTmFtZUEoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTUFYX1BBVEgpKTsKKworICBTdHJpbmcgY29tbWFuZF9saW5lID0gU3RyaW5nOjpGb3JtYXQoIiVzICVzIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldENvbW1hbmRMaW5lQSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2ZsYWcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gRmx1c2ggdGhlIGxvZyBidWZmZXJzIHNpbmNlIHRoZSBsb2cgc3RyZWFtcyBhcmUgc2hhcmVkIHdpdGggdGhlIGNoaWxkLgorICBGbHVzaEluZm9Mb2coKTsKKworICAvLyBUaGUgY2hpbGQgcHJvY2VzcyB3aWxsIHNoYXJlIHRoZSBzdGFuZGFyZCBoYW5kbGVzIHdpdGggdGhlIHBhcmVudC4KKyAgU1RBUlRVUElORk9BIHN0YXJ0dXBfaW5mbzsKKyAgbWVtc2V0KCZzdGFydHVwX2luZm8sIDAsIHNpemVvZihTVEFSVFVQSU5GTykpOworICBzdGFydHVwX2luZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOworICBzdGFydHVwX2luZm8uaFN0ZElucHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSk7CisgIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOworICBzdGFydHVwX2luZm8uaFN0ZEVycm9yID0gOjpHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKDo6Q3JlYXRlUHJvY2Vzc0EoCisgICAgICBleGVjdXRhYmxlX3BhdGgsCisgICAgICBjb25zdF9jYXN0PGNoYXIqPihjb21tYW5kX2xpbmUuY19zdHIoKSksCisgICAgICBOVUxMLCAgIC8vIFJldHVuZWQgcHJvY2VzcyBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHRocmVhZCBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgorICAgICAgVFJVRSwgICAvLyBDaGlsZCBpbmhlcml0cyBhbGwgaW5oZXJpdGFibGUgaGFuZGxlcyAoZm9yIHdyaXRlX2hhbmRsZV8pLgorICAgICAgMHgwLCAgICAvLyBEZWZhdWx0IGNyZWF0aW9uIGZsYWdzLgorICAgICAgTlVMTCwgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBlbnZpcm9ubWVudC4KKyAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpLAorICAgICAgJnN0YXJ0dXBfaW5mbywKKyAgICAgICZwcm9jZXNzX2luZm8pICE9IEZBTFNFKTsKKyAgY2hpbGRfaGFuZGxlXy5SZXNldChwcm9jZXNzX2luZm8uaFByb2Nlc3MpOworICA6OkNsb3NlSGFuZGxlKHByb2Nlc3NfaW5mby5oVGhyZWFkKTsKKyAgc2V0X3NwYXduZWQodHJ1ZSk7CisgIHJldHVybiBPVkVSU0VFX1RFU1Q7Cit9CisjIGVsc2UgIC8vIFdlIGFyZSBub3Qgb24gV2luZG93cy4KKworLy8gRm9ya2luZ0RlYXRoVGVzdCBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIG1vc3Qgb2YgdGhlIGFic3RyYWN0CisvLyBtZXRob2RzIG9mIHRoZSBEZWF0aFRlc3QgaW50ZXJmYWNlLiAgT25seSB0aGUgQXNzdW1lUm9sZSBtZXRob2QgaXMKKy8vIGxlZnQgdW5kZWZpbmVkLgorY2xhc3MgRm9ya2luZ0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKKyBwdWJsaWM6CisgIEZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgpOworCisgIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgorICB2aXJ0dWFsIGludCBXYWl0KCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0X2NoaWxkX3BpZChwaWRfdCBjaGlsZF9waWQpIHsgY2hpbGRfcGlkXyA9IGNoaWxkX3BpZDsgfQorCisgcHJpdmF0ZToKKyAgLy8gUElEIG9mIGNoaWxkIHByb2Nlc3MgZHVyaW5nIGRlYXRoIHRlc3Q7IDAgaW4gdGhlIGNoaWxkIHByb2Nlc3MgaXRzZWxmLgorICBwaWRfdCBjaGlsZF9waWRfOworfTsKKworLy8gQ29uc3RydWN0cyBhIEZvcmtpbmdEZWF0aFRlc3QuCitGb3JraW5nRGVhdGhUZXN0OjpGb3JraW5nRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkKKyAgICA6IERlYXRoVGVzdEltcGwoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLAorICAgICAgY2hpbGRfcGlkXygtMSkge30KKworLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0CisvLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQorLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KK2ludCBGb3JraW5nRGVhdGhUZXN0OjpXYWl0KCkgeworICBpZiAoIXNwYXduZWQoKSkKKyAgICByZXR1cm4gMDsKKworICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOworCisgIGludCBzdGF0dXNfdmFsdWU7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8od2FpdHBpZChjaGlsZF9waWRfLCAmc3RhdHVzX3ZhbHVlLCAwKSk7CisgIHNldF9zdGF0dXMoc3RhdHVzX3ZhbHVlKTsKKyAgcmV0dXJuIHN0YXR1c192YWx1ZTsKK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MsIHRoZW4gaW1tZWRpYXRlbHkgcnVucyB0aGUgdGVzdAorLy8gaW4gdGhlIGNoaWxkIHByb2Nlc3MuCitjbGFzcyBOb0V4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBOb0V4ZWNEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KSA6CisgICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7Cit9OworCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLXJ1biBkZWF0aCB0ZXN0LiAgSXQgaW1wbGVtZW50cyBhCisvLyBzdHJhaWdodGZvcndhcmQgZm9yaywgd2l0aCBhIHNpbXBsZSBwaXBlIHRvIHRyYW5zbWl0IHRoZSBzdGF0dXMgYnl0ZS4KK0RlYXRoVGVzdDo6VGVzdFJvbGUgTm9FeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBzaXplX3QgdGhyZWFkX2NvdW50ID0gR2V0VGhyZWFkQ291bnQoKTsKKyAgaWYgKHRocmVhZF9jb3VudCAhPSAxKSB7CisgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHRocmVhZF9jb3VudCk7CisgIH0KKworICBpbnQgcGlwZV9mZFsyXTsKKyAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocGlwZShwaXBlX2ZkKSAhPSAtMSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworICBDYXB0dXJlU3RkZXJyKCk7CisgIC8vIFdoZW4gd2UgZm9yayB0aGUgcHJvY2VzcyBiZWxvdywgdGhlIGxvZyBmaWxlIGJ1ZmZlcnMgYXJlIGNvcGllZCwgYnV0IHRoZQorICAvLyBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzaGFyZWQuICBXZSBmbHVzaCBhbGwgbG9nIGZpbGVzIGhlcmUgc28gdGhhdCBjbG9zaW5nCisgIC8vIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGluIHRoZSBjaGlsZCBwcm9jZXNzIGRvZXNuJ3QgdGhyb3cgb2ZmIHRoZQorICAvLyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkZXNjcmlwdG9ycyBhbmQgYnVmZmVycyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCisgIC8vIFRoaXMgaXMgYXMgY2xvc2UgdG8gdGhlIGZvcmsgYXMgcG9zc2libGUgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBjYXNlCisgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHJ1bm5pbmcgYmVmb3JlIHRoZSBkZWF0aCB0ZXN0LCBhbmQgYW5vdGhlcgorICAvLyB0aHJlYWQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZS4KKyAgRmx1c2hJbmZvTG9nKCk7CisKKyAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIGlmIChjaGlsZF9waWQgPT0gMCkgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFswXSkpOworICAgIHNldF93cml0ZV9mZChwaXBlX2ZkWzFdKTsKKyAgICAvLyBSZWRpcmVjdHMgYWxsIGxvZ2dpbmcgdG8gc3RkZXJyIGluIHRoZSBjaGlsZCBwcm9jZXNzIHRvIHByZXZlbnQKKyAgICAvLyBjb25jdXJyZW50IHdyaXRlcyB0byB0aGUgbG9nIGZpbGVzLiAgV2UgY2FwdHVyZSBzdGRlcnIgaW4gdGhlIHBhcmVudAorICAgIC8vIHByb2Nlc3MgYW5kIGFwcGVuZCB0aGUgY2hpbGQgcHJvY2Vzcycgb3V0cHV0IHRvIGEgbG9nLgorICAgIExvZ1RvU3RkZXJyKCk7CisgICAgLy8gRXZlbnQgZm9yd2FyZGluZyB0byB0aGUgbGlzdGVuZXJzIG9mIGV2ZW50IGxpc3RlbmVyIEFQSSBtdXNoIGJlIHNodXQKKyAgICAvLyBkb3duIGluIGRlYXRoIHRlc3Qgc3VicHJvY2Vzc2VzLgorICAgIEdldFVuaXRUZXN0SW1wbCgpLT5saXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9IGVsc2UgeworICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICAgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICAgIHNldF9zcGF3bmVkKHRydWUpOworICAgIHJldHVybiBPVkVSU0VFX1RFU1Q7CisgIH0KK30KKworLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MgYW5kIHJlLWV4ZWN1dGVzIHRoZSBtYWluCisvLyBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3Mgc2V0IHRoYXQgY2F1c2UKKy8vIG9ubHkgdGhpcyBzcGVjaWZpYyBkZWF0aCB0ZXN0IHRvIGJlIHJ1bi4KK2NsYXNzIEV4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7CisgcHVibGljOgorICBFeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgOgorICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7IH0KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7CisgcHJpdmF0ZToKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KKyAgY29uc3QgY2hhciogY29uc3QgZmlsZV87CisgIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgorICBjb25zdCBpbnQgbGluZV87Cit9OworCisvLyBVdGlsaXR5IGNsYXNzIGZvciBhY2N1bXVsYXRpbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KK2NsYXNzIEFyZ3VtZW50cyB7CisgcHVibGljOgorICBBcmd1bWVudHMoKSB7CisgICAgYXJnc18ucHVzaF9iYWNrKE5VTEwpOworICB9CisKKyAgfkFyZ3VtZW50cygpIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IGFyZ3NfLmJlZ2luKCk7IGkgIT0gYXJnc18uZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGZyZWUoKmkpOworICAgIH0KKyAgfQorICB2b2lkIEFkZEFyZ3VtZW50KGNvbnN0IGNoYXIqIGFyZ3VtZW50KSB7CisgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChhcmd1bWVudCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4KKyAgdm9pZCBBZGRBcmd1bWVudHMoY29uc3QgOjpzdGQ6OnZlY3RvcjxTdHI+JiBhcmd1bWVudHMpIHsKKyAgICBmb3IgKHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8U3RyPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGFyZ3VtZW50cy5iZWdpbigpOworICAgICAgICAgaSAhPSBhcmd1bWVudHMuZW5kKCk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGFyZ3NfLmluc2VydChhcmdzXy5lbmQoKSAtIDEsIHBvc2l4OjpTdHJEdXAoaS0+Y19zdHIoKSkpOworICAgIH0KKyAgfQorICBjaGFyKiBjb25zdCogQXJndigpIHsKKyAgICByZXR1cm4gJmFyZ3NfWzBdOworICB9CisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8Y2hhcio+IGFyZ3NfOworfTsKKworLy8gQSBzdHJ1Y3QgdGhhdCBlbmNvbXBhc3NlcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjaGlsZCBwcm9jZXNzIG9mIGEKKy8vIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBwcm9jZXNzLgorc3RydWN0IEV4ZWNEZWF0aFRlc3RBcmdzIHsKKyAgY2hhciogY29uc3QqIGFyZ3Y7ICAvLyBDb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0aGUgY2hpbGQncyBjYWxsIHRvIGV4ZWMKKyAgaW50IGNsb3NlX2ZkOyAgICAgICAvLyBGaWxlIGRlc2NyaXB0b3IgdG8gY2xvc2U7IHRoZSByZWFkIGVuZCBvZiBhIHBpcGUKK307CisKKyMgIGlmIEdURVNUX09TX01BQworaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgeworICAvLyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgZnJhbWV3b3JrIG9uIE1hY09TIFgsIHRoZSBlbnZpcm9uIHZhcmlhYmxlCisgIC8vIGlzIHVuYXZhaWxhYmxlLiBBcHBsZSdzIGRvY3VtZW50YXRpb24gKG1hbiBlbnZpcm9uKSByZWNvbW1lbmRzIHVzaW5nCisgIC8vIF9OU0dldEVudmlyb24oKSBpbnN0ZWFkLgorICByZXR1cm4gKl9OU0dldEVudmlyb24oKTsKK30KKyMgIGVsc2UKKy8vIFNvbWUgUE9TSVggcGxhdGZvcm1zIGV4cGVjdCB5b3UgdG8gZGVjbGFyZSBlbnZpcm9uLiBleHRlcm4gIkMiIG1ha2VzCisvLyBpdCByZXNpZGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCitleHRlcm4gIkMiIGNoYXIqKiBlbnZpcm9uOworaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgeyByZXR1cm4gZW52aXJvbjsgfQorIyAgZW5kaWYgIC8vIEdURVNUX09TX01BQworCisvLyBUaGUgbWFpbiBmdW5jdGlvbiBmb3IgYSB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGEgY2xvbmUoKS1lZCBwcm9jZXNzIGFuZCB0aHVzIG11c3QgYXZvaWQKKy8vIGFueSBwb3RlbnRpYWxseSB1bnNhZmUgb3BlcmF0aW9ucyBsaWtlIG1hbGxvYyBvciBsaWJjIGZ1bmN0aW9ucy4KK3N0YXRpYyBpbnQgRXhlY0RlYXRoVGVzdENoaWxkTWFpbih2b2lkKiBjaGlsZF9hcmcpIHsKKyAgRXhlY0RlYXRoVGVzdEFyZ3MqIGNvbnN0IGFyZ3MgPSBzdGF0aWNfY2FzdDxFeGVjRGVhdGhUZXN0QXJncyo+KGNoaWxkX2FyZyk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UoYXJncy0+Y2xvc2VfZmQpKTsKKworICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIHRlc3QgcHJvZ3JhbSBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCB3aGVyZQorICAvLyBpdCB3YXMgb3JpZ2luYWxseSBpbnZva2VkLiAgVGhlcmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgb3JpZ2luYWwKKyAgLy8gd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuCisgIGNvbnN0IGNoYXIqIGNvbnN0IG9yaWdpbmFsX2RpciA9CisgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKTsKKyAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGNoZGlyKCkgYXMgaXQncyBhIGRpcmVjdCBzeXN0ZW0gY2FsbC4KKyAgaWYgKGNoZGlyKG9yaWdpbmFsX2RpcikgIT0gMCkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KCJjaGRpcihcIiVzXCIpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpLmNfc3RyKCkpKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGV4ZWN2ZSgpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuICBXZQorICAvLyBjYW5ub3QgdXNlIGV4ZWN2cCgpIGFzIGl0J3MgYSBsaWJjIGZ1bmN0aW9uIGFuZCB0aHVzIHBvdGVudGlhbGx5CisgIC8vIHVuc2FmZS4gIFNpbmNlIGV4ZWN2ZSgpIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRILCB0aGUgdXNlciBtdXN0CisgIC8vIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHZhbGlkIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdAorICAvLyBvbmUgcGF0aCBzZXBhcmF0b3IuCisgIGV4ZWN2ZShhcmdzLT5hcmd2WzBdLCBhcmdzLT5hcmd2LCBHZXRFbnZpcm9uKCkpOworICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgiZXhlY3ZlKCVzLCAuLi4pIGluICVzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5hcmd2WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkuY19zdHIoKSkpOworICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCisvLyBUd28gdXRpbGl0eSByb3V0aW5lcyB0aGF0IHRvZ2V0aGVyIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIHRoZSBzdGFjaworLy8gZ3Jvd3MuCisvLyBUaGlzIGNvdWxkIGJlIGFjY29tcGxpc2hlZCBtb3JlIGVsZWdhbnRseSBieSBhIHNpbmdsZSByZWN1cnNpdmUKKy8vIGZ1bmN0aW9uLCBidXQgd2Ugd2FudCB0byBndWFyZCBhZ2FpbnN0IHRoZSB1bmxpa2VseSBwb3NzaWJpbGl0eSBvZgorLy8gYSBzbWFydCBjb21waWxlciBvcHRpbWl6aW5nIHRoZSByZWN1cnNpb24gYXdheS4KKy8vCisvLyBHVEVTVF9OT19JTkxJTkVfIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgR0NDIDQuNiBmcm9tIGlubGluaW5nCisvLyBTdGFja0xvd2VyVGhhbkFkZHJlc3MgaW50byBTdGFja0dyb3dzRG93biwgd2hpY2ggdGhlbiBkb2Vzbid0IGdpdmUKKy8vIGNvcnJlY3QgYW5zd2VyLgorYm9vbCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyKSBHVEVTVF9OT19JTkxJTkVfOworYm9vbCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyKSB7CisgIGludCBkdW1teTsKKyAgcmV0dXJuICZkdW1teSA8IHB0cjsKK30KKworYm9vbCBTdGFja0dyb3dzRG93bigpIHsKKyAgaW50IGR1bW15OworICByZXR1cm4gU3RhY2tMb3dlclRoYW5BZGRyZXNzKCZkdW1teSk7Cit9CisKKy8vIEEgdGhyZWFkc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiBmb3JrKDIpIGZvciB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3RzCisvLyB0aGF0IHVzZXMgY2xvbmUoMikuICBJdCBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbnl0aGluZyBnb2VzCisvLyB3cm9uZy4KK3N0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0Rm9yayhjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7CisgIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07CisgIHBpZF90IGNoaWxkX3BpZCA9IC0xOworCisjICBpZiBHVEVTVF9IQVNfQ0xPTkUKKyAgY29uc3QgYm9vbCB1c2VfZm9yayA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7CisKKyAgaWYgKCF1c2VfZm9yaykgeworICAgIHN0YXRpYyBjb25zdCBib29sIHN0YWNrX2dyb3dzX2Rvd24gPSBTdGFja0dyb3dzRG93bigpOworICAgIGNvbnN0IHNpemVfdCBzdGFja19zaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICAvLyBNTUFQX0FOT05ZTU9VUyBpcyBub3QgZGVmaW5lZCBvbiBNYWMsIHNvIHdlIHVzZSBNQVBfQU5PTiBpbnN0ZWFkLgorICAgIHZvaWQqIGNvbnN0IHN0YWNrID0gbW1hcChOVUxMLCBzdGFja19zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfQU5PTiB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oc3RhY2sgIT0gTUFQX0ZBSUxFRCk7CisgICAgdm9pZCogY29uc3Qgc3RhY2tfdG9wID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KHN0YWNrKSArIChzdGFja19ncm93c19kb3duID8gc3RhY2tfc2l6ZSA6IDApOworCisgICAgY2hpbGRfcGlkID0gY2xvbmUoJkV4ZWNEZWF0aFRlc3RDaGlsZE1haW4sIHN0YWNrX3RvcCwgU0lHQ0hMRCwgJmFyZ3MpOworCisgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18obXVubWFwKHN0YWNrLCBzdGFja19zaXplKSAhPSAtMSk7CisgIH0KKyMgIGVsc2UKKyAgY29uc3QgYm9vbCB1c2VfZm9yayA9IHRydWU7CisjICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCisKKyAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKKyAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOworICAgICAgX2V4aXQoMCk7CisgIH0KKworICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOworICByZXR1cm4gY2hpbGRfcGlkOworfQorCisvLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQorLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKKy8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKKy8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgorRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgeworICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKKyAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KKyAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKKyAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOworICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7CisKKyAgaWYgKGZsYWcgIT0gTlVMTCkgeworICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKKyAgICByZXR1cm4gRVhFQ1VURV9URVNUOworICB9CisKKyAgaW50IHBpcGVfZmRbMl07CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOworICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKKyAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgorICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7CisKKyAgY29uc3QgU3RyaW5nIGZpbHRlcl9mbGFnID0KKyAgICAgIFN0cmluZzo6Rm9ybWF0KCItLSVzJXM9JXMuJXMiLAorICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrRmlsdGVyRmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRlc3RfY2FzZV9uYW1lKCksIGluZm8tPm5hbWUoKSk7CisgIGNvbnN0IFN0cmluZyBpbnRlcm5hbF9mbGFnID0KKyAgICAgIFN0cmluZzo6Rm9ybWF0KCItLSVzJXM9JXN8JWR8JWR8JWQiLAorICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBR19QUkVGSVhfLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLAorICAgICAgICAgICAgICAgICAgICAgZmlsZV8sIGxpbmVfLCBkZWF0aF90ZXN0X2luZGV4LCBwaXBlX2ZkWzFdKTsKKyAgQXJndW1lbnRzIGFyZ3M7CisgIGFyZ3MuQWRkQXJndW1lbnRzKEdldEFyZ3ZzKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGZpbHRlcl9mbGFnLmNfc3RyKCkpOworICBhcmdzLkFkZEFyZ3VtZW50KGludGVybmFsX2ZsYWcuY19zdHIoKSk7CisKKyAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOworCisgIENhcHR1cmVTdGRlcnIoKTsKKyAgLy8gU2VlIHRoZSBjb21tZW50IGluIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSBmb3Igd2h5IHRoZSBuZXh0IGxpbmUKKyAgLy8gaXMgbmVjZXNzYXJ5LgorICBGbHVzaEluZm9Mb2coKTsKKworICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBFeGVjRGVhdGhUZXN0Rm9yayhhcmdzLkFyZ3YoKSwgcGlwZV9mZFswXSk7CisgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOworICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7CisgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOworICBzZXRfc3Bhd25lZCh0cnVlKTsKKyAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKK30KKworIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKKworLy8gQ3JlYXRlcyBhIGNvbmNyZXRlIERlYXRoVGVzdC1kZXJpdmVkIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUKKy8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnLCBhbmQgc2V0cyB0aGUgcG9pbnRlciBwb2ludGVkIHRvCisvLyBieSB0aGUgInRlc3QiIGFyZ3VtZW50IHRvIGl0cyBhZGRyZXNzLiAgSWYgdGhlIHRlc3Qgc2hvdWxkIGJlCisvLyBza2lwcGVkLCBzZXRzIHRoYXQgcG9pbnRlciB0byBOVUxMLiAgUmV0dXJucyB0cnVlLCB1bmxlc3MgdGhlCisvLyBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgorYm9vbCBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKKyAgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7CisgIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9CisgICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7CisgIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKQorICAgICAgLT5pbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOworCisgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICBpZiAoZGVhdGhfdGVzdF9pbmRleCA+IGZsYWctPmluZGV4KCkpIHsKKyAgICAgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAgICJEZWF0aCB0ZXN0IGNvdW50ICglZCkgc29tZWhvdyBleGNlZWRlZCBleHBlY3RlZCBtYXhpbXVtICglZCkiLAorICAgICAgICAgIGRlYXRoX3Rlc3RfaW5kZXgsIGZsYWctPmluZGV4KCkpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIShmbGFnLT5maWxlKCkgPT0gZmlsZSAmJiBmbGFnLT5saW5lKCkgPT0gbGluZSAmJgorICAgICAgICAgIGZsYWctPmluZGV4KCkgPT0gZGVhdGhfdGVzdF9pbmRleCkpIHsKKyAgICAgICp0ZXN0ID0gTlVMTDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIgfHwKKyAgICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7CisgICAgKnRlc3QgPSBuZXcgV2luZG93c0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKKyAgfQorCisjIGVsc2UKKworICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpIHsKKyAgICAqdGVzdCA9IG5ldyBFeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUpOworICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7CisgICAgKnRlc3QgPSBuZXcgTm9FeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgpOworICB9CisKKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworICBlbHNlIHsgIC8vIE5PTElOVCAtIHRoaXMgaXMgbW9yZSByZWFkYWJsZSB0aGFuIHVuYmFsYW5jZWQgYnJhY2tldHMgaW5zaWRlICNpZi4KKyAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVua25vd24gZGVhdGggdGVzdCBzdHlsZSBcIiVzXCIgZW5jb3VudGVyZWQiLAorICAgICAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpLmNfc3RyKCkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU3BsaXRzIGEgZ2l2ZW4gc3RyaW5nIG9uIGEgZ2l2ZW4gZGVsaW1pdGVyLCBwb3B1bGF0aW5nIGEgZ2l2ZW4KKy8vIHZlY3RvciB3aXRoIHRoZSBmaWVsZHMuICBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZQorLy8gOjpzdGQ6OnN0cmluZywgc28gd2UgY2FuIHVzZSBpdCBoZXJlLgorc3RhdGljIHZvaWQgU3BsaXRTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjaGFyIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+KiBkZXN0KSB7CisgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IHBhcnNlZDsKKyAgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7CisgIHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsKKyAgICBjb25zdCA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBzdHIuZmluZChkZWxpbWl0ZXIsIHBvcyk7CisgICAgaWYgKGNvbG9uID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MpKTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zLCBjb2xvbiAtIHBvcykpOworICAgICAgcG9zID0gY29sb24gKyAxOworICAgIH0KKyAgfQorICBkZXN0LT5zd2FwKHBhcnNlZCk7Cit9CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworLy8gUmVjcmVhdGVzIHRoZSBwaXBlIGFuZCBldmVudCBoYW5kbGVzIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMsCisvLyBzaWduYWxzIHRoZSBldmVudCwgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igd3JhcHBlZCBhcm91bmQgdGhlIHBpcGUKKy8vIGhhbmRsZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgb25seS4KK2ludCBHZXRTdGF0dXNGaWxlRGVzY3JpcHRvcih1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QpIHsKKyAgQXV0b0hhbmRsZSBwYXJlbnRfcHJvY2Vzc19oYW5kbGUoOjpPcGVuUHJvY2VzcyhQUk9DRVNTX0RVUF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIE5vbi1pbmhlcml0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIGlmIChwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgiVW5hYmxlIHRvIG9wZW4gcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIH0KKworICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgY2hlY2sgd2l0aCBhCisgIC8vIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gd2hlbiBhdmFpbGFibGUuCisgIEdURVNUX0NIRUNLXyhzaXplb2YoSEFORExFKSA8PSBzaXplb2Yoc2l6ZV90KSk7CisKKyAgY29uc3QgSEFORExFIHdyaXRlX2hhbmRsZSA9CisgICAgICByZWludGVycHJldF9jYXN0PEhBTkRMRT4od3JpdGVfaGFuZGxlX2FzX3NpemVfdCk7CisgIEhBTkRMRSBkdXBfd3JpdGVfaGFuZGxlOworCisgIC8vIFRoZSBuZXdseSBpbml0aWFsaXplZCBoYW5kbGUgaXMgYWNjZXNzaWJsZSBvbmx5IGluIGluIHRoZSBwYXJlbnQKKyAgLy8gcHJvY2Vzcy4gVG8gb2J0YWluIG9uZSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY2hpbGQsIHdlIG5lZWQgdG8gdXNlCisgIC8vIER1cGxpY2F0ZUhhbmRsZS4KKyAgaWYgKCE6OkR1cGxpY2F0ZUhhbmRsZShwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCksIHdyaXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfd3JpdGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgICAgLy8gUmVxdWVzdGVkIHByaXZpbGVnZXMgaWdub3JlZCBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRFVQTElDQVRFX1NBTUVfQUNDRVNTIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBSZXF1ZXN0IG5vbi1pbmhlcml0YWJsZSBoYW5kbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIHBpcGUgaGFuZGxlICVJdSBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAldSIsCisgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsIHBhcmVudF9wcm9jZXNzX2lkKSk7CisgIH0KKworICBjb25zdCBIQU5ETEUgZXZlbnRfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOworICBIQU5ETEUgZHVwX2V2ZW50X2hhbmRsZTsKKworICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgZXZlbnRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgJmR1cF9ldmVudF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIGV2ZW50IGhhbmRsZSAlSXUgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgJXUiLAorICAgICAgICBldmVudF9oYW5kbGVfYXNfc2l6ZV90LCBwYXJlbnRfcHJvY2Vzc19pZCkpOworICB9CisKKyAgY29uc3QgaW50IHdyaXRlX2ZkID0KKyAgICAgIDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGR1cF93cml0ZV9oYW5kbGUpLCBPX0FQUEVORCk7CisgIGlmICh3cml0ZV9mZCA9PSAtMSkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiVW5hYmxlIHRvIGNvbnZlcnQgcGlwZSBoYW5kbGUgJUl1IHRvIGEgZmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCkpOworICB9CisKKyAgLy8gU2lnbmFscyB0aGUgcGFyZW50IHRoYXQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBoYXMgYmVlbiBhY3F1aXJlZAorICAvLyBzbyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gd3JpdGUgZW5kLgorICA6OlNldEV2ZW50KGR1cF9ldmVudF9oYW5kbGUpOworCisgIHJldHVybiB3cml0ZV9mZDsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcworLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgorLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgorSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIHsKKyAgaWYgKEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID09ICIiKSByZXR1cm4gTlVMTDsKKworICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZSA6OnN0ZDo6c3RyaW5nLCBzbyB3ZQorICAvLyBjYW4gdXNlIGl0IGhlcmUuCisgIGludCBsaW5lID0gLTE7CisgIGludCBpbmRleCA9IC0xOworICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBmaWVsZHM7CisgIFNwbGl0U3RyaW5nKEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmNfc3RyKCksICd8JywgJmZpZWxkcyk7CisgIGludCB3cml0ZV9mZCA9IC0xOworCisjIGlmIEdURVNUX09TX1dJTkRPV1MKKworICB1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQgPSAwOworICBzaXplX3Qgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCA9IDA7CisgIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90ID0gMDsKKworICBpZiAoZmllbGRzLnNpemUoKSAhPSA2CisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQorICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZwYXJlbnRfcHJvY2Vzc19pZCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzRdLCAmd3JpdGVfaGFuZGxlX2FzX3NpemVfdCkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzVdLCAmZXZlbnRfaGFuZGxlX2FzX3NpemVfdCkpIHsKKyAgICBEZWF0aFRlc3RBYm9ydChTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICVzIiwKKyAgICAgICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkuY19zdHIoKSkpOworICB9CisgIHdyaXRlX2ZkID0gR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IocGFyZW50X3Byb2Nlc3NfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9oYW5kbGVfYXNfc2l6ZV90KTsKKyMgZWxzZQorCisgIGlmIChmaWVsZHMuc2l6ZSgpICE9IDQKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzFdLCAmbGluZSkKKyAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzJdLCAmaW5kZXgpCisgICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1szXSwgJndyaXRlX2ZkKSkgeworICAgIERlYXRoVGVzdEFib3J0KFN0cmluZzo6Rm9ybWF0KAorICAgICAgICAiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogJXMiLAorICAgICAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpKSk7CisgIH0KKworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisgIHJldHVybiBuZXcgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGZpZWxkc1swXSwgbGluZSwgaW5kZXgsIHdyaXRlX2ZkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDxkaXJlY3QuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyNlbGlmIEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfTkFDTAorLy8gU3ltYmlhbiBPcGVuQyBhbmQgTmFDbCBoYXZlIFBBVEhfTUFYIGluIHN5cy9zeXNsaW1pdHMuaAorIyBpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgaW5jbHVkZSA8Y2xpbWl0cz4gIC8vIFNvbWUgTGludXggZGlzdHJpYnV0aW9ucyBkZWZpbmUgUEFUSF9NQVggaGVyZS4KKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfTUFYX1BBVEgKKyNlbGlmIGRlZmluZWQoUEFUSF9NQVgpCisjIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoX1hPUEVOX1BBVEhfTUFYKQorIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIF9YT1BFTl9QQVRIX01BWAorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfUE9TSVhfUEFUSF9NQVgKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisvLyBPbiBXaW5kb3dzLCAnXFwnIGlzIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciwgYnV0IG1hbnkgdG9vbHMgYW5kIHRoZQorLy8gV2luZG93cyBBUEkgYWxzbyBhY2NlcHQgJy8nIGFzIGFuIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvci4gVW5sZXNzIG90aGVyd2lzZQorLy8gbm90ZWQsIGEgZmlsZSBwYXRoIGNhbiBjb250YWluIGVpdGhlciBraW5kIG9mIHBhdGggc2VwYXJhdG9ycywgb3IgYSBtaXh0dXJlCisvLyBvZiB0aGVtLgorY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICdcXCc7Citjb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yID0gJy8nOworY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIlxcIjsKK2NvbnN0IGNoYXIga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKKyMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnkuIFlvdSBzaG91bGQgbm90IHVzZQorLy8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluIHRlc3RzIG9uIFdpbmRvd3MgQ0UsIGJ1dCB0aGlzIGF0IGxlYXN0CisvLyBwcm92aWRlcyBhIHJlYXNvbmFibGUgZmFsbGJhY2suCitjb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiXFwiOworLy8gV2luZG93cyBDRSBkb2Vzbid0IGRlZmluZSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUworY29uc3QgRFdPUkQga0ludmFsaWRGaWxlQXR0cmlidXRlcyA9IDB4ZmZmZmZmZmY7CisjIGVsc2UKK2NvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuXFwiOworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyNlbHNlCitjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJy8nOworY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIi8iOworY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi4vIjsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIHBhdGggc2VwYXJhdG9yLgorc3RhdGljIGJvb2wgSXNQYXRoU2VwYXJhdG9yKGNoYXIgYykgeworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgIHJldHVybiAoYyA9PSBrUGF0aFNlcGFyYXRvcikgfHwgKGMgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOworI2Vsc2UKKyAgcmV0dXJuIGMgPT0ga1BhdGhTZXBhcmF0b3I7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgorRmlsZVBhdGggRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2luZG93cyBDRSBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IGRpcmVjdG9yeSwgc28gd2UganVzdCByZXR1cm4KKyAgLy8gc29tZXRoaW5nIHJlYXNvbmFibGUuCisgIHJldHVybiBGaWxlUGF0aChrQ3VycmVudERpcmVjdG9yeVN0cmluZyk7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgIGNoYXIgY3dkW0dURVNUX1BBVEhfTUFYXyArIDFdID0geyAnXDAnIH07CisgIHJldHVybiBGaWxlUGF0aChfZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7CisjZWxzZQorICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OworICByZXR1cm4gRmlsZVBhdGgoZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCit9CisKKy8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgorLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucworLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90CisvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKKyAgU3RyaW5nIGRvdF9leHRlbnNpb24oU3RyaW5nOjpGb3JtYXQoIi4lcyIsIGV4dGVuc2lvbikpOworICBpZiAocGF0aG5hbWVfLkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKGRvdF9leHRlbnNpb24uY19zdHIoKSkpIHsKKyAgICByZXR1cm4gRmlsZVBhdGgoU3RyaW5nKHBhdGhuYW1lXy5jX3N0cigpLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSA0KSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbgorLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAorLy8gc2VwYXJhdG9ycy4gUmV0dXJucyBOVUxMIGlmIG5vIHBhdGggc2VwYXJhdG9yIHdhcyBmb3VuZC4KK2NvbnN0IGNoYXIqIEZpbGVQYXRoOjpGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gc3RycmNocihjX3N0cigpLCBrUGF0aFNlcGFyYXRvcik7CisjaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9hbHRfc2VwID0gc3RycmNocihjX3N0cigpLCBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcik7CisgIC8vIENvbXBhcmluZyB0d28gcG9pbnRlcnMgb2Ygd2hpY2ggb25seSBvbmUgaXMgTlVMTCBpcyB1bmRlZmluZWQuCisgIGlmIChsYXN0X2FsdF9zZXAgIT0gTlVMTCAmJgorICAgICAgKGxhc3Rfc2VwID09IE5VTEwgfHwgbGFzdF9hbHRfc2VwID4gbGFzdF9zZXApKSB7CisgICAgcmV0dXJuIGxhc3RfYWx0X3NlcDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBsYXN0X3NlcDsKK30KKworLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpIHJldHVybnMKKy8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucworLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKKy8vIHJldHVybnMgYW4gZW1wdHkgRmlsZVBhdGggKCIiKS4KKy8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCitGaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRGlyZWN0b3J5TmFtZSgpIGNvbnN0IHsKKyAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKTsKKyAgcmV0dXJuIGxhc3Rfc2VwID8gRmlsZVBhdGgoU3RyaW5nKGxhc3Rfc2VwICsgMSkpIDogKnRoaXM7Cit9CisKKy8vIFJlbW92ZUZpbGVOYW1lIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXRoIHdpdGggdGhlIGZpbGVuYW1lIHJlbW92ZWQuCisvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCisvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCisvLyBGaWxlUGF0aCgiLi8iKSBvciwgb24gV2luZG93cywgRmlsZVBhdGgoIi5cXCIpLiBJZiB0aGUgZmlsZXBhdGggZG9lcworLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUZpbGVOYW1lKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOworICBTdHJpbmcgZGlyOworICBpZiAobGFzdF9zZXApIHsKKyAgICBkaXIgPSBTdHJpbmcoY19zdHIoKSwgbGFzdF9zZXAgKyAxIC0gY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgZGlyID0ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmc7CisgIH0KKyAgcmV0dXJuIEZpbGVQYXRoKGRpcik7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KKworLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKKy8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgorLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgorRmlsZVBhdGggRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKKyAgU3RyaW5nIGZpbGU7CisgIGlmIChudW1iZXIgPT0gMCkgeworICAgIGZpbGUgPSBTdHJpbmc6OkZvcm1hdCgiJXMuJXMiLCBiYXNlX25hbWUuY19zdHIoKSwgZXh0ZW5zaW9uKTsKKyAgfSBlbHNlIHsKKyAgICBmaWxlID0gU3RyaW5nOjpGb3JtYXQoIiVzXyVkLiVzIiwgYmFzZV9uYW1lLmNfc3RyKCksIG51bWJlciwgZXh0ZW5zaW9uKTsKKyAgfQorICByZXR1cm4gQ29uY2F0UGF0aHMoZGlyZWN0b3J5LCBGaWxlUGF0aChmaWxlKSk7Cit9CisKKy8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4KKy8vIE9uIFdpbmRvd3MsIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCitGaWxlUGF0aCBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCkgeworICBpZiAoZGlyZWN0b3J5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gcmVsYXRpdmVfcGF0aDsKKyAgY29uc3QgRmlsZVBhdGggZGlyKGRpcmVjdG9yeS5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisgIHJldHVybiBGaWxlUGF0aChTdHJpbmc6OkZvcm1hdCgiJXMlYyVzIiwgZGlyLmNfc3RyKCksIGtQYXRoU2VwYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfcGF0aC5jX3N0cigpKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgc29tZXRoaW5nIGZpbmRhYmxlIGluIHRoZSBmaWxlLXN5c3RlbSwKKy8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIuCitib29sIEZpbGVQYXRoOjpGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRobmFtZV8uY19zdHIoKSk7CisgIGNvbnN0IERXT1JEIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlcyh1bmljb2RlKTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisgIHJldHVybiBhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXM7CisjZWxzZQorICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7CisgIHJldHVybiBwb3NpeDo6U3RhdChwYXRobmFtZV8uY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMDsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KKy8vIHRoYXQgZXhpc3RzLgorYm9vbCBGaWxlUGF0aDo6RGlyZWN0b3J5RXhpc3RzKCkgY29uc3QgeworICBib29sIHJlc3VsdCA9IGZhbHNlOworI2lmIEdURVNUX09TX1dJTkRPV1MKKyAgLy8gRG9uJ3Qgc3RyaXAgb2ZmIHRyYWlsaW5nIHNlcGFyYXRvciBpZiBwYXRoIGlzIGEgcm9vdCBkaXJlY3Rvcnkgb24KKyAgLy8gV2luZG93cyAobGlrZSAiQzpcXCIpLgorICBjb25zdCBGaWxlUGF0aCYgcGF0aChJc1Jvb3REaXJlY3RvcnkoKSA/ICp0aGlzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7CisjZWxzZQorICBjb25zdCBGaWxlUGF0aCYgcGF0aCgqdGhpcyk7CisjZW5kaWYKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aC5jX3N0cigpKTsKKyAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOworICBkZWxldGUgW10gdW5pY29kZTsKKyAgaWYgKChhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMpICYmCisgICAgICAoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpIHsKKyAgICByZXN1bHQgPSB0cnVlOworICB9CisjZWxzZQorICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7CisgIHJlc3VsdCA9IHBvc2l4OjpTdGF0KHBhdGguY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMCAmJgorICAgICAgcG9zaXg6OklzRGlyKGZpbGVfc3RhdCk7CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCisvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCitib29sIEZpbGVQYXRoOjpJc1Jvb3REaXJlY3RvcnkoKSBjb25zdCB7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBhIG5ldHdvcmsgc2hhcmUgbGlrZQorICAvLyBcXHNlcnZlclxzaGFyZSBjYW4gYmUgYSByb290IGRpcmVjdG9yeSwgYWx0aG91Z2ggaXQgY2Fubm90IGJlIHRoZQorICAvLyBjdXJyZW50IGRpcmVjdG9yeS4gIEhhbmRsZSB0aGlzIHByb3Blcmx5LgorICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID09IDMgJiYgSXNBYnNvbHV0ZVBhdGgoKTsKKyNlbHNlCisgIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMSAmJiBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbMF0pOworI2VuZGlmCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYW4gYWJzb2x1dGUgcGF0aC4KK2Jvb2wgRmlsZVBhdGg6OklzQWJzb2x1dGVQYXRoKCkgY29uc3QgeworICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gcGF0aG5hbWVfLmNfc3RyKCk7CisjaWYgR1RFU1RfT1NfV0lORE9XUworICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID49IDMgJiYKKyAgICAgKChuYW1lWzBdID49ICdhJyAmJiBuYW1lWzBdIDw9ICd6JykgfHwKKyAgICAgIChuYW1lWzBdID49ICdBJyAmJiBuYW1lWzBdIDw9ICdaJykpICYmCisgICAgIG5hbWVbMV0gPT0gJzonICYmCisgICAgIElzUGF0aFNlcGFyYXRvcihuYW1lWzJdKTsKKyNlbHNlCisgIHJldHVybiBJc1BhdGhTZXBhcmF0b3IobmFtZVswXSk7CisjZW5kaWYKK30KKworLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQorLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcgorLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24KKy8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAorLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4KKy8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKKy8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuCitGaWxlUGF0aCBGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgeworICBGaWxlUGF0aCBmdWxsX3BhdGhuYW1lOworICBpbnQgbnVtYmVyID0gMDsKKyAgZG8geworICAgIGZ1bGxfcGF0aG5hbWUuU2V0KE1ha2VGaWxlTmFtZShkaXJlY3RvcnksIGJhc2VfbmFtZSwgbnVtYmVyKyssIGV4dGVuc2lvbikpOworICB9IHdoaWxlIChmdWxsX3BhdGhuYW1lLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKKyAgcmV0dXJuIGZ1bGxfcGF0aG5hbWU7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciwgd2hpY2ggaW5kaWNhdGVzIHRoYXQKKy8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KK2Jvb2wgRmlsZVBhdGg6OklzRGlyZWN0b3J5KCkgY29uc3QgeworICByZXR1cm4gIXBhdGhuYW1lXy5lbXB0eSgpICYmCisgICAgICAgICBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbcGF0aG5hbWVfLmxlbmd0aCgpIC0gMV0pOworfQorCisvLyBDcmVhdGUgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKKy8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3JpZXMKKy8vIGZvciBhbnkgcmVhc29uLgorYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGNvbnN0IHsKKyAgaWYgKCF0aGlzLT5Jc0RpcmVjdG9yeSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAwIHx8IHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBGaWxlUGF0aCBwYXJlbnQodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuUmVtb3ZlRmlsZU5hbWUoKSk7CisgIHJldHVybiBwYXJlbnQuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpICYmIHRoaXMtPkNyZWF0ZUZvbGRlcigpOworfQorCisvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgorLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQorLy8gZGlyZWN0b3J5IGZvciBhbnkgcmVhc29uLCBpbmNsdWRpbmcgaWYgdGhlIHBhcmVudCBkaXJlY3RvcnkgZG9lcyBub3QKKy8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgorYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRm9sZGVyKCkgY29uc3QgeworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisgIEZpbGVQYXRoIHJlbW92ZWRfc2VwKHRoaXMtPlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKKyAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihyZW1vdmVkX3NlcC5jX3N0cigpKTsKKyAgaW50IHJlc3VsdCA9IENyZWF0ZURpcmVjdG9yeSh1bmljb2RlLCBOVUxMKSA/IDAgOiAtMTsKKyAgZGVsZXRlIFtdIHVuaWNvZGU7CisjZWxpZiBHVEVTVF9PU19XSU5ET1dTCisgIGludCByZXN1bHQgPSBfbWtkaXIocGF0aG5hbWVfLmNfc3RyKCkpOworI2Vsc2UKKyAgaW50IHJlc3VsdCA9IG1rZGlyKHBhdGhuYW1lXy5jX3N0cigpLCAwNzc3KTsKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKworICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgcmV0dXJuIHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpOyAgLy8gQW4gZXJyb3IgaXMgT0sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgIH0KKyAgcmV0dXJuIHRydWU7ICAvLyBObyBlcnJvci4KK30KKworLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmUgaXQgYW5kIHJldHVybiB0aGUKKy8vIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gdGhlIG5hbWUgc3RyaW5nIHVubW9kaWZpZWQuCisvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgorRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKKyAgcmV0dXJuIElzRGlyZWN0b3J5KCkKKyAgICAgID8gRmlsZVBhdGgoU3RyaW5nKHBhdGhuYW1lXy5jX3N0cigpLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSAxKSkKKyAgICAgIDogKnRoaXM7Cit9CisKKy8vIFJlbW92ZXMgYW55IHJlZHVuZGFudCBzZXBhcmF0b3JzIHRoYXQgbWlnaHQgYmUgaW4gdGhlIHBhdGhuYW1lLgorLy8gRm9yIGV4YW1wbGUsICJiYXIvLy9mb28iIGJlY29tZXMgImJhci9mb28iLiBEb2VzIG5vdCBlbGltaW5hdGUgb3RoZXIKKy8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgorLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGhhbmRsZSBXaW5kb3dzIG5ldHdvcmsgc2hhcmVzIChlLmcuIFxcc2VydmVyXHNoYXJlKS4KK3ZvaWQgRmlsZVBhdGg6Ok5vcm1hbGl6ZSgpIHsKKyAgaWYgKHBhdGhuYW1lXy5jX3N0cigpID09IE5VTEwpIHsKKyAgICBwYXRobmFtZV8gPSAiIjsKKyAgICByZXR1cm47CisgIH0KKyAgY29uc3QgY2hhciogc3JjID0gcGF0aG5hbWVfLmNfc3RyKCk7CisgIGNoYXIqIGNvbnN0IGRlc3QgPSBuZXcgY2hhcltwYXRobmFtZV8ubGVuZ3RoKCkgKyAxXTsKKyAgY2hhciogZGVzdF9wdHIgPSBkZXN0OworICBtZW1zZXQoZGVzdF9wdHIsIDAsIHBhdGhuYW1lXy5sZW5ndGgoKSArIDEpOworCisgIHdoaWxlICgqc3JjICE9ICdcMCcpIHsKKyAgICAqZGVzdF9wdHIgPSAqc3JjOworICAgIGlmICghSXNQYXRoU2VwYXJhdG9yKCpzcmMpKSB7CisgICAgICBzcmMrKzsKKyAgICB9IGVsc2UgeworI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCisgICAgICBpZiAoKmRlc3RfcHRyID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKSB7CisgICAgICAgICpkZXN0X3B0ciA9IGtQYXRoU2VwYXJhdG9yOworICAgICAgfQorI2VuZGlmCisgICAgICB3aGlsZSAoSXNQYXRoU2VwYXJhdG9yKCpzcmMpKQorICAgICAgICBzcmMrKzsKKyAgICB9CisgICAgZGVzdF9wdHIrKzsKKyAgfQorICAqZGVzdF9wdHIgPSAnXDAnOworICBwYXRobmFtZV8gPSBkZXN0OworICBkZWxldGVbXSBkZXN0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gRm9yIFRlcm1pbmF0ZVByb2Nlc3MoKQorI2VsaWYgR1RFU1RfT1NfV0lORE9XUworIyBpbmNsdWRlIDxpby5oPgorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNpZiBHVEVTVF9PU19NQUMKKyMgaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KKyMgaW5jbHVkZSA8bWFjaC90YXNrLmg+CisjIGluY2x1ZGUgPG1hY2gvdm1fbWFwLmg+CisjZW5kaWYgIC8vIEdURVNUX09TX01BQworCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKy8vIE1TVkMgYW5kIEMrK0J1aWxkZXIgZG8gbm90IHByb3ZpZGUgYSBkZWZpbml0aW9uIG9mIFNUREVSUl9GSUxFTk8uCitjb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IDE7Citjb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IDI7CisjZWxzZQorY29uc3QgaW50IGtTdGRPdXRGaWxlbm8gPSBTVERPVVRfRklMRU5POworY29uc3QgaW50IGtTdGRFcnJGaWxlbm8gPSBTVERFUlJfRklMRU5POworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWYgR1RFU1RfT1NfTUFDCisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAorLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgY29uc3QgdGFza190IHRhc2sgPSBtYWNoX3Rhc2tfc2VsZigpOworICBtYWNoX21zZ190eXBlX251bWJlcl90IHRocmVhZF9jb3VudDsKKyAgdGhyZWFkX2FjdF9hcnJheV90IHRocmVhZF9saXN0OworICBjb25zdCBrZXJuX3JldHVybl90IHN0YXR1cyA9IHRhc2tfdGhyZWFkcyh0YXNrLCAmdGhyZWFkX2xpc3QsICZ0aHJlYWRfY291bnQpOworICBpZiAoc3RhdHVzID09IEtFUk5fU1VDQ0VTUykgeworICAgIC8vIHRhc2tfdGhyZWFkcyBhbGxvY2F0ZXMgcmVzb3VyY2VzIGluIHRocmVhZF9saXN0IGFuZCB3ZSBuZWVkIHRvIGZyZWUgdGhlbQorICAgIC8vIHRvIGF2b2lkIGxlYWtzLgorICAgIHZtX2RlYWxsb2NhdGUodGFzaywKKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm1fYWRkcmVzc190Pih0aHJlYWRfbGlzdCksCisgICAgICAgICAgICAgICAgICBzaXplb2YodGhyZWFkX3QpICogdGhyZWFkX2NvdW50KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0aHJlYWRfY291bnQpOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKKyNlbHNlCisKK3NpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKKyAgLy8gVGhlcmUncyBubyBwb3J0YWJsZSB3YXkgdG8gZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcywgc28gd2UganVzdAorICAvLyByZXR1cm4gMCB0byBpbmRpY2F0ZSB0aGF0IHdlIGNhbm5vdCBkZXRlY3QgaXQuCisgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIEdURVNUX09TX01BQworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisvLyBJbXBsZW1lbnRzIFJFLiAgQ3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KKworUkU6On5SRSgpIHsKKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIC8vIHJlZ2ZyZWUnaW5nIGFuIGludmFsaWQgcmVnZXggbWlnaHQgY3Jhc2ggYmVjYXVzZSB0aGUgY29udGVudAorICAgIC8vIG9mIHRoZSByZWdleCBpcyB1bmRlZmluZWQuIFNpbmNlIHRoZSByZWdleCdzIGFyZSBlc3NlbnRpYWxseQorICAgIC8vIHRoZSBzYW1lLCBvbmUgY2Fubm90IGJlIHZhbGlkIChvciBpbnZhbGlkKSB3aXRob3V0IHRoZSBvdGhlcgorICAgIC8vIGJlaW5nIHNvIHRvby4KKyAgICByZWdmcmVlKCZwYXJ0aWFsX3JlZ2V4Xyk7CisgICAgcmVnZnJlZSgmZnVsbF9yZWdleF8pOworICB9CisgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KK2Jvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOworCisgIHJlZ21hdGNoX3QgbWF0Y2g7CisgIHJldHVybiByZWdleGVjKCZyZS5mdWxsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCisvLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7CisKKyAgcmVnbWF0Y2hfdCBtYXRjaDsKKyAgcmV0dXJuIHJlZ2V4ZWMoJnJlLnBhcnRpYWxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKK30KKworLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgordm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgeworICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOworCisgIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQorICAvLyBmdWxsIG1hdGNoLgorICBjb25zdCBzaXplX3QgZnVsbF9yZWdleF9sZW4gPSBzdHJsZW4ocmVnZXgpICsgMTA7CisgIGNoYXIqIGNvbnN0IGZ1bGxfcGF0dGVybiA9IG5ldyBjaGFyW2Z1bGxfcmVnZXhfbGVuXTsKKworICBzbnByaW50ZihmdWxsX3BhdHRlcm4sIGZ1bGxfcmVnZXhfbGVuLCAiXiglcykkIiwgcmVnZXgpOworICBpc192YWxpZF8gPSByZWdjb21wKCZmdWxsX3JlZ2V4XywgZnVsbF9wYXR0ZXJuLCBSRUdfRVhURU5ERUQpID09IDA7CisgIC8vIFdlIHdhbnQgdG8gY2FsbCByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgLi4uKSBldmVuIGlmIHRoZQorICAvLyBwcmV2aW91cyBleHByZXNzaW9uIHJldHVybnMgZmFsc2UuICBPdGhlcndpc2UgcGFydGlhbF9yZWdleF8gbWF5CisgIC8vIG5vdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBjYW4gbWF5IGNhdXNlIHRyb3VibGUgd2hlbiBpdCdzCisgIC8vIGZyZWVkLgorICAvLworICAvLyBTb21lIGltcGxlbWVudGF0aW9uIG9mIFBPU0lYIHJlZ2V4IChlLmcuIG9uIGF0IGxlYXN0IHNvbWUKKyAgLy8gdmVyc2lvbnMgb2YgQ3lnd2luKSBkb2Vzbid0IGFjY2VwdCB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgdmFsaWQKKyAgLy8gcmVnZXguICBXZSBjaGFuZ2UgaXQgdG8gYW4gZXF1aXZhbGVudCBmb3JtICIoKSIgdG8gYmUgc2FmZS4KKyAgaWYgKGlzX3ZhbGlkXykgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IHBhcnRpYWxfcmVnZXggPSAoKnJlZ2V4ID09ICdcMCcpID8gIigpIiA6IHJlZ2V4OworICAgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCBwYXJ0aWFsX3JlZ2V4LCBSRUdfRVhURU5ERUQpID09IDA7CisgIH0KKyAgRVhQRUNUX1RSVUUoaXNfdmFsaWRfKQorICAgICAgPDwgIlJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXgKKyAgICAgIDw8ICJcIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIjsKKworICBkZWxldGVbXSBmdWxsX3BhdHRlcm47Cit9CisKKyNlbGlmIEdURVNUX1VTRVNfU0lNUExFX1JFCisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYXBwZWFycyBhbnl3aGVyZSBpbiBzdHIgKGV4Y2x1ZGluZyB0aGUKKy8vIHRlcm1pbmF0aW5nICdcMCcgY2hhcmFjdGVyKS4KK2Jvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIGNoICE9ICdcMCcgJiYgc3RyY2hyKHN0ciwgY2gpICE9IE5VTEw7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3NpZmljYXRpb24uICBVbmxpa2UKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiwgdGhlc2UgYXJlbid0IGFmZmVjdGVkIGJ5IHRoZQorLy8gY3VycmVudCBsb2NhbGUuCitib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9Citib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKSB7CisgIHJldHVybiBJc0luU2V0KGNoLCAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiIpOworfQorYm9vbCBJc1JlcGVhdChjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiPyorIik7IH0KK2Jvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIiBcZlxuXHJcdFx2Iik7IH0KK2Jvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpIHsKKyAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKKyAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAnXyc7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgIlxcYyIgaXMgYSBzdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlLgorYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgeworICByZXR1cm4gKElzQXNjaWlQdW5jdChjKSB8fCBJc0luU2V0KGMsICJkRGZucnNTdHZ3VyIpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXRvbSAoc3BlY2lmaWVkIGJ5IGVzY2FwZWQgYW5kIHBhdHRlcm4pCisvLyBtYXRjaGVzIGNoLiAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdGhlIGF0b20gaXMgaW52YWxpZC4KK2Jvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuX2NoYXIsIGNoYXIgY2gpIHsKKyAgaWYgKGVzY2FwZWQpIHsgIC8vICJcXHAiIHdoZXJlIHAgaXMgcGF0dGVybl9jaGFyLgorICAgIHN3aXRjaCAocGF0dGVybl9jaGFyKSB7CisgICAgICBjYXNlICdkJzogcmV0dXJuIElzQXNjaWlEaWdpdChjaCk7CisgICAgICBjYXNlICdEJzogcmV0dXJuICFJc0FzY2lpRGlnaXQoY2gpOworICAgICAgY2FzZSAnZic6IHJldHVybiBjaCA9PSAnXGYnOworICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOworICAgICAgY2FzZSAncic6IHJldHVybiBjaCA9PSAnXHInOworICAgICAgY2FzZSAncyc6IHJldHVybiBJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICdTJzogcmV0dXJuICFJc0FzY2lpV2hpdGVTcGFjZShjaCk7CisgICAgICBjYXNlICd0JzogcmV0dXJuIGNoID09ICdcdCc7CisgICAgICBjYXNlICd2JzogcmV0dXJuIGNoID09ICdcdic7CisgICAgICBjYXNlICd3JzogcmV0dXJuIElzQXNjaWlXb3JkQ2hhcihjaCk7CisgICAgICBjYXNlICdXJzogcmV0dXJuICFJc0FzY2lpV29yZENoYXIoY2gpOworICAgIH0KKyAgICByZXR1cm4gSXNBc2NpaVB1bmN0KHBhdHRlcm5fY2hhcikgJiYgcGF0dGVybl9jaGFyID09IGNoOworICB9CisKKyAgcmV0dXJuIChwYXR0ZXJuX2NoYXIgPT0gJy4nICYmIGNoICE9ICdcbicpIHx8IHBhdHRlcm5fY2hhciA9PSBjaDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVmFsaWRhdGVSZWdleCgpIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlcy4KK1N0cmluZyBGb3JtYXRSZWdleFN5bnRheEVycm9yKGNvbnN0IGNoYXIqIHJlZ2V4LCBpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkgPDwgIlN5bnRheCBlcnJvciBhdCBpbmRleCAiIDw8IGluZGV4CisgICAgICAgICAgPDwgIiBpbiBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIFwiIiA8PCByZWdleCA8PCAiXCI6ICIpLkdldFN0cmluZygpOworfQorCisvLyBHZW5lcmF0ZXMgbm9uLWZhdGFsIGZhaWx1cmVzIGFuZCByZXR1cm5zIGZhbHNlIGlmIHJlZ2V4IGlzIGludmFsaWQ7CisvLyBvdGhlcndpc2UgcmV0dXJucyB0cnVlLgorYm9vbCBWYWxpZGF0ZVJlZ2V4KGNvbnN0IGNoYXIqIHJlZ2V4KSB7CisgIGlmIChyZWdleCA9PSBOVUxMKSB7CisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGZpeCB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24gaW4gdGhlCisgICAgLy8gYXNzZXJ0aW9uIGZhaWx1cmVzIHRvIG1hdGNoIHdoZXJlIHRoZSByZWdleCBpcyB1c2VkIGluIHVzZXIKKyAgICAvLyBjb2RlLgorICAgIEFERF9GQUlMVVJFKCkgPDwgIk5VTEwgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNfdmFsaWQgPSB0cnVlOworCisgIC8vIFRydWUgaWZmID8sICosIG9yICsgY2FuIGZvbGxvdyB0aGUgcHJldmlvdXMgYXRvbS4KKyAgYm9vbCBwcmV2X3JlcGVhdGFibGUgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IHJlZ2V4W2ldOyBpKyspIHsKKyAgICBpZiAocmVnZXhbaV0gPT0gJ1xcJykgeyAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlCisgICAgICBpKys7CisgICAgICBpZiAocmVnZXhbaV0gPT0gJ1wwJykgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInXFwnIGNhbm5vdCBhcHBlYXIgYXQgdGhlIGVuZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmICghSXNWYWxpZEVzY2FwZShyZWdleFtpXSkpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXCJcXCIgPDwgcmVnZXhbaV0gPDwgIlwiLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9CisgICAgICBwcmV2X3JlcGVhdGFibGUgPSB0cnVlOworICAgIH0gZWxzZSB7ICAvLyBOb3QgYW4gZXNjYXBlIHNlcXVlbmNlLgorICAgICAgY29uc3QgY2hhciBjaCA9IHJlZ2V4W2ldOworCisgICAgICBpZiAoY2ggPT0gJ14nICYmIGkgPiAwKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJ14nIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGNoID09ICckJyAmJiByZWdleFtpICsgMV0gIT0gJ1wwJykgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIickJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZC4iOworICAgICAgICBpc192YWxpZCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChJc0luU2V0KGNoLCAiKClbXXt9fCIpKSB7CisgICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgY2ggPDwgIicgaXMgdW5zdXBwb3J0ZWQuIjsKKyAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoSXNSZXBlYXQoY2gpICYmICFwcmV2X3JlcGVhdGFibGUpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBjYW4gb25seSBmb2xsb3cgYSByZXBlYXRhYmxlIHRva2VuLiI7CisgICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHByZXZfcmVwZWF0YWJsZSA9ICFJc0luU2V0KGNoLCAiXiQ/KisiKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gaXNfdmFsaWQ7Cit9CisKKy8vIE1hdGNoZXMgYSByZXBlYXRlZCByZWdleCBhdG9tIGZvbGxvd2VkIGJ5IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIKKy8vIGV4cHJlc3Npb24uICBUaGUgcmVnZXggYXRvbSBpcyBkZWZpbmVkIGFzIGMgaWYgZXNjYXBlZCBpcyBmYWxzZSwKKy8vIG9yIFxjIG90aGVyd2lzZS4gIHJlcGVhdCBpcyB0aGUgcmVwZXRpdGlvbiBtZXRhIGNoYXJhY3RlciAoPywgKiwKKy8vIG9yICspLiAgVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBzdHIgY29udGFpbnMgdG9vIG1hbnkKKy8vIGNoYXJhY3RlcnMgdG8gYmUgaW5kZXhhYmxlIGJ5IHNpemVfdCwgaW4gd2hpY2ggY2FzZSB0aGUgdGVzdCB3aWxsCisvLyBwcm9iYWJseSB0aW1lIG91dCBhbnl3YXkuICBXZSBhcmUgZmluZSB3aXRoIHRoaXMgbGltaXRhdGlvbiBhcworLy8gc3RkOjpzdHJpbmcgaGFzIGl0IHRvby4KK2Jvb2wgTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgYm9vbCBlc2NhcGVkLCBjaGFyIGMsIGNoYXIgcmVwZWF0LCBjb25zdCBjaGFyKiByZWdleCwKKyAgICBjb25zdCBjaGFyKiBzdHIpIHsKKyAgY29uc3Qgc2l6ZV90IG1pbl9jb3VudCA9IChyZXBlYXQgPT0gJysnKSA/IDEgOiAwOworICBjb25zdCBzaXplX3QgbWF4X2NvdW50ID0gKHJlcGVhdCA9PSAnPycpID8gMSA6CisgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KC0xKSAtIDE7CisgIC8vIFdlIGNhbm5vdCBjYWxsIG51bWVyaWNfbGltaXRzOjptYXgoKSBhcyBpdCBjb25mbGljdHMgd2l0aCB0aGUKKyAgLy8gbWF4KCkgbWFjcm8gb24gV2luZG93cy4KKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSBtYXhfY291bnQ7ICsraSkgeworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgYXRvbSBtYXRjaGVzIGVhY2ggb2YgdGhlIGZpcnN0IGkgY2hhcmFjdGVycyBpbiBzdHIuCisgICAgaWYgKGkgPj0gbWluX2NvdW50ICYmIE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0ciArIGkpKSB7CisgICAgICAvLyBXZSBoYXZlIGVub3VnaCBtYXRjaGVzIGF0IHRoZSBoZWFkLCBhbmQgdGhlIHRhaWwgbWF0Y2hlcyB0b28uCisgICAgICAvLyBTaW5jZSB3ZSBvbmx5IGNhcmUgYWJvdXQgKndoZXRoZXIqIHRoZSBwYXR0ZXJuIG1hdGNoZXMgc3RyCisgICAgICAvLyAoYXMgb3Bwb3NlZCB0byAqaG93KiBpdCBtYXRjaGVzKSwgdGhlcmUgaXMgbm8gbmVlZCB0byBmaW5kIGEKKyAgICAgIC8vIGdyZWVkeSBtYXRjaC4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoc3RyW2ldID09ICdcMCcgfHwgIUF0b21NYXRjaGVzQ2hhcihlc2NhcGVkLCBjLCBzdHJbaV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWdleCBtYXRjaGVzIGEgcHJlZml4IG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUgYQorLy8gdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgbm90IHN0YXJ0IHdpdGggIl4iLCBvciB0aGUKKy8vIHJlc3VsdCBpcyB1bmRlZmluZWQuCitib29sIE1hdGNoUmVnZXhBdEhlYWQoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgeworICBpZiAoKnJlZ2V4ID09ICdcMCcpICAvLyBBbiBlbXB0eSByZWdleCBtYXRjaGVzIGEgcHJlZml4IG9mIGFueXRoaW5nLgorICAgIHJldHVybiB0cnVlOworCisgIC8vICIkIiBvbmx5IG1hdGNoZXMgdGhlIGVuZCBvZiBhIHN0cmluZy4gIE5vdGUgdGhhdCByZWdleCBiZWluZworICAvLyB2YWxpZCBndWFyYW50ZWVzIHRoYXQgdGhlcmUncyBub3RoaW5nIGFmdGVyICIkIiBpbiBpdC4KKyAgaWYgKCpyZWdleCA9PSAnJCcpCisgICAgcmV0dXJuICpzdHIgPT0gJ1wwJzsKKworICAvLyBJcyB0aGUgZmlyc3QgdGhpbmcgaW4gcmVnZXggYW4gZXNjYXBlIHNlcXVlbmNlPworICBjb25zdCBib29sIGVzY2FwZWQgPSAqcmVnZXggPT0gJ1xcJzsKKyAgaWYgKGVzY2FwZWQpCisgICAgKytyZWdleDsKKyAgaWYgKElzUmVwZWF0KHJlZ2V4WzFdKSkgeworICAgIC8vIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKCkgY2FsbHMgTWF0Y2hSZWdleEF0SGVhZCgpLCBzbworICAgIC8vIGhlcmUncyBhbiBpbmRpcmVjdCByZWN1cnNpb24uICBJdCB0ZXJtaW5hdGVzIGFzIHRoZSByZWdleCBnZXRzCisgICAgLy8gc2hvcnRlciBpbiBlYWNoIHJlY3Vyc2lvbi4KKyAgICByZXR1cm4gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoCisgICAgICAgIGVzY2FwZWQsIHJlZ2V4WzBdLCByZWdleFsxXSwgcmVnZXggKyAyLCBzdHIpOworICB9IGVsc2UgeworICAgIC8vIHJlZ2V4IGlzbid0IGVtcHR5LCBpc24ndCAiJCIsIGFuZCBkb2Vzbid0IHN0YXJ0IHdpdGggYQorICAgIC8vIHJlcGV0aXRpb24uICBXZSBtYXRjaCB0aGUgZmlyc3QgYXRvbSBvZiByZWdleCB3aXRoIHRoZSBmaXJzdAorICAgIC8vIGNoYXJhY3RlciBvZiBzdHIgYW5kIHJlY3Vyc2UuCisgICAgcmV0dXJuICgqc3RyICE9ICdcMCcpICYmIEF0b21NYXRjaGVzQ2hhcihlc2NhcGVkLCAqcmVnZXgsICpzdHIpICYmCisgICAgICAgIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIgKyAxKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYW55IHN1YnN0cmluZyBvZiBzdHIuICByZWdleCBtdXN0IGJlCisvLyBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24sIG9yIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorLy8KKy8vIFRoZSBhbGdvcml0aG0gaXMgcmVjdXJzaXZlLCBidXQgdGhlIHJlY3Vyc2lvbiBkZXB0aCBkb2Vzbid0IGV4Y2VlZAorLy8gdGhlIHJlZ2V4IGxlbmd0aCwgc28gd2Ugd29uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBydW5uaW5nIG91dCBvZgorLy8gc3RhY2sgc3BhY2Ugbm9ybWFsbHkuICBJbiByYXJlIGNhc2VzIHRoZSB0aW1lIGNvbXBsZXhpdHkgY2FuIGJlCisvLyBleHBvbmVudGlhbCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlZ2V4IGxlbmd0aCArIHRoZSBzdHJpbmcgbGVuZ3RoLAorLy8gYnV0IHVzdWFsbHkgaXQncyBtdXN0IGZhc3RlciAob2Z0ZW4gY2xvc2UgdG8gbGluZWFyKS4KK2Jvb2wgTWF0Y2hSZWdleEFueXdoZXJlKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKHJlZ2V4ID09IE5VTEwgfHwgc3RyID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgqcmVnZXggPT0gJ14nKQorICAgIHJldHVybiBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4ICsgMSwgc3RyKTsKKworICAvLyBBIHN1Y2Nlc3NmdWwgbWF0Y2ggY2FuIGJlIGFueXdoZXJlIGluIHN0ci4KKyAgZG8geworICAgIGlmIChNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4LCBzdHIpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0gd2hpbGUgKCpzdHIrKyAhPSAnXDAnKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBJbXBsZW1lbnRzIHRoZSBSRSBjbGFzcy4KKworUkU6On5SRSgpIHsKKyAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOworICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KGZ1bGxfcGF0dGVybl8pKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KK2Jvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICByZXR1cm4gcmUuaXNfdmFsaWRfICYmIE1hdGNoUmVnZXhBbnl3aGVyZShyZS5mdWxsX3BhdHRlcm5fLCBzdHIpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0cgorLy8gKGluY2x1ZGluZyBzdHIgaXRzZWxmKS4KK2Jvb2wgUkU6OlBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgeworICByZXR1cm4gcmUuaXNfdmFsaWRfICYmIE1hdGNoUmVnZXhBbnl3aGVyZShyZS5wYXR0ZXJuXywgc3RyKTsKK30KKworLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgordm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgeworICBwYXR0ZXJuXyA9IGZ1bGxfcGF0dGVybl8gPSBOVUxMOworICBpZiAocmVnZXggIT0gTlVMTCkgeworICAgIHBhdHRlcm5fID0gcG9zaXg6OlN0ckR1cChyZWdleCk7CisgIH0KKworICBpc192YWxpZF8gPSBWYWxpZGF0ZVJlZ2V4KHJlZ2V4KTsKKyAgaWYgKCFpc192YWxpZF8pIHsKKyAgICAvLyBObyBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgZnVsbCBwYXR0ZXJuIHdoZW4gdGhlIHJlZ2V4IGlzIGludmFsaWQuCisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbihyZWdleCk7CisgIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQorICAvLyBmdWxsIG1hdGNoOiB3ZSBuZWVkIHNwYWNlIHRvIHByZXBlbmQgYSAnXicsIGFwcGVuZCBhICckJywgYW5kCisgIC8vIHRlcm1pbmF0ZSB0aGUgc3RyaW5nIHdpdGggJ1wwJy4KKyAgY2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1hbGxvYyhsZW4gKyAzKSk7CisgIGZ1bGxfcGF0dGVybl8gPSBidWZmZXI7CisKKyAgaWYgKCpyZWdleCAhPSAnXicpCisgICAgKmJ1ZmZlcisrID0gJ14nOyAgLy8gTWFrZXMgc3VyZSBmdWxsX3BhdHRlcm5fIHN0YXJ0cyB3aXRoICdeJy4KKworICAvLyBXZSBkb24ndCB1c2Ugc25wcmludGYgb3Igc3RybmNweSwgYXMgdGhleSB0cmlnZ2VyIGEgd2FybmluZyB3aGVuCisgIC8vIGNvbXBpbGVkIHdpdGggVkMrKyA4LjAuCisgIG1lbWNweShidWZmZXIsIHJlZ2V4LCBsZW4pOworICBidWZmZXIgKz0gbGVuOworCisgIGlmIChsZW4gPT0gMCB8fCByZWdleFtsZW4gLSAxXSAhPSAnJCcpCisgICAgKmJ1ZmZlcisrID0gJyQnOyAgLy8gTWFrZXMgc3VyZSBmdWxsX3BhdHRlcm5fIGVuZHMgd2l0aCAnJCcuCisKKyAgKmJ1ZmZlciA9ICdcMCc7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfVVNFU19QT1NJWF9SRQorCitjb25zdCBjaGFyIGtVbmtub3duRmlsZVtdID0gInVua25vd24gZmlsZSI7CisKKy8vIEZvcm1hdHMgYSBzb3VyY2UgZmlsZSBwYXRoIGFuZCBhIGxpbmUgbnVtYmVyIGFzIHRoZXkgd291bGQgYXBwZWFyCisvLyBpbiBhbiBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSB0aGlzIGNvZGUuCitHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSA9IGZpbGUgPT0gTlVMTCA/IGtVbmtub3duRmlsZSA6IGZpbGU7CisKKyAgaWYgKGxpbmUgPCAwKSB7CisgICAgcmV0dXJuIFN0cmluZzo6Rm9ybWF0KCIlczoiLCBmaWxlX25hbWUpLmNfc3RyKCk7CisgIH0KKyNpZmRlZiBfTVNDX1ZFUgorICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIiVzKCVkKToiLCBmaWxlX25hbWUsIGxpbmUpLmNfc3RyKCk7CisjZWxzZQorICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIiVzOiVkOiIsIGZpbGVfbmFtZSwgbGluZSkuY19zdHIoKTsKKyNlbmRpZiAgLy8gX01TQ19WRVIKK30KKworLy8gRm9ybWF0cyBhIGZpbGUgbG9jYXRpb24gZm9yIGNvbXBpbGVyLWluZGVwZW5kZW50IFhNTCBvdXRwdXQuCisvLyBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwbGF0Zm9ybSBkZXBlbmRlbnQsIHdlIHB1dCBpdCBuZXh0IHRvCisvLyBGb3JtYXRGaWxlTG9jYXRpb24gaW4gb3JkZXIgdG8gY29udHJhc3QgdGhlIHR3byBmdW5jdGlvbnMuCisvLyBOb3RlIHRoYXQgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigpIGRvZXMgTk9UIGFwcGVuZCBjb2xvbgorLy8gdG8gdGhlIGZpbGUgbG9jYXRpb24gaXQgcHJvZHVjZXMsIHVubGlrZSBGb3JtYXRGaWxlTG9jYXRpb24oKS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKAorICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSA9IGZpbGUgPT0gTlVMTCA/IGtVbmtub3duRmlsZSA6IGZpbGU7CisKKyAgaWYgKGxpbmUgPCAwKQorICAgIHJldHVybiBmaWxlX25hbWU7CisgIGVsc2UKKyAgICByZXR1cm4gU3RyaW5nOjpGb3JtYXQoIiVzOiVkIiwgZmlsZV9uYW1lLCBsaW5lKS5jX3N0cigpOworfQorCisKK0dUZXN0TG9nOjpHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkKKyAgICA6IHNldmVyaXR5XyhzZXZlcml0eSkgeworICBjb25zdCBjaGFyKiBjb25zdCBtYXJrZXIgPQorICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfSU5GTyA/ICAgICJbICBJTkZPIF0iIDoKKyAgICAgIHNldmVyaXR5ID09IEdURVNUX1dBUk5JTkcgPyAiW1dBUk5JTkddIiA6CisgICAgICBzZXZlcml0eSA9PSBHVEVTVF9FUlJPUiA/ICAgIlsgRVJST1IgXSIgOiAiWyBGQVRBTCBdIjsKKyAgR2V0U3RyZWFtKCkgPDwgOjpzdGQ6OmVuZGwgPDwgbWFya2VyIDw8ICIgIgorICAgICAgICAgICAgICA8PCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSA8PCAiOiAiOworfQorCisvLyBGbHVzaGVzIHRoZSBidWZmZXJzIGFuZCwgaWYgc2V2ZXJpdHkgaXMgR1RFU1RfRkFUQUwsIGFib3J0cyB0aGUgcHJvZ3JhbS4KK0dUZXN0TG9nOjp+R1Rlc3RMb2coKSB7CisgIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsOworICBpZiAoc2V2ZXJpdHlfID09IEdURVNUX0ZBVEFMKSB7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkFib3J0KCk7CisgIH0KK30KKy8vIERpc2FibGUgTWljcm9zb2Z0IGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZvciBQT1NJWCBmdW5jdGlvbnMgY2FsbGVkIGZyb20KKy8vIHRoaXMgY2xhc3MgKGNyZWF0LCBkdXAsIGR1cDIsIGFuZCBjbG9zZSkKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwdXNoKQorIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0OTk2KQorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisvLyBPYmplY3QgdGhhdCBjYXB0dXJlcyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KK2NsYXNzIENhcHR1cmVkU3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjdG9yIHJlZGlyZWN0cyB0aGUgc3RyZWFtIHRvIGEgdGVtcG9yYXJ5IGZpbGUuCisgIENhcHR1cmVkU3RyZWFtKGludCBmZCkgOiBmZF8oZmQpLCB1bmNhcHR1cmVkX2ZkXyhkdXAoZmQpKSB7CisKKyMgaWYgR1RFU1RfT1NfV0lORE9XUworICAgIGNoYXIgdGVtcF9kaXJfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKKyAgICBjaGFyIHRlbXBfZmlsZV9wYXRoW01BWF9QQVRIICsgMV0gPSB7ICdcMCcgfTsgIC8vIE5PTElOVAorCisgICAgOjpHZXRUZW1wUGF0aEEoc2l6ZW9mKHRlbXBfZGlyX3BhdGgpLCB0ZW1wX2Rpcl9wYXRoKTsKKyAgICBjb25zdCBVSU5UIHN1Y2Nlc3MgPSA6OkdldFRlbXBGaWxlTmFtZUEodGVtcF9kaXJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd0ZXN0X3JlZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIEdlbmVyYXRlIHVuaXF1ZSBmaWxlIG5hbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZmlsZV9wYXRoKTsKKyAgICBHVEVTVF9DSEVDS18oc3VjY2VzcyAhPSAwKQorICAgICAgICA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluICIgPDwgdGVtcF9kaXJfcGF0aDsKKyAgICBjb25zdCBpbnQgY2FwdHVyZWRfZmQgPSBjcmVhdCh0ZW1wX2ZpbGVfcGF0aCwgX1NfSVJFQUQgfCBfU19JV1JJVEUpOworICAgIEdURVNUX0NIRUNLXyhjYXB0dXJlZF9mZCAhPSAtMSkgPDwgIlVuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRlbXBfZmlsZV9wYXRoOworICAgIGZpbGVuYW1lXyA9IHRlbXBfZmlsZV9wYXRoOworIyBlbHNlCisgICAgLy8gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHRlc3QgaGFzIHdyaXRlIGFjY2VzcyB0byB0aGUKKyAgICAvLyBjdXJyZW50IGRpcmVjdG9yeSwgc28gd2UgY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgL3RtcAorICAgIC8vIGRpcmVjdG9yeSBpbnN0ZWFkLgorICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi90bXAvY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7CisgICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gbWtzdGVtcChuYW1lX3RlbXBsYXRlKTsKKyAgICBmaWxlbmFtZV8gPSBuYW1lX3RlbXBsYXRlOworIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworICAgIGZmbHVzaChOVUxMKTsKKyAgICBkdXAyKGNhcHR1cmVkX2ZkLCBmZF8pOworICAgIGNsb3NlKGNhcHR1cmVkX2ZkKTsKKyAgfQorCisgIH5DYXB0dXJlZFN0cmVhbSgpIHsKKyAgICByZW1vdmUoZmlsZW5hbWVfLmNfc3RyKCkpOworICB9CisKKyAgU3RyaW5nIEdldENhcHR1cmVkU3RyaW5nKCkgeworICAgIGlmICh1bmNhcHR1cmVkX2ZkXyAhPSAtMSkgeworICAgICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgIGZmbHVzaChOVUxMKTsKKyAgICAgIGR1cDIodW5jYXB0dXJlZF9mZF8sIGZkXyk7CisgICAgICBjbG9zZSh1bmNhcHR1cmVkX2ZkXyk7CisgICAgICB1bmNhcHR1cmVkX2ZkXyA9IC0xOworICAgIH0KKworICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4oZmlsZW5hbWVfLmNfc3RyKCksICJyIik7CisgICAgY29uc3QgU3RyaW5nIGNvbnRlbnQgPSBSZWFkRW50aXJlRmlsZShmaWxlKTsKKyAgICBwb3NpeDo6RkNsb3NlKGZpbGUpOworICAgIHJldHVybiBjb250ZW50OworICB9CisKKyBwcml2YXRlOgorICAvLyBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBmaWxlIGFzIGEgU3RyaW5nLgorICBzdGF0aWMgU3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpOworCisgIC8vIFJldHVybnMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIGZpbGUuCisgIHN0YXRpYyBzaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSk7CisKKyAgY29uc3QgaW50IGZkXzsgIC8vIEEgc3RyZWFtIHRvIGNhcHR1cmUuCisgIGludCB1bmNhcHR1cmVkX2ZkXzsKKyAgLy8gTmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaG9sZGluZyB0aGUgc3RkZXJyIG91dHB1dC4KKyAgOjpzdGQ6OnN0cmluZyBmaWxlbmFtZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhDYXB0dXJlZFN0cmVhbSk7Cit9OworCisvLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgorc2l6ZV90IENhcHR1cmVkU3RyZWFtOjpHZXRGaWxlU2l6ZShGSUxFKiBmaWxlKSB7CisgIGZzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oZnRlbGwoZmlsZSkpOworfQorCisvLyBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBmaWxlIGFzIGEgc3RyaW5nLgorU3RyaW5nIENhcHR1cmVkU3RyZWFtOjpSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKSB7CisgIGNvbnN0IHNpemVfdCBmaWxlX3NpemUgPSBHZXRGaWxlU2l6ZShmaWxlKTsKKyAgY2hhciogY29uc3QgYnVmZmVyID0gbmV3IGNoYXJbZmlsZV9zaXplXTsKKworICBzaXplX3QgYnl0ZXNfbGFzdF9yZWFkID0gMDsgIC8vICMgb2YgYnl0ZXMgcmVhZCBpbiB0aGUgbGFzdCBmcmVhZCgpCisgIHNpemVfdCBieXRlc19yZWFkID0gMDsgICAgICAgLy8gIyBvZiBieXRlcyByZWFkIHNvIGZhcgorCisgIGZzZWVrKGZpbGUsIDAsIFNFRUtfU0VUKTsKKworICAvLyBLZWVwcyByZWFkaW5nIHRoZSBmaWxlIHVudGlsIHdlIGNhbm5vdCByZWFkIGZ1cnRoZXIgb3IgdGhlCisgIC8vIHByZS1kZXRlcm1pbmVkIGZpbGUgc2l6ZSBpcyByZWFjaGVkLgorICBkbyB7CisgICAgYnl0ZXNfbGFzdF9yZWFkID0gZnJlYWQoYnVmZmVyK2J5dGVzX3JlYWQsIDEsIGZpbGVfc2l6ZS1ieXRlc19yZWFkLCBmaWxlKTsKKyAgICBieXRlc19yZWFkICs9IGJ5dGVzX2xhc3RfcmVhZDsKKyAgfSB3aGlsZSAoYnl0ZXNfbGFzdF9yZWFkID4gMCAmJiBieXRlc19yZWFkIDwgZmlsZV9zaXplKTsKKworICBjb25zdCBTdHJpbmcgY29udGVudChidWZmZXIsIGJ5dGVzX3JlYWQpOworICBkZWxldGVbXSBidWZmZXI7CisKKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisKKyMgaWZkZWYgX01TQ19WRVIKKyMgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgZW5kaWYgIC8vIF9NU0NfVkVSCisKK3N0YXRpYyBDYXB0dXJlZFN0cmVhbSogZ19jYXB0dXJlZF9zdGRlcnIgPSBOVUxMOworc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZG91dCA9IE5VTEw7CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgYW4gb3V0cHV0IHN0cmVhbSAoc3Rkb3V0L3N0ZGVycikuCit2b2lkIENhcHR1cmVTdHJlYW0oaW50IGZkLCBjb25zdCBjaGFyKiBzdHJlYW1fbmFtZSwgQ2FwdHVyZWRTdHJlYW0qKiBzdHJlYW0pIHsKKyAgaWYgKCpzdHJlYW0gIT0gTlVMTCkgeworICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJPbmx5IG9uZSAiIDw8IHN0cmVhbV9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBjYXB0dXJlciBjYW4gZXhpc3QgYXQgYSB0aW1lLiI7CisgIH0KKyAgKnN0cmVhbSA9IG5ldyBDYXB0dXJlZFN0cmVhbShmZCk7Cit9CisKKy8vIFN0b3BzIGNhcHR1cmluZyB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorU3RyaW5nIEdldENhcHR1cmVkU3RyZWFtKENhcHR1cmVkU3RyZWFtKiogY2FwdHVyZWRfc3RyZWFtKSB7CisgIGNvbnN0IFN0cmluZyBjb250ZW50ID0gKCpjYXB0dXJlZF9zdHJlYW0pLT5HZXRDYXB0dXJlZFN0cmluZygpOworCisgIGRlbGV0ZSAqY2FwdHVyZWRfc3RyZWFtOworICAqY2FwdHVyZWRfc3RyZWFtID0gTlVMTDsKKworICByZXR1cm4gY29udGVudDsKK30KKworLy8gU3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCit2b2lkIENhcHR1cmVTdGRvdXQoKSB7CisgIENhcHR1cmVTdHJlYW0oa1N0ZE91dEZpbGVubywgInN0ZG91dCIsICZnX2NhcHR1cmVkX3N0ZG91dCk7Cit9CisKKy8vIFN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgordm9pZCBDYXB0dXJlU3RkZXJyKCkgeworICBDYXB0dXJlU3RyZWFtKGtTdGRFcnJGaWxlbm8sICJzdGRlcnIiLCAmZ19jYXB0dXJlZF9zdGRlcnIpOworfQorCisvLyBTdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCitTdHJpbmcgR2V0Q2FwdHVyZWRTdGRvdXQoKSB7IHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRvdXQpOyB9CisKKy8vIFN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KK1N0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpIHsgcmV0dXJuIEdldENhcHR1cmVkU3RyZWFtKCZnX2NhcHR1cmVkX3N0ZGVycik7IH0KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KKzo6c3RkOjp2ZWN0b3I8U3RyaW5nPiBnX2FyZ3ZzOworCisvLyBSZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgYXMgYSB2ZWN0b3Igb2Ygc3RyaW5ncy4KK2NvbnN0IDo6c3RkOjp2ZWN0b3I8U3RyaW5nPiYgR2V0QXJndnMoKSB7IHJldHVybiBnX2FyZ3ZzOyB9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCituYW1lc3BhY2UgcG9zaXggewordm9pZCBBYm9ydCgpIHsKKyAgRGVidWdCcmVhaygpOworICBUZXJtaW5hdGVQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIDEpOworfQorfSAgLy8gbmFtZXNwYWNlIHBvc2l4CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisvLyBnaXZlbiBmbGFnLiAgRm9yIGV4YW1wbGUsIEZsYWdUb0VudlZhcigiZm9vIikgd2lsbCByZXR1cm4KKy8vICJHVEVTVF9GT08iIGluIHRoZSBvcGVuLXNvdXJjZSB2ZXJzaW9uLgorc3RhdGljIFN0cmluZyBGbGFnVG9FbnZWYXIoY29uc3QgY2hhciogZmxhZykgeworICBjb25zdCBTdHJpbmcgZnVsbF9mbGFnID0KKyAgICAgIChNZXNzYWdlKCkgPDwgR1RFU1RfRkxBR19QUkVGSVhfIDw8IGZsYWcpLkdldFN0cmluZygpOworCisgIE1lc3NhZ2UgZW52X3ZhcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gZnVsbF9mbGFnLmxlbmd0aCgpOyBpKyspIHsKKyAgICBlbnZfdmFyIDw8IFRvVXBwZXIoZnVsbF9mbGFnLmNfc3RyKClbaV0pOworICB9CisKKyAgcmV0dXJuIGVudl92YXIuR2V0U3RyaW5nKCk7Cit9CisKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMKKy8vIHRoZSByZXN1bHQgdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlCisvLyB1bmNoYW5nZWQgYW5kIHJldHVybnMgZmFsc2UuCitib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKSB7CisgIC8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBkZWNpbWFsIGludGVnZXIuCisgIGNoYXIqIGVuZCA9IE5VTEw7CisgIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVAorCisgIC8vIEhhcyBzdHJ0b2woKSBjb25zdW1lZCBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nPworICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgLy8gTm8gLSBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgZW5jb3VudGVyZWQuCisgICAgTWVzc2FnZSBtc2c7CisgICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0CisgICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgorICAgICAgICA8PCAiIGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7CisgICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KKyAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOworICBpZiAobG9uZ192YWx1ZSA9PSBMT05HX01BWCB8fCBsb25nX3ZhbHVlID09IExPTkdfTUlOIHx8CisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucworICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKKyAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KKyAgICAgICkgeworICAgIE1lc3NhZ2UgbXNnOworICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAorICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKKyAgICAgICAgPDwgIiBoYXMgdmFsdWUgIiA8PCBzdHIgPDwgIiwgd2hpY2ggb3ZlcmZsb3dzLlxuIjsKKyAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICp2YWx1ZSA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBCb29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KKy8vCisvLyBUaGUgdmFsdWUgaXMgY29uc2lkZXJlZCB0cnVlIGlmZiBpdCdzIG5vdCAiMCIuCitib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7CisgIGNvbnN0IFN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOworICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiBzdHJpbmdfdmFsdWUgPT0gTlVMTCA/CisgICAgICBkZWZhdWx0X3ZhbHVlIDogc3RyY21wKHN0cmluZ192YWx1ZSwgIjAiKSAhPSAwOworfQorCisvLyBSZWFkcyBhbmQgcmV0dXJucyBhIDMyLWJpdCBpbnRlZ2VyIHN0b3JlZCBpbiB0aGUgZW52aXJvbm1lbnQKKy8vIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0IGlzbid0IHNldCBvcgorLy8gZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAzMi1iaXQgaW50ZWdlciwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgorSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBTdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOworICBpZiAoc3RyaW5nX3ZhbHVlID09IE5VTEwpIHsKKyAgICAvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4KKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIEludDMyIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7CisgIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIkVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSwgJnJlc3VsdCkpIHsKKyAgICBwcmludGYoIlRoZSBkZWZhdWx0IHZhbHVlICVzIGlzIHVzZWQuXG4iLAorICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGRlZmF1bHRfdmFsdWUpLkdldFN0cmluZygpLmNfc3RyKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitjb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBTdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7CisgIHJldHVybiB2YWx1ZSA9PSBOVUxMID8gZGVmYXVsdF92YWx1ZSA6IHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorCisvLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlciB0aGF0IGNhbiBwcmludCBhCisvLyB2YWx1ZSBvZiBhbnkgdHlwZSBUOgorLy8KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpOworLy8KKy8vIEl0IHVzZXMgdGhlIDw8IG9wZXJhdG9yIHdoZW4gcG9zc2libGUsIGFuZCBwcmludHMgdGhlIGJ5dGVzIGluIHRoZQorLy8gb2JqZWN0IG90aGVyd2lzZS4gIEEgdXNlciBjYW4gb3ZlcnJpZGUgaXRzIGJlaGF2aW9yIGZvciBhIGNsYXNzCisvLyB0eXBlIEZvbyBieSBkZWZpbmluZyBlaXRoZXIgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYsIGNvbnN0IEZvbyYpCisvLyBvciB2b2lkIFByaW50VG8oY29uc3QgRm9vJiwgOjpzdGQ6Om9zdHJlYW0qKSBpbiB0aGUgbmFtZXNwYWNlIHRoYXQKKy8vIGRlZmluZXMgRm9vLgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjpzdGQ6Om9zdHJlYW07CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAgLy8gV2luZG93cyBDRSBkb2VzIG5vdCBkZWZpbmUgX3NucHJpbnRmX3MuCisjIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbGlmIF9NU0NfVkVSID49IDE0MDAgIC8vIFZDIDguMCBhbmQgbGF0ZXIgZGVwcmVjYXRlIHNucHJpbnRmIGFuZCBfc25wcmludGYuCisjIGRlZmluZSBzbnByaW50ZiBfc25wcmludGZfcworI2VsaWYgX01TQ19WRVIKKyMgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQorCisvLyBQcmludHMgYSBzZWdtZW50IG9mIGJ5dGVzIGluIHRoZSBnaXZlbiBvYmplY3QuCit2b2lkIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIG9zdHJlYW0qIG9zKSB7CisgIGNoYXIgdGV4dFs1XSA9ICIiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisgICAgY29uc3Qgc2l6ZV90IGogPSBzdGFydCArIGk7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgLy8gT3JnYW5pemVzIHRoZSBieXRlcyBpbnRvIGdyb3VwcyBvZiAyIGZvciBlYXN5IHBhcnNpbmcgYnkKKyAgICAgIC8vIGh1bWFuLgorICAgICAgaWYgKChqICUgMikgPT0gMCkKKyAgICAgICAgKm9zIDw8ICcgJzsKKyAgICAgIGVsc2UKKyAgICAgICAgKm9zIDw8ICctJzsKKyAgICB9CisgICAgc25wcmludGYodGV4dCwgc2l6ZW9mKHRleHQpLCAiJTAyWCIsIG9ial9ieXRlc1tqXSk7CisgICAgKm9zIDw8IHRleHQ7CisgIH0KK30KKworLy8gUHJpbnRzIHRoZSBieXRlcyBpbiB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uCit2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbChjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7CisgIC8vIFRlbGxzIHRoZSB1c2VyIGhvdyBiaWcgdGhlIG9iamVjdCBpcy4KKyAgKm9zIDw8IGNvdW50IDw8ICItYnl0ZSBvYmplY3QgPCI7CisKKyAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxMzI7CisgIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gNjQ7CisgIC8vIElmIHRoZSBvYmplY3Qgc2l6ZSBpcyBiaWdnZXIgdGhhbiBrVGhyZXNob2xkLCB3ZSdsbCBoYXZlIHRvIG9taXQKKyAgLy8gc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBrQ2h1bmtTaXplCisgIC8vIGJ5dGVzLgorICAvLyBUT0RPKHdhbik6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgorICBpZiAoY291bnQgPCBrVGhyZXNob2xkKSB7CisgICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBjb3VudCwgb3MpOworICB9IGVsc2UgeworICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgMCwga0NodW5rU2l6ZSwgb3MpOworICAgICpvcyA8PCAiIC4uLiAiOworICAgIC8vIFJvdW5kcyB1cCB0byAyLWJ5dGUgYm91bmRhcnkuCisgICAgY29uc3Qgc2l6ZV90IHJlc3VtZV9wb3MgPSAoY291bnQgLSBrQ2h1bmtTaXplICsgMSkvMioyOworICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgcmVzdW1lX3BvcywgY291bnQgLSByZXN1bWVfcG9zLCBvcyk7CisgIH0KKyAgKm9zIDw8ICI+IjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbDIgeworCisvLyBEZWxlZ2F0ZXMgdG8gUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKCkgdG8gcHJpbnQgdGhlIGJ5dGVzIGluIHRoZQorLy8gZ2l2ZW4gb2JqZWN0LiAgVGhlIGRlbGVnYXRpb24gc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoCisvLyB1c2VzIHRoZSA8PCBvcGVyYXRvciBhbmQgdGh1cyBpcyBlYXNpZXIgZG9uZSBvdXRzaWRlIG9mIHRoZQorLy8gOjp0ZXN0aW5nOjppbnRlcm5hbCBuYW1lc3BhY2UsIHdoaWNoIGNvbnRhaW5zIGEgPDwgb3BlcmF0b3IgdGhhdAorLy8gc29tZXRpbWVzIGNvbmZsaWN0cyB3aXRoIHRoZSBvbmUgaW4gU1RMLgordm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKG9ial9ieXRlcywgY291bnQsIG9zKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGEgY2hhciAob3Igd2NoYXJfdCksIHdlIHByaW50IGl0IGluIG9uZQorLy8gb2YgdGhyZWUgZm9ybWF0czoKKy8vICAgLSBhcyBpcyBpZiBpdCdzIGEgcHJpbnRhYmxlIEFTQ0lJIChlLmcuICdhJywgJzInLCAnICcpLAorLy8gICAtIGFzIGEgaGV4aWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdceDdGJyksIG9yCisvLyAgIC0gYXMgYSBzcGVjaWFsIGVzY2FwZSBzZXF1ZW5jZSAoZS5nLiAnXHInLCAnXG4nKS4KK2VudW0gQ2hhckZvcm1hdCB7CisgIGtBc0lzLAorICBrSGV4RXNjYXBlLAorICBrU3BlY2lhbEVzY2FwZQorfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIGMgaXMgYSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyLiAgV2UgdGVzdCB0aGUKKy8vIHZhbHVlIG9mIGMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIGlzcHJpbnQoKSwgd2hpY2ggaXMgYnVnZ3kgb24KKy8vIFdpbmRvd3MgTW9iaWxlLgoraW5saW5lIGJvb2wgSXNQcmludGFibGVBc2NpaSh3Y2hhcl90IGMpIHsKKyAgcmV0dXJuIDB4MjAgPD0gYyAmJiBjIDw9IDB4N0U7Cit9CisKKy8vIFByaW50cyBhIHdpZGUgb3IgbmFycm93IGNoYXIgYyBhcyBhIGNoYXJhY3RlciBsaXRlcmFsIHdpdGhvdXQgdGhlCisvLyBxdW90ZXMsIGVzY2FwaW5nIGl0IHdoZW4gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCisvLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsCisvLyB3aGljaCBpcyB0aGUgdHlwZSBvZiBjLgordGVtcGxhdGUgPHR5cGVuYW1lIFVuc2lnbmVkQ2hhciwgdHlwZW5hbWUgQ2hhcj4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNDaGFyTGl0ZXJhbFRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsKKyAgc3dpdGNoIChzdGF0aWNfY2FzdDx3Y2hhcl90PihjKSkgeworICAgIGNhc2UgTCdcMCc6CisgICAgICAqb3MgPDwgIlxcMCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXCcnOgorICAgICAgKm9zIDw8ICJcXCciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xcJzoKKyAgICAgICpvcyA8PCAiXFxcXCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGEnOgorICAgICAgKm9zIDw8ICJcXGEiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xiJzoKKyAgICAgICpvcyA8PCAiXFxiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcZic6CisgICAgICAqb3MgPDwgIlxcZiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXG4nOgorICAgICAgKm9zIDw8ICJcXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ1xyJzoKKyAgICAgICpvcyA8PCAiXFxyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTCdcdCc6CisgICAgICAqb3MgPDwgIlxcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXHYnOgorICAgICAgKm9zIDw8ICJcXHYiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChJc1ByaW50YWJsZUFzY2lpKGMpKSB7CisgICAgICAgICpvcyA8PCBzdGF0aWNfY2FzdDxjaGFyPihjKTsKKyAgICAgICAgcmV0dXJuIGtBc0lzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKm9zIDw8IFN0cmluZzo6Rm9ybWF0KCJcXHglWCIsIHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpOworICAgICAgICByZXR1cm4ga0hleEVzY2FwZTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7Cit9CisKKy8vIFByaW50cyBhIGNoYXIgYyBhcyBpZiBpdCdzIHBhcnQgb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZXNjYXBpbmcgaXQgd2hlbgorLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCitzdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzV2lkZVN0cmluZ0xpdGVyYWxUbyh3Y2hhcl90IGMsIG9zdHJlYW0qIG9zKSB7CisgIHN3aXRjaCAoYykgeworICAgIGNhc2UgTCdcJyc6CisgICAgICAqb3MgPDwgIiciOworICAgICAgcmV0dXJuIGtBc0lzOworICAgIGNhc2UgTCciJzoKKyAgICAgICpvcyA8PCAiXFxcIiI7CisgICAgICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBQcmludEFzQ2hhckxpdGVyYWxUbzx3Y2hhcl90PihjLCBvcyk7CisgIH0KK30KKworLy8gUHJpbnRzIGEgY2hhciBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuCisvLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KK3N0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNOYXJyb3dTdHJpbmdMaXRlcmFsVG8oY2hhciBjLCBvc3RyZWFtKiBvcykgeworICByZXR1cm4gUHJpbnRBc1dpZGVTdHJpbmdMaXRlcmFsVG8oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyksIG9zKTsKK30KKworLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhcmFjdGVyIGMgYW5kIGl0cyBjb2RlLiAgJ1wwJyBpcyBwcmludGVkCisvLyBhcyAiJ1xcMCciLCBvdGhlciB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBhbHNvIHByb3Blcmx5IGVzY2FwZWQKKy8vIHVzaW5nIHRoZSBzdGFuZGFyZCBDKysgZXNjYXBlIHNlcXVlbmNlLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50CisvLyBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBVbnNpZ25lZENoYXIsIHR5cGVuYW1lIENoYXI+Cit2b2lkIFByaW50Q2hhckFuZENvZGVUbyhDaGFyIGMsIG9zdHJlYW0qIG9zKSB7CisgIC8vIEZpcnN0LCBwcmludCBjIGFzIGEgbGl0ZXJhbCBpbiB0aGUgbW9zdCByZWFkYWJsZSBmb3JtIHdlIGNhbiBmaW5kLgorICAqb3MgPDwgKChzaXplb2YoYykgPiAxKSA/ICJMJyIgOiAiJyIpOworICBjb25zdCBDaGFyRm9ybWF0IGZvcm1hdCA9IFByaW50QXNDaGFyTGl0ZXJhbFRvPFVuc2lnbmVkQ2hhcj4oYywgb3MpOworICAqb3MgPDwgIiciOworCisgIC8vIFRvIGFpZCB1c2VyIGRlYnVnZ2luZywgd2UgYWxzbyBwcmludCBjJ3MgY29kZSBpbiBkZWNpbWFsLCB1bmxlc3MKKyAgLy8gaXQncyAwIChpbiB3aGljaCBjYXNlIGMgd2FzIHByaW50ZWQgYXMgJ1xcMCcsIG1ha2luZyB0aGUgY29kZQorICAvLyBvYnZpb3VzKS4KKyAgaWYgKGMgPT0gMCkKKyAgICByZXR1cm47CisgICpvcyA8PCAiICgiIDw8IFN0cmluZzo6Rm9ybWF0KCIlZCIsIGMpLmNfc3RyKCk7CisKKyAgLy8gRm9yIG1vcmUgY29udmVuaWVuY2UsIHdlIHByaW50IGMncyBjb2RlIGFnYWluIGluIGhleGlkZWNpbWFsLAorICAvLyB1bmxlc3MgYyB3YXMgYWxyZWFkeSBwcmludGVkIGluIHRoZSBmb3JtICdceCMjJyBvciB0aGUgY29kZSBpcyBpbgorICAvLyBbMSwgOV0uCisgIGlmIChmb3JtYXQgPT0ga0hleEVzY2FwZSB8fCAoMSA8PSBjICYmIGMgPD0gOSkpIHsKKyAgICAvLyBEbyBub3RoaW5nLgorICB9IGVsc2UgeworICAgICpvcyA8PCBTdHJpbmc6OkZvcm1hdCgiLCAweCVYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSkuY19zdHIoKTsKKyAgfQorICAqb3MgPDwgIikiOworfQorCit2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKK30KK3ZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKK30KKworLy8gUHJpbnRzIGEgd2NoYXJfdCBhcyBhIHN5bWJvbCBpZiBpdCBpcyBwcmludGFibGUgb3IgYXMgaXRzIGludGVybmFsCisvLyBjb2RlIG90aGVyd2lzZSBhbmQgYWxzbyBhcyBpdHMgY29kZS4gIEwnXDAnIGlzIHByaW50ZWQgYXMgIkwnXFwwJyIuCit2b2lkIFByaW50VG8od2NoYXJfdCB3Yywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyQW5kQ29kZVRvPHdjaGFyX3Q+KHdjLCBvcyk7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0byB0aGUgb3N0cmVhbS4KKy8vIFRoZSBhcnJheSBzdGFydHMgYXQgKmJlZ2luLCB0aGUgbGVuZ3RoIGlzIGxlbiwgaXQgbWF5IGluY2x1ZGUgJ1wwJyBjaGFyYWN0ZXJzCisvLyBhbmQgbWF5IG5vdCBiZSBudWxsLXRlcm1pbmF0ZWQuCitzdGF0aWMgdm9pZCBQcmludENoYXJzQXNTdHJpbmdUbyhjb25zdCBjaGFyKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICJcIiI7CisgIGJvb2wgaXNfcHJldmlvdXNfaGV4ID0gZmFsc2U7CisgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBsZW47ICsraW5kZXgpIHsKKyAgICBjb25zdCBjaGFyIGN1ciA9IGJlZ2luW2luZGV4XTsKKyAgICBpZiAoaXNfcHJldmlvdXNfaGV4ICYmIElzWERpZ2l0KGN1cikpIHsKKyAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciBpcyBvZiAnXHguLicgZm9ybSBhbmQgdGhpcyBjaGFyYWN0ZXIgY2FuIGJlCisgICAgICAvLyBpbnRlcnByZXRlZCBhcyBhbm90aGVyIGhleGFkZWNpbWFsIGRpZ2l0IGluIGl0cyBudW1iZXIuIEJyZWFrIHN0cmluZyB0bworICAgICAgLy8gZGlzYW1iaWd1YXRlLgorICAgICAgKm9zIDw8ICJcIiBcIiI7CisgICAgfQorICAgIGlzX3ByZXZpb3VzX2hleCA9IFByaW50QXNOYXJyb3dTdHJpbmdMaXRlcmFsVG8oY3VyLCBvcykgPT0ga0hleEVzY2FwZTsKKyAgfQorICAqb3MgPDwgIlwiIjsKK30KKworLy8gUHJpbnRzIGEgKGNvbnN0KSBjaGFyIGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzICdiZWdpbicuCit2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7CisgIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4sIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSBvZiB3aWRlIGNoYXJhY3RlcnMgdG8gdGhlIG9zdHJlYW0uCisvLyBUaGUgYXJyYXkgc3RhcnRzIGF0ICpiZWdpbiwgdGhlIGxlbmd0aCBpcyBsZW4sIGl0IG1heSBpbmNsdWRlIEwnXDAnCisvLyBjaGFyYWN0ZXJzIGFuZCBtYXkgbm90IGJlIG51bGwtdGVybWluYXRlZC4KK3N0YXRpYyB2b2lkIFByaW50V2lkZUNoYXJzQXNTdHJpbmdUbyhjb25zdCB3Y2hhcl90KiBiZWdpbiwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgeworICAqb3MgPDwgIkxcIiI7CisgIGJvb2wgaXNfcHJldmlvdXNfaGV4ID0gZmFsc2U7CisgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBsZW47ICsraW5kZXgpIHsKKyAgICBjb25zdCB3Y2hhcl90IGN1ciA9IGJlZ2luW2luZGV4XTsKKyAgICBpZiAoaXNfcHJldmlvdXNfaGV4ICYmIGlzYXNjaWkoY3VyKSAmJiBJc1hEaWdpdChzdGF0aWNfY2FzdDxjaGFyPihjdXIpKSkgeworICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIGlzIG9mICdceC4uJyBmb3JtIGFuZCB0aGlzIGNoYXJhY3RlciBjYW4gYmUKKyAgICAgIC8vIGludGVycHJldGVkIGFzIGFub3RoZXIgaGV4YWRlY2ltYWwgZGlnaXQgaW4gaXRzIG51bWJlci4gQnJlYWsgc3RyaW5nIHRvCisgICAgICAvLyBkaXNhbWJpZ3VhdGUuCisgICAgICAqb3MgPDwgIlwiIExcIiI7CisgICAgfQorICAgIGlzX3ByZXZpb3VzX2hleCA9IFByaW50QXNXaWRlU3RyaW5nTGl0ZXJhbFRvKGN1ciwgb3MpID09IGtIZXhFc2NhcGU7CisgIH0KKyAgKm9zIDw8ICJcIiI7Cit9CisKKy8vIFByaW50cyB0aGUgZ2l2ZW4gQyBzdHJpbmcgdG8gdGhlIG9zdHJlYW0uCit2b2lkIFByaW50VG8oY29uc3QgY2hhciogcywgb3N0cmVhbSogb3MpIHsKKyAgaWYgKHMgPT0gTlVMTCkgeworICAgICpvcyA8PCAiTlVMTCI7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8IEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpIDw8ICIgcG9pbnRpbmcgdG8gIjsKKyAgICBQcmludENoYXJzQXNTdHJpbmdUbyhzLCBzdHJsZW4ocyksIG9zKTsKKyAgfQorfQorCisvLyBNU1ZDIGNvbXBpbGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIGRlZmluZSB3aGFyX3QgYXMgYSB0eXBlZGVmCisvLyBvZiB1bnNpZ25lZCBzaG9ydC4gRGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0IHdjaGFyX3QqIGluIHRoYXQgY2FzZQorLy8gd291bGQgY2F1c2UgcG9pbnRlcnMgdG8gdW5zaWduZWQgc2hvcnRzIGJlIHByaW50ZWQgYXMgd2lkZSBzdHJpbmdzLAorLy8gcG9zc2libHkgYWNjZXNzaW5nIG1vcmUgbWVtb3J5IHRoYW4gaW50ZW5kZWQgYW5kIGNhdXNpbmcgaW52YWxpZAorLy8gbWVtb3J5IGFjY2Vzc2VzLiBNU1ZDIGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgc3ltYm9sIHdoZW4KKy8vIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYXMgYSBuYXRpdmUgdHlwZS4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKKy8vIFByaW50cyB0aGUgZ2l2ZW4gd2lkZSBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4KK3ZvaWQgUHJpbnRUbyhjb25zdCB3Y2hhcl90KiBzLCBvc3RyZWFtKiBvcykgeworICBpZiAocyA9PSBOVUxMKSB7CisgICAgKm9zIDw8ICJOVUxMIjsKKyAgfSBlbHNlIHsKKyAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOworICAgIFByaW50V2lkZUNoYXJzQXNTdHJpbmdUbyhzLCB3Y3NsZW4ocyksIG9zKTsKKyAgfQorfQorI2VuZGlmICAvLyB3Y2hhcl90IGlzIG5hdGl2ZQorCisvLyBQcmludHMgYSA6OnN0cmluZyBvYmplY3QuCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKK3ZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKKyAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCisKK3ZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKK30KKworLy8gUHJpbnRzIGEgOjp3c3RyaW5nIG9iamVjdC4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK3ZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludFdpZGVDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCit2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgeworICBQcmludFdpZGVDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorCisKKy8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKKy8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcworLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8KKy8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbgorLy8gaGlzIGNvZGUuCisjZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCisjdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKwordXNpbmcgaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbDsKKworLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlIGJ5IG9taXR0aW5nIHRoZSBzdGFjayB0cmFjZQorLy8gaW4gaXQuCitpbnRlcm5hbDo6U3RyaW5nIFRlc3RQYXJ0UmVzdWx0OjpFeHRyYWN0U3VtbWFyeShjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHN0YWNrX3RyYWNlID0gc3Ryc3RyKG1lc3NhZ2UsIGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlcik7CisgIHJldHVybiBzdGFja190cmFjZSA9PSBOVUxMID8gaW50ZXJuYWw6OlN0cmluZyhtZXNzYWdlKSA6CisgICAgICBpbnRlcm5hbDo6U3RyaW5nKG1lc3NhZ2UsIHN0YWNrX3RyYWNlIC0gbWVzc2FnZSk7Cit9CisKKy8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdC4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7CisgIHJldHVybiBvcworICAgICAgPDwgcmVzdWx0LmZpbGVfbmFtZSgpIDw8ICI6IiA8PCByZXN1bHQubGluZV9udW1iZXIoKSA8PCAiOiAiCisgICAgICA8PCAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MgPyAiU3VjY2VzcyIgOgorICAgICAgICAgIHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgPyAiRmF0YWwgZmFpbHVyZSIgOgorICAgICAgICAgICJOb24tZmF0YWwgZmFpbHVyZSIpIDw8ICI6XG4iCisgICAgICA8PCByZXN1bHQubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKK30KKworLy8gQXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KK3ZvaWQgVGVzdFBhcnRSZXN1bHRBcnJheTo6QXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKKyAgYXJyYXlfLnB1c2hfYmFjayhyZXN1bHQpOworfQorCisvLyBSZXR1cm5zIHRoZSBUZXN0UGFydFJlc3VsdCBhdCB0aGUgZ2l2ZW4gaW5kZXggKDAtYmFzZWQpLgorY29uc3QgVGVzdFBhcnRSZXN1bHQmIFRlc3RQYXJ0UmVzdWx0QXJyYXk6OkdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3QgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKSkgeworICAgIHByaW50ZigiXG5JbnZhbGlkIGluZGV4ICglZCkgaW50byBUZXN0UGFydFJlc3VsdEFycmF5LlxuIiwgaW5kZXgpOworICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKKyAgfQorCisgIHJldHVybiBhcnJheV9baW5kZXhdOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVGVzdFBhcnRSZXN1bHQgb2JqZWN0cyBpbiB0aGUgYXJyYXkuCitpbnQgVGVzdFBhcnRSZXN1bHRBcnJheTo6c2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYXJyYXlfLnNpemUoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK0hhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCkKKyAgICA6IGhhc19uZXdfZmF0YWxfZmFpbHVyZV8oZmFsc2UpLAorICAgICAgb3JpZ2luYWxfcmVwb3J0ZXJfKEdldFVuaXRUZXN0SW1wbCgpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpKSB7CisgIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsKK30KKworSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjp+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCkgeworICBHZXRVbml0VGVzdEltcGwoKS0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCisgICAgICBvcmlnaW5hbF9yZXBvcnRlcl8pOworfQorCit2b2lkIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCisgICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgeworICBpZiAocmVzdWx0LmZhdGFsbHlfZmFpbGVkKCkpCisgICAgaGFzX25ld19mYXRhbF9mYWlsdXJlXyA9IHRydWU7CisgIG9yaWdpbmFsX3JlcG9ydGVyXy0+UmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGluIHN0ci4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgc3RyCisvLyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KK3N0YXRpYyBjb25zdCBjaGFyKiBTa2lwU3BhY2VzKGNvbnN0IGNoYXIqIHN0cikgeworICB3aGlsZSAoSXNTcGFjZSgqc3RyKSkKKyAgICBzdHIrKzsKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluCisvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKKy8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuCitjb25zdCBjaGFyKiBUeXBlZFRlc3RDYXNlUFN0YXRlOjpWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAorICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKSB7CisgIHR5cGVkZWYgOjpzdGQ6OnNldDxjb25zdCBjaGFyKj46OmNvbnN0X2l0ZXJhdG9yIERlZmluZWRUZXN0SXRlcjsKKyAgcmVnaXN0ZXJlZF8gPSB0cnVlOworCisgIC8vIFNraXAgaW5pdGlhbCB3aGl0ZXNwYWNlIGluIHJlZ2lzdGVyZWRfdGVzdHMgc2luY2Ugc29tZQorICAvLyBwcmVwcm9jZXNzb3JzIHByZWZpeCBzdHJpbmdpemllZCBsaXRlcmFscyB3aXRoIHdoaXRlc3BhY2UuCisgIHJlZ2lzdGVyZWRfdGVzdHMgPSBTa2lwU3BhY2VzKHJlZ2lzdGVyZWRfdGVzdHMpOworCisgIE1lc3NhZ2UgZXJyb3JzOworICA6OnN0ZDo6c2V0PFN0cmluZz4gdGVzdHM7CisgIGZvciAoY29uc3QgY2hhciogbmFtZXMgPSByZWdpc3RlcmVkX3Rlc3RzOyBuYW1lcyAhPSBOVUxMOworICAgICAgIG5hbWVzID0gU2tpcENvbW1hKG5hbWVzKSkgeworICAgIGNvbnN0IFN0cmluZyBuYW1lID0gR2V0UHJlZml4VW50aWxDb21tYShuYW1lcyk7CisgICAgaWYgKHRlc3RzLmNvdW50KG5hbWUpICE9IDApIHsKKyAgICAgIGVycm9ycyA8PCAiVGVzdCAiIDw8IG5hbWUgPDwgIiBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UuXG4iOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAoRGVmaW5lZFRlc3RJdGVyIGl0ID0gZGVmaW5lZF90ZXN0X25hbWVzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gZGVmaW5lZF90ZXN0X25hbWVzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmIChuYW1lID09ICppdCkgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3VuZCkgeworICAgICAgdGVzdHMuaW5zZXJ0KG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBlcnJvcnMgPDwgIk5vIHRlc3QgbmFtZWQgIiA8PCBuYW1lCisgICAgICAgICAgICAgPDwgIiBjYW4gYmUgZm91bmQgaW4gdGhpcyB0ZXN0IGNhc2UuXG4iOworICAgIH0KKyAgfQorCisgIGZvciAoRGVmaW5lZFRlc3RJdGVyIGl0ID0gZGVmaW5lZF90ZXN0X25hbWVzXy5iZWdpbigpOworICAgICAgIGl0ICE9IGRlZmluZWRfdGVzdF9uYW1lc18uZW5kKCk7CisgICAgICAgKytpdCkgeworICAgIGlmICh0ZXN0cy5jb3VudCgqaXQpID09IDApIHsKKyAgICAgIGVycm9ycyA8PCAiWW91IGZvcmdvdCB0byBsaXN0IHRlc3QgIiA8PCAqaXQgPDwgIi5cbiI7CisgICAgfQorICB9CisKKyAgY29uc3QgU3RyaW5nJiBlcnJvcnNfc3RyID0gZXJyb3JzLkdldFN0cmluZygpOworICBpZiAoZXJyb3JzX3N0ciAhPSAiIikgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKKyAgICAgICAgICAgIGVycm9yc19zdHIuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgcG9zaXg6OkFib3J0KCk7CisgIH0KKworICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0czsKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9ndGVzdC9ndGVzdF9tYWluLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL2d0ZXN0L2d0ZXN0X21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5YmJlMAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9ndGVzdC9ndGVzdF9tYWluLmNjCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworR1RFU1RfQVBJXyBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgc3RkOjpjb3V0IDw8ICJSdW5uaW5nIG1haW4oKSBmcm9tIGd0ZXN0X21haW4uY2NcbiI7CisKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2NzgyMgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKQEAgLTAsMCArMSwxOTU0MSBAQAorLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWMgQVBJIGZvciBHb29nbGUgVGVzdC4gIEl0IHNob3VsZCBiZQorLy8gaW5jbHVkZWQgYnkgYW55IHRlc3QgcHJvZ3JhbSB0aGF0IHVzZXMgR29vZ2xlIFRlc3QuCisvLworLy8gSU1QT1JUQU5UIE5PVEU6IER1ZSB0byBsaW1pdGF0aW9uIG9mIHRoZSBDKysgbGFuZ3VhZ2UsIHdlIGhhdmUgdG8KKy8vIGxlYXZlIHNvbWUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBpbiB0aGlzIGhlYWRlciBmaWxlLgorLy8gVGhleSBhcmUgY2xlYXJseSBtYXJrZWQgYnkgY29tbWVudHMgbGlrZSB0aGlzOgorLy8KKy8vICAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorLy8KKy8vIFN1Y2ggY29kZSBpcyBOT1QgbWVhbnQgdG8gYmUgdXNlZCBieSBhIHVzZXIgZGlyZWN0bHksIGFuZCBpcyBzdWJqZWN0CisvLyB0byBDSEFOR0UgV0lUSE9VVCBOT1RJQ0UuICBUaGVyZWZvcmUgRE8gTk9UIERFUEVORCBPTiBJVCBpbiBhIHVzZXIKKy8vIHByb2dyYW0hCisvLworLy8gQWNrbm93bGVkZ21lbnQ6IEdvb2dsZSBUZXN0IGJvcnJvd2VkIHRoZSBpZGVhIG9mIGF1dG9tYXRpYyB0ZXN0CisvLyByZWdpc3RyYXRpb24gZnJvbSBCYXJ0aGVsZW15IERhZ2VuYWlzJyAoYmFydGhlbGVteUBwcm9sb2dpcXVlLmNvbSkKKy8vIGVhc3lVbml0IGZyYW1ld29yay4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGJ5CisvLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXworCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBMb3ctbGV2ZWwgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgcG9ydGluZyBHb29nbGUgVGVzdCB0byB2YXJpb3VzCisvLyBwbGF0Zm9ybXMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIERPIE5PVCBVU0UKKy8vIFRIRU0gSU4gVVNFUiBDT0RFLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KKworLy8gVGhlIHVzZXIgY2FuIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBpbiB0aGUgYnVpbGQgc2NyaXB0IHRvCisvLyBjb250cm9sIEdvb2dsZSBUZXN0J3MgYmVoYXZpb3IuICBJZiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBhIG1hY3JvCisvLyBpbiB0aGlzIGxpc3QsIEdvb2dsZSBUZXN0IHdpbGwgZGVmaW5lIGl0LgorLy8KKy8vICAgR1RFU1RfSEFTX0NMT05FICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IGNsb25lKDIpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZS4KKy8vICAgR1RFU1RfSEFTX0VYQ0VQVElPTlMgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IGV4Y2VwdGlvbnMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGVuYWJsZWQuCisvLyAgIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA6OnN0cmluZworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUgKHNvbWUgc3lzdGVtcyBkZWZpbmUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdHJpbmcsIHdoaWNoIGlzIGRpZmZlcmVudCB0byBzdGQ6OnN0cmluZykuCisvLyAgIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA6OnN0cmluZworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUgKHNvbWUgc3lzdGVtcyBkZWZpbmUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp3c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjp3c3RyaW5nKS4KKy8vICAgR1RFU1RfSEFTX1BPU0lYX1JFICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IFBPU0lYIHJlZ3VsYXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgYXJlL2FyZW4ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19QVEhSRUFEICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA8cHRocmVhZC5oPgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19SVFRJICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBSVFRJIGlzL2lzbid0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuCisvLyAgIEdURVNUX0hBU19TVERfV1NUUklORyAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OndzdHJpbmcgZG9lcy9kb2Vzbid0IHdvcmsgKEdvb2dsZSBUZXN0IGNhbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIHdoZXJlIHN0ZDo6d3N0cmluZyBpcyB1bmF2YWlsYWJsZSkuCisvLyAgIEdURVNUX0hBU19UUjFfVFVQTEUgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdHIxOjp0dXBsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCisvLyAgIEdURVNUX0hBU19TRUggICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgc3VwcG9ydHMgTWljcm9zb2Z0J3MgIlN0cnVjdHVyZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIEhhbmRsaW5nIi4KKy8vICAgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtIHN1cHBvcnRzIEkvTyBzdHJlYW0gcmVkaXJlY3Rpb24gdXNpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwKCkgYW5kIGR1cDIoKS4KKy8vICAgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIEdvb2dsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0J3Mgb3duIHRyMSB0dXBsZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4gIFVudXNlZCB3aGVuIHRoZSB1c2VyIHNldHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfSEFTX1RSMV9UVVBMRSB0byAwLgorLy8gICBHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgdGVzdHMgdGhhdCB1c2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlIFRlc3QgYXMgYSBzaGFyZWQgbGlicmFyeSAoa25vd24gYXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExMIG9uIFdpbmRvd3MpLgorLy8gICBHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QgaXRzZWxmCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkuCisKKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIGZvbGxvd2luZyB1dGlsaXRpZXM6CisvLworLy8gTWFjcm9zIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0gKGRlZmluZWQgdG8gMSBpZiBjb21waWxlZCBvbgorLy8gdGhlIGdpdmVuIHBsYXRmb3JtOyBvdGhlcndpc2UgdW5kZWZpbmVkKToKKy8vICAgR1RFU1RfT1NfQUlYICAgICAgLSBJQk0gQUlYCisvLyAgIEdURVNUX09TX0NZR1dJTiAgIC0gQ3lnd2luCisvLyAgIEdURVNUX09TX0hQVVggICAgIC0gSFAtVVgKKy8vICAgR1RFU1RfT1NfTElOVVggICAgLSBMaW51eAorLy8gICAgIEdURVNUX09TX0xJTlVYX0FORFJPSUQgLSBHb29nbGUgQW5kcm9pZAorLy8gICBHVEVTVF9PU19NQUMgICAgICAtIE1hYyBPUyBYCisvLyAgIEdURVNUX09TX05BQ0wgICAgIC0gR29vZ2xlIE5hdGl2ZSBDbGllbnQgKE5hQ2wpCisvLyAgIEdURVNUX09TX1NPTEFSSVMgIC0gU3VuIFNvbGFyaXMKKy8vICAgR1RFU1RfT1NfU1lNQklBTiAgLSBTeW1iaWFuCisvLyAgIEdURVNUX09TX1dJTkRPV1MgIC0gV2luZG93cyAoRGVza3RvcCwgTWluR1csIG9yIE1vYmlsZSkKKy8vICAgICBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgIC0gV2luZG93cyBEZXNrdG9wCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAgICAtIE1pbkdXCisvLyAgICAgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgICAtIFdpbmRvd3MgTW9iaWxlCisvLyAgIEdURVNUX09TX1pPUyAgICAgIC0gei9PUworLy8KKy8vIEFtb25nIHRoZSBwbGF0Zm9ybXMsIEN5Z3dpbiwgTGludXgsIE1heCBPUyBYLCBhbmQgV2luZG93cyBoYXZlIHRoZQorLy8gbW9zdCBzdGFibGUgc3VwcG9ydC4gIFNpbmNlIGNvcmUgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgcHJvamVjdAorLy8gZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gb3RoZXIgcGxhdGZvcm1zLCBzdXBwb3J0IGZvciB0aGVtIG1heSBiZSBsZXNzCisvLyBzdGFibGUuICBJZiB5b3Ugbm90aWNlIGFueSBwcm9ibGVtcyBvbiB5b3VyIHBsYXRmb3JtLCBwbGVhc2Ugbm90aWZ5CisvLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gKHBhdGNoZXMgZm9yIGZpeGluZyB0aGVtIGFyZQorLy8gZXZlbiBtb3JlIHdlbGNvbWUhKS4KKy8vCisvLyBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCBub25lIG9mIHRoZSBHVEVTVF9PU18qIG1hY3JvcyBhcmUgZGVmaW5lZC4KKy8vCisvLyBNYWNyb3MgaW5kaWNhdGluZyBhdmFpbGFibGUgR29vZ2xlIFRlc3QgZmVhdHVyZXMgKGRlZmluZWQgdG8gMSBpZgorLy8gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpcyBzdXBwb3J0ZWQ7IG90aGVyd2lzZSB1bmRlZmluZWQpOgorLy8gICBHVEVTVF9IQVNfQ09NQklORSAgICAgIC0gdGhlIENvbWJpbmUoKSBmdW5jdGlvbiAoZm9yIHZhbHVlLXBhcmFtZXRlcml6ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzKQorLy8gICBHVEVTVF9IQVNfREVBVEhfVEVTVCAgIC0gZGVhdGggdGVzdHMKKy8vICAgR1RFU1RfSEFTX1BBUkFNX1RFU1QgICAtIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vICAgR1RFU1RfSEFTX1RZUEVEX1RFU1QgICAtIHR5cGVkIHRlc3RzCisvLyAgIEdURVNUX0hBU19UWVBFRF9URVNUX1AgLSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vICAgR1RFU1RfVVNFU19QT1NJWF9SRSAgICAtIGVuaGFuY2VkIFBPU0lYIHJlZ2V4IGlzIHVzZWQuIERvIG5vdCBjb25mdXNlIHdpdGgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19QT1NJWF9SRSAoc2VlIGFib3ZlKSB3aGljaCB1c2VycyBjYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSB0aGVtc2VsdmVzLgorLy8gICBHVEVTVF9VU0VTX1NJTVBMRV9SRSAgIC0gb3VyIG93biBzaW1wbGUgcmVnZXggaXMgdXNlZDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhYm92ZSB0d28gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKy8vICAgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTCAtIGFjY2VwdHMgdW50eXBlZCBOVUxMIGluIEVYUEVDVF9FUSgpLgorLy8KKy8vIE1hY3JvcyBmb3IgYmFzaWMgQysrIGNvZGluZzoKKy8vICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gLSBmb3IgZGlzYWJsaW5nIGEgZ2NjIHdhcm5pbmcuCisvLyAgIEdURVNUX0FUVFJJQlVURV9VTlVTRURfICAtIGRlY2xhcmVzIHRoYXQgYSBjbGFzcycgaW5zdGFuY2VzIG9yIGEKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgZG9uJ3QgaGF2ZSB0byBiZSB1c2VkLgorLy8gICBHVEVTVF9ESVNBTExPV19BU1NJR05fICAgLSBkaXNhYmxlcyBvcGVyYXRvcj0uCisvLyAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8gLSBkaXNhYmxlcyBjb3B5IGN0b3IgYW5kIG9wZXJhdG9yPS4KKy8vICAgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXyAgIC0gZGVjbGFyZXMgdGhhdCBhIGZ1bmN0aW9uJ3MgcmVzdWx0IG11c3QgYmUgdXNlZC4KKy8vCisvLyBTeW5jaHJvbml6YXRpb246CisvLyAgIE11dGV4LCBNdXRleExvY2ssIFRocmVhZExvY2FsLCBHZXRUaHJlYWRDb3VudCgpCisvLyAgICAgICAgICAgICAgICAgIC0gc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCisvLyAgIEdURVNUX0lTX1RIUkVBRFNBRkUgLSBkZWZpbmVkIHRvIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYWJvdmUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGhhdmUgcmVhbCBpbXBsZW1lbnRhdGlvbnMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBHb29nbGUgVGVzdCBpcyB0aHJlYWQtc2FmZTsgb3IgMCBvdGhlcndpc2UuCisvLworLy8gVGVtcGxhdGUgbWV0YSBwcm9ncmFtbWluZzoKKy8vICAgaXNfcG9pbnRlciAgICAgLSBhcyBpbiBUUjE7IG5lZWRlZCBvbiBTeW1iaWFuIGFuZCBJQk0gWEwgQy9DKysgb25seS4KKy8vICAgSXRlcmF0b3JUcmFpdHMgLSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHN0ZDo6aXRlcmF0b3JfdHJhaXRzLCB3aGljaAorLy8gICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUgaW4gbGliQ3N0ZCB3aGVuIGNvbXBpbGVkIHdpdGggU3VuIEMrKy4KKy8vCisvLyBTbWFydCBwb2ludGVyczoKKy8vICAgc2NvcGVkX3B0ciAgICAgLSBhcyBpbiBUUjIuCisvLworLy8gUmVndWxhciBleHByZXNzaW9uczoKKy8vICAgUkUgICAgICAgICAgICAgLSBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gY2xhc3MgdXNpbmcgdGhlIFBPU0lYCisvLyAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWQgUmVndWxhciBFeHByZXNzaW9uIHN5bnRheCBvbiBVTklYLWxpa2UKKy8vICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybXMsIG9yIGEgcmVkdWNlZCByZWd1bGFyIGV4Y2VwdGlvbiBzeW50YXggb24KKy8vICAgICAgICAgICAgICAgICAgICBvdGhlciBwbGF0Zm9ybXMsIGluY2x1ZGluZyBXaW5kb3dzLgorLy8KKy8vIExvZ2dpbmc6CisvLyAgIEdURVNUX0xPR18oKSAgIC0gbG9ncyBtZXNzYWdlcyBhdCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5IGxldmVsLgorLy8gICBMb2dUb1N0ZGVycigpICAtIGRpcmVjdHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIuCisvLyAgIEZsdXNoSW5mb0xvZygpIC0gZmx1c2hlcyBpbmZvcm1hdGlvbmFsIGxvZyBtZXNzYWdlcy4KKy8vCisvLyBTdGRvdXQgYW5kIHN0ZGVyciBjYXB0dXJpbmc6CisvLyAgIENhcHR1cmVTdGRvdXQoKSAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KKy8vICAgR2V0Q2FwdHVyZWRTdGRvdXQoKSAtIHN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuCisvLyAgIENhcHR1cmVTdGRlcnIoKSAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4KKy8vICAgR2V0Q2FwdHVyZWRTdGRlcnIoKSAtIHN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuCisvLworLy8gSW50ZWdlciB0eXBlczoKKy8vICAgVHlwZVdpdGhTaXplICAgLSBtYXBzIGFuIGludGVnZXIgdG8gYSBpbnQgdHlwZS4KKy8vICAgSW50MzIsIFVJbnQzMiwgSW50NjQsIFVJbnQ2NCwgVGltZUluTWlsbGlzCisvLyAgICAgICAgICAgICAgICAgIC0gaW50ZWdlcnMgb2Yga25vd24gc2l6ZXMuCisvLyAgIEJpZ2dlc3RJbnQgICAgIC0gdGhlIGJpZ2dlc3Qgc2lnbmVkIGludGVnZXIgdHlwZS4KKy8vCisvLyBDb21tYW5kLWxpbmUgdXRpbGl0aWVzOgorLy8gICBHVEVTVF9GTEFHKCkgICAgICAgLSByZWZlcmVuY2VzIGEgZmxhZy4KKy8vICAgR1RFU1RfREVDTEFSRV8qKCkgIC0gZGVjbGFyZXMgYSBmbGFnLgorLy8gICBHVEVTVF9ERUZJTkVfKigpICAgLSBkZWZpbmVzIGEgZmxhZy4KKy8vICAgR2V0QXJndnMoKSAgICAgICAgIC0gcmV0dXJucyB0aGUgY29tbWFuZCBsaW5lIGFzIGEgdmVjdG9yIG9mIHN0cmluZ3MuCisvLworLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXRpbGl0aWVzOgorLy8gICBHZXRFbnYoKSAgICAgICAgICAgICAtIGdldHMgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBCb29sRnJvbUdUZXN0RW52KCkgICAtIHBhcnNlcyBhIGJvb2wgZW52aXJvbm1lbnQgdmFyaWFibGUuCisvLyAgIEludDMyRnJvbUdUZXN0RW52KCkgIC0gcGFyc2VzIGFuIEludDMyIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gICBTdHJpbmdGcm9tR1Rlc3RFbnYoKSAtIHBhcnNlcyBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworI2luY2x1ZGUgPGN0eXBlLmg+ICAgLy8gZm9yIGlzc3BhY2UsIGV0YworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHB0cmRpZmZfdAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZuZGVmIF9XSU4zMl9XQ0UKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgIC8vICFfV0lOMzJfV0NFCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+ICAvLyBOT0xJTlQKKyNpbmNsdWRlIDxzdHJpbmc+ICAvLyBOT0xJTlQKKworI2RlZmluZSBHVEVTVF9ERVZfRU1BSUxfICJnb29nbGV0ZXN0ZnJhbWV3b3JrQEBnb29nbGVncm91cHMuY29tIgorI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF8gImd0ZXN0XyIKKyNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8gImd0ZXN0LSIKKyNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJHVEVTVF8iCisjZGVmaW5lIEdURVNUX05BTUVfICJHb29nbGUgVGVzdCIKKyNkZWZpbmUgR1RFU1RfUFJPSkVDVF9VUkxfICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC8iCisKKy8vIERldGVybWluZXMgdGhlIHZlcnNpb24gb2YgZ2NjIHRoYXQgaXMgdXNlZCB0byBjb21waWxlIHRoaXMuCisjaWZkZWYgX19HTlVDX18KKy8vIDQwMzAyIG1lYW5zIHZlcnNpb24gNC4zLjIuCisjIGRlZmluZSBHVEVTVF9HQ0NfVkVSXyBcCisgICAgKF9fR05VQ19fKjEwMDAwICsgX19HTlVDX01JTk9SX18qMTAwICsgX19HTlVDX1BBVENITEVWRUxfXykKKyNlbmRpZiAgLy8gX19HTlVDX18KKworLy8gRGV0ZXJtaW5lcyB0aGUgcGxhdGZvcm0gb24gd2hpY2ggR29vZ2xlIFRlc3QgaXMgY29tcGlsZWQuCisjaWZkZWYgX19DWUdXSU5fXworIyBkZWZpbmUgR1RFU1RfT1NfQ1lHV0lOIDEKKyNlbGlmIGRlZmluZWQgX19TWU1CSUFOMzJfXworIyBkZWZpbmUgR1RFU1RfT1NfU1lNQklBTiAxCisjZWxpZiBkZWZpbmVkIF9XSU4zMgorIyBkZWZpbmUgR1RFU1RfT1NfV0lORE9XUyAxCisjIGlmZGVmIF9XSU4zMl9XQ0UKKyMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAxCisjIGVsaWYgZGVmaW5lZChfX01JTkdXX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAxCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgMQorIyBlbmRpZiAgLy8gX1dJTjMyX1dDRQorI2VsaWYgZGVmaW5lZCBfX0FQUExFX18KKyMgZGVmaW5lIEdURVNUX09TX01BQyAxCisjZWxpZiBkZWZpbmVkIF9fbGludXhfXworIyBkZWZpbmUgR1RFU1RfT1NfTElOVVggMQorIyBpZmRlZiBBTkRST0lECisjICBkZWZpbmUgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAxCisjIGVuZGlmICAvLyBBTkRST0lECisjZWxpZiBkZWZpbmVkIF9fTVZTX18KKyMgZGVmaW5lIEdURVNUX09TX1pPUyAxCisjZWxpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkKKyMgZGVmaW5lIEdURVNUX09TX1NPTEFSSVMgMQorI2VsaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgR1RFU1RfT1NfQUlYIDEKKyNlbGlmIGRlZmluZWQoX19ocHV4KQorIyBkZWZpbmUgR1RFU1RfT1NfSFBVWCAxCisjZWxpZiBkZWZpbmVkIF9fbmF0aXZlX2NsaWVudF9fCisjIGRlZmluZSBHVEVTVF9PU19OQUNMIDEKKyNlbmRpZiAgLy8gX19DWUdXSU5fXworCisvLyBCcmluZ3MgaW4gZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXgKKy8vIG5hbWVzcGFjZSAocmVhZCwgd3JpdGUsIGNsb3NlLCBjaGRpciwgaXNhdHR5LCBzdGF0KS4gV2UgZG8gbm90IGN1cnJlbnRseQorLy8gdXNlIHRoZW0gb24gV2luZG93cyBNb2JpbGUuCisjaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIFRoaXMgYXNzdW1lcyB0aGF0IG5vbi1XaW5kb3dzIE9TZXMgcHJvdmlkZSB1bmlzdGQuaC4gRm9yIE9TZXMgd2hlcmUgdGhpcworLy8gaXMgbm90IHRoZSBjYXNlLCB3ZSBuZWVkIHRvIGluY2x1ZGUgaGVhZGVycyB0aGF0IHByb3ZpZGUgdGhlIGZ1bmN0aW9ucworLy8gbWVudGlvbmVkIGFib3ZlLgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgIUdURVNUX09TX05BQ0wKKy8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlbW92ZSB0aGlzIGNvbmRpdGlvbiB3aGVuIE5hdGl2ZSBDbGllbnQgU0RLIGFkZHMKKy8vIHN0cmluZ3MuaCAodHJhY2tlZCBpbgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL25hdGl2ZWNsaWVudC9pc3N1ZXMvZGV0YWlsP2lkPTExNzUpLgorIyAgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTmF0aXZlIENsaWVudCBkb2Vzbid0IHByb3ZpZGUgc3RyaW5ncy5oLgorIyBlbmRpZgorI2VsaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKy8vIERlZmluZXMgdGhpcyB0byB0cnVlIGlmZiBHb29nbGUgVGVzdCBjYW4gdXNlIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCisjaWZuZGVmIEdURVNUX0hBU19QT1NJWF9SRQorIyBkZWZpbmUgR1RFU1RfSEFTX1BPU0lYX1JFICghR1RFU1RfT1NfV0lORE9XUykKKyNlbmRpZgorCisjaWYgR1RFU1RfSEFTX1BPU0lYX1JFCisKKy8vIE9uIHNvbWUgcGxhdGZvcm1zLCA8cmVnZXguaD4gbmVlZHMgc29tZW9uZSB0byBkZWZpbmUgc2l6ZV90LCBhbmQKKy8vIHdvbid0IGNvbXBpbGUgb3RoZXJ3aXNlLiAgV2UgY2FuICNpbmNsdWRlIGl0IGhlcmUgYXMgd2UgYWxyZWFkeQorLy8gaW5jbHVkZWQgPHN0ZGxpYi5oPiwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBkZWZpbmUgc2l6ZV90IHRocm91Z2gKKy8vIDxzdGRkZWYuaD4uCisjIGluY2x1ZGUgPHJlZ2V4Lmg+ICAvLyBOT0xJTlQKKworIyBkZWZpbmUgR1RFU1RfVVNFU19QT1NJWF9SRSAxCisKKyNlbGlmIEdURVNUX09TX1dJTkRPV1MKKworLy8gPHJlZ2V4Lmg+IGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4gIFVzZSBvdXIgb3duIHNpbXBsZSByZWdleAorLy8gaW1wbGVtZW50YXRpb24gaW5zdGVhZC4KKyMgZGVmaW5lIEdURVNUX1VTRVNfU0lNUExFX1JFIDEKKworI2Vsc2UKKworLy8gPHJlZ2V4Lmg+IG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICBVc2Ugb3VyIG93bgorLy8gc2ltcGxlIHJlZ2V4IGltcGxlbWVudGF0aW9uIGluc3RlYWQuCisjIGRlZmluZSBHVEVTVF9VU0VTX1NJTVBMRV9SRSAxCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BPU0lYX1JFCisKKyNpZm5kZWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgc28gd2UgbmVlZAorLy8gdG8gZmlndXJlIGl0IG91dC4KKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisvLyBNU1ZDJ3MgYW5kIEMrK0J1aWxkZXIncyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFNUTCB1c2UgdGhlIF9IQVNfRVhDRVBUSU9OUworLy8gbWFjcm8gdG8gZW5hYmxlIGV4Y2VwdGlvbnMsIHNvIHdlJ2xsIGRvIHRoZSBzYW1lLgorLy8gQXNzdW1lcyB0aGF0IGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyMgIGlmbmRlZiBfSEFTX0VYQ0VQVElPTlMKKyMgICBkZWZpbmUgX0hBU19FWENFUFRJT05TIDEKKyMgIGVuZGlmICAvLyBfSEFTX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyBfSEFTX0VYQ0VQVElPTlMKKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0VYQ0VQVElPTlMKKy8vIGdjYyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKQorLy8gU3VuIFBybyBDQyBzdXBwb3J0cyBleGNlcHRpb25zLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gY29tcGlsZS10aW1lIHdheSBvZgorLy8gZGV0ZWN0aW5nIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBub3QuICBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGF0CisvLyB0aGV5IGFyZSBlbmFibGVkIHVubGVzcyB0aGUgdXNlciB0ZWxscyB1cyBvdGhlcndpc2UuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQorIyBlbGlmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgX19FWENFUFRJT05TCisvLyB4bEMgZGVmaW5lcyBfX0VYQ0VQVElPTlMgdG8gMSBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCisjIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKKy8vIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBpbiBlZmZlY3QgYnkgZGVmYXVsdCBpbiBIUCBhQ0MgY29tcGlsZXIuIEl0IGhhcyB0bworLy8gYmUgdHVybmVkIG9mIGJ5ICtub2VoIGNvbXBpbGVyIG9wdGlvbiBpZiBkZXNpcmVkLgorIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKKyMgZWxzZQorLy8gRm9yIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIGV4Y2VwdGlvbnMgYXJlIGRpc2FibGVkIHRvIGJlCisvLyBjb25zZXJ2YXRpdmUuCisjICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMAorIyBlbmRpZiAgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCisKKyNpZiAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKKy8vIEV2ZW4gdGhvdWdoIHdlIGRvbid0IHVzZSB0aGlzIG1hY3JvIGFueSBsb25nZXIsIHdlIGtlZXAgaXQgaW4gY2FzZQorLy8gc29tZSBjbGllbnRzIHN0aWxsIGRlcGVuZCBvbiBpdC4KKyMgZGVmaW5lIEdURVNUX0hBU19TVERfU1RSSU5HIDEKKyNlbGlmICFHVEVTVF9IQVNfU1REX1NUUklORworLy8gVGhlIHVzZXIgdG9sZCB1cyB0aGF0IDo6c3RkOjpzdHJpbmcgaXNuJ3QgYXZhaWxhYmxlLgorIyBlcnJvciAiR29vZ2xlIFRlc3QgY2Fubm90IGJlIHVzZWQgd2hlcmUgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuIgorI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKKworI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIDAKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisjaWZuZGVmIEdURVNUX0hBU19TVERfV1NUUklORworLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0ZDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogdXNlcyBhdXRvY29uZiB0byBkZXRlY3Qgd2hldGhlciA6OnN0ZDo6d3N0cmluZworLy8gICBpcyBhdmFpbGFibGUuCisKKy8vIEN5Z3dpbiAxLjcgYW5kIGJlbG93IGRvZXNuJ3Qgc3VwcG9ydCA6OnN0ZDo6d3N0cmluZy4KKy8vIFNvbGFyaXMnIGxpYmMrKyBkb2Vzbid0IHN1cHBvcnQgaXQgZWl0aGVyLiAgQW5kcm9pZCBoYXMKKy8vIG5vIHN1cHBvcnQgZm9yIGl0IGF0IGxlYXN0IGFzIHJlY2VudCBhcyBGcm95byAoMi4yKS4KKyMgZGVmaW5lIEdURVNUX0hBU19TVERfV1NUUklORyBcCisgICAgKCEoR1RFU1RfT1NfTElOVVhfQU5EUk9JRCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUykpCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZm5kZWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKKy8vIHRvIGZpZ3VyZSBpdCBvdXQuCisjIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgXAorICAgIChHVEVTVF9IQVNfU1REX1dTVFJJTkcgJiYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcpCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgUlRUSSBpcyBhdmFpbGFibGUuCisjaWZuZGVmIEdURVNUX0hBU19SVFRJCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZCwgc28gd2UgbmVlZCB0bworLy8gZmlndXJlIGl0IG91dC4KKworIyBpZmRlZiBfTVNDX1ZFUgorCisjICBpZmRlZiBfQ1BQUlRUSSAgLy8gTVNWQyBkZWZpbmVzIHRoaXMgbWFjcm8gaWZmIFJUVEkgaXMgZW5hYmxlZC4KKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQorIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjICBlbmRpZgorCisvLyBTdGFydGluZyB3aXRoIHZlcnNpb24gNC4zLjIsIGdjYyBkZWZpbmVzIF9fR1hYX1JUVEkgaWZmIFJUVEkgaXMgZW5hYmxlZC4KKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAzMDIpCisKKyMgIGlmZGVmIF9fR1hYX1JUVEkKKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQorIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjICBlbmRpZiAgLy8gX19HWFhfUlRUSQorCisvLyBTdGFydGluZyB3aXRoIHZlcnNpb24gOS4wIElCTSBWaXN1YWwgQWdlIGRlZmluZXMgX19SVFRJX0FMTF9fIHRvIDEgaWYKKy8vIGJvdGggdGhlIHR5cGVpZCBhbmQgZHluYW1pY19jYXN0IGZlYXR1cmVzIGFyZSBwcmVzZW50LgorIyBlbGlmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgKF9fSUJNQ1BQX18gPj0gOTAwKQorCisjICBpZmRlZiBfX1JUVElfQUxMX18KKyMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQorIyAgZWxzZQorIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCisjICBlbmRpZgorCisjIGVsc2UKKworLy8gRm9yIGFsbCBvdGhlciBjb21waWxlcnMsIHdlIGFzc3VtZSBSVFRJIGlzIGVuYWJsZWQuCisjICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQorCisjIGVuZGlmICAvLyBfTVNDX1ZFUgorCisjZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCisKKy8vIEl0J3MgdGhpcyBoZWFkZXIncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSA8dHlwZWluZm8+IHdoZW4gUlRUSQorLy8gaXMgZW5hYmxlZC4KKyNpZiBHVEVTVF9IQVNfUlRUSQorIyBpbmNsdWRlIDx0eXBlaW5mbz4KKyNlbmRpZgorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgR29vZ2xlIFRlc3QgY2FuIHVzZSB0aGUgcHRocmVhZHMgbGlicmFyeS4KKyNpZm5kZWYgR1RFU1RfSEFTX1BUSFJFQUQKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIGV4cGxpY2l0bHksIHNvIHdlIGFzc3VtZSBwdGhyZWFkcyBzdXBwb3J0IGlzCisvLyBhdmFpbGFibGUgb24gTGludXggYW5kIE1hYy4KKy8vCisvLyBUbyBkaXNhYmxlIHRocmVhZGluZyBzdXBwb3J0IGluIEdvb2dsZSBUZXN0LCBhZGQgLURHVEVTVF9IQVNfUFRIUkVBRD0wCisvLyB0byB5b3VyIGNvbXBpbGVyIGZsYWdzLgorIyBkZWZpbmUgR1RFU1RfSEFTX1BUSFJFQUQgKEdURVNUX09TX0xJTlVYIHx8IEdURVNUX09TX01BQyB8fCBHVEVTVF9PU19IUFVYKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfUFRIUkVBRAorCisjaWYgR1RFU1RfSEFTX1BUSFJFQUQKKy8vIGd0ZXN0LXBvcnQuaCBndWFyYW50ZWVzIHRvICNpbmNsdWRlIDxwdGhyZWFkLmg+IHdoZW4gR1RFU1RfSEFTX1BUSFJFQUQgaXMKKy8vIHRydWUuCisjIGluY2x1ZGUgPHB0aHJlYWQuaD4gIC8vIE5PTElOVAorCisvLyBGb3IgdGltZXNwZWMgYW5kIG5hbm9zbGVlcCwgdXNlZCBiZWxvdy4KKyMgaW5jbHVkZSA8dGltZS5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdHIxL3R1cGxlLiAgWW91IGNhbiBkZWZpbmUKKy8vIHRoaXMgbWFjcm8gdG8gMCB0byBwcmV2ZW50IEdvb2dsZSBUZXN0IGZyb20gdXNpbmcgdHVwbGUgKGFueQorLy8gZmVhdHVyZSBkZXBlbmRpbmcgb24gdHVwbGUgd2l0aCBiZSBkaXNhYmxlZCBpbiB0aGlzIG1vZGUpLgorI2lmbmRlZiBHVEVTVF9IQVNfVFIxX1RVUExFCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBub3QgdG8gZG8gaXQsIHNvIHdlIGFzc3VtZSBpdCdzIE9LLgorIyBkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAxCisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0J3Mgb3duIHRyMSB0dXBsZSBpbXBsZW1lbnRhdGlvbgorLy8gc2hvdWxkIGJlIHVzZWQuCisjaWZuZGVmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisvLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cywgc28gd2UgbmVlZCB0byBmaWd1cmUgaXQgb3V0LgorCisvLyBXZSB1c2Ugb3VyIG93biBUUjEgdHVwbGUgaWYgd2UgYXJlbid0IHN1cmUgdGhlIHVzZXIgaGFzIGFuCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBpdCBhbHJlYWR5LiAgQXQgdGhpcyB0aW1lLCBHQ0MgNC4wLjArIGFuZCBNU1ZDCisvLyAyMDEwIGFyZSB0aGUgb25seSBtYWluc3RyZWFtIGNvbXBpbGVycyB0aGF0IGNvbWUgd2l0aCBhIFRSMSB0dXBsZQorLy8gaW1wbGVtZW50YXRpb24uICBOVklESUEncyBDVURBIE5WQ0MgY29tcGlsZXIgcHJldGVuZHMgdG8gYmUgR0NDIGJ5CisvLyBkZWZpbmluZyBfX0dOVUNfXyBhbmQgZnJpZW5kcywgYnV0IGNhbm5vdCBjb21waWxlIEdDQydzIHR1cGxlCisvLyBpbXBsZW1lbnRhdGlvbi4gIE1TVkMgMjAwOCAoOS4wKSBwcm92aWRlcyBUUjEgdHVwbGUgaW4gYSAzMjMgTUIKKy8vIEZlYXR1cmUgUGFjayBkb3dubG9hZCwgd2hpY2ggd2UgY2Fubm90IGFzc3VtZSB0aGUgdXNlciBoYXMuCisjIGlmIChkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0NVREFDQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApKSBcCisgICAgfHwgX01TQ19WRVIgPj0gMTYwMAorIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDAKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDEKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorCisvLyBUbyBhdm9pZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBldmVyeXdoZXJlLCB3ZSBtYWtlIGl0CisvLyBndGVzdC1wb3J0LmgncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGltcGxlbWVudGluZworLy8gdHIxL3R1cGxlLgorI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKKworIyBpZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQorLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgYSBzY3JpcHQuICBETyBOT1QgRURJVCBCWSBIQU5EISEhCisKKy8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCisKKy8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCisvLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKKy8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCisvLyBwcml2YXRlIGFzIHB1YmxpYy4KKy8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KKyNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQorIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAorICAgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPiBmcmllbmQgY2xhc3MgdHVwbGU7IFwKKyAgIHByaXZhdGU6CisjZW5kaWYKKworLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KKyNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgorI2RlZmluZSBHVEVTVF8xX1RVUExFXyhUKSB0dXBsZTxUIyMwLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfMl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzNfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF80X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCB2b2lkLCB2b2lkLCB2b2lkLCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfNV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgdm9pZCwgdm9pZCwgXAorICAgIHZvaWQsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzZfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIHZvaWQsIFwKKyAgICB2b2lkLCB2b2lkLCB2b2lkPgorI2RlZmluZSBHVEVTVF83X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCisgICAgdm9pZCwgdm9pZCwgdm9pZD4KKyNkZWZpbmUgR1RFU1RfOF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIHZvaWQsIHZvaWQ+CisjZGVmaW5lIEdURVNUXzlfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKKyAgICBUIyM3LCBUIyM4LCB2b2lkPgorI2RlZmluZSBHVEVTVF8xMF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAorICAgIFQjIzcsIFQjIzgsIFQjIzk+CisKKy8vIEdURVNUX25fVFlQRU5BTUVTXyhUKSBkZWNsYXJlcyBhIGxpc3Qgb2YgbiB0eXBlbmFtZXMuCisjZGVmaW5lIEdURVNUXzBfVFlQRU5BTUVTXyhUKQorI2RlZmluZSBHVEVTVF8xX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMAorI2RlZmluZSBHVEVTVF8yX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMQorI2RlZmluZSBHVEVTVF8zX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMgorI2RlZmluZSBHVEVTVF80X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMKKyNkZWZpbmUgR1RFU1RfNV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0CisjZGVmaW5lIEdURVNUXzZfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNQorI2RlZmluZSBHVEVTVF83X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAorICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYKKyNkZWZpbmUgR1RFU1RfOF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKKyAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCB0eXBlbmFtZSBUIyM3CisjZGVmaW5lIEdURVNUXzlfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAorICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgKKyNkZWZpbmUgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCisgICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAorICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgsIHR5cGVuYW1lIFQjIzkKKworLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAorLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCisvLyBsaWJyYXJ5IHZlbmRvci4KK25hbWVzcGFjZSBzdGQgeworbmFtZXNwYWNlIHRyMSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMCA9IHZvaWQsIHR5cGVuYW1lIFQxID0gdm9pZCwgdHlwZW5hbWUgVDIgPSB2b2lkLAorICAgIHR5cGVuYW1lIFQzID0gdm9pZCwgdHlwZW5hbWUgVDQgPSB2b2lkLCB0eXBlbmFtZSBUNSA9IHZvaWQsCisgICAgdHlwZW5hbWUgVDYgPSB2b2lkLCB0eXBlbmFtZSBUNyA9IHZvaWQsIHR5cGVuYW1lIFQ4ID0gdm9pZCwKKyAgICB0eXBlbmFtZSBUOSA9IHZvaWQ+CitjbGFzcyB0dXBsZTsKKworLy8gQW55dGhpbmcgaW4gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIGlzIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKKy8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuCituYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgeworCisvLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQnlSZWYgeyB0eXBlZGVmIGNvbnN0IFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLgorI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQorCisvLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMKKy8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4KKyNkZWZpbmUgR1RFU1RfQUREX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkFkZFJlZjxUPjo6dHlwZQorCisvLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLgordGVtcGxhdGUgPGludCBrPiBjbGFzcyBHZXQ7CisKKy8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUKKy8vIGlmZiBrIDwgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUgdHlwZSBULgordGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPgorc3RydWN0IFR1cGxlRWxlbWVudDsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDAsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQwIHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAxLCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUMSB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMiwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDIgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDMsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQzIHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA0LCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUNCB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNSwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDUgdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDYsIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQ2IHR5cGU7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA3LCBHVEVTVF8xMF9UVVBMRV8oVCk+IHsgdHlwZWRlZiBUNyB0eXBlOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgOCwgR1RFU1RfMTBfVFVQTEVfKFQpPiB7IHR5cGVkZWYgVDggdHlwZTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDksIEdURVNUXzEwX1RVUExFXyhUKT4geyB0eXBlZGVmIFQ5IHR5cGU7IH07CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8PgorY2xhc3MgdHVwbGU8PiB7CisgcHVibGljOgorICB0dXBsZSgpIHt9CisgIHR1cGxlKGNvbnN0IHR1cGxlJiAvKiB0ICovKSAge30KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgLyogdCAqLykgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK3RlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF8xX1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwKSA6IGYwXyhmMCkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKK307CisKK3RlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+CitjbGFzcyBHVEVTVF8yX1RVUExFXyhUKSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OworCisgIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEpIDogZjBfKGYwKSwKKyAgICAgIGYxXyhmMSkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgorICB0dXBsZShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSA6IGYwXyhwLmZpcnN0KSwgZjFfKHAuc2Vjb25kKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIHsKKyAgICBmMF8gPSBwLmZpcnN0OworICAgIGYxXyA9IHAuc2Vjb25kOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzNfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMikgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzRfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCisgICAgICBmM18oZjMpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzVfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywKKyAgICAgIEdURVNUX0JZX1JFRl8oVDQpIGY0KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCkge30KKworICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAorICAgICAgZjRfKHQuZjRfKSB7fQorCisgIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlKGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pIHt9CisKKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KKworICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSB7CisgICAgZjBfID0gdC5mMF87CisgICAgZjFfID0gdC5mMV87CisgICAgZjJfID0gdC5mMl87CisgICAgZjNfID0gdC5mM187CisgICAgZjRfID0gdC5mNF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVDAgZjBfOworICBUMSBmMV87CisgIFQyIGYyXzsKKyAgVDMgZjNfOworICBUNCBmNF87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfNl9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpLAorICAgICAgZjVfKGY1KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzdfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNikgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLAorICAgICAgZjNfKGYzKSwgZjRfKGY0KSwgZjVfKGY1KSwgZjZfKGY2KSB7fQorCisgIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCisgICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pIHt9CisKKyAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKKyAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KKworICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQorCisgIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIHsKKyAgICByZXR1cm4gQ29weUZyb20odCk7CisgIH0KKworICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KKworICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgorICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgorY2xhc3MgR1RFU1RfOF9UVVBMRV8oVCkgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKKworICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpIHt9CisKKyAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAorICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDcpIGY3KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCisgICAgICBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIGY3XyA9IHQuZjdfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKKyAgVDcgZjdfOworfTsKKwordGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIEdURVNUXzlfVFVQTEVfKFQpIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSwgZjhfKCkge30KKworICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCisgICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAorICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LCBHVEVTVF9CWV9SRUZfKFQ3KSBmNywKKyAgICAgIEdURVNUX0JZX1JFRl8oVDgpIGY4KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCisgICAgICBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpLCBmOF8oZjgpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgorICB0dXBsZShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAorICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgeworICAgIHJldHVybiBDb3B5RnJvbSh0KTsKKyAgfQorCisgIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworCisgIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgeworICAgIGYwXyA9IHQuZjBfOworICAgIGYxXyA9IHQuZjFfOworICAgIGYyXyA9IHQuZjJfOworICAgIGYzXyA9IHQuZjNfOworICAgIGY0XyA9IHQuZjRfOworICAgIGY1XyA9IHQuZjVfOworICAgIGY2XyA9IHQuZjZfOworICAgIGY3XyA9IHQuZjdfOworICAgIGY4XyA9IHQuZjhfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFQwIGYwXzsKKyAgVDEgZjFfOworICBUMiBmMl87CisgIFQzIGYzXzsKKyAgVDQgZjRfOworICBUNSBmNV87CisgIFQ2IGY2XzsKKyAgVDcgZjdfOworICBUOCBmOF87Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK2NsYXNzIHR1cGxlIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7CisKKyAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSwgZjhfKCksCisgICAgICBmOV8oKSB7fQorCisgIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKKyAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCisgICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAorICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgsIEdURVNUX0JZX1JFRl8oVDkpIGY5KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCisgICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpLCBmOF8oZjgpLCBmOV8oZjkpIHt9CisKKyAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKKyAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksIGY5Xyh0LmY5Xykge30KKworICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KKyAgdHVwbGUoY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCisgICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pLAorICAgICAgZjlfKHQuZjlfKSB7fQorCisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9CisKKyAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSB7CisgICAgcmV0dXJuIENvcHlGcm9tKHQpOworICB9CisKKyAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCisKKyAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+CisgIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKKyAgICBmMF8gPSB0LmYwXzsKKyAgICBmMV8gPSB0LmYxXzsKKyAgICBmMl8gPSB0LmYyXzsKKyAgICBmM18gPSB0LmYzXzsKKyAgICBmNF8gPSB0LmY0XzsKKyAgICBmNV8gPSB0LmY1XzsKKyAgICBmNl8gPSB0LmY2XzsKKyAgICBmN18gPSB0LmY3XzsKKyAgICBmOF8gPSB0LmY4XzsKKyAgICBmOV8gPSB0LmY5XzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUMCBmMF87CisgIFQxIGYxXzsKKyAgVDIgZjJfOworICBUMyBmM187CisgIFQ0IGY0XzsKKyAgVDUgZjVfOworICBUNiBmNl87CisgIFQ3IGY3XzsKKyAgVDggZjhfOworICBUOSBmOV87Cit9OworCisvLyA2LjEuMy4yIFR1cGxlIGNyZWF0aW9uIGZ1bmN0aW9ucy4KKworLy8gS25vd24gbGltaXRhdGlvbnM6IHdlIGRvbid0IHN1cHBvcnQgcGFzc2luZyBhbgorLy8gc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPFQ+IHRvIG1ha2VfdHVwbGUoKS4gIEFuZCB3ZSBkb24ndAorLy8gaW1wbGVtZW50IHRpZSgpLgorCitpbmxpbmUgdHVwbGU8PiBtYWtlX3R1cGxlKCkgeyByZXR1cm4gdHVwbGU8PigpOyB9CisKK3RlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfMV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjApIHsKKyAgcmV0dXJuIEdURVNUXzFfVFVQTEVfKFQpKGYwKTsKK30KKwordGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF8yX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxKSB7CisgIHJldHVybiBHVEVTVF8yX1RVUExFXyhUKShmMCwgZjEpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzNfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMikgeworICByZXR1cm4gR1RFU1RfM19UVVBMRV8oVCkoZjAsIGYxLCBmMik7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfNF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMykgeworICByZXR1cm4gR1RFU1RfNF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzVfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCkgeworICByZXR1cm4gR1RFU1RfNV9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF82X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSkgeworICByZXR1cm4gR1RFU1RfNl9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfN19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAorICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNikgeworICByZXR1cm4gR1RFU1RfN19UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYpOworfQorCit0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgoraW5saW5lIEdURVNUXzhfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNykgeworICByZXR1cm4gR1RFU1RfOF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KK2lubGluZSBHVEVTVF85X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCisgICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcsCisgICAgY29uc3QgVDgmIGY4KSB7CisgIHJldHVybiBHVEVTVF85X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4KTsKK30KKwordGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitpbmxpbmUgR1RFU1RfMTBfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKKyAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKKyAgICBjb25zdCBUOCYgZjgsIGNvbnN0IFQ5JiBmOSkgeworICByZXR1cm4gR1RFU1RfMTBfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgsIGY5KTsKK30KKworLy8gNi4xLjMuMyBUdXBsZSBoZWxwZXIgY2xhc3Nlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBzdHJ1Y3QgdHVwbGVfc2l6ZTsKKwordGVtcGxhdGUgPEdURVNUXzBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzBfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMV9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDE7IH07CisKK3RlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8yX1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMjsgfTsKKwordGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzNfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAzOyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNF9UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDQ7IH07CisKK3RlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF81X1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNTsgfTsKKwordGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzZfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA2OyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgorc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfN19UVVBMRV8oVCk+IHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDc7IH07CisKK3RlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+CitzdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF84X1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gODsgfTsKKwordGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzlfVFVQTEVfKFQpPiB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA5OyB9OworCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KK3N0cnVjdCB0dXBsZV9zaXplPEdURVNUXzEwX1RVUExFXyhUKT4geyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTA7IH07CisKK3RlbXBsYXRlIDxpbnQgaywgY2xhc3MgVHVwbGU+CitzdHJ1Y3QgdHVwbGVfZWxlbWVudCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwKKyAgICAgIGsgPCAodHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwgaywgVHVwbGU+Ojp0eXBlIHR5cGU7Cit9OworCisjZGVmaW5lIEdURVNUX1RVUExFX0VMRU1FTlRfKGssIFR1cGxlKSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PGssIFR1cGxlID46OnR5cGUKKworLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4KKworbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwwPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjBfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDE+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMV87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8Mj4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYyXzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDwzPiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjNfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDQ+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNF87IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8NT4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY1XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw2PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjZfOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgR2V0PDc+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKKyAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9ICAvLyBOT0xJTlQKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKKyAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mN187IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBHZXQ8OD4geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQorICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0gIC8vIE5PTElOVAorCisgIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KKyAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQorICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY4XzsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIEdldDw5PiB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+CisgIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCisgIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfSAgLy8gTk9MSU5UCisKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgorICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCisgIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjlfOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKKwordGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgorR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfMTBfVFVQTEVfKFQpKSkKK2dldChHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOworfQorCit0ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+CitHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8xMF9UVVBMRV8oVCkpKQorZ2V0KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCkgeworICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKK30KKworLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycworCisvLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCisKK25hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7CisKKy8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKKy8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCisvLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKKy8vIGsxICE9IGsyLgordGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4geworICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+CisgIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGludCBrPgorc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgorICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7CisgICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKKyAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAorCit0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKSwgR1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHUpIHsKKyAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwKKyAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpPjo6dmFsdWUsCisgICAgICB0dXBsZV9zaXplPEdURVNUXzEwX1RVUExFXyhVKT46OnZhbHVlPjo6RXEodCwgdSk7Cit9CisKK3RlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdSkgeyByZXR1cm4gISh0ID09IHUpOyB9CisKKy8vIDYuMS40IFBhaXJzLgorLy8gVW5pbXBsZW1lbnRlZC4KKworfSAgLy8gbmFtZXNwYWNlIHRyMQorfSAgLy8gbmFtZXNwYWNlIHN0ZAorCisjdW5kZWYgR1RFU1RfMF9UVVBMRV8KKyN1bmRlZiBHVEVTVF8xX1RVUExFXworI3VuZGVmIEdURVNUXzJfVFVQTEVfCisjdW5kZWYgR1RFU1RfM19UVVBMRV8KKyN1bmRlZiBHVEVTVF80X1RVUExFXworI3VuZGVmIEdURVNUXzVfVFVQTEVfCisjdW5kZWYgR1RFU1RfNl9UVVBMRV8KKyN1bmRlZiBHVEVTVF83X1RVUExFXworI3VuZGVmIEdURVNUXzhfVFVQTEVfCisjdW5kZWYgR1RFU1RfOV9UVVBMRV8KKyN1bmRlZiBHVEVTVF8xMF9UVVBMRV8KKworI3VuZGVmIEdURVNUXzBfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzFfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzJfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzNfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzRfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzVfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzZfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzdfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzhfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzlfVFlQRU5BTUVTXworI3VuZGVmIEdURVNUXzEwX1RZUEVOQU1FU18KKworI3VuZGVmIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXworI3VuZGVmIEdURVNUX0JZX1JFRl8KKyN1bmRlZiBHVEVTVF9BRERfUkVGXworI3VuZGVmIEdURVNUX1RVUExFX0VMRU1FTlRfCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXworIyBlbGlmIEdURVNUX09TX1NZTUJJQU4KKworLy8gT24gU3ltYmlhbiwgQk9PU1RfSEFTX1RSMV9UVVBMRSBjYXVzZXMgQm9vc3QncyBUUjEgdHVwbGUgbGlicmFyeSB0bworLy8gdXNlIFNUTHBvcnQncyB0dXBsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBkb2Vzbid0CisvLyB3b3JrIGFzIHRoZSBjb3B5IG9mIFNUTHBvcnQgZGlzdHJpYnV0ZWQgd2l0aCBTeW1iaWFuIGlzIGluY29tcGxldGUuCisvLyBCeSBtYWtpbmcgc3VyZSBCT09TVF9IQVNfVFIxX1RVUExFIGlzIHVuZGVmaW5lZCwgd2UgZm9yY2UgQm9vc3QgdG8KKy8vIHVzZSBpdHMgb3duIHR1cGxlIGltcGxlbWVudGF0aW9uLgorIyAgaWZkZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQorIyAgIHVuZGVmIEJPT1NUX0hBU19UUjFfVFVQTEUKKyMgIGVuZGlmICAvLyBCT09TVF9IQVNfVFIxX1RVUExFCisKKy8vIFRoaXMgcHJldmVudHMgPGJvb3N0L3RyMS9kZXRhaWwvY29uZmlnLmhwcD4sIHdoaWNoIGRlZmluZXMKKy8vIEJPT1NUX0hBU19UUjFfVFVQTEUsIGZyb20gYmVpbmcgI2luY2x1ZGVkIGJ5IEJvb3N0J3MgPHR1cGxlPi4KKyMgIGRlZmluZSBCT09TVF9UUjFfREVUQUlMX0NPTkZJR19IUFBfSU5DTFVERUQKKyMgIGluY2x1ZGUgPHR1cGxlPgorCisjIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMDAwKQorLy8gR0NDIDQuMCsgaW1wbGVtZW50cyB0cjEvdHVwbGUgaW4gdGhlIDx0cjEvdHVwbGU+IGhlYWRlci4gIFRoaXMgZG9lcworLy8gbm90IGNvbmZvcm0gdG8gdGhlIFRSMSBzcGVjLCB3aGljaCByZXF1aXJlcyB0aGUgaGVhZGVyIHRvIGJlIDx0dXBsZT4uCisKKyMgIGlmICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCisvLyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBnY2MgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIDx0cjEvZnVuY3Rpb25hbD4sCisvLyB3aGljaCBpcyAjaW5jbHVkZWQgYnkgPHRyMS90dXBsZT4sIHRvIG5vdCBjb21waWxlIHdoZW4gUlRUSSBpcworLy8gZGlzYWJsZWQuICBfVFIxX0ZVTkNUSU9OQUwgaXMgdGhlIGhlYWRlciBndWFyZCBmb3IKKy8vIDx0cjEvZnVuY3Rpb25hbD4uICBIZW5jZSB0aGUgZm9sbG93aW5nICNkZWZpbmUgaXMgYSBoYWNrIHRvIHByZXZlbnQKKy8vIDx0cjEvZnVuY3Rpb25hbD4gZnJvbSBiZWluZyBpbmNsdWRlZC4KKyMgICBkZWZpbmUgX1RSMV9GVU5DVElPTkFMIDEKKyMgICBpbmNsdWRlIDx0cjEvdHVwbGU+CisjICAgdW5kZWYgX1RSMV9GVU5DVElPTkFMICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gI2luY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDx0cjEvZnVuY3Rpb25hbD4gaWYgaGUgY2hvb3NlcyB0by4KKyMgIGVsc2UKKyMgICBpbmNsdWRlIDx0cjEvdHVwbGU+ICAvLyBOT0xJTlQKKyMgIGVuZGlmICAvLyAhR1RFU1RfSEFTX1JUVEkgJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDMwMgorCisjIGVsc2UKKy8vIElmIHRoZSBjb21waWxlciBpcyBub3QgR0NDIDQuMCssIHdlIGFzc3VtZSB0aGUgdXNlciBpcyB1c2luZyBhCisvLyBzcGVjLWNvbmZvcm1pbmcgVFIxIGltcGxlbWVudGF0aW9uLgorIyAgaW5jbHVkZSA8dHVwbGU+ICAvLyBOT0xJTlQKKyMgZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgY2xvbmUoMikgaXMgc3VwcG9ydGVkLgorLy8gVXN1YWxseSBpdCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIG9uIExpbnV4LCBleGNsdWRpbmcKKy8vIExpbnV4IG9uIHRoZSBJdGFuaXVtIGFyY2hpdGVjdHVyZS4KKy8vIEFsc28gc2VlIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi8yL2Nsb25lLgorI2lmbmRlZiBHVEVTVF9IQVNfQ0xPTkUKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgaWYgR1RFU1RfT1NfTElOVVggJiYgIWRlZmluZWQoX19pYTY0X18pCisjICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDEKKyMgZWxzZQorIyAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAwCisjIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfQ0xPTkUKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgc3RyZWFtIHJlZGlyZWN0aW9uLiBUaGlzIGlzIHVzZWQgdG8gdGVzdAorLy8gb3V0cHV0IGNvcnJlY3RuZXNzIGFuZCB0byBpbXBsZW1lbnQgZGVhdGggdGVzdHMuCisjaWZuZGVmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KKy8vIEJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IHN0cmVhbSByZWRpcmVjdGlvbiBpcyBzdXBwb3J0ZWQgb24gYWxsCisvLyBwbGF0Zm9ybXMgZXhjZXB0IGtub3duIG1vYmlsZSBvbmVzLgorIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOCisjICBkZWZpbmUgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTiAwCisjIGVsc2UKKyMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDEKKyMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiAhR1RFU1RfT1NfU1lNQklBTgorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IGRlYXRoIHRlc3RzLgorLy8gR29vZ2xlIFRlc3QgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBmb3IgVkMgNy4xIGFuZCBlYXJsaWVyIGFzCisvLyBhYm9ydCgpIGluIGEgVkMgNy4xIGFwcGxpY2F0aW9uIGNvbXBpbGVkIGFzIEdVSSBpbiBkZWJ1ZyBjb25maWcKKy8vIHBvcHMgdXAgYSBkaWFsb2cgd2luZG93IHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgcHJvZ3JhbW1hdGljYWxseS4KKyNpZiAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTIHx8IFwKKyAgICAgKEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAmJiBfTVNDX1ZFUiA+PSAxNDAwKSB8fCBcCisgICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgfHwgR1RFU1RfT1NfQUlYIHx8IEdURVNUX09TX0hQVVgpCisjIGRlZmluZSBHVEVTVF9IQVNfREVBVEhfVEVTVCAxCisjIGluY2x1ZGUgPHZlY3Rvcj4gIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIFdlIGRvbid0IHN1cHBvcnQgTVNWQyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkIG5vdy4gIFRoZXJlZm9yZQorLy8gYWxsIHRoZSBjb21waWxlcnMgd2UgY2FyZSBhYm91dCBhcmUgYWRlcXVhdGUgZm9yIHN1cHBvcnRpbmcKKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCisjZGVmaW5lIEdURVNUX0hBU19QQVJBTV9URVNUIDEKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgdHlwZS1kcml2ZW4gdGVzdHMuCisKKy8vIFR5cGVkIHRlc3RzIG5lZWQgPHR5cGVpbmZvPiBhbmQgdmFyaWFkaWMgbWFjcm9zLCB3aGljaCBHQ0MsIFZDKysgOC4wLAorLy8gU3VuIFBybyBDQywgSUJNIFZpc3VhbCBBZ2UsIGFuZCBIUCBhQ0Mgc3VwcG9ydC4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoX01TQ19WRVIgPj0gMTQwMCkgfHwgZGVmaW5lZChfX1NVTlBST19DQykgfHwgXAorICAgIGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX0hQX2FDQykKKyMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUIDEKKyMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUX1AgMQorI2VuZGlmCisKKy8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IENvbWJpbmUoKS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4KKy8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gZG9lc24ndAorLy8gd29yayBvbiBTdW4gU3R1ZGlvIHNpbmNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0ZW1wbGF0ZWQgY29udmVyc2lvbgorLy8gb3BlcmF0b3JzLgorI2lmIEdURVNUX0hBU19QQVJBTV9URVNUICYmIEdURVNUX0hBU19UUjFfVFVQTEUgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCisjIGRlZmluZSBHVEVTVF9IQVNfQ09NQklORSAxCisjZW5kaWYKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzeXN0ZW0gY29tcGlsZXIgdXNlcyBVVEYtMTYgZm9yIGVuY29kaW5nIHdpZGUgc3RyaW5ncy4KKyNkZWZpbmUgR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8gXAorICAgIChHVEVTVF9PU19XSU5ET1dTIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX0FJWCkKKworLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRlc3QgcmVzdWx0cyBjYW4gYmUgc3RyZWFtZWQgdG8gYSBzb2NrZXQuCisjaWYgR1RFU1RfT1NfTElOVVgKKyMgZGVmaW5lIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18gMQorI2VuZGlmCisKKy8vIERlZmluZXMgc29tZSB1dGlsaXR5IG1hY3Jvcy4KKworLy8gVGhlIEdOVSBjb21waWxlciBlbWl0cyBhIHdhcm5pbmcgaWYgbmVzdGVkICJpZiIgc3RhdGVtZW50cyBhcmUgZm9sbG93ZWQgYnkKKy8vIGFuICJlbHNlIiBzdGF0ZW1lbnQgYW5kIGJyYWNlcyBhcmUgbm90IHVzZWQgdG8gZXhwbGljaXRseSBkaXNhbWJpZ3VhdGUgdGhlCisvLyAiZWxzZSIgYmluZGluZy4gIFRoaXMgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBjb2RlIGxpa2U6CisvLworLy8gICBpZiAoZ2F0ZSkKKy8vICAgICBBU1NFUlRfKihjb25kaXRpb24pIDw8ICJTb21lIG1lc3NhZ2UiOworLy8KKy8vIFRoZSAic3dpdGNoICgwKSBjYXNlIDA6IiBpZGlvbSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoaXMuCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorIyBkZWZpbmUgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8KKyNlbHNlCisjIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBzd2l0Y2ggKDApIGNhc2UgMDogZGVmYXVsdDogIC8vIE5PTElOVAorI2VuZGlmCisKKy8vIFVzZSB0aGlzIGFubm90YXRpb24gYXQgdGhlIGVuZCBvZiBhIHN0cnVjdC9jbGFzcyBkZWZpbml0aW9uIHRvCisvLyBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcgYXdheSBpbnN0YW5jZXMgdGhhdCBhcmUgbmV2ZXIKKy8vIHVzZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFsbCBpbnRlcmVzdGluZyBsb2dpYyBoYXBwZW5zIGluc2lkZSB0aGUKKy8vIGMndG9yIGFuZCAvIG9yIGQndG9yLiAgRXhhbXBsZToKKy8vCisvLyAgIHN0cnVjdCBGb28geworLy8gICAgIEZvbygpIHsgLi4uIH0KKy8vICAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKKy8vCisvLyBBbHNvIHVzZSBpdCBhZnRlciBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlciBkZWNsYXJhdGlvbiB0byB0ZWxsIHRoZQorLy8gY29tcGlsZXIgdGhlIHZhcmlhYmxlL3BhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQuCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ09NUElMRVJfSUNDKQorIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8KKyNlbmRpZgorCisvLyBBIG1hY3JvIHRvIGRpc2FsbG93IG9wZXJhdG9yPQorLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLgorI2RlZmluZSBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpXAorICB2b2lkIG9wZXJhdG9yPSh0eXBlIGNvbnN0ICYpCisKKy8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CisvLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCisjZGVmaW5lIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8odHlwZSlcCisgIHR5cGUodHlwZSBjb25zdCAmKTtcCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSkKKworLy8gVGVsbCB0aGUgY29tcGlsZXIgdG8gd2FybiBhYm91dCB1bnVzZWQgcmV0dXJuIHZhbHVlcyBmb3IgZnVuY3Rpb25zIGRlY2xhcmVkCisvLyB3aXRoIHRoaXMgbWFjcm8uICBUaGUgbWFjcm8gc2hvdWxkIGJlIHVzZWQgb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zCisvLyBmb2xsb3dpbmcgdGhlIGFyZ3VtZW50IGxpc3Q6CisvLworLy8gICBTcHJvY2tldCogQWxsb2NhdGVTcHJvY2tldCgpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCisjIGRlZmluZSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8KKyNlbmRpZiAgLy8gX19HTlVDX18gJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhQ09NUElMRVJfSUNDCisKKy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyBNaWNyb3NvZnQncyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbgorLy8gSGFuZGxpbmcuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBzZXZlcmFsIFdpbmRvd3MgY29tcGlsZXJzIGJ1dCBnZW5lcmFsbHkKKy8vIGRvZXMgbm90IGV4aXN0IG9uIGFueSBvdGhlciBzeXN0ZW0uCisjaWZuZGVmIEdURVNUX0hBU19TRUgKKy8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCisKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisvLyBUaGVzZSB0d28gY29tcGlsZXJzIGFyZSBrbm93biB0byBzdXBwb3J0IFNFSC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDEKKyMgZWxzZQorLy8gQXNzdW1lIG5vIFNFSC4KKyMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDAKKyMgZW5kaWYKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICisKKyNpZmRlZiBfTVNDX1ZFUgorCisjIGlmIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQorIyAgZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjIGVsaWYgR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZCisjICBkZWZpbmUgR1RFU1RfQVBJXyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgZW5kaWYKKworI2VuZGlmICAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIEdURVNUX0FQSV8KKyMgZGVmaW5lIEdURVNUX0FQSV8KKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKy8vIEFzayB0aGUgY29tcGlsZXIgdG8gbmV2ZXIgaW5saW5lIGEgZ2l2ZW4gZnVuY3Rpb24uCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfCisjZW5kaWYKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNZXNzYWdlOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBTdHJpbmc7CisKKy8vIFRoZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8gbWFjcm8gY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBjb21waWxlIHRpbWUKKy8vIGV4cHJlc3Npb24gaXMgdHJ1ZS4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgdG8gdmVyaWZ5IHRoZQorLy8gc2l6ZSBvZiBhIHN0YXRpYyBhcnJheToKKy8vCisvLyAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhBUlJBWVNJWkUoY29udGVudF90eXBlX25hbWVzKSA9PSBDT05URU5UX05VTV9UWVBFUywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZV9uYW1lc19pbmNvcnJlY3Rfc2l6ZSk7CisvLworLy8gb3IgdG8gbWFrZSBzdXJlIGEgc3RydWN0IGlzIHNtYWxsZXIgdGhhbiBhIGNlcnRhaW4gc2l6ZToKKy8vCisvLyAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhzaXplb2YoZm9vKSA8IDEyOCwgZm9vX3Rvb19sYXJnZSk7CisvLworLy8gVGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgbWFjcm8gaXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiBJZgorLy8gdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UsIG1vc3QgY29tcGlsZXJzIHdpbGwgaXNzdWUgYSB3YXJuaW5nL2Vycm9yCisvLyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4KKwordGVtcGxhdGUgPGJvb2w+CitzdHJ1Y3QgQ29tcGlsZUFzc2VydCB7Cit9OworCisjZGVmaW5lIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhleHByLCBtc2cpIFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gXAorICAgICAgbXNnW2Jvb2woZXhwcikgPyAxIDogLTFdCisKKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgR1RFU1RfQ09NUElMRV9BU1NFUlRfOgorLy8KKy8vIC0gR1RFU1RfQ09NUElMRV9BU1NFUlRfIHdvcmtzIGJ5IGRlZmluaW5nIGFuIGFycmF5IHR5cGUgdGhhdCBoYXMgLTEKKy8vICAgZWxlbWVudHMgKGFuZCB0aHVzIGlzIGludmFsaWQpIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UuCisvLworLy8gLSBUaGUgc2ltcGxlciBkZWZpbml0aW9uCisvLworLy8gICAgI2RlZmluZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZXhwciwgbXNnKSB0eXBlZGVmIGNoYXIgbXNnWyhleHByKSA/IDEgOiAtMV0KKy8vCisvLyAgIGRvZXMgbm90IHdvcmssIGFzIGdjYyBzdXBwb3J0cyB2YXJpYWJsZS1sZW5ndGggYXJyYXlzIHdob3NlIHNpemVzCisvLyAgIGFyZSBkZXRlcm1pbmVkIGF0IHJ1bi10aW1lICh0aGlzIGlzIGdjYydzIGV4dGVuc2lvbiBhbmQgbm90IHBhcnQKKy8vICAgb2YgdGhlIEMrKyBzdGFuZGFyZCkuICBBcyBhIHJlc3VsdCwgZ2NjIGZhaWxzIHRvIHJlamVjdCB0aGUKKy8vICAgZm9sbG93aW5nIGNvZGUgd2l0aCB0aGUgc2ltcGxlIGRlZmluaXRpb246CisvLworLy8gICAgIGludCBmb287CisvLyAgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGZvbywgbXNnKTsgLy8gbm90IHN1cHBvc2VkIHRvIGNvbXBpbGUgYXMgZm9vIGlzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50LgorLy8KKy8vIC0gQnkgdXNpbmcgdGhlIHR5cGUgQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+LCB3ZSBlbnN1cmVzIHRoYXQKKy8vICAgZXhwciBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gIChUZW1wbGF0ZSBhcmd1bWVudHMgbXVzdCBiZQorLy8gICBkZXRlcm1pbmVkIGF0IGNvbXBpbGUtdGltZS4pCisvLworLy8gLSBUaGUgb3V0dGVyIHBhcmVudGhlc2VzIGluIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiBhcmUgbmVjZXNzYXJ5CisvLyAgIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGdjYyAzLjQuNCBhbmQgNC4wLjEuICBJZiB3ZSBoYWQgd3JpdHRlbgorLy8KKy8vICAgICBDb21waWxlQXNzZXJ0PGJvb2woZXhwcik+CisvLworLy8gICBpbnN0ZWFkLCB0aGVzZSBjb21waWxlcnMgd2lsbCByZWZ1c2UgdG8gY29tcGlsZQorLy8KKy8vICAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oNSA+IDAsIHNvbWVfbWVzc2FnZSk7CisvLworLy8gICAoVGhleSBzZWVtIHRvIHRoaW5rIHRoZSAiPiIgaW4gIjUgPiAwIiBtYXJrcyB0aGUgZW5kIG9mIHRoZQorLy8gICB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LikKKy8vCisvLyAtIFRoZSBhcnJheSBzaXplIGlzIChib29sKGV4cHIpID8gMSA6IC0xKSwgaW5zdGVhZCBvZiBzaW1wbHkKKy8vCisvLyAgICAgKChleHByKSA/IDEgOiAtMSkuCisvLworLy8gICBUaGlzIGlzIHRvIGF2b2lkIHJ1bm5pbmcgaW50byBhIGJ1ZyBpbiBNUyBWQyA3LjEsIHdoaWNoCisvLyAgIGNhdXNlcyAoKDAuMCkgPyAxIDogLTEpIHRvIGluY29ycmVjdGx5IGV2YWx1YXRlIHRvIDEuCisKKy8vIFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlciBpcyB1c2VkIGJ5IFN0YXRpY0Fzc2VydFR5cGVFcSBkZWZpbmVkIGluIGd0ZXN0LmguCisvLworLy8gVGhpcyB0ZW1wbGF0ZSBpcyBkZWNsYXJlZCwgYnV0IGludGVudGlvbmFsbHkgdW5kZWZpbmVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjxULCBUPiB7fTsKKworI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCit0eXBlZGVmIDo6c3RyaW5nIHN0cmluZzsKKyNlbHNlCit0eXBlZGVmIDo6c3RkOjpzdHJpbmcgc3RyaW5nOworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCit0eXBlZGVmIDo6d3N0cmluZyB3c3RyaW5nOworI2VsaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCit0eXBlZGVmIDo6c3RkOjp3c3RyaW5nIHdzdHJpbmc7CisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisvLyBBIGhlbHBlciBmb3Igc3VwcHJlc3Npbmcgd2FybmluZ3Mgb24gY29uc3RhbnQgY29uZGl0aW9uLiAgSXQganVzdAorLy8gcmV0dXJucyAnY29uZGl0aW9uJy4KK0dURVNUX0FQSV8gYm9vbCBJc1RydWUoYm9vbCBjb25kaXRpb24pOworCisvLyBEZWZpbmVzIHNjb3BlZF9wdHIuCisKKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2Ygc2NvcGVkX3B0ciBpcyBQQVJUSUFMIC0gaXQgb25seSBjb250YWlucworLy8gZW5vdWdoIHN0dWZmIHRvIHNhdGlzZnkgR29vZ2xlIFRlc3QncyBuZWVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBzY29wZWRfcHRyIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7CisKKyAgZXhwbGljaXQgc2NvcGVkX3B0cihUKiBwID0gTlVMTCkgOiBwdHJfKHApIHt9CisgIH5zY29wZWRfcHRyKCkgeyByZXNldCgpOyB9CisKKyAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnB0cl87IH0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KKyAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQorCisgIFQqIHJlbGVhc2UoKSB7CisgICAgVCogY29uc3QgcHRyID0gcHRyXzsKKyAgICBwdHJfID0gTlVMTDsKKyAgICByZXR1cm4gcHRyOworICB9CisKKyAgdm9pZCByZXNldChUKiBwID0gTlVMTCkgeworICAgIGlmIChwICE9IHB0cl8pIHsKKyAgICAgIGlmIChJc1RydWUoc2l6ZW9mKFQpID4gMCkpIHsgIC8vIE1ha2VzIHN1cmUgVCBpcyBhIGNvbXBsZXRlIHR5cGUuCisgICAgICAgIGRlbGV0ZSBwdHJfOworICAgICAgfQorICAgICAgcHRyXyA9IHA7CisgICAgfQorICB9CisgcHJpdmF0ZToKKyAgVCogcHRyXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKHNjb3BlZF9wdHIpOworfTsKKworLy8gRGVmaW5lcyBSRS4KKworLy8gQSBzaW1wbGUgQysrIHdyYXBwZXIgZm9yIDxyZWdleC5oPi4gIEl0IHVzZXMgdGhlIFBPU0lYIEV4dGVuZGVkCisvLyBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4LgorY2xhc3MgR1RFU1RfQVBJXyBSRSB7CisgcHVibGljOgorICAvLyBBIGNvcHkgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgYnkgdGhlIFN0YW5kYXJkIHRvIGluaXRpYWxpemUgb2JqZWN0CisgIC8vIHJlZmVyZW5jZXMgZnJvbSByLXZhbHVlcy4KKyAgUkUoY29uc3QgUkUmIG90aGVyKSB7IEluaXQob3RoZXIucGF0dGVybigpKTsgfQorCisgIC8vIENvbnN0cnVjdHMgYW4gUkUgZnJvbSBhIHN0cmluZy4KKyAgUkUoY29uc3QgOjpzdGQ6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIFJFKGNvbnN0IGNoYXIqIHJlZ2V4KSB7IEluaXQocmVnZXgpOyB9ICAvLyBOT0xJTlQKKyAgflJFKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleC4KKyAgY29uc3QgY2hhciogcGF0dGVybigpIGNvbnN0IHsgcmV0dXJuIHBhdHRlcm5fOyB9CisKKyAgLy8gRnVsbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMKKyAgLy8gdGhlIGVudGlyZSBzdHIuCisgIC8vIFBhcnRpYWxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZQorICAvLyBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0ciAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgorICAvLworICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogbWFrZSBGdWxsTWF0Y2goKSBhbmQgUGFydGlhbE1hdGNoKCkgd29yaworICAvLyB3aGVuIHN0ciBjb250YWlucyBOVUwgY2hhcmFjdGVycy4KKyAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgeworICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7CisgICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOworICB9CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKKyAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7CisgIH0KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworCisgIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisgIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7CisKKyBwcml2YXRlOgorICB2b2lkIEluaXQoY29uc3QgY2hhciogcmVnZXgpOworCisgIC8vIFdlIHVzZSBhIGNvbnN0IGNoYXIqIGluc3RlYWQgb2YgYSBzdHJpbmcsIGFzIEdvb2dsZSBUZXN0IG1heSBiZSB1c2VkCisgIC8vIHdoZXJlIHN0cmluZyBpcyBub3QgYXZhaWxhYmxlLiAgV2UgYWxzbyBkbyBub3QgdXNlIEdvb2dsZSBUZXN0J3Mgb3duCisgIC8vIFN0cmluZyB0eXBlIGhlcmUsIGluIG9yZGVyIHRvIHNpbXBsaWZ5IGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZQorICAvLyBmaWxlcy4KKyAgY29uc3QgY2hhciogcGF0dGVybl87CisgIGJvb2wgaXNfdmFsaWRfOworCisjaWYgR1RFU1RfVVNFU19QT1NJWF9SRQorCisgIHJlZ2V4X3QgZnVsbF9yZWdleF87ICAgICAvLyBGb3IgRnVsbE1hdGNoKCkuCisgIHJlZ2V4X3QgcGFydGlhbF9yZWdleF87ICAvLyBGb3IgUGFydGlhbE1hdGNoKCkuCisKKyNlbHNlICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQorCisgIGNvbnN0IGNoYXIqIGZ1bGxfcGF0dGVybl87ICAvLyBGb3IgRnVsbE1hdGNoKCk7CisKKyNlbmRpZgorCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUkUpOworfTsKKworLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKKy8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisvLyBGb3JtYXRzIGEgZmlsZSBsb2NhdGlvbiBmb3IgY29tcGlsZXItaW5kZXBlbmRlbnQgWE1MIG91dHB1dC4KKy8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCwgd2UgcHV0IGl0IG5leHQgdG8KKy8vIEZvcm1hdEZpbGVMb2NhdGlvbiBpbiBvcmRlciB0byBjb250cmFzdCB0aGUgdHdvIGZ1bmN0aW9ucy4KK0dURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7CisKKy8vIERlZmluZXMgbG9nZ2luZyB1dGlsaXRpZXM6CisvLyAgIEdURVNUX0xPR18oc2V2ZXJpdHkpIC0gbG9ncyBtZXNzYWdlcyBhdCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5IGxldmVsLiBUaGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGl0c2VsZiBpcyBzdHJlYW1lZCBpbnRvIHRoZSBtYWNyby4KKy8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCisKK2VudW0gR1Rlc3RMb2dTZXZlcml0eSB7CisgIEdURVNUX0lORk8sCisgIEdURVNUX1dBUk5JTkcsCisgIEdURVNUX0VSUk9SLAorICBHVEVTVF9GQVRBTAorfTsKKworLy8gRm9ybWF0cyBsb2cgZW50cnkgc2V2ZXJpdHksIHByb3ZpZGVzIGEgc3RyZWFtIG9iamVjdCBmb3Igc3RyZWFtaW5nIHRoZQorLy8gbG9nIG1lc3NhZ2UsIGFuZCB0ZXJtaW5hdGVzIHRoZSBtZXNzYWdlIHdpdGggYSBuZXdsaW5lIHdoZW4gZ29pbmcgb3V0IG9mCisvLyBzY29wZS4KK2NsYXNzIEdURVNUX0FQSV8gR1Rlc3RMb2cgeworIHB1YmxpYzoKKyAgR1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOworCisgIC8vIEZsdXNoZXMgdGhlIGJ1ZmZlcnMgYW5kLCBpZiBzZXZlcml0eSBpcyBHVEVTVF9GQVRBTCwgYWJvcnRzIHRoZSBwcm9ncmFtLgorICB+R1Rlc3RMb2coKTsKKworICA6OnN0ZDo6b3N0cmVhbSYgR2V0U3RyZWFtKCkgeyByZXR1cm4gOjpzdGQ6OmNlcnI7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHlfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RMb2cpOworfTsKKworI2RlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RMb2coOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfIyNzZXZlcml0eSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykuR2V0U3RyZWFtKCkKKworaW5saW5lIHZvaWQgTG9nVG9TdGRlcnIoKSB7fQoraW5saW5lIHZvaWQgRmx1c2hJbmZvTG9nKCkgeyBmZmx1c2goTlVMTCk7IH0KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFLgorLy8KKy8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uCisvLyBpcyBub3Qgc2F0aXNmaWVkLgorLy8gIFN5bm9wc3lzOgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsKKy8vICAgICBvcgorLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKSA8PCAiQWRkaXRpb25hbCBtZXNzYWdlIjsKKy8vCisvLyAgICBUaGlzIGNoZWNrcyB0aGUgY29uZGl0aW9uIGFuZCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKKy8vICAgIGl0IHByaW50cyBtZXNzYWdlIGFib3V0IHRoZSBjb25kaXRpb24gdmlvbGF0aW9uLCBpbmNsdWRpbmcgdGhlCisvLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksCisvLyAgICBhbmQgdGhlbiBpdCBhYm9ydHMgdGhlIHByb2dyYW0uIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpcnJlc3BlY3RpdmUgb2YKKy8vICAgIHdoZXRoZXIgaXQgaXMgYnVpbHQgaW4gdGhlIGRlYnVnIG1vZGUgb3Igbm90LgorI2RlZmluZSBHVEVTVF9DSEVDS18oY29uZGl0aW9uKSBcCisgICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoY29uZGl0aW9uKSkgXAorICAgICAgOyBcCisgICAgZWxzZSBcCisgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiQ29uZGl0aW9uICIgI2NvbmRpdGlvbiAiIGZhaWxlZC4gIgorCisvLyBBbiBhbGwtbW9kZSBhc3NlcnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFBPU0lYLXN0eWxlIGZ1bmN0aW9uCisvLyBjYWxsIHJldHVybnMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKS4gIEtub3duIGxpbWl0YXRpb246IHRoaXMKKy8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvCisvLyBpbiB7fSBpZiB5b3UgbmVlZCB0byB1c2UgaXQgYXMgdGhlIG9ubHkgc3RhdGVtZW50IGluIGFuICdpZicKKy8vIGJyYW5jaC4KKyNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXAorICBpZiAoY29uc3QgaW50IGd0ZXN0X2Vycm9yID0gKHBvc2l4X2NhbGwpKSBcCisgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgI3Bvc2l4X2NhbGwgPDwgImZhaWxlZCB3aXRoIGVycm9yICIgXAorICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVXNlIEltcGxpY2l0Q2FzdF8gYXMgYSBzYWZlIHZlcnNpb24gb2Ygc3RhdGljX2Nhc3QgZm9yIHVwY2FzdGluZyBpbgorLy8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuIGNhc3RpbmcgYSBGb28qIHRvIGEgU3VwZXJjbGFzc09mRm9vKiBvciBhCisvLyBjb25zdCBGb28qKS4gIFdoZW4geW91IHVzZSBJbXBsaWNpdENhc3RfLCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQKKy8vIHRoZSBjYXN0IGlzIHNhZmUuICBTdWNoIGV4cGxpY2l0IEltcGxpY2l0Q2FzdF9zIGFyZSBuZWNlc3NhcnkgaW4KKy8vIHN1cnByaXNpbmdseSBtYW55IHNpdHVhdGlvbnMgd2hlcmUgQysrIGRlbWFuZHMgYW4gZXhhY3QgdHlwZSBtYXRjaAorLy8gaW5zdGVhZCBvZiBhbiBhcmd1bWVudCB0eXBlIGNvbnZlcnRhYmxlIHRvIGEgdGFyZ2V0IHR5cGUuCisvLworLy8gVGhlIHN5bnRheCBmb3IgdXNpbmcgSW1wbGljaXRDYXN0XyBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljX2Nhc3Q6CisvLworLy8gICBJbXBsaWNpdENhc3RfPFRvVHlwZT4oZXhwcikKKy8vCisvLyBJbXBsaWNpdENhc3RfIHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwKKy8vIGJ1dCB0aGUgcHJvcG9zYWwgd2FzIHN1Ym1pdHRlZCB0b28gbGF0ZS4gIEl0IHdpbGwgcHJvYmFibHkgbWFrZQorLy8gaXRzIHdheSBpbnRvIHRoZSBsYW5ndWFnZSBpbiB0aGUgZnV0dXJlLgorLy8KKy8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAorLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGltcGxpY2l0X2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbz4KK2lubGluZSBUbyBJbXBsaWNpdENhc3RfKFRvIHgpIHsgcmV0dXJuIHg7IH0KKworLy8gV2hlbiB5b3UgdXBjYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tIHR5cGUgRm9vIHRvIHR5cGUKKy8vIFN1cGVyY2xhc3NPZkZvbyksIGl0J3MgZmluZSB0byB1c2UgSW1wbGljaXRDYXN0Xzw+LCBzaW5jZSB1cGNhc3RzCisvLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tCisvLyB0eXBlIEZvbyB0byB0eXBlIFN1YmNsYXNzT2ZGb28pLCBzdGF0aWNfY2FzdDw+IGlzbid0IHNhZmUsIGJlY2F1c2UKKy8vIGhvdyBkbyB5b3Uga25vdyB0aGUgcG9pbnRlciBpcyByZWFsbHkgb2YgdHlwZSBTdWJjbGFzc09mRm9vPyAgSXQKKy8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsCisvLyB3aGVuIHlvdSBkb3duY2FzdCwgeW91IHNob3VsZCB1c2UgdGhpcyBtYWNyby4gIEluIGRlYnVnIG1vZGUsIHdlCisvLyB1c2UgZHluYW1pY19jYXN0PD4gdG8gZG91YmxlLWNoZWNrIHRoZSBkb3duY2FzdCBpcyBsZWdhbCAod2UgZGllCisvLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+CisvLyBpbnN0ZWFkLiAgVGh1cywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBpbiBkZWJ1ZyBtb2RlIHRvIG1ha2Ugc3VyZQorLy8gdGhlIGNhc3QgaXMgbGVnYWwhCisvLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uCisvLyBJbiBwYXJ0aWN1bGFyLCB5b3UgU0hPVUxETidUIGJlIHVzaW5nIGR5bmFtaWNfY2FzdDw+IGluIG9yZGVyIHRvCisvLyBkbyBSVFRJIChlZyBjb2RlIGxpa2UgdGhpczoKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7CisvLyAgICBpZiAoZHluYW1pY19jYXN0PFN1YmNsYXNzMj4oZm9vKSkgSGFuZGxlQVN1YmNsYXNzMk9iamVjdChmb28pOworLy8gWW91IHNob3VsZCBkZXNpZ24gdGhlIGNvZGUgc29tZSBvdGhlciB3YXkgbm90IHRvIG5lZWQgdGhpcy4KKy8vCisvLyBUaGlzIHJlbGF0aXZlbHkgdWdseSBuYW1lIGlzIGludGVudGlvbmFsLiBJdCBwcmV2ZW50cyBjbGFzaGVzIHdpdGgKKy8vIHNpbWlsYXIgZnVuY3Rpb25zIHVzZXJzIG1heSBoYXZlIChlLmcuLCBkb3duX2Nhc3QpLiBUaGUgaW50ZXJuYWwKKy8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gIC8vIHVzZSBsaWtlIHRoaXM6IERvd25DYXN0XzxUKj4oZm9vKTsKK2lubGluZSBUbyBEb3duQ2FzdF8oRnJvbSogZikgeyAgLy8gc28gd2Ugb25seSBhY2NlcHQgcG9pbnRlcnMKKyAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQorICAvLyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcsIGFuZCBoYXMgbm8gb3ZlcmhlYWQgaW4gYW4KKyAgLy8gb3B0aW1pemVkIGJ1aWxkIGF0IHJ1bi10aW1lLCBhcyBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5CisgIC8vIGNvbXBsZXRlbHkuCisgIGlmIChmYWxzZSkgeworICAgIGNvbnN0IFRvIHRvID0gTlVMTDsKKyAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7CisgIH0KKworI2lmIEdURVNUX0hBU19SVFRJCisgIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKKyAgR1RFU1RfQ0hFQ0tfKGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Cit9CisKKy8vIERvd25jYXN0cyB0aGUgcG9pbnRlciBvZiB0eXBlIEJhc2UgdG8gRGVyaXZlZC4KKy8vIERlcml2ZWQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEJhc2UuIFRoZSBwYXJhbWV0ZXIgTVVTVAorLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuCisvLyBXaGVuIFJUVEkgaXMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgYSBydW50aW1lCisvLyBjaGVjayB0byBlbmZvcmNlIHRoaXMuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4KK0Rlcml2ZWQqIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZShCYXNlKiBiYXNlKSB7CisjaWYgR1RFU1RfSEFTX1JUVEkKKyAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBOT0xJTlQKKyNlbHNlCisgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0LgorI2VuZGlmCit9CisKKyNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCisKKy8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoKKy8vICAgQ2FwdHVyZVN0ZG91dCAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KKy8vICAgR2V0Q2FwdHVyZWRTdGRvdXQgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCisvLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCisvLyAgIEdldENhcHR1cmVkU3RkZXJyIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgorLy8KK0dURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7CitHVEVTVF9BUElfIFN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpOworR1RFU1RfQVBJXyB2b2lkIENhcHR1cmVTdGRlcnIoKTsKK0dURVNUX0FQSV8gU3RyaW5nIEdldENhcHR1cmVkU3RkZXJyKCk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgorCisKKyNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KK2V4dGVybiA6OnN0ZDo6dmVjdG9yPFN0cmluZz4gZ19hcmd2czsKKworLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcuCitjb25zdCA6OnN0ZDo6dmVjdG9yPFN0cmluZz4mIEdldEFyZ3ZzKCk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gRGVmaW5lcyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKworI2lmIEdURVNUX0hBU19QVEhSRUFECisKKy8vIFNsZWVwcyBmb3IgKHJvdWdobHkpIG4gbWlsbGktc2Vjb25kcy4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IKKy8vIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gIERvbid0IHVzZSBpdCBpbiB1c2VyIHRlc3RzLAorLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitpbmxpbmUgdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbikgeworICBjb25zdCB0aW1lc3BlYyB0aW1lID0geworICAgIDAsICAgICAgICAgICAgICAgICAgLy8gMCBzZWNvbmRzLgorICAgIG4gKiAxMDAwTCAqIDEwMDBMLCAgLy8gQW5kIG4gbXMuCisgIH07CisgIG5hbm9zbGVlcCgmdGltZSwgTlVMTCk7Cit9CisKKy8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCisvLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCisvLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90CisvLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCitjbGFzcyBOb3RpZmljYXRpb24geworIHB1YmxpYzoKKyAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHt9CisKKyAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0CisgIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KKyAgdm9pZCBOb3RpZnkoKSB7IG5vdGlmaWVkXyA9IHRydWU7IH0KKworICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAorICAvLyB0aHJlYWQuCisgIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKKyAgICB3aGlsZSghbm90aWZpZWRfKSB7CisgICAgICBTbGVlcE1pbGxpc2Vjb25kcygxMCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICB2b2xhdGlsZSBib29sIG5vdGlmaWVkXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5vdGlmaWNhdGlvbik7Cit9OworCisvLyBBcyBhIEMtZnVuY3Rpb24sIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UgY2Fubm90IGJlIHRlbXBsYXRlZCBpdHNlbGYuCisvLyBDb25zZXF1ZW50bHksIGl0IGNhbm5vdCBzZWxlY3QgYSBjb3JyZWN0IGluc3RhbnRpYXRpb24gb2YgVGhyZWFkV2l0aFBhcmFtCisvLyBpbiBvcmRlciB0byBjYWxsIGl0cyBSdW4oKS4gSW50cm9kdWNpbmcgVGhyZWFkV2l0aFBhcmFtQmFzZSBhcyBhCisvLyBub24tdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFRocmVhZFdpdGhQYXJhbSBhbGxvd3MgdXMgdG8gYnlwYXNzIHRoaXMKKy8vIHByb2JsZW0uCitjbGFzcyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbUJhc2UoKSB7fQorICB2aXJ0dWFsIHZvaWQgUnVuKCkgPSAwOworfTsKKworLy8gcHRocmVhZF9jcmVhdGUoKSBhY2NlcHRzIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHR5cGUgd2l0aCB0aGUgQyBsaW5rYWdlLgorLy8gQWNjb3JkaW5nIHRvIHRoZSBTdGFuZGFyZCAoNy41LzEpLCBmdW5jdGlvbiB0eXBlcyB3aXRoIGRpZmZlcmVudCBsaW5rYWdlcworLy8gYXJlIGRpZmZlcmVudCBldmVuIGlmIHRoZXkgYXJlIG90aGVyd2lzZSBpZGVudGljYWwuICBTb21lIGNvbXBpbGVycyAoZm9yCisvLyBleGFtcGxlLCBTdW5TdHVkaW8pIHRyZWF0IHRoZW0gYXMgZGlmZmVyZW50IHR5cGVzLiAgU2luY2UgY2xhc3MgbWV0aG9kcworLy8gY2Fubm90IGJlIGRlZmluZWQgd2l0aCBDLWxpbmthZ2Ugd2UgbmVlZCB0byBkZWZpbmUgYSBmcmVlIEMtZnVuY3Rpb24gdG8KKy8vIHBhc3MgaW50byBwdGhyZWFkX2NyZWF0ZSgpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCogVGhyZWFkRnVuY1dpdGhDTGlua2FnZSh2b2lkKiB0aHJlYWQpIHsKKyAgc3RhdGljX2Nhc3Q8VGhyZWFkV2l0aFBhcmFtQmFzZSo+KHRocmVhZCktPlJ1bigpOworICByZXR1cm4gTlVMTDsKK30KKworLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCisvLyBUbyB1c2UgaXQsIHdyaXRlOgorLy8KKy8vICAgdm9pZCBUaHJlYWRGdW5jKGludCBwYXJhbSkgeyAvKiBEbyB0aGluZ3Mgd2l0aCBwYXJhbSAqLyB9CisvLyAgIE5vdGlmaWNhdGlvbiB0aHJlYWRfY2FuX3N0YXJ0OworLy8gICAuLi4KKy8vICAgLy8gVGhlIHRocmVhZF9jYW5fc3RhcnQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsOyB5b3UgY2FuIHN1cHBseSBOVUxMLgorLy8gICBUaHJlYWRXaXRoUGFyYW08aW50PiB0aHJlYWQoJlRocmVhZEZ1bmMsIDUsICZ0aHJlYWRfY2FuX3N0YXJ0KTsKKy8vICAgdGhyZWFkX2Nhbl9zdGFydC5Ob3RpZnkoKTsKKy8vCisvLyBUaGVzZSBjbGFzc2VzIGFyZSBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvCisvLyBub3QgdXNlIHRoZW0gaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoKlVzZXJUaHJlYWRGdW5jKShUKTsKKworICBUaHJlYWRXaXRoUGFyYW0oCisgICAgICBVc2VyVGhyZWFkRnVuYyBmdW5jLCBUIHBhcmFtLCBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCisgICAgICA6IGZ1bmNfKGZ1bmMpLAorICAgICAgICBwYXJhbV8ocGFyYW0pLAorICAgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xyh0aHJlYWRfY2FuX3N0YXJ0KSwKKyAgICAgICAgZmluaXNoZWRfKGZhbHNlKSB7CisgICAgVGhyZWFkV2l0aFBhcmFtQmFzZSogY29uc3QgYmFzZSA9IHRoaXM7CisgICAgLy8gVGhlIHRocmVhZCBjYW4gYmUgY3JlYXRlZCBvbmx5IGFmdGVyIGFsbCBmaWVsZHMgZXhjZXB0IHRocmVhZF8KKyAgICAvLyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRfLCAwLCAmVGhyZWFkRnVuY1dpdGhDTGlua2FnZSwgYmFzZSkpOworICB9CisgIH5UaHJlYWRXaXRoUGFyYW0oKSB7IEpvaW4oKTsgfQorCisgIHZvaWQgSm9pbigpIHsKKyAgICBpZiAoIWZpbmlzaGVkXykgeworICAgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9qb2luKHRocmVhZF8sIDApKTsKKyAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB2b2lkIFJ1bigpIHsKKyAgICBpZiAodGhyZWFkX2Nhbl9zdGFydF8gIT0gTlVMTCkKKyAgICAgIHRocmVhZF9jYW5fc3RhcnRfLT5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7CisgICAgZnVuY18ocGFyYW1fKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgVXNlclRocmVhZEZ1bmMgZnVuY187ICAvLyBVc2VyLXN1cHBsaWVkIHRocmVhZCBmdW5jdGlvbi4KKyAgY29uc3QgVCBwYXJhbV87ICAvLyBVc2VyLXN1cHBsaWVkIHBhcmFtZXRlciB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorICAvLyBXaGVuIG5vbi1OVUxMLCB1c2VkIHRvIGJsb2NrIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY29udHJvbGxlciB0aHJlYWQKKyAgLy8gbm90aWZpZXMuCisgIE5vdGlmaWNhdGlvbiogY29uc3QgdGhyZWFkX2Nhbl9zdGFydF87CisgIGJvb2wgZmluaXNoZWRfOyAgLy8gdHJ1ZSBpZmYgd2Uga25vdyB0aGF0IHRoZSB0aHJlYWQgZnVuY3Rpb24gaGFzIGZpbmlzaGVkLgorICBwdGhyZWFkX3QgdGhyZWFkXzsgIC8vIFRoZSBuYXRpdmUgdGhyZWFkIG9iamVjdC4KKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbSk7Cit9OworCisvLyBNdXRleEJhc2UgYW5kIE11dGV4IGltcGxlbWVudCBtdXRleCBvbiBwdGhyZWFkcy1iYXNlZCBwbGF0Zm9ybXMuIFRoZXkKKy8vIGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY2xhc3MgTXV0ZXhMb2NrOgorLy8KKy8vICAgTXV0ZXggbXV0ZXg7CisvLyAgIC4uLgorLy8gICBNdXRleExvY2sgbG9jaygmbXV0ZXgpOyAgLy8gQWNxdWlyZXMgdGhlIG11dGV4IGFuZCByZWxlYXNlcyBpdCBhdCB0aGUgZW5kCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBzY29wZS4KKy8vCisvLyBNdXRleEJhc2UgaW1wbGVtZW50cyBiZWhhdmlvciBmb3IgYm90aCBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseQorLy8gYWxsb2NhdGVkIG11dGV4ZXMuICBEbyBub3QgdXNlIE11dGV4QmFzZSBkaXJlY3RseS4gIEluc3RlYWQsIHdyaXRlCisvLyB0aGUgZm9sbG93aW5nIHRvIGRlZmluZSBhIHN0YXRpYyBtdXRleDoKKy8vCisvLyAgIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKGdfc29tZV9tdXRleCk7CisvLworLy8gWW91IGNhbiBmb3J3YXJkIGRlY2xhcmUgYSBzdGF0aWMgbXV0ZXggbGlrZSB0aGlzOgorLy8KKy8vICAgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfc29tZV9tdXRleCk7CisvLworLy8gVG8gY3JlYXRlIGEgZHluYW1pYyBtdXRleCwganVzdCBkZWZpbmUgYW4gb2JqZWN0IG9mIHR5cGUgTXV0ZXguCitjbGFzcyBNdXRleEJhc2UgeworIHB1YmxpYzoKKyAgLy8gQWNxdWlyZXMgdGhpcyBtdXRleC4KKyAgdm9pZCBMb2NrKCkgeworICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKSk7CisgICAgb3duZXJfID0gcHRocmVhZF9zZWxmKCk7CisgIH0KKworICAvLyBSZWxlYXNlcyB0aGlzIG11dGV4LgorICB2b2lkIFVubG9jaygpIHsKKyAgICAvLyBXZSBkb24ndCBwcm90ZWN0IHdyaXRpbmcgdG8gb3duZXJfIGhlcmUsIGFzIGl0J3MgdGhlIGNhbGxlcidzCisgICAgLy8gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZQorICAgIC8vIG11dGV4IHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgICAgb3duZXJfID0gMDsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKSk7CisgIH0KKworICAvLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZSBtdXRleC4gT3RoZXJ3aXNlLCBjcmFzaGVzCisgIC8vIHdpdGggaGlnaCBwcm9iYWJpbGl0eS4KKyAgdm9pZCBBc3NlcnRIZWxkKCkgY29uc3QgeworICAgIEdURVNUX0NIRUNLXyhvd25lcl8gPT0gcHRocmVhZF9zZWxmKCkpCisgICAgICAgIDw8ICJUaGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGhvbGRpbmcgdGhlIG11dGV4IEAiIDw8IHRoaXM7CisgIH0KKworICAvLyBBIHN0YXRpYyBtdXRleCBtYXkgYmUgdXNlZCBiZWZvcmUgbWFpbigpIGlzIGVudGVyZWQuICBJdCBtYXkgZXZlbgorICAvLyBiZSB1c2VkIGJlZm9yZSB0aGUgZHluYW1pYyBpbml0aWFsaXphdGlvbiBzdGFnZS4gIFRoZXJlZm9yZSB3ZQorICAvLyBtdXN0IGJlIGFibGUgdG8gaW5pdGlhbGl6ZSBhIHN0YXRpYyBtdXRleCBvYmplY3QgYXQgbGluayB0aW1lLgorICAvLyBUaGlzIG1lYW5zIE11dGV4QmFzZSBoYXMgdG8gYmUgYSBQT0QgYW5kIGl0cyBtZW1iZXIgdmFyaWFibGVzCisgIC8vIGhhdmUgdG8gYmUgcHVibGljLgorIHB1YmxpYzoKKyAgcHRocmVhZF9tdXRleF90IG11dGV4XzsgIC8vIFRoZSB1bmRlcmx5aW5nIHB0aHJlYWQgbXV0ZXguCisgIHB0aHJlYWRfdCBvd25lcl87ICAvLyBUaGUgdGhyZWFkIGhvbGRpbmcgdGhlIG11dGV4OyAwIG1lYW5zIG5vIG9uZSBob2xkcyBpdC4KK307CisKKy8vIEZvcndhcmQtZGVjbGFyZXMgYSBzdGF0aWMgbXV0ZXguCisjIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKKyAgICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4CisKKy8vIERlZmluZXMgYW5kIHN0YXRpY2FsbHkgKGkuZS4gYXQgbGluayB0aW1lKSBpbml0aWFsaXplcyBhIHN0YXRpYyBtdXRleC4KKyMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4ID0geyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCAwIH0KKworLy8gVGhlIE11dGV4IGNsYXNzIGNhbiBvbmx5IGJlIHVzZWQgZm9yIG11dGV4ZXMgY3JlYXRlZCBhdCBydW50aW1lLiBJdAorLy8gc2hhcmVzIGl0cyBBUEkgd2l0aCBNdXRleEJhc2Ugb3RoZXJ3aXNlLgorY2xhc3MgTXV0ZXggOiBwdWJsaWMgTXV0ZXhCYXNlIHsKKyBwdWJsaWM6CisgIE11dGV4KCkgeworICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXhfLCBOVUxMKSk7CisgICAgb3duZXJfID0gMDsKKyAgfQorICB+TXV0ZXgoKSB7CisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNdXRleCk7Cit9OworCisvLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBhcyB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAorLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KK2NsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4QmFzZSogbXV0ZXgpCisgICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQorCisgIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQorCisgcHJpdmF0ZToKKyAgTXV0ZXhCYXNlKiBjb25zdCBtdXRleF87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdE11dGV4TG9jayk7Cit9OworCit0eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKKworLy8gSGVscGVycyBmb3IgVGhyZWFkTG9jYWwuCisKKy8vIHB0aHJlYWRfa2V5X2NyZWF0ZSgpIHJlcXVpcmVzIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB0byBoYXZlCisvLyBDLWxpbmthZ2UuICBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIHRlbXBsYXRpemVkIHRvIGFjY2VzcworLy8gVGhyZWFkTG9jYWw8VD4uICBIZW5jZSB0aGUgbmVlZCBmb3IgY2xhc3MKKy8vIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlLgorY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UoKSB7fQorfTsKKworLy8gQ2FsbGVkIGJ5IHB0aHJlYWQgdG8gZGVsZXRlIHRocmVhZC1sb2NhbCBkYXRhIHN0b3JlZCBieQorLy8gcHRocmVhZF9zZXRzcGVjaWZpYygpLgorZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHZvaWQqIHZhbHVlX2hvbGRlcikgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPih2YWx1ZV9ob2xkZXIpOworfQorCisvLyBJbXBsZW1lbnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlIG9uIHB0aHJlYWRzLWJhc2VkIHN5c3RlbXMuCisvLworLy8gICAvLyBUaHJlYWQgMQorLy8gICBUaHJlYWRMb2NhbDxpbnQ+IHRsKDEwMCk7ICAvLyAxMDAgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgorLy8KKy8vICAgLy8gVGhyZWFkIDIKKy8vICAgdGwuc2V0KDE1MCk7ICAvLyBDaGFuZ2VzIHRoZSB2YWx1ZSBmb3IgdGhyZWFkIDIgb25seS4KKy8vICAgRVhQRUNUX0VRKDE1MCwgdGwuZ2V0KCkpOworLy8KKy8vICAgLy8gVGhyZWFkIDEKKy8vICAgRVhQRUNUX0VRKDEwMCwgdGwuZ2V0KCkpOyAgLy8gSW4gdGhyZWFkIDEsIHRsIGhhcyB0aGUgb3JpZ2luYWwgdmFsdWUuCisvLyAgIHRsLnNldCgyMDApOworLy8gICBFWFBFQ1RfRVEoMjAwLCB0bC5nZXQoKSk7CisvLworLy8gVGhlIHRlbXBsYXRlIHR5cGUgYXJndW1lbnQgVCBtdXN0IGhhdmUgYSBwdWJsaWMgY29weSBjb25zdHJ1Y3Rvci4KKy8vIEluIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCBUaHJlYWRMb2NhbCBjb25zdHJ1Y3RvciByZXF1aXJlcyBUIHRvIGhhdmUKKy8vIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuCisvLworLy8gQW4gb2JqZWN0IG1hbmFnZWQgZm9yIGEgdGhyZWFkIGJ5IGEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMgZGVsZXRlZAorLy8gd2hlbiB0aGUgdGhyZWFkIGV4aXRzLiAgT3IsIGlmIHRoZSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBkaWVzIGluCisvLyB0aGF0IHRocmVhZCwgd2hlbiB0aGUgVGhyZWFkTG9jYWwgZGllcy4gIEl0J3MgdGhlIHVzZXIncworLy8gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYWxsIG90aGVyIHRocmVhZHMgdXNpbmcgYSBUaHJlYWRMb2NhbAorLy8gaGF2ZSBleGl0ZWQgd2hlbiBpdCBkaWVzLCBvciB0aGUgcGVyLXRocmVhZCBvYmplY3RzIGZvciB0aG9zZQorLy8gdGhyZWFkcyB3aWxsIG5vdCBiZSBkZWxldGVkLgorLy8KKy8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQorLy8gd2lsbCBkaWUgYWZ0ZXIgbWFpbigpIGhhcyByZXR1cm5lZC4gIFRoZXJlZm9yZSwgbm8gcGVyLXRocmVhZAorLy8gb2JqZWN0IG1hbmFnZWQgYnkgR29vZ2xlIFRlc3Qgd2lsbCBiZSBsZWFrZWQgYXMgbG9uZyBhcyBhbGwgdGhyZWFkcworLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGhyZWFkTG9jYWwgeworIHB1YmxpYzoKKyAgVGhyZWFkTG9jYWwoKSA6IGtleV8oQ3JlYXRlS2V5KCkpLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdF8oKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiBrZXlfKENyZWF0ZUtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF8odmFsdWUpIHt9CisKKyAgflRocmVhZExvY2FsKCkgeworICAgIC8vIERlc3Ryb3lzIHRoZSBtYW5hZ2VkIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBpZiBhbnkuCisgICAgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZShwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKworICAgIC8vIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4gIFRoaXMgd2lsbCAqbm90KgorICAgIC8vIGRlbGV0ZSBtYW5hZ2VkIG9iamVjdHMgZm9yIG90aGVyIHRocmVhZHMuCisgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9rZXlfZGVsZXRlKGtleV8pKTsKKyAgfQorCisgIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KKyAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQorICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9CisgIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgLy8gSG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQuCisgIGNsYXNzIFZhbHVlSG9sZGVyIDogcHVibGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CisKKyAgICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQorCisgICBwcml2YXRlOgorICAgIFQgdmFsdWVfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOworICB9OworCisgIHN0YXRpYyBwdGhyZWFkX2tleV90IENyZWF0ZUtleSgpIHsKKyAgICBwdGhyZWFkX2tleV90IGtleTsKKyAgICAvLyBXaGVuIGEgdGhyZWFkIGV4aXRzLCBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKCkgd2lsbCBiZSBjYWxsZWQgb24KKyAgICAvLyB0aGUgb2JqZWN0IG1hbmFnZWQgZm9yIHRoYXQgdGhyZWFkLgorICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKAorICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmtleSwgJkRlbGV0ZVRocmVhZExvY2FsVmFsdWUpKTsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsKKyAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleV8pKTsKKyAgICBpZiAoaG9sZGVyICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8VmFsdWVIb2xkZXI+KGhvbGRlciktPnBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBWYWx1ZUhvbGRlciogY29uc3QgbmV3X2hvbGRlciA9IG5ldyBWYWx1ZUhvbGRlcihkZWZhdWx0Xyk7CisgICAgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIGNvbnN0IGhvbGRlcl9iYXNlID0gbmV3X2hvbGRlcjsKKyAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX3NldHNwZWNpZmljKGtleV8sIGhvbGRlcl9iYXNlKSk7CisgICAgcmV0dXJuIG5ld19ob2xkZXItPnBvaW50ZXIoKTsKKyAgfQorCisgIC8vIEEga2V5IHB0aHJlYWRzIHVzZXMgZm9yIGxvb2tpbmcgdXAgcGVyLXRocmVhZCB2YWx1ZXMuCisgIGNvbnN0IHB0aHJlYWRfa2V5X3Qga2V5XzsKKyAgY29uc3QgVCBkZWZhdWx0XzsgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4KKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZExvY2FsKTsKK307CisKKyMgZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgMQorCisjZWxzZSAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKKworLy8gQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAobXV0ZXgsIGxvY2ssCisvLyBhbmQgdGhyZWFkLWxvY2FsIHZhcmlhYmxlKS4gIE5lY2Vzc2FyeSBmb3IgY29tcGlsaW5nIEdvb2dsZSBUZXN0IHdoZXJlCisvLyBtdXRleCBpcyBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgR29vZ2xlIFRlc3QgaW4gbXVsdGlwbGUgdGhyZWFkcyBpcyBub3QKKy8vIHN1cHBvcnRlZCBvbiBzdWNoIHBsYXRmb3Jtcy4KKworY2xhc3MgTXV0ZXggeworIHB1YmxpYzoKKyAgTXV0ZXgoKSB7fQorICB2b2lkIEFzc2VydEhlbGQoKSBjb25zdCB7fQorfTsKKworIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCisgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAorCisjIGRlZmluZSBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgKKworY2xhc3MgR1Rlc3RNdXRleExvY2sgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgR1Rlc3RNdXRleExvY2soTXV0ZXgqKSB7fSAgLy8gTk9MSU5UCit9OworCit0eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUaHJlYWRMb2NhbCB7CisgcHVibGljOgorICBUaHJlYWRMb2NhbCgpIDogdmFsdWVfKCkge30KKyAgZXhwbGljaXQgVGhyZWFkTG9jYWwoY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQorICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQorICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQorICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgdmFsdWVfID0gdmFsdWU7IH0KKyBwcml2YXRlOgorICBUIHZhbHVlXzsKK307CisKKy8vIFRoZSBhYm92ZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBoYXZlIGR1bW15IGltcGxlbWVudGF0aW9ucy4KKy8vIFRoZXJlZm9yZSBHb29nbGUgVGVzdCBpcyBub3QgdGhyZWFkLXNhZmUuCisjIGRlZmluZSBHVEVTVF9JU19USFJFQURTQUZFIDAKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUFRIUkVBRAorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKKy8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCitHVEVTVF9BUElfIHNpemVfdCBHZXRUaHJlYWRDb3VudCgpOworCisvLyBQYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pIGNyYXNoZXMgdGhlIEFSTQorLy8gY29tcGlsZXIgYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgaW4gU3VuIFN0dWRpby4gIFRoZSBOb2tpYSBTeW1iaWFuCisvLyBhbmQgdGhlIElCTSBYTCBDL0MrKyBjb21waWxlciB0cnkgdG8gaW5zdGFudGlhdGUgYSBjb3B5IGNvbnN0cnVjdG9yCisvLyBmb3Igb2JqZWN0cyBwYXNzZWQgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKSwgZmFpbGluZyBmb3IgdW5jb3B5YWJsZQorLy8gb2JqZWN0cy4gIFdlIGRlZmluZSB0aGlzIHRvIGVuc3VyZSB0aGF0IG9ubHkgUE9EIGlzIHBhc3NlZCB0aHJvdWdoCisvLyBlbGxpcHNpcyBvbiB0aGVzZSBzeXN0ZW1zLgorI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKQorLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlCisvLyBwYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pLgorIyBkZWZpbmUgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXyAxCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTCAxCisjZW5kaWYKKworLy8gVGhlIE5va2lhIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBjb21waWxlcnMgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCisvLyBjb25zdCBUJiBhbmQgY29uc3QgVCogaW4gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gIFRoZXNlIGNvbXBpbGVycworLy8gX2Nhbl8gZGVjaWRlIGJldHdlZW4gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBUIGFuZCBUKiwKKy8vIHNvIGEgdHIxOjp0eXBlX3RyYWl0cy1saWtlIGlzX3BvaW50ZXIgd29ya3MuCisjaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pCisjIGRlZmluZSBHVEVTVF9ORUVEU19JU19QT0lOVEVSXyAxCisjZW5kaWYKKwordGVtcGxhdGUgPGJvb2wgYm9vbF92YWx1ZT4KK3N0cnVjdCBib29sX2NvbnN0YW50IHsKKyAgdHlwZWRlZiBib29sX2NvbnN0YW50PGJvb2xfdmFsdWU+IHR5cGU7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gYm9vbF92YWx1ZTsKK307Cit0ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPiBjb25zdCBib29sIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT46OnZhbHVlOworCit0eXBlZGVmIGJvb2xfY29uc3RhbnQ8ZmFsc2U+IGZhbHNlX3R5cGU7Cit0eXBlZGVmIGJvb2xfY29uc3RhbnQ8dHJ1ZT4gdHJ1ZV90eXBlOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19wb2ludGVyIDogcHVibGljIGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3BvaW50ZXI8VCo+IDogcHVibGljIHRydWVfdHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgorc3RydWN0IEl0ZXJhdG9yVHJhaXRzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSXRlcmF0b3JUcmFpdHM8VCo+IHsKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJdGVyYXRvclRyYWl0czxjb25zdCBUKj4geworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKK307CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisjIGRlZmluZSBHVEVTVF9QQVRIX1NFUF8gIlxcIgorIyBkZWZpbmUgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8gMQorLy8gVGhlIGJpZ2dlc3Qgc2lnbmVkIGludGVnZXIgdHlwZSB0aGUgY29tcGlsZXIgc3VwcG9ydHMuCit0eXBlZGVmIF9faW50NjQgQmlnZ2VzdEludDsKKyNlbHNlCisjIGRlZmluZSBHVEVTVF9QQVRIX1NFUF8gIi8iCisjIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAwCit0eXBlZGVmIGxvbmcgbG9uZyBCaWdnZXN0SW50OyAgLy8gTk9MSU5UCisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKKworLy8gVXRpbGl0aWVzIGZvciBjaGFyLgorCisvLyBpc3NwYWNlKGludCBjaCkgYW5kIGZyaWVuZHMgYWNjZXB0IGFuIHVuc2lnbmVkIGNoYXIgb3IgRU9GLiAgY2hhcgorLy8gbWF5IGJlIHNpZ25lZCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciAob3IgY29tcGlsZXIgZmxhZ3MpLgorLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2FzdCBhIGNoYXIgdG8gdW5zaWduZWQgY2hhciBiZWZvcmUgY2FsbGluZworLy8gaXNzcGFjZSgpLCBldGMuCisKK2lubGluZSBib29sIElzQWxwaGEoY2hhciBjaCkgeworICByZXR1cm4gaXNhbHBoYShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc0FsTnVtKGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzYWxudW0oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNEaWdpdChjaGFyIGNoKSB7CisgIHJldHVybiBpc2RpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzTG93ZXIoY2hhciBjaCkgeworICByZXR1cm4gaXNsb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Cit9CitpbmxpbmUgYm9vbCBJc1NwYWNlKGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzc3BhY2Uoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOworfQoraW5saW5lIGJvb2wgSXNVcHBlcihjaGFyIGNoKSB7CisgIHJldHVybiBpc3VwcGVyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KK2lubGluZSBib29sIElzWERpZ2l0KGNoYXIgY2gpIHsKKyAgcmV0dXJuIGlzeGRpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKK30KKworaW5saW5lIGNoYXIgVG9Mb3dlcihjaGFyIGNoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPih0b2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOworfQoraW5saW5lIGNoYXIgVG9VcHBlcihjaGFyIGNoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPih0b3VwcGVyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOworfQorCisvLyBUaGUgdGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4IG5hbWVzcGFjZSBob2xkcyB3cmFwcGVycyBmb3IgY29tbW9uCisvLyBQT1NJWCBmdW5jdGlvbnMuICBUaGVzZSB3cmFwcGVycyBoaWRlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisvLyBXaW5kb3dzL01TVkMgYW5kIFBPU0lYIHN5c3RlbXMuICBTaW5jZSBzb21lIGNvbXBpbGVycyBkZWZpbmUgdGhlc2UKKy8vIHN0YW5kYXJkIGZ1bmN0aW9ucyBhcyBtYWNyb3MsIHRoZSB3cmFwcGVyIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5hbWUKKy8vIGFzIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgorCituYW1lc3BhY2UgcG9zaXggeworCisvLyBGdW5jdGlvbnMgd2l0aCBhIGRpZmZlcmVudCBuYW1lIG9uIFdpbmRvd3MuCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKK3R5cGVkZWYgc3RydWN0IF9zdGF0IFN0YXRTdHJ1Y3Q7CisKKyMgaWZkZWYgX19CT1JMQU5EQ19fCitpbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0KK2lubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIHN0cmljbXAoczEsIHMyKTsKK30KK2lubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQorIyBlbHNlICAvLyAhX19CT1JMQU5EQ19fCisjICBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQoraW5saW5lIGludCBJc0FUVFkoaW50IC8qIGZkICovKSB7IHJldHVybiAwOyB9CisjICBlbHNlCitpbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIF9pc2F0dHkoZmQpOyB9CisjICBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgcmV0dXJuIF9zdHJpY21wKHMxLCBzMik7Cit9CitpbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gX3N0cmR1cChzcmMpOyB9CisjIGVuZGlmICAvLyBfX0JPUkxBTkRDX18KKworIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQoraW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KF9maWxlbm8oZmlsZSkpOyB9CisvLyBTdGF0KCksIFJtRGlyKCksIGFuZCBJc0RpcigpIGFyZSBub3QgbmVlZGVkIG9uIFdpbmRvd3MgQ0UgYXQgdGhpcworLy8gdGltZSBhbmQgdGh1cyBub3QgZGVmaW5lZCB0aGVyZS4KKyMgZWxzZQoraW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gX2ZpbGVubyhmaWxlKTsgfQoraW5saW5lIGludCBTdGF0KGNvbnN0IGNoYXIqIHBhdGgsIFN0YXRTdHJ1Y3QqIGJ1ZikgeyByZXR1cm4gX3N0YXQocGF0aCwgYnVmKTsgfQoraW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIF9ybWRpcihkaXIpOyB9CitpbmxpbmUgYm9vbCBJc0Rpcihjb25zdCBTdGF0U3RydWN0JiBzdCkgeworICByZXR1cm4gKF9TX0lGRElSICYgc3Quc3RfbW9kZSkgIT0gMDsKK30KKyMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKKyNlbHNlCisKK3R5cGVkZWYgc3RydWN0IHN0YXQgU3RhdFN0cnVjdDsKKworaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gZmlsZW5vKGZpbGUpOyB9CitpbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0KK2lubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIHN0YXQocGF0aCwgYnVmKTsgfQoraW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgeworICByZXR1cm4gc3RyY2FzZWNtcChzMSwgczIpOworfQoraW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIHN0cmR1cChzcmMpOyB9CitpbmxpbmUgaW50IFJtRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gcm1kaXIoZGlyKTsgfQoraW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsgcmV0dXJuIFNfSVNESVIoc3Quc3RfbW9kZSk7IH0KKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIEZ1bmN0aW9ucyBkZXByZWNhdGVkIGJ5IE1TVkMgOC4wLgorCisjaWZkZWYgX01TQ19WRVIKKy8vIFRlbXBvcmFyaWx5IGRpc2FibGUgd2FybmluZyA0OTk2IChkZXByZWNhdGVkIGZ1bmN0aW9uKS4KKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KQorI2VuZGlmCisKK2lubGluZSBjb25zdCBjaGFyKiBTdHJOQ3B5KGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IG4pIHsKKyAgcmV0dXJuIHN0cm5jcHkoZGVzdCwgc3JjLCBuKTsKK30KKworLy8gQ2hEaXIoKSwgRlJlb3BlbigpLCBGRE9wZW4oKSwgUmVhZCgpLCBXcml0ZSgpLCBDbG9zZSgpLCBhbmQKKy8vIFN0ckVycm9yKCkgYXJlbid0IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMgdGltZSBhbmQgdGh1cyBub3QKKy8vIGRlZmluZWQgdGhlcmUuCisKKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgQ2hEaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBjaGRpcihkaXIpOyB9CisjZW5kaWYKK2lubGluZSBGSUxFKiBGT3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlKSB7CisgIHJldHVybiBmb3BlbihwYXRoLCBtb2RlKTsKK30KKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBGSUxFICpGUmVvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUsIEZJTEUqIHN0cmVhbSkgeworICByZXR1cm4gZnJlb3BlbihwYXRoLCBtb2RlLCBzdHJlYW0pOworfQoraW5saW5lIEZJTEUqIEZET3BlbihpbnQgZmQsIGNvbnN0IGNoYXIqIG1vZGUpIHsgcmV0dXJuIGZkb3BlbihmZCwgbW9kZSk7IH0KKyNlbmRpZgoraW5saW5lIGludCBGQ2xvc2UoRklMRSogZnApIHsgcmV0dXJuIGZjbG9zZShmcCk7IH0KKyNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKK2lubGluZSBpbnQgUmVhZChpbnQgZmQsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHJlYWQoZmQsIGJ1ZiwgY291bnQpKTsKK30KK2lubGluZSBpbnQgV3JpdGUoaW50IGZkLCBjb25zdCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih3cml0ZShmZCwgYnVmLCBjb3VudCkpOworfQoraW5saW5lIGludCBDbG9zZShpbnQgZmQpIHsgcmV0dXJuIGNsb3NlKGZkKTsgfQoraW5saW5lIGNvbnN0IGNoYXIqIFN0ckVycm9yKGludCBlcnJudW0pIHsgcmV0dXJuIHN0cmVycm9yKGVycm51bSk7IH0KKyNlbmRpZgoraW5saW5lIGNvbnN0IGNoYXIqIEdldEVudihjb25zdCBjaGFyKiBuYW1lKSB7CisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UsIHdoaWNoIGhhcyBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgIHJldHVybiBOVUxMOworI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19TdW5PU181XzgpIHx8IGRlZmluZWQoX19TdW5PU181XzkpCisgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyB3aGljaCB3ZSBwcm9ncmFtbWF0aWNhbGx5IGNsZWFyIHdpbGwgYmUgc2V0IHRvIHRoZQorICAvLyBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gdW5zZXQgKE5VTEwpLiAgSGFuZGxlIHRoYXQgY2FzZS4KKyAgY29uc3QgY2hhciogY29uc3QgZW52ID0gZ2V0ZW52KG5hbWUpOworICByZXR1cm4gKGVudiAhPSBOVUxMICYmIGVudlswXSAhPSAnXDAnKSA/IGVudiA6IE5VTEw7CisjZWxzZQorICByZXR1cm4gZ2V0ZW52KG5hbWUpOworI2VuZGlmCit9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbmRpZgorCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKy8vIFdpbmRvd3MgQ0UgaGFzIG5vIEMgbGlicmFyeS4gVGhlIGFib3J0KCkgZnVuY3Rpb24gaXMgdXNlZCBpbgorLy8gc2V2ZXJhbCBwbGFjZXMgaW4gR29vZ2xlIFRlc3QuIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSByZWFzb25hYmxlCisvLyBpbWl0YXRpb24gb2Ygc3RhbmRhcmQgYmVoYXZpb3VyLgordm9pZCBBYm9ydCgpOworI2Vsc2UKK2lubGluZSB2b2lkIEFib3J0KCkgeyBhYm9ydCgpOyB9CisjZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCisKK30gIC8vIG5hbWVzcGFjZSBwb3NpeAorCisvLyBUaGUgbWF4aW11bSBudW1iZXIgYSBCaWdnZXN0SW50IGNhbiByZXByZXNlbnQuICBUaGlzIGRlZmluaXRpb24KKy8vIHdvcmtzIG5vIG1hdHRlciBCaWdnZXN0SW50IGlzIHJlcHJlc2VudGVkIGluIG9uZSdzIGNvbXBsZW1lbnQgb3IKKy8vIHR3bydzIGNvbXBsZW1lbnQuCisvLworLy8gV2UgY2Fubm90IHJlbHkgb24gbnVtZXJpY19saW1pdHMgaW4gU1RMLCBhcyBfX2ludDY0IGFuZCBsb25nIGxvbmcKKy8vIGFyZSBub3QgcGFydCBvZiBzdGFuZGFyZCBDKysgYW5kIG51bWVyaWNfbGltaXRzIGRvZXNuJ3QgbmVlZCB0byBiZQorLy8gZGVmaW5lZCBmb3IgdGhlbS4KK2NvbnN0IEJpZ2dlc3RJbnQga01heEJpZ2dlc3RJbnQgPQorICAgIH4oc3RhdGljX2Nhc3Q8QmlnZ2VzdEludD4oMSkgPDwgKDgqc2l6ZW9mKEJpZ2dlc3RJbnQpIC0gMSkpOworCisvLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHNlcnZlcyBhcyBhIGNvbXBpbGUtdGltZSBmdW5jdGlvbiBmcm9tIHNpemUgdG8KKy8vIHR5cGUuICBJdCBtYXBzIGEgc2l6ZSBpbiBieXRlcyB0byBhIHByaW1pdGl2ZSB0eXBlIHdpdGggdGhhdAorLy8gc2l6ZS4gZS5nLgorLy8KKy8vICAgVHlwZVdpdGhTaXplPDQ+OjpVSW50CisvLworLy8gaXMgdHlwZWRlZi1lZCB0byBiZSB1bnNpZ25lZCBpbnQgKHVuc2lnbmVkIGludGVnZXIgbWFkZSB1cCBvZiA0CisvLyBieXRlcykuCisvLworLy8gU3VjaCBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZWxvbmcgdG8gU1RMLCBidXQgSSBjYW5ub3QgZmluZCBpdAorLy8gdGhlcmUuCisvLworLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGlzIGNsYXNzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmbG9hdGluZy1wb2ludAorLy8gY29tcGFyaXNvbi4KKy8vCisvLyBGb3Igbm93IGl0IG9ubHkgaGFuZGxlcyBVSW50ICh1bnNpZ25lZCBpbnQpIGFzIHRoYXQncyBhbGwgR29vZ2xlIFRlc3QKKy8vIG5lZWRzLiAgT3RoZXIgdHlwZXMgY2FuIGJlIGVhc2lseSBhZGRlZCBpbiB0aGUgZnV0dXJlIGlmIG5lZWQKKy8vIGFyaXNlcy4KK3RlbXBsYXRlIDxzaXplX3Qgc2l6ZT4KK2NsYXNzIFR5cGVXaXRoU2l6ZSB7CisgcHVibGljOgorICAvLyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gdXNpbmcgVHlwZVdpdGhTaXplPE4+IHdpdGggaW5jb3JyZWN0CisgIC8vIHZhbHVlcyBvZiBOLgorICB0eXBlZGVmIHZvaWQgVUludDsKK307CisKKy8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA0LgordGVtcGxhdGUgPD4KK2NsYXNzIFR5cGVXaXRoU2l6ZTw0PiB7CisgcHVibGljOgorICAvLyB1bnNpZ25lZCBpbnQgaGFzIHNpemUgNCBpbiBib3RoIGdjYyBhbmQgTVNWQy4KKyAgLy8KKyAgLy8gQXMgYmFzZS9iYXNpY3R5cGVzLmggZG9lc24ndCBjb21waWxlIG9uIFdpbmRvd3MsIHdlIGNhbm5vdCB1c2UKKyAgLy8gdWludDMyLCB1aW50NjQsIGFuZCBldGMgaGVyZS4KKyAgdHlwZWRlZiBpbnQgSW50OworICB0eXBlZGVmIHVuc2lnbmVkIGludCBVSW50OworfTsKKworLy8gVGhlIHNwZWNpYWxpemF0aW9uIGZvciBzaXplIDguCit0ZW1wbGF0ZSA8PgorY2xhc3MgVHlwZVdpdGhTaXplPDg+IHsKKyBwdWJsaWM6CisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisgIHR5cGVkZWYgX19pbnQ2NCBJbnQ7CisgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSW50OworI2Vsc2UKKyAgdHlwZWRlZiBsb25nIGxvbmcgSW50OyAgLy8gTk9MSU5UCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJbnQ7ICAvLyBOT0xJTlQKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworfTsKKworLy8gSW50ZWdlciB0eXBlcyBvZiBrbm93biBzaXplcy4KK3R5cGVkZWYgVHlwZVdpdGhTaXplPDQ+OjpJbnQgSW50MzI7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw0Pjo6VUludCBVSW50MzI7Cit0eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6SW50IEludDY0OwordHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OlVJbnQgVUludDY0OwordHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OkludCBUaW1lSW5NaWxsaXM7ICAvLyBSZXByZXNlbnRzIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorCisvLyBVdGlsaXRpZXMgZm9yIGNvbW1hbmQgbGluZSBmbGFncyBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCisvLyBNYWNybyBmb3IgcmVmZXJlbmNpbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0ZMQUcobmFtZSkgRkxBR1NfZ3Rlc3RfIyNuYW1lCisKKy8vIE1hY3JvcyBmb3IgZGVjbGFyaW5nIGZsYWdzLgorI2RlZmluZSBHVEVTVF9ERUNMQVJFX2Jvb2xfKG5hbWUpIEdURVNUX0FQSV8gZXh0ZXJuIGJvb2wgR1RFU1RfRkxBRyhuYW1lKQorI2RlZmluZSBHVEVTVF9ERUNMQVJFX2ludDMyXyhuYW1lKSBcCisgICAgR1RFU1RfQVBJXyBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKQorI2RlZmluZSBHVEVTVF9ERUNMQVJFX3N0cmluZ18obmFtZSkgXAorICAgIEdURVNUX0FQSV8gZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OlN0cmluZyBHVEVTVF9GTEFHKG5hbWUpCisKKy8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCisjZGVmaW5lIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCisgICAgR1RFU1RfQVBJXyBib29sIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKKyNkZWZpbmUgR1RFU1RfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyaW5nIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMgdGhlIHJlc3VsdAorLy8gdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlIHVuY2hhbmdlZCBhbmQgcmV0dXJucworLy8gZmFsc2UuCisvLyBUT0RPKGNoYW5kbGVyYyk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZmFjdG9yIGZsYWcgYW5kIGVudmlyb25tZW50IHBhcnNpbmcKKy8vIG91dCBvZiBib3RoIGd0ZXN0LXBvcnQuY2MgYW5kIGd0ZXN0LmNjIHRvIGF2b2lkIGV4cG9ydGluZyB0aGlzIHV0aWxpdHkKKy8vIGZ1bmN0aW9uLgorYm9vbCBQYXJzZUludDMyKGNvbnN0IE1lc3NhZ2UmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIEludDMyKiB2YWx1ZSk7CisKKy8vIFBhcnNlcyBhIGJvb2wvSW50MzIvc3RyaW5nIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBHb29nbGUgVGVzdCBmbGFnLgorYm9vbCBCb29sRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWwpOworR1RFU1RfQVBJXyBJbnQzMiBJbnQzMkZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiBkZWZhdWx0X3ZhbCk7Citjb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWwpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCisKKyNpZiBHVEVTVF9PU19MSU5VWAorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy93YWl0Lmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzZXQ+CisKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgdGhlIFN0cmluZyBjbGFzcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQorLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gVGhleSBzaG91bGQgbm90IHVzZWQKKy8vIGJ5IGNvZGUgZXh0ZXJuYWwgdG8gR29vZ2xlIFRlc3QuCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBpcyAjaW5jbHVkZWQgYnkgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgorLy8gSXQgc2hvdWxkIG5vdCBiZSAjaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKworI2lmZGVmIF9fQk9STEFORENfXworLy8gc3RyaW5nLmggaXMgbm90IGd1YXJhbnRlZWQgdG8gcHJvdmlkZSBzdHJjcHkgb24gQysrIEJ1aWxkZXIuCisjIGluY2x1ZGUgPG1lbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gU3RyaW5nIC0gYSBVVEYtOCBzdHJpbmcgY2xhc3MuCisvLworLy8gRm9yIGhpc3RvcmljIHJlYXNvbnMsIHdlIGRvbid0IHVzZSBzdGQ6OnN0cmluZy4KKy8vCisvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVwbGFjZSB0aGlzIGNsYXNzIHdpdGggc3RkOjpzdHJpbmcgb3IKKy8vIGltcGxlbWVudCBpdCBpbiB0ZXJtcyBvZiB0aGUgbGF0dGVyLgorLy8KKy8vIE5vdGUgdGhhdCBTdHJpbmcgY2FuIHJlcHJlc2VudCBib3RoIE5VTEwgYW5kIHRoZSBlbXB0eSBzdHJpbmcsCisvLyB3aGlsZSBzdGQ6OnN0cmluZyBjYW5ub3QgcmVwcmVzZW50IE5VTEwuCisvLworLy8gTlVMTCBhbmQgdGhlIGVtcHR5IHN0cmluZyBhcmUgY29uc2lkZXJlZCBkaWZmZXJlbnQuICBOVUxMIGlzIGxlc3MKKy8vIHRoYW4gYW55dGhpbmcgKGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nKSBleGNlcHQgaXRzZWxmLgorLy8KKy8vIFRoaXMgY2xhc3Mgb25seSBwcm92aWRlcyBtaW5pbXVtIGZ1bmN0aW9uYWxpdHkgbmVjZXNzYXJ5IGZvcgorLy8gaW1wbGVtZW50aW5nIEdvb2dsZSBUZXN0LiAgV2UgZG8gbm90IGludGVuZCB0byBpbXBsZW1lbnQgYSBmdWxsLWZsZWRnZWQKKy8vIHN0cmluZyBjbGFzcyBoZXJlLgorLy8KKy8vIFNpbmNlIHRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gcHJvdmlkZSBhIHN1YnN0aXR1dGUgZm9yCisvLyBzdGQ6OnN0cmluZyBvbiBwbGF0Zm9ybXMgd2hlcmUgaXQgY2Fubm90IGJlIHVzZWQsIHdlIGRlZmluZSBhIGNvcHkKKy8vIGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9ycyBzdWNoIHRoYXQgd2UgZG9uJ3QgbmVlZAorLy8gY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaW4gYSBsb3Qgb2YgcGxhY2VzLgorLy8KKy8vIEluIG9yZGVyIHRvIG1ha2UgdGhlIHJlcHJlc2VudGF0aW9uIGVmZmljaWVudCwgdGhlIGQndG9yIG9mIFN0cmluZworLy8gaXMgbm90IHZpcnR1YWwuICBUaGVyZWZvcmUgRE8gTk9UIElOSEVSSVQgRlJPTSBTdHJpbmcuCitjbGFzcyBHVEVTVF9BUElfIFN0cmluZyB7CisgcHVibGljOgorICAvLyBTdGF0aWMgdXRpbGl0eSBtZXRob2RzCisKKyAgLy8gUmV0dXJucyB0aGUgaW5wdXQgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyBpZiBpdCdzIG5vdCBOVUxMOworICAvLyBvdGhlcndpc2UgcmV0dXJucyAiKG51bGwpIi4gIEZvciBleGFtcGxlLCAiXCJIZWxsb1wiIiBpcyByZXR1cm5lZAorICAvLyBmb3IgaW5wdXQgIkhlbGxvIi4KKyAgLy8KKyAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHByaW50aW5nIGEgQyBzdHJpbmcgaW4gdGhlIHN5bnRheCBvZiBhIGxpdGVyYWwuCisgIC8vCisgIC8vIEtub3duIGlzc3VlOiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgaGFuZGxlZCB5ZXQuCisgIHN0YXRpYyBTdHJpbmcgU2hvd0NTdHJpbmdRdW90ZWQoY29uc3QgY2hhciogY19zdHIpOworCisgIC8vIENsb25lcyBhIDAtdGVybWluYXRlZCBDIHN0cmluZywgYWxsb2NhdGluZyBtZW1vcnkgdXNpbmcgbmV3LiAgVGhlCisgIC8vIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybiB2YWx1ZSB1c2luZworICAvLyBkZWxldGVbXS4gIFJldHVybnMgdGhlIGNsb25lZCBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlIGlucHV0IGlzCisgIC8vIE5VTEwuCisgIC8vCisgIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gc3RyZHVwKCkgaW4gc3RyaW5nLmgsIHdoaWNoIGFsbG9jYXRlcworICAvLyBtZW1vcnkgdXNpbmcgbWFsbG9jKCkuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogY19zdHIpOworCisjaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKKyAgLy8gV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIHRoZSAnQU5TSScgdmVyc2lvbnMgb2YgV2luMzIgQVBJcy4gVG8gYmUKKyAgLy8gYWJsZSB0byBwYXNzIHN0cmluZ3MgdG8gV2luMzIgQVBJcyBvbiBDRSB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlbQorICAvLyB0byAnVW5pY29kZScsIFVURi0xNi4KKworICAvLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nCisgIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KKyAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQorICAvLyBpbnB1dCBpcyBOVUxMLgorICAvLworICAvLyBUaGUgd2lkZSBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bworICAvLyBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBTlNJIHZlcnNpb25zIG9mIFdpbjMyIGNhbGxzIGFuZCB0aGUKKyAgLy8gQyBydW50aW1lLgorICBzdGF0aWMgTFBDV1NUUiBBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBjX3N0cik7CisKKyAgLy8gQ3JlYXRlcyBhbiBBTlNJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiB3aWRlIHN0cmluZywgYWxsb2NhdGluZworICAvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCisgIC8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKKyAgLy8gaW5wdXQgaXMgTlVMTC4KKyAgLy8KKyAgLy8gVGhlIHJldHVybmVkIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCisgIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQorICAvLyBDIHJ1bnRpbWUuCisgIHN0YXRpYyBjb25zdCBjaGFyKiBVdGYxNlRvQW5zaShMUENXU1RSIHV0ZjE2X3N0cik7CisjZW5kaWYKKworICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKKyAgLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKTsKKworICAvLyBDb252ZXJ0cyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBTdHJpbmcgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICAvLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nCisgIC8vIHRoZSBjb252ZXJzaW9uLCAiKGZhaWxlZCB0byBjb252ZXJ0IGZyb20gd2lkZSBzdHJpbmcpIiBpcworICAvLyByZXR1cm5lZC4KKyAgc3RhdGljIFN0cmluZyBTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cik7CisKKyAgLy8gU2ltaWxhciB0byBTaG93V2lkZUNTdHJpbmcoKSwgZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBlbmNsb3NlcworICAvLyB0aGUgY29udmVydGVkIHN0cmluZyBpbiBkb3VibGUgcXVvdGVzLgorICBzdGF0aWMgU3RyaW5nIFNob3dXaWRlQ1N0cmluZ1F1b3RlZChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKKworICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQorICAvLyBjb250ZW50LgorICAvLworICAvLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQorICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKKyAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCisgIHN0YXRpYyBib29sIFdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3Qgd2NoYXJfdCogcmhzKTsKKworICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5CisgIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KKyAgLy8KKyAgLy8gVW5saWtlIHN0cmNhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCisgIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHMpOworCisgIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQorICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCisgIC8vCisgIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgorICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIHdpZGUgQyBzdHJpbmcsCisgIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgorICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4KKyAgLy8gT24gd2luZG93cywgdGhpcyBtZXRob2QgdXNlcyBfd2NzaWNtcCB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUKKyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXAKKyAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgLy8gT24gTWFjT1MgWCwgaXQgdXNlcyB0b3dsb3dlciwgd2hpY2ggYWxzbyB1c2VzIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZQorICAvLyBjdXJyZW50IGxvY2FsZS4KKyAgc3RhdGljIGJvb2wgQ2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpOworCisgIC8vIEZvcm1hdHMgYSBsaXN0IG9mIGFyZ3VtZW50cyB0byBhIFN0cmluZywgdXNpbmcgdGhlIHNhbWUgZm9ybWF0CisgIC8vIHNwZWMgc3RyaW5nIGFzIGZvciBwcmludGYuCisgIC8vCisgIC8vIFdlIGRvIG5vdCB1c2UgdGhlIFN0cmluZ1ByaW50ZiBjbGFzcyBhcyBpdCBpcyBub3QgdW5pdmVyc2FsbHkKKyAgLy8gYXZhaWxhYmxlLgorICAvLworICAvLyBUaGUgcmVzdWx0IGlzIGxpbWl0ZWQgdG8gNDA5NiBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIHRhaWxpbmcKKyAgLy8gMCkuICBJZiA0MDk2IGNoYXJhY3RlcnMgYXJlIG5vdCBlbm91Z2ggdG8gZm9ybWF0IHRoZSBpbnB1dCwKKyAgLy8gIjxidWZmZXIgZXhjZWVkZWQ+IiBpcyByZXR1cm5lZC4KKyAgc3RhdGljIFN0cmluZyBGb3JtYXQoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworCisgIC8vIEMndG9ycworCisgIC8vIFRoZSBkZWZhdWx0IGMndG9yIGNvbnN0cnVjdHMgYSBOVUxMIHN0cmluZy4KKyAgU3RyaW5nKCkgOiBjX3N0cl8oTlVMTCksIGxlbmd0aF8oMCkge30KKworICAvLyBDb25zdHJ1Y3RzIGEgU3RyaW5nIGJ5IGNsb25pbmcgYSAwLXRlcm1pbmF0ZWQgQyBzdHJpbmcuCisgIFN0cmluZyhjb25zdCBjaGFyKiBhX2Nfc3RyKSB7ICAvLyBOT0xJTlQKKyAgICBpZiAoYV9jX3N0ciA9PSBOVUxMKSB7CisgICAgICBjX3N0cl8gPSBOVUxMOworICAgICAgbGVuZ3RoXyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIENvbnN0cnVjdE5vbk51bGwoYV9jX3N0ciwgc3RybGVuKGFfY19zdHIpKTsKKyAgICB9CisgIH0KKworICAvLyBDb25zdHJ1Y3RzIGEgU3RyaW5nIGJ5IGNvcHlpbmcgYSBnaXZlbiBudW1iZXIgb2YgY2hhcnMgZnJvbSBhCisgIC8vIGJ1ZmZlci4gIEUuZy4gU3RyaW5nKCJoZWxsbyIsIDMpIGNyZWF0ZXMgdGhlIHN0cmluZyAiaGVsIiwKKyAgLy8gU3RyaW5nKCJhXDBiY2QiLCA0KSBjcmVhdGVzICJhXDBiYyIsIFN0cmluZyhOVUxMLCAwKSBjcmVhdGVzICIiLAorICAvLyBhbmQgU3RyaW5nKE5VTEwsIDEpIHJlc3VsdHMgaW4gYWNjZXNzIHZpb2xhdGlvbi4KKyAgU3RyaW5nKGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGFfbGVuZ3RoKSB7CisgICAgQ29uc3RydWN0Tm9uTnVsbChidWZmZXIsIGFfbGVuZ3RoKTsKKyAgfQorCisgIC8vIFRoZSBjb3B5IGMndG9yIGNyZWF0ZXMgYSBuZXcgY29weSBvZiB0aGUgc3RyaW5nLiAgVGhlIHR3bworICAvLyBTdHJpbmcgb2JqZWN0cyBkbyBub3Qgc2hhcmUgY29udGVudC4KKyAgU3RyaW5nKGNvbnN0IFN0cmluZyYgc3RyKSA6IGNfc3RyXyhOVUxMKSwgbGVuZ3RoXygwKSB7ICp0aGlzID0gc3RyOyB9CisKKyAgLy8gRCd0b3IuICBTdHJpbmcgaXMgaW50ZW5kZWQgdG8gYmUgYSBmaW5hbCBjbGFzcywgc28gdGhlIGQndG9yCisgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSB2aXJ0dWFsLgorICB+U3RyaW5nKCkgeyBkZWxldGVbXSBjX3N0cl87IH0KKworICAvLyBBbGxvd3MgYSBTdHJpbmcgdG8gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYW4gOjpzdGQ6OnN0cmluZyBvcgorICAvLyA6OnN0cmluZywgYW5kIHZpY2UgdmVyc2EuICBDb252ZXJ0aW5nIGEgU3RyaW5nIGNvbnRhaW5pbmcgYSBOVUxMCisgIC8vIHBvaW50ZXIgdG8gOjpzdGQ6OnN0cmluZyBvciA6OnN0cmluZyBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgIC8vIENvbnZlcnRpbmcgYSA6OnN0ZDo6c3RyaW5nIG9yIDo6c3RyaW5nIGNvbnRhaW5pbmcgYW4gZW1iZWRkZWQgTlVMCisgIC8vIGNoYXJhY3RlciB0byBhIFN0cmluZyB3aWxsIHJlc3VsdCBpbiB0aGUgcHJlZml4IHVwIHRvIHRoZSBmaXJzdAorICAvLyBOVUwgY2hhcmFjdGVyLgorICBTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgQ29uc3RydWN0Tm9uTnVsbChzdHIuY19zdHIoKSwgc3RyLmxlbmd0aCgpKTsKKyAgfQorCisgIG9wZXJhdG9yIDo6c3RkOjpzdHJpbmcoKSBjb25zdCB7IHJldHVybiA6OnN0ZDo6c3RyaW5nKGNfc3RyKCksIGxlbmd0aCgpKTsgfQorCisjaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKyAgU3RyaW5nKGNvbnN0IDo6c3RyaW5nJiBzdHIpIHsKKyAgICBDb25zdHJ1Y3ROb25OdWxsKHN0ci5jX3N0cigpLCBzdHIubGVuZ3RoKCkpOworICB9CisKKyAgb3BlcmF0b3IgOjpzdHJpbmcoKSBjb25zdCB7IHJldHVybiA6OnN0cmluZyhjX3N0cigpLCBsZW5ndGgoKSk7IH0KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gZW1wdHkgc3RyaW5nIChpLmUuICIiKS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIChjX3N0cigpICE9IE5VTEwpICYmIChsZW5ndGgoKSA9PSAwKTsgfQorCisgIC8vIENvbXBhcmVzIHRoaXMgd2l0aCBhbm90aGVyIFN0cmluZy4KKyAgLy8gUmV0dXJucyA8IDAgaWYgdGhpcyBpcyBsZXNzIHRoYW4gcmhzLCAwIGlmIHRoaXMgaXMgZXF1YWwgdG8gcmhzLCBvciA+IDAKKyAgLy8gaWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gcmhzLgorICBpbnQgQ29tcGFyZShjb25zdCBTdHJpbmcmIHJocykgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBlcXVhbHMgdGhlIGdpdmVuIEMgc3RyaW5nLiAgQSBOVUxMCisgIC8vIHN0cmluZyBhbmQgYSBub24tTlVMTCBzdHJpbmcgYXJlIGNvbnNpZGVyZWQgbm90IGVxdWFsLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgY2hhciogYV9jX3N0cikgY29uc3QgeyByZXR1cm4gQ29tcGFyZShhX2Nfc3RyKSA9PSAwOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIFN0cmluZy4gIEEKKyAgLy8gTlVMTCBzdHJpbmcgaXMgY29uc2lkZXJlZCBsZXNzIHRoYW4gIiIuCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cmluZyYgcmhzKSBjb25zdCB7IHJldHVybiBDb21wYXJlKHJocykgPCAwOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIFN0cmluZyBkb2Vzbid0IGVxdWFsIHRoZSBnaXZlbiBDIHN0cmluZy4gIEEgTlVMTAorICAvLyBzdHJpbmcgYW5kIGEgbm9uLU5VTEwgc3RyaW5nIGFyZSBjb25zaWRlcmVkIG5vdCBlcXVhbC4KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXIqIGFfY19zdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gYV9jX3N0cik7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgU3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LiAgKkFueSoKKyAgLy8gU3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYSBOVUxMIG9yIGVtcHR5IHN1ZmZpeC4KKyAgYm9vbCBFbmRzV2l0aChjb25zdCBjaGFyKiBzdWZmaXgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBTdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIG5vdCBjb25zaWRlcmluZworICAvLyBjYXNlLiBBbnkgU3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYSBOVUxMIG9yIGVtcHR5IHN1ZmZpeC4KKyAgYm9vbCBFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZShjb25zdCBjaGFyKiBzdWZmaXgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZW5jYXBzdWxhdGVkIHN0cmluZywgb3IgMCBpZiB0aGUKKyAgLy8gc3RyaW5nIGlzIE5VTEwuCisgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9CisKKyAgLy8gR2V0cyB0aGUgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHRoaXMgU3RyaW5nIG9iamVjdCByZXByZXNlbnRzLgorICAvLyBUaGUgU3RyaW5nIG9iamVjdCBzdGlsbCBvd25zIHRoZSBzdHJpbmcuICBUaGVyZWZvcmUgdGhlIGNhbGxlcgorICAvLyBzaG91bGQgTk9UIGRlbGV0ZSB0aGUgcmV0dXJuIHZhbHVlLgorICBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIGNfc3RyXzsgfQorCisgIC8vIEFzc2lnbnMgYSBDIHN0cmluZyB0byB0aGlzIG9iamVjdC4gIFNlbGYtYXNzaWdubWVudCB3b3Jrcy4KKyAgY29uc3QgU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgY2hhciogYV9jX3N0cikgeworICAgIHJldHVybiAqdGhpcyA9IFN0cmluZyhhX2Nfc3RyKTsKKyAgfQorCisgIC8vIEFzc2lnbnMgYSBTdHJpbmcgb2JqZWN0IHRvIHRoaXMgb2JqZWN0LiAgU2VsZi1hc3NpZ25tZW50IHdvcmtzLgorICBjb25zdCBTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBTdHJpbmcmIHJocykgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgIGRlbGV0ZVtdIGNfc3RyXzsKKyAgICAgIGlmIChyaHMuY19zdHIoKSA9PSBOVUxMKSB7CisgICAgICAgIGNfc3RyXyA9IE5VTEw7CisgICAgICAgIGxlbmd0aF8gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29uc3RydWN0Tm9uTnVsbChyaHMuY19zdHIoKSwgcmhzLmxlbmd0aCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIC8vIENvbnN0cnVjdHMgYSBub24tTlVMTCBTdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gY29udGVudC4gIFRoaXMKKyAgLy8gZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gY19zdHJfIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQuCisgIC8vIENvbnN0cnVjdE5vbk51bGwoTlVMTCwgMCkgcmVzdWx0cyBpbiBhbiBlbXB0eSBzdHJpbmcgKCIiKS4KKyAgLy8gQ29uc3RydWN0Tm9uTnVsbChOVUxMLCBub25femVybykgaXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorICB2b2lkIENvbnN0cnVjdE5vbk51bGwoY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgYV9sZW5ndGgpIHsKKyAgICBjaGFyKiBjb25zdCBzdHIgPSBuZXcgY2hhclthX2xlbmd0aCArIDFdOworICAgIG1lbWNweShzdHIsIGJ1ZmZlciwgYV9sZW5ndGgpOworICAgIHN0clthX2xlbmd0aF0gPSAnXDAnOworICAgIGNfc3RyXyA9IHN0cjsKKyAgICBsZW5ndGhfID0gYV9sZW5ndGg7CisgIH0KKworICBjb25zdCBjaGFyKiBjX3N0cl87CisgIHNpemVfdCBsZW5ndGhfOworfTsgIC8vIGNsYXNzIFN0cmluZworCisvLyBTdHJlYW1zIGEgU3RyaW5nIHRvIGFuIG9zdHJlYW0uICBFYWNoICdcMCcgY2hhcmFjdGVyIGluIHRoZSBTdHJpbmcKKy8vIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCitpbmxpbmUgOjpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdHJpbmcmIHN0cikgeworICBpZiAoc3RyLmNfc3RyKCkgPT0gTlVMTCkgeworICAgIG9zIDw8ICIobnVsbCkiOworICB9IGVsc2UgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGNfc3RyID0gc3RyLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIGlmIChjX3N0cltpXSA9PSAnXDAnKSB7CisgICAgICAgIG9zIDw8ICJcXDAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgY19zdHJbaV07CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvczsKK30KKworLy8gR2V0cyB0aGUgY29udGVudCBvZiB0aGUgc3RyaW5nc3RyZWFtJ3MgYnVmZmVyIGFzIGEgU3RyaW5nLiAgRWFjaCAnXDAnCisvLyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorR1RFU1RfQVBJXyBTdHJpbmcgU3RyaW5nU3RyZWFtVG9TdHJpbmcoOjpzdGQ6OnN0cmluZ3N0cmVhbSogc3RyZWFtKTsKKworLy8gQ29udmVydHMgYSBzdHJlYW1hYmxlIHZhbHVlIHRvIGEgU3RyaW5nLiAgQSBOVUxMIHBvaW50ZXIgaXMKKy8vIGNvbnZlcnRlZCB0byAiKG51bGwpIi4gIFdoZW4gdGhlIGlucHV0IHZhbHVlIGlzIGEgOjpzdHJpbmcsCisvLyA6OnN0ZDo6c3RyaW5nLCA6OndzdHJpbmcsIG9yIDo6c3RkOjp3c3RyaW5nIG9iamVjdCwgZWFjaCBOVUwKKy8vIGNoYXJhY3RlciBpbiBpdCBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorCisvLyBEZWNsYXJlZCBoZXJlIGJ1dCBkZWZpbmVkIGluIGd0ZXN0LmgsIHNvIHRoYXQgaXQgaGFzIGFjY2VzcworLy8gdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIE1lc3NhZ2UgY2xhc3MsIHJlcXVpcmVkIGJ5IHRoZSBBUk0KKy8vIGNvbXBpbGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitTdHJpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKGNvbnN0IFQmIHN0cmVhbWFibGUpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KKy8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKKy8vCisvLyBHb29nbGUgVGVzdCBmaWxlcGF0aCB1dGlsaXRpZXMKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKKy8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisvLworLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBpbiA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4uCisvLyBEbyBub3QgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlIHNlcGFyYXRlbHkhCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRmlsZVBhdGggLSBhIGNsYXNzIGZvciBmaWxlIGFuZCBkaXJlY3RvcnkgcGF0aG5hbWUgbWFuaXB1bGF0aW9uIHdoaWNoCisvLyBoYW5kbGVzIHBsYXRmb3JtLXNwZWNpZmljIGNvbnZlbnRpb25zIChsaWtlIHRoZSBwYXRobmFtZSBzZXBhcmF0b3IpLgorLy8gVXNlZCBmb3IgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFtaW5nIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciB4bWwgb3V0cHV0LgorLy8gRXhjZXB0IGZvciBTZXQgbWV0aG9kcywgYWxsIG1ldGhvZHMgYXJlIGNvbnN0IG9yIHN0YXRpYywgd2hpY2ggcHJvdmlkZXMgYW4KKy8vICJpbW11dGFibGUgdmFsdWUgb2JqZWN0IiAtLSB1c2VmdWwgZm9yIHBlYWNlIG9mIG1pbmQuCisvLyBBIEZpbGVQYXRoIHdpdGggYSB2YWx1ZSBlbmRpbmcgaW4gYSBwYXRoIHNlcGFyYXRvciAoImxpa2UvdGhpcy8iKSByZXByZXNlbnRzCisvLyBhIGRpcmVjdG9yeSwgb3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGEgZmlsZS4gSW4gZWl0aGVyIGNhc2UsCisvLyBpdCBtYXkgb3IgbWF5IG5vdCByZXByZXNlbnQgYW4gYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5IGluIHRoZSBmaWxlIHN5c3RlbS4KKy8vIE5hbWVzIGFyZSBOT1QgY2hlY2tlZCBmb3Igc3ludGF4IGNvcnJlY3RuZXNzIC0tIG5vIGNoZWNraW5nIGZvciBpbGxlZ2FsCisvLyBjaGFyYWN0ZXJzLCBtYWxmb3JtZWQgcGF0aHMsIGV0Yy4KKworY2xhc3MgR1RFU1RfQVBJXyBGaWxlUGF0aCB7CisgcHVibGljOgorICBGaWxlUGF0aCgpIDogcGF0aG5hbWVfKCIiKSB7IH0KKyAgRmlsZVBhdGgoY29uc3QgRmlsZVBhdGgmIHJocykgOiBwYXRobmFtZV8ocmhzLnBhdGhuYW1lXykgeyB9CisKKyAgZXhwbGljaXQgRmlsZVBhdGgoY29uc3QgY2hhciogcGF0aG5hbWUpIDogcGF0aG5hbWVfKHBhdGhuYW1lKSB7CisgICAgTm9ybWFsaXplKCk7CisgIH0KKworICBleHBsaWNpdCBGaWxlUGF0aChjb25zdCBTdHJpbmcmIHBhdGhuYW1lKSA6IHBhdGhuYW1lXyhwYXRobmFtZSkgeworICAgIE5vcm1hbGl6ZSgpOworICB9CisKKyAgRmlsZVBhdGgmIG9wZXJhdG9yPShjb25zdCBGaWxlUGF0aCYgcmhzKSB7CisgICAgU2V0KHJocyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBTZXQoY29uc3QgRmlsZVBhdGgmIHJocykgeworICAgIHBhdGhuYW1lXyA9IHJocy5wYXRobmFtZV87CisgIH0KKworICBTdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV87IH0KKyAgY29uc3QgY2hhciogY19zdHIoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgc3RhdGljIEZpbGVQYXRoIEdldEN1cnJlbnREaXIoKTsKKworICAvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgYmFzZV9uYW1lID0gInRlc3QiLCBudW1iZXIgPSAwLAorICAvLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXIKKyAgLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCisgIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCisgIHN0YXRpYyBGaWxlUGF0aCBNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsKKworICAvLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsCisgIC8vIHJldHVybnMgImRpci90ZXN0LnhtbCIuCisgIC8vIE9uIFdpbmRvd3MsIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yIHJhdGhlciB0aGFuIC8uCisgIHN0YXRpYyBGaWxlUGF0aCBDb25jYXRQYXRocyhjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpOworCisgIC8vIFJldHVybnMgYSBwYXRobmFtZSBmb3IgYSBmaWxlIHRoYXQgZG9lcyBub3QgY3VycmVudGx5IGV4aXN0LiBUaGUgcGF0aG5hbWUKKyAgLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcgorICAvLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgorICAvLyBhbHJlYWR5IGV4aXN0cy4gVGhlIG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIHVudGlsIGEgcGF0aG5hbWUgaXMgZm91bmQKKyAgLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICAvLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgorICAvLyBUaGVyZSBjb3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGlmIHR3byBvciBtb3JlIHByb2Nlc3NlcyBhcmUgY2FsbGluZyB0aGlzCisgIC8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuCisgIHN0YXRpYyBGaWxlUGF0aCBHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgcGF0aCBpcyBOVUxMIG9yICIiLgorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBjX3N0cigpID09IE5VTEwgfHwgKmNfc3RyKCkgPT0gJ1wwJzsgfQorCisgIC8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlcyBpdCBhbmQgcmV0dXJucworICAvLyB0aGUgbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KKyAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IsIG90aGVyIHBsYXRmb3JtcyB1c2UgLy4KKyAgRmlsZVBhdGggUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCisgIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucworICAvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKKyAgLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKKyAgLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorICBGaWxlUGF0aCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3Q7CisKKyAgLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KKyAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkgcmV0dXJucyAicGF0aC90by8iLgorICAvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCisgIC8vIG5vdCBoYXZlIGEgZmlsZSwgbGlrZSAianVzdC9hL2Rpci8iLCBpdCByZXR1cm5zIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLgorICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgorICBGaWxlUGF0aCBSZW1vdmVGaWxlTmFtZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgorICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgiZGlyL2ZpbGUuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJFWEUiKSByZXR1cm5zCisgIC8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAorICAvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgorICBGaWxlUGF0aCBSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdDsKKworICAvLyBDcmVhdGVzIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmCisgIC8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUKKyAgLy8gZGlyZWN0b3JpZXMgZm9yIGFueSByZWFzb24uIFdpbGwgYWxzbyByZXR1cm4gZmFsc2UgaWYgdGhlIEZpbGVQYXRoIGRvZXMKKyAgLy8gbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeSAodGhhdCBpcywgaXQgZG9lc24ndCBlbmQgd2l0aCBhIHBhdGggc2VwYXJhdG9yKS4KKyAgYm9vbCBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3Q7CisKKyAgLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IKKyAgLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQorICAvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAorICAvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4KKyAgYm9vbCBDcmVhdGVGb2xkZXIoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZGVzY3JpYmVzIHNvbWV0aGluZyBpbiB0aGUgZmlsZS1zeXN0ZW0sCisgIC8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIsIGFuZCB0aGF0IHNvbWV0aGluZyBleGlzdHMuCisgIGJvb2wgRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KKyAgLy8gdGhhdCBleGlzdHMuCisgIGJvb2wgRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAorICAvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KKyAgYm9vbCBJc0RpcmVjdG9yeSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSByb290IGRpcmVjdG9yeS4gKFdpbmRvd3MgaGFzIG9uZQorICAvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCisgIGJvb2wgSXNSb290RGlyZWN0b3J5KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgorICBib29sIElzQWJzb2x1dGVQYXRoKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBSZXBsYWNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIHdpdGggYSBzaW5nbGUgc2VwYXJhdG9yLgorICAvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgorICAvLyByZWR1bmRhbmNpZXMgdGhhdCBtaWdodCBiZSBpbiBhIHBhdGhuYW1lIGludm9sdmluZyAiLiIgb3IgIi4uIi4KKyAgLy8KKyAgLy8gQSBwYXRobmFtZSB3aXRoIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgbWF5IG9jY3VyIGVpdGhlciB0aHJvdWdoCisgIC8vIHVzZXIgZXJyb3Igb3IgYXMgYSByZXN1bHQgb2Ygc29tZSBzY3JpcHRzIG9yIEFQSXMgdGhhdCBnZW5lcmF0ZSBhIHBhdGhuYW1lCisgIC8vIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IuIE9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc2FtZSBBUEkgb3Igc2NyaXB0CisgIC8vIG1heSBOT1QgZ2VuZXJhdGUgYSBwYXRobmFtZSB3aXRoIGEgdHJhaWxpbmcgIi8iLiBUaGVuIGVsc2V3aGVyZSB0aGF0CisgIC8vIHBhdGhuYW1lIG1heSBoYXZlIGFub3RoZXIgIi8iIGFuZCBwYXRobmFtZSBjb21wb25lbnRzIGFkZGVkIHRvIGl0LAorICAvLyB3aXRob3V0IGNoZWNraW5nIGZvciB0aGUgc2VwYXJhdG9yIGFscmVhZHkgYmVpbmcgdGhlcmUuCisgIC8vIFRoZSBzY3JpcHQgbGFuZ3VhZ2UgYW5kIG9wZXJhdGluZyBzeXN0ZW0gbWF5IGFsbG93IHBhdGhzIGxpa2UgImZvby8vYmFyIgorICAvLyBidXQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGluIEZpbGVQYXRoIHdpbGwgbm90IGhhbmRsZSB0aGF0IGNvcnJlY3RseS4gSW4KKyAgLy8gcGFydGljdWxhciwgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgb25seSByZW1vdmVzIG9uZSBzZXBhcmF0b3IsIGFuZAorICAvLyBpdCBpcyBjYWxsZWQgaW4gQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGFzc3VtaW5nIHRoYXQgaXQgd2lsbCBjaGFuZ2UKKyAgLy8gYSBwYXRobmFtZSBmcm9tIGRpcmVjdG9yeSBzeW50YXggKHRyYWlsaW5nIHNlcGFyYXRvcikgdG8gZmlsZW5hbWUgc3ludGF4LgorICAvLworICAvLyBPbiBXaW5kb3dzIHRoaXMgbWV0aG9kIGFsc28gcmVwbGFjZXMgdGhlIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvciAnLycgd2l0aAorICAvLyB0aGUgcHJpbWFyeSBwYXRoIHNlcGFyYXRvciAnXFwnLCBzbyB0aGF0IGZvciBleGFtcGxlICJiYXJcXC9cXGZvbyIgYmVjb21lcworICAvLyAiYmFyXFxmb28iLgorCisgIHZvaWQgTm9ybWFsaXplKCk7CisKKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KKyAgLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAorICAvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgorICBjb25zdCBjaGFyKiBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdDsKKworICBTdHJpbmcgcGF0aG5hbWVfOworfTsgIC8vIGNsYXNzIEZpbGVQYXRoCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCisvLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgorLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHlwZS11dGlsLmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCisKKy8vIFR5cGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHR5cGVkIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQKKy8vIHRlc3RzLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gQ3VycmVudGx5IHdlIHN1cHBvcnQgYXQgbW9zdCA1MCB0eXBlcyBpbiBhIGxpc3QsIGFuZCBhdCBtb3N0IDUwCisvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW4gb25lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisvLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIG1vcmUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KKworCisvLyAjaWZkZWYgX19HTlVDX18gaXMgdG9vIGdlbmVyYWwgaGVyZS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBnY2Mgd2l0aG91dCB1c2luZworLy8gbGlic3RkYysrICh3aGljaCBpcyB3aGVyZSBjeHhhYmkuaCBjb21lcyBmcm9tKS4KKyMgaWZkZWYgX19HTElCQ1hYX18KKyMgIGluY2x1ZGUgPGN4eGFiaS5oPgorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisjICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+CisjIGVuZGlmICAvLyBfX0dMSUJDWFhfXworCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KKy8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKKy8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorU3RyaW5nIEdldFR5cGVOYW1lKCkgeworIyBpZiBHVEVTVF9IQVNfUlRUSQorCisgIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSB0eXBlaWQoVCkubmFtZSgpOworIyAgaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgZGVmaW5lZChfX0hQX2FDQykKKyAgaW50IHN0YXR1cyA9IDA7CisgIC8vIGdjYydzIGltcGxlbWVudGF0aW9uIG9mIHR5cGVpZChUKS5uYW1lKCkgbWFuZ2xlcyB0aGUgdHlwZSBuYW1lLAorICAvLyBzbyB3ZSBoYXZlIHRvIGRlbWFuZ2xlIGl0LgorIyAgIGlmZGVmIF9fR0xJQkNYWF9fCisgIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7CisjICAgZW5kaWYgLy8gX19HTElCQ1hYX18KKyAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOworICBjb25zdCBTdHJpbmcgbmFtZV9zdHIoc3RhdHVzID09IDAgPyByZWFkYWJsZV9uYW1lIDogbmFtZSk7CisgIGZyZWUocmVhZGFibGVfbmFtZSk7CisgIHJldHVybiBuYW1lX3N0cjsKKyMgIGVsc2UKKyAgcmV0dXJuIG5hbWU7CisjICBlbmRpZiAgLy8gX19HTElCQ1hYX18gfHwgX19IUF9hQ0MKKworIyBlbHNlCisKKyAgcmV0dXJuICI8dHlwZT4iOworCisjIGVuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQorfQorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBBc3NlcnR5VHlwZUVxPFQxLCBUMj46OnR5cGUgaXMgZGVmaW5lZCBpZmYgVDEgYW5kIFQyIGFyZSB0aGUgc2FtZQorLy8gdHlwZS4gIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHRvIGVuc3VyZSB0aGF0CisvLyB0d28gdHlwZXMgYXJlIGVxdWFsLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IEFzc2VydFR5cGVFcTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQXNzZXJ0VHlwZUVxPFQsIFQ+IHsKKyAgdHlwZWRlZiBib29sIHR5cGU7Cit9OworCisvLyBBIHVuaXF1ZSB0eXBlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudHMgb2YgY2xhc3MKKy8vIHRlbXBsYXRlIFR5cGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUgdmFyaWFkaWMgdGVtcGxhdGVzCisvLyAoZS5nLiBUeXBlczxpbnQ+LCBUeXBlPGludCwgZG91YmxlPiwgYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0CisvLyBzdXBwb3J0IGRpcmVjdGx5Lgorc3RydWN0IE5vbmUge307CisKKy8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bworLy8gcmVwcmVzZW50IHR5cGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUeXBlc048VDEsIFQyLCAuLi4sIFROPgorLy8gcmVwcmVzZW50cyBhIHR5cGUgbGlzdCB3aXRoIE4gdHlwZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pIGluIGl0LgorLy8gRXhjZXB0IGZvciBUeXBlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgorLy8gSGVhZCBmb3IgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsIGZvciB0aGUgcmVzdCBvZiB0aGUKKy8vIGxpc3QuCisKKy8vIFRoZSBlbXB0eSB0eXBlIGxpc3QuCitzdHJ1Y3QgVHlwZXMwIHt9OworCisvLyBUeXBlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMT4KK3N0cnVjdCBUeXBlczEgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMwIFRhaWw7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBUeXBlczIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxPFQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitzdHJ1Y3QgVHlwZXMzIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjxUMiwgVDM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitzdHJ1Y3QgVHlwZXM0IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMzxUMiwgVDMsIFQ0PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KK3N0cnVjdCBUeXBlczUgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0PFQyLCBUMywgVDQsIFQ1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNj4KK3N0cnVjdCBUeXBlczYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM1PFQyLCBUMywgVDQsIFQ1LCBUNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgorc3RydWN0IFR5cGVzNyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK3N0cnVjdCBUeXBlczggeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK3N0cnVjdCBUeXBlczkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK3N0cnVjdCBUeXBlczEwIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitzdHJ1Y3QgVHlwZXMxMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczEwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitzdHJ1Y3QgVHlwZXMxMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgorc3RydWN0IFR5cGVzMTMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+CitzdHJ1Y3QgVHlwZXMxNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczEzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitzdHJ1Y3QgVHlwZXMxNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2Pgorc3RydWN0IFR5cGVzMTYgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitzdHJ1Y3QgVHlwZXMxNyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitzdHJ1Y3QgVHlwZXMxOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5Pgorc3RydWN0IFR5cGVzMTkgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMxODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitzdHJ1Y3QgVHlwZXMyMCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczE5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK3N0cnVjdCBUeXBlczIxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KK3N0cnVjdCBUeXBlczIyIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitzdHJ1Y3QgVHlwZXMyMyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczIyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK3N0cnVjdCBUeXBlczI0IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KK3N0cnVjdCBUeXBlczI1IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK3N0cnVjdCBUeXBlczI2IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitzdHJ1Y3QgVHlwZXMyNyB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczI2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK3N0cnVjdCBUeXBlczI4IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK3N0cnVjdCBUeXBlczI5IHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgorc3RydWN0IFR5cGVzMzAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMyOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzE+CitzdHJ1Y3QgVHlwZXMzMSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczMwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitzdHJ1Y3QgVHlwZXMzMiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgorc3RydWN0IFR5cGVzMzMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+CitzdHJ1Y3QgVHlwZXMzNCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczMzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitzdHJ1Y3QgVHlwZXMzNSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzY+CitzdHJ1Y3QgVHlwZXMzNiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3Pgorc3RydWN0IFR5cGVzMzcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+CitzdHJ1Y3QgVHlwZXMzOCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitzdHJ1Y3QgVHlwZXMzOSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgorc3RydWN0IFR5cGVzNDAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXMzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MT4KK3N0cnVjdCBUeXBlczQxIHsKKyAgdHlwZWRlZiBUMSBIZWFkOworICB0eXBlZGVmIFR5cGVzNDA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorc3RydWN0IFR5cGVzNDIgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0Mj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgorc3RydWN0IFR5cGVzNDMgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0MjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0Mz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitzdHJ1Y3QgVHlwZXM0NCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+CitzdHJ1Y3QgVHlwZXM0NSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitzdHJ1Y3QgVHlwZXM0NiB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgorc3RydWN0IFR5cGVzNDcgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitzdHJ1Y3QgVHlwZXM0OCB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitzdHJ1Y3QgVHlwZXM0OSB7CisgIHR5cGVkZWYgVDEgSGVhZDsKKyAgdHlwZWRlZiBUeXBlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgorc3RydWN0IFR5cGVzNTAgeworICB0eXBlZGVmIFQxIEhlYWQ7CisgIHR5cGVkZWYgVHlwZXM0OTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBUYWlsOworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUeXBlc048Li4uPiBkaXJlY3RseSwKKy8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUeXBlczwuLi4+IGlzIG11Y2gKKy8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKKy8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQorLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFR5cGVzPGludD4KKy8vIHdpbGwgYXBwZWFyIGFzIFR5cGVzPGludCwgTm9uZSwgTm9uZSwgLi4uLCBOb25lPiBpbiB0aGUgY29tcGlsZXIKKy8vIGVycm9ycykuCisvLworLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKKy8vIHVzZXIgd291bGQgd3JpdGUgVHlwZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKKy8vIHRoYXQgdG8gVHlwZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKKy8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCisvLyBUeXBlcyB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxMCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDE1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQxNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMTkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIwID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDIxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjQgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMjUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI2ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDI3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyOCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQyOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzAgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMyID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDMzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzNCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQzNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzYgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUMzcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM4ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDM5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0MCA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0MSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDIgPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ0ID0gaW50ZXJuYWw6Ok5vbmUsCisgICAgdHlwZW5hbWUgVDQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NiA9IGludGVybmFsOjpOb25lLAorICAgIHR5cGVuYW1lIFQ0NyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDggPSBpbnRlcm5hbDo6Tm9uZSwKKyAgICB0eXBlbmFtZSBUNDkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDUwID0gaW50ZXJuYWw6Ok5vbmU+CitzdHJ1Y3QgVHlwZXMgeworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBUeXBlczxpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMwIHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgorc3RydWN0IFR5cGVzPFQxLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE8VDE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyPFQxLCBUMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzxUMSwgVDIsIFQzPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDxUMSwgVDIsIFQzLCBUND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzA+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAorICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAorICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0Mz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgorc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCisgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKKyAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKKyAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0ND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCisgICAgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KK3N0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAorICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCisgICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKKyAgICBUNDYsIFQ0NywgVDQ4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKKyAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitzdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKKyAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAorICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCisgICAgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBpbnRlcm5hbDo6Tm9uZT4geworICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gdHlwZTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyMgZGVmaW5lIEdURVNUX1RFTVBMQVRFXyB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MKKworLy8gVGhlIHRlbXBsYXRlICJzZWxlY3RvciIgc3RydWN0IFRlbXBsYXRlU2VsPFRtcGw+IGlzIHVzZWQgdG8KKy8vIHJlcHJlc2VudCBUbXBsLCB3aGljaCBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUgd2l0aCBvbmUgdHlwZQorLy8gcGFyYW1ldGVyLCBhcyBhIHR5cGUuICBUZW1wbGF0ZVNlbDxUbXBsPjo6QmluZDxUPjo6dHlwZSBpcyBkZWZpbmVkCisvLyBhcyB0aGUgdHlwZSBUbXBsPFQ+LiAgVGhpcyBhbGxvd3MgdXMgdG8gYWN0dWFsbHkgaW5zdGFudGlhdGUgdGhlCisvLyB0ZW1wbGF0ZSAic2VsZWN0ZWQiIGJ5IFRlbXBsYXRlU2VsPFRtcGw+LgorLy8KKy8vIFRoaXMgdHJpY2sgaXMgbmVjZXNzYXJ5IGZvciBzaW11bGF0aW5nIHR5cGVkZWYgZm9yIGNsYXNzIHRlbXBsYXRlcywKKy8vIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFRtcGw+CitzdHJ1Y3QgVGVtcGxhdGVTZWwgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RydWN0IEJpbmQgeworICAgIHR5cGVkZWYgVG1wbDxUPiB0eXBlOworICB9OworfTsKKworIyBkZWZpbmUgR1RFU1RfQklORF8oVG1wbFNlbCwgVCkgXAorICBUbXBsU2VsOjp0ZW1wbGF0ZSBCaW5kPFQ+Ojp0eXBlCisKKy8vIEEgdW5pcXVlIHN0cnVjdCB0ZW1wbGF0ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKKy8vIGFyZ3VtZW50cyBvZiBjbGFzcyB0ZW1wbGF0ZSBUZW1wbGF0ZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZQorLy8gdmFyaWFkaWMgdGVtcGxhdGVzIChlLmcuIFRlbXBsYXRlczxpbnQ+LCBUZW1wbGF0ZXM8aW50LCBkb3VibGU+LAorLy8gYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBOb25lVCB7fTsKKworLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCisvLyByZXByZXNlbnQgdGVtcGxhdGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUZW1wbGF0ZXNOPFQxLCBUMiwgLi4uLAorLy8gVE4+IHJlcHJlc2VudHMgYSBsaXN0IG9mIE4gdGVtcGxhdGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKS4gIEV4Y2VwdAorLy8gZm9yIFRlbXBsYXRlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgorLy8gSGVhZCBmb3IgdGhlIHNlbGVjdG9yIG9mIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwKKy8vIGZvciB0aGUgcmVzdCBvZiB0aGUgbGlzdC4KKworLy8gVGhlIGVtcHR5IHRlbXBsYXRlIGxpc3QuCitzdHJ1Y3QgVGVtcGxhdGVzMCB7fTsKKworLy8gVGVtcGxhdGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMT4KK3N0cnVjdCBUZW1wbGF0ZXMxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMwIFRhaWw7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyPgorc3RydWN0IFRlbXBsYXRlczIgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE8VDI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KK3N0cnVjdCBUZW1wbGF0ZXMzIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQyLCBUMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUND4KK3N0cnVjdCBUZW1wbGF0ZXM0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQyLCBUMywgVDQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNT4KK3N0cnVjdCBUZW1wbGF0ZXM1IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0PFQyLCBUMywgVDQsIFQ1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KK3N0cnVjdCBUZW1wbGF0ZXM2IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM1PFQyLCBUMywgVDQsIFQ1LCBUNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3Pgorc3RydWN0IFRlbXBsYXRlczcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDg+CitzdHJ1Y3QgVGVtcGxhdGVzOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KK3N0cnVjdCBUZW1wbGF0ZXM5IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwPgorc3RydWN0IFRlbXBsYXRlczEwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTE+CitzdHJ1Y3QgVGVtcGxhdGVzMTEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczEwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMj4KK3N0cnVjdCBUZW1wbGF0ZXMxMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KK3N0cnVjdCBUZW1wbGF0ZXMxMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgorc3RydWN0IFRlbXBsYXRlczE0IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+CitzdHJ1Y3QgVGVtcGxhdGVzMTUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTU+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTY+CitzdHJ1Y3QgVGVtcGxhdGVzMTYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNj4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KK3N0cnVjdCBUZW1wbGF0ZXMxNyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+CitzdHJ1Y3QgVGVtcGxhdGVzMTggeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOT4KK3N0cnVjdCBUZW1wbGF0ZXMxOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+CitzdHJ1Y3QgVGVtcGxhdGVzMjAgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczE5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+CitzdHJ1Y3QgVGVtcGxhdGVzMjEgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyPgorc3RydWN0IFRlbXBsYXRlczIyIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgorc3RydWN0IFRlbXBsYXRlczIzIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+CitzdHJ1Y3QgVGVtcGxhdGVzMjQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjU+CitzdHJ1Y3QgVGVtcGxhdGVzMjUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KK3N0cnVjdCBUZW1wbGF0ZXMyNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+CitzdHJ1Y3QgVGVtcGxhdGVzMjcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczI2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOD4KK3N0cnVjdCBUZW1wbGF0ZXMyOCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOD4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5Pgorc3RydWN0IFRlbXBsYXRlczI5IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMD4KK3N0cnVjdCBUZW1wbGF0ZXMzMCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzA+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxPgorc3RydWN0IFRlbXBsYXRlczMxIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KK3N0cnVjdCBUZW1wbGF0ZXMzMiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMz4KK3N0cnVjdCBUZW1wbGF0ZXMzMyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+CitzdHJ1Y3QgVGVtcGxhdGVzMzQgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczMzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+CitzdHJ1Y3QgVGVtcGxhdGVzMzUgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczM0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNj4KK3N0cnVjdCBUZW1wbGF0ZXMzNiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KK3N0cnVjdCBUZW1wbGF0ZXMzNyB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgorc3RydWN0IFRlbXBsYXRlczM4IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOT4KK3N0cnVjdCBUZW1wbGF0ZXMzOSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwPgorc3RydWN0IFRlbXBsYXRlczQwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KK3N0cnVjdCBUZW1wbGF0ZXM0MSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0Mj4KK3N0cnVjdCBUZW1wbGF0ZXM0MiB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyPiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzPgorc3RydWN0IFRlbXBsYXRlczQzIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0Mz4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0ND4KK3N0cnVjdCBUZW1wbGF0ZXM0NCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0ND4gVGFpbDsKK307CisKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NT4KK3N0cnVjdCBUZW1wbGF0ZXM0NSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDY+CitzdHJ1Y3QgVGVtcGxhdGVzNDYgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDc+CitzdHJ1Y3QgVGVtcGxhdGVzNDcgeworICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOworICB0eXBlZGVmIFRlbXBsYXRlczQ2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAorICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OD4KK3N0cnVjdCBUZW1wbGF0ZXM0OCB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiBUYWlsOworfTsKKwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OT4KK3N0cnVjdCBUZW1wbGF0ZXM0OSB7CisgIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCisgICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IFRhaWw7Cit9OworCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ5LCBHVEVTVF9URU1QTEFURV8gVDUwPgorc3RydWN0IFRlbXBsYXRlczUwIHsKKyAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBUYWlsOworfTsKKworCisvLyBXZSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlIHVzZXJzIHRvIHdyaXRlIFRlbXBsYXRlc048Li4uPiBkaXJlY3RseSwKKy8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUZW1wbGF0ZXM8Li4uPiBpcyBtdWNoCisvLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCisvLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKKy8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUZW1wbGF0ZXM8bGlzdD4KKy8vIHdpbGwgYXBwZWFyIGFzIFRlbXBsYXRlczxsaXN0LCBOb25lVCwgTm9uZVQsIC4uLiwgTm9uZVQ+IGluIHRoZSBjb21waWxlcgorLy8gZXJyb3JzKS4KKy8vCisvLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQorLy8gdXNlciB3b3VsZCB3cml0ZSBUZW1wbGF0ZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKKy8vIHRoYXQgdG8gVGVtcGxhdGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCisvLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQorLy8gVGVtcGxhdGVzIHRlbXBsYXRlLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDIgPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0ID0gTm9uZVQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDggPSBOb25lVCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDkgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQxMCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQxMiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQxNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQxNiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQxOCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTkgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyMCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyMiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjMgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyNiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyOCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjkgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQzMCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQzMiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzMgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQzNCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQzNiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQzOCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzkgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0MCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0MiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0NCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0NiA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0OCA9IE5vbmVULAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDkgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ1MCA9IE5vbmVUPgorc3RydWN0IFRlbXBsYXRlcyB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFRlbXBsYXRlczxOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMCB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQxPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI8VDEsIFQyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM8VDEsIFQyLCBUMz4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDxUMSwgVDIsIFQzLCBUND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTE+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAorICAgICAgVDEzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQ+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQ+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjM+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyND4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCisgICAgICBUMjc+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMD4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzE+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMT4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMz4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzND4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNj4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3Pgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDA+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIE5vbmVULCBOb25lVCwgTm9uZVQsCisgICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIE5vbmVULCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBOb25lVCwKKyAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDI+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzPgorc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKKyAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAorICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzPiB0eXBlOworfTsKK3RlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKKyAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0ND4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAorICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0ND4gdHlwZTsKK307Cit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDU+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDY+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKKyAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKKyAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAorICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDc+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgVDQ3LCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7CisgIHR5cGVkZWYgVGVtcGxhdGVzNDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCisgICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKKyAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+CitzdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAorICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCisgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKKyAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIE5vbmVULCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IHR5cGU7Cit9OwordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCisgICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKKyAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCisgICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKKyAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCisgICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKKyAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAorICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKKyAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAorICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCisgICAgR1RFU1RfVEVNUExBVEVfIFQ0OT4KK3N0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCisgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKKyAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAorICAgIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBOb25lVD4geworICB0eXBlZGVmIFRlbXBsYXRlczQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gdHlwZTsKK307CisKKy8vIFRoZSBUeXBlTGlzdCB0ZW1wbGF0ZSBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgZWl0aGVyIGEgc2luZ2xlIHR5cGUKKy8vIG9yIGEgVHlwZXM8Li4uPiBsaXN0IGluIFRZUEVEX1RFU1RfQ0FTRSgpIGFuZAorLy8gSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoKS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVHlwZUxpc3QgeyB0eXBlZGVmIFR5cGVzMTxUPiB0eXBlOyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+CitzdHJ1Y3QgVHlwZUxpc3Q8VHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+ID4geworICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCisgICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAorICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPjo6dHlwZSB0eXBlOworfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXworCisvLyBEdWUgdG8gQysrIHByZXByb2Nlc3NvciB3ZWlyZG5lc3MsIHdlIG5lZWQgZG91YmxlIGluZGlyZWN0aW9uIHRvCisvLyBjb25jYXRlbmF0ZSB0d28gdG9rZW5zIHdoZW4gb25lIG9mIHRoZW0gaXMgX19MSU5FX18uICBXcml0aW5nCisvLworLy8gICBmb28gIyMgX19MSU5FX18KKy8vCisvLyB3aWxsIHJlc3VsdCBpbiB0aGUgdG9rZW4gZm9vX19MSU5FX18sIGluc3RlYWQgb2YgZm9vIGZvbGxvd2VkIGJ5CisvLyB0aGUgY3VycmVudCBsaW5lIG51bWJlci4gIEZvciBtb3JlIGRldGFpbHMsIHNlZQorLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9taXNjLXRlY2huaWNhbC1pc3N1ZXMuaHRtbCNmYXEtMzkuNgorI2RlZmluZSBHVEVTVF9DT05DQVRfVE9LRU5fKGZvbywgYmFyKSBHVEVTVF9DT05DQVRfVE9LRU5fSU1QTF8oZm9vLCBiYXIpCisjZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikgZm9vICMjIGJhcgorCisvLyBHb29nbGUgVGVzdCBkZWZpbmVzIHRoZSB0ZXN0aW5nOjpNZXNzYWdlIGNsYXNzIHRvIGFsbG93IGNvbnN0cnVjdGlvbiBvZgorLy8gdGVzdCBtZXNzYWdlcyB2aWEgdGhlIDw8IG9wZXJhdG9yLiAgVGhlIGlkZWEgaXMgdGhhdCBhbnl0aGluZworLy8gc3RyZWFtYWJsZSB0byBzdGQ6Om9zdHJlYW0gY2FuIGJlIHN0cmVhbWVkIHRvIGEgdGVzdGluZzo6TWVzc2FnZS4KKy8vIFRoaXMgYWxsb3dzIGEgdXNlciB0byB1c2UgaGlzIG93biB0eXBlcyBpbiBHb29nbGUgVGVzdCBhc3NlcnRpb25zIGJ5CisvLyBvdmVybG9hZGluZyB0aGUgPDwgb3BlcmF0b3IuCisvLworLy8gdXRpbC9ndGwvc3RsX2xvZ2dpbmctaW5sLmggb3ZlcmxvYWRzIDw8IGZvciBTVEwgY29udGFpbmVycy4gIFRoZXNlCisvLyBvdmVybG9hZHMgY2Fubm90IGJlIGRlZmluZWQgaW4gdGhlIHN0ZCBuYW1lc3BhY2UsIGFzIHRoYXQgd2lsbCBiZQorLy8gdW5kZWZpbmVkIGJlaGF2aW9yLiAgVGhlcmVmb3JlLCB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwKKy8vIG5hbWVzcGFjZSBpbnN0ZWFkLgorLy8KKy8vIEMrKydzIHN5bWJvbCBsb29rdXAgcnVsZSAoaS5lLiBLb2VuaWcgbG9va3VwKSBzYXlzIHRoYXQgdGhlc2UKKy8vIG92ZXJsb2FkcyBhcmUgdmlzaWJsZSBpbiBlaXRoZXIgdGhlIHN0ZCBuYW1lc3BhY2Ugb3IgdGhlIGdsb2JhbAorLy8gbmFtZXNwYWNlLCBidXQgbm90IG90aGVyIG5hbWVzcGFjZXMsIGluY2x1ZGluZyB0aGUgdGVzdGluZworLy8gbmFtZXNwYWNlIHdoaWNoIEdvb2dsZSBUZXN0J3MgTWVzc2FnZSBjbGFzcyBpcyBpbi4KKy8vCisvLyBUbyBhbGxvdyBTVEwgY29udGFpbmVycyAoYW5kIG90aGVyIHR5cGVzIHRoYXQgaGFzIGEgPDwgb3BlcmF0b3IKKy8vIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UpIHRvIGJlIHVzZWQgaW4gR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucywKKy8vIHRlc3Rpbmc6Ok1lc3NhZ2UgbXVzdCBhY2Nlc3MgdGhlIGN1c3RvbSA8PCBvcGVyYXRvciBmcm9tIHRoZSBnbG9iYWwKKy8vIG5hbWVzcGFjZS4gIEhlbmNlIHRoaXMgaGVscGVyIGZ1bmN0aW9uLgorLy8KKy8vIE5vdGU6IEplZmZyZXkgWWFzc2tpbiBzdWdnZXN0ZWQgYW4gYWx0ZXJuYXRpdmUgZml4IGJ5ICJ1c2luZworLy8gOjpvcGVyYXRvcjw8OyIgaW4gdGhlIGRlZmluaXRpb24gb2YgTWVzc2FnZSdzIG9wZXJhdG9yPDwuICBUaGF0IGZpeAorLy8gZG9lc24ndCByZXF1aXJlIGEgaGVscGVyIGZ1bmN0aW9uLCBidXQgdW5mb3J0dW5hdGVseSBkb2Vzbid0CisvLyBjb21waWxlIHdpdGggTVNWQy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHZvaWQgR1Rlc3RTdHJlYW1Ub0hlbHBlcihzdGQ6Om9zdHJlYW0qIG9zLCBjb25zdCBUJiB2YWwpIHsKKyAgKm9zIDw8IHZhbDsKK30KKworY2xhc3MgUHJvdG9jb2xNZXNzYWdlOworbmFtZXNwYWNlIHByb3RvMiB7IGNsYXNzIE1lc3NhZ2U7IH0KKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKworY2xhc3MgQXNzZXJ0aW9uUmVzdWx0OyAgICAgICAgICAgICAgICAgLy8gUmVzdWx0IG9mIGFuIGFzc2VydGlvbi4KK2NsYXNzIE1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudHMgYSBmYWlsdXJlIG1lc3NhZ2UuCitjbGFzcyBUZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgdGVzdC4KK2NsYXNzIFRlc3RJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGEgdGVzdC4KK2NsYXNzIFRlc3RQYXJ0UmVzdWx0OyAgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhIHRlc3QgcGFydC4KK2NsYXNzIFVuaXRUZXN0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29sbGVjdGlvbiBvZiB0ZXN0IGNhc2VzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0cnVjdCBUcmFjZUluZm87ICAgICAgICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGEgdHJhY2UgcG9pbnQuCitjbGFzcyBTY29wZWRUcmFjZTsgICAgICAgICAgICAgICAgICAgICAvLyBJbXBsZW1lbnRzIHNjb3BlZCB0cmFjZS4KK2NsYXNzIFRlc3RJbmZvSW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBUZXN0SW5mbworY2xhc3MgVW5pdFRlc3RJbXBsOyAgICAgICAgICAgICAgICAgICAgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uIG9mIFVuaXRUZXN0CisKKy8vIEhvdyBtYW55IHRpbWVzIEluaXRHb29nbGVUZXN0KCkgaGFzIGJlZW4gY2FsbGVkLgorZXh0ZXJuIGludCBnX2luaXRfZ3Rlc3RfY291bnQ7CisKKy8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisvLyBzdGFjayB0cmFjZS4KK0dURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXTsKKworLy8gQSBzZWNyZXQgdHlwZSB0aGF0IEdvb2dsZSBUZXN0IHVzZXJzIGRvbid0IGtub3cgYWJvdXQuICBJdCBoYXMgbm8KKy8vIGRlZmluaXRpb24gb24gcHVycG9zZS4gIFRoZXJlZm9yZSBpdCdzIGltcG9zc2libGUgdG8gY3JlYXRlIGEKKy8vIFNlY3JldCBvYmplY3QsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4KK2NsYXNzIFNlY3JldDsKKworLy8gVHdvIG92ZXJsb2FkZWQgaGVscGVycyBmb3IgY2hlY2tpbmcgYXQgY29tcGlsZSB0aW1lIHdoZXRoZXIgYW4KKy8vIGV4cHJlc3Npb24gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbCAoaS5lLiBOVUxMIG9yIGFueSAwLXZhbHVlZAorLy8gY29tcGlsZS10aW1lIGludGVncmFsIGNvbnN0YW50KS4gIFRoZWlyIHJldHVybiB2YWx1ZXMgaGF2ZQorLy8gZGlmZmVyZW50IHNpemVzLCBzbyB3ZSBjYW4gdXNlIHNpemVvZigpIHRvIHRlc3Qgd2hpY2ggdmVyc2lvbiBpcworLy8gcGlja2VkIGJ5IHRoZSBjb21waWxlci4gIFRoZXNlIGhlbHBlcnMgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMsIGFzCisvLyB3ZSBvbmx5IG5lZWQgdGhlaXIgc2lnbmF0dXJlcy4KKy8vCisvLyBHaXZlbiBJc051bGxMaXRlcmFsSGVscGVyKHgpLCB0aGUgY29tcGlsZXIgd2lsbCBwaWNrIHRoZSBmaXJzdAorLy8gdmVyc2lvbiBpZiB4IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBTZWNyZXQqLCBhbmQgcGljayB0aGUKKy8vIHNlY29uZCB2ZXJzaW9uIG90aGVyd2lzZS4gIFNpbmNlIFNlY3JldCBpcyBhIHNlY3JldCBhbmQgaW5jb21wbGV0ZQorLy8gdHlwZSwgdGhlIG9ubHkgZXhwcmVzc2lvbiBhIHVzZXIgY2FuIHdyaXRlIHRoYXQgaGFzIHR5cGUgU2VjcmV0KiBpcworLy8gYSBudWxsIHBvaW50ZXIgbGl0ZXJhbC4gIFRoZXJlZm9yZSwgd2Uga25vdyB0aGF0IHggaXMgYSBudWxsCisvLyBwb2ludGVyIGxpdGVyYWwgaWYgYW5kIG9ubHkgaWYgdGhlIGZpcnN0IHZlcnNpb24gaXMgcGlja2VkIGJ5IHRoZQorLy8gY29tcGlsZXIuCitjaGFyIElzTnVsbExpdGVyYWxIZWxwZXIoU2VjcmV0KiBwKTsKK2NoYXIgKCZJc051bGxMaXRlcmFsSGVscGVyKC4uLikpWzJdOyAgLy8gTk9MSU5UCisKKy8vIEEgY29tcGlsZS10aW1lIGJvb2wgY29uc3RhbnQgdGhhdCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHggaXMgYQorLy8gbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQgY29tcGlsZS10aW1lCisvLyBpbnRlZ3JhbCBjb25zdGFudCkuCisjaWZkZWYgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlCisvLyBwYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pLgorIyBkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBmYWxzZQorI2Vsc2UKKyMgZGVmaW5lIEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgXAorICAgIChzaXplb2YoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNOdWxsTGl0ZXJhbEhlbHBlcih4KSkgPT0gMSkKKyNlbmRpZiAgLy8gR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXworCisvLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgorR1RFU1RfQVBJXyBTdHJpbmcgQXBwZW5kVXNlck1lc3NhZ2UoY29uc3QgU3RyaW5nJiBndGVzdF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiB1c2VyX21zZyk7CisKKy8vIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzY29wZWQgdHJhY2VzIGluIHVzZXIgcHJvZ3JhbXMuCitjbGFzcyBHVEVTVF9BUElfIFNjb3BlZFRyYWNlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBjJ3RvciBwdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8KKyAgLy8gYSB0cmFjZSBzdGFjayBtYWludGFpbmVkIGJ5IEdvb2dsZSBUZXN0LgorICBTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgLy8gVGhlIGQndG9yIHBvcHMgdGhlIGluZm8gcHVzaGVkIGJ5IHRoZSBjJ3Rvci4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoZSBkJ3RvciBpcyBub3QgdmlydHVhbCBpbiBvcmRlciB0byBiZSBlZmZpY2llbnQuCisgIC8vIERvbid0IGluaGVyaXQgZnJvbSBTY29wZWRUcmFjZSEKKyAgflNjb3BlZFRyYWNlKCk7CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZFRyYWNlKTsKK30gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87ICAvLyBBIFNjb3BlZFRyYWNlIG9iamVjdCBkb2VzIGl0cyBqb2IgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYyd0b3IgYW5kIGQndG9yLiAgVGhlcmVmb3JlIGl0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHVzZWQgb3RoZXJ3aXNlLgorCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYSBTdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisvLyBEZWNsYXJlZCBoZXJlIGJ1dCBkZWZpbmVkIGluIGd0ZXN0LmgsIHNvIHRoYXQgaXQgaGFzIGFjY2VzcworLy8gdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIE1lc3NhZ2UgY2xhc3MsIHJlcXVpcmVkIGJ5IHRoZSBBUk0KKy8vIGNvbXBpbGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitTdHJpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKGNvbnN0IFQmIHN0cmVhbWFibGUpOworCisvLyBUaGUgU3ltYmlhbiBjb21waWxlciBoYXMgYSBidWcgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIHNlbGVjdGluZyB0aGUKKy8vIGNvcnJlY3Qgb3ZlcmxvYWQgb2YgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlIChzZWUgYmVsb3cpCisvLyB1bmxlc3Mgd2UgcGFzcyB0aGUgZmlyc3QgYXJndW1lbnQgYnkgcmVmZXJlbmNlLiAgSWYgd2UgZG8gdGhhdCwKKy8vIGhvd2V2ZXIsIFZpc3VhbCBBZ2UgQysrIDEwLjEgZ2VuZXJhdGVzIGEgY29tcGlsZXIgZXJyb3IuICBUaGVyZWZvcmUKKy8vIHdlIG9ubHkgYXBwbHkgdGhlIHdvcmstYXJvdW5kIGZvciBTeW1iaWFuLgorI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykKKyMgZGVmaW5lIEdURVNUX0NSRUZfV09SS0FST1VORF8gY29uc3QmCisjZWxzZQorIyBkZWZpbmUgR1RFU1RfQ1JFRl9XT1JLQVJPVU5EXworI2VuZGlmCisKKy8vIFdoZW4gdGhpcyBvcGVyYW5kIGlzIGEgY29uc3QgY2hhciogb3IgY2hhciosIGlmIHRoZSBvdGhlciBvcGVyYW5kCisvLyBpcyBhIDo6c3RkOjpzdHJpbmcgb3IgOjpzdHJpbmcsIHdlIHByaW50IHRoaXMgb3BlcmFuZCBhcyBhIEMgc3RyaW5nCisvLyByYXRoZXIgdGhhbiBhIHBvaW50ZXIgKHdlIGRvIHRoZSBzYW1lIGZvciB3aWRlIHN0cmluZ3MpOyBvdGhlcndpc2UKKy8vIHdlIHByaW50IGl0IGFzIGEgcG9pbnRlciB0byBiZSBzYWZlLgorCisvLyBUaGlzIGludGVybmFsIG1hY3JvIGlzIHVzZWQgdG8gYXZvaWQgZHVwbGljYXRlZCBjb2RlLgorI2RlZmluZSBHVEVTVF9GT1JNQVRfSU1QTF8ob3BlcmFuZDJfdHlwZSwgb3BlcmFuZDFfcHJpbnRlcilcCitpbmxpbmUgU3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShcCisgICAgb3BlcmFuZDJfdHlwZTo6dmFsdWVfdHlwZSogR1RFU1RfQ1JFRl9XT1JLQVJPVU5EXyBzdHIsIFwKKyAgICBjb25zdCBvcGVyYW5kMl90eXBlJiAvKm9wZXJhbmQyKi8pIHtcCisgIHJldHVybiBvcGVyYW5kMV9wcmludGVyKHN0cik7XAorfVwKK2lubGluZSBTdHJpbmcgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKFwKKyAgICBjb25zdCBvcGVyYW5kMl90eXBlOjp2YWx1ZV90eXBlKiBHVEVTVF9DUkVGX1dPUktBUk9VTkRfIHN0ciwgXAorICAgIGNvbnN0IG9wZXJhbmQyX3R5cGUmIC8qb3BlcmFuZDIqLykge1wKKyAgcmV0dXJuIG9wZXJhbmQxX3ByaW50ZXIoc3RyKTtcCit9CisKK0dURVNUX0ZPUk1BVF9JTVBMXyg6OnN0ZDo6c3RyaW5nLCBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKQorI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfRk9STUFUX0lNUExfKDo6c3RkOjp3c3RyaW5nLCBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZ1F1b3RlZCkKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworR1RFU1RfRk9STUFUX0lNUExfKDo6c3RyaW5nLCBTdHJpbmc6OlNob3dDU3RyaW5nUXVvdGVkKQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworR1RFU1RfRk9STUFUX0lNUExfKDo6d3N0cmluZywgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmdRdW90ZWQpCisjZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORworCisjdW5kZWYgR1RFU1RfRk9STUFUX0lNUExfCisKKy8vIFRoZSBuZXh0IGZvdXIgb3ZlcmxvYWRzIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgb3BlcmFuZCBiZWluZworLy8gcHJpbnRlZCBpcyBhIGNoYXIvd2NoYXJfdCBwb2ludGVyIGFuZCB0aGUgb3RoZXIgb3BlcmFuZCBpcyBub3QgYQorLy8gc3RyaW5nL3dzdHJpbmcgb2JqZWN0LiAgSW4gc3VjaCBjYXNlcywgd2UganVzdCBwcmludCB0aGUgb3BlcmFuZCBhcworLy8gYSBwb2ludGVyIHRvIGJlIHNhZmUuCisjZGVmaW5lIEdURVNUX0ZPUk1BVF9DSEFSX1BUUl9JTVBMXyhDaGFyVHlwZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTdHJpbmcgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKENoYXJUeXBlKiBHVEVTVF9DUkVGX1dPUktBUk9VTkRfIHAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJikgeyBcCisgICAgcmV0dXJuIFByaW50VG9TdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHApKTsgICAgICAgICAgICAgIFwKKyAgfQorCitHVEVTVF9GT1JNQVRfQ0hBUl9QVFJfSU1QTF8oY2hhcikKK0dURVNUX0ZPUk1BVF9DSEFSX1BUUl9JTVBMXyhjb25zdCBjaGFyKQorR1RFU1RfRk9STUFUX0NIQVJfUFRSX0lNUExfKHdjaGFyX3QpCitHVEVTVF9GT1JNQVRfQ0hBUl9QVFJfSU1QTF8oY29uc3Qgd2NoYXJfdCkKKworI3VuZGVmIEdURVNUX0ZPUk1BVF9DSEFSX1BUUl9JTVBMXworCisvLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KKy8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCisvLworLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgorLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQorLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgorLy8KKy8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyIKKy8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciIKKy8vICAgZXhwZWN0ZWRfdmFsdWU6ICAgICAgIjUiCisvLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2IgorLy8KKy8vIFRoZSBpZ25vcmluZ19jYXNlIHBhcmFtZXRlciBpcyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEKKy8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsCisvLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBleHBlY3RlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIGFjdHVhbF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yaW5nX2Nhc2UpOworCisvLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4KK0dURVNUX0FQSV8gU3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZSgKKyAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCisgICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LAorICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCisgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyByZXByZXNlbnRzIGFuIElFRUUgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisvLyAoZWl0aGVyIHNpbmdsZS1wcmVjaXNpb24gb3IgZG91YmxlLXByZWNpc2lvbiwgZGVwZW5kaW5nIG9uIHRoZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVycykuCisvLworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBkbyBtb3JlIHNvcGhpc3RpY2F0ZWQgbnVtYmVyCisvLyBjb21wYXJpc29uLiAgKER1ZSB0byByb3VuZC1vZmYgZXJyb3IsIGV0YywgaXQncyB2ZXJ5IHVubGlrZWx5IHRoYXQKKy8vIHR3byBmbG9hdGluZy1wb2ludHMgd2lsbCBiZSBlcXVhbCBleGFjdGx5LiAgSGVuY2UgYSBuYWl2ZQorLy8gY29tcGFyaXNvbiBieSB0aGUgPT0gb3BlcmF0aW9uIG9mdGVuIGRvZXNuJ3Qgd29yay4pCisvLworLy8gRm9ybWF0IG9mIElFRUUgZmxvYXRpbmctcG9pbnQ6CisvLworLy8gICBUaGUgbW9zdC1zaWduaWZpY2FudCBiaXQgYmVpbmcgdGhlIGxlZnRtb3N0LCBhbiBJRUVFCisvLyAgIGZsb2F0aW5nLXBvaW50IGxvb2tzIGxpa2UKKy8vCisvLyAgICAgc2lnbl9iaXQgZXhwb25lbnRfYml0cyBmcmFjdGlvbl9iaXRzCisvLworLy8gICBIZXJlLCBzaWduX2JpdCBpcyBhIHNpbmdsZSBiaXQgdGhhdCBkZXNpZ25hdGVzIHRoZSBzaWduIG9mIHRoZQorLy8gICBudW1iZXIuCisvLworLy8gICBGb3IgZmxvYXQsIHRoZXJlIGFyZSA4IGV4cG9uZW50IGJpdHMgYW5kIDIzIGZyYWN0aW9uIGJpdHMuCisvLworLy8gICBGb3IgZG91YmxlLCB0aGVyZSBhcmUgMTEgZXhwb25lbnQgYml0cyBhbmQgNTIgZnJhY3Rpb24gYml0cy4KKy8vCisvLyAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKKy8vICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JRUVFX2Zsb2F0aW5nLXBvaW50X3N0YW5kYXJkLgorLy8KKy8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKKy8vCisvLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgorY2xhc3MgRmxvYXRpbmdQb2ludCB7CisgcHVibGljOgorICAvLyBEZWZpbmVzIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhhdCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKKyAgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVXaXRoU2l6ZTxzaXplb2YoUmF3VHlwZSk+OjpVSW50IEJpdHM7CisKKyAgLy8gQ29uc3RhbnRzLgorCisgIC8vICMgb2YgYml0cyBpbiBhIG51bWJlci4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrQml0Q291bnQgPSA4KnNpemVvZihSYXdUeXBlKTsKKworICAvLyAjIG9mIGZyYWN0aW9uIGJpdHMgaW4gYSBudW1iZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYWN0aW9uQml0Q291bnQgPQorICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0cyAtIDE7CisKKyAgLy8gIyBvZiBleHBvbmVudCBiaXRzIGluIGEgbnVtYmVyLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtFeHBvbmVudEJpdENvdW50ID0ga0JpdENvdW50IC0gMSAtIGtGcmFjdGlvbkJpdENvdW50OworCisgIC8vIFRoZSBtYXNrIGZvciB0aGUgc2lnbiBiaXQuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtTaWduQml0TWFzayA9IHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChrQml0Q291bnQgLSAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGZyYWN0aW9uIGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtGcmFjdGlvbkJpdE1hc2sgPQorICAgIH5zdGF0aWNfY2FzdDxCaXRzPigwKSA+PiAoa0V4cG9uZW50Qml0Q291bnQgKyAxKTsKKworICAvLyBUaGUgbWFzayBmb3IgdGhlIGV4cG9uZW50IGJpdHMuCisgIHN0YXRpYyBjb25zdCBCaXRzIGtFeHBvbmVudEJpdE1hc2sgPSB+KGtTaWduQml0TWFzayB8IGtGcmFjdGlvbkJpdE1hc2spOworCisgIC8vIEhvdyBtYW55IFVMUCdzIChVbml0cyBpbiB0aGUgTGFzdCBQbGFjZSkgd2Ugd2FudCB0byB0b2xlcmF0ZSB3aGVuCisgIC8vIGNvbXBhcmluZyB0d28gbnVtYmVycy4gIFRoZSBsYXJnZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBlcnJvciB3ZQorICAvLyBhbGxvdy4gIEEgMCB2YWx1ZSBtZWFucyB0aGF0IHR3byBudW1iZXJzIG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZQorICAvLyB0byBiZSBjb25zaWRlcmVkIGVxdWFsLgorICAvLworICAvLyBUaGUgbWF4aW11bSBlcnJvciBvZiBhIHNpbmdsZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gaXMgMC41CisgIC8vIHVuaXRzIGluIHRoZSBsYXN0IHBsYWNlLiAgT24gSW50ZWwgQ1BVJ3MsIGFsbCBmbG9hdGluZy1wb2ludAorICAvLyBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgd2l0aCA4MC1iaXQgcHJlY2lzaW9uLCB3aGlsZSBkb3VibGUgaGFzIDY0CisgIC8vIGJpdHMuICBUaGVyZWZvcmUsIDQgc2hvdWxkIGJlIGVub3VnaCBmb3Igb3JkaW5hcnkgdXNlLgorICAvLworICAvLyBTZWUgdGhlIGZvbGxvd2luZyBhcnRpY2xlIGZvciBtb3JlIGRldGFpbHMgb24gVUxQOgorICAvLyBodHRwOi8vd3d3LmN5Z251cy1zb2Z0d2FyZS5jb20vcGFwZXJzL2NvbXBhcmluZ2Zsb2F0cy9jb21wYXJpbmdmbG9hdHMuaHRtLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhVbHBzID0gNDsKKworICAvLyBDb25zdHJ1Y3RzIGEgRmxvYXRpbmdQb2ludCBmcm9tIGEgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgLy8KKyAgLy8gT24gYW4gSW50ZWwgQ1BVLCBwYXNzaW5nIGEgbm9uLW5vcm1hbGl6ZWQgTkFOIChOb3QgYSBOdW1iZXIpCisgIC8vIGFyb3VuZCBtYXkgY2hhbmdlIGl0cyBiaXRzLCBhbHRob3VnaCB0aGUgbmV3IHZhbHVlIGlzIGd1YXJhbnRlZWQKKyAgLy8gdG8gYmUgYWxzbyBhIE5BTi4gIFRoZXJlZm9yZSwgZG9uJ3QgZXhwZWN0IHRoaXMgY29uc3RydWN0b3IgdG8KKyAgLy8gcHJlc2VydmUgdGhlIGJpdHMgaW4geCB3aGVuIHggaXMgYSBOQU4uCisgIGV4cGxpY2l0IEZsb2F0aW5nUG9pbnQoY29uc3QgUmF3VHlwZSYgeCkgeyB1Xy52YWx1ZV8gPSB4OyB9CisKKyAgLy8gU3RhdGljIG1ldGhvZHMKKworICAvLyBSZWludGVycHJldHMgYSBiaXQgcGF0dGVybiBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gdGVzdCB0aGUgQWxtb3N0RXF1YWxzKCkgbWV0aG9kLgorICBzdGF0aWMgUmF3VHlwZSBSZWludGVycHJldEJpdHMoY29uc3QgQml0cyBiaXRzKSB7CisgICAgRmxvYXRpbmdQb2ludCBmcCgwKTsKKyAgICBmcC51Xy5iaXRzXyA9IGJpdHM7CisgICAgcmV0dXJuIGZwLnVfLnZhbHVlXzsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIGZsb2F0aW5nLXBvaW50IG51bWJlciB0aGF0IHJlcHJlc2VudCBwb3NpdGl2ZSBpbmZpbml0eS4KKyAgc3RhdGljIFJhd1R5cGUgSW5maW5pdHkoKSB7CisgICAgcmV0dXJuIFJlaW50ZXJwcmV0Qml0cyhrRXhwb25lbnRCaXRNYXNrKTsKKyAgfQorCisgIC8vIE5vbi1zdGF0aWMgbWV0aG9kcworCisgIC8vIFJldHVybnMgdGhlIGJpdHMgdGhhdCByZXByZXNlbnRzIHRoaXMgbnVtYmVyLgorICBjb25zdCBCaXRzICZiaXRzKCkgY29uc3QgeyByZXR1cm4gdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRoZSBleHBvbmVudCBiaXRzIG9mIHRoaXMgbnVtYmVyLgorICBCaXRzIGV4cG9uZW50X2JpdHMoKSBjb25zdCB7IHJldHVybiBrRXhwb25lbnRCaXRNYXNrICYgdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRoZSBmcmFjdGlvbiBiaXRzIG9mIHRoaXMgbnVtYmVyLgorICBCaXRzIGZyYWN0aW9uX2JpdHMoKSBjb25zdCB7IHJldHVybiBrRnJhY3Rpb25CaXRNYXNrICYgdV8uYml0c187IH0KKworICAvLyBSZXR1cm5zIHRoZSBzaWduIGJpdCBvZiB0aGlzIG51bWJlci4KKyAgQml0cyBzaWduX2JpdCgpIGNvbnN0IHsgcmV0dXJuIGtTaWduQml0TWFzayAmIHVfLmJpdHNfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIE5BTiAobm90IGEgbnVtYmVyKS4KKyAgYm9vbCBpc19uYW4oKSBjb25zdCB7CisgICAgLy8gSXQncyBhIE5BTiBpZiB0aGUgZXhwb25lbnQgYml0cyBhcmUgYWxsIG9uZXMgYW5kIHRoZSBmcmFjdGlvbgorICAgIC8vIGJpdHMgYXJlIG5vdCBlbnRpcmVseSB6ZXJvcy4KKyAgICByZXR1cm4gKGV4cG9uZW50X2JpdHMoKSA9PSBrRXhwb25lbnRCaXRNYXNrKSAmJiAoZnJhY3Rpb25fYml0cygpICE9IDApOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIG51bWJlciBpcyBhdCBtb3N0IGtNYXhVbHBzIFVMUCdzIGF3YXkgZnJvbQorICAvLyByaHMuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGZ1bmN0aW9uOgorICAvLworICAvLyAgIC0gcmV0dXJucyBmYWxzZSBpZiBlaXRoZXIgbnVtYmVyIGlzIChvciBib3RoIGFyZSkgTkFOLgorICAvLyAgIC0gdHJlYXRzIHJlYWxseSBsYXJnZSBudW1iZXJzIGFzIGFsbW9zdCBlcXVhbCB0byBpbmZpbml0eS4KKyAgLy8gICAtIHRoaW5rcyArMC4wIGFuZCAtMC4wIGFyZSAwIERMUCdzIGFwYXJ0LgorICBib29sIEFsbW9zdEVxdWFscyhjb25zdCBGbG9hdGluZ1BvaW50JiByaHMpIGNvbnN0IHsKKyAgICAvLyBUaGUgSUVFRSBzdGFuZGFyZCBzYXlzIHRoYXQgYW55IGNvbXBhcmlzb24gb3BlcmF0aW9uIGludm9sdmluZworICAgIC8vIGEgTkFOIG11c3QgcmV0dXJuIGZhbHNlLgorICAgIGlmIChpc19uYW4oKSB8fCByaHMuaXNfbmFuKCkpIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyh1Xy5iaXRzXywgcmhzLnVfLmJpdHNfKQorICAgICAgICA8PSBrTWF4VWxwczsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIHRoZSBhY3R1YWwgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICB1bmlvbiBGbG9hdGluZ1BvaW50VW5pb24geworICAgIFJhd1R5cGUgdmFsdWVfOyAgLy8gVGhlIHJhdyBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgQml0cyBiaXRzXzsgICAgICAvLyBUaGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgbnVtYmVyLgorICB9OworCisgIC8vIENvbnZlcnRzIGFuIGludGVnZXIgZnJvbSB0aGUgc2lnbi1hbmQtbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uIHRvCisgIC8vIHRoZSBiaWFzZWQgcmVwcmVzZW50YXRpb24uICBNb3JlIHByZWNpc2VseSwgbGV0IE4gYmUgMiB0byB0aGUKKyAgLy8gcG93ZXIgb2YgKGtCaXRDb3VudCAtIDEpLCBhbiBpbnRlZ2VyIHggaXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgIC8vIHVuc2lnbmVkIG51bWJlciB4ICsgTi4KKyAgLy8KKyAgLy8gRm9yIGluc3RhbmNlLAorICAvLworICAvLyAgIC1OICsgMSAodGhlIG1vc3QgbmVnYXRpdmUgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcKKyAgLy8gICAgICAgICAgc2lnbi1hbmQtbWFnbml0dWRlKSBpcyByZXByZXNlbnRlZCBieSAxOworICAvLyAgIDAgICAgICBpcyByZXByZXNlbnRlZCBieSBOOyBhbmQKKyAgLy8gICBOIC0gMSAgKHRoZSBiaWdnZXN0IG51bWJlciByZXByZXNlbnRhYmxlIHVzaW5nCisgIC8vICAgICAgICAgIHNpZ24tYW5kLW1hZ25pdHVkZSkgaXMgcmVwcmVzZW50ZWQgYnkgMk4gLSAxLgorICAvLworICAvLyBSZWFkIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2lnbmVkX251bWJlcl9yZXByZXNlbnRhdGlvbnMKKyAgLy8gZm9yIG1vcmUgZGV0YWlscyBvbiBzaWduZWQgbnVtYmVyIHJlcHJlc2VudGF0aW9ucy4KKyAgc3RhdGljIEJpdHMgU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKGNvbnN0IEJpdHMgJnNhbSkgeworICAgIGlmIChrU2lnbkJpdE1hc2sgJiBzYW0pIHsKKyAgICAgIC8vIHNhbSByZXByZXNlbnRzIGEgbmVnYXRpdmUgbnVtYmVyLgorICAgICAgcmV0dXJuIH5zYW0gKyAxOworICAgIH0gZWxzZSB7CisgICAgICAvLyBzYW0gcmVwcmVzZW50cyBhIHBvc2l0aXZlIG51bWJlci4KKyAgICAgIHJldHVybiBrU2lnbkJpdE1hc2sgfCBzYW07CisgICAgfQorICB9CisKKyAgLy8gR2l2ZW4gdHdvIG51bWJlcnMgaW4gdGhlIHNpZ24tYW5kLW1hZ25pdHVkZSByZXByZXNlbnRhdGlvbiwKKyAgLy8gcmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVtIGFzIGFuIHVuc2lnbmVkIG51bWJlci4KKyAgc3RhdGljIEJpdHMgRGlzdGFuY2VCZXR3ZWVuU2lnbkFuZE1hZ25pdHVkZU51bWJlcnMoY29uc3QgQml0cyAmc2FtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQml0cyAmc2FtMikgeworICAgIGNvbnN0IEJpdHMgYmlhc2VkMSA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0xKTsKKyAgICBjb25zdCBCaXRzIGJpYXNlZDIgPSBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoc2FtMik7CisgICAgcmV0dXJuIChiaWFzZWQxID49IGJpYXNlZDIpID8gKGJpYXNlZDEgLSBiaWFzZWQyKSA6IChiaWFzZWQyIC0gYmlhc2VkMSk7CisgIH0KKworICBGbG9hdGluZ1BvaW50VW5pb24gdV87Cit9OworCisvLyBUeXBlZGVmcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBGbG9hdGluZ1BvaW50IHRlbXBsYXRlIGNsYXNzIHRoYXQgd2UKKy8vIGNhcmUgdG8gdXNlLgordHlwZWRlZiBGbG9hdGluZ1BvaW50PGZsb2F0PiBGbG9hdDsKK3R5cGVkZWYgRmxvYXRpbmdQb2ludDxkb3VibGU+IERvdWJsZTsKKworLy8gSW4gb3JkZXIgdG8gY2F0Y2ggdGhlIG1pc3Rha2Ugb2YgcHV0dGluZyB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQKKy8vIHRlc3QgZml4dHVyZSBjbGFzc2VzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSwgd2UgbmVlZCB0byBhc3NpZ24KKy8vIHVuaXF1ZSBJRHMgdG8gZml4dHVyZSBjbGFzc2VzIGFuZCBjb21wYXJlIHRoZW0uICBUaGUgVHlwZUlkIHR5cGUgaXMKKy8vIHVzZWQgdG8gaG9sZCBzdWNoIElEcy4gIFRoZSB1c2VyIHNob3VsZCB0cmVhdCBUeXBlSWQgYXMgYW4gb3BhcXVlCisvLyB0eXBlOiB0aGUgb25seSBvcGVyYXRpb24gYWxsb3dlZCBvbiBUeXBlSWQgdmFsdWVzIGlzIHRvIGNvbXBhcmUKKy8vIHRoZW0gZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA9PSBvcGVyYXRvci4KK3R5cGVkZWYgY29uc3Qgdm9pZCogVHlwZUlkOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVJZEhlbHBlciB7CisgcHVibGljOgorICAvLyBkdW1teV8gbXVzdCBub3QgaGF2ZSBhIGNvbnN0IHR5cGUuICBPdGhlcndpc2UgYW4gb3Zlcmx5IGVhZ2VyCisgIC8vIGNvbXBpbGVyIChlLmcuIE1TVkMgNy4xICYgOC4wKSBtYXkgdHJ5IHRvIG1lcmdlCisgIC8vIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfIGZvciBkaWZmZXJlbnQgVHMgYXMgYW4gIm9wdGltaXphdGlvbiIuCisgIHN0YXRpYyBib29sIGR1bW15XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyA9IGZhbHNlOworCisvLyBHZXRUeXBlSWQ8VD4oKSByZXR1cm5zIHRoZSBJRCBvZiB0eXBlIFQuICBEaWZmZXJlbnQgdmFsdWVzIHdpbGwgYmUKKy8vIHJldHVybmVkIGZvciBkaWZmZXJlbnQgdHlwZXMuICBDYWxsaW5nIHRoZSBmdW5jdGlvbiB0d2ljZSB3aXRoIHRoZQorLy8gc2FtZSB0eXBlIGFyZ3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIElELgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUeXBlSWQgR2V0VHlwZUlkKCkgeworICAvLyBUaGUgY29tcGlsZXIgaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgYSBkaWZmZXJlbnQKKyAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gdmFyaWFibGUgZm9yIGVhY2ggVCB1c2VkIHRvIGluc3RhbnRpYXRlCisgIC8vIHRoZSB0ZW1wbGF0ZS4gIFRoZXJlZm9yZSwgdGhlIGFkZHJlc3Mgb2YgZHVtbXlfIGlzIGd1YXJhbnRlZWQgdG8KKyAgLy8gYmUgdW5pcXVlLgorICByZXR1cm4gJihUeXBlSWRIZWxwZXI8VD46OmR1bW15Xyk7Cit9CisKKy8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgQWx3YXlzIGNhbGwgdGhpcyBpbnN0ZWFkCisvLyBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKKy8vIDo6dGVzdGluZzo6VGVzdCwgYXMgdGhlIGxhdHRlciBtYXkgZ2l2ZSB0aGUgd3JvbmcgcmVzdWx0IGR1ZSB0byBhCisvLyBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhcyBhIE1hYyBPUyBYCisvLyBmcmFtZXdvcmsuCitHVEVTVF9BUElfIFR5cGVJZCBHZXRUZXN0VHlwZUlkKCk7CisKKy8vIERlZmluZXMgdGhlIGFic3RyYWN0IGZhY3RvcnkgaW50ZXJmYWNlIHRoYXQgY3JlYXRlcyBpbnN0YW5jZXMKKy8vIG9mIGEgVGVzdCBvYmplY3QuCitjbGFzcyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdEZhY3RvcnlCYXNlKCkge30KKworICAvLyBDcmVhdGVzIGEgdGVzdCBpbnN0YW5jZSB0byBydW4uIFRoZSBpbnN0YW5jZSBpcyBib3RoIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZAorICAvLyB3aXRoaW4gVGVzdEluZm9JbXBsOjpSdW4oKQorICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIFRlc3RGYWN0b3J5QmFzZSgpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RGYWN0b3J5QmFzZSk7Cit9OworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFRlYXN0RmFjdG9yeUJhc2UgaW50ZXJmYWNlLgorLy8gSXQgaXMgdXNlZCBpbiBURVNUIGFuZCBURVNUX0YgbWFjcm9zLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KK2NsYXNzIFRlc3RGYWN0b3J5SW1wbCA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeyByZXR1cm4gbmV3IFRlc3RDbGFzczsgfQorfTsKKworI2lmIEdURVNUX09TX1dJTkRPV1MKKworLy8gUHJlZGljYXRlLWZvcm1hdHRlcnMgZm9yIGltcGxlbWVudGluZyB0aGUgSFJFU1VMVCBjaGVja2luZyBtYWNyb3MKKy8vIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfQorLy8gV2UgcGFzcyBhIGxvbmcgaW5zdGVhZCBvZiBIUkVTVUxUIHRvIGF2b2lkIGNhdXNpbmcgYW4KKy8vIGluY2x1ZGUgZGVwZW5kZW5jeSBmb3IgdGhlIEhSRVNVTFQgdHlwZS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKKworI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCisKKy8vIFR5cGVzIG9mIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpIGZ1bmN0aW9ucy4KK3R5cGVkZWYgdm9pZCAoKlNldFVwVGVzdENhc2VGdW5jKSgpOwordHlwZWRlZiB2b2lkICgqVGVhckRvd25UZXN0Q2FzZUZ1bmMpKCk7CisKKy8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKKy8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgorLy8KKy8vIEFyZ3VtZW50czoKKy8vCisvLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQorLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0CisvLyAgIHR5cGVfcGFyYW0gICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKy8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgIGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KKy8vICAgdmFsdWVfcGFyYW0gICAgICAgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVzdCdzIHZhbHVlIHBhcmFtZXRlciwKKy8vICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorLy8gICBmaXh0dXJlX2NsYXNzX2lkOiBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCisvLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCisvLyAgIHRlYXJfZG93bl90YzogICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCisvLyAgIGZhY3Rvcnk6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdGVzdCBvYmplY3QuCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lCisvLyAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCitHVEVTVF9BUElfIFRlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAorICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKKyAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCisgICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKKy8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAorLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgorR1RFU1RfQVBJXyBib29sIFNraXBQcmVmaXgoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiogcHN0cik7CisKKyNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFN0YXRlIG9mIHRoZSBkZWZpbml0aW9uIG9mIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KK2NsYXNzIEdURVNUX0FQSV8gVHlwZWRUZXN0Q2FzZVBTdGF0ZSB7CisgcHVibGljOgorICBUeXBlZFRlc3RDYXNlUFN0YXRlKCkgOiByZWdpc3RlcmVkXyhmYWxzZSkge30KKworICAvLyBBZGRzIHRoZSBnaXZlbiB0ZXN0IG5hbWUgdG8gZGVmaW5lZF90ZXN0X25hbWVzXyBhbmQgcmV0dXJuIHRydWUKKyAgLy8gaWYgdGhlIHRlc3QgY2FzZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkOyBvdGhlcndpc2UgYWJvcnRzIHRoZQorICAvLyBwcm9ncmFtLgorICBib29sIEFkZFRlc3ROYW1lKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBjYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lKSB7CisgICAgaWYgKHJlZ2lzdGVyZWRfKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIFRlc3QgJXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSAiCisgICAgICAgICAgICAgICJSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCglcywgLi4uKS5cbiIsCisgICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLCB0ZXN0X25hbWUsIGNhc2VfbmFtZSk7CisgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgIHBvc2l4OjpBYm9ydCgpOworICAgIH0KKyAgICBkZWZpbmVkX3Rlc3RfbmFtZXNfLmluc2VydCh0ZXN0X25hbWUpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluCisgIC8vIGRlZmluZWRfdGVzdF9uYW1lc187IHJldHVybnMgcmVnaXN0ZXJlZF90ZXN0cyBpZiBzdWNjZXNzZnVsLCBvcgorICAvLyBhYm9ydHMgdGhlIHByb2dyYW0gb3RoZXJ3aXNlLgorICBjb25zdCBjaGFyKiBWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAorICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIHJlZ2lzdGVyZWRfdGVzdHMpOworCisgcHJpdmF0ZToKKyAgYm9vbCByZWdpc3RlcmVkXzsKKyAgOjpzdGQ6OnNldDxjb25zdCBjaGFyKj4gZGVmaW5lZF90ZXN0X25hbWVzXzsKK307CisKKy8vIFNraXBzIHRvIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhciBhZnRlciB0aGUgZmlyc3QgY29tbWEgaW4gJ3N0cic7CisvLyByZXR1cm5zIE5VTEwgaWYgbm8gY29tbWEgaXMgZm91bmQgaW4gJ3N0cicuCitpbmxpbmUgY29uc3QgY2hhciogU2tpcENvbW1hKGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihzdHIsICcsJyk7CisgIGlmIChjb21tYSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgd2hpbGUgKElzU3BhY2UoKigrK2NvbW1hKSkpIHt9CisgIHJldHVybiBjb21tYTsKK30KKworLy8gUmV0dXJucyB0aGUgcHJlZml4IG9mICdzdHInIGJlZm9yZSB0aGUgZmlyc3QgY29tbWEgaW4gaXQ7IHJldHVybnMKKy8vIHRoZSBlbnRpcmUgc3RyaW5nIGlmIGl0IGNvbnRhaW5zIG5vIGNvbW1hLgoraW5saW5lIFN0cmluZyBHZXRQcmVmaXhVbnRpbENvbW1hKGNvbnN0IGNoYXIqIHN0cikgeworICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihzdHIsICcsJyk7CisgIHJldHVybiBjb21tYSA9PSBOVUxMID8gU3RyaW5nKHN0cikgOiBTdHJpbmcoc3RyLCBjb21tYSAtIHN0cik7Cit9CisKKy8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlcz46OlJlZ2lzdGVyKCkKKy8vIHJlZ2lzdGVycyBhIGxpc3Qgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QuICBUaGUKKy8vIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcKKy8vIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgorLy8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBHVEVTVF9URU1QTEFURV8gbWFjcm8gZGVjbGFyZXMgYSB0ZW1wbGF0ZQorLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgSXQncyBkZWZpbmVkIGluIGd0ZXN0LXR5cGUtdXRpbC5oLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdCB7CisgcHVibGljOgorICAvLyAnaW5kZXgnIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVzdCBpbiB0aGUgdHlwZSBsaXN0ICdUeXBlcycKKyAgLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgVGVzdENhc2UsCisgIC8vIFR5cGVzKS4gIFZhbGlkIHZhbHVlcyBmb3IgJ2luZGV4JyBhcmUgWzAsIE4gLSAxXSB3aGVyZSBOIGlzIHRoZQorICAvLyBsZW5ndGggb2YgVHlwZXMuCisgIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWVzLCBpbnQgaW5kZXgpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVzOjpIZWFkIFR5cGU7CisgICAgdHlwZWRlZiBGaXh0dXJlPFR5cGU+IEZpeHR1cmVDbGFzczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEdURVNUX0JJTkRfKFRlc3RTZWwsIFR5cGUpIFRlc3RDbGFzczsKKworICAgIC8vIEZpcnN0LCByZWdpc3RlcnMgdGhlIGZpcnN0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGluIHRoZSB0eXBlCisgICAgLy8gbGlzdC4KKyAgICBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgICAgU3RyaW5nOjpGb3JtYXQoIiVzJXMlcy8lZCIsIHByZWZpeCwgcHJlZml4WzBdID09ICdcMCcgPyAiIiA6ICIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzZV9uYW1lLCBpbmRleCkuY19zdHIoKSwKKyAgICAgICAgR2V0UHJlZml4VW50aWxDb21tYSh0ZXN0X25hbWVzKS5jX3N0cigpLAorICAgICAgICBHZXRUeXBlTmFtZTxUeXBlPigpLmNfc3RyKCksCisgICAgICAgIE5VTEwsICAvLyBObyB2YWx1ZSBwYXJhbWV0ZXIuCisgICAgICAgIEdldFR5cGVJZDxGaXh0dXJlQ2xhc3M+KCksCisgICAgICAgIFRlc3RDbGFzczo6U2V0VXBUZXN0Q2FzZSwKKyAgICAgICAgVGVzdENsYXNzOjpUZWFyRG93blRlc3RDYXNlLAorICAgICAgICBuZXcgVGVzdEZhY3RvcnlJbXBsPFRlc3RDbGFzcz4pOworCisgICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdHlwZSBsaXN0LgorICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM6OlRhaWw+CisgICAgICAgIDo6UmVnaXN0ZXIocHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIGluZGV4ICsgMSk7CisgIH0KK307CisKKy8vIFRoZSBiYXNlIGNhc2UgZm9yIHRoZSBjb21waWxlIHRpbWUgcmVjdXJzaW9uLgordGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIFR5cGVzMD4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8sIGludCAvKmluZGV4Ki8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworLy8gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZXN0cywgVHlwZXM+OjpSZWdpc3RlcigpCisvLyByZWdpc3RlcnMgKmFsbCBjb21iaW5hdGlvbnMqIG9mICdUZXN0cycgYW5kICdUeXBlcycgd2l0aCBHb29nbGUKKy8vIFRlc3QuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluc2lnbmlmaWNhbnQgLSB3ZSBqdXN0IG5lZWQgdG8gcmV0dXJuCisvLyBzb21ldGhpbmcgc3VjaCB0aGF0IHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2NvcGUuCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzLCB0eXBlbmFtZSBUeXBlcz4KK2NsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiBjYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfbmFtZXMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RzOjpIZWFkIEhlYWQ7CisKKyAgICAvLyBGaXJzdCwgcmVnaXN0ZXIgdGhlIGZpcnN0IHRlc3QgaW4gJ1Rlc3QnIGZvciBlYWNoIHR5cGUgaW4gJ1R5cGVzJy4KKyAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgSGVhZCwgVHlwZXM+OjpSZWdpc3RlcigKKyAgICAgICAgcHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIDApOworCisgICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdGVzdCBsaXN0LgorICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzOjpUYWlsLCBUeXBlcz4KKyAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNhc2VfbmFtZSwgU2tpcENvbW1hKHRlc3RfbmFtZXMpKTsKKyAgfQorfTsKKworLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCit0ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFR5cGVzPgorY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZW1wbGF0ZXMwLCBUeXBlcz4geworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYSBTdHJpbmcuCisvLworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKKy8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCisvLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKKy8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCisvLworLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCisvLyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKC4uLiwgMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4KKy8vIHRoZSB0cmFjZSBidXQgQmFyKCkgYW5kIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KK0dURVNUX0FQSV8gU3RyaW5nIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoVW5pdFRlc3QqIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQpOworCisvLyBIZWxwZXJzIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiB1bnJlYWNoYWJsZSBjb2RlIG9yIGNvbnN0YW50CisvLyBjb25kaXRpb24uCisKKy8vIEFsd2F5cyByZXR1cm5zIHRydWUuCitHVEVTVF9BUElfIGJvb2wgQWx3YXlzVHJ1ZSgpOworCisvLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KK2lubGluZSBib29sIEFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gIUFsd2F5c1RydWUoKTsgfQorCisvLyBIZWxwZXIgZm9yIHN1cHByZXNzaW5nIGZhbHNlIHdhcm5pbmcgZnJvbSBDbGFuZyBvbiBhIGNvbnN0IGNoYXIqCisvLyB2YXJpYWJsZSBkZWNsYXJlZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYWx3YXlzIGJlaW5nIE5VTEwgaW4KKy8vIHRoZSBlbHNlIGJyYW5jaC4KK3N0cnVjdCBHVEVTVF9BUElfIENvbnN0Q2hhclB0ciB7CisgIENvbnN0Q2hhclB0cihjb25zdCBjaGFyKiBzdHIpIDogdmFsdWUoc3RyKSB7fQorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBjb25zdCBjaGFyKiB2YWx1ZTsKK307CisKKy8vIEEgc2ltcGxlIExpbmVhciBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHJhbmRvbQorLy8gbnVtYmVycyB3aXRoIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uICBVbmxpa2UgcmFuZCgpIGFuZCBzcmFuZCgpLCBpdAorLy8gZG9lc24ndCB1c2UgZ2xvYmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlIGNhbid0IGludGVyZmVyZSB3aXRoIHVzZXIKKy8vIGNvZGUpLiAgVW5saWtlIHJhbmRfcigpLCBpdCdzIHBvcnRhYmxlLiAgQW4gTENHIGlzbid0IHZlcnkgcmFuZG9tLAorLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KK2NsYXNzIEdURVNUX0FQSV8gUmFuZG9tIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBVSW50MzIga01heFJhbmdlID0gMXUgPDwgMzE7CisKKyAgZXhwbGljaXQgUmFuZG9tKFVJbnQzMiBzZWVkKSA6IHN0YXRlXyhzZWVkKSB7fQorCisgIHZvaWQgUmVzZWVkKFVJbnQzMiBzZWVkKSB7IHN0YXRlXyA9IHNlZWQ7IH0KKworICAvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcworICAvLyAwIG9yIGdyZWF0ZXIgdGhhbiBrTWF4UmFuZ2UuCisgIFVJbnQzMiBHZW5lcmF0ZShVSW50MzIgcmFuZ2UpOworCisgcHJpdmF0ZToKKyAgVUludDMyIHN0YXRlXzsKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSYW5kb20pOworfTsKKworLy8gRGVmaW5pbmcgYSB2YXJpYWJsZSBvZiB0eXBlIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBUMj4gd2lsbCBjYXVzZSBhCisvLyBjb21waWxlciBlcnJvciBpZmYgVDEgYW5kIFQyIGFyZSBkaWZmZXJlbnQgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxULCBUPiB7Cit9OworCisvLyBSZW1vdmVzIHRoZSByZWZlcmVuY2UgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSByZWZlcmVuY2UgdHlwZSwKKy8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcworLy8gdHIxOjpyZW1vdmVfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBSZW1vdmVSZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBhcm91bmQgUmVtb3ZlUmVmZXJlbmNlIHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKKy8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSBcCisgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlUmVmZXJlbmNlPFQ+Ojp0eXBlCisKKy8vIFJlbW92ZXMgY29uc3QgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSBjb25zdCB0eXBlLCBvdGhlcndpc2UgbGVhdmVzCisvLyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRyMTo6cmVtb3ZlX2NvbnN0LCB3aGljaCBpcyBub3QKKy8vIHdpZGVseSBhdmFpbGFibGUgeWV0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlQ29uc3QgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVD4geyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBNU1ZDIDguMCwgU3VuIEMrKywgYW5kIElCTSBYTCBDKysgaGF2ZSBhIGJ1ZyB3aGljaCBjYXVzZXMgdGhlIGFib3ZlCisvLyBkZWZpbml0aW9uIHRvIGZhaWwgdG8gcmVtb3ZlIHRoZSBjb25zdCBpbiAnY29uc3QgaW50WzNdJyBhbmQgJ2NvbnN0CisvLyBjaGFyWzNdWzRdJy4gIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gd29ya3MgYXJvdW5kIHRoZSBidWcuCisvLyBIb3dldmVyLCBpdCBjYXVzZXMgdHJvdWJsZSB3aXRoIEdDQyBhbmQgdGh1cyBuZWVkcyB0byBiZQorLy8gY29uZGl0aW9uYWxseSBjb21waWxlZC4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitzdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVFtOXT4geworICB0eXBlZGVmIHR5cGVuYW1lIFJlbW92ZUNvbnN0PFQ+Ojp0eXBlIHR5cGVbTl07Cit9OworI2VuZGlmCisKKy8vIEEgaGFuZHkgd3JhcHBlciBhcm91bmQgUmVtb3ZlQ29uc3QgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudAorLy8gVCBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisjZGVmaW5lIEdURVNUX1JFTU9WRV9DT05TVF8oVCkgXAorICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OlJlbW92ZUNvbnN0PFQ+Ojp0eXBlCisKKy8vIFR1cm5zIGNvbnN0IFUmLCBVJiwgY29uc3QgVSwgYW5kIFUgYWxsIGludG8gVS4KKyNkZWZpbmUgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFQpIFwKKyAgICBHVEVTVF9SRU1PVkVfQ09OU1RfKEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpKQorCisvLyBBZGRzIHJlZmVyZW5jZSB0byBhIHR5cGUgaWYgaXQgaXMgbm90IGEgcmVmZXJlbmNlIHR5cGUsCisvLyBvdGhlcndpc2UgbGVhdmVzIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMKKy8vIHRyMTo6YWRkX3JlZmVyZW5jZSwgd2hpY2ggaXMgbm90IHdpZGVseSBhdmFpbGFibGUgeWV0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQWRkUmVmZXJlbmNlIHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBBZGRSZWZlcmVuY2U8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCisKKy8vIEEgaGFuZHkgd3JhcHBlciBhcm91bmQgQWRkUmVmZXJlbmNlIHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQgVAorLy8gZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9BRERfUkVGRVJFTkNFXyhUKSBcCisgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWRkUmVmZXJlbmNlPFQ+Ojp0eXBlCisKKy8vIEFkZHMgYSByZWZlcmVuY2UgdG8gY29uc3Qgb24gdG9wIG9mIFQgYXMgbmVjZXNzYXJ5LiAgRm9yIGV4YW1wbGUsCisvLyBpdCB0cmFuc2Zvcm1zCisvLworLy8gICBjaGFyICAgICAgICAgPT0+IGNvbnN0IGNoYXImCisvLyAgIGNvbnN0IGNoYXIgICA9PT4gY29uc3QgY2hhciYKKy8vICAgY2hhciYgICAgICAgID09PiBjb25zdCBjaGFyJgorLy8gICBjb25zdCBjaGFyJiAgPT0+IGNvbnN0IGNoYXImCisvLworLy8gVGhlIGFyZ3VtZW50IFQgbXVzdCBkZXBlbmQgb24gc29tZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorI2RlZmluZSBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1RfKFQpIFwKKyAgICBHVEVTVF9BRERfUkVGRVJFTkNFXyhjb25zdCBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSkKKworLy8gSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbAorLy8gY29uc3RhbnQgdGhhdCdzIHRydWUgaWZmIHR5cGUgRnJvbSBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8KKy8vIHR5cGUgVG8uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CitjbGFzcyBJbXBsaWNpdGx5Q29udmVydGlibGUgeworIHByaXZhdGU6CisgIC8vIFdlIG5lZWQgdGhlIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb25zIG9ubHkgZm9yIHRoZWlyIHR5cGVzLgorICAvLyBUaGV5IGhhdmUgbm8gaW1wbGVtZW50YXRpb25zLgorCisgIC8vIE1ha2VGcm9tKCkgaXMgYW4gZXhwcmVzc2lvbiB3aG9zZSB0eXBlIGlzIEZyb20uICBXZSBjYW5ub3Qgc2ltcGx5CisgIC8vIHVzZSBGcm9tKCksIGFzIHRoZSB0eXBlIEZyb20gbWF5IG5vdCBoYXZlIGEgcHVibGljIGRlZmF1bHQKKyAgLy8gY29uc3RydWN0b3IuCisgIHN0YXRpYyBGcm9tIE1ha2VGcm9tKCk7CisKKyAgLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgb3ZlcmxvYWRlZC4gIEdpdmVuIGFuIGV4cHJlc3Npb24KKyAgLy8gSGVscGVyKHgpLCB0aGUgY29tcGlsZXIgd2lsbCBwaWNrIHRoZSBmaXJzdCB2ZXJzaW9uIGlmIHggY2FuIGJlCisgIC8vIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHR5cGUgVG87IG90aGVyd2lzZSBpdCB3aWxsIHBpY2sgdGhlCisgIC8vIHNlY29uZCB2ZXJzaW9uLgorICAvLworICAvLyBUaGUgZmlyc3QgdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAxLCBhbmQgdGhlIHNlY29uZAorICAvLyB2ZXJzaW9uIHJldHVybnMgYSB2YWx1ZSBvZiBzaXplIDIuICBUaGVyZWZvcmUsIGJ5IGNoZWNraW5nIHRoZQorICAvLyBzaXplIG9mIEhlbHBlcih4KSwgd2hpY2ggY2FuIGJlIGRvbmUgYXQgY29tcGlsZSB0aW1lLCB3ZSBjYW4gdGVsbAorICAvLyB3aGljaCB2ZXJzaW9uIG9mIEhlbHBlcigpIGlzIHVzZWQsIGFuZCBoZW5jZSB3aGV0aGVyIHggY2FuIGJlCisgIC8vIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHR5cGUgVG8uCisgIHN0YXRpYyBjaGFyIEhlbHBlcihUbyk7CisgIHN0YXRpYyBjaGFyICgmSGVscGVyKC4uLikpWzJdOyAgLy8gTk9MSU5UCisKKyAgLy8gV2UgaGF2ZSB0byBwdXQgdGhlICdwdWJsaWMnIHNlY3Rpb24gYWZ0ZXIgdGhlICdwcml2YXRlJyBzZWN0aW9uLAorICAvLyBvciBNU1ZDIHJlZnVzZXMgdG8gY29tcGlsZSB0aGUgY29kZS4KKyBwdWJsaWM6CisgIC8vIE1TVkMgd2FybnMgYWJvdXQgaW1wbGljaXRseSBjb252ZXJ0aW5nIGZyb20gZG91YmxlIHRvIGludCBmb3IKKyAgLy8gcG9zc2libGUgbG9zcyBvZiBkYXRhLCBzbyB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlCisgIC8vIHdhcm5pbmcuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjQ0KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MjQ0LgorCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIHNpemVvZihIZWxwZXIoSW1wbGljaXRseUNvbnZlcnRpYmxlOjpNYWtlRnJvbSgpKSkgPT0gMTsKKyMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKKyAgLy8gQysrQnVpbGRlciBjYW5ub3QgdXNlIG1lbWJlciBvdmVybG9hZCByZXNvbHV0aW9uIGR1cmluZyB0ZW1wbGF0ZQorICAvLyBpbnN0YW50aWF0aW9uLiAgVGhlIHNpbXBsZXN0IHdvcmthcm91bmQgaXMgdG8gdXNlIGl0cyBDKysweCB0eXBlIHRyYWl0cworICAvLyBmdW5jdGlvbnMgKEMrK0J1aWxkZXIgMjAwOSBhbmQgYWJvdmUgb25seSkuCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX19pc19jb252ZXJ0aWJsZShGcm9tLCBUbyk7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzaXplb2YoSGVscGVyKEltcGxpY2l0bHlDb252ZXJ0aWJsZTo6TWFrZUZyb20oKSkpID09IDE7CisjZW5kaWYgIC8vIF9NU1ZfVkVSCit9OwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorY29uc3QgYm9vbCBJbXBsaWNpdGx5Q29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZTsKKworLy8gSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBib29sIGNvbnN0YW50IHRoYXQncworLy8gdHJ1ZSBpZmYgVCBpcyB0eXBlIFByb3RvY29sTWVzc2FnZSwgcHJvdG8yOjpNZXNzYWdlLCBvciBhIHN1YmNsYXNzCisvLyBvZiB0aG9zZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IElzQVByb3RvY29sTWVzc2FnZQorICAgIDogcHVibGljIGJvb2xfY29uc3RhbnQ8CisgIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpQcm90b2NvbE1lc3NhZ2UqPjo6dmFsdWUgfHwKKyAgSW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQqLCBjb25zdCA6OnByb3RvMjo6TWVzc2FnZSo+Ojp2YWx1ZT4geworfTsKKworLy8gV2hlbiB0aGUgY29tcGlsZXIgc2VlcyBleHByZXNzaW9uIElzQ29udGFpbmVyVGVzdDxDPigwKSwgaWYgQyBpcyBhbgorLy8gU1RMLXN0eWxlIGNvbnRhaW5lciBjbGFzcywgdGhlIGZpcnN0IG92ZXJsb2FkIG9mIElzQ29udGFpbmVyVGVzdAorLy8gd2lsbCBiZSB2aWFibGUgKHNpbmNlIGJvdGggQzo6aXRlcmF0b3IqIGFuZCBDOjpjb25zdF9pdGVyYXRvciogYXJlCisvLyB2YWxpZCB0eXBlcyBhbmQgTlVMTCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlbSkuICBJdCB3aWxsCisvLyBiZSBwaWNrZWQgb3ZlciB0aGUgc2Vjb25kIG92ZXJsb2FkIGFzICdpbnQnIGlzIGEgcGVyZmVjdCBtYXRjaCBmb3IKKy8vIHRoZSB0eXBlIG9mIGFyZ3VtZW50IDAuICBJZiBDOjppdGVyYXRvciBvciBDOjpjb25zdF9pdGVyYXRvciBpcyBub3QKKy8vIGEgdmFsaWQgdHlwZSwgdGhlIGZpcnN0IG92ZXJsb2FkIGlzIG5vdCB2aWFibGUsIGFuZCB0aGUgc2Vjb25kCisvLyBvdmVybG9hZCB3aWxsIGJlIHBpY2tlZC4gIFRoZXJlZm9yZSwgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIEMgaXMKKy8vIGEgY29udGFpbmVyIGNsYXNzIGJ5IGNoZWNraW5nIHRoZSB0eXBlIG9mIElzQ29udGFpbmVyVGVzdDxDPigwKS4KKy8vIFRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBpbnNpZ25pZmljYW50LgorLy8KKy8vIE5vdGUgdGhhdCB3ZSBsb29rIGZvciBib3RoIEM6Oml0ZXJhdG9yIGFuZCBDOjpjb25zdF9pdGVyYXRvci4gIFRoZQorLy8gcmVhc29uIGlzIHRoYXQgQysrIGluamVjdHMgdGhlIG5hbWUgb2YgYSBjbGFzcyBhcyBhIG1lbWJlciBvZiB0aGUKKy8vIGNsYXNzIGl0c2VsZiAoZS5nLiB5b3UgY2FuIHJlZmVyIHRvIGNsYXNzIGl0ZXJhdG9yIGFzIGVpdGhlcgorLy8gJ2l0ZXJhdG9yJyBvciAnaXRlcmF0b3I6Oml0ZXJhdG9yJykuICBJZiB3ZSBsb29rIGZvciBDOjppdGVyYXRvcgorLy8gb25seSwgZm9yIGV4YW1wbGUsIHdlIHdvdWxkIG1pc3Rha2VubHkgdGhpbmsgdGhhdCBhIGNsYXNzIG5hbWVkCisvLyBpdGVyYXRvciBpcyBhbiBTVEwgY29udGFpbmVyLgorLy8KKy8vIEFsc28gbm90ZSB0aGF0IHRoZSBzaW1wbGVyIGFwcHJvYWNoIG9mIG92ZXJsb2FkaW5nCisvLyBJc0NvbnRhaW5lclRlc3QodHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqKSBhbmQKKy8vIElzQ29udGFpbmVyVGVzdCguLi4pIGRvZXNuJ3Qgd29yayB3aXRoIFZpc3VhbCBBZ2UgQysrIGFuZCBTdW4gQysrLgordHlwZWRlZiBpbnQgSXNDb250YWluZXI7Cit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK0lzQ29udGFpbmVyIElzQ29udGFpbmVyVGVzdChpbnQgLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6aXRlcmF0b3IqIC8qIGl0ICovID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjpjb25zdF9pdGVyYXRvciogLyogY29uc3RfaXQgKi8gPSBOVUxMKSB7CisgIHJldHVybiAwOworfQorCit0eXBlZGVmIGNoYXIgSXNOb3RDb250YWluZXI7Cit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK0lzTm90Q29udGFpbmVyIElzQ29udGFpbmVyVGVzdChsb25nIC8qIGR1bW15ICovKSB7IHJldHVybiAnXDAnOyB9CisKKy8vIEVuYWJsZUlmPGNvbmRpdGlvbj46OnR5cGUgaXMgdm9pZCB3aGVuICdDb25kJyBpcyB0cnVlLCBhbmQKKy8vIHVuZGVmaW5lZCB3aGVuICdDb25kJyBpcyBmYWxzZS4gIFRvIHVzZSBTRklOQUUgdG8gbWFrZSBhIGZ1bmN0aW9uCisvLyBvdmVybG9hZCBvbmx5IGFwcGx5IHdoZW4gYSBwYXJ0aWN1bGFyIGV4cHJlc3Npb24gaXMgdHJ1ZSwgYWRkCisvLyAidHlwZW5hbWUgRW5hYmxlSWY8ZXhwcmVzc2lvbj46OnR5cGUqID0gMCIgYXMgdGhlIGxhc3QgcGFyYW1ldGVyLgordGVtcGxhdGU8Ym9vbD4gc3RydWN0IEVuYWJsZUlmOwordGVtcGxhdGU8PiBzdHJ1Y3QgRW5hYmxlSWY8dHJ1ZT4geyB0eXBlZGVmIHZvaWQgdHlwZTsgfTsgIC8vIE5PTElOVAorCisvLyBVdGlsaXRpZXMgZm9yIG5hdGl2ZSBhcnJheXMuCisKKy8vIEFycmF5RXEoKSBjb21wYXJlcyB0d28gay1kaW1lbnNpb25hbCBuYXRpdmUgYXJyYXlzIHVzaW5nIHRoZQorLy8gZWxlbWVudHMnIG9wZXJhdG9yPT0sIHdoZXJlIGsgY2FuIGJlIGFueSBpbnRlZ2VyID49IDAuICBXaGVuIGsgaXMKKy8vIDAsIEFycmF5RXEoKSBkZWdlbmVyYXRlcyBpbnRvIGNvbXBhcmluZyBhIHNpbmdsZSBwYWlyIG9mIHZhbHVlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKTsKKworLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIGsgaXMgMC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUJiBsaHMsIGNvbnN0IFUmIHJocykgeyByZXR1cm4gbGhzID09IHJoczsgfQorCisvLyBUaGlzIG92ZXJsb2FkIGlzIHVzZWQgd2hlbiBrID49IDEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgc2l6ZV90IE4+CitpbmxpbmUgYm9vbCBBcnJheUVxKGNvbnN0IFQoJmxocylbTl0sIGNvbnN0IFUoJnJocylbTl0pIHsKKyAgcmV0dXJuIGludGVybmFsOjpBcnJheUVxKGxocywgTiwgcmhzKTsKK30KKworLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQorLy8gdGhlIHByZXZpb3VzIEFycmF5RXEoKSBmdW5jdGlvbiwgYXJyYXlzIHdpdGggZGlmZmVyZW50IHNpemVzIHdvdWxkCisvLyBsZWFkIHRvIGRpZmZlcmVudCBjb3BpZXMgb2YgdGhlIHRlbXBsYXRlIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgQXJyYXlFcShjb25zdCBUKiBsaHMsIHNpemVfdCBzaXplLCBjb25zdCBVKiByaHMpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc2l6ZTsgaSsrKSB7CisgICAgaWYgKCFpbnRlcm5hbDo6QXJyYXlFcShsaHNbaV0sIHJoc1tpXSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciByYW5nZSBbYmVnaW4sIGVuZCkgdGhhdAorLy8gZXF1YWxzIGVsZW0uICBFbGVtZW50IG1heSBiZSBhIG5hdGl2ZSBhcnJheSB0eXBlIGl0c2VsZi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyLCB0eXBlbmFtZSBFbGVtZW50PgorSXRlciBBcnJheUF3YXJlRmluZChJdGVyIGJlZ2luLCBJdGVyIGVuZCwgY29uc3QgRWxlbWVudCYgZWxlbSkgeworICBmb3IgKEl0ZXIgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgaWYgKGludGVybmFsOjpBcnJheUVxKCppdCwgZWxlbSkpCisgICAgICByZXR1cm4gaXQ7CisgIH0KKyAgcmV0dXJuIGVuZDsKK30KKworLy8gQ29weUFycmF5KCkgY29waWVzIGEgay1kaW1lbnNpb25hbCBuYXRpdmUgYXJyYXkgdXNpbmcgdGhlIGVsZW1lbnRzJworLy8gb3BlcmF0b3I9LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzIDAsCisvLyBDb3B5QXJyYXkoKSBkZWdlbmVyYXRlcyBpbnRvIGNvcHlpbmcgYSBzaW5nbGUgdmFsdWUuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgordm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKTsKKworLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIGsgaXMgMC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIHZvaWQgQ29weUFycmF5KGNvbnN0IFQmIGZyb20sIFUqIHRvKSB7ICp0byA9IGZyb207IH0KKworLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgoraW5saW5lIHZvaWQgQ29weUFycmF5KGNvbnN0IFQoJmZyb20pW05dLCBVKCp0bylbTl0pIHsKKyAgaW50ZXJuYWw6OkNvcHlBcnJheShmcm9tLCBOLCAqdG8pOworfQorCisvLyBUaGlzIGhlbHBlciByZWR1Y2VzIGNvZGUgYmxvYXQuICBJZiB3ZSBpbnN0ZWFkIHB1dCBpdHMgbG9naWMgaW5zaWRlCisvLyB0aGUgcHJldmlvdXMgQ29weUFycmF5KCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcworLy8gd291bGQgbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Cit2b2lkIENvcHlBcnJheShjb25zdCBUKiBmcm9tLCBzaXplX3Qgc2l6ZSwgVSogdG8pIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc2l6ZTsgaSsrKSB7CisgICAgaW50ZXJuYWw6OkNvcHlBcnJheShmcm9tW2ldLCB0byArIGkpOworICB9Cit9CisKKy8vIFRoZSByZWxhdGlvbiBiZXR3ZWVuIGFuIE5hdGl2ZUFycmF5IG9iamVjdCAoc2VlIGJlbG93KSBhbmQgdGhlCisvLyBuYXRpdmUgYXJyYXkgaXQgcmVwcmVzZW50cy4KK2VudW0gUmVsYXRpb25Ub1NvdXJjZSB7CisgIGtSZWZlcmVuY2UsICAvLyBUaGUgTmF0aXZlQXJyYXkgcmVmZXJlbmNlcyB0aGUgbmF0aXZlIGFycmF5LgorICBrQ29weSAgICAgICAgLy8gVGhlIE5hdGl2ZUFycmF5IG1ha2VzIGEgY29weSBvZiB0aGUgbmF0aXZlIGFycmF5IGFuZAorICAgICAgICAgICAgICAgLy8gb3ducyB0aGUgY29weS4KK307CisKKy8vIEFkYXB0cyBhIG5hdGl2ZSBhcnJheSB0byBhIHJlYWQtb25seSBTVEwtc3R5bGUgY29udGFpbmVyLiAgSW5zdGVhZAorLy8gb2YgdGhlIGNvbXBsZXRlIFNUTCBjb250YWluZXIgY29uY2VwdCwgdGhpcyBhZGFwdG9yIG9ubHkgaW1wbGVtZW50cworLy8gbWVtYmVycyB1c2VmdWwgZm9yIEdvb2dsZSBNb2NrJ3MgY29udGFpbmVyIG1hdGNoZXJzLiAgTmV3IG1lbWJlcnMKKy8vIHNob3VsZCBiZSBhZGRlZCBhcyBuZWVkZWQuICBUbyBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIHdlIG9ubHkKKy8vIHN1cHBvcnQgRWxlbWVudCBiZWluZyBhIHJhdyB0eXBlIChpLmUuIGhhdmluZyBubyB0b3AtbGV2ZWwgY29uc3Qgb3IKKy8vIHJlZmVyZW5jZSBtb2RpZmllcikuICBJdCdzIHRoZSBjbGllbnQncyByZXNwb25zaWJpbGl0eSB0byBzYXRpc2Z5CisvLyB0aGlzIHJlcXVpcmVtZW50LiAgRWxlbWVudCBjYW4gYmUgYW4gYXJyYXkgdHlwZSBpdHNlbGYgKGhlbmNlCisvLyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHN1cHBvcnRlZCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2NsYXNzIE5hdGl2ZUFycmF5IHsKKyBwdWJsaWM6CisgIC8vIFNUTC1zdHlsZSBjb250YWluZXIgdHlwZWRlZnMuCisgIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOworICB0eXBlZGVmIEVsZW1lbnQqIGl0ZXJhdG9yOworICB0eXBlZGVmIGNvbnN0IEVsZW1lbnQqIGNvbnN0X2l0ZXJhdG9yOworCisgIC8vIENvbnN0cnVjdHMgZnJvbSBhIG5hdGl2ZSBhcnJheS4KKyAgTmF0aXZlQXJyYXkoY29uc3QgRWxlbWVudCogYXJyYXksIHNpemVfdCBjb3VudCwgUmVsYXRpb25Ub1NvdXJjZSByZWxhdGlvbikgeworICAgIEluaXQoYXJyYXksIGNvdW50LCByZWxhdGlvbik7CisgIH0KKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBOYXRpdmVBcnJheShjb25zdCBOYXRpdmVBcnJheSYgcmhzKSB7CisgICAgSW5pdChyaHMuYXJyYXlfLCByaHMuc2l6ZV8sIHJocy5yZWxhdGlvbl90b19zb3VyY2VfKTsKKyAgfQorCisgIH5OYXRpdmVBcnJheSgpIHsKKyAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIHVzZXIgZG9lc24ndCBpbnN0YW50aWF0ZSBOYXRpdmVBcnJheSB3aXRoIGEKKyAgICAvLyBjb25zdCBvciByZWZlcmVuY2UgdHlwZS4KKyAgICBzdGF0aWNfY2FzdDx2b2lkPihTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8RWxlbWVudCwKKyAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEVsZW1lbnQpPigpKTsKKyAgICBpZiAocmVsYXRpb25fdG9fc291cmNlXyA9PSBrQ29weSkKKyAgICAgIGRlbGV0ZVtdIGFycmF5XzsKKyAgfQorCisgIC8vIFNUTC1zdHlsZSBjb250YWluZXIgbWV0aG9kcy4KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFycmF5XzsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBhcnJheV8gKyBzaXplXzsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgTmF0aXZlQXJyYXkmIHJocykgY29uc3QgeworICAgIHJldHVybiBzaXplKCkgPT0gcmhzLnNpemUoKSAmJgorICAgICAgICBBcnJheUVxKGJlZ2luKCksIHNpemUoKSwgcmhzLmJlZ2luKCkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBJbml0aWFsaXplcyB0aGlzIG9iamVjdDsgbWFrZXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBhcnJheSBpZgorICAvLyAncmVsYXRpb24nIGlzIGtDb3B5LgorICB2b2lkIEluaXQoY29uc3QgRWxlbWVudCogYXJyYXksIHNpemVfdCBhX3NpemUsIFJlbGF0aW9uVG9Tb3VyY2UgcmVsYXRpb24pIHsKKyAgICBpZiAocmVsYXRpb24gPT0ga1JlZmVyZW5jZSkgeworICAgICAgYXJyYXlfID0gYXJyYXk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVsZW1lbnQqIGNvbnN0IGNvcHkgPSBuZXcgRWxlbWVudFthX3NpemVdOworICAgICAgQ29weUFycmF5KGFycmF5LCBhX3NpemUsIGNvcHkpOworICAgICAgYXJyYXlfID0gY29weTsKKyAgICB9CisgICAgc2l6ZV8gPSBhX3NpemU7CisgICAgcmVsYXRpb25fdG9fc291cmNlXyA9IHJlbGF0aW9uOworICB9CisKKyAgY29uc3QgRWxlbWVudCogYXJyYXlfOworICBzaXplX3Qgc2l6ZV87CisgIFJlbGF0aW9uVG9Tb3VyY2UgcmVsYXRpb25fdG9fc291cmNlXzsKKworICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5hdGl2ZUFycmF5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2RlZmluZSBHVEVTVF9NRVNTQUdFX0FUXyhmaWxlLCBsaW5lLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpBc3NlcnRIZWxwZXIocmVzdWx0X3R5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpIFwKKyAgICA9IDo6dGVzdGluZzo6TWVzc2FnZSgpCisKKyNkZWZpbmUgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgcmVzdWx0X3R5cGUpIFwKKyAgR1RFU1RfTUVTU0FHRV9BVF8oX19GSUxFX18sIF9fTElORV9fLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkKKworI2RlZmluZSBHVEVTVF9GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcCisgIHJldHVybiBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlKQorCisjZGVmaW5lIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKG1lc3NhZ2UpIFwKKyAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKKworI2RlZmluZSBHVEVTVF9TVUNDRVNTXyhtZXNzYWdlKSBcCisgIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKQorCisvLyBTdXBwcmVzc2VzIE1TVkMgd2FybmluZ3MgNDA3MiAodW5yZWFjaGFibGUgY29kZSkgZm9yIHRoZSBjb2RlIGZvbGxvd2luZworLy8gc3RhdGVtZW50IGlmIGl0IHJldHVybnMgb3IgdGhyb3dzIChvciBkb2Vzbid0IHJldHVybiBvciB0aHJvdyBpbiBzb21lCisvLyBzaXR1YXRpb25zKS4KKyNkZWZpbmUgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH0KKworI2RlZmluZSBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpDb25zdENoYXJQdHIgZ3Rlc3RfbXNnID0gIiIpIHsgXAorICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gZmFsc2U7IFwKKyAgICB0cnkgeyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICB9IFwKKyAgICBjYXRjaCAoZXhwZWN0ZWRfZXhjZXB0aW9uIGNvbnN0JikgeyBcCisgICAgICBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSB0cnVlOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBndGVzdF9tc2cudmFsdWUgPSBcCisgICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCisgICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiI7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgICBpZiAoIWd0ZXN0X2NhdWdodF9leHBlY3RlZCkgeyBcCisgICAgICBndGVzdF9tc2cudmFsdWUgPSBcCisgICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCisgICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiI7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbChndGVzdF9tc2cudmFsdWUpCisKKyNkZWZpbmUgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgdHJ5IHsgXAorICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCisgICAgfSBcCisgICAgY2F0Y2ggKC4uLikgeyBcCisgICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vdGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOiBcCisgICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24uXG4iIFwKKyAgICAgICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3MuIikKKworI2RlZmluZSBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgYm9vbCBndGVzdF9jYXVnaHRfYW55ID0gZmFsc2U7IFwKKyAgICB0cnkgeyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICB9IFwKKyAgICBjYXRjaCAoLi4uKSB7IFwKKyAgICAgIGd0ZXN0X2NhdWdodF9hbnkgPSB0cnVlOyBcCisgICAgfSBcCisgICAgaWYgKCFndGVzdF9jYXVnaHRfYW55KSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk7IFwKKyAgICB9IFwKKyAgfSBlbHNlIFwKKyAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rhbnl0aHJvd18sIF9fTElORV9fKTogXAorICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24uXG4iIFwKKyAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2Vzbid0LiIpCisKKworLy8gSW1wbGVtZW50cyBCb29sZWFuIHRlc3QgYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLiBleHByZXNzaW9uIGNhbiBiZQorLy8gZWl0aGVyIGEgYm9vbGVhbiBleHByZXNzaW9uIG9yIGFuIEFzc2VydGlvblJlc3VsdC4gdGV4dCBpcyBhIHRleHR1YWwKKy8vIHJlcHJlc2VuYXRpb24gb2YgZXhwcmVzc2lvbiBhcyBpdCB3YXMgcGFzc2VkIGludG8gdGhlIEVYUEVDVF9UUlVFLgorI2RlZmluZSBHVEVTVF9URVNUX0JPT0xFQU5fKGV4cHJlc3Npb24sIHRleHQsIGFjdHVhbCwgZXhwZWN0ZWQsIGZhaWwpIFwKKyAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAorICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXJfID0gXAorICAgICAgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQoZXhwcmVzc2lvbikpIFwKKyAgICA7IFwKKyAgZWxzZSBcCisgICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoXAorICAgICAgICBndGVzdF9hcl8sIHRleHQsICNhY3R1YWwsICNleHBlY3RlZCkuY19zdHIoKSkKKworI2RlZmluZSBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgZmFpbCkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlciBndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXI7IFwKKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICBpZiAoZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyLmhhc19uZXdfZmF0YWxfZmFpbHVyZSgpKSB7IFwKKyAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTsgXAorICAgIH0gXAorICB9IGVsc2UgXAorICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk6IFwKKyAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbCAiIFwKKyAgICAgICAgICAgImZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZC5cbiIgXAorICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXMuIikKKworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBnaXZlbiB0ZXN0LgorI2RlZmluZSBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgdGVzdF9jYXNlX25hbWUjI18jI3Rlc3RfbmFtZSMjX1Rlc3QKKworLy8gSGVscGVyIG1hY3JvIGZvciBkZWZpbmluZyB0ZXN0cy4KKyNkZWZpbmUgR1RFU1RfVEVTVF8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSwgcGFyZW50X2NsYXNzLCBwYXJlbnRfaWQpXAorY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSA6IHB1YmxpYyBwYXJlbnRfY2xhc3Mge1wKKyBwdWJsaWM6XAorICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge31cCisgcHJpdmF0ZTpcCisgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpO1wKKyAgc3RhdGljIDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mb18gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87XAorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKKyAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpO1wKK307XAorXAorOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKKyAgOjp0ZXN0X2luZm9fID1cCisgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oXAorICAgICAgICAjdGVzdF9jYXNlX25hbWUsICN0ZXN0X25hbWUsIE5VTEwsIE5VTEwsIFwKKyAgICAgICAgKHBhcmVudF9pZCksIFwKKyAgICAgICAgcGFyZW50X2NsYXNzOjpTZXRVcFRlc3RDYXNlLCBcCisgICAgICAgIHBhcmVudF9jbGFzczo6VGVhckRvd25UZXN0Q2FzZSwgXAorICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdEZhY3RvcnlJbXBsPFwKKyAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KTtcCit2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCisvLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQorLy8KKy8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIGRlYXRoIHRlc3RzLiAgSXQgaXMKKy8vICNpbmNsdWRlZCBieSBndGVzdC5oIHNvIGEgdXNlciBkb2Vzbid0IG5lZWQgdG8gaW5jbHVkZSB0aGlzCisvLyBkaXJlY3RseS4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCisKKy8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCisvLworLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBpbnRlcm5hbCB1dGlsaXRpZXMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcKKy8vIGRlYXRoIHRlc3RzLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitHVEVTVF9ERUNMQVJFX3N0cmluZ18oaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpOworCisvLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuCitjb25zdCBjaGFyIGtEZWF0aFRlc3RTdHlsZUZsYWdbXSA9ICJkZWF0aF90ZXN0X3N0eWxlIjsKK2NvbnN0IGNoYXIga0RlYXRoVGVzdFVzZUZvcmtbXSA9ICJkZWF0aF90ZXN0X3VzZV9mb3JrIjsKK2NvbnN0IGNoYXIga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZ1tdID0gImludGVybmFsX3J1bl9kZWF0aF90ZXN0IjsKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIERlYXRoVGVzdCBpcyBhIGNsYXNzIHRoYXQgaGlkZXMgbXVjaCBvZiB0aGUgY29tcGxleGl0eSBvZiB0aGUKKy8vIEdURVNUX0RFQVRIX1RFU1RfIG1hY3JvLiAgSXQgaXMgYWJzdHJhY3Q7IGl0cyBzdGF0aWMgQ3JlYXRlIG1ldGhvZAorLy8gcmV0dXJucyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUgcHJldmFpbGluZyBkZWF0aCB0ZXN0CisvLyBzdHlsZSwgYXMgZGVmaW5lZCBieSB0aGUgLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGFuZC9vcgorLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFncy4KKworLy8gSW4gZGVzY3JpYmluZyB0aGUgcmVzdWx0cyBvZiBkZWF0aCB0ZXN0cywgdGhlc2UgdGVybXMgYXJlIHVzZWQgd2l0aAorLy8gdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbnM6CisvLworLy8gZXhpdCBzdGF0dXM6ICBUaGUgaW50ZWdlciBleGl0IGluZm9ybWF0aW9uIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkCisvLyAgICAgICAgICAgICAgIGJ5IHdhaXQoMikKKy8vIGV4aXQgY29kZTogICAgVGhlIGludGVnZXIgY29kZSBwYXNzZWQgdG8gZXhpdCgzKSwgX2V4aXQoMiksIG9yCisvLyAgICAgICAgICAgICAgIHJldHVybmVkIGZyb20gbWFpbigpCitjbGFzcyBHVEVTVF9BUElfIERlYXRoVGVzdCB7CisgcHVibGljOgorICAvLyBDcmVhdGUgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZGV0ZXJtaW5pbmcgdGhlCisgIC8vIGFwcHJvcHJpYXRlIGFjdGlvbiB0byB0YWtlIGZvciB0aGUgY3VycmVudCBkZWF0aCB0ZXN0OyBmb3IgZXhhbXBsZSwKKyAgLy8gaWYgdGhlIGd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgZmxhZyBpcyBzZXQgdG8gYW4gaW52YWxpZCB2YWx1ZS4KKyAgLy8gVGhlIExhc3RNZXNzYWdlIG1ldGhvZCB3aWxsIHJldHVybiBhIG1vcmUgZGV0YWlsZWQgbWVzc2FnZSBpbiB0aGF0CisgIC8vIGNhc2UuICBPdGhlcndpc2UsIHRoZSBEZWF0aFRlc3QgcG9pbnRlciBwb2ludGVkIHRvIGJ5IHRoZSAidGVzdCIKKyAgLy8gYXJndW1lbnQgaXMgc2V0LiAgSWYgdGhlIGRlYXRoIHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQsIHRoZSBwb2ludGVyCisgIC8vIGlzIHNldCB0byBOVUxMOyBvdGhlcndpc2UsIGl0IGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiBhIG5ldyBjb25jcmV0ZQorICAvLyBEZWF0aFRlc3Qgb2JqZWN0IHRoYXQgY29udHJvbHMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCB0ZXN0LgorICBzdGF0aWMgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCk7CisgIERlYXRoVGVzdCgpOworICB2aXJ0dWFsIH5EZWF0aFRlc3QoKSB7IH0KKworICAvLyBBIGhlbHBlciBjbGFzcyB0aGF0IGFib3J0cyBhIGRlYXRoIHRlc3Qgd2hlbiBpdCdzIGRlbGV0ZWQuCisgIGNsYXNzIFJldHVyblNlbnRpbmVsIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBSZXR1cm5TZW50aW5lbChEZWF0aFRlc3QqIHRlc3QpIDogdGVzdF8odGVzdCkgeyB9CisgICAgflJldHVyblNlbnRpbmVsKCkgeyB0ZXN0Xy0+QWJvcnQoVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5UKTsgfQorICAgcHJpdmF0ZToKKyAgICBEZWF0aFRlc3QqIGNvbnN0IHRlc3RfOworICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUmV0dXJuU2VudGluZWwpOworICB9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOworCisgIC8vIEFuIGVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJvbGVzIHRoYXQgbWF5IGJlIHRha2VuIHdoZW4gYSBkZWF0aAorICAvLyB0ZXN0IGlzIGVuY291bnRlcmVkLiAgRVhFQ1VURSBtZWFucyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGxvZ2ljIHNob3VsZAorICAvLyBiZSBleGVjdXRlZCBpbW1lZGlhdGVseS4gIE9WRVJTRUUgbWVhbnMgdGhhdCB0aGUgcHJvZ3JhbSBzaG91bGQgcHJlcGFyZQorICAvLyB0aGUgYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgZm9yIGEgY2hpbGQgcHJvY2VzcyB0byBleGVjdXRlIHRoZSBkZWF0aAorICAvLyB0ZXN0LCB0aGVuIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLgorICBlbnVtIFRlc3RSb2xlIHsgT1ZFUlNFRV9URVNULCBFWEVDVVRFX1RFU1QgfTsKKworICAvLyBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgdGhyZWUgcmVhc29ucyB0aGF0IGEgdGVzdCBtaWdodCBiZSBhYm9ydGVkLgorICBlbnVtIEFib3J0UmVhc29uIHsKKyAgICBURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQsCisgICAgVEVTVF9USFJFV19FWENFUFRJT04sCisgICAgVEVTVF9ESURfTk9UX0RJRQorICB9OworCisgIC8vIEFzc3VtZXMgb25lIG9mIHRoZSBhYm92ZSByb2xlcy4KKyAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCkgPSAwOworCisgIC8vIFdhaXRzIGZvciB0aGUgZGVhdGggdGVzdCB0byBmaW5pc2ggYW5kIHJldHVybnMgaXRzIHN0YXR1cy4KKyAgdmlydHVhbCBpbnQgV2FpdCgpID0gMDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGRlYXRoIHRlc3QgcGFzc2VkOyB0aGF0IGlzLCB0aGUgdGVzdCBwcm9jZXNzCisgIC8vIGV4aXRlZCBkdXJpbmcgdGhlIHRlc3QsIGl0cyBleGl0IHN0YXR1cyBtYXRjaGVzIGEgdXNlci1zdXBwbGllZAorICAvLyBwcmVkaWNhdGUsIGFuZCBpdHMgc3RkZXJyIG91dHB1dCBtYXRjaGVzIGEgdXNlci1zdXBwbGllZCByZWd1bGFyCisgIC8vIGV4cHJlc3Npb24uCisgIC8vIFRoZSB1c2VyLXN1cHBsaWVkIHByZWRpY2F0ZSBtYXkgYmUgYSBtYWNybyBleHByZXNzaW9uIHJhdGhlcgorICAvLyB0aGFuIGEgZnVuY3Rpb24gcG9pbnRlciBvciBmdW5jdG9yLCBvciBlbHNlIFdhaXQgYW5kIFBhc3NlZCBjb3VsZAorICAvLyBiZSBjb21iaW5lZC4KKyAgdmlydHVhbCBib29sIFBhc3NlZChib29sIGV4aXRfc3RhdHVzX29rKSA9IDA7CisKKyAgLy8gU2lnbmFscyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGRpZCBub3QgZGllIGFzIGV4cGVjdGVkLgorICB2aXJ0dWFsIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSA9IDA7CisKKyAgLy8gUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG91dGNvbWUgbWVzc2FnZSByZWdhcmRpbmcgdGhlIG91dGNvbWUgb2YKKyAgLy8gdGhlIGxhc3QgZGVhdGggdGVzdC4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIExhc3RNZXNzYWdlKCk7CisKKyAgc3RhdGljIHZvaWQgc2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGNvbnN0IFN0cmluZyYgbWVzc2FnZSk7CisKKyBwcml2YXRlOgorICAvLyBBIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIG91dGNvbWUgb2YgdGhlIGxhc3QgZGVhdGggdGVzdC4KKyAgc3RhdGljIFN0cmluZyBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWF0aFRlc3QpOworfTsKKworLy8gRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGRlYXRoIHRlc3RzLiAgTWF5IGJlIG1vY2tlZCBvdXQgZm9yIHRlc3RpbmcuCitjbGFzcyBEZWF0aFRlc3RGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkRlYXRoVGVzdEZhY3RvcnkoKSB7IH0KKyAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgPSAwOworfTsKKworLy8gQSBjb25jcmV0ZSBEZWF0aFRlc3RGYWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciBub3JtYWwgdXNlLgorY2xhc3MgRGVmYXVsdERlYXRoVGVzdEZhY3RvcnkgOiBwdWJsaWMgRGVhdGhUZXN0RmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKK307CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBleGl0X3N0YXR1cyBkZXNjcmliZXMgYSBwcm9jZXNzIHRoYXQgd2FzIHRlcm1pbmF0ZWQKKy8vIGJ5IGEgc2lnbmFsLCBvciBleGl0ZWQgbm9ybWFsbHkgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlLgorR1RFU1RfQVBJXyBib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cyk7CisKKy8vIFRyYXBzIEMrKyBleGNlcHRpb25zIGVzY2FwaW5nIHN0YXRlbWVudCBhbmQgcmVwb3J0cyB0aGVtIGFzIHRlc3QKKy8vIGZhaWx1cmVzLiBOb3RlIHRoYXQgdHJhcHBpbmcgU0VIIGV4Y2VwdGlvbnMgaXMgbm90IGltcGxlbWVudGVkIGhlcmUuCisjIGlmIEdURVNUX0hBU19FWENFUFRJT05TCisjICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCisgIHRyeSB7IFwKKyAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgfSBjYXRjaCAoY29uc3QgOjpzdGQ6OmV4Y2VwdGlvbiYgZ3Rlc3RfZXhjZXB0aW9uKSB7IFwKKyAgICBmcHJpbnRmKFwKKyAgICAgICAgc3RkZXJyLCBcCisgICAgICAgICJcbiVzOiBDYXVnaHQgc3RkOjpleGNlcHRpb24tZGVyaXZlZCBleGNlcHRpb24gZXNjYXBpbmcgdGhlICIgXAorICAgICAgICAiZGVhdGggdGVzdCBzdGF0ZW1lbnQuIEV4Y2VwdGlvbiBtZXNzYWdlOiAlc1xuIiwgXAorICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKS5jX3N0cigpLCBcCisgICAgICAgIGd0ZXN0X2V4Y2VwdGlvbi53aGF0KCkpOyBcCisgICAgZmZsdXNoKHN0ZGVycik7IFwKKyAgICBkZWF0aF90ZXN0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfVEhSRVdfRVhDRVBUSU9OKTsgXAorICB9IGNhdGNoICguLi4pIHsgXAorICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcCisgIH0KKworIyBlbHNlCisjICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCisgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQorCisjIGVuZGlmCisKKy8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlRfREVBVEgqLCBFWFBFQ1RfREVBVEgqLAorLy8gQVNTRVJUX0VYSVQqLCBhbmQgRVhQRUNUX0VYSVQqLgorIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBmYWlsKSBcCisgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKKyAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUmIGd0ZXN0X3JlZ2V4ID0gKHJlZ2V4KTsgXAorICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdCogZ3Rlc3RfZHQ7IFwKKyAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6Q3JlYXRlKCNzdGF0ZW1lbnQsICZndGVzdF9yZWdleCwgXAorICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICZndGVzdF9kdCkpIHsgXAorICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcCisgICAgfSBcCisgICAgaWYgKGd0ZXN0X2R0ICE9IE5VTEwpIHsgXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0PiBcCisgICAgICAgICAgZ3Rlc3RfZHRfcHRyKGd0ZXN0X2R0KTsgXAorICAgICAgc3dpdGNoIChndGVzdF9kdC0+QXNzdW1lUm9sZSgpKSB7IFwKKyAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVDogXAorICAgICAgICAgIGlmICghZ3Rlc3RfZHQtPlBhc3NlZChwcmVkaWNhdGUoZ3Rlc3RfZHQtPldhaXQoKSkpKSB7IFwKKyAgICAgICAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTsgXAorICAgICAgICAgIH0gXAorICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIGNhc2UgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpFWEVDVVRFX1RFU1Q6IHsgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6UmV0dXJuU2VudGluZWwgXAorICAgICAgICAgICAgICBndGVzdF9zZW50aW5lbChndGVzdF9kdCk7IFwKKyAgICAgICAgICBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGd0ZXN0X2R0KTsgXAorICAgICAgICAgIGd0ZXN0X2R0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfRElEX05PVF9ESUUpOyBcCisgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGRlZmF1bHQ6IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gZWxzZSBcCisgICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTogXAorICAgICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkpCisvLyBUaGUgc3ltYm9sICJmYWlsIiBoZXJlIGV4cGFuZHMgdG8gc29tZXRoaW5nIGludG8gd2hpY2ggYSBtZXNzYWdlCisvLyBjYW4gYmUgc3RyZWFtZWQuCisKKy8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgY29udGVudHMgb2YgdGhlCisvLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWcsIGFzIGl0IGV4aXN0ZWQgd2hlbgorLy8gUlVOX0FMTF9URVNUUyB3YXMgY2FsbGVkLgorY2xhc3MgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIHsKKyBwdWJsaWM6CisgIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyhjb25zdCBTdHJpbmcmIGFfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYV93cml0ZV9mZCkKKyAgICAgIDogZmlsZV8oYV9maWxlKSwgbGluZV8oYV9saW5lKSwgaW5kZXhfKGFuX2luZGV4KSwKKyAgICAgICAgd3JpdGVfZmRfKGFfd3JpdGVfZmQpIHt9CisKKyAgfkludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIHsKKyAgICBpZiAod3JpdGVfZmRfID49IDApCisgICAgICBwb3NpeDo6Q2xvc2Uod3JpdGVfZmRfKTsKKyAgfQorCisgIFN0cmluZyBmaWxlKCkgY29uc3QgeyByZXR1cm4gZmlsZV87IH0KKyAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQorICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBpbmRleF87IH0KKyAgaW50IHdyaXRlX2ZkKCkgY29uc3QgeyByZXR1cm4gd3JpdGVfZmRfOyB9CisKKyBwcml2YXRlOgorICBTdHJpbmcgZmlsZV87CisgIGludCBsaW5lXzsKKyAgaW50IGluZGV4XzsKKyAgaW50IHdyaXRlX2ZkXzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyk7Cit9OworCisvLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzCisvLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmCisvLyB0aGUgZmxhZyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCitJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCk7CisKKyNlbHNlICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGltcGxlbWVudGluZyBtYWNyb3Mgc3VjaCBhcworLy8gRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBhbmQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBvbiBzeXN0ZW1zIHdoZXJlCisvLyBkZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhvc2UgbWFjcm9zIG11c3QgY29tcGlsZSBvbiBzdWNoIHN5c3RlbXMKKy8vIGlmZiBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCBjb21waWxlIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBvbgorLy8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgZGVhdGggdGVzdHMuIFRoaXMgYWxsb3dzIG9uZSB0byB3cml0ZSBzdWNoIGEgbWFjcm8KKy8vIG9uIGEgc3lzdGVtIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBhbmQgYmUgc3VyZSB0aGF0IGl0IHdpbGwKKy8vIGNvbXBpbGUgb24gYSBkZWF0aC10ZXN0IHN1cHBvcnRpbmcgc3lzdGVtLgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgIHN0YXRlbWVudCAtICBBIHN0YXRlbWVudCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdGVzdAorLy8gICAgICAgICAgICAgICAgZm9yIHByb2dyYW0gdGVybWluYXRpb24uIFRoaXMgbWFjcm8gaGFzIHRvIG1ha2Ugc3VyZSB0aGlzCisvLyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgaXMgY29tcGlsZWQgYnV0IG5vdCBleGVjdXRlZCwgdG8gZW5zdXJlIHRoYXQKKy8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgY29tcGlsZXMgd2l0aCBhIGNlcnRhaW4KKy8vICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpZmYgRVhQRUNUX0RFQVRIIGNvbXBpbGVzIHdpdGggaXQuCisvLyAgIHJlZ2V4ICAgICAtICBBIHJlZ2V4IHRoYXQgYSBtYWNybyBzdWNoIGFzIEVYUEVDVF9ERUFUSCB3b3VsZCB1c2UgdG8gdGVzdAorLy8gICAgICAgICAgICAgICAgdGhlIG91dHB1dCBvZiBzdGF0ZW1lbnQuICBUaGlzIHBhcmFtZXRlciBoYXMgdG8gYmUKKy8vICAgICAgICAgICAgICAgIGNvbXBpbGVkIGJ1dCBub3QgZXZhbHVhdGVkIGJ5IHRoaXMgbWFjcm8sIHRvIGVuc3VyZSB0aGF0CisvLyAgICAgICAgICAgICAgICB0aGlzIG1hY3JvIG9ubHkgYWNjZXB0cyBleHByZXNzaW9ucyB0aGF0IGEgbWFjcm8gc3VjaCBhcworLy8gICAgICAgICAgICAgICAgRVhQRUNUX0RFQVRIIHdvdWxkIGFjY2VwdC4KKy8vICAgdGVybWluYXRvciAtIE11c3QgYmUgYW4gZW1wdHkgc3RhdGVtZW50IGZvciBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVECisvLyAgICAgICAgICAgICAgICBhbmQgYSByZXR1cm4gc3RhdGVtZW50IGZvciBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVELgorLy8gICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCB3aWxsIG5vdAorLy8gICAgICAgICAgICAgICAgY29tcGlsZSBpbnNpZGUgZnVuY3Rpb25zIHdoZXJlIEFTU0VSVF9ERUFUSCBkb2Vzbid0CisvLyAgICAgICAgICAgICAgICBjb21waWxlLgorLy8KKy8vICBUaGUgYnJhbmNoIHRoYXQgaGFzIGFuIGFsd2F5cyBmYWxzZSBjb25kaXRpb24gaXMgdXNlZCB0byBlbnN1cmUgdGhhdAorLy8gIHN0YXRlbWVudCBhbmQgcmVnZXggYXJlIGNvbXBpbGVkIChhbmQgdGh1cyBzeW50YWN0aWNhbGx5IGNvcnJlY3QpIGJ1dAorLy8gIG5ldmVyIGV4ZWN1dGVkLiBUaGUgdW5yZWFjaGFibGUgY29kZSBtYWNybyBwcm90ZWN0cyB0aGUgdGVybWluYXRvcgorLy8gIHN0YXRlbWVudCBmcm9tIGdlbmVyYXRpbmcgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgaW4gY2FzZQorLy8gIHN0YXRlbWVudCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJucyBvciB0aHJvd3MuIFRoZSBNZXNzYWdlIGNvbnN0cnVjdG9yIGF0CisvLyAgdGhlIGVuZCBhbGxvd3MgdGhlIHN5bnRheCBvZiBzdHJlYW1pbmcgYWRkaXRpb25hbCBtZXNzYWdlcyBpbnRvIHRoZQorLy8gIG1hY3JvLCBmb3IgY29tcGlsYXRpb25hbCBjb21wYXRpYmlsaXR5IHdpdGggRVhQRUNUX0RFQVRIL0FTU0VSVF9ERUFUSC4KKyMgZGVmaW5lIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHRlcm1pbmF0b3IpIFwKKyAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCisgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIFwKKyAgICAgICAgICA8PCAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS5cbiIgXAorICAgICAgICAgIDw8ICJTdGF0ZW1lbnQgJyIgI3N0YXRlbWVudCAiJyBjYW5ub3QgYmUgdmVyaWZpZWQuIjsgXAorICAgIH0gZWxzZSBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkgeyBcCisgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTo6UGFydGlhbE1hdGNoKCIuKiIsIChyZWdleCkpOyBcCisgICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKKyAgICAgIHRlcm1pbmF0b3I7IFwKKyAgICB9IGVsc2UgXAorICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBzdHlsZSBvZiBkZWF0aCB0ZXN0cy4gIFZhbGlkIHZhbHVlcyBhcmUgInRocmVhZHNhZmUiLAorLy8gbWVhbmluZyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Mgd2lsbCByZS1leGVjdXRlIHRoZSB0ZXN0IGJpbmFyeQorLy8gZnJvbSB0aGUgc3RhcnQsIHJ1bm5pbmcgb25seSBhIHNpbmdsZSBkZWF0aCB0ZXN0LCBvciAiZmFzdCIsCisvLyBtZWFuaW5nIHRoYXQgdGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBleGVjdXRlIHRoZSB0ZXN0IGxvZ2ljIGltbWVkaWF0ZWx5CisvLyBhZnRlciBmb3JraW5nLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGRlYXRoX3Rlc3Rfc3R5bGUpOworCisjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBkZWF0aCB0ZXN0cy4KKworLy8gSGVyZSdzIHdoYXQgaGFwcGVucyB3aGVuIGFuIEFTU0VSVF9ERUFUSCogb3IgRVhQRUNUX0RFQVRIKiBpcworLy8gZXhlY3V0ZWQ6CisvLworLy8gICAxLiBJdCBnZW5lcmF0ZXMgYSB3YXJuaW5nIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYWN0aXZlCisvLyAgIHRocmVhZC4gIFRoaXMgaXMgYmVjYXVzZSBpdCdzIHNhZmUgdG8gZm9yaygpIG9yIGNsb25lKCkgb25seQorLy8gICB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHRocmVhZC4KKy8vCisvLyAgIDIuIFRoZSBwYXJlbnQgcHJvY2VzcyBjbG9uZSgpcyBhIHN1Yi1wcm9jZXNzIGFuZCBydW5zIHRoZSBkZWF0aAorLy8gICB0ZXN0IGluIGl0OyB0aGUgc3ViLXByb2Nlc3MgZXhpdHMgd2l0aCBjb2RlIDAgYXQgdGhlIGVuZCBvZiB0aGUKKy8vICAgZGVhdGggdGVzdCwgaWYgaXQgaGFzbid0IGV4aXRlZCBhbHJlYWR5LgorLy8KKy8vICAgMy4gVGhlIHBhcmVudCBwcm9jZXNzIHdhaXRzIGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlLgorLy8KKy8vICAgNC4gVGhlIHBhcmVudCBwcm9jZXNzIGNoZWNrcyB0aGUgZXhpdCBjb2RlIGFuZCBlcnJvciBtZXNzYWdlIG9mCisvLyAgIHRoZSBzdWItcHJvY2Vzcy4KKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEFTU0VSVF9ERUFUSChzZXJ2ZXIuU2VuZE1lc3NhZ2UoNTYsICJIZWxsbyIpLCAiSW52YWxpZCBwb3J0IG51bWJlciIpOworLy8gICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworLy8gICAgIEVYUEVDVF9ERUFUSChzZXJ2ZXIuUHJvY2Vzc1JlcXVlc3QoaSksCisvLyAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVlc3QgLiogaW4gUHJvY2Vzc1JlcXVlc3QoKSIpCisvLyAgICAgICAgIDw8ICJGYWlsZWQgdG8gZGllIG9uIHJlcXVlc3QgIiA8PCBpKTsKKy8vICAgfQorLy8KKy8vICAgQVNTRVJUX0VYSVQoc2VydmVyLkV4aXROb3coKSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIkV4aXRpbmciKTsKKy8vCisvLyAgIGJvb2wgS2lsbGVkQnlTSUdIVVAoaW50IGV4aXRfY29kZSkgeworLy8gICAgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X2NvZGUpICYmIFdURVJNU0lHKGV4aXRfY29kZSkgPT0gU0lHSFVQOworLy8gICB9CisvLworLy8gICBBU1NFUlRfRVhJVChjbGllbnQuSGFuZ1VwU2VydmVyKCksIEtpbGxlZEJ5U0lHSFVQLCAiSGFuZ2luZyB1cCEiKTsKKy8vCisvLyBPbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGluIGRlYXRoIHRlc3RzOgorLy8KKy8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LAorLy8gICB3aGljaCB1c2VzIHRoZSBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguCisvLworLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleAorLy8gICBzeW50YXggaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBHb29nbGUgVGVzdC4gIFRoaXMgbGltaXRlZAorLy8gICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZW5vdWdoIG1vc3Qgb2YgdGhlIHRpbWUgd2hlbiB3cml0aW5nCisvLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQorLy8gICBvciBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydAorLy8gICB1bmlvbiAoInh8eSIpLCBncm91cGluZyAoIih4eSkiKSwgYnJhY2tldHMgKCJbeHldIiksIGFuZAorLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4KKy8vCisvLyAgIEJlbG93IGlzIHRoZSBzeW50YXggdGhhdCB3ZSBkbyBzdXBwb3J0LiAgV2UgY2hvc2UgaXQgdG8gYmUgYQorLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvCisvLyAgIGxlYXJuIHdoZXJldmVyIHlvdSBjb21lIGZyb20uICBJbiB0aGUgZm9sbG93aW5nOiAnQScgZGVub3RlcyBhCisvLyAgIGxpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKC4pLCBvciBhIHNpbmdsZSBcXCBlc2NhcGUgc2VxdWVuY2U7CisvLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yCisvLyAgIG5hdHVyYWwgbnVtYmVycy4KKy8vCisvLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYworLy8gICAgIFxcZCAgIG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXEQgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQKKy8vICAgICBcXGYgICBtYXRjaGVzIFxmCisvLyAgICAgXFxuICAgbWF0Y2hlcyBcbgorLy8gICAgIFxcciAgIG1hdGNoZXMgXHIKKy8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4KKy8vICAgICBcXFMgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UKKy8vICAgICBcXHQgICBtYXRjaGVzIFx0CisvLyAgICAgXFx2ICAgbWF0Y2hlcyBcdgorLy8gICAgIFxcdyAgIG1hdGNoZXMgYW55IGxldHRlciwgXywgb3IgZGVjaW1hbCBkaWdpdAorLy8gICAgIFxcVyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IFxcdyBkb2Vzbid0IG1hdGNoCisvLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uCisvLyAgICAgLiAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgXG4KKy8vICAgICBBPyAgICBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBBCisvLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQorLy8gICAgIEErICAgIG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIEEKKy8vICAgICBeICAgICBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKKy8vICAgICB4eSAgICBtYXRjaGVzIHggZm9sbG93ZWQgYnkgeQorLy8KKy8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcworLy8gICBub3QgaW1wbGVtZW50ZWQgYnkgdXMsIHlvdSB3aWxsIGdldCBhIHJ1bi10aW1lIGZhaWx1cmUuICBJbiB0aGF0CisvLyAgIGNhc2UsIHBsZWFzZSB0cnkgdG8gcmV3cml0ZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gdGhlCisvLyAgIGFib3ZlIHN5bnRheC4KKy8vCisvLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgKm5vdCogbWVhbnQgdG8gYmUgYXMgaGlnaGx5IHR1bmVkIG9yIHJvYnVzdAorLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQorLy8gICBkZWF0aCB0ZXN0LCB3aGljaCBhbHJlYWR5IGluY3VycyBzaWduaWZpY2FudCBvdmVyaGVhZCBieSBsYXVuY2hpbmcKKy8vICAgYSBjaGlsZCBwcm9jZXNzLgorLy8KKy8vIEtub3duIGNhdmVhdHM6CisvLworLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QKKy8vICAgcHJvZ3JhbSBmcm9tIGFyZ3ZbMF0gYW5kIHJlLWV4ZWN1dGVzIGl0IGluIHRoZSBzdWItcHJvY2Vzcy4gIEZvcgorLy8gICBzaW1wbGljaXR5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSAorLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdAorLy8gICBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lCisvLyAgIHBhdGggc2VwYXJhdG9yIChlLmcuIHBhdGgvdG8vZm9vX3Rlc3QgYW5kCisvLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMKKy8vICAgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBwZW9wbGUgdXN1YWxseSBkb24ndCBwdXQgdGhlIHRlc3QgYmluYXJ5CisvLyAgIGRpcmVjdG9yeSBpbiBQQVRILgorLy8KKy8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzIHNlYXJjaCB0aGUgUEFUSC4KKworLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuCisvLyBpbnRlZ2VyIGV4aXQgc3RhdHVzIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dAorLy8gdGhhdCBtYXRjaGVzIHJlZ2V4LgorIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCisgICAgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQorLy8gdGVzdCBjYXNlLCBpZiBhbnk6CisjIGRlZmluZSBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKKyAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorCisvLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIGVpdGhlciBieQorLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQorLy8gc2lnbmFsLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0IHRoYXQgbWF0Y2hlcyByZWdleC4KKyMgZGVmaW5lIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIExpa2UgQVNTRVJUX0RFQVRILCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCisvLyB0ZXN0IGNhc2UsIGlmIGFueToKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgICAgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCisKKy8vIFR3byBwcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHtBU1NFUlQsRVhQRUNUfV9FWElUKjoKKworLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4KK2NsYXNzIEdURVNUX0FQSV8gRXhpdGVkV2l0aENvZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7CisgIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXhpdGVkV2l0aENvZGUmIG90aGVyKTsKKworICBjb25zdCBpbnQgZXhpdF9jb2RlXzsKK307CisKKyMgaWYgIUdURVNUX09TX1dJTkRPV1MKKy8vIFRlc3RzIHRoYXQgYW4gZXhpdCBjb2RlIGRlc2NyaWJlcyBhbiBleGl0IGR1ZSB0byB0ZXJtaW5hdGlvbiBieSBhCisvLyBnaXZlbiBzaWduYWwuCitjbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEtpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pOworICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsKKyBwcml2YXRlOgorICBjb25zdCBpbnQgc2lnbnVtXzsKK307CisjIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUworCisvLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgorLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAorLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKKy8vIGluIGRlYnVnIG1vZGUuCisvLworLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQorLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKKy8vCisvLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7CisvLyAgIGlmIChzaWRlZWZmZWN0KSB7CisvLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKKy8vICAgfQorLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOworLy8gICByZXR1cm4gMTI7CisvLyB9CisvLworLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7CisvLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKKy8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KKy8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7CisvLworLy8gI2lmZGVmIE5ERUJVRworLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgorLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOworLy8gI2Vsc2UKKy8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgorLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7CisvLyAjZW5kaWYKKy8vIH0KKy8vCisvLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCisvLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCisvLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91CisvLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0CisvLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCisvLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgorLy8KKy8vIEVYUEVDVF9ERUJVR19ERUFUSCh7CisvLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KKy8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCisvLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKKy8vIH0sICJkZWF0aCIpOworLy8KKyMgaWZkZWYgTkRFQlVHCisKKyMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAorICBkbyB7IHN0YXRlbWVudDsgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKKworIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIGRvIHsgc3RhdGVtZW50OyB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQorCisjIGVsc2UKKworIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCisgIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorCisjICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCisKKyMgZW5kaWYgIC8vIE5ERUJVRyBmb3IgRVhQRUNUX0RFQlVHX0RFQVRICisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgYW5kCisvLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmCisvLyBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgdGhleSBqdXN0IGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMKKy8vIHVzZWZ1bCB3aGVuIHlvdSBhcmUgY29tYmluaW5nIGRlYXRoIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIG5vcm1hbCB0ZXN0CisvLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0LgorI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisjIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKKyAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQorI2Vsc2UKKyMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsICkKKyMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAorICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXworLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBNZXNzYWdlIGNsYXNzLgorLy8KKy8vIElNUE9SVEFOVCBOT1RFOiBEdWUgdG8gbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlLCB3ZSBoYXZlIHRvCisvLyBsZWF2ZSBzb21lIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaW4gdGhpcyBoZWFkZXIgZmlsZS4KKy8vIFRoZXkgYXJlIGNsZWFybHkgbWFya2VkIGJ5IGNvbW1lbnRzIGxpa2UgdGhpczoKKy8vCisvLyAgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKy8vCisvLyBTdWNoIGNvZGUgaXMgTk9UIG1lYW50IHRvIGJlIHVzZWQgYnkgYSB1c2VyIGRpcmVjdGx5LCBhbmQgaXMgc3ViamVjdAorLy8gdG8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLiAgVGhlcmVmb3JlIERPIE5PVCBERVBFTkQgT04gSVQgaW4gYSB1c2VyCisvLyBwcm9ncmFtIQorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKworI2luY2x1ZGUgPGxpbWl0cz4KKworCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIFRoZSBNZXNzYWdlIGNsYXNzIHdvcmtzIGxpa2UgYW4gb3N0cmVhbSByZXBlYXRlci4KKy8vCisvLyBUeXBpY2FsIHVzYWdlOgorLy8KKy8vICAgMS4gWW91IHN0cmVhbSBhIGJ1bmNoIG9mIHZhbHVlcyB0byBhIE1lc3NhZ2Ugb2JqZWN0LgorLy8gICAgICBJdCB3aWxsIHJlbWVtYmVyIHRoZSB0ZXh0IGluIGEgc3RyaW5nc3RyZWFtLgorLy8gICAyLiBUaGVuIHlvdSBzdHJlYW0gdGhlIE1lc3NhZ2Ugb2JqZWN0IHRvIGFuIG9zdHJlYW0uCisvLyAgICAgIFRoaXMgY2F1c2VzIHRoZSB0ZXh0IGluIHRoZSBNZXNzYWdlIHRvIGJlIHN0cmVhbWVkCisvLyAgICAgIHRvIHRoZSBvc3RyZWFtLgorLy8KKy8vIEZvciBleGFtcGxlOworLy8KKy8vICAgdGVzdGluZzo6TWVzc2FnZSBmb287CisvLyAgIGZvbyA8PCAxIDw8ICIgIT0gIiA8PCAyOworLy8gICBzdGQ6OmNvdXQgPDwgZm9vOworLy8KKy8vIHdpbGwgcHJpbnQgIjEgIT0gMiIuCisvLworLy8gTWVzc2FnZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5oZXJpdGVkIGZyb20uICBJbiBwYXJ0aWN1bGFyLCBpdHMKKy8vIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCisvLworLy8gTm90ZSB0aGF0IHN0cmluZ3N0cmVhbSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGdjYyBhbmQgaW4gTVNWQy4gIFlvdQorLy8gY2FuIHN0cmVhbSBhIE5VTEwgY2hhciBwb2ludGVyIHRvIGl0IGluIHRoZSBmb3JtZXIsIGJ1dCBub3QgaW4gdGhlCisvLyBsYXR0ZXIgKGl0IGNhdXNlcyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHlvdSBkbykuICBUaGUgTWVzc2FnZQorLy8gY2xhc3MgaGlkZXMgdGhpcyBkaWZmZXJlbmNlIGJ5IHRyZWF0aW5nIGEgTlVMTCBjaGFyIHBvaW50ZXIgYXMKKy8vICIobnVsbCkiLgorY2xhc3MgR1RFU1RfQVBJXyBNZXNzYWdlIHsKKyBwcml2YXRlOgorICAvLyBUaGUgdHlwZSBvZiBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgKGVuZGwsIGVuZHMsIGFuZCBmbHVzaCkgZm9yCisgIC8vIG5hcnJvdyBzdHJlYW1zLgorICB0eXBlZGVmIHN0ZDo6b3N0cmVhbSYgKCpCYXNpY05hcnJvd0lvTWFuaXApKHN0ZDo6b3N0cmVhbSYpOworCisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCisgIC8vIFdlIGFsbG9jYXRlIHRoZSBzdHJpbmdzdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIG90aGVyd2lzZSBlYWNoIHVzZSBvZgorICAvLyBBU1NFUlQvRVhQRUNUIGluIGEgcHJvY2VkdXJlIGFkZHMgb3ZlciAyMDAgYnl0ZXMgdG8gdGhlIHByb2NlZHVyZSdzCisgIC8vIHN0YWNrIGZyYW1lIGxlYWRpbmcgdG8gaHVnZSBzdGFjayBmcmFtZXMgaW4gc29tZSBjYXNlczsgZ2NjIGRvZXMgbm90IHJldXNlCisgIC8vIHRoZSBzdGFjayBzcGFjZS4KKyAgTWVzc2FnZSgpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7CisgICAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKKyAgICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCisgICAgKnNzXyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMik7CisgIH0KKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1zZykgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsgIC8vIE5PTElOVAorICAgICpzc18gPDwgbXNnLkdldFN0cmluZygpOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorICBleHBsaWNpdCBNZXNzYWdlKGNvbnN0IGNoYXIqIHN0cikgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsKKyAgICAqc3NfIDw8IHN0cjsKKyAgfQorCisjaWYgR1RFU1RfT1NfU1lNQklBTgorICAvLyBTdHJlYW1zIGEgdmFsdWUgKGVpdGhlciBhIHBvaW50ZXIgb3Igbm90KSB0byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJiB2YWx1ZSkgeworICAgIFN0cmVhbUhlbHBlcih0eXBlbmFtZSBpbnRlcm5hbDo6aXNfcG9pbnRlcjxUPjo6dHlwZSgpLCB2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZWxzZQorICAvLyBTdHJlYW1zIGEgbm9uLXBvaW50ZXIgdmFsdWUgdG8gdGhpcyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsKSB7CisgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXy5nZXQoKSwgdmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTdHJlYW1zIGEgcG9pbnRlciB2YWx1ZSB0byB0aGlzIG9iamVjdC4KKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBvdmVybG9hZCBvZiB0aGUgcHJldmlvdXMgb25lLiAgV2hlbiB5b3UKKyAgLy8gc3RyZWFtIGEgcG9pbnRlciB0byBhIE1lc3NhZ2UsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQgYXMgaXQKKyAgLy8gaXMgbW9yZSBzcGVjaWFsaXplZC4gIChUaGUgQysrIFN0YW5kYXJkLCBzZWN0aW9uCisgIC8vIFt0ZW1wLmZ1bmMub3JkZXJdLikgIElmIHlvdSBzdHJlYW0gYSBub24tcG9pbnRlciwgdGhlbiB0aGUKKyAgLy8gcHJldmlvdXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQuCisgIC8vCisgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgb3ZlcmxvYWQgaXMgdGhhdCBzdHJlYW1pbmcgYSBOVUxMIHBvaW50ZXIgdG8KKyAgLy8gb3N0cmVhbSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuICBEZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLCB5b3UKKyAgLy8gbWF5IGdldCAiMCIsICIobmlsKSIsICIobnVsbCkiLCBvciBhbiBhY2Nlc3MgdmlvbGF0aW9uLiAgVG8KKyAgLy8gZW5zdXJlIGNvbnNpc3RlbnQgcmVzdWx0IGFjcm9zcyBjb21waWxlcnMsIHdlIGFsd2F5cyB0cmVhdCBOVUxMCisgIC8vIGFzICIobnVsbCkiLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KFQqIGNvbnN0JiBwb2ludGVyKSB7ICAvLyBOT0xJTlQKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAqc3NfIDw8ICIobnVsbCkiOworICAgIH0gZWxzZSB7CisgICAgICA6OkdUZXN0U3RyZWFtVG9IZWxwZXIoc3NfLmdldCgpLCBwb2ludGVyKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBTaW5jZSB0aGUgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIGFyZSBvdmVybG9hZGVkIGZvciBib3RoIG5hcnJvdworICAvLyBhbmQgd2lkZSBzdHJlYW1zLCB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyBzcGVjaWFsaXplZCBkZWZpbml0aW9uCisgIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgLy8gdGVtcGxhdGl6ZWQgdmVyc2lvbiBhYm92ZS4gIFdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLCBzdHJlYW1pbmcKKyAgLy8gZW5kbCBvciBvdGhlciBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgdG8gTWVzc2FnZSB3aWxsIGNvbmZ1c2UgdGhlCisgIC8vIGNvbXBpbGVyLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChCYXNpY05hcnJvd0lvTWFuaXAgdmFsKSB7CisgICAgKnNzXyA8PCB2YWw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChib29sIGIpIHsKKyAgICByZXR1cm4gKnRoaXMgPDwgKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorCisgIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKKyAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgorICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorICBNZXNzYWdlJiBvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7CisgICAgcmV0dXJuICp0aGlzIDw8IGludGVybmFsOjpTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyh3aWRlX2Nfc3RyKTsKKyAgfQorCisjaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCisgIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04CisgIC8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCisgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCisKKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKyAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKKyAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KKyAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCisKKyAgLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYSBTdHJpbmcuCisgIC8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgorICAvLworICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCisgIGludGVybmFsOjpTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6U3RyaW5nU3RyZWFtVG9TdHJpbmcoc3NfLmdldCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKworI2lmIEdURVNUX09TX1NZTUJJQU4KKyAgLy8gVGhlc2UgYXJlIG5lZWRlZCBhcyB0aGUgTm9raWEgU3ltYmlhbiBDb21waWxlciBjYW5ub3QgZGVjaWRlIGJldHdlZW4KKyAgLy8gY29uc3QgVCYgYW5kIGNvbnN0IFQqIGluIGEgZnVuY3Rpb24gdGVtcGxhdGUuIFRoZSBOb2tpYSBjb21waWxlciBfY2FuXworICAvLyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLCBzbyBhCisgIC8vIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLCBhbmQgd2UgY2FuIG92ZXJsb2FkIG9uIHRoYXQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OnRydWVfdHlwZSAvKmR1bW15Ki8sIFQqIHBvaW50ZXIpIHsKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAqc3NfIDw8ICIobnVsbCkiOworICAgIH0gZWxzZSB7CisgICAgICA6OkdUZXN0U3RyZWFtVG9IZWxwZXIoc3NfLmdldCgpLCBwb2ludGVyKTsKKyAgICB9CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6ZmFsc2VfdHlwZSAvKmR1bW15Ki8sIGNvbnN0IFQmIHZhbHVlKSB7CisgICAgOjpHVGVzdFN0cmVhbVRvSGVscGVyKHNzXy5nZXQoKSwgdmFsdWUpOworICB9CisjZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KKworICAvLyBXZSdsbCBob2xkIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IGhlcmUuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPCA6OnN0ZDo6c3RyaW5nc3RyZWFtPiBzc187CisKKyAgLy8gV2UgZGVjbGFyZSAoYnV0IGRvbid0IGltcGxlbWVudCkgdGhpcyB0byBwcmV2ZW50IHRoZSBjb21waWxlcgorICAvLyBmcm9tIGltcGxlbWVudGluZyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYpOworfTsKKworLy8gU3RyZWFtcyBhIE1lc3NhZ2UgdG8gYW4gb3N0cmVhbS4KK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE1lc3NhZ2UmIHNiKSB7CisgIHJldHVybiBvcyA8PCBzYi5HZXRTdHJpbmcoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KKy8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6CisvLyAgICAgcHVtcC5weSBndGVzdC1wYXJhbS10ZXN0LmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKKy8vCisvLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQorLy8KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQorLy8KKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworCisKKy8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50CisvLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4KKy8vCisvLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6CisKKyNpZiAwCisKKy8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQorLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKKy8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKKy8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgorLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQorLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKy8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KKworY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKKyAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KK307CisKKy8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKKy8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgorLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KKworVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKKyAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6CisgIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKKyAgLi4uCit9CisKK1RFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgeworICAuLi4KK30KKworLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKKy8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKKy8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAorLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAorLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6CisvLworLy8KKy8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KKy8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCisvLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKKy8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgorLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCisvLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgorLy8KKy8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93CisvLyBpbiB0aGlzIGZpbGUuCisvLworLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQorLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7CisKKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQorLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisvLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKKy8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKKy8vIHRoZXNlIG5hbWVzOgorLy8KKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKKy8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCisvLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKKy8vCisvLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KKy8vCisvLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKKy8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6CisKK2NvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7CisKKy8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKKy8vCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCisvLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCisvLworLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cworLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgorLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KKy8vCisvLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKKy8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgorLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgorLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCisvLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0CisvLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgorLy8KKy8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCisvLyBmb3IgbW9yZSBleGFtcGxlcy4KKy8vCisvLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgorLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAorLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgorLy8KKy8vCisvLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KKy8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisvLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKKy8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQorLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAorLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6CisKK2NsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAorICAvLyBmaXh0dXJlIGhlcmUuCit9OworCitjbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4geworICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCit9OworCitURVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgeworICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCit9CisKK1RFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKKyAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KKyAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOworfQorCisjZW5kaWYgIC8vIDAKKworCisjaWYgIUdURVNUX09TX1NZTUJJQU4KKyMgaW5jbHVkZSA8dXRpbGl0eT4KKyNlbmRpZgorCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQorCisvLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXworI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCisvLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCisvLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgorLy8gQ29weXJpZ2h0IDIwMDMgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQXV0aG9yczogRGFuIEVnbm9yIChlZ25vckBnb29nbGUuY29tKQorLy8KKy8vIEEgInNtYXJ0IiBwb2ludGVyIHR5cGUgd2l0aCByZWZlcmVuY2UgdHJhY2tpbmcuICBFdmVyeSBwb2ludGVyIHRvIGEKKy8vIHBhcnRpY3VsYXIgb2JqZWN0IGlzIGtlcHQgb24gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gIFdoZW4gdGhlIGxhc3QgcG9pbnRlcgorLy8gdG8gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZCBvciByZWFzc2lnbmVkLCB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCisvLworLy8gVXNlZCBwcm9wZXJseSwgdGhpcyBkZWxldGVzIHRoZSBvYmplY3Qgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcyBhd2F5LgorLy8gVGhlcmUgYXJlIHNldmVyYWwgY2F2ZWF0czoKKy8vIC0gTGlrZSBhbGwgcmVmZXJlbmNlIGNvdW50aW5nIHNjaGVtZXMsIGN5Y2xlcyBsZWFkIHRvIGxlYWtzLgorLy8gLSBFYWNoIHNtYXJ0IHBvaW50ZXIgaXMgYWN0dWFsbHkgdHdvIHBvaW50ZXJzICg4IGJ5dGVzIGluc3RlYWQgb2YgNCkuCisvLyAtIEV2ZXJ5IHRpbWUgYSBwb2ludGVyIGlzIGFzc2lnbmVkLCB0aGUgZW50aXJlIGxpc3Qgb2YgcG9pbnRlcnMgdG8gdGhhdAorLy8gICBvYmplY3QgaXMgdHJhdmVyc2VkLiAgVGhpcyBjbGFzcyBpcyB0aGVyZWZvcmUgTk9UIFNVSVRBQkxFIHdoZW4gdGhlcmUKKy8vICAgd2lsbCBvZnRlbiBiZSBtb3JlIHRoYW4gdHdvIG9yIHRocmVlIHBvaW50ZXJzIHRvIGEgcGFydGljdWxhciBvYmplY3QuCisvLyAtIFJlZmVyZW5jZXMgYXJlIG9ubHkgdHJhY2tlZCBhcyBsb25nIGFzIGxpbmtlZF9wdHI8PiBvYmplY3RzIGFyZSBjb3BpZWQuCisvLyAgIElmIGEgbGlua2VkX3B0cjw+IGlzIGNvbnZlcnRlZCB0byBhIHJhdyBwb2ludGVyIGFuZCBiYWNrLCBCQUQgVEhJTkdTCisvLyAgIHdpbGwgaGFwcGVuIChkb3VibGUgZGVsZXRpb24pLgorLy8KKy8vIEEgZ29vZCB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBzdG9yaW5nIG9iamVjdCByZWZlcmVuY2VzIGluIFNUTCBjb250YWluZXJzLgorLy8gWW91IGNhbiBzYWZlbHkgcHV0IGxpbmtlZF9wdHI8PiBpbiBhIHZlY3Rvcjw+LgorLy8gT3RoZXIgdXNlcyBtYXkgbm90IGJlIGFzIGdvb2QuCisvLworLy8gTm90ZTogSWYgeW91IHVzZSBhbiBpbmNvbXBsZXRlIHR5cGUgd2l0aCBsaW5rZWRfcHRyPD4sIHRoZSBjbGFzcworLy8gKmNvbnRhaW5pbmcqIGxpbmtlZF9wdHI8PiBtdXN0IGhhdmUgYSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciAoZXZlbgorLy8gaWYgdGhleSBkbyBub3RoaW5nISkuCisvLworLy8gQmlsbCBHaWJib25zIHN1Z2dlc3RlZCB3ZSB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcy4KKy8vCisvLyBUaHJlYWQgU2FmZXR5OgorLy8gICBVbmxpa2Ugb3RoZXIgbGlua2VkX3B0ciBpbXBsZW1lbnRhdGlvbnMsIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKy8vICAgYSBsaW5rZWRfcHRyIG9iamVjdCBpcyB0aHJlYWQtc2FmZSBpbiB0aGUgc2Vuc2UgdGhhdDoKKy8vICAgICAtIGl0J3Mgc2FmZSB0byBjb3B5IGxpbmtlZF9wdHIgb2JqZWN0cyBjb25jdXJyZW50bHksCisvLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSAqZnJvbSogYSBsaW5rZWRfcHRyIGFuZCByZWFkIGl0cyB1bmRlcmx5aW5nCisvLyAgICAgICByYXcgcG9pbnRlciAoZS5nLiB2aWEgZ2V0KCkpIGNvbmN1cnJlbnRseSwgYW5kCisvLyAgICAgLSBpdCdzIHNhZmUgdG8gd3JpdGUgdG8gdHdvIGxpbmtlZF9wdHJzIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUKKy8vICAgICAgIHNoYXJlZCBvYmplY3QgY29uY3VycmVudGx5LgorLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbmFtZSB0aGlzIHRvIHNhZmVfbGlua2VkX3B0ciB0byBhdm9pZAorLy8gY29uZnVzaW9uIHdpdGggbm9ybWFsIGxpbmtlZF9wdHIuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUHJvdGVjdHMgY29weWluZyBvZiBhbGwgbGlua2VkX3B0ciBvYmplY3RzLgorR1RFU1RfQVBJXyBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKKworLy8gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgYWxsIGluc3RhbmNlcyBvZiBsaW5rZWRfcHRyPD4uICBJdCBuZWVkcyB0byBiZQorLy8gYSBub24tdGVtcGxhdGUgY2xhc3MgYmVjYXVzZSBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0cjw+IGNhbiByZWZlciB0bworLy8gdGhlIHNhbWUgb2JqZWN0IChsaW5rZWRfcHRyPFN1cGVyY2xhc3M+KG9iaikgdnMgbGlua2VkX3B0cjxTdWJjbGFzcz4ob2JqKSkuCisvLyBTbywgaXQgbmVlZHMgdG8gYmUgcG9zc2libGUgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIHRvIHBhcnRpY2lwYXRlCisvLyBpbiB0aGUgc2FtZSBjaXJjdWxhciBsaW5rZWQgbGlzdCwgc28gd2UgbmVlZCBhIHNpbmdsZSBjbGFzcyB0eXBlIGhlcmUuCisvLworLy8gRE8gTk9UIFVTRSBUSElTIENMQVNTIERJUkVDVExZIFlPVVJTRUxGLiAgVXNlIGxpbmtlZF9wdHI8VD4uCitjbGFzcyBsaW5rZWRfcHRyX2ludGVybmFsIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhIG5ldyBjaXJjbGUgdGhhdCBpbmNsdWRlcyBvbmx5IHRoaXMgaW5zdGFuY2UuCisgIHZvaWQgam9pbl9uZXcoKSB7CisgICAgbmV4dF8gPSB0aGlzOworICB9CisKKyAgLy8gTWFueSBsaW5rZWRfcHRyIG9wZXJhdGlvbnMgbWF5IGNoYW5nZSBwLmxpbmtfIGZvciBzb21lIGxpbmtlZF9wdHIKKyAgLy8gdmFyaWFibGUgcCBpbiB0aGUgc2FtZSBjaXJjbGUgYXMgdGhpcyBvYmplY3QuICBUaGVyZWZvcmUgd2UgbmVlZAorICAvLyB0byBwcmV2ZW50IHR3byBzdWNoIG9wZXJhdGlvbnMgZnJvbSBvY2N1cnJpbmcgY29uY3VycmVudGx5LgorICAvLworICAvLyBOb3RlIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHIgb2JqZWN0cyBjYW4gY29leGlzdCBpbiBhCisgIC8vIGNpcmNsZSAoZS5nLiBsaW5rZWRfcHRyPEJhc2U+LCBsaW5rZWRfcHRyPERlcml2ZWQxPiwgYW5kCisgIC8vIGxpbmtlZF9wdHI8RGVyaXZlZDI+KS4gIFRoZXJlZm9yZSB3ZSBtdXN0IHVzZSBhIHNpbmdsZSBtdXRleCB0bworICAvLyBwcm90ZWN0IGFsbCBsaW5rZWRfcHRyIG9iamVjdHMuICBUaGlzIGNhbiBjcmVhdGUgc2VyaW91cworICAvLyBjb250ZW50aW9uIGluIHByb2R1Y3Rpb24gY29kZSwgYnV0IGlzIGFjY2VwdGFibGUgaW4gYSB0ZXN0aW5nCisgIC8vIGZyYW1ld29yay4KKworICAvLyBKb2luIGFuIGV4aXN0aW5nIGNpcmNsZS4KKyAgLy8gTCA8IGdfbGlua2VkX3B0cl9tdXRleAorICB2b2lkIGpvaW4obGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcHRyKSB7CisgICAgTXV0ZXhMb2NrIGxvY2soJmdfbGlua2VkX3B0cl9tdXRleCk7CisKKyAgICBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwID0gcHRyOworICAgIHdoaWxlIChwLT5uZXh0XyAhPSBwdHIpIHAgPSBwLT5uZXh0XzsKKyAgICBwLT5uZXh0XyA9IHRoaXM7CisgICAgbmV4dF8gPSBwdHI7CisgIH0KKworICAvLyBMZWF2ZSB3aGF0ZXZlciBjaXJjbGUgd2UncmUgcGFydCBvZi4gIFJldHVybnMgdHJ1ZSBpZiB3ZSB3ZXJlIHRoZQorICAvLyBsYXN0IG1lbWJlciBvZiB0aGUgY2lyY2xlLiAgT25jZSB0aGlzIGlzIGRvbmUsIHlvdSBjYW4gam9pbigpIGFub3RoZXIuCisgIC8vIEwgPCBnX2xpbmtlZF9wdHJfbXV0ZXgKKyAgYm9vbCBkZXBhcnQoKSB7CisgICAgTXV0ZXhMb2NrIGxvY2soJmdfbGlua2VkX3B0cl9tdXRleCk7CisKKyAgICBpZiAobmV4dF8gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgICAgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcCA9IG5leHRfOworICAgIHdoaWxlIChwLT5uZXh0XyAhPSB0aGlzKSBwID0gcC0+bmV4dF87CisgICAgcC0+bmV4dF8gPSBuZXh0XzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworIHByaXZhdGU6CisgIG11dGFibGUgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogbmV4dF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIGxpbmtlZF9wdHIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKworICAvLyBUYWtlIG92ZXIgb3duZXJzaGlwIG9mIGEgcmF3IHBvaW50ZXIuICBUaGlzIHNob3VsZCBoYXBwZW4gYXMgc29vbiBhcworICAvLyBwb3NzaWJsZSBhZnRlciB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuCisgIGV4cGxpY2l0IGxpbmtlZF9wdHIoVCogcHRyID0gTlVMTCkgeyBjYXB0dXJlKHB0cik7IH0KKyAgfmxpbmtlZF9wdHIoKSB7IGRlcGFydCgpOyB9CisKKyAgLy8gQ29weSBhbiBleGlzdGluZyBsaW5rZWRfcHRyPD4sIGFkZGluZyBvdXJzZWx2ZXMgdG8gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGxpbmtlZF9wdHIobGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7IGNvcHkoJnB0cik7IH0KKyAgbGlua2VkX3B0cihsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsgIC8vIE5PTElOVAorICAgIGFzc2VydCgmcHRyICE9IHRoaXMpOworICAgIGNvcHkoJnB0cik7CisgIH0KKworICAvLyBBc3NpZ25tZW50IHJlbGVhc2VzIHRoZSBvbGQgdmFsdWUgYW5kIGFjcXVpcmVzIHRoZSBuZXcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7CisgICAgZGVwYXJ0KCk7CisgICAgY29weSgmcHRyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0ciBjb25zdCYgcHRyKSB7CisgICAgaWYgKCZwdHIgIT0gdGhpcykgeworICAgICAgZGVwYXJ0KCk7CisgICAgICBjb3B5KCZwdHIpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTbWFydCBwb2ludGVyIG1lbWJlcnMuCisgIHZvaWQgcmVzZXQoVCogcHRyID0gTlVMTCkgeworICAgIGRlcGFydCgpOworICAgIGNhcHR1cmUocHRyKTsKKyAgfQorICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqdmFsdWVfOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyA9PSBwOyB9CisgIGJvb2wgb3BlcmF0b3IhPShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gIT0gcDsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvcj09KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8gPT0gcHRyLmdldCgpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBib29sIG9wZXJhdG9yIT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXyAhPSBwdHIuZ2V0KCk7CisgIH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBmcmllbmQgY2xhc3MgbGlua2VkX3B0cjsKKworICBUKiB2YWx1ZV87CisgIGxpbmtlZF9wdHJfaW50ZXJuYWwgbGlua187CisKKyAgdm9pZCBkZXBhcnQoKSB7CisgICAgaWYgKGxpbmtfLmRlcGFydCgpKSBkZWxldGUgdmFsdWVfOworICB9CisKKyAgdm9pZCBjYXB0dXJlKFQqIHB0cikgeworICAgIHZhbHVlXyA9IHB0cjsKKyAgICBsaW5rXy5qb2luX25ldygpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IHZvaWQgY29weShsaW5rZWRfcHRyPFU+IGNvbnN0KiBwdHIpIHsKKyAgICB2YWx1ZV8gPSBwdHItPmdldCgpOworICAgIGlmICh2YWx1ZV8pCisgICAgICBsaW5rXy5qb2luKCZwdHItPmxpbmtfKTsKKyAgICBlbHNlCisgICAgICBsaW5rXy5qb2luX25ldygpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKK2Jvb2wgb3BlcmF0b3I9PShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKKyAgcmV0dXJuIHB0ciA9PSB4LmdldCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKK2Jvb2wgb3BlcmF0b3IhPShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKKyAgcmV0dXJuIHB0ciAhPSB4LmdldCgpOworfQorCisvLyBBIGZ1bmN0aW9uIHRvIGNvbnZlcnQgVCogaW50byBsaW5rZWRfcHRyPFQ+CisvLyBEb2luZyBlLmcuIG1ha2VfbGlua2VkX3B0cihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpIGlzIGEgc2hvcnRlciBub3RhdGlvbgorLy8gZm9yIGxpbmtlZF9wdHI8Rm9vQmFyQmF6PHR5cGU+ID4obmV3IEZvb0JhckJhejx0eXBlPihhcmcpKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitsaW5rZWRfcHRyPFQ+IG1ha2VfbGlua2VkX3B0cihUKiBwdHIpIHsKKyAgcmV0dXJuIGxpbmtlZF9wdHI8VD4ocHRyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXworLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworLy8gR29vZ2xlIFRlc3QgLSBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgdGhhdCBjYW4gcHJpbnQgYQorLy8gdmFsdWUgb2YgYW55IHR5cGUgVDoKKy8vCisvLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKTsKKy8vCisvLyBBIHVzZXIgY2FuIHRlYWNoIHRoaXMgZnVuY3Rpb24gaG93IHRvIHByaW50IGEgY2xhc3MgdHlwZSBUIGJ5CisvLyBkZWZpbmluZyBlaXRoZXIgb3BlcmF0b3I8PCgpIG9yIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHRoYXQKKy8vIGRlZmluZXMgVC4gIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgRklSU1QgZGVmaW5lZCBmdW5jdGlvbiBpbiB0aGUKKy8vIGZvbGxvd2luZyBsaXN0IHdpbGwgYmUgdXNlZCAoYXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZQorLy8gZm9vKToKKy8vCisvLyAgIDEuIGZvbzo6UHJpbnRUbyhjb25zdCBUJiwgb3N0cmVhbSopCisvLyAgIDIuIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IFQmKSBkZWZpbmVkIGluIGVpdGhlciBmb28gb3IgdGhlCisvLyAgICAgIGdsb2JhbCBuYW1lc3BhY2UuCisvLworLy8gSWYgbm9uZSBvZiB0aGUgYWJvdmUgaXMgZGVmaW5lZCwgaXQgd2lsbCBwcmludCB0aGUgZGVidWcgc3RyaW5nIG9mCisvLyB0aGUgdmFsdWUgaWYgaXQgaXMgYSBwcm90b2NvbCBidWZmZXIsIG9yIHByaW50IHRoZSByYXcgYnl0ZXMgaW4gdGhlCisvLyB2YWx1ZSBvdGhlcndpc2UuCisvLworLy8gVG8gYWlkIGRlYnVnZ2luZzogd2hlbiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSBhZGRyZXNzIG9mIHRoZQorLy8gdmFsdWUgaXMgYWxzbyBwcmludGVkOyB3aGVuIFQgaXMgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgYm90aCB0aGUKKy8vIHBvaW50ZXIgdmFsdWUgYW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaXQgcG9pbnRzIHRvIGFyZQorLy8gcHJpbnRlZC4KKy8vCisvLyBXZSBhbHNvIHByb3ZpZGUgc29tZSBjb252ZW5pZW50IHdyYXBwZXJzOgorLy8KKy8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcuICBGb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyCisvLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzCisvLyAgIC8vIHByaW50ZWQuCisvLyAgIHN0ZDo6c3RyaW5nIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSk7CisvLworLy8gICAvLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQKKy8vICAgLy8gdmFsdWUgKGJ1dCBub3QgdGhlIGFkZHJlc3MpIGlzIHByaW50ZWQ7IGZvciBhIChjb25zdCBvciBub3QpIGNoYXIKKy8vICAgLy8gcG9pbnRlciwgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyAoYnV0IG5vdCB0aGUgcG9pbnRlcikgaXMKKy8vICAgLy8gcHJpbnRlZC4KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50KGNvbnN0IFQmIHZhbHVlLCBvc3RyZWFtKik7CisvLworLy8gICAvLyBQcmludHMgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlIGRpZmZlcmVuY2UKKy8vICAgLy8gZnJvbSBVbml2ZXJzYWxUZXJzZVByaW50KCkgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHByaW50cyBib3RoIHRoZQorLy8gICAvLyBwb2ludGVyIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZvciBhIChjb25zdCBvciBub3QpIGNoYXIgcG9pbnRlci4KKy8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgb3N0cmVhbSopOworLy8KKy8vICAgLy8gUHJpbnRzIHRoZSBmaWVsZHMgb2YgYSB0dXBsZSB0ZXJzZWx5IHRvIGEgc3RyaW5nIHZlY3Rvciwgb25lCisvLyAgIC8vIGVsZW1lbnQgZm9yIGVhY2ggZmllbGQuIFR1cGxlIHN1cHBvcnQgbXVzdCBiZSBlbmFibGVkIGluCisvLyAgIC8vIGd0ZXN0LXBvcnQuaC4KKy8vICAgc3RkOjp2ZWN0b3I8c3RyaW5nPiBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoCisvLyAgICAgICBjb25zdCBUdXBsZSYgdmFsdWUpOworLy8KKy8vIEtub3duIGxpbWl0YXRpb246CisvLworLy8gVGhlIHByaW50IHByaW1pdGl2ZXMgcHJpbnQgdGhlIGVsZW1lbnRzIG9mIGFuIFNUTC1zdHlsZSBjb250YWluZXIKKy8vIHVzaW5nIHRoZSBjb21waWxlci1pbmZlcnJlZCB0eXBlIG9mICppdGVyIHdoZXJlIGl0ZXIgaXMgYQorLy8gY29uc3RfaXRlcmF0b3Igb2YgdGhlIGNvbnRhaW5lci4gIFdoZW4gY29uc3RfaXRlcmF0b3IgaXMgYW4gaW5wdXQKKy8vIGl0ZXJhdG9yIGJ1dCBub3QgYSBmb3J3YXJkIGl0ZXJhdG9yLCB0aGlzIGluZmVycmVkIHR5cGUgbWF5IG5vdAorLy8gbWF0Y2ggdmFsdWVfdHlwZSwgYW5kIHRoZSBwcmludCBvdXRwdXQgbWF5IGJlIGluY29ycmVjdC4gIEluCisvLyBwcmFjdGljZSwgdGhpcyBpcyByYXJlbHkgYSBwcm9ibGVtIGFzIGZvciBtb3N0IGNvbnRhaW5lcnMKKy8vIGNvbnN0X2l0ZXJhdG9yIGlzIGEgZm9yd2FyZCBpdGVyYXRvci4gIFdlJ2xsIGZpeCB0aGlzIGlmIHRoZXJlJ3MgYW4KKy8vIGFjdHVhbCBuZWVkIGZvciBpdC4gIE5vdGUgdGhhdCB0aGlzIGZpeCBjYW5ub3QgcmVseSBvbiB2YWx1ZV90eXBlCisvLyBiZWluZyBkZWZpbmVkIGFzIG1hbnkgdXNlci1kZWZpbmVkIGNvbnRhaW5lciB0eXBlcyBkb24ndCBoYXZlCisvLyB2YWx1ZV90eXBlLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXworCisjaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIERlZmluaXRpb25zIGluIHRoZSAnaW50ZXJuYWwnIGFuZCAnaW50ZXJuYWwyJyBuYW1lIHNwYWNlcyBhcmUKKy8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBUSEVNIElOIFVTRVIgQ09ERSEKK25hbWVzcGFjZSBpbnRlcm5hbDIgeworCisvLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBnaXZlbgorLy8gb3N0cmVhbS4KK0dURVNUX0FQSV8gdm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIEZvciBzZWxlY3Rpbmcgd2hpY2ggcHJpbnRlciB0byB1c2Ugd2hlbiBhIGdpdmVuIHR5cGUgaGFzIG5laXRoZXIgPDwKKy8vIG5vciBQcmludFRvKCkuCitlbnVtIFR5cGVLaW5kIHsKKyAga1Byb3RvYnVmLCAgICAgICAgICAgICAgLy8gYSBwcm90b2J1ZiB0eXBlCisgIGtDb252ZXJ0aWJsZVRvSW50ZWdlciwgIC8vIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYSBuYW1lZCBvciB1bm5hbWVkIGVudW0gdHlwZSkKKyAga090aGVyVHlwZSAgICAgICAgICAgICAgLy8gYW55dGhpbmcgZWxzZQorfTsKKworLy8gVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga1R5cGVLaW5kPjo6UHJpbnRWYWx1ZSh2YWx1ZSwgb3MpIGlzIGNhbGxlZAorLy8gYnkgdGhlIHVuaXZlcnNhbCBwcmludGVyIHRvIHByaW50IGEgdmFsdWUgb2YgdHlwZSBUIHdoZW4gbmVpdGhlcgorLy8gb3BlcmF0b3I8PCBub3IgUHJpbnRUbygpIGlzIGRlZmluZWQgZm9yIFQsIHdoZXJlIGtUeXBlS2luZCBpcyB0aGUKKy8vICJraW5kIiBvZiBUIGFzIGRlZmluZWQgYnkgZW51bSBUeXBlS2luZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBUeXBlS2luZCBrVHlwZUtpbmQ+CitjbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlciB7CisgcHVibGljOgorICAvLyBUaGlzIGRlZmF1bHQgdmVyc2lvbiBpcyBjYWxsZWQgd2hlbiBrVHlwZUtpbmQgaXMga090aGVyVHlwZS4KKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgUHJpbnRCeXRlc0luT2JqZWN0VG8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oJnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWUpLCBvcyk7CisgIH0KK307CisKKy8vIFdlIHByaW50IGEgcHJvdG9idWYgdXNpbmcgaXRzIFNob3J0RGVidWdTdHJpbmcoKSB3aGVuIHRoZSBzdHJpbmcKKy8vIGRvZXNuJ3QgZXhjZWVkIHRoaXMgbWFueSBjaGFyYWN0ZXJzOyBvdGhlcndpc2Ugd2UgcHJpbnQgaXQgdXNpbmcKKy8vIERlYnVnU3RyaW5nKCkgZm9yIGJldHRlciByZWFkYWJpbGl0eS4KK2NvbnN0IHNpemVfdCBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA9IDUwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtQcm90b2J1Zj4geworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHNob3J0X3N0ciA9IHZhbHVlLlNob3J0RGVidWdTdHJpbmcoKTsKKyAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgcHJldHR5X3N0ciA9CisgICAgICAgIHNob3J0X3N0ci5sZW5ndGgoKSA8PSBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA/CisgICAgICAgIHNob3J0X3N0ciA6ICgiXG4iICsgdmFsdWUuRGVidWdTdHJpbmcoKSk7CisgICAgKm9zIDw8ICgiPCIgKyBwcmV0dHlfc3RyICsgIj4iKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrQ29udmVydGlibGVUb0ludGVnZXI+IHsKKyBwdWJsaWM6CisgIC8vIFNpbmNlIFQgaGFzIG5vIDw8IG9wZXJhdG9yIG9yIFByaW50VG8oKSBidXQgY2FuIGJlIGltcGxpY2l0bHkKKyAgLy8gY29udmVydGVkIHRvIEJpZ2dlc3RJbnQsIHdlIHByaW50IGl0IGFzIGEgQmlnZ2VzdEludC4KKyAgLy8KKyAgLy8gTW9zdCBsaWtlbHkgVCBpcyBhbiBlbnVtIHR5cGUgKGVpdGhlciBuYW1lZCBvciB1bm5hbWVkKSwgaW4gd2hpY2gKKyAgLy8gY2FzZSBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBkZXNpcmVkIGJlaGF2aW9yLiAgSW4gY2FzZQorICAvLyBUIGlzIG5vdCBhbiBlbnVtLCBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBiZXN0IHdlIGNhbiBkbworICAvLyBnaXZlbiB0aGF0IGl0IGhhcyBubyB1c2VyLWRlZmluZWQgcHJpbnRlci4KKyAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgY29uc3QgaW50ZXJuYWw6OkJpZ2dlc3RJbnQga0JpZ0ludCA9IHZhbHVlOworICAgICpvcyA8PCBrQmlnSW50OworICB9Cit9OworCisvLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLiAgSWYgdGhlIHZhbHVlIGlzIGEKKy8vIHByb3RvY29sIG1lc3NhZ2UsIGl0cyBkZWJ1ZyBzdHJpbmcgaXMgcHJpbnRlZDsgaWYgaXQncyBhbiBlbnVtIG9yCisvLyBvZiBhIHR5cGUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LCBpdCdzIHByaW50ZWQgYXMgYW4KKy8vIGludGVnZXI7IG90aGVyd2lzZSB0aGUgYnl0ZXMgaW4gdGhlIHZhbHVlIGFyZSBwcmludGVkLiAgVGhpcyBpcworLy8gd2hhdCBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBpdCBrbm93cyBub3RoaW5nIGFib3V0CisvLyB0eXBlIFQgYW5kIFQgaGFzIG5laXRoZXIgPDwgb3BlcmF0b3Igbm9yIFByaW50VG8oKS4KKy8vCisvLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKKy8vIGEgPDwgb3BlcmF0b3IgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4KKy8vCisvLyBXZSBwdXQgdGhpcyBvcGVyYXRvciBpbiBuYW1lc3BhY2UgJ2ludGVybmFsMicgaW5zdGVhZCBvZiAnaW50ZXJuYWwnCisvLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIGFzIG11Y2ggY29kZSBpbiAnaW50ZXJuYWwnIG5lZWRzIHRvCisvLyB1c2UgPDwgaW4gU1RMLCB3aGljaCB3b3VsZCBjb25mbGljdCB3aXRoIG91ciBvd24gPDwgd2VyZSBpdCBkZWZpbmVkCisvLyBpbiAnaW50ZXJuYWwnLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIG9wZXJhdG9yPDwgdGFrZXMgYSBnZW5lcmljIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLAorLy8gQ2hhclRyYWl0cz4gdHlwZSBpbnN0ZWFkIG9mIHRoZSBtb3JlIHJlc3RyaWN0ZWQgc3RkOjpvc3RyZWFtLiAgSWYKKy8vIHdlIGRlZmluZSBpdCB0byB0YWtlIGFuIHN0ZDo6b3N0cmVhbSBpbnN0ZWFkLCB3ZSdsbCBnZXQgYW4KKy8vICJhbWJpZ3VvdXMgb3ZlcmxvYWRzIiBjb21waWxlciBlcnJvciB3aGVuIHRyeWluZyB0byBwcmludCBhIHR5cGUKKy8vIEZvbyB0aGF0IHN1cHBvcnRzIHN0cmVhbWluZyB0byBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwKKy8vIENoYXJUcmFpdHM+LCBhcyB0aGUgY29tcGlsZXIgY2Fubm90IHRlbGwgd2hldGhlcgorLy8gb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mLCBjb25zdCBUJikgb3IKKy8vIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4sIGNvbnN0IEZvbyYpIGlzIG1vcmUKKy8vIHNwZWNpZmljLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+Cis6OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKKyAgICA6OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsIGNvbnN0IFQmIHgpIHsKKyAgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwKKyAgICAgIChpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSA/IGtQcm90b2J1ZiA6CisgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUJiwgaW50ZXJuYWw6OkJpZ2dlc3RJbnQ+Ojp2YWx1ZSA/CisgICAgICAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyIDoga090aGVyVHlwZSk+OjpQcmludFZhbHVlKHgsICZvcyk7CisgIHJldHVybiBvczsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworLy8gVGhpcyBuYW1lc3BhY2UgTVVTVCBOT1QgQkUgTkVTVEVEIElOIDo6dGVzdGluZywgb3IgdGhlIG5hbWUgbG9vay11cAorLy8gbWFnaWMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgVW5pdmVyc2FsUHJpbnRlciB3b24ndCB3b3JrLgorbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwgeworCisvLyBVc2VkIHRvIHByaW50IGEgdmFsdWUgdGhhdCBpcyBub3QgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZQorLy8gdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludE5vbkNvbnRhaW5lclRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgLy8gV2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCwgZHVyaW5nIHVucXVhbGlmaWVkIG5hbWUgbG9va3VwLAorICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgYXBwZWFycyBhcyBpZiBpdCB3YXMgZGVjbGFyZWQgaW4KKyAgLy8gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGJvdGgKKyAgLy8gOjp0ZXN0aW5nX2ludGVybmFsIGFuZCA6OnRlc3Rpbmc6OmludGVybmFsMiwgaS5lLiB0aGUgZ2xvYmFsCisgIC8vIG5hbWVzcGFjZS4gIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIHRoZSBDKysgU3RhbmRhcmQgc2VjdGlvbgorICAvLyA3LjMuNC0xIFtuYW1lc3BhY2UudWRpcl0uICBUaGlzIGFsbG93cyB1cyB0byBmYWxsIGJhY2sgb250bworICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgaW4gY2FzZSBUIGRvZXNuJ3QgY29tZSB3aXRoIGEgPDwKKyAgLy8gb3BlcmF0b3IuCisgIC8vCisgIC8vIFdlIGNhbm5vdCB3cml0ZSAndXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDw7Jywgd2hpY2gKKyAgLy8gZ2NjIDMuMyBmYWlscyB0byBjb21waWxlIGR1ZSB0byBhIGNvbXBpbGVyIGJ1Zy4KKyAgdXNpbmcgbmFtZXNwYWNlIDo6dGVzdGluZzo6aW50ZXJuYWwyOyAgLy8gTk9MSU5UCisKKyAgLy8gQXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZSBmb28sIGluIHRoZSBuZXh0IHN0YXRlbWVudCwKKyAgLy8gdGhlIGNvbXBpbGVyIHdpbGwgY29uc2lkZXIgYWxsIG9mOgorICAvLworICAvLyAgIDEuIGZvbzo6b3BlcmF0b3I8PCAodGhhbmtzIHRvIEtvZW5pZyBsb29rLXVwKSwKKyAgLy8gICAyLiA6Om9wZXJhdG9yPDwgKGFzIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpcyBlbmNsb3NlZCBpbiA6OiksCisgIC8vICAgMy4gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gdGhlIHVzaW5nIHN0YXRlbWVudCBhYm92ZSkuCisgIC8vCisgIC8vIFRoZSBvcGVyYXRvcjw8IHdob3NlIHR5cGUgbWF0Y2hlcyBUIGJlc3Qgd2lsbCBiZSBwaWNrZWQuCisgIC8vCisgIC8vIFdlIGRlbGliZXJhdGVseSBhbGxvdyAjMiB0byBiZSBhIGNhbmRpZGF0ZSwgYXMgc29tZXRpbWVzIGl0J3MKKyAgLy8gaW1wb3NzaWJsZSB0byBkZWZpbmUgIzEgKGUuZy4gd2hlbiBmb28gaXMgOjpzdGQsIGRlZmluaW5nCisgIC8vIGFueXRoaW5nIGluIGl0IGlzIHVuZGVmaW5lZCBiZWhhdmlvciB1bmxlc3MgeW91IGFyZSBhIGNvbXBpbGVyCisgIC8vIHZlbmRvci4pLgorICAqb3MgPDwgdmFsdWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nX2ludGVybmFsCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cikgcHJpbnRzIHRoZSBnaXZlbgorLy8gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQKKy8vICdvc3RyZWFtX3B0cicgaXMgbm90IE5VTEwsIG9yIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisvLworLy8gV2UgZGVmaW5lIFVuaXZlcnNhbFByaW50ZXIgYXMgYSBjbGFzcyB0ZW1wbGF0ZSAoYXMgb3Bwb3NlZCB0byBhCisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSksIGFzIHdlIG5lZWQgdG8gcGFydGlhbGx5IHNwZWNpYWxpemUgaXQgZm9yCisvLyByZWZlcmVuY2UgdHlwZXMsIHdoaWNoIGNhbm5vdCBiZSBkb25lIHdpdGggZnVuY3Rpb24gdGVtcGxhdGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CisKKy8vIFVzZWQgdG8gcHJpbnQgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lCisvLyBhIFByaW50VG8oKSBmb3IgaXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4KK3ZvaWQgRGVmYXVsdFByaW50VG8oSXNDb250YWluZXIgLyogZHVtbXkgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlX3R5cGUgLyogaXMgbm90IGEgcG9pbnRlciAqLywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQyYgY29udGFpbmVyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgY29uc3Qgc2l6ZV90IGtNYXhDb3VudCA9IDMyOyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHByaW50LgorICAqb3MgPDwgJ3snOworICBzaXplX3QgY291bnQgPSAwOworICBmb3IgKHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgaXQgIT0gY29udGFpbmVyLmVuZCgpOyArK2l0LCArK2NvdW50KSB7CisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgKm9zIDw8ICcsJzsKKyAgICAgIGlmIChjb3VudCA9PSBrTWF4Q291bnQpIHsgIC8vIEVub3VnaCBoYXMgYmVlbiBwcmludGVkLgorICAgICAgICAqb3MgPDwgIiAuLi4iOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICcgJzsKKyAgICAvLyBXZSBjYW5ub3QgY2FsbCBQcmludFRvKCppdCwgb3MpIGhlcmUgYXMgUHJpbnRUbygpIGRvZXNuJ3QKKyAgICAvLyBoYW5kbGUgKml0IGJlaW5nIGEgbmF0aXZlIGFycmF5LgorICAgIGludGVybmFsOjpVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsKKyAgfQorCisgIGlmIChjb3VudCA+IDApIHsKKyAgICAqb3MgPDwgJyAnOworICB9CisgICpvcyA8PCAnfSc7Cit9CisKKy8vIFVzZWQgdG8gcHJpbnQgYSBwb2ludGVyIHRoYXQgaXMgbmVpdGhlciBhIGNoYXIgcG9pbnRlciBub3IgYSBtZW1iZXIKKy8vIHBvaW50ZXIsIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4gIChBIG1lbWJlcgorLy8gdmFyaWFibGUgcG9pbnRlciBvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBkb2Vzbid0IHJlYWxseSBwb2ludCB0bworLy8gYSBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4gIFRoZWlyIHJlcHJlc2VudGF0aW9uIGlzCisvLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGhlcmVmb3JlIHRoZXkgd2lsbCBiZSBwcmludGVkIGFzIHJhdworLy8gYnl0ZXMuKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAorICAgICAgICAgICAgICAgICAgICB0cnVlX3R5cGUgLyogaXMgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBUKiBwLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgICpvcyA8PCAiTlVMTCI7CisgIH0gZWxzZSB7CisgICAgLy8gQysrIGRvZXNuJ3QgYWxsb3cgY2FzdGluZyBmcm9tIGEgZnVuY3Rpb24gcG9pbnRlciB0byBhbnkgb2JqZWN0CisgICAgLy8gcG9pbnRlci4KKyAgICAvLworICAgIC8vIElzVHJ1ZSgpIHNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwKKyAgICAvLyAidW5yZWFjaGFibGUgY29kZSIuCisgICAgaWYgKElzVHJ1ZShJbXBsaWNpdGx5Q29udmVydGlibGU8VCosIGNvbnN0IHZvaWQqPjo6dmFsdWUpKSB7CisgICAgICAvLyBUIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUuICBXZSBqdXN0IGNhbGwgPDwgdG8gcHJpbnQgcCwKKyAgICAgIC8vIHJlbHlpbmcgb24gQURMIHRvIHBpY2sgdXAgdXNlci1kZWZpbmVkIDw8IGZvciB0aGVpciBwb2ludGVyCisgICAgICAvLyB0eXBlcywgaWYgYW55LgorICAgICAgKm9zIDw8IHA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFQgaXMgYSBmdW5jdGlvbiB0eXBlLCBzbyAnKm9zIDw8IHAnIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50CisgICAgICAvLyAoaXQganVzdCBwcmludHMgcCBhcyBib29sKS4gIFdlIHdhbnQgdG8gcHJpbnQgcCBhcyBhIGNvbnN0CisgICAgICAvLyB2b2lkKi4gIEhvd2V2ZXIsIHdlIGNhbm5vdCBjYXN0IGl0IHRvIGNvbnN0IHZvaWQqIGRpcmVjdGx5LAorICAgICAgLy8gZXZlbiB1c2luZyByZWludGVycHJldF9jYXN0LCBhcyBlYXJsaWVyIHZlcnNpb25zIG9mIGdjYworICAgICAgLy8gKGUuZy4gMy40LjUpIGNhbm5vdCBjb21waWxlIHRoZSBjYXN0IHdoZW4gcCBpcyBhIGZ1bmN0aW9uCisgICAgICAvLyBwb2ludGVyLiAgQ2FzdGluZyB0byBVSW50NjQgZmlyc3Qgc29sdmVzIHRoZSBwcm9ibGVtLgorICAgICAgKm9zIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OlVJbnQ2ND4ocCkpOworICAgIH0KKyAgfQorfQorCisvLyBVc2VkIHRvIHByaW50IGEgbm9uLWNvbnRhaW5lciwgbm9uLXBvaW50ZXIgdmFsdWUgd2hlbiB0aGUgdXNlcgorLy8gZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBEZWZhdWx0UHJpbnRUbyhJc05vdENvbnRhaW5lciAvKiBkdW1teSAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIDo6dGVzdGluZ19pbnRlcm5hbDo6RGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8odmFsdWUsIG9zKTsKK30KKworLy8gUHJpbnRzIHRoZSBnaXZlbiB2YWx1ZSB1c2luZyB0aGUgPDwgb3BlcmF0b3IgaWYgaXQgaGFzIG9uZTsKKy8vIG90aGVyd2lzZSBwcmludHMgdGhlIGJ5dGVzIGluIGl0LiAgVGhpcyBpcyB3aGF0CisvLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBQcmludFRvKCkgaXMgbm90IHNwZWNpYWxpemVkCisvLyBvciBvdmVybG9hZGVkIGZvciB0eXBlIFQuCisvLworLy8gQSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGZvciBhIGNsYXNzIHR5cGUgRm9vIGJ5IGRlZmluaW5nCisvLyBhbiBvdmVybG9hZCBvZiBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4gIFdlCisvLyBnaXZlIHRoZSB1c2VyIHRoaXMgb3B0aW9uIGFzIHNvbWV0aW1lcyBkZWZpbmluZyBhIDw8IG9wZXJhdG9yIGZvcgorLy8gRm9vIGlzIG5vdCBkZXNpcmFibGUgKGUuZy4gdGhlIGNvZGluZyBzdHlsZSBtYXkgcHJldmVudCBkb2luZyBpdCwKKy8vIG9yIHRoZXJlIGlzIGFscmVhZHkgYSA8PCBvcGVyYXRvciBidXQgaXQgZG9lc24ndCBkbyB3aGF0IHRoZSB1c2VyCisvLyB3YW50cykuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUbyhjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIC8vIERlZmF1bHRQcmludFRvKCkgaXMgb3ZlcmxvYWRlZC4gIFRoZSB0eXBlIG9mIGl0cyBmaXJzdCB0d28KKyAgLy8gYXJndW1lbnRzIGRldGVybWluZSB3aGljaCB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkLiAgSWYgVCBpcyBhbgorICAvLyBTVEwtc3R5bGUgY29udGFpbmVyLCB0aGUgdmVyc2lvbiBmb3IgY29udGFpbmVyIHdpbGwgYmUgY2FsbGVkOyBpZgorICAvLyBUIGlzIGEgcG9pbnRlciwgdGhlIHBvaW50ZXIgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZDsgb3RoZXJ3aXNlIHRoZQorICAvLyBnZW5lcmljIHZlcnNpb24gd2lsbCBiZSBjYWxsZWQuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUsIHByaW9yIHRvIHdlIGNoZWNrCisgIC8vIGZvciBwcm90b2NvbCBtZXNzYWdlIHR5cGVzIGluIG91ciBvcGVyYXRvcjw8LiAgVGhlIHJhdGlvbmFsZSBpczoKKyAgLy8KKyAgLy8gRm9yIHByb3RvY29sIG1lc3NhZ2VzLCB3ZSB3YW50IHRvIGdpdmUgcGVvcGxlIGEgY2hhbmNlIHRvCisgIC8vIG92ZXJyaWRlIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGJ5IGRlZmluaW5nIGEgUHJpbnRUbygpIG9yCisgIC8vIG9wZXJhdG9yPDwuICBGb3IgU1RMIGNvbnRhaW5lcnMsIG90aGVyIGZvcm1hdHMgY2FuIGJlCisgIC8vIGluY29tcGF0aWJsZSB3aXRoIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGZvciB0aGUgY29udGFpbmVyCisgIC8vIGVsZW1lbnRzOyB0aGVyZWZvcmUgd2UgY2hlY2sgZm9yIGNvbnRhaW5lciB0eXBlcyBoZXJlIHRvIGVuc3VyZQorICAvLyB0aGF0IG91ciBmb3JtYXQgaXMgdXNlZC4KKyAgLy8KKyAgLy8gVGhlIHNlY29uZCBhcmd1bWVudCBvZiBEZWZhdWx0UHJpbnRUbygpIGlzIG5lZWRlZCB0byBieXBhc3MgYSBidWcKKyAgLy8gaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciB0aGF0IHByZXZlbnRzIGl0IGZyb20gcGlja2luZyB0aGUgcmlnaHQKKyAgLy8gb3ZlcmxvYWQgYmV0d2VlbjoKKyAgLy8KKyAgLy8gICBQcmludFRvKGNvbnN0IFQmIHgsIC4uLik7CisgIC8vICAgUHJpbnRUbyhUKiB4LCAuLi4pOworICBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lclRlc3Q8VD4oMCksIGlzX3BvaW50ZXI8VD4oKSwgdmFsdWUsIG9zKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyBsaXN0IG9mIFByaW50VG8oKSBvdmVybG9hZHMgdGVsbHMKKy8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgaG93IHRvIHByaW50IHN0YW5kYXJkIHR5cGVzIChidWlsdC1pbgorLy8gdHlwZXMsIHN0cmluZ3MsIHBsYWluIGFycmF5cywgYW5kIHBvaW50ZXJzKS4KKworLy8gT3ZlcmxvYWRzIGZvciB2YXJpb3VzIGNoYXIgdHlwZXMuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAvLyBXaGVuIHByaW50aW5nIGEgcGxhaW4gY2hhciwgd2UgYWx3YXlzIHRyZWF0IGl0IGFzIHVuc2lnbmVkLiAgVGhpcworICAvLyB3YXksIHRoZSBvdXRwdXQgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGUgY29tcGlsZXIgdGhpbmtzCisgIC8vIGNoYXIgaXMgc2lnbmVkIG9yIG5vdC4KKyAgUHJpbnRUbyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSwgb3MpOworfQorCisvLyBPdmVybG9hZHMgZm9yIG90aGVyIHNpbXBsZSBidWlsdC1pbiB0eXBlcy4KK2lubGluZSB2b2lkIFByaW50VG8oYm9vbCB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICh4ID8gInRydWUiIDogImZhbHNlIik7Cit9CisKKy8vIE92ZXJsb2FkIGZvciB3Y2hhcl90IHR5cGUuCisvLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwKKy8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBkZWNpbWFsIGNvZGUgKGV4Y2VwdCBmb3IgTCdcMCcpLgorLy8gVGhlIEwnXDAnIGNoYXIgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4gVGhlIGRlY2ltYWwgY29kZSBpcyBwcmludGVkCisvLyBhcyBzaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbXBpbGVyCisvLyBhcyBhIHNpZ25lZCB0eXBlIGFuZCBpcyBwcmludGVkIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgd2hlbiB3Y2hhcl90CisvLyBpcyBpbXBsZW1lbnRlZCBhcyBhbiB1bnNpZ25lZCB0eXBlLgorR1RFU1RfQVBJXyB2b2lkIFByaW50VG8od2NoYXJfdCB3YywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gT3ZlcmxvYWRzIGZvciBDIHN0cmluZ3MuCitHVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IGNoYXIqPihzKSwgb3MpOworfQorCisvLyBzaWduZWQvdW5zaWduZWQgY2hhciBpcyBvZnRlbiB1c2VkIGZvciByZXByZXNlbnRpbmcgYmluYXJ5IGRhdGEsIHNvCisvLyB3ZSBwcmludCBwb2ludGVycyB0byBpdCBhcyB2b2lkKiB0byBiZSBzYWZlLgoraW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKK30KK2lubGluZSB2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CitpbmxpbmUgdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Cit9CisKKy8vIE1TVkMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdjaGFyX3QgYXMgYSB0eXBlZGVmIG9mIHVuc2lnbmVkCisvLyBzaG9ydC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgd2hlbiB3Y2hhcl90IGlzIGEgbmF0aXZlCisvLyB0eXBlLiAgV2hlbiB3Y2hhcl90IGlzIGEgdHlwZWRlZiwgZGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0CisvLyB3Y2hhcl90KiB3b3VsZCBjYXVzZSB1bnNpZ25lZCBzaG9ydCogYmUgcHJpbnRlZCBhcyBhIHdpZGUgc3RyaW5nLAorLy8gcG9zc2libHkgY2F1c2luZyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Nlcy4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKKy8vIE92ZXJsb2FkcyBmb3Igd2lkZSBDIHN0cmluZ3MKK0dURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgd2NoYXJfdCo+KHMpLCBvcyk7Cit9CisjZW5kaWYKKworLy8gT3ZlcmxvYWQgZm9yIEMgYXJyYXlzLiAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBwcmludGVkCisvLyBwcm9wZXJseS4KKworLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXksIHdpdGhvdXQgcHJpbnRpbmcKKy8vIHRoZSBjdXJseSBicmFjZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRSYXdBcnJheVRvKGNvbnN0IFQgYVtdLCBzaXplX3QgY291bnQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxQcmludChhWzBdLCBvcyk7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpICE9IGNvdW50OyBpKyspIHsKKyAgICAqb3MgPDwgIiwgIjsKKyAgICBVbml2ZXJzYWxQcmludChhW2ldLCBvcyk7CisgIH0KK30KKworLy8gT3ZlcmxvYWRzIGZvciA6OnN0cmluZyBhbmQgOjpzdGQ6OnN0cmluZy4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFN0cmluZ1RvKHMsIG9zKTsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKKworR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdGQ6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRTdHJpbmdUbyhzLCBvcyk7Cit9CisKKy8vIE92ZXJsb2FkcyBmb3IgOjp3c3RyaW5nIGFuZCA6OnN0ZDo6d3N0cmluZy4KKyNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKK0dURVNUX0FQSV8gdm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKK2lubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19TVERfV1NUUklORworR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7CitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKKy8vIE92ZXJsb2FkIGZvciA6OnN0ZDo6dHIxOjp0dXBsZS4gIE5lZWRlZCBmb3IgcHJpbnRpbmcgZnVuY3Rpb24gYXJndW1lbnRzLAorLy8gd2hpY2ggYXJlIHBhY2tlZCBhcyB0dXBsZXMuCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSB0dXBsZS4gIFQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gYSB0dXBsZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VHVwbGVUbyhjb25zdCBUJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpOworCisvLyBPdmVybG9hZGVkIFByaW50VG8oKSBmb3IgdHVwbGVzIG9mIHZhcmlvdXMgYXJpdGllcy4gIFdlIHN1cHBvcnQKKy8vIHR1cGxlcyBvZiB1cC10byAxMCBmaWVsZHMuICBUaGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIHdvcmtzCisvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdHIxOjp0dXBsZSBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUKKy8vIG5vbi1zdGFuZGFyZCB2YXJpYWRpYyB0ZW1wbGF0ZSBmZWF0dXJlIG9yIG5vdC4KKworaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTw+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgordm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNj4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+JiB0LAorICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBQcmludFR1cGxlVG8odCwgb3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK3ZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiYgdCwKKyAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgordm9pZCBQcmludFRvKAorICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4mIHQsCisgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgIFByaW50VHVwbGVUbyh0LCBvcyk7Cit9CisjZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKKworLy8gT3ZlcmxvYWQgZm9yIHN0ZDo6cGFpci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnBhaXI8VDEsIFQyPiYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAqb3MgPDwgJygnOworICAvLyBXZSBjYW5ub3QgdXNlIFVuaXZlcnNhbFByaW50KHZhbHVlLmZpcnN0LCBvcykgaGVyZSwgYXMgVDEgbWF5IGJlCisgIC8vIGEgcmVmZXJlbmNlIHR5cGUuICBUaGUgc2FtZSBmb3IgcHJpbnRpbmcgdmFsdWUuc2Vjb25kLgorICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUuZmlyc3QsIG9zKTsKKyAgKm9zIDw8ICIsICI7CisgIFVuaXZlcnNhbFByaW50ZXI8VDI+OjpQcmludCh2YWx1ZS5zZWNvbmQsIG9zKTsKKyAgKm9zIDw8ICcpJzsKK30KKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIGJ5IGxldHRpbmcgdGhlIGNvbXBpbGVyCisvLyBwaWNrIHRoZSByaWdodCBvdmVybG9hZCBvZiBQcmludFRvKCkgZm9yIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFVuaXZlcnNhbFByaW50ZXIgeworIHB1YmxpYzoKKyAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCisgIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTgwKSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MTgwLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisgIC8vIE5vdGU6IHdlIGRlbGliZXJhdGVseSBkb24ndCBjYWxsIHRoaXMgUHJpbnRUbygpLCBhcyB0aGF0IG5hbWUKKyAgLy8gY29uZmxpY3RzIHdpdGggOjp0ZXN0aW5nOjppbnRlcm5hbDo6UHJpbnRUbyBpbiB0aGUgYm9keSBvZiB0aGUKKyAgLy8gZnVuY3Rpb24uCisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAvLyBCeSBkZWZhdWx0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvKCkgaXMgdXNlZCBmb3IgcHJpbnRpbmcKKyAgICAvLyB0aGUgdmFsdWUuCisgICAgLy8KKyAgICAvLyBUaGFua3MgdG8gS29lbmlnIGxvb2stdXAsIGlmIFQgaXMgYSBjbGFzcyBhbmQgaGFzIGl0cyBvd24KKyAgICAvLyBQcmludFRvKCkgZnVuY3Rpb24gZGVmaW5lZCBpbiBpdHMgbmFtZXNwYWNlLCB0aGF0IGZ1bmN0aW9uIHdpbGwKKyAgICAvLyBiZSB2aXNpYmxlIGhlcmUuICBTaW5jZSBpdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIGdlbmVyaWMgb25lcworICAgIC8vIGluIDo6dGVzdGluZzo6aW50ZXJuYWwsIGl0IHdpbGwgYmUgcGlja2VkIGJ5IHRoZSBjb21waWxlciBpbiB0aGUKKyAgICAvLyBmb2xsb3dpbmcgc3RhdGVtZW50IC0gZXhhY3RseSB3aGF0IHdlIHdhbnQuCisgICAgUHJpbnRUbyh2YWx1ZSwgb3MpOworICB9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KKyNlbmRpZiAgLy8gX01TQ19WRVIKK307CisKKy8vIFVuaXZlcnNhbFByaW50QXJyYXkoYmVnaW4sIGxlbiwgb3MpIHByaW50cyBhbiBhcnJheSBvZiAnbGVuJworLy8gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IFQqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgKm9zIDw8ICJ7fSI7CisgIH0gZWxzZSB7CisgICAgKm9zIDw8ICJ7ICI7CisgICAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxODsKKyAgICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDg7CisgICAgLy8gSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4ga1RocmVzaG9sZCBlbGVtZW50cywgd2UnbGwgaGF2ZSB0bworICAgIC8vIG9taXQgc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdAorICAgIC8vIGtDaHVua1NpemUgZWxlbWVudHMuCisgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgorICAgIGlmIChsZW4gPD0ga1RocmVzaG9sZCkgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBsZW4sIG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBrQ2h1bmtTaXplLCBvcyk7CisgICAgICAqb3MgPDwgIiwgLi4uLCAiOworICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luICsgbGVuIC0ga0NodW5rU2l6ZSwga0NodW5rU2l6ZSwgb3MpOworICAgIH0KKyAgICAqb3MgPDwgIiB9IjsKKyAgfQorfQorLy8gVGhpcyBvdmVybG9hZCBwcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgY29tcGFjdGx5LgorR1RFU1RfQVBJXyB2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3QgY2hhciogYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKKworLy8gSW1wbGVtZW50cyBwcmludGluZyBhbiBhcnJheSB0eXBlIFRbTl0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitjbGFzcyBVbml2ZXJzYWxQcmludGVyPFRbTl0+IHsKKyBwdWJsaWM6CisgIC8vIFByaW50cyB0aGUgZ2l2ZW4gYXJyYXksIG9taXR0aW5nIHNvbWUgZWxlbWVudHMgd2hlbiB0aGVyZSBhcmUgdG9vCisgIC8vIG1hbnkuCisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZhKVtOXSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgVW5pdmVyc2FsUHJpbnRBcnJheShhLCBOLCBvcyk7CisgIH0KK307CisKKy8vIEltcGxlbWVudHMgcHJpbnRpbmcgYSByZWZlcmVuY2UgdHlwZSBUJi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVW5pdmVyc2FsUHJpbnRlcjxUJj4geworIHB1YmxpYzoKKyAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCisgIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTgwKSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MTgwLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorCisgIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAvLyBQcmludHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlLiAgV2UgdXNlIHJlaW50ZXJwcmV0X2Nhc3QgaGVyZQorICAgIC8vIGFzIHN0YXRpY19jYXN0IGRvZXNuJ3QgY29tcGlsZSB3aGVuIFQgaXMgYSBmdW5jdGlvbiB0eXBlLgorICAgICpvcyA8PCAiQCIgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJnZhbHVlKSA8PCAiICI7CisKKyAgICAvLyBUaGVuIHByaW50cyB0aGUgdmFsdWUgaXRzZWxmLgorICAgIFVuaXZlcnNhbFByaW50KHZhbHVlLCBvcyk7CisgIH0KKworI2lmZGVmIF9NU0NfVkVSCisjIHByYWdtYSB3YXJuaW5nKHBvcCkgICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VuZGlmICAvLyBfTVNDX1ZFUgorfTsKKworLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkIHZhbHVlCisvLyAoYnV0IG5vdCB0aGUgYWRkcmVzcykgaXMgcHJpbnRlZDsgZm9yIGEgKGNvbnN0KSBjaGFyIHBvaW50ZXIsIHRoZQorLy8gTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcyBwcmludGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFVuaXZlcnNhbFRlcnNlUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOworfQoraW5saW5lIHZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAqb3MgPDwgIk5VTEwiOworICB9IGVsc2UgeworICAgIFVuaXZlcnNhbFByaW50KHN0cmluZyhzdHIpLCBvcyk7CisgIH0KK30KK2lubGluZSB2b2lkIFVuaXZlcnNhbFRlcnNlUHJpbnQoY2hhciogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgVW5pdmVyc2FsVGVyc2VQcmludChzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc3RyKSwgb3MpOworfQorCisvLyBQcmludHMgYSB2YWx1ZSB1c2luZyB0aGUgdHlwZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuICBUaGUKKy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBVbml2ZXJzYWxUZXJzZVByaW50KCkgaXMgdGhhdCBmb3IgYQorLy8gKGNvbnN0KSBjaGFyIHBvaW50ZXIsIHRoaXMgcHJpbnRzIGJvdGggdGhlIHBvaW50ZXIgYW5kIHRoZQorLy8gTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFVuaXZlcnNhbFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zKTsKK30KKworI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKK3R5cGVkZWYgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+IFN0cmluZ3M7CisKKy8vIFRoaXMgaGVscGVyIHRlbXBsYXRlIGFsbG93cyBQcmludFRvKCkgZm9yIHR1cGxlcyBhbmQKKy8vIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygpIHRvIGJlIGRlZmluZWQgYnkKKy8vIGluZHVjdGlvbiBvbiB0aGUgbnVtYmVyIG9mIHR1cGxlIGZpZWxkcy4gIFRoZSBpZGVhIGlzIHRoYXQKKy8vIFR1cGxlUHJlZml4UHJpbnRlcjxOPjo6UHJpbnRQcmVmaXhUbyh0LCBvcykgcHJpbnRzIHRoZSBmaXJzdCBOCisvLyBmaWVsZHMgaW4gdHVwbGUgdCwgYW5kIGNhbiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mCisvLyBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+LgorCisvLyBUaGUgaW5kdWN0aXZlIGNhc2UuCit0ZW1wbGF0ZSA8c2l6ZV90IE4+CitzdHJ1Y3QgVHVwbGVQcmVmaXhQcmludGVyIHsKKyAgLy8gUHJpbnRzIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBhIHR1cGxlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT46OlByaW50UHJlZml4VG8odCwgb3MpOworICAgICpvcyA8PCAiLCAiOworICAgIFVuaXZlcnNhbFByaW50ZXI8dHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxOIC0gMSwgVHVwbGU+Ojp0eXBlPgorICAgICAgICA6OlByaW50KDo6c3RkOjp0cjE6OmdldDxOIC0gMT4odCksIG9zKTsKKyAgfQorCisgIC8vIFRlcnNlbHkgcHJpbnRzIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBhIHR1cGxlIHRvIGEgc3RyaW5nIHZlY3RvciwKKyAgLy8gb25lIGVsZW1lbnQgZm9yIGVhY2ggZmllbGQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYgdCwgU3RyaW5ncyogc3RyaW5ncykgeworICAgIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT46OlRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModCwgc3RyaW5ncyk7CisgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBVbml2ZXJzYWxUZXJzZVByaW50KDo6c3RkOjp0cjE6OmdldDxOIC0gMT4odCksICZzcyk7CisgICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKKyAgfQorfTsKKworLy8gQmFzZSBjYXNlcy4KK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVHVwbGVQcmVmaXhQcmludGVyPDA+IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgorICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiwgOjpzdGQ6Om9zdHJlYW0qKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KKyAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYsIFN0cmluZ3MqKSB7fQorfTsKKy8vIFdlIGhhdmUgdG8gc3BlY2lhbGl6ZSB0aGUgZW50aXJlIFR1cGxlUHJlZml4UHJpbnRlcjw+IGNsYXNzCisvLyB0ZW1wbGF0ZSBoZXJlLCBldmVuIHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZgorLy8gVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncygpIGlzIHRoZSBzYW1lIGFzIHRoZSBnZW5lcmljIHZlcnNpb24sIGFzCisvLyBFbWJhcmNhZGVybyAoZm9ybWVybHkgQ29kZUdlYXIsIGZvcm1lcmx5IEJvcmxhbmQpIEMrKyBkb2Vzbid0CisvLyBzdXBwb3J0IHNwZWNpYWxpemluZyBhIG1ldGhvZCB0ZW1wbGF0ZSBvZiBhIGNsYXNzIHRlbXBsYXRlLgordGVtcGxhdGUgPD4KK3N0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MT4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgIFVuaXZlcnNhbFByaW50ZXI8dHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDwwLCBUdXBsZT46OnR5cGU+OjoKKyAgICAgICAgUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PDA+KHQpLCBvcyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CisgIHN0YXRpYyB2b2lkIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3MoY29uc3QgVHVwbGUmIHQsIFN0cmluZ3MqIHN0cmluZ3MpIHsKKyAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIFVuaXZlcnNhbFRlcnNlUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PDA+KHQpLCAmc3MpOworICAgIHN0cmluZ3MtPnB1c2hfYmFjayhzcy5zdHIoKSk7CisgIH0KK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSB0dXBsZS4gIFQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aAorLy8gYSB0dXBsZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFByaW50VHVwbGVUbyhjb25zdCBUJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgKm9zIDw8ICIoIjsKKyAgVHVwbGVQcmVmaXhQcmludGVyPCA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPFQ+Ojp2YWx1ZT46OgorICAgICAgUHJpbnRQcmVmaXhUbyh0LCBvcyk7CisgICpvcyA8PCAiKSI7Cit9CisKKy8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQorLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gIFNlZSB0aGUgY29tbWVudCBiZWZvcmUKKy8vIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBmb3IgaG93IHdlIGRlZmluZSAidGVyc2VseSIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CitTdHJpbmdzIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhjb25zdCBUdXBsZSYgdmFsdWUpIHsKKyAgU3RyaW5ncyByZXN1bHQ7CisgIFR1cGxlUHJlZml4UHJpbnRlcjwgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlPjo6CisgICAgICBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKHZhbHVlLCAmcmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cis6OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpIHsKKyAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgaW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnQodmFsdWUsICZzcyk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIE91dHB1dHMgYSBtZXNzYWdlIGV4cGxhaW5pbmcgaW52YWxpZCByZWdpc3RyYXRpb24gb2YgZGlmZmVyZW50CisvLyBmaXh0dXJlIGNsYXNzIGZvciB0aGUgc2FtZSB0ZXN0IGNhc2UuIFRoaXMgbWF5IGhhcHBlbiB3aGVuCisvLyBURVNUX1AgbWFjcm8gaXMgdXNlZCB0byBkZWZpbmUgdHdvIHRlc3RzIHdpdGggdGhlIHNhbWUgbmFtZQorLy8gYnV0IGluIGRpZmZlcmVudCBuYW1lc3BhY2VzLgorR1RFU1RfQVBJXyB2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U7Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFBhcmFtR2VuZXJhdG9yOworCisvLyBJbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uCisvLyBvZiBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUGFyYW1JdGVyYXRvckludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5QYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKCkge30KKyAgLy8gQSBwb2ludGVyIHRvIHRoZSBiYXNlIGdlbmVyYXRvciBpbnN0YW5jZS4KKyAgLy8gVXNlZCBvbmx5IGZvciB0aGUgcHVycG9zZXMgb2YgaXRlcmF0b3IgY29tcGFyaXNvbgorICAvLyB0byBtYWtlIHN1cmUgdGhhdCB0d28gaXRlcmF0b3JzIGJlbG9uZyB0byB0aGUgc2FtZSBnZW5lcmF0b3IuCisgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCA9IDA7CisgIC8vIEFkdmFuY2VzIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBuZXh0IGVsZW1lbnQKKyAgLy8gcHJvdmlkZWQgYnkgdGhlIGdlbmVyYXRvci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICAvLyBmb3Igbm90IGNhbGxpbmcgQWR2YW5jZSgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvCisgIC8vIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCisgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgPSAwOworICAvLyBDbG9uZXMgdGhlIGl0ZXJhdG9yIG9iamVjdC4gVXNlZCBmb3IgaW1wbGVtZW50aW5nIGNvcHkgc2VtYW50aWNzCisgIC8vIG9mIFBhcmFtSXRlcmF0b3I8VD4uCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZSogQ2xvbmUoKSBjb25zdCA9IDA7CisgIC8vIERlcmVmZXJlbmNlcyB0aGUgY3VycmVudCBpdGVyYXRvciBhbmQgcHJvdmlkZXMgKHJlYWQtb25seSkgYWNjZXNzCisgIC8vIHRvIHRoZSBwb2ludGVkIHZhbHVlLiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgbm90IHRvIGNhbGwKKyAgLy8gQ3VycmVudCgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCisgIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3IqKCkuCisgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0ID0gMDsKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBpdGVyYXRvciBhbmQgb3RoZXIgcG9pbnQgdG8gdGhlIHNhbWUKKyAgLy8gZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IuCisgIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3I9PSgpLgorICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UmIG90aGVyKSBjb25zdCA9IDA7Cit9OworCisvLyBDbGFzcyBpdGVyYXRpbmcgb3ZlciBlbGVtZW50cyBwcm92aWRlZCBieSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uIEl0IHdyYXBzIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4KKy8vIGFuZCBpbXBsZW1lbnRzIHRoZSBjb25zdCBmb3J3YXJkIGl0ZXJhdG9yIGNvbmNlcHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgY29uc3QgVCYgcmVmZXJlbmNlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisKKyAgLy8gUGFyYW1JdGVyYXRvciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgaW1wbF8gcG9pbnRlci4KKyAgUGFyYW1JdGVyYXRvcihjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXy0+Q2xvbmUoKSkge30KKyAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSB7CisgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgaW1wbF8ucmVzZXQob3RoZXIuaW1wbF8tPkNsb25lKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICppbXBsXy0+Q3VycmVudCgpOyB9CisgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Q3VycmVudCgpOyB9CisgIC8vIFByZWZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCisgIFBhcmFtSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgaW1wbF8tPkFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgLy8gUG9zdGZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCisgIFBhcmFtSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQgLyp1bnVzZWQqLykgeworICAgIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGNsb25lID0gaW1wbF8tPkNsb25lKCk7CisgICAgaW1wbF8tPkFkdmFuY2UoKTsKKyAgICByZXR1cm4gUGFyYW1JdGVyYXRvcihjbG9uZSk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGltcGxfLmdldCgpID09IG90aGVyLmltcGxfLmdldCgpIHx8IGltcGxfLT5FcXVhbHMoKm90aGVyLmltcGxfKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgIH0KKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBQYXJhbUdlbmVyYXRvcjxUPjsKKyAgZXhwbGljaXQgUGFyYW1JdGVyYXRvcihQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9CisgIHNjb3BlZF9wdHI8UGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOworfTsKKworLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gaXMgdGhlIGJpbmFyeSBpbnRlcmZhY2UgdG8gYWNjZXNzIGdlbmVyYXRvcnMKKy8vIGRlZmluZWQgaW4gb3RoZXIgdHJhbnNsYXRpb24gdW5pdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgVCBQYXJhbVR5cGU7CisKKyAgdmlydHVhbCB+UGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UoKSB7fQorCisgIC8vIEdlbmVyYXRvciBpbnRlcmZhY2UgZGVmaW5pdGlvbgorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0ID0gMDsKK307CisKKy8vIFdyYXBzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGFuZCBwcm92aWRlcyBnZW5lcmFsIGdlbmVyYXRvciBzeW50YXgKKy8vIGNvbXBhdGlibGUgd2l0aCB0aGUgU1RMIENvbnRhaW5lciBjb25jZXB0LgorLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGNvcHkgaW5pdGlhbGl6YXRpb24gc2VtYW50aWNzIGFuZCB0aGUgY29udGFpbmVkCisvLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpbnN0YW5jZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGNvcGllcworLy8gb2YgdGhlIG9yaWdpbmFsIG9iamVjdC4gVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIHRoYXQgaW5zdGFuY2UgaXMgaW1tdXRhYmxlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFBhcmFtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgUGFyYW1JdGVyYXRvcjxUPiBpdGVyYXRvcjsKKworICBleHBsaWNpdCBQYXJhbUdlbmVyYXRvcihQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQorICBQYXJhbUdlbmVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIDogaW1wbF8ob3RoZXIuaW1wbF8pIHt9CisKKyAgUGFyYW1HZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIHsKKyAgICBpbXBsXyA9IG90aGVyLmltcGxfOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKGltcGxfLT5FbmQoKSk7IH0KKworIHByaXZhdGU6CisgIGxpbmtlZF9wdHI8Y29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gPiBpbXBsXzsKK307CisKKy8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSBhIHJhbmdlIG9mIHR3byBjb21wYXJhYmxlIHZhbHVlcy4gQ2FuIGJlIHVzZWQgdG8KKy8vIGdlbmVyYXRlIHNlcXVlbmNlcyBvZiB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBpbXBsZW1lbnQgb3BlcmF0b3IrKCkgYW5kCisvLyBvcGVyYXRvcjwoKS4KKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUgUmFuZ2UoKSBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgorY2xhc3MgUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4geworIHB1YmxpYzoKKyAgUmFuZ2VHZW5lcmF0b3IoVCBiZWdpbiwgVCBlbmQsIEluY3JlbWVudFQgc3RlcCkKKyAgICAgIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhlbmQpLAorICAgICAgICBzdGVwXyhzdGVwKSwgZW5kX2luZGV4XyhDYWxjdWxhdGVFbmRJbmRleChiZWdpbiwgZW5kLCBzdGVwKSkge30KKyAgdmlydHVhbCB+UmFuZ2VHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBiZWdpbl8sIDAsIHN0ZXBfKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGVuZF8sIGVuZF9pbmRleF8sIHN0ZXBfKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGJhc2UsIFQgdmFsdWUsIGludCBpbmRleCwKKyAgICAgICAgICAgICBJbmNyZW1lbnRUIHN0ZXApCisgICAgICAgIDogYmFzZV8oYmFzZSksIHZhbHVlXyh2YWx1ZSksIGluZGV4XyhpbmRleCksIHN0ZXBfKHN0ZXApIHt9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICB2YWx1ZV8gPSB2YWx1ZV8gKyBzdGVwXzsKKyAgICAgIGluZGV4XysrOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZ2YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBpbnQgb3RoZXJfaW5kZXggPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aW5kZXhfOworICAgICAgcmV0dXJuIGluZGV4XyA9PSBvdGhlcl9pbmRleDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4oKSwKKyAgICAgICAgICBiYXNlXyhvdGhlci5iYXNlXyksIHZhbHVlXyhvdGhlci52YWx1ZV8pLCBpbmRleF8ob3RoZXIuaW5kZXhfKSwKKyAgICAgICAgICBzdGVwXyhvdGhlci5zdGVwXykge30KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOworICAgIFQgdmFsdWVfOworICAgIGludCBpbmRleF87CisgICAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKKyAgfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcgorCisgIHN0YXRpYyBpbnQgQ2FsY3VsYXRlRW5kSW5kZXgoY29uc3QgVCYgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluY3JlbWVudFQmIHN0ZXApIHsKKyAgICBpbnQgZW5kX2luZGV4ID0gMDsKKyAgICBmb3IgKFQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpID0gaSArIHN0ZXApCisgICAgICBlbmRfaW5kZXgrKzsKKyAgICByZXR1cm4gZW5kX2luZGV4OworICB9CisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBSYW5nZUdlbmVyYXRvciYgb3RoZXIpOworCisgIGNvbnN0IFQgYmVnaW5fOworICBjb25zdCBUIGVuZF87CisgIGNvbnN0IEluY3JlbWVudFQgc3RlcF87CisgIC8vIFRoZSBpbmRleCBmb3IgdGhlIGVuZCgpIGl0ZXJhdG9yLiBBbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQKKyAgLy8gc2VxdWVuY2UgYXJlIGluZGV4ZWQgKDAtYmFzZWQpIHRvIGFpZCBpdGVyYXRvciBjb21wYXJpc29uLgorICBjb25zdCBpbnQgZW5kX2luZGV4XzsKK307ICAvLyBjbGFzcyBSYW5nZUdlbmVyYXRvcgorCisKKy8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVXNlZCBpbiB0aGUKKy8vIFZhbHVlc0luKCkgZnVuY3Rpb24uIFRoZSBlbGVtZW50cyBhcmUgY29waWVkIGZyb20gdGhlIHNvdXJjZSByYW5nZQorLy8gc2luY2UgdGhlIHNvdXJjZSBjYW4gYmUgbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB0aGUgZ2VuZXJhdG9yCisvLyBpcyBsaWtlbHkgdG8gcGVyc2lzdCBiZXlvbmQgdGhhdCBzdGFjayBmcmFtZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+CisgIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpCisgICAgICA6IGNvbnRhaW5lcl8oYmVnaW4sIGVuZCkge30KKyAgdmlydHVhbCB+VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGNvbnRhaW5lcl8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8VD4gQ29udGFpbmVyVHlwZTsKKworICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcikKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwgaXRlcmF0b3JfKGl0ZXJhdG9yKSB7fQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgKytpdGVyYXRvcl87CisgICAgICB2YWx1ZV8ucmVzZXQoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICAvLyBXZSBuZWVkIHRvIHVzZSBjYWNoZWQgdmFsdWUgcmVmZXJlbmNlZCBieSBpdGVyYXRvcl8gYmVjYXVzZSAqaXRlcmF0b3JfCisgICAgLy8gY2FuIHJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QgKGFuZCBvZiB0eXBlIG90aGVyIHRoZW4gVCksIHNvIGp1c3QKKyAgICAvLyBoYXZpbmcgInJldHVybiAmKml0ZXJhdG9yXzsiIGRvZXNuJ3Qgd29yay4KKyAgICAvLyB2YWx1ZV8gaXMgdXBkYXRlZCBoZXJlIGFuZCBub3QgaW4gQWR2YW5jZSgpIGJlY2F1c2UgQWR2YW5jZSgpCisgICAgLy8gY2FuIGFkdmFuY2UgaXRlcmF0b3JfIGJleW9uZCB0aGUgZW5kIG9mIHRoZSByYW5nZSwgYW5kIHdlIGNhbm5vdAorICAgIC8vIGRldGVjdCB0aGF0IGZhY3QuIFRoZSBjbGllbnQgY29kZSwgb24gdGhlIG90aGVyIGhhbmQsIGlzCisgICAgLy8gcmVzcG9uc2libGUgZm9yIG5vdCBjYWxsaW5nIEN1cnJlbnQoKSBvbiBhbiBvdXQtb2YtcmFuZ2UgaXRlcmF0b3IuCisgICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeworICAgICAgaWYgKHZhbHVlXy5nZXQoKSA9PSBOVUxMKQorICAgICAgICB2YWx1ZV8ucmVzZXQobmV3IFQoKml0ZXJhdG9yXykpOworICAgICAgcmV0dXJuIHZhbHVlXy5nZXQoKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGl0ZXJhdG9yXyA9PQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aXRlcmF0b3JfOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgICAgLy8gVGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgc3VwcHJlc3NlcyBhIGZhbHNlIHdhcm5pbmcKKyAgICAgICAgICAvLyBlbWl0dGVkIGJ5IGdjYyB3aGVuIHN1cHBsaWVkIHdpdGggdGhlIC1XZXh0cmEgb3B0aW9uLgorICAgICAgICA6IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4oKSwKKyAgICAgICAgICBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgICAgaXRlcmF0b3JfKG90aGVyLml0ZXJhdG9yXykge30KKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBjb25zdCBiYXNlXzsKKyAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcl87CisgICAgLy8gQSBjYWNoZWQgdmFsdWUgb2YgKml0ZXJhdG9yXy4gV2Uga2VlcCBpdCBoZXJlIHRvIGFsbG93IGFjY2VzcyBieQorICAgIC8vIHBvaW50ZXIgaW4gdGhlIHdyYXBwaW5nIGl0ZXJhdG9yJ3Mgb3BlcmF0b3ItPigpLgorICAgIC8vIHZhbHVlXyBuZWVkcyB0byBiZSBtdXRhYmxlIHRvIGJlIGFjY2Vzc2VkIGluIEN1cnJlbnQoKS4KKyAgICAvLyBVc2Ugb2Ygc2NvcGVkX3B0ciBoZWxwcyBtYW5hZ2UgY2FjaGVkIHZhbHVlJ3MgbGlmZXRpbWUsCisgICAgLy8gd2hpY2ggaXMgYm91bmQgYnkgdGhlIGxpZmVzcGFuIG9mIHRoZSBpdGVyYXRvciBpdHNlbGYuCisgICAgbXV0YWJsZSBzY29wZWRfcHRyPGNvbnN0IFQ+IHZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvciYgb3RoZXIpOworCisgIGNvbnN0IENvbnRhaW5lclR5cGUgY29udGFpbmVyXzsKK307ICAvLyBjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBTdG9yZXMgYSBwYXJhbWV0ZXIgdmFsdWUgYW5kIGxhdGVyIGNyZWF0ZXMgdGVzdHMgcGFyYW1ldGVyaXplZCB3aXRoIHRoYXQKKy8vIHZhbHVlLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeSA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2xhc3M6OlBhcmFtVHlwZSBQYXJhbVR5cGU7CisgIGV4cGxpY2l0IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSA6CisgICAgICBwYXJhbWV0ZXJfKHBhcmFtZXRlcikge30KKyAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeworICAgIFRlc3RDbGFzczo6U2V0UGFyYW0oJnBhcmFtZXRlcl8pOworICAgIHJldHVybiBuZXcgVGVzdENsYXNzKCk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IFBhcmFtVHlwZSBwYXJhbWV0ZXJfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVGVzdE1ldGFGYWN0b3J5QmFzZSBpcyBhIGJhc2UgY2xhc3MgZm9yIG1ldGEtZmFjdG9yaWVzIHRoYXQgY3JlYXRlCisvLyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLgordGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KK2NsYXNzIFRlc3RNZXRhRmFjdG9yeUJhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+VGVzdE1ldGFGYWN0b3J5QmFzZSgpIHt9CisKKyAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpID0gMDsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gVGVzdE1ldGFGYWN0b3J5IGNyZWF0ZXMgdGVzdCBmYWN0b3JpZXMgZm9yIHBhc3NpbmcgaW50bworLy8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uIFNpbmNlIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIHJlY2VpdmVzCisvLyBvd25lcnNoaXAgb2YgdGVzdCBmYWN0b3J5IHBvaW50ZXIsIHNhbWUgZmFjdG9yeSBvYmplY3QgY2Fubm90IGJlIHBhc3NlZAorLy8gaW50byB0aGF0IG1ldGhvZCB0d2ljZS4gQnV0IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gaXMgZ29pbmcgdG8gY2FsbAorLy8gaXQgZm9yIGVhY2ggVGVzdC9QYXJhbWV0ZXIgdmFsdWUgY29tYmluYXRpb24uIFRodXMgaXQgbmVlZHMgbWV0YSBmYWN0b3J5CisvLyBjcmVhdG9yIGNsYXNzLgordGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgorY2xhc3MgVGVzdE1ldGFGYWN0b3J5CisgICAgOiBwdWJsaWMgVGVzdE1ldGFGYWN0b3J5QmFzZTx0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlPiB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOworCisgIFRlc3RNZXRhRmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VGVzdE1ldGFGYWN0b3J5ICgpIHsKKworICB9CisKKyAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIHsKKyAgICByZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeTxUZXN0Q2FzZT4ocGFyYW1ldGVyKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0TWV0YUZhY3RvcnkpOworfTsKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBpcyBhIGdlbmVyaWMgaW50ZXJmYWNlCisvLyB0byBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGNsYXNzZXMuIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlCisvLyBhY2N1bXVsYXRlcyB0ZXN0IGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IFRFU1RfUCBtYWNybyBpbnZvY2F0aW9ucworLy8gYW5kIGdlbmVyYXRvcnMgcHJvdmlkZWQgYnkgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMKKy8vIGFuZCB1c2VzIHRoYXQgaW5mb3JtYXRpb24gdG8gcmVnaXN0ZXIgYWxsIHJlc3VsdGluZyB0ZXN0IGluc3RhbmNlcworLy8gaW4gUmVnaXN0ZXJUZXN0cyBtZXRob2QuIFRoZSBQYXJhbWV0ZXJpemVUZXN0Q2FzZVJlZ2lzdHJ5IGNsYXNzIGhvbGRzCisvLyBhIGNvbGxlY3Rpb24gb2YgcG9pbnRlcnMgdG8gdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gb2JqZWN0cworLy8gYW5kIGNhbGxzIFJlZ2lzdGVyVGVzdHMoKSBvbiBlYWNoIG9mIHRoZW0gd2hlbiBhc2tlZC4KK2NsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30KKworICAvLyBCYXNlIHBhcnQgb2YgdGVzdCBjYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCA9IDA7CisgIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCisgIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgPSAwOworICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMKKyAgLy8gdGVzdCBjYXNlIHJpZ2h0IGJlZm9yZSBydW5uaW5nIHRoZW0gaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KKyAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQorICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBSZWdpc3RlclRlc3RzKCkgPSAwOworCisgcHJvdGVjdGVkOgorICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSgpIHt9CisKKyBwcml2YXRlOgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKTsKK307CisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBhY2N1bXVsYXRlcyB0ZXN0cyBvYnRhaW5lZCBmcm9tIFRFU1RfUAorLy8gbWFjcm8gaW52b2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciB0ZXN0IGNhc2UgYW5kIGdlbmVyYXRvcnMKKy8vIG9idGFpbmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaW52b2NhdGlvbnMgZm9yIHRoYXQKKy8vIHRlc3QgY2FzZS4gSXQgcmVnaXN0ZXJzIHRlc3RzIHdpdGggYWxsIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWxsCisvLyBnZW5lcmF0b3JzIHdoZW4gYXNrZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+CitjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIDogcHVibGljIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsKKyBwdWJsaWM6CisgIC8vIFBhcmFtVHlwZSBhbmQgR2VuZXJhdG9yQ3JlYXRpb25GdW5jIGFyZSBwcml2YXRlIHR5cGVzIGJ1dCBhcmUgcmVxdWlyZWQKKyAgLy8gZm9yIGRlY2xhcmF0aW9ucyBvZiBwdWJsaWMgbWV0aG9kcyBBZGRUZXN0UGF0dGVybigpIGFuZAorICAvLyBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oKS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKKyAgLy8gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYXBwcm9wcmlhdGUgZ2VuZXJhdG9yIHR5cGUuCisgIHR5cGVkZWYgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPihHZW5lcmF0b3JDcmVhdGlvbkZ1bmMpKCk7CisKKyAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyhjb25zdCBjaGFyKiBuYW1lKQorICAgICAgOiB0ZXN0X2Nhc2VfbmFtZV8obmFtZSkge30KKworICAvLyBUZXN0IGNhc2UgYmFzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0VGVzdENhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfOyB9CisgIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCisgIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgeyByZXR1cm4gR2V0VHlwZUlkPFRlc3RDYXNlPigpOyB9CisgIC8vIFRFU1RfUCBtYWNybyB1c2VzIEFkZFRlc3RQYXR0ZXJuKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCisgIC8vIGFib3V0IGEgc2luZ2xlIHRlc3QgaW4gYSBMb2NhbFRlc3RJbmZvIHN0cnVjdHVyZS4KKyAgLy8gdGVzdF9jYXNlX25hbWUgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgdGVzdCBjYXNlICh3aXRob3V0IGludm9jYXRpb24KKyAgLy8gcHJlZml4KS4gdGVzdF9iYXNlX25hbWUgaXMgdGhlIG5hbWUgb2YgYW4gaW5kaXZpZHVhbCB0ZXN0IHdpdGhvdXQKKyAgLy8gcGFyYW1ldGVyIGluZGV4LiBGb3IgdGhlIHRlc3QgU2VxdWVuY2VBL0Zvb1Rlc3QuRG9CYXIvMSBGb29UZXN0IGlzCisgIC8vIHRlc3QgY2FzZSBiYXNlIG5hbWUgYW5kIERvQmFyIGlzIHRlc3QgYmFzZSBuYW1lLgorICB2b2lkIEFkZFRlc3RQYXR0ZXJuKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogbWV0YV9mYWN0b3J5KSB7CisgICAgdGVzdHNfLnB1c2hfYmFjayhsaW5rZWRfcHRyPFRlc3RJbmZvPihuZXcgVGVzdEluZm8odGVzdF9jYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9iYXNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mYWN0b3J5KSkpOworICB9CisgIC8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIHVzZXMgQWRkR2VuZXJhdG9yKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCisgIC8vIGFib3V0IGEgZ2VuZXJhdG9yLgorICBpbnQgQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKGNvbnN0IHN0cmluZyYgaW5zdGFudGlhdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNyZWF0aW9uRnVuYyogZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBmaWxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBsaW5lICovKSB7CisgICAgaW5zdGFudGlhdGlvbnNfLnB1c2hfYmFjayg6OnN0ZDo6bWFrZV9wYWlyKGluc3RhbnRpYXRpb25fbmFtZSwgZnVuYykpOworICAgIHJldHVybiAwOyAgLy8gUmV0dXJuIHZhbHVlIHVzZWQgb25seSB0byBydW4gdGhpcyBtZXRob2QgaW4gbmFtZXNwYWNlIHNjb3BlLgorICB9CisgIC8vIFVuaXRUZXN0IGNsYXNzIGludm9rZXMgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UKKyAgLy8gdGVzdCBjYXNlcyByaWdodCBiZWZvcmUgcnVubmluZyB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTIG1hY3JvLgorICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZSBvbiBhbnkgc2luZ2xlCisgIC8vIGluc3RhbmNlIG9mIGEgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgZGVyaXZlZCBjbGFzcy4KKyAgLy8gVW5pdFRlc3QgaGFzIGEgZ3VhcmQgdG8gcHJldmVudCBmcm9tIGNhbGxpbmcgdGhpcyBtZXRob2QgbW9yZSB0aGVuIG9uY2UuCisgIHZpcnR1YWwgdm9pZCBSZWdpc3RlclRlc3RzKCkgeworICAgIGZvciAodHlwZW5hbWUgVGVzdEluZm9Db250YWluZXI6Oml0ZXJhdG9yIHRlc3RfaXQgPSB0ZXN0c18uYmVnaW4oKTsKKyAgICAgICAgIHRlc3RfaXQgIT0gdGVzdHNfLmVuZCgpOyArK3Rlc3RfaXQpIHsKKyAgICAgIGxpbmtlZF9wdHI8VGVzdEluZm8+IHRlc3RfaW5mbyA9ICp0ZXN0X2l0OworICAgICAgZm9yICh0eXBlbmFtZSBJbnN0YW50aWF0aW9uQ29udGFpbmVyOjppdGVyYXRvciBnZW5faXQgPQorICAgICAgICAgICAgICAgaW5zdGFudGlhdGlvbnNfLmJlZ2luKCk7IGdlbl9pdCAhPSBpbnN0YW50aWF0aW9uc18uZW5kKCk7CisgICAgICAgICAgICAgICArK2dlbl9pdCkgeworICAgICAgICBjb25zdCBzdHJpbmcmIGluc3RhbnRpYXRpb25fbmFtZSA9IGdlbl9pdC0+Zmlyc3Q7CisgICAgICAgIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4gZ2VuZXJhdG9yKCgqZ2VuX2l0LT5zZWNvbmQpKCkpOworCisgICAgICAgIE1lc3NhZ2UgdGVzdF9jYXNlX25hbWVfc3RyZWFtOworICAgICAgICBpZiAoICFpbnN0YW50aWF0aW9uX25hbWUuZW1wdHkoKSApCisgICAgICAgICAgdGVzdF9jYXNlX25hbWVfc3RyZWFtIDw8IGluc3RhbnRpYXRpb25fbmFtZSA8PCAiLyI7CisgICAgICAgIHRlc3RfY2FzZV9uYW1lX3N0cmVhbSA8PCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9iYXNlX25hbWU7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT46Oml0ZXJhdG9yIHBhcmFtX2l0ID0KKyAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmJlZ2luKCk7CisgICAgICAgICAgICAgcGFyYW1faXQgIT0gZ2VuZXJhdG9yLmVuZCgpOyArK3BhcmFtX2l0LCArK2kpIHsKKyAgICAgICAgICBNZXNzYWdlIHRlc3RfbmFtZV9zdHJlYW07CisgICAgICAgICAgdGVzdF9uYW1lX3N0cmVhbSA8PCB0ZXN0X2luZm8tPnRlc3RfYmFzZV9uYW1lIDw8ICIvIiA8PCBpOworICAgICAgICAgIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAorICAgICAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgdGVzdF9uYW1lX3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICBOVUxMLCAgLy8gTm8gdHlwZSBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoKnBhcmFtX2l0KS5jX3N0cigpLAorICAgICAgICAgICAgICBHZXRUZXN0Q2FzZVR5cGVJZCgpLAorICAgICAgICAgICAgICBUZXN0Q2FzZTo6U2V0VXBUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgVGVzdENhc2U6OlRlYXJEb3duVGVzdENhc2UsCisgICAgICAgICAgICAgIHRlc3RfaW5mby0+dGVzdF9tZXRhX2ZhY3RvcnktPkNyZWF0ZVRlc3RGYWN0b3J5KCpwYXJhbV9pdCkpOworICAgICAgICB9ICAvLyBmb3IgcGFyYW1faXQKKyAgICAgIH0gIC8vIGZvciBnZW5faXQKKyAgICB9ICAvLyBmb3IgdGVzdF9pdAorICB9ICAvLyBSZWdpc3RlclRlc3RzCisKKyBwcml2YXRlOgorICAvLyBMb2NhbFRlc3RJbmZvIHN0cnVjdHVyZSBrZWVwcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSB0ZXN0IHJlZ2lzdGVyZWQKKyAgLy8gd2l0aCBURVNUX1AgbWFjcm8uCisgIHN0cnVjdCBUZXN0SW5mbyB7CisgICAgVGVzdEluZm8oY29uc3QgY2hhciogYV90ZXN0X2Nhc2VfYmFzZV9uYW1lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdGVzdF9iYXNlX25hbWUsCisgICAgICAgICAgICAgVGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+KiBhX3Rlc3RfbWV0YV9mYWN0b3J5KSA6CisgICAgICAgIHRlc3RfY2FzZV9iYXNlX25hbWUoYV90ZXN0X2Nhc2VfYmFzZV9uYW1lKSwKKyAgICAgICAgdGVzdF9iYXNlX25hbWUoYV90ZXN0X2Jhc2VfbmFtZSksCisgICAgICAgIHRlc3RfbWV0YV9mYWN0b3J5KGFfdGVzdF9tZXRhX2ZhY3RvcnkpIHt9CisKKyAgICBjb25zdCBzdHJpbmcgdGVzdF9jYXNlX2Jhc2VfbmFtZTsKKyAgICBjb25zdCBzdHJpbmcgdGVzdF9iYXNlX25hbWU7CisgICAgY29uc3Qgc2NvcGVkX3B0cjxUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4gPiB0ZXN0X21ldGFfZmFjdG9yeTsKKyAgfTsKKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGxpbmtlZF9wdHI8VGVzdEluZm8+ID4gVGVzdEluZm9Db250YWluZXI7CisgIC8vIEtlZXBzIHBhaXJzIG9mIDxJbnN0YW50aWF0aW9uIG5hbWUsIFNlcXVlbmNlIGdlbmVyYXRvciBjcmVhdGlvbiBmdW5jdGlvbj4KKyAgLy8gcmVjZWl2ZWQgZnJvbSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNyb3MuCisgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RyaW5nLCBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMqPiA+CisgICAgICBJbnN0YW50aWF0aW9uQ29udGFpbmVyOworCisgIGNvbnN0IHN0cmluZyB0ZXN0X2Nhc2VfbmFtZV87CisgIFRlc3RJbmZvQ29udGFpbmVyIHRlc3RzXzsKKyAgSW5zdGFudGlhdGlvbkNvbnRhaW5lciBpbnN0YW50aWF0aW9uc187CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvKTsKK307ICAvLyBjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgY29udGFpbnMgYSBtYXAgb2YgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UKKy8vIGNsYXNzZXMgYWNjZXNzZWQgYnkgdGVzdCBjYXNlIG5hbWVzLiBURVNUX1AgYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QCisvLyBtYWNyb3MgdXNlIGl0IHRvIGxvY2F0ZSB0aGVpciBjb3JyZXNwb25kaW5nIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8KKy8vIGRlc2NyaXB0b3JzLgorY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgeworIHB1YmxpYzoKKyAgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkoKSB7fQorICB+UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkoKSB7CisgICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgeworICAgICAgZGVsZXRlICppdDsKKyAgICB9CisgIH0KKworICAvLyBMb29rcyB1cCBvciBjcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQKKyAgLy8gdGVzdHMgYW5kIGluc3RhbnRpYXRpb25zIG9mIGEgcGFydGljdWxhciB0ZXN0IGNhc2UuCisgIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KKyAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4qIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcigKKyAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAorICAgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICAgIGludCBsaW5lKSB7CisgICAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4qIHR5cGVkX3Rlc3RfaW5mbyA9IE5VTEw7CisgICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgeworICAgICAgaWYgKCgqaXQpLT5HZXRUZXN0Q2FzZU5hbWUoKSA9PSB0ZXN0X2Nhc2VfbmFtZSkgeworICAgICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlVHlwZUlkKCkgIT0gR2V0VHlwZUlkPFRlc3RDYXNlPigpKSB7CisgICAgICAgICAgLy8gQ29tcGxhaW4gYWJvdXQgaW5jb3JyZWN0IHVzYWdlIG9mIEdvb2dsZSBUZXN0IGZhY2lsaXRpZXMKKyAgICAgICAgICAvLyBhbmQgdGVybWluYXRlIHRoZSBwcm9ncmFtIHNpbmNlIHdlIGNhbm5vdCBndWFyYW50eSBjb3JyZWN0CisgICAgICAgICAgLy8gdGVzdCBjYXNlIHNldHVwIGFuZCB0ZWFyLWRvd24gaW4gdGhpcyBjYXNlLgorICAgICAgICAgIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUodGVzdF9jYXNlX25hbWUsICBmaWxlLCBsaW5lKTsKKyAgICAgICAgICBwb3NpeDo6QWJvcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgdGhlIG9iamVjdCB3ZSBmb3VuZCBpcyBvZiB0aGUgc2FtZQorICAgICAgICAgIC8vIHR5cGUgd2UgYXJlIGxvb2tpbmcgZm9yLCBzbyB3ZSBkb3duY2FzdCBpdCB0byB0aGF0IHR5cGUKKyAgICAgICAgICAvLyB3aXRob3V0IGZ1cnRoZXIgY2hlY2tzLgorICAgICAgICAgIHR5cGVkX3Rlc3RfaW5mbyA9IENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTwKKyAgICAgICAgICAgICAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4gPigqaXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAodHlwZWRfdGVzdF9pbmZvID09IE5VTEwpIHsKKyAgICAgIHR5cGVkX3Rlc3RfaW5mbyA9IG5ldyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPih0ZXN0X2Nhc2VfbmFtZSk7CisgICAgICB0ZXN0X2Nhc2VfaW5mb3NfLnB1c2hfYmFjayh0eXBlZF90ZXN0X2luZm8pOworICAgIH0KKyAgICByZXR1cm4gdHlwZWRfdGVzdF9pbmZvOworICB9CisgIHZvaWQgUmVnaXN0ZXJUZXN0cygpIHsKKyAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7CisgICAgICAoKml0KS0+UmVnaXN0ZXJUZXN0cygpOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKj4gVGVzdENhc2VJbmZvQ29udGFpbmVyOworCisgIFRlc3RDYXNlSW5mb0NvbnRhaW5lciB0ZXN0X2Nhc2VfaW5mb3NfOworCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vICBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXworLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKKy8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcAorLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQorCisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCisKKy8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKKy8vCisvLyBDdXJyZW50bHkgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgYXQgbW9zdCA1MCBhcmd1bWVudHMgaW4gVmFsdWVzLAorLy8gYW5kIGF0IG1vc3QgMTAgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0CisvLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4KKy8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gQ29tYmluZSBpcyBsaW1pdGVkCisvLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHIxOjp0dXBsZSB3aGljaCBpcworLy8gY3VycmVudGx5IHNldCBhdCAxMC4KKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KKworLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAorLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAorLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4KKy8vIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLgordGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KK1ZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKTsKKwordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAorICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVXNlZCBpbiB0aGUgVmFsdWVzKCkgZnVuY3Rpb24gdG8gcHJvdmlkZSBwb2x5bW9ycGhpYyBjYXBhYmlsaXRpZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+CitjbGFzcyBWYWx1ZUFycmF5MSB7CisgcHVibGljOgorICBleHBsaWNpdCBWYWx1ZUFycmF5MShUMSB2MSkgOiB2MV8odjEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeyByZXR1cm4gVmFsdWVzSW4oJnYxXywgJnYxXyArIDEpOyB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIFZhbHVlQXJyYXkyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyKFQxIHYxLCBUMiB2MikgOiB2MV8odjEpLCB2Ml8odjIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitjbGFzcyBWYWx1ZUFycmF5MyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MyhUMSB2MSwgVDIgdjIsIFQzIHYzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorY2xhc3MgVmFsdWVBcnJheTQgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CitjbGFzcyBWYWx1ZUFycmF5NSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgorY2xhc3MgVmFsdWVBcnJheTYgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NikgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2NsYXNzIFZhbHVlQXJyYXk3IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitjbGFzcyBWYWx1ZUFycmF5OCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5OChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKKyAgICAgIFQ4IHY4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5OCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KK2NsYXNzIFZhbHVlQXJyYXk5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICAgIFQ5IHY5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KK2NsYXNzIFZhbHVlQXJyYXkxMCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTE+CitjbGFzcyBWYWx1ZUFycmF5MTEgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTExKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+CitjbGFzcyBWYWx1ZUFycmF5MTIgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTEyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK2NsYXNzIFZhbHVlQXJyYXkxMyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0PgorY2xhc3MgVmFsdWVBcnJheTE0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK2NsYXNzIFZhbHVlQXJyYXkxNSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MTUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUpIDogdjFfKHYxKSwgdjJfKHYyKSwKKyAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2PgorY2xhc3MgVmFsdWVBcnJheTE2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNikgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE2JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+CitjbGFzcyBWYWx1ZUFycmF5MTcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTE3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAorICAgICAgVDE3IHYxNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNyYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4PgorY2xhc3MgVmFsdWVBcnJheTE4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxOCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5PgorY2xhc3MgVmFsdWVBcnJheTE5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkxOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE5JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+CitjbGFzcyBWYWx1ZUFycmF5MjAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAorICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKKyAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCisgICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjAmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxPgorY2xhc3MgVmFsdWVBcnJheTIxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKKyAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAorICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKKyAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjEmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgorY2xhc3MgVmFsdWVBcnJheTIyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+CitjbGFzcyBWYWx1ZUFycmF5MjMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTIzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMykgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sCisgICAgICAgIHYyM199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK2NsYXNzIFZhbHVlQXJyYXkyNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0KSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+CitjbGFzcyBWYWx1ZUFycmF5MjUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKKyAgICAgIFQyNSB2MjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNj4KK2NsYXNzIFZhbHVlQXJyYXkyNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MjYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+CitjbGFzcyBWYWx1ZUFycmF5MjcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTI3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKKyAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKKyAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCisgICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAorICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4PgorY2xhc3MgVmFsdWVBcnJheTI4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCisgICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAorICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKKyAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCisgICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5PgorY2xhc3MgVmFsdWVBcnJheTI5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkyOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+CitjbGFzcyBWYWx1ZUFycmF5MzAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgorY2xhc3MgVmFsdWVBcnJheTMxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxKSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgorY2xhc3MgVmFsdWVBcnJheTMyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyKSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAorICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMyJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitjbGFzcyBWYWx1ZUFycmF5MzMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTMzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsCisgICAgICBUMzMgdjMzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCisgICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKKyAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCisgICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAorICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKKyAgICAgIHYzM18odjMzKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzMmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK2NsYXNzIFZhbHVlQXJyYXkzNCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM0JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitjbGFzcyBWYWx1ZUFycmF5MzUgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCisgICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCisgICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAorICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKKyAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksCisgICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sCisgICAgICAgIHYzNV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM1JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK2NsYXNzIFZhbHVlQXJyYXkzNiB7CisgcHVibGljOgorICBWYWx1ZUFycmF5MzYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKKyAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCisgICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNiYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+CitjbGFzcyBWYWx1ZUFycmF5MzcgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTM3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzcmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgorY2xhc3MgVmFsdWVBcnJheTM4IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAorICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzgmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5PgorY2xhc3MgVmFsdWVBcnJheTM5IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXkzOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSkgOiB2MV8odjEpLCB2Ml8odjIpLAorICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAorICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKKyAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCisgICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAorICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKKyAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzOSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+CitjbGFzcyBWYWx1ZUFycmF5NDAgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwKSA6IHYxXyh2MSksCisgICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAorICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKKyAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCisgICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAorICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwKKyAgICAgIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksCisgICAgICB2NDBfKHY0MCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxPgorY2xhc3MgVmFsdWVBcnJheTQxIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKKyAgICAgIFQ0MSB2NDEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQxJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgorY2xhc3MgVmFsdWVBcnJheTQyIHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0MihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyX307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDImIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+CitjbGFzcyBWYWx1ZUFycmF5NDMgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAorICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAorICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKKyAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCisgICAgICB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLAorICAgICAgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwKKyAgICAgIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0Mykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQzJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgorY2xhc3MgVmFsdWVBcnJheTQ0IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKKyAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCisgICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAorICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKKyAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCisgICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLAorICAgICAgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwKKyAgICAgIHY0M18odjQzKSwgdjQ0Xyh2NDQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlfLCB2NDBfLCB2NDFfLCB2NDJfLCB2NDNfLCB2NDRffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NCYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KK2NsYXNzIFZhbHVlQXJyYXk0NSB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCisgICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKKyAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCisgICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAorICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwKKyAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksCisgICAgICB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLAorICAgICAgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgeworICAgIGNvbnN0IFQgYXJyYXlbXSA9IHt2MV8sIHYyXywgdjNfLCB2NF8sIHY1XywgdjZfLCB2N18sIHY4XywgdjlfLCB2MTBfLCB2MTFfLAorICAgICAgICB2MTJfLCB2MTNfLCB2MTRfLCB2MTVfLCB2MTZfLCB2MTdfLCB2MThfLCB2MTlfLCB2MjBfLCB2MjFfLCB2MjJfLCB2MjNfLAorICAgICAgICB2MjRfLCB2MjVfLCB2MjZfLCB2MjdfLCB2MjhfLCB2MjlfLCB2MzBfLCB2MzFfLCB2MzJfLCB2MzNfLCB2MzRfLCB2MzVfLAorICAgICAgICB2MzZfLCB2MzdfLCB2MzhfLCB2MzlfLCB2NDBfLCB2NDFfLCB2NDJfLCB2NDNfLCB2NDRfLCB2NDVffTsKKyAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NSYgb3RoZXIpOworCisgIGNvbnN0IFQxIHYxXzsKKyAgY29uc3QgVDIgdjJfOworICBjb25zdCBUMyB2M187CisgIGNvbnN0IFQ0IHY0XzsKKyAgY29uc3QgVDUgdjVfOworICBjb25zdCBUNiB2Nl87CisgIGNvbnN0IFQ3IHY3XzsKKyAgY29uc3QgVDggdjhfOworICBjb25zdCBUOSB2OV87CisgIGNvbnN0IFQxMCB2MTBfOworICBjb25zdCBUMTEgdjExXzsKKyAgY29uc3QgVDEyIHYxMl87CisgIGNvbnN0IFQxMyB2MTNfOworICBjb25zdCBUMTQgdjE0XzsKKyAgY29uc3QgVDE1IHYxNV87CisgIGNvbnN0IFQxNiB2MTZfOworICBjb25zdCBUMTcgdjE3XzsKKyAgY29uc3QgVDE4IHYxOF87CisgIGNvbnN0IFQxOSB2MTlfOworICBjb25zdCBUMjAgdjIwXzsKKyAgY29uc3QgVDIxIHYyMV87CisgIGNvbnN0IFQyMiB2MjJfOworICBjb25zdCBUMjMgdjIzXzsKKyAgY29uc3QgVDI0IHYyNF87CisgIGNvbnN0IFQyNSB2MjVfOworICBjb25zdCBUMjYgdjI2XzsKKyAgY29uc3QgVDI3IHYyN187CisgIGNvbnN0IFQyOCB2MjhfOworICBjb25zdCBUMjkgdjI5XzsKKyAgY29uc3QgVDMwIHYzMF87CisgIGNvbnN0IFQzMSB2MzFfOworICBjb25zdCBUMzIgdjMyXzsKKyAgY29uc3QgVDMzIHYzM187CisgIGNvbnN0IFQzNCB2MzRfOworICBjb25zdCBUMzUgdjM1XzsKKyAgY29uc3QgVDM2IHYzNl87CisgIGNvbnN0IFQzNyB2MzdfOworICBjb25zdCBUMzggdjM4XzsKKyAgY29uc3QgVDM5IHYzOV87CisgIGNvbnN0IFQ0MCB2NDBfOworICBjb25zdCBUNDEgdjQxXzsKKyAgY29uc3QgVDQyIHY0Ml87CisgIGNvbnN0IFQ0MyB2NDNfOworICBjb25zdCBUNDQgdjQ0XzsKKyAgY29uc3QgVDQ1IHY0NV87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCisgICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCisgICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCisgICAgdHlwZW5hbWUgVDQ2PgorY2xhc3MgVmFsdWVBcnJheTQ2IHsKKyBwdWJsaWM6CisgIFZhbHVlQXJyYXk0NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKKyAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKKyAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKKyAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCisgICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAorICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKKyAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCisgICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAorICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzXywgdjQ0XywgdjQ1XywgdjQ2X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDYmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworICBjb25zdCBUNDYgdjQ2XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KK2NsYXNzIFZhbHVlQXJyYXk0NyB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NDcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSA6IHYxXyh2MSksIHYyXyh2MiksCisgICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCisgICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAorICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKKyAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCisgICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAorICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwKKyAgICAgIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksCisgICAgICB2NDdfKHY0Nykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF8sIHY0NV8sIHY0Nl8sCisgICAgICAgIHY0N199OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ3JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+CitjbGFzcyBWYWx1ZUFycmF5NDggeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCkgOiB2MV8odjEpLAorICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKKyAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCisgICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAorICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKKyAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksCisgICAgICB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLAorICAgICAgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwKKyAgICAgIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF8sIHY0NV8sIHY0Nl8sIHY0N18sCisgICAgICAgIHY0OF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ4JiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+CitjbGFzcyBWYWx1ZUFycmF5NDkgeworIHB1YmxpYzoKKyAgVmFsdWVBcnJheTQ5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCisgICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywgVDQ4IHY0OCwKKyAgICAgIFQ0OSB2NDkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKKyAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAorICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKKyAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCisgICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAorICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKKyAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksCisgICAgICB2NDVfKHY0NSksIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCksIHY0OV8odjQ5KSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKKyAgICBjb25zdCBUIGFycmF5W10gPSB7djFfLCB2Ml8sIHYzXywgdjRfLCB2NV8sIHY2XywgdjdfLCB2OF8sIHY5XywgdjEwXywgdjExXywKKyAgICAgICAgdjEyXywgdjEzXywgdjE0XywgdjE1XywgdjE2XywgdjE3XywgdjE4XywgdjE5XywgdjIwXywgdjIxXywgdjIyXywgdjIzXywKKyAgICAgICAgdjI0XywgdjI1XywgdjI2XywgdjI3XywgdjI4XywgdjI5XywgdjMwXywgdjMxXywgdjMyXywgdjMzXywgdjM0XywgdjM1XywKKyAgICAgICAgdjM2XywgdjM3XywgdjM4XywgdjM5XywgdjQwXywgdjQxXywgdjQyXywgdjQzXywgdjQ0XywgdjQ1XywgdjQ2XywgdjQ3XywKKyAgICAgICAgdjQ4XywgdjQ5X307CisgICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDkmIG90aGVyKTsKKworICBjb25zdCBUMSB2MV87CisgIGNvbnN0IFQyIHYyXzsKKyAgY29uc3QgVDMgdjNfOworICBjb25zdCBUNCB2NF87CisgIGNvbnN0IFQ1IHY1XzsKKyAgY29uc3QgVDYgdjZfOworICBjb25zdCBUNyB2N187CisgIGNvbnN0IFQ4IHY4XzsKKyAgY29uc3QgVDkgdjlfOworICBjb25zdCBUMTAgdjEwXzsKKyAgY29uc3QgVDExIHYxMV87CisgIGNvbnN0IFQxMiB2MTJfOworICBjb25zdCBUMTMgdjEzXzsKKyAgY29uc3QgVDE0IHYxNF87CisgIGNvbnN0IFQxNSB2MTVfOworICBjb25zdCBUMTYgdjE2XzsKKyAgY29uc3QgVDE3IHYxN187CisgIGNvbnN0IFQxOCB2MThfOworICBjb25zdCBUMTkgdjE5XzsKKyAgY29uc3QgVDIwIHYyMF87CisgIGNvbnN0IFQyMSB2MjFfOworICBjb25zdCBUMjIgdjIyXzsKKyAgY29uc3QgVDIzIHYyM187CisgIGNvbnN0IFQyNCB2MjRfOworICBjb25zdCBUMjUgdjI1XzsKKyAgY29uc3QgVDI2IHYyNl87CisgIGNvbnN0IFQyNyB2MjdfOworICBjb25zdCBUMjggdjI4XzsKKyAgY29uc3QgVDI5IHYyOV87CisgIGNvbnN0IFQzMCB2MzBfOworICBjb25zdCBUMzEgdjMxXzsKKyAgY29uc3QgVDMyIHYzMl87CisgIGNvbnN0IFQzMyB2MzNfOworICBjb25zdCBUMzQgdjM0XzsKKyAgY29uc3QgVDM1IHYzNV87CisgIGNvbnN0IFQzNiB2MzZfOworICBjb25zdCBUMzcgdjM3XzsKKyAgY29uc3QgVDM4IHYzOF87CisgIGNvbnN0IFQzOSB2MzlfOworICBjb25zdCBUNDAgdjQwXzsKKyAgY29uc3QgVDQxIHY0MV87CisgIGNvbnN0IFQ0MiB2NDJfOworICBjb25zdCBUNDMgdjQzXzsKKyAgY29uc3QgVDQ0IHY0NF87CisgIGNvbnN0IFQ0NSB2NDVfOworICBjb25zdCBUNDYgdjQ2XzsKKyAgY29uc3QgVDQ3IHY0N187CisgIGNvbnN0IFQ0OCB2NDhfOworICBjb25zdCBUNDkgdjQ5XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK2NsYXNzIFZhbHVlQXJyYXk1MCB7CisgcHVibGljOgorICBWYWx1ZUFycmF5NTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LAorICAgICAgVDUwIHY1MCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAorICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCisgICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAorICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKKyAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCisgICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAorICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwKKyAgICAgIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSwgdjQ5Xyh2NDkpLCB2NTBfKHY1MCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7CisgICAgY29uc3QgVCBhcnJheVtdID0ge3YxXywgdjJfLCB2M18sIHY0XywgdjVfLCB2Nl8sIHY3XywgdjhfLCB2OV8sIHYxMF8sIHYxMV8sCisgICAgICAgIHYxMl8sIHYxM18sIHYxNF8sIHYxNV8sIHYxNl8sIHYxN18sIHYxOF8sIHYxOV8sIHYyMF8sIHYyMV8sIHYyMl8sIHYyM18sCisgICAgICAgIHYyNF8sIHYyNV8sIHYyNl8sIHYyN18sIHYyOF8sIHYyOV8sIHYzMF8sIHYzMV8sIHYzMl8sIHYzM18sIHYzNF8sIHYzNV8sCisgICAgICAgIHYzNl8sIHYzN18sIHYzOF8sIHYzOV8sIHY0MF8sIHY0MV8sIHY0Ml8sIHY0M18sIHY0NF8sIHY0NV8sIHY0Nl8sIHY0N18sCisgICAgICAgIHY0OF8sIHY0OV8sIHY1MF99OworICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTUwJiBvdGhlcik7CisKKyAgY29uc3QgVDEgdjFfOworICBjb25zdCBUMiB2Ml87CisgIGNvbnN0IFQzIHYzXzsKKyAgY29uc3QgVDQgdjRfOworICBjb25zdCBUNSB2NV87CisgIGNvbnN0IFQ2IHY2XzsKKyAgY29uc3QgVDcgdjdfOworICBjb25zdCBUOCB2OF87CisgIGNvbnN0IFQ5IHY5XzsKKyAgY29uc3QgVDEwIHYxMF87CisgIGNvbnN0IFQxMSB2MTFfOworICBjb25zdCBUMTIgdjEyXzsKKyAgY29uc3QgVDEzIHYxM187CisgIGNvbnN0IFQxNCB2MTRfOworICBjb25zdCBUMTUgdjE1XzsKKyAgY29uc3QgVDE2IHYxNl87CisgIGNvbnN0IFQxNyB2MTdfOworICBjb25zdCBUMTggdjE4XzsKKyAgY29uc3QgVDE5IHYxOV87CisgIGNvbnN0IFQyMCB2MjBfOworICBjb25zdCBUMjEgdjIxXzsKKyAgY29uc3QgVDIyIHYyMl87CisgIGNvbnN0IFQyMyB2MjNfOworICBjb25zdCBUMjQgdjI0XzsKKyAgY29uc3QgVDI1IHYyNV87CisgIGNvbnN0IFQyNiB2MjZfOworICBjb25zdCBUMjcgdjI3XzsKKyAgY29uc3QgVDI4IHYyOF87CisgIGNvbnN0IFQyOSB2MjlfOworICBjb25zdCBUMzAgdjMwXzsKKyAgY29uc3QgVDMxIHYzMV87CisgIGNvbnN0IFQzMiB2MzJfOworICBjb25zdCBUMzMgdjMzXzsKKyAgY29uc3QgVDM0IHYzNF87CisgIGNvbnN0IFQzNSB2MzVfOworICBjb25zdCBUMzYgdjM2XzsKKyAgY29uc3QgVDM3IHYzN187CisgIGNvbnN0IFQzOCB2MzhfOworICBjb25zdCBUMzkgdjM5XzsKKyAgY29uc3QgVDQwIHY0MF87CisgIGNvbnN0IFQ0MSB2NDFfOworICBjb25zdCBUNDIgdjQyXzsKKyAgY29uc3QgVDQzIHY0M187CisgIGNvbnN0IFQ0NCB2NDRfOworICBjb25zdCBUNDUgdjQ1XzsKKyAgY29uc3QgVDQ2IHY0Nl87CisgIGNvbnN0IFQ0NyB2NDdfOworICBjb25zdCBUNDggdjQ4XzsKKyAgY29uc3QgVDQ5IHY0OV87CisgIGNvbnN0IFQ1MCB2NTBfOworfTsKKworIyBpZiBHVEVTVF9IQVNfQ09NQklORQorLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHZhbHVlcyBwcm9kdWNlZAorLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyKQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MikgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50Ml87CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyOjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjImIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMworICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSk7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7CisgICBwdWJsaWM6CisgICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MykKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSAgICB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiYXNlXzsKKyAgICB9CisgICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCisgICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KKyAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydCghQXRFbmQoKSk7CisgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQorICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKKyAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKKyAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAorICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKKyAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKKyAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAorICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKKyAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKKyAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAorICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSB7CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgeworICAgICAgaWYgKCFBdEVuZCgpKQorICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDRfOworICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUKKyAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiBQYXJhbVR5cGU7CisKKyAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50NV87CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDY+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNgorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsCisgICAgICAgIFQ2PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNikge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKKyAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDZfOworICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNiYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3CisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICAgIFQ3PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCkpOworICB9CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4geworICAgcHVibGljOgorICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcpCisgICAgICAgIDogYmFzZV8oYmFzZSksCisgICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAorICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKKyAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCisgICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAorICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKKyAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCisgICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDdfOworICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfKTsKKyAgICB9CisgICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCisgICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgorICAgICAgcmV0dXJuCisgICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8CisgICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8CisgICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8CisgICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8CisgICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8CisgICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8CisgICAgICAgICAgY3VycmVudDdfID09IGVuZDdfOworICAgIH0KKworICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOworCisgICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87CisgICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KKyAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187CisgICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187CisgICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOworICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc6Okl0ZXJhdG9yCisKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNyYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDg+ID4geworIHB1YmxpYzoKKyAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFBhcmFtVHlwZTsKKworICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKKyAgICAgICAgICBnOF8oZzgpIHt9CisgIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4KCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpKTsKKyAgfQorICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKKyAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKKyAgICAgICAgZzhfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKKyAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50OF87CisgICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7CisgICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87CisgICAgICAgICsrY3VycmVudDdfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgeworICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOworICAgICAgICArK2N1cnJlbnQ2XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKKyAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKKyAgICAgICAgKytjdXJyZW50NV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7CisgICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87CisgICAgICAgICsrY3VycmVudDRfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgeworICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOworICAgICAgICArK2N1cnJlbnQzXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKKyAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKKyAgICAgICAgKytjdXJyZW50Ml87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7CisgICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87CisgICAgICAgICsrY3VycmVudDFfOworICAgICAgfQorICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KKyAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCisgICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCisgICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKKyAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKKyAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9CisgICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKKyAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAorICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCisgICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8CisgICAgICAgICAoCisgICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgorICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCisgICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKKyAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgorICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCisgICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKKyAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4Xyk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKKyAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCisgICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCisgICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKKyAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCisgICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCisgICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKKyAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCisgICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCisgICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKKyAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCisgICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCisgICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKKyAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCisgICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCisgICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKKyAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCisgICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCisgICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKKyAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCisgICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCisgICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKKyAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksCisgICAgICAgIGJlZ2luOF8ob3RoZXIuYmVnaW44XyksCisgICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwKKyAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XykgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKworICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKKyAgICAgIGlmICghQXRFbmQoKSkKKyAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKKyAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18sICpjdXJyZW50OF8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF87CisgICAgfQorCisgICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7CisKKyAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKKyAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgorICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87CisgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKKyAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87CisgIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4JiBvdGhlcik7CisKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKKyAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQorICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAorICAgICAgICBUNywgVDgsIFQ5PiA+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAorICAgICAgICAgIGc5XyhnOSkge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkoKSB7fQorCisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKKyAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywKKyAgICAgICAgZzdfLmJlZ2luKCksIGc4XywgZzhfLmJlZ2luKCksIGc5XywgZzlfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAorICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5KQorICAgICAgICA6IGJhc2VfKGJhc2UpLAorICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKKyAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCisgICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAorICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKKyAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCisgICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAorICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKKyAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCksCisgICAgICAgICAgYmVnaW45XyhnOS5iZWdpbigpKSwgZW5kOV8oZzkuZW5kKCkpLCBjdXJyZW50OV8oY3VycmVudDkpICAgIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGJhc2VfOworICAgIH0KKyAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKKyAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgorICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKKyAgICAgICsrY3VycmVudDlfOworICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgeworICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOworICAgICAgICArK2N1cnJlbnQ4XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKKyAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKKyAgICAgICAgKytjdXJyZW50N187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7CisgICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187CisgICAgICAgICsrY3VycmVudDZfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgeworICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOworICAgICAgICArK2N1cnJlbnQ1XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKKyAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKKyAgICAgICAgKytjdXJyZW50NF87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7CisgICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87CisgICAgICAgICsrY3VycmVudDNfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgeworICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOworICAgICAgICArK2N1cnJlbnQyXzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKKyAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKKyAgICAgICAgKytjdXJyZW50MV87CisgICAgICB9CisgICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7CisgICAgfQorICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQorICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgeworICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKKyAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KKyAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQorICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgorICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOworICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KKyAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgorICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCisgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KKyAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKKyAgICAgICAgICgKKyAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgorICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCisgICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKKyAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgorICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCisgICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKKyAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgorICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCisgICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAorICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAorICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCisgICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAorICAgICAgICAgICAgKmN1cnJlbnQ5Xyk7CisgICAgfQorICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7CisgICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQorICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KKyAgICAgIHJldHVybgorICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAorICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAorICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAorICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAorICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAorICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAorICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XyB8fAorICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XyB8fAorICAgICAgICAgIGN1cnJlbnQ5XyA9PSBlbmQ5XzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5OjpJdGVyYXRvcgorCisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkmIG90aGVyKTsKKworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOworICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCisgICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICAgIFQ3LCBUOCwgVDksIFQxMD4gPiB7CisgcHVibGljOgorICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gUGFyYW1UeXBlOworCisgIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCisgICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KKyAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwKCkge30KKworICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCisgICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCisgICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpLCBnMTBfLCBnMTBfLmJlZ2luKCkpOworICB9CisgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAorICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAorICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpLCBnMTBfLCBnMTBfLmVuZCgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKKyAgIHB1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5LAorICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiYgZzEwLAorICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3ImIGN1cnJlbnQxMCkKKyAgICAgICAgOiBiYXNlXyhiYXNlKSwKKyAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCisgICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAorICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKKyAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCisgICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAorICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKKyAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCisgICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAorICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSwKKyAgICAgICAgICBiZWdpbjEwXyhnMTAuYmVnaW4oKSksIGVuZDEwXyhnMTAuZW5kKCkpLCBjdXJyZW50MTBfKGN1cnJlbnQxMCkgICAgeworICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gYmFzZV87CisgICAgfQorICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycworICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCisgICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7CisgICAgICBhc3NlcnQoIUF0RW5kKCkpOworICAgICAgKytjdXJyZW50MTBfOworICAgICAgaWYgKGN1cnJlbnQxMF8gPT0gZW5kMTBfKSB7CisgICAgICAgIGN1cnJlbnQxMF8gPSBiZWdpbjEwXzsKKyAgICAgICAgKytjdXJyZW50OV87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7CisgICAgICAgIGN1cnJlbnQ5XyA9IGJlZ2luOV87CisgICAgICAgICsrY3VycmVudDhfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ4XyA9PSBlbmQ4XykgeworICAgICAgICBjdXJyZW50OF8gPSBiZWdpbjhfOworICAgICAgICArK2N1cnJlbnQ3XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKKyAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKKyAgICAgICAgKytjdXJyZW50Nl87CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7CisgICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87CisgICAgICAgICsrY3VycmVudDVfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgeworICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOworICAgICAgICArK2N1cnJlbnQ0XzsKKyAgICAgIH0KKyAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKKyAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKKyAgICAgICAgKytjdXJyZW50M187CisgICAgICB9CisgICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7CisgICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187CisgICAgICAgICsrY3VycmVudDJfOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgeworICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOworICAgICAgICArK2N1cnJlbnQxXzsKKyAgICAgIH0KKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgeworICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9CisgICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7CisgICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgorICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgorICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCisgICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCisgICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQorICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKKyAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCisgICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKKyAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgorICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAorICAgICAgICAgKAorICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCisgICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKKyAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgorICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCisgICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgorICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmCisgICAgICAgICAgY3VycmVudDhfID09IHR5cGVkX290aGVyLT5jdXJyZW50OF8gJiYKKyAgICAgICAgICBjdXJyZW50OV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ5XyAmJgorICAgICAgICAgIGN1cnJlbnQxMF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxMF8pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCisgICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAorICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAorICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCisgICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAorICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAorICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCisgICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAorICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAorICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCisgICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAorICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAorICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCisgICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAorICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAorICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCisgICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAorICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAorICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCisgICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAorICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAorICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCisgICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAorICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAorICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCisgICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAorICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAorICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCisgICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pLAorICAgICAgICBiZWdpbjEwXyhvdGhlci5iZWdpbjEwXyksCisgICAgICAgIGVuZDEwXyhvdGhlci5lbmQxMF8pLAorICAgICAgICBjdXJyZW50MTBfKG90aGVyLmN1cnJlbnQxMF8pIHsKKyAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7CisgICAgICBpZiAoIUF0RW5kKCkpCisgICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCisgICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAorICAgICAgICAgICAgKmN1cnJlbnQ5XywgKmN1cnJlbnQxMF8pOworICAgIH0KKyAgICBib29sIEF0RW5kKCkgY29uc3QgeworICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKKyAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCisgICAgICByZXR1cm4KKyAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKKyAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKKyAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKKyAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKKyAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKKyAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKKyAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKKyAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKKyAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV8gfHwKKyAgICAgICAgICBjdXJyZW50MTBfID09IGVuZDEwXzsKKyAgICB9CisKKyAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKKworICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOworICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCisgICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgorICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKKyAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOworICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGJlZ2luMTBfOworICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGVuZDEwXzsKKyAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBjdXJyZW50MTBfOworICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKKyAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMDo6SXRlcmF0b3IKKworICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCYgb3RoZXIpOworCisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiBnN187CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87CisgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4gZzEwXzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAKKworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBDb21iaW5lKCkgd2l0aCBwb2x5bW9ycGhpYyBmZWF0dXJlcy4gVGhleSBhbGxvdworLy8gY2FzdGluZyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yTjxUPiB0byBQYXJhbUdlbmVyYXRvcjxVPiBpZiBUIGlzCisvLyBjb252ZXJ0aWJsZSB0byBVLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIyKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMikKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjI8VDEsIFQyPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIyJiBvdGhlcik7CisKKyAgY29uc3QgR2VuZXJhdG9yMSBnMV87CisgIGNvbnN0IEdlbmVyYXRvcjIgZzJfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyCisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzPgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIzKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMykKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzPiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM8VDEsIFQyLCBUMz4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yND4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNDxUMSwgVDIsIFQzLCBUND4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjU+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSkge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1PFQxLCBUMiwgVDMsIFQ0LCBUNT4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNQorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2PgorY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXI2KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKKyAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAorICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2KQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNj4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNiYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYKKwordGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCisgICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNz4KK2NsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI3IHsKKyBwdWJsaWM6CitDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcpCisgICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNykge30KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCisgICAgICBUNz4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiA+KAorICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNworCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjg+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKKyAgICAgICAgICBnOF8oZzgpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgorICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsCisgICAgICBUOD4gPigpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XykpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKK307ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOAorCit0ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKKyAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAorICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjk+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOSB7CisgcHVibGljOgorQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAorICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCisgICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKKyAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSkKKyAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKKyAgICAgICAgICBnOV8oZzkpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgIFQ5PiA+KCkgY29uc3QgeworICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAorICAgICAgICBUOT4gPigKKyAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAorICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pKSk7CisgIH0KKworIHByaXZhdGU6CisgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkmIG90aGVyKTsKKworICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKKyAgY29uc3QgR2VuZXJhdG9yMiBnMl87CisgIGNvbnN0IEdlbmVyYXRvcjMgZzNfOworICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKKyAgY29uc3QgR2VuZXJhdG9yNSBnNV87CisgIGNvbnN0IEdlbmVyYXRvcjYgZzZfOworICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKKyAgY29uc3QgR2VuZXJhdG9yOCBnOF87CisgIGNvbnN0IEdlbmVyYXRvcjkgZzlfOworfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI5CisKK3RlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAorICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjcsCisgICAgY2xhc3MgR2VuZXJhdG9yOCwgY2xhc3MgR2VuZXJhdG9yOSwgY2xhc3MgR2VuZXJhdG9yMTA+CitjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAgeworIHB1YmxpYzoKK0NhcnRlc2lhblByb2R1Y3RIb2xkZXIxMChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCisgICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKKyAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LAorICAgIGNvbnN0IEdlbmVyYXRvcjkmIGc5LCBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKQorICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAorICAgICAgICAgIGc5XyhnOSksIGcxMF8oZzEwKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KKyAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKKyAgICAgIFQ5LCBUMTA+ID4oKSBjb25zdCB7CisgICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCisgICAgICAgIFQ5LCBUMTA+ID4oCisgICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwKKyAgICAgICAgICAgIFQxMD4oCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ5PiA+KGc5XyksCisgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxMD4gPihnMTBfKSkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMCYgb3RoZXIpOworCisgIGNvbnN0IEdlbmVyYXRvcjEgZzFfOworICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKKyAgY29uc3QgR2VuZXJhdG9yMyBnM187CisgIGNvbnN0IEdlbmVyYXRvcjQgZzRfOworICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKKyAgY29uc3QgR2VuZXJhdG9yNiBnNl87CisgIGNvbnN0IEdlbmVyYXRvcjcgZzdfOworICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKKyAgY29uc3QgR2VuZXJhdG9yOSBnOV87CisgIGNvbnN0IEdlbmVyYXRvcjEwIGcxMF87Cit9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwCisKKyMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEZ1bmN0aW9ucyBwcm9kdWNpbmcgcGFyYW1ldGVyIGdlbmVyYXRvcnMuCisvLworLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGVzZSBnZW5lcmF0b3JzIHRvIHByb2R1Y2UgcGFyYW1ldGVycyBmb3IgdmFsdWUtCisvLyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBXaGVuIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgaXMgaW5zdGFudGlhdGVkCisvLyB3aXRoIGEgcGFydGljdWxhciBnZW5lcmF0b3IsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYW5kIHJ1bnMgdGVzdHMKKy8vIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuCisvLworLy8gSW4gdGhlIGZvbGxvd2luZyBzYW1wbGUsIHRlc3RzIGZyb20gdGVzdCBjYXNlIEZvb1Rlc3QgYXJlIGluc3RhbnRpYXRlZAorLy8gZWFjaCB0aHJlZSB0aW1lcyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgMywgNSwgYW5kIDg6CisvLworLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geyAuLi4gfTsKKy8vCisvLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoaXMpIHsKKy8vIH0KKy8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhhdCkgeworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdFNlcXVlbmNlLCBGb29UZXN0LCBWYWx1ZXMoMywgNSwgOCkpOworLy8KKworLy8gUmFuZ2UoKSByZXR1cm5zIGdlbmVyYXRvcnMgcHJvdmlkaW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgaW4gYSByYW5nZS4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFJhbmdlKHN0YXJ0LCBlbmQpCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCsxLAorLy8gICAgIHN0YXJ0KzIsIC4uLiwgfS4KKy8vIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCtzdGVwLAorLy8gICAgIHN0YXJ0K3N0ZXArc3RlcCwgLi4uLCB9LgorLy8gTm90ZXM6CisvLyAgICogVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgbmV2ZXIgaW5jbHVkZSBlbmQuIEZvciBleGFtcGxlLCBSYW5nZSgxLCA1KQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2UgezEsIDIsIDMsIDR9LiBSYW5nZSgxLCA5LCAyKQorLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHsxLCAzLCA1LCA3fS4KKy8vICAgKiBzdGFydCBhbmQgZW5kIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBUaGF0IHR5cGUgbWF5IGJlIGFueSBpbnRlZ3JhbCBvcgorLy8gICAgIGZsb2F0aW5nLXBvaW50IHR5cGUgb3IgYSB1c2VyIGRlZmluZWQgdHlwZSBzYXRpc2Z5aW5nIHRoZXNlIGNvbmRpdGlvbnM6CisvLyAgICAgKiBJdCBtdXN0IGJlIGFzc2lnbmFibGUgKGhhdmUgb3BlcmF0b3I9KCkgZGVmaW5lZCkuCisvLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3IrKCkgKG9wZXJhdG9yKyhpbnQtY29tcGF0aWJsZSB0eXBlKSBmb3IKKy8vICAgICAgIHR3by1vcGVyYW5kIHZlcnNpb24pLgorLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yPCgpIGRlZmluZWQuCisvLyAgICAgRWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMgd2lsbCBhbHNvIGhhdmUgdGhhdCB0eXBlLgorLy8gICAqIENvbmRpdGlvbiBzdGFydCA8IGVuZCBtdXN0IGJlIHNhdGlzZmllZCBpbiBvcmRlciBmb3IgcmVzdWx0aW5nIHNlcXVlbmNlcworLy8gICAgIHRvIGNvbnRhaW4gYW55IGVsZW1lbnRzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgoraW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApIHsKKyAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6UmFuZ2VHZW5lcmF0b3I8VCwgSW5jcmVtZW50VD4oc3RhcnQsIGVuZCwgc3RlcCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCkgeworICByZXR1cm4gUmFuZ2Uoc3RhcnQsIGVuZCwgMSk7Cit9CisKKy8vIFZhbHVlc0luKCkgZnVuY3Rpb24gYWxsb3dzIGdlbmVyYXRpb24gb2YgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGNvbWluZyBmcm9tCisvLyBhIGNvbnRhaW5lci4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQorLy8gICAgIGEgQy1zdHlsZSBhcnJheS4KKy8vIFZhbHVlc0luKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KKy8vICAgICBhbiBTVEwtc3R5bGUgY29udGFpbmVyLgorLy8gVmFsdWVzSW4oSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCisvLyAgICAgYSByYW5nZSBbYmVnaW4sIGVuZCkgZGVmaW5lZCBieSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVGhlc2UKKy8vICAgICBpdGVyYXRvcnMgY2FuIGFsc28gYmUgcGxhaW4gQyBwb2ludGVycy4KKy8vCisvLyBQbGVhc2Ugbm90ZSB0aGF0IFZhbHVlc0luIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lcnMKKy8vIHBhc3NlZCBpbiBhbmQga2VlcHMgdGhlbSB0byBnZW5lcmF0ZSB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTKCkuCisvLworLy8gRXhhbXBsZXM6CisvLworLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RyaW5nVGVzdAorLy8gZWFjaCB3aXRoIEMtc3RyaW5nIHZhbHVlcyBvZiAiZm9vIiwgImJhciIsIGFuZCAiYmF6IjoKKy8vCisvLyBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6In07CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJpbmdTZXF1ZW5jZSwgU3J0aW5nVGVzdCwgVmFsdWVzSW4oc3RyaW5ncykpOworLy8KKy8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0bFN0cmluZ1Rlc3QKKy8vIGVhY2ggd2l0aCBTVEwgc3RyaW5ncyB3aXRoIHZhbHVlcyAiYSIgYW5kICJiIjoKKy8vCisvLyA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBHZXRQYXJhbWV0ZXJTdHJpbmdzKCkgeworLy8gICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiB2OworLy8gICB2LnB1c2hfYmFjaygiYSIpOworLy8gICB2LnB1c2hfYmFjaygiYiIpOworLy8gICByZXR1cm4gdjsKKy8vIH0KKy8vCisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBTdGxTdHJpbmdUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0UGFyYW1ldGVyU3RyaW5ncygpKSk7CisvLworLy8KKy8vIFRoaXMgd2lsbCBhbHNvIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gQ2hhclRlc3QKKy8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICdhJyBhbmQgJ2InOgorLy8KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IEdldFBhcmFtZXRlckNoYXJzKCkgeworLy8gICA6OnN0ZDo6bGlzdDxjaGFyPiBsaXN0OworLy8gICBsaXN0LnB1c2hfYmFjaygnYScpOworLy8gICBsaXN0LnB1c2hfYmFjaygnYicpOworLy8gICByZXR1cm4gbGlzdDsKKy8vIH0KKy8vIDo6c3RkOjpsaXN0PGNoYXI+IGwgPSBHZXRQYXJhbWV0ZXJDaGFycygpOworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlMiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJUZXN0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4obC5iZWdpbigpLCBsLmVuZCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KK2ludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKKyAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KK1ZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkgeworICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj4KKyAgICAgIDo6dmFsdWVfdHlwZSBQYXJhbVR5cGU7CisgIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPigKKyAgICAgIG5ldyBpbnRlcm5hbDo6VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yPFBhcmFtVHlwZT4oYmVnaW4sIGVuZCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkgeworICByZXR1cm4gVmFsdWVzSW4oYXJyYXksIGFycmF5ICsgTik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+CitpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKKyAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgeworICByZXR1cm4gVmFsdWVzSW4oY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Cit9CisKKy8vIFZhbHVlcygpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIGZyb20gZXhwbGljaXRseSBzcGVjaWZpZWQgbGlzdCBvZgorLy8gcGFyYW1ldGVycy4KKy8vCisvLyBTeW5vcHNpczoKKy8vIFZhbHVlcyhUIHYxLCBUIHYyLCAuLi4sIFQgdk4pCisvLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgdjEsIHYyLCAuLi4sIHZOLgorLy8KKy8vIEZvciBleGFtcGxlLCB0aGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXJUZXN0IGVhY2gKKy8vIHdpdGggdmFsdWVzICJvbmUiLCAidHdvIiwgYW5kICJ0aHJlZSI6CisvLworLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTnVtU2VxdWVuY2UsIEJhclRlc3QsIFZhbHVlcygib25lIiwgInR3byIsICJ0aHJlZSIpKTsKKy8vCisvLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXpUZXN0IGVhY2ggd2l0aCB2YWx1ZXMgMSwgMiwgMy41LgorLy8gVGhlIGV4YWN0IHR5cGUgb2YgdmFsdWVzIHdpbGwgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBpbiBCYXpUZXN0LgorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEZsb2F0aW5nTnVtYmVycywgQmF6VGVzdCwgVmFsdWVzKDEsIDIsIDMuNSkpOworLy8KKy8vIEN1cnJlbnRseSwgVmFsdWVzKCkgc3VwcG9ydHMgZnJvbSAxIHRvIDUwIHBhcmFtZXRlcnMuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxPFQxPiBWYWx1ZXMoVDEgdjEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4odjEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4gVmFsdWVzKFQxIHYxLCBUMiB2MikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4odjEsIHYyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzxUMSwgVDIsIFQzPih2MSwgdjIsIHYzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0PFQxLCBUMiwgVDMsIFQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4odjEsIHYyLCB2MywgdjQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTU8VDEsIFQyLCBUMywgVDQsIFQ1Pih2MSwgdjIsIHYzLCB2NCwgdjUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CitpbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAorICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KHYxLCB2MiwgdjMsIHY0LCB2NSwKKyAgICAgIHY2LCB2Nyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KHYxLCB2MiwgdjMsCisgICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFZhbHVlcyhUMSB2MSwKKyAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPih2MSwKKyAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAorICAgIFQxMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsCisgICAgICBUMTE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICBUMTI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKKyAgICBUMTM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAorICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCisgICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCisgICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAorICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAorICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAorICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMT4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCisgICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAorICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCisgICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCisgICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4odjEsIHYyLCB2MywgdjQsCisgICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKKyAgICAgIHYyMCwgdjIxLCB2MjIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKKyAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKKyAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAorICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPih2MSwgdjIsIHYzLAorICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4odjEsIHYyLAorICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCisgICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVmFsdWVzKFQxIHYxLAorICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKKyAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAorICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4odjEsCisgICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAorICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICBUMjY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsCisgICAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKKyAgICBUMjc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCisgICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAorICAgIFQyOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCisgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKKyAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAorICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKKyAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAorICAgICAgdjI4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KK2ludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAorICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCisgICAgICB2MjcsIHYyOCwgdjI5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKKyAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKKyAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAorICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKKyAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAorICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxPgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCisgICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCisgICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+CitpbnRlcm5hbDo6VmFsdWVBcnJheTMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMikgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAorICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCisgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+CitpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKKyAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKKyAgICBUMzIgdjMyLCBUMzMgdjMzKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAorICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKKyAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKKyAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAorICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCisgICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCisgICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKKyAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAorICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCisgICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCisgICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCisgICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCisgICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCisgICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAorICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKKyAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLAorICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksCisgICAgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAorICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKKyAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNj4KK2ludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2Pih2MSwgdjIsIHYzLCB2NCwKKyAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKKyAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+KHYxLCB2MiwgdjMsCisgICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCisgICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywKKyAgICAgIHYzNCwgdjM1LCB2MzYsIHYzNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCisgICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCisgICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKKyAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LAorICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsCisgICAgVDM3IHYzNywgVDM4IHYzOCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4Pih2MSwgdjIsCisgICAgICB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwKKyAgICAgIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLAorICAgICAgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+CitpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAorICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAorICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCisgICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKKyAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAorICAgIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5Pih2MSwKKyAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsCisgICAgICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwKKyAgICAgIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBWYWx1ZXMoVDEgdjEsCisgICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLAorICAgIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksCisgICAgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywKKyAgICBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LAorICAgIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAorICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksCisgICAgICB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDE+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCisgICAgVDQxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwKKyAgICAgIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LAorICAgICAgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCisgICAgVDQyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0Mj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLAorICAgICAgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsCisgICAgICB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwKKyAgICAgIHY0Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKKyAgICBUNDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAorICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCisgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKKyAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAorICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCisgICAgVDQyIHY0MiwgVDQzIHY0MykgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsCisgICAgICB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwKKyAgICAgIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLAorICAgICAgdjQxLCB2NDIsIHY0Myk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKKyAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAorICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCisgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKKyAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAorICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAorICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsCisgICAgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwKKyAgICAgIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAorICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAorICAgIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCisgICAgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwKKyAgICBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAorICAgIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCisgICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKKyAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAorICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAorICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCisgICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwKKyAgICAgIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDY+CitpbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKKyAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAorICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCisgICAgVDQ0LCBUNDUsIFQ0Nj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKKyAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAorICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCisgICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAorICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKKyAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAorICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCisgICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKKyAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsCisgICAgICB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCisgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywKKyAgICAgIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0Nyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4PgoraW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCisgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKKyAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAorICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKKyAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAorICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCisgICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKKyAgICBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LAorICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsCisgICAgVDQ4IHY0OCkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywKKyAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLAorICAgICAgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsCisgICAgICB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKKyAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAorICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAorICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAorICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAorICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAorICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAorICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAorICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAorICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KK2ludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAorICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAorICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsCisgICAgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwKKyAgICBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LAorICAgIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsCisgICAgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSkgeworICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKKyAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAorICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCisgICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCisgICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLAorICAgICAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsCisgICAgICB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3LCB2NDgsIHY0OSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCisgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKKyAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKKyAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKKyAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKKyAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKKyAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKKyAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKKyAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKKyAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KK2ludGVybmFsOjpWYWx1ZUFycmF5NTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAorICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCisgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKKyAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKKyAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCisgICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKKyAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAorICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsCisgICAgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwKKyAgICBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LCBUNTAgdjUwKSB7CisgIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAorICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCisgICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKKyAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPih2MSwgdjIsIHYzLCB2NCwKKyAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAorICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCisgICAgICB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywKKyAgICAgIHY0OCwgdjQ5LCB2NTApOworfQorCisvLyBCb29sKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGluIGEgc2V0IG9mIChmYWxzZSwgdHJ1ZSkuCisvLworLy8gU3lub3BzaXM6CisvLyBCb29sKCkKKy8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyB7ZmFsc2UsIHRydWV9LgorLy8KKy8vIEl0IGlzIHVzZWZ1bCB3aGVuIHRlc3RpbmcgY29kZSB0aGF0IGRlcGVuZHMgb24gQm9vbGVhbiBmbGFncy4gQ29tYmluYXRpb25zCisvLyBvZiBtdWx0aXBsZSBmbGFncyBjYW4gYmUgdGVzdGVkIHdoZW4gc2V2ZXJhbCBCb29sKCkncyBhcmUgY29tYmluZWQgdXNpbmcKKy8vIENvbWJpbmUoKSBmdW5jdGlvbi4KKy8vCisvLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYWxsIHRlc3RzIGluIHRoZSB0ZXN0IGNhc2UgRmxhZ0RlcGVuZGVudFRlc3QKKy8vIHdpbGwgYmUgaW5zdGFudGlhdGVkIHR3aWNlIHdpdGggcGFyYW1ldGVycyBmYWxzZSBhbmQgdHJ1ZS4KKy8vCisvLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGJvb2w+IHsKKy8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworLy8gICAgIGV4dGVybmFsX2ZsYWcgPSBHZXRQYXJhbSgpOworLy8gICB9CisvLyB9CisvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChCb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LCBCb29sKCkpOworLy8KK2lubGluZSBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ym9vbD4gQm9vbCgpIHsKKyAgcmV0dXJuIFZhbHVlcyhmYWxzZSwgdHJ1ZSk7Cit9CisKKyMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKKy8vIENvbWJpbmUoKSBhbGxvd3MgdGhlIHVzZXIgdG8gY29tYmluZSB0d28gb3IgbW9yZSBzZXF1ZW5jZXMgdG8gcHJvZHVjZQorLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4KKy8vCisvLyBTeW5vcHNpczoKKy8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQorLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGNvbWluZyBmcm9tCisvLyAgICAgdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkKKy8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mCisvLyAgICAgdHVwbGU8VDEsIFQyLCAuLi4sIFROPiB3aGVyZSBUMSwgVDIsIC4uLiwgVE4gYXJlIHRoZSB0eXBlcworLy8gICAgIG9mIGVsZW1lbnRzIGZyb20gc2VxdWVuY2VzIHByb2R1Y2VzIGJ5IGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4KKy8vCisvLyBDb21iaW5lIGNhbiBoYXZlIHVwIHRvIDEwIGFyZ3VtZW50cy4gVGhpcyBudW1iZXIgaXMgY3VycmVudGx5IGxpbWl0ZWQKKy8vIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUgaW1wbGVtZW50YXRpb24gdXNlZCBieSBHb29nbGUKKy8vIFRlc3QuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gdGVzdCBjYXNlIEFuaW1hbFRlc3QgZWFjaCBvbmUgd2l0aAorLy8gdGhlIHBhcmFtZXRlciB2YWx1ZXMgdHVwbGUoImNhdCIsIEJMQUNLKSwgdHVwbGUoImNhdCIsIFdISVRFKSwKKy8vIHR1cGxlKCJkb2ciLCBCTEFDSyksIGFuZCB0dXBsZSgiZG9nIiwgV0hJVEUpOgorLy8KKy8vIGVudW0gQ29sb3IgeyBCTEFDSywgR1JBWSwgV0hJVEUgfTsKKy8vIGNsYXNzIEFuaW1hbFRlc3QKKy8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGNvbnN0IGNoYXIqLCBDb2xvcj4gPiB7Li4ufTsKKy8vCisvLyBURVNUX1AoQW5pbWFsVGVzdCwgQW5pbWFsTG9va3NOaWNlKSB7Li4ufQorLy8KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFuaW1hbFZhcmlhdGlvbnMsIEFuaW1hbFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKFZhbHVlcygiY2F0IiwgImRvZyIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoQkxBQ0ssIFdISVRFKSkpOworLy8KKy8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiBGbGFnRGVwZW5kZW50VGVzdCB3aXRoIGFsbCB2YXJpYXRpb25zIG9mIHR3bworLy8gQm9vbGVhbiBmbGFnczoKKy8vCisvLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdAorLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGUoYm9vbCwgYm9vbCk+ID4geworLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisvLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7CisvLyAgIH0KKy8vIH07CisvLworLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKKy8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KKy8vIH0KKy8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7CisvLwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjI+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPigKKyAgICAgIGcxLCBnMik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMykgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+KAorICAgICAgZzEsIGcyLCBnMyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQ+CitpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICBHZW5lcmF0b3I0PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQ+KAorICAgICAgZzEsIGcyLCBnMywgZzQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4gQ29tYmluZSgKKyAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAorICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNz4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4KK2ludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKKyAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjg+KAorICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5PgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCisgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwKKyAgICBHZW5lcmF0b3I5PiBDb21iaW5lKAorICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCisgICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzkpIHsKKyAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oCisgICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCisgICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKKyAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LAorICAgIHR5cGVuYW1lIEdlbmVyYXRvcjEwPgoraW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCisgICAgR2VuZXJhdG9yMTA+IENvbWJpbmUoCisgICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSwKKyAgICAgICAgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkgeworICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAorICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKKyAgICAgIEdlbmVyYXRvcjEwPigKKyAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7Cit9CisjIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQorCisKKworIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKKyAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCisgICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKKyAgIHB1YmxpYzogXAorICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCisgICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKKyAgIHByaXZhdGU6IFwKKyAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKKyAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCisgICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCisgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdFBhdHRlcm4oXAorICAgICAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCisgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCisgICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4oKSk7IFwKKyAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgc3RhdGljIGludCBndGVzdF9yZWdpc3RlcmluZ19kdW1teV87IFwKKyAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKKyAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwKKyAgfTsgXAorICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcCisgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpBZGRUb1JlZ2lzdHJ5KCk7IFwKKyAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvcikgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCisgICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCisgIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gPSBcCisgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAorICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAorICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCisgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCisgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKKyAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXworLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKy8vCisvLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGRlZmluaXRpb25zIHVzZWZ1bCBpbiBwcm9kdWN0aW9uIGNvZGUuCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworCisvLyBXaGVuIHlvdSBuZWVkIHRvIHRlc3QgdGhlIHByaXZhdGUgb3IgcHJvdGVjdGVkIG1lbWJlcnMgb2YgYSBjbGFzcywKKy8vIHVzZSB0aGUgRlJJRU5EX1RFU1QgbWFjcm8gdG8gZGVjbGFyZSB5b3VyIHRlc3RzIGFzIGZyaWVuZHMgb2YgdGhlCisvLyBjbGFzcy4gIEZvciBleGFtcGxlOgorLy8KKy8vIGNsYXNzIE15Q2xhc3MgeworLy8gIHByaXZhdGU6CisvLyAgIHZvaWQgTXlNZXRob2QoKTsKKy8vICAgRlJJRU5EX1RFU1QoTXlDbGFzc1Rlc3QsIE15TWV0aG9kKTsKKy8vIH07CisvLworLy8gY2xhc3MgTXlDbGFzc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisvLyAgIC8vIC4uLgorLy8gfTsKKy8vCisvLyBURVNUX0YoTXlDbGFzc1Rlc3QsIE15TWV0aG9kKSB7CisvLyAgIC8vIENhbiBjYWxsIE15Q2xhc3M6Ok15TWV0aG9kKCkgaGVyZS4KKy8vIH0KKworI2RlZmluZSBGUklFTkRfVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKK2ZyaWVuZCBjbGFzcyB0ZXN0X2Nhc2VfbmFtZSMjXyMjdGVzdF9uYW1lIyNfVGVzdAorCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXworLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKKy8vCisKKyNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4KKy8vIGFzc2VydGlvbiBvciBhbiBleHBsaWNpdCBGQUlMKCksIEFERF9GQUlMVVJFKCksIG9yIFNVQ0NFU1MoKSkuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdCB7CisgcHVibGljOgorICAvLyBUaGUgcG9zc2libGUgb3V0Y29tZXMgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4gYXNzZXJ0aW9uIG9yIGFuCisgIC8vIGV4cGxpY2l0IFNVQ0NFRUQoKSwgRkFJTCgpLCBvciBBRERfRkFJTFVSRSgpKS4KKyAgZW51bSBUeXBlIHsKKyAgICBrU3VjY2VzcywgICAgICAgICAgLy8gU3VjY2VlZGVkLgorICAgIGtOb25GYXRhbEZhaWx1cmUsICAvLyBGYWlsZWQgYnV0IHRoZSB0ZXN0IGNhbiBjb250aW51ZS4KKyAgICBrRmF0YWxGYWlsdXJlICAgICAgLy8gRmFpbGVkIGFuZCB0aGUgdGVzdCBzaG91bGQgYmUgdGVybWluYXRlZC4KKyAgfTsKKworICAvLyBDJ3Rvci4gIFRlc3RQYXJ0UmVzdWx0IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKKyAgLy8gVGVzdFBhcnRSZXN1bHQgb2JqZWN0LgorICBUZXN0UGFydFJlc3VsdChUeXBlIGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgIGludCBhX2xpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX21lc3NhZ2UpCisgICAgICA6IHR5cGVfKGFfdHlwZSksCisgICAgICAgIGZpbGVfbmFtZV8oYV9maWxlX25hbWUpLAorICAgICAgICBsaW5lX251bWJlcl8oYV9saW5lX251bWJlciksCisgICAgICAgIHN1bW1hcnlfKEV4dHJhY3RTdW1tYXJ5KGFfbWVzc2FnZSkpLAorICAgICAgICBtZXNzYWdlXyhhX21lc3NhZ2UpIHsKKyAgfQorCisgIC8vIEdldHMgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgcGFydC4KKyAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgaXQncyB1bmtub3duLgorICBjb25zdCBjaGFyKiBmaWxlX25hbWUoKSBjb25zdCB7IHJldHVybiBmaWxlX25hbWVfLmNfc3RyKCk7IH0KKworICAvLyBHZXRzIHRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsCisgIC8vIG9yIC0xIGlmIGl0J3MgdW5rbm93bi4KKyAgaW50IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbGluZV9udW1iZXJfOyB9CisKKyAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgorICBjb25zdCBjaGFyKiBzdW1tYXJ5KCkgY29uc3QgeyByZXR1cm4gc3VtbWFyeV8uY19zdHIoKTsgfQorCisgIC8vIEdldHMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IHBhcnQuCisgIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXy5jX3N0cigpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IHBhc3NlZC4KKyAgYm9vbCBwYXNzZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrU3VjY2VzczsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYWlsZWQuCisgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gIT0ga1N1Y2Nlc3M7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgorICBib29sIG5vbmZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga05vbkZhdGFsRmFpbHVyZTsgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KKyAgYm9vbCBmYXRhbGx5X2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtGYXRhbEZhaWx1cmU7IH0KKyBwcml2YXRlOgorICBUeXBlIHR5cGVfOworCisgIC8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sKKyAgLy8gdHJhY2UgaW4gaXQuCisgIHN0YXRpYyBpbnRlcm5hbDo6U3RyaW5nIEV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCisgIC8vIE5VTEwgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIHVua25vd24uCisgIGludGVybmFsOjpTdHJpbmcgZmlsZV9uYW1lXzsKKyAgLy8gVGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IgLTEKKyAgLy8gaWYgdGhlIGxpbmUgbnVtYmVyIGlzIHVua25vd24uCisgIGludCBsaW5lX251bWJlcl87CisgIGludGVybmFsOjpTdHJpbmcgc3VtbWFyeV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIHN1bW1hcnkuCisgIGludGVybmFsOjpTdHJpbmcgbWVzc2FnZV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIG1lc3NhZ2UuCit9OworCisvLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKy8vIEFuIGFycmF5IG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMuCisvLworLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90CisvLyB2aXJ0dWFsLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdEFycmF5IHsKKyBwdWJsaWM6CisgIFRlc3RQYXJ0UmVzdWx0QXJyYXkoKSB7fQorCisgIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KKyAgdm9pZCBBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgorICBpbnQgc2l6ZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IGFycmF5XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOworfTsKKworLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuCitjbGFzcyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSA9IDA7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIGJ5IHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFIHRvIGNoZWNrIGlmIGEKKy8vIHN0YXRlbWVudCBnZW5lcmF0ZXMgbmV3IGZhdGFsIGZhaWx1cmVzLiBUbyBkbyBzbyBpdCByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZQorLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUKKy8vIHJlcG9ydGVkLCBpdCBvbmx5IGRlbGVnYXRlcyB0aGUgcmVwb3J0aW5nIHRvIHRoZSBmb3JtZXIgcmVzdWx0IHJlcG9ydGVyLgorLy8gVGhlIG9yaWdpbmFsIHJlc3VsdCByZXBvcnRlciBpcyByZXN0b3JlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK2NsYXNzIEdURVNUX0FQSV8gSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyCisgICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7CisgcHVibGljOgorICBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsKKyAgdmlydHVhbCB+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7CisgIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSBjb25zdCB7IHJldHVybiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOyB9CisgcHJpdmF0ZToKKyAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOworICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvcmlnaW5hbF9yZXBvcnRlcl87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKKyNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKKworI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KKyNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCisKKy8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgdHlwZWQgdGVzdHMgYW5kIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KKworLy8gVHlwZWQgKGFrYSB0eXBlLWRyaXZlbikgdGVzdHMgcmVwZWF0IHRoZSBzYW1lIHRlc3QgZm9yIHR5cGVzIGluIGEKKy8vIGxpc3QuICBZb3UgbXVzdCBrbm93IHdoaWNoIHR5cGVzIHlvdSB3YW50IHRvIHRlc3Qgd2l0aCB3aGVuIHdyaXRpbmcKKy8vIHR5cGVkIHRlc3RzLiBIZXJlJ3MgaG93IHlvdSBkbyBpdDoKKworI2lmIDAKKworLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAorLy8gYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gdGVzdGluZzo6VGVzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIC4uLgorICB0eXBlZGVmIHN0ZDo6bGlzdDxUPiBMaXN0OworICBzdGF0aWMgVCBzaGFyZWRfOworICBUIHZhbHVlXzsKK307CisKKy8vIE5leHQsIGFzc29jaWF0ZSBhIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGUgdGVzdCBjYXNlLCB3aGljaCB3aWxsIGJlCisvLyByZXBlYXRlZCBmb3IgZWFjaCB0eXBlIGluIHRoZSBsaXN0LiAgVGhlIHR5cGVkZWYgaXMgbmVjZXNzYXJ5IGZvcgorLy8gdGhlIG1hY3JvIHRvIHBhcnNlIGNvcnJlY3RseS4KK3R5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7CitUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgTXlUeXBlcyk7CisKKy8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUKKy8vIGRpcmVjdGx5IHdpdGhvdXQgVHlwZXM8Li4uPjoKKy8vICAgVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIGludCk7CisKKy8vIFRoZW4sIHVzZSBUWVBFRF9URVNUKCkgaW5zdGVhZCBvZiBURVNUX0YoKSB0byBkZWZpbmUgYXMgbWFueSB0eXBlZAorLy8gdGVzdHMgZm9yIHRoaXMgdGVzdCBjYXNlIGFzIHlvdSB3YW50LgorVFlQRURfVEVTVChGb29UZXN0LCBEb2VzQmxhaCkgeworICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgLy8gU2luY2Ugd2UgYXJlIGluc2lkZSBhIGRlcml2ZWQgY2xhc3MgdGVtcGxhdGUsIEMrKyByZXF1aXJlcyB1c2UgdG8KKyAgLy8gdmlzaXQgdGhlIG1lbWJlcnMgb2YgRm9vVGVzdCB2aWEgJ3RoaXMnLgorICBUeXBlUGFyYW0gbiA9IHRoaXMtPnZhbHVlXzsKKworICAvLyBUbyB2aXNpdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSwgYWRkIHRoZSBUZXN0Rml4dHVyZTo6CisgIC8vIHByZWZpeC4KKyAgbiArPSBUZXN0Rml4dHVyZTo6c2hhcmVkXzsKKworICAvLyBUbyByZWZlciB0byB0eXBlZGVmcyBpbiB0aGUgZml4dHVyZSwgYWRkIHRoZSAidHlwZW5hbWUKKyAgLy8gVGVzdEZpeHR1cmU6OiIgcHJlZml4LgorICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6TGlzdCB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2sobik7CisgIC4uLgorfQorCitUWVBFRF9URVNUKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQorCisjZW5kaWYgIC8vIDAKKworLy8gVHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBhYnN0cmFjdCB0ZXN0IHBhdHRlcm5zIHBhcmFtZXRlcml6ZWQKKy8vIGJ5IGEgdHlwZS4gIENvbXBhcmVkIHdpdGggdHlwZWQgdGVzdHMsIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cworLy8gYWxsb3cgeW91IHRvIGRlZmluZSB0aGUgdGVzdCBwYXR0ZXJuIHdpdGhvdXQga25vd2luZyB3aGF0IHRoZSB0eXBlCisvLyBwYXJhbWV0ZXJzIGFyZS4gIFRoZSBkZWZpbmVkIHBhdHRlcm4gY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoCisvLyBkaWZmZXJlbnQgdHlwZXMgYW55IG51bWJlciBvZiB0aW1lcywgaW4gYW55IG51bWJlciBvZiB0cmFuc2xhdGlvbgorLy8gdW5pdHMuCisvLworLy8gSWYgeW91IGFyZSBkZXNpZ25pbmcgYW4gaW50ZXJmYWNlIG9yIGNvbmNlcHQsIHlvdSBjYW4gZGVmaW5lIGEKKy8vIHN1aXRlIG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB0byB2ZXJpZnkgcHJvcGVydGllcyB0aGF0IGFueQorLy8gdmFsaWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS9jb25jZXB0IHNob3VsZCBoYXZlLiAgVGhlbiwKKy8vIGVhY2ggaW1wbGVtZW50YXRpb24gY2FuIGVhc2lseSBpbnN0YW50aWF0ZSB0aGUgdGVzdCBzdWl0ZSB0byB2ZXJpZnkKKy8vIHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHJlcXVpcmVtZW50cywgd2l0aG91dCBoYXZpbmcgdG8gd3JpdGUKKy8vIHNpbWlsYXIgdGVzdHMgcmVwZWF0ZWRseS4gIEhlcmUncyBhbiBleGFtcGxlOgorCisjaWYgMAorCisvLyBGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCisvLyBieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSB0ZXN0aW5nOjpUZXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworICAuLi4KK307CisKKy8vIE5leHQsIGRlY2xhcmUgdGhhdCB5b3Ugd2lsbCBkZWZpbmUgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlCisvLyAodGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdQorLy8gcHJlZmVyKToKK1RZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QpOworCisvLyBUaGVuLCB1c2UgVFlQRURfVEVTVF9QKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCisvLyBmb3IgdGhpcyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFzIHlvdSB3YW50LgorVFlQRURfVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7CisgIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUgcGFyYW1ldGVyLgorICBUeXBlUGFyYW0gbiA9IDA7CisgIC4uLgorfQorCitUWVBFRF9URVNUX1AoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9CisKKy8vIE5vdyB0aGUgdHJpY2t5IHBhcnQ6IHlvdSBuZWVkIHRvIHJlZ2lzdGVyIGFsbCB0ZXN0IHBhdHRlcm5zIGJlZm9yZQorLy8geW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBtYWNybyBpcyB0aGUKKy8vIHRlc3QgY2FzZSBuYW1lOyB0aGUgcmVzdCBhcmUgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QKKy8vIGNhc2UuCitSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChGb29UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9lc0JsYWgsIEhhc1Byb3BlcnR5QSk7CisKKy8vIEZpbmFsbHksIHlvdSBhcmUgZnJlZSB0byBpbnN0YW50aWF0ZSB0aGUgcGF0dGVybiB3aXRoIHRoZSB0eXBlcyB5b3UKKy8vIHdhbnQuICBJZiB5b3UgcHV0IHRoZSBhYm92ZSBjb2RlIGluIGEgaGVhZGVyIGZpbGUsIHlvdSBjYW4gI2luY2x1ZGUKKy8vIGl0IGluIG11bHRpcGxlIEMrKyBzb3VyY2UgZmlsZXMgYW5kIGluc3RhbnRpYXRlIGl0IG11bHRpcGxlIHRpbWVzLgorLy8KKy8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sIHRoZSBmaXJzdAorLy8gYXJndW1lbnQgdG8gdGhlIElOU1RBTlRJQVRFXyogbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkCisvLyB0byB0aGUgYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiAgUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yCisvLyBkaWZmZXJlbnQgaW5zdGFuY2VzLgordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKK0lOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBNeVR5cGVzKTsKKworLy8gSWYgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UgY2FuIHdyaXRlIHRoYXQgdHlwZQorLy8gZGlyZWN0bHkgd2l0aG91dCBUeXBlczwuLi4+OgorLy8gICBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgaW50KTsKKworI2VuZGlmICAvLyAwCisKKworLy8gSW1wbGVtZW50cyB0eXBlZCB0ZXN0cy4KKworI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCisvLworLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUKKy8vIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1RZUEVfUEFSQU1TXyhUZXN0Q2FzZU5hbWUpIGd0ZXN0X3R5cGVfcGFyYW1zXyMjVGVzdENhc2VOYW1lIyNfCisKKy8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0CisvLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQorLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKKyMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRShDYXNlTmFtZSwgVHlwZXMpIFwKKyAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZSBcCisgICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpCisKKyMgZGVmaW5lIFRZUEVEX1RFU1QoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCisgIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCisgICAgICA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwKKyAgIHByaXZhdGU6IFwKKyAgICB0eXBlZGVmIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IFRlc3RGaXh0dXJlOyBcCisgICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXAorICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCisgIH07IFwKKyAgYm9vbCBndGVzdF8jI0Nhc2VOYW1lIyNfIyNUZXN0TmFtZSMjX3JlZ2lzdGVyZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0PCBcCisgICAgICAgICAgQ2FzZU5hbWUsIFwKKyAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZVNlbDwgXAorICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk+LCBcCisgICAgICAgICAgR1RFU1RfVFlQRV9QQVJBTVNfKENhc2VOYW1lKT46OlJlZ2lzdGVyKFwKKyAgICAgICAgICAgICAgIiIsICNDYXNlTmFtZSwgI1Rlc3ROYW1lLCAwKTsgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCisKKy8vIEltcGxlbWVudHMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgorCisjaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAorCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8KKy8vIEV4cGFuZHMgdG8gdGhlIG5hbWVzcGFjZSBuYW1lIHRoYXQgdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBmb3IKKy8vIHRoZSBnaXZlbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFyZSBkZWZpbmVkIGluLiAgVGhlIGV4YWN0CisvLyBuYW1lIG9mIHRoZSBuYW1lc3BhY2UgaXMgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisjIGRlZmluZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oVGVzdENhc2VOYW1lKSBcCisgIGd0ZXN0X2Nhc2VfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgorLy8gdGhlIGRlZmluZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhUZXN0Q2FzZU5hbWUpIFwKKyAgZ3Rlc3RfdHlwZWRfdGVzdF9jYXNlX3Bfc3RhdGVfIyNUZXN0Q2FzZU5hbWUjI18KKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSBESVJFQ1RMWS4KKy8vCisvLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgorLy8gdGhlIHJlZ2lzdGVyZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KKyMgZGVmaW5lIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oVGVzdENhc2VOYW1lKSBcCisgIGd0ZXN0X3JlZ2lzdGVyZWRfdGVzdF9uYW1lc18jI1Rlc3RDYXNlTmFtZSMjXworCisvLyBUaGUgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IG1hY3JvcyBhcmUKKy8vIHN0YXRpYyBhcyB0eXBpY2FsbHkgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIGEgLmggZmlsZSB0aGF0IGNhbiBiZQorLy8gI2luY2x1ZGVkIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KKyMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lKSBcCisgIHN0YXRpYyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZFRlc3RDYXNlUFN0YXRlIFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkKKworIyBkZWZpbmUgVFlQRURfVEVTVF9QKENhc2VOYW1lLCBUZXN0TmFtZSkgXAorICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKKyAgY2xhc3MgVGVzdE5hbWUgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCisgICBwcml2YXRlOiBcCisgICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAorICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKKyAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAorICB9OyBcCisgIHN0YXRpYyBib29sIGd0ZXN0XyMjVGVzdE5hbWUjI19kZWZpbmVkXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuQWRkVGVzdE5hbWUoXAorICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI0Nhc2VOYW1lLCAjVGVzdE5hbWUpOyBcCisgIH0gXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAorICB2b2lkIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6OlRlc3ROYW1lPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCisKKyMgZGVmaW5lIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lLCAuLi4pIFwKKyAgbmFtZXNwYWNlIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSkgeyBcCisgIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVtcGxhdGVzPF9fVkFfQVJHU19fPjo6dHlwZSBndGVzdF9BbGxUZXN0c187IFwKKyAgfSBcCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSA9IFwKKyAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcyhcCisgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjX19WQV9BUkdTX18pCisKKy8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0CisvLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQorLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKKyMgZGVmaW5lIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgQ2FzZU5hbWUsIFR5cGVzKSBcCisgIGJvb2wgZ3Rlc3RfIyNQcmVmaXgjI18jI0Nhc2VOYW1lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAorICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxDYXNlTmFtZSwgXAorICAgICAgICAgIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6Omd0ZXN0X0FsbFRlc3RzXywgXAorICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlPjo6UmVnaXN0ZXIoXAorICAgICAgICAgICAgICAjUHJlZml4LCAjQ2FzZU5hbWUsIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oQ2FzZU5hbWUpKQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KKworLy8gRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgZGlmZmVyZW50IHN0cmluZyBjbGFzc2VzIGFyZSBhdmFpbGFibGUuCisvLyBPbiBMaW51eCwgaW4gYWRkaXRpb24gdG8gOjpzdGQ6OnN0cmluZywgR29vZ2xlIGFsc28gbWFrZXMgdXNlIG9mCisvLyBjbGFzcyA6OnN0cmluZywgd2hpY2ggaGFzIHRoZSBzYW1lIGludGVyZmFjZSBhcyA6OnN0ZDo6c3RyaW5nLCBidXQKKy8vIGhhcyBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KKy8vCisvLyBUaGUgdXNlciBjYW4gZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIHRvIDEgdG8gaW5kaWNhdGUgdGhhdAorLy8gOjpzdHJpbmcgaXMgYXZhaWxhYmxlIEFORCBpcyBhIGRpc3RpbmN0IHR5cGUgdG8gOjpzdGQ6OnN0cmluZywgb3IKKy8vIGRlZmluZSBpdCB0byAwIHRvIGluZGljYXRlIG90aGVyd2lzZS4KKy8vCisvLyBJZiB0aGUgdXNlcidzIDo6c3RkOjpzdHJpbmcgYW5kIDo6c3RyaW5nIGFyZSB0aGUgc2FtZSBjbGFzcyBkdWUgdG8KKy8vIGFsaWFzaW5nLCBoZSBzaG91bGQgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIHRvIDAuCisvLworLy8gSWYgdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcsIGl0IGlzIGRlZmluZWQKKy8vIGhldXJpc3RpY2FsbHkuCisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gRGVjbGFyZXMgdGhlIGZsYWdzLgorCisvLyBUaGlzIGZsYWcgdGVtcG9yYXJ5IGVuYWJsZXMgdGhlIGRpc2FibGVkIHRlc3RzLgorR1RFU1RfREVDTEFSRV9ib29sXyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyk7CisKKy8vIFRoaXMgZmxhZyBicmluZ3MgdGhlIGRlYnVnZ2VyIG9uIGFuIGFzc2VydGlvbiBmYWlsdXJlLgorR1RFU1RfREVDTEFSRV9ib29sXyhicmVha19vbl9mYWlsdXJlKTsKKworLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgY2F0Y2hlcyBhbGwgdGVzdC10aHJvd24gZXhjZXB0aW9ucworLy8gYW5kIGxvZ3MgdGhlbSBhcyBmYWlsdXJlcy4KK0dURVNUX0RFQ0xBUkVfYm9vbF8oY2F0Y2hfZXhjZXB0aW9ucyk7CisKKy8vIFRoaXMgZmxhZyBlbmFibGVzIHVzaW5nIGNvbG9ycyBpbiB0ZXJtaW5hbCBvdXRwdXQuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlCisvLyAieWVzIiB0byBlbmFibGUgY29sb3JzLCAibm8iIChkaXNhYmxlIGNvbG9ycyksIG9yICJhdXRvIiAodGhlIGRlZmF1bHQpCisvLyB0byBsZXQgR29vZ2xlIFRlc3QgZGVjaWRlLgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKGNvbG9yKTsKKworLy8gVGhpcyBmbGFnIHNldHMgdXAgdGhlIGZpbHRlciB0byBzZWxlY3QgYnkgbmFtZSB1c2luZyBhIGdsb2IgcGF0dGVybgorLy8gdGhlIHRlc3RzIHRvIHJ1bi4gSWYgdGhlIGZpbHRlciBpcyBub3QgZ2l2ZW4gYWxsIHRlc3RzIGFyZSBleGVjdXRlZC4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhmaWx0ZXIpOworCisvLyBUaGlzIGZsYWcgY2F1c2VzIHRoZSBHb29nbGUgVGVzdCB0byBsaXN0IHRlc3RzLiBOb25lIG9mIHRoZSB0ZXN0cyBsaXN0ZWQKKy8vIGFyZSBhY3R1YWxseSBydW4gaWYgdGhlIGZsYWcgaXMgcHJvdmlkZWQuCitHVEVTVF9ERUNMQVJFX2Jvb2xfKGxpc3RfdGVzdHMpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBlbWl0cyBhIGRldGFpbGVkIFhNTCByZXBvcnQgdG8gYSBmaWxlCisvLyBpbiBhZGRpdGlvbiB0byBpdHMgbm9ybWFsIHRleHR1YWwgb3V0cHV0LgorR1RFU1RfREVDTEFSRV9zdHJpbmdfKG91dHB1dCk7CisKKy8vIFRoaXMgZmxhZ3MgY29udHJvbCB3aGV0aGVyIEdvb2dsZSBUZXN0IHByaW50cyB0aGUgZWxhcHNlZCB0aW1lIGZvciBlYWNoCisvLyB0ZXN0LgorR1RFU1RfREVDTEFSRV9ib29sXyhwcmludF90aW1lKTsKKworLy8gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgcmFuZG9tIG51bWJlciBzZWVkLgorR1RFU1RfREVDTEFSRV9pbnQzMl8ocmFuZG9tX3NlZWQpOworCisvLyBUaGlzIGZsYWcgc2V0cyBob3cgbWFueSB0aW1lcyB0aGUgdGVzdHMgYXJlIHJlcGVhdGVkLiBUaGUgZGVmYXVsdCB2YWx1ZQorLy8gaXMgMS4gSWYgdGhlIHZhbHVlIGlzIC0xIHRoZSB0ZXN0cyBhcmUgcmVwZWF0aW5nIGZvcmV2ZXIuCitHVEVTVF9ERUNMQVJFX2ludDMyXyhyZXBlYXQpOworCisvLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBpbmNsdWRlcyBHb29nbGUgVGVzdCBpbnRlcm5hbAorLy8gc3RhY2sgZnJhbWVzIGluIGZhaWx1cmUgc3RhY2sgdHJhY2VzLgorR1RFU1RfREVDTEFSRV9ib29sXyhzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcyk7CisKKy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGVzdHMnIG9yZGVyIGlzIHJhbmRvbWl6ZWQgb24gZXZlcnkgaXRlcmF0aW9uLgorR1RFU1RfREVDTEFSRV9ib29sXyhzaHVmZmxlKTsKKworLy8gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlCisvLyBwcmludGVkIGluIGEgZmFpbHVyZSBtZXNzYWdlLgorR1RFU1RfREVDTEFSRV9pbnQzMl8oc3RhY2tfdHJhY2VfZGVwdGgpOworCisvLyBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGEgZmFpbGVkIGFzc2VydGlvbiB3aWxsIHRocm93IGFuCisvLyBleGNlcHRpb24gaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgb3IgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIGEKKy8vIG5vbi16ZXJvIGNvZGUgb3RoZXJ3aXNlLgorR1RFU1RfREVDTEFSRV9ib29sXyh0aHJvd19vbl9mYWlsdXJlKTsKKworLy8gV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHdpdGggYSAiaG9zdDpwb3J0IiBzdHJpbmcsIG9uIHN1cHBvcnRlZAorLy8gcGxhdGZvcm1zIHRlc3QgcmVzdWx0cyBhcmUgc3RyZWFtZWQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IG9uCisvLyB0aGUgc3BlY2lmaWVkIGhvc3QgbWFjaGluZS4KK0dURVNUX0RFQ0xBUkVfc3RyaW5nXyhzdHJlYW1fcmVzdWx0X3RvKTsKKworLy8gVGhlIHVwcGVyIGxpbWl0IGZvciB2YWxpZCBzdGFjayB0cmFjZSBkZXB0aHMuCitjb25zdCBpbnQga01heFN0YWNrVHJhY2VEZXB0aCA9IDEwMDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworY2xhc3MgQXNzZXJ0SGVscGVyOworY2xhc3MgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7CitjbGFzcyBFeGVjRGVhdGhUZXN0OworY2xhc3MgTm9FeGVjRGVhdGhUZXN0OworY2xhc3MgRmluYWxTdWNjZXNzQ2hlY2tlcjsKK2NsYXNzIEdUZXN0RmxhZ1NhdmVyOworY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yOworY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7CitjbGFzcyBUZXN0RXZlbnRSZXBlYXRlcjsKK2NsYXNzIFdpbmRvd3NEZWF0aFRlc3Q7CitjbGFzcyBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpOwordm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIG1lc3NhZ2UpOworCisvLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYSBTdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcworLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKKy8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAorLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCisvLyBEZWNsYXJlZCBpbiBndGVzdC1pbnRlcm5hbC5oIGJ1dCBkZWZpbmVkIGhlcmUsIHNvIHRoYXQgaXQgaGFzIGFjY2VzcworLy8gdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIE1lc3NhZ2UgY2xhc3MsIHJlcXVpcmVkIGJ5IHRoZSBBUk0KKy8vIGNvbXBpbGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitTdHJpbmcgU3RyZWFtYWJsZVRvU3RyaW5nKGNvbnN0IFQmIHN0cmVhbWFibGUpIHsKKyAgcmV0dXJuIChNZXNzYWdlKCkgPDwgc3RyZWFtYWJsZSkuR2V0U3RyaW5nKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBUaGUgZnJpZW5kIHJlbGF0aW9uc2hpcCBvZiBzb21lIG9mIHRoZXNlIGNsYXNzZXMgaXMgY3ljbGljLgorLy8gSWYgd2UgZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIHRoZW0gdGhlIGNvbXBpbGVyIG1pZ2h0IGNvbmZ1c2UgdGhlIGNsYXNzZXMKKy8vIGluIGZyaWVuZHNoaXAgY2xhdXNlcyB3aXRoIHNhbWUgbmFtZWQgY2xhc3NlcyBvbiB0aGUgc2NvcGUuCitjbGFzcyBUZXN0OworY2xhc3MgVGVzdENhc2U7CitjbGFzcyBUZXN0SW5mbzsKK2NsYXNzIFVuaXRUZXN0OworCisvLyBBIGNsYXNzIGZvciBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gYXNzZXJ0aW9uIHdhcyBzdWNjZXNzZnVsLiAgV2hlbgorLy8gdGhlIGFzc2VydGlvbiB3YXNuJ3Qgc3VjY2Vzc2Z1bCwgdGhlIEFzc2VydGlvblJlc3VsdCBvYmplY3QKKy8vIHJlbWVtYmVycyBhIG5vbi1lbXB0eSBtZXNzYWdlIHRoYXQgZGVzY3JpYmVzIGhvdyBpdCBmYWlsZWQuCisvLworLy8gVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHVzZSBvbmUgb2YgdGhlIGZhY3RvcnkgZnVuY3Rpb25zCisvLyAoQXNzZXJ0aW9uU3VjY2VzcygpIGFuZCBBc3NlcnRpb25GYWlsdXJlKCkpLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGZvciB0d28gcHVycG9zZXM6CisvLyAgIDEuIERlZmluaW5nIHByZWRpY2F0ZSBmdW5jdGlvbnMgdG8gYmUgdXNlZCB3aXRoIEJvb2xlYW4gdGVzdCBhc3NlcnRpb25zCisvLyAgICAgIEVYUEVDVF9UUlVFL0VYUEVDVF9GQUxTRSBhbmQgdGhlaXIgQVNTRVJUXyBjb3VudGVycGFydHMKKy8vICAgMi4gRGVmaW5pbmcgcHJlZGljYXRlLWZvcm1hdCBmdW5jdGlvbnMgdG8gYmUKKy8vICAgICAgdXNlZCB3aXRoIHByZWRpY2F0ZSBhc3NlcnRpb25zIChBU1NFUlRfUFJFRF9GT1JNQVQqLCBldGMpLgorLy8KKy8vIEZvciBleGFtcGxlLCBpZiB5b3UgZGVmaW5lIElzRXZlbiBwcmVkaWNhdGU6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7CisvLyAgICAgZWxzZQorLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKKy8vICAgfQorLy8KKy8vIFRoZW4gdGhlIGZhaWxlZCBleHBlY3RhdGlvbiBFWFBFQ1RfVFJVRShJc0V2ZW4oRmliKDUpKSkKKy8vIHdpbGwgcHJpbnQgdGhlIG1lc3NhZ2UKKy8vCisvLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDUpKQorLy8gICAgIEFjdHVhbDogZmFsc2UgKDUgaXMgb2RkKQorLy8gICBFeHBlY3RlZDogdHJ1ZQorLy8KKy8vIGluc3RlYWQgb2YgYSBtb3JlIG9wYXF1ZQorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCisvLyAgICAgQWN0dWFsOiBmYWxzZQorLy8gICBFeHBlY3RlZDogdHJ1ZQorLy8KKy8vIGluIGNhc2UgSXNFdmVuIGlzIGEgc2ltcGxlIEJvb2xlYW4gcHJlZGljYXRlLgorLy8KKy8vIElmIHlvdSBleHBlY3QgeW91ciBwcmVkaWNhdGUgdG8gYmUgcmV1c2VkIGFuZCB3YW50IHRvIHN1cHBvcnQgaW5mb3JtYXRpdmUKKy8vIG1lc3NhZ2VzIGluIEVYUEVDVF9GQUxTRSBhbmQgQVNTRVJUX0ZBTFNFIChuZWdhdGl2ZSBhc3NlcnRpb25zIHNob3cgdXAKKy8vIGFib3V0IGhhbGYgYXMgb2Z0ZW4gYXMgcG9zaXRpdmUgb25lcyBpbiBvdXIgdGVzdHMpLCBzdXBwbHkgbWVzc2FnZXMgZm9yCisvLyBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgY2FzZXM6CisvLworLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7CisvLyAgICAgaWYgKChuICUgMikgPT0gMCkKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOworLy8gICAgIGVsc2UKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7CisvLyAgIH0KKy8vCisvLyBUaGVuIGEgc3RhdGVtZW50IEVYUEVDVF9GQUxTRShJc0V2ZW4oRmliKDYpKSkgd2lsbCBwcmludAorLy8KKy8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNikpCisvLyAgICAgQWN0dWFsOiB0cnVlICg4IGlzIGV2ZW4pCisvLyAgIEV4cGVjdGVkOiBmYWxzZQorLy8KKy8vIE5COiBQcmVkaWNhdGVzIHRoYXQgc3VwcG9ydCBuZWdhdGl2ZSBCb29sZWFuIGFzc2VydGlvbnMgaGF2ZSByZWR1Y2VkCisvLyBwZXJmb3JtYW5jZSBpbiBwb3NpdGl2ZSBvbmVzIHNvIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0aGVtIGluIHRlc3RzCisvLyB0aGF0IGhhdmUgbG90cyAodGVucyBvZiB0aG91c2FuZHMpIG9mIHBvc2l0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucy4KKy8vCisvLyBUbyB1c2UgdGhpcyBjbGFzcyB3aXRoIEVYUEVDVF9QUkVEX0ZPUk1BVCBhc3NlcnRpb25zIHN1Y2ggYXM6CisvLworLy8gICAvLyBWZXJpZmllcyB0aGF0IEZvbygpIHJldHVybnMgYW4gZXZlbiBudW1iZXIuCisvLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNFdmVuLCBGb28oKSk7CisvLworLy8geW91IG5lZWQgdG8gZGVmaW5lOgorLy8KKy8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihjb25zdCBjaGFyKiBleHByLCBpbnQgbikgeworLy8gICAgIGlmICgobiAlIDIpID09IDApCisvLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOworLy8gICAgIGVsc2UKKy8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKy8vICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cHIgPDwgIiBpcyBldmVuXG4gIEFjdHVhbDogaXQncyAiIDw8IG47CisvLyAgIH0KKy8vCisvLyBJZiBGb28oKSByZXR1cm5zIDUsIHlvdSB3aWxsIHNlZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6CisvLworLy8gICBFeHBlY3RlZDogRm9vKCkgaXMgZXZlbgorLy8gICAgIEFjdHVhbDogaXQncyA1CisvLworY2xhc3MgR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgeworIHB1YmxpYzoKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgLy8gVXNlZCBpbiBFWFBFQ1RfVFJVRS9GQUxTRShhc3NlcnRpb25fcmVzdWx0KS4KKyAgQXNzZXJ0aW9uUmVzdWx0KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpOworICAvLyBVc2VkIGluIHRoZSBFWFBFQ1RfVFJVRS9GQUxTRShib29sX2V4cHJlc3Npb24pLgorICBleHBsaWNpdCBBc3NlcnRpb25SZXN1bHQoYm9vbCBzdWNjZXNzKSA6IHN1Y2Nlc3NfKHN1Y2Nlc3MpIHt9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIHN1Y2NlZWRlZC4KKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3NfOyB9ICAvLyBOT0xJTlQKKworICAvLyBSZXR1cm5zIHRoZSBhc3NlcnRpb24ncyBuZWdhdGlvbi4gVXNlZCB3aXRoIEVYUEVDVC9BU1NFUlRfRkFMU0UuCisgIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvciEoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSB0ZXh0IHN0cmVhbWVkIGludG8gdGhpcyBBc3NlcnRpb25SZXN1bHQuIFRlc3QgYXNzZXJ0aW9ucworICAvLyB1c2UgaXQgd2hlbiB0aGV5IGZhaWwgKGkuZS4sIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lIGRvZXNuJ3QgbWF0Y2ggdGhlCisgIC8vIGFzc2VydGlvbidzIGV4cGVjdGF0aW9uKS4gV2hlbiBub3RoaW5nIGhhcyBiZWVuIHN0cmVhbWVkIGludG8gdGhlCisgIC8vIG9iamVjdCwgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPyAgbWVzc2FnZV8tPmNfc3RyKCkgOiAiIjsKKyAgfQorICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZW1vdmUgdGhpcyBhZnRlciBtYWtpbmcgc3VyZSBubyBjbGllbnRzIHVzZSBpdC4KKyAgLy8gRGVwcmVjYXRlZDsgcGxlYXNlIHVzZSBtZXNzYWdlKCkgaW5zdGVhZC4KKyAgY29uc3QgY2hhciogZmFpbHVyZV9tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZSgpOyB9CisKKyAgLy8gU3RyZWFtcyBhIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UgaW50byB0aGlzIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I8PChjb25zdCBUJiB2YWx1ZSkgeworICAgIEFwcGVuZE1lc3NhZ2UoTWVzc2FnZSgpIDw8IHZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBBbGxvd3Mgc3RyZWFtaW5nIGJhc2ljIG91dHB1dCBtYW5pcHVsYXRvcnMgc3VjaCBhcyBlbmRsIG9yIGZsdXNoIGludG8KKyAgLy8gdGhpcyBvYmplY3QuCisgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I8PCgKKyAgICAgIDo6c3RkOjpvc3RyZWFtJiAoKmJhc2ljX21hbmlwdWxhdG9yKSg6OnN0ZDo6b3N0cmVhbSYgc3RyZWFtKSkgeworICAgIEFwcGVuZE1lc3NhZ2UoTWVzc2FnZSgpIDw8IGJhc2ljX21hbmlwdWxhdG9yKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIG1lc3NhZ2UgdG8gbWVzc2FnZV8uCisgIHZvaWQgQXBwZW5kTWVzc2FnZShjb25zdCBNZXNzYWdlJiBhX21lc3NhZ2UpIHsKKyAgICBpZiAobWVzc2FnZV8uZ2V0KCkgPT0gTlVMTCkKKyAgICAgIG1lc3NhZ2VfLnJlc2V0KG5ldyA6OnN0ZDo6c3RyaW5nKTsKKyAgICBtZXNzYWdlXy0+YXBwZW5kKGFfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKKyAgfQorCisgIC8vIFN0b3JlcyByZXN1bHQgb2YgdGhlIGFzc2VydGlvbiBwcmVkaWNhdGUuCisgIGJvb2wgc3VjY2Vzc187CisgIC8vIFN0b3JlcyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24gaW4gY2FzZSB0aGUgZXhwZWN0YXRpb24KKyAgLy8gY29uc3RydWN0IGlzIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgcHJlZGljYXRlJ3Mgb3V0Y29tZS4KKyAgLy8gUmVmZXJlbmNlZCB2aWEgYSBwb2ludGVyIHRvIGF2b2lkIHRha2luZyB0b28gbXVjaCBzdGFjayBmcmFtZSBzcGFjZQorICAvLyB3aXRoIHRlc3QgYXNzZXJ0aW9ucy4KKyAgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmc+IG1lc3NhZ2VfOworCisgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXNzZXJ0aW9uUmVzdWx0KTsKK307CisKKy8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpOworCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0LgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpOworCisvLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4KKy8vIERlcHJlY2F0ZWQ7IHVzZSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtc2cpOworCisvLyBUaGUgYWJzdHJhY3QgY2xhc3MgdGhhdCBhbGwgdGVzdHMgaW5oZXJpdCBmcm9tLgorLy8KKy8vIEluIEdvb2dsZSBUZXN0LCBhIHVuaXQgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RDYXNlcywgYW5kCisvLyBlYWNoIFRlc3RDYXNlIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RzLgorLy8KKy8vIFdoZW4geW91IGRlZmluZSBhIHRlc3QgdXNpbmcgdGhlIFRFU1QgbWFjcm8sIHlvdSBkb24ndCBuZWVkIHRvCisvLyBleHBsaWNpdGx5IGRlcml2ZSBmcm9tIFRlc3QgLSB0aGUgVEVTVCBtYWNybyBhdXRvbWF0aWNhbGx5IGRvZXMKKy8vIHRoaXMgZm9yIHlvdS4KKy8vCisvLyBUaGUgb25seSB0aW1lIHlvdSBkZXJpdmUgZnJvbSBUZXN0IGlzIHdoZW4gZGVmaW5pbmcgYSB0ZXN0IGZpeHR1cmUKKy8vIHRvIGJlIHVzZWQgYSBURVNUX0YuICBGb3IgZXhhbXBsZToKKy8vCisvLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisvLyAgICBwcm90ZWN0ZWQ6CisvLyAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyAuLi4gfQorLy8gICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsgLi4uIH0KKy8vICAgICAuLi4KKy8vICAgfTsKKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBCYXIpIHsgLi4uIH0KKy8vICAgVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQorLy8KKy8vIFRlc3QgaXMgbm90IGNvcHlhYmxlLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0IHsKKyBwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKKworICAvLyBEZWZpbmVzIHR5cGVzIGZvciBwb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBzZXQgdXAgYW5kIHRlYXIgZG93bgorICAvLyBhIHRlc3QgY2FzZS4KKyAgdHlwZWRlZiBpbnRlcm5hbDo6U2V0VXBUZXN0Q2FzZUZ1bmMgU2V0VXBUZXN0Q2FzZUZ1bmM7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlRlYXJEb3duVGVzdENhc2VGdW5jIFRlYXJEb3duVGVzdENhc2VGdW5jOworCisgIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIGludGVuZCB0byBpbmhlcml0IGZyb20gVGVzdC4KKyAgdmlydHVhbCB+VGVzdCgpOworCisgIC8vIFNldHMgdXAgdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vCisgIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlNldFVwVGVzdENhc2UoKSBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QKKyAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCisgIC8vIFNldFVwVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKKyAgLy8gY2xhc3MuCisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7fQorCisgIC8vIFRlYXJzIGRvd24gdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIC8vCisgIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlRlYXJEb3duVGVzdENhc2UoKSBhZnRlciBydW5uaW5nIHRoZSBsYXN0CisgIC8vIHRlc3QgaW4gdGVzdCBjYXNlIEZvby4gIEhlbmNlIGEgc3ViLWNsYXNzIGNhbiBkZWZpbmUgaXRzIG93bgorICAvLyBUZWFyRG93blRlc3RDYXNlKCkgbWV0aG9kIHRvIHNoYWRvdyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIHN1cGVyCisgIC8vIGNsYXNzLgorICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkge30KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgZmF0YWwgZmFpbHVyZS4KKyAgc3RhdGljIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgorICBzdGF0aWMgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmUoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgKGVpdGhlciBmYXRhbCBvcgorICAvLyBub24tZmF0YWwpIGZhaWx1cmUuCisgIHN0YXRpYyBib29sIEhhc0ZhaWx1cmUoKSB7IHJldHVybiBIYXNGYXRhbEZhaWx1cmUoKSB8fCBIYXNOb25mYXRhbEZhaWx1cmUoKTsgfQorCisgIC8vIExvZ3MgYSBwcm9wZXJ0eSBmb3IgdGhlIGN1cnJlbnQgdGVzdC4gIE9ubHkgdGhlIGxhc3QgdmFsdWUgZm9yIGEgZ2l2ZW4KKyAgLy8ga2V5IGlzIHJlbWVtYmVyZWQuCisgIC8vIFRoZXNlIGFyZSBwdWJsaWMgc3RhdGljIHNvIHRoZXkgY2FuIGJlIGNhbGxlZCBmcm9tIHV0aWxpdHkgZnVuY3Rpb25zCisgIC8vIHRoYXQgYXJlIG5vdCBtZW1iZXJzIG9mIHRoZSB0ZXN0IGZpeHR1cmUuCisgIC8vIFRoZSBhcmd1bWVudHMgYXJlIGNvbnN0IGNoYXIqIGluc3RlYWQgc3RyaW5ncywgYXMgR29vZ2xlIFRlc3QgaXMgdXNlZAorICAvLyBvbiBwbGF0Zm9ybXMgd2hlcmUgc3RyaW5nIGRvZXNuJ3QgY29tcGlsZS4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGEgZHJpdmluZyBjb25zaWRlcmF0aW9uIGZvciB0aGVzZSBSZWNvcmRQcm9wZXJ0eSBtZXRob2RzCisgIC8vIHdhcyB0byBwcm9kdWNlIHhtbCBvdXRwdXQgc3VpdGVkIHRvIHRoZSBHcmVlbnNwYW4gY2hhcnRpbmcgdXRpbGl0eSwKKyAgLy8gd2hpY2ggYXQgcHJlc2VudCB3aWxsIG9ubHkgY2hhcnQgdmFsdWVzIHRoYXQgZml0IGluIGEgMzItYml0IGludC4gSXQKKyAgLy8gaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byByZXN0cmljdCB0aGVpciB2YWx1ZXMgdG8gMzItYml0IGludHMKKyAgLy8gaWYgdGhleSBpbnRlbmQgdGhlbSB0byBiZSB1c2VkIHdpdGggR3JlZW5zcGFuLgorICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3QgY2hhcioga2V5LCBpbnQgdmFsdWUpOworCisgcHJvdGVjdGVkOgorICAvLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCisgIFRlc3QoKTsKKworICAvLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOworCisgIC8vIFRlYXJzIGRvd24gdGhlIHRlc3QgZml4dHVyZS4KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7CisKKyBwcml2YXRlOgorICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIHRoZSBzYW1lIGZpeHR1cmUgY2xhc3MgYXMKKyAgLy8gdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgorICBzdGF0aWMgYm9vbCBIYXNTYW1lRml4dHVyZUNsYXNzKCk7CisKKyAgLy8gUnVucyB0aGUgdGVzdCBhZnRlciB0aGUgdGVzdCBmaXh0dXJlIGhhcyBiZWVuIHNldCB1cC4KKyAgLy8KKyAgLy8gQSBzdWItY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhpcyB0byBkZWZpbmUgdGhlIHRlc3QgbG9naWMuCisgIC8vCisgIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OIERJUkVDVExZIElOIEEgVVNFUiBQUk9HUkFNLgorICAvLyBJbnN0ZWFkLCB1c2UgdGhlIFRFU1Qgb3IgVEVTVF9GIG1hY3JvLgorICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKSA9IDA7CisKKyAgLy8gU2V0cyB1cCwgZXhlY3V0ZXMsIGFuZCB0ZWFycyBkb3duIHRoZSB0ZXN0LgorICB2b2lkIFJ1bigpOworCisgIC8vIERlbGV0ZXMgc2VsZi4gIFdlIGRlbGliZXJhdGVseSBwaWNrIGFuIHVudXN1YWwgbmFtZSBmb3IgdGhpcworICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gYXZvaWQgY2xhc2hpbmcgd2l0aCBuYW1lcyB1c2VkIGluIHVzZXIgVEVTVHMuCisgIHZvaWQgRGVsZXRlU2VsZl8oKSB7IGRlbGV0ZSB0aGlzOyB9CisKKyAgLy8gVXNlcyBhIEdUZXN0RmxhZ1NhdmVyIHRvIHNhdmUgYW5kIHJlc3RvcmUgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLgorICBjb25zdCBpbnRlcm5hbDo6R1Rlc3RGbGFnU2F2ZXIqIGNvbnN0IGd0ZXN0X2ZsYWdfc2F2ZXJfOworCisgIC8vIE9mdGVuIGEgdXNlciBtaXMtc3BlbGxzIFNldFVwKCkgYXMgU2V0dXAoKSBhbmQgc3BlbmRzIGEgbG9uZyB0aW1lCisgIC8vIHdvbmRlcmluZyB3aHkgaXQgaXMgbmV2ZXIgY2FsbGVkIGJ5IEdvb2dsZSBUZXN0LiAgVGhlIGRlY2xhcmF0aW9uIG9mCisgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIHNvbGVseSBmb3IgY2F0Y2hpbmcgc3VjaCBhbiBlcnJvciBhdAorICAvLyBjb21waWxlIHRpbWU6CisgIC8vCisgIC8vICAgLSBUaGUgcmV0dXJuIHR5cGUgaXMgZGVsaWJlcmF0ZWx5IGNob3NlbiB0byBiZSBub3Qgdm9pZCwgc28gaXQKKyAgLy8gICB3aWxsIGJlIGEgY29uZmxpY3QgaWYgYSB1c2VyIGRlY2xhcmVzIHZvaWQgU2V0dXAoKSBpbiBoaXMgdGVzdAorICAvLyAgIGZpeHR1cmUuCisgIC8vCisgIC8vICAgLSBUaGlzIG1ldGhvZCBpcyBwcml2YXRlLCBzbyBpdCB3aWxsIGJlIGFub3RoZXIgY29tcGlsZXIgZXJyb3IKKyAgLy8gICBpZiBhIHVzZXIgY2FsbHMgaXQgZnJvbSBoaXMgdGVzdCBmaXh0dXJlLgorICAvLworICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBGVU5DVElPTi4KKyAgLy8KKyAgLy8gSWYgeW91IHNlZSBhbiBlcnJvciBhYm91dCBvdmVycmlkaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gb3IKKyAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLgorICBzdHJ1Y3QgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAge307CisgIHZpcnR1YWwgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAqIFNldHVwKCkgeyByZXR1cm4gTlVMTDsgfQorCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdHMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdCk7Cit9OworCit0eXBlZGVmIGludGVybmFsOjpUaW1lSW5NaWxsaXMgVGltZUluTWlsbGlzOworCisvLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgYSB1c2VyIHNwZWNpZmllZCB0ZXN0IHByb3BlcnR5IHdoaWNoIGNhbiBiZQorLy8gb3V0cHV0IGFzIGEga2V5L3ZhbHVlIHN0cmluZyBwYWlyLgorLy8KKy8vIERvbid0IGluaGVyaXQgZnJvbSBUZXN0UHJvcGVydHkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCitjbGFzcyBUZXN0UHJvcGVydHkgeworIHB1YmxpYzoKKyAgLy8gQyd0b3IuICBUZXN0UHJvcGVydHkgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQorICAvLyBUZXN0UHJvcGVydHkgb2JqZWN0LgorICBUZXN0UHJvcGVydHkoY29uc3QgY2hhciogYV9rZXksIGNvbnN0IGNoYXIqIGFfdmFsdWUpIDoKKyAgICBrZXlfKGFfa2V5KSwgdmFsdWVfKGFfdmFsdWUpIHsKKyAgfQorCisgIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQga2V5LgorICBjb25zdCBjaGFyKiBrZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIGtleV8uY19zdHIoKTsKKyAgfQorCisgIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQgdmFsdWUuCisgIGNvbnN0IGNoYXIqIHZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV8uY19zdHIoKTsKKyAgfQorCisgIC8vIFNldHMgYSBuZXcgdmFsdWUsIG92ZXJyaWRpbmcgdGhlIG9uZSBzdXBwbGllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgIHZvaWQgU2V0VmFsdWUoY29uc3QgY2hhciogbmV3X3ZhbHVlKSB7CisgICAgdmFsdWVfID0gbmV3X3ZhbHVlOworICB9CisKKyBwcml2YXRlOgorICAvLyBUaGUga2V5IHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorICBpbnRlcm5hbDo6U3RyaW5nIGtleV87CisgIC8vIFRoZSB2YWx1ZSBzdXBwbGllZCBieSB0aGUgdXNlci4KKyAgaW50ZXJuYWw6OlN0cmluZyB2YWx1ZV87Cit9OworCisvLyBUaGUgcmVzdWx0IG9mIGEgc2luZ2xlIFRlc3QuICBUaGlzIGluY2x1ZGVzIGEgbGlzdCBvZgorLy8gVGVzdFBhcnRSZXN1bHRzLCBhIGxpc3Qgb2YgVGVzdFByb3BlcnRpZXMsIGEgY291bnQgb2YgaG93IG1hbnkKKy8vIGRlYXRoIHRlc3RzIHRoZXJlIGFyZSBpbiB0aGUgVGVzdCwgYW5kIGhvdyBtdWNoIHRpbWUgaXQgdG9vayB0byBydW4KKy8vIHRoZSBUZXN0LgorLy8KKy8vIFRlc3RSZXN1bHQgaXMgbm90IGNvcHlhYmxlLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0UmVzdWx0IHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4KKyAgVGVzdFJlc3VsdCgpOworCisgIC8vIEQndG9yLiAgRG8gbm90IGluaGVyaXQgZnJvbSBUZXN0UmVzdWx0LgorICB+VGVzdFJlc3VsdCgpOworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCisgIC8vIG9mIHN1Y2Nlc3NmdWwgdGVzdCBwYXJ0cyBhbmQgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBwYXJ0cy4KKyAgaW50IHRvdGFsX3BhcnRfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KKyAgaW50IHRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhc3NlZCAoaS5lLiBubyB0ZXN0IHBhcnQgZmFpbGVkKS4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhdGFsbHkgZmFpbGVkLgorICBib29sIEhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCisgIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHBhcnQgcmVzdWx0IGFtb25nIGFsbCB0aGUgcmVzdWx0cy4gaSBjYW4gcmFuZ2UKKyAgLy8gZnJvbSAwIHRvIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cworICAvLyB0aGUgcHJvZ3JhbS4KKyAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMgdGhlCisgIC8vIHByb2dyYW0uCisgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgR2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKKyAgZnJpZW5kIGNsYXNzIFVuaXRUZXN0OworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkV4ZWNEZWF0aFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdFJlc3VsdEFjY2Vzc29yOworICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpXaW5kb3dzRGVhdGhUZXN0OworCisgIC8vIEdldHMgdGhlIHZlY3RvciBvZiBUZXN0UGFydFJlc3VsdHMuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiYgdGVzdF9wYXJ0X3Jlc3VsdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXzsKKyAgfQorCisgIC8vIEdldHMgdGhlIHZlY3RvciBvZiBUZXN0UHJvcGVydGllcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiYgdGVzdF9wcm9wZXJ0aWVzKCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfOworICB9CisKKyAgLy8gU2V0cyB0aGUgZWxhcHNlZCB0aW1lLgorICB2b2lkIHNldF9lbGFwc2VkX3RpbWUoVGltZUluTWlsbGlzIGVsYXBzZWQpIHsgZWxhcHNlZF90aW1lXyA9IGVsYXBzZWQ7IH0KKworICAvLyBBZGRzIGEgdGVzdCBwcm9wZXJ0eSB0byB0aGUgbGlzdC4gVGhlIHByb3BlcnR5IGlzIHZhbGlkYXRlZCBhbmQgbWF5IGFkZAorICAvLyBhIG5vbi1mYXRhbCBmYWlsdXJlIGlmIGludmFsaWQgKGUuZy4sIGlmIGl0IGNvbmZsaWN0cyB3aXRoIHJlc2VydmVkCisgIC8vIGtleSBuYW1lcykuIElmIGEgcHJvcGVydHkgaXMgYWxyZWFkeSByZWNvcmRlZCBmb3IgdGhlIHNhbWUga2V5LCB0aGUKKyAgLy8gdmFsdWUgd2lsbCBiZSB1cGRhdGVkLCByYXRoZXIgdGhhbiBzdG9yaW5nIG11bHRpcGxlIHZhbHVlcyBmb3IgdGhlIHNhbWUKKyAgLy8ga2V5LgorICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7CisKKyAgLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiBHb29nbGUgVGVzdAorICAvLyB0ZXN0Y2FzZSB0YWdzLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4KKyAgLy8gVE9ETyhydXNzcik6IFZhbGlkYXRlIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbGVnYWwgYW5kIGh1bWFuIHJlYWRhYmxlLgorICBzdGF0aWMgYm9vbCBWYWxpZGF0ZVRlc3RQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOworCisgIC8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0LgorICB2b2lkIEFkZFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKKworICAvLyBSZXR1cm5zIHRoZSBkZWF0aCB0ZXN0IGNvdW50LgorICBpbnQgZGVhdGhfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGRlYXRoX3Rlc3RfY291bnRfOyB9CisKKyAgLy8gSW5jcmVtZW50cyB0aGUgZGVhdGggdGVzdCBjb3VudCwgcmV0dXJuaW5nIHRoZSBuZXcgY291bnQuCisgIGludCBpbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpIHsgcmV0dXJuICsrZGVhdGhfdGVzdF9jb3VudF87IH0KKworICAvLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLgorICB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKCk7CisKKyAgLy8gQ2xlYXJzIHRoZSBvYmplY3QuCisgIHZvaWQgQ2xlYXIoKTsKKworICAvLyBQcm90ZWN0cyBtdXRhYmxlIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eSB2ZWN0b3IgYW5kIG9mIG93bmVkCisgIC8vIHByb3BlcnRpZXMsIHdob3NlIHZhbHVlcyBtYXkgYmUgdXBkYXRlZC4KKyAgaW50ZXJuYWw6Ok11dGV4IHRlc3RfcHJvcGVyaXRlc19tdXRleF87CisKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0UGFydFJlc3VsdHMKKyAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IHRlc3RfcGFydF9yZXN1bHRzXzsKKyAgLy8gVGhlIHZlY3RvciBvZiBUZXN0UHJvcGVydGllcworICBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+IHRlc3RfcHJvcGVydGllc187CisgIC8vIFJ1bm5pbmcgY291bnQgb2YgZGVhdGggdGVzdHMuCisgIGludCBkZWF0aF90ZXN0X2NvdW50XzsKKyAgLy8gVGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgorICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsKKworICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RSZXN1bHQuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdFJlc3VsdCk7Cit9OyAgLy8gY2xhc3MgVGVzdFJlc3VsdAorCisvLyBBIFRlc3RJbmZvIG9iamVjdCBzdG9yZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCBhIHRlc3Q6CisvLworLy8gICBUZXN0IGNhc2UgbmFtZQorLy8gICBUZXN0IG5hbWUKKy8vICAgV2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgcnVuCisvLyAgIEEgZnVuY3Rpb24gcG9pbnRlciB0aGF0IGNyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0IHdoZW4gaW52b2tlZAorLy8gICBUZXN0IHJlc3VsdAorLy8KKy8vIFRoZSBjb25zdHJ1Y3RvciBvZiBUZXN0SW5mbyByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIFVuaXRUZXN0CisvLyBzaW5nbGV0b24gc3VjaCB0aGF0IHRoZSBSVU5fQUxMX1RFU1RTKCkgbWFjcm8ga25vd3Mgd2hpY2ggdGVzdHMgdG8KKy8vIHJ1bi4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdEluZm8geworIHB1YmxpYzoKKyAgLy8gRGVzdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdmlydHVhbCwgc28KKyAgLy8gZG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RJbmZvLgorICB+VGVzdEluZm8oKTsKKworICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgbmFtZS4KKyAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUoKSBjb25zdCB7IHJldHVybiB0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKTsgfQorCisgIC8vIFJldHVybnMgdGhlIHRlc3QgbmFtZS4KKyAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkCisgIC8vIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0oKSBjb25zdCB7CisgICAgaWYgKHR5cGVfcGFyYW1fLmdldCgpICE9IE5VTEwpCisgICAgICByZXR1cm4gdHlwZV9wYXJhbV8tPmNfc3RyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcworICAvLyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtKCkgY29uc3QgeworICAgIGlmICh2YWx1ZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKKyAgICAgIHJldHVybiB2YWx1ZV9wYXJhbV8tPmNfc3RyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0ZXN0IHNob3VsZCBydW4sIHRoYXQgaXMgaWYgdGhlIHRlc3QgaXMgbm90IGRpc2FibGVkCisgIC8vIChvciBpdCBpcyBkaXNhYmxlZCBidXQgdGhlIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgaGFzIGJlZW4gc3BlY2lmaWVkKQorICAvLyBhbmQgaXRzIGZ1bGwgbmFtZSBtYXRjaGVzIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIuCisgIC8vCisgIC8vIEdvb2dsZSBUZXN0IGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIHRlc3RzIGJ5IHRoZWlyIGZ1bGwgbmFtZXMuCisgIC8vIFRoZSBmdWxsIG5hbWUgb2YgYSB0ZXN0IEJhciBpbiB0ZXN0IGNhc2UgRm9vIGlzIGRlZmluZWQgYXMKKyAgLy8gIkZvby5CYXIiLiAgT25seSB0aGUgdGVzdHMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIHdpbGwgcnVuLgorICAvLworICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMsCisgIC8vIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAnLScgYW5kIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YKKyAgLy8gbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvIGV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdAorICAvLyBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZgorICAvLyB0aGUgbmVnYXRpdmUgcGF0dGVybnMuCisgIC8vCisgIC8vIEZvciBleGFtcGxlLCAqQSo6Rm9vLiogaXMgYSBmaWx0ZXIgdGhhdCBtYXRjaGVzIGFueSBzdHJpbmcgdGhhdAorICAvLyBjb250YWlucyB0aGUgY2hhcmFjdGVyICdBJyBvciBzdGFydHMgd2l0aCAiRm9vLiIuCisgIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0LgorICBjb25zdCBUZXN0UmVzdWx0KiByZXN1bHQoKSBjb25zdCB7IHJldHVybiAmcmVzdWx0XzsgfQorCisgcHJpdmF0ZToKKworI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RGVmYXVsdERlYXRoVGVzdEZhY3Rvcnk7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisgIGZyaWVuZCBjbGFzcyBUZXN0OworICBmcmllbmQgY2xhc3MgVGVzdENhc2U7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworICBmcmllbmQgVGVzdEluZm8qIGludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKKyAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKKyAgICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAorICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAorICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAorICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7CisKKyAgLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gVGhlIG5ld2x5IGNvbnN0cnVjdGVkIGluc3RhbmNlIGFzc3VtZXMKKyAgLy8gb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KKyAgVGVzdEluZm8oY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwKKyAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwKKyAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAorICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKKworICAvLyBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgZGVhdGggdGVzdHMgZW5jb3VudGVyZWQgaW4gdGhpcyB0ZXN0IHNvCisgIC8vIGZhci4KKyAgaW50IGluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCkgeworICAgIHJldHVybiByZXN1bHRfLmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7CisgIH0KKworICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgorICAvLyBkZWxldGVzIGl0LgorICB2b2lkIFJ1bigpOworCisgIHN0YXRpYyB2b2lkIENsZWFyVGVzdFJlc3VsdChUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgdGVzdF9pbmZvLT5yZXN1bHRfLkNsZWFyKCk7CisgIH0KKworICAvLyBUaGVzZSBmaWVsZHMgYXJlIGltbXV0YWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSB0ZXN0LgorICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X2Nhc2VfbmFtZV87ICAgICAvLyBUZXN0IGNhc2UgbmFtZQorICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lXzsgICAgICAgICAgICAgICAvLyBUZXN0IG5hbWUKKyAgLy8gTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhCisgIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB0eXBlX3BhcmFtXzsKKyAgLy8gVGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgcGFyYW1ldGVyLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgorICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB2YWx1ZV9wYXJhbV87CisgIGNvbnN0IGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZF87ICAgLy8gSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcworICBib29sIHNob3VsZF9ydW5fOyAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IHNob3VsZCBydW4KKyAgYm9vbCBpc19kaXNhYmxlZF87ICAgICAgICAgICAgICAgIC8vIFRydWUgaWZmIHRoaXMgdGVzdCBpcyBkaXNhYmxlZAorICBib29sIG1hdGNoZXNfZmlsdGVyXzsgICAgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGlzIHRlc3QgbWF0Y2hlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXItc3BlY2lmaWVkIGZpbHRlci4KKyAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogY29uc3QgZmFjdG9yeV87ICAvLyBUaGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVzdCBvYmplY3QKKworICAvLyBUaGlzIGZpZWxkIGlzIG11dGFibGUgYW5kIG5lZWRzIHRvIGJlIHJlc2V0IGJlZm9yZSBydW5uaW5nIHRoZQorICAvLyB0ZXN0IGZvciB0aGUgc2Vjb25kIHRpbWUuCisgIFRlc3RSZXN1bHQgcmVzdWx0XzsKKworICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RJbmZvKTsKK307CisKKy8vIEEgdGVzdCBjYXNlLCB3aGljaCBjb25zaXN0cyBvZiBhIHZlY3RvciBvZiBUZXN0SW5mb3MuCisvLworLy8gVGVzdENhc2UgaXMgbm90IGNvcHlhYmxlLgorY2xhc3MgR1RFU1RfQVBJXyBUZXN0Q2FzZSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgLy8KKyAgLy8gVGVzdENhc2UgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBBbHdheXMgdXNlIHRoaXMKKyAgLy8gY29uc3RydWN0b3IgdG8gY3JlYXRlIGEgVGVzdENhc2Ugb2JqZWN0LgorICAvLworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vICAgbmFtZTogICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgLy8gICBhX3R5cGVfcGFyYW06IHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKKyAgLy8gICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIC8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQorICAvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKKyAgVGVzdENhc2UoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAorICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCisgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7CisKKyAgLy8gRGVzdHJ1Y3RvciBvZiBUZXN0Q2FzZS4KKyAgdmlydHVhbCB+VGVzdENhc2UoKTsKKworICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBUZXN0Q2FzZS4KKyAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfLmNfc3RyKCk7IH0KKworICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhCisgIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCisgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0oKSBjb25zdCB7CisgICAgaWYgKHR5cGVfcGFyYW1fLmdldCgpICE9IE5VTEwpCisgICAgICByZXR1cm4gdHlwZV9wYXJhbV8tPmNfc3RyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIHJ1bi4KKyAgYm9vbCBzaG91bGRfcnVuKCkgY29uc3QgeyByZXR1cm4gc2hvdWxkX3J1bl87IH0KKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KKyAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXQgdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgorICBib29sIEZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhaWxlZF90ZXN0X2NvdW50KCkgPiAwOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIGNvbnN0IFRlc3RJbmZvKiBHZXRUZXN0SW5mbyhpbnQgaSkgY29uc3Q7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7CisKKyAgLy8gR2V0cyB0aGUgKG11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSB7IHJldHVybiB0ZXN0X2luZm9fbGlzdF87IH0KKworICAvLyBHZXRzIHRoZSAoaW1tdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgY29uc3QgeworICAgIHJldHVybiB0ZXN0X2luZm9fbGlzdF87CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCisgIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgVGVzdEluZm8qIEdldE11dGFibGVUZXN0SW5mbyhpbnQgaSk7CisKKyAgLy8gU2V0cyB0aGUgc2hvdWxkX3J1biBtZW1iZXIuCisgIHZvaWQgc2V0X3Nob3VsZF9ydW4oYm9vbCBzaG91bGQpIHsgc2hvdWxkX3J1bl8gPSBzaG91bGQ7IH0KKworICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgVGVzdEluZm8gdXBvbgorICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgVGVzdENhc2Ugb2JqZWN0LgorICB2b2lkIEFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKTsKKworICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgorICB2b2lkIENsZWFyUmVzdWx0KCk7CisKKyAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgorICBzdGF0aWMgdm9pZCBDbGVhclRlc3RDYXNlUmVzdWx0KFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKKyAgICB0ZXN0X2Nhc2UtPkNsZWFyUmVzdWx0KCk7CisgIH0KKworICAvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KKyAgdm9pZCBSdW4oKTsKKworICAvLyBSdW5zIFNldFVwVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcyBuZWVkZWQKKyAgLy8gZm9yIGNhdGNoaW5nIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gU2V0VXBUZXN0Q2FzZSgpLgorICB2b2lkIFJ1blNldFVwVGVzdENhc2UoKSB7ICgqc2V0X3VwX3RjXykoKTsgfQorCisgIC8vIFJ1bnMgVGVhckRvd25UZXN0Q2FzZSgpIGZvciB0aGlzIFRlc3RDYXNlLiAgVGhpcyB3cmFwcGVyIGlzCisgIC8vIG5lZWRlZCBmb3IgY2F0Y2hpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBUZWFyRG93blRlc3RDYXNlKCkuCisgIHZvaWQgUnVuVGVhckRvd25UZXN0Q2FzZSgpIHsgKCp0ZWFyX2Rvd25fdGNfKSgpOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IHBhc3NlZC4KKyAgc3RhdGljIGJvb2wgVGVzdFBhc3NlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPlBhc3NlZCgpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGZhaWxlZC4KKyAgc3RhdGljIGJvb2wgVGVzdEZhaWxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7CisgICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPkZhaWxlZCgpOworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGlzIGRpc2FibGVkLgorICBzdGF0aWMgYm9vbCBUZXN0RGlzYWJsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgeworICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXzsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGVzdCBzaG91bGQgcnVuLgorICBzdGF0aWMgYm9vbCBTaG91bGRSdW5UZXN0KGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKKyAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCk7CisgIH0KKworICAvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCisgIHZvaWQgU2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSk7CisKKyAgLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgorICB2b2lkIFVuc2h1ZmZsZVRlc3RzKCk7CisKKyAgLy8gTmFtZSBvZiB0aGUgdGVzdCBjYXNlLgorICBpbnRlcm5hbDo6U3RyaW5nIG5hbWVfOworICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKKyAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCisgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOworICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCisgIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCisgIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4gdGVzdF9pbmZvX2xpc3RfOworICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBsaXN0IHRvIGFsbG93IGVhc3kKKyAgLy8gc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3Qgb3JkZXIuICBUaGUgaS10aCBlbGVtZW50IGluIHRoaXMKKyAgLy8gdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGluIHRoZSBzaHVmZmxlZCB0ZXN0IGxpc3QuCisgIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9pbmRpY2VzXzsKKyAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UuCisgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90Y187CisgIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlLgorICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGNfOworICAvLyBUcnVlIGlmZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgorICBib29sIHNob3VsZF9ydW5fOworICAvLyBFbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0Q2FzZXMuCisgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdENhc2UpOworfTsKKworLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGlzIGNhcGFibGUgb2Ygc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIGFuCisvLyBlbnZpcm9ubWVudC4gIFRoZSB1c2VyIHNob3VsZCBzdWJjbGFzcyB0aGlzIHRvIGRlZmluZSBoaXMgb3duCisvLyBlbnZpcm9ubWVudChzKS4KKy8vCisvLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgZG9lcyB0aGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gaW4gdmlydHVhbAorLy8gbWV0aG9kcyBTZXRVcCgpIGFuZCBUZWFyRG93bigpIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUKKy8vIGRlc3RydWN0b3IsIGFzOgorLy8KKy8vICAgMS4gWW91IGNhbm5vdCBzYWZlbHkgdGhyb3cgZnJvbSBhIGRlc3RydWN0b3IuICBUaGlzIGlzIGEgcHJvYmxlbQorLy8gICAgICBhcyBpbiBzb21lIGNhc2VzIEdvb2dsZSBUZXN0IGlzIHVzZWQgd2hlcmUgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgYW5kCisvLyAgICAgIHdlIG1heSB3YW50IHRvIGltcGxlbWVudCBBU1NFUlRfKiB1c2luZyBleGNlcHRpb25zIHdoZXJlIHRoZXkgYXJlCisvLyAgICAgIGF2YWlsYWJsZS4KKy8vICAgMi4gWW91IGNhbm5vdCB1c2UgQVNTRVJUXyogZGlyZWN0bHkgaW4gYSBjb25zdHJ1Y3RvciBvcgorLy8gICAgICBkZXN0cnVjdG9yLgorY2xhc3MgRW52aXJvbm1lbnQgeworIHB1YmxpYzoKKyAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgbmVlZCB0byBzdWJjbGFzcyBFbnZpcm9ubWVudC4KKyAgdmlydHVhbCB+RW52aXJvbm1lbnQoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQorCisgIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byB0ZWFyIGRvd24gdGhlIGVudmlyb25tZW50LgorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQorIHByaXZhdGU6CisgIC8vIElmIHlvdSBzZWUgYW4gZXJyb3IgYWJvdXQgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG9yCisgIC8vIGFib3V0IGl0IGJlaW5nIHByaXZhdGUsIHlvdSBoYXZlIG1pcy1zcGVsbGVkIFNldFVwKCkgYXMgU2V0dXAoKS4KKyAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9OworICB2aXJ0dWFsIFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwKiBTZXR1cCgpIHsgcmV0dXJuIE5VTEw7IH0KK307CisKKy8vIFRoZSBpbnRlcmZhY2UgZm9yIHRyYWNpbmcgZXhlY3V0aW9uIG9mIHRlc3RzLiBUaGUgbWV0aG9kcyBhcmUgb3JnYW5pemVkIGluCisvLyB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGFyZSBmaXJlZC4KK2NsYXNzIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgflRlc3RFdmVudExpc3RlbmVyKCkge30KKworICAvLyBGaXJlZCBiZWZvcmUgYW55IHRlc3QgYWN0aXZpdHkgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLiAgVGhlcmUgbWF5IGJlIG1vcmUgdGhhbgorICAvLyBvbmUgaXRlcmF0aW9uIGlmIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBzZXQuIGl0ZXJhdGlvbiBpcyB0aGUgaXRlcmF0aW9uCisgIC8vIGluZGV4LCBzdGFydGluZyBmcm9tIDAuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2Ugc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKKworICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3Qgc3RhcnRzLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGVuZHMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOworCisgIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgZW5kcy4KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOworCisgIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCB0ZWFyLWRvd24gZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KKyAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZmluaXNoZXMuCisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7CisKKyAgLy8gRmlyZWQgYWZ0ZXIgYWxsIHRlc3QgYWN0aXZpdGllcyBoYXZlIGVuZGVkLgorICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Cit9OworCisvLyBUaGUgY29udmVuaWVuY2UgY2xhc3MgZm9yIHVzZXJzIHdobyBuZWVkIHRvIG92ZXJyaWRlIGp1c3Qgb25lIG9yIHR3bworLy8gbWV0aG9kcyBhbmQgYXJlIG5vdCBjb25jZXJuZWQgdGhhdCBhIHBvc3NpYmxlIGNoYW5nZSB0byBhIHNpZ25hdHVyZSBvZgorLy8gdGhlIG1ldGhvZHMgdGhleSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYXVnaHQgZHVyaW5nIHRoZSBidWlsZC4gIEZvcgorLy8gY29tbWVudHMgYWJvdXQgZWFjaCBtZXRob2QgcGxlYXNlIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiBUZXN0RXZlbnRMaXN0ZW5lcgorLy8gYWJvdmUuCitjbGFzcyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgLyp0ZXN0X3BhcnRfcmVzdWx0Ki8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQorICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykge30KKyAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Cit9OworCisvLyBUZXN0RXZlbnRMaXN0ZW5lcnMgbGV0cyB1c2VycyBhZGQgbGlzdGVuZXJzIHRvIHRyYWNrIGV2ZW50cyBpbiBHb29nbGUgVGVzdC4KK2NsYXNzIEdURVNUX0FQSV8gVGVzdEV2ZW50TGlzdGVuZXJzIHsKKyBwdWJsaWM6CisgIFRlc3RFdmVudExpc3RlbmVycygpOworICB+VGVzdEV2ZW50TGlzdGVuZXJzKCk7CisKKyAgLy8gQXBwZW5kcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBHb29nbGUgVGVzdCBhc3N1bWVzCisgIC8vIHRoZSBvd25lcnNoaXAgb2YgdGhlIGxpc3RlbmVyIChpLmUuIGl0IHdpbGwgZGVsZXRlIHRoZSBsaXN0ZW5lciB3aGVuCisgIC8vIHRoZSB0ZXN0IHByb2dyYW0gZmluaXNoZXMpLgorICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBJdCB0aGVuCisgIC8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKKyAgLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgorICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOworCisgIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCisgIC8vIG91dHB1dC4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3RlbmVycyBsaXN0IHRvIHNodXQgZG93biBkZWZhdWx0CisgIC8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKKyAgLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIgYW5kIG1ha2VzIHRoaXMKKyAgLy8gZnVuY3Rpb24gcmV0dXJuIE5VTEwgdGhlIG5leHQgdGltZS4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQKKyAgLy8gY29udHJvbGxlZCBieSB0aGUgLS1ndGVzdF9vdXRwdXQ9eG1sIGZsYWcuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQorICAvLyBsaXN0ZW5lcnMgbGlzdCBieSB1c2VycyB3aG8gd2FudCB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dAorICAvLyBjb250cm9sbGVkIGJ5IHRoaXMgZmxhZyBhbmQgc3Vic3RpdHV0ZSBpdCB3aXRoIGN1c3RvbSBvbmUuICBOb3RlIHRoYXQKKyAgLy8gcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdCB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cworICAvLyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dAorICAvLyB0aW1lLgorICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVGVzdENhc2U7CisgIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpOb0V4ZWNEZWF0aFRlc3Q7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOworCisgIC8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCisgIC8vIHN1YnNjcmliZXJzLgorICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIoKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisgIC8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgorICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcworICAvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCisgIHZvaWQgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKKworICAvLyBTZXRzIHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4gIFRoZQorICAvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cworICAvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCisgIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCisgIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KKyAgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7CisKKyAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQorICAvLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuCisgIGJvb2wgRXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpIGNvbnN0OworICB2b2lkIFN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7CisKKyAgLy8gVGhlIGFjdHVhbCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKiByZXBlYXRlcl87CisgIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgc3RhbmRhcmQgcmVzdWx0IG91dHB1dC4KKyAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOworICAvLyBMaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBYTUwgb3V0cHV0IGZpbGUuCisgIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOworCisgIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdEV2ZW50TGlzdGVuZXJzLgorICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudExpc3RlbmVycyk7Cit9OworCisvLyBBIFVuaXRUZXN0IGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RDYXNlcy4KKy8vCisvLyBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgVW5pdFRlc3QgaXMKKy8vIGNyZWF0ZWQgd2hlbiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSBpcyBmaXJzdCBjYWxsZWQuICBUaGlzCisvLyBpbnN0YW5jZSBpcyBuZXZlciBkZWxldGVkLgorLy8KKy8vIFVuaXRUZXN0IGlzIG5vdCBjb3B5YWJsZS4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlIGFzIGxvbmcgYXMgdGhlIG1ldGhvZHMgYXJlIGNhbGxlZAorLy8gYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb24uCitjbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0IHsKKyBwdWJsaWM6CisgIC8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZAorICAvLyBpcyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4KKyAgLy8gQ29uc2VjdXRpdmUgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgorICBzdGF0aWMgVW5pdFRlc3QqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgorICAvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgLy8KKyAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorICBpbnQgUnVuKCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKKworICAvLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkKKyAgLy8gd2FzIGV4ZWN1dGVkLiAgVGhlIFVuaXRUZXN0IG9iamVjdCBvd25zIHRoZSBzdHJpbmcuCisgIGNvbnN0IGNoYXIqIG9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCisgIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgorICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKKyAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCisgIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgorICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdDsKKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisgIC8vIFJldHVybnMgdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKKyAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCisgIC8vCisgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgorICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCisgIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgorICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAorICAvLyB0aGF0IHNob3VsZCBydW4uCisgIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCisgIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgorICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCisgIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KKyAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgorICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KKyAgYm9vbCBQYXNzZWQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAorICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KKyAgYm9vbCBGYWlsZWQoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bworICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cworICAvLyBpbnNpZGUgR29vZ2xlIFRlc3QuCisgIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzKCk7CisKKyBwcml2YXRlOgorICAvLyBSZWdpc3RlcnMgYW5kIHJldHVybnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudC4gIFdoZW4gYSB0ZXN0CisgIC8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluCisgIC8vIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbQorICAvLyBoYXZlIGZpbmlzaGVkLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgdG9ybi1kb3duIGluCisgIC8vIHRoZSAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCisgIC8vCisgIC8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICBFbnZpcm9ubWVudCogQWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7CisKKyAgLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsCisgIC8vIEdvb2dsZSBUZXN0IGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKQorICAvLyBldmVudHVhbGx5IGNhbGwgdGhpcyB0byByZXBvcnQgdGhlaXIgcmVzdWx0cy4gIFRoZSB1c2VyIGNvZGUKKyAgLy8gc2hvdWxkIHVzZSB0aGUgYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KKyAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpTdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OlN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpOworCisgIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuIElmIHRoZSByZXN1bHQgYWxyZWFkeQorICAvLyBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgorICB2b2lkIFJlY29yZFByb3BlcnR5Rm9yQ3VycmVudFRlc3QoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisKKyAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KKyAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCisgIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpOworCisgIC8vIEFjY2Vzc29ycyBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdC4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9CisgIGNvbnN0IGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQorCisgIC8vIFRoZXNlIGNsYXNzZXMgYW5kIGZ1bmNpb25zIGFyZSBmcmllbmRzIGFzIHRoZXkgbmVlZCB0byBhY2Nlc3MgcHJpdmF0ZQorICAvLyBtZW1iZXJzIG9mIFVuaXRUZXN0LgorICBmcmllbmQgY2xhc3MgVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBc3NlcnRIZWxwZXI7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U2NvcGVkVHJhY2U7CisgIGZyaWVuZCBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOworICBmcmllbmQgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOworICBmcmllbmQgdm9pZCBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAorICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCisgICAgICBjb25zdCBpbnRlcm5hbDo6U3RyaW5nJiBtZXNzYWdlKTsKKworICAvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgorICBVbml0VGVzdCgpOworCisgIC8vIEQndG9yCisgIHZpcnR1YWwgflVuaXRUZXN0KCk7CisKKyAgLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZAorICAvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KKyAgdm9pZCBQdXNoR1Rlc3RUcmFjZShjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSk7CisKKyAgLy8gUG9wcyBhIHRyYWNlIGZyb20gdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCisgIHZvaWQgUG9wR1Rlc3RUcmFjZSgpOworCisgIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgaW4gKmltcGxfLiAgVGhpcyBpcyBtdXRhYmxlIGFzIHNvbWUgY29uc3QKKyAgLy8gbWV0aG9kcyBuZWVkIHRvIGxvY2sgaXQgdG9vLgorICBtdXRhYmxlIGludGVybmFsOjpNdXRleCBtdXRleF87CisKKyAgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uIG9iamVjdC4gIFRoaXMgZmllbGQgaXMgbmV2ZXIgY2hhbmdlZCBvbmNlCisgIC8vIHRoZSBvYmplY3QgaXMgY29uc3RydWN0ZWQuICBXZSBkb24ndCBtYXJrIGl0IGFzIGNvbnN0IGhlcmUsIGFzCisgIC8vIGRvaW5nIHNvIHdpbGwgY2F1c2UgYSB3YXJuaW5nIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBVbml0VGVzdC4KKyAgLy8gTXV0YWJsZSBzdGF0ZSBpbiAqaW1wbF8gaXMgcHJvdGVjdGVkIGJ5IG11dGV4Xy4KKyAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbF87CisKKyAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBVbml0VGVzdC4KKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdCk7Cit9OworCisvLyBBIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgYWRkaW5nIGFuIGVudmlyb25tZW50IGZvciB0aGUgdGVzdAorLy8gcHJvZ3JhbS4KKy8vCisvLyBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGNhbGxlZCwgcHJvYmFibHkgaW4KKy8vIG1haW4oKS4gIElmIHlvdSB1c2UgZ3Rlc3RfbWFpbiwgeW91IG5lZWQgdG8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkKKy8vIHN0YXJ0cyBmb3IgaXQgdG8gdGFrZSBlZmZlY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgYSBnbG9iYWwKKy8vIHZhcmlhYmxlIGxpa2UgdGhpczoKKy8vCisvLyAgIHRlc3Rpbmc6OkVudmlyb25tZW50KiBjb25zdCBmb29fZW52ID0KKy8vICAgICAgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOworLy8KKy8vIEhvd2V2ZXIsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gd3JpdGUgeW91ciBvd24gbWFpbigpIGFuZAorLy8gY2FsbCBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKSB0aGVyZSwgYXMgcmVseWluZyBvbiBpbml0aWFsaXphdGlvbgorLy8gb2YgZ2xvYmFsIHZhcmlhYmxlcyBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZCBhbmQgbWF5IGNhdXNlCisvLyBwcm9ibGVtcyB3aGVuIHlvdSByZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudHMgZnJvbSBkaWZmZXJlbnQKKy8vIHRyYW5zbGF0aW9uIHVuaXRzIGFuZCB0aGUgZW52aXJvbm1lbnRzIGhhdmUgZGVwZW5kZW5jaWVzIGFtb25nIHRoZW0KKy8vIChyZW1lbWJlciB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgaW4gd2hpY2gKKy8vIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgYXJlIGluaXRpYWxpemVkKS4KK2lubGluZSBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsKKyAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRFbnZpcm9ubWVudChlbnYpOworfQorCisvLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKKy8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCisvLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKKy8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCisvLworLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCisvLyB1cGRhdGVkLgorLy8KKy8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCitHVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCBjaGFyKiogYXJndik7CisKKy8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KKy8vIFVOSUNPREUgbW9kZS4KK0dURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRm9ybWF0cyBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX0xULCBhbmQgZXRjKQorLy8gb3BlcmFuZCB0byBiZSB1c2VkIGluIGEgZmFpbHVyZSBtZXNzYWdlLiAgVGhlIHR5cGUgKGJ1dCBub3QgdmFsdWUpCisvLyBvZiB0aGUgb3RoZXIgb3BlcmFuZCBtYXkgYWZmZWN0IHRoZSBmb3JtYXQuICBUaGlzIGFsbG93cyB1cyB0bworLy8gcHJpbnQgYSBjaGFyKiBhcyBhIHJhdyBwb2ludGVyIHdoZW4gaXQgaXMgY29tcGFyZWQgYWdhaW5zdCBhbm90aGVyCisvLyBjaGFyKiwgYW5kIHByaW50IGl0IGFzIGEgQyBzdHJpbmcgd2hlbiBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IGFuCisvLyBzdGQ6OnN0cmluZyBvYmplY3QsIGZvciBleGFtcGxlLgorLy8KKy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIHR5cGUgb2YgdGhlIG90aGVyIG9wZXJhbmQuCisvLyBTb21lIHNwZWNpYWxpemVkIHZlcnNpb25zIGFyZSB1c2VkIHRvIGhhbmRsZSBmb3JtYXR0aW5nIHdpZGUgb3IKKy8vIG5hcnJvdyBDIHN0cmluZ3MuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK1N0cmluZyBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoY29uc3QgVDEmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgLyogb3RoZXJfb3BlcmFuZCAqLykgeworICAvLyBDKytCdWlsZGVyIGNvbXBpbGVzIHRoaXMgaW5jb3JyZWN0bHkgaWYgdGhlIG5hbWVzcGFjZSBpc24ndCBleHBsaWNpdGx5CisgIC8vIGdpdmVuLgorICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsKK30KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgYWN0dWFsKSB7CisjaWZkZWYgX01TQ19WRVIKKyMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KKyMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0Mzg5KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaC4KKyNlbmRpZgorCisgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICB9CisKKyNpZmRlZiBfTVNDX1ZFUgorIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgorI2VuZGlmCisKKyAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoYWN0dWFsLCBleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCisvLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAorLy8gaW4ge0FTU0VSVHxFWFBFQ1R9X0VRIHdoZW4gY29tcGlsZWQgd2l0aCBnY2MgNCwgYXMgYW5vbnltb3VzIGVudW1zCisvLyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGNsYXNzIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKKy8vIGxoc19pc19udWxsX2xpdGVyYWwgaXMgdHJ1ZSBpZmYgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpCisvLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLiAgVGhlIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzCisvLyBmb3IgbGhzX2lzX251bGxfbGl0ZXJhbCBiZWluZyBmYWxzZS4KK3RlbXBsYXRlIDxib29sIGxoc19pc19udWxsX2xpdGVyYWw+CitjbGFzcyBFcUhlbHBlciB7CisgcHVibGljOgorICAvLyBUaGlzIHRlbXBsYXRpemVkIHZlcnNpb24gaXMgZm9yIHRoZSBnZW5lcmFsIGNhc2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgYWN0dWFsKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorCisgIC8vIFdpdGggdGhpcyBvdmVybG9hZGVkIHZlcnNpb24sIHdlIGFsbG93IGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkCisgIC8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cworICAvLyBlbnVtcyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCisgIC8vCisgIC8vIEV2ZW4gdGhvdWdoIGl0cyBib2R5IGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSB2ZXJzaW9uLCB3ZQorICAvLyBjYW5ub3QgbWVyZ2UgdGhlIHR3bywgYXMgaXQgd2lsbCBtYWtlIGFub255bW91cyBlbnVtcyB1bmhhcHB5LgorICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7CisgICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgfQorfTsKKworLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpCisvLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLCBsaWtlIE5VTEwsIGZhbHNlLCBvciAwLgordGVtcGxhdGUgPD4KK2NsYXNzIEVxSGVscGVyPHRydWU+IHsKKyBwdWJsaWM6CisgIC8vIFdlIGRlZmluZSB0d28gb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBDb21wYXJlKCkuICBUaGUgZmlyc3QKKyAgLy8gdmVyc2lvbiB3aWxsIGJlIHBpY2tlZCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkgaXMKKyAgLy8gTk9UIGEgcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoMCwgQW5JbnRGdW5jdGlvbigpKSBvcgorICAvLyBFWFBFQ1RfRVEoZmFsc2UsIGFfYm9vbCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwKKyAgICAgIGNvbnN0IFQyJiBhY3R1YWwsCisgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgcHJldmVudHMgdGhpcyBvdmVybG9hZCBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgaWYgVDIKKyAgICAgIC8vIGlzIG5vdCBhIHBvaW50ZXIgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlIEFTU0VSVF9FUShOVUxMLCBteV9wdHIpCisgICAgICAvLyBleHBhbmRzIHRvIENvbXBhcmUoIiIsICIiLCBOVUxMLCBteV9wdHIpLCB3aGljaCByZXF1aXJlcyBhIGNvbnZlcnNpb24KKyAgICAgIC8vIHRvIG1hdGNoIHRoZSBTZWNyZXQqIGluIHRoZSBvdGhlciBvdmVybG9hZCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIG1ha2UKKyAgICAgIC8vIHRoaXMgdGVtcGxhdGUgbWF0Y2ggYmV0dGVyLgorICAgICAgdHlwZW5hbWUgRW5hYmxlSWY8IWlzX3BvaW50ZXI8VDI+Ojp2YWx1ZT46OnR5cGUqID0gMCkgeworICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgIH0KKworICAvLyBUaGlzIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzIGEKKyAgLy8gcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoTlVMTCwgYV9wb2ludGVyKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgIC8vIFdlIHVzZWQgdG8gaGF2ZSBhIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBTZWNyZXQqLiAgVGhhdAorICAgICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIHdvdWxkIGRlZHVjZSB0byAnbG9uZycsIG1ha2luZyB0aGlzIGEgYmV0dGVyIG1hdGNoCisgICAgICAvLyB0aGFuIHRoZSBmaXJzdCBvdmVybG9hZCBldmVuIHdpdGhvdXQgdGhlIGZpcnN0IG92ZXJsb2FkJ3MgRW5hYmxlSWYuCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBnY2Mgd2l0aCAtV2NvbnZlcnNpb24tbnVsbCB3YXJucyB3aGVuICJwYXNzaW5nIE5VTEwgdG8KKyAgICAgIC8vIG5vbi1wb2ludGVyIGFyZ3VtZW50IiAoZXZlbiBhIGRlZHVjZWQgaW50ZWdyYWwgYXJndW1lbnQpLCBzbyB0aGUgb2xkCisgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBjYXVzZWQgd2FybmluZ3MgaW4gdXNlciBjb2RlLgorICAgICAgU2VjcmV0KiAvKiBleHBlY3RlZCAoTlVMTCkgKi8sCisgICAgICBUKiBhY3R1YWwpIHsKKyAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhhdCAnZXhwZWN0ZWQnIGlzIGEgbnVsbCBwb2ludGVyLgorICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VCo+KE5VTEwpLCBhY3R1YWwpOworICB9Cit9OworCisvLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8uICBJdCBpcyBoZXJlIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUKKy8vIG9mIHNpbWlsYXIgY29kZS4KKy8vCisvLyBGb3IgZWFjaCB0ZW1wbGF0aXplZCBoZWxwZXIgZnVuY3Rpb24sIHdlIGFsc28gZGVmaW5lIGFuIG92ZXJsb2FkZWQKKy8vIHZlcnNpb24gZm9yIEJpZ2dlc3RJbnQgaW4gb3JkZXIgdG8gcmVkdWNlIGNvZGUgYmxvYXQgYW5kIGFsbG93CisvLyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZCB3aXRoIHtBU1NFUlR8RVhQRUNUfV8/PyB3aGVuIGNvbXBpbGVkCisvLyB3aXRoIGdjYyA0LgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KKyNkZWZpbmUgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhvcF9uYW1lLCBvcClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPlwKK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2YWwxLCBjb25zdCBUMiYgdmFsMikge1wKKyAgaWYgKHZhbDEgb3AgdmFsMikge1wKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpO1wKKyAgfSBlbHNlIHtcCisgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSBcCisgICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgIiAjb3AgIiAoIiA8PCBleHByMlwKKyAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMilcCisgICAgICAgIDw8ICIgdnMgIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMiwgdmFsMSk7XAorICB9XAorfVwKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShcCisgICAgY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBCaWdnZXN0SW50IHZhbDEsIEJpZ2dlc3RJbnQgdmFsMikKKworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorCisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9ORQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhORSwgIT0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oTEUsIDw9KTsKKy8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xUCitHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExULCA8ICk7CisvLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HRQorR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pOworLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1QKK0dURVNUX0lNUExfQ01QX0hFTFBFUl8oR1QsID4gKTsKKworI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8KKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkVRLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKTsKKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOworCisvLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSTkUuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKKworLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORS4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKKworCisvLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSRVEgb24gd2lkZSBzdHJpbmdzLgorLy8KKy8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogYWN0dWFsKTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gSXNTdWJzdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUKKy8vIGZpcnN0IGFyZ3VtZW50IHRvIHtFWFBFQ1QsQVNTRVJUfV9QUkVEX0ZPUk1BVDIoKSwgbm90IGJ5CisvLyB0aGVtc2VsdmVzLiAgVGhleSBjaGVjayB3aGV0aGVyIG5lZWRsZSBpcyBhIHN1YnN0cmluZyBvZiBoYXlzdGFjaworLy8gKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYgb25seSksIGFuZCByZXR1cm4gYW4KKy8vIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuCisvLworLy8gVGhlIHtuZWVkbGUsaGF5c3RhY2t9X2V4cHIgYXJndW1lbnRzIGFyZSB0aGUgc3RyaW5naWZpZWQKKy8vIGV4cHJlc3Npb25zIHRoYXQgZ2VuZXJhdGVkIHRoZSB0d28gcmVhbCBhcmd1bWVudHMuCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKTsKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spOworR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCisgICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7CisKKyNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKK0dURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAorICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAorICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKKyAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKKyAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spOworI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gSGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnRzLgorLy8KKy8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKKy8vCisvLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKKy8vCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KK0Fzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgYWN0dWFsKSB7CisgIGNvbnN0IEZsb2F0aW5nUG9pbnQ8UmF3VHlwZT4gbGhzKGV4cGVjdGVkKSwgcmhzKGFjdHVhbCk7CisKKyAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgeworICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgIH0KKworICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGV4cGVjdGVkX3NzOworICBleHBlY3RlZF9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCisgICAgICAgICAgICAgIDw8IGV4cGVjdGVkOworCisgIDo6c3RkOjpzdHJpbmdzdHJlYW0gYWN0dWFsX3NzOworICBhY3R1YWxfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQorICAgICAgICAgICAgPDwgYWN0dWFsOworCisgIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdTdHJlYW1Ub1N0cmluZygmZXhwZWN0ZWRfc3MpLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZhY3R1YWxfc3MpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCisvLworLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgorR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpOworCisvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgorLy8gQSBjbGFzcyB0aGF0IGVuYWJsZXMgb25lIHRvIHN0cmVhbSBtZXNzYWdlcyB0byBhc3NlcnRpb24gbWFjcm9zCitjbGFzcyBHVEVTVF9BUElfIEFzc2VydEhlbHBlciB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3Rvci4KKyAgQXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKTsKKyAgfkFzc2VydEhlbHBlcigpOworCisgIC8vIE1lc3NhZ2UgYXNzaWdubWVudCBpcyBhIHNlbWFudGljIHRyaWNrIHRvIGVuYWJsZSBhc3NlcnRpb24KKyAgLy8gc3RyZWFtaW5nOyBzZWUgdGhlIEdURVNUX01FU1NBR0VfIG1hY3JvIGJlbG93LgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFdlIHB1dCBvdXIgZGF0YSBpbiBhIHN0cnVjdCBzbyB0aGF0IHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MgY2FuCisgIC8vIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBnY2MgaXMgaW5jYXBhYmxlIG9mCisgIC8vIHJlLXVzaW5nIHN0YWNrIHNwYWNlIGV2ZW4gZm9yIHRlbXBvcmFyeSB2YXJpYWJsZXMsIHNvIGV2ZXJ5IEVYUEVDVF9FUQorICAvLyByZXNlcnZlcyBzdGFjayBzcGFjZSBmb3IgYW5vdGhlciBBc3NlcnRIZWxwZXIuCisgIHN0cnVjdCBBc3NlcnRIZWxwZXJEYXRhIHsKKyAgICBBc3NlcnRIZWxwZXJEYXRhKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzcmNmaWxlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnKQorICAgICAgICA6IHR5cGUodCksIGZpbGUoc3JjZmlsZSksIGxpbmUobGluZV9udW0pLCBtZXNzYWdlKG1zZykgeyB9CisKKyAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSBjb25zdCB0eXBlOworICAgIGNvbnN0IGNoYXIqICAgICAgICBjb25zdCBmaWxlOworICAgIGludCAgICAgICAgICAgICAgICBjb25zdCBsaW5lOworICAgIFN0cmluZyAgICAgICAgICAgICBjb25zdCBtZXNzYWdlOworCisgICBwcml2YXRlOgorICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyRGF0YSk7CisgIH07CisKKyAgQXNzZXJ0SGVscGVyRGF0YSogY29uc3QgZGF0YV87CisKKyAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBc3NlcnRIZWxwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKyNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAorLy8gVGhlIHB1cmUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgYWxsIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW5oZXJpdCBmcm9tLgorLy8gQSB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzIG11c3QgaW5oZXJpdCBmcm9tIGJvdGggOjp0ZXN0aW5nOjpUZXN0IGFuZAorLy8gOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vc3QgY2FzZXMgdGhhdCBqdXN0IG1lYW5zIGluaGVyaXRpbmcKKy8vIGZyb20gOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtLCBidXQgbW9yZSBjb21wbGljYXRlZCB0ZXN0IGhpZXJhcmNoaWVzCisvLyBtYXkgbmVlZCB0byBpbmhlcml0IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlIGF0IGRpZmZlcmVudCBsZXZlbHMuCisvLworLy8gVGhpcyBpbnRlcmZhY2UgaGFzIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgdmlhCisvLyB0aGUgR2V0UGFyYW0oKSBtZXRob2QuCisvLworLy8gVXNlIGl0IHdpdGggb25lIG9mIHRoZSBwYXJhbWV0ZXIgZ2VuZXJhdG9yIGRlZmluaW5nIGZ1bmN0aW9ucywgbGlrZSBSYW5nZSgpLAorLy8gVmFsdWVzKCksIFZhbHVlc0luKCksIEJvb2woKSwgYW5kIENvbWJpbmUoKS4KKy8vCisvLyBjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKKy8vICBwcm90ZWN0ZWQ6CisvLyAgIEZvb1Rlc3QoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB+Rm9vVGVzdCgpIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisvLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCisvLyAgIH0KKy8vICAgdmlydHVhbCB2b2lkIFRlYXJEb3duIHsKKy8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KKy8vICAgfQorLy8gfTsKKy8vIFRFU1RfUChGb29UZXN0LCBEb2VzQmFyKSB7CisvLyAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBtZXRob2QgaGVyZS4KKy8vICAgRm9vIGZvbzsKKy8vICAgQVNTRVJUX1RSVUUoZm9vLkRvZXNCYXIoR2V0UGFyYW0oKSkpOworLy8gfQorLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoT25lVG9UZW5SYW5nZSwgRm9vVGVzdCwgOjp0ZXN0aW5nOjpSYW5nZSgxLCAxMCkpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFdpdGhQYXJhbUludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIFQgUGFyYW1UeXBlOworICB2aXJ0dWFsIH5XaXRoUGFyYW1JbnRlcmZhY2UoKSB7fQorCisgIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZS4gSXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHRlc3QgZml4dHVyZSdzCisgIC8vIGNvbnN0cnVjdG9yLiBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBub24tc3RhdGljLCBldmVuIHRob3VnaCBpdCBvbmx5CisgIC8vIHJlZmVyZW5jZXMgc3RhdGljIGRhdGEsIHRvIHJlZHVjZSB0aGUgb3Bwb3J0dW5pdHkgZm9yIGluY29ycmVjdCB1c2VzCisgIC8vIGxpa2Ugd3JpdGluZyAnV2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+OjpHZXRQYXJhbSgpJyBmb3IgYSB0ZXN0IHRoYXQKKyAgLy8gdXNlcyBhIGZpeHR1cmUgd2hvc2UgcGFyYW1ldGVyIHR5cGUgaXMgaW50LgorICBjb25zdCBQYXJhbVR5cGUmIEdldFBhcmFtKCkgY29uc3QgeyByZXR1cm4gKnBhcmFtZXRlcl87IH0KKworIHByaXZhdGU6CisgIC8vIFNldHMgcGFyYW1ldGVyIHZhbHVlLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgc3VyZSB0aGUgdmFsdWUKKyAgLy8gcmVtYWlucyBhbGl2ZSBhbmQgdW5jaGFuZ2VkIHRocm91Z2hvdXQgdGhlIGN1cnJlbnQgdGVzdC4KKyAgc3RhdGljIHZvaWQgU2V0UGFyYW0oY29uc3QgUGFyYW1UeXBlKiBwYXJhbWV0ZXIpIHsKKyAgICBwYXJhbWV0ZXJfID0gcGFyYW1ldGVyOworICB9CisKKyAgLy8gU3RhdGljIHZhbHVlIHVzZWQgZm9yIGFjY2Vzc2luZyBwYXJhbWV0ZXIgZHVyaW5nIGEgdGVzdCBsaWZldGltZS4KKyAgc3RhdGljIGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyXzsKKworICAvLyBUZXN0Q2xhc3MgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIFdpdGhQYXJhbUludGVyZmFjZTxUPiBhbmQgVGVzdC4KKyAgdGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4gZnJpZW5kIGNsYXNzIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdEZhY3Rvcnk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IFQqIFdpdGhQYXJhbUludGVyZmFjZTxUPjo6cGFyYW1ldGVyXyA9IE5VTEw7CisKKy8vIE1vc3QgdmFsdWUtcGFyYW1ldGVyaXplZCBjbGFzc2VzIGNhbiBpZ25vcmUgdGhlIGV4aXN0ZW5jZSBvZgorLy8gV2l0aFBhcmFtSW50ZXJmYWNlLCBhbmQgY2FuIGp1c3QgaW5oZXJpdCBmcm9tIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUZXN0V2l0aFBhcmFtIDogcHVibGljIFRlc3QsIHB1YmxpYyBXaXRoUGFyYW1JbnRlcmZhY2U8VD4geworfTsKKworI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAorCisvLyBNYWNyb3MgZm9yIGluZGljYXRpbmcgc3VjY2Vzcy9mYWlsdXJlIGluIHRlc3QgY29kZS4KKworLy8gQUREX0ZBSUxVUkUgdW5jb25kaXRpb25hbGx5IGFkZHMgYSBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCisvLyBTVUNDRUVEIGdlbmVyYXRlcyBhIHN1Y2Nlc3MgLSBpdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUKKy8vIGN1cnJlbnQgdGVzdCBzdWNjZXNzZnVsLCBhcyBhIHRlc3QgaXMgb25seSBzdWNjZXNzZnVsIHdoZW4gaXQgaGFzCisvLyBubyBmYWlsdXJlLgorLy8KKy8vIEVYUEVDVF8qIHZlcmlmaWVzIHRoYXQgYSBjZXJ0YWluIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuICBJZiBub3QsCisvLyBpdCBiZWhhdmVzIGxpa2UgQUREX0ZBSUxVUkUuICBJbiBwYXJ0aWN1bGFyOgorLy8KKy8vICAgRVhQRUNUX1RSVUUgIHZlcmlmaWVzIHRoYXQgYSBCb29sZWFuIGNvbmRpdGlvbiBpcyB0cnVlLgorLy8gICBFWFBFQ1RfRkFMU0UgdmVyaWZpZXMgdGhhdCBhIEJvb2xlYW4gY29uZGl0aW9uIGlzIGZhbHNlLgorLy8KKy8vIEZBSUwgYW5kIEFTU0VSVF8qIGFyZSBzaW1pbGFyIHRvIEFERF9GQUlMVVJFIGFuZCBFWFBFQ1RfKiwgZXhjZXB0CisvLyB0aGF0IHRoZXkgd2lsbCBhbHNvIGFib3J0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9uIGZhaWx1cmUuICBQZW9wbGUKKy8vIHVzdWFsbHkgd2FudCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIEZBSUwgYW5kIEFTU0VSVF8qLCBidXQgdGhvc2UKKy8vIHdyaXRpbmcgZGF0YS1kcml2ZW4gdGVzdHMgb2Z0ZW4gZmluZCB0aGVtc2VsdmVzIHVzaW5nIEFERF9GQUlMVVJFCisvLyBhbmQgRVhQRUNUXyogbW9yZS4KKy8vCisvLyBFeGFtcGxlczoKKy8vCisvLyAgIEVYUEVDVF9UUlVFKHNlcnZlci5TdGF0dXNJc09LKCkpOworLy8gICBBU1NFUlRfRkFMU0Uoc2VydmVyLkhhc1BlbmRpbmdSZXF1ZXN0KHBvcnQpKQorLy8gICAgICAgPDwgIlRoZXJlIGFyZSBzdGlsbCBwZW5kaW5nIHJlcXVlc3RzICIgPDwgIm9uIHBvcnQgIiA8PCBwb3J0OworCisvLyBHZW5lcmF0ZXMgYSBub25mYXRhbCBmYWlsdXJlIHdpdGggYSBnZW5lcmljIG1lc3NhZ2UuCisjZGVmaW5lIEFERF9GQUlMVVJFKCkgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCisKKy8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgYXQgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIHdpdGgKKy8vIGEgZ2VuZXJpYyBtZXNzYWdlLgorI2RlZmluZSBBRERfRkFJTFVSRV9BVChmaWxlLCBsaW5lKSBcCisgIEdURVNUX01FU1NBR0VfQVRfKGZpbGUsIGxpbmUsICJGYWlsZWQiLCBcCisgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUpCisKKy8vIEdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgR1RFU1RfRkFJTCgpIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKCJGYWlsZWQiKQorCisvLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgRkFJTCgpLCB3aGljaCBpcyBhCisvLyBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfRkFJTAorIyBkZWZpbmUgRkFJTCgpIEdURVNUX0ZBSUwoKQorI2VuZGlmCisKKy8vIEdlbmVyYXRlcyBhIHN1Y2Nlc3Mgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KKyNkZWZpbmUgR1RFU1RfU1VDQ0VFRCgpIEdURVNUX1NVQ0NFU1NfKCJTdWNjZWVkZWQiKQorCisvLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgU1VDQ0VFRCgpLCB3aGljaAorLy8gaXMgYSBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfU1VDQ0VFRAorIyBkZWZpbmUgU1VDQ0VFRCgpIEdURVNUX1NVQ0NFRUQoKQorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgdGVzdGluZyBleGNlcHRpb25zLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1RIUk9XKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IHRocm93cyB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fVEhST1coc3RhdGVtZW50KToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IGRvZXNuJ3QgdGhyb3cgYW55IGV4Y2VwdGlvbi4KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0FOWV9USFJPVyhzdGF0ZW1lbnQpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKworI2RlZmluZSBFWFBFQ1RfVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pIFwKKyAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfTk9fVEhST1coc3RhdGVtZW50KSBcCisgIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9BTllfVEhST1coc3RhdGVtZW50KSBcCisgIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pIFwKKyAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfTk9fVEhST1coc3RhdGVtZW50KSBcCisgIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9BTllfVEhST1coc3RhdGVtZW50KSBcCisgIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisvLyBCb29sZWFuIGFzc2VydGlvbnMuIENvbmRpdGlvbiBjYW4gYmUgZWl0aGVyIGEgQm9vbGVhbiBleHByZXNzaW9uIG9yIGFuCisvLyBBc3NlcnRpb25SZXN1bHQuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgQXNzZXJ0aW9uUmVzdWx0IHdpdGgKKy8vIHRoZXNlIG1hY3JvcyBzZWUgY29tbWVudHMgb24gdGhhdCBjbGFzcy4KKyNkZWZpbmUgRVhQRUNUX1RSVUUoY29uZGl0aW9uKSBcCisgIEdURVNUX1RFU1RfQk9PTEVBTl8oY29uZGl0aW9uLCAjY29uZGl0aW9uLCBmYWxzZSwgdHJ1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfRkFMU0UoY29uZGl0aW9uKSBcCisgIEdURVNUX1RFU1RfQk9PTEVBTl8oIShjb25kaXRpb24pLCAjY29uZGl0aW9uLCB0cnVlLCBmYWxzZSwgXAorICAgICAgICAgICAgICAgICAgICAgIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfVFJVRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyhjb25kaXRpb24sICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9GQUxTRShjb25kaXRpb24pIFwKKyAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisKKy8vIEluY2x1ZGVzIHRoZSBhdXRvLWdlbmVyYXRlZCBoZWFkZXIgdGhhdCBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mCisvLyBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gMDkvMjQvMjAxMCBieSBjb21tYW5kCisvLyAnZ2VuX2d0ZXN0X3ByZWRfaW1wbC5weSA1Jy4gIERPIE5PVCBFRElUIEJZIEhBTkQhCisvLworLy8gSW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorCisjaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCisjZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfCisKKy8vIE1ha2VzIHN1cmUgdGhpcyBoZWFkZXIgaXMgbm90IGluY2x1ZGVkIGJlZm9yZSBndGVzdC5oLgorI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCisjIGVycm9yIERvIG5vdCBpbmNsdWRlIGd0ZXN0X3ByZWRfaW1wbC5oIGRpcmVjdGx5LiAgSW5jbHVkZSBndGVzdC5oIGluc3RlYWQuCisjZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KKworLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24KKy8vIG1hY3JvczoKKy8vCisvLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKQorLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWRfZm9ybWF0IGlzIGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHRha2VzIG4gKGluIHRoZQorLy8gY2FzZSBvZiBBU1NFUlRfUFJFRF9GT1JNQVRuKSB2YWx1ZXMgYW5kIHRoZWlyIHNvdXJjZSBleHByZXNzaW9uCisvLyB0ZXh0LCBhbmQgcmV0dXJucyBhIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdC4gIFNlZSB0aGUgZGVmaW5pdGlvbgorLy8gb2YgQVNTRVJUX0VRIGluIGd0ZXN0LmggZm9yIGFuIGV4YW1wbGUuCisvLworLy8gSWYgeW91IGRvbid0IGNhcmUgYWJvdXQgZm9ybWF0dGluZywgeW91IGNhbiB1c2UgdGhlIG1vcmUKKy8vIHJlc3RyaWN0aXZlIHZlcnNpb246CisvLworLy8gICBBU1NFUlRfUFJFRDEocHJlZCwgdjEpCisvLyAgIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpCisvLyAgIC4uLgorLy8KKy8vIHdoZXJlIHByZWQgaXMgYW4gbi1hcnkgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IHJldHVybnMgYm9vbCwKKy8vIGFuZCB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uLCBtdXN0IHN1cHBvcnQgdGhlIDw8IG9wZXJhdG9yIGZvcgorLy8gc3RyZWFtaW5nIHRvIHN0ZDo6b3N0cmVhbS4KKy8vCisvLyBXZSBhbHNvIGRlZmluZSB0aGUgRVhQRUNUXyogdmFyaWF0aW9ucy4KKy8vCisvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBwcmVkaWNhdGVzIHdob3NlIGFyaXR5IGlzIGF0IG1vc3QgNS4KKy8vIFBsZWFzZSBlbWFpbCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKKy8vIHN1cHBvcnQgZm9yIGhpZ2hlciBhcml0aWVzLgorCisvLyBHVEVTVF9BU1NFUlRfIGlzIHRoZSBiYXNpYyBzdGF0ZW1lbnQgdG8gd2hpY2ggYWxsIG9mIHRoZSBhc3NlcnRpb25zCisvLyBpbiB0aGlzIGZpbGUgcmVkdWNlLiAgRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorCisjZGVmaW5lIEdURVNUX0FTU0VSVF8oZXhwcmVzc2lvbiwgb25fZmFpbHVyZSkgXAorICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCisgIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hciA9IChleHByZXNzaW9uKSkgXAorICAgIDsgXAorICBlbHNlIFwKKyAgICBvbl9mYWlsdXJlKGd0ZXN0X2FyLmZhaWx1cmVfbWVzc2FnZSgpKQorCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMT4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkMUhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSkgeworICBpZiAocHJlZCh2MSkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjE7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMS4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgdjEpLFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMUhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSksIG9uX2ZhaWx1cmUpCisKKy8vIFVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVEMShwcmVkLCB2MSkgXAorICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkgXAorICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyPgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQySGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgeworICBpZiAocHJlZCh2MSwgdjIpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MjsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQyLgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCB2MSwgdjIpLFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMi4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDJIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIpLCBvbl9mYWlsdXJlKQorCisvLyBCaW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCisjZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDIocHJlZCwgdjEsIHYyKSBcCisgIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKyNkZWZpbmUgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikgXAorICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMy4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiwKKyAgICAgICAgICB0eXBlbmFtZSBUMz4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkM0hlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzKSB7CisgIGlmIChwcmVkKHYxLCB2MiwgdjMpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjM7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMy4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgdjEsIHYyLCB2MyksXAorICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQzLiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDNIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMpLCBvbl9mYWlsdXJlKQorCisvLyBUZXJuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBFWFBFQ1RfUFJFRDMocHJlZCwgdjEsIHYyLCB2MykgXAorICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDMocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMpIFwKKyAgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcCisgIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKKworCisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKKyAgICAgICAgICB0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiwKKyAgICAgICAgICB0eXBlbmFtZSBUMywKKyAgICAgICAgICB0eXBlbmFtZSBUND4KK0Fzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkNEhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgeworICBpZiAocHJlZCh2MSwgdjIsIHYzLCB2NCkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisKKyAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTQgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU0IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjQ7Cit9CisKKy8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNC4KKy8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KKyNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsICN2NCwgdjEsIHYyLCB2MywgdjQpLFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCisgIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNEhlbHBlcigjcHJlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCksIG9uX2ZhaWx1cmUpCisKKy8vIDQtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgorI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAorICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlCisvLyB0aGlzIGluIHlvdXIgY29kZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAorICAgICAgICAgIHR5cGVuYW1lIFQxLAorICAgICAgICAgIHR5cGVuYW1lIFQyLAorICAgICAgICAgIHR5cGVuYW1lIFQzLAorICAgICAgICAgIHR5cGVuYW1lIFQ0LAorICAgICAgICAgIHR5cGVuYW1lIFQ1PgorQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ1SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgeworICBpZiAocHJlZCh2MSwgdjIsIHYzLCB2NCwgdjUpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworCisgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU0IDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTUgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NTsKK30KKworLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ1LgorLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgorI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsICN2NCwgI3Y1LCB2MSwgdjIsIHYzLCB2NCwgdjUpLFwKKyAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQorCisvLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENS4gIERvbid0IHVzZQorLy8gdGhpcyBpbiB5b3VyIGNvZGUuCisjZGVmaW5lIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXAorICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDVIZWxwZXIoI3ByZWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y1LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjUpLCBvbl9mYWlsdXJlKQorCisvLyA1LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KKyNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUNShwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9QUkVENShwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKKyAgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAorICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorI2RlZmluZSBBU1NFUlRfUFJFRDUocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCisgIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQorCisKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXworCisvLyBNYWNyb3MgZm9yIHRlc3RpbmcgZXF1YWxpdGllcyBhbmQgaW5lcXVhbGl0aWVzLgorLy8KKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0VRKGV4cGVjdGVkLCBhY3R1YWwpOiBUZXN0cyB0aGF0IGV4cGVjdGVkID09IGFjdHVhbAorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTkUodjEsIHYyKTogICAgICAgICAgIFRlc3RzIHRoYXQgdjEgIT0gdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxIDwgdjIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xFKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxIDw9IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HVCh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA+IHYyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HRSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA+PSB2MgorLy8KKy8vIFdoZW4gdGhleSBhcmUgbm90LCBHb29nbGUgVGVzdCBwcmludHMgYm90aCB0aGUgdGVzdGVkIGV4cHJlc3Npb25zIGFuZAorLy8gdGhlaXIgYWN0dWFsIHZhbHVlcy4gIFRoZSB2YWx1ZXMgbXVzdCBiZSBjb21wYXRpYmxlIGJ1aWx0LWluIHR5cGVzLAorLy8gb3IgeW91IHdpbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IuICBCeSAiY29tcGF0aWJsZSIgd2UgbWVhbiB0aGF0IHRoZQorLy8gdmFsdWVzIGNhbiBiZSBjb21wYXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBvcGVyYXRvci4KKy8vCisvLyBOb3RlOgorLy8KKy8vICAgMS4gSXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHVzZXItZGVmaW5lZCB0eXBlIHdvcmsgd2l0aAorLy8gICB7QVNTRVJUfEVYUEVDVH1fPz8oKSwgYnV0IHRoYXQgcmVxdWlyZXMgb3ZlcmxvYWRpbmcgdGhlCisvLyAgIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFuZCBpcyB0aHVzIGRpc2NvdXJhZ2VkIGJ5IHRoZSBHb29nbGUgQysrCisvLyAgIFVzYWdlIEd1aWRlLiAgVGhlcmVmb3JlLCB5b3UgYXJlIGFkdmlzZWQgdG8gdXNlIHRoZQorLy8gICB7QVNTRVJUfEVYUEVDVH1fVFJVRSgpIG1hY3JvIHRvIGFzc2VydCB0aGF0IHR3byBvYmplY3RzIGFyZQorLy8gICBlcXVhbC4KKy8vCisvLyAgIDIuIFRoZSB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MgZG8gcG9pbnRlciBjb21wYXJpc29ucyBvbgorLy8gICBwb2ludGVycyAoaW4gcGFydGljdWxhciwgQyBzdHJpbmdzKS4gIFRoZXJlZm9yZSwgaWYgeW91IHVzZSBpdAorLy8gICB3aXRoIHR3byBDIHN0cmluZ3MsIHlvdSBhcmUgdGVzdGluZyBob3cgdGhlaXIgbG9jYXRpb25zIGluIG1lbW9yeQorLy8gICBhcmUgcmVsYXRlZCwgbm90IGhvdyB0aGVpciBjb250ZW50IGlzIHJlbGF0ZWQuICBUbyBjb21wYXJlIHR3byBDCisvLyAgIHN0cmluZ3MgYnkgY29udGVudCwgdXNlIHtBU1NFUlR8RVhQRUNUfV9TVFIqKCkuCisvLworLy8gICAzLiB7QVNTRVJUfEVYUEVDVH1fRVEoZXhwZWN0ZWQsIGFjdHVhbCkgaXMgcHJlZmVycmVkIHRvCisvLyAgIHtBU1NFUlR8RVhQRUNUfV9UUlVFKGV4cGVjdGVkID09IGFjdHVhbCksIGFzIHRoZSBmb3JtZXIgdGVsbHMgeW91CisvLyAgIHdoYXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyB3aGVuIGl0IGZhaWxzLCBhbmQgc2ltaWxhcmx5IGZvciB0aGUKKy8vICAgb3RoZXIgY29tcGFyaXNvbnMuCisvLworLy8gICA0LiBEbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB7QVNTRVJUfEVYUEVDVH1fPz8oKQorLy8gICBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMsIHdoaWNoIGlzIHVuZGVmaW5lZC4KKy8vCisvLyAgIDUuIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgorLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vICAgRVhQRUNUX05FKDUsIEZvbygpKTsKKy8vICAgRVhQRUNUX0VRKE5VTEwsIGFfcG9pbnRlcik7CisvLyAgIEFTU0VSVF9MVChpLCBhcnJheV9zaXplKTsKKy8vICAgQVNTRVJUX0dUKHJlY29yZHMuc2l6ZSgpLCAwKSA8PCAiVGhlcmUgaXMgbm8gcmVjb3JkIGxlZnQuIjsKKworI2RlZmluZSBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCisgICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhleHBlY3RlZCk+OjpDb21wYXJlLCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX05FKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJORSwgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgRVhQRUNUX0xFKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgRVhQRUNUX0xUKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikKKyNkZWZpbmUgRVhQRUNUX0dFKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgRVhQRUNUX0dUKHZhbDEsIHZhbDIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHVCwgdmFsMSwgdmFsMikKKworI2RlZmluZSBHVEVTVF9BU1NFUlRfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCisgICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyhleHBlY3RlZCk+OjpDb21wYXJlLCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX05FKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJORSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0xUKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0dFKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHRSwgdmFsMSwgdmFsMikKKyNkZWZpbmUgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpIFwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHVCwgdmFsMSwgdmFsMikKKworLy8gRGVmaW5lIG1hY3JvIEdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9YWSB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YKKy8vIEFTU0VSVF9YWSgpLCB3aGljaCBjbGFzaGVzIHdpdGggc29tZSB1c2Vycycgb3duIGNvZGUuCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0VRCisjIGRlZmluZSBBU1NFUlRfRVEodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0VRKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTkUKKyMgZGVmaW5lIEFTU0VSVF9ORSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTkUodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9MRQorIyBkZWZpbmUgQVNTRVJUX0xFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9MRSh2YWwxLCB2YWwyKQorI2VuZGlmCisKKyNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xUCisjIGRlZmluZSBBU1NFUlRfTFQodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0xUKHZhbDEsIHZhbDIpCisjZW5kaWYKKworI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfR0UKKyMgZGVmaW5lIEFTU0VSVF9HRSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfR0UodmFsMSwgdmFsMikKKyNlbmRpZgorCisjaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9HVAorIyBkZWZpbmUgQVNTRVJUX0dUKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HVCh2YWwxLCB2YWwyKQorI2VuZGlmCisKKy8vIEMgU3RyaW5nIENvbXBhcmlzb25zLiAgQWxsIHRlc3RzIHRyZWF0IE5VTEwgYW5kIGFueSBub24tTlVMTCBzdHJpbmcKKy8vIGFzIGRpZmZlcmVudC4gIFR3byBOVUxMcyBhcmUgZXF1YWwuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSRVEoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgPT0gczIKKy8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUk5FKHMxLCBzMik6ICAgICBUZXN0cyB0aGF0IHMxICE9IHMyCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEoczEsIHMyKTogVGVzdHMgdGhhdCBzMSA9PSBzMiwgaWdub3JpbmcgY2FzZQorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FKHMxLCBzMik6IFRlc3RzIHRoYXQgczEgIT0gczIsIGlnbm9yaW5nIGNhc2UKKy8vCisvLyBGb3Igd2lkZSBvciBuYXJyb3cgc3RyaW5nIG9iamVjdHMsIHlvdSBjYW4gdXNlIHRoZQorLy8ge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zLgorLy8KKy8vIERvbid0IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkLAorLy8gd2hpY2ggaXMgdW5kZWZpbmVkLgorLy8KKy8vIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgorCisjZGVmaW5lIEVYUEVDVF9TVFJFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9TVFJORShzMSwgczIpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQorI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpCisjZGVmaW5lIEVYUEVDVF9TVFJDQVNFTkUoczEsIHMyKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKKworI2RlZmluZSBBU1NFUlRfU1RSRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXAorICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBBU1NFUlRfU1RSTkUoczEsIHMyKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSTkUsIHMxLCBzMikKKyNkZWZpbmUgQVNTRVJUX1NUUkNBU0VFUShleHBlY3RlZCwgYWN0dWFsKSBcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBleHBlY3RlZCwgYWN0dWFsKQorI2RlZmluZSBBU1NFUlRfU1RSQ0FTRU5FKHMxLCBzMilcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRU5FLCBzMSwgczIpCisKKy8vIE1hY3JvcyBmb3IgY29tcGFyaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCisvLworLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6CisvLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGZsb2F0IHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsLgorLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpOgorLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBkb3VibGUgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORUFSKHYxLCB2MiwgYWJzX2Vycm9yKToKKy8vICAgICAgICAgVGVzdHMgdGhhdCB2MSBhbmQgdjIgYXJlIHdpdGhpbiB0aGUgZ2l2ZW4gZGlzdGFuY2UgdG8gZWFjaCBvdGhlci4KKy8vCisvLyBHb29nbGUgVGVzdCB1c2VzIFVMUC1iYXNlZCBjb21wYXJpc29uIHRvIGF1dG9tYXRpY2FsbHkgcGljayBhIGRlZmF1bHQKKy8vIGVycm9yIGJvdW5kIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBvcGVyYW5kcy4gIFNlZSB0aGUKKy8vIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgaW4gZ3Rlc3QtaW50ZXJuYWwuaCBpZiB5b3UgYXJlCisvLyBpbnRlcmVzdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCisjZGVmaW5lIEVYUEVDVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0VRKGV4cGVjdGVkLCBhY3R1YWwpXAorICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkKKworI2RlZmluZSBBU1NFUlRfRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbClcCisgIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgQVNTRVJUX0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKVwKKyAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZG91YmxlPiwgXAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBhY3R1YWwpCisKKyNkZWZpbmUgRVhQRUNUX05FQVIodmFsMSwgdmFsMiwgYWJzX2Vycm9yKVwKKyAgRVhQRUNUX1BSRURfRk9STUFUMyg6OnRlc3Rpbmc6OmludGVybmFsOjpEb3VibGVOZWFyUHJlZEZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikKKworI2RlZmluZSBBU1NFUlRfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAorICBBU1NFUlRfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQorCisvLyBUaGVzZSBwcmVkaWNhdGUgZm9ybWF0IGZ1bmN0aW9ucyB3b3JrIG9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcywgYW5kCisvLyBjYW4gYmUgdXNlZCBpbiB7QVNTRVJUfEVYUEVDVH1fUFJFRF9GT1JNQVQyKigpLCBlLmcuCisvLworLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OkRvdWJsZUxFLCBGb28oKSwgNS4wKTsKKworLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscworLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMik7CitHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpOworCisKKyNpZiBHVEVTVF9PU19XSU5ET1dTCisKKy8vIE1hY3JvcyB0aGF0IHRlc3QgZm9yIEhSRVNVTFQgZmFpbHVyZSBhbmQgc3VjY2VzcywgdGhlc2UgYXJlIG9ubHkgdXNlZnVsCisvLyBvbiBXaW5kb3dzLCBhbmQgcmVseSBvbiBXaW5kb3dzIFNESyBtYWNyb3MgYW5kIEFQSXMgdG8gY29tcGlsZS4KKy8vCisvLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfShleHByKQorLy8KKy8vIFdoZW4gZXhwciB1bmV4cGVjdGVkbHkgZmFpbHMgb3Igc3VjY2VlZHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUKKy8vIGV4cGVjdGVkIHJlc3VsdCBhbmQgdGhlIGFjdHVhbCByZXN1bHQgd2l0aCBib3RoIGEgaHVtYW4tcmVhZGFibGUKKy8vIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyB0aGUKKy8vIGhleCByZXN1bHQgY29kZS4KKyMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCisgICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCisKKyMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCisgICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCisKKyMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCisgICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCisKKyMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCisgICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCisKKyNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUworCisvLyBNYWNyb3MgdGhhdCBleGVjdXRlIHN0YXRlbWVudCBhbmQgY2hlY2sgdGhhdCBpdCBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbAorLy8gZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgorLy8KKy8vICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpOworLy8KKy8vIEV4YW1wbGVzOgorLy8KKy8vICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKTsKKy8vICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKSA8PCAiUHJvY2VzcygpIGZhaWxlZCI7CisvLworI2RlZmluZSBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpIFwKKyAgICBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCisjZGVmaW5lIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAorICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKKworLy8gQ2F1c2VzIGEgdHJhY2UgKGluY2x1ZGluZyB0aGUgc291cmNlIGZpbGUgcGF0aCwgdGhlIGN1cnJlbnQgbGluZQorLy8gbnVtYmVyLCBhbmQgdGhlIGdpdmVuIG1lc3NhZ2UpIHRvIGJlIGluY2x1ZGVkIGluIGV2ZXJ5IHRlc3QgZmFpbHVyZQorLy8gbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29kZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIFRoZSBlZmZlY3QgaXMKKy8vIHVuZG9uZSB3aGVuIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgY3VycmVudCBzY29wZS4KKy8vCisvLyBUaGUgbWVzc2FnZSBhcmd1bWVudCBjYW4gYmUgYW55dGhpbmcgc3RyZWFtYWJsZSB0byBzdGQ6Om9zdHJlYW0uCisvLworLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBpbmNsdWRlIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGFzIHBhcnQKKy8vIG9mIHRoZSBkdW1teSB2YXJpYWJsZSBuYW1lLCB0aHVzIGFsbG93aW5nIG11bHRpcGxlIFNDT1BFRF9UUkFDRSgpcworLy8gdG8gYXBwZWFyIGluIHRoZSBzYW1lIGJsb2NrIC0gYXMgbG9uZyBhcyB0aGV5IGFyZSBvbiBkaWZmZXJlbnQKKy8vIGxpbmVzLgorI2RlZmluZSBTQ09QRURfVFJBQ0UobWVzc2FnZSkgXAorICA6OnRlc3Rpbmc6OmludGVybmFsOjpTY29wZWRUcmFjZSBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X3RyYWNlXywgX19MSU5FX18pKFwKKyAgICBfX0ZJTEVfXywgX19MSU5FX18sIDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8IChtZXNzYWdlKSkKKworLy8gQ29tcGlsZS10aW1lIGFzc2VydGlvbiBmb3IgdHlwZSBlcXVhbGl0eS4KKy8vIFN0YXRpY0Fzc2VydFR5cGVFcTx0eXBlMSwgdHlwZTI+KCkgY29tcGlsZXMgaWZmIHR5cGUxIGFuZCB0eXBlMiBhcmUKKy8vIHRoZSBzYW1lIHR5cGUuICBUaGUgdmFsdWUgaXQgcmV0dXJucyBpcyBub3QgaW50ZXJlc3RpbmcuCisvLworLy8gSW5zdGVhZCBvZiBtYWtpbmcgU3RhdGljQXNzZXJ0VHlwZUVxIGEgY2xhc3MgdGVtcGxhdGUsIHdlIG1ha2UgaXQgYQorLy8gZnVuY3Rpb24gdGVtcGxhdGUgdGhhdCBpbnZva2VzIGEgaGVscGVyIGNsYXNzIHRlbXBsYXRlLiAgVGhpcworLy8gcHJldmVudHMgYSB1c2VyIGZyb20gbWlzdXNpbmcgU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4gYnkKKy8vIGRlZmluaW5nIG9iamVjdHMgb2YgdGhhdCB0eXBlLgorLy8KKy8vIENBVkVBVDoKKy8vCisvLyBXaGVuIHVzZWQgaW5zaWRlIGEgbWV0aG9kIG9mIGEgY2xhc3MgdGVtcGxhdGUsCisvLyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPigpIGlzIGVmZmVjdGl2ZSBPTkxZIElGIHRoZSBtZXRob2QgaXMKKy8vIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoKKy8vCisvLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBGb28geworLy8gICAgcHVibGljOgorLy8gICAgIHZvaWQgQmFyKCkgeyB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBUPigpOyB9CisvLyAgIH07CisvLworLy8gdGhlIGNvZGU6CisvLworLy8gICB2b2lkIFRlc3QxKCkgeyBGb288Ym9vbD4gZm9vOyB9CisvLworLy8gd2lsbCBOT1QgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciwgYXMgRm9vPGJvb2w+OjpCYXIoKSBpcyBuZXZlcgorLy8gYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6CisvLworLy8gICB2b2lkIFRlc3QyKCkgeyBGb288Ym9vbD4gZm9vOyBmb28uQmFyKCk7IH0KKy8vCisvLyB0byBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2Jvb2wgU3RhdGljQXNzZXJ0VHlwZUVxKCkgeworICAodm9pZClpbnRlcm5hbDo6U3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQxLCBUMj4oKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERlZmluZXMgYSB0ZXN0LgorLy8KKy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSwgYW5kIHRoZSBzZWNvbmQKKy8vIHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KKy8vCisvLyBUaGUgY29udmVudGlvbiBpcyB0byBlbmQgdGhlIHRlc3QgY2FzZSBuYW1lIHdpdGggIlRlc3QiLiAgRm9yCisvLyBleGFtcGxlLCBhIHRlc3QgY2FzZSBmb3IgdGhlIEZvbyBjbGFzcyBjYW4gYmUgbmFtZWQgRm9vVGVzdC4KKy8vCisvLyBUaGUgdXNlciBzaG91bGQgcHV0IGhpcyB0ZXN0IGNvZGUgYmV0d2VlbiBicmFjZXMgYWZ0ZXIgdXNpbmcgdGhpcworLy8gbWFjcm8uICBFeGFtcGxlOgorLy8KKy8vICAgVEVTVChGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgeworLy8gICAgIEZvbyBmb287CisvLyAgICAgRVhQRUNUX1RSVUUoZm9vLlN0YXR1c0lzT0soKSk7CisvLyAgIH0KKworLy8gTm90ZSB0aGF0IHdlIGNhbGwgR2V0VGVzdFR5cGVJZCgpIGluc3RlYWQgb2YgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIGhlcmUgdG8gZ2V0IHRoZSB0eXBlIElEIG9mIHRlc3Rpbmc6OlRlc3QuICBUaGlzCisvLyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMKKy8vIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMgR2V0VHlwZUlkPAorLy8gOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyCisvLyB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yIGZyb20gdXNlciB0ZXN0CisvLyBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZQorLy8gdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlIEdvb2dsZSBUZXN0CisvLyBmcmFtZXdvcmsuCisjZGVmaW5lIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCisgIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIFwKKyAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUZXN0VHlwZUlkKCkpCisKKy8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBURVNUKCksIHdoaWNoCisvLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorI2lmICFHVEVTVF9ET05UX0RFRklORV9URVNUCisjIGRlZmluZSBURVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkKKyNlbmRpZgorCisvLyBEZWZpbmVzIGEgdGVzdCB0aGF0IHVzZXMgYSB0ZXN0IGZpeHR1cmUuCisvLworLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLCB3aGljaAorLy8gYWxzbyBkb3VibGVzIGFzIHRoZSB0ZXN0IGNhc2UgbmFtZS4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZQorLy8gbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KKy8vCisvLyBBIHRlc3QgZml4dHVyZSBjbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGVhcmxpZXIuICBUaGUgdXNlciBzaG91bGQgcHV0CisvLyBoaXMgdGVzdCBjb2RlIGJldHdlZW4gYnJhY2VzIGFmdGVyIHVzaW5nIHRoaXMgbWFjcm8uICBFeGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKy8vICAgIHByb3RlY3RlZDoKKy8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGJfLkFkZEVsZW1lbnQoMyk7IH0KKy8vCisvLyAgICAgRm9vIGFfOworLy8gICAgIEZvbyBiXzsKKy8vICAgfTsKKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgeworLy8gICAgIEVYUEVDVF9UUlVFKGFfLlN0YXR1c0lzT0soKSk7CisvLyAgIH0KKy8vCisvLyAgIFRFU1RfRihGb29UZXN0LCBSZXR1cm5zRWxlbWVudENvdW50Q29ycmVjdGx5KSB7CisvLyAgICAgRVhQRUNUX0VRKDAsIGFfLnNpemUoKSk7CisvLyAgICAgRVhQRUNUX0VRKDEsIGJfLnNpemUoKSk7CisvLyAgIH0KKworI2RlZmluZSBURVNUX0YodGVzdF9maXh0dXJlLCB0ZXN0X25hbWUpXAorICBHVEVTVF9URVNUXyh0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSwgdGVzdF9maXh0dXJlLCBcCisgICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFR5cGVJZDx0ZXN0X2ZpeHR1cmU+KCkpCisKKy8vIFVzZSB0aGlzIG1hY3JvIGluIG1haW4oKSB0byBydW4gYWxsIHRlc3RzLiAgSXQgcmV0dXJucyAwIGlmIGFsbAorLy8gdGVzdHMgYXJlIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgorLy8KKy8vIFJVTl9BTExfVEVTVFMoKSBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGhhcyBiZWVuCisvLyBwYXJzZWQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KKworI2RlZmluZSBSVU5fQUxMX1RFU1RTKClcCisgICg6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5SdW4oKSkKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL05hdGl2ZVRhc2suaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvTmF0aXZlVGFzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDI2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL05hdGl2ZVRhc2suaApAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOQVRJVkVUQVNLX0hfCisjZGVmaW5lIE5BVElWRVRBU0tfSF8KKworI2luY2x1ZGUgImxpYi9qbml1dGlscy5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6cGFpcjsKKworLyoqCisgKiBOYXRpdmVPYmplY3RUeXBlCisgKi8KK2VudW0gTmF0aXZlT2JqZWN0VHlwZSB7CisgIFVua25vd25PYmplY3RUeXBlID0gMCwKKyAgQmF0Y2hIYW5kbGVyVHlwZSA9IDEsCit9OworCisvKioKKyAqIEVuZHVpbSBzZXR0aW5nCisgKgorICovCitlbnVtIEVuZGl1bSB7CisgIExJVFRMRV9FTkRJVU0gPSAwLAorICBMQVJHRV9FTkRJVU0gPSAxCit9OworCisjZGVmaW5lIE5BVElWRV9DT01CSU5FUiAibmF0aXZlLmNvbWJpbmVyLmNsYXNzIgorI2RlZmluZSBOQVRJVkVfUEFSVElUSU9ORVIgIm5hdGl2ZS5wYXJ0aXRpb25lci5jbGFzcyIKKyNkZWZpbmUgTkFUSVZFX01BUFBFUiAibmF0aXZlLm1hcHBlci5jbGFzcyIKKyNkZWZpbmUgTkFUSVZFX1JFQ09SRFJFQURFUiAibmF0aXZlLnJlY29yZHJlYWRlci5jbGFzcyIKKyNkZWZpbmUgTkFUSVZFX1JFQ09SRFdSSVRFUiAibmF0aXZlLnJlY29yZHdyaXRlci5jbGFzcyIKKworI2RlZmluZSBOQVRJVkVfUkVEVUNFUiAibmF0aXZlLnJlZHVjZXIuY2xhc3MiCisjZGVmaW5lIE5BVElWRV9IQURPT1BfVkVSU0lPTiAibmF0aXZlLmhhZG9vcC52ZXJzaW9uIgorCisjZGVmaW5lIE5BVElWRV9JTlBVVF9TUExJVCAibmF0aXZlLmlucHV0LnNwbGl0IgorI2RlZmluZSBJTlBVVF9MSU5FX0tWX1NFUEVSQVRPUiAibWFwcmVkdWNlLmlucHV0LmtleXZhbHVlbGluZXJlY29yZHJlYWRlci5rZXkudmFsdWUuc2VwYXJhdG9yIgorI2RlZmluZSBNQVBSRURfVEVYVE9VVFBVVF9GT1JNQVRfU0VQRVJBVE9SICJtYXByZWR1Y2Uub3V0cHV0LnRleHRvdXRwdXRmb3JtYXQuc2VwYXJhdG9yIgorI2RlZmluZSBNQVBSRURfV09SS19PVVRfRElSICJtYXByZWR1Y2UudGFzay5vdXRwdXQuZGlyIgorI2RlZmluZSBNQVBSRURfQ09NUFJFU1NfT1VUUFVUICJtYXByZWR1Y2Uub3V0cHV0LmZpbGVvdXRwdXRmb3JtYXQuY29tcHJlc3MiCisjZGVmaW5lIE1BUFJFRF9PVVRQVVRfQ09NUFJFU1NJT05fQ09ERUMgIm1hcHJlZHVjZS5vdXRwdXQuZmlsZW91dHB1dGZvcm1hdC5jb21wcmVzcy5jb2RlYyIKKyNkZWZpbmUgVE9UQUxfT1JERVJfUEFSVElUSU9ORVJfUEFUSCAidG90YWwub3JkZXIucGFydGl0aW9uZXIucGF0aCIKKyNkZWZpbmUgVE9UQUxfT1JERVJfUEFSVElUSU9ORVJfTUFYX1RSSUVfREVQVEggInRvdGFsLm9yZGVyLnBhcnRpdGlvbmVyLm1heC50cmllLmRlcHRoIgorI2RlZmluZSBGU19ERUZBVUxUX05BTUUgImZzLmRlZmF1bHQubmFtZSIKKyNkZWZpbmUgRlNfREVGQVVMVF9GUyAiZnMuZGVmYXVsdEZTIgorCisjZGVmaW5lIE5BVElWRV9TT1JUX1RZUEUgIm5hdGl2ZS5zb3J0LnR5cGUiCisjZGVmaW5lIE1BUFJFRF9TT1JUX0FWT0lEICJtYXByZWR1Y2Uuc29ydC5hdm9pZGFuY2UiCisjZGVmaW5lIE5BVElWRV9TT1JUX01BWF9CTE9DS19TSVpFICJuYXRpdmUuc29ydC5ibG9ja3NpemUubWF4IgorI2RlZmluZSBNQVBSRURfQ09NUFJFU1NfTUFQX09VVFBVVCAibWFwcmVkdWNlLm1hcC5vdXRwdXQuY29tcHJlc3MiCisjZGVmaW5lIE1BUFJFRF9NQVBfT1VUUFVUX0NPTVBSRVNTSU9OX0NPREVDICJtYXByZWR1Y2UubWFwLm91dHB1dC5jb21wcmVzcy5jb2RlYyIKKyNkZWZpbmUgTUFQUkVEX01BUE9VVFBVVF9LRVlfQ0xBU1MgIm1hcHJlZHVjZS5tYXAub3V0cHV0LmtleS5jbGFzcyIKKyNkZWZpbmUgTUFQUkVEX09VVFBVVF9LRVlfQ0xBU1MgIm1hcHJlZHVjZS5qb2Iub3V0cHV0LmtleS5jbGFzcyIKKyNkZWZpbmUgTUFQUkVEX01BUE9VVFBVVF9WQUxVRV9DTEFTUyAibWFwcmVkdWNlLm1hcC5vdXRwdXQudmFsdWUuY2xhc3MiCisjZGVmaW5lIE1BUFJFRF9PVVRQVVRfVkFMVUVfQ0xBU1MgIm1hcHJlZHVjZS5qb2Iub3V0cHV0LnZhbHVlLmNsYXNzIgorI2RlZmluZSBNQVBSRURfSU9fU09SVF9NQiAibWFwcmVkdWNlLnRhc2suaW8uc29ydC5tYiIKKyNkZWZpbmUgTUFQUkVEX05VTV9SRURVQ0VTICJtYXByZWR1Y2Uuam9iLnJlZHVjZXMiCisjZGVmaW5lIE1BUFJFRF9DT01CSU5FX0NMQVNTX09MRCAibWFwcmVkLmNvbWJpbmVyLmNsYXNzIgorI2RlZmluZSBNQVBSRURfQ09NQklORV9DTEFTU19ORVcgIm1hcHJlZHVjZS5qb2IuY29tYmluZS5jbGFzcyIKKworI2RlZmluZSBOQVRJVkVfTE9HX0RFVklDRSAibmF0aXZlLmxvZy5kZXZpY2UiCisKKy8vZm9ybWF0OiBuYW1lPXBhdGgsbmFtZT1wYXRoLG5hbWU9cGF0aAorI2RlZmluZSBOQVRJVkVfQ0xBU1NfTElCUkFSWV9CVUlMRElOICJuYXRpdmUuY2xhc3MubGlicmFyeS5idWlsZGluIgorCisjZGVmaW5lIE5BVElWRV9NQVBPVVRfS0VZX0NPTVBBUkFUT1IgIm5hdGl2ZS5tYXAub3V0cHV0LmtleS5jb21wYXJhdG9yIgorCitleHRlcm4gY29uc3Qgc3RkOjpzdHJpbmcgTmF0aXZlT2JqZWN0VHlwZVRvU3RyaW5nKE5hdGl2ZU9iamVjdFR5cGUgdHlwZSk7CitleHRlcm4gTmF0aXZlT2JqZWN0VHlwZSBOYXRpdmVPYmplY3RUeXBlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyB0eXBlKTsKKworLyoqCisgKiBPYmplY3RzIHRoYXQgY2FuIGJlIGxvYWRlZCBkeW5hbWljYWxseSBmcm9tIHNoYXJlZCBsaWJyYXJ5LAorICogYW5kIG1hbmFnZWQgYnkgTmF0aXZlT2JqZWN0RmFjdG9yeQorICovCitjbGFzcyBOYXRpdmVPYmplY3QgeworcHVibGljOgorICB2aXJ0dWFsIE5hdGl2ZU9iamVjdFR5cGUgdHlwZSgpIHsKKyAgICByZXR1cm4gVW5rbm93bk9iamVjdFR5cGU7CisgIH0KKworICB2aXJ0dWFsIH5OYXRpdmVPYmplY3QoKSB7CisgIH0KKyAgOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK05hdGl2ZU9iamVjdCAqIE9iamVjdENyZWF0b3IoKSB7CisgIHJldHVybiBuZXcgVCgpOworfQorCit0eXBlZGVmIE5hdGl2ZU9iamVjdCAqICgqT2JqZWN0Q3JlYXRvckZ1bmMpKCk7CisKK3R5cGVkZWYgT2JqZWN0Q3JlYXRvckZ1bmMgKCpHZXRPYmplY3RDcmVhdG9yRnVuYykoY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKTsKKwordHlwZWRlZiB2b2lkICogKCpGdW5jdGlvbkdldHRlcikoY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKTsKKwordHlwZWRlZiBpbnQzMl90ICgqSW5pdExpYnJhcnlGdW5jKSgpOworCisvKioKKyAqIEV4Y2VwdGlvbnMKKyAqLworY2xhc3MgSGFkb29wRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIF9yZWFzb247CitwdWJsaWM6CisgIEhhZG9vcEV4Y2VwdGlvbihjb25zdCBzdHJpbmcgJiB3aGF0KTsKKyAgdmlydHVhbCB+SGFkb29wRXhjZXB0aW9uKCkgdGhyb3cgKCkgeworICB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3cgKCkgeworICAgIHJldHVybiBfcmVhc29uLmNfc3RyKCk7CisgIH0KK307CisKK2NsYXNzIE91dE9mTWVtb3J5RXhjZXB0aW9uIDogcHVibGljIEhhZG9vcEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIE91dE9mTWVtb3J5RXhjZXB0aW9uKGNvbnN0IHN0cmluZyAmIHdoYXQpCisgICAgICA6IEhhZG9vcEV4Y2VwdGlvbih3aGF0KSB7CisgIH0KK307CisKK2NsYXNzIElPRXhjZXB0aW9uIDogcHVibGljIEhhZG9vcEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIElPRXhjZXB0aW9uKGNvbnN0IHN0cmluZyAmIHdoYXQpCisgICAgICA6IEhhZG9vcEV4Y2VwdGlvbih3aGF0KSB7CisgIH0KK307CisKK2NsYXNzIFVuc3VwcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBIYWRvb3BFeGNlcHRpb24geworcHVibGljOgorICBVbnN1cHBvcnRFeGNlcHRpb24oY29uc3Qgc3RyaW5nICYgd2hhdCkKKyAgICAgIDogSGFkb29wRXhjZXB0aW9uKHdoYXQpIHsKKyAgfQorfTsKKworLyoqCisgKiBFeGNlcHRpb24gd2hlbiBjYWxsIGphdmEgbWV0aG9kcyB1c2luZyBKTkkKKyAqLworY2xhc3MgSmF2YUV4Y2VwdGlvbiA6IHB1YmxpYyBIYWRvb3BFeGNlcHRpb24geworcHVibGljOgorICBKYXZhRXhjZXB0aW9uKGNvbnN0IHN0cmluZyAmIHdoYXQpCisgICAgICA6IEhhZG9vcEV4Y2VwdGlvbih3aGF0KSB7CisgIH0KK307CisKKyNkZWZpbmUgU1RSSU5HSUZZKHgpICN4CisjZGVmaW5lIFRPU1RSSU5HKHgpIFNUUklOR0lGWSh4KQorI2RlZmluZSBBVCBfX0ZJTEVfXyAiOiIgVE9TVFJJTkcoX19MSU5FX18pCisjZGVmaW5lIFRIUk9XX0VYQ0VQVElPTih0eXBlLCB3aGF0KSB0aHJvdyB0eXBlKChzdGQ6OnN0cmluZyhBVCI6IikgKyB3aGF0KSkKKyNkZWZpbmUgVEhST1dfRVhDRVBUSU9OX0VYKHR5cGUsIGZtdCwgYXJncy4uLikgXAorICAgICAgICB0aHJvdyB0eXBlKFN0cmluZ1V0aWw6OkZvcm1hdCgiJXM6IiBmbXQsIEFULCAjI2FyZ3MpKQorCitjbGFzcyBDb25maWcgeworcHJvdGVjdGVkOgorICBtYXA8c3RyaW5nLCBzdHJpbmc+IF9jb25maWdzOworcHVibGljOgorICBDb25maWcoKSB7CisgIH0KKyAgfkNvbmZpZygpIHsKKyAgfQorCisgIGNvbnN0IGNoYXIgKiBnZXQoY29uc3Qgc3RyaW5nICYgbmFtZSk7CisKKyAgc3RyaW5nIGdldChjb25zdCBzdHJpbmcgJiBuYW1lLCBjb25zdCBzdHJpbmcgJiBkZWZhdWx0VmFsdWUpOworCisgIGJvb2wgZ2V0Qm9vbChjb25zdCBzdHJpbmcgJiBuYW1lLCBib29sIGRlZmF1bHRWYWx1ZSk7CisKKyAgaW50NjRfdCBnZXRJbnQoY29uc3Qgc3RyaW5nICYgbmFtZSwgaW50NjRfdCBkZWZhdWx0VmFsdWUgPSAtMSk7CisKKyAgZmxvYXQgZ2V0RmxvYXQoY29uc3Qgc3RyaW5nICYgbmFtZSwgZmxvYXQgZGVmYXVsdFZhbHVlID0gLTEpOworCisgIHZvaWQgZ2V0U3RyaW5ncyhjb25zdCBzdHJpbmcgJiBuYW1lLCB2ZWN0b3I8c3RyaW5nPiAmIGRlc3QpOworCisgIHZvaWQgZ2V0SW50cyhjb25zdCBzdHJpbmcgJiBuYW1lLCB2ZWN0b3I8aW50NjRfdD4gJiBkZXN0KTsKKworICB2b2lkIGdldEZsb2F0cyhjb25zdCBzdHJpbmcgJiBuYW1lLCB2ZWN0b3I8ZmxvYXQ+ICYgZGVzdCk7CisKKyAgdm9pZCBzZXQoY29uc3Qgc3RyaW5nICYga2V5LCBjb25zdCBzdHJpbmcgJiB2YWx1ZSk7CisKKyAgdm9pZCBzZXRJbnQoY29uc3Qgc3RyaW5nICYgbmFtZSwgaW50NjRfdCB2YWx1ZSk7CisKKyAgdm9pZCBzZXRCb29sKGNvbnN0IHN0cmluZyAmIG5hbWUsIGJvb2wgdmFsdWUpOworCisgIC8qKgorICAgKiBMb2FkIGNvbmZpZ3MgZnJvbSBhIGNvbmZpZyBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAqICMgY29tbWVudAorICAgKiBrZXkxPXZhbHVlMQorICAgKiBrZXkyPXZhbHVlMgorICAgKiAuLi4KKyAgICovCisgIHZvaWQgbG9hZChjb25zdCBzdHJpbmcgJiBwYXRoKTsKKworICAvKioKKyAgICogTG9hZCBjb25maWdzIGZvcm0gY29tbWFuZCBsaW5lIGFyZ3MKKyAgICoga2V5MT12YWx1ZTEga2V5Mj12YWx1ZTIsdmFsdWUyCisgICAqLworICB2b2lkIHBhcnNlKGludDMyX3QgYXJnYywgY29uc3QgY2hhciAqKiBhcmd2KTsKK307CisKK2NsYXNzIENvbW1hbmQgeworcHJpdmF0ZToKKyAgaW50IF9pZDsKKyAgY29uc3QgY2hhciAqIF9kZXNjcmlwdGlvbjsKKworcHVibGljOgorICBDb21tYW5kKGludCBpZCwgY29uc3QgY2hhciAqIGRlc2NyaXB0aW9uKQorICAgICAgOiBfaWQoaWQpLCBfZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pIHsKKyAgfQorCisgIENvbW1hbmQoaW50IGlkKQorICAgICAgOiBfaWQoaWQpLCBfZGVzY3JpcHRpb24oTlVMTCkgeworICB9CisKKyAgaW50IGlkKCkgY29uc3QgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBjb25zdCBjaGFyICogZGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKKyAgfQorCisgIGJvb2wgZXF1YWxzKGNvbnN0IENvbW1hbmQgJiBvdGhlcikgY29uc3QgeworICAgIGlmIChfaWQgPT0gb3RoZXIuX2lkKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitjbGFzcyBCdWZmZXIgeworcHJvdGVjdGVkOgorICBjb25zdCBjaGFyICogX2RhdGE7CisgIHVpbnQzMl90IF9sZW5ndGg7CisKK3B1YmxpYzoKKyAgQnVmZmVyKCkKKyAgICAgIDogX2RhdGEoTlVMTCksIF9sZW5ndGgoMCkgeworICB9CisKKyAgQnVmZmVyKGNvbnN0IGNoYXIgKiBkYXRhLCB1aW50MzJfdCBsZW5ndGgpCisgICAgICA6IF9kYXRhKGRhdGEpLCBfbGVuZ3RoKGxlbmd0aCkgeworICB9CisKKyAgfkJ1ZmZlcigpIHsKKyAgfQorCisgIHZvaWQgcmVzZXQoY29uc3QgY2hhciAqIGRhdGEsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIHRoaXMtPl9kYXRhID0gZGF0YTsKKyAgICB0aGlzLT5fbGVuZ3RoID0gbGVuZ3RoOworICB9CisKKyAgY29uc3QgY2hhciAqIGRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIF9kYXRhOworICB9CisKKyAgdWludDMyX3QgbGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBfbGVuZ3RoOworICB9CisKKyAgdm9pZCBkYXRhKGNvbnN0IGNoYXIgKiBkYXRhKSB7CisgICAgdGhpcy0+X2RhdGEgPSBkYXRhOworICB9CisKKyAgdm9pZCBsZW5ndGgodWludDMyX3QgbGVuZ3RoKSB7CisgICAgdGhpcy0+X2xlbmd0aCA9IGxlbmd0aDsKKyAgfQorCisgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyaW5nKF9kYXRhLCBfbGVuZ3RoKTsKKyAgfQorfTsKKworY2xhc3MgSW5wdXRTcGxpdCB7CitwdWJsaWM6CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0TGVuZ3RoKCkgPSAwOworICB2aXJ0dWFsIHZlY3RvcjxzdHJpbmc+ICYgZ2V0TG9jYXRpb25zKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgcmVhZEZpZWxkcyhjb25zdCBzdHJpbmcgJiBkYXRhKSA9IDA7CisgIHZpcnR1YWwgdm9pZCB3cml0ZUZpZWxkcyhzdHJpbmcgJiBkZXN0KSA9IDA7CisgIHZpcnR1YWwgc3RyaW5nIHRvU3RyaW5nKCkgPSAwOworCisgIHZpcnR1YWwgfklucHV0U3BsaXQoKSB7CisKKyAgfQorfTsKKworY2xhc3MgQ29uZmlndXJhYmxlIDogcHVibGljIE5hdGl2ZU9iamVjdCB7CitwdWJsaWM6CisgIENvbmZpZ3VyYWJsZSgpIHsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoQ29uZmlnICogY29uZmlnKSB7CisgIH0KK307CisKK2NsYXNzIENvbGxlY3RvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkNvbGxlY3RvcigpIHsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBjb2xsZWN0KGNvbnN0IHZvaWQgKiBrZXksIHVpbnQzMl90IGtleUxlbiwgY29uc3Qgdm9pZCAqIHZhbHVlLCB1aW50MzJfdCB2YWx1ZUxlbikgeworICB9CisKKyAgdmlydHVhbCB2b2lkIGNvbGxlY3QoY29uc3Qgdm9pZCAqIGtleSwgdWludDMyX3Qga2V5TGVuLCBjb25zdCB2b2lkICogdmFsdWUsIHVpbnQzMl90IHZhbHVlTGVuLAorICAgICAgaW50MzJfdCBwYXJ0aXRpb24pIHsKKyAgICBjb2xsZWN0KGtleSwga2V5TGVuLCB2YWx1ZSwgdmFsdWVMZW4pOworICB9Cit9OworCitjbGFzcyBQcm9ncmVzcyB7CitwdWJsaWM6CisgIHZpcnR1YWwgflByb2dyZXNzKCkgeworICB9CisgIHZpcnR1YWwgZmxvYXQgZ2V0UHJvZ3Jlc3MoKSA9IDA7Cit9OworCitjbGFzcyBDb3VudGVyIHsKK3ByaXZhdGU6CisgIC8vIG5vdCB0aHJlYWQgc2FmZQorICAvLyBUT0RPOiB1c2UgYXRvbWljCisgIHZvbGF0aWxlIHVpbnQ2NF90IF9jb3VudDsKKworICBzdHJpbmcgX2dyb3VwOworICBzdHJpbmcgX25hbWU7CitwdWJsaWM6CisgIENvdW50ZXIoY29uc3Qgc3RyaW5nICYgZ3JvdXAsIGNvbnN0IHN0cmluZyAmIG5hbWUpCisgICAgICA6IF9jb3VudCgwKSwgX2dyb3VwKGdyb3VwKSwgX25hbWUobmFtZSkgeworICB9CisKKyAgY29uc3Qgc3RyaW5nICYgZ3JvdXAoKSBjb25zdCB7CisgICAgcmV0dXJuIF9ncm91cDsKKyAgfQorICBjb25zdCBzdHJpbmcgJiBuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBfbmFtZTsKKyAgfQorCisgIHVpbnQ2NF90IGdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2NvdW50OworICB9CisKKyAgdm9pZCBpbmNyZWFzZSgpIHsKKyAgICBfY291bnQrKzsKKyAgfQorCisgIHZvaWQgaW5jcmVhc2UodWludDY0X3QgY250KSB7CisgICAgX2NvdW50ICs9IGNudDsKKyAgfQorfTsKKworY2xhc3MgS1ZJdGVyYXRvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfktWSXRlcmF0b3IoKSB7CisgIH0KKyAgdmlydHVhbCBib29sIG5leHQoQnVmZmVyICYga2V5LCBCdWZmZXIgJiB2YWx1ZSkgPSAwOworfTsKKworCitjbGFzcyBQcm9jZXNzb3JCYXNlIDogcHVibGljIENvbmZpZ3VyYWJsZSB7Citwcm90ZWN0ZWQ6CisgIENvbGxlY3RvciAqIF9jb2xsZWN0b3I7CitwdWJsaWM6CisgIFByb2Nlc3NvckJhc2UoKQorICAgICAgOiBfY29sbGVjdG9yKE5VTEwpIHsKKyAgfQorCisgIHZvaWQgc2V0Q29sbGVjdG9yKENvbGxlY3RvciAqIGNvbGxlY3RvcikgeworICAgIF9jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisgIH0KKworICBDb2xsZWN0b3IgKiBnZXRDb2xsZWN0b3IoKSB7CisgICAgcmV0dXJuIF9jb2xsZWN0b3I7CisgIH0KKworICB2b2lkIGNvbGxlY3QoY29uc3Qgdm9pZCAqIGtleSwgdWludDMyX3Qga2V5TGVuLCBjb25zdCB2b2lkICogdmFsdWUsIHVpbnQzMl90IHZhbHVlTGVuKSB7CisgICAgX2NvbGxlY3Rvci0+Y29sbGVjdChrZXksIGtleUxlbiwgdmFsdWUsIHZhbHVlTGVuKTsKKyAgfQorCisgIHZvaWQgY29sbGVjdChjb25zdCB2b2lkICoga2V5LCB1aW50MzJfdCBrZXlMZW4sIGNvbnN0IHZvaWQgKiB2YWx1ZSwgdWludDMyX3QgdmFsdWVMZW4sCisgICAgICBpbnQzMl90IHBhcnRpdGlvbikgeworICAgIF9jb2xsZWN0b3ItPmNvbGxlY3Qoa2V5LCBrZXlMZW4sIHZhbHVlLCB2YWx1ZUxlbiwgcGFydGl0aW9uKTsKKyAgfQorCisgIENvdW50ZXIgKiBnZXRDb3VudGVyKGNvbnN0IHN0cmluZyAmIGdyb3VwLCBjb25zdCBzdHJpbmcgJiBuYW1lKTsKKworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7CisgIH0KK307CisKK2VudW0gS2V5R3JvdXBJdGVyU3RhdGUgeworICBTQU1FX0tFWSwKKyAgTkVXX0tFWSwKKyAgTkVXX0tFWV9WQUxVRSwKKyAgTk9fTU9SRSwKK307CisKK2NsYXNzIEtleUdyb3VwSXRlcmF0b3IgeworcHVibGljOgorICB2aXJ0dWFsIH5LZXlHcm91cEl0ZXJhdG9yKCkgeworICB9CisgIC8qKgorICAgKiBNb3ZlIHRvIG5leHRLZXksIG9yIGJlZ2luIHRoaXMgaXRlcmF0b3IKKyAgICovCisgIHZpcnR1YWwgYm9vbCBuZXh0S2V5KCkgPSAwOworCisgIC8qKgorICAgKiBHZXQga2V5IG9mIHRoaXMgaW5wdXQgZ3JvdXAKKyAgICovCisgIHZpcnR1YWwgY29uc3QgY2hhciAqIGdldEtleSh1aW50MzJfdCAmIGxlbikgPSAwOworCisgIC8qKgorICAgKiBHZXQgbmV4dCB2YWx1ZSBvZiB0aGlzIGlucHV0IGdyb3VwCisgICAqIEByZXR1cm4gTlVMTCBpZiBubyBtb3JlCisgICAqLworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuZXh0VmFsdWUodWludDMyX3QgJiBsZW4pID0gMDsKK307CisKKworCitlbnVtIEtleVZhbHVlVHlwZSB7CisgIFRleHRUeXBlID0gMCwKKyAgQnl0ZXNUeXBlID0gMSwKKyAgQnl0ZVR5cGUgPSAyLAorICBCb29sVHlwZSA9IDMsCisgIEludFR5cGUgPSA0LAorICBMb25nVHlwZSA9IDUsCisgIEZsb2F0VHlwZSA9IDYsCisgIERvdWJsZVR5cGUgPSA3LAorICBNRDVIYXNoVHlwZSA9IDgsCisgIFZJbnRUeXBlID0gOSwKKyAgVkxvbmdUeXBlID0gMTAsCisgIFVua25vd25UeXBlID0gLTEKK307CisKK3R5cGVkZWYgaW50ICgqQ29tcGFyYXRvclB0cikoY29uc3QgY2hhciAqIHNyYywgdWludDMyX3Qgc3JjTGVuZ3RoLCBjb25zdCBjaGFyICogZGVzdCwKKyAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKTsKKworQ29tcGFyYXRvclB0ciBnZXRfY29tcGFyYXRvcihjb25zdCBLZXlWYWx1ZVR5cGUga2V5VHlwZSwgY29uc3QgY2hhciAqIGNvbXBhcmF0b3JOYW1lKTsKKwordHlwZWRlZiB2b2lkICgqQU5ZX0ZVTkNfUFRSKSgpOworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrOworCisvKioKKyAqIFVzZSB0aGVzZSB0d28gcHJlZGVmaW5lZCBtYWNybyB0byBkZWZpbmUgYSBjbGFzcyBsaWJyYXJ5OgorICogICBERUZJTkVfTkFUSVZFX0xJQlJBUlkoTGlicmFyeSkKKyAqICAgUkVHSVNURVJfQ0xBU1MoVHlwZSwgTGlicmFyeSkKKyAqIEZvciBleGFtcGxlLCBzdXBwb3NlIHdlIGhhdmUgYSBkZW1vIGFwcGxpY2F0aW9uLCB3aGljaCBoYXMKKyAqIGRlZmluZWQgY2xhc3MgTXlEZW1vTWFwcGVyIGFuZCBNeURlbW9SZWR1Y2VyLCB0byByZWdpc3RlcgorICogdGhpcyBtb2R1bGUgJiB0aGVzZSB0d28gY2xhc3NlcywgeW91IG5lZWQgdG8gYWRkIGZvbGxvd2luZworICogY29kZSB0byB5b3Ugc291cmNlIGNvZGUuCisgKiAgIERFRklORV9OQVRJVkVfTElCUkFSWShNeURlbW8pIHsKKyAqICAgICBSRUdJU1RFUl9DTEFTUyhNeURlbW9NYXBwZXIsIE15RGVtbyk7CisgKiAgICAgUkVHSVNURVJfQ0xBU1MoTXlEZW1vUmVkdWNlciwgTXlEZW1vKTsKKyAqICAgfQorICogVGhlIGNsYXNzIG5hbWUgZm9yIE15RGVtb01hcHBlciB3aWxsIGJlIE15RGVtby5NeURlbW9NYXBwZXIsCisgKiBhbmQgc2ltaWxhciBmb3IgTXlEZW1vUmVkdWNlci4KKyAqIFRoZW4geW91IGNhbiBzZXQgbmF0aXZlLm1hcHBlci5jbGFzcyB0byBNeURlbW8uTXlEZW1vTWFwcGVyCisgKiBpbiBKb2JDb25mLgorICovCisKKyNkZWZpbmUgREVGSU5FX05BVElWRV9MSUJSQVJZKExpYnJhcnkpIFwKKyAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBOYXRpdmVUYXNrOjpPYmplY3RDcmVhdG9yRnVuYz4gTGlicmFyeSMjQ2xhc3NNYXBfXzsgXAorICBleHRlcm4gIkMiIHZvaWQgKiBMaWJyYXJ5IyNHZXRGdW5jdGlvbkdldHRlcihjb25zdCBzdGQ6OnN0cmluZyAmIG5hbWUpIHsgXAorICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE5hdGl2ZVRhc2s6Ok9iamVjdENyZWF0b3JGdW5jPjo6aXRlcmF0b3IgaXRyID0gTGlicmFyeSMjQ2xhc3NNYXBfXy5maW5kKG5hbWUpOyBcCisgICAgICBpZiAoaXRyICE9IExpYnJhcnkjI0NsYXNzTWFwX18uZW5kKCkpIHsgXAorICAgICAgICByZXR1cm4gKHZvaWQgKikoaXRyLT5zZWNvbmQpOyBcCisgICAgICB9IFwKKyAgICAgIHJldHVybiBOVUxMOyBcCisgICAgfSBcCisgIGV4dGVybiAiQyIgTmF0aXZlVGFzazo6T2JqZWN0Q3JlYXRvckZ1bmMgTGlicmFyeSMjR2V0T2JqZWN0Q3JlYXRvcihjb25zdCBzdGQ6OnN0cmluZyAmIG5hbWUpIHsgXAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBOYXRpdmVUYXNrOjpPYmplY3RDcmVhdG9yRnVuYz46Oml0ZXJhdG9yIGl0ciA9IExpYnJhcnkjI0NsYXNzTWFwX18uZmluZChuYW1lKTsgXAorICAgIGlmIChpdHIgIT0gTGlicmFyeSMjQ2xhc3NNYXBfXy5lbmQoKSkgeyBcCisgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7IFwKKyAgICB9IFwKKyAgICByZXR1cm4gTlVMTDsgXAorICB9IFwKKyAgZXh0ZXJuICJDIiB2b2lkIExpYnJhcnkjI0luaXQoKQorCisjZGVmaW5lIFJFR0lTVEVSX0NMQVNTKFR5cGUsIExpYnJhcnkpIExpYnJhcnkjI0NsYXNzTWFwX19bI0xpYnJhcnkiLiIjVHlwZV0gPSBOYXRpdmVUYXNrOjpPYmplY3RDcmVhdG9yPFR5cGU+CisKKyNkZWZpbmUgUkVHSVNURVJfRlVOQ1RJT04oVHlwZSwgTGlicmFyeSkgTGlicmFyeSMjQ2xhc3NNYXBfX1sjTGlicmFyeSIuIiNUeXBlXSA9IChPYmplY3RDcmVhdG9yRnVuYylUeXBlCisKKyNlbmRpZiAvKiBOQVRJVkVUQVNLX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2NvZGVjL0Jsb2NrQ29kZWMuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2NvZGVjL0Jsb2NrQ29kZWMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzNjIzOQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvQmxvY2tDb2RlYy5jYwpAQCAtMCwwICsxLDE3OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKyNpbmNsdWRlICJCbG9ja0NvZGVjLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworQmxvY2tDb21wcmVzc1N0cmVhbTo6QmxvY2tDb21wcmVzc1N0cmVhbShPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KQorICAgIDogQ29tcHJlc3NTdHJlYW0oc3RyZWFtKSwgX3RlbXBCdWZmZXIoTlVMTCksIF90ZW1wQnVmZmVyU2l6ZSgwKSwgX2NvbXByZXNzZWRCeXRlc1dyaXR0ZW4oMCkgeworICBfaGludCA9IGJ1ZmZlclNpemVIaW50OworICBfYmxvY2tNYXggPSBidWZmZXJTaXplSGludCAvIDIgKiAzOworfQorCit2b2lkIEJsb2NrQ29tcHJlc3NTdHJlYW06OmluaXQoKSB7CisgIF90ZW1wQnVmZmVyU2l6ZSA9IG1heENvbXByZXNzZWRMZW5ndGgoX2Jsb2NrTWF4KSArIDg7CisgIF90ZW1wQnVmZmVyID0gbmV3IGNoYXJbX3RlbXBCdWZmZXJTaXplXTsKK30KKworQmxvY2tDb21wcmVzc1N0cmVhbTo6fkJsb2NrQ29tcHJlc3NTdHJlYW0oKSB7CisgIGRlbGV0ZVtdIF90ZW1wQnVmZmVyOworICBfdGVtcEJ1ZmZlciA9IE5VTEw7CisgIF90ZW1wQnVmZmVyU2l6ZSA9IDA7Cit9CisKK3ZvaWQgQmxvY2tDb21wcmVzc1N0cmVhbTo6d3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgIHVpbnQzMl90IHRha2UgPSBsZW5ndGggPCBfYmxvY2tNYXggPyBsZW5ndGggOiBfaGludDsKKyAgICBjb21wcmVzc09uZUJsb2NrKGJ1ZmYsIHRha2UpOworICAgIGJ1ZmYgPSAoKGNvbnN0IGNoYXIgKilidWZmKSArIHRha2U7CisgICAgbGVuZ3RoIC09IHRha2U7CisgIH0KK30KKwordm9pZCBCbG9ja0NvbXByZXNzU3RyZWFtOjpmbHVzaCgpIHsKKyAgX3N0cmVhbS0+Zmx1c2goKTsKK30KKwordm9pZCBCbG9ja0NvbXByZXNzU3RyZWFtOjpjbG9zZSgpIHsKKyAgZmx1c2goKTsKK30KKwordm9pZCBCbG9ja0NvbXByZXNzU3RyZWFtOjp3cml0ZURpcmVjdChjb25zdCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgIF9zdHJlYW0tPndyaXRlKGJ1ZmYsIGxlbmd0aCk7CisgIF9jb21wcmVzc2VkQnl0ZXNXcml0dGVuICs9IGxlbmd0aDsKK30KKwordWludDY0X3QgQmxvY2tDb21wcmVzc1N0cmVhbTo6Y29tcHJlc3NlZEJ5dGVzV3JpdHRlbigpIHsKKyAgcmV0dXJuIF9jb21wcmVzc2VkQnl0ZXNXcml0dGVuOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCbG9ja0RlY29tcHJlc3NTdHJlYW06OkJsb2NrRGVjb21wcmVzc1N0cmVhbShJbnB1dFN0cmVhbSAqIHN0cmVhbSwgdWludDMyX3QgYnVmZmVyU2l6ZUhpbnQpCisgICAgOiBEZWNvbXByZXNzU3RyZWFtKHN0cmVhbSksIF90ZW1wQnVmZmVyKE5VTEwpLCBfdGVtcEJ1ZmZlclNpemUoMCkgeworICBfaGludCA9IGJ1ZmZlclNpemVIaW50OworICBfYmxvY2tNYXggPSBidWZmZXJTaXplSGludCAvIDIgKiAzOworICBfdGVtcERlY29tcHJlc3NCdWZmZXIgPSBOVUxMOworICBfdGVtcERlY29tcHJlc3NCdWZmZXJTaXplID0gMDsKKyAgX3RlbXBEZWNvbXByZXNzQnVmZmVyVXNlZCA9IDA7CisgIF90ZW1wRGVjb21wcmVzc0J1ZmZlckNhcGFjaXR5ID0gMDsKKyAgX2NvbXByZXNzZWRCeXRlc1JlYWQgPSAwOworfQorCit2b2lkIEJsb2NrRGVjb21wcmVzc1N0cmVhbTo6aW5pdCgpIHsKKyAgX3RlbXBCdWZmZXJTaXplID0gbWF4Q29tcHJlc3NlZExlbmd0aChfYmxvY2tNYXgpICsgODsKKyAgX3RlbXBCdWZmZXIgPSAoY2hhciopbWFsbG9jKF90ZW1wQnVmZmVyU2l6ZSk7Cit9CisKK0Jsb2NrRGVjb21wcmVzc1N0cmVhbTo6fkJsb2NrRGVjb21wcmVzc1N0cmVhbSgpIHsKKyAgY2xvc2UoKTsKKyAgaWYgKE5VTEwgIT0gX3RlbXBCdWZmZXIpIHsKKyAgICBmcmVlKF90ZW1wQnVmZmVyKTsKKyAgICBfdGVtcEJ1ZmZlciA9IE5VTEw7CisgIH0KKyAgX3RlbXBCdWZmZXJTaXplID0gMDsKK30KKworaW50MzJfdCBCbG9ja0RlY29tcHJlc3NTdHJlYW06OnJlYWQodm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICBpZiAoX3RlbXBEZWNvbXByZXNzQnVmZmVyU2l6ZSA9PSAwKSB7CisgICAgdWludDMyX3Qgc2l6ZXNbMl07CisgICAgaW50MzJfdCByZCA9IF9zdHJlYW0tPnJlYWRGdWxseSgmc2l6ZXMsIHNpemVvZih1aW50MzJfdCkgKiAyKTsKKyAgICBpZiAocmQgPD0gMCkgeworICAgICAgLy8gRU9GCisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZCAhPSBzaXplb2YodWludDMyX3QpICogMikgeworICAgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAicmVhZEZ1bGx5IGdldCBpbmNvbXBsZXRlIGRhdGEiKTsKKyAgICB9CisgICAgX2NvbXByZXNzZWRCeXRlc1JlYWQgKz0gcmQ7CisgICAgc2l6ZXNbMF0gPSBic3dhcChzaXplc1swXSk7CisgICAgc2l6ZXNbMV0gPSBic3dhcChzaXplc1sxXSk7CisgICAgaWYgKHNpemVzWzBdIDw9IGxlbmd0aCkgeworICAgICAgdWludDMyX3QgbGVuID0gZGVjb21wcmVzc09uZUJsb2NrKHNpemVzWzFdLCBidWZmLCBzaXplc1swXSk7CisgICAgICBpZiAobGVuICE9IHNpemVzWzBdKSB7CisgICAgICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIkJsb2NrIGRlY29tcHJlc3MgZGF0YSBlcnJvciwgbGVuZ3RoIG5vdCBtYXRjaCIpOworICAgICAgfQorICAgICAgcmV0dXJuIGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNpemVzWzBdID4gX3RlbXBEZWNvbXByZXNzQnVmZmVyQ2FwYWNpdHkpIHsKKyAgICAgICAgY2hhciAqIG5ld0J1ZmZlciA9IChjaGFyICopcmVhbGxvYyhfdGVtcERlY29tcHJlc3NCdWZmZXIsIHNpemVzWzBdKTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgVEhST1dfRVhDRVBUSU9OKE91dE9mTWVtb3J5RXhjZXB0aW9uLCAicmVhbGxvYyBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgICAgICBfdGVtcERlY29tcHJlc3NCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIF90ZW1wRGVjb21wcmVzc0J1ZmZlckNhcGFjaXR5ID0gc2l6ZXNbMF07CisgICAgICB9CisgICAgICB1aW50MzJfdCBsZW4gPSBkZWNvbXByZXNzT25lQmxvY2soc2l6ZXNbMV0sIF90ZW1wRGVjb21wcmVzc0J1ZmZlciwgc2l6ZXNbMF0pOworICAgICAgaWYgKGxlbiAhPSBzaXplc1swXSkgeworICAgICAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJCbG9jayBkZWNvbXByZXNzIGRhdGEgZXJyb3IsIGxlbmd0aCBub3QgbWF0Y2giKTsKKyAgICAgIH0KKyAgICAgIF90ZW1wRGVjb21wcmVzc0J1ZmZlclNpemUgPSBzaXplc1swXTsKKyAgICAgIF90ZW1wRGVjb21wcmVzc0J1ZmZlclVzZWQgPSAwOworICAgIH0KKyAgfQorICBpZiAoX3RlbXBEZWNvbXByZXNzQnVmZmVyU2l6ZSA+IDApIHsKKyAgICB1aW50MzJfdCBsZWZ0ID0gX3RlbXBEZWNvbXByZXNzQnVmZmVyU2l6ZSAtIF90ZW1wRGVjb21wcmVzc0J1ZmZlclVzZWQ7CisgICAgaWYgKGxlbmd0aCA8IGxlZnQpIHsKKyAgICAgIG1lbWNweShidWZmLCBfdGVtcERlY29tcHJlc3NCdWZmZXIgKyBfdGVtcERlY29tcHJlc3NCdWZmZXJVc2VkLCBsZW5ndGgpOworICAgICAgX3RlbXBEZWNvbXByZXNzQnVmZmVyVXNlZCArPSBsZW5ndGg7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICBtZW1jcHkoYnVmZiwgX3RlbXBEZWNvbXByZXNzQnVmZmVyICsgX3RlbXBEZWNvbXByZXNzQnVmZmVyVXNlZCwgbGVmdCk7CisgICAgICBfdGVtcERlY29tcHJlc3NCdWZmZXJTaXplID0gMDsKKyAgICAgIF90ZW1wRGVjb21wcmVzc0J1ZmZlclVzZWQgPSAwOworICAgICAgcmV0dXJuIGxlZnQ7CisgICAgfQorICB9CisgIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUKKyAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiRGVjb21wcmVzcyBsb2dpYyBlcnJvciIpOworICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgQmxvY2tEZWNvbXByZXNzU3RyZWFtOjpjbG9zZSgpIHsKKyAgaWYgKF90ZW1wRGVjb21wcmVzc0J1ZmZlclNpemUgPiAwKSB7CisgICAgTE9HKCJbQmxvY2tEZWNvbXByZXNzU3RyZWFtXSBTb21lIGRhdGEgbGVmdCBpbiB0aGUgX3RlbXBEZWNvbXByZXNzQnVmZmVyIHdoZW4gY2xvc2UoKSIpOworICB9CisgIGlmIChOVUxMICE9IF90ZW1wRGVjb21wcmVzc0J1ZmZlcikgeworICAgIGZyZWUoX3RlbXBEZWNvbXByZXNzQnVmZmVyKTsKKyAgICBfdGVtcERlY29tcHJlc3NCdWZmZXIgPSBOVUxMOworICAgIF90ZW1wRGVjb21wcmVzc0J1ZmZlckNhcGFjaXR5ID0gMDsKKyAgfQorICBfdGVtcERlY29tcHJlc3NCdWZmZXJTaXplID0gMDsKKyAgX3RlbXBEZWNvbXByZXNzQnVmZmVyVXNlZCA9IDA7Cit9CisKK2ludDMyX3QgQmxvY2tEZWNvbXByZXNzU3RyZWFtOjpyZWFkRGlyZWN0KHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaWYgKF90ZW1wRGVjb21wcmVzc0J1ZmZlclNpemUgPiAwKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAidGVtcCBkZWNvbXByZXNzIGRhdGEgZXhpc3RzIHdoZW4gY2FsbCByZWFkRGlyZWN0KCkiKTsKKyAgfQorICBpbnQzMl90IHJldCA9IF9zdHJlYW0tPnJlYWRGdWxseShidWZmLCBsZW5ndGgpOworICBpZiAocmV0ID4gMCkgeworICAgIF9jb21wcmVzc2VkQnl0ZXNSZWFkICs9IHJldDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCit1aW50NjRfdCBCbG9ja0RlY29tcHJlc3NTdHJlYW06OmNvbXByZXNzZWRCeXRlc1JlYWQoKSB7CisgIHJldHVybiBfY29tcHJlc3NlZEJ5dGVzUmVhZDsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2NvZGVjL0Jsb2NrQ29kZWMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvQmxvY2tDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTQ0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2NvZGVjL0Jsb2NrQ29kZWMuaApAQCAtMCwwICsxLDk4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBCTE9DS0NPREVDX0hfCisjZGVmaW5lIEJMT0NLQ09ERUNfSF8KKworI2luY2x1ZGUgImxpYi9Db21wcmVzc2lvbnMuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBCbG9ja0NvbXByZXNzU3RyZWFtIDogcHVibGljIENvbXByZXNzU3RyZWFtIHsKK3Byb3RlY3RlZDoKKyAgdWludDMyX3QgX2hpbnQ7CisgIHVpbnQzMl90IF9ibG9ja01heDsKKyAgY2hhciAqIF90ZW1wQnVmZmVyOworICB1aW50MzJfdCBfdGVtcEJ1ZmZlclNpemU7CisgIHVpbnQ2NF90IF9jb21wcmVzc2VkQnl0ZXNXcml0dGVuOworcHVibGljOgorICBCbG9ja0NvbXByZXNzU3RyZWFtKE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgdWludDMyX3QgYnVmZmVyU2l6ZUhpbnQpOworCisgIHZpcnR1YWwgfkJsb2NrQ29tcHJlc3NTdHJlYW0oKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlRGlyZWN0KGNvbnN0IHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpOworCisgIHZpcnR1YWwgdWludDY0X3QgY29tcHJlc3NlZEJ5dGVzV3JpdHRlbigpOworCisgIHZvaWQgaW5pdCgpOworCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdWludDY0X3QgbWF4Q29tcHJlc3NlZExlbmd0aCh1aW50NjRfdCBvcmlnTGVuZ3RoKSB7CisgICAgcmV0dXJuIG9yaWdMZW5ndGg7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgY29tcHJlc3NPbmVCbG9jayhjb25zdCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgIH0KK307CisKK2NsYXNzIEJsb2NrRGVjb21wcmVzc1N0cmVhbSA6IHB1YmxpYyBEZWNvbXByZXNzU3RyZWFtIHsKK3Byb3RlY3RlZDoKKyAgdWludDMyX3QgX2hpbnQ7CisgIHVpbnQzMl90IF9ibG9ja01heDsKKyAgY2hhciAqIF90ZW1wQnVmZmVyOworICB1aW50MzJfdCBfdGVtcEJ1ZmZlclNpemU7CisgIGNoYXIgKiBfdGVtcERlY29tcHJlc3NCdWZmZXI7CisgIHVpbnQzMl90IF90ZW1wRGVjb21wcmVzc0J1ZmZlclNpemU7CisgIHVpbnQzMl90IF90ZW1wRGVjb21wcmVzc0J1ZmZlclVzZWQ7CisgIHVpbnQzMl90IF90ZW1wRGVjb21wcmVzc0J1ZmZlckNhcGFjaXR5OworICB1aW50NjRfdCBfY29tcHJlc3NlZEJ5dGVzUmVhZDsKK3B1YmxpYzoKKyAgQmxvY2tEZWNvbXByZXNzU3RyZWFtKElucHV0U3RyZWFtICogc3RyZWFtLCB1aW50MzJfdCBidWZmZXJTaXplSGludCk7CisKKyAgdmlydHVhbCB+QmxvY2tEZWNvbXByZXNzU3RyZWFtKCk7CisKKyAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgdmlydHVhbCBpbnQzMl90IHJlYWREaXJlY3Qodm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdmlydHVhbCB1aW50NjRfdCBjb21wcmVzc2VkQnl0ZXNSZWFkKCk7CisKKyAgdm9pZCBpbml0KCk7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB1aW50NjRfdCBtYXhDb21wcmVzc2VkTGVuZ3RoKHVpbnQ2NF90IG9yaWdMZW5ndGgpIHsKKyAgICByZXR1cm4gb3JpZ0xlbmd0aDsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgZGVjb21wcmVzc09uZUJsb2NrKHVpbnQzMl90IGNvbXByZXNzZWRTaXplLCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgLy9UT0RPOiBhZGQgaW1wbGVtZW50YXRpb24KKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogQkxPQ0tDT0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9HemlwQ29kZWMuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2NvZGVjL0d6aXBDb2RlYy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI5ODUyCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9HemlwQ29kZWMuY2MKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8emNvbmYuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJHemlwQ29kZWMuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitHemlwQ29tcHJlc3NTdHJlYW06Okd6aXBDb21wcmVzc1N0cmVhbShPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KQorICAgIDogQ29tcHJlc3NTdHJlYW0oc3RyZWFtKSwgX2NvbXByZXNzZWRCeXRlc1dyaXR0ZW4oMCksIF96c3RyZWFtKE5VTEwpLCBfZmluaXNoZWQoZmFsc2UpIHsKKyAgX2J1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlclNpemVIaW50XTsKKyAgX2NhcGFjaXR5ID0gYnVmZmVyU2l6ZUhpbnQ7CisgIF96c3RyZWFtID0gbWFsbG9jKHNpemVvZih6X3N0cmVhbSkpOworICB6X3N0cmVhbSAqIHpzdHJlYW0gPSAoel9zdHJlYW0qKV96c3RyZWFtOworICBtZW1zZXQoenN0cmVhbSwgMCwgc2l6ZW9mKHpfc3RyZWFtKSk7CisgIGlmIChaX09LICE9IGRlZmxhdGVJbml0Mih6c3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIFpfREVGTEFURUQsIDMxLCA4LAorICAgICAgWl9ERUZBVUxUX1NUUkFURUdZKSkgeworICAgIGZyZWUoX3pzdHJlYW0pOworICAgIF96c3RyZWFtID0gTlVMTDsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJkZWZsYXRlSW5pdDIgZmFpbGVkIik7CisgIH0KKyAgenN0cmVhbS0+bmV4dF9vdXQgPSAoQnl0ZWYgKilfYnVmZmVyOworICB6c3RyZWFtLT5hdmFpbF9vdXQgPSBfY2FwYWNpdHk7Cit9CisKK0d6aXBDb21wcmVzc1N0cmVhbTo6fkd6aXBDb21wcmVzc1N0cmVhbSgpIHsKKyAgaWYgKF96c3RyZWFtICE9IE5VTEwpIHsKKyAgICBkZWZsYXRlRW5kKCh6X3N0cmVhbSopX3pzdHJlYW0pOworICAgIGZyZWUoX3pzdHJlYW0pOworICAgIF96c3RyZWFtID0gTlVMTDsKKyAgfQorICBkZWxldGVbXSBfYnVmZmVyOworICBfYnVmZmVyID0gTlVMTDsKK30KKwordm9pZCBHemlwQ29tcHJlc3NTdHJlYW06OndyaXRlKGNvbnN0IHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgel9zdHJlYW0gKiB6c3RyZWFtID0gKHpfc3RyZWFtKilfenN0cmVhbTsKKyAgenN0cmVhbS0+bmV4dF9pbiA9IChCeXRlZiopYnVmZjsKKyAgenN0cmVhbS0+YXZhaWxfaW4gPSBsZW5ndGg7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaW50IHJldCA9IGRlZmxhdGUoenN0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgaWYgKHJldCA9PSBaX09LKSB7CisgICAgICBpZiAoenN0cmVhbS0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgX3N0cmVhbS0+d3JpdGUoX2J1ZmZlciwgX2NhcGFjaXR5KTsKKyAgICAgICAgX2NvbXByZXNzZWRCeXRlc1dyaXR0ZW4gKz0gX2NhcGFjaXR5OworICAgICAgICB6c3RyZWFtLT5uZXh0X291dCA9IChCeXRlZiAqKV9idWZmZXI7CisgICAgICAgIHpzdHJlYW0tPmF2YWlsX291dCA9IF9jYXBhY2l0eTsKKyAgICAgIH0KKyAgICAgIGlmICh6c3RyZWFtLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJkZWZsYXRlIHJldHVybiBlcnJvciIpOworICAgIH0KKyAgfQorICBfZmluaXNoZWQgPSBmYWxzZTsKK30KKwordm9pZCBHemlwQ29tcHJlc3NTdHJlYW06OmZsdXNoKCkgeworICB6X3N0cmVhbSAqIHpzdHJlYW0gPSAoel9zdHJlYW0qKV96c3RyZWFtOworICB3aGlsZSAodHJ1ZSkgeworICAgIGludCByZXQgPSBkZWZsYXRlKHpzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAocmV0ID09IFpfT0spIHsKKyAgICAgIGlmICh6c3RyZWFtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICBfc3RyZWFtLT53cml0ZShfYnVmZmVyLCBfY2FwYWNpdHkpOworICAgICAgICBfY29tcHJlc3NlZEJ5dGVzV3JpdHRlbiArPSBfY2FwYWNpdHk7CisgICAgICAgIHpzdHJlYW0tPm5leHRfb3V0ID0gKEJ5dGVmICopX2J1ZmZlcjsKKyAgICAgICAgenN0cmVhbS0+YXZhaWxfb3V0ID0gX2NhcGFjaXR5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiZmx1c2ggc3RhdGUgZXJyb3IiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgIHNpemVfdCB3dCA9IHpzdHJlYW0tPm5leHRfb3V0IC0gKEJ5dGVmKilfYnVmZmVyOworICAgICAgX3N0cmVhbS0+d3JpdGUoX2J1ZmZlciwgd3QpOworICAgICAgX2NvbXByZXNzZWRCeXRlc1dyaXR0ZW4gKz0gd3Q7CisgICAgICB6c3RyZWFtLT5uZXh0X291dCA9IChCeXRlZiAqKV9idWZmZXI7CisgICAgICB6c3RyZWFtLT5hdmFpbF9vdXQgPSBfY2FwYWNpdHk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgX2ZpbmlzaGVkID0gdHJ1ZTsKKyAgX3N0cmVhbS0+Zmx1c2goKTsKK30KKwordm9pZCBHemlwQ29tcHJlc3NTdHJlYW06OnJlc2V0U3RhdGUoKSB7CisgIHpfc3RyZWFtICogenN0cmVhbSA9ICh6X3N0cmVhbSopX3pzdHJlYW07CisgIGRlZmxhdGVSZXNldCh6c3RyZWFtKTsKK30KKwordm9pZCBHemlwQ29tcHJlc3NTdHJlYW06OmNsb3NlKCkgeworICBpZiAoIV9maW5pc2hlZCkgeworICAgIGZsdXNoKCk7CisgIH0KK30KKwordm9pZCBHemlwQ29tcHJlc3NTdHJlYW06OndyaXRlRGlyZWN0KGNvbnN0IHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaWYgKCFfZmluaXNoZWQpIHsKKyAgICBmbHVzaCgpOworICB9CisgIF9zdHJlYW0tPndyaXRlKGJ1ZmYsIGxlbmd0aCk7CisgIF9jb21wcmVzc2VkQnl0ZXNXcml0dGVuICs9IGxlbmd0aDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworR3ppcERlY29tcHJlc3NTdHJlYW06Okd6aXBEZWNvbXByZXNzU3RyZWFtKElucHV0U3RyZWFtICogc3RyZWFtLCB1aW50MzJfdCBidWZmZXJTaXplSGludCkKKyAgICA6IERlY29tcHJlc3NTdHJlYW0oc3RyZWFtKSwgX2NvbXByZXNzZWRCeXRlc1JlYWQoMCksIF96c3RyZWFtKE5VTEwpIHsKKyAgX2J1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlclNpemVIaW50XTsKKyAgX2NhcGFjaXR5ID0gYnVmZmVyU2l6ZUhpbnQ7CisgIF96c3RyZWFtID0gbWFsbG9jKHNpemVvZih6X3N0cmVhbSkpOworICB6X3N0cmVhbSAqIHpzdHJlYW0gPSAoel9zdHJlYW0qKV96c3RyZWFtOworICBtZW1zZXQoenN0cmVhbSwgMCwgc2l6ZW9mKHpfc3RyZWFtKSk7CisgIGlmIChaX09LICE9IGluZmxhdGVJbml0Mih6c3RyZWFtLCAzMSkpIHsKKyAgICBmcmVlKF96c3RyZWFtKTsKKyAgICBfenN0cmVhbSA9IE5VTEw7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiaW5mbGF0ZUluaXQyIGZhaWxlZCIpOworICB9CisgIHpzdHJlYW0tPm5leHRfaW4gPSBOVUxMOworICB6c3RyZWFtLT5hdmFpbF9pbiA9IDA7CisgIF9lb2YgPSBmYWxzZTsKK30KKworR3ppcERlY29tcHJlc3NTdHJlYW06On5HemlwRGVjb21wcmVzc1N0cmVhbSgpIHsKKyAgaWYgKF96c3RyZWFtICE9IE5VTEwpIHsKKyAgICBpbmZsYXRlRW5kKCh6X3N0cmVhbSopX3pzdHJlYW0pOworICAgIGZyZWUoX3pzdHJlYW0pOworICAgIF96c3RyZWFtID0gTlVMTDsKKyAgfQorICBkZWxldGVbXSBfYnVmZmVyOworICBfYnVmZmVyID0gTlVMTDsKK30KKworaW50MzJfdCBHemlwRGVjb21wcmVzc1N0cmVhbTo6cmVhZCh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgIHpfc3RyZWFtICogenN0cmVhbSA9ICh6X3N0cmVhbSopX3pzdHJlYW07CisgIHpzdHJlYW0tPm5leHRfb3V0ID0gKEJ5dGVmKilidWZmOworICB6c3RyZWFtLT5hdmFpbF9vdXQgPSBsZW5ndGg7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKHpzdHJlYW0tPmF2YWlsX2luID09IDApIHsKKyAgICAgIGludDMyX3QgcmQgPSBfc3RyZWFtLT5yZWFkKF9idWZmZXIsIF9jYXBhY2l0eSk7CisgICAgICBpZiAocmQgPD0gMCkgeworICAgICAgICBfZW9mID0gdHJ1ZTsKKyAgICAgICAgc2l6ZV90IHd0ID0genN0cmVhbS0+bmV4dF9vdXQgLSAoQnl0ZWYqKWJ1ZmY7CisgICAgICAgIHJldHVybiB3dCA+IDAgPyB3dCA6IC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX2NvbXByZXNzZWRCeXRlc1JlYWQgKz0gcmQ7CisgICAgICAgIHpzdHJlYW0tPm5leHRfaW4gPSAoQnl0ZWYqKV9idWZmZXI7CisgICAgICAgIHpzdHJlYW0tPmF2YWlsX2luID0gcmQ7CisgICAgICB9CisgICAgfQorICAgIGludCByZXQgPSBpbmZsYXRlKHpzdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIChyZXQgPT0gWl9PSyB8fCByZXQgPT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICBpZiAoenN0cmVhbS0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgR3ppcERlY29tcHJlc3NTdHJlYW06OmNsb3NlKCkgeworfQorCitpbnQzMl90IEd6aXBEZWNvbXByZXNzU3RyZWFtOjpyZWFkRGlyZWN0KHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaW50MzJfdCByZXQgPSBfc3RyZWFtLT5yZWFkRnVsbHkoYnVmZiwgbGVuZ3RoKTsKKyAgaWYgKHJldCA+IDApIHsKKyAgICBfY29tcHJlc3NlZEJ5dGVzUmVhZCArPSByZXQ7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2NvZGVjL0d6aXBDb2RlYy5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9HemlwQ29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY5ODZlCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9HemlwQ29kZWMuaApAQCAtMCwwICsxLDgyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBHWklQQ09ERUNfSF8KKyNkZWZpbmUgR1pJUENPREVDX0hfCisKKyNpbmNsdWRlICJsaWIvQ29tcHJlc3Npb25zLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworY2xhc3MgR3ppcENvbXByZXNzU3RyZWFtIDogcHVibGljIENvbXByZXNzU3RyZWFtIHsKK3Byb3RlY3RlZDoKKyAgdWludDY0X3QgX2NvbXByZXNzZWRCeXRlc1dyaXR0ZW47CisgIGNoYXIgKiBfYnVmZmVyOworICB1aW50MzJfdCBfY2FwYWNpdHk7CisgIHZvaWQgKiBfenN0cmVhbTsKKyAgYm9vbCBfZmluaXNoZWQ7CitwdWJsaWM6CisgIEd6aXBDb21wcmVzc1N0cmVhbShPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KTsKKworICB2aXJ0dWFsIH5HemlwQ29tcHJlc3NTdHJlYW0oKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgdmlydHVhbCB2b2lkIGZpbmlzaCgpIHsKKyAgICBmbHVzaCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHJlc2V0U3RhdGUoKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGVEaXJlY3QoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdmlydHVhbCB1aW50NjRfdCBjb21wcmVzc2VkQnl0ZXNXcml0dGVuKCkgeworICAgIHJldHVybiBfY29tcHJlc3NlZEJ5dGVzV3JpdHRlbjsKKyAgfQorfTsKKworY2xhc3MgR3ppcERlY29tcHJlc3NTdHJlYW0gOiBwdWJsaWMgRGVjb21wcmVzc1N0cmVhbSB7Citwcm90ZWN0ZWQ6CisgIHVpbnQ2NF90IF9jb21wcmVzc2VkQnl0ZXNSZWFkOworICBjaGFyICogX2J1ZmZlcjsKKyAgdWludDMyX3QgX2NhcGFjaXR5OworICB2b2lkICogX3pzdHJlYW07CisgIGJvb2wgX2VvZjsKK3B1YmxpYzoKKyAgR3ppcERlY29tcHJlc3NTdHJlYW0oSW5wdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KTsKKworICB2aXJ0dWFsIH5HemlwRGVjb21wcmVzc1N0cmVhbSgpOworCisgIHZpcnR1YWwgaW50MzJfdCByZWFkKHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpOworCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCisgIHZpcnR1YWwgaW50MzJfdCByZWFkRGlyZWN0KHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpOworCisgIHZpcnR1YWwgdWludDY0X3QgY29tcHJlc3NlZEJ5dGVzUmVhZCgpIHsKKyAgICByZXR1cm4gX2NvbXByZXNzZWRCeXRlc1JlYWQ7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIEdaSVBDT0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9MejRDb2RlYy5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvTHo0Q29kZWMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViZmFkMQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvTHo0Q29kZWMuY2MKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgImx6NC5oIgorI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKyNpbmNsdWRlICJMejRDb2RlYy5oIgorCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworc3RhdGljIGludDMyX3QgTFo0X01heENvbXByZXNzZWRTaXplKGludDMyX3Qgb3JpZykgeworICByZXR1cm4gTFo0X2NvbXByZXNzQm91bmQob3JpZyk7Cit9CisKK0x6NENvbXByZXNzU3RyZWFtOjpMejRDb21wcmVzc1N0cmVhbShPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KQorICAgIDogQmxvY2tDb21wcmVzc1N0cmVhbShzdHJlYW0sIGJ1ZmZlclNpemVIaW50KSB7CisgIGluaXQoKTsKK30KKwordm9pZCBMejRDb21wcmVzc1N0cmVhbTo6Y29tcHJlc3NPbmVCbG9jayhjb25zdCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgIHNpemVfdCBjb21wcmVzc2VkTGVuZ3RoID0gX3RlbXBCdWZmZXJTaXplIC0gODsKKyAgaW50IHJldCA9IExaNF9jb21wcmVzcygoY2hhciopYnVmZiwgX3RlbXBCdWZmZXIgKyA4LCBsZW5ndGgpOworICBpZiAocmV0ID4gMCkgeworICAgIGNvbXByZXNzZWRMZW5ndGggPSByZXQ7CisgICAgKCh1aW50MzJfdCopX3RlbXBCdWZmZXIpWzBdID0gYnN3YXAobGVuZ3RoKTsKKyAgICAoKHVpbnQzMl90KilfdGVtcEJ1ZmZlcilbMV0gPSBic3dhcCgodWludDMyX3QpY29tcHJlc3NlZExlbmd0aCk7CisgICAgX3N0cmVhbS0+d3JpdGUoX3RlbXBCdWZmZXIsIGNvbXByZXNzZWRMZW5ndGggKyA4KTsKKyAgICBfY29tcHJlc3NlZEJ5dGVzV3JpdHRlbiArPSAoY29tcHJlc3NlZExlbmd0aCArIDgpOworICB9IGVsc2UgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImNvbXByZXNzIExaNCBmYWlsZWQiKTsKKyAgfQorfQorCit1aW50NjRfdCBMejRDb21wcmVzc1N0cmVhbTo6bWF4Q29tcHJlc3NlZExlbmd0aCh1aW50NjRfdCBvcmlnTGVuZ3RoKSB7CisgIHJldHVybiBMWjRfTWF4Q29tcHJlc3NlZFNpemUob3JpZ0xlbmd0aCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0x6NERlY29tcHJlc3NTdHJlYW06Okx6NERlY29tcHJlc3NTdHJlYW0oSW5wdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KQorICAgIDogQmxvY2tEZWNvbXByZXNzU3RyZWFtKHN0cmVhbSwgYnVmZmVyU2l6ZUhpbnQpIHsKKyAgaW5pdCgpOworfQorCit1aW50MzJfdCBMejREZWNvbXByZXNzU3RyZWFtOjpkZWNvbXByZXNzT25lQmxvY2sodWludDMyX3QgY29tcHJlc3NlZFNpemUsIHZvaWQgKiBidWZmLAorICAgIHVpbnQzMl90IGxlbmd0aCkgeworICBpZiAoY29tcHJlc3NlZFNpemUgPiBfdGVtcEJ1ZmZlclNpemUpIHsKKyAgICBjaGFyICogbmV3QnVmZmVyID0gKGNoYXIgKilyZWFsbG9jKF90ZW1wQnVmZmVyLCBjb21wcmVzc2VkU2l6ZSk7CisgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICBUSFJPV19FWENFUFRJT04oT3V0T2ZNZW1vcnlFeGNlcHRpb24sICJyZWFsbG9jIGZhaWxlZCIpOworICAgIH0KKyAgICBfdGVtcEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICBfdGVtcEJ1ZmZlclNpemUgPSBjb21wcmVzc2VkU2l6ZTsKKyAgfQorICB1aW50MzJfdCByZCA9IF9zdHJlYW0tPnJlYWRGdWxseShfdGVtcEJ1ZmZlciwgY29tcHJlc3NlZFNpemUpOworICBpZiAocmQgIT0gY29tcHJlc3NlZFNpemUpIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJyZWFkRnVsbHkgcmVhY2ggRU9GIik7CisgIH0KKyAgX2NvbXByZXNzZWRCeXRlc1JlYWQgKz0gcmQ7CisgIHVpbnQzMl90IHJldCA9IExaNF91bmNvbXByZXNzKF90ZW1wQnVmZmVyLCAoY2hhciopYnVmZiwgbGVuZ3RoKTsKKyAgaWYgKHJldCA9PSBjb21wcmVzc2VkU2l6ZSkgeworICAgIHJldHVybiBsZW5ndGg7CisgIH0gZWxzZSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiZGVjb21wcmVzcyBMWjQgZmFpbGVkIik7CisgIH0KK30KKwordWludDY0X3QgTHo0RGVjb21wcmVzc1N0cmVhbTo6bWF4Q29tcHJlc3NlZExlbmd0aCh1aW50NjRfdCBvcmlnTGVuZ3RoKSB7CisgIHJldHVybiBMWjRfTWF4Q29tcHJlc3NlZFNpemUob3JpZ0xlbmd0aCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvTHo0Q29kZWMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvTHo0Q29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RkMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9MejRDb2RlYy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIExaNENPREVDX0hfCisjZGVmaW5lIExaNENPREVDX0hfCisKKyNpbmNsdWRlICJsaWIvQ29tcHJlc3Npb25zLmgiCisjaW5jbHVkZSAiQmxvY2tDb2RlYy5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2NsYXNzIEx6NENvbXByZXNzU3RyZWFtIDogcHVibGljIEJsb2NrQ29tcHJlc3NTdHJlYW0geworcHVibGljOgorICBMejRDb21wcmVzc1N0cmVhbShPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KTsKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB1aW50NjRfdCBtYXhDb21wcmVzc2VkTGVuZ3RoKHVpbnQ2NF90IG9yaWdMZW5ndGgpOworICB2aXJ0dWFsIHZvaWQgY29tcHJlc3NPbmVCbG9jayhjb25zdCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKTsKK307CisKK2NsYXNzIEx6NERlY29tcHJlc3NTdHJlYW0gOiBwdWJsaWMgQmxvY2tEZWNvbXByZXNzU3RyZWFtIHsKK3B1YmxpYzoKKyAgTHo0RGVjb21wcmVzc1N0cmVhbShJbnB1dFN0cmVhbSAqIHN0cmVhbSwgdWludDMyX3QgYnVmZmVyU2l6ZUhpbnQpOworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHVpbnQ2NF90IG1heENvbXByZXNzZWRMZW5ndGgodWludDY0X3Qgb3JpZ0xlbmd0aCk7CisgIHZpcnR1YWwgdWludDMyX3QgZGVjb21wcmVzc09uZUJsb2NrKHVpbnQzMl90IGNvbXByZXNzZWRTaXplLCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIExaNENPREVDX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2NvZGVjL1NuYXBweUNvZGVjLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9TbmFwcHlDb2RlYy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQxN2UwCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9jb2RlYy9TbmFwcHlDb2RlYy5jYwpAQCAtMCwwICsxLDk4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgZGVmaW5lZCBIQURPT1BfU05BUFBZX0xJQlJBUlkKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKyNpbmNsdWRlICJTbmFwcHlDb2RlYy5oIgorCisjaW5jbHVkZSA8c25hcHB5LWMuaD4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitTbmFwcHlDb21wcmVzc1N0cmVhbTo6U25hcHB5Q29tcHJlc3NTdHJlYW0oT3V0cHV0U3RyZWFtICogc3RyZWFtLCB1aW50MzJfdCBidWZmZXJTaXplSGludCkKKyAgICA6IEJsb2NrQ29tcHJlc3NTdHJlYW0oc3RyZWFtLCBidWZmZXJTaXplSGludCkgeworICBpbml0KCk7Cit9CisKK3ZvaWQgU25hcHB5Q29tcHJlc3NTdHJlYW06OmNvbXByZXNzT25lQmxvY2soY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICBzaXplX3QgY29tcHJlc3NlZExlbmd0aCA9IF90ZW1wQnVmZmVyU2l6ZSAtIDg7CisgIHNuYXBweV9zdGF0dXMgcmV0ID0gc25hcHB5X2NvbXByZXNzKChjb25zdCBjaGFyKilidWZmLCBsZW5ndGgsIF90ZW1wQnVmZmVyICsgOCwKKyAgICAgICZjb21wcmVzc2VkTGVuZ3RoKTsKKyAgaWYgKHJldCA9PSBTTkFQUFlfT0spIHsKKyAgICAoKHVpbnQzMl90KilfdGVtcEJ1ZmZlcilbMF0gPSBic3dhcChsZW5ndGgpOworICAgICgodWludDMyX3QqKV90ZW1wQnVmZmVyKVsxXSA9IGJzd2FwKCh1aW50MzJfdCljb21wcmVzc2VkTGVuZ3RoKTsKKyAgICBfc3RyZWFtLT53cml0ZShfdGVtcEJ1ZmZlciwgY29tcHJlc3NlZExlbmd0aCArIDgpOworICAgIF9jb21wcmVzc2VkQnl0ZXNXcml0dGVuICs9IChjb21wcmVzc2VkTGVuZ3RoICsgOCk7CisgIH0gZWxzZSBpZiAocmV0ID09IFNOQVBQWV9JTlZBTElEX0lOUFVUKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiY29tcHJlc3MgU05BUFBZX0lOVkFMSURfSU5QVVQiKTsKKyAgfSBlbHNlIGlmIChyZXQgPT0gU05BUFBZX0JVRkZFUl9UT09fU01BTEwpIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJjb21wcmVzcyBTTkFQUFlfQlVGRkVSX1RPT19TTUFMTCIpOworICB9IGVsc2UgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImNvbXByZXNzIHNuYXBweSBmYWlsZWQiKTsKKyAgfQorfQorCit1aW50NjRfdCBTbmFwcHlDb21wcmVzc1N0cmVhbTo6bWF4Q29tcHJlc3NlZExlbmd0aCh1aW50NjRfdCBvcmlnTGVuZ3RoKSB7CisgIHJldHVybiBzbmFwcHlfbWF4X2NvbXByZXNzZWRfbGVuZ3RoKG9yaWdMZW5ndGgpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTbmFwcHlEZWNvbXByZXNzU3RyZWFtOjpTbmFwcHlEZWNvbXByZXNzU3RyZWFtKElucHV0U3RyZWFtICogc3RyZWFtLCB1aW50MzJfdCBidWZmZXJTaXplSGludCkKKyAgICA6IEJsb2NrRGVjb21wcmVzc1N0cmVhbShzdHJlYW0sIGJ1ZmZlclNpemVIaW50KSB7CisgIGluaXQoKTsKK30KKwordWludDMyX3QgU25hcHB5RGVjb21wcmVzc1N0cmVhbTo6ZGVjb21wcmVzc09uZUJsb2NrKHVpbnQzMl90IGNvbXByZXNzZWRTaXplLCB2b2lkICogYnVmZiwKKyAgICB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaWYgKGNvbXByZXNzZWRTaXplID4gX3RlbXBCdWZmZXJTaXplKSB7CisgICAgY2hhciAqIG5ld0J1ZmZlciA9IChjaGFyICopcmVhbGxvYyhfdGVtcEJ1ZmZlciwgY29tcHJlc3NlZFNpemUpOworICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkgeworICAgICAgVEhST1dfRVhDRVBUSU9OKE91dE9mTWVtb3J5RXhjZXB0aW9uLCAicmVhbGxvYyBmYWlsZWQiKTsKKyAgICB9CisgICAgX3RlbXBCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgX3RlbXBCdWZmZXJTaXplID0gY29tcHJlc3NlZFNpemU7CisgIH0KKyAgdWludDMyX3QgcmQgPSBfc3RyZWFtLT5yZWFkRnVsbHkoX3RlbXBCdWZmZXIsIGNvbXByZXNzZWRTaXplKTsKKyAgaWYgKHJkICE9IGNvbXByZXNzZWRTaXplKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAicmVhZEZ1bGx5IHJlYWNoIEVPRiIpOworICB9CisgIF9jb21wcmVzc2VkQnl0ZXNSZWFkICs9IHJkOworICBzaXplX3QgdW5jb21wcmVzc2VkTGVuZ3RoID0gbGVuZ3RoOworICBzbmFwcHlfc3RhdHVzIHJldCA9IHNuYXBweV91bmNvbXByZXNzKF90ZW1wQnVmZmVyLCBjb21wcmVzc2VkU2l6ZSwgKGNoYXIgKilidWZmLAorICAgICAgJnVuY29tcHJlc3NlZExlbmd0aCk7CisgIGlmIChyZXQgPT0gU05BUFBZX09LKSB7CisgICAgcmV0dXJuIHVuY29tcHJlc3NlZExlbmd0aDsKKyAgfSBlbHNlIGlmIChyZXQgPT0gU05BUFBZX0lOVkFMSURfSU5QVVQpIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJkZWNvbXByZXNzIFNOQVBQWV9JTlZBTElEX0lOUFVUIik7CisgIH0gZWxzZSBpZiAocmV0ID09IFNOQVBQWV9CVUZGRVJfVE9PX1NNQUxMKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiZGVjb21wcmVzcyBTTkFQUFlfQlVGRkVSX1RPT19TTUFMTCIpOworICB9IGVsc2UgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImRlY29tcHJlc3Mgc25hcHB5IGZhaWxlZCIpOworICB9Cit9CisKK3VpbnQ2NF90IFNuYXBweURlY29tcHJlc3NTdHJlYW06Om1heENvbXByZXNzZWRMZW5ndGgodWludDY0X3Qgb3JpZ0xlbmd0aCkgeworICByZXR1cm4gc25hcHB5X21heF9jb21wcmVzc2VkX2xlbmd0aChvcmlnTGVuZ3RoKTsKK30KK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8vIGRlZmluZSBIQURPT1BfU05BUFBZX0xJQlJBUlkKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvU25hcHB5Q29kZWMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvU25hcHB5Q29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjczY2YzNAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvY29kZWMvU25hcHB5Q29kZWMuaApAQCAtMCwwICsxLDQ2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTTkFQUFlDT0RFQ19IXworI2RlZmluZSBTTkFQUFlDT0RFQ19IXworCisjaW5jbHVkZSAibGliL0NvbXByZXNzaW9ucy5oIgorI2luY2x1ZGUgIkJsb2NrQ29kZWMuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBTbmFwcHlDb21wcmVzc1N0cmVhbSA6IHB1YmxpYyBCbG9ja0NvbXByZXNzU3RyZWFtIHsKK3B1YmxpYzoKKyAgU25hcHB5Q29tcHJlc3NTdHJlYW0oT3V0cHV0U3RyZWFtICogc3RyZWFtLCB1aW50MzJfdCBidWZmZXJTaXplSGludCk7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdWludDY0X3QgbWF4Q29tcHJlc3NlZExlbmd0aCh1aW50NjRfdCBvcmlnTGVuZ3RoKTsKKyAgdmlydHVhbCB2b2lkIGNvbXByZXNzT25lQmxvY2soY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7Cit9OworCitjbGFzcyBTbmFwcHlEZWNvbXByZXNzU3RyZWFtIDogcHVibGljIEJsb2NrRGVjb21wcmVzc1N0cmVhbSB7CitwdWJsaWM6CisgIFNuYXBweURlY29tcHJlc3NTdHJlYW0oSW5wdXRTdHJlYW0gKiBzdHJlYW0sIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KTsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHVpbnQ2NF90IG1heENvbXByZXNzZWRMZW5ndGgodWludDY0X3Qgb3JpZ0xlbmd0aCk7CisgIHZpcnR1YWwgdWludDMyX3QgZGVjb21wcmVzc09uZUJsb2NrKHVpbnQzMl90IGNvbXByZXNzZWRTaXplLCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIFNOQVBQWUNPREVDX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQWJzdHJhY3RNYXBIYW5kbGVyLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9oYW5kbGVyL0Fic3RyYWN0TWFwSGFuZGxlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2UwZDQyCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9oYW5kbGVyL0Fic3RyYWN0TWFwSGFuZGxlci5jYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJNQ29sbGVjdG9yT3V0cHV0SGFuZGxlci5oIgorI2luY2x1ZGUgImxpYi9OYXRpdmVPYmplY3RGYWN0b3J5LmgiCisjaW5jbHVkZSAibGliL01hcE91dHB1dENvbGxlY3Rvci5oIgorI2luY2x1ZGUgIkNvbWJpbmVIYW5kbGVyLmgiCisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKK2NvbnN0IENvbW1hbmQgQWJzdHJhY3RNYXBIYW5kbGVyOjpHRVRfT1VUUFVUX1BBVEgoMTAwLCAiR0VUX09VVFBVVF9QQVRIIik7Citjb25zdCBDb21tYW5kIEFic3RyYWN0TWFwSGFuZGxlcjo6R0VUX09VVFBVVF9JTkRFWF9QQVRIKDEwMSwgIkdFVF9PVVRQVVRfSU5ERVhfUEFUSCIpOworY29uc3QgQ29tbWFuZCBBYnN0cmFjdE1hcEhhbmRsZXI6OkdFVF9TUElMTF9QQVRIKDEwMiwgIkdFVF9TUElMTF9QQVRIIik7Citjb25zdCBDb21tYW5kIEFic3RyYWN0TWFwSGFuZGxlcjo6R0VUX0NPTUJJTkVfSEFORExFUigxMDMsICJHRVRfQ09NQklORV9IQU5ETEVSIik7Cit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQWJzdHJhY3RNYXBIYW5kbGVyLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQWJzdHJhY3RNYXBIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2Y2VhMgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9BYnN0cmFjdE1hcEhhbmRsZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQlNUUkFDVF9NQVBfSEFORExFUl9ICisjZGVmaW5lIEFCU1RSQUNUX01BUF9IQU5ETEVSX0gKKworI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKyNpbmNsdWRlICJCYXRjaEhhbmRsZXIuaCIKKyNpbmNsdWRlICJsaWIvU3BpbGxPdXRwdXRTZXJ2aWNlLmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisjaW5jbHVkZSAiQ29tYmluZUhhbmRsZXIuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBBYnN0cmFjdE1hcEhhbmRsZXIgOiBwdWJsaWMgQmF0Y2hIYW5kbGVyLCAgcHVibGljIFNwaWxsT3V0cHV0U2VydmljZSB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBDb21tYW5kIEdFVF9PVVRQVVRfUEFUSDsKKyAgc3RhdGljIGNvbnN0IENvbW1hbmQgR0VUX09VVFBVVF9JTkRFWF9QQVRIOworICBzdGF0aWMgY29uc3QgQ29tbWFuZCBHRVRfU1BJTExfUEFUSDsKKyAgc3RhdGljIGNvbnN0IENvbW1hbmQgR0VUX0NPTUJJTkVfSEFORExFUjsKKworcHVibGljOgorICBBYnN0cmFjdE1hcEhhbmRsZXIoKSB7fQorCisgIHZpcnR1YWwgfkFic3RyYWN0TWFwSGFuZGxlcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZShDb25maWcgKiBjb25maWcpIHsKKyAgICBfY29uZmlnID0gY29uZmlnOworICB9CisKKyAgdmlydHVhbCBzdHJpbmcgKiBnZXRPdXRwdXRQYXRoKCkgeworICAgIFJlc3VsdEJ1ZmZlciAqIG91dHB1dFBhdGhSZXN1bHQgPSBjYWxsKEdFVF9PVVRQVVRfUEFUSCwgTlVMTCk7CisgICAgaWYgKE5VTEwgPT0gb3V0cHV0UGF0aFJlc3VsdCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmluZyAqIG91dHB1dFBhdGggPSBvdXRwdXRQYXRoUmVzdWx0LT5yZWFkU3RyaW5nKCk7CisKKyAgICBkZWxldGUgb3V0cHV0UGF0aFJlc3VsdDsKKyAgICByZXR1cm4gb3V0cHV0UGF0aDsKKyAgfQorCisgIHZpcnR1YWwgc3RyaW5nICogZ2V0T3V0cHV0SW5kZXhQYXRoKCkgeworCisgICAgUmVzdWx0QnVmZmVyICogb3V0cHV0SW5kZXhQYXRoID0gY2FsbChHRVRfT1VUUFVUX0lOREVYX1BBVEgsIE5VTEwpOworICAgIGlmIChOVUxMID09IG91dHB1dEluZGV4UGF0aCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmluZyAqIGluZGV4cGF0aCA9IG91dHB1dEluZGV4UGF0aC0+cmVhZFN0cmluZygpOworICAgIGRlbGV0ZSBvdXRwdXRJbmRleFBhdGg7CisgICAgcmV0dXJuIGluZGV4cGF0aDsKKyAgfQorCisKKyAgdmlydHVhbCBzdHJpbmcgKiBnZXRTcGlsbFBhdGgoKSB7CisgICAgUmVzdWx0QnVmZmVyICogc3BpbGxQYXRoQnVmZmVyID0gY2FsbChHRVRfU1BJTExfUEFUSCwgTlVMTCk7CisgICAgaWYgKE5VTEwgPT0gc3BpbGxQYXRoQnVmZmVyKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyaW5nICogc3BpbGxwYXRoID0gc3BpbGxQYXRoQnVmZmVyLT5yZWFkU3RyaW5nKCk7CisgICAgZGVsZXRlIHNwaWxsUGF0aEJ1ZmZlcjsKKyAgICByZXR1cm4gc3BpbGxwYXRoOworICB9CisKKyAgdmlydHVhbCBDb21iaW5lSGFuZGxlciAqIGdldEphdmFDb21iaW5lSGFuZGxlcigpIHsKKworICAgIExPRygiW01hcE91dHB1dENvbGxlY3Rvcjo6Y29uZmlndXJlXSBqYXZhIGNvbWJpbmVyIGlzIGNvbmZpZ3VyZWQiKTsKKworICAgIFJlc3VsdEJ1ZmZlciAqIGdldENvbWJpbmVIYW5kbGVyUmVzdWx0ID0gY2FsbChHRVRfQ09NQklORV9IQU5ETEVSLCBOVUxMKTsKKyAgICBpZiAoTlVMTCAhPSBnZXRDb21iaW5lSGFuZGxlclJlc3VsdCkgeworCisgICAgICBnZXRDb21iaW5lSGFuZGxlclJlc3VsdC0+c2V0UmVhZFBvaW50KDApOworCisgICAgICBDb21iaW5lSGFuZGxlciAqIGphdmFDb21iaW5lciA9IChDb21iaW5lSGFuZGxlciAqKSgoQmF0Y2hIYW5kbGVyICogKShnZXRDb21iaW5lSGFuZGxlclJlc3VsdC0+cmVhZFBvaW50ZXIoKSkpOworICAgICAgZGVsZXRlIGdldENvbWJpbmVIYW5kbGVyUmVzdWx0OworICAgICAgcmV0dXJuIGphdmFDb21iaW5lcjsKKyAgICB9CisKKworCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworfTsKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogTU1BUFBFUkhBTkRMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9CYXRjaEhhbmRsZXIuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQmF0Y2hIYW5kbGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjIxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQmF0Y2hIYW5kbGVyLmNjCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFFVSUNLX0JVSUxECisjaW5jbHVkZSAib3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlQmF0Y2hQcm9jZXNzb3IuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAiam5pX21kLmgiCisjaW5jbHVkZSAibGliL2puaXV0aWxzLmgiCisjaW5jbHVkZSAiQmF0Y2hIYW5kbGVyLmgiCisjaW5jbHVkZSAibGliL05hdGl2ZU9iamVjdEZhY3RvcnkuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOYXRpdmVCYXRjaFByb2Nlc3NvciBqbmkgdXRpbCBtZXRob2RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGpmaWVsZElEIElucHV0QnVmZmVyRmllbGRJRCA9IE5VTEw7CitzdGF0aWMgamZpZWxkSUQgT3V0cHV0QnVmZmVyRmllbGRJRCA9IE5VTEw7CitzdGF0aWMgam1ldGhvZElEIEZsdXNoT3V0cHV0TWV0aG9kSUQgPSBOVUxMOworc3RhdGljIGptZXRob2RJRCBGaW5pc2hPdXRwdXRNZXRob2RJRCA9IE5VTEw7CitzdGF0aWMgam1ldGhvZElEIFNlbmRDb21tYW5kVG9KYXZhTWV0aG9kSUQgPSBOVUxMOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhdGNoSGFuZGxlciBtZXRob2RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitSZWFkV3JpdGVCdWZmZXIgKiBKTlVfQnl0ZUFycmF5dG9SZWFkV3JpdGVCdWZmZXIoSk5JRW52ICogamVudiwgamJ5dGVBcnJheSBzcmMpIHsKKyAgaWYgKE5VTEwgPT0gc3JjKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAganNpemUgbGVuID0gamVudi0+R2V0QXJyYXlMZW5ndGgoc3JjKTsKKworICBSZWFkV3JpdGVCdWZmZXIgKiByZXQgPSBuZXcgUmVhZFdyaXRlQnVmZmVyKGxlbik7CisgIGplbnYtPkdldEJ5dGVBcnJheVJlZ2lvbihzcmMsIDAsIGxlbiwgKGpieXRlKilyZXQtPmdldEJ1ZmYoKSk7CisgIHJldC0+c2V0V3JpdGVQb2ludChsZW4pOworICByZXR1cm4gcmV0OworfQorCitqYnl0ZUFycmF5IEpOVV9SZWFkV3JpdGVCdWZmZXJUb0J5dGVBcnJheShKTklFbnYgKiBqZW52LCBSZWFkV3JpdGVCdWZmZXIgKiByZXN1bHQpIHsKKyAgaWYgKE5VTEwgPT0gcmVzdWx0IHx8IHJlc3VsdC0+Z2V0V3JpdGVQb2ludCgpID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGpieXRlQXJyYXkgcmV0ID0gamVudi0+TmV3Qnl0ZUFycmF5KHJlc3VsdC0+Z2V0V3JpdGVQb2ludCgpKTsKKyAgamVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKHJldCwgMCwgcmVzdWx0LT5nZXRXcml0ZVBvaW50KCksIChqYnl0ZSopcmVzdWx0LT5nZXRCdWZmKCkpOworICByZXR1cm4gcmV0OworfQorCitCYXRjaEhhbmRsZXI6OkJhdGNoSGFuZGxlcigpCisgICAgOiBfcHJvY2Vzc29yKE5VTEwpLCBfY29uZmlnKE5VTEwpIHsKK30KKworQmF0Y2hIYW5kbGVyOjp+QmF0Y2hIYW5kbGVyKCkgeworICByZWxlYXNlUHJvY2Vzc29yKCk7CisgIGlmIChOVUxMICE9IF9jb25maWcpIHsKKyAgICBkZWxldGUgX2NvbmZpZzsKKyAgICBfY29uZmlnID0gTlVMTDsKKyAgfQorfQorCit2b2lkIEJhdGNoSGFuZGxlcjo6cmVsZWFzZVByb2Nlc3NvcigpIHsKKyAgaWYgKF9wcm9jZXNzb3IgIT0gTlVMTCkgeworICAgIEpOSUVudiAqIGVudiA9IEpOVV9HZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZigoam9iamVjdClfcHJvY2Vzc29yKTsKKyAgICBfcHJvY2Vzc29yID0gTlVMTDsKKyAgfQorfQorCit2b2lkIEJhdGNoSGFuZGxlcjo6b25JbnB1dERhdGEodWludDMyX3QgbGVuZ3RoKSB7CisgIF9pbi5yZXdpbmQoMCwgbGVuZ3RoKTsKKyAgaGFuZGxlSW5wdXQoX2luKTsKK30KKwordm9pZCBCYXRjaEhhbmRsZXI6OmZsdXNoT3V0cHV0KCkgeworCisgIGlmIChOVUxMID09IF9vdXQuYmFzZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdWludDMyX3QgbGVuZ3RoID0gX291dC5wb3NpdGlvbigpOworICBfb3V0LnBvc2l0aW9uKDApOworCisgIGlmIChsZW5ndGggPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIEpOSUVudiAqIGVudiA9IEpOVV9HZXRKTklFbnYoKTsKKyAgZW52LT5DYWxsVm9pZE1ldGhvZCgoam9iamVjdClfcHJvY2Vzc29yLCBGbHVzaE91dHB1dE1ldGhvZElELCAoamludClsZW5ndGgpOworICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKEphdmFFeGNlcHRpb24sICJGbHVzaE91dHB1dCB0aHJvdyBleGNlcHRpb24iKTsKKyAgfQorfQorCit2b2lkIEJhdGNoSGFuZGxlcjo6ZmluaXNoT3V0cHV0KCkgeworICBpZiAoTlVMTCA9PSBfb3V0LmJhc2UoKSkgeworICAgIHJldHVybjsKKyAgfQorICBKTklFbnYgKiBlbnYgPSBKTlVfR2V0Sk5JRW52KCk7CisgIGVudi0+Q2FsbFZvaWRNZXRob2QoKGpvYmplY3QpX3Byb2Nlc3NvciwgRmluaXNoT3V0cHV0TWV0aG9kSUQpOworICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKEphdmFFeGNlcHRpb24sICJGaW5pc2hPdXRwdXQgdGhyb3cgZXhjZXB0aW9uIik7CisgIH0KK30KKwordm9pZCBCYXRjaEhhbmRsZXI6Om9uU2V0dXAoQ29uZmlnICogY29uZmlnLCBjaGFyICogaW5wdXRCdWZmZXIsIHVpbnQzMl90IGlucHV0QnVmZmVyQ2FwYWNpdHksCisgICAgY2hhciAqIG91dHB1dEJ1ZmZlciwgdWludDMyX3Qgb3V0cHV0QnVmZmVyQ2FwYWNpdHkpIHsKKyAgdGhpcy0+X2NvbmZpZyA9IGNvbmZpZzsKKyAgX2luLnJlc2V0KGlucHV0QnVmZmVyLCBpbnB1dEJ1ZmZlckNhcGFjaXR5KTsKKyAgaWYgKE5VTEwgIT0gb3V0cHV0QnVmZmVyKSB7CisgICAgaWYgKG91dHB1dEJ1ZmZlckNhcGFjaXR5IDw9IDEwMjQpIHsKKyAgICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIk91dHB1dCBidWZmZXIgc2l6ZSB0b28gc21hbGwgZm9yIEJhdGNoSGFuZGxlciIpOworICAgIH0KKyAgICBfb3V0LnJlc2V0KG91dHB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyQ2FwYWNpdHkpOworICAgIF9vdXQucmV3aW5kKDAsIG91dHB1dEJ1ZmZlckNhcGFjaXR5KTsKKworICAgIExPRygiW0JhdGNoSGFuZGxlcjo6b25TZXR1cF0gaW5wdXQgQ2FwYWNpdHkgJWQsIG91dHB1dCBjYXBhY2l0eSAlZCIsCisgICAgICAgIGlucHV0QnVmZmVyQ2FwYWNpdHksIF9vdXQubGltaXQoKSk7CisgIH0KKyAgY29uZmlndXJlKF9jb25maWcpOworfQorCitSZXN1bHRCdWZmZXIgKiBCYXRjaEhhbmRsZXI6OmNhbGwoY29uc3QgQ29tbWFuZCYgY21kLCBQYXJhbWV0ZXJCdWZmZXIgKiBwYXJhbSkgeworICBKTklFbnYgKiBlbnYgPSBKTlVfR2V0Sk5JRW52KCk7CisgIGpieXRlQXJyYXkgamNtZERhdGEgPSBKTlVfUmVhZFdyaXRlQnVmZmVyVG9CeXRlQXJyYXkoZW52LCBwYXJhbSk7CisgIGpieXRlQXJyYXkgcmV0ID0gKGpieXRlQXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKChqb2JqZWN0KV9wcm9jZXNzb3IsIFNlbmRDb21tYW5kVG9KYXZhTWV0aG9kSUQsCisgICAgICBjbWQuaWQoKSwgamNtZERhdGEpOworCisKKyAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgIFRIUk9XX0VYQ0VQVElPTihKYXZhRXhjZXB0aW9uLCAiU2VuZENvbW1hbmRUb0phdmEgdGhyb3cgZXhjZXB0aW9uIik7CisgIH0KKyAgcmV0dXJuIEpOVV9CeXRlQXJyYXl0b1JlYWRXcml0ZUJ1ZmZlcihlbnYsIHJldCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOYXRpdmVCYXRjaFByb2Nlc3NvciBqbmkgbWV0aG9kcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit1c2luZyBuYW1lc3BhY2UgTmF0aXZlVGFzazsKKworLyoKKyAqIENsYXNzOiAgICAgb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlQmF0Y2hQcm9jZXNzb3IKKyAqIE1ldGhvZDogICAgc2V0dXBIYW5kbGVyCisgKiBTaWduYXR1cmU6IChKKVYKKyAqLwordm9pZCBKTklDQUxMIEphdmFfb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlQmF0Y2hQcm9jZXNzb3Jfc2V0dXBIYW5kbGVyKAorICAgIEpOSUVudiAqIGplbnYsIGpvYmplY3QgcHJvY2Vzc29yLCBqbG9uZyBoYW5kbGVyLCBqb2JqZWN0QXJyYXkgY29uZmlncykgeworICB0cnkgeworCisgICAgTmF0aXZlVGFzazo6Q29uZmlnICogY29uZmlnID0gbmV3IE5hdGl2ZVRhc2s6OkNvbmZpZygpOworICAgIGpzaXplIGxlbiA9IGplbnYtPkdldEFycmF5TGVuZ3RoKGNvbmZpZ3MpOworICAgIGZvciAoanNpemUgaSA9IDA7IGkgKyAxIDwgbGVuOyBpICs9IDIpIHsKKyAgICAgIGpieXRlQXJyYXkga2V5X29iaiA9IChqYnl0ZUFycmF5KWplbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChjb25maWdzLCBpKTsKKyAgICAgIGpieXRlQXJyYXkgdmFsX29iaiA9IChqYnl0ZUFycmF5KWplbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChjb25maWdzLCBpICsgMSk7CisgICAgICBjb25maWctPnNldChKTlVfQnl0ZUFycmF5VG9TdHJpbmcoamVudiwga2V5X29iaiksIEpOVV9CeXRlQXJyYXlUb1N0cmluZyhqZW52LCB2YWxfb2JqKSk7CisgICAgfQorCisgICAgTmF0aXZlVGFzazo6QmF0Y2hIYW5kbGVyICogYmF0Y2hIYW5kbGVyID0gKE5hdGl2ZVRhc2s6OkJhdGNoSGFuZGxlciAqKSgodm9pZCopaGFuZGxlcik7CisgICAgaWYgKE5VTEwgPT0gYmF0Y2hIYW5kbGVyKSB7CisgICAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCAiQmF0Y2hIYW5kbGVyIGlzIG51bGwiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgam9iamVjdCBqaW5wdXRCdWZmZXIgPSBqZW52LT5HZXRPYmplY3RGaWVsZChwcm9jZXNzb3IsIElucHV0QnVmZmVyRmllbGRJRCk7CisgICAgY2hhciAqIGlucHV0QnVmZmVyQWRkciA9IE5VTEw7CisgICAgdWludDMyX3QgaW5wdXRCdWZmZXJDYXBhY2l0eSA9IDA7CisgICAgaWYgKE5VTEwgIT0gamlucHV0QnVmZmVyKSB7CisgICAgICBpbnB1dEJ1ZmZlckFkZHIgPSAoY2hhciopKGplbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoamlucHV0QnVmZmVyKSk7CisgICAgICBpbnB1dEJ1ZmZlckNhcGFjaXR5ID0gamVudi0+R2V0RGlyZWN0QnVmZmVyQ2FwYWNpdHkoamlucHV0QnVmZmVyKTsKKyAgICB9CisgICAgam9iamVjdCBqb3V0cHV0QnVmZmVyID0gamVudi0+R2V0T2JqZWN0RmllbGQocHJvY2Vzc29yLCBPdXRwdXRCdWZmZXJGaWVsZElEKTsKKyAgICBjaGFyICogb3V0cHV0QnVmZmVyQWRkciA9IE5VTEw7CisgICAgdWludDMyX3Qgb3V0cHV0QnVmZmVyQ2FwYWNpdHkgPSAwOworICAgIGlmIChOVUxMICE9IGpvdXRwdXRCdWZmZXIpIHsKKyAgICAgIG91dHB1dEJ1ZmZlckFkZHIgPSAoY2hhciopKGplbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3Moam91dHB1dEJ1ZmZlcikpOworICAgICAgb3V0cHV0QnVmZmVyQ2FwYWNpdHkgPSBqZW52LT5HZXREaXJlY3RCdWZmZXJDYXBhY2l0eShqb3V0cHV0QnVmZmVyKTsKKyAgICB9CisgICAgYmF0Y2hIYW5kbGVyLT5zZXRQcm9jZXNzb3IoamVudi0+TmV3R2xvYmFsUmVmKHByb2Nlc3NvcikpOworICAgIGJhdGNoSGFuZGxlci0+b25TZXR1cChjb25maWcsIGlucHV0QnVmZmVyQWRkciwgaW5wdXRCdWZmZXJDYXBhY2l0eSwgb3V0cHV0QnVmZmVyQWRkciwKKyAgICAgICAgb3V0cHV0QnVmZmVyQ2FwYWNpdHkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpVbnN1cHBvcnRFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6Ok91dE9mTWVtb3J5RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OklPRXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6SmF2YUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBMT0coIkphdmFFeGNlcHRpb246ICVzIiwgZS53aGF0KCkpOworICAgIC8vIERvIG5vdGhpbmcsIGxldCBqYXZhIHNpZGUgaGFuZGxlCisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgIlVua25vd24gZXhjZXB0aW9uIik7CisgIH0KK30KKworLyoKKyAqIENsYXNzOiAgICAgb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlQmF0Y2hQcm9jZXNzb3IKKyAqIE1ldGhvZDogICAgbmF0aXZlUHJvY2Vzc0lucHV0CisgKiBTaWduYXR1cmU6IChKSSlWCisgKi8KK3ZvaWQgSk5JQ0FMTCBKYXZhX29yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZUJhdGNoUHJvY2Vzc29yX25hdGl2ZVByb2Nlc3NJbnB1dCgKKyAgICBKTklFbnYgKiBqZW52LCBqb2JqZWN0IHByb2Nlc3NvciwgamxvbmcgaGFuZGxlciwgamludCBsZW5ndGgpIHsKKworICB0cnkgeworICAgIE5hdGl2ZVRhc2s6OkJhdGNoSGFuZGxlciAqIGJhdGNoSGFuZGxlciA9IChOYXRpdmVUYXNrOjpCYXRjaEhhbmRsZXIgKikoKHZvaWQqKWhhbmRsZXIpOworICAgIGlmIChOVUxMID09IGJhdGNoSGFuZGxlcikgeworICAgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAiaGFuZGxlciBub3QgaW5zdGFuY2Ugb2YgQmF0Y2hIYW5kbGVyIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJhdGNoSGFuZGxlci0+b25JbnB1dERhdGEobGVuZ3RoKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6VW5zdXBwb3J0RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpPdXRPZk1lbW9yeUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpJT0V4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OkphdmFFeGNlcHRpb24gJiBlKSB7CisgICAgTE9HKCJKYXZhRXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAvLyBEbyBub3RoaW5nLCBsZXQgamF2YSBzaWRlIGhhbmRsZQorICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJVbmtub3duIGV4Y2VwdGlvbiIpOworICB9Cit9CisKKy8qCisgKiBDbGFzczogICAgIG9yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZUJhdGNoUHJvY2Vzc29yCisgKiBNZXRob2Q6ICAgIG5hdGl2ZUZpbmlzaAorICogU2lnbmF0dXJlOiAoSilWCisgKi8KK3ZvaWQgSk5JQ0FMTCBKYXZhX29yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZUJhdGNoUHJvY2Vzc29yX25hdGl2ZUZpbmlzaCgKKyAgICBKTklFbnYgKiBqZW52LCBqb2JqZWN0IHByb2Nlc3NvciwgamxvbmcgaGFuZGxlcikgeworICB0cnkgeworICAgIE5hdGl2ZVRhc2s6OkJhdGNoSGFuZGxlciAqIGJhdGNoSGFuZGxlciA9IChOYXRpdmVUYXNrOjpCYXRjaEhhbmRsZXIgKikoKHZvaWQqKWhhbmRsZXIpOworICAgIGlmIChOVUxMID09IGJhdGNoSGFuZGxlcikgeworICAgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAiaGFuZGxlciBub3QgaW5zdGFuY2Ugb2YgQmF0Y2hIYW5kbGVyIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJhdGNoSGFuZGxlci0+b25GaW5pc2goKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6VW5zdXBwb3J0RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpPdXRPZk1lbW9yeUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpJT0V4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OkphdmFFeGNlcHRpb24gJiBlKSB7CisgICAgTE9HKCJKYXZhRXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAvLyBEbyBub3RoaW5nLCBsZXQgamF2YSBzaWRlIGhhbmRsZQorICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJVbmtub3duIGV4Y2VwdGlvbiIpOworICB9Cit9CisKK3ZvaWQgSk5JQ0FMTCBKYXZhX29yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZUJhdGNoUHJvY2Vzc29yX25hdGl2ZUxvYWREYXRhKAorICAgIEpOSUVudiAqIGplbnYsIGpvYmplY3QgcHJvY2Vzc29yLCBqbG9uZyBoYW5kbGVyKSB7CisgIHRyeSB7CisgICAgTmF0aXZlVGFzazo6QmF0Y2hIYW5kbGVyICogYmF0Y2hIYW5kbGVyID0gKE5hdGl2ZVRhc2s6OkJhdGNoSGFuZGxlciAqKSgodm9pZCopaGFuZGxlcik7CisgICAgaWYgKE5VTEwgPT0gYmF0Y2hIYW5kbGVyKSB7CisgICAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICJoYW5kbGVyIG5vdCBpbnN0YW5jZSBvZiBCYXRjaEhhbmRsZXIiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYmF0Y2hIYW5kbGVyLT5vbkxvYWREYXRhKCk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OlVuc3VwcG9ydEV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6T3V0T2ZNZW1vcnlFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6SU9FeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpKYXZhRXhjZXB0aW9uICYgZSkgeworICAgIExPRygiSmF2YUV4Y2VwdGlvbjogJXMiLCBlLndoYXQoKSk7CisgICAgLy8gRG8gbm90aGluZywgbGV0IGphdmEgc2lkZSBoYW5kbGUKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoICguLi4pIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCAiVW5rbm93biBleGNlcHRpb24iKTsKKyAgfQorfQorCisvKgorICogQ2xhc3M6ICAgICBvcmdfYXBhY2hlX2hhZG9vcF9tYXByZWRfbmF0aXZldGFza19OYXRpdmVCYXRjaFByb2Nlc3NvcgorICogTWV0aG9kOiAgICBuYXRpdmVDb21tYW5kCisgKiBTaWduYXR1cmU6IChKW0IpW0IKKyAqLworamJ5dGVBcnJheSBKTklDQUxMIEphdmFfb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlQmF0Y2hQcm9jZXNzb3JfbmF0aXZlQ29tbWFuZCgKKyAgICBKTklFbnYgKiBqZW52LCBqb2JqZWN0IHByb2Nlc3NvciwgamxvbmcgaGFuZGxlciwgamludCBjb21tYW5kLCBqYnl0ZUFycmF5IGNtZERhdGEpIHsKKyAgdHJ5IHsKKyAgICBOYXRpdmVUYXNrOjpCYXRjaEhhbmRsZXIgKiBiYXRjaEhhbmRsZXIgPSAoTmF0aXZlVGFzazo6QmF0Y2hIYW5kbGVyICopKCh2b2lkKiloYW5kbGVyKTsKKyAgICBpZiAoTlVMTCA9PSBiYXRjaEhhbmRsZXIpIHsKKyAgICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgImhhbmRsZXIgbm90IGluc3RhbmNlIG9mIEJhdGNoSGFuZGxlciIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIENvbW1hbmQgY21kKGNvbW1hbmQpOworICAgIFBhcmFtZXRlckJ1ZmZlciAqIHBhcmFtID0gSk5VX0J5dGVBcnJheXRvUmVhZFdyaXRlQnVmZmVyKGplbnYsIGNtZERhdGEpOworICAgIFJlc3VsdEJ1ZmZlciAqIHJlc3VsdCA9IGJhdGNoSGFuZGxlci0+b25DYWxsKGNtZCwgcGFyYW0pOworICAgIGpieXRlQXJyYXkgcmV0ID0gSk5VX1JlYWRXcml0ZUJ1ZmZlclRvQnl0ZUFycmF5KGplbnYsIHJlc3VsdCk7CisKKyAgICBkZWxldGUgcmVzdWx0OworICAgIGRlbGV0ZSBwYXJhbTsKKyAgICByZXR1cm4gcmV0OworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpVbnN1cHBvcnRFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6Ok91dE9mTWVtb3J5RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OklPRXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoY29uc3QgTmF0aXZlVGFzazo6SmF2YUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBMT0coIkphdmFFeGNlcHRpb246ICVzIiwgZS53aGF0KCkpOworICAgIC8vIERvIG5vdGhpbmcsIGxldCBqYXZhIHNpZGUgaGFuZGxlCisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgIlVua25vd24gZXhjZXB0aW9uIik7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBDbGFzczogICAgIG9yZ19hcGFjZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlQmF0Y2hQcm9jZXNzb3IKKyAqIE1ldGhvZDogICAgSW5pdElEcworICogU2lnbmF0dXJlOiAoKVYKKyAqLwordm9pZCBKTklDQUxMIEphdmFfb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlQmF0Y2hQcm9jZXNzb3JfSW5pdElEcyhKTklFbnYgKiBqZW52LAorICAgIGpjbGFzcyBwcm9jZXNzb3JDbGFzcykgeworICBJbnB1dEJ1ZmZlckZpZWxkSUQgPSBqZW52LT5HZXRGaWVsZElEKHByb2Nlc3NvckNsYXNzLCAicmF3T3V0cHV0QnVmZmVyIiwgIkxqYXZhL25pby9CeXRlQnVmZmVyOyIpOworICBPdXRwdXRCdWZmZXJGaWVsZElEID0gamVudi0+R2V0RmllbGRJRChwcm9jZXNzb3JDbGFzcywgInJhd0lucHV0QnVmZmVyIiwgIkxqYXZhL25pby9CeXRlQnVmZmVyOyIpOworICBGbHVzaE91dHB1dE1ldGhvZElEID0gamVudi0+R2V0TWV0aG9kSUQocHJvY2Vzc29yQ2xhc3MsICJmbHVzaE91dHB1dCIsICIoSSlWIik7CisgIEZpbmlzaE91dHB1dE1ldGhvZElEID0gamVudi0+R2V0TWV0aG9kSUQocHJvY2Vzc29yQ2xhc3MsICJmaW5pc2hPdXRwdXQiLCAiKClWIik7CisgIFNlbmRDb21tYW5kVG9KYXZhTWV0aG9kSUQgPSBqZW52LT5HZXRNZXRob2RJRChwcm9jZXNzb3JDbGFzcywgInNlbmRDb21tYW5kVG9KYXZhIiwgIihJW0IpW0IiKTsKK30KKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9oYW5kbGVyL0JhdGNoSGFuZGxlci5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9oYW5kbGVyL0JhdGNoSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Y2UyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQmF0Y2hIYW5kbGVyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQkFUQ0hIQU5ETEVSX0hfCisjZGVmaW5lIEJBVENISEFORExFUl9IXworCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJzLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworLyoqCisgKiBOYXRpdmUgc2lkZSBjb3VudGVycGFydCBvZiBqYXZhIHNpZGUgTmF0aXZlQmF0Y2hQcm9jZXNzb3IKKyAqLworY2xhc3MgQmF0Y2hIYW5kbGVyIDogcHVibGljIENvbmZpZ3VyYWJsZSB7Citwcm90ZWN0ZWQ6CisgIEJ5dGVCdWZmZXIgX2luOworICBCeXRlQnVmZmVyIF9vdXQ7CisgIHZvaWQgKiBfcHJvY2Vzc29yOworICBDb25maWcgKiBfY29uZmlnOworcHVibGljOgorICBCYXRjaEhhbmRsZXIoKTsKKyAgdmlydHVhbCB+QmF0Y2hIYW5kbGVyKCk7CisKKyAgdmlydHVhbCBOYXRpdmVPYmplY3RUeXBlIHR5cGUoKSB7CisgICAgcmV0dXJuIEJhdGNoSGFuZGxlclR5cGU7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IG5hdGl2ZSBqbmkgZnVuY3Rpb25zIHRvIHNldCBnbG9iYWwgam5pIHJlZmVyZW5jZQorICAgKi8KKyAgdm9pZCBzZXRQcm9jZXNzb3Iodm9pZCAqIHByb2Nlc3NvcikgeworICAgIF9wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgIH0KKworICB2b2lkIHJlbGVhc2VQcm9jZXNzb3IoKTsKKworICAvKioKKyAgICogQ2FsbGVkIGJ5IGphdmEgc2lkZSB0byBzZXR1cCBuYXRpdmUgc2lkZSBCYXRjaEhhbmRsZXIKKyAgICogaW5pdGlhbGl6ZSBidWZmZXJzIGJ5IGRlZmF1bHQKKyAgICovCisgIHZvaWQgb25TZXR1cChDb25maWcgKiBjb25maWcsIGNoYXIgKiBpbnB1dEJ1ZmZlciwgdWludDMyX3QgaW5wdXRCdWZmZXJDYXBhY2l0eSwKKyAgICAgIGNoYXIgKiBvdXRwdXRCdWZmZXIsIHVpbnQzMl90IG91dHB1dEJ1ZmZlckNhcGFjaXR5KTsKKworICAvKioKKyAgICogQ2FsbGVkIGJ5IGphdmEgc2lkZSB0byBub3RpY2UgdGhhdCBpbnB1dCBkYXRhIGF2YWlsYWJsZSB0byBoYW5kbGUKKyAgICogQHBhcmFtIGxlbmd0aCBpbnB1dCBidWZmZXIncyBhdmFpbGFibGUgZGF0YSBsZW5ndGgKKyAgICovCisgIHZvaWQgb25JbnB1dERhdGEodWludDMyX3QgbGVuZ3RoKTsKKworICB2aXJ0dWFsIHZvaWQgb25Mb2FkRGF0YSgpIHsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgamF2YSBzaWRlIHRvIG5vdGljZSB0aGF0IGlucHV0IGhhcyBmaW5pc2hlZAorICAgKi8KKyAgdm9pZCBvbkZpbmlzaCgpIHsKKyAgICBmaW5pc2goKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgamF2YSBzaWRlIHRvIHNlbmQgY29tbWFuZCB0byB0aGlzIGhhbmRsZXIKKyAgICogQmF0Y2hIYW5kbGVyIGlnbm9yZSBhbGwgY29tbWFuZCBieSBkZWZhdWx0CisgICAqIEBwYXJhbSBjbWQgY29tbWFuZCBkYXRhCisgICAqIEByZXR1cm4gY29tbWFuZCByZXR1cm4gdmFsdWUKKyAgICovCisgIHZpcnR1YWwgUmVzdWx0QnVmZmVyICogb25DYWxsKGNvbnN0IENvbW1hbmQmIGNvbW1hbmQsIFJlYWRXcml0ZUJ1ZmZlciAqIHBhcmFtKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIFJlc3VsdEJ1ZmZlciAqIGNhbGwoY29uc3QgQ29tbWFuZCYgY21kLCBQYXJhbWV0ZXJCdWZmZXIgKiBwYXJhbSk7CisKKyAgLyoqCisgICAqIFVzZWQgYnkgc3ViY2xhc3MsIGNhbGwgamF2YSBzaWRlIGZsdXNoT3V0cHV0KGludCBsZW5ndGgpCisgICAqIEBwYXJhbSBsZW5ndGggb3V0cHV0IGJ1ZmZlcidzIGF2YWlsYWJsZSBkYXRhIGxlbmd0aAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGZsdXNoT3V0cHV0KCk7CisKKyAgLyoqCisgICAqIFVzZWQgYnkgc3ViY2xhc3MsIGNhbGwgamF2YSBzaWRlIGZpbmlzaE91dHB1dCgpCisgICAqLworICB2b2lkIGZpbmlzaE91dHB1dCgpOworCisgIC8qKgorICAgKiBXcml0ZSBvdXRwdXQgYnVmZmVyIGFuZCB1c2UgZmx1c2hPdXRwdXQgbWFudWFsbHksCisgICAqIG9yIHVzZSB0aGlzIGhlbHBlciBtZXRob2QKKyAgICovCisgIGlubGluZSB2b2lkIG91dHB1dChjb25zdCBjaGFyICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgIHVpbnQzMl90IHJlbWFpbiA9IF9vdXQucmVtYWluKCk7CisgICAgICBpZiAobGVuZ3RoID4gcmVtYWluKSB7CisgICAgICAgIGZsdXNoT3V0cHV0KCk7CisgICAgICB9CisgICAgICB1aW50MzJfdCBjcCA9IGxlbmd0aCA8IHJlbWFpbiA/IGxlbmd0aCA6IHJlbWFpbjsKKyAgICAgIHNpbXBsZV9tZW1jcHkoX291dC5jdXJyZW50KCksIGJ1ZmYsIGNwKTsKKyAgICAgIGJ1ZmYgKz0gY3A7CisgICAgICBsZW5ndGggLT0gY3A7CisgICAgICBfb3V0LmFkdmFuY2UoY3ApOworICAgIH0KKyAgfQorCisgIGlubGluZSB2b2lkIG91dHB1dEludCh1aW50MzJfdCB2KSB7CisgICAgaWYgKDQgPiBfb3V0LnJlbWFpbigpKSB7CisgICAgICBmbHVzaE91dHB1dCgpOworICAgIH0KKyAgICAqKHVpbnQzMl90KikoX291dC5jdXJyZW50KCkpID0gdjsKKyAgICBfb3V0LmFkdmFuY2UoNCk7CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIFN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdGhlc2UgaWYgbmVlZGVkCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IG9uU2V0dXAsIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorICAgKiBTdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBpZiBuZWVkZWQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoQ29uZmlnICogY29uZmlnKSB7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IG9uRmluaXNoLCBmbHVzaCAmIGNsb3NlIG91dHB1dCBieSBkZWZhdWx0CisgICAqIFN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIGlmIG5lZWRlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGZpbmlzaCgpIHsKKyAgICBmbHVzaE91dHB1dCgpOworICAgIGZpbmlzaE91dHB1dCgpOworICB9CisgIDsKKworICAvKioKKyAgICogQ2FsbGVkIGJ5IG9uSW5wdXREYXRhLCBpbnRlcm5hbCBpbnB1dCBkYXRhIHByb2Nlc3NvciwKKyAgICogU3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgaWYgbmVlZGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgaGFuZGxlSW5wdXQoQnl0ZUJ1ZmZlciAmIGJ5dGVCdWZmZXIpIHsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogQkFUQ0hIQU5ETEVSX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQ29tYmluZUhhbmRsZXIuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvQ29tYmluZUhhbmRsZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzODYzZQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9Db21iaW5lSGFuZGxlci5jYwpAQCAtMCwwICsxLDI1NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiQ29tYmluZUhhbmRsZXIuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworY29uc3QgY2hhciAqIFJFRklMTCA9ICJyZWZpbGwiOworY29uc3QgaW50IExFTkdUSF9PRl9SRUZJTExfU1RSSU5HID0gNjsKKworY29uc3QgQ29tbWFuZCBDb21iaW5lSGFuZGxlcjo6Q09NQklORSg0LCAiQ29tYmluZSIpOworCitDb21iaW5lSGFuZGxlcjo6Q29tYmluZUhhbmRsZXIoKQorICAgIDogX2NvbWJpbmVDb250ZXh0KE5VTEwpLCBfa3ZJdGVyYXRvcihOVUxMKSwgX3dyaXRlcihOVUxMKSwgX2tUeXBlKFVua25vd25UeXBlKSwKKyAgICAgICAgX3ZUeXBlKFVua25vd25UeXBlKSwgX2NvbmZpZyhOVUxMKSwgX2t2Q2FjaGVkKGZhbHNlKSwgX2NvbWJpbmVJbnB1dFJlY29yZENvdW50KDApLAorICAgICAgICBfY29tYmluZUlucHV0Qnl0ZXMoMCksIF9jb21iaW5lT3V0cHV0UmVjb3JkQ291bnQoMCksIF9jb21iaW5lT3V0cHV0Qnl0ZXMoMCkgeworfQorCitDb21iaW5lSGFuZGxlcjo6fkNvbWJpbmVIYW5kbGVyKCkgeworfQorCit2b2lkIENvbWJpbmVIYW5kbGVyOjpjb25maWd1cmUoQ29uZmlnICogY29uZmlnKSB7CisKKyAgX2NvbmZpZyA9IGNvbmZpZzsKKyAgTWFwT3V0cHV0U3BlYzo6Z2V0U3BlY0Zyb21Db25maWcoX2NvbmZpZywgX21hcE91dHB1dFNwZWMpOworICBfa1R5cGUgPSBfbWFwT3V0cHV0U3BlYy5rZXlUeXBlOworICBfdlR5cGUgPSBfbWFwT3V0cHV0U3BlYy52YWx1ZVR5cGU7Cit9CisKK3VpbnQzMl90IENvbWJpbmVIYW5kbGVyOjpmZWVkRGF0YVRvSmF2YUluV3JpdGFibGVTZXJpYWxpemF0aW9uKCkgeworCisgIHVpbnQzMl90IHdyaXR0ZW4gPSAwOworICBib29sIGZpcnN0S1YgPSB0cnVlOworICBfb3V0LnBvc2l0aW9uKDApOworCisgIGlmIChfa3ZDYWNoZWQpIHsKKyAgICB1aW50MzJfdCBrdkxlbmd0aCA9IF9rZXkub3V0ZXJMZW5ndGggKyBfdmFsdWUub3V0ZXJMZW5ndGggKyBLVkJ1ZmZlcjo6aGVhZGVyTGVuZ3RoKCk7CisgICAgb3V0cHV0SW50KGJzd2FwKF9rZXkub3V0ZXJMZW5ndGgpKTsKKyAgICBvdXRwdXRJbnQoYnN3YXAoX3ZhbHVlLm91dGVyTGVuZ3RoKSk7CisgICAgb3V0cHV0S2V5T3JWYWx1ZShfa2V5LCBfa1R5cGUpOworICAgIG91dHB1dEtleU9yVmFsdWUoX3ZhbHVlLCBfdlR5cGUpOworCisgICAgd3JpdHRlbiArPSBrdkxlbmd0aDsKKyAgICBfa3ZDYWNoZWQgPSBmYWxzZTsKKyAgICBmaXJzdEtWID0gZmFsc2U7CisgIH0KKworICB1aW50MzJfdCByZWNvcmRDb3VudCA9IDA7CisgIHdoaWxlIChuZXh0S2V5VmFsdWUoX2tleSwgX3ZhbHVlKSkgeworCisgICAgLy86OnNsZWVwKDUpOworICAgIF9rdkNhY2hlZCA9IGZhbHNlOworICAgIHJlY29yZENvdW50Kys7CisKKyAgICB1aW50MzJfdCBrdkxlbmd0aCA9IF9rZXkub3V0ZXJMZW5ndGggKyBfdmFsdWUub3V0ZXJMZW5ndGggKyBLVkJ1ZmZlcjo6aGVhZGVyTGVuZ3RoKCk7CisKKyAgICBpZiAoIWZpcnN0S1YgJiYga3ZMZW5ndGggPiBfb3V0LnJlbWFpbigpKSB7CisgICAgICBfa3ZDYWNoZWQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpcnN0S1YgPSBmYWxzZTsKKyAgICAgIC8vd3JpdGUgZmluYWwga2V5IGxlbmd0aCBhbmQgZmluYWwgdmFsdWUgbGVuZ3RoCisgICAgICBvdXRwdXRJbnQoYnN3YXAoX2tleS5vdXRlckxlbmd0aCkpOworICAgICAgb3V0cHV0SW50KGJzd2FwKF92YWx1ZS5vdXRlckxlbmd0aCkpOworICAgICAgb3V0cHV0S2V5T3JWYWx1ZShfa2V5LCBfa1R5cGUpOworICAgICAgb3V0cHV0S2V5T3JWYWx1ZShfdmFsdWUsIF92VHlwZSk7CisKKyAgICAgIHdyaXR0ZW4gKz0ga3ZMZW5ndGg7CisgICAgfQorICB9CisKKyAgaWYgKF9vdXQucG9zaXRpb24oKSA+IDApIHsKKyAgICBmbHVzaE91dHB1dCgpOworICB9CisKKyAgX2NvbWJpbmVJbnB1dFJlY29yZENvdW50ICs9IHJlY29yZENvdW50OworICBfY29tYmluZUlucHV0Qnl0ZXMgKz0gd3JpdHRlbjsKKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKKy8qKgorICogS1Y6IGtleSBvciB2YWx1ZQorICovCit2b2lkIENvbWJpbmVIYW5kbGVyOjpvdXRwdXRLZXlPclZhbHVlKFNlcmlhbGl6ZUluZm8gJiBLViwgS2V5VmFsdWVUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVGV4dFR5cGU6CisgICAgb3V0cHV0KEtWLnZhckJ5dGVzLCBLVi5vdXRlckxlbmd0aCAtIEtWLmJ1ZmZlci5sZW5ndGgoKSk7CisgICAgb3V0cHV0KEtWLmJ1ZmZlci5kYXRhKCksIEtWLmJ1ZmZlci5sZW5ndGgoKSk7CisgICAgYnJlYWs7CisgIGNhc2UgQnl0ZXNUeXBlOgorICAgIG91dHB1dEludChic3dhcChLVi5idWZmZXIubGVuZ3RoKCkpKTsKKyAgICBvdXRwdXQoS1YuYnVmZmVyLmRhdGEoKSwgS1YuYnVmZmVyLmxlbmd0aCgpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBvdXRwdXQoS1YuYnVmZmVyLmRhdGEoKSwgS1YuYnVmZmVyLmxlbmd0aCgpKTsKKyAgICBicmVhazsKKyAgfQorfQorCitib29sIENvbWJpbmVIYW5kbGVyOjpuZXh0S2V5VmFsdWUoU2VyaWFsaXplSW5mbyAmIGtleSwgU2VyaWFsaXplSW5mbyAmIHZhbHVlKSB7CisKKyAgaWYgKCFfa3ZJdGVyYXRvci0+bmV4dChrZXkuYnVmZmVyLCB2YWx1ZS5idWZmZXIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdWludDMyX3QgdmFyTGVuZ3RoID0gMDsKKyAgc3dpdGNoIChfa1R5cGUpIHsKKyAgY2FzZSBUZXh0VHlwZToKKyAgICBXcml0YWJsZVV0aWxzOjpXcml0ZVZJbnQoa2V5LmJ1ZmZlci5sZW5ndGgoKSwga2V5LnZhckJ5dGVzLCB2YXJMZW5ndGgpOworICAgIGtleS5vdXRlckxlbmd0aCA9IGtleS5idWZmZXIubGVuZ3RoKCkgKyB2YXJMZW5ndGg7CisgICAgYnJlYWs7CisgIGNhc2UgQnl0ZXNUeXBlOgorICAgIGtleS5vdXRlckxlbmd0aCA9IGtleS5idWZmZXIubGVuZ3RoKCkgKyA0OworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGtleS5vdXRlckxlbmd0aCA9IGtleS5idWZmZXIubGVuZ3RoKCk7CisgICAgYnJlYWs7CisgIH0KKworICAvL3ByZXBhcmUgZmluYWwgdmFsdWUgbGVuZ3RoCisgIHVpbnQzMl90IHZhclZhbHVlTGVuZ3RoID0gMDsKKyAgc3dpdGNoIChfdlR5cGUpIHsKKyAgY2FzZSBUZXh0VHlwZToKKyAgICBXcml0YWJsZVV0aWxzOjpXcml0ZVZJbnQodmFsdWUuYnVmZmVyLmxlbmd0aCgpLCB2YWx1ZS52YXJCeXRlcywgdmFyVmFsdWVMZW5ndGgpOworICAgIHZhbHVlLm91dGVyTGVuZ3RoID0gdmFsdWUuYnVmZmVyLmxlbmd0aCgpICsgdmFyVmFsdWVMZW5ndGg7CisgICAgYnJlYWs7CisgIGNhc2UgQnl0ZXNUeXBlOgorICAgIHZhbHVlLm91dGVyTGVuZ3RoID0gdmFsdWUuYnVmZmVyLmxlbmd0aCgpICsgNDsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB2YWx1ZS5vdXRlckxlbmd0aCA9IHZhbHVlLmJ1ZmZlci5sZW5ndGgoKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBDb21iaW5lSGFuZGxlcjo6ZmVlZERhdGFUb0phdmEoU2VyaWFsaXphdGlvbkZyYW1ld29yayBzZXJpYWxpemF0aW9uVHlwZSkgeworICBpZiAoc2VyaWFsaXphdGlvblR5cGUgPT0gV1JJVEFCTEVfU0VSSUFMSVpBVElPTikgeworICAgIHJldHVybiBmZWVkRGF0YVRvSmF2YUluV3JpdGFibGVTZXJpYWxpemF0aW9uKCk7CisgIH0KKyAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiTmF0aXZlIFNlcmlhbGl6YXRpb24gbm90IHN1cHBvcnRlZCIpOworfQorCit2b2lkIENvbWJpbmVIYW5kbGVyOjpoYW5kbGVJbnB1dChCeXRlQnVmZmVyICYgaW4pIHsKKyAgY2hhciAqIGJ1ZmYgPSBpbi5jdXJyZW50KCk7CisgIHVpbnQzMl90IGxlbmd0aCA9IGluLnJlbWFpbigpOworICB1aW50MzJfdCByZW1haW4gPSBsZW5ndGg7CisgIGNoYXIgKiBwb3MgPSBidWZmOworICBpZiAoX2FzaWRlQnVmZmVyLnJlbWFpbigpID4gMCkgeworICAgIHVpbnQzMl90IGZpbGxlZExlbmd0aCA9IF9hc2lkZUJ1ZmZlci5maWxsKHBvcywgbGVuZ3RoKTsKKyAgICBwb3MgKz0gZmlsbGVkTGVuZ3RoOworICAgIHJlbWFpbiAtPSBmaWxsZWRMZW5ndGg7CisgIH0KKworICBpZiAoX2FzaWRlQnVmZmVyLnNpemUoKSA+IDAgJiYgX2FzaWRlQnVmZmVyLnJlbWFpbigpID09IDApIHsKKyAgICBfYXNpZGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgd3JpdGUoX2FzaWRlQnVmZmVyLmN1cnJlbnQoKSwgX2FzaWRlQnVmZmVyLnNpemUoKSk7CisgICAgX2FzaWRlQnVmZmVyLndyYXAoTlVMTCwgMCk7CisgIH0KKworICBpZiAocmVtYWluID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgS1ZCdWZmZXIgKiBrdkJ1ZmZlciA9IChLVkJ1ZmZlciAqKXBvczsKKworICBpZiAodW5saWtlbHkocmVtYWluIDwga3ZCdWZmZXItPmhlYWRlckxlbmd0aCgpKSkgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImsvdiBtZXRhIGluZm9ybWF0aW9uIGluY29tcGxldGUiKTsKKyAgfQorCisgIHVpbnQzMl90IGt2TGVuZ3RoID0ga3ZCdWZmZXItPmxlbmd0aENvbnZlcnRFbmRpdW0oKTsKKworICBpZiAoa3ZMZW5ndGggPiByZW1haW4pIHsKKyAgICBfYXNpZGVCeXRlcy5yZXNpemUoa3ZMZW5ndGgpOworICAgIF9hc2lkZUJ1ZmZlci53cmFwKF9hc2lkZUJ5dGVzLmJ1ZmYoKSwgX2FzaWRlQnl0ZXMuc2l6ZSgpKTsKKyAgICBfYXNpZGVCdWZmZXIuZmlsbChwb3MsIHJlbWFpbik7CisgICAgcG9zICs9IHJlbWFpbjsKKyAgICByZW1haW4gPSAwOworICB9IGVsc2UgeworICAgIHdyaXRlKHBvcywgcmVtYWluKTsKKyAgfQorfQorCit2b2lkIENvbWJpbmVIYW5kbGVyOjp3cml0ZShjaGFyICogYnVmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgS1ZCdWZmZXIgKiBrdiA9IE5VTEw7CisgIGNoYXIgKiBwb3MgPSBidWY7CisgIHVpbnQzMl90IHJlbWFpbiA9IGxlbmd0aDsKKworICB1aW50MzJfdCBvdXRwdXRSZWNvcmRDb3VudCA9IDA7CisgIHdoaWxlIChyZW1haW4gPiAwKSB7CisgICAga3YgPSAoS1ZCdWZmZXIgKilwb3M7CisgICAga3YtPmtleUxlbmd0aCA9IGJzd2FwKGt2LT5rZXlMZW5ndGgpOworICAgIGt2LT52YWx1ZUxlbmd0aCA9IGJzd2FwKGt2LT52YWx1ZUxlbmd0aCk7CisgICAgX3dyaXRlci0+d3JpdGUoa3YtPmdldEtleSgpLCBrdi0+a2V5TGVuZ3RoLCBrdi0+Z2V0VmFsdWUoKSwga3YtPnZhbHVlTGVuZ3RoKTsKKyAgICBvdXRwdXRSZWNvcmRDb3VudCsrOworICAgIHJlbWFpbiAtPSBrdi0+bGVuZ3RoKCk7CisgICAgcG9zICs9IGt2LT5sZW5ndGgoKTsKKyAgfQorCisgIF9jb21iaW5lT3V0cHV0UmVjb3JkQ291bnQgKz0gb3V0cHV0UmVjb3JkQ291bnQ7CisgIF9jb21iaW5lT3V0cHV0Qnl0ZXMgKz0gbGVuZ3RoOworfQorCitzdHJpbmcgdG9TdHJpbmcodWludDMyX3QgbGVuZ3RoKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKDQpOworICByZXN1bHQuYXNzaWduKChjaGFyICopKCZsZW5ndGgpLCA0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBDb21iaW5lSGFuZGxlcjo6b25Mb2FkRGF0YSgpIHsKKyAgZmVlZERhdGFUb0phdmEoV1JJVEFCTEVfU0VSSUFMSVpBVElPTik7Cit9CisKK1Jlc3VsdEJ1ZmZlciAqIENvbWJpbmVIYW5kbGVyOjpvbkNhbGwoY29uc3QgQ29tbWFuZCYgY29tbWFuZCwgUGFyYW1ldGVyQnVmZmVyICogcGFyYW0pIHsKKyAgVEhST1dfRVhDRVBUSU9OKFVuc3VwcG9ydEV4Y2VwdGlvbiwgIkNvbW1hbmQgbm90IHN1cHBvcnRlZCBieSBSUmVkdWNlckhhbmRsZXIiKTsKK30KKwordm9pZCBDb21iaW5lSGFuZGxlcjo6Y29tYmluZShDb21iaW5lQ29udGV4dCB0eXBlLCBLVkl0ZXJhdG9yICoga3ZJdGVyYXRvciwgSUZpbGVXcml0ZXIgKiB3cml0ZXIpIHsKKworICBfY29tYmluZUlucHV0UmVjb3JkQ291bnQgPSAwOworICBfY29tYmluZU91dHB1dFJlY29yZENvdW50ID0gMDsKKyAgX2NvbWJpbmVJbnB1dEJ5dGVzID0gMDsKKyAgX2NvbWJpbmVPdXRwdXRCeXRlcyA9IDA7CisKKyAgdGhpcy0+X2NvbWJpbmVDb250ZXh0ID0gJnR5cGU7CisgIHRoaXMtPl9rdkl0ZXJhdG9yID0ga3ZJdGVyYXRvcjsKKyAgdGhpcy0+X3dyaXRlciA9IHdyaXRlcjsKKyAgY2FsbChDT01CSU5FLCBOVUxMKTsKKworICBMT0coIltDb21iaW5lSGFuZGxlcl0gaW5wdXQgUmVjb3JkIENvdW50OiAlZCwgaW5wdXQgQnl0ZXM6ICVkLCAiCisgICAgICAib3V0cHV0IFJlY29yZCBDb3VudDogJWQsIG91dHB1dCBCeXRlczogJWQiLAorICAgICAgX2NvbWJpbmVJbnB1dFJlY29yZENvdW50LCBfY29tYmluZUlucHV0Qnl0ZXMsCisgICAgICBfY29tYmluZU91dHB1dFJlY29yZENvdW50LCBfY29tYmluZU91dHB1dEJ5dGVzKTsKKyAgcmV0dXJuOworfQorCit2b2lkIENvbWJpbmVIYW5kbGVyOjpmaW5pc2goKSB7Cit9CisKK30gLyogbmFtZXNwYWNlIE5hdGl2ZVRhc2sgKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9Db21iaW5lSGFuZGxlci5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9oYW5kbGVyL0NvbWJpbmVIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0M2JkNAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9Db21iaW5lSGFuZGxlci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfQ09NQklORUhBTkRMRVJfSF8KKyNkZWZpbmUgX0NPTUJJTkVIQU5ETEVSX0hfCisKKyNpbmNsdWRlICJsaWIvQ29tYmluZXIuaCIKKyNpbmNsdWRlICJCYXRjaEhhbmRsZXIuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitlbnVtIFNlcmlhbGl6YXRpb25GcmFtZXdvcmsgeworICBXUklUQUJMRV9TRVJJQUxJWkFUSU9OID0gMCwKKyAgTkFUSVZFX1NFUklBTElaQVRJT04gPSAxCit9OworCitzdHJ1Y3QgU2VyaWFsaXplSW5mbyB7CisgIEJ1ZmZlciBidWZmZXI7CisgIHVpbnQzMl90IG91dGVyTGVuZ3RoOworICBjaGFyIHZhckJ5dGVzWzhdOworfTsKKworY2xhc3MgQ29tYmluZUhhbmRsZXIgOiBwdWJsaWMgTmF0aXZlVGFzazo6SUNvbWJpbmVSdW5uZXIsIHB1YmxpYyBOYXRpdmVUYXNrOjpCYXRjaEhhbmRsZXIgeworcHVibGljOgorICBzdGF0aWMgY29uc3QgQ29tbWFuZCBDT01CSU5FOworCitwcml2YXRlOgorCisgIENvbWJpbmVDb250ZXh0ICogX2NvbWJpbmVDb250ZXh0OworICBLVkl0ZXJhdG9yICogX2t2SXRlcmF0b3I7CisgIElGaWxlV3JpdGVyICogX3dyaXRlcjsKKyAgU2VyaWFsaXplSW5mbyBfa2V5OworICBTZXJpYWxpemVJbmZvIF92YWx1ZTsKKworICBLZXlWYWx1ZVR5cGUgX2tUeXBlOworICBLZXlWYWx1ZVR5cGUgX3ZUeXBlOworICBNYXBPdXRwdXRTcGVjIF9tYXBPdXRwdXRTcGVjOworICBDb25maWcgKiBfY29uZmlnOworICBib29sIF9rdkNhY2hlZDsKKworICB1aW50MzJfdCBfY29tYmluZUlucHV0UmVjb3JkQ291bnQ7CisgIHVpbnQzMl90IF9jb21iaW5lSW5wdXRCeXRlczsKKworICB1aW50MzJfdCBfY29tYmluZU91dHB1dFJlY29yZENvdW50OworICB1aW50MzJfdCBfY29tYmluZU91dHB1dEJ5dGVzOworCisgIEZpeFNpemVDb250YWluZXIgX2FzaWRlQnVmZmVyOworICBCeXRlQXJyYXkgX2FzaWRlQnl0ZXM7CisKK3B1YmxpYzoKKyAgQ29tYmluZUhhbmRsZXIoKTsKKyAgdmlydHVhbCB+Q29tYmluZUhhbmRsZXIoKTsKKworICB2aXJ0dWFsIHZvaWQgaGFuZGxlSW5wdXQoQnl0ZUJ1ZmZlciAmIGJ5dGVCdWZmZXIpOworICB2b2lkIGZpbmlzaCgpOworCisgIFJlc3VsdEJ1ZmZlciAqIG9uQ2FsbChjb25zdCBDb21tYW5kJiBjb21tYW5kLCBQYXJhbWV0ZXJCdWZmZXIgKiBwYXJhbSk7CisKKyAgdm9pZCBjb25maWd1cmUoQ29uZmlnICogY29uZmlnKTsKKworICB2b2lkIGNvbWJpbmUoQ29tYmluZUNvbnRleHQgdHlwZSwgS1ZJdGVyYXRvciAqIGt2SXRlcmF0b3IsIElGaWxlV3JpdGVyICogd3JpdGVyKTsKKworICB2aXJ0dWFsIHZvaWQgb25Mb2FkRGF0YSgpOworCitwcml2YXRlOgorICB2b2lkIGZsdXNoRGF0YVRvV3JpdGVyKCk7CisgIHZvaWQgb3V0cHV0S2V5T3JWYWx1ZShTZXJpYWxpemVJbmZvICYgaW5mbywgS2V5VmFsdWVUeXBlIHR5cGUpOworICBib29sIG5leHRLZXlWYWx1ZShTZXJpYWxpemVJbmZvICYga2V5LCBTZXJpYWxpemVJbmZvICYgdmFsdWUpOworICB1aW50MzJfdCBmZWVkRGF0YVRvSmF2YShTZXJpYWxpemF0aW9uRnJhbWV3b3JrIHNlcmlhbGl6YXRpb25UeXBlKTsKKyAgdWludDMyX3QgZmVlZERhdGFUb0phdmFJbldyaXRhYmxlU2VyaWFsaXphdGlvbigpOworICB2b2lkIHdyaXRlKGNoYXIgKiBidWYsIHVpbnQzMl90IGxlbmd0aCk7CisKK307CisKK30gLyogbmFtZXNwYWNlIE5hdGl2ZVRhc2sgKi8KKyNlbmRpZiAvKiBfSkFWQUNPTUJJTkVIQU5ETEVSX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvTUNvbGxlY3Rvck91dHB1dEhhbmRsZXIuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2hhbmRsZXIvTUNvbGxlY3Rvck91dHB1dEhhbmRsZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0YWU0NAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9NQ29sbGVjdG9yT3V0cHV0SGFuZGxlci5jYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJsaWIvVGFza0NvdW50ZXJzLmgiCisjaW5jbHVkZSAiTUNvbGxlY3Rvck91dHB1dEhhbmRsZXIuaCIKKyNpbmNsdWRlICJsaWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5oIgorI2luY2x1ZGUgImxpYi9NYXBPdXRwdXRDb2xsZWN0b3IuaCIKKyNpbmNsdWRlICJDb21iaW5lSGFuZGxlci5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK01Db2xsZWN0b3JPdXRwdXRIYW5kbGVyOjpNQ29sbGVjdG9yT3V0cHV0SGFuZGxlcigpCisgICAgOiBfY29sbGVjdG9yKE5VTEwpLCBfZGVzdChOVUxMKSwgX2VuZGl1bShMQVJHRV9FTkRJVU0pIHsKK30KKworTUNvbGxlY3Rvck91dHB1dEhhbmRsZXI6On5NQ29sbGVjdG9yT3V0cHV0SGFuZGxlcigpIHsKKyAgX2Rlc3QgPSBOVUxMOworICBkZWxldGUgX2NvbGxlY3RvcjsKKyAgX2NvbGxlY3RvciA9IE5VTEw7Cit9CisKK3ZvaWQgTUNvbGxlY3Rvck91dHB1dEhhbmRsZXI6OmNvbmZpZ3VyZShDb25maWcgKiBjb25maWcpIHsKKyAgaWYgKE5VTEwgPT0gY29uZmlnKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdWludDMyX3QgcGFydGl0aW9uID0gY29uZmlnLT5nZXRJbnQoTUFQUkVEX05VTV9SRURVQ0VTLCAxKTsKKworICBfY29sbGVjdG9yID0gbmV3IE1hcE91dHB1dENvbGxlY3RvcihwYXJ0aXRpb24sIHRoaXMpOworICBfY29sbGVjdG9yLT5jb25maWd1cmUoY29uZmlnKTsKK30KKwordm9pZCBNQ29sbGVjdG9yT3V0cHV0SGFuZGxlcjo6ZmluaXNoKCkgeworICBfY29sbGVjdG9yLT5jbG9zZSgpOworICBCYXRjaEhhbmRsZXI6OmZpbmlzaCgpOworfQorCit2b2lkIE1Db2xsZWN0b3JPdXRwdXRIYW5kbGVyOjpoYW5kbGVJbnB1dChCeXRlQnVmZmVyICYgaW4pIHsKKyAgY2hhciAqIGJ1ZmYgPSBpbi5jdXJyZW50KCk7CisgIHVpbnQzMl90IGxlbmd0aCA9IGluLnJlbWFpbigpOworCisgIGNvbnN0IGNoYXIgKiBlbmQgPSBidWZmICsgbGVuZ3RoOworICBjaGFyICogcG9zID0gYnVmZjsKKyAgaWYgKF9rdkNvbnRhaW5lci5yZW1haW4oKSA+IDApIHsKKyAgICB1aW50MzJfdCBmaWxsZWRMZW5ndGggPSBfa3ZDb250YWluZXIuZmlsbChwb3MsIGxlbmd0aCk7CisgICAgcG9zICs9IGZpbGxlZExlbmd0aDsKKyAgfQorCisgIHdoaWxlIChlbmQgLSBwb3MgPiAwKSB7CisgICAgS1ZCdWZmZXJXaXRoUGFyaXRpdGlvbklkICoga3ZCdWZmZXIgPSAoS1ZCdWZmZXJXaXRoUGFyaXRpdGlvbklkICopcG9zOworCisgICAgaWYgKHVubGlrZWx5KGVuZCAtIHBvcyA8IEtWQnVmZmVyOjpoZWFkZXJMZW5ndGgoKSkpIHsKKyAgICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImsvdiBtZXRhIGluZm9ybWF0aW9uIGluY29tcGxldGUiKTsKKyAgICB9CisKKyAgICBpZiAoX2VuZGl1bSA9PSBMQVJHRV9FTkRJVU0pIHsKKyAgICAgIGt2QnVmZmVyLT5wYXJ0aXRpb25JZCA9IGJzd2FwKGt2QnVmZmVyLT5wYXJ0aXRpb25JZCk7CisgICAgICBrdkJ1ZmZlci0+YnVmZmVyLmtleUxlbmd0aCA9IGJzd2FwKGt2QnVmZmVyLT5idWZmZXIua2V5TGVuZ3RoKTsKKyAgICAgIGt2QnVmZmVyLT5idWZmZXIudmFsdWVMZW5ndGggPSBic3dhcChrdkJ1ZmZlci0+YnVmZmVyLnZhbHVlTGVuZ3RoKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBrdkxlbmd0aCA9IGt2QnVmZmVyLT5idWZmZXIubGVuZ3RoKCk7CisKKyAgICBLVkJ1ZmZlciAqIGRlc3QgPSBhbGxvY2F0ZUtWQnVmZmVyKGt2QnVmZmVyLT5wYXJ0aXRpb25JZCwga3ZMZW5ndGgpOworICAgIF9rdkNvbnRhaW5lci53cmFwKChjaGFyICopZGVzdCwga3ZMZW5ndGgpOworCisgICAgcG9zICs9IDQ7IC8vc2tpcCB0aGUgcGFydGl0aW9uIGxlbmd0aAorICAgIHVpbnQzMl90IGZpbGxlZExlbmd0aCA9IF9rdkNvbnRhaW5lci5maWxsKHBvcywgZW5kIC0gcG9zKTsKKyAgICBwb3MgKz0gZmlsbGVkTGVuZ3RoOworICB9Cit9CisKK0tWQnVmZmVyICogTUNvbGxlY3Rvck91dHB1dEhhbmRsZXI6OmFsbG9jYXRlS1ZCdWZmZXIodWludDMyX3QgcGFydGl0aW9uSWQsIHVpbnQzMl90IGt2bGVuZ3RoKSB7CisgIEtWQnVmZmVyICogZGVzdCA9IF9jb2xsZWN0b3ItPmFsbG9jYXRlS1ZCdWZmZXIocGFydGl0aW9uSWQsIGt2bGVuZ3RoKTsKKyAgcmV0dXJuIGRlc3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9NQ29sbGVjdG9yT3V0cHV0SGFuZGxlci5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9oYW5kbGVyL01Db2xsZWN0b3JPdXRwdXRIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0NjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvaGFuZGxlci9NQ29sbGVjdG9yT3V0cHV0SGFuZGxlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUNPTExFQ1RPUk9VVFBVVEhBTkRMRVJfSF8KKyNkZWZpbmUgTUNPTExFQ1RPUk9VVFBVVEhBTkRMRVJfSF8KKworI2luY2x1ZGUgIkJhdGNoSGFuZGxlci5oIgorI2luY2x1ZGUgImxpYi9TcGlsbE91dHB1dFNlcnZpY2UuaCIKKyNpbmNsdWRlICJBYnN0cmFjdE1hcEhhbmRsZXIuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworY2xhc3MgTWFwT3V0cHV0Q29sbGVjdG9yOworCitjbGFzcyBNQ29sbGVjdG9yT3V0cHV0SGFuZGxlciA6IHB1YmxpYyBBYnN0cmFjdE1hcEhhbmRsZXIgeworcHJpdmF0ZToKKworICBGaXhTaXplQ29udGFpbmVyIF9rdkNvbnRhaW5lcjsKKworICBNYXBPdXRwdXRDb2xsZWN0b3IgKiBfY29sbGVjdG9yOworICAvLyBzdGF0ZSBpbmZvIGZvciBsYXJnZSBLViBwYWlycworICBjaGFyICogX2Rlc3Q7CisKKyAgRW5kaXVtIF9lbmRpdW07CisKK3B1YmxpYzoKKyAgTUNvbGxlY3Rvck91dHB1dEhhbmRsZXIoKTsKKyAgdmlydHVhbCB+TUNvbGxlY3Rvck91dHB1dEhhbmRsZXIoKTsKKworICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKENvbmZpZyAqIGNvbmZpZyk7CisgIHZpcnR1YWwgdm9pZCBmaW5pc2goKTsKKyAgdmlydHVhbCB2b2lkIGhhbmRsZUlucHV0KEJ5dGVCdWZmZXIgJiBieXRlQnVmZmVyKTsKK3ByaXZhdGU6CisgIEtWQnVmZmVyICogYWxsb2NhdGVLVkJ1ZmZlcih1aW50MzJfdCBwYXJ0aXRpb24sIHVpbnQzMl90IGt2bGVuZ3RoKTsKK307CisKK30KKworI2VuZGlmIC8qIE1DT0xMRUNUT1JPVVRQVVRIQU5ETEVSX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJTdHJlYW0uY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJTdHJlYW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1OWI0NgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0J1ZmZlclN0cmVhbS5jYwpAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL0J1ZmZlclN0cmVhbS5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2ludDMyX3QgSW5wdXRCdWZmZXI6OnJlYWQodm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICB1aW50MzJfdCByZCA9IF9jYXBhY2l0eSAtIF9wb3NpdGlvbiA8IGxlbmd0aCA/IF9jYXBhY2l0eSAtIF9wb3NpdGlvbiA6IGxlbmd0aDsKKyAgaWYgKHJkID4gMCkgeworICAgIG1lbWNweShidWZmLCBfYnVmZiArIF9wb3NpdGlvbiwgcmQpOworICAgIF9wb3NpdGlvbiArPSByZDsKKyAgICByZXR1cm4gcmQ7CisgIH0KKyAgcmV0dXJuIGxlbmd0aCA9PSAwID8gMCA6IC0xOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcjo6d3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICBpZiAoX3Bvc2l0aW9uICsgbGVuZ3RoIDw9IF9jYXBhY2l0eSkgeworICAgIG1lbWNweShfYnVmZiArIF9wb3NpdGlvbiwgYnVmZiwgbGVuZ3RoKTsKKyAgICBfcG9zaXRpb24gKz0gbGVuZ3RoOworICB9IGVsc2UgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIk91dHB1dEJ1ZmZlciB0b28gc21hbGwgdG8gd3JpdGUiKTsKKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJTdHJlYW0uaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0J1ZmZlclN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDViOTUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJTdHJlYW0uaApAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQlVGRkVSU1RSRUFNX0hfCisjZGVmaW5lIEJVRkZFUlNUUkVBTV9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImxpYi9TdHJlYW1zLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK2NsYXNzIElucHV0QnVmZmVyIDogcHVibGljIElucHV0U3RyZWFtIHsKK3Byb3RlY3RlZDoKKyAgY29uc3QgY2hhciAqIF9idWZmOworICB1aW50MzJfdCBfcG9zaXRpb247CisgIHVpbnQzMl90IF9jYXBhY2l0eTsKK3B1YmxpYzoKKyAgSW5wdXRCdWZmZXIoKQorICAgICAgOiBfYnVmZihOVUxMKSwgX3Bvc2l0aW9uKDApLCBfY2FwYWNpdHkoMCkgeworICB9CisKKyAgSW5wdXRCdWZmZXIoY29uc3QgY2hhciAqIGJ1ZmYsIHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgOiBfYnVmZihidWZmKSwgX3Bvc2l0aW9uKDApLCBfY2FwYWNpdHkoY2FwYWNpdHkpIHsKKyAgfQorCisgIElucHV0QnVmZmVyKGNvbnN0IHN0cmluZyAmIHNyYykKKyAgICAgIDogX2J1ZmYoc3JjLmRhdGEoKSksIF9wb3NpdGlvbigwKSwgX2NhcGFjaXR5KHNyYy5sZW5ndGgoKSkgeworICB9CisKKyAgdmlydHVhbCB+SW5wdXRCdWZmZXIoKSB7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgc2Vlayh1aW50NjRfdCBwb3NpdGlvbikgeworICAgIGlmIChwb3NpdGlvbiA8PSBfY2FwYWNpdHkpIHsKKyAgICAgIF9wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIH0gZWxzZSB7CisgICAgICBfcG9zaXRpb24gPSBfY2FwYWNpdHk7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB1aW50NjRfdCB0ZWxsKCkgeworICAgIHJldHVybiBfcG9zaXRpb247CisgIH0KKworICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKTsKKworICB2b2lkIHJlc2V0KGNvbnN0IGNoYXIgKiBidWZmLCB1aW50MzJfdCBjYXBhY2l0eSkgeworICAgIF9idWZmID0gYnVmZjsKKyAgICBfcG9zaXRpb24gPSAwOworICAgIF9jYXBhY2l0eSA9IGNhcGFjaXR5OworICB9CisKKyAgdm9pZCByZXNldChjb25zdCBzdHJpbmcgJiBzcmMpIHsKKyAgICBfYnVmZiA9IHNyYy5kYXRhKCk7CisgICAgX3Bvc2l0aW9uID0gMDsKKyAgICBfY2FwYWNpdHkgPSBzcmMubGVuZ3RoKCk7CisgIH0KKworICB2b2lkIHJld2luZCgpIHsKKyAgICBfcG9zaXRpb24gPSAwOworICB9Cit9OworCitjbGFzcyBPdXRwdXRCdWZmZXIgOiBwdWJsaWMgT3V0cHV0U3RyZWFtIHsKK3Byb3RlY3RlZDoKKyAgY2hhciAqIF9idWZmOworICB1aW50MzJfdCBfcG9zaXRpb247CisgIHVpbnQzMl90IF9jYXBhY2l0eTsKK3B1YmxpYzoKKyAgT3V0cHV0QnVmZmVyKCkKKyAgICAgIDogX2J1ZmYoTlVMTCksIF9wb3NpdGlvbigwKSwgX2NhcGFjaXR5KDApIHsKKyAgfQorCisgIE91dHB1dEJ1ZmZlcihjaGFyICogYnVmZiwgdWludDMyX3QgY2FwYWNpdHkpCisgICAgICA6IF9idWZmKGJ1ZmYpLCBfcG9zaXRpb24oMCksIF9jYXBhY2l0eShjYXBhY2l0eSkgeworICB9CisKKyAgdmlydHVhbCB+T3V0cHV0QnVmZmVyKCkgeworICB9CisKKyAgdmlydHVhbCB1aW50NjRfdCB0ZWxsKCkgeworICAgIHJldHVybiBfcG9zaXRpb247CisgIH0KKworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBfcG9zaXRpb24gPSAwOworICB9CisKKyAgdm9pZCByZXNldChjaGFyICogYnVmZiwgdWludDMyX3QgY2FwYWNpdHkpIHsKKyAgICBfYnVmZiA9IGJ1ZmY7CisgICAgX3Bvc2l0aW9uID0gMDsKKyAgICBfY2FwYWNpdHkgPSBjYXBhY2l0eTsKKyAgfQorCisgIHN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgcmV0dXJuIHN0cmluZyhfYnVmZiwgX3Bvc2l0aW9uKTsKKyAgfQorfTsKKworY2xhc3MgT3V0cHV0U3RyaW5nU3RyZWFtIDogcHVibGljIE91dHB1dFN0cmVhbSB7Citwcm90ZWN0ZWQ6CisgIHN0cmluZyAqIF9kZXN0OworcHVibGljOgorICBPdXRwdXRTdHJpbmdTdHJlYW0oKQorICAgICAgOiBfZGVzdChOVUxMKSB7CisgIH0KKworICBPdXRwdXRTdHJpbmdTdHJlYW0oc3RyaW5nICYgZGVzdCkKKyAgICAgIDogX2Rlc3QoJmRlc3QpIHsKKyAgfQorICB2aXJ0dWFsIH5PdXRwdXRTdHJpbmdTdHJlYW0oKSB7CisgIH0KKworICB2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKSB7CisgICAgcmV0dXJuIF9kZXN0LT5sZW5ndGgoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgX2Rlc3QtPmFwcGVuZCgoY29uc3QgY2hhciAqKWJ1ZmYsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlc2V0KHN0cmluZyAqIGRlc3QpIHsKKyAgICBfZGVzdCA9IGRlc3Q7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIF9kZXN0LT5jbGVhcigpOworICB9CisKKyAgc3RyaW5nIGdldFN0cmluZygpIHsKKyAgICByZXR1cm4gKl9kZXN0OworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBCVUZGRVJTVFJFQU1fSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0J1ZmZlcnMuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MGFiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJzLmNjCkBAIC0wLDAgKzEsMjM1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAidXRpbC9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAidXRpbC9Xcml0YWJsZVV0aWxzLmgiCisjaW5jbHVkZSAibGliL0J1ZmZlcnMuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCisKK1JlYWRCdWZmZXI6OlJlYWRCdWZmZXIoKQorICAgIDogX2J1ZmYoTlVMTCksIF9yZW1haW4oMCksIF9zaXplKDApLCBfY2FwYWNpdHkoMCksIF9zdHJlYW0oTlVMTCksIF9zb3VyY2UoTlVMTCkgeworfQorCit2b2lkIFJlYWRCdWZmZXI6OmluaXQodWludDMyX3Qgc2l6ZSwgSW5wdXRTdHJlYW0gKiBzdHJlYW0sIGNvbnN0IHN0cmluZyAmIGNvZGVjKSB7CisgIGlmIChzaXplIDwgMTAyNCkgeworICAgIFRIUk9XX0VYQ0VQVElPTl9FWChVbnN1cHBvcnRFeGNlcHRpb24sICJSZWFkQnVmZmVyIHNpemUgJXUgbm90IHN1cHBvcnQuIiwgc2l6ZSk7CisgIH0KKyAgX2J1ZmYgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKKyAgaWYgKE5VTEwgPT0gX2J1ZmYpIHsKKyAgICBUSFJPV19FWENFUFRJT04oT3V0T2ZNZW1vcnlFeGNlcHRpb24sICJjcmVhdGUgYXBwZW5kIGJ1ZmZlciIpOworICB9CisgIF9jYXBhY2l0eSA9IHNpemU7CisgIF9yZW1haW4gPSAwOworICBfc2l6ZSA9IDA7CisgIF9zdHJlYW0gPSBzdHJlYW07CisgIF9zb3VyY2UgPSBfc3RyZWFtOworICBpZiAoY29kZWMubGVuZ3RoKCkgPiAwKSB7CisgICAgaWYgKCFDb21wcmVzc2lvbnM6OnN1cHBvcnQoY29kZWMpKSB7CisgICAgICBUSFJPV19FWENFUFRJT04oVW5zdXBwb3J0RXhjZXB0aW9uLCAiY29tcHJlc3Npb24gY29kZWMgbm90IHN1cHBvcnQiKTsKKyAgICB9CisgICAgX3NvdXJjZSA9IENvbXByZXNzaW9uczo6Z2V0RGVjb21wcmVzc2lvblN0cmVhbShjb2RlYywgX3N0cmVhbSwgc2l6ZSk7CisgIH0KK30KKworUmVhZEJ1ZmZlcjo6flJlYWRCdWZmZXIoKSB7CisgIGlmIChfc291cmNlICE9IF9zdHJlYW0pIHsKKyAgICBkZWxldGUgX3NvdXJjZTsKKyAgICBfc291cmNlID0gTlVMTDsKKyAgfQorICBpZiAoTlVMTCAhPSBfYnVmZikgeworICAgIGZyZWUoX2J1ZmYpOworICAgIF9idWZmID0gTlVMTDsKKyAgICBfY2FwYWNpdHkgPSAwOworICAgIF9yZW1haW4gPSAwOworICAgIF9zaXplID0gMDsKKyAgfQorfQorCitjaGFyICogUmVhZEJ1ZmZlcjo6ZmlsbEdldCh1aW50MzJfdCBjb3VudCkgeworCisgIGlmICh1bmxpa2VseShjb3VudCA+IF9jYXBhY2l0eSkpIHsKKyAgICB1aW50MzJfdCBuZXdjYXAgPSBfY2FwYWNpdHkgKiAyID4gY291bnQgPyBfY2FwYWNpdHkgKiAyIDogY291bnQ7CisgICAgY2hhciAqIG5ld2J1ZmYgPSAoY2hhciopbWFsbG9jKG5ld2NhcCk7CisKKworICAgIGlmIChuZXdidWZmID09IE5VTEwpIHsKKyAgICAgIFRIUk9XX0VYQ0VQVElPTihPdXRPZk1lbW9yeUV4Y2VwdGlvbiwKKyAgICAgICAgICBTdHJpbmdVdGlsOjpGb3JtYXQoImJ1ZmYgcmVhbGxvYyBmYWlsZWQsIHNpemU9JXUiLCBuZXdjYXApKTsKKyAgICB9CisKKyAgICBpZiAoX3JlbWFpbiA+IDApIHsKKyAgICAgIG1lbWNweShuZXdidWZmLCBjdXJyZW50KCksIF9yZW1haW4pOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBfYnVmZikgeworICAgICAgZnJlZShfYnVmZik7CisgICAgfQorCisgICAgX2J1ZmYgPSBuZXdidWZmOworICAgIF9jYXBhY2l0eSA9IG5ld2NhcDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoX3JlbWFpbiA+IDApIHsKKyAgICAgIG1lbW1vdmUoX2J1ZmYsIGN1cnJlbnQoKSwgX3JlbWFpbik7CisgICAgfQorICB9CisgIF9zaXplID0gX3JlbWFpbjsKKyAgd2hpbGUgKF9yZW1haW4gPCBjb3VudCkgeworICAgIGludDMyX3QgcmQgPSBfc291cmNlLT5yZWFkKF9idWZmICsgX3NpemUsIF9jYXBhY2l0eSAtIF9zaXplKTsKKyAgICBpZiAocmQgPD0gMCkgeworICAgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAicmVhZCByZWFjaCBFT0YiKTsKKyAgICB9CisgICAgX3JlbWFpbiArPSByZDsKKyAgICBfc2l6ZSArPSByZDsKKyAgfQorICBjaGFyICogcmV0ID0gY3VycmVudCgpOworICBfcmVtYWluIC09IGNvdW50OworICByZXR1cm4gcmV0OworfQorCitpbnQzMl90IFJlYWRCdWZmZXI6OmZpbGxSZWFkKGNoYXIgKiBidWZmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgY3AgPSBfcmVtYWluOworICBpZiAoY3AgPiAwKSB7CisgICAgbWVtY3B5KGJ1ZmYsIGN1cnJlbnQoKSwgY3ApOworICAgIF9yZW1haW4gPSAwOworICB9CisgIC8vIFRPRE86IHJlYWQgdG8gYnVmZmVyIGZpcnN0CisgIGludDMyX3QgcmV0ID0gX3NvdXJjZS0+cmVhZEZ1bGx5KGJ1ZmYgKyBjcCwgbGVuIC0gY3ApOworICBpZiAocmV0IDwgMCAmJiBjcCA9PSAwKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmV0IDwgMCA/IGNwIDogcmV0ICsgY3A7CisgIH0KK30KKworaW50NjRfdCBSZWFkQnVmZmVyOjpmaWxsUmVhZFZMb25nKCkgeworICBpZiAoX3JlbWFpbiA9PSAwKSB7CisgICAgaW50MzJfdCByZCA9IF9zb3VyY2UtPnJlYWQoX2J1ZmYsIF9jYXBhY2l0eSk7CisgICAgaWYgKHJkIDw9IDApIHsKKyAgICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImZpbGxSZWFkVkxvbmcgcmVhY2ggRU9GIik7CisgICAgfQorICAgIF9yZW1haW4gPSByZDsKKyAgICBfc2l6ZSA9IHJkOworICB9CisgIGludDhfdCAqIHBvcyA9IChpbnQ4X3QqKWN1cnJlbnQoKTsKKyAgaWYgKCpwb3MgPj0gLTExMikgeworICAgIF9yZW1haW4tLTsKKyAgICByZXR1cm4gKGludDY0X3QpKnBvczsKKyAgfQorICBib29sIG5lZyA9ICpwb3MgPCAtMTIwOworICB1aW50MzJfdCBsZW4gPSBuZWcgPyAoLTExOSAtICpwb3MpIDogKC0xMTEgLSAqcG9zKTsKKyAgcG9zID0gKGludDhfdCopZ2V0KGxlbik7CisgIGNvbnN0IGludDhfdCAqIGVuZCA9IHBvcyArIGxlbjsKKyAgdWludDY0X3QgdmFsdWUgPSAwOworICB3aGlsZSAoKytwb3MgPCBlbmQpIHsKKyAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICoodWludDhfdCopcG9zOworICB9CisgIHJldHVybiBuZWcgPyAodmFsdWUgXiAtMUxMKSA6IHZhbHVlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBcHBlbmRCdWZmZXI6OkFwcGVuZEJ1ZmZlcigpCisgICAgOiBfYnVmZihOVUxMKSwgX3JlbWFpbigwKSwgX2NhcGFjaXR5KDApLCBfY291bnRlcigwKSwgX3N0cmVhbShOVUxMKSwgX2Rlc3QoTlVMTCksCisgICAgICAgIF9jb21wcmVzc2lvbihmYWxzZSkgeworfQorCit2b2lkIEFwcGVuZEJ1ZmZlcjo6aW5pdCh1aW50MzJfdCBzaXplLCBPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIGNvbnN0IHN0cmluZyAmIGNvZGVjKSB7CisgIGlmIChzaXplIDwgMTAyNCkgeworICAgIFRIUk9XX0VYQ0VQVElPTl9FWChVbnN1cHBvcnRFeGNlcHRpb24sICJBcHBlbmRCdWZmZXIgc2l6ZSAldSBub3Qgc3VwcG9ydC4iLCBzaXplKTsKKyAgfQorICBfYnVmZiA9IChjaGFyICopbWFsbG9jKHNpemUgKyA4KTsKKyAgaWYgKE5VTEwgPT0gX2J1ZmYpIHsKKyAgICBUSFJPV19FWENFUFRJT04oT3V0T2ZNZW1vcnlFeGNlcHRpb24sICJjcmVhdGUgYXBwZW5kIGJ1ZmZlciIpOworICB9CisgIF9jYXBhY2l0eSA9IHNpemU7CisgIF9yZW1haW4gPSBfY2FwYWNpdHk7CisgIF9zdHJlYW0gPSBzdHJlYW07CisgIF9kZXN0ID0gX3N0cmVhbTsKKyAgaWYgKGNvZGVjLmxlbmd0aCgpID4gMCkgeworICAgIGlmICghQ29tcHJlc3Npb25zOjpzdXBwb3J0KGNvZGVjKSkgeworICAgICAgVEhST1dfRVhDRVBUSU9OKFVuc3VwcG9ydEV4Y2VwdGlvbiwgImNvbXByZXNzaW9uIGNvZGVjIG5vdCBzdXBwb3J0Iik7CisgICAgfQorICAgIF9kZXN0ID0gQ29tcHJlc3Npb25zOjpnZXRDb21wcmVzc2lvblN0cmVhbShjb2RlYywgX3N0cmVhbSwgc2l6ZSk7CisgICAgX2NvbXByZXNzaW9uID0gdHJ1ZTsKKyAgfQorfQorCitDb21wcmVzc1N0cmVhbSAqIEFwcGVuZEJ1ZmZlcjo6Z2V0Q29tcHJlc3Npb25TdHJlYW0oKSB7CisgIGlmIChfY29tcHJlc3Npb24pIHsKKyAgICByZXR1cm4gKENvbXByZXNzU3RyZWFtICopX2Rlc3Q7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworQXBwZW5kQnVmZmVyOjp+QXBwZW5kQnVmZmVyKCkgeworICBpZiAoX2Rlc3QgIT0gX3N0cmVhbSkgeworICAgIGRlbGV0ZSBfZGVzdDsKKyAgICBfZGVzdCA9IE5VTEw7CisgIH0KKyAgaWYgKE5VTEwgIT0gX2J1ZmYpIHsKKyAgICBmcmVlKF9idWZmKTsKKyAgICBfYnVmZiA9IE5VTEw7CisgICAgX3JlbWFpbiA9IDA7CisgICAgX2NhcGFjaXR5ID0gMDsKKyAgfQorfQorCit2b2lkIEFwcGVuZEJ1ZmZlcjo6Zmx1c2hkKCkgeworICBfZGVzdC0+d3JpdGUoX2J1ZmYsIF9jYXBhY2l0eSAtIF9yZW1haW4pOworICBfY291bnRlciArPSBfY2FwYWNpdHkgLSBfcmVtYWluOworICBfcmVtYWluID0gX2NhcGFjaXR5OworfQorCit2b2lkIEFwcGVuZEJ1ZmZlcjo6d3JpdGVfaW5uZXIoY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IGxlbikgeworICBmbHVzaGQoKTsKKyAgaWYgKGxlbiA+PSBfY2FwYWNpdHkgLyAyKSB7CisgICAgX2Rlc3QtPndyaXRlKGRhdGEsIGxlbik7CisgICAgX2NvdW50ZXIgKz0gbGVuOworICB9IGVsc2UgeworICAgIHNpbXBsZV9tZW1jcHkoX2J1ZmYsIGRhdGEsIGxlbik7CisgICAgX3JlbWFpbiAtPSBsZW47CisgIH0KK30KKwordm9pZCBBcHBlbmRCdWZmZXI6OndyaXRlX3Zsb25nX2lubmVyKGludDY0X3QgdikgeworICBpZiAoX3JlbWFpbiA8IDkpIHsKKyAgICBmbHVzaGQoKTsKKyAgfQorICB1aW50MzJfdCBsZW47CisgIFdyaXRhYmxlVXRpbHM6OldyaXRlVkxvbmcodiwgY3VycmVudCgpLCBsZW4pOworICBfcmVtYWluIC09IGxlbjsKK30KKwordm9pZCBBcHBlbmRCdWZmZXI6OndyaXRlX3Z1aW50Ml9pbm5lcih1aW50MzJfdCB2MSwgdWludDMyX3QgdjIpIHsKKyAgaWYgKF9yZW1haW4gPCAxMCkgeworICAgIGZsdXNoZCgpOworICB9CisgIHVpbnQzMl90IGxlbjsKKyAgV3JpdGFibGVVdGlsczo6V3JpdGVWTG9uZyh2MSwgY3VycmVudCgpLCBsZW4pOworICBfcmVtYWluIC09IGxlbjsKKyAgV3JpdGFibGVVdGlsczo6V3JpdGVWTG9uZyh2MiwgY3VycmVudCgpLCBsZW4pOworICBfcmVtYWluIC09IGxlbjsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJzLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9CdWZmZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjZDU0NQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0J1ZmZlcnMuaApAQCAtMCwwICsxLDYzNyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQlVGRkVSU19IXworI2RlZmluZSBCVUZGRVJTX0hfCisKKyNpbmNsdWRlICJsaWIvU3RyZWFtcy5oIgorI2luY2x1ZGUgImxpYi9Db21wcmVzc2lvbnMuaCIKKyNpbmNsdWRlICJsaWIvQ29uc3RhbnRzLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworCisvKioKKyAqIEEgbGlnaHR3ZWlnaHQgcmVhZCBidWZmZXIsIGFjdCBhcyBidWZmZXJlZCBpbnB1dCBzdHJlYW0KKyAqLworY2xhc3MgUmVhZEJ1ZmZlciB7Citwcm90ZWN0ZWQ6CisgIGNoYXIgKiBfYnVmZjsKKyAgdWludDMyX3QgX3JlbWFpbjsKKyAgdWludDMyX3QgX3NpemU7CisgIHVpbnQzMl90IF9jYXBhY2l0eTsKKworICBJbnB1dFN0cmVhbSAqIF9zdHJlYW07CisgIElucHV0U3RyZWFtICogX3NvdXJjZTsKKworcHJvdGVjdGVkOgorICBpbmxpbmUgY2hhciAqIGN1cnJlbnQoKSB7CisgICAgcmV0dXJuIF9idWZmICsgX3NpemUgLSBfcmVtYWluOworICB9CisKKyAgY2hhciAqIGZpbGxHZXQodWludDMyX3QgY291bnQpOworICBpbnQzMl90IGZpbGxSZWFkKGNoYXIgKiBidWZmLCB1aW50MzJfdCBsZW4pOworICBpbnQ2NF90IGZpbGxSZWFkVkxvbmcoKTsKK3B1YmxpYzoKKyAgUmVhZEJ1ZmZlcigpOworCisgIHZvaWQgaW5pdCh1aW50MzJfdCBzaXplLCBJbnB1dFN0cmVhbSAqIHN0cmVhbSwgY29uc3Qgc3RyaW5nICYgY29kZWMpOworCisgIH5SZWFkQnVmZmVyKCk7CisKKyAgLyoqCisgICAqIHVzZSBnZXQoKSB0byBnZXQgaW5wbGFjZSBjb250aW51b3VzIG1lbW9yeSBvZiBzbWFsbCBvYmplY3QKKyAgICovCisgIGlubGluZSBjaGFyICogZ2V0KHVpbnQzMl90IGNvdW50KSB7CisgICAgaWYgKGxpa2VseShjb3VudCA8PSBfcmVtYWluKSkgeworICAgICAgY2hhciAqIHJldCA9IGN1cnJlbnQoKTsKKyAgICAgIF9yZW1haW4gLT0gY291bnQ7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gZmlsbEdldChjb3VudCk7CisgIH0KKworICAvKioKKyAgICogcmVhZCB0byBvdXRzaWRlIGJ1ZmZlcgorICAgKi8KKyAgaW5saW5lIGludDMyX3QgcmVhZChjaGFyICogYnVmZiwgdWludDMyX3QgbGVuKSB7CisgICAgaWYgKGxpa2VseShsZW4gPD0gX3JlbWFpbikpIHsKKyAgICAgIG1lbWNweShidWZmLCBjdXJyZW50KCksIGxlbik7CisgICAgICBfcmVtYWluIC09IGxlbjsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIHJldHVybiBmaWxsUmVhZChidWZmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIHJlYWQgdG8gb3V0c2lkZSBidWZmZXIsIHVzZSBzaW1wbGVfbWVtY3B5CisgICAqLworICBpbmxpbmUgdm9pZCByZWFkVW5zYWZlKGNoYXIgKiBidWZmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBpZiAobGlrZWx5KGxlbiA8PSBfcmVtYWluKSkgeworICAgICAgc2ltcGxlX21lbWNweShidWZmLCBjdXJyZW50KCksIGxlbik7CisgICAgICBfcmVtYWluIC09IGxlbjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbFJlYWQoYnVmZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiByZWFkIFZVSW50CisgICAqLworICBpbmxpbmUgaW50NjRfdCByZWFkVkxvbmcoKSB7CisgICAgaWYgKGxpa2VseShfcmVtYWluID4gMCkpIHsKKyAgICAgIGNoYXIgKiBtYXJrID0gY3VycmVudCgpOworICAgICAgaWYgKCooaW50OF90KiltYXJrID49IChpbnQ4X3QpLTExMikgeworICAgICAgICBfcmVtYWluLS07CisgICAgICAgIHJldHVybiAoaW50NjRfdCkqbWFyazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpbGxSZWFkVkxvbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiByZWFkIHVpbnQzMl90IGxpdHRsZSBlbmRpYW4KKyAgICovCisgIGlubGluZSB1aW50MzJfdCByZWFkX3VpbnQzMl9sZSgpIHsKKyAgICByZXR1cm4gKih1aW50MzJfdCopZ2V0KDQpOworICB9CisKKyAgLyoqCisgICAqIHJlYWQgdWludDMyX3QgYmlnIGVuZGlhbgorICAgKi8KKyAgaW5saW5lIHVpbnQzMl90IHJlYWRfdWludDMyX2JlKCkgeworICAgIHJldHVybiBic3dhcChyZWFkX3VpbnQzMl9sZSgpKTsKKyAgfQorfTsKKworLyoqCisgKiBBIGxpZ2h0IHdlaWdodGVkIGFwcGVuZCBidWZmZXIsIHVzZWQgYXMgYnVmZmVyZWQgb3V0cHV0IHN0cmVhbXMKKyAqLworY2xhc3MgQXBwZW5kQnVmZmVyIHsKK3Byb3RlY3RlZDoKKyAgY2hhciAqIF9idWZmOworICB1aW50MzJfdCBfcmVtYWluOworICB1aW50MzJfdCBfY2FwYWNpdHk7CisgIHVpbnQ2NF90IF9jb3VudGVyOworCisgIE91dHB1dFN0cmVhbSAqIF9zdHJlYW07CisgIE91dHB1dFN0cmVhbSAqIF9kZXN0OworICBib29sIF9jb21wcmVzc2lvbjsKKworcHJvdGVjdGVkOgorICB2b2lkIGZsdXNoZCgpOworCisgIGlubGluZSBjaGFyICogY3VycmVudCgpIHsKKyAgICByZXR1cm4gX2J1ZmYgKyBfY2FwYWNpdHkgLSBfcmVtYWluOworICB9CisKKyAgdm9pZCB3cml0ZV9pbm5lcihjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCB3cml0ZV92bG9uZ19pbm5lcihpbnQ2NF90IHYpOworICB2b2lkIHdyaXRlX3Z1aW50Ml9pbm5lcih1aW50MzJfdCB2MSwgdWludDMyX3QgdjIpOworcHVibGljOgorICBBcHBlbmRCdWZmZXIoKTsKKworICB+QXBwZW5kQnVmZmVyKCk7CisKKyAgdm9pZCBpbml0KHVpbnQzMl90IHNpemUsIE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgY29uc3Qgc3RyaW5nICYgY29kZWMpOworCisgIENvbXByZXNzU3RyZWFtICogZ2V0Q29tcHJlc3Npb25TdHJlYW0oKTsKKworICB1aW50NjRfdCBnZXRDb3VudGVyKCkgeworICAgIHJldHVybiBfY291bnRlcjsKKyAgfQorCisgIGlubGluZSBjaGFyICogYm9ycm93VW5zYWZlKHVpbnQzMl90IGxlbikgeworICAgIGlmIChsaWtlbHkoX3JlbWFpbiA+PSBsZW4pKSB7CisgICAgICByZXR1cm4gY3VycmVudCgpOworICAgIH0KKyAgICBpZiAobGlrZWx5KF9jYXBhY2l0eSA+PSBsZW4pKSB7CisgICAgICBmbHVzaGQoKTsKKyAgICAgIHJldHVybiBfYnVmZjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpbmxpbmUgdm9pZCB1c2VVbnNhZmUodWludDMyX3QgY291bnQpIHsKKyAgICBfcmVtYWluIC09IGNvdW50OworICB9CisKKyAgaW5saW5lIHZvaWQgd3JpdGUoY2hhciBjKSB7CisgICAgaWYgKHVubGlrZWx5KF9yZW1haW4gPT0gMCkpIHsKKyAgICAgIGZsdXNoZCgpOworICAgIH0KKyAgICAqY3VycmVudCgpID0gYzsKKyAgICBfcmVtYWluLS07CisgIH0KKworICBpbmxpbmUgdm9pZCB3cml0ZShjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3QgbGVuKSB7CisgICAgaWYgKGxpa2VseShsZW4gPD0gX3JlbWFpbikpIHsgLy8gYXBwZW5kIGRpcmVjdGx5CisgICAgICBzaW1wbGVfbWVtY3B5KGN1cnJlbnQoKSwgZGF0YSwgbGVuKTsKKyAgICAgIF9yZW1haW4gLT0gbGVuOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3cml0ZV9pbm5lcihkYXRhLCBsZW4pOworICB9CisKKyAgaW5saW5lIHZvaWQgd3JpdGVfdWludDMyX2xlKHVpbnQzMl90IHYpIHsKKyAgICBpZiAodW5saWtlbHkoNCA+IF9yZW1haW4pKSB7CisgICAgICBmbHVzaGQoKTsKKyAgICB9CisgICAgKih1aW50MzJfdCopY3VycmVudCgpID0gdjsKKyAgICBfcmVtYWluIC09IDQ7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5saW5lIHZvaWQgd3JpdGVfdWludDMyX2JlKHVpbnQzMl90IHYpIHsKKyAgICB3cml0ZV91aW50MzJfbGUoYnN3YXAodikpOworICB9CisKKyAgaW5saW5lIHZvaWQgd3JpdGVfdWludDY0X2xlKHVpbnQ2NF90IHYpIHsKKyAgICBpZiAodW5saWtlbHkoOCA+IF9yZW1haW4pKSB7CisgICAgICBmbHVzaGQoKTsKKyAgICB9CisgICAgKih1aW50NjRfdCopY3VycmVudCgpID0gdjsKKyAgICBfcmVtYWluIC09IDg7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5saW5lIHZvaWQgd3JpdGVfdWludDY0X2JlKHVpbnQ2NF90IHYpIHsKKyAgICB3cml0ZV91aW50NjRfbGUoYnN3YXA2NCh2KSk7CisgIH0KKworICBpbmxpbmUgdm9pZCB3cml0ZV92bG9uZyhpbnQ2NF90IHYpIHsKKyAgICBpZiAobGlrZWx5KF9yZW1haW4gPiAwICYmIHYgPD0gMTI3ICYmIHYgPj0gLTExMikpIHsKKyAgICAgICooY2hhciopY3VycmVudCgpID0gKGNoYXIpdjsKKyAgICAgIF9yZW1haW4tLTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd3JpdGVfdmxvbmdfaW5uZXIodik7CisgIH0KKworICBpbmxpbmUgdm9pZCB3cml0ZV92dWludCh1aW50MzJfdCB2KSB7CisgICAgaWYgKGxpa2VseShfcmVtYWluID4gMCAmJiB2IDw9IDEyNykpIHsKKyAgICAgICooY2hhciopY3VycmVudCgpID0gKGNoYXIpdjsKKyAgICAgIF9yZW1haW4tLTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd3JpdGVfdmxvbmdfaW5uZXIodik7CisgIH0KKworICBpbmxpbmUgdm9pZCB3cml0ZV92dWludDIodWludDMyX3QgdjEsIHVpbnQzMl90IHYyKSB7CisgICAgaWYgKGxpa2VseShfcmVtYWluID49IDIgJiYgdjEgPD0gMTI3ICYmIHYyIDw9IDEyNykpIHsKKyAgICAgICooY2hhciopY3VycmVudCgpID0gKGNoYXIpdjE7CisgICAgICAqKGNoYXIqKShjdXJyZW50KCkgKyAxKSA9IChjaGFyKXYyOworICAgICAgX3JlbWFpbiAtPSAyOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3cml0ZV92dWludDJfaW5uZXIodjEsIHYyKTsKKyAgfQorCisgIC8qKgorICAgKiBmbHVzaCBjdXJyZW50IGJ1ZmZlciwgY2xlYXIgY29udGVudAorICAgKi8KKyAgaW5saW5lIHZvaWQgZmx1c2goKSB7CisgICAgaWYgKF9yZW1haW4gPCBfY2FwYWNpdHkpIHsKKyAgICAgIGZsdXNoZCgpOworICAgIH0KKyAgfQorfTsKKworLyoqCisgKiBNZW1vcnkgS2V5LVZhbHVlIGJ1ZmZlciBwYWlyIHdpdGggZGlyZWN0IGFkZHJlc3MgY29udGVudCwgc28gY2FuIGJlCisgKiBlYXNpbHkgY29waWVkIG9yIGR1bXBlZCB0byBmaWxlCisgKi8KK3N0cnVjdCBLVkJ1ZmZlciB7CisgIHVpbnQzMl90IGtleUxlbmd0aDsKKyAgdWludDMyX3QgdmFsdWVMZW5ndGg7CisgIGNoYXIgY29udGVudFsxXTsKKworICBjaGFyICogZ2V0S2V5KCkgeworICAgIHJldHVybiBjb250ZW50OworICB9CisKKyAgY2hhciAqIGdldFZhbHVlKCkgeworICAgIHJldHVybiBjb250ZW50ICsga2V5TGVuZ3RoOworICB9CisKKyAgS1ZCdWZmZXIgKiBuZXh0KCkgeworICAgIHJldHVybiAoKEtWQnVmZmVyKikoY29udGVudCArIGtleUxlbmd0aCArIHZhbHVlTGVuZ3RoKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyBzdHIoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGNvbnRlbnQsIGtleUxlbmd0aCkgKyAiXHQiICsgc3RkOjpzdHJpbmcoZ2V0VmFsdWUoKSwgdmFsdWVMZW5ndGgpOworICB9CisKKyAgdWludDMyX3QgbGVuZ3RoKCkgeworICAgIHJldHVybiBrZXlMZW5ndGggKyB2YWx1ZUxlbmd0aCArIFNJWkVfT0ZfS0VZX0xFTkdUSCArIFNJWkVfT0ZfVkFMVUVfTEVOR1RIOworICB9CisKKyAgdWludDMyX3QgbGVuZ3RoQ29udmVydEVuZGl1bSgpIHsKKyAgICBsb25nIHZhbHVlID0gYnN3YXA2NCgqKChsb25nICopdGhpcykpOworICAgIHJldHVybiAodmFsdWUgPj4gMzIpICsgdmFsdWUgKyBTSVpFX09GX0tFWV9MRU5HVEggKyBTSVpFX09GX1ZBTFVFX0xFTkdUSDsKKyAgfQorCisgIHZvaWQgZmlsbChjb25zdCB2b2lkICoga2V5LCB1aW50MzJfdCBrZXlsZW4sIGNvbnN0IHZvaWQgKiB2YWx1ZSwgdWludDMyX3QgdmFsbGVuKSB7CisgICAga2V5TGVuZ3RoID0ga2V5bGVuOworICAgIHZhbHVlTGVuZ3RoID0gdmFsbGVuOworCisgICAgaWYgKGtleWxlbiA+IDApIHsKKyAgICAgIHNpbXBsZV9tZW1jcHkoZ2V0S2V5KCksIGtleSwga2V5bGVuKTsKKyAgICB9CisgICAgaWYgKHZhbGxlbiA+IDApIHsKKyAgICAgIHNpbXBsZV9tZW1jcHkoZ2V0VmFsdWUoKSwgdmFsdWUsIHZhbGxlbik7CisgICAgfQorICB9CisKKyAgc3RhdGljIHVpbnQzMl90IGhlYWRlckxlbmd0aCgpIHsKKyAgICByZXR1cm4gU0laRV9PRl9LRVlfTEVOR1RIICsgU0laRV9PRl9WQUxVRV9MRU5HVEg7CisgIH0KK307CisKK3N0cnVjdCBLVkJ1ZmZlcldpdGhQYXJpdGl0aW9uSWQgeworICB1aW50MzJfdCBwYXJ0aXRpb25JZDsKKyAgS1ZCdWZmZXIgYnVmZmVyOworCisgIGlubGluZSBzdGF0aWMgdWludDMyX3QgbWluTGVuZ3RoKCkgeworICAgIHJldHVybiBTSVpFX09GX1BBUlRJVElPTl9MRU5HVEggKyBTSVpFX09GX0tWX0xFTkdUSDsKKyAgfQorCisgIGludCBsZW5ndGgoKSB7CisgICAgcmV0dXJuIDQgKyBidWZmZXIubGVuZ3RoKCk7CisgIH0KKworICBpbnQgbGVuZ3RoQ29udmVydEVuZGl1bSgpIHsKKyAgICByZXR1cm4gNCArIGJ1ZmZlci5sZW5ndGhDb252ZXJ0RW5kaXVtKCk7CisgIH0KK307CisKKy8qKgorICogTmF0aXZlIHNpZGUgYWJzdHJhY3Rpb24gb2YgamF2YSBCeXRlQnVmZmVyCisgKi8KK2NsYXNzIEJ5dGVCdWZmZXIgeworcHJpdmF0ZToKKyAgY2hhciAqIF9idWZmOworICB1aW50MzJfdCBfbGltaXQ7CisgIHVpbnQzMl90IF9wb3NpdGlvbjsKKyAgdWludDMyX3QgX2NhcGFjaXR5OworCitwdWJsaWM6CisgIEJ5dGVCdWZmZXIoKQorICAgICAgOiBfYnVmZihOVUxMKSwgX2xpbWl0KDApLCBfcG9zaXRpb24oMCksIF9jYXBhY2l0eSgwKSB7CisgIH0KKworICB+Qnl0ZUJ1ZmZlcigpIHsKKyAgfQorCisgIHZvaWQgcmVzZXQoY2hhciAqIGJ1ZmYsIHVpbnQzMl90IGlucHV0Q2FwYWNpdHkpIHsKKyAgICB0aGlzLT5fYnVmZiA9IGJ1ZmY7CisgICAgdGhpcy0+X2NhcGFjaXR5ID0gaW5wdXRDYXBhY2l0eTsKKyAgICB0aGlzLT5fcG9zaXRpb24gPSAwOworICAgIHRoaXMtPl9saW1pdCA9IDA7CisgIH0KKworICBpbnQgY2FwYWNpdHkoKSB7CisgICAgcmV0dXJuIHRoaXMtPl9jYXBhY2l0eTsKKyAgfQorCisgIGludCByZW1haW4oKSB7CisgICAgcmV0dXJuIF9saW1pdCAtIF9wb3NpdGlvbjsKKyAgfQorCisgIGludCBsaW1pdCgpIHsKKyAgICByZXR1cm4gX2xpbWl0OworICB9CisKKyAgaW50IGFkdmFuY2UoaW50IHBvc2l0aW9uT2Zmc2V0KSB7CisgICAgX3Bvc2l0aW9uICs9IHBvc2l0aW9uT2Zmc2V0OworICAgIHJldHVybiBfcG9zaXRpb247CisgIH0KKworICBpbnQgcG9zaXRpb24oKSB7CisgICAgcmV0dXJuIHRoaXMtPl9wb3NpdGlvbjsKKyAgfQorCisgIHZvaWQgcG9zaXRpb24oaW50IG5ld1BvcykgeworICAgIHRoaXMtPl9wb3NpdGlvbiA9IG5ld1BvczsKKyAgfQorCisgIHZvaWQgcmV3aW5kKGludCBuZXdQb3MsIGludCBuZXdMaW1pdCkgeworICAgIHRoaXMtPl9wb3NpdGlvbiA9IG5ld1BvczsKKyAgICBpZiAobmV3TGltaXQgPCAwIHx8IG5ld0xpbWl0ID4gdGhpcy0+X2NhcGFjaXR5KSB7CisgICAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJsZW5ndGggc21hbGxlciB0aGFuIHplcm8gb3IgbGFyZ2VyIHRoYW4gaW5wdXQgYnVmZmVyIGNhcGFjaXR5Iik7CisgICAgfQorICAgIHRoaXMtPl9saW1pdCA9IG5ld0xpbWl0OworICB9CisKKyAgY2hhciAqIGN1cnJlbnQoKSB7CisgICAgcmV0dXJuIF9idWZmICsgX3Bvc2l0aW9uOworICB9CisKKyAgY2hhciAqIGJhc2UoKSB7CisgICAgcmV0dXJuIF9idWZmOworICB9Cit9OworCitjbGFzcyBCeXRlQXJyYXkgeworcHJpdmF0ZToKKyAgY2hhciAqIF9idWZmOworICB1aW50MzJfdCBfbGVuZ3RoOworICB1aW50MzJfdCBfY2FwYWNpdHk7CisKK3B1YmxpYzoKKyAgQnl0ZUFycmF5KCkKKyAgICAgIDogX2J1ZmYoTlVMTCksIF9sZW5ndGgoMCksIF9jYXBhY2l0eSgwKSB7CisgIH0KKworICB+Qnl0ZUFycmF5KCkgeworICAgIGlmIChOVUxMICE9IF9idWZmKSB7CisgICAgICBkZWxldGVbXSBfYnVmZjsKKyAgICAgIF9idWZmID0gTlVMTDsKKyAgICB9CisgICAgX2xlbmd0aCA9IDA7CisgICAgX2NhcGFjaXR5ID0gMDsKKyAgfQorCisgIHZvaWQgcmVzaXplKHVpbnQzMl90IG5ld1NpemUpIHsKKyAgICBpZiAobmV3U2l6ZSA8PSBfY2FwYWNpdHkpIHsKKyAgICAgIF9sZW5ndGggPSBuZXdTaXplOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoTlVMTCAhPSBfYnVmZikgeworICAgICAgICBkZWxldGVbXSBfYnVmZjsKKyAgICAgICAgX2J1ZmYgPSBOVUxMOworICAgICAgfQorICAgICAgX2NhcGFjaXR5ID0gMiAqIG5ld1NpemU7CisgICAgICBfYnVmZiA9IG5ldyBjaGFyW19jYXBhY2l0eV07CisgICAgICBfbGVuZ3RoID0gbmV3U2l6ZTsKKyAgICB9CisgIH0KKworICBjaGFyICogYnVmZigpIHsKKyAgICByZXR1cm4gX2J1ZmY7CisgIH0KKworICB1aW50MzJfdCBzaXplKCkgeworICAgIHJldHVybiBfbGVuZ3RoOworICB9Cit9OworCitjbGFzcyBGaXhTaXplQ29udGFpbmVyIHsKK3ByaXZhdGU6CisgIGNoYXIgKiBfYnVmZjsKKyAgdWludDMyX3QgX3BvczsKKyAgdWludDMyX3QgX3NpemU7CisKK3B1YmxpYzoKKyAgRml4U2l6ZUNvbnRhaW5lcigpCisgICAgICA6IF9idWZmKE5VTEwpLCBfcG9zKDApLCBfc2l6ZSgwKSB7CisgIH0KKworICB+Rml4U2l6ZUNvbnRhaW5lcigpIHsKKyAgfQorCisgIHZvaWQgd3JhcChjaGFyICogYnVmZiwgdWludDMyX3Qgc2l6ZSkgeworICAgIF9zaXplID0gc2l6ZTsKKyAgICBfYnVmZiA9IGJ1ZmY7CisgICAgX3BvcyA9IDA7CisgIH0KKworICB2b2lkIHJld2luZCgpIHsKKyAgICBfcG9zID0gMDsKKyAgfQorCisgIHVpbnQzMl90IHJlbWFpbigpIHsKKyAgICByZXR1cm4gX3NpemUgLSBfcG9zOworICB9CisKKyAgY2hhciAqIGN1cnJlbnQoKSB7CisgICAgcmV0dXJuIF9idWZmICsgX3BvczsKKyAgfQorCisgIGNoYXIgKiBiYXNlKCkgeworICAgIHJldHVybiBfYnVmZjsKKyAgfQorCisgIHVpbnQzMl90IHNpemUoKSB7CisgICAgcmV0dXJuIF9zaXplOworICB9CisKKyAgLyoqCisgICAqIHJldHVybiB0aGUgbGVuZ3RoIG9mIGFjdHVhbGx5IGZpbGxlZCBkYXRhLgorICAgKi8KKyAgdWludDMyX3QgZmlsbChjb25zdCBjaGFyICogc291cmNlLCB1aW50MzJfdCBtYXhTaXplKSB7CisgICAgaW50IHJlbWFpbiA9IF9zaXplIC0gX3BvczsKKyAgICBpZiAocmVtYWluIDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQzMl90IGxlbmd0aCA9IChtYXhTaXplIDwgcmVtYWluKSA/IG1heFNpemUgOiByZW1haW47CisgICAgc2ltcGxlX21lbWNweShfYnVmZiArIF9wb3MsIHNvdXJjZSwgbGVuZ3RoKTsKKyAgICBfcG9zICs9IGxlbmd0aDsKKyAgICByZXR1cm4gbGVuZ3RoOworICB9CisKKyAgdWludDMyX3QgcG9zaXRpb24oKSB7CisgICAgcmV0dXJuIF9wb3M7CisgIH0KKworICB2b2lkIHBvc2l0aW9uKGludCBwb3MpIHsKKyAgICBfcG9zID0gcG9zOworICB9Cit9OworCitjbGFzcyBSZWFkV3JpdGVCdWZmZXIgeworcHJpdmF0ZToKKworICBzdGF0aWMgY29uc3QgdWludDMyX3QgSU5JVElBTF9MRU5HVEggPSAxNjsKKworICB1aW50MzJfdCBfcmVhZFBvaW50OworICB1aW50MzJfdCBfd3JpdGVQb2ludDsKKyAgY2hhciAqIF9idWZmOworICB1aW50MzJfdCBfYnVmZkxlbmd0aDsKKyAgYm9vbCBfbmV3Q3JlYXRlZEJ1ZmY7CisKK3B1YmxpYzoKKworICBSZWFkV3JpdGVCdWZmZXIodWludDMyX3QgbGVuZ3RoKQorICAgICAgOiBfcmVhZFBvaW50KDApLCBfd3JpdGVQb2ludCgwKSwgX2J1ZmYoTlVMTCksIF9idWZmTGVuZ3RoKDApLCBfbmV3Q3JlYXRlZEJ1ZmYoZmFsc2UpIHsKKyAgICBfYnVmZkxlbmd0aCA9IGxlbmd0aDsKKyAgICBpZiAoX2J1ZmZMZW5ndGggPiAwKSB7CisgICAgICBfYnVmZiA9IG5ldyBjaGFyW19idWZmTGVuZ3RoXTsKKyAgICAgIF9uZXdDcmVhdGVkQnVmZiA9IHRydWU7CisgICAgfQorICB9CisKKyAgUmVhZFdyaXRlQnVmZmVyKCkKKyAgICAgIDogX3JlYWRQb2ludCgwKSwgX3dyaXRlUG9pbnQoMCksIF9idWZmKE5VTEwpLCBfYnVmZkxlbmd0aCgwKSwgX25ld0NyZWF0ZWRCdWZmKGZhbHNlKSB7CisgIH0KKworICB+UmVhZFdyaXRlQnVmZmVyKCkgeworICAgIGlmIChfbmV3Q3JlYXRlZEJ1ZmYpIHsKKyAgICAgIGRlbGV0ZVtdIF9idWZmOworICAgICAgX2J1ZmYgPSBOVUxMOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0UmVhZFBvaW50KHVpbnQzMl90IHBvcykgeworICAgIF9yZWFkUG9pbnQgPSBwb3M7CisgIH0KKworICB2b2lkIHNldFdyaXRlUG9pbnQodWludDMyX3QgcG9zKSB7CisgICAgX3dyaXRlUG9pbnQgPSBwb3M7CisgIH0KKworICBjaGFyICogZ2V0QnVmZigpIHsKKyAgICByZXR1cm4gX2J1ZmY7CisgIH0KKworICB1aW50MzJfdCBnZXRXcml0ZVBvaW50KCkgeworICAgIHJldHVybiBfd3JpdGVQb2ludDsKKyAgfQorCisgIHVpbnQzMl90IGdldFJlYWRQb2ludCgpIHsKKyAgICByZXR1cm4gX3JlYWRQb2ludDsKKyAgfQorCisgIHZvaWQgd3JpdGVJbnQodWludDMyX3QgcGFyYW0pIHsKKyAgICB1aW50MzJfdCB3cml0dGVuID0gcGFyYW07CisKKyAgICBjaGVja1dyaXRlU3BhY2VBbmRSZXNpemVJZk5lY2Vzc2FyeSg0KTsKKyAgICAqKCh1aW50MzJfdCAqKShfYnVmZiArIF93cml0ZVBvaW50KSkgPSB3cml0dGVuOworICAgIF93cml0ZVBvaW50ICs9IDQ7CisgIH0KKworICB2b2lkIHdyaXRlTG9uZyh1aW50NjRfdCBwYXJhbSkgeworICAgIHVpbnQ2NF90IHdyaXR0ZW4gPSBwYXJhbTsKKworICAgIGNoZWNrV3JpdGVTcGFjZUFuZFJlc2l6ZUlmTmVjZXNzYXJ5KDgpOworICAgICooKHVpbnQ2NF90ICopKF9idWZmICsgX3dyaXRlUG9pbnQpKSA9IHdyaXR0ZW47CisgICAgX3dyaXRlUG9pbnQgKz0gODsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoY29uc3QgY2hhciAqIHBhcmFtLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICB3cml0ZUludChsZW5ndGgpOworICAgIGNoZWNrV3JpdGVTcGFjZUFuZFJlc2l6ZUlmTmVjZXNzYXJ5KGxlbmd0aCk7CisKKyAgICBtZW1jcHkoX2J1ZmYgKyBfd3JpdGVQb2ludCwgcGFyYW0sIGxlbmd0aCk7CisgICAgX3dyaXRlUG9pbnQgKz0gbGVuZ3RoOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhzdGQ6OnN0cmluZyAqIHBhcmFtKSB7CisgICAgY29uc3QgY2hhciAqIHN0ciA9IHBhcmFtLT5jX3N0cigpOworICAgIGludCBsZW5ndGggPSBwYXJhbS0+c2l6ZSgpOworICAgIHdyaXRlU3RyaW5nKHN0ciwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVQb2ludGVyKHZvaWQgKiBwYXJhbSkgeworICAgIHVpbnQ2NF90IHdyaXR0ZW4gPSAodWludDY0X3QpKHBhcmFtKTsKKyAgICB3cml0ZUxvbmcod3JpdHRlbik7CisgIH0KKworICB1aW50MzJfdCByZWFkSW50KCkgeworICAgIGNoYXIgKiByZWFkUG9zID0gX2J1ZmYgKyBfcmVhZFBvaW50OworICAgIHVpbnQzMl90IHJlc3VsdCA9ICooKHVpbnQzMl90ICopKHJlYWRQb3MpKTsKKyAgICBfcmVhZFBvaW50ICs9IDQ7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHVpbnQ2NF90IHJlYWRMb25nKCkgeworICAgIGNoYXIgKiByZWFkUG9zID0gX2J1ZmYgKyBfcmVhZFBvaW50OworICAgIHVpbnQ2NF90IHJlc3VsdCA9ICooKHVpbnQ2NF90ICopKHJlYWRQb3MpKTsKKyAgICBfcmVhZFBvaW50ICs9IDg7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nICogcmVhZFN0cmluZygpIHsKKyAgICB1aW50MzJfdCBsZW4gPSByZWFkSW50KCk7CisgICAgY2hhciAqIHN0ckJlZ2luID0gX2J1ZmYgKyBfcmVhZFBvaW50OworICAgIF9yZWFkUG9pbnQgKz0gbGVuOworICAgIHJldHVybiBuZXcgc3RkOjpzdHJpbmcoc3RyQmVnaW4sIGxlbik7CisgIH0KKworICB2b2lkICogcmVhZFBvaW50ZXIoKSB7CisgICAgdWludDY0X3QgcmVzdWx0ID0gcmVhZExvbmcoKTsKKyAgICByZXR1cm4gKHZvaWQgKikocmVzdWx0KTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGNoZWNrV3JpdGVTcGFjZUFuZFJlc2l6ZUlmTmVjZXNzYXJ5KHVpbnQzMl90IHRvQmVXcml0dGVuKSB7CisgICAgaWYgKF9idWZmTGVuZ3RoID09IDApIHsKKyAgICAgIF9uZXdDcmVhdGVkQnVmZiA9IHRydWU7CisgICAgICBfYnVmZkxlbmd0aCA9IElOSVRJQUxfTEVOR1RIID4gdG9CZVdyaXR0ZW4gPyBJTklUSUFMX0xFTkdUSCA6IHRvQmVXcml0dGVuOworICAgICAgX2J1ZmYgPSBuZXcgY2hhcltfYnVmZkxlbmd0aF07CisgICAgfQorCisgICAgaWYgKF9idWZmTGVuZ3RoIC0gX3dyaXRlUG9pbnQgPj0gdG9CZVdyaXR0ZW4pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfYnVmZkxlbmd0aCA9IF9idWZmTGVuZ3RoICsgdG9CZVdyaXR0ZW47CisgICAgX25ld0NyZWF0ZWRCdWZmID0gdHJ1ZTsKKyAgICBjaGFyICogbmV3QnVmZiA9IG5ldyBjaGFyW19idWZmTGVuZ3RoXTsKKyAgICBtZW1jcHkobmV3QnVmZiwgX2J1ZmYsIF93cml0ZVBvaW50KTsKKyAgICBkZWxldGVbXSBfYnVmZjsKKyAgICBfYnVmZiA9IG5ld0J1ZmY7CisgIH0KK307CisKK3R5cGVkZWYgUmVhZFdyaXRlQnVmZmVyIFBhcmFtZXRlckJ1ZmZlcjsKK3R5cGVkZWYgUmVhZFdyaXRlQnVmZmVyIFJlc3VsdEJ1ZmZlcjsKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogQlVGRkVSU19IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvQ29tYmluZXIuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0NvbWJpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMDlmZgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0NvbWJpbmVyLmgKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIENPTUJJTkVSX0hfCisjZGVmaW5lIENPTUJJTkVSX0hfCisjaW5jbHVkZSAiY29tbW9ucy5oIgorI2luY2x1ZGUgImxpYi9JRmlsZS5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlcktWSXRlcmF0b3IgOiBwdWJsaWMgS1ZJdGVyYXRvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgY29uc3QgY2hhciAqIGdldEJhc2UoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICogZ2V0S1ZPZmZzZXRzKCkgPSAwOworfTsKKworZW51bSBDb21iaW5lQ29udGV4dFR5cGUgeworICBVTktOT1dOID0gMCwKKyAgQ09OVElOVU9VU19NRU1PUllfQlVGRkVSID0gMSwKK307CisKK2NsYXNzIENvbWJpbmVDb250ZXh0IHsKKworcHJpdmF0ZToKKyAgQ29tYmluZUNvbnRleHRUeXBlIF90eXBlOworCitwdWJsaWM6CisgIENvbWJpbmVDb250ZXh0KENvbWJpbmVDb250ZXh0VHlwZSB0eXBlKQorICAgICAgOiBfdHlwZSh0eXBlKSB7CisgIH0KKworcHVibGljOgorICBDb21iaW5lQ29udGV4dFR5cGUgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gX3R5cGU7CisgIH0KK307CisKK2NsYXNzIENvbWJpbmVJbk1lbW9yeSA6IHB1YmxpYyBDb21iaW5lQ29udGV4dCB7CisgIENvbWJpbmVJbk1lbW9yeSgpCisgICAgICA6IENvbWJpbmVDb250ZXh0KENPTlRJTlVPVVNfTUVNT1JZX0JVRkZFUikgeworICB9Cit9OworCitjbGFzcyBJQ29tYmluZVJ1bm5lciB7CitwdWJsaWM6CisgIElDb21iaW5lUnVubmVyKCkgeworICB9CisKKyAgdmlydHVhbCB2b2lkIGNvbWJpbmUoQ29tYmluZUNvbnRleHQgdHlwZSwgS1ZJdGVyYXRvciAqIGt2SXRlcmF0b3IsIElGaWxlV3JpdGVyICogd3JpdGVyKSA9IDA7CisKKyAgdmlydHVhbCB+SUNvbWJpbmVSdW5uZXIoKSB7CisgIH0KK307CisKK30gLyogbmFtZXNwYWNlIE5hdGl2ZVRhc2sgKi8KKyNlbmRpZiAvKiBDT01CSU5FUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvQ29tcHJlc3Npb25zLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvQ29tcHJlc3Npb25zLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWMwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9Db21wcmVzc2lvbnMuY2MKQEAgLTAsMCArMSwxNDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWIvQ29tcHJlc3Npb25zLmgiCisjaW5jbHVkZSAidXRpbC9TeW5jVXRpbHMuaCIKKyNpbmNsdWRlICJjb2RlYy9HemlwQ29kZWMuaCIKKyNpbmNsdWRlICJjb2RlYy9TbmFwcHlDb2RlYy5oIgorI2luY2x1ZGUgImNvZGVjL0x6NENvZGVjLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworQ29tcHJlc3NTdHJlYW06On5Db21wcmVzc1N0cmVhbSgpIHsKK30KKwordm9pZCBDb21wcmVzc1N0cmVhbTo6d3JpdGVEaXJlY3QoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICBUSFJPV19FWENFUFRJT04oVW5zdXBwb3J0RXhjZXB0aW9uLCAid3JpdGVEaXJlY3Qgbm90IHN1cHBvcnQiKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRGVjb21wcmVzc1N0cmVhbTo6fkRlY29tcHJlc3NTdHJlYW0oKSB7Cit9CisKK2ludDMyX3QgRGVjb21wcmVzc1N0cmVhbTo6cmVhZERpcmVjdCh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgIFRIUk9XX0VYQ0VQVElPTihVbnN1cHBvcnRFeGNlcHRpb24sICJyZWFkRGlyZWN0IG5vdCBzdXBwb3J0Iik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IENvbXByZXNzaW9uczo6Q29kZWMgQ29tcHJlc3Npb25zOjpHemlwQ29kZWMgPSBDb21wcmVzc2lvbnM6OkNvZGVjKAorICAgICJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5HemlwQ29kZWMiLCAiLmd6Iik7Citjb25zdCBDb21wcmVzc2lvbnM6OkNvZGVjIENvbXByZXNzaW9uczo6U25hcHB5Q29kZWMgPSBDb21wcmVzc2lvbnM6OkNvZGVjKAorICAgICJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5TbmFwcHlDb2RlYyIsICIuc25hcHB5Iik7Citjb25zdCBDb21wcmVzc2lvbnM6OkNvZGVjIENvbXByZXNzaW9uczo6THo0Q29kZWMgPSBDb21wcmVzc2lvbnM6OkNvZGVjKAorICAgICJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5MejRDb2RlYyIsICIubHo0Iik7CisKK3ZlY3RvcjxDb21wcmVzc2lvbnM6OkNvZGVjPiBDb21wcmVzc2lvbnM6OlN1cHBvcnRlZENvZGVjcyA9IHZlY3RvcjxDb21wcmVzc2lvbnM6OkNvZGVjPigpOworCit2b2lkIENvbXByZXNzaW9uczo6aW5pdENvZGVjcygpIHsKKyAgc3RhdGljIExvY2sgbG9jazsKKyAgU2NvcGVMb2NrPExvY2s+IGF1dG9sb2NrKGxvY2spOworICBpZiAoU3VwcG9ydGVkQ29kZWNzLnNpemUoKSA9PSAwKSB7CisgICAgU3VwcG9ydGVkQ29kZWNzLnB1c2hfYmFjayhHemlwQ29kZWMpOworICAgIFN1cHBvcnRlZENvZGVjcy5wdXNoX2JhY2soU25hcHB5Q29kZWMpOworICAgIFN1cHBvcnRlZENvZGVjcy5wdXNoX2JhY2soTHo0Q29kZWMpOworICB9Cit9CisKK2Jvb2wgQ29tcHJlc3Npb25zOjpzdXBwb3J0KGNvbnN0IHN0cmluZyAmIGNvZGVjKSB7CisgIGluaXRDb2RlY3MoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBTdXBwb3J0ZWRDb2RlY3Muc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoY29kZWMgPT0gU3VwcG9ydGVkQ29kZWNzW2ldLm5hbWUpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0IHN0cmluZyBDb21wcmVzc2lvbnM6OmdldEV4dGVuc2lvbihjb25zdCBzdHJpbmcgJiBjb2RlYykgeworICBpbml0Q29kZWNzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgU3VwcG9ydGVkQ29kZWNzLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGNvZGVjID09IFN1cHBvcnRlZENvZGVjc1tpXS5uYW1lKSB7CisgICAgICByZXR1cm4gU3VwcG9ydGVkQ29kZWNzW2ldLmV4dGVuc2lvbjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0cmluZygpOworfQorCitjb25zdCBzdHJpbmcgQ29tcHJlc3Npb25zOjpnZXRDb2RlYyhjb25zdCBzdHJpbmcgJiBleHRlbnNpb24pIHsKKyAgaW5pdENvZGVjcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFN1cHBvcnRlZENvZGVjcy5zaXplKCk7IGkrKykgeworICAgIGlmIChleHRlbnNpb24gPT0gU3VwcG9ydGVkQ29kZWNzW2ldLmV4dGVuc2lvbikgeworICAgICAgcmV0dXJuIFN1cHBvcnRlZENvZGVjc1tpXS5uYW1lOworICAgIH0KKyAgfQorICByZXR1cm4gc3RyaW5nKCk7Cit9CisKK2NvbnN0IHN0cmluZyBDb21wcmVzc2lvbnM6OmdldENvZGVjQnlGaWxlKGNvbnN0IHN0cmluZyAmIGZpbGUpIHsKKyAgaW5pdENvZGVjcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFN1cHBvcnRlZENvZGVjcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IHN0cmluZyAmIGV4dGVuc2lvbiA9IFN1cHBvcnRlZENvZGVjc1tpXS5leHRlbnNpb247CisgICAgaWYgKChmaWxlLmxlbmd0aCgpID4gZXh0ZW5zaW9uLmxlbmd0aCgpKQorICAgICAgICAmJiAoZmlsZS5zdWJzdHIoZmlsZS5sZW5ndGgoKSAtIGV4dGVuc2lvbi5sZW5ndGgoKSkgPT0gZXh0ZW5zaW9uKSkgeworICAgICAgcmV0dXJuIFN1cHBvcnRlZENvZGVjc1tpXS5uYW1lOworICAgIH0KKyAgfQorICByZXR1cm4gc3RyaW5nKCk7Cit9CisKK0NvbXByZXNzU3RyZWFtICogQ29tcHJlc3Npb25zOjpnZXRDb21wcmVzc2lvblN0cmVhbShjb25zdCBzdHJpbmcgJiBjb2RlYywgT3V0cHV0U3RyZWFtICogc3RyZWFtLAorICAgIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KSB7CisgIGlmIChjb2RlYyA9PSBHemlwQ29kZWMubmFtZSkgeworICAgIHJldHVybiBuZXcgR3ppcENvbXByZXNzU3RyZWFtKHN0cmVhbSwgYnVmZmVyU2l6ZUhpbnQpOworICB9CisgIGlmIChjb2RlYyA9PSBTbmFwcHlDb2RlYy5uYW1lKSB7CisjaWYgZGVmaW5lZCBIQURPT1BfU05BUFBZX0xJQlJBUlkKKyAgICByZXR1cm4gbmV3IFNuYXBweUNvbXByZXNzU3RyZWFtKHN0cmVhbSwgYnVmZmVyU2l6ZUhpbnQpOworI2Vsc2UKKyAgICBUSFJPV19FWENFUFRJT04oVW5zdXBwb3J0RXhjZXB0aW9uLCAiU25hcHB5IGxpYnJhcnkgaXMgbm90IGxvYWRlZCIpOworI2VuZGlmCisgIH0KKyAgaWYgKGNvZGVjID09IEx6NENvZGVjLm5hbWUpIHsKKyAgICByZXR1cm4gbmV3IEx6NENvbXByZXNzU3RyZWFtKHN0cmVhbSwgYnVmZmVyU2l6ZUhpbnQpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitEZWNvbXByZXNzU3RyZWFtICogQ29tcHJlc3Npb25zOjpnZXREZWNvbXByZXNzaW9uU3RyZWFtKGNvbnN0IHN0cmluZyAmIGNvZGVjLCBJbnB1dFN0cmVhbSAqIHN0cmVhbSwKKyAgICB1aW50MzJfdCBidWZmZXJTaXplSGludCkgeworICBpZiAoY29kZWMgPT0gR3ppcENvZGVjLm5hbWUpIHsKKyAgICByZXR1cm4gbmV3IEd6aXBEZWNvbXByZXNzU3RyZWFtKHN0cmVhbSwgYnVmZmVyU2l6ZUhpbnQpOworICB9CisgIGlmIChjb2RlYyA9PSBTbmFwcHlDb2RlYy5uYW1lKSB7CisjaWYgZGVmaW5lZCBIQURPT1BfU05BUFBZX0xJQlJBUlkKKyAgICByZXR1cm4gbmV3IFNuYXBweURlY29tcHJlc3NTdHJlYW0oc3RyZWFtLCBidWZmZXJTaXplSGludCk7CisjZWxzZQorICAgIFRIUk9XX0VYQ0VQVElPTihVbnN1cHBvcnRFeGNlcHRpb24sICJTbmFwcHkgbGlicmFyeSBpcyBub3QgbG9hZGVkIik7CisjZW5kaWYKKyAgfQorICBpZiAoY29kZWMgPT0gTHo0Q29kZWMubmFtZSkgeworICAgIHJldHVybiBuZXcgTHo0RGVjb21wcmVzc1N0cmVhbShzdHJlYW0sIGJ1ZmZlclNpemVIaW50KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9Db21wcmVzc2lvbnMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0NvbXByZXNzaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzUwODQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9Db21wcmVzc2lvbnMuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09NUFJFU1NJT05TX0hfCisjZGVmaW5lIENPTVBSRVNTSU9OU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJsaWIvU3RyZWFtcy5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK2NsYXNzIENvbXByZXNzU3RyZWFtIDogcHVibGljIEZpbHRlck91dHB1dFN0cmVhbSB7CitwdWJsaWM6CisgIENvbXByZXNzU3RyZWFtKE91dHB1dFN0cmVhbSAqIHN0cmVhbSkKKyAgICAgIDogRmlsdGVyT3V0cHV0U3RyZWFtKHN0cmVhbSkgeworICB9CisKKyAgdmlydHVhbCB+Q29tcHJlc3NTdHJlYW0oKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGVEaXJlY3QoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdmlydHVhbCB2b2lkIGZpbmlzaCgpIHsKKyAgICBmbHVzaCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHJlc2V0U3RhdGUoKSB7CisKKyAgfQorCisgIHZpcnR1YWwgdWludDY0X3QgY29tcHJlc3NlZEJ5dGVzV3JpdHRlbigpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKworY2xhc3MgRGVjb21wcmVzc1N0cmVhbSA6IHB1YmxpYyBGaWx0ZXJJbnB1dFN0cmVhbSB7CitwdWJsaWM6CisgIERlY29tcHJlc3NTdHJlYW0oSW5wdXRTdHJlYW0gKiBzdHJlYW0pCisgICAgICA6IEZpbHRlcklucHV0U3RyZWFtKHN0cmVhbSkgeworICB9CisKKyAgdmlydHVhbCB+RGVjb21wcmVzc1N0cmVhbSgpOworCisgIHZpcnR1YWwgaW50MzJfdCByZWFkRGlyZWN0KHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpOworCisgIHZpcnR1YWwgdWludDY0X3QgY29tcHJlc3NlZEJ5dGVzUmVhZCgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKworY2xhc3MgQ29tcHJlc3Npb25zIHsKK3Byb3RlY3RlZDoKKyAgY2xhc3MgQ29kZWMgeworICBwdWJsaWM6CisgICAgc3RyaW5nIG5hbWU7CisgICAgc3RyaW5nIGV4dGVuc2lvbjsKKworICAgIENvZGVjKGNvbnN0IHN0cmluZyAmIG5hbWUsIGNvbnN0IHN0cmluZyAmIGV4dGVuc2lvbikKKyAgICAgICAgOiBuYW1lKG5hbWUpLCBleHRlbnNpb24oZXh0ZW5zaW9uKSB7CisgICAgfQorICB9OworCisgIHN0YXRpYyB2ZWN0b3I8Q29kZWM+IFN1cHBvcnRlZENvZGVjczsKKworICBzdGF0aWMgdm9pZCBpbml0Q29kZWNzKCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IENvZGVjIEd6aXBDb2RlYzsKKyAgc3RhdGljIGNvbnN0IENvZGVjIFNuYXBweUNvZGVjOworICBzdGF0aWMgY29uc3QgQ29kZWMgTHo0Q29kZWM7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgc3VwcG9ydChjb25zdCBzdHJpbmcgJiBjb2RlYyk7CisKKyAgc3RhdGljIGNvbnN0IHN0cmluZyBnZXRFeHRlbnNpb24oY29uc3Qgc3RyaW5nICYgY29kZWMpOworCisgIHN0YXRpYyBjb25zdCBzdHJpbmcgZ2V0Q29kZWMoY29uc3Qgc3RyaW5nICYgZXh0ZW5zaW9uKTsKKworICBzdGF0aWMgY29uc3Qgc3RyaW5nIGdldENvZGVjQnlGaWxlKGNvbnN0IHN0cmluZyAmIGZpbGUpOworCisgIHN0YXRpYyBDb21wcmVzc1N0cmVhbSAqIGdldENvbXByZXNzaW9uU3RyZWFtKGNvbnN0IHN0cmluZyAmIGNvZGVjLCBPdXRwdXRTdHJlYW0gKiBzdHJlYW0sCisgICAgICB1aW50MzJfdCBidWZmZXJTaXplSGludCk7CisKKyAgc3RhdGljIERlY29tcHJlc3NTdHJlYW0gKiBnZXREZWNvbXByZXNzaW9uU3RyZWFtKGNvbnN0IHN0cmluZyAmIGNvZGVjLCBJbnB1dFN0cmVhbSAqIHN0cmVhbSwKKyAgICAgIHVpbnQzMl90IGJ1ZmZlclNpemVIaW50KTsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIENPTVBSRVNTSU9OU19IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvQ29uc3RhbnRzLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9Db25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTU3MDdiCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvQ29uc3RhbnRzLmgKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIENPTlNUQU5UU19IXworI2RlZmluZSBDT05TVEFOVFNfSF8KKworY29uc3QgdWludDMyX3QgU0laRV9PRl9QQVJUSVRJT05fTEVOR1RIID0gc2l6ZW9mKHVpbnQzMl90KTsKK2NvbnN0IHVpbnQzMl90IFNJWkVfT0ZfS0VZX0xFTkdUSCA9IHNpemVvZih1aW50MzJfdCk7Citjb25zdCB1aW50MzJfdCBTSVpFX09GX1ZBTFVFX0xFTkdUSCA9IHNpemVvZih1aW50MzJfdCk7Citjb25zdCB1aW50MzJfdCBTSVpFX09GX0tWX0xFTkdUSCA9IFNJWkVfT0ZfS0VZX0xFTkdUSCArIFNJWkVfT0ZfVkFMVUVfTEVOR1RIOworCisjZW5kaWYgLy9DT05TVEFOVFNfSF8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0ZpbGVTeXN0ZW0uY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9GaWxlU3lzdGVtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTY5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9GaWxlU3lzdGVtLmNjCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJsaWIvam5pdXRpbHMuaCIKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisjaW5jbHVkZSAibGliL1Rhc2tDb3VudGVycy5oIgorI2luY2x1ZGUgImxpYi9OYXRpdmVPYmplY3RGYWN0b3J5LmgiCisjaW5jbHVkZSAibGliL1BhdGguaCIKKyNpbmNsdWRlICJsaWIvRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRmlsZUlucHV0U3RyZWFtOjpGaWxlSW5wdXRTdHJlYW0oY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICBfZmQgPSA6Om9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSk7CisgIGlmIChfZmQgPj0gMCkgeworICAgIF9wYXRoID0gcGF0aDsKKyAgfSBlbHNlIHsKKyAgICBfZmQgPSAtMTsKKyAgICBUSFJPV19FWENFUFRJT05fRVgoSU9FeGNlcHRpb24sICJDYW4ndCBvcGVuIGZpbGUgZm9yIHJlYWQ6IFslc10iLCBwYXRoLmNfc3RyKCkpOworICB9CisgIF9ieXRlc1JlYWQgPSBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRDb3VudGVyKFRhc2tDb3VudGVyczo6RklMRVNZU1RFTV9DT1VOVEVSX0dST1VQLAorICAgICAgVGFza0NvdW50ZXJzOjpGSUxFX0JZVEVTX1JFQUQpOworfQorCitGaWxlSW5wdXRTdHJlYW06On5GaWxlSW5wdXRTdHJlYW0oKSB7CisgIGNsb3NlKCk7Cit9CisKK3ZvaWQgRmlsZUlucHV0U3RyZWFtOjpzZWVrKHVpbnQ2NF90IHBvc2l0aW9uKSB7CisgIDo6bHNlZWsoX2ZkLCBwb3NpdGlvbiwgU0VFS19TRVQpOworfQorCit1aW50NjRfdCBGaWxlSW5wdXRTdHJlYW06OnRlbGwoKSB7CisgIHJldHVybiA6OmxzZWVrKF9mZCwgMCwgU0VFS19DVVIpOworfQorCitpbnQzMl90IEZpbGVJbnB1dFN0cmVhbTo6cmVhZCh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgIGludDMyX3QgcmV0ID0gOjpyZWFkKF9mZCwgYnVmZiwgbGVuZ3RoKTsKKyAgaWYgKHJldCA+IDApIHsKKyAgICBfYnl0ZXNSZWFkLT5pbmNyZWFzZShyZXQpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgRmlsZUlucHV0U3RyZWFtOjpjbG9zZSgpIHsKKyAgaWYgKF9mZCA+PSAwKSB7CisgICAgOjpjbG9zZShfZmQpOworICAgIF9mZCA9IC0xOworICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRmlsZU91dHB1dFN0cmVhbTo6RmlsZU91dHB1dFN0cmVhbShjb25zdCBzdHJpbmcgJiBwYXRoLCBib29sIG92ZXJ3aXRlKSB7CisgIGludCBmbGFncyA9IDA7CisgIGlmIChvdmVyd2l0ZSkgeworICAgIGZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKyAgfSBlbHNlIHsKKyAgICBmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTDsKKyAgfQorICBtb2RlX3QgbWFzayA9IHVtYXNrKDApOworICB1bWFzayhtYXNrKTsKKyAgX2ZkID0gOjpvcGVuKHBhdGguY19zdHIoKSwgZmxhZ3MsICgwNjY2ICYgfm1hc2spKTsKKyAgaWYgKF9mZCA+PSAwKSB7CisgICAgX3BhdGggPSBwYXRoOworICB9IGVsc2UgeworICAgIF9mZCA9IC0xOworICAgIFRIUk9XX0VYQ0VQVElPTl9FWChJT0V4Y2VwdGlvbiwgIkNhbid0IG9wZW4gZmlsZSBmb3Igd3JpdGU6IFslc10iLCBwYXRoLmNfc3RyKCkpOworICB9CisgIF9ieXRlc1dyaXRlID0gTmF0aXZlT2JqZWN0RmFjdG9yeTo6R2V0Q291bnRlcihUYXNrQ291bnRlcnM6OkZJTEVTWVNURU1fQ09VTlRFUl9HUk9VUCwKKyAgICAgIFRhc2tDb3VudGVyczo6RklMRV9CWVRFU19XUklUVEVOKTsKK30KKworRmlsZU91dHB1dFN0cmVhbTo6fkZpbGVPdXRwdXRTdHJlYW0oKSB7CisgIGNsb3NlKCk7Cit9CisKK3VpbnQ2NF90IEZpbGVPdXRwdXRTdHJlYW06OnRlbGwoKSB7CisgIHJldHVybiA6OmxzZWVrKF9mZCwgMCwgU0VFS19DVVIpOworfQorCit2b2lkIEZpbGVPdXRwdXRTdHJlYW06OndyaXRlKGNvbnN0IHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaWYgKDo6d3JpdGUoX2ZkLCBidWZmLCBsZW5ndGgpIDwgbGVuZ3RoKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiOjp3cml0ZSBlcnJvciIpOworICB9CisgIF9ieXRlc1dyaXRlLT5pbmNyZWFzZShsZW5ndGgpOworfQorCit2b2lkIEZpbGVPdXRwdXRTdHJlYW06OmZsdXNoKCkgeworfQorCit2b2lkIEZpbGVPdXRwdXRTdHJlYW06OmNsb3NlKCkgeworICBpZiAoX2ZkID49IDApIHsKKyAgICA6OmNsb3NlKF9mZCk7CisgICAgX2ZkID0gLTE7CisgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBSYXdGaWxlU3lzdGVtIDogcHVibGljIEZpbGVTeXN0ZW0geworIHByb3RlY3RlZDoKKyAgc3RyaW5nIGdldFJlYWxQYXRoKGNvbnN0IHN0cmluZyAmIHBhdGgpIHsKKyAgICBpZiAoU3RyaW5nVXRpbDo6U3RhcnRzV2l0aChwYXRoLCAiZmlsZToiKSkgeworICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKDUpOworICAgIH0KKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgcHVibGljOgorICBJbnB1dFN0cmVhbSAqIG9wZW4oY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGdldFJlYWxQYXRoKHBhdGgpKTsKKyAgfQorCisgIE91dHB1dFN0cmVhbSAqIGNyZWF0ZShjb25zdCBzdHJpbmcgJiBwYXRoLCBib29sIG92ZXJ3cml0ZSkgeworICAgIHN0cmluZyBucCA9IGdldFJlYWxQYXRoKHBhdGgpOworICAgIHN0cmluZyBwYXJlbnQgPSBQYXRoOjpHZXRQYXJlbnQobnApOworICAgIGlmIChwYXJlbnQubGVuZ3RoKCkgPiAwKSB7CisgICAgICBpZiAoIWV4aXN0cyhwYXJlbnQpKSB7CisgICAgICAgIG1rZGlycyhwYXJlbnQpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0obnAsIG92ZXJ3cml0ZSk7CisgIH0KKworICB1aW50NjRfdCBnZXRMZW5ndGgoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIGlmICg6OnN0YXQoZ2V0UmVhbFBhdGgocGF0aCkuY19zdHIoKSwgJnN0KSAhPSAwKSB7CisgICAgICBjaGFyIGJ1ZmZbMjU2XTsKKyAgICAgIHN0cmVycm9yX3IoZXJybm8sIGJ1ZmYsIDI1Nik7CisgICAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sCisgICAgICAgICAgU3RyaW5nVXRpbDo6Rm9ybWF0KCJzdGF0IHBhdGggJXMgZmFpbGVkLCAlcyIsIHBhdGguY19zdHIoKSwgYnVmZikpOworICAgIH0KKyAgICByZXR1cm4gc3Quc3Rfc2l6ZTsKKyAgfQorCisgIGJvb2wgbGlzdChjb25zdCBzdHJpbmcgJiBwYXRoLCB2ZWN0b3I8RmlsZUVudHJ5PiAmIHN0YXR1cykgeworICAgIERJUiAqIGRwOworICAgIHN0cnVjdCBkaXJlbnQgKiBkaXJwOworICAgIGlmICgoZHAgPSBvcGVuZGlyKHBhdGguY19zdHIoKSkpID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBGaWxlRW50cnkgdGVtcDsKKyAgICB3aGlsZSAoKGRpcnAgPSByZWFkZGlyKGRwKSkgIT0gTlVMTCkgeworICAgICAgdGVtcC5uYW1lID0gZGlycC0+ZF9uYW1lOworICAgICAgdGVtcC5pc0RpcmVjdG9yeSA9IGRpcnAtPmRfdHlwZSAmIERUX0RJUjsKKyAgICAgIGlmICh0ZW1wLm5hbWUgPT0gIi4iIHx8IHRlbXAubmFtZSA9PSAiLi4iKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3RhdHVzLnB1c2hfYmFjayh0ZW1wKTsKKyAgICB9CisgICAgY2xvc2VkaXIoZHApOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCByZW1vdmUoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICAgIGlmICghZXhpc3RzKHBhdGgpKSB7CisgICAgICBMT0coIltGaWxlU3lzdGVtXSByZW1vdmUgZmlsZSAlcyBub3QgZXhpc3RzLCBpZ25vcmUiLCBwYXRoLmNfc3RyKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoOjpyZW1vdmUoZ2V0UmVhbFBhdGgocGF0aCkuY19zdHIoKSkgIT0gMCkgeworICAgICAgaW50IGVyciA9IGVycm5vOworICAgICAgaWYgKDo6c3lzdGVtKFN0cmluZ1V0aWw6OkZvcm1hdCgicm0gLXJmICVzIiwgcGF0aC5jX3N0cigpKS5jX3N0cigpKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNoYXIgYnVmZlsyNTZdOworICAgICAgc3RyZXJyb3JfcihlcnIsIGJ1ZmYsIDI1Nik7CisgICAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sCisgICAgICAgICAgU3RyaW5nVXRpbDo6Rm9ybWF0KCJGaWxlU3lzdGVtOiByZW1vdmUgcGF0aCAlcyBmYWlsZWQsICVzIiwgcGF0aC5jX3N0cigpLCBidWZmKSk7CisgICAgfQorICB9CisKKyAgYm9vbCBleGlzdHMoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIGlmICg6OnN0YXQoZ2V0UmVhbFBhdGgocGF0aCkuY19zdHIoKSwgJnN0KSAhPSAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50IG1rZGlycyhjb25zdCBzdHJpbmcgJiBwYXRoLCBtb2RlX3Qgbm1vZGUpIHsKKyAgICBzdHJpbmcgbnAgPSBnZXRSZWFsUGF0aChwYXRoKTsKKyAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgIGlmIChzdGF0KG5wLmNfc3RyKCksICZzYikgPT0gMCkgeworICAgICAgaWYgKFNfSVNESVIoc2Iuc3RfbW9kZSkgPT0gMCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0cmluZyBucGF0aHN0ciA9IG5wOworICAgIGNoYXIgKiBucGF0aCA9IGNvbnN0X2Nhc3Q8Y2hhcio+KG5wYXRoc3RyLmNfc3RyKCkpOworCisgICAgLyogU2tpcCBsZWFkaW5nIHNsYXNoZXMuICovCisgICAgY2hhciAqIHAgPSBucGF0aDsKKyAgICB3aGlsZSAoKnAgPT0gJy8nKQorICAgICAgcCsrOworCisgICAgd2hpbGUgKE5VTEwgIT0gKHAgPSBzdHJjaHIocCwgJy8nKSkpIHsKKyAgICAgICpwID0gJ1wwJzsKKyAgICAgIGlmIChzdGF0KG5wYXRoLCAmc2IpICE9IDApIHsKKyAgICAgICAgaWYgKG1rZGlyKG5wYXRoLCBubW9kZSkpIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChTX0lTRElSKHNiLnN0X21vZGUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICAqcCsrID0gJy8nOyAvKiByZXN0b3JlIHNsYXNoICovCisgICAgICB3aGlsZSAoKnAgPT0gJy8nKQorICAgICAgICBwKys7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSBmaW5hbCBkaXJlY3RvcnkgY29tcG9uZW50LiAqLworICAgIGlmIChzdGF0KG5wYXRoLCAmc2IpICYmIG1rZGlyKG5wYXRoLCBubW9kZSkpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZvaWQgbWtkaXJzKGNvbnN0IHN0cmluZyAmIHBhdGgpIHsKKyAgICBpbnQgcmV0ID0gbWtkaXJzKHBhdGgsIDA3NTUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgVEhST1dfRVhDRVBUSU9OX0VYKElPRXhjZXB0aW9uLCAibWtkaXJzIFslc10gZmFpbGVkIiwgcGF0aC5jX3N0cigpKTsKKyAgICB9CisgIH0KK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4dGVybiBSYXdGaWxlU3lzdGVtIFJhd0ZpbGVTeXN0ZW1JbnN0YW5jZTsKKworUmF3RmlsZVN5c3RlbSBSYXdGaWxlU3lzdGVtSW5zdGFuY2UgPSBSYXdGaWxlU3lzdGVtKCk7CisKK0ZpbGVTeXN0ZW0gJiBGaWxlU3lzdGVtOjpnZXRMb2NhbCgpIHsKKyAgcmV0dXJuIFJhd0ZpbGVTeXN0ZW1JbnN0YW5jZTsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvRmlsZVN5c3RlbS5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvRmlsZVN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYWYzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9GaWxlU3lzdGVtLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZJTEVTWVNURU1fSF8KKyNkZWZpbmUgRklMRVNZU1RFTV9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKyNpbmNsdWRlICJsaWIvU3RyZWFtcy5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2NsYXNzIEZpbGVTeXN0ZW07CisKKy8qKgorICogTG9jYWwgcmF3IGZpbGVzeXN0ZW0gZmlsZSBpbnB1dCBzdHJlYW0KKyAqIHdpdGggYmxvY2tpbmcgc2VtYW50aWNzCisgKi8KK2NsYXNzIEZpbGVJbnB1dFN0cmVhbSA6IHB1YmxpYyBJbnB1dFN0cmVhbSB7Citwcml2YXRlOgorICBzdHJpbmcgX3BhdGg7CisgIGludCBfZmQ7CisgIENvdW50ZXIgKiBfYnl0ZXNSZWFkOworcHVibGljOgorICBGaWxlSW5wdXRTdHJlYW0oY29uc3Qgc3RyaW5nICYgcGF0aCk7CisgIHZpcnR1YWwgfkZpbGVJbnB1dFN0cmVhbSgpOworCisgIHZpcnR1YWwgdm9pZCBzZWVrKHVpbnQ2NF90IHBvc2l0aW9uKTsKKworICB2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKTsKKworICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKTsKKworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKK307CisKKy8qKgorICogTG9jYWwgcmF3IGZpbGVzeXN0ZW0gZmlsZSBvdXRwdXQgc3RyZWFtCisgKiB3aXRoIGJsb2NraW5nIHNlbWFudGljcworICovCitjbGFzcyBGaWxlT3V0cHV0U3RyZWFtIDogcHVibGljIE91dHB1dFN0cmVhbSB7Citwcml2YXRlOgorICBzdHJpbmcgX3BhdGg7CisgIGludCBfZmQ7CisgIENvdW50ZXIgKiBfYnl0ZXNXcml0ZTsKK3B1YmxpYzoKKyAgRmlsZU91dHB1dFN0cmVhbShjb25zdCBzdHJpbmcgJiBwYXRoLCBib29sIG92ZXJ3aXRlID0gdHJ1ZSk7CisgIHZpcnR1YWwgfkZpbGVPdXRwdXRTdHJlYW0oKTsKKworICB2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7Cit9OworCisKK2NsYXNzIEZpbGVFbnRyeSB7CitwdWJsaWM6CisgIHN0cmluZyBuYW1lOworICBib29sIGlzRGlyZWN0b3J5OworfTsKKworLyoqCisgKiBGaWxlU3lzdGVtIGludGVyZmFjZQorICovCitjbGFzcyBGaWxlU3lzdGVtIHsKK3Byb3RlY3RlZDoKKyAgRmlsZVN5c3RlbSgpIHsKKyAgfQorcHVibGljOgorICB2aXJ0dWFsIH5GaWxlU3lzdGVtKCkgeworICB9CisKKyAgdmlydHVhbCBJbnB1dFN0cmVhbSAqIG9wZW4oY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdmlydHVhbCBPdXRwdXRTdHJlYW0gKiBjcmVhdGUoY29uc3Qgc3RyaW5nICYgcGF0aCwgYm9vbCBvdmVyd3JpdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB2aXJ0dWFsIHVpbnQ2NF90IGdldExlbmd0aChjb25zdCBzdHJpbmcgJiBwYXRoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgbGlzdChjb25zdCBzdHJpbmcgJiBwYXRoLCB2ZWN0b3I8RmlsZUVudHJ5PiAmIHN0YXR1cykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCByZW1vdmUoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICB9CisKKyAgdmlydHVhbCBib29sIGV4aXN0cyhjb25zdCBzdHJpbmcgJiBwYXRoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCB2b2lkIG1rZGlycyhjb25zdCBzdHJpbmcgJiBwYXRoKSB7CisgIH0KKworICBzdGF0aWMgRmlsZVN5c3RlbSAmIGdldExvY2FsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBGSUxFU1lTVEVNX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9JRmlsZS5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0lGaWxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkM2UwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9JRmlsZS5jYwpAQCAtMCwwICsxLDIzMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgInV0aWwvU3RyaW5nVXRpbC5oIgorI2luY2x1ZGUgImxpYi9JRmlsZS5oIgorI2luY2x1ZGUgImxpYi9Db21wcmVzc2lvbnMuaCIKKyNpbmNsdWRlICJsaWIvRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0lGaWxlUmVhZGVyOjpJRmlsZVJlYWRlcihJbnB1dFN0cmVhbSAqIHN0cmVhbSwgU2luZ2xlU3BpbGxJbmZvICogc3BpbGwsIGJvb2wgZGVsZXRlSW5wdXRTdHJlYW0pCisgICAgOiAgX3N0cmVhbShzdHJlYW0pLCBfc291cmNlKE5VTEwpLCBfY2hlY2tzdW1UeXBlKHNwaWxsLT5jaGVja1N1bVR5cGUpLCBfa1R5cGUoc3BpbGwtPmtleVR5cGUpLAorICAgICAgICBfdlR5cGUoc3BpbGwtPnZhbHVlVHlwZSksIF9jb2RlYyhzcGlsbC0+Y29kZWMpLCBfc2VnbWVudEluZGV4KC0xKSwgX3NwaWxsSW5mbyhzcGlsbCksCisgICAgICAgIF92YWx1ZVBvcyhOVUxMKSwgX3ZhbHVlTGVuKDApLCBfZGVsZXRlU291cmNlU3RyZWFtKGRlbGV0ZUlucHV0U3RyZWFtKSB7CisgIF9zb3VyY2UgPSBuZXcgQ2hlY2tzdW1JbnB1dFN0cmVhbShfc3RyZWFtLCBfY2hlY2tzdW1UeXBlKTsKKyAgX3NvdXJjZS0+c2V0TGltaXQoMCk7CisgIF9yZWFkZXIuaW5pdCgxMjggKiAxMDI0LCBfc291cmNlLCBfY29kZWMpOworfQorCitJRmlsZVJlYWRlcjo6fklGaWxlUmVhZGVyKCkgeworCisgIGRlbGV0ZSBfc291cmNlOworICBfc291cmNlID0gTlVMTDsKKworICBpZiAoX2RlbGV0ZVNvdXJjZVN0cmVhbSkgeworICAgIGRlbGV0ZSBfc3RyZWFtOworICAgIF9zdHJlYW0gPSBOVUxMOworICB9Cit9CisKKy8qKgorICogMCBpZiBzdWNjZXNzCisgKiAxIGlmIGVuZAorICovCitib29sIElGaWxlUmVhZGVyOjpuZXh0UGFydGl0aW9uKCkgeworICBpZiAoMCAhPSBfc291cmNlLT5nZXRMaW1pdCgpKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiYmFkIGlmaWxlIHNlZ21lbnQgbGVuZ3RoIik7CisgIH0KKyAgaWYgKF9zZWdtZW50SW5kZXggPj0gMCkgeworICAgIC8vIHZlcmlmeSBjaGVja3N1bQorICAgIHVpbnQzMl90IGNoc3VtID0gMDsKKyAgICBpZiAoNCAhPSBfc3RyZWFtLT5yZWFkRnVsbHkoJmNoc3VtLCA0KSkgeworICAgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAicmVhZCBpZmlsZSBjaGVja3N1bSBmYWlsZWQiKTsKKyAgICB9CisgICAgdWludDMyX3QgYWN0dWFsID0gYnN3YXAoY2hzdW0pOworICAgIHVpbnQzMl90IGV4cGVjdCA9IF9zb3VyY2UtPmdldENoZWNrc3VtKCk7CisgICAgaWYgKGFjdHVhbCAhPSBleHBlY3QpIHsKKyAgICAgIFRIUk9XX0VYQ0VQVElPTl9FWChJT0V4Y2VwdGlvbiwgInJlYWQgaWZpbGUgY2hlY2tzdW0gbm90IG1hdGNoLCBhY3R1YWwgJXggZXhwZWN0ICV4IiwgYWN0dWFsLAorICAgICAgICAgIGV4cGVjdCk7CisgICAgfQorICB9CisgIF9zZWdtZW50SW5kZXgrKzsKKyAgaWYgKF9zZWdtZW50SW5kZXggPCAoaW50KShfc3BpbGxJbmZvLT5sZW5ndGgpKSB7CisgICAgaW50NjRfdCBlbmRfcG9zID0gKGludDY0X3QpX3NwaWxsSW5mby0+c2VnbWVudHNbX3NlZ21lbnRJbmRleF0ucmVhbEVuZE9mZnNldDsKKyAgICBpZiAoX3NlZ21lbnRJbmRleCA+IDApIHsKKyAgICAgIGVuZF9wb3MgLT0gKGludDY0X3QpX3NwaWxsSW5mby0+c2VnbWVudHNbX3NlZ21lbnRJbmRleCAtIDFdLnJlYWxFbmRPZmZzZXQ7CisgICAgfQorICAgIGlmIChlbmRfcG9zIDwgMCkgeworICAgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiYmFkIGlmaWxlIGZvcm1hdCIpOworICAgIH0KKyAgICAvLyBleGNsdWRlIGNoZWNrc3VtCisgICAgX3NvdXJjZS0+c2V0TGltaXQoZW5kX3BvcyAtIDQpOworICAgIF9zb3VyY2UtPnJlc2V0Q2hlY2tzdW0oKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSUZpbGVXcml0ZXIgKiBJRmlsZVdyaXRlcjo6Y3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZXBhdGgsIGNvbnN0IE1hcE91dHB1dFNwZWMgJiBzcGVjLAorICAgIENvdW50ZXIgKiBzcGlsbGVkUmVjb3JkcykgeworICBPdXRwdXRTdHJlYW0gKiBmb3V0ID0gRmlsZVN5c3RlbTo6Z2V0TG9jYWwoKS5jcmVhdGUoZmlsZXBhdGgsIHRydWUpOworICBJRmlsZVdyaXRlciAqIHdyaXRlciA9IG5ldyBJRmlsZVdyaXRlcihmb3V0LCBzcGVjLmNoZWNrc3VtVHlwZSwgc3BlYy5rZXlUeXBlLCBzcGVjLnZhbHVlVHlwZSwKKyAgICAgIHNwZWMuY29kZWMsIHNwaWxsZWRSZWNvcmRzLCB0cnVlKTsKKyAgcmV0dXJuIHdyaXRlcjsKK30KKworSUZpbGVXcml0ZXI6OklGaWxlV3JpdGVyKE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgQ2hlY2tzdW1UeXBlIGNoZWNrc3VtVHlwZSwgS2V5VmFsdWVUeXBlIGt0eXBlLAorICAgIEtleVZhbHVlVHlwZSB2dHlwZSwgY29uc3Qgc3RyaW5nICYgY29kZWMsIENvdW50ZXIgKiBjb3VudGVyLCBib29sIGRlbGV0ZVRhcmdldFN0cmVhbSkKKyAgICA6IF9zdHJlYW0oc3RyZWFtKSwgX2Rlc3QoTlVMTCksIF9jaGVja3N1bVR5cGUoY2hlY2tzdW1UeXBlKSwgX2tUeXBlKGt0eXBlKSwgX3ZUeXBlKHZ0eXBlKSwKKyAgICAgICAgX2NvZGVjKGNvZGVjKSwgX3JlY29yZENvdW50ZXIoY291bnRlciksIF9yZWNvcmRDb3VudCgwKSwgX2RlbGV0ZVRhcmdldFN0cmVhbShkZWxldGVUYXJnZXRTdHJlYW0pIHsKKyAgX2Rlc3QgPSBuZXcgQ2hlY2tzdW1PdXRwdXRTdHJlYW0oX3N0cmVhbSwgX2NoZWNrc3VtVHlwZSk7CisgIF9hcHBlbmRCdWZmZXIuaW5pdCgxMjggKiAxMDI0LCBfZGVzdCwgX2NvZGVjKTsKK30KKworSUZpbGVXcml0ZXI6On5JRmlsZVdyaXRlcigpIHsKKyAgZGVsZXRlIF9kZXN0OworICBfZGVzdCA9IE5VTEw7CisKKyAgaWYgKF9kZWxldGVUYXJnZXRTdHJlYW0pIHsKKyAgICBkZWxldGUgX3N0cmVhbTsKKyAgICBfc3RyZWFtID0gTlVMTDsKKyAgfQorfQorCit2b2lkIElGaWxlV3JpdGVyOjpzdGFydFBhcnRpdGlvbigpIHsKKyAgX3NwaWxsRmlsZVNlZ21lbnRzLnB1c2hfYmFjayhJRmlsZVNlZ21lbnQoKSk7CisgIF9kZXN0LT5yZXNldENoZWNrc3VtKCk7Cit9CisKK3ZvaWQgSUZpbGVXcml0ZXI6OmVuZFBhcnRpdGlvbigpIHsKKyAgY2hhciBFT0ZNYXJrZXJbMl0gPSB7LTEsIC0xfTsKKyAgX2FwcGVuZEJ1ZmZlci53cml0ZShFT0ZNYXJrZXIsIDIpOworICBfYXBwZW5kQnVmZmVyLmZsdXNoKCk7CisKKyAgQ29tcHJlc3NTdHJlYW0gKiBjb21wcmVzc2lvblN0cmVhbSA9IF9hcHBlbmRCdWZmZXIuZ2V0Q29tcHJlc3Npb25TdHJlYW0oKTsKKyAgaWYgKE5VTEwgIT0gY29tcHJlc3Npb25TdHJlYW0pIHsKKyAgICBjb21wcmVzc2lvblN0cmVhbS0+ZmluaXNoKCk7CisgICAgY29tcHJlc3Npb25TdHJlYW0tPnJlc2V0U3RhdGUoKTsKKyAgfQorCisgIHVpbnQzMl90IGNoc3VtID0gX2Rlc3QtPmdldENoZWNrc3VtKCk7CisgIGNoc3VtID0gYnN3YXAoY2hzdW0pOworICBfc3RyZWFtLT53cml0ZSgmY2hzdW0sIHNpemVvZihjaHN1bSkpOworICBfc3RyZWFtLT5mbHVzaCgpOworICBJRmlsZVNlZ21lbnQgKiBpbmZvID0gJihfc3BpbGxGaWxlU2VnbWVudHNbX3NwaWxsRmlsZVNlZ21lbnRzLnNpemUoKSAtIDFdKTsKKyAgaW5mby0+dW5jb21wcmVzc2VkRW5kT2Zmc2V0ID0gX2FwcGVuZEJ1ZmZlci5nZXRDb3VudGVyKCk7CisgIGluZm8tPnJlYWxFbmRPZmZzZXQgPSBfc3RyZWFtLT50ZWxsKCk7Cit9CisKK3ZvaWQgSUZpbGVXcml0ZXI6OndyaXRlKGNvbnN0IGNoYXIgKiBrZXksIHVpbnQzMl90IGtleUxlbiwgY29uc3QgY2hhciAqIHZhbHVlLCB1aW50MzJfdCB2YWx1ZUxlbikgeworICAvLyBhcHBlbmQgS2V5TGVuZ3RoIFZhbHVlTGVuZ3RoIEtleUJ5dGVzTGVuZ3RoCisgIHVpbnQzMl90IGtleUJ1ZmZMZW4gPSBrZXlMZW47CisgIHVpbnQzMl90IHZhbEJ1ZmZMZW4gPSB2YWx1ZUxlbjsKKyAgc3dpdGNoIChfa1R5cGUpIHsKKyAgY2FzZSBUZXh0VHlwZToKKyAgICBrZXlCdWZmTGVuICs9IFdyaXRhYmxlVXRpbHM6OkdldFZMb25nU2l6ZShrZXlMZW4pOworICAgIGJyZWFrOworICBjYXNlIEJ5dGVzVHlwZToKKyAgICBrZXlCdWZmTGVuICs9IDQ7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKF92VHlwZSkgeworICBjYXNlIFRleHRUeXBlOgorICAgIHZhbEJ1ZmZMZW4gKz0gV3JpdGFibGVVdGlsczo6R2V0VkxvbmdTaXplKHZhbHVlTGVuKTsKKyAgICBicmVhazsKKyAgY2FzZSBCeXRlc1R5cGU6CisgICAgdmFsQnVmZkxlbiArPSA0OworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisKKyAgX2FwcGVuZEJ1ZmZlci53cml0ZV92dWludDIoa2V5QnVmZkxlbiwgdmFsQnVmZkxlbik7CisKKyAgc3dpdGNoIChfa1R5cGUpIHsKKyAgY2FzZSBUZXh0VHlwZToKKyAgICBfYXBwZW5kQnVmZmVyLndyaXRlX3Z1aW50KGtleUxlbik7CisgICAgYnJlYWs7CisgIGNhc2UgQnl0ZXNUeXBlOgorICAgIF9hcHBlbmRCdWZmZXIud3JpdGVfdWludDMyX2JlKGtleUxlbik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoa2V5TGVuID4gMCkgeworICAgIF9hcHBlbmRCdWZmZXIud3JpdGUoa2V5LCBrZXlMZW4pOworICB9CisKKyAgaWYgKE5VTEwgIT0gX3JlY29yZENvdW50ZXIpIHsKKyAgICBfcmVjb3JkQ291bnRlci0+aW5jcmVhc2UoKTsKKyAgfQorICBfcmVjb3JkQ291bnQrKzsKKworICBzd2l0Y2ggKF92VHlwZSkgeworICBjYXNlIFRleHRUeXBlOgorICAgIF9hcHBlbmRCdWZmZXIud3JpdGVfdnVpbnQodmFsdWVMZW4pOworICAgIGJyZWFrOworICBjYXNlIEJ5dGVzVHlwZToKKyAgICBfYXBwZW5kQnVmZmVyLndyaXRlX3VpbnQzMl9iZSh2YWx1ZUxlbik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgaWYgKHZhbHVlTGVuID4gMCkgeworICAgIF9hcHBlbmRCdWZmZXIud3JpdGUodmFsdWUsIHZhbHVlTGVuKTsKKyAgfQorfQorCitJRmlsZVNlZ21lbnQgKiBJRmlsZVdyaXRlcjo6dG9BcnJheShzdGQ6OnZlY3RvcjxJRmlsZVNlZ21lbnQ+ICpzZWdtZW50cykgeworICBJRmlsZVNlZ21lbnQgKiBzZWdzID0gbmV3IElGaWxlU2VnbWVudFtzZWdtZW50cy0+c2l6ZSgpXTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZWdtZW50cy0+c2l6ZSgpOyBpKyspIHsKKyAgICBzZWdzW2ldID0gc2VnbWVudHMtPmF0KGkpOworICB9CisgIHJldHVybiBzZWdzOworfQorCitTaW5nbGVTcGlsbEluZm8gKiBJRmlsZVdyaXRlcjo6Z2V0U3BpbGxJbmZvKCkgeworICBjb25zdCB1aW50MzJfdCBzaXplID0gX3NwaWxsRmlsZVNlZ21lbnRzLnNpemUoKTsKKyAgcmV0dXJuIG5ldyBTaW5nbGVTcGlsbEluZm8odG9BcnJheSgmX3NwaWxsRmlsZVNlZ21lbnRzKSwgc2l6ZSwgIiIsIF9jaGVja3N1bVR5cGUsIF9rVHlwZSwgX3ZUeXBlLAorICAgICAgX2NvZGVjKTsKK30KKwordm9pZCBJRmlsZVdyaXRlcjo6Z2V0U3RhdGlzdGljcyh1aW50NjRfdCAmIG9mZnNldCwgdWludDY0X3QgJiByZWFsT2Zmc2V0LCB1aW50NjRfdCAmIHJlY29yZENvdW50KSB7CisgIGlmIChfc3BpbGxGaWxlU2VnbWVudHMuc2l6ZSgpID4gMCkgeworICAgIG9mZnNldCA9IF9zcGlsbEZpbGVTZWdtZW50c1tfc3BpbGxGaWxlU2VnbWVudHMuc2l6ZSgpIC0gMV0udW5jb21wcmVzc2VkRW5kT2Zmc2V0OworICAgIHJlYWxPZmZzZXQgPSBfc3BpbGxGaWxlU2VnbWVudHNbX3NwaWxsRmlsZVNlZ21lbnRzLnNpemUoKSAtIDFdLnJlYWxFbmRPZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgb2Zmc2V0ID0gMDsKKyAgICByZWFsT2Zmc2V0ID0gMDsKKyAgfQorICByZWNvcmRDb3VudCA9IF9yZWNvcmRDb3VudDsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9JRmlsZS5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvSUZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzk3ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvSUZpbGUuaApAQCAtMCwwICsxLDE2NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSUZJTEVfSF8KKyNkZWZpbmUgSUZJTEVfSF8KKworI2luY2x1ZGUgInV0aWwvQ2hlY2tzdW0uaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVycy5oIgorI2luY2x1ZGUgInV0aWwvV3JpdGFibGVVdGlscy5oIgorI2luY2x1ZGUgImxpYi9TcGlsbEluZm8uaCIKKyNpbmNsdWRlICJsaWIvTWFwT3V0cHV0U3BlYy5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKy8qKgorICogSUZpbGVSZWFkZXIKKyAqLworY2xhc3MgSUZpbGVSZWFkZXIgeworcHJpdmF0ZToKKyAgSW5wdXRTdHJlYW0gKiBfc3RyZWFtOworICBDaGVja3N1bUlucHV0U3RyZWFtICogX3NvdXJjZTsKKyAgUmVhZEJ1ZmZlciBfcmVhZGVyOworICBDaGVja3N1bVR5cGUgX2NoZWNrc3VtVHlwZTsKKyAgS2V5VmFsdWVUeXBlIF9rVHlwZTsKKyAgS2V5VmFsdWVUeXBlIF92VHlwZTsKKyAgc3RyaW5nIF9jb2RlYzsKKyAgaW50MzJfdCBfc2VnbWVudEluZGV4OworICBTaW5nbGVTcGlsbEluZm8gKiBfc3BpbGxJbmZvOworICBjb25zdCBjaGFyICogX3ZhbHVlUG9zOworICB1aW50MzJfdCBfdmFsdWVMZW47CisgIGJvb2wgX2RlbGV0ZVNvdXJjZVN0cmVhbTsKKworcHVibGljOgorICBJRmlsZVJlYWRlcihJbnB1dFN0cmVhbSAqIHN0cmVhbSwgU2luZ2xlU3BpbGxJbmZvICogc3BpbGwsIGJvb2wgZGVsZXRlU291cmNlU3RyZWFtID0gZmFsc2UpOworCisgIHZpcnR1YWwgfklGaWxlUmVhZGVyKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gMCBpZiBoYXZlIG5leHQgcGFydGl0aW9uLCBub25lIDAgaWYgbm8gbW9yZSBwYXJ0aXRpb24KKyAgICovCisgIGJvb2wgbmV4dFBhcnRpdGlvbigpOworCisgIC8qKgorICAgKiBnZXQgbmV4dCBrZXkKKyAgICogTlVMTCBpZiBubyBtb3JlLCB0aGVuIG5leHRfcGFydGl0aW9uKCkgbmVlZCB0byBiZSBjYWxsZWQKKyAgICogTk9USUNFOiBiZWZvcmUgdmFsdWUoKSBpcyBjYWxsZWQsIHRoZSByZXR1cm4gcG9pbnRlciB2YWx1ZSBpcworICAgKiAgICAgICAgIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQKKyAgICovCisgIGNvbnN0IGNoYXIgKiBuZXh0S2V5KHVpbnQzMl90ICYga2V5TGVuKSB7CisgICAgaW50NjRfdCB0MSA9IF9yZWFkZXIucmVhZFZMb25nKCk7CisgICAgaW50NjRfdCB0MiA9IF9yZWFkZXIucmVhZFZMb25nKCk7CisgICAgaWYgKHQxID09IC0xKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY29uc3QgY2hhciAqIGt2YnVmZiA9IF9yZWFkZXIuZ2V0KCh1aW50MzJfdCkodDEgKyB0MikpOworICAgIHVpbnQzMl90IGxlbjsKKyAgICBzd2l0Y2ggKF9rVHlwZSkgeworICAgIGNhc2UgVGV4dFR5cGU6CisgICAgICBrZXlMZW4gPSBXcml0YWJsZVV0aWxzOjpSZWFkVkludChrdmJ1ZmYsIGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJ5dGVzVHlwZToKKyAgICAgIGtleUxlbiA9IGJzd2FwKCoodWludDMyX3QqKWt2YnVmZik7CisgICAgICBsZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGtleUxlbiA9IHQxOworICAgICAgbGVuID0gMDsKKyAgICB9CisgICAgY29uc3QgY2hhciAqIGtidWZmID0ga3ZidWZmICsgbGVuOworICAgIGNvbnN0IGNoYXIgKiB2YnVmZiA9IGt2YnVmZiArICh1aW50MzJfdCl0MTsKKyAgICBzd2l0Y2ggKF92VHlwZSkgeworICAgIGNhc2UgVGV4dFR5cGU6CisgICAgICBfdmFsdWVMZW4gPSBXcml0YWJsZVV0aWxzOjpSZWFkVkludCh2YnVmZiwgbGVuKTsKKyAgICAgIF92YWx1ZVBvcyA9IHZidWZmICsgbGVuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCeXRlc1R5cGU6CisgICAgICBfdmFsdWVMZW4gPSBic3dhcCgqKHVpbnQzMl90Kil2YnVmZik7CisgICAgICBfdmFsdWVQb3MgPSB2YnVmZiArIDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX3ZhbHVlTGVuID0gdDI7CisgICAgICBfdmFsdWVQb3MgPSB2YnVmZjsKKyAgICB9CisgICAgcmV0dXJuIGtidWZmOworICB9CisKKyAgLyoqCisgICAqIGxlbmd0aCBvZiBjdXJyZW50IHZhbHVlIHBhcnQgb2YgSUZpbGUgZW50cnkKKyAgICovCisgIHVpbnQzMl90IHZhbHVlTGVuKCkgeworICAgIHJldHVybiBfdmFsdWVMZW47CisgIH0KKworICAvKioKKyAgICogZ2V0IGN1cnJlbnQgdmFsdWUKKyAgICovCisgIGNvbnN0IGNoYXIgKiB2YWx1ZSh1aW50MzJfdCAmIHZhbHVlTGVuKSB7CisgICAgdmFsdWVMZW4gPSBfdmFsdWVMZW47CisgICAgcmV0dXJuIF92YWx1ZVBvczsKKyAgfQorfTsKKworLyoqCisgKiBJRmlsZSBXcml0ZXIKKyAqLworY2xhc3MgSUZpbGVXcml0ZXIgOiBwdWJsaWMgQ29sbGVjdG9yIHsKK3Byb3RlY3RlZDoKKyAgT3V0cHV0U3RyZWFtICogX3N0cmVhbTsKKyAgQ2hlY2tzdW1PdXRwdXRTdHJlYW0gKiBfZGVzdDsKKyAgQ2hlY2tzdW1UeXBlIF9jaGVja3N1bVR5cGU7CisgIEtleVZhbHVlVHlwZSBfa1R5cGU7CisgIEtleVZhbHVlVHlwZSBfdlR5cGU7CisgIHN0cmluZyBfY29kZWM7CisgIEFwcGVuZEJ1ZmZlciBfYXBwZW5kQnVmZmVyOworICB2ZWN0b3I8SUZpbGVTZWdtZW50PiBfc3BpbGxGaWxlU2VnbWVudHM7CisgIENvdW50ZXIgKiBfcmVjb3JkQ291bnRlcjsKKyAgdWludDY0X3QgX3JlY29yZENvdW50OworCisgIGJvb2wgX2RlbGV0ZVRhcmdldFN0cmVhbTsKKworcHJpdmF0ZToKKyAgSUZpbGVTZWdtZW50ICogdG9BcnJheShzdGQ6OnZlY3RvcjxJRmlsZVNlZ21lbnQ+ICpzZWdtZW50cyk7CisKK3B1YmxpYzoKKyAgc3RhdGljIElGaWxlV3JpdGVyICogY3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZXBhdGgsIGNvbnN0IE1hcE91dHB1dFNwZWMgJiBzcGVjLAorICAgICAgQ291bnRlciAqIHNwaWxsZWRSZWNvcmRzKTsKKworICBJRmlsZVdyaXRlcihPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIENoZWNrc3VtVHlwZSBjaGVja3N1bVR5cGUsIEtleVZhbHVlVHlwZSBrdHlwZSwKKyAgICAgIEtleVZhbHVlVHlwZSB2dHlwZSwgY29uc3Qgc3RyaW5nICYgY29kZWMsIENvdW50ZXIgKiByZWNvcmRDb3VudGVyLAorICAgICAgYm9vbCBkZWxldGVUYXJnZXRTdHJlYW0gPSBmYWxzZSk7CisKKyAgdmlydHVhbCB+SUZpbGVXcml0ZXIoKTsKKworICB2b2lkIHN0YXJ0UGFydGl0aW9uKCk7CisKKyAgdm9pZCBlbmRQYXJ0aXRpb24oKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgY2hhciAqIGtleSwgdWludDMyX3Qga2V5TGVuLCBjb25zdCBjaGFyICogdmFsdWUsIHVpbnQzMl90IHZhbHVlTGVuKTsKKworICBTaW5nbGVTcGlsbEluZm8gKiBnZXRTcGlsbEluZm8oKTsKKworICB2b2lkIGdldFN0YXRpc3RpY3ModWludDY0X3QgJiBvZmZzZXQsIHVpbnQ2NF90ICYgcmVhbE9mZnNldCwgdWludDY0X3QgJiByZWNvcmRDb3VudCk7CisKKyAgdmlydHVhbCB2b2lkIGNvbGxlY3QoY29uc3Qgdm9pZCAqIGtleSwgdWludDMyX3Qga2V5TGVuLCBjb25zdCB2b2lkICogdmFsdWUsIHVpbnQzMl90IHZhbHVlTGVuKSB7CisgICAgd3JpdGUoKGNvbnN0IGNoYXIqKWtleSwga2V5TGVuLCAoY29uc3QgY2hhciopdmFsdWUsIHZhbHVlTGVuKTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogSUZJTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0l0ZXJhdG9yLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvSXRlcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwNTE2YQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0l0ZXJhdG9yLmNjCkBAIC0wLDAgKzEsOTEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgImxpYi9JdGVyYXRvci5oIgorI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworS2V5R3JvdXBJdGVyYXRvckltcGw6OktleUdyb3VwSXRlcmF0b3JJbXBsKEtWSXRlcmF0b3IgKiBpdGVyYXRvcikKKyAgICA6IF9rZXlHcm91cEl0ZXJTdGF0ZShORVdfS0VZKSwgX2l0ZXJhdG9yKGl0ZXJhdG9yKSwgX2ZpcnN0KHRydWUpIHsKK30KKworYm9vbCBLZXlHcm91cEl0ZXJhdG9ySW1wbDo6bmV4dEtleSgpIHsKKyAgaWYgKF9rZXlHcm91cEl0ZXJTdGF0ZSA9PSBOT19NT1JFKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdWludDMyX3QgdGVtcDsKKyAgd2hpbGUgKF9rZXlHcm91cEl0ZXJTdGF0ZSA9PSBTQU1FX0tFWSB8fCBfa2V5R3JvdXBJdGVyU3RhdGUgPT0gTkVXX0tFWV9WQUxVRSkgeworICAgIG5leHRWYWx1ZSh0ZW1wKTsKKyAgfQorICBpZiAoX2tleUdyb3VwSXRlclN0YXRlID09IE5FV19LRVkpIHsKKyAgICBpZiAoX2ZpcnN0ID09IHRydWUpIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgaWYgKCFuZXh0KCkpIHsKKyAgICAgICAgX2tleUdyb3VwSXRlclN0YXRlID0gTk9fTU9SRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBfa2V5R3JvdXBJdGVyU3RhdGUgPSBORVdfS0VZX1ZBTFVFOworICAgIF9jdXJyZW50R3JvdXBLZXkuYXNzaWduKF9rZXkuZGF0YSgpLCBfa2V5Lmxlbmd0aCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0IGNoYXIgKiBLZXlHcm91cEl0ZXJhdG9ySW1wbDo6Z2V0S2V5KHVpbnQzMl90ICYgbGVuKSB7CisgIGxlbiA9ICh1aW50MzJfdClfa2V5Lmxlbmd0aCgpOworICByZXR1cm4gX2tleS5kYXRhKCk7Cit9CisKK2NvbnN0IGNoYXIgKiBLZXlHcm91cEl0ZXJhdG9ySW1wbDo6bmV4dFZhbHVlKHVpbnQzMl90ICYgbGVuKSB7CisgIHN3aXRjaCAoX2tleUdyb3VwSXRlclN0YXRlKSB7CisgIGNhc2UgTkVXX0tFWTogeworICAgIHJldHVybiBOVUxMOworICB9CisgIGNhc2UgU0FNRV9LRVk6IHsKKyAgICBpZiAobmV4dCgpKSB7CisgICAgICBpZiAoX2tleS5sZW5ndGgoKSA9PSBfY3VycmVudEdyb3VwS2V5Lmxlbmd0aCgpKSB7CisgICAgICAgIGlmIChmbWVtZXEoX2tleS5kYXRhKCksIF9jdXJyZW50R3JvdXBLZXkuY19zdHIoKSwgX2tleS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICBsZW4gPSBfdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgcmV0dXJuIF92YWx1ZS5kYXRhKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9rZXlHcm91cEl0ZXJTdGF0ZSA9IE5FV19LRVk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgX2tleUdyb3VwSXRlclN0YXRlID0gTk9fTU9SRTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjYXNlIE5FV19LRVlfVkFMVUU6IHsKKyAgICBfa2V5R3JvdXBJdGVyU3RhdGUgPSBTQU1FX0tFWTsKKyAgICBsZW4gPSBfdmFsdWUubGVuZ3RoKCk7CisgICAgcmV0dXJuIF92YWx1ZS5kYXRhKCk7CisgIH0KKyAgY2FzZSBOT19NT1JFOgorICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBOVUxMOworfQorCitib29sIEtleUdyb3VwSXRlcmF0b3JJbXBsOjpuZXh0KCkgeworICBib29sIHJlc3VsdCA9IF9pdGVyYXRvci0+bmV4dChfa2V5LCBfdmFsdWUpOworICByZXR1cm4gcmVzdWx0OworfQorCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9JdGVyYXRvci5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvSXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI1ZjAzCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvSXRlcmF0b3IuaApAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJVEVSQVRPUl9IXworI2RlZmluZSBJVEVSQVRPUl9IXworCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2NsYXNzIEtleUdyb3VwSXRlcmF0b3JJbXBsIDogcHVibGljIEtleUdyb3VwSXRlcmF0b3IgeworcHJvdGVjdGVkOgorICAvLyBmb3IgS2V5R3JvdXBJdGVyYXRvcgorICBLZXlHcm91cEl0ZXJTdGF0ZSBfa2V5R3JvdXBJdGVyU3RhdGU7CisgIEtWSXRlcmF0b3IgKiBfaXRlcmF0b3I7CisgIHN0cmluZyBfY3VycmVudEdyb3VwS2V5OworICBCdWZmZXIgX2tleTsKKyAgQnVmZmVyIF92YWx1ZTsKKyAgYm9vbCBfZmlyc3Q7CisKK3B1YmxpYzoKKyAgS2V5R3JvdXBJdGVyYXRvckltcGwoS1ZJdGVyYXRvciAqIGl0ZXJhdG9yKTsKKyAgYm9vbCBuZXh0S2V5KCk7CisgIGNvbnN0IGNoYXIgKiBnZXRLZXkodWludDMyX3QgJiBsZW4pOworICBjb25zdCBjaGFyICogbmV4dFZhbHVlKHVpbnQzMl90ICYgbGVuKTsKKworcHJvdGVjdGVkOgorICBib29sIG5leHQoKTsKK307CisKK30gLy9uYW1lc3BhY2UgTmF0aXZlVGFzaworI2VuZGlmCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9Mb2cuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9Mb2cuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzNmUxOAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0xvZy5jYwpAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9Mb2cuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCisjaWZkZWYgUFJJTlRfTE9HCisKK0ZJTEUgKiBMT0dfREVWSUNFID0gc3RkZXJyOworCisjZW5kaWYKKworfSAvL25hbWVzcGFjZSBOYXRpdmVUYXNrCisKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0xvZy5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjMTdmMwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL0xvZy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIExPR19IXworI2RlZmluZSBMT0dfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKyNkZWZpbmUgUFJJTlRfTE9HCisKKyNpZmRlZiBQUklOVF9MT0cKKworZXh0ZXJuIEZJTEUgKiBMT0dfREVWSUNFOworI2RlZmluZSBMT0coX2ZtdF8sIGFyZ3MuLi4pICAgaWYgKExPR19ERVZJQ0UpIHsgXAorICAgIHRpbWVfdCBsb2dfdGltZXI7IHN0cnVjdCB0bSBsb2dfdG07IFwKKyAgICB0aW1lKCZsb2dfdGltZXIpOyBsb2NhbHRpbWVfcigmbG9nX3RpbWVyLCAmbG9nX3RtKTsgXAorICAgIGZwcmludGYoTE9HX0RFVklDRSwgIiUwMmQvJTAyZC8lMDJkICUwMmQ6JTAyZDolMDJkIElORk8gIl9mbXRfIlxuIiwgXAorICAgIGxvZ190bS50bV95ZWFyJTEwMCwgbG9nX3RtLnRtX21vbisxLCBsb2dfdG0udG1fbWRheSwgXAorICAgIGxvZ190bS50bV9ob3VyLCBsb2dfdG0udG1fbWluLCBsb2dfdG0udG1fc2VjLCBcCisgICAgIyNhcmdzKTt9CisKKyNlbHNlCisKKyNkZWZpbmUgTE9HKF9mbXRfLCBhcmdzLi4uKQorCisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogTE9HX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NYXBPdXRwdXRDb2xsZWN0b3IuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NYXBPdXRwdXRDb2xsZWN0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NWIyMwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01hcE91dHB1dENvbGxlY3Rvci5jYwpAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAidXRpbC9UaW1lci5oIgorI2luY2x1ZGUgInV0aWwvU3RyaW5nVXRpbC5oIgorI2luY2x1ZGUgImxpYi9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAibGliL05hdGl2ZU9iamVjdEZhY3RvcnkuaCIKKyNpbmNsdWRlICJsaWIvTWFwT3V0cHV0Q29sbGVjdG9yLmgiCisjaW5jbHVkZSAibGliL01lcmdlLmgiCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorI2luY2x1ZGUgInV0aWwvV3JpdGFibGVVdGlscy5oIgorI2luY2x1ZGUgInV0aWwvRHVhbFBpdm90UXVpY2tTb3J0LmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisjaW5jbHVkZSAibGliL1Rhc2tDb3VudGVycy5oIgorI2luY2x1ZGUgImxpYi9NaW5IZWFwLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworSUNvbWJpbmVSdW5uZXIgKiBDb21iaW5lUnVubmVyV3JhcHBlcjo6Y3JlYXRlQ29tYmluZXIoKSB7CisKKyAgSUNvbWJpbmVSdW5uZXIgKiBjb21iaW5lUnVubmVyID0gTlVMTDsKKyAgaWYgKE5VTEwgIT0gX2NvbmZpZy0+Z2V0KE5BVElWRV9DT01CSU5FUikpIHsKKyAgICAvLyBFYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgY29kZSBzdXBwb3J0ZWQgdXNlci1kZWZpbmVkCisgICAgLy8gbmF0aXZlIENvbWJpbmVyIGltcGxlbWVudGF0aW9ucy4gVGhpcyBzaW1wbGlmaWVkIHZlcnNpb24KKyAgICAvLyBubyBsb25nZXIgc3VwcG9ydHMgaXQuCisgICAgVEhST1dfRVhDRVBUSU9OX0VYKFVuc3VwcG9ydEV4Y2VwdGlvbiwgIk5hdGl2ZSBDb21iaW5lcnMgbm90IHN1cHBvcnRlZCIpOworICB9CisKKyAgQ29tYmluZUhhbmRsZXIgKiBqYXZhQ29tYmluZXIgPSBfc3BpbGxPdXRwdXQtPmdldEphdmFDb21iaW5lSGFuZGxlcigpOworICBpZiAoTlVMTCAhPSBqYXZhQ29tYmluZXIpIHsKKyAgICBfaXNKYXZhQ29tYmluZXIgPSB0cnVlOworICAgIGNvbWJpbmVSdW5uZXIgPSAoSUNvbWJpbmVSdW5uZXIgKilqYXZhQ29tYmluZXI7CisgIH0gZWxzZSB7CisgICAgTE9HKCJbTWFwT3V0cHV0Q29sbGVjdG9yOjpnZXRDb21iaW5lcl0gY2Fubm90IGdldCBjb21iaW5lIGhhbmRsZXIgZnJvbSBqYXZhIik7CisgIH0KKyAgcmV0dXJuIGNvbWJpbmVSdW5uZXI7Cit9CisKK3ZvaWQgQ29tYmluZVJ1bm5lcldyYXBwZXI6OmNvbWJpbmUoQ29tYmluZUNvbnRleHQgdHlwZSwgS1ZJdGVyYXRvciAqIGt2SXRlcmF0b3IsCisgICAgSUZpbGVXcml0ZXIgKiB3cml0ZXIpIHsKKworICBpZiAoIV9jb21iaW5lckluaXRlZCkgeworICAgIF9jb21iaW5lUnVubmVyID0gY3JlYXRlQ29tYmluZXIoKTsKKyAgICBfY29tYmluZXJJbml0ZWQgPSB0cnVlOworICB9CisKKyAgaWYgKE5VTEwgIT0gX2NvbWJpbmVSdW5uZXIpIHsKKyAgICBfY29tYmluZVJ1bm5lci0+Y29tYmluZSh0eXBlLCBrdkl0ZXJhdG9yLCB3cml0ZXIpOworICB9IGVsc2UgeworICAgIExPRygiW0NvbWJpbmVSdW5uZXJXcmFwcGVyOjpjb21iaW5lXSBubyB2YWxpZCBjb21iaW5lciIpOworICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNYXBPdXRwdXRDb2xsZWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01hcE91dHB1dENvbGxlY3Rvcjo6TWFwT3V0cHV0Q29sbGVjdG9yKHVpbnQzMl90IG51bWJlclBhcnRpdGlvbnMsIFNwaWxsT3V0cHV0U2VydmljZSAqIHNwaWxsU2VydmljZSkKKyAgICA6IF9jb25maWcoTlVMTCksIF9udW1QYXJ0aXRpb25zKG51bWJlclBhcnRpdGlvbnMpLCBfYnVja2V0cyhOVUxMKSwKKyAgICAgIF9rZXlDb21wYXJhdG9yKE5VTEwpLCBfY29tYmluZVJ1bm5lcihOVUxMKSwKKyAgICAgIF9tYXBPdXRwdXRSZWNvcmRzKE5VTEwpLCBfbWFwT3V0cHV0Qnl0ZXMoTlVMTCksCisgICAgICBfbWFwT3V0cHV0TWF0ZXJpYWxpemVkQnl0ZXMoTlVMTCksIF9zcGlsbGVkUmVjb3JkcyhOVUxMKSwKKyAgICAgIF9zcGlsbE91dHB1dChzcGlsbFNlcnZpY2UpLCBfZGVmYXVsdEJsb2NrU2l6ZSgwKSwgX3Bvb2woTlVMTCkgeworICBfcG9vbCA9IG5ldyBNZW1vcnlQb29sKCk7Cit9CisKK01hcE91dHB1dENvbGxlY3Rvcjo6fk1hcE91dHB1dENvbGxlY3RvcigpIHsKKworICBpZiAoTlVMTCAhPSBfYnVja2V0cykgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBfbnVtUGFydGl0aW9uczsgaSsrKSB7CisgICAgICBpZiAoTlVMTCAhPSBfYnVja2V0c1tpXSkgeworICAgICAgICBkZWxldGUgX2J1Y2tldHNbaV07CisgICAgICAgIF9idWNrZXRzW2ldID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBkZWxldGVbXSBfYnVja2V0czsKKyAgX2J1Y2tldHMgPSBOVUxMOworCisgIGlmIChOVUxMICE9IF9wb29sKSB7CisgICAgZGVsZXRlIF9wb29sOworICAgIF9wb29sID0gTlVMTDsKKyAgfQorCisgIGlmIChOVUxMICE9IF9jb21iaW5lUnVubmVyKSB7CisgICAgZGVsZXRlIF9jb21iaW5lUnVubmVyOworICAgIF9jb21iaW5lUnVubmVyID0gTlVMTDsKKyAgfQorfQorCit2b2lkIE1hcE91dHB1dENvbGxlY3Rvcjo6aW5pdCh1aW50MzJfdCBkZWZhdWx0QmxvY2tTaXplLCB1aW50MzJfdCBtZW1vcnlDYXBhY2l0eSwKKyAgICBDb21wYXJhdG9yUHRyIGtleUNvbXBhcmF0b3IsIElDb21iaW5lUnVubmVyICogY29tYmluZXIpIHsKKworICB0aGlzLT5fY29tYmluZVJ1bm5lciA9IGNvbWJpbmVyOworCisgIHRoaXMtPl9kZWZhdWx0QmxvY2tTaXplID0gZGVmYXVsdEJsb2NrU2l6ZTsKKworICBfcG9vbC0+aW5pdChtZW1vcnlDYXBhY2l0eSk7CisKKyAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIGN1c3RvbWl6ZWQgY29tcGFyYXRvcgorICB0aGlzLT5fa2V5Q29tcGFyYXRvciA9IGtleUNvbXBhcmF0b3I7CisKKyAgX2J1Y2tldHMgPSBuZXcgUGFydGl0aW9uQnVja2V0KltfbnVtUGFydGl0aW9uc107CisKKyAgZm9yICh1aW50MzJfdCBwYXJ0aXRpb25JZCA9IDA7IHBhcnRpdGlvbklkIDwgX251bVBhcnRpdGlvbnM7IHBhcnRpdGlvbklkKyspIHsKKyAgICBQYXJ0aXRpb25CdWNrZXQgKiBwYiA9IG5ldyBQYXJ0aXRpb25CdWNrZXQoX3Bvb2wsIHBhcnRpdGlvbklkLCBrZXlDb21wYXJhdG9yLCBfY29tYmluZVJ1bm5lciwKKyAgICAgICAgZGVmYXVsdEJsb2NrU2l6ZSk7CisKKyAgICBfYnVja2V0c1twYXJ0aXRpb25JZF0gPSBwYjsKKyAgfQorCisgIF9tYXBPdXRwdXRSZWNvcmRzID0gTmF0aXZlT2JqZWN0RmFjdG9yeTo6R2V0Q291bnRlcigKKyAgICAgIFRhc2tDb3VudGVyczo6VEFTS19DT1VOVEVSX0dST1VQLCBUYXNrQ291bnRlcnM6Ok1BUF9PVVRQVVRfUkVDT1JEUyk7CisgIF9tYXBPdXRwdXRCeXRlcyA9IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkdldENvdW50ZXIoCisgICAgICBUYXNrQ291bnRlcnM6OlRBU0tfQ09VTlRFUl9HUk9VUCwgVGFza0NvdW50ZXJzOjpNQVBfT1VUUFVUX0JZVEVTKTsKKyAgX21hcE91dHB1dE1hdGVyaWFsaXplZEJ5dGVzID0gTmF0aXZlT2JqZWN0RmFjdG9yeTo6R2V0Q291bnRlcigKKyAgICAgIFRhc2tDb3VudGVyczo6VEFTS19DT1VOVEVSX0dST1VQLAorICAgICAgVGFza0NvdW50ZXJzOjpNQVBfT1VUUFVUX01BVEVSSUFMSVpFRF9CWVRFUyk7CisgIF9zcGlsbGVkUmVjb3JkcyA9IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkdldENvdW50ZXIoCisgICAgICBUYXNrQ291bnRlcnM6OlRBU0tfQ09VTlRFUl9HUk9VUCwgVGFza0NvdW50ZXJzOjpTUElMTEVEX1JFQ09SRFMpOworCisgIF9jb2xsZWN0VGltZXIucmVzZXQoKTsKK30KKwordm9pZCBNYXBPdXRwdXRDb2xsZWN0b3I6OnJlc2V0KCkgeworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgX251bVBhcnRpdGlvbnM7IGkrKykgeworICAgIGlmIChOVUxMICE9IF9idWNrZXRzW2ldKSB7CisgICAgICBfYnVja2V0c1tpXS0+cmVzZXQoKTsKKyAgICB9CisgIH0KKyAgX3Bvb2wtPnJlc2V0KCk7Cit9CisKK3ZvaWQgTWFwT3V0cHV0Q29sbGVjdG9yOjpjb25maWd1cmUoQ29uZmlnICogY29uZmlnKSB7CisgIF9jb25maWcgPSBjb25maWc7CisgIE1hcE91dHB1dFNwZWM6OmdldFNwZWNGcm9tQ29uZmlnKGNvbmZpZywgX3NwZWMpOworCisgIHVpbnQzMl90IG1heEJsb2NrU2l6ZSA9IGNvbmZpZy0+Z2V0SW50KE5BVElWRV9TT1JUX01BWF9CTE9DS19TSVpFLCBERUZBVUxUX01BWF9CTE9DS19TSVpFKTsKKyAgdWludDMyX3QgY2FwYWNpdHkgPSBjb25maWctPmdldEludChNQVBSRURfSU9fU09SVF9NQiwgMzAwKSAqIDEwMjQgKiAxMDI0OworCisgIHVpbnQzMl90IGRlZmF1bHRCbG9ja1NpemUgPSBnZXREZWZhdWx0QmxvY2tTaXplKGNhcGFjaXR5LCBfbnVtUGFydGl0aW9ucywgbWF4QmxvY2tTaXplKTsKKyAgTE9HKCJOYXRpdmUgVG90YWwgTWVtb3J5QmxvY2tQb29sOiBudW1fcGFydGl0aW9ucyAldSwgbWluX2Jsb2NrX3NpemUgJXVLLCAiCisgICAgICAibWF4X2Jsb2NrX3NpemUgJXVLLCBjYXBhY2l0eSAldU0iLCBfbnVtUGFydGl0aW9ucywgZGVmYXVsdEJsb2NrU2l6ZSAvIDEwMjQsCisgICAgICBtYXhCbG9ja1NpemUgLyAxMDI0LCBjYXBhY2l0eSAvIDEwMjQgLyAxMDI0KTsKKworICBDb21wYXJhdG9yUHRyIGNvbXBhcmF0b3IgPSBnZXRDb21wYXJhdG9yKGNvbmZpZywgX3NwZWMpOworCisgIElDb21iaW5lUnVubmVyICogY29tYmluZXIgPSBOVUxMOworICBpZiAoTlVMTCAhPSBjb25maWctPmdldChOQVRJVkVfQ09NQklORVIpCisgICAgICAvLyBjb25maWcgbmFtZSBmb3Igb2xkIGFwaSBhbmQgbmV3IGFwaQorICAgICAgfHwgTlVMTCAhPSBjb25maWctPmdldChNQVBSRURfQ09NQklORV9DTEFTU19PTEQpCisgICAgICB8fCBOVUxMICE9IGNvbmZpZy0+Z2V0KE1BUFJFRF9DT01CSU5FX0NMQVNTX05FVykpIHsKKyAgICBjb21iaW5lciA9IG5ldyBDb21iaW5lUnVubmVyV3JhcHBlcihjb25maWcsIF9zcGlsbE91dHB1dCk7CisgIH0KKworICBpbml0KGRlZmF1bHRCbG9ja1NpemUsIGNhcGFjaXR5LCBjb21wYXJhdG9yLCBjb21iaW5lcik7Cit9CisKK0tWQnVmZmVyICogTWFwT3V0cHV0Q29sbGVjdG9yOjphbGxvY2F0ZUtWQnVmZmVyKHVpbnQzMl90IHBhcnRpdGlvbklkLCB1aW50MzJfdCBrdmxlbmd0aCkgeworICBQYXJ0aXRpb25CdWNrZXQgKiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocGFydGl0aW9uSWQpOworICBpZiAoTlVMTCA9PSBwYXJ0aXRpb24pIHsKKyAgICBUSFJPV19FWENFUFRJT05fRVgoSU9FeGNlcHRpb24sICJQYXJ0aXRpb24gaXMgTlVMTCwgcGFydGl0aW9uX2lkOiAlZCwgbnVtX3BhcnRpdGlvbnM6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uSWQsIF9udW1QYXJ0aXRpb25zKTsKKyAgfQorCisgIEtWQnVmZmVyICogZGVzdCA9IHBhcnRpdGlvbi0+YWxsb2NhdGVLVkJ1ZmZlcihrdmxlbmd0aCk7CisKKyAgaWYgKE5VTEwgPT0gZGVzdCkgeworICAgIHN0cmluZyAqIHNwaWxscGF0aCA9IF9zcGlsbE91dHB1dC0+Z2V0U3BpbGxQYXRoKCk7CisgICAgaWYgKE5VTEwgPT0gc3BpbGxwYXRoIHx8IHNwaWxscGF0aC0+bGVuZ3RoKCkgPT0gMCkgeworICAgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiSWxsZWdhbChlbXB0eSkgc3BpbGwgZmlsZXMgcGF0aCIpOworICAgIH0gZWxzZSB7CisgICAgICBtaWRkbGVTcGlsbCgqc3BpbGxwYXRoLCAiIiwgZmFsc2UpOworICAgICAgZGVsZXRlIHNwaWxscGF0aDsKKyAgICB9CisKKyAgICBkZXN0ID0gcGFydGl0aW9uLT5hbGxvY2F0ZUtWQnVmZmVyKGt2bGVuZ3RoKTsKKyAgICBpZiAoTlVMTCA9PSBkZXN0KSB7CisgICAgICAvLyBpby5zb3J0Lm1iIHRvbyBzbWFsbCwgY2Fubid0IHByb2NlZWQKKyAgICAgIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUsIGNhdXNlIGdldF9idWZmZXJfdG9fcHV0IGNhbiB0aHJvdyBPT00gZXhjZXB0aW9uCisgICAgICBUSFJPV19FWENFUFRJT04oT3V0T2ZNZW1vcnlFeGNlcHRpb24sICJrZXkvdmFsdWUgcGFpciBsYXJnZXIgdGhhbiBpby5zb3J0Lm1iIik7CisgICAgfQorICB9CisgIF9tYXBPdXRwdXRSZWNvcmRzLT5pbmNyZWFzZSgpOworICBfbWFwT3V0cHV0Qnl0ZXMtPmluY3JlYXNlKGt2bGVuZ3RoIC0gS1ZCdWZmZXI6OmhlYWRlckxlbmd0aCgpKTsKKyAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qKgorICogY29sbGVjdCBvbmUgay92IHBhaXIKKyAqIEByZXR1cm4gdHJ1ZSBzdWNjZXNzOyBmYWxzZSBidWZmZXIgZnVsbCwgbmVlZCBzcGlsbAorICovCitib29sIE1hcE91dHB1dENvbGxlY3Rvcjo6Y29sbGVjdChjb25zdCB2b2lkICoga2V5LCB1aW50MzJfdCBrZXlsZW4sIGNvbnN0IHZvaWQgKiB2YWx1ZSwKKyAgICB1aW50MzJfdCB2YWxsZW4sIHVpbnQzMl90IHBhcnRpdGlvbklkKSB7CisgIHVpbnQzMl90IHRvdGFsX2xlbmd0aCA9IGtleWxlbiArIHZhbGxlbiArIEtWQnVmZmVyOjpoZWFkZXJMZW5ndGgoKTsKKyAgS1ZCdWZmZXIgKiBidWZmID0gYWxsb2NhdGVLVkJ1ZmZlcihwYXJ0aXRpb25JZCwgdG90YWxfbGVuZ3RoKTsKKworICBpZiAoTlVMTCA9PSBidWZmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJ1ZmYtPmZpbGwoa2V5LCBrZXlsZW4sIHZhbHVlLCB2YWxsZW4pOworICByZXR1cm4gdHJ1ZTsKK30KKworQ29tcGFyYXRvclB0ciBNYXBPdXRwdXRDb2xsZWN0b3I6OmdldENvbXBhcmF0b3IoQ29uZmlnICogY29uZmlnLCBNYXBPdXRwdXRTcGVjICYgc3BlYykgeworICBzdHJpbmcgbmF0aXZlQ29tcGFyYXRvciA9IE5BVElWRV9NQVBPVVRfS0VZX0NPTVBBUkFUT1I7CisgIGNvbnN0IGNoYXIgKiBrZXlfY2xhc3MgPSBjb25maWctPmdldChNQVBSRURfTUFQT1VUUFVUX0tFWV9DTEFTUyk7CisgIGlmIChOVUxMID09IGtleV9jbGFzcykgeworICAgIGtleV9jbGFzcyA9IGNvbmZpZy0+Z2V0KE1BUFJFRF9PVVRQVVRfS0VZX0NMQVNTKTsKKyAgfQorICBuYXRpdmVDb21wYXJhdG9yLmFwcGVuZCgiLiIpLmFwcGVuZChrZXlfY2xhc3MpOworICBjb25zdCBjaGFyICogY29tcGFyYXRvck5hbWUgPSBjb25maWctPmdldChuYXRpdmVDb21wYXJhdG9yKTsKKyAgcmV0dXJuIE5hdGl2ZVRhc2s6OmdldF9jb21wYXJhdG9yKHNwZWMua2V5VHlwZSwgY29tcGFyYXRvck5hbWUpOworfQorCitQYXJ0aXRpb25CdWNrZXQgKiBNYXBPdXRwdXRDb2xsZWN0b3I6OmdldFBhcnRpdGlvbih1aW50MzJfdCBwYXJ0aXRpb24pIHsKKyAgaWYgKHBhcnRpdGlvbiA+PSBfbnVtUGFydGl0aW9ucykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBfYnVja2V0c1twYXJ0aXRpb25dOworfQorCisvKioKKyAqIFNwaWxsIGJ1ZmZlciB0byBmaWxlCisgKiBAcmV0dXJuIEFycmF5IG9mIHNwaWxsIHNlZ21lbnRzIGluZm9ybWF0aW9uCisgKi8KK3ZvaWQgTWFwT3V0cHV0Q29sbGVjdG9yOjpzb3J0UGFydGl0aW9ucyhTb3J0T3JkZXIgb3JkZXJUeXBlLCBTb3J0QWxnb3JpdGhtIHNvcnRUeXBlLAorICAgIElGaWxlV3JpdGVyICogd3JpdGVyLCBTb3J0TWV0cmljcyAmIG1ldHJpYykgeworCisgIHVpbnQzMl90IHN0YXJ0X3BhcnRpdGlvbiA9IDA7CisgIHVpbnQzMl90IG51bV9wYXJ0aXRpb24gPSBfbnVtUGFydGl0aW9uczsKKyAgaWYgKG9yZGVyVHlwZSA9PSBHUk9VUEJZKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKFVuc3VwcG9ydEV4Y2VwdGlvbiwgIkdST1VQQlkgbm90IHN1cHBvcnRlZCIpOworICB9CisKKyAgdWludDY0X3Qgc29ydGluZ1RpbWUgPSAwOworICBUaW1lciB0aW1lcjsKKyAgdWludDY0X3QgcmVjb3JkTnVtID0gMDsKKworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtX3BhcnRpdGlvbjsgaSsrKSB7CisgICAgaWYgKE5VTEwgIT0gd3JpdGVyKSB7CisgICAgICB3cml0ZXItPnN0YXJ0UGFydGl0aW9uKCk7CisgICAgfQorICAgIFBhcnRpdGlvbkJ1Y2tldCAqIHBiID0gX2J1Y2tldHNbc3RhcnRfcGFydGl0aW9uICsgaV07CisgICAgaWYgKHBiICE9IE5VTEwpIHsKKyAgICAgIHJlY29yZE51bSArPSBwYi0+Z2V0S1ZDb3VudCgpOworICAgICAgaWYgKG9yZGVyVHlwZSA9PSBGVUxMT1JERVIpIHsKKyAgICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgICAgcGItPnNvcnQoc29ydFR5cGUpOworICAgICAgICBzb3J0aW5nVGltZSArPSB0aW1lci5ub3coKSAtIHRpbWVyLmxhc3QoKTsKKyAgICAgIH0KKyAgICAgIGlmIChOVUxMICE9IHdyaXRlcikgeworICAgICAgICBwYi0+c3BpbGwod3JpdGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgIT0gd3JpdGVyKSB7CisgICAgICB3cml0ZXItPmVuZFBhcnRpdGlvbigpOworICAgIH0KKyAgfQorICBtZXRyaWMuc29ydFRpbWUgPSBzb3J0aW5nVGltZTsKKyAgbWV0cmljLnJlY29yZENvdW50ID0gcmVjb3JkTnVtOworfQorCit2b2lkIE1hcE91dHB1dENvbGxlY3Rvcjo6bWlkZGxlU3BpbGwoY29uc3Qgc3RkOjpzdHJpbmcgJiBzcGlsbE91dHB1dCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmIGluZGV4RmlsZVBhdGgsIGJvb2wgZmluYWwpIHsKKworICB1aW50NjRfdCBjb2xsZWN0dGltZSA9IF9jb2xsZWN0VGltZXIubm93KCkgLSBfY29sbGVjdFRpbWVyLmxhc3QoKTsKKworICBpZiAoc3BpbGxPdXRwdXQuZW1wdHkoKSkgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIk1hcE91dHB1dENvbGxlY3RvcjogU3BpbGwgZmlsZSBwYXRoIGVtcHR5Iik7CisgIH0gZWxzZSB7CisgICAgT3V0cHV0U3RyZWFtICogZm91dCA9IEZpbGVTeXN0ZW06OmdldExvY2FsKCkuY3JlYXRlKHNwaWxsT3V0cHV0LCB0cnVlKTsKKworICAgIElGaWxlV3JpdGVyICogd3JpdGVyID0gbmV3IElGaWxlV3JpdGVyKGZvdXQsIF9zcGVjLmNoZWNrc3VtVHlwZSwgX3NwZWMua2V5VHlwZSwgX3NwZWMudmFsdWVUeXBlLAorICAgICAgICBfc3BlYy5jb2RlYywgX3NwaWxsZWRSZWNvcmRzKTsKKworICAgIFRpbWVyIHRpbWVyOworICAgIFNvcnRNZXRyaWNzIG1ldHJpY3M7CisgICAgc29ydFBhcnRpdGlvbnMoX3NwZWMuc29ydE9yZGVyLCBfc3BlYy5zb3J0QWxnb3JpdGhtLCB3cml0ZXIsIG1ldHJpY3MpOworCisgICAgU2luZ2xlU3BpbGxJbmZvICogaW5mbyA9IHdyaXRlci0+Z2V0U3BpbGxJbmZvKCk7CisgICAgaW5mby0+cGF0aCA9IHNwaWxsT3V0cHV0OworICAgIHVpbnQ2NF90IHNwaWxsVGltZSA9IHRpbWVyLm5vdygpIC0gdGltZXIubGFzdCgpIC0gbWV0cmljcy5zb3J0VGltZTsKKworICAgIGNvbnN0IHVpbnQ2NF90IE0gPSAxMDAwMDAwOyAvLyBtaWxsaW9uCisgICAgTE9HKCIlcy1zcGlsbDogeyBpZDogJWQsIGNvbGxlY3Q6ICUiUFJJdTY0IiBtcywgIgorICAgICAgICAiaW4tbWVtb3J5IHNvcnQ6ICUiUFJJdTY0IiBtcywgaW4tbWVtb3J5IHJlY29yZHM6ICUiUFJJdTY0IiwgIgorICAgICAgICAibWVyZ2Umc3BpbGw6ICUiUFJJdTY0IiBtcywgdW5jb21wcmVzc2VkIHNpemU6ICUiUFJJdTY0IiwgIgorICAgICAgICAicmVhbCBzaXplOiAlIlBSSXU2NCIgcGF0aDogJXMgfSIsCisgICAgICAgIGZpbmFsID8gIkZpbmFsIiA6ICJNaWQiLAorICAgICAgICBfc3BpbGxJbmZvcy5nZXRTcGlsbENvdW50KCksCisgICAgICAgIGNvbGxlY3R0aW1lIC8gTSwKKyAgICAgICAgbWV0cmljcy5zb3J0VGltZSAgLyBNLAorICAgICAgICBtZXRyaWNzLnJlY29yZENvdW50LAorICAgICAgICBzcGlsbFRpbWUgIC8gTSwKKyAgICAgICAgaW5mby0+Z2V0RW5kUG9zaXRpb24oKSwKKyAgICAgICAgaW5mby0+Z2V0UmVhbEVuZFBvc2l0aW9uKCksCisgICAgICAgIHNwaWxsT3V0cHV0LmNfc3RyKCkpOworCisgICAgaWYgKGZpbmFsKSB7CisgICAgICBfbWFwT3V0cHV0TWF0ZXJpYWxpemVkQnl0ZXMtPmluY3JlYXNlKGluZm8tPmdldFJlYWxFbmRQb3NpdGlvbigpKTsKKyAgICB9CisKKyAgICBpZiAoaW5kZXhGaWxlUGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgIGluZm8tPndyaXRlU3BpbGxJbmZvKGluZGV4RmlsZVBhdGgpOworICAgICAgZGVsZXRlIGluZm87CisgICAgfSBlbHNlIHsKKyAgICAgIF9zcGlsbEluZm9zLmFkZChpbmZvKTsKKyAgICB9CisKKyAgICBkZWxldGUgd3JpdGVyOworICAgIGRlbGV0ZSBmb3V0OworCisgICAgcmVzZXQoKTsKKyAgICBfY29sbGVjdFRpbWVyLnJlc2V0KCk7CisgIH0KK30KKworLyoqCisgKiBmaW5hbCBtZXJnZSBhbmQvb3Igc3BpbGwsIHVzZSBwcmV2aW91cyBzcGlsbGVkCisgKiBmaWxlICYgaW4tbWVtb3J5IGRhdGEKKyAqLwordm9pZCBNYXBPdXRwdXRDb2xsZWN0b3I6OmZpbmFsU3BpbGwoY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlcGF0aCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmIGlkeF9maWxlX3BhdGgpIHsKKworICBpZiAoX3NwaWxsSW5mb3MuZ2V0U3BpbGxDb3VudCgpID09IDApIHsKKyAgICBtaWRkbGVTcGlsbChmaWxlcGF0aCwgaWR4X2ZpbGVfcGF0aCwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgSUZpbGVXcml0ZXIgKiB3cml0ZXIgPSBJRmlsZVdyaXRlcjo6Y3JlYXRlKGZpbGVwYXRoLCBfc3BlYywgX3NwaWxsZWRSZWNvcmRzKTsKKyAgTWVyZ2VyICogbWVyZ2VyID0gbmV3IE1lcmdlcih3cml0ZXIsIF9jb25maWcsIF9rZXlDb21wYXJhdG9yLCBfY29tYmluZVJ1bm5lcik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfc3BpbGxJbmZvcy5nZXRTcGlsbENvdW50KCk7IGkrKykgeworICAgIFNpbmdsZVNwaWxsSW5mbyAqIHNwaWxsID0gX3NwaWxsSW5mb3MuZ2V0U2luZ2xlU3BpbGxJbmZvKGkpOworICAgIE1lcmdlRW50cnlQdHIgcG1lID0gSUZpbGVNZXJnZUVudHJ5OjpjcmVhdGUoc3BpbGwpOworICAgIG1lcmdlci0+YWRkTWVyZ2VFbnRyeShwbWUpOworICB9CisKKyAgU29ydE1ldHJpY3MgbWV0cmljczsKKyAgc29ydFBhcnRpdGlvbnMoX3NwZWMuc29ydE9yZGVyLCBfc3BlYy5zb3J0QWxnb3JpdGhtLCBOVUxMLCBtZXRyaWNzKTsKKworICBtZXJnZXItPmFkZE1lcmdlRW50cnkobmV3IE1lbW9yeU1lcmdlRW50cnkoX2J1Y2tldHMsIF9udW1QYXJ0aXRpb25zKSk7CisKKyAgVGltZXIgdGltZXI7CisgIG1lcmdlci0+bWVyZ2UoKTsKKworICB1aW50NjRfdCBvdXRwdXRTaXplOworICB1aW50NjRfdCByZWFsT3V0cHV0U2l6ZTsKKyAgdWludDY0X3QgcmVjb3JkQ291bnQ7CisgIHdyaXRlci0+Z2V0U3RhdGlzdGljcyhvdXRwdXRTaXplLCByZWFsT3V0cHV0U2l6ZSwgcmVjb3JkQ291bnQpOworCisgIGNvbnN0IHVpbnQ2NF90IE0gPSAxMDAwMDAwOyAvLyBtaWxsaW9uCisgIExPRygiRmluYWwtbWVyZ2Utc3BpbGw6IHsgaWQ6ICVkLCBpbi1tZW1vcnkgc29ydDogJSJQUkl1NjQiIG1zLCAiCisgICAgICAiaW4tbWVtb3J5IHJlY29yZHM6ICUiUFJJdTY0IiwgbWVyZ2Umc3BpbGw6ICUiUFJJdTY0IiBtcywgIgorICAgICAgInJlY29yZHM6ICUiUFJJdTY0IiwgdW5jb21wcmVzc2VkIHNpemU6ICUiUFJJdTY0IiwgIgorICAgICAgInJlYWwgc2l6ZTogJSJQUkl1NjQiIHBhdGg6ICVzIH0iLAorICAgICAgX3NwaWxsSW5mb3MuZ2V0U3BpbGxDb3VudCgpLAorICAgICAgbWV0cmljcy5zb3J0VGltZSAvIE0sCisgICAgICBtZXRyaWNzLnJlY29yZENvdW50LAorICAgICAgKHRpbWVyLm5vdygpIC0gdGltZXIubGFzdCgpKSAvIE0sCisgICAgICByZWNvcmRDb3VudCwKKyAgICAgIG91dHB1dFNpemUsCisgICAgICByZWFsT3V0cHV0U2l6ZSwKKyAgICAgIGZpbGVwYXRoLmNfc3RyKCkpOworCisgIF9tYXBPdXRwdXRNYXRlcmlhbGl6ZWRCeXRlcy0+aW5jcmVhc2UocmVhbE91dHB1dFNpemUpOworCisgIGRlbGV0ZSBtZXJnZXI7CisKKyAgLy8gd3JpdGUgaW5kZXgKKyAgU2luZ2xlU3BpbGxJbmZvICogc3BpbGxfcmFuZ2UgPSB3cml0ZXItPmdldFNwaWxsSW5mbygpOworICBzcGlsbF9yYW5nZS0+d3JpdGVTcGlsbEluZm8oaWR4X2ZpbGVfcGF0aCk7CisgIGRlbGV0ZSBzcGlsbF9yYW5nZTsKKyAgX3NwaWxsSW5mb3MuZGVsZXRlQWxsU3BpbGxGaWxlcygpOworICBkZWxldGUgd3JpdGVyOworICByZXNldCgpOworfQorCit2b2lkIE1hcE91dHB1dENvbGxlY3Rvcjo6Y2xvc2UoKSB7CisgIHN0cmluZyAqIG91dHB1dHBhdGggPSBfc3BpbGxPdXRwdXQtPmdldE91dHB1dFBhdGgoKTsKKyAgc3RyaW5nICogaW5kZXhwYXRoID0gX3NwaWxsT3V0cHV0LT5nZXRPdXRwdXRJbmRleFBhdGgoKTsKKworICBpZiAoKG91dHB1dHBhdGgtPmxlbmd0aCgpID09IDApIHx8IChpbmRleHBhdGgtPmxlbmd0aCgpID09IDApKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiSWxsZWdhbChlbXB0eSkgbWFwIG91dHB1dCBmaWxlL2luZGV4IHBhdGgiKTsKKyAgfQorCisgIGZpbmFsU3BpbGwoKm91dHB1dHBhdGgsICppbmRleHBhdGgpOworCisgIGRlbGV0ZSBvdXRwdXRwYXRoOworICBkZWxldGUgaW5kZXhwYXRoOworfQorfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NYXBPdXRwdXRDb2xsZWN0b3IuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01hcE91dHB1dENvbGxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDQ3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NYXBPdXRwdXRDb2xsZWN0b3IuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNQVBfT1VUUFVUX0NPTExFQ1RPUl9IXworI2RlZmluZSBNQVBfT1VUUFVUX0NPTExFQ1RPUl9IXworCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorI2luY2x1ZGUgImxpYi9NZW1vcnlQb29sLmgiCisjaW5jbHVkZSAidXRpbC9UaW1lci5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJzLmgiCisjaW5jbHVkZSAibGliL01hcE91dHB1dFNwZWMuaCIKKyNpbmNsdWRlICJsaWIvSUZpbGUuaCIKKyNpbmNsdWRlICJsaWIvU3BpbGxJbmZvLmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisjaW5jbHVkZSAibGliL1BhcnRpdGlvbkJ1Y2tldC5oIgorI2luY2x1ZGUgImxpYi9TcGlsbE91dHB1dFNlcnZpY2UuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworLyoqCisgKiBNYXBPdXRwdXRDb2xsZWN0b3IKKyAqLworCitzdHJ1Y3QgU29ydE1ldHJpY3MgeworICB1aW50NjRfdCByZWNvcmRDb3VudDsKKyAgdWludDY0X3Qgc29ydFRpbWU7CisKK3B1YmxpYzoKKyAgU29ydE1ldHJpY3MoKQorICAgICAgOiByZWNvcmRDb3VudCgwKSwgc29ydFRpbWUoMCkgeworICB9Cit9OworCitjbGFzcyBDb21iaW5lUnVubmVyV3JhcHBlciA6IHB1YmxpYyBJQ29tYmluZVJ1bm5lciB7Citwcml2YXRlOgorICBDb25maWcgKiBfY29uZmlnOworICBJQ29tYmluZVJ1bm5lciAqIF9jb21iaW5lUnVubmVyOworICBib29sIF9pc0phdmFDb21iaW5lcjsKKyAgYm9vbCBfY29tYmluZXJJbml0ZWQ7CisgIFNwaWxsT3V0cHV0U2VydmljZSAqIF9zcGlsbE91dHB1dDsKKworcHVibGljOgorICBDb21iaW5lUnVubmVyV3JhcHBlcihDb25maWcgKiBjb25maWcsIFNwaWxsT3V0cHV0U2VydmljZSAqIHNlcnZpY2UpCisgICAgICA6IF9jb25maWcoY29uZmlnKSwgX2NvbWJpbmVSdW5uZXIoTlVMTCksIF9pc0phdmFDb21iaW5lcihmYWxzZSksCisgICAgICAgICAgX2NvbWJpbmVySW5pdGVkKGZhbHNlKSwgX3NwaWxsT3V0cHV0KHNlcnZpY2UpIHsKKyAgfQorCisgIH5Db21iaW5lUnVubmVyV3JhcHBlcigpIHsKKyAgICBpZiAoIV9pc0phdmFDb21iaW5lcikgeworICAgICAgZGVsZXRlIF9jb21iaW5lUnVubmVyOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBjb21iaW5lKENvbWJpbmVDb250ZXh0IHR5cGUsIEtWSXRlcmF0b3IgKiBrdkl0ZXJhdG9yLCBJRmlsZVdyaXRlciAqIHdyaXRlcik7CisKK3ByaXZhdGU6CisgIElDb21iaW5lUnVubmVyICogY3JlYXRlQ29tYmluZXIoKTsKK307CisKK2NsYXNzIE1hcE91dHB1dENvbGxlY3RvciB7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX01JTl9CTE9DS19TSVpFID0gMTYgKiAxMDI0OworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfQkxPQ0tfU0laRSA9IDQgKiAxMDI0ICogMTAyNDsKKworcHJpdmF0ZToKKyAgQ29uZmlnICogX2NvbmZpZzsKKworICB1aW50MzJfdCBfbnVtUGFydGl0aW9uczsKKyAgUGFydGl0aW9uQnVja2V0ICoqIF9idWNrZXRzOworCisgIENvbXBhcmF0b3JQdHIgX2tleUNvbXBhcmF0b3I7CisKKyAgSUNvbWJpbmVSdW5uZXIgKiBfY29tYmluZVJ1bm5lcjsKKworICBDb3VudGVyICogX21hcE91dHB1dFJlY29yZHM7CisgIENvdW50ZXIgKiBfbWFwT3V0cHV0Qnl0ZXM7CisgIENvdW50ZXIgKiBfbWFwT3V0cHV0TWF0ZXJpYWxpemVkQnl0ZXM7CisgIENvdW50ZXIgKiBfc3BpbGxlZFJlY29yZHM7CisKKyAgU3BpbGxPdXRwdXRTZXJ2aWNlICogX3NwaWxsT3V0cHV0OworCisgIHVpbnQzMl90IF9kZWZhdWx0QmxvY2tTaXplOworCisgIFNwaWxsSW5mb3MgX3NwaWxsSW5mb3M7CisKKyAgTWFwT3V0cHV0U3BlYyBfc3BlYzsKKworICBUaW1lciBfY29sbGVjdFRpbWVyOworCisgIE1lbW9yeVBvb2wgKiBfcG9vbDsKKworcHVibGljOgorICBNYXBPdXRwdXRDb2xsZWN0b3IodWludDMyX3QgbnVtX3BhcnRpdGlvbiwgU3BpbGxPdXRwdXRTZXJ2aWNlICogc3BpbGxTZXJ2aWNlKTsKKworICB+TWFwT3V0cHV0Q29sbGVjdG9yKCk7CisKKyAgdm9pZCBjb25maWd1cmUoQ29uZmlnICogY29uZmlnKTsKKworICAvKioKKyAgICogY29sbGVjdCBvbmUgay92IHBhaXIKKyAgICogQHJldHVybiB0cnVlIHN1Y2Nlc3M7IGZhbHNlIGJ1ZmZlciBmdWxsLCBuZWVkIHNwaWxsCisgICAqLworICBib29sIGNvbGxlY3QoY29uc3Qgdm9pZCAqIGtleSwgdWludDMyX3Qga2V5bGVuLCBjb25zdCB2b2lkICogdmFsdWUsIHVpbnQzMl90IHZhbGxlbiwKKyAgICAgIHVpbnQzMl90IHBhcnRpdGlvbklkKTsKKworICBLVkJ1ZmZlciAqIGFsbG9jYXRlS1ZCdWZmZXIodWludDMyX3QgcGFydGl0aW9uSWQsIHVpbnQzMl90IGt2bGVuZ3RoKTsKKworICB2b2lkIGNsb3NlKCk7CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdCh1aW50MzJfdCBtYXhCbG9ja1NpemUsIHVpbnQzMl90IG1lbW9yeV9jYXBhY2l0eSwgQ29tcGFyYXRvclB0ciBrZXlDb21wYXJhdG9yLAorICAgICAgSUNvbWJpbmVSdW5uZXIgKiBjb21iaW5lcik7CisKKyAgdm9pZCByZXNldCgpOworCisgIC8qKgorICAgKiBzcGlsbCBhIHJhbmdlIG9mIHBhcnRpdGlvbiBidWNrZXRzLCBwcmVwYXJlIGZvciBmdXR1cmUKKyAgICogUGFyYWxsZWwgc29ydCAmIHNwaWxsLCBUT0RPOiBwYXJhbGxlbCBzb3J0ICYgc3BpbGwKKyAgICovCisgIHZvaWQgc29ydFBhcnRpdGlvbnMoU29ydE9yZGVyIG9yZGVyVHlwZSwgU29ydEFsZ29yaXRobSBzb3J0VHlwZSwgSUZpbGVXcml0ZXIgKiB3cml0ZXIsCisgICAgICBTb3J0TWV0cmljcyAmIG1ldHJpY3MpOworCisgIENvbXBhcmF0b3JQdHIgZ2V0Q29tcGFyYXRvcihDb25maWcgKiBjb25maWcsIE1hcE91dHB1dFNwZWMgJiBzcGVjKTsKKworICBpbmxpbmUgdWludDMyX3QgR2V0Q2VpbCh1aW50MzJfdCB2LCB1aW50MzJfdCB1bml0KSB7CisgICAgcmV0dXJuICgodiArIHVuaXQgLSAxKSAvIHVuaXQpICogdW5pdDsKKyAgfQorCisgIHVpbnQzMl90IGdldERlZmF1bHRCbG9ja1NpemUodWludDMyX3QgbWVtb3J5Q2FwYWNpdHksIHVpbnQzMl90IHBhcnRpdGlvbk51bSwKKyAgICAgIHVpbnQzMl90IG1heEJsb2NrU2l6ZSkgeworICAgIHVpbnQzMl90IGRlZmF1bHRCbG9ja1NpemUgPSBtZW1vcnlDYXBhY2l0eSAvIF9udW1QYXJ0aXRpb25zIC8gNDsKKyAgICBkZWZhdWx0QmxvY2tTaXplID0gR2V0Q2VpbChkZWZhdWx0QmxvY2tTaXplLCBERUZBVUxUX01JTl9CTE9DS19TSVpFKTsKKyAgICBkZWZhdWx0QmxvY2tTaXplID0gc3RkOjptaW4oZGVmYXVsdEJsb2NrU2l6ZSwgbWF4QmxvY2tTaXplKTsKKyAgICByZXR1cm4gZGVmYXVsdEJsb2NrU2l6ZTsKKyAgfQorCisgIFBhcnRpdGlvbkJ1Y2tldCAqIGdldFBhcnRpdGlvbih1aW50MzJfdCBwYXJ0aXRpb24pOworCisgIC8qKgorICAgKiBub3JtYWwgc3BpbGwgdXNlIG9wdGlvbnMgaW4gX2NvbmZpZworICAgKiBAcGFyYW0gZmlsZXBhdGhzOiBzcGlsbCBmaWxlIHBhdGgKKyAgICovCisgIHZvaWQgbWlkZGxlU3BpbGwoY29uc3Qgc3RkOjpzdHJpbmcgJiBzcGlsbE91dHB1dCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpbmRleEZpbGVQYXRoLCBib29sIGZpbmFsKTsKKworICAvKioKKyAgICogZmluYWwgbWVyZ2UgYW5kL29yIHNwaWxsIHVzZSBvcHRpb25zIGluIF9jb25maWcsIGFuZAorICAgKiBwcmV2aW91cyBzcGlsbGVkIGZpbGUgJiBpbi1tZW1vcnkgZGF0YQorICAgKi8KKyAgdm9pZCBmaW5hbFNwaWxsKGNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZXBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5kZXhwYXRoKTsKK307CisKK30gLy9uYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogTUFQX09VVFBVVF9DT0xMRUNUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01hcE91dHB1dFNwZWMuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NYXBPdXRwdXRTcGVjLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzRkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NYXBPdXRwdXRTcGVjLmNjCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvTWFwT3V0cHV0U3BlYy5oIgorI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCit2b2lkIE1hcE91dHB1dFNwZWM6OmdldFNwZWNGcm9tQ29uZmlnKENvbmZpZyAqIGNvbmZpZywgTWFwT3V0cHV0U3BlYyAmIHNwZWMpIHsKKyAgaWYgKE5VTEwgPT0gY29uZmlnKSB7CisgICAgcmV0dXJuOworICB9CisgIHNwZWMuY2hlY2tzdW1UeXBlID0gQ0hFQ0tTVU1fQ1JDMzI7CisgIHN0cmluZyBzb3J0VHlwZSA9IGNvbmZpZy0+Z2V0KE5BVElWRV9TT1JUX1RZUEUsICJEVUFMUElWT1RTT1JUIik7CisgIGlmIChzb3J0VHlwZSA9PSAiRFVBTFBJVk9UU09SVCIpIHsKKyAgICBzcGVjLnNvcnRBbGdvcml0aG0gPSBEVUFMUElWT1RTT1JUOworICB9IGVsc2UgeworICAgIHNwZWMuc29ydEFsZ29yaXRobSA9IENQUFNPUlQ7CisgIH0KKyAgaWYgKGNvbmZpZy0+Z2V0KE1BUFJFRF9DT01QUkVTU19NQVBfT1VUUFVULCAiZmFsc2UiKSA9PSAidHJ1ZSIpIHsKKyAgICBzcGVjLmNvZGVjID0gY29uZmlnLT5nZXQoTUFQUkVEX01BUF9PVVRQVVRfQ09NUFJFU1NJT05fQ09ERUMpOworICB9IGVsc2UgeworICAgIHNwZWMuY29kZWMgPSAiIjsKKyAgfQorICBpZiAoY29uZmlnLT5nZXRCb29sKE1BUFJFRF9TT1JUX0FWT0lELCBmYWxzZSkpIHsKKyAgICBzcGVjLnNvcnRPcmRlciA9IE5PU09SVDsKKyAgfSBlbHNlIHsKKyAgICBzcGVjLnNvcnRPcmRlciA9IEZVTExPUkRFUjsKKyAgfQorICBjb25zdCBjaGFyICoga2V5X2NsYXNzID0gY29uZmlnLT5nZXQoTUFQUkVEX01BUE9VVFBVVF9LRVlfQ0xBU1MpOworICBpZiAoTlVMTCA9PSBrZXlfY2xhc3MpIHsKKyAgICBrZXlfY2xhc3MgPSBjb25maWctPmdldChNQVBSRURfT1VUUFVUX0tFWV9DTEFTUyk7CisgIH0KKyAgaWYgKE5VTEwgPT0ga2V5X2NsYXNzKSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAibWFwcmVkLm1hcG91dHB1dC5rZXkuY2xhc3Mgbm90IHNldCIpOworICB9CisgIHNwZWMua2V5VHlwZSA9IEphdmFDbGFzc1RvS2V5VmFsdWVUeXBlKGtleV9jbGFzcyk7CisgIGNvbnN0IGNoYXIgKiB2YWx1ZV9jbGFzcyA9IGNvbmZpZy0+Z2V0KE1BUFJFRF9NQVBPVVRQVVRfVkFMVUVfQ0xBU1MpOworICBpZiAoTlVMTCA9PSB2YWx1ZV9jbGFzcykgeworICAgIHZhbHVlX2NsYXNzID0gY29uZmlnLT5nZXQoTUFQUkVEX09VVFBVVF9WQUxVRV9DTEFTUyk7CisgIH0KKyAgaWYgKE5VTEwgPT0gdmFsdWVfY2xhc3MpIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJtYXByZWQubWFwb3V0cHV0LnZhbHVlLmNsYXNzIG5vdCBzZXQiKTsKKyAgfQorICBzcGVjLnZhbHVlVHlwZSA9IEphdmFDbGFzc1RvS2V5VmFsdWVUeXBlKHZhbHVlX2NsYXNzKTsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTWFwT3V0cHV0U3BlYy5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTWFwT3V0cHV0U3BlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDM5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NYXBPdXRwdXRTcGVjLmgKQEAgLTAsMCArMSw4MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUFQT1VUUFVUU1BFQ19IXworI2RlZmluZSBNQVBPVVRQVVRTUEVDX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidXRpbC9DaGVja3N1bS5oIgorI2luY2x1ZGUgInV0aWwvV3JpdGFibGVVdGlscy5oIgorI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCit1c2luZyBzdGQ6OnN0cmluZzsKKworLyoqCisgKiBpbnRlcm5hbCBzb3J0IG1ldGhvZAorICovCitlbnVtIFNvcnRBbGdvcml0aG0geworICBDUVNPUlQgPSAwLAorICBDUFBTT1JUID0gMSwKKyAgRFVBTFBJVk9UU09SVCA9IDIsCit9OworCisvKioKKyAqIHNwaWxsIGZpbGUgdHlwZQorICogSU5URVJNRURJQVRFOiBhIHNpbXBsZSBrZXkvdmFsdWUgc2VxdWVuY2UgZmlsZQorICogSUZJTEU6IGNsYXNzaWMgaGFkb29wIElGaWxlCisgKi8KK2VudW0gT3V0cHV0RmlsZVR5cGUgeworICBJTlRFUk1FRElBVEUgPSAwLAorICBJRklMRSA9IDEsCit9OworCisvKioKKyAqIGtleS92YWx1ZSByZWNvcmVkIG9yZGVyIHJlcXVpcmVtZW50cworICogRlVMTFNPUlQ6IGhhZG9vcCAgc3RhbmRhcmQKKyAqIEdST1VQQlk6ICBzYW1lIGtleSBhcmUgZ3JvdXBlZCB0b2dldGhlciwgYnV0IG5vdCBpbiBvcmRlcgorICogTk9TT1JUOiAgIG5vIG9yZGVyIGF0IGFsbAorICovCitlbnVtIFNvcnRPcmRlciB7CisgIEZVTExPUkRFUiA9IDAsCisgIEdST1VQQlkgPSAxLAorICBOT1NPUlQgPSAyLAorfTsKKworZW51bSBDb21wcmVzc2lvblR5cGUgeworICBQTEFJTiA9IDAsCisgIFNOQVBQWSA9IDEsCit9OworCitjbGFzcyBNYXBPdXRwdXRTcGVjIHsKK3B1YmxpYzoKKyAgS2V5VmFsdWVUeXBlIGtleVR5cGU7CisgIEtleVZhbHVlVHlwZSB2YWx1ZVR5cGU7CisgIFNvcnRPcmRlciBzb3J0T3JkZXI7CisgIFNvcnRBbGdvcml0aG0gc29ydEFsZ29yaXRobTsKKyAgc3RyaW5nIGNvZGVjOworICBDaGVja3N1bVR5cGUgY2hlY2tzdW1UeXBlOworCisgIHN0YXRpYyB2b2lkIGdldFNwZWNGcm9tQ29uZmlnKENvbmZpZyAqIGNvbmZpZywgTWFwT3V0cHV0U3BlYyAmIHNwZWMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogTUFQT1VUUFVUU1BFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTWVtb3J5QmxvY2suY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NZW1vcnlCbG9jay5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzczNGExCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTWVtb3J5QmxvY2suY2MKQEAgLTAsMCArMSw2NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1RpbWVyLmgiCisjaW5jbHVkZSAibGliL0J1ZmZlcnMuaCIKKyNpbmNsdWRlICJsaWIvTWFwT3V0cHV0U3BlYy5oIgorI2luY2x1ZGUgImxpYi9JRmlsZS5oIgorI2luY2x1ZGUgImxpYi9TcGlsbEluZm8uaCIKKyNpbmNsdWRlICJsaWIvQ29tYmluZXIuaCIKKworI2luY2x1ZGUgImxpYi9NZW1vcnlCbG9jay5oIgorI2luY2x1ZGUgImxpYi9NZW1vcnlQb29sLmgiCisjaW5jbHVkZSAidXRpbC9EdWFsUGl2b3RRdWlja1NvcnQuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBNZW1vcnlQb29sOworCitNZW1vcnlCbG9jazo6TWVtb3J5QmxvY2soY2hhciAqIHBvcywgdWludDMyX3Qgc2l6ZSkKKyAgICA6IF9iYXNlKHBvcyksIF9zaXplKHNpemUpLCBfcG9zaXRpb24oMCksIF9zb3J0ZWQoZmFsc2UpIHsKK30KKworS1ZCdWZmZXIgKiBNZW1vcnlCbG9jazo6Z2V0S1ZCdWZmZXIoaW50IGluZGV4KSB7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gX2t2T2Zmc2V0cy5zaXplKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB1aW50MzJfdCBvZmZzZXQgPSBfa3ZPZmZzZXRzLmF0KGluZGV4KTsKKyAgS1ZCdWZmZXIgKiBrdmJ1ZmZlciA9IChLVkJ1ZmZlciopKF9iYXNlICsgb2Zmc2V0KTsKKyAgcmV0dXJuIGt2YnVmZmVyOworfQorCit2b2lkIE1lbW9yeUJsb2NrOjpzb3J0KFNvcnRBbGdvcml0aG0gdHlwZSwgQ29tcGFyYXRvclB0ciBjb21wYXJhdG9yKSB7CisgIGlmICgoIV9zb3J0ZWQpICYmIChfa3ZPZmZzZXRzLnNpemUoKSA+IDEpKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDUFBTT1JUOgorICAgICAgc3RkOjpzb3J0KF9rdk9mZnNldHMuYmVnaW4oKSwgX2t2T2Zmc2V0cy5lbmQoKSwgQ29tcGFyYXRvckZvclN0ZFNvcnQoX2Jhc2UsIGNvbXBhcmF0b3IpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFVBTFBJVk9UU09SVDogeworICAgICAgRHVhbFBpdm90UXVpY2tzb3J0KF9rdk9mZnNldHMsIENvbXBhcmF0b3JGb3JEdWFsUGl2b3RTb3J0KF9iYXNlLCBjb21wYXJhdG9yKSk7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIFRIUk9XX0VYQ0VQVElPTihVbnN1cHBvcnRFeGNlcHRpb24sICJTb3J0IEFsZ29yaXRobSBub3Qgc3VwcG9ydCIpOworICAgIH0KKyAgfQorICBfc29ydGVkID0gdHJ1ZTsKK30KK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01lbW9yeUJsb2NrLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NZW1vcnlCbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWMzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NZW1vcnlCbG9jay5oCkBAIC0wLDAgKzEsMTcyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJjb21tb25zLmgiCisKKyNpZm5kZWYgTUVNT1JZQkxPQ0tfSF8KKyNkZWZpbmUgTUVNT1JZQkxPQ0tfSF8KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBNZW1vcnlQb29sOworCitjbGFzcyBDb21wYXJhdG9yRm9yRHVhbFBpdm90U29ydCB7Citwcml2YXRlOgorICBjb25zdCBjaGFyICogX2Jhc2U7CisgIENvbXBhcmF0b3JQdHIgX2tleUNvbXBhcmF0b3I7CitwdWJsaWM6CisgIENvbXBhcmF0b3JGb3JEdWFsUGl2b3RTb3J0KGNvbnN0IGNoYXIgKiBiYXNlLCBDb21wYXJhdG9yUHRyIGNvbXBhcmF0b3IpCisgICAgICA6IF9iYXNlKGJhc2UpLCBfa2V5Q29tcGFyYXRvcihjb21wYXJhdG9yKSB7CisgIH0KKworICBpbmxpbmUgaW50IG9wZXJhdG9yKCkodWludDMyX3QgbGhzLCB1aW50MzJfdCByaHMpIHsKKyAgICBLVkJ1ZmZlciAqIGxlZnQgPSAoS1ZCdWZmZXIgKikoX2Jhc2UgKyBsaHMpOworICAgIEtWQnVmZmVyICogcmlnaHQgPSAoS1ZCdWZmZXIgKikoX2Jhc2UgKyByaHMpOworICAgIHJldHVybiAoKl9rZXlDb21wYXJhdG9yKShsZWZ0LT5jb250ZW50LCBsZWZ0LT5rZXlMZW5ndGgsIHJpZ2h0LT5jb250ZW50LCByaWdodC0+a2V5TGVuZ3RoKTsKKyAgfQorfTsKKworY2xhc3MgQ29tcGFyYXRvckZvclN0ZFNvcnQgeworcHJpdmF0ZToKKyAgY29uc3QgY2hhciAqIF9iYXNlOworICBDb21wYXJhdG9yUHRyIF9rZXlDb21wYXJhdG9yOworcHVibGljOgorICBDb21wYXJhdG9yRm9yU3RkU29ydChjb25zdCBjaGFyICogYmFzZSwgQ29tcGFyYXRvclB0ciBjb21wYXJhdG9yKQorICAgICAgOiBfYmFzZShiYXNlKSwgX2tleUNvbXBhcmF0b3IoY29tcGFyYXRvcikgeworICB9CisKK3B1YmxpYzoKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSh1aW50MzJfdCBsaHMsIHVpbnQzMl90IHJocykgeworICAgIEtWQnVmZmVyICogbGVmdCA9IChLVkJ1ZmZlciAqKShfYmFzZSArIGxocyk7CisgICAgS1ZCdWZmZXIgKiByaWdodCA9IChLVkJ1ZmZlciAqKShfYmFzZSArIHJocyk7CisgICAgaW50IHJldCA9ICgqX2tleUNvbXBhcmF0b3IpKGxlZnQtPmdldEtleSgpLCBsZWZ0LT5rZXlMZW5ndGgsIHJpZ2h0LT5nZXRLZXkoKSwgcmlnaHQtPmtleUxlbmd0aCk7CisgICAgcmV0dXJuIHJldCA8IDA7CisgIH0KK307CisKK2NsYXNzIE1lbW9yeUJsb2NrIHsKK3ByaXZhdGU6CisgIGNoYXIgKiBfYmFzZTsKKyAgdWludDMyX3QgX3NpemU7CisgIHVpbnQzMl90IF9wb3NpdGlvbjsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IF9rdk9mZnNldHM7CisgIGJvb2wgX3NvcnRlZDsKKworcHVibGljOgorICBNZW1vcnlCbG9jayhjaGFyICogcG9zLCB1aW50MzJfdCBzaXplKTsKKworICBjaGFyICogYmFzZSgpIHsKKyAgICByZXR1cm4gX2Jhc2U7CisgIH0KKworICBib29sIHNvcnRlZCgpIHsKKyAgICByZXR1cm4gX3NvcnRlZDsKKyAgfQorCisgIEtWQnVmZmVyICogYWxsb2NhdGVLVkJ1ZmZlcih1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoID4gcmVtYWluU3BhY2UoKSkgeworICAgICAgTE9HKCJVbmFibGUgdG8gYWxsb2NhdGUga3YgZnJvbSBtZW1vcnkgYnVmZmVyLCBsZW5ndGg6ICVkLCByZW1haW46ICVkIiwgbGVuZ3RoLCByZW1haW5TcGFjZSgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfc29ydGVkID0gZmFsc2U7CisgICAgX2t2T2Zmc2V0cy5wdXNoX2JhY2soX3Bvc2l0aW9uKTsKKyAgICBjaGFyICogc3BhY2UgPSBfYmFzZSArIF9wb3NpdGlvbjsKKyAgICBfcG9zaXRpb24gKz0gbGVuZ3RoOworICAgIHJldHVybiAoS1ZCdWZmZXIgKilzcGFjZTsKKyAgfQorCisgIHVpbnQzMl90IHJlbWFpblNwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBfc2l6ZSAtIF9wb3NpdGlvbjsKKyAgfQorCisgIHVpbnQzMl90IGdldEtWQ291bnQoKSB7CisgICAgcmV0dXJuIF9rdk9mZnNldHMuc2l6ZSgpOworICB9CisKKyAgS1ZCdWZmZXIgKiBnZXRLVkJ1ZmZlcihpbnQgaW5kZXgpOworCisgIHZvaWQgc29ydChTb3J0QWxnb3JpdGhtIHR5cGUsIENvbXBhcmF0b3JQdHIgY29tcGFyYXRvcik7Cit9OworLy9jbGFzcyBNZW1vcnlCbG9jaworCitjbGFzcyBNZW1CbG9ja0l0ZXJhdG9yIHsKK3ByaXZhdGU6CisgIE1lbW9yeUJsb2NrICogX21lbUJsb2NrOworICB1aW50MzJfdCBfZW5kOworICB1aW50MzJfdCBfY3VycmVudDsKKyAgS1ZCdWZmZXIgKiBfa3ZCdWZmZXI7CisKK3B1YmxpYzoKKworICBNZW1CbG9ja0l0ZXJhdG9yKE1lbW9yeUJsb2NrICogbWVtQmxvY2spCisgICAgICA6IF9tZW1CbG9jayhtZW1CbG9jayksIF9lbmQoMCksIF9jdXJyZW50KDApLCBfa3ZCdWZmZXIoTlVMTCkgeworICAgIF9lbmQgPSBtZW1CbG9jay0+Z2V0S1ZDb3VudCgpOworICB9CisKKyAgS1ZCdWZmZXIgKiBnZXRLVkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gX2t2QnVmZmVyOworICB9CisKKyAgLyoqCisgICAqIG1vdmUgdG8gbmV4dCBrZXkvdmFsdWUKKyAgICogMCBvbiBzdWNjZXNzCisgICAqIDEgb24gbm8gbW9yZQorICAgKi8KKyAgYm9vbCBuZXh0KCkgeworICAgIGlmIChfY3VycmVudCA+PSBfZW5kKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRoaXMtPl9rdkJ1ZmZlciA9IF9tZW1CbG9jay0+Z2V0S1ZCdWZmZXIoX2N1cnJlbnQpOworICAgICsrX2N1cnJlbnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisvL2NsYXNzIE1lbW9yeUJsb2NrSXRlcmF0b3IKKwordHlwZWRlZiBNZW1CbG9ja0l0ZXJhdG9yICogTWVtQmxvY2tJdGVyYXRvclB0cjsKKworY2xhc3MgTWVtQmxvY2tDb21wYXJhdG9yIHsKK3ByaXZhdGU6CisgIENvbXBhcmF0b3JQdHIgX2tleUNvbXBhcmF0b3I7CisKK3B1YmxpYzoKKyAgTWVtQmxvY2tDb21wYXJhdG9yKENvbXBhcmF0b3JQdHIgY29tcGFyYXRvcikKKyAgICAgIDogX2tleUNvbXBhcmF0b3IoY29tcGFyYXRvcikgeworICB9CisKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IE1lbUJsb2NrSXRlcmF0b3JQdHIgbGhzLCBjb25zdCBNZW1CbG9ja0l0ZXJhdG9yUHRyIHJocykgeworCisgICAgS1ZCdWZmZXIgKiBsZWZ0ID0gbGhzLT5nZXRLVkJ1ZmZlcigpOworICAgIEtWQnVmZmVyICogcmlnaHQgPSByaHMtPmdldEtWQnVmZmVyKCk7CisKKyAgICAvL1RyZWF0IE5VTEwgYXMgaW5maW5pdGUgTUFYLCBzbyB0aGF0IHdlIGNhbiBwb3Agb3V0IG5leHQgdmFsdWUKKyAgICBpZiAoTlVMTCA9PSBsZWZ0KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gcmlnaHQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiAoKl9rZXlDb21wYXJhdG9yKShsZWZ0LT5jb250ZW50LCBsZWZ0LT5rZXlMZW5ndGgsIHJpZ2h0LT5jb250ZW50LCByaWdodC0+a2V5TGVuZ3RoKSA8IDA7CisgIH0KK307CisKK30gLy9uYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogTUVNT1JZQkxPQ0tfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01lbW9yeVBvb2wuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01lbW9yeVBvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWE5Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTWVtb3J5UG9vbC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVNT1JZUE9PTF9IXworI2RlZmluZSBNRU1PUllQT09MX0hfCisKKyNpbmNsdWRlICJsaWIvQnVmZmVycy5oIgorI2luY2x1ZGUgImxpYi9NYXBPdXRwdXRTcGVjLmgiCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorI2luY2x1ZGUgInV0aWwvU3RyaW5nVXRpbC5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKy8qKgorICogQ2xhc3MgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IGJ1ZmZlcgorICovCisKK2NsYXNzIE1lbW9yeVBvb2wgeworcHJpdmF0ZToKKyAgY2hhciAqIF9iYXNlOworICB1aW50MzJfdCBfY2FwYWNpdHk7CisgIHVpbnQzMl90IF91c2VkOworCitwdWJsaWM6CisKKyAgTWVtb3J5UG9vbCgpCisgICAgICA6IF9iYXNlKE5VTEwpLCBfY2FwYWNpdHkoMCksIF91c2VkKDApIHsKKyAgfQorCisgIH5NZW1vcnlQb29sKCkgeworICAgIGlmIChOVUxMICE9IF9iYXNlKSB7CisgICAgICBmcmVlKF9iYXNlKTsKKyAgICAgIF9iYXNlID0gTlVMTDsKKyAgICB9CisgIH0KKworICB2b2lkIGluaXQodWludDMyX3QgY2FwYWNpdHkpIHRocm93IChPdXRPZk1lbW9yeUV4Y2VwdGlvbikgeworICAgIGlmIChjYXBhY2l0eSA+IF9jYXBhY2l0eSkgeworICAgICAgaWYgKE5VTEwgIT0gX2Jhc2UpIHsKKyAgICAgICAgZnJlZShfYmFzZSk7CisgICAgICAgIF9iYXNlID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIF9iYXNlID0gKGNoYXIqKW1hbGxvYyhjYXBhY2l0eSk7CisgICAgICBpZiAoTlVMTCA9PSBfYmFzZSkgeworICAgICAgICBUSFJPV19FWENFUFRJT04oT3V0T2ZNZW1vcnlFeGNlcHRpb24sICJOb3QgZW5vdWdoIG1lbW9yeSB0byBpbml0IE1lbW9yeUJsb2NrUG9vbCIpOworICAgICAgfQorICAgICAgX2NhcGFjaXR5ID0gY2FwYWNpdHk7CisgICAgfQorICAgIHJlc2V0KCk7CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIF91c2VkID0gMDsKKyAgfQorCisgIGNoYXIgKiBhbGxvY2F0ZSh1aW50MzJfdCBtaW4sIHVpbnQzMl90IGV4cGVjdCwgdWludDMyX3QgJiBhbGxvY2F0ZWQpIHsKKyAgICBpZiAoX3VzZWQgKyBtaW4gPiBfY2FwYWNpdHkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoX3VzZWQgKyBleHBlY3QgPiBfY2FwYWNpdHkpIHsKKyAgICAgIGNoYXIgKiBidWZmID0gX2Jhc2UgKyBfdXNlZDsKKyAgICAgIGFsbG9jYXRlZCA9IG1pbjsKKyAgICAgIF91c2VkICs9IG1pbjsKKyAgICAgIHJldHVybiBidWZmOworICAgIH0gZWxzZSB7CisgICAgICBjaGFyICogYnVmZiA9IF9iYXNlICsgX3VzZWQ7CisgICAgICBhbGxvY2F0ZWQgPSBleHBlY3Q7CisgICAgICBfdXNlZCArPSBleHBlY3Q7CisgICAgICByZXR1cm4gYnVmZjsKKyAgICB9CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIE1FTU9SWVBPT0xfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01lcmdlLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTWVyZ2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxOGRiOAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01lcmdlLmNjCkBAIC0wLDAgKzEsMTU2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAidXRpbC9UaW1lci5oIgorI2luY2x1ZGUgInV0aWwvU3RyaW5nVXRpbC5oIgorI2luY2x1ZGUgImxpYi9NZXJnZS5oIgorI2luY2x1ZGUgImxpYi9GaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworSUZpbGVNZXJnZUVudHJ5ICogSUZpbGVNZXJnZUVudHJ5OjpjcmVhdGUoU2luZ2xlU3BpbGxJbmZvICogc3BpbGwpIHsKKyAgSW5wdXRTdHJlYW0gKiBmaWxlT3V0ID0gRmlsZVN5c3RlbTo6Z2V0TG9jYWwoKS5vcGVuKHNwaWxsLT5wYXRoKTsKKyAgSUZpbGVSZWFkZXIgKiByZWFkZXIgPSBuZXcgSUZpbGVSZWFkZXIoZmlsZU91dCwgc3BpbGwsIHRydWUpOworICByZXR1cm4gbmV3IElGaWxlTWVyZ2VFbnRyeShyZWFkZXIpOworfQorCitNZXJnZXI6Ok1lcmdlcihJRmlsZVdyaXRlciAqIHdyaXRlciwgQ29uZmlnICogY29uZmlnLCBDb21wYXJhdG9yUHRyIGNvbXBhcmF0b3IsCisgICAgSUNvbWJpbmVSdW5uZXIgKiBjb21iaW5lUnVubmVyKQorICAgIDogX3dyaXRlcih3cml0ZXIpLCBfY29uZmlnKGNvbmZpZyksIF9jb21iaW5lUnVubmVyKGNvbWJpbmVSdW5uZXIpLCBfZmlyc3QodHJ1ZSksCisgICAgICAgIF9jb21wYXJhdG9yKGNvbXBhcmF0b3IpIHsKK30KKworTWVyZ2VyOjp+TWVyZ2VyKCkgeworICBfaGVhcC5jbGVhcigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IF9lbnRyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgZGVsZXRlIF9lbnRyaWVzW2ldOworICB9CisgIF9lbnRyaWVzLmNsZWFyKCk7Cit9CisKK3ZvaWQgTWVyZ2VyOjphZGRNZXJnZUVudHJ5KE1lcmdlRW50cnlQdHIgcG1lKSB7CisgIF9lbnRyaWVzLnB1c2hfYmFjayhwbWUpOworfQorCisvKioKKyAqIDAgaWYgc3VjY2VzcywgaGF2ZSBuZXh0IHBhcnRpdGlvbgorICogMSBpZiBmYWlsZWQsIG5vIG1vcmUKKyAqLworYm9vbCBNZXJnZXI6OnN0YXJ0UGFydGl0aW9uKCkgeworICBib29sIGZpcnN0UGFydGl0aW9uU3RhdGUgPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfZW50cmllcy5zaXplKCk7IGkrKykgeworICAgIGJvb2wgcGFydGl0aW9uU3RhdGUgPSBfZW50cmllc1tpXS0+bmV4dFBhcnRpdGlvbigpOworICAgIGlmIChpID09IDApIHsKKyAgICAgIGZpcnN0UGFydGl0aW9uU3RhdGUgPSBwYXJ0aXRpb25TdGF0ZTsKKyAgICB9CisgICAgaWYgKGZpcnN0UGFydGl0aW9uU3RhdGUgIT0gcGFydGl0aW9uU3RhdGUpIHsKKyAgICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIk1lcmdlRW50cnkgcGFydGl0aW9uIG51bWJlciBub3QgZXF1YWwiKTsKKyAgICB9CisgIH0KKyAgaWYgKGZpcnN0UGFydGl0aW9uU3RhdGUpIHsgLy8gZG8gaGF2ZSBuZXcgcGFydGl0aW9uCisgICAgX3dyaXRlci0+c3RhcnRQYXJ0aXRpb24oKTsKKyAgfQorICByZXR1cm4gZmlyc3RQYXJ0aXRpb25TdGF0ZTsKK30KKworLyoqCisgKiBmaW5pc2ggb25lIHBhcnRpdGlvbgorICovCit2b2lkIE1lcmdlcjo6ZW5kUGFydGl0aW9uKCkgeworICBfd3JpdGVyLT5lbmRQYXJ0aXRpb24oKTsKK30KKwordm9pZCBNZXJnZXI6OmluaXRIZWFwKCkgeworICBfaGVhcC5jbGVhcigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IF9lbnRyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgTWVyZ2VFbnRyeVB0ciBwbWUgPSBfZW50cmllc1tpXTsKKyAgICBpZiAocG1lLT5uZXh0KCkpIHsKKyAgICAgIF9oZWFwLnB1c2hfYmFjayhwbWUpOworICAgIH0KKyAgfQorICBtYWtlSGVhcCgmKF9oZWFwWzBdKSwgJihfaGVhcFswXSkgKyBfaGVhcC5zaXplKCksIF9jb21wYXJhdG9yKTsKK30KKworYm9vbCBNZXJnZXI6Om5leHQoKSB7CisgIHNpemVfdCBjdXJfaGVhcF9zaXplID0gX2hlYXAuc2l6ZSgpOworICBpZiAoY3VyX2hlYXBfc2l6ZSA+IDApIHsKKyAgICBpZiAoIV9maXJzdCkgeworICAgICAgaWYgKF9oZWFwWzBdLT5uZXh0KCkpIHsgLy8gaGF2ZSBtb3JlLCBhZGp1c3QgaGVhcAorICAgICAgICBpZiAoY3VyX2hlYXBfc2l6ZSA9PSAxKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyX2hlYXBfc2l6ZSA9PSAyKSB7CisgICAgICAgICAgTWVyZ2VFbnRyeVB0ciAqIGJhc2UgPSAmKF9oZWFwWzBdKTsKKworICAgICAgICAgIGlmIChfY29tcGFyYXRvcihiYXNlWzFdLCBiYXNlWzBdKSkgeworICAgICAgICAgICAgc3RkOjpzd2FwKGJhc2VbMF0sIGJhc2VbMV0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNZXJnZUVudHJ5UHRyICogYmFzZSA9ICYoX2hlYXBbMF0pOworICAgICAgICAgIGhlYXBpZnkoYmFzZSwgMSwgY3VyX2hlYXBfc2l6ZSwgX2NvbXBhcmF0b3IpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvLyBubyBtb3JlLCBwb3AgaGVhcAorICAgICAgICBNZXJnZUVudHJ5UHRyICogYmFzZSA9ICYoX2hlYXBbMF0pOworICAgICAgICBwb3BIZWFwKGJhc2UsIGJhc2UgKyBjdXJfaGVhcF9zaXplLCBfY29tcGFyYXRvcik7CisgICAgICAgIF9oZWFwLnBvcF9iYWNrKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9maXJzdCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gX2hlYXAuc2l6ZSgpID4gMDsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTWVyZ2VyOjpuZXh0KEJ1ZmZlciAmIGtleSwgQnVmZmVyICYgdmFsdWUpIHsKKyAgYm9vbCByZXN1bHQgPSBuZXh0KCk7CisgIGlmIChyZXN1bHQpIHsKKyAgICBNZXJnZUVudHJ5UHRyICogYmFzZSA9ICYoX2hlYXBbMF0pOworICAgIGtleS5yZXNldChiYXNlWzBdLT5nZXRLZXkoKSwgYmFzZVswXS0+Z2V0S2V5TGVuZ3RoKCkpOworICAgIHZhbHVlLnJlc2V0KGJhc2VbMF0tPmdldFZhbHVlKCksIGJhc2VbMF0tPmdldFZhbHVlTGVuZ3RoKCkpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIE1lcmdlcjo6bWVyZ2UoKSB7CisgIHVpbnQ2NF90IHRvdGFsX3JlY29yZCA9IDA7CisgIF9oZWFwLnJlc2VydmUoX2VudHJpZXMuc2l6ZSgpKTsKKyAgTWVyZ2VFbnRyeVB0ciAqIGJhc2UgPSAmKF9oZWFwWzBdKTsKKyAgd2hpbGUgKHN0YXJ0UGFydGl0aW9uKCkpIHsKKyAgICBpbml0SGVhcCgpOworICAgIGlmIChfaGVhcC5zaXplKCkgPT0gMCkgeworICAgICAgZW5kUGFydGl0aW9uKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgX2ZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoX2NvbWJpbmVSdW5uZXIgPT0gTlVMTCkgeworICAgICAgd2hpbGUgKG5leHQoKSkgeworICAgICAgICBfd3JpdGVyLT53cml0ZShiYXNlWzBdLT5nZXRLZXkoKSwgYmFzZVswXS0+Z2V0S2V5TGVuZ3RoKCksIGJhc2VbMF0tPmdldFZhbHVlKCksCisgICAgICAgICAgICBiYXNlWzBdLT5nZXRWYWx1ZUxlbmd0aCgpKTsKKyAgICAgICAgdG90YWxfcmVjb3JkKys7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIF9jb21iaW5lUnVubmVyLT5jb21iaW5lKENvbWJpbmVDb250ZXh0KFVOS05PV04pLCB0aGlzLCBfd3JpdGVyKTsKKyAgICB9CisgICAgZW5kUGFydGl0aW9uKCk7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTWVyZ2UuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01lcmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxZjJiZQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01lcmdlLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVSR0VfSF8KKyNkZWZpbmUgTUVSR0VfSF8KKworI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVycy5oIgorI2luY2x1ZGUgImxpYi9NYXBPdXRwdXRDb2xsZWN0b3IuaCIKKyNpbmNsdWRlICJsaWIvSUZpbGUuaCIKKyNpbmNsdWRlICJsaWIvTWluSGVhcC5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKy8qKgorICogbWVyZ2VyCisgKi8KK2NsYXNzIE1lcmdlRW50cnkgeworCitwcm90ZWN0ZWQ6CisgIC8vIHRoZXNlIDMgZmllbGRzIHNob3VsZCBiZSBmaWxsZWQgYWZ0ZXIgbmV4dCgpIGlzIGNhbGxlZAorICBjb25zdCBjaGFyICogX2tleTsKKyAgY29uc3QgY2hhciAqIF92YWx1ZTsKKyAgdWludDMyX3QgX2tleUxlbmd0aDsKKyAgdWludDMyX3QgX3ZhbHVlTGVuZ3RoOworCitwdWJsaWM6CisgIE1lcmdlRW50cnkoKQorICAgICAgOiBfa2V5KE5VTEwpLCBfdmFsdWUoTlVMTCksIF9rZXlMZW5ndGgoMCksIF92YWx1ZUxlbmd0aCgwKSB7CisgIH0KKworICBjb25zdCBjaGFyICogZ2V0S2V5KCkgY29uc3QgeworICAgIHJldHVybiBfa2V5OworICB9CisKKyAgY29uc3QgY2hhciAqIGdldFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBfdmFsdWU7CisgIH0KKworICB1aW50MzJfdCBnZXRLZXlMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIF9rZXlMZW5ndGg7CisgIH0KKworICB1aW50MzJfdCBnZXRWYWx1ZUxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX3ZhbHVlTGVuZ3RoOworICB9CisKKyAgdmlydHVhbCB+TWVyZ2VFbnRyeSgpIHsKKyAgfQorCisgIC8qKgorICAgKiBtb3ZlIHRvIG5leHQgcGFydGl0aW9uCisgICAqIDAgb24gc3VjY2VzcworICAgKiAxIG9uIG5vIG1vcmUKKyAgICovCisgIHZpcnR1YWwgYm9vbCBuZXh0UGFydGl0aW9uKCkgPSAwOworCisgIC8qKgorICAgKiBtb3ZlIHRvIG5leHQga2V5L3ZhbHVlCisgICAqIDAgb24gc3VjY2VzcworICAgKiAxIG9uIG5vIG1vcmUKKyAgICovCisgIHZpcnR1YWwgYm9vbCBuZXh0KCkgPSAwOworfTsKKworLyoqCisgKiBNZXJnZXIKKyAqLwordHlwZWRlZiBNZXJnZUVudHJ5ICogTWVyZ2VFbnRyeVB0cjsKKworY2xhc3MgTWVyZ2VFbnRyeUNvbXBhcmF0b3IgeworcHJpdmF0ZToKKyAgQ29tcGFyYXRvclB0ciBfa2V5Q29tcGFyYXRvcjsKKworcHVibGljOgorICBNZXJnZUVudHJ5Q29tcGFyYXRvcihDb21wYXJhdG9yUHRyIGNvbXBhcmF0b3IpCisgICAgICA6IF9rZXlDb21wYXJhdG9yKGNvbXBhcmF0b3IpIHsKKyAgfQorCitwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBNZXJnZUVudHJ5UHRyIGxocywgY29uc3QgTWVyZ2VFbnRyeVB0ciByaHMpIHsKKyAgICByZXR1cm4gKCpfa2V5Q29tcGFyYXRvcikobGhzLT5nZXRLZXkoKSwgbGhzLT5nZXRLZXlMZW5ndGgoKSwgcmhzLT5nZXRLZXkoKSwgcmhzLT5nZXRLZXlMZW5ndGgoKSkKKyAgICAgICAgPCAwOworICB9Cit9OworCisvKioKKyAqIE1lcmdlIGVudHJ5IGZvciBpbi1tZW1vcnkgcGFydGl0aW9uIGJ1Y2tldAorICovCitjbGFzcyBNZW1vcnlNZXJnZUVudHJ5IDogcHVibGljIE1lcmdlRW50cnkgeworcHJvdGVjdGVkOgorCisgIFBhcnRpdGlvbkJ1Y2tldCAqKiBfcGFydGl0aW9uczsKKyAgdWludDMyX3QgX251bWJlcjsKKyAgaW50NjRfdCBfaW5kZXg7CisKKyAgS1ZJdGVyYXRvciAqIF9pdGVyYXRvcjsKKyAgQnVmZmVyIGtleUJ1ZmZlcjsKKyAgQnVmZmVyIHZhbHVlQnVmZmVyOworCitwdWJsaWM6CisgIE1lbW9yeU1lcmdlRW50cnkoUGFydGl0aW9uQnVja2V0ICoqIHBhcnRpdGlvbnMsIHVpbnQzMl90IG51bWJlck9mUGFydGl0aW9ucykKKyAgICAgIDogX3BhcnRpdGlvbnMocGFydGl0aW9ucyksIF9udW1iZXIobnVtYmVyT2ZQYXJ0aXRpb25zKSwgX2luZGV4KC0xKSwgX2l0ZXJhdG9yKE5VTEwpIHsKKyAgfQorCisgIHZpcnR1YWwgfk1lbW9yeU1lcmdlRW50cnkoKSB7CisgICAgaWYgKE5VTEwgIT0gX2l0ZXJhdG9yKSB7CisgICAgICBkZWxldGUgX2l0ZXJhdG9yOworICAgICAgX2l0ZXJhdG9yID0gTlVMTDsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIGJvb2wgbmV4dFBhcnRpdGlvbigpIHsKKyAgICArK19pbmRleDsKKyAgICBpZiAoX2luZGV4IDwgX251bWJlcikgeworICAgICAgUGFydGl0aW9uQnVja2V0ICogY3VycmVudCA9IF9wYXJ0aXRpb25zW19pbmRleF07CisgICAgICBpZiAoTlVMTCAhPSBfaXRlcmF0b3IpIHsKKyAgICAgICAgZGVsZXRlIF9pdGVyYXRvcjsKKyAgICAgICAgX2l0ZXJhdG9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChOVUxMICE9IGN1cnJlbnQpIHsKKyAgICAgICAgX2l0ZXJhdG9yID0gY3VycmVudC0+Z2V0SXRlcmF0b3IoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogbW92ZSB0byBuZXh0IGtleS92YWx1ZQorICAgKiAwIG9uIHN1Y2Nlc3MKKyAgICogMSBvbiBubyBtb3JlCisgICAqLworICB2aXJ0dWFsIGJvb2wgbmV4dCgpIHsKKyAgICBpZiAoTlVMTCA9PSBfaXRlcmF0b3IpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBoYXNOZXh0ID0gX2l0ZXJhdG9yLT5uZXh0KGtleUJ1ZmZlciwgdmFsdWVCdWZmZXIpOworCisgICAgaWYgKGhhc05leHQpIHsKKyAgICAgIF9rZXlMZW5ndGggPSBrZXlCdWZmZXIubGVuZ3RoKCk7CisgICAgICBfa2V5ID0ga2V5QnVmZmVyLmRhdGEoKTsKKyAgICAgIF92YWx1ZUxlbmd0aCA9IHZhbHVlQnVmZmVyLmxlbmd0aCgpOworICAgICAgX3ZhbHVlID0gdmFsdWVCdWZmZXIuZGF0YSgpOworICAgICAgYXNzZXJ0KF92YWx1ZSAhPSBOVUxMKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBkZXRlY3QgZXJyb3IgZWFybHkKKyAgICBfa2V5TGVuZ3RoID0gMHhmZmZmZmZmZjsKKyAgICBfdmFsdWVMZW5ndGggPSAweGZmZmZmZmZmOworICAgIF9rZXkgPSBOVUxMOworICAgIF92YWx1ZSA9IE5VTEw7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvKioKKyAqIE1lcmdlIGVudHJ5IGZvciBpbnRlcm1lZGlhdGUgZmlsZQorICovCitjbGFzcyBJRmlsZU1lcmdlRW50cnkgOiBwdWJsaWMgTWVyZ2VFbnRyeSB7Citwcm90ZWN0ZWQ6CisgIElGaWxlUmVhZGVyICogX3JlYWRlcjsKKyAgYm9vbCBuZXdfcGFydGl0aW9uOworcHVibGljOgorICAvKioKKyAgICogQHBhcmFtIHJlYWRlcjogbWFuYWdlZCBieSBJbnRlckZpbGVNZXJnZUVudHJ5CisgICAqLworCisgIHN0YXRpYyBJRmlsZU1lcmdlRW50cnkgKiBjcmVhdGUoU2luZ2xlU3BpbGxJbmZvICogc3BpbGwpOworCisgIElGaWxlTWVyZ2VFbnRyeShJRmlsZVJlYWRlciAqIHJlYWRlcikKKyAgICAgIDogX3JlYWRlcihyZWFkZXIpIHsKKyAgICBuZXdfcGFydGl0aW9uID0gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIH5JRmlsZU1lcmdlRW50cnkoKSB7CisgICAgZGVsZXRlIF9yZWFkZXI7CisgICAgX3JlYWRlciA9IE5VTEw7CisgIH0KKworICAvKioKKyAgICogbW92ZSB0byBuZXh0IHBhcnRpdGlvbgorICAgKiAwIG9uIHN1Y2Nlc3MKKyAgICogMSBvbiBubyBtb3JlCisgICAqLworICB2aXJ0dWFsIGJvb2wgbmV4dFBhcnRpdGlvbigpIHsKKyAgICByZXR1cm4gX3JlYWRlci0+bmV4dFBhcnRpdGlvbigpOworICB9CisKKyAgLyoqCisgICAqIG1vdmUgdG8gbmV4dCBrZXkvdmFsdWUKKyAgICogMCBvbiBzdWNjZXNzCisgICAqIDEgb24gbm8gbW9yZQorICAgKi8KKyAgdmlydHVhbCBib29sIG5leHQoKSB7CisgICAgX2tleSA9IF9yZWFkZXItPm5leHRLZXkoX2tleUxlbmd0aCk7CisgICAgaWYgKHVubGlrZWx5KE5VTEwgPT0gX2tleSkpIHsKKyAgICAgIC8vIGRldGVjdCBlcnJvciBlYXJseQorICAgICAgX2tleUxlbmd0aCA9IDB4ZmZmZmZmZmZVOworICAgICAgX3ZhbHVlTGVuZ3RoID0gMHhmZmZmZmZmZlU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIF92YWx1ZSA9IF9yZWFkZXItPnZhbHVlKF92YWx1ZUxlbmd0aCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK2NsYXNzIE1lcmdlciA6IHB1YmxpYyBLVkl0ZXJhdG9yIHsKKworcHJpdmF0ZToKKyAgdmVjdG9yPE1lcmdlRW50cnlQdHI+IF9lbnRyaWVzOworICB2ZWN0b3I8TWVyZ2VFbnRyeVB0cj4gX2hlYXA7CisgIElGaWxlV3JpdGVyICogX3dyaXRlcjsKKyAgQ29uZmlnICogX2NvbmZpZzsKKyAgSUNvbWJpbmVSdW5uZXIgKiBfY29tYmluZVJ1bm5lcjsKKyAgYm9vbCBfZmlyc3Q7CisgIE1lcmdlRW50cnlDb21wYXJhdG9yIF9jb21wYXJhdG9yOworCitwdWJsaWM6CisgIE1lcmdlcihJRmlsZVdyaXRlciAqIHdyaXRlciwgQ29uZmlnICogY29uZmlnLCBDb21wYXJhdG9yUHRyIGNvbXBhcmF0b3IsCisgICAgICBJQ29tYmluZVJ1bm5lciAqIGNvbWJpbmVSdW5uZXIgPSBOVUxMKTsKKworICB+TWVyZ2VyKCk7CisKKyAgdm9pZCBhZGRNZXJnZUVudHJ5KE1lcmdlRW50cnlQdHIgcG1lKTsKKworICB2b2lkIG1lcmdlKCk7CisKKyAgdmlydHVhbCBib29sIG5leHQoQnVmZmVyICYga2V5LCBCdWZmZXIgJiB2YWx1ZSk7Citwcm90ZWN0ZWQ6CisgIGJvb2wgc3RhcnRQYXJ0aXRpb24oKTsKKyAgdm9pZCBlbmRQYXJ0aXRpb24oKTsKKyAgdm9pZCBpbml0SGVhcCgpOworICBib29sIG5leHQoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIE1FUkdFX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NaW5IZWFwLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9NaW5IZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4NWYzNAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL01pbkhlYXAuaApAQCAtMCwwICsxLDY0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNSU5fSEVBUF9IXworI2RlZmluZSBNSU5fSEVBUF9IXworCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJzLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmU+Cit2b2lkIGhlYXBpZnkoVCogZmlyc3QsIGludCBydCwgaW50IGhlYXBfbGVuLCBDb21wYXJlICYgQ29tcCkgeworICB3aGlsZSAocnQgKiAyIDw9IGhlYXBfbGVuKSAvLyBub3QgbGVhZgorICB7CisgICAgaW50IGxlZnQgPSAocnQgPDwgMSk7IC8vIGxlZnQgY2hpbGQKKyAgICBpbnQgcmlnaHQgPSAocnQgPDwgMSkgKyAxOyAvLyByaWdodCBjaGlsZAorICAgIGludCBzbWFsbGVzdCA9IHJ0OworICAgIGlmIChDb21wKCooZmlyc3QgKyBsZWZ0IC0gMSksICooZmlyc3QgKyBzbWFsbGVzdCAtIDEpKSkgeworICAgICAgc21hbGxlc3QgPSBsZWZ0OworICAgIH0KKyAgICBpZiAocmlnaHQgPD0gaGVhcF9sZW4gJiYgQ29tcCgqKGZpcnN0ICsgcmlnaHQgLSAxKSwgKihmaXJzdCArIHNtYWxsZXN0IC0gMSkpKSB7CisgICAgICBzbWFsbGVzdCA9IHJpZ2h0OworICAgIH0KKyAgICBpZiAoc21hbGxlc3QgIT0gcnQpIHsKKyAgICAgIHN0ZDo6c3dhcCgqKGZpcnN0ICsgc21hbGxlc3QgLSAxKSwgKihmaXJzdCArIHJ0IC0gMSkpOworICAgICAgcnQgPSBzbWFsbGVzdDsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmU+Cit2b2lkIG1ha2VIZWFwKFQqIGJlZ2luLCBUKiBlbmQsIENvbXBhcmUgJiBDb21wKSB7CisgIGludCBoZWFwX2xlbiA9IGVuZCAtIGJlZ2luOworICBpZiAoaGVhcF9sZW4gPj0gMCkgeworICAgIGZvciAodWludDMyX3QgaSA9IGhlYXBfbGVuIC8gMjsgaSA+PSAxOyBpLS0pIHsKKyAgICAgIGhlYXBpZnkoYmVnaW4sIGksIGhlYXBfbGVuLCBDb21wKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29tcGFyZT4KK3ZvaWQgcG9wSGVhcChUKiBiZWdpbiwgVCogZW5kLCBDb21wYXJlICYgQ29tcCkgeworICAqYmVnaW4gPSAqKGVuZCAtIDEpOworICAvLyBhZGp1c3QgW2JlZ2luLCBlbmQgLSAxKSB0byBoZWFwCisgIGhlYXBpZnkoYmVnaW4sIDEsIGVuZCAtIGJlZ2luIC0gMSwgQ29tcCk7Cit9CisKKyNlbmRpZiAvKiBIRUFQX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9OYXRpdmVMaWJyYXJ5LmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlTGlicmFyeS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDY5YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlTGlicmFyeS5jYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL05hdGl2ZU9iamVjdEZhY3RvcnkuaCIKKyNpbmNsdWRlICJsaWIvTmF0aXZlTGlicmFyeS5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTmF0aXZlTGlicmFyeSBtZXRob2RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTmF0aXZlTGlicmFyeTo6TmF0aXZlTGlicmFyeShjb25zdCBzdHJpbmcgJiBwYXRoLCBjb25zdCBzdHJpbmcgJiBuYW1lKQorICAgIDogX3BhdGgocGF0aCksIF9uYW1lKG5hbWUpLCBfZ2V0T2JqZWN0Q3JlYXRvckZ1bmMoTlVMTCksIF9mdW5jdGlvbkdldHRlcihOVUxMKSB7Cit9CisKK2Jvb2wgTmF0aXZlTGlicmFyeTo6aW5pdCgpIHsKKyAgdm9pZCAqbGlicmFyeSA9IGRsb3BlbihfcGF0aC5jX3N0cigpLCBSVExEX0xBWlkgfCBSVExEX0dMT0JBTCk7CisgIGlmIChOVUxMID09IGxpYnJhcnkpIHsKKyAgICBMT0coIltOYXRpdmVMaWJyYXJ5XSBMb2FkIG9iamVjdCBsaWJyYXJ5ICVzIGZhaWxlZC4iLCBfcGF0aC5jX3N0cigpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gY2xlYW4gZXJyb3Igc3RhdHVzCisgIGRsZXJyb3IoKTsKKworICBzdHJpbmcgY3JlYXRlX29iamVjdF9mdW5jX25hbWUgPSBfbmFtZSArICJHZXRPYmplY3RDcmVhdG9yIjsKKyAgX2dldE9iamVjdENyZWF0b3JGdW5jID0gKEdldE9iamVjdENyZWF0b3JGdW5jKWRsc3ltKGxpYnJhcnksIGNyZWF0ZV9vYmplY3RfZnVuY19uYW1lLmNfc3RyKCkpOworICBpZiAoTlVMTCA9PSBfZ2V0T2JqZWN0Q3JlYXRvckZ1bmMpIHsKKyAgICBMT0coIltOYXRpdmVMaWJyYXJ5XSBPYmplY3RDcmVhdG9yIGZ1bmN0aW9uIFslc10gbm90IGZvdW5kIiwgY3JlYXRlX29iamVjdF9mdW5jX25hbWUuY19zdHIoKSk7CisgIH0KKworICBzdHJpbmcgZnVuY3Rpb25HZXR0ZXIgPSBfbmFtZSArICJHZXRGdW5jdGlvbkdldHRlciI7CisgIF9mdW5jdGlvbkdldHRlciA9IChGdW5jdGlvbkdldHRlcilkbHN5bShsaWJyYXJ5LCBmdW5jdGlvbkdldHRlci5jX3N0cigpKTsKKyAgaWYgKE5VTEwgPT0gX2Z1bmN0aW9uR2V0dGVyKSB7CisgICAgTE9HKCJbTmF0aXZlTGlicmFyeV0gZnVuY3Rpb24gZ2V0dGVyIFslc10gbm90IGZvdW5kIiwgZnVuY3Rpb25HZXR0ZXIuY19zdHIoKSk7CisgIH0KKworICBzdHJpbmcgaW5pdF9saWJyYXJ5X2Z1bmNfbmFtZSA9IF9uYW1lICsgIkluaXQiOworICBJbml0TGlicmFyeUZ1bmMgaW5pdF9saWJyYXJ5X2Z1bmMgPSAoSW5pdExpYnJhcnlGdW5jKWRsc3ltKGxpYnJhcnksCisgICAgICBpbml0X2xpYnJhcnlfZnVuY19uYW1lLmNfc3RyKCkpOworICBpZiAoTlVMTCA9PSBpbml0X2xpYnJhcnlfZnVuYykgeworICAgIExPRygiW05hdGl2ZUxpYnJhcnldIExpYnJhcnkgaW5pdCBmdW5jdGlvbiBbJXNdIG5vdCBmb3VuZCIsIGluaXRfbGlicmFyeV9mdW5jX25hbWUuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgaW5pdF9saWJyYXJ5X2Z1bmMoKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworTmF0aXZlT2JqZWN0ICogTmF0aXZlTGlicmFyeTo6Y3JlYXRlT2JqZWN0KGNvbnN0IHN0cmluZyAmIGNseikgeworICBpZiAoTlVMTCA9PSBfZ2V0T2JqZWN0Q3JlYXRvckZ1bmMpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gKE5hdGl2ZU9iamVjdCopKChfZ2V0T2JqZWN0Q3JlYXRvckZ1bmMoY2x6KSkoKSk7Cit9CisKK3ZvaWQgKiBOYXRpdmVMaWJyYXJ5OjpnZXRGdW5jdGlvbihjb25zdCBzdHJpbmcgJiBmdW5jdGlvbk5hbWUpIHsKKyAgaWYgKE5VTEwgPT0gX2Z1bmN0aW9uR2V0dGVyKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuICgqX2Z1bmN0aW9uR2V0dGVyKShmdW5jdGlvbk5hbWUpOworfQorCitPYmplY3RDcmVhdG9yRnVuYyBOYXRpdmVMaWJyYXJ5OjpnZXRPYmplY3RDcmVhdG9yKGNvbnN0IHN0cmluZyAmIGNseikgeworICBpZiAoTlVMTCA9PSBfZ2V0T2JqZWN0Q3JlYXRvckZ1bmMpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gX2dldE9iamVjdENyZWF0b3JGdW5jKGNseik7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlTGlicmFyeS5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZGEyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9OYXRpdmVMaWJyYXJ5LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOQVRJVkVMSUJSQVJZX0hfCisjZGVmaW5lIE5BVElWRUxJQlJBUllfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCit1c2luZyBzdGQ6OnN0cmluZzsKK2NsYXNzIE5hdGl2ZU9iamVjdDsKK2NsYXNzIE5hdGl2ZU9iamVjdEZhY3Rvcnk7CisKKy8qKgorICogVXNlciBsZXZlbCBvYmplY3QgbGlicmFyeSBhYnN0cmFjdGlvbgorICovCitjbGFzcyBOYXRpdmVMaWJyYXJ5IHsKKyAgZnJpZW5kIGNsYXNzIE5hdGl2ZU9iamVjdEZhY3Rvcnk7Citwcml2YXRlOgorICBzdHJpbmcgX3BhdGg7CisgIHN0cmluZyBfbmFtZTsKKyAgR2V0T2JqZWN0Q3JlYXRvckZ1bmMgX2dldE9iamVjdENyZWF0b3JGdW5jOworICBGdW5jdGlvbkdldHRlciBfZnVuY3Rpb25HZXR0ZXI7CitwdWJsaWM6CisgIE5hdGl2ZUxpYnJhcnkoY29uc3Qgc3RyaW5nICYgcGF0aCwgY29uc3Qgc3RyaW5nICYgbmFtZSk7CisKKyAgYm9vbCBpbml0KCk7CisKKyAgTmF0aXZlT2JqZWN0ICogY3JlYXRlT2JqZWN0KGNvbnN0IHN0cmluZyAmIGNseik7CisKKyAgdm9pZCAqIGdldEZ1bmN0aW9uKGNvbnN0IHN0cmluZyAmIGZ1bmN0aW9uTmFtZSk7CisKKyAgT2JqZWN0Q3JlYXRvckZ1bmMgZ2V0T2JqZWN0Q3JlYXRvcihjb25zdCBzdHJpbmcgJiBjbHopOworCisgIH5OYXRpdmVMaWJyYXJ5KCkgeworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBOQVRJVkVMSUJSQVJZX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9OYXRpdmVPYmplY3RGYWN0b3J5LmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTg1Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5jYwpAQCAtMCwwICsxLDQ0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmbmRlZiBfX0NZR1dJTl9fCisjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorI2luY2x1ZGUgImxpYi9OYXRpdmVPYmplY3RGYWN0b3J5LmgiCisjaW5jbHVkZSAibGliL05hdGl2ZUxpYnJhcnkuaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVyU3RyZWFtLmgiCisjaW5jbHVkZSAidXRpbC9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAidXRpbC9TeW5jVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlsL1dyaXRhYmxlVXRpbHMuaCIKKyNpbmNsdWRlICJoYW5kbGVyL0JhdGNoSGFuZGxlci5oIgorI2luY2x1ZGUgImhhbmRsZXIvTUNvbGxlY3Rvck91dHB1dEhhbmRsZXIuaCIKKyNpbmNsdWRlICJoYW5kbGVyL0NvbWJpbmVIYW5kbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBOYXRpdmVUYXNrOworCisvLyBUT0RPOiBqdXN0IGZvciBkZWJ1Zywgc2hvdWxkIGJlIHJlbW92ZWQKK2V4dGVybiAiQyIgdm9pZCBoYW5kbGVyKGludCBzaWcpIHsKKyAgdm9pZCAqYXJyYXlbMTBdOworICBzaXplX3Qgc2l6ZTsKKworICAvLyBwcmludCBvdXQgYWxsIHRoZSBmcmFtZXMgdG8gc3RkZXJyCisgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IHNpZ25hbCAlZDpcbiIsIHNpZyk7CisKKyNpZm5kZWYgX19DWUdXSU5fXworICAvLyBnZXQgdm9pZConcyBmb3IgYWxsIGVudHJpZXMgb24gdGhlIHN0YWNrCisgIHNpemUgPSBiYWNrdHJhY2UoYXJyYXksIDEwKTsKKworICBiYWNrdHJhY2Vfc3ltYm9sc19mZChhcnJheSwgc2l6ZSwgMik7CisjZW5kaWYKKworICBleGl0KDEpOworfQorCitERUZJTkVfTkFUSVZFX0xJQlJBUlkoTmF0aXZlVGFzaykgeworICBSRUdJU1RFUl9DTEFTUyhCYXRjaEhhbmRsZXIsIE5hdGl2ZVRhc2spOworICBSRUdJU1RFUl9DTEFTUyhDb21iaW5lSGFuZGxlciwgTmF0aXZlVGFzayk7CisgIFJFR0lTVEVSX0NMQVNTKE1Db2xsZWN0b3JPdXRwdXRIYW5kbGVyLCBOYXRpdmVUYXNrKTsKKyAgTmF0aXZlT2JqZWN0RmFjdG9yeTo6U2V0RGVmYXVsdENsYXNzKEJhdGNoSGFuZGxlclR5cGUsICJOYXRpdmVUYXNrLkJhdGNoSGFuZGxlciIpOworfQorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK3N0YXRpYyBDb25maWcgR19DT05GSUc7CisKK3ZlY3RvcjxOYXRpdmVMaWJyYXJ5ICo+IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkxpYnJhcmllczsKK21hcDxOYXRpdmVPYmplY3RUeXBlLCBzdHJpbmc+IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkRlZmF1bHRDbGFzc2VzOworQ29uZmlnICogTmF0aXZlT2JqZWN0RmFjdG9yeTo6R2xvYmFsQ29uZmlnID0gJkdfQ09ORklHOworZmxvYXQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6TGFzdFByb2dyZXNzID0gMDsKK1Byb2dyZXNzICogTmF0aXZlT2JqZWN0RmFjdG9yeTo6VGFza1Byb2dyZXNzID0gTlVMTDsKK3N0cmluZyBOYXRpdmVPYmplY3RGYWN0b3J5OjpMYXN0U3RhdHVzOworc2V0PENvdW50ZXIgKiwgQ291bnRlclB0ckNvbXBhcmU+IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkNvdW50ZXJTZXQ7Cit2ZWN0b3I8Q291bnRlciAqPiBOYXRpdmVPYmplY3RGYWN0b3J5OjpDb3VudGVyczsKK3ZlY3Rvcjx1aW50NjRfdD4gTmF0aXZlT2JqZWN0RmFjdG9yeTo6Q291bnRlckxhc3RVcGRhdGVWYWx1ZXM7Citib29sIE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkluaXRlZCA9IGZhbHNlOworCitzdGF0aWMgTG9jayBGYWN0b3J5TG9jazsKKworYm9vbCBOYXRpdmVPYmplY3RGYWN0b3J5OjpJbml0KCkgeworICBTY29wZUxvY2s8TG9jaz4gYXV0b2xvY2FrKEZhY3RvcnlMb2NrKTsKKyAgaWYgKEluaXRlZCA9PSBmYWxzZSkgeworICAgIC8vIHNldHVwIGxvZyBkZXZpY2UKKyAgICBzdHJpbmcgZGV2aWNlID0gR2V0Q29uZmlnKCkuZ2V0KE5BVElWRV9MT0dfREVWSUNFLCAic3RkZXJyIik7CisgICAgaWYgKGRldmljZSA9PSAic3Rkb3V0IikgeworICAgICAgTE9HX0RFVklDRSA9IHN0ZG91dDsKKyAgICB9IGVsc2UgaWYgKGRldmljZSA9PSAic3RkZXJyIikgeworICAgICAgTE9HX0RFVklDRSA9IHN0ZGVycjsKKyAgICB9IGVsc2UgeworICAgICAgTE9HX0RFVklDRSA9IGZvcGVuKGRldmljZS5jX3N0cigpLCAidyIpOworICAgIH0KKyAgICBOYXRpdmVUYXNrSW5pdCgpOworICAgIE5hdGl2ZUxpYnJhcnkgKiBsaWJyYXJ5ID0gbmV3IE5hdGl2ZUxpYnJhcnkoImxpYm5hdGl2ZXRhc2suc28iLCAiTmF0aXZlVGFzayIpOworICAgIGxpYnJhcnktPl9nZXRPYmplY3RDcmVhdG9yRnVuYyA9IE5hdGl2ZVRhc2tHZXRPYmplY3RDcmVhdG9yOworICAgIExpYnJhcmllcy5wdXNoX2JhY2sobGlicmFyeSk7CisgICAgSW5pdGVkID0gdHJ1ZTsKKyAgICAvLyBsb2FkIGV4dHJhIHVzZXIgcHJvdmlkZWQgbGlicmFyaWVzCisgICAgc3RyaW5nIGxpYnJhcnlDb25mID0gR2V0Q29uZmlnKCkuZ2V0KE5BVElWRV9DTEFTU19MSUJSQVJZX0JVSUxESU4sICIiKTsKKyAgICBpZiAobGlicmFyeUNvbmYubGVuZ3RoKCkgPiAwKSB7CisgICAgICB2ZWN0b3I8c3RyaW5nPiBsaWJyYXJpZXM7CisgICAgICB2ZWN0b3I8c3RyaW5nPiBwYWlyOworICAgICAgU3RyaW5nVXRpbDo6U3BsaXQobGlicmFyeUNvbmYsICIsIiwgbGlicmFyaWVzLCB0cnVlKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlicmFyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHBhaXIuY2xlYXIoKTsKKyAgICAgICAgU3RyaW5nVXRpbDo6U3BsaXQobGlicmFyaWVzW2ldLCAiPSIsIHBhaXIsIHRydWUpOworICAgICAgICBpZiAocGFpci5zaXplKCkgPT0gMikgeworICAgICAgICAgIHN0cmluZyAmIG5hbWUgPSBwYWlyWzBdOworICAgICAgICAgIHN0cmluZyAmIHBhdGggPSBwYWlyWzFdOworICAgICAgICAgIExPRygiW05hdGl2ZU9iamVjdExpYnJhcnldIFRyeSB0byBsb2FkIGxpYnJhcnkgWyVzXSB3aXRoIGZpbGUgWyVzXSIsIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgICBpZiAoZmFsc2UgPT0gUmVnaXN0ZXJMaWJyYXJ5KHBhdGgsIG5hbWUpKSB7CisgICAgICAgICAgICBMT0coIltOYXRpdmVPYmplY3RMaWJyYXJ5XSBSZWdpc3RlckxpYnJhcnkgZmFpbGVkOiBuYW1lPSVzIHBhdGg9JXMiLCBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKCJbTmF0aXZlT2JqZWN0TGlicmFyeV0gUmVnaXN0ZXJMaWJyYXJ5IHN1Y2Nlc3M6IG5hbWU9JXMgcGF0aD0lcyIsIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBwYXRoLmNfc3RyKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBMT0coIltOYXRpdmVPYmplY3RMaWJyYXJ5XSBJbGxlZ2FsIG5hdGl2ZS5jbGFzcy5saWJyYXk6IFslc10gaW4gWyVzXSIsCisgICAgICAgICAgICAgIGxpYnJhcmllc1tpXS5jX3N0cigpLCBsaWJyYXJ5Q29uZi5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjb25zdCBjaGFyICogdmVyc2lvbiA9IEdldENvbmZpZygpLmdldChOQVRJVkVfSEFET09QX1ZFUlNJT04pOworICAgIExPRygiW05hdGl2ZU9iamVjdExpYnJhcnldIE5hdGl2ZVRhc2sgbGlicmFyeSBpbml0aWFsaXplZCB3aXRoIGhhZG9vcCAlcyIsCisgICAgICAgIHZlcnNpb24gPT0gTlVMTCA/ICJ1bmtvd24iIDogdmVyc2lvbik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6UmVsZWFzZSgpIHsKKyAgU2NvcGVMb2NrPExvY2s+IGF1dG9sb2NhayhGYWN0b3J5TG9jayk7CisgIGZvciAoc3NpemVfdCBpID0gTGlicmFyaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgZGVsZXRlIExpYnJhcmllc1tpXTsKKyAgICBMaWJyYXJpZXNbaV0gPSBOVUxMOworICB9CisgIExpYnJhcmllcy5jbGVhcigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IENvdW50ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgZGVsZXRlIENvdW50ZXJzW2ldOworICB9CisgIENvdW50ZXJzLmNsZWFyKCk7CisgIGlmIChMT0dfREVWSUNFICE9IHN0ZG91dCAmJiBMT0dfREVWSUNFICE9IHN0ZGVycikgeworICAgIGZjbG9zZShMT0dfREVWSUNFKTsKKyAgICBMT0dfREVWSUNFID0gc3RkZXJyOworICB9CisgIEluaXRlZCA9IGZhbHNlOworfQorCit2b2lkIE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkNoZWNrSW5pdCgpIHsKKyAgaWYgKEluaXRlZCA9PSBmYWxzZSkgeworICAgIGlmICghSW5pdCgpKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkluaXQgTmF0aXZlVGFzayBsaWJyYXJ5IGZhaWxlZC4iKTsKKyAgICB9CisgIH0KK30KKworQ29uZmlnICYgTmF0aXZlT2JqZWN0RmFjdG9yeTo6R2V0Q29uZmlnKCkgeworICByZXR1cm4gKkdsb2JhbENvbmZpZzsKK30KKworQ29uZmlnICogTmF0aXZlT2JqZWN0RmFjdG9yeTo6R2V0Q29uZmlnUHRyKCkgeworICByZXR1cm4gR2xvYmFsQ29uZmlnOworfQorCit2b2lkIE5hdGl2ZU9iamVjdEZhY3Rvcnk6OlNldFRhc2tQcm9ncmVzc1NvdXJjZShQcm9ncmVzcyAqIHByb2dyZXNzKSB7CisgIFRhc2tQcm9ncmVzcyA9IHByb2dyZXNzOworfQorCitmbG9hdCBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRUYXNrUHJvZ3Jlc3MoKSB7CisgIGlmIChUYXNrUHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIExhc3RQcm9ncmVzcyA9IFRhc2tQcm9ncmVzcy0+Z2V0UHJvZ3Jlc3MoKTsKKyAgfQorICByZXR1cm4gTGFzdFByb2dyZXNzOworfQorCit2b2lkIE5hdGl2ZU9iamVjdEZhY3Rvcnk6OlNldFRhc2tTdGF0dXMoY29uc3Qgc3RyaW5nICYgc3RhdHVzKSB7CisgIExhc3RTdGF0dXMgPSBzdGF0dXM7Cit9CisKK3N0YXRpYyBMb2NrIENvdW50ZXJzTG9jazsKKwordm9pZCBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRUYXNrU3RhdHVzVXBkYXRlKHN0cmluZyAmIHN0YXR1c0RhdGEpIHsKKyAgLy8gRW5jb2Rpbmc6CisgIC8vIHByb2dyZXNzOmZsb2F0CisgIC8vIHN0YXR1czpUZXh0CisgIC8vIENvdW50ZXIgbnVtYmVyCisgIC8vIENvdW50ZXJzW2dyb3VwOlRleHQsIG5hbWU6VGV4dCwgaW5jckNvdW50OkxvbmddCisgIE91dHB1dFN0cmluZ1N0cmVhbSBvcyhzdGF0dXNEYXRhKTsKKyAgZmxvYXQgcHJvZ3Jlc3MgPSBHZXRUYXNrUHJvZ3Jlc3MoKTsKKyAgV3JpdGFibGVVdGlsczo6V3JpdGVGbG9hdCgmb3MsIHByb2dyZXNzKTsKKyAgV3JpdGFibGVVdGlsczo6V3JpdGVUZXh0KCZvcywgTGFzdFN0YXR1cyk7CisgIExhc3RTdGF0dXMuY2xlYXIoKTsKKyAgeworICAgIFNjb3BlTG9jazxMb2NrPiBBdXRvTG9jayhDb3VudGVyc0xvY2spOworICAgIHVpbnQzMl90IG51bUNvdW50ZXIgPSAodWludDMyX3QpQ291bnRlcnMuc2l6ZSgpOworICAgIFdyaXRhYmxlVXRpbHM6OldyaXRlSW50KCZvcywgbnVtQ291bnRlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db3VudGVyOyBpKyspIHsKKyAgICAgIENvdW50ZXIgKiBjb3VudGVyID0gQ291bnRlcnNbaV07CisgICAgICB1aW50NjRfdCBuZXdDb3VudCA9IGNvdW50ZXItPmdldCgpOworICAgICAgdWludDY0X3QgaW5jciA9IG5ld0NvdW50IC0gQ291bnRlckxhc3RVcGRhdGVWYWx1ZXNbaV07CisgICAgICBDb3VudGVyTGFzdFVwZGF0ZVZhbHVlc1tpXSA9IG5ld0NvdW50OworICAgICAgV3JpdGFibGVVdGlsczo6V3JpdGVUZXh0KCZvcywgY291bnRlci0+Z3JvdXAoKSk7CisgICAgICBXcml0YWJsZVV0aWxzOjpXcml0ZVRleHQoJm9zLCBjb3VudGVyLT5uYW1lKCkpOworICAgICAgV3JpdGFibGVVdGlsczo6V3JpdGVMb25nKCZvcywgaW5jcik7CisgICAgfQorICB9Cit9CisKK0NvdW50ZXIgKiBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRDb3VudGVyKGNvbnN0IHN0cmluZyAmIGdyb3VwLCBjb25zdCBzdHJpbmcgJiBuYW1lKSB7CisgIFNjb3BlTG9jazxMb2NrPiBBdXRvTG9jayhDb3VudGVyc0xvY2spOworICBDb3VudGVyIHRtcENvdW50ZXIoZ3JvdXAsIG5hbWUpOworICBzZXQ8Q291bnRlciAqPjo6aXRlcmF0b3IgaXRyID0gQ291bnRlclNldC5maW5kKCZ0bXBDb3VudGVyKTsKKyAgaWYgKGl0ciAhPSBDb3VudGVyU2V0LmVuZCgpKSB7CisgICAgcmV0dXJuICppdHI7CisgIH0KKyAgQ291bnRlciAqIHJldCA9IG5ldyBDb3VudGVyKGdyb3VwLCBuYW1lKTsKKyAgQ291bnRlcnMucHVzaF9iYWNrKHJldCk7CisgIENvdW50ZXJMYXN0VXBkYXRlVmFsdWVzLnB1c2hfYmFjaygwKTsKKyAgQ291bnRlclNldC5pbnNlcnQocmV0KTsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBOYXRpdmVPYmplY3RGYWN0b3J5OjpSZWdpc3RlckNsYXNzKGNvbnN0IHN0cmluZyAmIGNseiwgT2JqZWN0Q3JlYXRvckZ1bmMgZnVuYykgeworICBOYXRpdmVUYXNrQ2xhc3NNYXBfX1tjbHpdID0gZnVuYzsKK30KKworTmF0aXZlT2JqZWN0ICogTmF0aXZlT2JqZWN0RmFjdG9yeTo6Q3JlYXRlT2JqZWN0KGNvbnN0IHN0cmluZyAmIGNseikgeworICBPYmplY3RDcmVhdG9yRnVuYyBjcmVhdG9yID0gR2V0T2JqZWN0Q3JlYXRvcihjbHopOworICByZXR1cm4gY3JlYXRvciA/IGNyZWF0b3IoKSA6IE5VTEw7Cit9CisKK3ZvaWQgKiBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRGdW5jdGlvbihjb25zdCBzdHJpbmcgJiBmdW5jTmFtZSkgeworICBDaGVja0luaXQoKTsKKyAgeworICAgIGZvciAodmVjdG9yPE5hdGl2ZUxpYnJhcnkqPjo6cmV2ZXJzZV9pdGVyYXRvciByaXRyID0gTGlicmFyaWVzLnJiZWdpbigpOworICAgICAgICByaXRyICE9IExpYnJhcmllcy5yZW5kKCk7IHJpdHIrKykgeworICAgICAgdm9pZCAqIHJldCA9ICgqcml0ciktPmdldEZ1bmN0aW9uKGZ1bmNOYW1lKTsKKyAgICAgIGlmIChOVUxMICE9IHJldCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitPYmplY3RDcmVhdG9yRnVuYyBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRPYmplY3RDcmVhdG9yKGNvbnN0IHN0cmluZyAmIGNseikgeworICBDaGVja0luaXQoKTsKKyAgeworICAgIGZvciAodmVjdG9yPE5hdGl2ZUxpYnJhcnkqPjo6cmV2ZXJzZV9pdGVyYXRvciByaXRyID0gTGlicmFyaWVzLnJiZWdpbigpOworICAgICAgICByaXRyICE9IExpYnJhcmllcy5yZW5kKCk7IHJpdHIrKykgeworICAgICAgT2JqZWN0Q3JlYXRvckZ1bmMgcmV0ID0gKCpyaXRyKS0+Z2V0T2JqZWN0Q3JlYXRvcihjbHopOworICAgICAgaWYgKE5VTEwgIT0gcmV0KSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3ZvaWQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6UmVsZWFzZU9iamVjdChOYXRpdmVPYmplY3QgKiBvYmopIHsKKyAgZGVsZXRlIG9iajsKK30KKworYm9vbCBOYXRpdmVPYmplY3RGYWN0b3J5OjpSZWdpc3RlckxpYnJhcnkoY29uc3Qgc3RyaW5nICYgcGF0aCwgY29uc3Qgc3RyaW5nICYgbmFtZSkgeworICBDaGVja0luaXQoKTsKKyAgeworICAgIE5hdGl2ZUxpYnJhcnkgKiBsaWJyYXJ5ID0gbmV3IE5hdGl2ZUxpYnJhcnkocGF0aCwgbmFtZSk7CisgICAgYm9vbCByZXQgPSBsaWJyYXJ5LT5pbml0KCk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIGRlbGV0ZSBsaWJyYXJ5OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBMaWJyYXJpZXMucHVzaF9iYWNrKGxpYnJhcnkpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3N0YXRpYyBMb2NrIERlZmF1bHRDbGFzc2VzTG9jazsKKwordm9pZCBOYXRpdmVPYmplY3RGYWN0b3J5OjpTZXREZWZhdWx0Q2xhc3MoTmF0aXZlT2JqZWN0VHlwZSB0eXBlLCBjb25zdCBzdHJpbmcgJiBjbHopIHsKKyAgU2NvcGVMb2NrPExvY2s+IGF1dG9sb2NhayhEZWZhdWx0Q2xhc3Nlc0xvY2spOworICBEZWZhdWx0Q2xhc3Nlc1t0eXBlXSA9IGNsejsKK30KKworTmF0aXZlT2JqZWN0ICogTmF0aXZlT2JqZWN0RmFjdG9yeTo6Q3JlYXRlRGVmYXVsdE9iamVjdChOYXRpdmVPYmplY3RUeXBlIHR5cGUpIHsKKyAgQ2hlY2tJbml0KCk7CisgIHsKKyAgICBpZiAoRGVmYXVsdENsYXNzZXMuZmluZCh0eXBlKSAhPSBEZWZhdWx0Q2xhc3Nlcy5lbmQoKSkgeworICAgICAgc3RyaW5nIGNseiA9IERlZmF1bHRDbGFzc2VzW3R5cGVdOworICAgICAgcmV0dXJuIENyZWF0ZU9iamVjdChjbHopOworICAgIH0KKyAgICBMT0coIltOYXRpdmVPYmplY3RMaWJyYXJ5XSBEZWZhdWx0IGNsYXNzIGZvciBOYXRpdmVPYmplY3RUeXBlICVzIG5vdCBmb3VuZCIsCisgICAgICAgIE5hdGl2ZU9iamVjdFR5cGVUb1N0cmluZyh0eXBlKS5jX3N0cigpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitpbnQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6Qnl0ZXNDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgdWludDMyX3QgZGVzdExlbmd0aCkgeworCisgIHVpbnQzMl90IG1pbmxlbiA9IHN0ZDo6bWluKHNyY0xlbmd0aCwgZGVzdExlbmd0aCk7CisgIGludDY0X3QgcmV0ID0gZm1lbWNtcChzcmMsIGRlc3QsIG1pbmxlbik7CisgIGlmIChyZXQgPiAwKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gc3JjTGVuZ3RoIC0gZGVzdExlbmd0aDsKK30KKworaW50IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkJ5dGVDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgdWludDMyX3QgZGVzdExlbmd0aCkgeworICByZXR1cm4gKCpzcmMpIC0gKCpkZXN0KTsKK30KKworaW50IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkludENvbXBhcmF0b3IoY29uc3QgY2hhciAqIHNyYywgdWludDMyX3Qgc3JjTGVuZ3RoLCBjb25zdCBjaGFyICogZGVzdCwKKyAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKSB7CisgIGludCByZXN1bHQgPSAoKnNyYykgLSAoKmRlc3QpOworICBpZiAocmVzdWx0ID09IDApIHsKKyAgICB1aW50MzJfdCBmcm9tID0gYnN3YXAoKih1aW50MzJfdCopc3JjKTsKKyAgICB1aW50MzJfdCB0byA9IGJzd2FwKCoodWludDMyX3QqKWRlc3QpOworICAgIGlmIChmcm9tID4gdG8pIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAoZnJvbSA9PSB0bykgeworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IE5hdGl2ZU9iamVjdEZhY3Rvcnk6OkxvbmdDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgdWludDMyX3QgZGVzdExlbmd0aCkgeworICBpbnQgcmVzdWx0ID0gKGludCkoKnNyYykgLSAoaW50KSgqZGVzdCk7CisgIGlmIChyZXN1bHQgPT0gMCkgeworCisgICAgdWludDY0X3QgZnJvbSA9IGJzd2FwNjQoKih1aW50NjRfdCopc3JjKTsKKyAgICB1aW50NjRfdCB0byA9IGJzd2FwNjQoKih1aW50NjRfdCopZGVzdCk7CisgICAgaWYgKGZyb20gPiB0bykgeworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChmcm9tID09IHRvKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6VkludENvbXBhcmF0b3IoY29uc3QgY2hhciAqIHNyYywgdWludDMyX3Qgc3JjTGVuZ3RoLCBjb25zdCBjaGFyICogZGVzdCwKKyAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKSB7CisgIGludDMyX3QgZnJvbSA9IFdyaXRhYmxlVXRpbHM6OlJlYWRWSW50KHNyYywgc3JjTGVuZ3RoKTsKKyAgaW50MzJfdCB0byA9IFdyaXRhYmxlVXRpbHM6OlJlYWRWSW50KGRlc3QsIGRlc3RMZW5ndGgpOworICBpZiAoZnJvbSA+IHRvKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAoZnJvbSA9PSB0bykgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitpbnQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6VkxvbmdDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgdWludDMyX3QgZGVzdExlbmd0aCkgeworICBpbnQ2NF90IGZyb20gPSBXcml0YWJsZVV0aWxzOjpSZWFkVkxvbmcoc3JjLCBzcmNMZW5ndGgpOworICBpbnQ2NF90IHRvID0gV3JpdGFibGVVdGlsczo6UmVhZFZMb25nKGRlc3QsIGRlc3RMZW5ndGgpOworICBpZiAoZnJvbSA+IHRvKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAoZnJvbSA9PSB0bykgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitpbnQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6RmxvYXRDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgdWludDMyX3QgZGVzdExlbmd0aCkgeworICBpZiAoc3JjTGVuZ3RoICE9IDQgfHwgZGVzdExlbmd0aCAhPSA0KSB7CisgICAgVEhST1dfRVhDRVBUSU9OX0VYKElPRXhjZXB0aW9uLCAiZmxvYXQgY29tcGFyYXRvciwgd2hpbGUgc3JjL2Rlc3QgbGVuZ3QgaXMgbm90IDQiKTsKKyAgfQorCisgIHVpbnQzMl90IGZyb20gPSBic3dhcCgqKHVpbnQzMl90KilzcmMpOworICB1aW50MzJfdCB0byA9IGJzd2FwKCoodWludDMyX3QqKWRlc3QpOworCisgIGZsb2F0ICogc3JjVmFsdWUgPSAoZmxvYXQgKikoJmZyb20pOworICBmbG9hdCAqIGRlc3RWYWx1ZSA9IChmbG9hdCAqKSgmdG8pOworCisgIGlmICgoKnNyY1ZhbHVlKSA8ICgqZGVzdFZhbHVlKSkgeworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmICgoKnNyY1ZhbHVlKSA9PSAoKmRlc3RWYWx1ZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCitpbnQgTmF0aXZlT2JqZWN0RmFjdG9yeTo6RG91YmxlQ29tcGFyYXRvcihjb25zdCBjaGFyICogc3JjLCB1aW50MzJfdCBzcmNMZW5ndGgsIGNvbnN0IGNoYXIgKiBkZXN0LAorICAgIHVpbnQzMl90IGRlc3RMZW5ndGgpIHsKKyAgaWYgKHNyY0xlbmd0aCAhPSA4IHx8IGRlc3RMZW5ndGggIT0gOCkgeworICAgIFRIUk9XX0VYQ0VQVElPTl9FWChJT0V4Y2VwdGlvbiwgImRvdWJsZSBjb21wYXJhdG9yLCB3aGlsZSBzcmMvZGVzdCBsZW5ndCBpcyBub3QgNCIpOworICB9CisKKyAgdWludDY0X3QgZnJvbSA9IGJzd2FwNjQoKih1aW50NjRfdCopc3JjKTsKKyAgdWludDY0X3QgdG8gPSBic3dhcDY0KCoodWludDY0X3QqKWRlc3QpOworCisgIGRvdWJsZSAqIHNyY1ZhbHVlID0gKGRvdWJsZSAqKSgmZnJvbSk7CisgIGRvdWJsZSAqIGRlc3RWYWx1ZSA9IChkb3VibGUgKikoJnRvKTsKKyAgaWYgKCgqc3JjVmFsdWUpIDwgKCpkZXN0VmFsdWUpKSB7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKCgqc3JjVmFsdWUpID09ICgqZGVzdFZhbHVlKSkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiAxOworICB9Cit9CisKK0NvbXBhcmF0b3JQdHIgZ2V0X2NvbXBhcmF0b3IoY29uc3QgS2V5VmFsdWVUeXBlIGtleVR5cGUsIGNvbnN0IGNoYXIgKiBjb21wYXJhdG9yTmFtZSkgeworICBpZiAoTlVMTCA9PSBjb21wYXJhdG9yTmFtZSkgeworICAgIGlmIChrZXlUeXBlID09IEJ5dGVzVHlwZSB8fCBrZXlUeXBlID09IFRleHRUeXBlKSB7CisgICAgICByZXR1cm4gJk5hdGl2ZU9iamVjdEZhY3Rvcnk6OkJ5dGVzQ29tcGFyYXRvcjsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gQnl0ZVR5cGUgfHwga2V5VHlwZSA9PSBCb29sVHlwZSkgeworICAgICAgcmV0dXJuICZOYXRpdmVPYmplY3RGYWN0b3J5OjpCeXRlQ29tcGFyYXRvcjsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gSW50VHlwZSkgeworICAgICAgcmV0dXJuICZOYXRpdmVPYmplY3RGYWN0b3J5OjpJbnRDb21wYXJhdG9yOworICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBMb25nVHlwZSkgeworICAgICAgcmV0dXJuICZOYXRpdmVPYmplY3RGYWN0b3J5OjpMb25nQ29tcGFyYXRvcjsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gRmxvYXRUeXBlKSB7CisgICAgICByZXR1cm4gJk5hdGl2ZU9iamVjdEZhY3Rvcnk6OkZsb2F0Q29tcGFyYXRvcjsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gRG91YmxlVHlwZSkgeworICAgICAgcmV0dXJuICZOYXRpdmVPYmplY3RGYWN0b3J5OjpEb3VibGVDb21wYXJhdG9yOworICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBWSW50VHlwZSkgeworICAgICAgcmV0dXJuICZOYXRpdmVPYmplY3RGYWN0b3J5OjpWSW50Q29tcGFyYXRvcjsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gVkxvbmdUeXBlKSB7CisgICAgICByZXR1cm4gJk5hdGl2ZU9iamVjdEZhY3Rvcnk6OlZMb25nQ29tcGFyYXRvcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdm9pZCAqIGZ1bmMgPSBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRGdW5jdGlvbihzdHJpbmcoY29tcGFyYXRvck5hbWUpKTsKKyAgICByZXR1cm4gKENvbXBhcmF0b3JQdHIpZnVuYzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOWQ0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9OYXRpdmVPYmplY3RGYWN0b3J5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTkFUSVZFT0JKRUNURkFDVE9SWV9IXworI2RlZmluZSBOQVRJVkVPQkpFQ1RGQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnBhaXI7CisKK2NsYXNzIE5hdGl2ZUxpYnJhcnk7CisKK2NsYXNzIENvdW50ZXJQdHJDb21wYXJlIHsKK3B1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IENvdW50ZXIgKiBsaHMsIGNvbnN0IENvdW50ZXIgKiByaHMpIGNvbnN0IHsKKyAgICBpZiAobGhzLT5ncm91cCgpIDwgcmhzLT5ncm91cCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGxocy0+Z3JvdXAoKSA9PSByaHMtPmdyb3VwKCkpIHsKKyAgICAgIHJldHVybiBsaHMtPm5hbWUoKSA8IHJocy0+bmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIE5hdGl2ZSBvYmplY3QgZmFjdG9yeQorICovCitjbGFzcyBOYXRpdmVPYmplY3RGYWN0b3J5IHsKK3ByaXZhdGU6CisgIHN0YXRpYyB2ZWN0b3I8TmF0aXZlTGlicmFyeSAqPiBMaWJyYXJpZXM7CisgIHN0YXRpYyBtYXA8TmF0aXZlT2JqZWN0VHlwZSwgc3RyaW5nPiBEZWZhdWx0Q2xhc3NlczsKKyAgc3RhdGljIENvbmZpZyAqIEdsb2JhbENvbmZpZzsKKyAgc3RhdGljIGZsb2F0IExhc3RQcm9ncmVzczsKKyAgc3RhdGljIFByb2dyZXNzICogVGFza1Byb2dyZXNzOworICBzdGF0aWMgc3RyaW5nIExhc3RTdGF0dXM7CisgIHN0YXRpYyBzZXQ8Q291bnRlciAqLCBDb3VudGVyUHRyQ29tcGFyZT4gQ291bnRlclNldDsKKyAgc3RhdGljIHZlY3RvcjxDb3VudGVyICo+IENvdW50ZXJzOworICBzdGF0aWMgdmVjdG9yPHVpbnQ2NF90PiBDb3VudGVyTGFzdFVwZGF0ZVZhbHVlczsKKyAgc3RhdGljIGJvb2wgSW5pdGVkOworcHVibGljOgorICBzdGF0aWMgYm9vbCBJbml0KCk7CisgIHN0YXRpYyB2b2lkIFJlbGVhc2UoKTsKKyAgc3RhdGljIHZvaWQgQ2hlY2tJbml0KCk7CisgIHN0YXRpYyBDb25maWcgJiBHZXRDb25maWcoKTsKKyAgc3RhdGljIENvbmZpZyAqIEdldENvbmZpZ1B0cigpOworICBzdGF0aWMgdm9pZCBTZXRUYXNrUHJvZ3Jlc3NTb3VyY2UoUHJvZ3Jlc3MgKiBwcm9ncmVzcyk7CisgIHN0YXRpYyBmbG9hdCBHZXRUYXNrUHJvZ3Jlc3MoKTsKKyAgc3RhdGljIHZvaWQgU2V0VGFza1N0YXR1cyhjb25zdCBzdHJpbmcgJiBzdGF0dXMpOworICBzdGF0aWMgdm9pZCBHZXRUYXNrU3RhdHVzVXBkYXRlKHN0cmluZyAmIHN0YXR1c0RhdGEpOworICBzdGF0aWMgQ291bnRlciAqIEdldENvdW50ZXIoY29uc3Qgc3RyaW5nICYgZ3JvdXAsIGNvbnN0IHN0cmluZyAmIG5hbWUpOworICBzdGF0aWMgdm9pZCBSZWdpc3RlckNsYXNzKGNvbnN0IHN0cmluZyAmIGNseiwgT2JqZWN0Q3JlYXRvckZ1bmMgZnVuYyk7CisgIHN0YXRpYyBOYXRpdmVPYmplY3QgKiBDcmVhdGVPYmplY3QoY29uc3Qgc3RyaW5nICYgY2x6KTsKKyAgc3RhdGljIHZvaWQgKiBHZXRGdW5jdGlvbihjb25zdCBzdHJpbmcgJiBjbHopOworICBzdGF0aWMgT2JqZWN0Q3JlYXRvckZ1bmMgR2V0T2JqZWN0Q3JlYXRvcihjb25zdCBzdHJpbmcgJiBjbHopOworICBzdGF0aWMgdm9pZCBSZWxlYXNlT2JqZWN0KE5hdGl2ZU9iamVjdCAqIG9iaik7CisgIHN0YXRpYyBib29sIFJlZ2lzdGVyTGlicmFyeShjb25zdCBzdHJpbmcgJiBwYXRoLCBjb25zdCBzdHJpbmcgJiBuYW1lKTsKKyAgc3RhdGljIHZvaWQgU2V0RGVmYXVsdENsYXNzKE5hdGl2ZU9iamVjdFR5cGUgdHlwZSwgY29uc3Qgc3RyaW5nICYgY2x6KTsKKyAgc3RhdGljIE5hdGl2ZU9iamVjdCAqIENyZWF0ZURlZmF1bHRPYmplY3QoTmF0aXZlT2JqZWN0VHlwZSB0eXBlKTsKKyAgc3RhdGljIGludCBCeXRlc0NvbXBhcmF0b3IoY29uc3QgY2hhciAqIHNyYywgdWludDMyX3Qgc3JjTGVuZ3RoLCBjb25zdCBjaGFyICogZGVzdCwKKyAgICAgIHVpbnQzMl90IGRlc3RMZW5ndGgpOworICBzdGF0aWMgaW50IEJ5dGVDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKTsKKyAgc3RhdGljIGludCBJbnRDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKTsKKyAgc3RhdGljIGludCBMb25nQ29tcGFyYXRvcihjb25zdCBjaGFyICogc3JjLCB1aW50MzJfdCBzcmNMZW5ndGgsIGNvbnN0IGNoYXIgKiBkZXN0LAorICAgICAgdWludDMyX3QgZGVzdExlbmd0aCk7CisgIHN0YXRpYyBpbnQgVkludENvbXBhcmF0b3IoY29uc3QgY2hhciAqIHNyYywgdWludDMyX3Qgc3JjTGVuZ3RoLCBjb25zdCBjaGFyICogZGVzdCwKKyAgICAgIHVpbnQzMl90IGRlc3RMZW5ndGgpOworICBzdGF0aWMgaW50IFZMb25nQ29tcGFyYXRvcihjb25zdCBjaGFyICogc3JjLCB1aW50MzJfdCBzcmNMZW5ndGgsIGNvbnN0IGNoYXIgKiBkZXN0LAorICAgICAgdWludDMyX3QgZGVzdExlbmd0aCk7CisgIHN0YXRpYyBpbnQgRmxvYXRDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKTsKKyAgc3RhdGljIGludCBEb3VibGVDb21wYXJhdG9yKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbmd0aCwgY29uc3QgY2hhciAqIGRlc3QsCisgICAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIE5BVElWRU9CSkVDVEZBQ1RPUllfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL05hdGl2ZVJ1bnRpbWVKbmlJbXBsLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlUnVudGltZUpuaUltcGwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2ODJlOAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL05hdGl2ZVJ1bnRpbWVKbmlJbXBsLmNjCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFFVSUNLX0JVSUxECisjaW5jbHVkZSAib3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZS5oIgorI2VuZGlmCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvam5pdXRpbHMuaCIKKyNpbmNsdWRlICJsaWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5oIgorCit1c2luZyBuYW1lc3BhY2UgTmF0aXZlVGFzazsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOYXRpdmVSdW50aW1lIEpOSSBtZXRob2RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoKKyAqIENsYXNzOiAgICAgb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZQorICogTWV0aG9kOiAgICBzdXBwb3J0Q29tcHJlc3Npb25Db2RlYworICogU2lnbmF0dXJlOiAoW0IpWgorICovCitKTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWVfc3VwcG9ydHNDb21wcmVzc2lvbkNvZGVjCisgIChKTklFbnYgKmplbnYsIGpjbGFzcyBjbGF6eiwgamJ5dGVBcnJheSBjb2RlYykgeworICBjb25zdCBzdGQ6OnN0cmluZyBjb2RlY1N0cmluZyA9IEpOVV9CeXRlQXJyYXlUb1N0cmluZyhqZW52LCBjb2RlYyk7CisgIGlmICgib3JnLmFwYWNoZS5oYWRvb3AuaW8uY29tcHJlc3MuR3ppcENvZGVjIiA9PSBjb2RlY1N0cmluZykgeworICAgIHJldHVybiBKTklfVFJVRTsKKyAgfSBlbHNlIGlmICgib3JnLmFwYWNoZS5oYWRvb3AuaW8uY29tcHJlc3MuTHo0Q29kZWMiID09IGNvZGVjU3RyaW5nKSB7CisgICAgcmV0dXJuIEpOSV9UUlVFOworICB9IGVsc2UgaWYgKCJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5TbmFwcHlDb2RlYyIgPT0gY29kZWNTdHJpbmcpIHsKKyNpZiBkZWZpbmVkIEhBRE9PUF9TTkFQUFlfTElCUkFSWQorICAgIHJldHVybiBKTklfVFJVRTsKKyNlbHNlCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIHJldHVybiBKTklfRkFMU0U7CisgIH0KK30KKworLyoKKyAqIENsYXNzOiAgICAgb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZQorICogTWV0aG9kOiAgICBKTklSZWxlYXNlCisgKiBTaWduYXR1cmU6ICgpVgorICovCitKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZV9KTklSZWxlYXNlKAorICAgIEpOSUVudiAqIGplbnYsIGpjbGFzcyBuYXRpdmVSdW50aW1lQ2xhc3MpIHsKKyAgdHJ5IHsKKyAgICBOYXRpdmVUYXNrOjpOYXRpdmVPYmplY3RGYWN0b3J5OjpSZWxlYXNlKCk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OlVuc3VwcG9ydEV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6T3V0T2ZNZW1vcnlFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6SU9FeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpKYXZhRXhjZXB0aW9uICYgZSkgeworICAgIExPRygiW05hdGl2ZVJ1bnRpbWVKbmlJbXBsXSBKYXZhRXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAvLyBEbyBub3RoaW5nLCBsZXQgamF2YSBzaWRlIGhhbmRsZQorICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJbTmF0aXZlUnVudGltZUpuaUltcGxdIFVua293biBzdGQ6OmV4Y2VwdGlvbiIpOworICB9Cit9CisKKy8qCisgKiBDbGFzczogICAgIG9yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWUKKyAqIE1ldGhvZDogICAgSk5JQ29uZmlndXJlCisgKiBTaWduYXR1cmU6IChbW0IpVgorICovCitKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZV9KTklDb25maWd1cmUoCisgICAgSk5JRW52ICogamVudiwgamNsYXNzIG5hdGl2ZVJ1bnRpbWVDbGFzcywgam9iamVjdEFycmF5IGNvbmZpZ3MpIHsKKyAgdHJ5IHsKKyAgICBOYXRpdmVUYXNrOjpDb25maWcgJiBjb25maWcgPSBOYXRpdmVUYXNrOjpOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRDb25maWcoKTsKKyAgICBqc2l6ZSBsZW4gPSBqZW52LT5HZXRBcnJheUxlbmd0aChjb25maWdzKTsKKyAgICBmb3IgKGpzaXplIGkgPSAwOyBpICsgMSA8IGxlbjsgaSArPSAyKSB7CisgICAgICBqYnl0ZUFycmF5IGtleV9vYmogPSAoamJ5dGVBcnJheSlqZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoY29uZmlncywgaSk7CisgICAgICBqYnl0ZUFycmF5IHZhbF9vYmogPSAoamJ5dGVBcnJheSlqZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoY29uZmlncywgaSArIDEpOworICAgICAgY29uZmlnLnNldChKTlVfQnl0ZUFycmF5VG9TdHJpbmcoamVudiwga2V5X29iaiksIEpOVV9CeXRlQXJyYXlUb1N0cmluZyhqZW52LCB2YWxfb2JqKSk7CisgICAgfQorICB9IGNhdGNoIChOYXRpdmVUYXNrOjpVbnN1cHBvcnRFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6Ok91dE9mTWVtb3J5RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OklPRXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6SmF2YUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBMT0coIkphdmFFeGNlcHRpb246ICVzIiwgZS53aGF0KCkpOworICAgIC8vIERvIG5vdGhpbmcsIGxldCBqYXZhIHNpZGUgaGFuZGxlCisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgIlVua293biBzdGQ6OmV4Y2VwdGlvbiIpOworICB9Cit9CisKKy8qCisgKiBDbGFzczogICAgIG9yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWUKKyAqIE1ldGhvZDogICAgSk5JQ3JlYXRlTmF0aXZlT2JqZWN0CisgKiBTaWduYXR1cmU6IChbQltCKUoKKyAqLworamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWVfSk5JQ3JlYXRlTmF0aXZlT2JqZWN0KAorICAgIEpOSUVudiAqIGplbnYsIGpjbGFzcyBuYXRpdmVSdW50aW1lQ2xhc3MsIGpieXRlQXJyYXkgY2xhenopIHsKKyAgdHJ5IHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlU3RyaW5nID0gSk5VX0J5dGVBcnJheVRvU3RyaW5nKGplbnYsIGNsYXp6KTsKKyAgICByZXR1cm4gKGpsb25nKShOYXRpdmVUYXNrOjpOYXRpdmVPYmplY3RGYWN0b3J5OjpDcmVhdGVPYmplY3QodHlwZVN0cmluZykpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpVbnN1cHBvcnRFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6Ok91dE9mTWVtb3J5RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OklPRXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6SmF2YUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBMT0coIkphdmFFeGNlcHRpb246ICVzIiwgZS53aGF0KCkpOworICAgIC8vIERvIG5vdGhpbmcsIGxldCBqYXZhIHNpZGUgaGFuZGxlCisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgIlVua25vd24gZXhjZXB0aW9uIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbGFzczogICAgIG9yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWUKKyAqIE1ldGhvZDogICAgSk5JQ3JlYXRlRGVmYXVsdE5hdGl2ZU9iamVjdAorICogU2lnbmF0dXJlOiAoW0IpSgorICovCitKTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWVfSk5JQ3JlYXRlRGVmYXVsdE5hdGl2ZU9iamVjdCgKKyAgICBKTklFbnYgKiBqZW52LCBqY2xhc3MgbmF0aXZlUnVudGltZUNsYXNzLCBqYnl0ZUFycmF5IHR5cGUpIHsKKyAgdHJ5IHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlU3RyaW5nID0gSk5VX0J5dGVBcnJheVRvU3RyaW5nKGplbnYsIHR5cGUpOworICAgIE5hdGl2ZVRhc2s6Ok5hdGl2ZU9iamVjdFR5cGUgdHlwZSA9IE5hdGl2ZVRhc2s6Ok5hdGl2ZU9iamVjdFR5cGVGcm9tU3RyaW5nKHR5cGVTdHJpbmcuY19zdHIoKSk7CisgICAgcmV0dXJuIChqbG9uZykoTmF0aXZlVGFzazo6TmF0aXZlT2JqZWN0RmFjdG9yeTo6Q3JlYXRlRGVmYXVsdE9iamVjdCh0eXBlKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OlVuc3VwcG9ydEV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6T3V0T2ZNZW1vcnlFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6SU9FeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpKYXZhRXhjZXB0aW9uICYgZSkgeworICAgIExPRygiW05hdGl2ZVJ1bnRpbWVKbmlJbXBsXSBKYXZhRXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAvLyBEbyBub3RoaW5nLCBsZXQgamF2YSBzaWRlIGhhbmRsZQorICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJbTmF0aXZlUnVudGltZUpuaUltcGxdIFVua25vd24gZXhjZXB0aW9uIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbGFzczogICAgIG9yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWUKKyAqIE1ldGhvZDogICAgSk5JUmVsZWFzZU5hdGl2ZU9iamVjdAorICogU2lnbmF0dXJlOiAoSilWCisgKi8KK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9vcmdfYXBhY2hlX2hhZG9vcF9tYXByZWRfbmF0aXZldGFza19OYXRpdmVSdW50aW1lX0pOSVJlbGVhc2VOYXRpdmVPYmplY3QoCisgICAgSk5JRW52ICogamVudiwgamNsYXNzIG5hdGl2ZVJ1bnRpbWVDbGFzcywgamxvbmcgb2JqZWN0QWRkcikgeworICB0cnkgeworICAgIE5hdGl2ZVRhc2s6Ok5hdGl2ZU9iamVjdCAqIG5vYmogPSAoKE5hdGl2ZVRhc2s6Ok5hdGl2ZU9iamVjdCAqKW9iamVjdEFkZHIpOworICAgIGlmIChOVUxMID09IG5vYmopIHsKKyAgICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgIk9iamVjdCBhZGRyIG5vdCBpbnN0YW5jZSBvZiBOYXRpdmVPYmplY3QiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgTmF0aXZlVGFzazo6TmF0aXZlT2JqZWN0RmFjdG9yeTo6UmVsZWFzZU9iamVjdChub2JqKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6VW5zdXBwb3J0RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpPdXRPZk1lbW9yeUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpJT0V4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OkphdmFFeGNlcHRpb24gJiBlKSB7CisgICAgTE9HKCJKYXZhRXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAvLyBEbyBub3RoaW5nLCBsZXQgamF2YSBzaWRlIGhhbmRsZQorICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJVbmtub3duIGV4Y2VwdGlvbiIpOworICB9Cit9CisKKy8qCisgKiBDbGFzczogICAgIG9yZ19hcGFjaGVfaGFkb29wX21hcHJlZF9uYXRpdmV0YXNrX05hdGl2ZVJ1bnRpbWUKKyAqIE1ldGhvZDogICAgSk5JUmVnaXN0ZXJNb2R1bGUKKyAqIFNpZ25hdHVyZTogKFtCW0IpSQorICovCitKTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZV9KTklSZWdpc3Rlck1vZHVsZSgKKyAgICBKTklFbnYgKiBqZW52LCBqY2xhc3MgbmF0aXZlUnVudGltZUNsYXNzLCBqYnl0ZUFycmF5IG1vZHVsZVBhdGgsIGpieXRlQXJyYXkgbW9kdWxlTmFtZSkgeworICB0cnkgeworICAgIHN0ZDo6c3RyaW5nIHBhdGhTdHJpbmcgPSBKTlVfQnl0ZUFycmF5VG9TdHJpbmcoamVudiwgbW9kdWxlUGF0aCk7CisgICAgc3RkOjpzdHJpbmcgbmFtZVN0cmluZyA9IEpOVV9CeXRlQXJyYXlUb1N0cmluZyhqZW52LCBtb2R1bGVOYW1lKTsKKyAgICBpZiAoTmF0aXZlVGFzazo6TmF0aXZlT2JqZWN0RmFjdG9yeTo6UmVnaXN0ZXJMaWJyYXJ5KHBhdGhTdHJpbmcsIG5hbWVTdHJpbmcpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OlVuc3VwcG9ydEV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6T3V0T2ZNZW1vcnlFeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIsIGUud2hhdCgpKTsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6SU9FeGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpKYXZhRXhjZXB0aW9uICYgZSkgeworICAgIExPRygiSmF2YUV4Y2VwdGlvbjogJXMiLCBlLndoYXQoKSk7CisgICAgLy8gRG8gbm90aGluZywgbGV0IGphdmEgc2lkZSBoYW5kbGUKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24gJiBlKSB7CisgICAgSk5VX1Rocm93QnlOYW1lKGplbnYsICJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoICguLi4pIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCAiVW5rbm93biBleGNlcHRpb24iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoKKyAqIENsYXNzOiAgICAgb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZQorICogTWV0aG9kOiAgICBKTklVcGRhdGVTdGF0dXMKKyAqIFNpZ25hdHVyZTogKClbQgorICovCitKTklFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfb3JnX2FwYWNoZV9oYWRvb3BfbWFwcmVkX25hdGl2ZXRhc2tfTmF0aXZlUnVudGltZV9KTklVcGRhdGVTdGF0dXMoCisgICAgSk5JRW52ICogamVudiwgamNsYXNzIG5hdGl2ZVJ1bnRpbWVDbGFzcykgeworICB0cnkgeworICAgIHN0ZDo6c3RyaW5nIHN0YXR1c0RhdGE7CisgICAgTmF0aXZlVGFzazo6TmF0aXZlT2JqZWN0RmFjdG9yeTo6R2V0VGFza1N0YXR1c1VwZGF0ZShzdGF0dXNEYXRhKTsKKyAgICBqYnl0ZUFycmF5IHJldCA9IGplbnYtPk5ld0J5dGVBcnJheShzdGF0dXNEYXRhLmxlbmd0aCgpKTsKKyAgICBqZW52LT5TZXRCeXRlQXJyYXlSZWdpb24ocmV0LCAwLCBzdGF0dXNEYXRhLmxlbmd0aCgpLCAoamJ5dGUqKXN0YXR1c0RhdGEuY19zdHIoKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfSBjYXRjaCAoTmF0aXZlVGFzazo6VW5zdXBwb3J0RXhjZXB0aW9uICYgZSkgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpPdXRPZk1lbW9yeUV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwgZS53aGF0KCkpOworICB9IGNhdGNoIChOYXRpdmVUYXNrOjpJT0V4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKE5hdGl2ZVRhc2s6OkphdmFFeGNlcHRpb24gJiBlKSB7CisgICAgTE9HKCJKYXZhRXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAvLyBEbyBub3RoaW5nLCBsZXQgamF2YSBzaWRlIGhhbmRsZQorICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmIGUpIHsKKyAgICBKTlVfVGhyb3dCeU5hbWUoamVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBlLndoYXQoKSk7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIEpOVV9UaHJvd0J5TmFtZShqZW52LCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJVbmtub3duIGV4Y2VwdGlvbiIpOworICB9CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvTmF0aXZlVGFzay5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL05hdGl2ZVRhc2suY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjODgwYwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL05hdGl2ZVRhc2suY2MKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9fQ1lHV0lOX18KKyNpbmNsdWRlIDxleGVjaW5mby5oPgorI2VuZGlmCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisjaW5jbHVkZSAibGliL05hdGl2ZU9iamVjdEZhY3RvcnkuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5hdGl2ZU9iamVjdFR5cGUgbWV0aG9kcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IHN0cmluZyBOYXRpdmVPYmplY3RUeXBlVG9TdHJpbmcoTmF0aXZlT2JqZWN0VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIEJhdGNoSGFuZGxlclR5cGU6CisgICAgcmV0dXJuIHN0cmluZygiQmF0Y2hIYW5kbGVyVHlwZSIpOworICBkZWZhdWx0OgorICAgIHJldHVybiBzdHJpbmcoIlVua25vd25PYmplY3RUeXBlIik7CisgIH0KK30KKworTmF0aXZlT2JqZWN0VHlwZSBOYXRpdmVPYmplY3RUeXBlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcgdHlwZSkgeworICBpZiAodHlwZSA9PSAiQmF0Y2hIYW5kbGVyVHlwZSIpIHsKKyAgICByZXR1cm4gQmF0Y2hIYW5kbGVyVHlwZTsKKyAgfQorICByZXR1cm4gVW5rbm93bk9iamVjdFR5cGU7Cit9CisKK0hhZG9vcEV4Y2VwdGlvbjo6SGFkb29wRXhjZXB0aW9uKGNvbnN0IHN0cmluZyAmIHdoYXQpIHsKKyAgLy8gcmVtb3ZlIGxvbmcgcGF0aCBwcmVmaXgKKyAgc2l6ZV90IG4gPSAwOworICBpZiAod2hhdFswXSA9PSAnLycpIHsKKyAgICBzaXplX3QgcCA9IHdoYXQuZmluZCgnOicpOworICAgIGlmIChwICE9IHdoYXQubnBvcykgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc2l6ZV90IG5wID0gd2hhdC5maW5kKCcvJywgbiArIDEpOworICAgICAgICBpZiAobnAgPT0gd2hhdC5ucG9zIHx8IG5wID49IHApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuID0gbnA7CisgICAgICB9CisgICAgfQorICB9CisgIF9yZWFzb24uYXBwZW5kKHdoYXQuY19zdHIoKSArIG4sIHdoYXQubGVuZ3RoKCkgLSBuKTsKKyAgdm9pZCAqYXJyYXlbNjRdOworICBzaXplX3Qgc2l6ZTsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisgIHNpemUgPSBiYWNrdHJhY2UoYXJyYXksIDY0KTsKKyAgY2hhciAqKiB0cmFjZXMgPSBiYWNrdHJhY2Vfc3ltYm9scyhhcnJheSwgc2l6ZSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgX3JlYXNvbi5hcHBlbmQoIlxuXHQiKTsKKyAgICBfcmVhc29uLmFwcGVuZCh0cmFjZXNbaV0pOworICB9CisjZW5kaWYKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBDb25maWc6OmxvYWQoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICBGSUxFICogZmluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOworICBpZiAoTlVMTCA9PSBmaW4pIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJmaWxlIG5vdCBmb3VuZCBvciBjYW4gbm90IG9wZW4gZm9yIHJlYWQiKTsKKyAgfQorICBjaGFyIGJ1ZmZbMjU2XTsKKyAgd2hpbGUgKGZnZXRzKGJ1ZmYsIDI1NiwgZmluKSAhPSBOVUxMKSB7CisgICAgaWYgKGJ1ZmZbMF0gPT0gJyMnKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcga2V5ID0gYnVmZjsKKyAgICBpZiAoa2V5W2tleS5sZW5ndGgoKSAtIDFdID09ICdcbicpIHsKKyAgICAgIHNpemVfdCBiciA9IGtleS5maW5kKCc9Jyk7CisgICAgICBpZiAoYnIgIT0ga2V5Lm5wb3MpIHsKKyAgICAgICAgc2V0KGtleS5zdWJzdHIoMCwgYnIpLCBTdHJpbmdVdGlsOjpUcmltKGtleS5zdWJzdHIoYnIgKyAxKSkpOworICAgICAgfQorICAgIH0KKyAgfQorICBmY2xvc2UoZmluKTsKK30KKwordm9pZCBDb25maWc6OnNldChjb25zdCBzdHJpbmcgJiBrZXksIGNvbnN0IHN0cmluZyAmIHZhbHVlKSB7CisgIF9jb25maWdzW2tleV0gPSB2YWx1ZTsKK30KKwordm9pZCBDb25maWc6OnNldEludChjb25zdCBzdHJpbmcgJiBuYW1lLCBpbnQ2NF90IHZhbHVlKSB7CisgIF9jb25maWdzW25hbWVdID0gU3RyaW5nVXRpbDo6VG9TdHJpbmcodmFsdWUpOworfQorCit2b2lkIENvbmZpZzo6c2V0Qm9vbChjb25zdCBzdHJpbmcgJiBuYW1lLCBib29sIHZhbHVlKSB7CisgIF9jb25maWdzW25hbWVdID0gU3RyaW5nVXRpbDo6VG9TdHJpbmcodmFsdWUpOworfQorCit2b2lkIENvbmZpZzo6cGFyc2UoaW50MzJfdCBhcmdjLCBjb25zdCBjaGFyICoqIGFyZ3YpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgY29uc3QgY2hhciAqIGVxdSA9IHN0cmNocihhcmd2W2ldLCAnPScpOworICAgIGlmIChOVUxMID09IGVxdSkgeworICAgICAgTE9HKCJbTmF0aXZlVGFza10gY29uZmlnIGFyZ3VtZW50IG5vdCByZWNvZ25pemVkOiAlcyIsIGFyZ3ZbaV0pOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeworICAgICAgTE9HKCJbTmF0aXZlVGFza10gY29uZmlnIGFyZ3VtZW50IHdpdGggJy0nIHByZWZpeCBpZ25vcmVkOiAlcyIsIGFyZ3ZbaV0pOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHN0cmluZyBrZXkoYXJndltpXSwgZXF1IC0gYXJndltpXSk7CisgICAgc3RyaW5nIHZhbHVlKGVxdSArIDEsIHN0cmxlbihlcXUgKyAxKSk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRyID0gX2NvbmZpZ3MuZmluZChrZXkpOworICAgIGlmIChpdHIgPT0gX2NvbmZpZ3MuZW5kKCkpIHsKKyAgICAgIF9jb25maWdzW2tleV0gPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaXRyLT5zZWNvbmQuYXBwZW5kKCIsIik7CisgICAgICBpdHItPnNlY29uZC5hcHBlbmQodmFsdWUpOworICAgIH0KKyAgfQorfQorCitjb25zdCBjaGFyICogQ29uZmlnOjpnZXQoY29uc3Qgc3RyaW5nICYgbmFtZSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdHIgPSBfY29uZmlncy5maW5kKG5hbWUpOworICBpZiAoaXRyID09IF9jb25maWdzLmVuZCgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGl0ci0+c2Vjb25kLmNfc3RyKCk7CisgIH0KK30KKworc3RyaW5nIENvbmZpZzo6Z2V0KGNvbnN0IHN0cmluZyAmIG5hbWUsIGNvbnN0IHN0cmluZyAmIGRlZmF1bHRWYWx1ZSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdHIgPSBfY29uZmlncy5maW5kKG5hbWUpOworICBpZiAoaXRyID09IF9jb25maWdzLmVuZCgpKSB7CisgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgIH0KK30KKworaW50NjRfdCBDb25maWc6OmdldEludChjb25zdCBzdHJpbmcgJiBuYW1lLCBpbnQ2NF90IGRlZmF1bHRWYWx1ZSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdHIgPSBfY29uZmlncy5maW5kKG5hbWUpOworICBpZiAoaXRyID09IF9jb25maWdzLmVuZCgpKSB7CisgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gU3RyaW5nVXRpbDo6dG9JbnQoaXRyLT5zZWNvbmQpOworICB9Cit9CisKK2Jvb2wgQ29uZmlnOjpnZXRCb29sKGNvbnN0IHN0cmluZyAmIG5hbWUsIGJvb2wgZGVmYXVsdFZhbHVlKSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ciA9IF9jb25maWdzLmZpbmQobmFtZSk7CisgIGlmIChpdHIgPT0gX2NvbmZpZ3MuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpbmdVdGlsOjp0b0Jvb2woaXRyLT5zZWNvbmQpOworICB9Cit9CisKK2Zsb2F0IENvbmZpZzo6Z2V0RmxvYXQoY29uc3Qgc3RyaW5nICYgbmFtZSwgZmxvYXQgZGVmYXVsdFZhbHVlKSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ciA9IF9jb25maWdzLmZpbmQobmFtZSk7CisgIGlmIChpdHIgPT0gX2NvbmZpZ3MuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpbmdVdGlsOjp0b0Zsb2F0KGl0ci0+c2Vjb25kKTsKKyAgfQorfQorCit2b2lkIENvbmZpZzo6Z2V0U3RyaW5ncyhjb25zdCBzdHJpbmcgJiBuYW1lLCB2ZWN0b3I8c3RyaW5nPiAmIGRlc3QpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRyID0gX2NvbmZpZ3MuZmluZChuYW1lKTsKKyAgaWYgKGl0ciAhPSBfY29uZmlncy5lbmQoKSkgeworICAgIFN0cmluZ1V0aWw6OlNwbGl0KGl0ci0+c2Vjb25kLCAiLCIsIGRlc3QsIHRydWUpOworICB9Cit9CisKK3ZvaWQgQ29uZmlnOjpnZXRJbnRzKGNvbnN0IHN0cmluZyAmIG5hbWUsIHZlY3RvcjxpbnQ2NF90PiAmIGRlc3QpIHsKKyAgdmVjdG9yPHN0cmluZz4gc2Rlc3Q7CisgIGdldFN0cmluZ3MobmFtZSwgc2Rlc3QpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNkZXN0LnNpemUoKTsgaSsrKSB7CisgICAgZGVzdC5wdXNoX2JhY2soU3RyaW5nVXRpbDo6dG9JbnQoc2Rlc3RbaV0pKTsKKyAgfQorfQorCit2b2lkIENvbmZpZzo6Z2V0RmxvYXRzKGNvbnN0IHN0cmluZyAmIG5hbWUsIHZlY3RvcjxmbG9hdD4gJiBkZXN0KSB7CisgIHZlY3RvcjxzdHJpbmc+IHNkZXN0OworICBnZXRTdHJpbmdzKG5hbWUsIHNkZXN0KTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZGVzdC5zaXplKCk7IGkrKykgeworICAgIGRlc3QucHVzaF9iYWNrKFN0cmluZ1V0aWw6OnRvRmxvYXQoc2Rlc3RbaV0pKTsKKyAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDb3VudGVyICogUHJvY2Vzc29yQmFzZTo6Z2V0Q291bnRlcihjb25zdCBzdHJpbmcgJiBncm91cCwgY29uc3Qgc3RyaW5nICYgbmFtZSkgeworICByZXR1cm4gTlVMTDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvUGFydGl0aW9uQnVja2V0LmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvUGFydGl0aW9uQnVja2V0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzI0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9QYXJ0aXRpb25CdWNrZXQuY2MKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAidXRpbC9UaW1lci5oIgorI2luY2x1ZGUgInV0aWwvU3RyaW5nVXRpbC5oIgorI2luY2x1ZGUgImxpYi9OYXRpdmVPYmplY3RGYWN0b3J5LmgiCisjaW5jbHVkZSAibGliL1BhcnRpdGlvbkJ1Y2tldC5oIgorI2luY2x1ZGUgImxpYi9NZXJnZS5oIgorI2luY2x1ZGUgIk5hdGl2ZVRhc2suaCIKKyNpbmNsdWRlICJ1dGlsL1dyaXRhYmxlVXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlsL0R1YWxQaXZvdFF1aWNrU29ydC5oIgorI2luY2x1ZGUgImxpYi9Db21iaW5lci5oIgorI2luY2x1ZGUgImxpYi9UYXNrQ291bnRlcnMuaCIKKyNpbmNsdWRlICJsaWIvTWluSGVhcC5oIgorI2luY2x1ZGUgImxpYi9QYXJ0aXRpb25CdWNrZXRJdGVyYXRvci5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK0tWSXRlcmF0b3IgKiBQYXJ0aXRpb25CdWNrZXQ6OmdldEl0ZXJhdG9yKCkgeworICBpZiAoX21lbUJsb2Nrcy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBuZXcgUGFydGl0aW9uQnVja2V0SXRlcmF0b3IodGhpcywgX2tleUNvbXBhcmF0b3IpOworfQorCit2b2lkIFBhcnRpdGlvbkJ1Y2tldDo6c3BpbGwoSUZpbGVXcml0ZXIgKiB3cml0ZXIpCisgIHRocm93KElPRXhjZXB0aW9uLCBVbnN1cHBvcnRFeGNlcHRpb24pIHsKKyAgS1ZJdGVyYXRvciAqIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoKTsKKyAgaWYgKE5VTEwgPT0gaXRlcmF0b3IgfHwgTlVMTCA9PSB3cml0ZXIpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoX2NvbWJpbmVSdW5uZXIgPT0gTlVMTCkgeworICAgIEJ1ZmZlciBrZXk7CisgICAgQnVmZmVyIHZhbHVlOworCisgICAgd2hpbGUgKGl0ZXJhdG9yLT5uZXh0KGtleSwgdmFsdWUpKSB7CisgICAgICB3cml0ZXItPndyaXRlKGtleS5kYXRhKCksIGtleS5sZW5ndGgoKSwgdmFsdWUuZGF0YSgpLCB2YWx1ZS5sZW5ndGgoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIF9jb21iaW5lUnVubmVyLT5jb21iaW5lKENvbWJpbmVDb250ZXh0KFVOS05PV04pLCBpdGVyYXRvciwgd3JpdGVyKTsKKyAgfQorICBkZWxldGUgaXRlcmF0b3I7Cit9CisKK3ZvaWQgUGFydGl0aW9uQnVja2V0Ojpzb3J0KFNvcnRBbGdvcml0aG0gdHlwZSkgeworICBpZiAoX21lbUJsb2Nrcy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoKCFfc29ydGVkKSkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBfbWVtQmxvY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICBNZW1vcnlCbG9jayAqIGJsb2NrID0gX21lbUJsb2Nrc1tpXTsKKyAgICAgIGJsb2NrLT5zb3J0KHR5cGUsIF9rZXlDb21wYXJhdG9yKTsKKyAgICB9CisgIH0KKyAgX3NvcnRlZCA9IHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1BhcnRpdGlvbkJ1Y2tldC5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvUGFydGl0aW9uQnVja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ZWM5NwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1BhcnRpdGlvbkJ1Y2tldC5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFBBUlRJVElPTl9CVUNLRVRfSF8KKyNkZWZpbmUgUEFSVElUSU9OX0JVQ0tFVF9IXworCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorI2luY2x1ZGUgImxpYi9NZW1vcnlQb29sLmgiCisjaW5jbHVkZSAibGliL01lbW9yeUJsb2NrLmgiCisjaW5jbHVkZSAidXRpbC9UaW1lci5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJzLmgiCisjaW5jbHVkZSAibGliL01hcE91dHB1dFNwZWMuaCIKKyNpbmNsdWRlICJsaWIvSUZpbGUuaCIKKyNpbmNsdWRlICJsaWIvU3BpbGxJbmZvLmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworLyoqCisgKiBCdWZmZXIgZm9yIGEgc2luZ2xlIHBhcnRpdGlvbgorICovCitjbGFzcyBQYXJ0aXRpb25CdWNrZXQgeworICBmcmllbmQgY2xhc3MgUGFydGl0aW9uQnVja2V0SXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBUZXN0UGFydGl0aW9uQnVja2V0OworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxNZW1vcnlCbG9jayAqPiBfbWVtQmxvY2tzOworICBNZW1vcnlQb29sICogX3Bvb2w7CisgIHVpbnQzMl90IF9wYXJ0aXRpb247CisgIHVpbnQzMl90IF9ibG9ja1NpemU7CisgIENvbXBhcmF0b3JQdHIgX2tleUNvbXBhcmF0b3I7CisgIElDb21iaW5lUnVubmVyICogX2NvbWJpbmVSdW5uZXI7CisgIGJvb2wgX3NvcnRlZDsKKworcHVibGljOgorICBQYXJ0aXRpb25CdWNrZXQoTWVtb3J5UG9vbCAqIHBvb2wsIHVpbnQzMl90IHBhcnRpdGlvbiwgQ29tcGFyYXRvclB0ciBjb21wYXJhdG9yLAorICAgICAgSUNvbWJpbmVSdW5uZXIgKiBjb21iaW5lUnVubmVyLCB1aW50MzJfdCBibG9ja1NpemUpCisgICAgICA6IF9wb29sKHBvb2wpLCBfcGFydGl0aW9uKHBhcnRpdGlvbiksIF9ibG9ja1NpemUoYmxvY2tTaXplKSwKKyAgICAgICAgICBfa2V5Q29tcGFyYXRvcihjb21wYXJhdG9yKSwgX2NvbWJpbmVSdW5uZXIoY29tYmluZVJ1bm5lciksICBfc29ydGVkKGZhbHNlKSB7CisgICAgaWYgKE5VTEwgPT0gX3Bvb2wgfHwgTlVMTCA9PSBjb21wYXJhdG9yKSB7CisgICAgICBUSFJPV19FWENFUFRJT05fRVgoSU9FeGNlcHRpb24sICJwb29sIGlzIE5VTEwsIG9yIGNvbXBhcmF0b3IgaXMgbm90IHNldCIpOworICAgIH0KKworICAgIGlmIChOVUxMICE9IGNvbWJpbmVSdW5uZXIpIHsKKyAgICAgIExPRygiW1BhcnRpdGlvbkJ1Y2tldF0gY29tYmluZSBydW5uZXIgaGFzIGJlZW4gc2V0Iik7CisgICAgfQorICB9CisKKyAgflBhcnRpdGlvbkJ1Y2tldCgpIHsKKyAgICByZXNldCgpOworICB9CisKKyAgdWludDMyX3QgZ2V0UGFydGl0aW9uSWQoKSB7CisgICAgcmV0dXJuIF9wYXJ0aXRpb247CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBfbWVtQmxvY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAoTlVMTCAhPSBfbWVtQmxvY2tzW2ldKSB7CisgICAgICAgIGRlbGV0ZSBfbWVtQmxvY2tzW2ldOworICAgICAgICBfbWVtQmxvY2tzW2ldID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgX21lbUJsb2Nrcy5jbGVhcigpOworICB9CisKKyAgS1ZJdGVyYXRvciAqIGdldEl0ZXJhdG9yKCk7CisKKyAgdWludDMyX3QgZ2V0S1ZDb3VudCgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgX21lbUJsb2Nrcy5zaXplKCk7IGkrKykgeworICAgICAgTWVtb3J5QmxvY2sgKiBibG9jayA9IF9tZW1CbG9ja3NbaV07CisgICAgICBpZiAoTlVMTCAhPSBibG9jaykgeworICAgICAgICBzaXplICs9IGJsb2NrLT5nZXRLVkNvdW50KCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgLyoqCisgICAqIEB0aHJvd3MgT3V0T2ZNZW1vcnlFeGNlcHRpb24gaWYgdG90YWxfbGVuZ3RoID4gaW8uc29ydC5tYgorICAgKi8KKyAgS1ZCdWZmZXIgKiBhbGxvY2F0ZUtWQnVmZmVyKHVpbnQzMl90IGt2TGVuZ3RoKSB7CisgICAgaWYgKGt2TGVuZ3RoID09IDApIHsKKyAgICAgIExPRygiS1YgTGVuZ3RoIGlzIGVtcHR5LCBubyBuZWVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgaXQiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfc29ydGVkID0gZmFsc2U7CisgICAgTWVtb3J5QmxvY2sgKiBtZW1CbG9jayA9IE5VTEw7CisgICAgdWludDMyX3QgbWVtQmxvY2tTaXplID0gX21lbUJsb2Nrcy5zaXplKCk7CisgICAgaWYgKG1lbUJsb2NrU2l6ZSA+IDApIHsKKyAgICAgIG1lbUJsb2NrID0gX21lbUJsb2Nrc1ttZW1CbG9ja1NpemUgLSAxXTsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gbWVtQmxvY2sgJiYgbWVtQmxvY2stPnJlbWFpblNwYWNlKCkgPj0ga3ZMZW5ndGgpIHsKKyAgICAgIHJldHVybiBtZW1CbG9jay0+YWxsb2NhdGVLVkJ1ZmZlcihrdkxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQzMl90IG1pbiA9IGt2TGVuZ3RoOworICAgICAgdWludDMyX3QgZXhwZWN0ID0gc3RkOjptYXgoX2Jsb2NrU2l6ZSwgbWluKTsKKyAgICAgIHVpbnQzMl90IGFsbG9jYXRlZCA9IDA7CisgICAgICBjaGFyICogYnVmZiA9IF9wb29sLT5hbGxvY2F0ZShtaW4sIGV4cGVjdCwgYWxsb2NhdGVkKTsKKyAgICAgIGlmIChOVUxMICE9IGJ1ZmYpIHsKKyAgICAgICAgbWVtQmxvY2sgPSBuZXcgTWVtb3J5QmxvY2soYnVmZiwgYWxsb2NhdGVkKTsKKyAgICAgICAgX21lbUJsb2Nrcy5wdXNoX2JhY2sobWVtQmxvY2spOworICAgICAgICByZXR1cm4gbWVtQmxvY2stPmFsbG9jYXRlS1ZCdWZmZXIoa3ZMZW5ndGgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHZvaWQgc29ydChTb3J0QWxnb3JpdGhtIHR5cGUpOworCisgIHZvaWQgc3BpbGwoSUZpbGVXcml0ZXIgKiB3cml0ZXIpIHRocm93IChJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0RXhjZXB0aW9uKTsKKworICB1aW50MzJfdCBnZXRNZW1vcnlCbG9ja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBfbWVtQmxvY2tzLnNpemUoKTsKKyAgfQorCisgIE1lbW9yeUJsb2NrICogZ2V0TWVtb3J5QmxvY2sodWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21lbUJsb2Nrc1tpbmRleF07CisgIH0KK307CisKK30KKzsKKy8vbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIFBBUlRJVElPTl9CVUNLRVRfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1BhcnRpdGlvbkJ1Y2tldEl0ZXJhdG9yLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvUGFydGl0aW9uQnVja2V0SXRlcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlMDQyZQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1BhcnRpdGlvbkJ1Y2tldEl0ZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1RpbWVyLmgiCisjaW5jbHVkZSAidXRpbC9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAibGliL05hdGl2ZU9iamVjdEZhY3RvcnkuaCIKKyNpbmNsdWRlICJsaWIvUGFydGl0aW9uQnVja2V0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsaWIvTWVyZ2UuaCIKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisjaW5jbHVkZSAidXRpbC9Xcml0YWJsZVV0aWxzLmgiCisjaW5jbHVkZSAidXRpbC9EdWFsUGl2b3RRdWlja1NvcnQuaCIKKyNpbmNsdWRlICJsaWIvQ29tYmluZXIuaCIKKyNpbmNsdWRlICJsaWIvVGFza0NvdW50ZXJzLmgiCisjaW5jbHVkZSAibGliL01pbkhlYXAuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUGFydGl0aW9uQnVja2V0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXJ0aXRpb25CdWNrZXRJdGVyYXRvcjo6UGFydGl0aW9uQnVja2V0SXRlcmF0b3IoUGFydGl0aW9uQnVja2V0ICogcGIsIENvbXBhcmF0b3JQdHIgY29tcGFyYXRvcikKKyAgICA6IF9wYihwYiksIF9jb21wYXJhdG9yKGNvbXBhcmF0b3IpLCBfZmlyc3QodHJ1ZSkgeworICB1aW50MzJfdCBibG9ja0NvdW50ID0gX3BiLT5nZXRNZW1vcnlCbG9ja0NvdW50KCk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBibG9ja0NvdW50OyBpKyspIHsKKyAgICBNZW1vcnlCbG9jayAqIGJsb2NrID0gX3BiLT5nZXRNZW1vcnlCbG9jayhpKTsKKyAgICBNZW1CbG9ja0l0ZXJhdG9yUHRyIGJsb2NrSXRlcmF0b3IgPSBuZXcgTWVtQmxvY2tJdGVyYXRvcihibG9jayk7CisgICAgaWYgKGJsb2NrSXRlcmF0b3ItPm5leHQoKSkgeworICAgICAgX2hlYXAucHVzaF9iYWNrKGJsb2NrSXRlcmF0b3IpOworICAgIH0gZWxzZSB7CisgICAgICBkZWxldGUgYmxvY2tJdGVyYXRvcjsKKyAgICB9CisgIH0KKyAgaWYgKF9oZWFwLnNpemUoKSA+IDEpIHsKKyAgICBtYWtlSGVhcCgmKF9oZWFwWzBdKSwgJihfaGVhcFswXSkgKyBfaGVhcC5zaXplKCksIF9jb21wYXJhdG9yKTsKKyAgfQorfQorCitQYXJ0aXRpb25CdWNrZXRJdGVyYXRvcjo6flBhcnRpdGlvbkJ1Y2tldEl0ZXJhdG9yKCkgeworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgX2hlYXAuc2l6ZSgpOyBpKyspIHsKKyAgICBNZW1CbG9ja0l0ZXJhdG9yUHRyIHB0ciA9IF9oZWFwW2ldOworICAgIGlmIChOVUxMICE9IHB0cikgeworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIF9oZWFwW2ldID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworYm9vbCBQYXJ0aXRpb25CdWNrZXRJdGVyYXRvcjo6bmV4dCgpIHsKKyAgc2l6ZV90IGN1cl9oZWFwX3NpemUgPSBfaGVhcC5zaXplKCk7CisgIGlmIChjdXJfaGVhcF9zaXplID4gMCkgeworICAgIGlmICghX2ZpcnN0KSB7CisgICAgICBpZiAoX2hlYXBbMF0tPm5leHQoKSkgeyAvLyBoYXZlIG1vcmUsIGFkanVzdCBoZWFwCisgICAgICAgIGlmIChjdXJfaGVhcF9zaXplID09IDEpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJfaGVhcF9zaXplID09IDIpIHsKKyAgICAgICAgICBNZW1CbG9ja0l0ZXJhdG9yUHRyICogYmFzZSA9ICYoX2hlYXBbMF0pOworCisgICAgICAgICAgaWYgKF9jb21wYXJhdG9yKGJhc2VbMV0sIGJhc2VbMF0pKSB7CisgICAgICAgICAgICBzdGQ6OnN3YXAoYmFzZVswXSwgYmFzZVsxXSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE1lbUJsb2NrSXRlcmF0b3JQdHIgKiBiYXNlID0gJihfaGVhcFswXSk7CisgICAgICAgICAgaGVhcGlmeShiYXNlLCAxLCBjdXJfaGVhcF9zaXplLCBfY29tcGFyYXRvcik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7IC8vIG5vIG1vcmUsIHBvcCBoZWFwCisgICAgICAgIC8vIGFmdGVyIHBvcEhlYXAsIHRoZSBmaXJzdCBlbGVtZW50IG9mIGhlYXAgd2lsbCBiZSByZW1vdmVkCisgICAgICAgIC8vIGFuZCByZXBsYWNlZCBieSBvdGhlciBlbGVtZW50LCBzbyBpdCBuZWVkcyB0byBiZSBkZWxldGVkCisgICAgICAgIGRlbGV0ZSBfaGVhcFswXTsKKyAgICAgICAgTWVtQmxvY2tJdGVyYXRvclB0ciAqIGJhc2UgPSAmKF9oZWFwWzBdKTsKKyAgICAgICAgcG9wSGVhcChiYXNlLCBiYXNlICsgY3VyX2hlYXBfc2l6ZSwgX2NvbXBhcmF0b3IpOworICAgICAgICBfaGVhcC5wb3BfYmFjaygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIF9oZWFwLnNpemUoKSA+IDA7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFBhcnRpdGlvbkJ1Y2tldEl0ZXJhdG9yOjpuZXh0KEJ1ZmZlciAmIGtleSwgQnVmZmVyICYgdmFsdWUpIHsKKyAgYm9vbCByZXN1bHQgPSBuZXh0KCk7CisgIGlmIChyZXN1bHQpIHsKKyAgICBNZW1CbG9ja0l0ZXJhdG9yUHRyICogYmFzZSA9ICYoX2hlYXBbMF0pOworICAgIEtWQnVmZmVyICoga3ZCdWZmZXIgPSBiYXNlWzBdLT5nZXRLVkJ1ZmZlcigpOworCisgICAga2V5LnJlc2V0KGt2QnVmZmVyLT5nZXRLZXkoKSwga3ZCdWZmZXItPmtleUxlbmd0aCk7CisgICAgdmFsdWUucmVzZXQoa3ZCdWZmZXItPmdldFZhbHVlKCksIGt2QnVmZmVyLT52YWx1ZUxlbmd0aCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9Cit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1BhcnRpdGlvbkJ1Y2tldEl0ZXJhdG9yLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9QYXJ0aXRpb25CdWNrZXRJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzg0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9QYXJ0aXRpb25CdWNrZXRJdGVyYXRvci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUEFSVElUSU9OX0JVQ0tFVF9JVEVSQVRPUl9IXworI2RlZmluZSBQQVJUSVRJT05fQlVDS0VUX0lURVJBVE9SX0hfCisKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisjaW5jbHVkZSAibGliL01lbW9yeVBvb2wuaCIKKyNpbmNsdWRlICJ1dGlsL1RpbWVyLmgiCisjaW5jbHVkZSAibGliL0J1ZmZlcnMuaCIKKyNpbmNsdWRlICJsaWIvTWFwT3V0cHV0U3BlYy5oIgorI2luY2x1ZGUgImxpYi9JRmlsZS5oIgorI2luY2x1ZGUgImxpYi9TcGlsbEluZm8uaCIKKyNpbmNsdWRlICJsaWIvQ29tYmluZXIuaCIKKyNpbmNsdWRlICJsaWIvUGFydGl0aW9uQnVja2V0LmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworY2xhc3MgUGFydGl0aW9uQnVja2V0SXRlcmF0b3IgOiBwdWJsaWMgS1ZJdGVyYXRvciB7Citwcm90ZWN0ZWQ6CisgIFBhcnRpdGlvbkJ1Y2tldCAqIF9wYjsKKyAgc3RkOjp2ZWN0b3I8TWVtQmxvY2tJdGVyYXRvclB0cj4gX2hlYXA7CisgIE1lbUJsb2NrQ29tcGFyYXRvciBfY29tcGFyYXRvcjsKKyAgYm9vbCBfZmlyc3Q7CisKK3B1YmxpYzoKKyAgUGFydGl0aW9uQnVja2V0SXRlcmF0b3IoUGFydGl0aW9uQnVja2V0ICogcGIsIENvbXBhcmF0b3JQdHIgY29tcGFyYXRvcik7CisgIHZpcnR1YWwgflBhcnRpdGlvbkJ1Y2tldEl0ZXJhdG9yKCk7CisgIHZpcnR1YWwgYm9vbCBuZXh0KEJ1ZmZlciAmIGtleSwgQnVmZmVyICYgdmFsdWUpOworCitwcml2YXRlOgorICBib29sIG5leHQoKTsKK307CisKK30KKzsKKy8vbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIFBBUlRJVElPTl9CVUNLRVRfSVRFUkFUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1BhdGguY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9QYXRoLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzIxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9QYXRoLmNjCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL1BhdGguaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitib29sIFBhdGg6OklzQWJzb2x1dGUoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICBpZiAocGF0aC5sZW5ndGgoKSA+IDAgJiYgcGF0aFswXSA9PSAnLycpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyBQYXRoOjpHZXRQYXJlbnQoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICBzaXplX3QgbGFzdFNsYXNoID0gcGF0aC5yZmluZCgnLycpOworICBpZiAobGFzdFNsYXNoID09IHBhdGgubnBvcykgeworICAgIHJldHVybiAiLiI7CisgIH0KKyAgaWYgKGxhc3RTbGFzaCA9PSAwICYmIHBhdGgubGVuZ3RoKCkgPT0gMSkgeworICAgIHJldHVybiAiIjsKKyAgfQorICBpZiAobGFzdFNsYXNoID09IDApIHsKKyAgICByZXR1cm4gcGF0aDsKKyAgfQorICByZXR1cm4gcGF0aC5zdWJzdHIoMCwgbGFzdFNsYXNoKTsKK30KKworc3RyaW5nIFBhdGg6OkdldE5hbWUoY29uc3Qgc3RyaW5nICYgcGF0aCkgeworICBzaXplX3QgbGFzdFNsYXNoID0gcGF0aC5yZmluZCgnLycpOworICBpZiAobGFzdFNsYXNoID09IHBhdGgubnBvcykgeworICAgIHJldHVybiBwYXRoOworICB9CisgIHJldHVybiBwYXRoLnN1YnN0cihsYXN0U2xhc2ggKyAxKTsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9QYXRoLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9QYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjODJmMgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1BhdGguaApAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQQVRIX0hfCisjZGVmaW5lIFBBVEhfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCit1c2luZyBzdGQ6OnN0cmluZzsKKworY2xhc3MgUGF0aCB7CitwdWJsaWM6CisgIHN0YXRpYyBib29sIElzQWJzb2x1dGUoY29uc3Qgc3RyaW5nICYgcGF0aCk7CisgIHN0YXRpYyBzdHJpbmcgR2V0UGFyZW50KGNvbnN0IHN0cmluZyAmIHBhdGgpOworICBzdGF0aWMgc3RyaW5nIEdldE5hbWUoY29uc3Qgc3RyaW5nICYgcGF0aCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBQQVRIX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9TcGlsbEluZm8uY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9TcGlsbEluZm8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmZjUyOQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1NwaWxsSW5mby5jYwpAQCAtMCwwICsxLDczIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL1N0cmVhbXMuaCIKKyNpbmNsdWRlICJsaWIvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJzLmgiCisjaW5jbHVkZSAibGliL1NwaWxsSW5mby5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK3ZvaWQgU2luZ2xlU3BpbGxJbmZvOjpkZWxldGVTcGlsbEZpbGUoKSB7CisgIGlmIChwYXRoLmxlbmd0aCgpID4gMCkgeworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIGlmICgwID09IHN0YXQocGF0aC5jX3N0cigpLCAmc3QpKSB7CisgICAgICByZW1vdmUocGF0aC5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBTaW5nbGVTcGlsbEluZm86OndyaXRlU3BpbGxJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZXBhdGgpIHsKKyAgT3V0cHV0U3RyZWFtICogZm91dCA9IEZpbGVTeXN0ZW06OmdldExvY2FsKCkuY3JlYXRlKGZpbGVwYXRoLCB0cnVlKTsKKyAgeworICAgIENoZWNrc3VtT3V0cHV0U3RyZWFtIGRlc3QgPSBDaGVja3N1bU91dHB1dFN0cmVhbShmb3V0LCBDSEVDS1NVTV9DUkMzMik7CisgICAgQXBwZW5kQnVmZmVyIGFwcGVuZEJ1ZmZlcjsKKyAgICBhcHBlbmRCdWZmZXIuaW5pdCgzMiAqIDEwMjQsICZkZXN0LCAiIik7CisgICAgdWludDY0X3QgYmFzZSA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRoaXMtPmxlbmd0aDsgaisrKSB7CisgICAgICBJRmlsZVNlZ21lbnQgKiBzZWdtZW50ID0gJih0aGlzLT5zZWdtZW50c1tqXSk7CisgICAgICBjb25zdCBib29sIGZpcnN0U2VnbWVudCA9IChqID09IDApOworICAgICAgaWYgKGZpcnN0U2VnbWVudCkgeworICAgICAgICBhcHBlbmRCdWZmZXIud3JpdGVfdWludDY0X2JlKGJhc2UpOworICAgICAgICBhcHBlbmRCdWZmZXIud3JpdGVfdWludDY0X2JlKHNlZ21lbnQtPnVuY29tcHJlc3NlZEVuZE9mZnNldCk7CisgICAgICAgIGFwcGVuZEJ1ZmZlci53cml0ZV91aW50NjRfYmUoc2VnbWVudC0+cmVhbEVuZE9mZnNldCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcHBlbmRCdWZmZXIud3JpdGVfdWludDY0X2JlKGJhc2UgKyB0aGlzLT5zZWdtZW50c1tqIC0gMV0ucmVhbEVuZE9mZnNldCk7CisgICAgICAgIGFwcGVuZEJ1ZmZlci53cml0ZV91aW50NjRfYmUoCisgICAgICAgICAgICBzZWdtZW50LT51bmNvbXByZXNzZWRFbmRPZmZzZXQgLSB0aGlzLT5zZWdtZW50c1tqIC0gMV0udW5jb21wcmVzc2VkRW5kT2Zmc2V0KTsKKyAgICAgICAgYXBwZW5kQnVmZmVyLndyaXRlX3VpbnQ2NF9iZShzZWdtZW50LT5yZWFsRW5kT2Zmc2V0IC0gdGhpcy0+c2VnbWVudHNbaiAtIDFdLnJlYWxFbmRPZmZzZXQpOworICAgICAgfQorICAgIH0KKyAgICBhcHBlbmRCdWZmZXIuZmx1c2goKTsKKyAgICB1aW50MzJfdCBjaHN1bSA9IGRlc3QuZ2V0Q2hlY2tzdW0oKTsKKyNpZmRlZiBTUElMTFJFQ09SRF9DSEVDS1NVTV9VSU5UCisgICAgY2hzdW0gPSBic3dhcChjaHN1bSk7CisgICAgZm91dC0+d3JpdGUoJmNoc3VtLCBzaXplb2YodWludDMyX3QpKTsKKyNlbHNlCisgICAgdWludDY0X3Qgd3RjaHN1bSA9IGJzd2FwNjQoKHVpbnQ2NF90KWNoc3VtKTsKKyAgICBmb3V0LT53cml0ZSgmd3RjaHN1bSwgc2l6ZW9mKHVpbnQ2NF90KSk7CisjZW5kaWYKKyAgfQorICBmb3V0LT5jbG9zZSgpOworICBkZWxldGUgZm91dDsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9TcGlsbEluZm8uaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1NwaWxsSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZWIxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9TcGlsbEluZm8uaApAQCAtMCwwICsxLDEwNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUEFSVElUSU9OSU5ERVhfSF8KKyNkZWZpbmUgUEFSVElUSU9OSU5ERVhfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCit1c2luZyBzdGQ6OnN0cmluZzsKKworLyoqCisgKiBTdG9yZSBzcGlsbCBmaWxlIHNlZ21lbnQgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IElGaWxlU2VnbWVudCB7CisgIC8vIHVuY29tcHJlc3NlZCBzdHJlYW0gZW5kIHBvc2l0aW9uCisgIHVpbnQ2NF90IHVuY29tcHJlc3NlZEVuZE9mZnNldDsKKyAgLy8gY29tcHJlc3NlZCBzdHJlYW0gZW5kIHBvc2l0aW9uCisgIHVpbnQ2NF90IHJlYWxFbmRPZmZzZXQ7Cit9OworCitjbGFzcyBTaW5nbGVTcGlsbEluZm8geworcHVibGljOgorICB1aW50MzJfdCBsZW5ndGg7CisgIHN0ZDo6c3RyaW5nIHBhdGg7CisgIElGaWxlU2VnbWVudCAqIHNlZ21lbnRzOworICBDaGVja3N1bVR5cGUgY2hlY2tTdW1UeXBlOworICBLZXlWYWx1ZVR5cGUga2V5VHlwZTsKKyAgS2V5VmFsdWVUeXBlIHZhbHVlVHlwZTsKKyAgc3RkOjpzdHJpbmcgY29kZWM7CisKKyAgU2luZ2xlU3BpbGxJbmZvKElGaWxlU2VnbWVudCAqIHNlZ21lbnRzLCB1aW50MzJfdCBsZW4sIGNvbnN0IHN0cmluZyAmIHBhdGgsIENoZWNrc3VtVHlwZSBjaGVja3N1bSwKKyAgICAgIEtleVZhbHVlVHlwZSBrdHlwZSwgS2V5VmFsdWVUeXBlIHZ0eXBlLCBjb25zdCBzdHJpbmcgJiBpbnB1dENvZGVjKQorICAgICAgOiBsZW5ndGgobGVuKSwgcGF0aChwYXRoKSwgc2VnbWVudHMoc2VnbWVudHMpLCBjaGVja1N1bVR5cGUoY2hlY2tzdW0pLCBrZXlUeXBlKGt0eXBlKSwKKyAgICAgICAgICB2YWx1ZVR5cGUodnR5cGUpLCBjb2RlYyhpbnB1dENvZGVjKSB7CisgIH0KKworICB+U2luZ2xlU3BpbGxJbmZvKCkgeworICAgIGRlbGV0ZVtdIHNlZ21lbnRzOworICB9CisKKyAgdm9pZCBkZWxldGVTcGlsbEZpbGUoKTsKKworICB1aW50NjRfdCBnZXRFbmRQb3NpdGlvbigpIHsKKyAgICByZXR1cm4gc2VnbWVudHMgPyBzZWdtZW50c1tsZW5ndGggLSAxXS51bmNvbXByZXNzZWRFbmRPZmZzZXQgOiAwOworICB9CisKKyAgdWludDY0X3QgZ2V0UmVhbEVuZFBvc2l0aW9uKCkgeworICAgIHJldHVybiBzZWdtZW50cyA/IHNlZ21lbnRzW2xlbmd0aCAtIDFdLnJlYWxFbmRPZmZzZXQgOiAwOworICB9CisKKyAgdm9pZCB3cml0ZVNwaWxsSW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVwYXRoKTsKK307CisKK2NsYXNzIFNwaWxsSW5mb3MgeworcHVibGljOgorICBzdGQ6OnZlY3RvcjxTaW5nbGVTcGlsbEluZm8qPiBzcGlsbHM7CisgIFNwaWxsSW5mb3MoKSB7CisgIH0KKworICB+U3BpbGxJbmZvcygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNwaWxscy5zaXplKCk7IGkrKykgeworICAgICAgZGVsZXRlIHNwaWxsc1tpXTsKKyAgICB9CisgICAgc3BpbGxzLmNsZWFyKCk7CisgIH0KKworICB2b2lkIGRlbGV0ZUFsbFNwaWxsRmlsZXMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzcGlsbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHNwaWxsc1tpXS0+ZGVsZXRlU3BpbGxGaWxlKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBhZGQoU2luZ2xlU3BpbGxJbmZvICogc3JpKSB7CisgICAgc3BpbGxzLnB1c2hfYmFjayhzcmkpOworICB9CisKKyAgdWludDMyX3QgZ2V0U3BpbGxDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3BpbGxzLnNpemUoKTsKKyAgfQorCisgIFNpbmdsZVNwaWxsSW5mbyogZ2V0U2luZ2xlU3BpbGxJbmZvKGludCBpbmRleCkgeworICAgIHJldHVybiBzcGlsbHMuYXQoaW5kZXgpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBQQVJUSVRJT05JTkRFWF9IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvU3BpbGxPdXRwdXRTZXJ2aWNlLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9TcGlsbE91dHB1dFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmE2Njg1Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvU3BpbGxPdXRwdXRTZXJ2aWNlLmgKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1BJTExfT1VUUFVUX1NFUlZJQ0VfSF8KKyNkZWZpbmUgU1BJTExfT1VUUFVUX1NFUlZJQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBDb21iaW5lSGFuZGxlcjsKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK2NsYXNzIFNwaWxsT3V0cHV0U2VydmljZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflNwaWxsT3V0cHV0U2VydmljZSgpIHt9CisKKyAgdmlydHVhbCBzdHJpbmcgKiBnZXRTcGlsbFBhdGgoKSA9IDA7CisgIHZpcnR1YWwgc3RyaW5nICogZ2V0T3V0cHV0UGF0aCgpID0gMDsKKyAgdmlydHVhbCBzdHJpbmcgKiBnZXRPdXRwdXRJbmRleFBhdGgoKSA9IDA7CisKKyAgdmlydHVhbCBDb21iaW5lSGFuZGxlciAqIGdldEphdmFDb21iaW5lSGFuZGxlcigpID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIFNQSUxMX09VVFBVVF9TRVJWSUNFX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9TdHJlYW1zLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvU3RyZWFtcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThmZmJhCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvU3RyZWFtcy5jYwpAQCAtMCwwICsxLDEyMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgInV0aWwvQ2hlY2tzdW0uaCIKKyNpbmNsdWRlICJsaWIvU3RyZWFtcy5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBJbnB1dFN0cmVhbTo6c2Vlayh1aW50NjRfdCBwb3NpdGlvbikgeworICBUSFJPV19FWENFUFRJT04oVW5zdXBwb3J0RXhjZXB0aW9uLCAic2VlayBub3Qgc3VwcG9ydCIpOworfQorCit1aW50NjRfdCBJbnB1dFN0cmVhbTo6dGVsbCgpIHsKKyAgVEhST1dfRVhDRVBUSU9OKFVuc3VwcG9ydEV4Y2VwdGlvbiwgInRlbGwgbm90IHN1cHBvcnQiKTsKK30KKworaW50MzJfdCBJbnB1dFN0cmVhbTo6cmVhZEZ1bGx5KHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaW50MzJfdCByZXQgPSAwOworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgIGludDMyX3QgcmQgPSByZWFkKGJ1ZmYsIGxlbmd0aCk7CisgICAgaWYgKHJkIDw9IDApIHsKKyAgICAgIHJldHVybiByZXQgPiAwID8gcmV0IDogLTE7CisgICAgfQorICAgIHJldCArPSByZDsKKyAgICBidWZmID0gKChjaGFyICopYnVmZikgKyByZDsKKyAgICBsZW5ndGggLT0gcmQ7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBJbnB1dFN0cmVhbTo6cmVhZEFsbFRvKE91dHB1dFN0cmVhbSAmIG91dCwgdWludDMyX3QgYnVmZmVySGludCkgeworICBjaGFyICogYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVySGludF07CisgIHdoaWxlICh0cnVlKSB7CisgICAgaW50MzJfdCByZCA9IHJlYWQoYnVmZmVyLCBidWZmZXJIaW50KTsKKyAgICBpZiAocmQgPD0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIG91dC53cml0ZShidWZmZXIsIHJkKTsKKyAgfQorICBkZWxldGUgYnVmZmVyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQ2NF90IE91dHB1dFN0cmVhbTo6dGVsbCgpIHsKKyAgVEhST1dfRVhDRVBUSU9OKFVuc3VwcG9ydEV4Y2VwdGlvbiwgInRlbGwgbm90IHN1cHBvcnQiKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ2hlY2tzdW1JbnB1dFN0cmVhbTo6Q2hlY2tzdW1JbnB1dFN0cmVhbShJbnB1dFN0cmVhbSAqIHN0cmVhbSwgQ2hlY2tzdW1UeXBlIHR5cGUpCisgICAgOiBGaWx0ZXJJbnB1dFN0cmVhbShzdHJlYW0pLCBfdHlwZSh0eXBlKSwgX2xpbWl0KC0xKSB7CisgIHJlc2V0Q2hlY2tzdW0oKTsKK30KKwordm9pZCBDaGVja3N1bUlucHV0U3RyZWFtOjpyZXNldENoZWNrc3VtKCkgeworICBfY2hlY2tzdW0gPSBDaGVja3N1bTo6aW5pdChfdHlwZSk7Cit9CisKK3VpbnQzMl90IENoZWNrc3VtSW5wdXRTdHJlYW06OmdldENoZWNrc3VtKCkgeworICByZXR1cm4gQ2hlY2tzdW06OmdldFZhbHVlKF90eXBlLCBfY2hlY2tzdW0pOworfQorCitpbnQzMl90IENoZWNrc3VtSW5wdXRTdHJlYW06OnJlYWQodm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICBpZiAoX2xpbWl0IDwgMCkgeworICAgIGludDMyX3QgcmV0ID0gX3N0cmVhbS0+cmVhZChidWZmLCBsZW5ndGgpOworICAgIGlmIChyZXQgPiAwKSB7CisgICAgICBDaGVja3N1bTo6dXBkYXRlKF90eXBlLCBfY2hlY2tzdW0sIGJ1ZmYsIHJldCk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0gZWxzZSBpZiAoX2xpbWl0ID09IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSB7CisgICAgaW50NjRfdCByZCA9IF9saW1pdCA8IGxlbmd0aCA/IF9saW1pdCA6IGxlbmd0aDsKKyAgICBpbnQzMl90IHJldCA9IF9zdHJlYW0tPnJlYWQoYnVmZiwgcmQpOworICAgIGlmIChyZXQgPiAwKSB7CisgICAgICBfbGltaXQgLT0gcmV0OworICAgICAgQ2hlY2tzdW06OnVwZGF0ZShfdHlwZSwgX2NoZWNrc3VtLCBidWZmLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0NoZWNrc3VtT3V0cHV0U3RyZWFtOjpDaGVja3N1bU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIENoZWNrc3VtVHlwZSB0eXBlKQorICAgIDogRmlsdGVyT3V0cHV0U3RyZWFtKHN0cmVhbSksIF90eXBlKHR5cGUpIHsKKyAgcmVzZXRDaGVja3N1bSgpOworfQorCit2b2lkIENoZWNrc3VtT3V0cHV0U3RyZWFtOjpyZXNldENoZWNrc3VtKCkgeworICBfY2hlY2tzdW0gPSBDaGVja3N1bTo6aW5pdChfdHlwZSk7Cit9CisKK3VpbnQzMl90IENoZWNrc3VtT3V0cHV0U3RyZWFtOjpnZXRDaGVja3N1bSgpIHsKKyAgcmV0dXJuIENoZWNrc3VtOjpnZXRWYWx1ZShfdHlwZSwgX2NoZWNrc3VtKTsKK30KKwordm9pZCBDaGVja3N1bU91dHB1dFN0cmVhbTo6d3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICBDaGVja3N1bTo6dXBkYXRlKF90eXBlLCBfY2hlY2tzdW0sIGJ1ZmYsIGxlbmd0aCk7CisgIF9zdHJlYW0tPndyaXRlKGJ1ZmYsIGxlbmd0aCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1N0cmVhbXMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1N0cmVhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTk3NjJiCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvU3RyZWFtcy5oCkBAIC0wLDAgKzEsMjIxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVFJFQU1TX0hfCisjZGVmaW5lIFNUUkVBTVNfSF8KKworI2luY2x1ZGUgInV0aWwvQ2hlY2tzdW0uaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBPdXRwdXRTdHJlYW07CisKK2NsYXNzIElucHV0U3RyZWFtIHsKK3B1YmxpYzoKKyAgSW5wdXRTdHJlYW0oKSB7CisgIH0KKworICB2aXJ0dWFsIH5JbnB1dFN0cmVhbSgpIHsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBzZWVrKHVpbnQ2NF90IHBvc2l0aW9uKTsKKworICB2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKTsKKworICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCkgeworICB9CisKKyAgdmlydHVhbCBpbnQzMl90IHJlYWRGdWxseSh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKTsKKworICB2b2lkIHJlYWRBbGxUbyhPdXRwdXRTdHJlYW0gJiBvdXQsIHVpbnQzMl90IGJ1ZmZlckhpbnQgPSAxMDI0ICogNCk7Cit9OworCitjbGFzcyBPdXRwdXRTdHJlYW0geworcHVibGljOgorICBPdXRwdXRTdHJlYW0oKSB7CisgIH0KKworICB2aXJ0dWFsIH5PdXRwdXRTdHJlYW0oKSB7CisgIH0KKworICB2aXJ0dWFsIHVpbnQ2NF90IHRlbGwoKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICB9CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCkgeworICB9CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCkgeworICB9Cit9OworCitjbGFzcyBGaWx0ZXJJbnB1dFN0cmVhbSA6IHB1YmxpYyBJbnB1dFN0cmVhbSB7Citwcm90ZWN0ZWQ6CisgIElucHV0U3RyZWFtICogX3N0cmVhbTsKK3B1YmxpYzoKKyAgRmlsdGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gKiBzdHJlYW0pCisgICAgICA6IF9zdHJlYW0oc3RyZWFtKSB7CisgIH0KKworICB2aXJ0dWFsIH5GaWx0ZXJJbnB1dFN0cmVhbSgpIHsKKyAgfQorCisgIHZvaWQgc2V0U3RyZWFtKElucHV0U3RyZWFtICogc3RyZWFtKSB7CisgICAgX3N0cmVhbSA9IHN0cmVhbTsKKyAgfQorCisgIElucHV0U3RyZWFtICogZ2V0U3RyZWFtKCkgeworICAgIHJldHVybiBfc3RyZWFtOworICB9CisKKyAgdmlydHVhbCB2b2lkIHNlZWsodWludDY0X3QgcG9zaXRpb24pIHsKKyAgICBfc3RyZWFtLT5zZWVrKHBvc2l0aW9uKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDY0X3QgdGVsbCgpIHsKKyAgICByZXR1cm4gX3N0cmVhbS0+dGVsbCgpOworICB9CisKKyAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIHJldHVybiBfc3RyZWFtLT5yZWFkKGJ1ZmYsIGxlbmd0aCk7CisgIH0KK307CisKK2NsYXNzIEZpbHRlck91dHB1dFN0cmVhbSA6IHB1YmxpYyBPdXRwdXRTdHJlYW0geworcHJvdGVjdGVkOgorICBPdXRwdXRTdHJlYW0gKiBfc3RyZWFtOworcHVibGljOgorICBGaWx0ZXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtICogc3RyZWFtKQorICAgICAgOiBfc3RyZWFtKHN0cmVhbSkgeworICB9CisKKyAgdmlydHVhbCB+RmlsdGVyT3V0cHV0U3RyZWFtKCkgeworICB9CisKKyAgdm9pZCBzZXRTdHJlYW0oT3V0cHV0U3RyZWFtICogc3RyZWFtKSB7CisgICAgX3N0cmVhbSA9IHN0cmVhbTsKKyAgfQorCisgIE91dHB1dFN0cmVhbSAqIGdldFN0cmVhbSgpIHsKKyAgICByZXR1cm4gX3N0cmVhbTsKKyAgfQorCisgIHZpcnR1YWwgdWludDY0X3QgdGVsbCgpIHsKKyAgICByZXR1cm4gX3N0cmVhbS0+dGVsbCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBfc3RyZWFtLT53cml0ZShidWZmLCBsZW5ndGgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCkgeworICAgIF9zdHJlYW0tPmZsdXNoKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7CisgICAgZmx1c2goKTsKKyAgfQorfTsKKworY2xhc3MgTGltaXRJbnB1dFN0cmVhbSA6IHB1YmxpYyBGaWx0ZXJJbnB1dFN0cmVhbSB7Citwcm90ZWN0ZWQ6CisgIGludDY0X3QgX2xpbWl0OworcHVibGljOgorICBMaW1pdElucHV0U3RyZWFtKElucHV0U3RyZWFtICogc3RyZWFtLCBpbnQ2NF90IGxpbWl0KQorICAgICAgOiBGaWx0ZXJJbnB1dFN0cmVhbShzdHJlYW0pLCBfbGltaXQobGltaXQpIHsKKyAgfQorCisgIHZpcnR1YWwgfkxpbWl0SW5wdXRTdHJlYW0oKSB7CisgIH0KKworICBpbnQ2NF90IGdldExpbWl0KCkgeworICAgIHJldHVybiBfbGltaXQ7CisgIH0KKworICB2b2lkIHNldExpbWl0KGludDY0X3QgbGltaXQpIHsKKyAgICBfbGltaXQgPSBsaW1pdDsKKyAgfQorCisgIHZpcnR1YWwgaW50MzJfdCByZWFkKHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBpZiAoX2xpbWl0IDwgMCkgeworICAgICAgcmV0dXJuIF9zdHJlYW0tPnJlYWQoYnVmZiwgbGVuZ3RoKTsKKyAgICB9IGVsc2UgaWYgKF9saW1pdCA9PSAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGludDY0X3QgcmQgPSBfbGltaXQgPCBsZW5ndGggPyBfbGltaXQgOiBsZW5ndGg7CisgICAgICBpbnQzMl90IHJldCA9IF9zdHJlYW0tPnJlYWQoYnVmZiwgcmQpOworICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgX2xpbWl0IC09IHJldDsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9Cit9OworCitjbGFzcyBDaGVja3N1bUlucHV0U3RyZWFtIDogcHVibGljIEZpbHRlcklucHV0U3RyZWFtIHsKK3Byb3RlY3RlZDoKKyAgQ2hlY2tzdW1UeXBlIF90eXBlOworICB1aW50MzJfdCBfY2hlY2tzdW07CisgIGludDY0X3QgX2xpbWl0OworcHVibGljOgorICBDaGVja3N1bUlucHV0U3RyZWFtKElucHV0U3RyZWFtICogc3RyZWFtLCBDaGVja3N1bVR5cGUgdHlwZSk7CisKKyAgdmlydHVhbCB+Q2hlY2tzdW1JbnB1dFN0cmVhbSgpIHsKKyAgfQorCisgIGludDY0X3QgZ2V0TGltaXQoKSB7CisgICAgcmV0dXJuIF9saW1pdDsKKyAgfQorCisgIHZvaWQgc2V0TGltaXQoaW50NjRfdCBsaW1pdCkgeworICAgIF9saW1pdCA9IGxpbWl0OworICB9CisKKyAgdm9pZCByZXNldENoZWNrc3VtKCk7CisKKyAgdWludDMyX3QgZ2V0Q2hlY2tzdW0oKTsKKworICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICogYnVmZiwgdWludDMyX3QgbGVuZ3RoKTsKK307CisKK2NsYXNzIENoZWNrc3VtT3V0cHV0U3RyZWFtIDogcHVibGljIEZpbHRlck91dHB1dFN0cmVhbSB7Citwcm90ZWN0ZWQ6CisgIENoZWNrc3VtVHlwZSBfdHlwZTsKKyAgdWludDMyX3QgX2NoZWNrc3VtOworcHVibGljOgorICBDaGVja3N1bU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIENoZWNrc3VtVHlwZSB0eXBlKTsKKworICB2aXJ0dWFsIH5DaGVja3N1bU91dHB1dFN0cmVhbSgpIHsKKyAgfQorCisgIHZvaWQgcmVzZXRDaGVja3N1bSgpOworCisgIHVpbnQzMl90IGdldENoZWNrc3VtKCk7CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpOworCit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBTVFJFQU1TX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9UYXNrQ291bnRlcnMuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9UYXNrQ291bnRlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwZGI0YwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL1Rhc2tDb3VudGVycy5jYwpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9UYXNrQ291bnRlcnMuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCisjZGVmaW5lIERFRklORV9DT1VOVEVSKG5hbWUpIGNvbnN0IGNoYXIgKiBUYXNrQ291bnRlcnM6Om5hbWUgPSAjbmFtZTsKKworY29uc3QgY2hhciAqIFRhc2tDb3VudGVyczo6VEFTS19DT1VOVEVSX0dST1VQID0gIm9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQ291bnRlciI7CisKK0RFRklORV9DT1VOVEVSKE1BUF9JTlBVVF9SRUNPUkRTKQorREVGSU5FX0NPVU5URVIoTUFQX09VVFBVVF9SRUNPUkRTKQorREVGSU5FX0NPVU5URVIoTUFQX09VVFBVVF9CWVRFUykKK0RFRklORV9DT1VOVEVSKE1BUF9PVVRQVVRfTUFURVJJQUxJWkVEX0JZVEVTKQorREVGSU5FX0NPVU5URVIoQ09NQklORV9JTlBVVF9SRUNPUkRTKQorREVGSU5FX0NPVU5URVIoQ09NQklORV9PVVRQVVRfUkVDT1JEUykKK0RFRklORV9DT1VOVEVSKFNQSUxMRURfUkVDT1JEUykKKworY29uc3QgY2hhciAqIFRhc2tDb3VudGVyczo6RklMRVNZU1RFTV9DT1VOVEVSX0dST1VQID0gIkZpbGVTeXN0ZW1Db3VudGVycyI7CisKK0RFRklORV9DT1VOVEVSKEZJTEVfQllURVNfUkVBRCkKK0RFRklORV9DT1VOVEVSKEZJTEVfQllURVNfV1JJVFRFTikKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvVGFza0NvdW50ZXJzLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9UYXNrQ291bnRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NlZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvVGFza0NvdW50ZXJzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEFTS0NPVU5URVJTX0hfCisjZGVmaW5lIFRBU0tDT1VOVEVSU19IXworCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2NsYXNzIFRhc2tDb3VudGVycyB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyICogVEFTS19DT1VOVEVSX0dST1VQOworCisgIHN0YXRpYyBjb25zdCBjaGFyICogTUFQX0lOUFVUX1JFQ09SRFM7CisgIHN0YXRpYyBjb25zdCBjaGFyICogTUFQX09VVFBVVF9SRUNPUkRTOworICBzdGF0aWMgY29uc3QgY2hhciAqIE1BUF9PVVRQVVRfQllURVM7CisgIHN0YXRpYyBjb25zdCBjaGFyICogTUFQX09VVFBVVF9NQVRFUklBTElaRURfQllURVM7CisgIHN0YXRpYyBjb25zdCBjaGFyICogQ09NQklORV9JTlBVVF9SRUNPUkRTOworICBzdGF0aWMgY29uc3QgY2hhciAqIENPTUJJTkVfT1VUUFVUX1JFQ09SRFM7CisgIHN0YXRpYyBjb25zdCBjaGFyICogU1BJTExFRF9SRUNPUkRTOworCisgIHN0YXRpYyBjb25zdCBjaGFyICogRklMRVNZU1RFTV9DT1VOVEVSX0dST1VQOworCisgIHN0YXRpYyBjb25zdCBjaGFyICogRklMRV9CWVRFU19SRUFEOworICBzdGF0aWMgY29uc3QgY2hhciAqIEZJTEVfQllURVNfV1JJVFRFTjsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIFRBU0tDT1VOVEVSU19IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvY29tbW9ucy5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvY29tbW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTAwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL2xpYi9jb21tb25zLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT01NT05TX0hfCisjZGVmaW5lIENPTU1PTlNfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJsaWIvcHJpbWl0aXZlcy5oIgorI2luY2x1ZGUgImxpYi9Mb2cuaCIKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisKKyNpbmNsdWRlICJsaWIvQ29uc3RhbnRzLmgiCisKKyNpbmNsdWRlICJsaWIvSXRlcmF0b3IuaCIKKworI2VuZGlmIC8qIENPTU1PTlNfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL2puaXV0aWxzLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvam5pdXRpbHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNDViZAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL2puaXV0aWxzLmNjCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJ1dGlsL1N5bmNVdGlscy5oIgorI2luY2x1ZGUgImxpYi9qbml1dGlscy5oIgorCit1c2luZyBuYW1lc3BhY2UgTmF0aXZlVGFzazsKKworSmF2YVZNICogSk5VX0dldEpWTSh2b2lkKSB7CisgIHN0YXRpYyBKYXZhVk0gKiBnSlZNID0gTlVMTDsKKyAgc3RhdGljIExvY2sgR0pWTUxvY2s7CisgIGlmIChnSlZNICE9IE5VTEwpIHsKKyAgICByZXR1cm4gZ0pWTTsKKyAgfQorICB7CisgICAgU2NvcGVMb2NrPExvY2s+IGF1dG9sb2NrKEdKVk1Mb2NrKTsKKyAgICBpZiAoZ0pWTSA9PSBOVUxMKSB7CisgICAgICBqaW50IHJ2ID0gMDsKKyAgICAgIGppbnQgbm9WTXMgPSAwOworICAgICAgcnYgPSBKTklfR2V0Q3JlYXRlZEphdmFWTXMoJmdKVk0sIDEsICZub1ZNcyk7CisgICAgICBpZiAocnYgIT0gMCkgeworICAgICAgICBUSFJPV19FWENFUFRJT04oTmF0aXZlVGFzazo6SGFkb29wRXhjZXB0aW9uLCAiSk5JX0dldENyZWF0ZWRKYXZhVk1zIGZhaWxlZCIpOworICAgICAgfQorICAgICAgaWYgKG5vVk1zID09IDApIHsKKyAgICAgICAgY2hhciAqaGFkb29wQ2xhc3NQYXRoID0gZ2V0ZW52KCJDTEFTU1BBVEgiKTsKKyAgICAgICAgaWYgKGhhZG9vcENsYXNzUGF0aCA9PSBOVUxMKSB7CisgICAgICAgICAgVEhST1dfRVhDRVBUSU9OKE5hdGl2ZVRhc2s6OkhhZG9vcEV4Y2VwdGlvbiwgIkVudmlyb25tZW50IHZhcmlhYmxlIENMQVNTUEFUSCBub3Qgc2V0ISIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKmhhZG9vcENsYXNzUGF0aFZNQXJnID0gIi1EamF2YS5jbGFzcy5wYXRoPSI7CisgICAgICAgIHNpemVfdCBvcHRIYWRvb3BDbGFzc1BhdGhMZW4gPSBzdHJsZW4oaGFkb29wQ2xhc3NQYXRoKSArIHN0cmxlbihoYWRvb3BDbGFzc1BhdGhWTUFyZykgKyAxOworICAgICAgICBjaGFyICpvcHRIYWRvb3BDbGFzc1BhdGggPSAoY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqIG9wdEhhZG9vcENsYXNzUGF0aExlbik7CisgICAgICAgIHNucHJpbnRmKG9wdEhhZG9vcENsYXNzUGF0aCwgb3B0SGFkb29wQ2xhc3NQYXRoTGVuLCAiJXMlcyIsIGhhZG9vcENsYXNzUGF0aFZNQXJnLAorICAgICAgICAgICAgaGFkb29wQ2xhc3NQYXRoKTsKKyAgICAgICAgaW50IG5vQXJncyA9IDE7CisgICAgICAgIEphdmFWTU9wdGlvbiBvcHRpb25zW25vQXJnc107CisgICAgICAgIG9wdGlvbnNbMF0ub3B0aW9uU3RyaW5nID0gb3B0SGFkb29wQ2xhc3NQYXRoOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgVk0KKyAgICAgICAgSmF2YVZNSW5pdEFyZ3Mgdm1fYXJnczsKKyAgICAgICAgdm1fYXJncy52ZXJzaW9uID0gSk5JX1ZFUlNJT05fMV82OworICAgICAgICB2bV9hcmdzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB2bV9hcmdzLm5PcHRpb25zID0gbm9BcmdzOworICAgICAgICB2bV9hcmdzLmlnbm9yZVVucmVjb2duaXplZCA9IDE7CisgICAgICAgIEpOSUVudiAqIGplbnY7CisgICAgICAgIHJ2ID0gSk5JX0NyZWF0ZUphdmFWTSgmZ0pWTSwgKHZvaWQqKikmamVudiwgJnZtX2FyZ3MpOworICAgICAgICBpZiAocnYgIT0gMCkgeworICAgICAgICAgIFRIUk9XX0VYQ0VQVElPTihOYXRpdmVUYXNrOjpIYWRvb3BFeGNlcHRpb24sICJKTklfQ3JlYXRlSmF2YVZNIGZhaWxlZCIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZyZWUob3B0SGFkb29wQ2xhc3NQYXRoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGdKVk07Cit9CisKK0pOSUVudiogSk5VX0dldEpOSUVudih2b2lkKSB7CisgIEpOSUVudiAqIGVudjsKKyAgamludCBydiA9IEpOVV9HZXRKVk0oKS0+QXR0YWNoQ3VycmVudFRocmVhZCgodm9pZCAqKikmZW52LCBOVUxMKTsKKyAgaWYgKHJ2ICE9IDApIHsKKyAgICBUSFJPV19FWENFUFRJT04oTmF0aXZlVGFzazo6SGFkb29wRXhjZXB0aW9uLCAiQ2FsbCB0byBBdHRhY2hDdXJyZW50VGhyZWFkIGZhaWxlZCIpOworICB9CisgIHJldHVybiBlbnY7Cit9CisKK3ZvaWQgSk5VX0F0dGFjaEN1cnJlbnRUaHJlYWQoKSB7CisgIEpOVV9HZXRKTklFbnYoKTsKK30KKwordm9pZCBKTlVfRGV0YWNoQ3VycmVudFRocmVhZCgpIHsKKyAgamludCBydiA9IEpOVV9HZXRKVk0oKS0+RGV0YWNoQ3VycmVudFRocmVhZCgpOworICBpZiAocnYgIT0gMCkgeworICAgIFRIUk9XX0VYQ0VQVElPTihOYXRpdmVUYXNrOjpIYWRvb3BFeGNlcHRpb24sICJDYWxsIHRvIERldGFjaEN1cnJlbnRUaHJlYWQgZmFpbGVkIik7CisgIH0KK30KKwordm9pZCBKTlVfVGhyb3dCeU5hbWUoSk5JRW52ICpqZW52LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKKyAgamNsYXNzIGNscyA9IGplbnYtPkZpbmRDbGFzcyhuYW1lKTsKKyAgaWYgKGNscyAhPSBOVUxMKSB7CisgICAgamVudi0+VGhyb3dOZXcoY2xzLCBtc2cpOworICB9CisgIGplbnYtPkRlbGV0ZUxvY2FsUmVmKGNscyk7Cit9CisKK3N0ZDo6c3RyaW5nIEpOVV9CeXRlQXJyYXlUb1N0cmluZyhKTklFbnYgKiBqZW52LCBqYnl0ZUFycmF5IHNyYykgeworICBpZiAoTlVMTCAhPSBzcmMpIHsKKyAgICBqc2l6ZSBsZW4gPSBqZW52LT5HZXRBcnJheUxlbmd0aChzcmMpOworICAgIHN0ZDo6c3RyaW5nIHJldChsZW4sICdcMCcpOworICAgIGplbnYtPkdldEJ5dGVBcnJheVJlZ2lvbihzcmMsIDAsIGxlbiwgKGpieXRlKilyZXQuZGF0YSgpKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvam5pdXRpbHMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL2puaXV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjNGZkYQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL2puaXV0aWxzLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKTklVVElMU19IXworI2RlZmluZSBKTklVVElMU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGpuaS5oPgorCisvKioKKyAqIEdldCBjdXJyZW50IEphdmFWTSwgaWYgbm9uZSB0aGVuIHRyeSB0byBjcmVhdGUgb25lLgorICovCitKYXZhVk0gKiBKTlVfR2V0SlZNKHZvaWQpOworCisvKioKKyAqIEdldCBKTklFbnYgZm9yIGN1cnJlbnQgdGhyZWFkLgorICovCitKTklFbnYqIEpOVV9HZXRKTklFbnYodm9pZCk7CisKKy8qKgorICogQXR0YWNoIGN1cnJlbnRUaHJlYWQsIHNhbWUgZWZmZWN0IGFzIEpOVV9HZXRKTklFbnYuCisgKi8KK3ZvaWQgSk5VX0F0dGFjaEN1cnJlbnRUaHJlYWQoKTsKKworLyoqCisgKiBEZXRhY2ggY3VycmVudCB0aHJlYWQsIGNhbGwgaXQgaWYgY3VycmVudCB0aHJlYWQKKyAqIGlzIGNyZWF0ZWQgaW4gbmF0aXZlIHNpZGUgYW5kIGhhdmUgY2FsbGVkCisgKiBKTlVfQXR0YWNoQ3VycmVudFRocmVhZCBiZWZvcmUKKyAqLwordm9pZCBKTlVfRGV0YWNoQ3VycmVudFRocmVhZCgpOworCisvKioKKyAqIFRocm93IGEgamF2YSBleGNlcHRpb24uCisgKi8KK3ZvaWQgSk5VX1Rocm93QnlOYW1lKEpOSUVudiAqamVudiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbXNnKTsKKworLyoqCisgKiBDb252ZXJ0IGEgamF2YSBieXRlIGFycmF5IHRvIGMrKyBzdGQ6OnN0cmluZworICovCitzdGQ6OnN0cmluZyBKTlVfQnl0ZUFycmF5VG9TdHJpbmcoSk5JRW52ICogamVudiwgamJ5dGVBcnJheSBzcmMpOworCisjZW5kaWYgLyogSk5JVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL3ByaW1pdGl2ZXMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvbGliL3ByaW1pdGl2ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzBjMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy9saWIvcHJpbWl0aXZlcy5oCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEhpZ2ggcGVyZm9ybWFuY2UgcHJpbWl0aXZlIGZ1bmN0aW9ucworICoKKyAqKi8KKworI2lmbmRlZiBQUklNSVRJVkVTX0hfCisjZGVmaW5lIFBSSU1JVElWRVNfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIGxpa2VseSh4KSAgICAgICBfX2J1aWx0aW5fZXhwZWN0KCh4KSwxKQorI2RlZmluZSB1bmxpa2VseSh4KSAgICAgX19idWlsdGluX2V4cGVjdCgoeCksMCkKKyNlbHNlCisjZGVmaW5lIGxpa2VseSh4KSAgICAgICAoeCkKKyNkZWZpbmUgdW5saWtlbHkoeCkgICAgICh4KQorI2VuZGlmCisKKy8vI2RlZmluZSBTSU1QTEVfTUVNQ1BZCisKKyNpZiAhZGVmaW5lZChTSU1QTEVfTUVNQ1BZKQorI2RlZmluZSBzaW1wbGVfbWVtY3B5IG1lbWNweQorI2RlZmluZSBzaW1wbGVfbWVtY3B5MiBtZW1jcHkKKyNlbHNlCisKKy8qKgorICogVGhpcyBtZW1jcHkgYXNzdW1lcyBzcmMgJiBkZXN0IGFyZSBub3Qgb3ZlcmxhcHBlZCwKKyAqIGFuZCBsZW4gYXJlIG5vcm1hbGx5IHZlcnkgc21hbGwoPDY0KQorICogVGhpcyBmdW5jdGlvbiBpcyBwcmltYXJpbHkgb3B0aW1pemVkIGZvciB4ODYtNjQgcHJvY2Vzc29ycywKKyAqIG9uIHdoaWNoIHVuYWxpZ25lZCA2NC1iaXQgbG9hZHMgYW5kIHN0b3JlcyBhcmUgY2hlYXAKKyAqCisgKiBAcGFyYW0gZGVzdDogZGVzdCBidWZmZXIKKyAqIEBwYXJhbSBzcmM6ICBzcmMgYnVmZmVyCisgKiBAcGFyYW0gbGVuOiBzcmMgYnVmZmVyIHNpemUsIG11c3QgYmUgPjAKKyAqLworaW5saW5lIHZvaWQgc2ltcGxlX21lbWNweSh2b2lkICogZGVzdCwgY29uc3Qgdm9pZCAqIHNyYywgc2l6ZV90IGxlbikgeworICBjb25zdCB1aW50OF90ICogc3JjOCA9IChjb25zdCB1aW50OF90KilzcmM7CisgIHVpbnQ4X3QgKiBkZXN0OCA9ICh1aW50OF90KilkZXN0OworICBzd2l0Y2ggKGxlbikgeworICAgIGNhc2UgMDoKKyAgICByZXR1cm47CisgICAgY2FzZSAxOgorICAgIGRlc3Q4WzBdPXNyYzhbMF07CisgICAgcmV0dXJuOworICAgIGNhc2UgMjoKKyAgICAqKHVpbnQxNl90KilkZXN0OD0qKGNvbnN0IHVpbnQxNl90KilzcmM4OworICAgIHJldHVybjsKKyAgICBjYXNlIDM6CisgICAgKih1aW50MTZfdCopZGVzdDggPSAqKGNvbnN0IHVpbnQxNl90KilzcmM4OworICAgIGRlc3Q4WzJdPXNyYzhbMl07CisgICAgcmV0dXJuOworICAgIGNhc2UgNDoKKyAgICAqKHVpbnQzMl90KilkZXN0OCA9ICooY29uc3QgdWludDMyX3QqKXNyYzg7CisgICAgcmV0dXJuOworICB9CisgIGlmIChsZW48OCkgeworICAgICoodWludDMyX3QqKWRlc3Q4ID0gKihjb25zdCB1aW50MzJfdCopc3JjODsKKyAgICAqKHVpbnQzMl90KikoZGVzdDgrbGVuLTQpID0gKihjb25zdCB1aW50MzJfdCopKHNyYzgrbGVuLTQpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobGVuPDEyOCkgeworICAgIGludDY0X3QgY3VyID0gKGludDY0X3QpbGVuIC0gODsKKyAgICB3aGlsZSAoY3VyPjApIHsKKyAgICAgICoodWludDY0X3QqKShkZXN0OCtjdXIpID0gKihjb25zdCB1aW50NjRfdCopKHNyYzgrY3VyKTsKKyAgICAgIGN1ciAtPSA4OworICAgIH0KKyAgICAqKHVpbnQ2NF90KikoZGVzdDgpID0gKihjb25zdCB1aW50NjRfdCopKHNyYzgpOworICAgIHJldHVybjsKKyAgfQorICA6Om1lbWNweShkZXN0LCBzcmMsIGxlbik7Cit9CisKKyNlbmRpZgorCisvKioKKyAqIGxpdHRsZS1lbmRpYW4gdG8gYmlnLWVuZGlhbiBvciB2aWNlIHZlcnNhCisgKi8KK2lubGluZSB1aW50MzJfdCBic3dhcCh1aW50MzJfdCB2YWwpIHsKKyAgX19hc21fXygiYnN3YXAgJTAiIDogIj1yIiAodmFsKSA6ICIwIiAodmFsKSk7CisgIHJldHVybiB2YWw7Cit9CisKK2lubGluZSB1aW50NjRfdCBic3dhcDY0KHVpbnQ2NF90IHZhbCkgeworI2lmZGVmIF9fWDY0CisgIF9fYXNtX18oImJzd2FwcSAlMCIgOiAiPXIiICh2YWwpIDogIjAiICh2YWwpKTsKKyNlbHNlCisKKyAgdWludDY0X3QgbG93ZXIgPSB2YWwgJiAweGZmZmZmZmZmVTsKKyAgdWludDMyX3QgaGlnaGVyID0gKHZhbCA+PiAzMikgJiAweGZmZmZmZmZmVTsKKworICBsb3dlciA9IGJzd2FwKGxvd2VyKTsKKyAgaGlnaGVyID0gYnN3YXAoaGlnaGVyKTsKKworICByZXR1cm4gKGxvd2VyIDw8IDMyKSArIGhpZ2hlcjsKKworI2VuZGlmCisgIHJldHVybiB2YWw7Cit9CisKKy8qKgorICogRmFzdCBtZW1jbXAKKyAqLworaW5saW5lIGludDY0X3QgZm1lbWNtcChjb25zdCBjaGFyICogc3JjLCBjb25zdCBjaGFyICogZGVzdCwgdWludDMyX3QgbGVuKSB7CisKKyNpZmRlZiBCVUlMRElOX01FTUNNUAorICByZXR1cm4gbWVtY21wKHNyYywgZGVzdCwgbGVuKTsKKyNlbHNlCisKKyAgY29uc3QgdWludDhfdCAqIHNyYzggPSAoY29uc3QgdWludDhfdCopc3JjOworICBjb25zdCB1aW50OF90ICogZGVzdDggPSAoY29uc3QgdWludDhfdCopZGVzdDsKKyAgc3dpdGNoIChsZW4pIHsKKyAgY2FzZSAwOgorICAgIHJldHVybiAwOworICBjYXNlIDE6CisgICAgcmV0dXJuIChpbnQ2NF90KXNyYzhbMF0gLSAoaW50NjRfdClkZXN0OFswXTsKKyAgY2FzZSAyOiB7CisgICAgaW50NjRfdCByZXQgPSAoKGludDY0X3Qpc3JjOFswXSAtIChpbnQ2NF90KWRlc3Q4WzBdKTsKKyAgICBpZiAocmV0KQorICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gKChpbnQ2NF90KXNyYzhbMV0gLSAoaW50NjRfdClkZXN0OFsxXSk7CisgIH0KKyAgY2FzZSAzOiB7CisgICAgaW50NjRfdCByZXQgPSAoKGludDY0X3Qpc3JjOFswXSAtIChpbnQ2NF90KWRlc3Q4WzBdKTsKKyAgICBpZiAocmV0KQorICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSAoKGludDY0X3Qpc3JjOFsxXSAtIChpbnQ2NF90KWRlc3Q4WzFdKTsKKyAgICBpZiAocmV0KQorICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gKChpbnQ2NF90KXNyYzhbMl0gLSAoaW50NjRfdClkZXN0OFsyXSk7CisgIH0KKyAgY2FzZSA0OiB7CisgICAgcmV0dXJuIChpbnQ2NF90KWJzd2FwKCoodWludDMyX3QqKXNyYykgLSAoaW50NjRfdClic3dhcCgqKHVpbnQzMl90KilkZXN0KTsKKyAgfQorICB9CisgIGlmIChsZW4gPCA4KSB7CisgICAgaW50NjRfdCByZXQgPSAoKGludDY0X3QpYnN3YXAoKih1aW50MzJfdCopc3JjKSAtIChpbnQ2NF90KWJzd2FwKCoodWludDMyX3QqKWRlc3QpKTsKKyAgICBpZiAocmV0KSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gKChpbnQ2NF90KWJzd2FwKCoodWludDMyX3QqKShzcmMgKyBsZW4gLSA0KSkKKyAgICAgICAgLSAoaW50NjRfdClic3dhcCgqKHVpbnQzMl90KikoZGVzdCArIGxlbiAtIDQpKSk7CisgIH0KKyAgdWludDMyX3QgY3VyID0gMDsKKyAgdWludDMyX3QgZW5kID0gbGVuICYgKDB4ZmZmZmZmZmZVIDw8IDMpOworICB3aGlsZSAoY3VyIDwgZW5kKSB7CisgICAgdWludDY0X3QgbCA9ICoodWludDY0X3QqKShzcmM4ICsgY3VyKTsKKyAgICB1aW50NjRfdCByID0gKih1aW50NjRfdCopKGRlc3Q4ICsgY3VyKTsKKyAgICBpZiAobCAhPSByKSB7CisgICAgICBsID0gYnN3YXA2NChsKTsKKyAgICAgIHIgPSBic3dhcDY0KHIpOworICAgICAgcmV0dXJuIGwgPiByID8gMSA6IC0xOworICAgIH0KKyAgICBjdXIgKz0gODsKKyAgfQorICB1aW50NjRfdCBsID0gKih1aW50NjRfdCopKHNyYzggKyBsZW4gLSA4KTsKKyAgdWludDY0X3QgciA9ICoodWludDY0X3QqKShkZXN0OCArIGxlbiAtIDgpOworICBpZiAobCAhPSByKSB7CisgICAgbCA9IGJzd2FwNjQobCk7CisgICAgciA9IGJzd2FwNjQocik7CisgICAgcmV0dXJuIGwgPiByID8gMSA6IC0xOworICB9CisgIHJldHVybiAwOworI2VuZGlmCit9CisKK2lubGluZSBpbnQ2NF90IGZtZW1jbXAoY29uc3QgY2hhciAqIHNyYywgY29uc3QgY2hhciAqIGRlc3QsIHVpbnQzMl90IHNyY0xlbiwgdWludDMyX3QgZGVzdExlbikgeworICB1aW50MzJfdCBtaW5sZW4gPSBzcmNMZW4gPCBkZXN0TGVuID8gc3JjTGVuIDogZGVzdExlbjsKKyAgaW50NjRfdCByZXQgPSBmbWVtY21wKHNyYywgZGVzdCwgbWlubGVuKTsKKyAgaWYgKHJldCkgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgcmV0dXJuIChpbnQ2NF90KXNyY0xlbiAtIChpbnQ2NF90KWRlc3RMZW47Cit9CisKKy8qKgorICogRmFzdCBtZW1vcnkgZXF1YWwKKyAqLworaW5saW5lIGJvb2wgZm1lbWVxKGNvbnN0IGNoYXIgKiBzcmMsIGNvbnN0IGNoYXIgKiBkZXN0LCB1aW50MzJfdCBsZW4pIHsKKyNpZmRlZiBCVUlMRElOX01FTUNNUAorICByZXR1cm4gMCA9PSBtZW1jbXAoc3JjLCBkZXN0LCBsZW4pOworI2Vsc2UKKworICBjb25zdCB1aW50OF90ICogc3JjOCA9IChjb25zdCB1aW50OF90KilzcmM7CisgIGNvbnN0IHVpbnQ4X3QgKiBkZXN0OCA9IChjb25zdCB1aW50OF90KilkZXN0OworICBzd2l0Y2ggKGxlbikgeworICBjYXNlIDA6CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgMToKKyAgICByZXR1cm4gc3JjOFswXSA9PSBkZXN0OFswXTsKKyAgY2FzZSAyOgorICAgIHJldHVybiAqKHVpbnQxNl90KilzcmM4ID09ICoodWludDE2X3QqKWRlc3Q4OworICBjYXNlIDM6CisgICAgcmV0dXJuICgqKHVpbnQxNl90KilzcmM4ID09ICoodWludDE2X3QqKWRlc3Q4KSAmJiAoc3JjOFsyXSA9PSBkZXN0OFsyXSk7CisgIGNhc2UgNDoKKyAgICByZXR1cm4gKih1aW50MzJfdCopc3JjOCA9PSAqKHVpbnQzMl90KilkZXN0ODsKKyAgfQorICBpZiAobGVuIDwgOCkgeworICAgIHJldHVybiAoKih1aW50MzJfdCopc3JjOCA9PSAqKHVpbnQzMl90KilkZXN0OCkKKyAgICAgICAgJiYgKCoodWludDMyX3QqKShzcmM4ICsgbGVuIC0gNCkgPT0gKih1aW50MzJfdCopKGRlc3Q4ICsgbGVuIC0gNCkpOworICB9CisgIHVpbnQzMl90IGN1ciA9IDA7CisgIHVpbnQzMl90IGVuZCA9IGxlbiAmICgweGZmZmZmZmZmIDw8IDMpOworICB3aGlsZSAoY3VyIDwgZW5kKSB7CisgICAgdWludDY0X3QgbCA9ICoodWludDY0X3QqKShzcmM4ICsgY3VyKTsKKyAgICB1aW50NjRfdCByID0gKih1aW50NjRfdCopKGRlc3Q4ICsgY3VyKTsKKyAgICBpZiAobCAhPSByKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGN1ciArPSA4OworICB9CisgIHVpbnQ2NF90IGwgPSAqKHVpbnQ2NF90Kikoc3JjOCArIGxlbiAtIDgpOworICB1aW50NjRfdCByID0gKih1aW50NjRfdCopKGRlc3Q4ICsgbGVuIC0gOCk7CisgIGlmIChsICE9IHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgZm1lbWVxKGNvbnN0IGNoYXIgKiBzcmMsIHVpbnQzMl90IHNyY0xlbiwgY29uc3QgY2hhciAqIGRlc3QsIHVpbnQzMl90IGRlc3RMZW4pIHsKKyAgaWYgKHNyY0xlbiAhPSBkZXN0TGVuKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBmbWVtZXEoc3JjLCBkZXN0LCBzdGQ6Om1pbihzcmNMZW4sIGRlc3RMZW4pKTsKK30KKworLyoqCisgKiBGYXN0IG1lbW9yeSBlcXVhbCwgcmV2ZXJzZSBvcmRlcgorICovCitpbmxpbmUgYm9vbCBmcm1lbWVxKGNvbnN0IGNoYXIgKiBzcmMsIGNvbnN0IGNoYXIgKiBkZXN0LCB1aW50MzJfdCBsZW4pIHsKKyAgY29uc3QgdWludDhfdCAqIHNyYzggPSAoY29uc3QgdWludDhfdCopc3JjOworICBjb25zdCB1aW50OF90ICogZGVzdDggPSAoY29uc3QgdWludDhfdCopZGVzdDsKKyAgc3dpdGNoIChsZW4pIHsKKyAgY2FzZSAwOgorICAgIHJldHVybiB0cnVlOworICBjYXNlIDE6CisgICAgcmV0dXJuIHNyYzhbMF0gPT0gZGVzdDhbMF07CisgIGNhc2UgMjoKKyAgICByZXR1cm4gKih1aW50MTZfdCopc3JjOCA9PSAqKHVpbnQxNl90KilkZXN0ODsKKyAgY2FzZSAzOgorICAgIHJldHVybiAoc3JjOFsyXSA9PSBkZXN0OFsyXSkgJiYgKCoodWludDE2X3QqKXNyYzggPT0gKih1aW50MTZfdCopZGVzdDgpOworICBjYXNlIDQ6CisgICAgcmV0dXJuICoodWludDMyX3QqKXNyYzggPT0gKih1aW50MzJfdCopZGVzdDg7CisgIH0KKyAgaWYgKGxlbiA8IDgpIHsKKyAgICByZXR1cm4gKCoodWludDMyX3QqKShzcmM4ICsgbGVuIC0gNCkgPT0gKih1aW50MzJfdCopKGRlc3Q4ICsgbGVuIC0gNCkpCisgICAgICAgICYmICgqKHVpbnQzMl90KilzcmM4ID09ICoodWludDMyX3QqKWRlc3Q4KTsKKyAgfQorICBpbnQzMl90IGN1ciA9IChpbnQzMl90KWxlbiAtIDg7CisgIHdoaWxlIChjdXIgPiAwKSB7CisgICAgaWYgKCoodWludDY0X3QqKShzcmM4ICsgY3VyKSAhPSAqKHVpbnQ2NF90KikoZGVzdDggKyBjdXIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGN1ciAtPSA4OworICB9CisgIHJldHVybiAqKHVpbnQ2NF90Kikoc3JjOCkgPT0gKih1aW50NjRfdCopKGRlc3Q4KTsKK30KKworaW5saW5lIGJvb2wgZnJtZW1lcShjb25zdCBjaGFyICogc3JjLCBjb25zdCBjaGFyICogZGVzdCwgdWludDMyX3Qgc3JjTGVuLCB1aW50MzJfdCBkZXN0TGVuKSB7CisgIGlmIChzcmNMZW4gIT0gZGVzdExlbikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZnJtZW1lcShzcmMsIGRlc3QsIHN0ZDo6bWluKHNyY0xlbiwgZGVzdExlbikpOworfQorCisjZW5kaWYgLyogUFJJTUlUSVZFU19IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL0NoZWNrc3VtLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL0NoZWNrc3VtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWUwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvQ2hlY2tzdW0uY2MKQEAgLTAsMCArMSw3NDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAidXRpbC9DaGVja3N1bS5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2NvbnN0IHVpbnQzMl90IENSQzMyX1Q4XzBbXSA9IHsweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweEVFMEU2MTJDLCAweDk5MDk1MUJBLCAweDA3NkRDNDE5LAorICAgIDB4NzA2QUY0OEYsIDB4RTk2M0E1MzUsIDB4OUU2NDk1QTMsIDB4MEVEQjg4MzIsIDB4NzlEQ0I4QTQsIDB4RTBENUU5MUUsIDB4OTdEMkQ5ODgsIDB4MDlCNjRDMkIsCisgICAgMHg3RUIxN0NCRCwgMHhFN0I4MkQwNywgMHg5MEJGMUQ5MSwgMHgxREI3MTA2NCwgMHg2QUIwMjBGMiwgMHhGM0I5NzE0OCwgMHg4NEJFNDFERSwgMHgxQURBRDQ3RCwKKyAgICAweDZERERFNEVCLCAweEY0RDRCNTUxLCAweDgzRDM4NUM3LCAweDEzNkM5ODU2LCAweDY0NkJBOEMwLCAweEZENjJGOTdBLCAweDhBNjVDOUVDLCAweDE0MDE1QzRGLAorICAgIDB4NjMwNjZDRDksIDB4RkEwRjNENjMsIDB4OEQwODBERjUsIDB4M0I2RTIwQzgsIDB4NEM2OTEwNUUsIDB4RDU2MDQxRTQsIDB4QTI2NzcxNzIsIDB4M0MwM0U0RDEsCisgICAgMHg0QjA0RDQ0NywgMHhEMjBEODVGRCwgMHhBNTBBQjU2QiwgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywgMHhEQkJCQzlENiwgMHhBQ0JDRjk0MCwgMHgzMkQ4NkNFMywKKyAgICAweDQ1REY1Qzc1LCAweERDRDYwRENGLCAweEFCRDEzRDU5LCAweDI2RDkzMEFDLCAweDUxREUwMDNBLCAweEM4RDc1MTgwLCAweEJGRDA2MTE2LCAweDIxQjRGNEI1LAorICAgIDB4NTZCM0M0MjMsIDB4Q0ZCQTk1OTksIDB4QjhCREE1MEYsIDB4MjgwMkI4OUUsIDB4NUYwNTg4MDgsIDB4QzYwQ0Q5QjIsIDB4QjEwQkU5MjQsIDB4MkY2RjdDODcsCisgICAgMHg1ODY4NEMxMSwgMHhDMTYxMURBQiwgMHhCNjY2MkQzRCwgMHg3NkRDNDE5MCwgMHgwMURCNzEwNiwgMHg5OEQyMjBCQywgMHhFRkQ1MTAyQSwgMHg3MUIxODU4OSwKKyAgICAweDA2QjZCNTFGLCAweDlGQkZFNEE1LCAweEU4QjhENDMzLCAweDc4MDdDOUEyLCAweDBGMDBGOTM0LCAweDk2MDlBODhFLCAweEUxMEU5ODE4LCAweDdGNkEwREJCLAorICAgIDB4MDg2RDNEMkQsIDB4OTE2NDZDOTcsIDB4RTY2MzVDMDEsIDB4NkI2QjUxRjQsIDB4MUM2QzYxNjIsIDB4ODU2NTMwRDgsIDB4RjI2MjAwNEUsIDB4NkMwNjk1RUQsCisgICAgMHgxQjAxQTU3QiwgMHg4MjA4RjRDMSwgMHhGNTBGQzQ1NywgMHg2NUIwRDlDNiwgMHgxMkI3RTk1MCwgMHg4QkJFQjhFQSwgMHhGQ0I5ODg3QywgMHg2MkREMURERiwKKyAgICAweDE1REEyRDQ5LCAweDhDRDM3Q0YzLCAweEZCRDQ0QzY1LCAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LCAweEQ0QkIzMEUyLCAweDRBREZBNTQxLAorICAgIDB4M0REODk1RDcsIDB4QTREMUM0NkQsIDB4RDNENkY0RkIsIDB4NDM2OUU5NkEsIDB4MzQ2RUQ5RkMsIDB4QUQ2Nzg4NDYsIDB4REE2MEI4RDAsIDB4NDQwNDJENzMsCisgICAgMHgzMzAzMURFNSwgMHhBQTBBNEM1RiwgMHhERDBEN0NDOSwgMHg1MDA1NzEzQywgMHgyNzAyNDFBQSwgMHhCRTBCMTAxMCwgMHhDOTBDMjA4NiwgMHg1NzY4QjUyNSwKKyAgICAweDIwNkY4NUIzLCAweEI5NjZENDA5LCAweENFNjFFNDlGLCAweDVFREVGOTBFLCAweDI5RDlDOTk4LCAweEIwRDA5ODIyLCAweEM3RDdBOEI0LCAweDU5QjMzRDE3LAorICAgIDB4MkVCNDBEODEsIDB4QjdCRDVDM0IsIDB4QzBCQTZDQUQsIDB4RURCODgzMjAsIDB4OUFCRkIzQjYsIDB4MDNCNkUyMEMsIDB4NzRCMUQyOUEsIDB4RUFENTQ3MzksCisgICAgMHg5REQyNzdBRiwgMHgwNERCMjYxNSwgMHg3M0RDMTY4MywgMHhFMzYzMEIxMiwgMHg5NDY0M0I4NCwgMHgwRDZENkEzRSwgMHg3QTZBNUFBOCwgMHhFNDBFQ0YwQiwKKyAgICAweDkzMDlGRjlELCAweDBBMDBBRTI3LCAweDdEMDc5RUIxLCAweEYwMEY5MzQ0LCAweDg3MDhBM0QyLCAweDFFMDFGMjY4LCAweDY5MDZDMkZFLCAweEY3NjI1NzVELAorICAgIDB4ODA2NTY3Q0IsIDB4MTk2QzM2NzEsIDB4NkU2QjA2RTcsIDB4RkVENDFCNzYsIDB4ODlEMzJCRTAsIDB4MTBEQTdBNUEsIDB4NjdERDRBQ0MsIDB4RjlCOURGNkYsCisgICAgMHg4RUJFRUZGOSwgMHgxN0I3QkU0MywgMHg2MEIwOEVENSwgMHhENkQ2QTNFOCwgMHhBMUQxOTM3RSwgMHgzOEQ4QzJDNCwgMHg0RkRGRjI1MiwgMHhEMUJCNjdGMSwKKyAgICAweEE2QkM1NzY3LCAweDNGQjUwNkRELCAweDQ4QjIzNjRCLCAweEQ4MEQyQkRBLCAweEFGMEExQjRDLCAweDM2MDM0QUY2LCAweDQxMDQ3QTYwLCAweERGNjBFRkMzLAorICAgIDB4QTg2N0RGNTUsIDB4MzE2RThFRUYsIDB4NDY2OUJFNzksIDB4Q0I2MUIzOEMsIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsIDB4NTI2OEUyMzYsIDB4Q0MwQzc3OTUsCisgICAgMHhCQjBCNDcwMywgMHgyMjAyMTZCOSwgMHg1NTA1MjYyRiwgMHhDNUJBM0JCRSwgMHhCMkJEMEIyOCwgMHgyQkI0NUE5MiwgMHg1Q0IzNkEwNCwgMHhDMkQ3RkZBNywKKyAgICAweEI1RDBDRjMxLCAweDJDRDk5RThCLCAweDVCREVBRTFELCAweDlCNjRDMkIwLCAweEVDNjNGMjI2LCAweDc1NkFBMzlDLCAweDAyNkQ5MzBBLCAweDlDMDkwNkE5LAorICAgIDB4RUIwRTM2M0YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsIDB4OTVCRjRBODIsIDB4RTJCODdBMTQsIDB4N0JCMTJCQUUsIDB4MENCNjFCMzgsIDB4OTJEMjhFOUIsCisgICAgMHhFNUQ1QkUwRCwgMHg3Q0RDRUZCNywgMHgwQkRCREYyMSwgMHg4NkQzRDJENCwgMHhGMUQ0RTI0MiwgMHg2OEREQjNGOCwgMHgxRkRBODM2RSwgMHg4MUJFMTZDRCwKKyAgICAweEY2QjkyNjVCLCAweDZGQjA3N0UxLCAweDE4Qjc0Nzc3LCAweDg4MDg1QUU2LCAweEZGMEY2QTcwLCAweDY2MDYzQkNBLCAweDExMDEwQjVDLCAweDhGNjU5RUZGLAorICAgIDB4Rjg2MkFFNjksIDB4NjE2QkZGRDMsIDB4MTY2Q0NGNDUsIDB4QTAwQUUyNzgsIDB4RDcwREQyRUUsIDB4NEUwNDgzNTQsIDB4MzkwM0IzQzIsIDB4QTc2NzI2NjEsCisgICAgMHhEMDYwMTZGNywgMHg0OTY5NDc0RCwgMHgzRTZFNzdEQiwgMHhBRUQxNkE0QSwgMHhEOUQ2NUFEQywgMHg0MERGMEI2NiwgMHgzN0Q4M0JGMCwgMHhBOUJDQUU1MywKKyAgICAweERFQkI5RUM1LCAweDQ3QjJDRjdGLCAweDMwQjVGRkU5LCAweEJEQkRGMjFDLCAweENBQkFDMjhBLCAweDUzQjM5MzMwLCAweDI0QjRBM0E2LCAweEJBRDAzNjA1LAorICAgIDB4Q0RENzA2OTMsIDB4NTRERTU3MjksIDB4MjNEOTY3QkYsIDB4QjM2NjdBMkUsIDB4QzQ2MTRBQjgsIDB4NUQ2ODFCMDIsIDB4MkE2RjJCOTQsIDB4QjQwQkJFMzcsCisgICAgMHhDMzBDOEVBMSwgMHg1QTA1REYxQiwgMHgyRDAyRUY4RH07Citjb25zdCB1aW50MzJfdCBDUkMzMl9UOF8xW10gPSB7MHgwMDAwMDAwMCwgMHgxOTFCMzE0MSwgMHgzMjM2NjI4MiwgMHgyQjJENTNDMywgMHg2NDZDQzUwNCwKKyAgICAweDdENzdGNDQ1LCAweDU2NUFBNzg2LCAweDRGNDE5NkM3LCAweEM4RDk4QTA4LCAweEQxQzJCQjQ5LCAweEZBRUZFODhBLCAweEUzRjREOUNCLCAweEFDQjU0RjBDLAorICAgIDB4QjVBRTdFNEQsIDB4OUU4MzJEOEUsIDB4ODc5ODFDQ0YsIDB4NEFDMjEyNTEsIDB4NTNEOTIzMTAsIDB4NzhGNDcwRDMsIDB4NjFFRjQxOTIsIDB4MkVBRUQ3NTUsCisgICAgMHgzN0I1RTYxNCwgMHgxQzk4QjVENywgMHgwNTgzODQ5NiwgMHg4MjFCOTg1OSwgMHg5QjAwQTkxOCwgMHhCMDJERkFEQiwgMHhBOTM2Q0I5QSwgMHhFNjc3NUQ1RCwKKyAgICAweEZGNkM2QzFDLCAweEQ0NDEzRkRGLCAweENENUEwRTlFLCAweDk1ODQyNEEyLCAweDhDOUYxNUUzLCAweEE3QjI0NjIwLCAweEJFQTk3NzYxLCAweEYxRThFMUE2LAorICAgIDB4RThGM0QwRTcsIDB4QzNERTgzMjQsIDB4REFDNUIyNjUsIDB4NUQ1REFFQUEsIDB4NDQ0NjlGRUIsIDB4NkY2QkNDMjgsIDB4NzY3MEZENjksIDB4MzkzMTZCQUUsCisgICAgMHgyMDJBNUFFRiwgMHgwQjA3MDkyQywgMHgxMjFDMzg2RCwgMHhERjQ2MzZGMywgMHhDNjVEMDdCMiwgMHhFRDcwNTQ3MSwgMHhGNDZCNjUzMCwgMHhCQjJBRjNGNywKKyAgICAweEEyMzFDMkI2LCAweDg5MUM5MTc1LCAweDkwMDdBMDM0LCAweDE3OUZCQ0ZCLCAweDBFODQ4REJBLCAweDI1QTlERTc5LCAweDNDQjJFRjM4LCAweDczRjM3OUZGLAorICAgIDB4NkFFODQ4QkUsIDB4NDFDNTFCN0QsIDB4NThERTJBM0MsIDB4RjA3OTRGMDUsIDB4RTk2MjdFNDQsIDB4QzI0RjJEODcsIDB4REI1NDFDQzYsIDB4OTQxNThBMDEsCisgICAgMHg4RDBFQkI0MCwgMHhBNjIzRTg4MywgMHhCRjM4RDlDMiwgMHgzOEEwQzUwRCwgMHgyMUJCRjQ0QywgMHgwQTk2QTc4RiwgMHgxMzhEOTZDRSwgMHg1Q0NDMDAwOSwKKyAgICAweDQ1RDczMTQ4LCAweDZFRkE2MjhCLCAweDc3RTE1M0NBLCAweEJBQkI1RDU0LCAweEEzQTA2QzE1LCAweDg4OEQzRkQ2LCAweDkxOTYwRTk3LCAweERFRDc5ODUwLAorICAgIDB4QzdDQ0E5MTEsIDB4RUNFMUZBRDIsIDB4RjVGQUNCOTMsIDB4NzI2MkQ3NUMsIDB4NkI3OUU2MUQsIDB4NDA1NEI1REUsIDB4NTk0Rjg0OUYsIDB4MTYwRTEyNTgsCisgICAgMHgwRjE1MjMxOSwgMHgyNDM4NzBEQSwgMHgzRDIzNDE5QiwgMHg2NUZENkJBNywgMHg3Q0U2NUFFNiwgMHg1N0NCMDkyNSwgMHg0RUQwMzg2NCwgMHgwMTkxQUVBMywKKyAgICAweDE4OEE5RkUyLCAweDMzQTdDQzIxLCAweDJBQkNGRDYwLCAweEFEMjRFMUFGLCAweEI0M0ZEMEVFLCAweDlGMTI4MzJELCAweDg2MDlCMjZDLCAweEM5NDgyNEFCLAorICAgIDB4RDA1MzE1RUEsIDB4RkI3RTQ2MjksIDB4RTI2NTc3NjgsIDB4MkYzRjc5RjYsIDB4MzYyNDQ4QjcsIDB4MUQwOTFCNzQsIDB4MDQxMjJBMzUsIDB4NEI1M0JDRjIsCisgICAgMHg1MjQ4OERCMywgMHg3OTY1REU3MCwgMHg2MDdFRUYzMSwgMHhFN0U2RjNGRSwgMHhGRUZEQzJCRiwgMHhENUQwOTE3QywgMHhDQ0NCQTAzRCwgMHg4MzhBMzZGQSwKKyAgICAweDlBOTEwN0JCLCAweEIxQkM1NDc4LCAweEE4QTc2NTM5LCAweDNCODM5ODRCLCAweDIyOThBOTBBLCAweDA5QjVGQUM5LCAweDEwQUVDQjg4LCAweDVGRUY1RDRGLAorICAgIDB4NDZGNDZDMEUsIDB4NkREOTNGQ0QsIDB4NzRDMjBFOEMsIDB4RjM1QTEyNDMsIDB4RUE0MTIzMDIsIDB4QzE2QzcwQzEsIDB4RDg3NzQxODAsIDB4OTczNkQ3NDcsCisgICAgMHg4RTJERTYwNiwgMHhBNTAwQjVDNSwgMHhCQzFCODQ4NCwgMHg3MTQxOEExQSwgMHg2ODVBQkI1QiwgMHg0Mzc3RTg5OCwgMHg1QTZDRDlEOSwgMHgxNTJENEYxRSwKKyAgICAweDBDMzY3RTVGLCAweDI3MUIyRDlDLCAweDNFMDAxQ0RELCAweEI5OTgwMDEyLCAweEEwODMzMTUzLCAweDhCQUU2MjkwLCAweDkyQjU1M0QxLCAweERERjRDNTE2LAorICAgIDB4QzRFRkY0NTcsIDB4RUZDMkE3OTQsIDB4RjZEOTk2RDUsIDB4QUUwN0JDRTksIDB4QjcxQzhEQTgsIDB4OUMzMURFNkIsIDB4ODUyQUVGMkEsIDB4Q0E2Qjc5RUQsCisgICAgMHhEMzcwNDhBQywgMHhGODVEMUI2RiwgMHhFMTQ2MkEyRSwgMHg2NkRFMzZFMSwgMHg3RkM1MDdBMCwgMHg1NEU4NTQ2MywgMHg0REYzNjUyMiwgMHgwMkIyRjNFNSwKKyAgICAweDFCQTlDMkE0LCAweDMwODQ5MTY3LCAweDI5OUZBMDI2LCAweEU0QzVBRUI4LCAweEZEREU5RkY5LCAweEQ2RjNDQzNBLCAweENGRThGRDdCLCAweDgwQTk2QkJDLAorICAgIDB4OTlCMjVBRkQsIDB4QjI5RjA5M0UsIDB4QUI4NDM4N0YsIDB4MkMxQzI0QjAsIDB4MzUwNzE1RjEsIDB4MUUyQTQ2MzIsIDB4MDczMTc3NzMsIDB4NDg3MEUxQjQsCisgICAgMHg1MTZCRDBGNSwgMHg3QTQ2ODMzNiwgMHg2MzVEQjI3NywgMHhDQkZBRDc0RSwgMHhEMkUxRTYwRiwgMHhGOUNDQjVDQywgMHhFMEQ3ODQ4RCwgMHhBRjk2MTI0QSwKKyAgICAweEI2OEQyMzBCLCAweDlEQTA3MEM4LCAweDg0QkI0MTg5LCAweDAzMjM1RDQ2LCAweDFBMzg2QzA3LCAweDMxMTUzRkM0LCAweDI4MEUwRTg1LCAweDY3NEY5ODQyLAorICAgIDB4N0U1NEE5MDMsIDB4NTU3OUZBQzAsIDB4NEM2MkNCODEsIDB4ODEzOEM1MUYsIDB4OTgyM0Y0NUUsIDB4QjMwRUE3OUQsIDB4QUExNTk2REMsIDB4RTU1NDAwMUIsCisgICAgMHhGQzRGMzE1QSwgMHhENzYyNjI5OSwgMHhDRTc5NTNEOCwgMHg0OUUxNEYxNywgMHg1MEZBN0U1NiwgMHg3QkQ3MkQ5NSwgMHg2MkNDMUNENCwgMHgyRDhEOEExMywKKyAgICAweDM0OTZCQjUyLCAweDFGQkJFODkxLCAweDA2QTBEOUQwLCAweDVFN0VGM0VDLCAweDQ3NjVDMkFELCAweDZDNDg5MTZFLCAweDc1NTNBMDJGLCAweDNBMTIzNkU4LAorICAgIDB4MjMwOTA3QTksIDB4MDgyNDU0NkEsIDB4MTEzRjY1MkIsIDB4OTZBNzc5RTQsIDB4OEZCQzQ4QTUsIDB4QTQ5MTFCNjYsIDB4QkQ4QTJBMjcsIDB4RjJDQkJDRTAsCisgICAgMHhFQkQwOERBMSwgMHhDMEZEREU2MiwgMHhEOUU2RUYyMywgMHgxNEJDRTFCRCwgMHgwREE3RDBGQywgMHgyNjhBODMzRiwgMHgzRjkxQjI3RSwgMHg3MEQwMjRCOSwKKyAgICAweDY5Q0IxNUY4LCAweDQyRTY0NjNCLCAweDVCRkQ3NzdBLCAweERDNjU2QkI1LCAweEM1N0U1QUY0LCAweEVFNTMwOTM3LCAweEY3NDgzODc2LCAweEI4MDlBRUIxLAorICAgIDB4QTExMjlGRjAsIDB4OEEzRkNDMzMsIDB4OTMyNEZENzJ9OworY29uc3QgdWludDMyX3QgQ1JDMzJfVDhfMltdID0gezB4MDAwMDAwMDAsIDB4MDFDMjZBMzcsIDB4MDM4NEQ0NkUsIDB4MDI0NkJFNTksIDB4MDcwOUE4REMsCisgICAgMHgwNkNCQzJFQiwgMHgwNDhEN0NCMiwgMHgwNTRGMTY4NSwgMHgwRTEzNTFCOCwgMHgwRkQxM0I4RiwgMHgwRDk3ODVENiwgMHgwQzU1RUZFMSwgMHgwOTFBRjk2NCwKKyAgICAweDA4RDg5MzUzLCAweDBBOUUyRDBBLCAweDBCNUM0NzNELCAweDFDMjZBMzcwLCAweDFERTRDOTQ3LCAweDFGQTI3NzFFLCAweDFFNjAxRDI5LCAweDFCMkYwQkFDLAorICAgIDB4MUFFRDYxOUIsIDB4MThBQkRGQzIsIDB4MTk2OUI1RjUsIDB4MTIzNUYyQzgsIDB4MTNGNzk4RkYsIDB4MTFCMTI2QTYsIDB4MTA3MzRDOTEsIDB4MTUzQzVBMTQsCisgICAgMHgxNEZFMzAyMywgMHgxNkI4OEU3QSwgMHgxNzdBRTQ0RCwgMHgzODRENDZFMCwgMHgzOThGMkNENywgMHgzQkM5OTI4RSwgMHgzQTBCRjhCOSwgMHgzRjQ0RUUzQywKKyAgICAweDNFODY4NDBCLCAweDNDQzAzQTUyLCAweDNEMDI1MDY1LCAweDM2NUUxNzU4LCAweDM3OUM3RDZGLCAweDM1REFDMzM2LCAweDM0MThBOTAxLCAweDMxNTdCRjg0LAorICAgIDB4MzA5NUQ1QjMsIDB4MzJEMzZCRUEsIDB4MzMxMTAxREQsIDB4MjQ2QkU1OTAsIDB4MjVBOThGQTcsIDB4MjdFRjMxRkUsIDB4MjYyRDVCQzksIDB4MjM2MjRENEMsCisgICAgMHgyMkEwMjc3QiwgMHgyMEU2OTkyMiwgMHgyMTI0RjMxNSwgMHgyQTc4QjQyOCwgMHgyQkJBREUxRiwgMHgyOUZDNjA0NiwgMHgyODNFMEE3MSwgMHgyRDcxMUNGNCwKKyAgICAweDJDQjM3NkMzLCAweDJFRjVDODlBLCAweDJGMzdBMkFELCAweDcwOUE4REMwLCAweDcxNThFN0Y3LCAweDczMUU1OUFFLCAweDcyREMzMzk5LCAweDc3OTMyNTFDLAorICAgIDB4NzY1MTRGMkIsIDB4NzQxN0YxNzIsIDB4NzVENTlCNDUsIDB4N0U4OURDNzgsIDB4N0Y0QkI2NEYsIDB4N0QwRDA4MTYsIDB4N0NDRjYyMjEsIDB4Nzk4MDc0QTQsCisgICAgMHg3ODQyMUU5MywgMHg3QTA0QTBDQSwgMHg3QkM2Q0FGRCwgMHg2Q0JDMkVCMCwgMHg2RDdFNDQ4NywgMHg2RjM4RkFERSwgMHg2RUZBOTBFOSwgMHg2QkI1ODY2QywKKyAgICAweDZBNzdFQzVCLCAweDY4MzE1MjAyLCAweDY5RjMzODM1LCAweDYyQUY3RjA4LCAweDYzNkQxNTNGLCAweDYxMkJBQjY2LCAweDYwRTlDMTUxLCAweDY1QTZEN0Q0LAorICAgIDB4NjQ2NEJERTMsIDB4NjYyMjAzQkEsIDB4NjdFMDY5OEQsIDB4NDhEN0NCMjAsIDB4NDkxNUExMTcsIDB4NEI1MzFGNEUsIDB4NEE5MTc1NzksIDB4NEZERTYzRkMsCisgICAgMHg0RTFDMDlDQiwgMHg0QzVBQjc5MiwgMHg0RDk4RERBNSwgMHg0NkM0OUE5OCwgMHg0NzA2RjBBRiwgMHg0NTQwNEVGNiwgMHg0NDgyMjRDMSwgMHg0MUNEMzI0NCwKKyAgICAweDQwMEY1ODczLCAweDQyNDlFNjJBLCAweDQzOEI4QzFELCAweDU0RjE2ODUwLCAweDU1MzMwMjY3LCAweDU3NzVCQzNFLCAweDU2QjdENjA5LCAweDUzRjhDMDhDLAorICAgIDB4NTIzQUFBQkIsIDB4NTA3QzE0RTIsIDB4NTFCRTdFRDUsIDB4NUFFMjM5RTgsIDB4NUIyMDUzREYsIDB4NTk2NkVEODYsIDB4NThBNDg3QjEsIDB4NURFQjkxMzQsCisgICAgMHg1QzI5RkIwMywgMHg1RTZGNDU1QSwgMHg1RkFEMkY2RCwgMHhFMTM1MUI4MCwgMHhFMEY3NzFCNywgMHhFMkIxQ0ZFRSwgMHhFMzczQTVEOSwgMHhFNjNDQjM1QywKKyAgICAweEU3RkVEOTZCLCAweEU1Qjg2NzMyLCAweEU0N0EwRDA1LCAweEVGMjY0QTM4LCAweEVFRTQyMDBGLCAweEVDQTI5RTU2LCAweEVENjBGNDYxLCAweEU4MkZFMkU0LAorICAgIDB4RTlFRDg4RDMsIDB4RUJBQjM2OEEsIDB4RUE2OTVDQkQsIDB4RkQxM0I4RjAsIDB4RkNEMUQyQzcsIDB4RkU5NzZDOUUsIDB4RkY1NTA2QTksIDB4RkExQTEwMkMsCisgICAgMHhGQkQ4N0ExQiwgMHhGOTlFQzQ0MiwgMHhGODVDQUU3NSwgMHhGMzAwRTk0OCwgMHhGMkMyODM3RiwgMHhGMDg0M0QyNiwgMHhGMTQ2NTcxMSwgMHhGNDA5NDE5NCwKKyAgICAweEY1Q0IyQkEzLCAweEY3OEQ5NUZBLCAweEY2NEZGRkNELCAweEQ5Nzg1RDYwLCAweEQ4QkEzNzU3LCAweERBRkM4OTBFLCAweERCM0VFMzM5LCAweERFNzFGNUJDLAorICAgIDB4REZCMzlGOEIsIDB4RERGNTIxRDIsIDB4REMzNzRCRTUsIDB4RDc2QjBDRDgsIDB4RDZBOTY2RUYsIDB4RDRFRkQ4QjYsIDB4RDUyREIyODEsIDB4RDA2MkE0MDQsCisgICAgMHhEMUEwQ0UzMywgMHhEM0U2NzA2QSwgMHhEMjI0MUE1RCwgMHhDNTVFRkUxMCwgMHhDNDlDOTQyNywgMHhDNkRBMkE3RSwgMHhDNzE4NDA0OSwgMHhDMjU3NTZDQywKKyAgICAweEMzOTUzQ0ZCLCAweEMxRDM4MkEyLCAweEMwMTFFODk1LCAweENCNERBRkE4LCAweENBOEZDNTlGLCAweEM4Qzk3QkM2LCAweEM5MEIxMUYxLCAweENDNDQwNzc0LAorICAgIDB4Q0Q4NjZENDMsIDB4Q0ZDMEQzMUEsIDB4Q0UwMkI5MkQsIDB4OTFBRjk2NDAsIDB4OTA2REZDNzcsIDB4OTIyQjQyMkUsIDB4OTNFOTI4MTksIDB4OTZBNjNFOUMsCisgICAgMHg5NzY0NTRBQiwgMHg5NTIyRUFGMiwgMHg5NEUwODBDNSwgMHg5RkJDQzdGOCwgMHg5RTdFQURDRiwgMHg5QzM4MTM5NiwgMHg5REZBNzlBMSwgMHg5OEI1NkYyNCwKKyAgICAweDk5NzcwNTEzLCAweDlCMzFCQjRBLCAweDlBRjNEMTdELCAweDhEODkzNTMwLCAweDhDNEI1RjA3LCAweDhFMERFMTVFLCAweDhGQ0Y4QjY5LCAweDhBODA5REVDLAorICAgIDB4OEI0MkY3REIsIDB4ODkwNDQ5ODIsIDB4ODhDNjIzQjUsIDB4ODM5QTY0ODgsIDB4ODI1ODBFQkYsIDB4ODAxRUIwRTYsIDB4ODFEQ0RBRDEsIDB4ODQ5M0NDNTQsCisgICAgMHg4NTUxQTY2MywgMHg4NzE3MTgzQSwgMHg4NkQ1NzIwRCwgMHhBOUUyRDBBMCwgMHhBODIwQkE5NywgMHhBQTY2MDRDRSwgMHhBQkE0NkVGOSwgMHhBRUVCNzg3QywKKyAgICAweEFGMjkxMjRCLCAweEFENkZBQzEyLCAweEFDQURDNjI1LCAweEE3RjE4MTE4LCAweEE2MzNFQjJGLCAweEE0NzU1NTc2LCAweEE1QjczRjQxLCAweEEwRjgyOUM0LAorICAgIDB4QTEzQTQzRjMsIDB4QTM3Q0ZEQUEsIDB4QTJCRTk3OUQsIDB4QjVDNDczRDAsIDB4QjQwNjE5RTcsIDB4QjY0MEE3QkUsIDB4Qjc4MkNEODksIDB4QjJDRERCMEMsCisgICAgMHhCMzBGQjEzQiwgMHhCMTQ5MEY2MiwgMHhCMDhCNjU1NSwgMHhCQkQ3MjI2OCwgMHhCQTE1NDg1RiwgMHhCODUzRjYwNiwgMHhCOTkxOUMzMSwgMHhCQ0RFOEFCNCwKKyAgICAweEJEMUNFMDgzLCAweEJGNUE1RURBLCAweEJFOTgzNEVEfTsKK2NvbnN0IHVpbnQzMl90IENSQzMyX1Q4XzNbXSA9IHsweDAwMDAwMDAwLCAweEI4QkM2NzY1LCAweEFBMDlDODhCLCAweDEyQjVBRkVFLCAweDhGNjI5NzU3LAorICAgIDB4MzdERUYwMzIsIDB4MjU2QjVGREMsIDB4OURENzM4QjksIDB4QzVCNDI4RUYsIDB4N0QwODRGOEEsIDB4NkZCREUwNjQsIDB4RDcwMTg3MDEsIDB4NEFENkJGQjgsCisgICAgMHhGMjZBRDhERCwgMHhFMERGNzczMywgMHg1ODYzMTA1NiwgMHg1MDE5NTc5RiwgMHhFOEE1MzBGQSwgMHhGQTEwOUYxNCwgMHg0MkFDRjg3MSwgMHhERjdCQzBDOCwKKyAgICAweDY3QzdBN0FELCAweDc1NzIwODQzLCAweENEQ0U2RjI2LCAweDk1QUQ3RjcwLCAweDJEMTExODE1LCAweDNGQTRCN0ZCLCAweDg3MThEMDlFLCAweDFBQ0ZFODI3LAorICAgIDB4QTI3MzhGNDIsIDB4QjBDNjIwQUMsIDB4MDg3QTQ3QzksIDB4QTAzMkFGM0UsIDB4MTg4RUM4NUIsIDB4MEEzQjY3QjUsIDB4QjI4NzAwRDAsIDB4MkY1MDM4NjksCisgICAgMHg5N0VDNUYwQywgMHg4NTU5RjBFMiwgMHgzREU1OTc4NywgMHg2NTg2ODdEMSwgMHhERDNBRTBCNCwgMHhDRjhGNEY1QSwgMHg3NzMzMjgzRiwgMHhFQUU0MTA4NiwKKyAgICAweDUyNTg3N0UzLCAweDQwRUREODBELCAweEY4NTFCRjY4LCAweEYwMkJGOEExLCAweDQ4OTc5RkM0LCAweDVBMjIzMDJBLCAweEUyOUU1NzRGLCAweDdGNDk2RkY2LAorICAgIDB4QzdGNTA4OTMsIDB4RDU0MEE3N0QsIDB4NkRGQ0MwMTgsIDB4MzU5RkQwNEUsIDB4OEQyM0I3MkIsIDB4OUY5NjE4QzUsIDB4MjcyQTdGQTAsIDB4QkFGRDQ3MTksCisgICAgMHgwMjQxMjA3QywgMHgxMEY0OEY5MiwgMHhBODQ4RThGNywgMHg5QjE0NTgzRCwgMHgyM0E4M0Y1OCwgMHgzMTFEOTBCNiwgMHg4OUExRjdEMywgMHgxNDc2Q0Y2QSwKKyAgICAweEFDQ0FBODBGLCAweEJFN0YwN0UxLCAweDA2QzM2MDg0LCAweDVFQTA3MEQyLCAweEU2MUMxN0I3LCAweEY0QTlCODU5LCAweDRDMTVERjNDLCAweEQxQzJFNzg1LAorICAgIDB4Njk3RTgwRTAsIDB4N0JDQjJGMEUsIDB4QzM3NzQ4NkIsIDB4Q0IwRDBGQTIsIDB4NzNCMTY4QzcsIDB4NjEwNEM3MjksIDB4RDlCOEEwNEMsIDB4NDQ2Rjk4RjUsCisgICAgMHhGQ0QzRkY5MCwgMHhFRTY2NTA3RSwgMHg1NkRBMzcxQiwgMHgwRUI5Mjc0RCwgMHhCNjA1NDAyOCwgMHhBNEIwRUZDNiwgMHgxQzBDODhBMywgMHg4MURCQjAxQSwKKyAgICAweDM5NjdENzdGLCAweDJCRDI3ODkxLCAweDkzNkUxRkY0LCAweDNCMjZGNzAzLCAweDgzOUE5MDY2LCAweDkxMkYzRjg4LCAweDI5OTM1OEVELCAweEI0NDQ2MDU0LAorICAgIDB4MENGODA3MzEsIDB4MUU0REE4REYsIDB4QTZGMUNGQkEsIDB4RkU5MkRGRUMsIDB4NDYyRUI4ODksIDB4NTQ5QjE3NjcsIDB4RUMyNzcwMDIsIDB4NzFGMDQ4QkIsCisgICAgMHhDOTRDMkZERSwgMHhEQkY5ODAzMCwgMHg2MzQ1RTc1NSwgMHg2QjNGQTA5QywgMHhEMzgzQzdGOSwgMHhDMTM2NjgxNywgMHg3OThBMEY3MiwgMHhFNDVEMzdDQiwKKyAgICAweDVDRTE1MEFFLCAweDRFNTRGRjQwLCAweEY2RTg5ODI1LCAweEFFOEI4ODczLCAweDE2MzdFRjE2LCAweDA0ODI0MEY4LCAweEJDM0UyNzlELCAweDIxRTkxRjI0LAorICAgIDB4OTk1NTc4NDEsIDB4OEJFMEQ3QUYsIDB4MzM1Q0IwQ0EsIDB4RUQ1OUI2M0IsIDB4NTVFNUQxNUUsIDB4NDc1MDdFQjAsIDB4RkZFQzE5RDUsIDB4NjIzQjIxNkMsCisgICAgMHhEQTg3NDYwOSwgMHhDODMyRTlFNywgMHg3MDhFOEU4MiwgMHgyOEVEOUVENCwgMHg5MDUxRjlCMSwgMHg4MkU0NTY1RiwgMHgzQTU4MzEzQSwgMHhBNzhGMDk4MywKKyAgICAweDFGMzM2RUU2LCAweDBEODZDMTA4LCAweEI1M0FBNjZELCAweEJENDBFMUE0LCAweDA1RkM4NkMxLCAweDE3NDkyOTJGLCAweEFGRjU0RTRBLCAweDMyMjI3NkYzLAorICAgIDB4OEE5RTExOTYsIDB4OTgyQkJFNzgsIDB4MjA5N0Q5MUQsIDB4NzhGNEM5NEIsIDB4QzA0OEFFMkUsIDB4RDJGRDAxQzAsIDB4NkE0MTY2QTUsIDB4Rjc5NjVFMUMsCisgICAgMHg0RjJBMzk3OSwgMHg1RDlGOTY5NywgMHhFNTIzRjFGMiwgMHg0RDZCMTkwNSwgMHhGNUQ3N0U2MCwgMHhFNzYyRDE4RSwgMHg1RkRFQjZFQiwgMHhDMjA5OEU1MiwKKyAgICAweDdBQjVFOTM3LCAweDY4MDA0NkQ5LCAweEQwQkMyMUJDLCAweDg4REYzMUVBLCAweDMwNjM1NjhGLCAweDIyRDZGOTYxLCAweDlBNkE5RTA0LCAweDA3QkRBNkJELAorICAgIDB4QkYwMUMxRDgsIDB4QURCNDZFMzYsIDB4MTUwODA5NTMsIDB4MUQ3MjRFOUEsIDB4QTVDRTI5RkYsIDB4Qjc3Qjg2MTEsIDB4MEZDN0UxNzQsIDB4OTIxMEQ5Q0QsCisgICAgMHgyQUFDQkVBOCwgMHgzODE5MTE0NiwgMHg4MEE1NzYyMywgMHhEOEM2NjY3NSwgMHg2MDdBMDExMCwgMHg3MkNGQUVGRSwgMHhDQTczQzk5QiwgMHg1N0E0RjEyMiwKKyAgICAweEVGMTg5NjQ3LCAweEZEQUQzOUE5LCAweDQ1MTE1RUNDLCAweDc2NERFRTA2LCAweENFRjE4OTYzLCAweERDNDQyNjhELCAweDY0Rjg0MUU4LCAweEY5MkY3OTUxLAorICAgIDB4NDE5MzFFMzQsIDB4NTMyNkIxREEsIDB4RUI5QUQ2QkYsIDB4QjNGOUM2RTksIDB4MEI0NUExOEMsIDB4MTlGMDBFNjIsIDB4QTE0QzY5MDcsIDB4M0M5QjUxQkUsCisgICAgMHg4NDI3MzZEQiwgMHg5NjkyOTkzNSwgMHgyRTJFRkU1MCwgMHgyNjU0Qjk5OSwgMHg5RUU4REVGQywgMHg4QzVENzExMiwgMHgzNEUxMTY3NywgMHhBOTM2MkVDRSwKKyAgICAweDExOEE0OUFCLCAweDAzM0ZFNjQ1LCAweEJCODM4MTIwLCAweEUzRTA5MTc2LCAweDVCNUNGNjEzLCAweDQ5RTk1OUZELCAweEYxNTUzRTk4LCAweDZDODIwNjIxLAorICAgIDB4RDQzRTYxNDQsIDB4QzY4QkNFQUEsIDB4N0UzN0E5Q0YsIDB4RDY3RjQxMzgsIDB4NkVDMzI2NUQsIDB4N0M3Njg5QjMsIDB4QzRDQUVFRDYsIDB4NTkxREQ2NkYsCisgICAgMHhFMUExQjEwQSwgMHhGMzE0MUVFNCwgMHg0QkE4Nzk4MSwgMHgxM0NCNjlENywgMHhBQjc3MEVCMiwgMHhCOUMyQTE1QywgMHgwMTdFQzYzOSwgMHg5Q0E5RkU4MCwKKyAgICAweDI0MTU5OUU1LCAweDM2QTAzNjBCLCAweDhFMUM1MTZFLCAweDg2NjYxNkE3LCAweDNFREE3MUMyLCAweDJDNkZERTJDLCAweDk0RDNCOTQ5LCAweDA5MDQ4MUYwLAorICAgIDB4QjFCOEU2OTUsIDB4QTMwRDQ5N0IsIDB4MUJCMTJFMUUsIDB4NDNEMjNFNDgsIDB4RkI2RTU5MkQsIDB4RTlEQkY2QzMsIDB4NTE2NzkxQTYsIDB4Q0NCMEE5MUYsCisgICAgMHg3NDBDQ0U3QSwgMHg2NkI5NjE5NCwgMHhERTA1MDZGMX07Citjb25zdCB1aW50MzJfdCBDUkMzMl9UOF80W10gPSB7MHgwMDAwMDAwMCwgMHgzRDYwMjlCMCwgMHg3QUMwNTM2MCwgMHg0N0EwN0FEMCwgMHhGNTgwQTZDMCwKKyAgICAweEM4RTA4RjcwLCAweDhGNDBGNUEwLCAweEIyMjBEQzEwLCAweDMwNzA0QkMxLCAweDBEMTA2MjcxLCAweDRBQjAxOEExLCAweDc3RDAzMTExLCAweEM1RjBFRDAxLAorICAgIDB4Rjg5MEM0QjEsIDB4QkYzMEJFNjEsIDB4ODI1MDk3RDEsIDB4NjBFMDk3ODIsIDB4NUQ4MEJFMzIsIDB4MUEyMEM0RTIsIDB4Mjc0MEVENTIsIDB4OTU2MDMxNDIsCisgICAgMHhBODAwMThGMiwgMHhFRkEwNjIyMiwgMHhEMkMwNEI5MiwgMHg1MDkwREM0MywgMHg2REYwRjVGMywgMHgyQTUwOEYyMywgMHgxNzMwQTY5MywgMHhBNTEwN0E4MywKKyAgICAweDk4NzA1MzMzLCAweERGRDAyOUUzLCAweEUyQjAwMDUzLCAweEMxQzEyRjA0LCAweEZDQTEwNkI0LCAweEJCMDE3QzY0LCAweDg2NjE1NUQ0LCAweDM0NDE4OUM0LAorICAgIDB4MDkyMUEwNzQsIDB4NEU4MURBQTQsIDB4NzNFMUYzMTQsIDB4RjFCMTY0QzUsIDB4Q0NEMTRENzUsIDB4OEI3MTM3QTUsIDB4QjYxMTFFMTUsIDB4MDQzMUMyMDUsCisgICAgMHgzOTUxRUJCNSwgMHg3RUYxOTE2NSwgMHg0MzkxQjhENSwgMHhBMTIxQjg4NiwgMHg5QzQxOTEzNiwgMHhEQkUxRUJFNiwgMHhFNjgxQzI1NiwgMHg1NEExMUU0NiwKKyAgICAweDY5QzEzN0Y2LCAweDJFNjE0RDI2LCAweDEzMDE2NDk2LCAweDkxNTFGMzQ3LCAweEFDMzFEQUY3LCAweEVCOTFBMDI3LCAweEQ2RjE4OTk3LCAweDY0RDE1NTg3LAorICAgIDB4NTlCMTdDMzcsIDB4MUUxMTA2RTcsIDB4MjM3MTJGNTcsIDB4NThGMzU4NDksIDB4NjU5MzcxRjksIDB4MjIzMzBCMjksIDB4MUY1MzIyOTksIDB4QUQ3M0ZFODksCisgICAgMHg5MDEzRDczOSwgMHhEN0IzQURFOSwgMHhFQUQzODQ1OSwgMHg2ODgzMTM4OCwgMHg1NUUzM0EzOCwgMHgxMjQzNDBFOCwgMHgyRjIzNjk1OCwgMHg5RDAzQjU0OCwKKyAgICAweEEwNjM5Q0Y4LCAweEU3QzNFNjI4LCAweERBQTNDRjk4LCAweDM4MTNDRkNCLCAweDA1NzNFNjdCLCAweDQyRDM5Q0FCLCAweDdGQjNCNTFCLCAweENEOTM2OTBCLAorICAgIDB4RjBGMzQwQkIsIDB4Qjc1MzNBNkIsIDB4OEEzMzEzREIsIDB4MDg2Mzg0MEEsIDB4MzUwM0FEQkEsIDB4NzJBM0Q3NkEsIDB4NEZDM0ZFREEsIDB4RkRFMzIyQ0EsCisgICAgMHhDMDgzMEI3QSwgMHg4NzIzNzFBQSwgMHhCQTQzNTgxQSwgMHg5OTMyNzc0RCwgMHhBNDUyNUVGRCwgMHhFM0YyMjQyRCwgMHhERTkyMEQ5RCwgMHg2Q0IyRDE4RCwKKyAgICAweDUxRDJGODNELCAweDE2NzI4MkVELCAweDJCMTJBQjVELCAweEE5NDIzQzhDLCAweDk0MjIxNTNDLCAweEQzODI2RkVDLCAweEVFRTI0NjVDLCAweDVDQzI5QTRDLAorICAgIDB4NjFBMkIzRkMsIDB4MjYwMkM5MkMsIDB4MUI2MkUwOUMsIDB4RjlEMkUwQ0YsIDB4QzRCMkM5N0YsIDB4ODMxMkIzQUYsIDB4QkU3MjlBMUYsIDB4MEM1MjQ2MEYsCisgICAgMHgzMTMyNkZCRiwgMHg3NjkyMTU2RiwgMHg0QkYyM0NERiwgMHhDOUEyQUIwRSwgMHhGNEMyODJCRSwgMHhCMzYyRjg2RSwgMHg4RTAyRDFERSwgMHgzQzIyMERDRSwKKyAgICAweDAxNDIyNDdFLCAweDQ2RTI1RUFFLCAweDdCODI3NzFFLCAweEIxRTZCMDkyLCAweDhDODY5OTIyLCAweENCMjZFM0YyLCAweEY2NDZDQTQyLCAweDQ0NjYxNjUyLAorICAgIDB4NzkwNjNGRTIsIDB4M0VBNjQ1MzIsIDB4MDNDNjZDODIsIDB4ODE5NkZCNTMsIDB4QkNGNkQyRTMsIDB4RkI1NkE4MzMsIDB4QzYzNjgxODMsIDB4NzQxNjVEOTMsCisgICAgMHg0OTc2NzQyMywgMHgwRUQ2MEVGMywgMHgzM0I2Mjc0MywgMHhEMTA2MjcxMCwgMHhFQzY2MEVBMCwgMHhBQkM2NzQ3MCwgMHg5NkE2NURDMCwgMHgyNDg2ODFEMCwKKyAgICAweDE5RTZBODYwLCAweDVFNDZEMkIwLCAweDYzMjZGQjAwLCAweEUxNzY2Q0QxLCAweERDMTY0NTYxLCAweDlCQjYzRkIxLCAweEE2RDYxNjAxLCAweDE0RjZDQTExLAorICAgIDB4Mjk5NkUzQTEsIDB4NkUzNjk5NzEsIDB4NTM1NkIwQzEsIDB4NzAyNzlGOTYsIDB4NEQ0N0I2MjYsIDB4MEFFN0NDRjYsIDB4Mzc4N0U1NDYsIDB4ODVBNzM5NTYsCisgICAgMHhCOEM3MTBFNiwgMHhGRjY3NkEzNiwgMHhDMjA3NDM4NiwgMHg0MDU3RDQ1NywgMHg3RDM3RkRFNywgMHgzQTk3ODczNywgMHgwN0Y3QUU4NywgMHhCNUQ3NzI5NywKKyAgICAweDg4Qjc1QjI3LCAweENGMTcyMUY3LCAweEYyNzcwODQ3LCAweDEwQzcwODE0LCAweDJEQTcyMUE0LCAweDZBMDc1Qjc0LCAweDU3Njc3MkM0LCAweEU1NDdBRUQ0LAorICAgIDB4RDgyNzg3NjQsIDB4OUY4N0ZEQjQsIDB4QTJFN0Q0MDQsIDB4MjBCNzQzRDUsIDB4MURENzZBNjUsIDB4NUE3NzEwQjUsIDB4NjcxNzM5MDUsIDB4RDUzN0U1MTUsCisgICAgMHhFODU3Q0NBNSwgMHhBRkY3QjY3NSwgMHg5Mjk3OUZDNSwgMHhFOTE1RThEQiwgMHhENDc1QzE2QiwgMHg5M0Q1QkJCQiwgMHhBRUI1OTIwQiwgMHgxQzk1NEUxQiwKKyAgICAweDIxRjU2N0FCLCAweDY2NTUxRDdCLCAweDVCMzUzNENCLCAweEQ5NjVBMzFBLCAweEU0MDU4QUFBLCAweEEzQTVGMDdBLCAweDlFQzVEOUNBLCAweDJDRTUwNURBLAorICAgIDB4MTE4NTJDNkEsIDB4NTYyNTU2QkEsIDB4NkI0NTdGMEEsIDB4ODlGNTdGNTksIDB4QjQ5NTU2RTksIDB4RjMzNTJDMzksIDB4Q0U1NTA1ODksIDB4N0M3NUQ5OTksCisgICAgMHg0MTE1RjAyOSwgMHgwNkI1OEFGOSwgMHgzQkQ1QTM0OSwgMHhCOTg1MzQ5OCwgMHg4NEU1MUQyOCwgMHhDMzQ1NjdGOCwgMHhGRTI1NEU0OCwgMHg0QzA1OTI1OCwKKyAgICAweDcxNjVCQkU4LCAweDM2QzVDMTM4LCAweDBCQTVFODg4LCAweDI4RDRDN0RGLCAweDE1QjRFRTZGLCAweDUyMTQ5NEJGLCAweDZGNzRCRDBGLCAweERENTQ2MTFGLAorICAgIDB4RTAzNDQ4QUYsIDB4QTc5NDMyN0YsIDB4OUFGNDFCQ0YsIDB4MThBNDhDMUUsIDB4MjVDNEE1QUUsIDB4NjI2NERGN0UsIDB4NUYwNEY2Q0UsIDB4RUQyNDJBREUsCisgICAgMHhEMDQ0MDM2RSwgMHg5N0U0NzlCRSwgMHhBQTg0NTAwRSwgMHg0ODM0NTA1RCwgMHg3NTU0NzlFRCwgMHgzMkY0MDMzRCwgMHgwRjk0MkE4RCwgMHhCREI0RjY5RCwKKyAgICAweDgwRDRERjJELCAweEM3NzRBNUZELCAweEZBMTQ4QzRELCAweDc4NDQxQjlDLCAweDQ1MjQzMjJDLCAweDAyODQ0OEZDLCAweDNGRTQ2MTRDLCAweDhEQzRCRDVDLAorICAgIDB4QjBBNDk0RUMsIDB4RjcwNEVFM0MsIDB4Q0E2NEM3OEN9OworY29uc3QgdWludDMyX3QgQ1JDMzJfVDhfNVtdID0gezB4MDAwMDAwMDAsIDB4Q0I1Q0QzQTUsIDB4NERDOEExMEIsIDB4ODY5NDcyQUUsIDB4OUI5MTQyMTYsCisgICAgMHg1MENEOTFCMywgMHhENjU5RTMxRCwgMHgxRDA1MzBCOCwgMHhFQzUzODI2RCwgMHgyNzBGNTFDOCwgMHhBMTlCMjM2NiwgMHg2QUM3RjBDMywgMHg3N0MyQzA3QiwKKyAgICAweEJDOUUxM0RFLCAweDNBMEE2MTcwLCAweEYxNTZCMkQ1LCAweDAzRDYwMjlCLCAweEM4OEFEMTNFLCAweDRFMUVBMzkwLCAweDg1NDI3MDM1LCAweDk4NDc0MDhELAorICAgIDB4NTMxQjkzMjgsIDB4RDU4RkUxODYsIDB4MUVEMzMyMjMsIDB4RUY4NTgwRjYsIDB4MjREOTUzNTMsIDB4QTI0RDIxRkQsIDB4NjkxMUYyNTgsIDB4NzQxNEMyRTAsCisgICAgMHhCRjQ4MTE0NSwgMHgzOURDNjNFQiwgMHhGMjgwQjA0RSwgMHgwN0FDMDUzNiwgMHhDQ0YwRDY5MywgMHg0QTY0QTQzRCwgMHg4MTM4Nzc5OCwgMHg5QzNENDcyMCwKKyAgICAweDU3NjE5NDg1LCAweEQxRjVFNjJCLCAweDFBQTkzNThFLCAweEVCRkY4NzVCLCAweDIwQTM1NEZFLCAweEE2MzcyNjUwLCAweDZENkJGNUY1LCAweDcwNkVDNTRELAorICAgIDB4QkIzMjE2RTgsIDB4M0RBNjY0NDYsIDB4RjZGQUI3RTMsIDB4MDQ3QTA3QUQsIDB4Q0YyNkQ0MDgsIDB4NDlCMkE2QTYsIDB4ODJFRTc1MDMsIDB4OUZFQjQ1QkIsCisgICAgMHg1NEI3OTYxRSwgMHhEMjIzRTRCMCwgMHgxOTdGMzcxNSwgMHhFODI5ODVDMCwgMHgyMzc1NTY2NSwgMHhBNUUxMjRDQiwgMHg2RUJERjc2RSwgMHg3M0I4QzdENiwKKyAgICAweEI4RTQxNDczLCAweDNFNzA2NkRELCAweEY1MkNCNTc4LCAweDBGNTgwQTZDLCAweEM0MDREOUM5LCAweDQyOTBBQjY3LCAweDg5Q0M3OEMyLCAweDk0Qzk0ODdBLAorICAgIDB4NUY5NTlCREYsIDB4RDkwMUU5NzEsIDB4MTI1RDNBRDQsIDB4RTMwQjg4MDEsIDB4Mjg1NzVCQTQsIDB4QUVDMzI5MEEsIDB4NjU5RkZBQUYsIDB4Nzg5QUNBMTcsCisgICAgMHhCM0M2MTlCMiwgMHgzNTUyNkIxQywgMHhGRTBFQjhCOSwgMHgwQzhFMDhGNywgMHhDN0QyREI1MiwgMHg0MTQ2QTlGQywgMHg4QTFBN0E1OSwgMHg5NzFGNEFFMSwKKyAgICAweDVDNDM5OTQ0LCAweERBRDdFQkVBLCAweDExOEIzODRGLCAweEUwREQ4QTlBLCAweDJCODE1OTNGLCAweEFEMTUyQjkxLCAweDY2NDlGODM0LCAweDdCNENDODhDLAorICAgIDB4QjAxMDFCMjksIDB4MzY4NDY5ODcsIDB4RkREOEJBMjIsIDB4MDhGNDBGNUEsIDB4QzNBOERDRkYsIDB4NDUzQ0FFNTEsIDB4OEU2MDdERjQsIDB4OTM2NTRENEMsCisgICAgMHg1ODM5OUVFOSwgMHhERUFERUM0NywgMHgxNUYxM0ZFMiwgMHhFNEE3OEQzNywgMHgyRkZCNUU5MiwgMHhBOTZGMkMzQywgMHg2MjMzRkY5OSwgMHg3RjM2Q0YyMSwKKyAgICAweEI0NkExQzg0LCAweDMyRkU2RTJBLCAweEY5QTJCRDhGLCAweDBCMjIwREMxLCAweEMwN0VERTY0LCAweDQ2RUFBQ0NBLCAweDhEQjY3RjZGLCAweDkwQjM0RkQ3LAorICAgIDB4NUJFRjlDNzIsIDB4REQ3QkVFREMsIDB4MTYyNzNENzksIDB4RTc3MThGQUMsIDB4MkMyRDVDMDksIDB4QUFCOTJFQTcsIDB4NjFFNUZEMDIsIDB4N0NFMENEQkEsCisgICAgMHhCN0JDMUUxRiwgMHgzMTI4NkNCMSwgMHhGQTc0QkYxNCwgMHgxRUIwMTREOCwgMHhENUVDQzc3RCwgMHg1Mzc4QjVEMywgMHg5ODI0NjY3NiwgMHg4NTIxNTZDRSwKKyAgICAweDRFN0Q4NTZCLCAweEM4RTlGN0M1LCAweDAzQjUyNDYwLCAweEYyRTM5NkI1LCAweDM5QkY0NTEwLCAweEJGMkIzN0JFLCAweDc0NzdFNDFCLCAweDY5NzJENEEzLAorICAgIDB4QTIyRTA3MDYsIDB4MjRCQTc1QTgsIDB4RUZFNkE2MEQsIDB4MUQ2NjE2NDMsIDB4RDYzQUM1RTYsIDB4NTBBRUI3NDgsIDB4OUJGMjY0RUQsIDB4ODZGNzU0NTUsCisgICAgMHg0REFCODdGMCwgMHhDQjNGRjU1RSwgMHgwMDYzMjZGQiwgMHhGMTM1OTQyRSwgMHgzQTY5NDc4QiwgMHhCQ0ZEMzUyNSwgMHg3N0ExRTY4MCwgMHg2QUE0RDYzOCwKKyAgICAweEExRjgwNTlELCAweDI3NkM3NzMzLCAweEVDMzBBNDk2LCAweDE5MUMxMUVFLCAweEQyNDBDMjRCLCAweDU0RDRCMEU1LCAweDlGODg2MzQwLCAweDgyOEQ1M0Y4LAorICAgIDB4NDlEMTgwNUQsIDB4Q0Y0NUYyRjMsIDB4MDQxOTIxNTYsIDB4RjU0RjkzODMsIDB4M0UxMzQwMjYsIDB4Qjg4NzMyODgsIDB4NzNEQkUxMkQsIDB4NkVERUQxOTUsCisgICAgMHhBNTgyMDIzMCwgMHgyMzE2NzA5RSwgMHhFODRBQTMzQiwgMHgxQUNBMTM3NSwgMHhEMTk2QzBEMCwgMHg1NzAyQjI3RSwgMHg5QzVFNjFEQiwgMHg4MTVCNTE2MywKKyAgICAweDRBMDc4MkM2LCAweENDOTNGMDY4LCAweDA3Q0YyM0NELCAweEY2OTk5MTE4LCAweDNEQzU0MkJELCAweEJCNTEzMDEzLCAweDcwMERFM0I2LCAweDZEMDhEMzBFLAorICAgIDB4QTY1NDAwQUIsIDB4MjBDMDcyMDUsIDB4RUI5Q0ExQTAsIDB4MTFFODFFQjQsIDB4REFCNENEMTEsIDB4NUMyMEJGQkYsIDB4OTc3QzZDMUEsIDB4OEE3OTVDQTIsCisgICAgMHg0MTI1OEYwNywgMHhDN0IxRkRBOSwgMHgwQ0VEMkUwQywgMHhGREJCOUNEOSwgMHgzNkU3NEY3QywgMHhCMDczM0REMiwgMHg3QjJGRUU3NywgMHg2NjJBREVDRiwKKyAgICAweEFENzYwRDZBLCAweDJCRTI3RkM0LCAweEUwQkVBQzYxLCAweDEyM0UxQzJGLCAweEQ5NjJDRjhBLCAweDVGRjZCRDI0LCAweDk0QUE2RTgxLCAweDg5QUY1RTM5LAorICAgIDB4NDJGMzhEOUMsIDB4QzQ2N0ZGMzIsIDB4MEYzQjJDOTcsIDB4RkU2RDlFNDIsIDB4MzUzMTRERTcsIDB4QjNBNTNGNDksIDB4NzhGOUVDRUMsIDB4NjVGQ0RDNTQsCisgICAgMHhBRUEwMEZGMSwgMHgyODM0N0Q1RiwgMHhFMzY4QUVGQSwgMHgxNjQ0MUI4MiwgMHhERDE4QzgyNywgMHg1QjhDQkE4OSwgMHg5MEQwNjkyQywgMHg4REQ1NTk5NCwKKyAgICAweDQ2ODk4QTMxLCAweEMwMURGODlGLCAweDBCNDEyQjNBLCAweEZBMTc5OUVGLCAweDMxNEI0QTRBLCAweEI3REYzOEU0LCAweDdDODNFQjQxLCAweDYxODZEQkY5LAorICAgIDB4QUFEQTA4NUMsIDB4MkM0RTdBRjIsIDB4RTcxMkE5NTcsIDB4MTU5MjE5MTksIDB4REVDRUNBQkMsIDB4NTg1QUI4MTIsIDB4OTMwNjZCQjcsIDB4OEUwMzVCMEYsCisgICAgMHg0NTVGODhBQSwgMHhDM0NCRkEwNCwgMHgwODk3MjlBMSwgMHhGOUMxOUI3NCwgMHgzMjlENDhEMSwgMHhCNDA5M0E3RiwgMHg3RjU1RTlEQSwgMHg2MjUwRDk2MiwKKyAgICAweEE5MEMwQUM3LCAweDJGOTg3ODY5LCAweEU0QzRBQkNDfTsKK2NvbnN0IHVpbnQzMl90IENSQzMyX1Q4XzZbXSA9IHsweDAwMDAwMDAwLCAweEE2NzcwQkI0LCAweDk3OUYxMTI5LCAweDMxRTgxQTlELCAweEY0NEYyNDEzLAorICAgIDB4NTIzODJGQTcsIDB4NjNEMDM1M0EsIDB4QzVBNzNFOEUsIDB4MzNFRjRFNjcsIDB4OTU5ODQ1RDMsIDB4QTQ3MDVGNEUsIDB4MDIwNzU0RkEsIDB4QzdBMDZBNzQsCisgICAgMHg2MUQ3NjFDMCwgMHg1MDNGN0I1RCwgMHhGNjQ4NzBFOSwgMHg2N0RFOUNDRSwgMHhDMUE5OTc3QSwgMHhGMDQxOERFNywgMHg1NjM2ODY1MywgMHg5MzkxQjhERCwKKyAgICAweDM1RTZCMzY5LCAweDA0MEVBOUY0LCAweEEyNzlBMjQwLCAweDU0MzFEMkE5LCAweEYyNDZEOTFELCAweEMzQUVDMzgwLCAweDY1RDlDODM0LCAweEEwN0VGNkJBLAorICAgIDB4MDYwOUZEMEUsIDB4MzdFMUU3OTMsIDB4OTE5NkVDMjcsIDB4Q0ZCRDM5OUMsIDB4NjlDQTMyMjgsIDB4NTgyMjI4QjUsIDB4RkU1NTIzMDEsIDB4M0JGMjFEOEYsCisgICAgMHg5RDg1MTYzQiwgMHhBQzZEMENBNiwgMHgwQTFBMDcxMiwgMHhGQzUyNzdGQiwgMHg1QTI1N0M0RiwgMHg2QkNENjZEMiwgMHhDREJBNkQ2NiwgMHgwODFENTNFOCwKKyAgICAweEFFNkE1ODVDLCAweDlGODI0MkMxLCAweDM5RjU0OTc1LCAweEE4NjNBNTUyLCAweDBFMTRBRUU2LCAweDNGRkNCNDdCLCAweDk5OEJCRkNGLCAweDVDMkM4MTQxLAorICAgIDB4RkE1QjhBRjUsIDB4Q0JCMzkwNjgsIDB4NkRDNDlCREMsIDB4OUI4Q0VCMzUsIDB4M0RGQkUwODEsIDB4MEMxM0ZBMUMsIDB4QUE2NEYxQTgsIDB4NkZDM0NGMjYsCisgICAgMHhDOUI0QzQ5MiwgMHhGODVDREUwRiwgMHg1RTJCRDVCQiwgMHg0NDBCNzU3OSwgMHhFMjdDN0VDRCwgMHhEMzk0NjQ1MCwgMHg3NUUzNkZFNCwgMHhCMDQ0NTE2QSwKKyAgICAweDE2MzM1QURFLCAweDI3REI0MDQzLCAweDgxQUM0QkY3LCAweDc3RTQzQjFFLCAweEQxOTMzMEFBLCAweEUwN0IyQTM3LCAweDQ2MEMyMTgzLCAweDgzQUIxRjBELAorICAgIDB4MjVEQzE0QjksIDB4MTQzNDBFMjQsIDB4QjI0MzA1OTAsIDB4MjNENUU5QjcsIDB4ODVBMkUyMDMsIDB4QjQ0QUY4OUUsIDB4MTIzREYzMkEsIDB4RDc5QUNEQTQsCisgICAgMHg3MUVEQzYxMCwgMHg0MDA1REM4RCwgMHhFNjcyRDczOSwgMHgxMDNBQTdEMCwgMHhCNjREQUM2NCwgMHg4N0E1QjZGOSwgMHgyMUQyQkQ0RCwgMHhFNDc1ODNDMywKKyAgICAweDQyMDI4ODc3LCAweDczRUE5MkVBLCAweEQ1OUQ5OTVFLCAweDhCQjY0Q0U1LCAweDJEQzE0NzUxLCAweDFDMjk1RENDLCAweEJBNUU1Njc4LCAweDdGRjk2OEY2LAorICAgIDB4RDk4RTYzNDIsIDB4RTg2Njc5REYsIDB4NEUxMTcyNkIsIDB4Qjg1OTAyODIsIDB4MUUyRTA5MzYsIDB4MkZDNjEzQUIsIDB4ODlCMTE4MUYsIDB4NEMxNjI2OTEsCisgICAgMHhFQTYxMkQyNSwgMHhEQjg5MzdCOCwgMHg3REZFM0MwQywgMHhFQzY4RDAyQiwgMHg0QTFGREI5RiwgMHg3QkY3QzEwMiwgMHhERDgwQ0FCNiwgMHgxODI3RjQzOCwKKyAgICAweEJFNTBGRjhDLCAweDhGQjhFNTExLCAweDI5Q0ZFRUE1LCAweERGODc5RTRDLCAweDc5RjA5NUY4LCAweDQ4MTg4RjY1LCAweEVFNkY4NEQxLCAweDJCQzhCQTVGLAorICAgIDB4OERCRkIxRUIsIDB4QkM1N0FCNzYsIDB4MUEyMEEwQzIsIDB4ODgxNkVBRjIsIDB4MkU2MUUxNDYsIDB4MUY4OUZCREIsIDB4QjlGRUYwNkYsIDB4N0M1OUNFRTEsCisgICAgMHhEQTJFQzU1NSwgMHhFQkM2REZDOCwgMHg0REIxRDQ3QywgMHhCQkY5QTQ5NSwgMHgxRDhFQUYyMSwgMHgyQzY2QjVCQywgMHg4QTExQkUwOCwgMHg0RkI2ODA4NiwKKyAgICAweEU5QzE4QjMyLCAweEQ4Mjk5MUFGLCAweDdFNUU5QTFCLCAweEVGQzg3NjNDLCAweDQ5QkY3RDg4LCAweDc4NTc2NzE1LCAweERFMjA2Q0ExLCAweDFCODc1MjJGLAorICAgIDB4QkRGMDU5OUIsIDB4OEMxODQzMDYsIDB4MkE2RjQ4QjIsIDB4REMyNzM4NUIsIDB4N0E1MDMzRUYsIDB4NEJCODI5NzIsIDB4RURDRjIyQzYsIDB4Mjg2ODFDNDgsCisgICAgMHg4RTFGMTdGQywgMHhCRkY3MEQ2MSwgMHgxOTgwMDZENSwgMHg0N0FCRDM2RSwgMHhFMURDRDhEQSwgMHhEMDM0QzI0NywgMHg3NjQzQzlGMywgMHhCM0U0Rjc3RCwKKyAgICAweDE1OTNGQ0M5LCAweDI0N0JFNjU0LCAweDgyMENFREUwLCAweDc0NDQ5RDA5LCAweEQyMzM5NkJELCAweEUzREI4QzIwLCAweDQ1QUM4Nzk0LCAweDgwMEJCOTFBLAorICAgIDB4MjY3Q0IyQUUsIDB4MTc5NEE4MzMsIDB4QjFFM0EzODcsIDB4MjA3NTRGQTAsIDB4ODYwMjQ0MTQsIDB4QjdFQTVFODksIDB4MTE5RDU1M0QsIDB4RDQzQTZCQjMsCisgICAgMHg3MjRENjAwNywgMHg0M0E1N0E5QSwgMHhFNUQyNzEyRSwgMHgxMzlBMDFDNywgMHhCNUVEMEE3MywgMHg4NDA1MTBFRSwgMHgyMjcyMUI1QSwgMHhFN0Q1MjVENCwKKyAgICAweDQxQTIyRTYwLCAweDcwNEEzNEZELCAweEQ2M0QzRjQ5LCAweENDMUQ5RjhCLCAweDZBNkE5NDNGLCAweDVCODI4RUEyLCAweEZERjU4NTE2LCAweDM4NTJCQjk4LAorICAgIDB4OUUyNUIwMkMsIDB4QUZDREFBQjEsIDB4MDlCQUExMDUsIDB4RkZGMkQxRUMsIDB4NTk4NURBNTgsIDB4Njg2REMwQzUsIDB4Q0UxQUNCNzEsIDB4MEJCREY1RkYsCisgICAgMHhBRENBRkU0QiwgMHg5QzIyRTRENiwgMHgzQTU1RUY2MiwgMHhBQkMzMDM0NSwgMHgwREI0MDhGMSwgMHgzQzVDMTI2QywgMHg5QTJCMTlEOCwgMHg1RjhDMjc1NiwKKyAgICAweEY5RkIyQ0UyLCAweEM4MTMzNjdGLCAweDZFNjQzRENCLCAweDk4MkM0RDIyLCAweDNFNUI0Njk2LCAweDBGQjM1QzBCLCAweEE5QzQ1N0JGLCAweDZDNjM2OTMxLAorICAgIDB4Q0ExNDYyODUsIDB4RkJGQzc4MTgsIDB4NUQ4QjczQUMsIDB4MDNBMEE2MTcsIDB4QTVEN0FEQTMsIDB4OTQzRkI3M0UsIDB4MzI0OEJDOEEsIDB4RjdFRjgyMDQsCisgICAgMHg1MTk4ODlCMCwgMHg2MDcwOTMyRCwgMHhDNjA3OTg5OSwgMHgzMDRGRTg3MCwgMHg5NjM4RTNDNCwgMHhBN0QwRjk1OSwgMHgwMUE3RjJFRCwgMHhDNDAwQ0M2MywKKyAgICAweDYyNzdDN0Q3LCAweDUzOUZERDRBLCAweEY1RThENkZFLCAweDY0N0UzQUQ5LCAweEMyMDkzMTZELCAweEYzRTEyQkYwLCAweDU1OTYyMDQ0LCAweDkwMzExRUNBLAorICAgIDB4MzY0NjE1N0UsIDB4MDdBRTBGRTMsIDB4QTFEOTA0NTcsIDB4NTc5MTc0QkUsIDB4RjFFNjdGMEEsIDB4QzAwRTY1OTcsIDB4NjY3OTZFMjMsIDB4QTNERTUwQUQsCisgICAgMHgwNUE5NUIxOSwgMHgzNDQxNDE4NCwgMHg5MjM2NEEzMH07Citjb25zdCB1aW50MzJfdCBDUkMzMl9UOF83W10gPSB7MHgwMDAwMDAwMCwgMHhDQ0FBMDA5RSwgMHg0MjI1MDc3RCwgMHg4RThGMDdFMywgMHg4NDRBMEVGQSwKKyAgICAweDQ4RTAwRTY0LCAweEM2NkYwOTg3LCAweDBBQzUwOTE5LCAweEQzRTUxQkI1LCAweDFGNEYxQjJCLCAweDkxQzAxQ0M4LCAweDVENkExQzU2LCAweDU3QUYxNTRGLAorICAgIDB4OUIwNTE1RDEsIDB4MTU4QTEyMzIsIDB4RDkyMDEyQUMsIDB4N0NCQjMxMkIsIDB4QjAxMTMxQjUsIDB4M0U5RTM2NTYsIDB4RjIzNDM2QzgsIDB4RjhGMTNGRDEsCisgICAgMHgzNDVCM0Y0RiwgMHhCQUQ0MzhBQywgMHg3NjdFMzgzMiwgMHhBRjVFMkE5RSwgMHg2M0Y0MkEwMCwgMHhFRDdCMkRFMywgMHgyMUQxMkQ3RCwgMHgyQjE0MjQ2NCwKKyAgICAweEU3QkUyNEZBLCAweDY5MzEyMzE5LCAweEE1OUIyMzg3LCAweEY5NzY2MjU2LCAweDM1REM2MkM4LCAweEJCNTM2NTJCLCAweDc3Rjk2NUI1LCAweDdEM0M2Q0FDLAorICAgIDB4QjE5NjZDMzIsIDB4M0YxOTZCRDEsIDB4RjNCMzZCNEYsIDB4MkE5Mzc5RTMsIDB4RTYzOTc5N0QsIDB4NjhCNjdFOUUsIDB4QTQxQzdFMDAsIDB4QUVEOTc3MTksCisgICAgMHg2MjczNzc4NywgMHhFQ0ZDNzA2NCwgMHgyMDU2NzBGQSwgMHg4NUNENTM3RCwgMHg0OTY3NTNFMywgMHhDN0U4NTQwMCwgMHgwQjQyNTQ5RSwgMHgwMTg3NUQ4NywKKyAgICAweENEMkQ1RDE5LCAweDQzQTI1QUZBLCAweDhGMDg1QTY0LCAweDU2Mjg0OEM4LCAweDlBODI0ODU2LCAweDE0MEQ0RkI1LCAweEQ4QTc0RjJCLCAweEQyNjI0NjMyLAorICAgIDB4MUVDODQ2QUMsIDB4OTA0NzQxNEYsIDB4NUNFRDQxRDEsIDB4Mjk5REMyRUQsIDB4RTUzN0MyNzMsIDB4NkJCOEM1OTAsIDB4QTcxMkM1MEUsIDB4QUREN0NDMTcsCisgICAgMHg2MTdEQ0M4OSwgMHhFRkYyQ0I2QSwgMHgyMzU4Q0JGNCwgMHhGQTc4RDk1OCwgMHgzNkQyRDlDNiwgMHhCODVEREUyNSwgMHg3NEY3REVCQiwgMHg3RTMyRDdBMiwKKyAgICAweEIyOThENzNDLCAweDNDMTdEMERGLCAweEYwQkREMDQxLCAweDU1MjZGM0M2LCAweDk5OENGMzU4LCAweDE3MDNGNEJCLCAweERCQTlGNDI1LCAweEQxNkNGRDNDLAorICAgIDB4MURDNkZEQTIsIDB4OTM0OUZBNDEsIDB4NUZFM0ZBREYsIDB4ODZDM0U4NzMsIDB4NEE2OUU4RUQsIDB4QzRFNkVGMEUsIDB4MDg0Q0VGOTAsIDB4MDI4OUU2ODksCisgICAgMHhDRTIzRTYxNywgMHg0MEFDRTFGNCwgMHg4QzA2RTE2QSwgMHhEMEVCQTBCQiwgMHgxQzQxQTAyNSwgMHg5MkNFQTdDNiwgMHg1RTY0QTc1OCwgMHg1NEExQUU0MSwKKyAgICAweDk4MEJBRURGLCAweDE2ODRBOTNDLCAweERBMkVBOUEyLCAweDAzMEVCQjBFLCAweENGQTRCQjkwLCAweDQxMkJCQzczLCAweDhEODFCQ0VELCAweDg3NDRCNUY0LAorICAgIDB4NEJFRUI1NkEsIDB4QzU2MUIyODksIDB4MDlDQkIyMTcsIDB4QUM1MDkxOTAsIDB4NjBGQTkxMEUsIDB4RUU3NTk2RUQsIDB4MjJERjk2NzMsIDB4MjgxQTlGNkEsCisgICAgMHhFNEIwOUZGNCwgMHg2QTNGOTgxNywgMHhBNjk1OTg4OSwgMHg3RkI1OEEyNSwgMHhCMzFGOEFCQiwgMHgzRDkwOEQ1OCwgMHhGMTNBOERDNiwgMHhGQkZGODRERiwKKyAgICAweDM3NTU4NDQxLCAweEI5REE4M0EyLCAweDc1NzA4MzNDLCAweDUzM0I4NURBLCAweDlGOTE4NTQ0LCAweDExMUU4MkE3LCAweEREQjQ4MjM5LCAweEQ3NzE4QjIwLAorICAgIDB4MUJEQjhCQkUsIDB4OTU1NDhDNUQsIDB4NTlGRThDQzMsIDB4ODBERTlFNkYsIDB4NEM3NDlFRjEsIDB4QzJGQjk5MTIsIDB4MEU1MTk5OEMsIDB4MDQ5NDkwOTUsCisgICAgMHhDODNFOTAwQiwgMHg0NkIxOTdFOCwgMHg4QTFCOTc3NiwgMHgyRjgwQjRGMSwgMHhFMzJBQjQ2RiwgMHg2REE1QjM4QywgMHhBMTBGQjMxMiwgMHhBQkNBQkEwQiwKKyAgICAweDY3NjBCQTk1LCAweEU5RUZCRDc2LCAweDI1NDVCREU4LCAweEZDNjVBRjQ0LCAweDMwQ0ZBRkRBLCAweEJFNDBBODM5LCAweDcyRUFBOEE3LCAweDc4MkZBMUJFLAorICAgIDB4QjQ4NUExMjAsIDB4M0EwQUE2QzMsIDB4RjZBMEE2NUQsIDB4QUE0REU3OEMsIDB4NjZFN0U3MTIsIDB4RTg2OEUwRjEsIDB4MjRDMkUwNkYsIDB4MkUwN0U5NzYsCisgICAgMHhFMkFERTlFOCwgMHg2QzIyRUUwQiwgMHhBMDg4RUU5NSwgMHg3OUE4RkMzOSwgMHhCNTAyRkNBNywgMHgzQjhERkI0NCwgMHhGNzI3RkJEQSwgMHhGREUyRjJDMywKKyAgICAweDMxNDhGMjVELCAweEJGQzdGNUJFLCAweDczNkRGNTIwLCAweEQ2RjZENkE3LCAweDFBNUNENjM5LCAweDk0RDNEMURBLCAweDU4NzlEMTQ0LCAweDUyQkNEODVELAorICAgIDB4OUUxNkQ4QzMsIDB4MTA5OURGMjAsIDB4REMzM0RGQkUsIDB4MDUxM0NEMTIsIDB4QzlCOUNEOEMsIDB4NDczNkNBNkYsIDB4OEI5Q0NBRjEsIDB4ODE1OUMzRTgsCisgICAgMHg0REYzQzM3NiwgMHhDMzdDQzQ5NSwgMHgwRkQ2QzQwQiwgMHg3QUE2NDczNywgMHhCNjBDNDdBOSwgMHgzODgzNDA0QSwgMHhGNDI5NDBENCwgMHhGRUVDNDlDRCwKKyAgICAweDMyNDY0OTUzLCAweEJDQzk0RUIwLCAweDcwNjM0RTJFLCAweEE5NDM1QzgyLCAweDY1RTk1QzFDLCAweEVCNjY1QkZGLCAweDI3Q0M1QjYxLCAweDJEMDk1Mjc4LAorICAgIDB4RTFBMzUyRTYsIDB4NkYyQzU1MDUsIDB4QTM4NjU1OUIsIDB4MDYxRDc2MUMsIDB4Q0FCNzc2ODIsIDB4NDQzODcxNjEsIDB4ODg5MjcxRkYsIDB4ODI1Nzc4RTYsCisgICAgMHg0RUZENzg3OCwgMHhDMDcyN0Y5QiwgMHgwQ0Q4N0YwNSwgMHhENUY4NkRBOSwgMHgxOTUyNkQzNywgMHg5N0RENkFENCwgMHg1Qjc3NkE0QSwgMHg1MUIyNjM1MywKKyAgICAweDlEMTg2M0NELCAweDEzOTc2NDJFLCAweERGM0Q2NEIwLCAweDgzRDAyNTYxLCAweDRGN0EyNUZGLCAweEMxRjUyMjFDLCAweDBENUYyMjgyLCAweDA3OUEyQjlCLAorICAgIDB4Q0IzMDJCMDUsIDB4NDVCRjJDRTYsIDB4ODkxNTJDNzgsIDB4NTAzNTNFRDQsIDB4OUM5RjNFNEEsIDB4MTIxMDM5QTksIDB4REVCQTM5MzcsIDB4RDQ3RjMwMkUsCisgICAgMHgxOEQ1MzBCMCwgMHg5NjVBMzc1MywgMHg1QUYwMzdDRCwgMHhGRjZCMTQ0QSwgMHgzM0MxMTRENCwgMHhCRDRFMTMzNywgMHg3MUU0MTNBOSwgMHg3QjIxMUFCMCwKKyAgICAweEI3OEIxQTJFLCAweDM5MDQxRENELCAweEY1QUUxRDUzLCAweDJDOEUwRkZGLCAweEUwMjQwRjYxLCAweDZFQUIwODgyLCAweEEyMDEwODFDLCAweEE4QzQwMTA1LAorICAgIDB4NjQ2RTAxOUIsIDB4RUFFMTA2NzgsIDB4MjY0QjA2RTZ9OworCisvKioKKyAqIFVwZGF0ZSBhIENSQyB1c2luZyB0aGUgInpsaWIiIHBvbHlub21pYWwgLS0gd2hhdCBIYWRvb3AgY2FsbHMgQ0hFQ0tTVU1fQ1JDMzIKKyAqIHVzaW5nIHNsaWNpbmctYnktOAorICovCit1aW50MzJfdCBjcmMzMl9zYjgodWludDMyX3QgdmFsdWUsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkgeworICB1aW50MzJfdCBydW5uaW5nX2xlbmd0aCA9ICgobGVuZ3RoKSAvIDgpICogODsKKyAgdWludDMyX3QgZW5kX2J5dGVzID0gbGVuZ3RoIC0gcnVubmluZ19sZW5ndGg7CisgIHVpbnQzMl90IGxpOworICBmb3IgKGxpID0gMDsgbGkgPCBydW5uaW5nX2xlbmd0aCAvIDg7IGxpKyspIHsKKyAgICB2YWx1ZSBePSAqKHVpbnQzMl90ICopYnVmOworICAgIGJ1ZiArPSA0OworICAgIHVpbnQzMl90IHRlcm0xID0gQ1JDMzJfVDhfN1t2YWx1ZSAmIDB4MDAwMDAwRkZdIF4gQ1JDMzJfVDhfNlsodmFsdWUgPj4gOCkgJiAweDAwMDAwMEZGXTsKKyAgICB1aW50MzJfdCB0ZXJtMiA9IHZhbHVlID4+IDE2OworICAgIHZhbHVlID0gdGVybTEgXiBDUkMzMl9UOF81W3Rlcm0yICYgMHgwMDAwMDBGRl0gXiBDUkMzMl9UOF80Wyh0ZXJtMiA+PiA4KSAmIDB4MDAwMDAwRkZdOworICAgIHRlcm0xID0gQ1JDMzJfVDhfM1soKih1aW50MzJfdCAqKWJ1ZikgJiAweDAwMDAwMEZGXQorICAgICAgICBeIENSQzMyX1Q4XzJbKCgqKHVpbnQzMl90ICopYnVmKSA+PiA4KSAmIDB4MDAwMDAwRkZdOworCisgICAgdGVybTIgPSAoKih1aW50MzJfdCAqKWJ1ZikgPj4gMTY7CisgICAgdmFsdWUgPSB2YWx1ZSBeIHRlcm0xIF4gQ1JDMzJfVDhfMVt0ZXJtMiAmIDB4MDAwMDAwRkZdIF4gQ1JDMzJfVDhfMFsodGVybTIgPj4gOCkgJiAweDAwMDAwMEZGXTsKKyAgICBidWYgKz0gNDsKKyAgfQorICBmb3IgKGxpID0gMDsgbGkgPCBlbmRfYnl0ZXM7IGxpKyspIHsKKyAgICB2YWx1ZSA9IENSQzMyX1Q4XzBbKHZhbHVlIF4gKmJ1ZisrKSAmIDB4MDAwMDAwRkZdIF4gKHZhbHVlID4+IDgpOworICB9CisgIHJldHVybiB2YWx1ZTsKK30KKworY29uc3QgdWludDMyX3QgQ1JDMzJDX1Q4XzBbMjU2XSA9IHsweDAwMDAwMDAwLCAweEYyNkI4MzAzLCAweEUxM0I3MEY3LCAweDEzNTBGM0Y0LCAweEM3OUE5NzFGLAorICAgIDB4MzVGMTE0MUMsIDB4MjZBMUU3RTgsIDB4RDRDQTY0RUIsIDB4OEFEOTU4Q0YsIDB4NzhCMkRCQ0MsIDB4NkJFMjI4MzgsIDB4OTk4OUFCM0IsIDB4NEQ0M0NGRDAsCisgICAgMHhCRjI4NENEMywgMHhBQzc4QkYyNywgMHg1RTEzM0MyNCwgMHgxMDVFQzc2RiwgMHhFMjM1NDQ2QywgMHhGMTY1Qjc5OCwgMHgwMzBFMzQ5QiwgMHhEN0M0NTA3MCwKKyAgICAweDI1QUZEMzczLCAweDM2RkYyMDg3LCAweEM0OTRBMzg0LCAweDlBODc5RkEwLCAweDY4RUMxQ0EzLCAweDdCQkNFRjU3LCAweDg5RDc2QzU0LCAweDVEMUQwOEJGLAorICAgIDB4QUY3NjhCQkMsIDB4QkMyNjc4NDgsIDB4NEU0REZCNEIsIDB4MjBCRDhFREUsIDB4RDJENjBEREQsIDB4QzE4NkZFMjksIDB4MzNFRDdEMkEsIDB4RTcyNzE5QzEsCisgICAgMHgxNTRDOUFDMiwgMHgwNjFDNjkzNiwgMHhGNDc3RUEzNSwgMHhBQTY0RDYxMSwgMHg1ODBGNTUxMiwgMHg0QjVGQTZFNiwgMHhCOTM0MjVFNSwgMHg2REZFNDEwRSwKKyAgICAweDlGOTVDMjBELCAweDhDQzUzMUY5LCAweDdFQUVCMkZBLCAweDMwRTM0OUIxLCAweEMyODhDQUIyLCAweEQxRDgzOTQ2LCAweDIzQjNCQTQ1LCAweEY3NzlERUFFLAorICAgIDB4MDUxMjVEQUQsIDB4MTY0MkFFNTksIDB4RTQyOTJENUEsIDB4QkEzQTExN0UsIDB4NDg1MTkyN0QsIDB4NUIwMTYxODksIDB4QTk2QUUyOEEsIDB4N0RBMDg2NjEsCisgICAgMHg4RkNCMDU2MiwgMHg5QzlCRjY5NiwgMHg2RUYwNzU5NSwgMHg0MTdCMURCQywgMHhCMzEwOUVCRiwgMHhBMDQwNkQ0QiwgMHg1MjJCRUU0OCwgMHg4NkUxOEFBMywKKyAgICAweDc0OEEwOUEwLCAweDY3REFGQTU0LCAweDk1QjE3OTU3LCAweENCQTI0NTczLCAweDM5QzlDNjcwLCAweDJBOTkzNTg0LCAweEQ4RjJCNjg3LCAweDBDMzhEMjZDLAorICAgIDB4RkU1MzUxNkYsIDB4RUQwM0EyOUIsIDB4MUY2ODIxOTgsIDB4NTEyNURBRDMsIDB4QTM0RTU5RDAsIDB4QjAxRUFBMjQsIDB4NDI3NTI5MjcsIDB4OTZCRjREQ0MsCisgICAgMHg2NEQ0Q0VDRiwgMHg3Nzg0M0QzQiwgMHg4NUVGQkUzOCwgMHhEQkZDODIxQywgMHgyOTk3MDExRiwgMHgzQUM3RjJFQiwgMHhDOEFDNzFFOCwgMHgxQzY2MTUwMywKKyAgICAweEVFMEQ5NjAwLCAweEZENUQ2NUY0LCAweDBGMzZFNkY3LCAweDYxQzY5MzYyLCAweDkzQUQxMDYxLCAweDgwRkRFMzk1LCAweDcyOTY2MDk2LCAweEE2NUMwNDdELAorICAgIDB4NTQzNzg3N0UsIDB4NDc2Nzc0OEEsIDB4QjUwQ0Y3ODksIDB4RUIxRkNCQUQsIDB4MTk3NDQ4QUUsIDB4MEEyNEJCNUEsIDB4Rjg0RjM4NTksIDB4MkM4NTVDQjIsCisgICAgMHhERUVFREZCMSwgMHhDREJFMkM0NSwgMHgzRkQ1QUY0NiwgMHg3MTk4NTQwRCwgMHg4M0YzRDcwRSwgMHg5MEEzMjRGQSwgMHg2MkM4QTdGOSwgMHhCNjAyQzMxMiwKKyAgICAweDQ0Njk0MDExLCAweDU3MzlCM0U1LCAweEE1NTIzMEU2LCAweEZCNDEwQ0MyLCAweDA5MkE4RkMxLCAweDFBN0E3QzM1LCAweEU4MTFGRjM2LCAweDNDREI5QkRELAorICAgIDB4Q0VCMDE4REUsIDB4RERFMEVCMkEsIDB4MkY4QjY4MjksIDB4ODJGNjNCNzgsIDB4NzA5REI4N0IsIDB4NjNDRDRCOEYsIDB4OTFBNkM4OEMsIDB4NDU2Q0FDNjcsCisgICAgMHhCNzA3MkY2NCwgMHhBNDU3REM5MCwgMHg1NjNDNUY5MywgMHgwODJGNjNCNywgMHhGQTQ0RTBCNCwgMHhFOTE0MTM0MCwgMHgxQjdGOTA0MywgMHhDRkI1RjRBOCwKKyAgICAweDNEREU3N0FCLCAweDJFOEU4NDVGLCAweERDRTUwNzVDLCAweDkyQThGQzE3LCAweDYwQzM3RjE0LCAweDczOTM4Q0UwLCAweDgxRjgwRkUzLCAweDU1MzI2QjA4LAorICAgIDB4QTc1OUU4MEIsIDB4QjQwOTFCRkYsIDB4NDY2Mjk4RkMsIDB4MTg3MUE0RDgsIDB4RUExQTI3REIsIDB4Rjk0QUQ0MkYsIDB4MEIyMTU3MkMsIDB4REZFQjMzQzcsCisgICAgMHgyRDgwQjBDNCwgMHgzRUQwNDMzMCwgMHhDQ0JCQzAzMywgMHhBMjRCQjVBNiwgMHg1MDIwMzZBNSwgMHg0MzcwQzU1MSwgMHhCMTFCNDY1MiwgMHg2NUQxMjJCOSwKKyAgICAweDk3QkFBMUJBLCAweDg0RUE1MjRFLCAweDc2ODFEMTRELCAweDI4OTJFRDY5LCAweERBRjk2RTZBLCAweEM5QTk5RDlFLCAweDNCQzIxRTlELCAweEVGMDg3QTc2LAorICAgIDB4MUQ2M0Y5NzUsIDB4MEUzMzBBODEsIDB4RkM1ODg5ODIsIDB4QjIxNTcyQzksIDB4NDA3RUYxQ0EsIDB4NTMyRTAyM0UsIDB4QTE0NTgxM0QsIDB4NzU4RkU1RDYsCisgICAgMHg4N0U0NjZENSwgMHg5NEI0OTUyMSwgMHg2NkRGMTYyMiwgMHgzOENDMkEwNiwgMHhDQUE3QTkwNSwgMHhEOUY3NUFGMSwgMHgyQjlDRDlGMiwgMHhGRjU2QkQxOSwKKyAgICAweDBEM0QzRTFBLCAweDFFNkRDREVFLCAweEVDMDY0RUVELCAweEMzOEQyNkM0LCAweDMxRTZBNUM3LCAweDIyQjY1NjMzLCAweEQwRERENTMwLCAweDA0MTdCMURCLAorICAgIDB4RjY3QzMyRDgsIDB4RTUyQ0MxMkMsIDB4MTc0NzQyMkYsIDB4NDk1NDdFMEIsIDB4QkIzRkZEMDgsIDB4QTg2RjBFRkMsIDB4NUEwNDhERkYsIDB4OEVDRUU5MTQsCisgICAgMHg3Q0E1NkExNywgMHg2RkY1OTlFMywgMHg5RDlFMUFFMCwgMHhEM0QzRTFBQiwgMHgyMUI4NjJBOCwgMHgzMkU4OTE1QywgMHhDMDgzMTI1RiwgMHgxNDQ5NzZCNCwKKyAgICAweEU2MjJGNUI3LCAweEY1NzIwNjQzLCAweDA3MTk4NTQwLCAweDU5MEFCOTY0LCAweEFCNjEzQTY3LCAweEI4MzFDOTkzLCAweDRBNUE0QTkwLCAweDlFOTAyRTdCLAorICAgIDB4NkNGQkFENzgsIDB4N0ZBQjVFOEMsIDB4OERDMEREOEYsIDB4RTMzMEE4MUEsIDB4MTE1QjJCMTksIDB4MDIwQkQ4RUQsIDB4RjA2MDVCRUUsIDB4MjRBQTNGMDUsCisgICAgMHhENkMxQkMwNiwgMHhDNTkxNEZGMiwgMHgzN0ZBQ0NGMSwgMHg2OUU5RjBENSwgMHg5QjgyNzNENiwgMHg4OEQyODAyMiwgMHg3QUI5MDMyMSwgMHhBRTczNjdDQSwKKyAgICAweDVDMThFNEM5LCAweDRGNDgxNzNELCAweEJEMjM5NDNFLCAweEYzNkU2Rjc1LCAweDAxMDVFQzc2LCAweDEyNTUxRjgyLCAweEUwM0U5QzgxLCAweDM0RjRGODZBLAorICAgIDB4QzY5RjdCNjksIDB4RDVDRjg4OUQsIDB4MjdBNDBCOUUsIDB4NzlCNzM3QkEsIDB4OEJEQ0I0QjksIDB4OTg4QzQ3NEQsIDB4NkFFN0M0NEUsIDB4QkUyREEwQTUsCisgICAgMHg0QzQ2MjNBNiwgMHg1RjE2RDA1MiwgMHhBRDdENTM1MX07Citjb25zdCB1aW50MzJfdCBDUkMzMkNfVDhfMVsyNTZdID0gezB4MDAwMDAwMDAsIDB4MTNBMjk4NzcsIDB4Mjc0NTMwRUUsIDB4MzRFN0E4OTksIDB4NEU4QTYxREMsCisgICAgMHg1RDI4RjlBQiwgMHg2OUNGNTEzMiwgMHg3QTZEQzk0NSwgMHg5RDE0QzNCOCwgMHg4RUI2NUJDRiwgMHhCQTUxRjM1NiwgMHhBOUYzNkIyMSwgMHhEMzlFQTI2NCwKKyAgICAweEMwM0MzQTEzLCAweEY0REI5MjhBLCAweEU3NzkwQUZELCAweDNGQzVGMTgxLCAweDJDNjc2OUY2LCAweDE4ODBDMTZGLCAweDBCMjI1OTE4LCAweDcxNEY5MDVELAorICAgIDB4NjJFRDA4MkEsIDB4NTYwQUEwQjMsIDB4NDVBODM4QzQsIDB4QTJEMTMyMzksIDB4QjE3M0FBNEUsIDB4ODU5NDAyRDcsIDB4OTYzNjlBQTAsIDB4RUM1QjUzRTUsCisgICAgMHhGRkY5Q0I5MiwgMHhDQjFFNjMwQiwgMHhEOEJDRkI3QywgMHg3RjhCRTMwMiwgMHg2QzI5N0I3NSwgMHg1OENFRDNFQywgMHg0QjZDNEI5QiwgMHgzMTAxODJERSwKKyAgICAweDIyQTMxQUE5LCAweDE2NDRCMjMwLCAweDA1RTYyQTQ3LCAweEUyOUYyMEJBLCAweEYxM0RCOENELCAweEM1REExMDU0LCAweEQ2Nzg4ODIzLCAweEFDMTU0MTY2LAorICAgIDB4QkZCN0Q5MTEsIDB4OEI1MDcxODgsIDB4OThGMkU5RkYsIDB4NDA0RTEyODMsIDB4NTNFQzhBRjQsIDB4NjcwQjIyNkQsIDB4NzRBOUJBMUEsIDB4MEVDNDczNUYsCisgICAgMHgxRDY2RUIyOCwgMHgyOTgxNDNCMSwgMHgzQTIzREJDNiwgMHhERDVBRDEzQiwgMHhDRUY4NDk0QywgMHhGQTFGRTFENSwgMHhFOUJENzlBMiwgMHg5M0QwQjBFNywKKyAgICAweDgwNzIyODkwLCAweEI0OTU4MDA5LCAweEE3MzcxODdFLCAweEZGMTdDNjA0LCAweEVDQjU1RTczLCAweEQ4NTJGNkVBLCAweENCRjA2RTlELCAweEIxOURBN0Q4LAorICAgIDB4QTIzRjNGQUYsIDB4OTZEODk3MzYsIDB4ODU3QTBGNDEsIDB4NjIwMzA1QkMsIDB4NzFBMTlEQ0IsIDB4NDU0NjM1NTIsIDB4NTZFNEFEMjUsIDB4MkM4OTY0NjAsCisgICAgMHgzRjJCRkMxNywgMHgwQkNDNTQ4RSwgMHgxODZFQ0NGOSwgMHhDMEQyMzc4NSwgMHhEMzcwQUZGMiwgMHhFNzk3MDc2QiwgMHhGNDM1OUYxQywgMHg4RTU4NTY1OSwKKyAgICAweDlERkFDRTJFLCAweEE5MUQ2NkI3LCAweEJBQkZGRUMwLCAweDVEQzZGNDNELCAweDRFNjQ2QzRBLCAweDdBODNDNEQzLCAweDY5MjE1Q0E0LCAweDEzNEM5NUUxLAorICAgIDB4MDBFRTBEOTYsIDB4MzQwOUE1MEYsIDB4MjdBQjNENzgsIDB4ODA5QzI1MDYsIDB4OTMzRUJENzEsIDB4QTdEOTE1RTgsIDB4QjQ3QjhEOUYsIDB4Q0UxNjQ0REEsCisgICAgMHhEREI0RENBRCwgMHhFOTUzNzQzNCwgMHhGQUYxRUM0MywgMHgxRDg4RTZCRSwgMHgwRTJBN0VDOSwgMHgzQUNERDY1MCwgMHgyOTZGNEUyNywgMHg1MzAyODc2MiwKKyAgICAweDQwQTAxRjE1LCAweDc0NDdCNzhDLCAweDY3RTUyRkZCLCAweEJGNTlENDg3LCAweEFDRkI0Q0YwLCAweDk4MUNFNDY5LCAweDhCQkU3QzFFLCAweEYxRDNCNTVCLAorICAgIDB4RTI3MTJEMkMsIDB4RDY5Njg1QjUsIDB4QzUzNDFEQzIsIDB4MjI0RDE3M0YsIDB4MzFFRjhGNDgsIDB4MDUwODI3RDEsIDB4MTZBQUJGQTYsIDB4NkNDNzc2RTMsCisgICAgMHg3RjY1RUU5NCwgMHg0QjgyNDYwRCwgMHg1ODIwREU3QSwgMHhGQkMzRkFGOSwgMHhFODYxNjI4RSwgMHhEQzg2Q0ExNywgMHhDRjI0NTI2MCwgMHhCNTQ5OUIyNSwKKyAgICAweEE2RUIwMzUyLCAweDkyMENBQkNCLCAweDgxQUUzM0JDLCAweDY2RDczOTQxLCAweDc1NzVBMTM2LCAweDQxOTIwOUFGLCAweDUyMzA5MUQ4LCAweDI4NUQ1ODlELAorICAgIDB4M0JGRkMwRUEsIDB4MEYxODY4NzMsIDB4MUNCQUYwMDQsIDB4QzQwNjBCNzgsIDB4RDdBNDkzMEYsIDB4RTM0MzNCOTYsIDB4RjBFMUEzRTEsIDB4OEE4QzZBQTQsCisgICAgMHg5OTJFRjJEMywgMHhBREM5NUE0QSwgMHhCRTZCQzIzRCwgMHg1OTEyQzhDMCwgMHg0QUIwNTBCNywgMHg3RTU3RjgyRSwgMHg2REY1NjA1OSwgMHgxNzk4QTkxQywKKyAgICAweDA0M0EzMTZCLCAweDMwREQ5OUYyLCAweDIzN0YwMTg1LCAweDg0NDgxOUZCLCAweDk3RUE4MThDLCAweEEzMEQyOTE1LCAweEIwQUZCMTYyLCAweENBQzI3ODI3LAorICAgIDB4RDk2MEUwNTAsIDB4RUQ4NzQ4QzksIDB4RkUyNUQwQkUsIDB4MTk1Q0RBNDMsIDB4MEFGRTQyMzQsIDB4M0UxOUVBQUQsIDB4MkRCQjcyREEsIDB4NTdENkJCOUYsCisgICAgMHg0NDc0MjNFOCwgMHg3MDkzOEI3MSwgMHg2MzMxMTMwNiwgMHhCQjhERTg3QSwgMHhBODJGNzAwRCwgMHg5Q0M4RDg5NCwgMHg4RjZBNDBFMywgMHhGNTA3ODlBNiwKKyAgICAweEU2QTUxMUQxLCAweEQyNDJCOTQ4LCAweEMxRTAyMTNGLCAweDI2OTkyQkMyLCAweDM1M0JCM0I1LCAweDAxREMxQjJDLCAweDEyN0U4MzVCLCAweDY4MTM0QTFFLAorICAgIDB4N0JCMUQyNjksIDB4NEY1NjdBRjAsIDB4NUNGNEUyODcsIDB4MDRENDNDRkQsIDB4MTc3NkE0OEEsIDB4MjM5MTBDMTMsIDB4MzAzMzk0NjQsIDB4NEE1RTVEMjEsCisgICAgMHg1OUZDQzU1NiwgMHg2RDFCNkRDRiwgMHg3RUI5RjVCOCwgMHg5OUMwRkY0NSwgMHg4QTYyNjczMiwgMHhCRTg1Q0ZBQiwgMHhBRDI3NTdEQywgMHhENzRBOUU5OSwKKyAgICAweEM0RTgwNkVFLCAweEYwMEZBRTc3LCAweEUzQUQzNjAwLCAweDNCMTFDRDdDLCAweDI4QjM1NTBCLCAweDFDNTRGRDkyLCAweDBGRjY2NUU1LCAweDc1OUJBQ0EwLAorICAgIDB4NjYzOTM0RDcsIDB4NTJERTlDNEUsIDB4NDE3QzA0MzksIDB4QTYwNTBFQzQsIDB4QjVBNzk2QjMsIDB4ODE0MDNFMkEsIDB4OTJFMkE2NUQsIDB4RTg4RjZGMTgsCisgICAgMHhGQjJERjc2RiwgMHhDRkNBNUZGNiwgMHhEQzY4Qzc4MSwgMHg3QjVGREZGRiwgMHg2OEZENDc4OCwgMHg1QzFBRUYxMSwgMHg0RkI4Nzc2NiwgMHgzNUQ1QkUyMywKKyAgICAweDI2NzcyNjU0LCAweDEyOTA4RUNELCAweDAxMzIxNkJBLCAweEU2NEIxQzQ3LCAweEY1RTk4NDMwLCAweEMxMEUyQ0E5LCAweEQyQUNCNERFLCAweEE4QzE3RDlCLAorICAgIDB4QkI2M0U1RUMsIDB4OEY4NDRENzUsIDB4OUMyNkQ1MDIsIDB4NDQ5QTJFN0UsIDB4NTczOEI2MDksIDB4NjNERjFFOTAsIDB4NzA3RDg2RTcsIDB4MEExMDRGQTIsCisgICAgMHgxOUIyRDdENSwgMHgyRDU1N0Y0QywgMHgzRUY3RTczQiwgMHhEOThFRURDNiwgMHhDQTJDNzVCMSwgMHhGRUNCREQyOCwgMHhFRDY5NDU1RiwgMHg5NzA0OEMxQSwKKyAgICAweDg0QTYxNDZELCAweEIwNDFCQ0Y0LCAweEEzRTMyNDgzfTsKK2NvbnN0IHVpbnQzMl90IENSQzMyQ19UOF8yWzI1Nl0gPSB7MHgwMDAwMDAwMCwgMHhBNTQxOTI3RSwgMHg0RjZGNTIwRCwgMHhFQTJFQzA3MywgMHg5RURFQTQxQSwKKyAgICAweDNCOUYzNjY0LCAweEQxQjFGNjE3LCAweDc0RjA2NDY5LCAweDM4NTEzRUM1LCAweDlEMTBBQ0JCLCAweDc3M0U2Q0M4LCAweEQyN0ZGRUI2LCAweEE2OEY5QURGLAorICAgIDB4MDNDRTA4QTEsIDB4RTlFMEM4RDIsIDB4NENBMTVBQUMsIDB4NzBBMjdEOEEsIDB4RDVFM0VGRjQsIDB4M0ZDRDJGODcsIDB4OUE4Q0JERjksIDB4RUU3Q0Q5OTAsCisgICAgMHg0QjNENEJFRSwgMHhBMTEzOEI5RCwgMHgwNDUyMTlFMywgMHg0OEYzNDM0RiwgMHhFREIyRDEzMSwgMHgwNzlDMTE0MiwgMHhBMkREODMzQywgMHhENjJERTc1NSwKKyAgICAweDczNkM3NTJCLCAweDk5NDJCNTU4LCAweDNDMDMyNzI2LCAweEUxNDRGQjE0LCAweDQ0MDU2OTZBLCAweEFFMkJBOTE5LCAweDBCNkEzQjY3LCAweDdGOUE1RjBFLAorICAgIDB4REFEQkNENzAsIDB4MzBGNTBEMDMsIDB4OTVCNDlGN0QsIDB4RDkxNUM1RDEsIDB4N0M1NDU3QUYsIDB4OTY3QTk3REMsIDB4MzMzQjA1QTIsIDB4NDdDQjYxQ0IsCisgICAgMHhFMjhBRjNCNSwgMHgwOEE0MzNDNiwgMHhBREU1QTFCOCwgMHg5MUU2ODY5RSwgMHgzNEE3MTRFMCwgMHhERTg5RDQ5MywgMHg3QkM4NDZFRCwgMHgwRjM4MjI4NCwKKyAgICAweEFBNzlCMEZBLCAweDQwNTc3MDg5LCAweEU1MTZFMkY3LCAweEE5QjdCODVCLCAweDBDRjYyQTI1LCAweEU2RDhFQTU2LCAweDQzOTk3ODI4LCAweDM3NjkxQzQxLAorICAgIDB4OTIyODhFM0YsIDB4NzgwNjRFNEMsIDB4REQ0N0RDMzIsIDB4Qzc2NTgwRDksIDB4NjIyNDEyQTcsIDB4ODgwQUQyRDQsIDB4MkQ0QjQwQUEsIDB4NTlCQjI0QzMsCisgICAgMHhGQ0ZBQjZCRCwgMHgxNkQ0NzZDRSwgMHhCMzk1RTRCMCwgMHhGRjM0QkUxQywgMHg1QTc1MkM2MiwgMHhCMDVCRUMxMSwgMHgxNTFBN0U2RiwgMHg2MUVBMUEwNiwKKyAgICAweEM0QUI4ODc4LCAweDJFODU0ODBCLCAweDhCQzREQTc1LCAweEI3QzdGRDUzLCAweDEyODY2RjJELCAweEY4QThBRjVFLCAweDVERTkzRDIwLCAweDI5MTk1OTQ5LAorICAgIDB4OEM1OENCMzcsIDB4NjY3NjBCNDQsIDB4QzMzNzk5M0EsIDB4OEY5NkMzOTYsIDB4MkFENzUxRTgsIDB4QzBGOTkxOUIsIDB4NjVCODAzRTUsIDB4MTE0ODY3OEMsCisgICAgMHhCNDA5RjVGMiwgMHg1RTI3MzU4MSwgMHhGQjY2QTdGRiwgMHgyNjIxN0JDRCwgMHg4MzYwRTlCMywgMHg2OTRFMjlDMCwgMHhDQzBGQkJCRSwgMHhCOEZGREZENywKKyAgICAweDFEQkU0REE5LCAweEY3OTA4RERBLCAweDUyRDExRkE0LCAweDFFNzA0NTA4LCAweEJCMzFENzc2LCAweDUxMUYxNzA1LCAweEY0NUU4NTdCLCAweDgwQUVFMTEyLAorICAgIDB4MjVFRjczNkMsIDB4Q0ZDMUIzMUYsIDB4NkE4MDIxNjEsIDB4NTY4MzA2NDcsIDB4RjNDMjk0MzksIDB4MTlFQzU0NEEsIDB4QkNBREM2MzQsIDB4Qzg1REEyNUQsCisgICAgMHg2RDFDMzAyMywgMHg4NzMyRjA1MCwgMHgyMjczNjIyRSwgMHg2RUQyMzg4MiwgMHhDQjkzQUFGQywgMHgyMUJENkE4RiwgMHg4NEZDRjhGMSwgMHhGMDBDOUM5OCwKKyAgICAweDU1NEQwRUU2LCAweEJGNjNDRTk1LCAweDFBMjI1Q0VCLCAweDhCMjc3NzQzLCAweDJFNjZFNTNELCAweEM0NDgyNTRFLCAweDYxMDlCNzMwLCAweDE1RjlEMzU5LAorICAgIDB4QjBCODQxMjcsIDB4NUE5NjgxNTQsIDB4RkZENzEzMkEsIDB4QjM3NjQ5ODYsIDB4MTYzN0RCRjgsIDB4RkMxOTFCOEIsIDB4NTk1ODg5RjUsIDB4MkRBOEVEOUMsCisgICAgMHg4OEU5N0ZFMiwgMHg2MkM3QkY5MSwgMHhDNzg2MkRFRiwgMHhGQjg1MEFDOSwgMHg1RUM0OThCNywgMHhCNEVBNThDNCwgMHgxMUFCQ0FCQSwgMHg2NTVCQUVEMywKKyAgICAweEMwMUEzQ0FELCAweDJBMzRGQ0RFLCAweDhGNzU2RUEwLCAweEMzRDQzNDBDLCAweDY2OTVBNjcyLCAweDhDQkI2NjAxLCAweDI5RkFGNDdGLCAweDVEMEE5MDE2LAorICAgIDB4Rjg0QjAyNjgsIDB4MTI2NUMyMUIsIDB4QjcyNDUwNjUsIDB4NkE2MzhDNTcsIDB4Q0YyMjFFMjksIDB4MjUwQ0RFNUEsIDB4ODA0RDRDMjQsIDB4RjRCRDI4NEQsCisgICAgMHg1MUZDQkEzMywgMHhCQkQyN0E0MCwgMHgxRTkzRTgzRSwgMHg1MjMyQjI5MiwgMHhGNzczMjBFQywgMHgxRDVERTA5RiwgMHhCODFDNzJFMSwgMHhDQ0VDMTY4OCwKKyAgICAweDY5QUQ4NEY2LCAweDgzODM0NDg1LCAweDI2QzJENkZCLCAweDFBQzFGMURELCAweEJGODA2M0EzLCAweDU1QUVBM0QwLCAweEYwRUYzMUFFLCAweDg0MUY1NUM3LAorICAgIDB4MjE1RUM3QjksIDB4Q0I3MDA3Q0EsIDB4NkUzMTk1QjQsIDB4MjI5MENGMTgsIDB4ODdEMTVENjYsIDB4NkRGRjlEMTUsIDB4QzhCRTBGNkIsIDB4QkM0RTZCMDIsCisgICAgMHgxOTBGRjk3QywgMHhGMzIxMzkwRiwgMHg1NjYwQUI3MSwgMHg0QzQyRjc5QSwgMHhFOTAzNjVFNCwgMHgwMzJEQTU5NywgMHhBNjZDMzdFOSwgMHhEMjlDNTM4MCwKKyAgICAweDc3RERDMUZFLCAweDlERjMwMThELCAweDM4QjI5M0YzLCAweDc0MTNDOTVGLCAweEQxNTI1QjIxLCAweDNCN0M5QjUyLCAweDlFM0QwOTJDLCAweEVBQ0Q2RDQ1LAorICAgIDB4NEY4Q0ZGM0IsIDB4QTVBMjNGNDgsIDB4MDBFM0FEMzYsIDB4M0NFMDhBMTAsIDB4OTlBMTE4NkUsIDB4NzM4RkQ4MUQsIDB4RDZDRTRBNjMsIDB4QTIzRTJFMEEsCisgICAgMHgwNzdGQkM3NCwgMHhFRDUxN0MwNywgMHg0ODEwRUU3OSwgMHgwNEIxQjRENSwgMHhBMUYwMjZBQiwgMHg0QkRFRTZEOCwgMHhFRTlGNzRBNiwgMHg5QTZGMTBDRiwKKyAgICAweDNGMkU4MkIxLCAweEQ1MDA0MkMyLCAweDcwNDFEMEJDLCAweEFEMDYwQzhFLCAweDA4NDc5RUYwLCAweEUyNjk1RTgzLCAweDQ3MjhDQ0ZELCAweDMzRDhBODk0LAorICAgIDB4OTY5OTNBRUEsIDB4N0NCN0ZBOTksIDB4RDlGNjY4RTcsIDB4OTU1NzMyNEIsIDB4MzAxNkEwMzUsIDB4REEzODYwNDYsIDB4N0Y3OUYyMzgsIDB4MEI4OTk2NTEsCisgICAgMHhBRUM4MDQyRiwgMHg0NEU2QzQ1QywgMHhFMUE3NTYyMiwgMHhEREE0NzEwNCwgMHg3OEU1RTM3QSwgMHg5MkNCMjMwOSwgMHgzNzhBQjE3NywgMHg0MzdBRDUxRSwKKyAgICAweEU2M0I0NzYwLCAweDBDMTU4NzEzLCAweEE5NTQxNTZELCAweEU1RjU0RkMxLCAweDQwQjREREJGLCAweEFBOUExRENDLCAweDBGREI4RkIyLCAweDdCMkJFQkRCLAorICAgIDB4REU2QTc5QTUsIDB4MzQ0NEI5RDYsIDB4OTEwNTJCQTh9OworY29uc3QgdWludDMyX3QgQ1JDMzJDX1Q4XzNbMjU2XSA9IHsweDAwMDAwMDAwLCAweERENDVBQUI4LCAweEJGNjcyMzgxLCAweDYyMjI4OTM5LCAweDdCMjIzMUYzLAorICAgIDB4QTY2NzlCNEIsIDB4QzQ0NTEyNzIsIDB4MTkwMEI4Q0EsIDB4RjY0NDYzRTYsIDB4MkIwMUM5NUUsIDB4NDkyMzQwNjcsIDB4OTQ2NkVBREYsIDB4OEQ2NjUyMTUsCisgICAgMHg1MDIzRjhBRCwgMHgzMjAxNzE5NCwgMHhFRjQ0REIyQywgMHhFOTY0QjEzRCwgMHgzNDIxMUI4NSwgMHg1NjAzOTJCQywgMHg4QjQ2MzgwNCwgMHg5MjQ2ODBDRSwKKyAgICAweDRGMDMyQTc2LCAweDJEMjFBMzRGLCAweEYwNjQwOUY3LCAweDFGMjBEMkRCLCAweEMyNjU3ODYzLCAweEEwNDdGMTVBLCAweDdEMDI1QkUyLCAweDY0MDJFMzI4LAorICAgIDB4Qjk0NzQ5OTAsIDB4REI2NUMwQTksIDB4MDYyMDZBMTEsIDB4RDcyNTE0OEIsIDB4MEE2MEJFMzMsIDB4Njg0MjM3MEEsIDB4QjUwNzlEQjIsIDB4QUMwNzI1NzgsCisgICAgMHg3MTQyOEZDMCwgMHgxMzYwMDZGOSwgMHhDRTI1QUM0MSwgMHgyMTYxNzc2RCwgMHhGQzI0RERENSwgMHg5RTA2NTRFQywgMHg0MzQzRkU1NCwgMHg1QTQzNDY5RSwKKyAgICAweDg3MDZFQzI2LCAweEU1MjQ2NTFGLCAweDM4NjFDRkE3LCAweDNFNDFBNUI2LCAweEUzMDQwRjBFLCAweDgxMjY4NjM3LCAweDVDNjMyQzhGLCAweDQ1NjM5NDQ1LAorICAgIDB4OTgyNjNFRkQsIDB4RkEwNEI3QzQsIDB4Mjc0MTFEN0MsIDB4QzgwNUM2NTAsIDB4MTU0MDZDRTgsIDB4Nzc2MkU1RDEsIDB4QUEyNzRGNjksIDB4QjMyN0Y3QTMsCisgICAgMHg2RTYyNUQxQiwgMHgwQzQwRDQyMiwgMHhEMTA1N0U5QSwgMHhBQkE2NUZFNywgMHg3NkUzRjU1RiwgMHgxNEMxN0M2NiwgMHhDOTg0RDZERSwgMHhEMDg0NkUxNCwKKyAgICAweDBEQzFDNEFDLCAweDZGRTM0RDk1LCAweEIyQTZFNzJELCAweDVERTIzQzAxLCAweDgwQTc5NkI5LCAweEUyODUxRjgwLCAweDNGQzBCNTM4LCAweDI2QzAwREYyLAorICAgIDB4RkI4NUE3NEEsIDB4OTlBNzJFNzMsIDB4NDRFMjg0Q0IsIDB4NDJDMkVFREEsIDB4OUY4NzQ0NjIsIDB4RkRBNUNENUIsIDB4MjBFMDY3RTMsIDB4MzlFMERGMjksCisgICAgMHhFNEE1NzU5MSwgMHg4Njg3RkNBOCwgMHg1QkMyNTYxMCwgMHhCNDg2OEQzQywgMHg2OUMzMjc4NCwgMHgwQkUxQUVCRCwgMHhENkE0MDQwNSwgMHhDRkE0QkNDRiwKKyAgICAweDEyRTExNjc3LCAweDcwQzM5RjRFLCAweEFEODYzNUY2LCAweDdDODM0QjZDLCAweEExQzZFMUQ0LCAweEMzRTQ2OEVELCAweDFFQTFDMjU1LCAweDA3QTE3QTlGLAorICAgIDB4REFFNEQwMjcsIDB4QjhDNjU5MUUsIDB4NjU4M0YzQTYsIDB4OEFDNzI4OEEsIDB4NTc4MjgyMzIsIDB4MzVBMDBCMEIsIDB4RThFNUExQjMsIDB4RjFFNTE5NzksCisgICAgMHgyQ0EwQjNDMSwgMHg0RTgyM0FGOCwgMHg5M0M3OTA0MCwgMHg5NUU3RkE1MSwgMHg0OEEyNTBFOSwgMHgyQTgwRDlEMCwgMHhGN0M1NzM2OCwgMHhFRUM1Q0JBMiwKKyAgICAweDMzODA2MTFBLCAweDUxQTJFODIzLCAweDhDRTc0MjlCLCAweDYzQTM5OUI3LCAweEJFRTYzMzBGLCAweERDQzRCQTM2LCAweDAxODExMDhFLCAweDE4ODFBODQ0LAorICAgIDB4QzVDNDAyRkMsIDB4QTdFNjhCQzUsIDB4N0FBMzIxN0QsIDB4NTJBMEM5M0YsIDB4OEZFNTYzODcsIDB4RURDN0VBQkUsIDB4MzA4MjQwMDYsIDB4Mjk4MkY4Q0MsCisgICAgMHhGNEM3NTI3NCwgMHg5NkU1REI0RCwgMHg0QkEwNzFGNSwgMHhBNEU0QUFEOSwgMHg3OUExMDA2MSwgMHgxQjgzODk1OCwgMHhDNkM2MjNFMCwgMHhERkM2OUIyQSwKKyAgICAweDAyODMzMTkyLCAweDYwQTFCOEFCLCAweEJERTQxMjEzLCAweEJCQzQ3ODAyLCAweDY2ODFEMkJBLCAweDA0QTM1QjgzLCAweEQ5RTZGMTNCLCAweEMwRTY0OUYxLAorICAgIDB4MURBM0UzNDksIDB4N0Y4MTZBNzAsIDB4QTJDNEMwQzgsIDB4NEQ4MDFCRTQsIDB4OTBDNUIxNUMsIDB4RjJFNzM4NjUsIDB4MkZBMjkyREQsIDB4MzZBMjJBMTcsCisgICAgMHhFQkU3ODBBRiwgMHg4OUM1MDk5NiwgMHg1NDgwQTMyRSwgMHg4NTg1RERCNCwgMHg1OEMwNzcwQywgMHgzQUUyRkUzNSwgMHhFN0E3NTQ4RCwgMHhGRUE3RUM0NywKKyAgICAweDIzRTI0NkZGLCAweDQxQzBDRkM2LCAweDlDODU2NTdFLCAweDczQzFCRTUyLCAweEFFODQxNEVBLCAweENDQTY5REQzLCAweDExRTMzNzZCLCAweDA4RTM4RkExLAorICAgIDB4RDVBNjI1MTksIDB4Qjc4NEFDMjAsIDB4NkFDMTA2OTgsIDB4NkNFMTZDODksIDB4QjFBNEM2MzEsIDB4RDM4NjRGMDgsIDB4MEVDM0U1QjAsIDB4MTdDMzVEN0EsCisgICAgMHhDQTg2RjdDMiwgMHhBOEE0N0VGQiwgMHg3NUUxRDQ0MywgMHg5QUE1MEY2RiwgMHg0N0UwQTVENywgMHgyNUMyMkNFRSwgMHhGODg3ODY1NiwgMHhFMTg3M0U5QywKKyAgICAweDNDQzI5NDI0LCAweDVFRTAxRDFELCAweDgzQTVCN0E1LCAweEY5MDY5NkQ4LCAweDI0NDMzQzYwLCAweDQ2NjFCNTU5LCAweDlCMjQxRkUxLCAweDgyMjRBNzJCLAorICAgIDB4NUY2MTBEOTMsIDB4M0Q0Mzg0QUEsIDB4RTAwNjJFMTIsIDB4MEY0MkY1M0UsIDB4RDIwNzVGODYsIDB4QjAyNUQ2QkYsIDB4NkQ2MDdDMDcsIDB4NzQ2MEM0Q0QsCisgICAgMHhBOTI1NkU3NSwgMHhDQjA3RTc0QywgMHgxNjQyNERGNCwgMHgxMDYyMjdFNSwgMHhDRDI3OEQ1RCwgMHhBRjA1MDQ2NCwgMHg3MjQwQUVEQywgMHg2QjQwMTYxNiwKKyAgICAweEI2MDVCQ0FFLCAweEQ0MjczNTk3LCAweDA5NjI5RjJGLCAweEU2MjY0NDAzLCAweDNCNjNFRUJCLCAweDU5NDE2NzgyLCAweDg0MDRDRDNBLCAweDlEMDQ3NUYwLAorICAgIDB4NDA0MURGNDgsIDB4MjI2MzU2NzEsIDB4RkYyNkZDQzksIDB4MkUyMzgyNTMsIDB4RjM2NjI4RUIsIDB4OTE0NEExRDIsIDB4NEMwMTBCNkEsIDB4NTUwMUIzQTAsCisgICAgMHg4ODQ0MTkxOCwgMHhFQTY2OTAyMSwgMHgzNzIzM0E5OSwgMHhEODY3RTFCNSwgMHgwNTIyNEIwRCwgMHg2NzAwQzIzNCwgMHhCQTQ1Njg4QywgMHhBMzQ1RDA0NiwKKyAgICAweDdFMDA3QUZFLCAweDFDMjJGM0M3LCAweEMxNjc1OTdGLCAweEM3NDczMzZFLCAweDFBMDI5OUQ2LCAweDc4MjAxMEVGLCAweEE1NjVCQTU3LCAweEJDNjUwMjlELAorICAgIDB4NjEyMEE4MjUsIDB4MDMwMjIxMUMsIDB4REU0NzhCQTQsIDB4MzEwMzUwODgsIDB4RUM0NkZBMzAsIDB4OEU2NDczMDksIDB4NTMyMUQ5QjEsIDB4NEEyMTYxN0IsCisgICAgMHg5NzY0Q0JDMywgMHhGNTQ2NDJGQSwgMHgyODAzRTg0Mn07Citjb25zdCB1aW50MzJfdCBDUkMzMkNfVDhfNFsyNTZdID0gezB4MDAwMDAwMDAsIDB4MzgxMTZGQUMsIDB4NzAyMkRGNTgsIDB4NDgzM0IwRjQsIDB4RTA0NUJFQjAsCisgICAgMHhEODU0RDExQywgMHg5MDY3NjFFOCwgMHhBODc2MEU0NCwgMHhDNTY3MEI5MSwgMHhGRDc2NjQzRCwgMHhCNTQ1RDRDOSwgMHg4RDU0QkI2NSwgMHgyNTIyQjUyMSwKKyAgICAweDFEMzNEQThELCAweDU1MDA2QTc5LCAweDZEMTEwNUQ1LCAweDhGMjI2MUQzLCAweEI3MzMwRTdGLCAweEZGMDBCRThCLCAweEM3MTFEMTI3LCAweDZGNjdERjYzLAorICAgIDB4NTc3NkIwQ0YsIDB4MUY0NTAwM0IsIDB4Mjc1NDZGOTcsIDB4NEE0NTZBNDIsIDB4NzI1NDA1RUUsIDB4M0E2N0I1MUEsIDB4MDI3NkRBQjYsIDB4QUEwMEQ0RjIsCisgICAgMHg5MjExQkI1RSwgMHhEQTIyMEJBQSwgMHhFMjMzNjQwNiwgMHgxQkE4QjU1NywgMHgyM0I5REFGQiwgMHg2QjhBNkEwRiwgMHg1MzlCMDVBMywgMHhGQkVEMEJFNywKKyAgICAweEMzRkM2NDRCLCAweDhCQ0ZENEJGLCAweEIzREVCQjEzLCAweERFQ0ZCRUM2LCAweEU2REVEMTZBLCAweEFFRUQ2MTlFLCAweDk2RkMwRTMyLCAweDNFOEEwMDc2LAorICAgIDB4MDY5QjZGREEsIDB4NEVBOERGMkUsIDB4NzZCOUIwODIsIDB4OTQ4QUQ0ODQsIDB4QUM5QkJCMjgsIDB4RTRBODBCREMsIDB4RENCOTY0NzAsIDB4NzRDRjZBMzQsCisgICAgMHg0Q0RFMDU5OCwgMHgwNEVEQjU2QywgMHgzQ0ZDREFDMCwgMHg1MUVEREYxNSwgMHg2OUZDQjBCOSwgMHgyMUNGMDA0RCwgMHgxOURFNkZFMSwgMHhCMUE4NjFBNSwKKyAgICAweDg5QjkwRTA5LCAweEMxOEFCRUZELCAweEY5OUJEMTUxLCAweDM3NTE2QUFFLCAweDBGNDAwNTAyLCAweDQ3NzNCNUY2LCAweDdGNjJEQTVBLCAweEQ3MTRENDFFLAorICAgIDB4RUYwNUJCQjIsIDB4QTczNjBCNDYsIDB4OUYyNzY0RUEsIDB4RjIzNjYxM0YsIDB4Q0EyNzBFOTMsIDB4ODIxNEJFNjcsIDB4QkEwNUQxQ0IsIDB4MTI3M0RGOEYsCisgICAgMHgyQTYyQjAyMywgMHg2MjUxMDBENywgMHg1QTQwNkY3QiwgMHhCODczMEI3RCwgMHg4MDYyNjREMSwgMHhDODUxRDQyNSwgMHhGMDQwQkI4OSwgMHg1ODM2QjVDRCwKKyAgICAweDYwMjdEQTYxLCAweDI4MTQ2QTk1LCAweDEwMDUwNTM5LCAweDdEMTQwMEVDLCAweDQ1MDU2RjQwLCAweDBEMzZERkI0LCAweDM1MjdCMDE4LCAweDlENTFCRTVDLAorICAgIDB4QTU0MEQxRjAsIDB4RUQ3MzYxMDQsIDB4RDU2MjBFQTgsIDB4MkNGOURGRjksIDB4MTRFOEIwNTUsIDB4NUNEQjAwQTEsIDB4NjRDQTZGMEQsIDB4Q0NCQzYxNDksCisgICAgMHhGNEFEMEVFNSwgMHhCQzlFQkUxMSwgMHg4NDhGRDFCRCwgMHhFOTlFRDQ2OCwgMHhEMThGQkJDNCwgMHg5OUJDMEIzMCwgMHhBMUFENjQ5QywgMHgwOURCNkFEOCwKKyAgICAweDMxQ0EwNTc0LCAweDc5RjlCNTgwLCAweDQxRThEQTJDLCAweEEzREJCRTJBLCAweDlCQ0FEMTg2LCAweEQzRjk2MTcyLCAweEVCRTgwRURFLCAweDQzOUUwMDlBLAorICAgIDB4N0I4RjZGMzYsIDB4MzNCQ0RGQzIsIDB4MEJBREIwNkUsIDB4NjZCQ0I1QkIsIDB4NUVBRERBMTcsIDB4MTY5RTZBRTMsIDB4MkU4RjA1NEYsIDB4ODZGOTBCMEIsCisgICAgMHhCRUU4NjRBNywgMHhGNkRCRDQ1MywgMHhDRUNBQkJGRiwgMHg2RUEyRDU1QywgMHg1NkIzQkFGMCwgMHgxRTgwMEEwNCwgMHgyNjkxNjVBOCwgMHg4RUU3NkJFQywKKyAgICAweEI2RjYwNDQwLCAweEZFQzVCNEI0LCAweEM2RDREQjE4LCAweEFCQzVERUNELCAweDkzRDRCMTYxLCAweERCRTcwMTk1LCAweEUzRjY2RTM5LCAweDRCODA2MDdELAorICAgIDB4NzM5MTBGRDEsIDB4M0JBMkJGMjUsIDB4MDNCM0QwODksIDB4RTE4MEI0OEYsIDB4RDk5MURCMjMsIDB4OTFBMjZCRDcsIDB4QTlCMzA0N0IsIDB4MDFDNTBBM0YsCisgICAgMHgzOUQ0NjU5MywgMHg3MUU3RDU2NywgMHg0OUY2QkFDQiwgMHgyNEU3QkYxRSwgMHgxQ0Y2RDBCMiwgMHg1NEM1NjA0NiwgMHg2Q0Q0MEZFQSwgMHhDNEEyMDFBRSwKKyAgICAweEZDQjM2RTAyLCAweEI0ODBERUY2LCAweDhDOTFCMTVBLCAweDc1MEE2MDBCLCAweDREMUIwRkE3LCAweDA1MjhCRjUzLCAweDNEMzlEMEZGLCAweDk1NEZERUJCLAorICAgIDB4QUQ1RUIxMTcsIDB4RTU2RDAxRTMsIDB4REQ3QzZFNEYsIDB4QjA2RDZCOUEsIDB4ODg3QzA0MzYsIDB4QzA0RkI0QzIsIDB4Rjg1RURCNkUsIDB4NTAyOEQ1MkEsCisgICAgMHg2ODM5QkE4NiwgMHgyMDBBMEE3MiwgMHgxODFCNjVERSwgMHhGQTI4MDFEOCwgMHhDMjM5NkU3NCwgMHg4QTBBREU4MCwgMHhCMjFCQjEyQywgMHgxQTZEQkY2OCwKKyAgICAweDIyN0NEMEM0LCAweDZBNEY2MDMwLCAweDUyNUUwRjlDLCAweDNGNEYwQTQ5LCAweDA3NUU2NUU1LCAweDRGNkRENTExLCAweDc3N0NCQUJELCAweERGMEFCNEY5LAorICAgIDB4RTcxQkRCNTUsIDB4QUYyODZCQTEsIDB4OTczOTA0MEQsIDB4NTlGM0JGRjIsIDB4NjFFMkQwNUUsIDB4MjlEMTYwQUEsIDB4MTFDMDBGMDYsIDB4QjlCNjAxNDIsCisgICAgMHg4MUE3NkVFRSwgMHhDOTk0REUxQSwgMHhGMTg1QjFCNiwgMHg5Qzk0QjQ2MywgMHhBNDg1REJDRiwgMHhFQ0I2NkIzQiwgMHhENEE3MDQ5NywgMHg3Q0QxMEFEMywKKyAgICAweDQ0QzA2NTdGLCAweDBDRjNENThCLCAweDM0RTJCQTI3LCAweEQ2RDFERTIxLCAweEVFQzBCMThELCAweEE2RjMwMTc5LCAweDlFRTI2RUQ1LCAweDM2OTQ2MDkxLAorICAgIDB4MEU4NTBGM0QsIDB4NDZCNkJGQzksIDB4N0VBN0QwNjUsIDB4MTNCNkQ1QjAsIDB4MkJBN0JBMUMsIDB4NjM5NDBBRTgsIDB4NUI4NTY1NDQsIDB4RjNGMzZCMDAsCisgICAgMHhDQkUyMDRBQywgMHg4M0QxQjQ1OCwgMHhCQkMwREJGNCwgMHg0MjVCMEFBNSwgMHg3QTRBNjUwOSwgMHgzMjc5RDVGRCwgMHgwQTY4QkE1MSwgMHhBMjFFQjQxNSwKKyAgICAweDlBMEZEQkI5LCAweEQyM0M2QjRELCAweEVBMkQwNEUxLCAweDg3M0MwMTM0LCAweEJGMkQ2RTk4LCAweEY3MUVERTZDLCAweENGMEZCMUMwLCAweDY3NzlCRjg0LAorICAgIDB4NUY2OEQwMjgsIDB4MTc1QjYwREMsIDB4MkY0QTBGNzAsIDB4Q0Q3OTZCNzYsIDB4RjU2ODA0REEsIDB4QkQ1QkI0MkUsIDB4ODU0QURCODIsIDB4MkQzQ0Q1QzYsCisgICAgMHgxNTJEQkE2QSwgMHg1RDFFMEE5RSwgMHg2NTBGNjUzMiwgMHgwODFFNjBFNywgMHgzMDBGMEY0QiwgMHg3ODNDQkZCRiwgMHg0MDJERDAxMywgMHhFODVCREU1NywKKyAgICAweEQwNEFCMUZCLCAweDk4NzkwMTBGLCAweEEwNjg2RUEzfTsKKworY29uc3QgdWludDMyX3QgQ1JDMzJDX1Q4XzVbMjU2XSA9IHsweDAwMDAwMDAwLCAweEVGMzA2QjE5LCAweERCOENBMEMzLCAweDM0QkNDQkRBLCAweEIyRjUzNzc3LAorICAgIDB4NURDNTVDNkUsIDB4Njk3OTk3QjQsIDB4ODY0OUZDQUQsIDB4NjAwNjE4MUYsIDB4OEYzNjczMDYsIDB4QkI4QUI4REMsIDB4NTRCQUQzQzUsIDB4RDJGMzJGNjgsCisgICAgMHgzREMzNDQ3MSwgMHgwOTdGOEZBQiwgMHhFNjRGRTRCMiwgMHhDMDBDMzAzRSwgMHgyRjNDNUIyNywgMHgxQjgwOTBGRCwgMHhGNEIwRkJFNCwgMHg3MkY5MDc0OSwKKyAgICAweDlEQzk2QzUwLCAweEE5NzVBNzhBLCAweDQ2NDVDQzkzLCAweEEwMEEyODIxLCAweDRGM0E0MzM4LCAweDdCODY4OEUyLCAweDk0QjZFM0ZCLCAweDEyRkYxRjU2LAorICAgIDB4RkRDRjc0NEYsIDB4Qzk3M0JGOTUsIDB4MjY0M0Q0OEMsIDB4ODVGNDE2OEQsIDB4NkFDNDdEOTQsIDB4NUU3OEI2NEUsIDB4QjE0OERENTcsIDB4MzcwMTIxRkEsCisgICAgMHhEODMxNEFFMywgMHhFQzhEODEzOSwgMHgwM0JERUEyMCwgMHhFNUYyMEU5MiwgMHgwQUMyNjU4QiwgMHgzRTdFQUU1MSwgMHhEMTRFQzU0OCwgMHg1NzA3MzlFNSwKKyAgICAweEI4Mzc1MkZDLCAweDhDOEI5OTI2LCAweDYzQkJGMjNGLCAweDQ1RjgyNkIzLCAweEFBQzg0REFBLCAweDlFNzQ4NjcwLCAweDcxNDRFRDY5LCAweEY3MEQxMUM0LAorICAgIDB4MTgzRDdBREQsIDB4MkM4MUIxMDcsIDB4QzNCMURBMUUsIDB4MjVGRTNFQUMsIDB4Q0FDRTU1QjUsIDB4RkU3MjlFNkYsIDB4MTE0MkY1NzYsIDB4OTcwQjA5REIsCisgICAgMHg3ODNCNjJDMiwgMHg0Qzg3QTkxOCwgMHhBM0I3QzIwMSwgMHgwRTA0NUJFQiwgMHhFMTM0MzBGMiwgMHhENTg4RkIyOCwgMHgzQUI4OTAzMSwgMHhCQ0YxNkM5QywKKyAgICAweDUzQzEwNzg1LCAweDY3N0RDQzVGLCAweDg4NERBNzQ2LCAweDZFMDI0M0Y0LCAweDgxMzIyOEVELCAweEI1OEVFMzM3LCAweDVBQkU4ODJFLCAweERDRjc3NDgzLAorICAgIDB4MzNDNzFGOUEsIDB4MDc3QkQ0NDAsIDB4RTg0QkJGNTksIDB4Q0UwODZCRDUsIDB4MjEzODAwQ0MsIDB4MTU4NENCMTYsIDB4RkFCNEEwMEYsIDB4N0NGRDVDQTIsCisgICAgMHg5M0NEMzdCQiwgMHhBNzcxRkM2MSwgMHg0ODQxOTc3OCwgMHhBRTBFNzNDQSwgMHg0MTNFMThEMywgMHg3NTgyRDMwOSwgMHg5QUIyQjgxMCwgMHgxQ0ZCNDRCRCwKKyAgICAweEYzQ0IyRkE0LCAweEM3NzdFNDdFLCAweDI4NDc4RjY3LCAweDhCRjA0RDY2LCAweDY0QzAyNjdGLCAweDUwN0NFREE1LCAweEJGNEM4NkJDLCAweDM5MDU3QTExLAorICAgIDB4RDYzNTExMDgsIDB4RTI4OURBRDIsIDB4MERCOUIxQ0IsIDB4RUJGNjU1NzksIDB4MDRDNjNFNjAsIDB4MzA3QUY1QkEsIDB4REY0QTlFQTMsIDB4NTkwMzYyMEUsCisgICAgMHhCNjMzMDkxNywgMHg4MjhGQzJDRCwgMHg2REJGQTlENCwgMHg0QkZDN0Q1OCwgMHhBNENDMTY0MSwgMHg5MDcwREQ5QiwgMHg3RjQwQjY4MiwgMHhGOTA5NEEyRiwKKyAgICAweDE2MzkyMTM2LCAweDIyODVFQUVDLCAweENEQjU4MUY1LCAweDJCRkE2NTQ3LCAweEM0Q0EwRTVFLCAweEYwNzZDNTg0LCAweDFGNDZBRTlELCAweDk5MEY1MjMwLAorICAgIDB4NzYzRjM5MjksIDB4NDI4M0YyRjMsIDB4QURCMzk5RUEsIDB4MUMwOEI3RDYsIDB4RjMzOERDQ0YsIDB4Qzc4NDE3MTUsIDB4MjhCNDdDMEMsIDB4QUVGRDgwQTEsCisgICAgMHg0MUNERUJCOCwgMHg3NTcxMjA2MiwgMHg5QTQxNEI3QiwgMHg3QzBFQUZDOSwgMHg5MzNFQzREMCwgMHhBNzgyMEYwQSwgMHg0OEIyNjQxMywgMHhDRUZCOThCRSwKKyAgICAweDIxQ0JGM0E3LCAweDE1NzczODdELCAweEZBNDc1MzY0LCAweERDMDQ4N0U4LCAweDMzMzRFQ0YxLCAweDA3ODgyNzJCLCAweEU4Qjg0QzMyLCAweDZFRjFCMDlGLAorICAgIDB4ODFDMURCODYsIDB4QjU3RDEwNUMsIDB4NUE0RDdCNDUsIDB4QkMwMjlGRjcsIDB4NTMzMkY0RUUsIDB4Njc4RTNGMzQsIDB4ODhCRTU0MkQsIDB4MEVGN0E4ODAsCisgICAgMHhFMUM3QzM5OSwgMHhENTdCMDg0MywgMHgzQTRCNjM1QSwgMHg5OUZDQTE1QiwgMHg3NkNDQ0E0MiwgMHg0MjcwMDE5OCwgMHhBRDQwNkE4MSwgMHgyQjA5OTYyQywKKyAgICAweEM0MzlGRDM1LCAweEYwODUzNkVGLCAweDFGQjU1REY2LCAweEY5RkFCOTQ0LCAweDE2Q0FEMjVELCAweDIyNzYxOTg3LCAweENENDY3MjlFLCAweDRCMEY4RTMzLAorICAgIDB4QTQzRkU1MkEsIDB4OTA4MzJFRjAsIDB4N0ZCMzQ1RTksIDB4NTlGMDkxNjUsIDB4QjZDMEZBN0MsIDB4ODI3QzMxQTYsIDB4NkQ0QzVBQkYsIDB4RUIwNUE2MTIsCisgICAgMHgwNDM1Q0QwQiwgMHgzMDg5MDZEMSwgMHhERkI5NkRDOCwgMHgzOUY2ODk3QSwgMHhENkM2RTI2MywgMHhFMjdBMjlCOSwgMHgwRDRBNDJBMCwgMHg4QjAzQkUwRCwKKyAgICAweDY0MzNENTE0LCAweDUwOEYxRUNFLCAweEJGQkY3NUQ3LCAweDEyMENFQzNELCAweEZEM0M4NzI0LCAweEM5ODA0Q0ZFLCAweDI2QjAyN0U3LCAweEEwRjlEQjRBLAorICAgIDB4NEZDOUIwNTMsIDB4N0I3NTdCODksIDB4OTQ0NTEwOTAsIDB4NzIwQUY0MjIsIDB4OUQzQTlGM0IsIDB4QTk4NjU0RTEsIDB4NDZCNjNGRjgsIDB4QzBGRkMzNTUsCisgICAgMHgyRkNGQTg0QywgMHgxQjczNjM5NiwgMHhGNDQzMDg4RiwgMHhEMjAwREMwMywgMHgzRDMwQjcxQSwgMHgwOThDN0NDMCwgMHhFNkJDMTdEOSwgMHg2MEY1RUI3NCwKKyAgICAweDhGQzU4MDZELCAweEJCNzk0QkI3LCAweDU0NDkyMEFFLCAweEIyMDZDNDFDLCAweDVEMzZBRjA1LCAweDY5OEE2NERGLCAweDg2QkEwRkM2LCAweDAwRjNGMzZCLAorICAgIDB4RUZDMzk4NzIsIDB4REI3RjUzQTgsIDB4MzQ0RjM4QjEsIDB4OTdGOEZBQjAsIDB4NzhDODkxQTksIDB4NEM3NDVBNzMsIDB4QTM0NDMxNkEsIDB4MjUwRENEQzcsCisgICAgMHhDQTNEQTZERSwgMHhGRTgxNkQwNCwgMHgxMUIxMDYxRCwgMHhGN0ZFRTJBRiwgMHgxOENFODlCNiwgMHgyQzcyNDI2QywgMHhDMzQyMjk3NSwgMHg0NTBCRDVEOCwKKyAgICAweEFBM0JCRUMxLCAweDlFODc3NTFCLCAweDcxQjcxRTAyLCAweDU3RjRDQThFLCAweEI4QzRBMTk3LCAweDhDNzg2QTRELCAweDYzNDgwMTU0LCAweEU1MDFGREY5LAorICAgIDB4MEEzMTk2RTAsIDB4M0U4RDVEM0EsIDB4RDFCRDM2MjMsIDB4MzdGMkQyOTEsIDB4RDhDMkI5ODgsIDB4RUM3RTcyNTIsIDB4MDM0RTE5NEIsIDB4ODUwN0U1RTYsCisgICAgMHg2QTM3OEVGRiwgMHg1RThCNDUyNSwgMHhCMUJCMkUzQ307Citjb25zdCB1aW50MzJfdCBDUkMzMkNfVDhfNlsyNTZdID0gezB4MDAwMDAwMDAsIDB4NjgwMzJDQzgsIDB4RDAwNjU5OTAsIDB4QjgwNTc1NTgsIDB4QTVFMEM1RDEsCisgICAgMHhDREUzRTkxOSwgMHg3NUU2OUM0MSwgMHgxREU1QjA4OSwgMHg0RTJERkQ1MywgMHgyNjJFRDE5QiwgMHg5RTJCQTRDMywgMHhGNjI4ODgwQiwgMHhFQkNEMzg4MiwKKyAgICAweDgzQ0UxNDRBLCAweDNCQ0I2MTEyLCAweDUzQzg0RERBLCAweDlDNUJGQUE2LCAweEY0NThENjZFLCAweDRDNURBMzM2LCAweDI0NUU4RkZFLCAweDM5QkIzRjc3LAorICAgIDB4NTFCODEzQkYsIDB4RTlCRDY2RTcsIDB4ODFCRTRBMkYsIDB4RDI3NjA3RjUsIDB4QkE3NTJCM0QsIDB4MDI3MDVFNjUsIDB4NkE3MzcyQUQsIDB4Nzc5NkMyMjQsCisgICAgMHgxRjk1RUVFQywgMHhBNzkwOUJCNCwgMHhDRjkzQjc3QywgMHgzRDVCODNCRCwgMHg1NTU4QUY3NSwgMHhFRDVEREEyRCwgMHg4NTVFRjZFNSwgMHg5OEJCNDY2QywKKyAgICAweEYwQjg2QUE0LCAweDQ4QkQxRkZDLCAweDIwQkUzMzM0LCAweDczNzY3RUVFLCAweDFCNzU1MjI2LCAweEEzNzAyNzdFLCAweENCNzMwQkI2LCAweEQ2OTZCQjNGLAorICAgIDB4QkU5NTk3RjcsIDB4MDY5MEUyQUYsIDB4NkU5M0NFNjcsIDB4QTEwMDc5MUIsIDB4QzkwMzU1RDMsIDB4NzEwNjIwOEIsIDB4MTkwNTBDNDMsIDB4MDRFMEJDQ0EsCisgICAgMHg2Q0UzOTAwMiwgMHhENEU2RTU1QSwgMHhCQ0U1Qzk5MiwgMHhFRjJEODQ0OCwgMHg4NzJFQTg4MCwgMHgzRjJCREREOCwgMHg1NzI4RjExMCwgMHg0QUNENDE5OSwKKyAgICAweDIyQ0U2RDUxLCAweDlBQ0IxODA5LCAweEYyQzgzNEMxLCAweDdBQjcwNzdBLCAweDEyQjQyQkIyLCAweEFBQjE1RUVBLCAweEMyQjI3MjIyLCAweERGNTdDMkFCLAorICAgIDB4Qjc1NEVFNjMsIDB4MEY1MTlCM0IsIDB4Njc1MkI3RjMsIDB4MzQ5QUZBMjksIDB4NUM5OUQ2RTEsIDB4RTQ5Q0EzQjksIDB4OEM5RjhGNzEsIDB4OTE3QTNGRjgsCisgICAgMHhGOTc5MTMzMCwgMHg0MTdDNjY2OCwgMHgyOTdGNEFBMCwgMHhFNkVDRkREQywgMHg4RUVGRDExNCwgMHgzNkVBQTQ0QywgMHg1RUU5ODg4NCwgMHg0MzBDMzgwRCwKKyAgICAweDJCMEYxNEM1LCAweDkzMEE2MTlELCAweEZCMDk0RDU1LCAweEE4QzEwMDhGLCAweEMwQzIyQzQ3LCAweDc4Qzc1OTFGLCAweDEwQzQ3NUQ3LCAweDBEMjFDNTVFLAorICAgIDB4NjUyMkU5OTYsIDB4REQyNzlDQ0UsIDB4QjUyNEIwMDYsIDB4NDdFQzg0QzcsIDB4MkZFRkE4MEYsIDB4OTdFQURENTcsIDB4RkZFOUYxOUYsIDB4RTIwQzQxMTYsCisgICAgMHg4QTBGNkRERSwgMHgzMjBBMTg4NiwgMHg1QTA5MzQ0RSwgMHgwOUMxNzk5NCwgMHg2MUMyNTU1QywgMHhEOUM3MjAwNCwgMHhCMUM0MENDQywgMHhBQzIxQkM0NSwKKyAgICAweEM0MjI5MDhELCAweDdDMjdFNUQ1LCAweDE0MjRDOTFELCAweERCQjc3RTYxLCAweEIzQjQ1MkE5LCAweDBCQjEyN0YxLCAweDYzQjIwQjM5LCAweDdFNTdCQkIwLAorICAgIDB4MTY1NDk3NzgsIDB4QUU1MUUyMjAsIDB4QzY1MkNFRTgsIDB4OTU5QTgzMzIsIDB4RkQ5OUFGRkEsIDB4NDU5Q0RBQTIsIDB4MkQ5RkY2NkEsIDB4MzA3QTQ2RTMsCisgICAgMHg1ODc5NkEyQiwgMHhFMDdDMUY3MywgMHg4ODdGMzNCQiwgMHhGNTZFMEVGNCwgMHg5RDZEMjIzQywgMHgyNTY4NTc2NCwgMHg0RDZCN0JBQywgMHg1MDhFQ0IyNSwKKyAgICAweDM4OERFN0VELCAweDgwODg5MkI1LCAweEU4OEJCRTdELCAweEJCNDNGM0E3LCAweEQzNDBERjZGLCAweDZCNDVBQTM3LCAweDAzNDY4NkZGLCAweDFFQTMzNjc2LAorICAgIDB4NzZBMDFBQkUsIDB4Q0VBNTZGRTYsIDB4QTZBNjQzMkUsIDB4NjkzNUY0NTIsIDB4MDEzNkQ4OUEsIDB4QjkzM0FEQzIsIDB4RDEzMDgxMEEsIDB4Q0NENTMxODMsCisgICAgMHhBNEQ2MUQ0QiwgMHgxQ0QzNjgxMywgMHg3NEQwNDREQiwgMHgyNzE4MDkwMSwgMHg0RjFCMjVDOSwgMHhGNzFFNTA5MSwgMHg5RjFEN0M1OSwgMHg4MkY4Q0NEMCwKKyAgICAweEVBRkJFMDE4LCAweDUyRkU5NTQwLCAweDNBRkRCOTg4LCAweEM4MzU4RDQ5LCAweEEwMzZBMTgxLCAweDE4MzNENEQ5LCAweDcwMzBGODExLCAweDZERDU0ODk4LAorICAgIDB4MDVENjY0NTAsIDB4QkREMzExMDgsIDB4RDVEMDNEQzAsIDB4ODYxODcwMUEsIDB4RUUxQjVDRDIsIDB4NTYxRTI5OEEsIDB4M0UxRDA1NDIsIDB4MjNGOEI1Q0IsCisgICAgMHg0QkZCOTkwMywgMHhGM0ZFRUM1QiwgMHg5QkZEQzA5MywgMHg1NDZFNzdFRiwgMHgzQzZENUIyNywgMHg4NDY4MkU3RiwgMHhFQzZCMDJCNywgMHhGMThFQjIzRSwKKyAgICAweDk5OEQ5RUY2LCAweDIxODhFQkFFLCAweDQ5OEJDNzY2LCAweDFBNDM4QUJDLCAweDcyNDBBNjc0LCAweENBNDVEMzJDLCAweEEyNDZGRkU0LCAweEJGQTM0RjZELAorICAgIDB4RDdBMDYzQTUsIDB4NkZBNTE2RkQsIDB4MDdBNjNBMzUsIDB4OEZEOTA5OEUsIDB4RTdEQTI1NDYsIDB4NUZERjUwMUUsIDB4MzdEQzdDRDYsIDB4MkEzOUNDNUYsCisgICAgMHg0MjNBRTA5NywgMHhGQTNGOTVDRiwgMHg5MjNDQjkwNywgMHhDMUY0RjRERCwgMHhBOUY3RDgxNSwgMHgxMUYyQUQ0RCwgMHg3OUYxODE4NSwgMHg2NDE0MzEwQywKKyAgICAweDBDMTcxREM0LCAweEI0MTI2ODlDLCAweERDMTE0NDU0LCAweDEzODJGMzI4LCAweDdCODFERkUwLCAweEMzODRBQUI4LCAweEFCODc4NjcwLCAweEI2NjIzNkY5LAorICAgIDB4REU2MTFBMzEsIDB4NjY2NDZGNjksIDB4MEU2NzQzQTEsIDB4NURBRjBFN0IsIDB4MzVBQzIyQjMsIDB4OERBOTU3RUIsIDB4RTVBQTdCMjMsIDB4Rjg0RkNCQUEsCisgICAgMHg5MDRDRTc2MiwgMHgyODQ5OTIzQSwgMHg0MDRBQkVGMiwgMHhCMjgyOEEzMywgMHhEQTgxQTZGQiwgMHg2Mjg0RDNBMywgMHgwQTg3RkY2QiwgMHgxNzYyNEZFMiwKKyAgICAweDdGNjE2MzJBLCAweEM3NjQxNjcyLCAweEFGNjczQUJBLCAweEZDQUY3NzYwLCAweDk0QUM1QkE4LCAweDJDQTkyRUYwLCAweDQ0QUEwMjM4LCAweDU5NEZCMkIxLAorICAgIDB4MzE0QzlFNzksIDB4ODk0OUVCMjEsIDB4RTE0QUM3RTksIDB4MkVEOTcwOTUsIDB4NDZEQTVDNUQsIDB4RkVERjI5MDUsIDB4OTZEQzA1Q0QsIDB4OEIzOUI1NDQsCisgICAgMHhFMzNBOTk4QywgMHg1QjNGRUNENCwgMHgzMzNDQzAxQywgMHg2MEY0OERDNiwgMHgwOEY3QTEwRSwgMHhCMEYyRDQ1NiwgMHhEOEYxRjg5RSwgMHhDNTE0NDgxNywKKyAgICAweEFEMTc2NERGLCAweDE1MTIxMTg3LCAweDdEMTEzRDRGfTsKK2NvbnN0IHVpbnQzMl90IENSQzMyQ19UOF83WzI1Nl0gPSB7MHgwMDAwMDAwMCwgMHg0OTNDN0QyNywgMHg5Mjc4RkE0RSwgMHhEQjQ0ODc2OSwgMHgyMTFEODI2RCwKKyAgICAweDY4MjFGRjRBLCAweEIzNjU3ODIzLCAweEZBNTkwNTA0LCAweDQyM0IwNERBLCAweDBCMDc3OUZELCAweEQwNDNGRTk0LCAweDk5N0Y4M0IzLCAweDYzMjY4NkI3LAorICAgIDB4MkExQUZCOTAsIDB4RjE1RTdDRjksIDB4Qjg2MjAxREUsIDB4ODQ3NjA5QjQsIDB4Q0Q0QTc0OTMsIDB4MTYwRUYzRkEsIDB4NUYzMjhFREQsIDB4QTU2QjhCRDksCisgICAgMHhFQzU3RjZGRSwgMHgzNzEzNzE5NywgMHg3RTJGMENCMCwgMHhDNjREMEQ2RSwgMHg4RjcxNzA0OSwgMHg1NDM1RjcyMCwgMHgxRDA5OEEwNywgMHhFNzUwOEYwMywKKyAgICAweEFFNkNGMjI0LCAweDc1Mjg3NTRELCAweDNDMTQwODZBLCAweDBEMDA2NTk5LCAweDQ0M0MxOEJFLCAweDlGNzg5RkQ3LCAweEQ2NDRFMkYwLCAweDJDMURFN0Y0LAorICAgIDB4NjUyMTlBRDMsIDB4QkU2NTFEQkEsIDB4Rjc1OTYwOUQsIDB4NEYzQjYxNDMsIDB4MDYwNzFDNjQsIDB4REQ0MzlCMEQsIDB4OTQ3RkU2MkEsIDB4NkUyNkUzMkUsCisgICAgMHgyNzFBOUUwOSwgMHhGQzVFMTk2MCwgMHhCNTYyNjQ0NywgMHg4OTc2NkMyRCwgMHhDMDRBMTEwQSwgMHgxQjBFOTY2MywgMHg1MjMyRUI0NCwgMHhBODZCRUU0MCwKKyAgICAweEUxNTc5MzY3LCAweDNBMTMxNDBFLCAweDczMkY2OTI5LCAweENCNEQ2OEY3LCAweDgyNzExNUQwLCAweDU5MzU5MkI5LCAweDEwMDlFRjlFLCAweEVBNTBFQTlBLAorICAgIDB4QTM2Qzk3QkQsIDB4NzgyODEwRDQsIDB4MzExNDZERjMsIDB4MUEwMENCMzIsIDB4NTMzQ0I2MTUsIDB4ODg3ODMxN0MsIDB4QzE0NDRDNUIsIDB4M0IxRDQ5NUYsCisgICAgMHg3MjIxMzQ3OCwgMHhBOTY1QjMxMSwgMHhFMDU5Q0UzNiwgMHg1ODNCQ0ZFOCwgMHgxMTA3QjJDRiwgMHhDQTQzMzVBNiwgMHg4MzdGNDg4MSwgMHg3OTI2NEQ4NSwKKyAgICAweDMwMUEzMEEyLCAweEVCNUVCN0NCLCAweEEyNjJDQUVDLCAweDlFNzZDMjg2LCAweEQ3NEFCRkExLCAweDBDMEUzOEM4LCAweDQ1MzI0NUVGLCAweEJGNkI0MEVCLAorICAgIDB4RjY1NzNEQ0MsIDB4MkQxM0JBQTUsIDB4NjQyRkM3ODIsIDB4REM0REM2NUMsIDB4OTU3MUJCN0IsIDB4NEUzNTNDMTIsIDB4MDcwOTQxMzUsIDB4RkQ1MDQ0MzEsCisgICAgMHhCNDZDMzkxNiwgMHg2RjI4QkU3RiwgMHgyNjE0QzM1OCwgMHgxNzAwQUVBQiwgMHg1RTNDRDM4QywgMHg4NTc4NTRFNSwgMHhDQzQ0MjlDMiwgMHgzNjFEMkNDNiwKKyAgICAweDdGMjE1MUUxLCAweEE0NjVENjg4LCAweEVENTlBQkFGLCAweDU1M0JBQTcxLCAweDFDMDdENzU2LCAweEM3NDM1MDNGLCAweDhFN0YyRDE4LCAweDc0MjYyODFDLAorICAgIDB4M0QxQTU1M0IsIDB4RTY1RUQyNTIsIDB4QUY2MkFGNzUsIDB4OTM3NkE3MUYsIDB4REE0QURBMzgsIDB4MDEwRTVENTEsIDB4NDgzMjIwNzYsIDB4QjI2QjI1NzIsCisgICAgMHhGQjU3NTg1NSwgMHgyMDEzREYzQywgMHg2OTJGQTIxQiwgMHhEMTREQTNDNSwgMHg5ODcxREVFMiwgMHg0MzM1NTk4QiwgMHgwQTA5MjRBQywgMHhGMDUwMjFBOCwKKyAgICAweEI5NkM1QzhGLCAweDYyMjhEQkU2LCAweDJCMTRBNkMxLCAweDM0MDE5NjY0LCAweDdEM0RFQjQzLCAweEE2Nzk2QzJBLCAweEVGNDUxMTBELCAweDE1MUMxNDA5LAorICAgIDB4NUMyMDY5MkUsIDB4ODc2NEVFNDcsIDB4Q0U1ODkzNjAsIDB4NzYzQTkyQkUsIDB4M0YwNkVGOTksIDB4RTQ0MjY4RjAsIDB4QUQ3RTE1RDcsIDB4NTcyNzEwRDMsCisgICAgMHgxRTFCNkRGNCwgMHhDNTVGRUE5RCwgMHg4QzYzOTdCQSwgMHhCMDc3OUZEMCwgMHhGOTRCRTJGNywgMHgyMjBGNjU5RSwgMHg2QjMzMThCOSwgMHg5MTZBMURCRCwKKyAgICAweEQ4NTY2MDlBLCAweDAzMTJFN0YzLCAweDRBMkU5QUQ0LCAweEYyNEM5QjBBLCAweEJCNzBFNjJELCAweDYwMzQ2MTQ0LCAweDI5MDgxQzYzLCAweEQzNTExOTY3LAorICAgIDB4OUE2RDY0NDAsIDB4NDEyOUUzMjksIDB4MDgxNTlFMEUsIDB4MzkwMUYzRkQsIDB4NzAzRDhFREEsIDB4QUI3OTA5QjMsIDB4RTI0NTc0OTQsIDB4MTgxQzcxOTAsCisgICAgMHg1MTIwMENCNywgMHg4QTY0OEJERSwgMHhDMzU4RjZGOSwgMHg3QjNBRjcyNywgMHgzMjA2OEEwMCwgMHhFOTQyMEQ2OSwgMHhBMDdFNzA0RSwgMHg1QTI3NzU0QSwKKyAgICAweDEzMUIwODZELCAweEM4NUY4RjA0LCAweDgxNjNGMjIzLCAweEJENzdGQTQ5LCAweEY0NEI4NzZFLCAweDJGMEYwMDA3LCAweDY2MzM3RDIwLCAweDlDNkE3ODI0LAorICAgIDB4RDU1NjA1MDMsIDB4MEUxMjgyNkEsIDB4NDcyRUZGNEQsIDB4RkY0Q0ZFOTMsIDB4QjY3MDgzQjQsIDB4NkQzNDA0REQsIDB4MjQwODc5RkEsIDB4REU1MTdDRkUsCisgICAgMHg5NzZEMDFEOSwgMHg0QzI5ODZCMCwgMHgwNTE1RkI5NywgMHgyRTAxNUQ1NiwgMHg2NzNEMjA3MSwgMHhCQzc5QTcxOCwgMHhGNTQ1REEzRiwgMHgwRjFDREYzQiwKKyAgICAweDQ2MjBBMjFDLCAweDlENjQyNTc1LCAweEQ0NTg1ODUyLCAweDZDM0E1OThDLCAweDI1MDYyNEFCLCAweEZFNDJBM0MyLCAweEI3N0VERUU1LCAweDREMjdEQkUxLAorICAgIDB4MDQxQkE2QzYsIDB4REY1RjIxQUYsIDB4OTY2MzVDODgsIDB4QUE3NzU0RTIsIDB4RTM0QjI5QzUsIDB4MzgwRkFFQUMsIDB4NzEzM0QzOEIsIDB4OEI2QUQ2OEYsCisgICAgMHhDMjU2QUJBOCwgMHgxOTEyMkNDMSwgMHg1MDJFNTFFNiwgMHhFODRDNTAzOCwgMHhBMTcwMkQxRiwgMHg3QTM0QUE3NiwgMHgzMzA4RDc1MSwgMHhDOTUxRDI1NSwKKyAgICAweDgwNkRBRjcyLCAweDVCMjkyODFCLCAweDEyMTU1NTNDLCAweDIzMDEzOENGLCAweDZBM0Q0NUU4LCAweEIxNzlDMjgxLCAweEY4NDVCRkE2LCAweDAyMUNCQUEyLAorICAgIDB4NEIyMEM3ODUsIDB4OTA2NDQwRUMsIDB4RDk1ODNEQ0IsIDB4NjEzQTNDMTUsIDB4MjgwNjQxMzIsIDB4RjM0MkM2NUIsIDB4QkE3RUJCN0MsIDB4NDAyN0JFNzgsCisgICAgMHgwOTFCQzM1RiwgMHhEMjVGNDQzNiwgMHg5QjYzMzkxMSwgMHhBNzc3MzE3QiwgMHhFRTRCNEM1QywgMHgzNTBGQ0IzNSwgMHg3QzMzQjYxMiwgMHg4NjZBQjMxNiwKKyAgICAweENGNTZDRTMxLCAweDE0MTI0OTU4LCAweDVEMkUzNDdGLCAweEU1NEMzNUExLCAweEFDNzA0ODg2LCAweDc3MzRDRkVGLCAweDNFMDhCMkM4LCAweEM0NTFCN0NDLAorICAgIDB4OEQ2RENBRUIsIDB4NTYyOTREODIsIDB4MUYxNTMwQTV9OworCisjaWZuZGVmIFNPRlRXQVJFX0NSQworI2RlZmluZSBVU0VfSEFSRFdBUkVfQ1JDMzJDIDEKKyNlbmRpZgorCisjaWZkZWYgVVNFX0hBUkRXQVJFX0NSQzMyQworCitzdGF0aWMgaW50IGNhY2hlZF9jcHVfc3VwcG9ydHNfY3JjMzI7IC8vIGluaXRpYWxpemVkIGJ5IGNvbnN0cnVjdG9yIGJlbG93CitzdGF0aWMgdWludDMyX3QgY3JjMzJjX2hhcmR3YXJlKHVpbnQzMl90IGNyYywgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKyNkZWZpbmUgU1NFNDJfRkVBVFVSRV9CSVQgKDEgPDwgMjApCisjZGVmaW5lIENQVUlEX0ZFQVRVUkVTIDEKKworLyoqCisgKiBDYWxsIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiB0byBkZXRlcm1pbmUgQ1BVIGZlYXR1cmUgZmxhZ3MuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBjcHVpZCh1aW50MzJfdCBlYXhfaW4pIHsKKyAgdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4OworIyAgaWYgZGVmaW5lZChfX1BJQ19fKSAmJiAhZGVmaW5lZChfX0xQNjRfXykKKy8vIDMyLWJpdCBQSUMgY29kZSB1c2VzIHRoZSBlYnggcmVnaXN0ZXIgZm9yIHRoZSBiYXNlIG9mZnNldCAtLQorLy8gaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIGl0IG9uIHRoZSBzdGFjaworICBhc20oInB1c2hsICUlZWJ4XG5cdCIKKyAgICAgICJjcHVpZFxuXHQiCisgICAgICAibW92bCAlJWVieCwgJVtlYnhdXG5cdCIKKyAgICAgICJwb3BsICUlZWJ4IiA6ICI9YSIgKGVheCksIFtlYnhdICI9ciIoZWJ4KSwgIj1jIihlY3gpLCAiPWQiKGVkeCkgOiAiYSIgKGVheF9pbikKKyAgICAgIDogImNjIik7CisjICBlbHNlCisgIGFzbSgiY3B1aWQiIDogIj1hIiAoZWF4KSwgIj1iIihlYngpLCAiPWMiKGVjeCksICI9ZCIoZWR4KSA6ICJhIihlYXhfaW4pCisgICAgICA6ICJjYyIpOworIyAgZW5kaWYKKworICByZXR1cm4gZWN4OworfQorCisvLworLy8gRGVmaW5pdGlvbnMgb2YgdGhlIFNTRTQuMiBjcmMzMiBvcGVyYXRpb25zLiBVc2luZyB0aGVzZSBpbnN0ZWFkIG9mCisvLyB0aGUgR0NDIF9fYnVpbHRpbl8qIGludHJpbnNpY3MgYWxsb3dzIHRoaXMgY29kZSB0byBjb21waWxlIHdpdGhvdXQKKy8vIC1tc3NlNC4yLCBzaW5jZSB3ZSBkbyBkeW5hbWljIENQVSBkZXRlY3Rpb24gYXQgcnVudGltZS4KKy8vCisKK2lubGluZSB1aW50NjRfdCBfbW1fY3JjMzJfdTY0KHVpbnQ2NF90IGNyYywgdWludDY0X3QgdmFsdWUpIHsKKyAgYXNtKCJjcmMzMnEgJVt2YWx1ZV0sICVbY3JjXVxuIiA6IFtjcmNdICIrciIgKGNyYykgOiBbdmFsdWVdICJybSIgKHZhbHVlKSk7CisgIHJldHVybiBjcmM7Cit9CisKK2lubGluZSB1aW50MzJfdCBfbW1fY3JjMzJfdTMyKHVpbnQzMl90IGNyYywgdWludDMyX3QgdmFsdWUpIHsKKyAgYXNtKCJjcmMzMmwgJVt2YWx1ZV0sICVbY3JjXVxuIiA6IFtjcmNdICIrciIgKGNyYykgOiBbdmFsdWVdICJybSIgKHZhbHVlKSk7CisgIHJldHVybiBjcmM7Cit9CisKK2lubGluZSB1aW50MzJfdCBfbW1fY3JjMzJfdTE2KHVpbnQzMl90IGNyYywgdWludDE2X3QgdmFsdWUpIHsKKyAgYXNtKCJjcmMzMncgJVt2YWx1ZV0sICVbY3JjXVxuIiA6IFtjcmNdICIrciIgKGNyYykgOiBbdmFsdWVdICJybSIgKHZhbHVlKSk7CisgIHJldHVybiBjcmM7Cit9CisKK2lubGluZSB1aW50MzJfdCBfbW1fY3JjMzJfdTgodWludDMyX3QgY3JjLCB1aW50OF90IHZhbHVlKSB7CisgIGFzbSgiY3JjMzJiICVbdmFsdWVdLCAlW2NyY11cbiIgOiBbY3JjXSAiK3IiIChjcmMpIDogW3ZhbHVlXSAicm0iICh2YWx1ZSkpOworICByZXR1cm4gY3JjOworfQorCisvKioKKyAqIEhhcmR3YXJlLWFjY2VsZXJhdGVkIENSQzMyQyBjYWxjdWxhdGlvbiB1c2luZyB0aGUgNjQtYml0IGluc3RydWN0aW9ucy4KKyAqLworc3RhdGljIHVpbnQzMl90IGNyYzMyY19oYXJkd2FyZSh1aW50MzJfdCBjcmMsIGNvbnN0IHVpbnQ4X3QqIHBfYnVmLCBzaXplX3QgbGVuZ3RoKSB7CisgIC8vIHN0YXJ0IGRpcmVjdGx5IGF0IHBfYnVmLCBldmVuIGlmIGl0J3MgYW4gdW5hbGlnbmVkIGFkZHJlc3MuIEFjY29yZGluZworICAvLyB0byB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mIHRoaXMgY29kZSwgZG9pbmcgYSBzbWFsbCBydW4gb2Ygc2luZ2xlIGJ5dGVzCisgIC8vIHRvIHdvcmQtYWxpZ24gdGhlIDY0LWJpdCBpbnN0cnVjdGlvbnMgZG9lc24ndCBzZWVtIHRvIGhlbHAsIGJ1dAorICAvLyB3ZSBoYXZlbid0IHJlY29uZmlybWVkIHRob3NlIGJlbmNobWFya3Mgb3Vyc2VsdmVzLgorICB1aW50NjRfdCBjcmM2NGJpdCA9IGNyYzsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLyBzaXplb2YodWludDY0X3QpOyBpKyspIHsKKyAgICBjcmM2NGJpdCA9IF9tbV9jcmMzMl91NjQoY3JjNjRiaXQsICoodWludDY0X3QqKSBwX2J1Zik7CisgICAgcF9idWYgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgfQorCisgIC8vIFRoaXMgdWdseSBzd2l0Y2ggaXMgc2xpZ2h0bHkgZmFzdGVyIGZvciBzaG9ydCBzdHJpbmdzIHRoYW4gdGhlIHN0cmFpZ2h0Zm9yd2FyZCBsb29wCisgIHVpbnQzMl90IGNyYzMyYml0ID0gKHVpbnQzMl90KSBjcmM2NGJpdDsKKyAgbGVuZ3RoICY9IHNpemVvZih1aW50NjRfdCkgLSAxOworICBzd2l0Y2ggKGxlbmd0aCkgeworICAgIGNhc2UgNzoKKyAgICBjcmMzMmJpdCA9IF9tbV9jcmMzMl91OChjcmMzMmJpdCwgKnBfYnVmKyspOworICAgIGNhc2UgNjoKKyAgICBjcmMzMmJpdCA9IF9tbV9jcmMzMl91MTYoY3JjMzJiaXQsICoodWludDE2X3QqKSBwX2J1Zik7CisgICAgcF9idWYgKz0gMjsKKyAgICAvLyBjYXNlIDUgaXMgYmVsb3c6IDQgKyAxCisgICAgY2FzZSA0OgorICAgIGNyYzMyYml0ID0gX21tX2NyYzMyX3UzMihjcmMzMmJpdCwgKih1aW50MzJfdCopIHBfYnVmKTsKKyAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgY3JjMzJiaXQgPSBfbW1fY3JjMzJfdTgoY3JjMzJiaXQsICpwX2J1ZisrKTsKKyAgICBjYXNlIDI6CisgICAgY3JjMzJiaXQgPSBfbW1fY3JjMzJfdTE2KGNyYzMyYml0LCAqKHVpbnQxNl90KikgcF9idWYpOworICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICBjcmMzMmJpdCA9IF9tbV9jcmMzMl91MzIoY3JjMzJiaXQsICoodWludDMyX3QqKSBwX2J1Zik7CisgICAgcF9idWYgKz0gNDsKKyAgICBjYXNlIDE6CisgICAgY3JjMzJiaXQgPSBfbW1fY3JjMzJfdTgoY3JjMzJiaXQsICpwX2J1Zik7CisgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyBlbmFibGUgaW4gZGVidWcgY29kZQorICAgIGFzc2VydCgwICYmICJlbmRlZCB1cCB3aXRoIDggb3IgbW9yZSBieXRlcyBhdCB0YWlsIG9mIGNhbGN1bGF0aW9uIik7CisgIH0KKworICByZXR1cm4gY3JjMzJiaXQ7Cit9CisKKy8qKgorICogT24gbGlicmFyeSBsb2FkLCBpbml0aWFpbGl6ZSB0aGUgY2FjaGVkIHZhbHVlIGFib3ZlIGZvcgorICogd2hldGhlciB0aGUgY3B1IHN1cHBvcnRzIFNTRTQuMidzIGNyYzMyIGluc3RydWN0aW9uLgorICovCit2b2lkIF9fYXR0cmlidXRlX18gKChjb25zdHJ1Y3RvcikpIGluaXRfY3B1X3N1cHBvcnRfZmxhZyh2b2lkKSB7CisgIHVpbnQzMl90IGVjeCA9IGNwdWlkKENQVUlEX0ZFQVRVUkVTKTsKKyAgY2FjaGVkX2NwdV9zdXBwb3J0c19jcmMzMiA9IGVjeCAmIFNTRTQyX0ZFQVRVUkVfQklUOworfQorCisjZW5kaWYKKworLyoqCisgKiBDb21wdXRlcyB0aGUgQ1JDMzJjIGNoZWNrc3VtIGZvciB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB1c2luZyB0aGUgc2xpY2luZyBieSA4CisgKiBhbGdvcml0aG0gb3ZlciA2NCBiaXQgcXVhbnRpdGllcy4KKyAqLwordWludDMyX3QgY3JjMzJjX3NiOF9zb2Z0d2FyZSh1aW50MzJfdCBjcmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkgeworICB1aW50MzJfdCBydW5uaW5nX2xlbmd0aCA9ICgobGVuZ3RoKSAvIDgpICogODsKKyAgdWludDMyX3QgZW5kX2J5dGVzID0gbGVuZ3RoIC0gcnVubmluZ19sZW5ndGg7CisgIHVpbnQzMl90IGxpOworICBmb3IgKGxpID0gMDsgbGkgPCBydW5uaW5nX2xlbmd0aCAvIDg7IGxpKyspIHsKKyAgICBjcmMgXj0gKih1aW50MzJfdCAqKWJ1ZjsKKyAgICBidWYgKz0gNDsKKyAgICB1aW50MzJfdCB0ZXJtMSA9IENSQzMyQ19UOF83W2NyYyAmIDB4MDAwMDAwRkZdIF4gQ1JDMzJDX1Q4XzZbKGNyYyA+PiA4KSAmIDB4MDAwMDAwRkZdOworICAgIHVpbnQzMl90IHRlcm0yID0gY3JjID4+IDE2OworICAgIGNyYyA9IHRlcm0xIF4gQ1JDMzJDX1Q4XzVbdGVybTIgJiAweDAwMDAwMEZGXSBeIENSQzMyQ19UOF80Wyh0ZXJtMiA+PiA4KSAmIDB4MDAwMDAwRkZdOworICAgIHRlcm0xID0gQ1JDMzJDX1Q4XzNbKCoodWludDMyX3QgKilidWYpICYgMHgwMDAwMDBGRl0KKyAgICAgICAgXiBDUkMzMkNfVDhfMlsoKCoodWludDMyX3QgKilidWYpID4+IDgpICYgMHgwMDAwMDBGRl07CisKKyAgICB0ZXJtMiA9ICgqKHVpbnQzMl90ICopYnVmKSA+PiAxNjsKKyAgICBjcmMgPSBjcmMgXiB0ZXJtMSBeIENSQzMyQ19UOF8xW3Rlcm0yICYgMHgwMDAwMDBGRl0gXiBDUkMzMkNfVDhfMFsodGVybTIgPj4gOCkgJiAweDAwMDAwMEZGXTsKKyAgICBidWYgKz0gNDsKKyAgfQorICBmb3IgKGxpID0gMDsgbGkgPCBlbmRfYnl0ZXM7IGxpKyspIHsKKyAgICBjcmMgPSBDUkMzMkNfVDhfMFsoY3JjIF4gKmJ1ZisrKSAmIDB4MDAwMDAwRkZdIF4gKGNyYyA+PiA4KTsKKyAgfQorICByZXR1cm4gY3JjOworfQorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgbGlrZWx5KHgpICAgICAgIF9fYnVpbHRpbl9leHBlY3QoKHgpLDEpCisjZGVmaW5lIHVubGlrZWx5KHgpICAgICBfX2J1aWx0aW5fZXhwZWN0KCh4KSwwKQorI2Vsc2UKKyNkZWZpbmUgbGlrZWx5KHgpICAgICAgICh4KQorI2RlZmluZSB1bmxpa2VseSh4KSAgICAgKHgpCisjZW5kaWYKKwordWludDMyX3QgY3JjMzJjX3NiOCh1aW50MzJfdCBjcmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkgeworI2lmZGVmIFVTRV9IQVJEV0FSRV9DUkMzMkMKKyAgaWYgKGxpa2VseShjYWNoZWRfY3B1X3N1cHBvcnRzX2NyYzMyKSkgeworICAgIHJldHVybiBjcmMzMmNfaGFyZHdhcmUoY3JjLCBidWYsIGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGNyYzMyY19zYjhfc29mdHdhcmUoY3JjLCBidWYsIGxlbmd0aCk7CisgIH0KKyNlbHNlCisgIHJldHVybiBjcmMzMmNfc2I4X3NvZnR3YXJlKGNyYywgYnVmLCBsZW5ndGgpOworI2VuZGlmCit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL0NoZWNrc3VtLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvQ2hlY2tzdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWFlMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL0NoZWNrc3VtLmgKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0hFQ0tTVU1fSF8KKyNkZWZpbmUgQ0hFQ0tTVU1fSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2V4dGVybiB1aW50MzJfdCBjcmMzMl9zYjgodWludDMyX3QsIGNvbnN0IHVpbnQ4X3QgKiwgc2l6ZV90KTsKK2V4dGVybiB1aW50MzJfdCBjcmMzMmNfc2I4KHVpbnQzMl90LCBjb25zdCB1aW50OF90ICosIHNpemVfdCk7CisKK2VudW0gQ2hlY2tzdW1UeXBlIHsKKyAgQ0hFQ0tTVU1fTk9ORSwKKyAgQ0hFQ0tTVU1fQ1JDMzIsCisgIENIRUNLU1VNX0NSQzMyQywKK307CisKK2NsYXNzIENoZWNrc3VtIHsKK3B1YmxpYzoKKyAgc3RhdGljIHVpbnQzMl90IGluaXQoQ2hlY2tzdW1UeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENIRUNLU1VNX05PTkU6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIENIRUNLU1VNX0NSQzMyOgorICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CisgICAgY2FzZSBDSEVDS1NVTV9DUkMzMkM6CisgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGF0aWMgdm9pZCB1cGRhdGUoQ2hlY2tzdW1UeXBlIHR5cGUsIHVpbnQzMl90ICYgdmFsdWUsIGNvbnN0IHZvaWQgKiBidWZmLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENIRUNLU1VNX05PTkU6CisgICAgICByZXR1cm47CisgICAgY2FzZSBDSEVDS1NVTV9DUkMzMjoKKyAgICAgIHZhbHVlID0gY3JjMzJfc2I4KHZhbHVlLCAoY29uc3QgdWludDhfdCAqKWJ1ZmYsIGxlbmd0aCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBDSEVDS1NVTV9DUkMzMkM6CisgICAgICB2YWx1ZSA9IGNyYzMyY19zYjgodmFsdWUsIChjb25zdCB1aW50OF90ICopYnVmZiwgbGVuZ3RoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90IGdldFZhbHVlKENoZWNrc3VtVHlwZSB0eXBlLCB1aW50MzJfdCB2YWx1ZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ0hFQ0tTVU1fTk9ORToKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgQ0hFQ0tTVU1fQ1JDMzI6CisgICAgY2FzZSBDSEVDS1NVTV9DUkMzMkM6CisgICAgICByZXR1cm4gfnZhbHVlOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogQ0hFQ0tTVU1fSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9EdWFsUGl2b3RRdWlja1NvcnQuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9EdWFsUGl2b3RRdWlja1NvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMwMTNiCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL0R1YWxQaXZvdFF1aWNrU29ydC5oCkBAIC0wLDAgKzEsMTM3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEVUFMUElWT1RRVUlDS1NPUlRfSF8KKyNkZWZpbmUgRFVBTFBJVk9UUVVJQ0tTT1JUX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworLy8gVE9ETzogZGVmaW5pdGVseSBuZWVkcyByZWZhY3RvcmluZy4uCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcGFyZT4KK3ZvaWQgRHVhbFBpdm90UXVpY2tzb3J0KHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAmIGVsZW1lbnRzLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgZGl2LAorICAgIF9Db21wYXJlIGNvbXBhcmUpIHsKKworICBpZiAobGVmdCA+PSByaWdodCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHVpbnQzMl90ICogZSA9ICYoZWxlbWVudHNbMF0pOworICBpbnQgbGVuID0gcmlnaHQgLSBsZWZ0OworCisgIGlmIChsZW4gPCAyNykgeyAvLyBpbnNlcnRpb24gc29ydCBmb3IgdGlueSBhcnJheQorICAgIGZvciAoaW50IGkgPSBsZWZ0ICsgMTsgaSA8PSByaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGludCBqID0gaTsgaiA+IGxlZnQgJiYgY29tcGFyZShlW2ogLSAxXSwgZVtqXSkgPiAwOyAtLWopIHsKKyAgICAgICAgc3RkOjpzd2FwKGVbal0sIGVbaiAtIDFdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IHRoaXJkID0gbGVuIC8gZGl2OworCisgIC8vICJtZWRpYW5zIgorICBpbnQgbTEgPSBsZWZ0ICsgdGhpcmQ7CisgIGludCBtMiA9IHJpZ2h0IC0gdGhpcmQ7CisKKyAgaWYgKG0xIDw9IGxlZnQpIHsKKyAgICBtMSA9IGxlZnQgKyAxOworICB9CisgIGlmIChtMiA+PSByaWdodCkgeworICAgIG0yID0gcmlnaHQgLSAxOworICB9CisgIGlmIChjb21wYXJlKGVbbTFdLCBlW20yXSkgPCAwKSB7CisgICAgc3RkOjpzd2FwKGVbbTFdLCBlW2xlZnRdKTsKKyAgICBzdGQ6OnN3YXAoZVttMl0sIGVbcmlnaHRdKTsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnN3YXAoZVttMV0sIGVbcmlnaHRdKTsKKyAgICBzdGQ6OnN3YXAoZVttMl0sIGVbbGVmdF0pOworICB9CisKKyAgLy8gcGl2b3QgaWR4CisgIGludCBwaXZvdDEgPSBsZWZ0OworICBpbnQgcGl2b3QyID0gcmlnaHQ7CisKKyAgLy8gcG9pbnRlcnMKKyAgaW50IGxlc3MgPSBsZWZ0ICsgMTsKKyAgaW50IGdyZWF0ID0gcmlnaHQgLSAxOworCisgIC8vIHNvcnRpbmcKKyAgZm9yIChpbnQgayA9IGxlc3M7IGsgPD0gZ3JlYXQ7IGsrKykgeworICAgIGlmIChjb21wYXJlKGVba10sIGVbcGl2b3QxXSkgPCAwKSB7CisgICAgICBzdGQ6OnN3YXAoZVtrXSwgZVtsZXNzXSk7CisgICAgICBsZXNzKys7CisgICAgfSBlbHNlIGlmIChjb21wYXJlKGVba10sIGVbcGl2b3QyXSkgPiAwKSB7CisgICAgICB3aGlsZSAoayA8IGdyZWF0ICYmIGNvbXBhcmUoZVtncmVhdF0sIGVbcGl2b3QyXSkgPiAwKSB7CisgICAgICAgIC0tZ3JlYXQ7CisgICAgICB9CisgICAgICBzdGQ6OnN3YXAoZVtrXSwgZVtncmVhdF0pOworICAgICAgZ3JlYXQtLTsKKworICAgICAgaWYgKGNvbXBhcmUoZVtrXSwgZVtwaXZvdDFdKSA8IDApIHsKKyAgICAgICAgc3RkOjpzd2FwKGVba10sIGVbbGVzc10pOworICAgICAgICBsZXNzKys7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIHN3YXBzCisgIGludCBkaXN0ID0gZ3JlYXQgLSBsZXNzOworCisgIGlmIChkaXN0IDwgMTMpIHsKKyAgICArK2RpdjsKKyAgfQorICBzdGQ6OnN3YXAoZVtsZXNzIC0gMV0sIGVbbGVmdF0pOworICBzdGQ6OnN3YXAoZVtncmVhdCArIDFdLCBlW3JpZ2h0XSk7CisKKyAgLy8gc3ViYXJyYXlzCisgIER1YWxQaXZvdFF1aWNrc29ydChlbGVtZW50cywgbGVmdCwgbGVzcyAtIDIsIGRpdiwgY29tcGFyZSk7CisgIER1YWxQaXZvdFF1aWNrc29ydChlbGVtZW50cywgZ3JlYXQgKyAyLCByaWdodCwgZGl2LCBjb21wYXJlKTsKKworICAvLyBlcXVhbCBlbGVtZW50cworICBpZiAoZGlzdCA+IGxlbiAtIDEzICYmIHBpdm90MSAhPSBwaXZvdDIpIHsKKyAgICBmb3IgKGludCBrID0gbGVzczsgayA8PSBncmVhdDsgKytrKSB7CisgICAgICBpZiAoMCA9PSBjb21wYXJlKGVba10sIGVbcGl2b3QxXSkpIHsKKyAgICAgICAgc3RkOjpzd2FwKGVba10sIGVbbGVzc10pOworICAgICAgICBsZXNzKys7CisgICAgICB9IGVsc2UgaWYgKDAgPT0gY29tcGFyZShlW2tdLCBlW3Bpdm90Ml0pKSB7CisgICAgICAgIHN0ZDo6c3dhcChlW2tdLCBlW2dyZWF0XSk7CisgICAgICAgIGdyZWF0LS07CisgICAgICAgIGlmICgwID09IGNvbXBhcmUoZVtrXSwgZVtwaXZvdDFdKSkgeworICAgICAgICAgIHN0ZDo6c3dhcChlW2tdLCBlW2xlc3NdKTsKKyAgICAgICAgICBsZXNzKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBzdWJhcnJheQorICBpZiAoY29tcGFyZShlW3Bpdm90MV0sIGVbcGl2b3QyXSkgPCAwKSB7CisgICAgRHVhbFBpdm90UXVpY2tzb3J0KGVsZW1lbnRzLCBsZXNzLCBncmVhdCwgZGl2LCBjb21wYXJlKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcGFyZT4KK3ZvaWQgRHVhbFBpdm90UXVpY2tzb3J0KHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAmIGVsZW1lbnRzLCBfQ29tcGFyZSBjb21wYXJlKSB7CisgIER1YWxQaXZvdFF1aWNrc29ydChlbGVtZW50cywgMCwgZWxlbWVudHMuc2l6ZSgpIC0gMSwgMywgY29tcGFyZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIERVQUxQSVZPVFFVSUNLU09SVF9IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1JhbmRvbS5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9SYW5kb20uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2NmIxZgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9SYW5kb20uY2MKQEAgLTAsMCArMSwyODUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAidXRpbC9SYW5kb20uaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitzdGF0aWMgbG9uZyBSYW5kb21Jbml0aWFsaXplSUQgPSA4NjgyNTIyODA3MTQ4MDEyVUxMOworCisvLyBBIHJhbmRvbSBsaXN0IG9mIDEwMDAgd29yZHMgZnJvbSAvdXNyL3NoYXJlL2RpY3Qvd29yZHMKK3N0YXRpYyBjb25zdAorY2hhciAqIFdvcmRzW10gPSB7ImRpdXJuYWxuZXNzIiwgIkhvbW9pb3VzaWFuIiwgInNwaXJhbnRoaWMiLCAidGV0cmFneW5pYW4iLCAic2lsdmVyaGVhZCIsCisgICAgInVuZ3JlYXQiLCAibGl0aG9ncmFwaCIsICJleHBsb2l0ZXIiLCAicGh5c2lvbG9naWFuIiwgImJ5IiwgImhlbGxiZW5kZXIiLCAiRmlsaXBlbmR1bGEiLAorICAgICJ1bmRldGVycmluZyIsICJhbnRpc2NvbGljIiwgInBlbnRhZ2FtaXN0IiwgImh5cG9pZCIsICJjYWN1bWluYWwiLCAic2VydHVsYXJpYW4iLAorICAgICJzY2hvb2xtYXN0ZXJpc20iLCAibm9udXBsZSIsICJnYWxseWJlZ2dhciIsICJwaHl0b25pYyIsICJzd2VhcmluZ2x5IiwgIm5lYnVsYXIiLCAiQ29uZmVydmFsZXMiLAorICAgICJ0aGVybW9jaGVtaWNhbGx5IiwgImNoYXJhY2lub2lkIiwgImNvY2tzdXJlZG9tIiwgImZhbGxhY2lvdXMiLCAiZmVhc2libGVuZXNzIiwgImRlYnJvbWluYXRpb24iLAorICAgICJwbGF5ZmVsbG93c2hpcCIsICJ0cmFtcGxpa2UiLCAidGVzdGEiLCAicGFydGljaXBhdGluZ2x5IiwgInVuYWNjZXNzaWJsZSIsICJicm9tYXRlIiwKKyAgICAiZXhwZXJpZW50aWFsaXN0IiwgInJvdWdoY2FzdCIsICJkb2NpbWFzdGljYWwiLCAiY2hvcmFsY2VsbyIsICJibGlnaHRiaXJkIiwgInBlcHRvbmF0ZSIsCisgICAgInNvbWJyZXJvZWQiLCAidW5zY2hlbWF0aXplZCIsICJhbnRpYWJvbGl0aW9uaXN0IiwgImJlc2FnbmUiLCAibWFzdGljYXRpb24iLCAiYnJvbWljIiwKKyAgICAic3ZpYXRvbm9zaXRlIiwgImNhdHRpbWFuZG9vIiwgIm1ldGFwaHJhc3RpY2FsIiwgImVuZG90aGVsaW9teW9tYSIsICJoeXN0ZXJvbHlzaXMiLAorICAgICJ1bmZ1bG1pbmF0ZWQiLCAiSGVzdGVyIiwgIm9ibG9uZ2x5IiwgImJsdXJyZWRuZXNzIiwgImF1dGhvcmxpbmciLCAiY2hhc215IiwgIlNjb3JwYWVuaWRhZSIsCisgICAgInRveGloYWVtaWEiLCAiRGljdG9ncmFwaCIsICJRdWFrZXJpc2hseSIsICJkZWFmIiwgInRpbWJlcm1vbmdlciIsICJzdHJhbW1lbCIsICJUaHJhdXBpZGFlIiwKKyAgICAic2VkaXRpb3VzIiwgInBsZXJvbWUiLCAiQXJuZWIiLCAiZXJpc3RpY2FsbHkiLCAic2VycGVudGluaWMiLCAiZ2xhdW1yaWUiLCAic29jaW9yb21hbnRpYyIsCisgICAgImFwb2NhbHlwc3QiLCAidGFydHJvdXMiLCAiQmFzc2FyaXMiLCAiYW5naW9seW1waG9tYSIsICJob3JzZWZseSIsICJrZW5ubyIsICJhc3Ryb25vbWl6ZSIsCisgICAgImV1cGhlbWlvdXMiLCAiYXJzZW5pZGUiLCAidW50b25ndWVkIiwgInBhcmFib2xpY25lc3MiLCAidXZhbml0ZSIsICJoZWxwbGVzcyIsICJnZW1tZW91cyIsCisgICAgInN0b3JteSIsICJ0ZW1wbGFyIiwgImVyeXRocm9kZXh0cmluIiwgImNvbWlzbSIsICJpbnRlcmZyYXRlcm5hbCIsICJwcmVwYXJhdGl2ZSIsICJwYXJhc3RhcyIsCisgICAgImZyb250b29yYml0YWwiLCAiT3BoaW9zYXVydXMiLCAiZGlvcHNpZGUiLCAic2Vyb3Nhbmd1aW5lb3VzIiwgInVudW5pZm9ybWx5IiwgImthcnlvbG9naWNhbCIsCisgICAgImNvbGxlZ2lhbiIsICJhbGxvdHJvcGljIiwgImRlcHJhdml0eSIsICJhbXlsb2dlbmVzaXMiLCAicmVmb3JtYXRvcnkiLCAiZXBpZHltaWRlcyIsCisgICAgInBsZXVyb3Ryb3BvdXMiLCAidHJpbGxpdW0iLCAiZGFzdGFyZGxpbmVzcyIsICJjb2FkdmljZSIsICJlbWJyeW90aWMiLCAiYmVudGhvbmljIiwKKyAgICAicG9taWZlcm91cyIsICJmaWd1cmVoZWFkc2hpcCIsICJNZWdhbHVyaWRhZSIsICJIYXJwYSIsICJmcmVuYWwiLCAiY29tbW90aW9uIiwgImFidGhhaW5yeSIsCisgICAgImNvYmVsaWV2ZXIiLCAibWFuaWxsYSIsICJzcGljaWZlcm91cyIsICJuYXRpdmVuZXNzIiwgIm9iaXNwbyIsICJtb25pbGlvaWQiLCAiYmlvcHNpYyIsCisgICAgInZhbHZ1bGEiLCAiZW50ZXJvc3RvbXkiLCAicGxhbm9zdWJ1bGF0ZSIsICJwdGVyb3N0aWdtYSIsICJsaWZ0ZXIiLCAidHJpcmFkaWF0ZWQiLCAidmVuaWFsbmVzcyIsCisgICAgInR1bSIsICJhcmNoaXN0b21lIiwgInRhdXRuZXNzIiwgInVuc3dhbmxpa2UiLCAiYW50aXZlbmluIiwgIkxlbnRpYnVsYXJpYWNlYWUiLCAiVHJpcGhvcmEiLAorICAgICJhbmdpb3BhdGh5IiwgImFudGEiLCAiRGF3c29uaWEiLCAiYmVjb21tYSIsICJZYW5uaWdhbiIsICJ3aW50ZXJwcm9vZiIsICJhbnRhbGdvbCIsICJoYXJyIiwKKyAgICAidW5kZXJvZ2F0aW5nIiwgImluZXVudCIsICJjb3JuYmVycnkiLCAiZmxpcHBhbnRuZXNzIiwgInNjeXBob3N0b21hIiwgImFwcHJvYmF0aW9uIiwgIkdoZW50IiwKKyAgICAiTWFjcmF1Y2hlbmlpZGFlIiwgInNjYWJiaW5lc3MiLCAidW5hbmF0b21pemVkIiwgInBob3RvZWxhc3RpY2l0eSIsICJldXJ5dGhlcm1hbCIsICJlbmF0aW9uIiwKKyAgICAicHJlcGF2ZW1lbnQiLCAiZmx1c2hnYXRlIiwgInN1YnNlcXVlbnRpYWxseSIsICJFZG8iLCAiYW50aWhlcm8iLCAiSXNva29udGFlIiwgInVuZm9ya2VkbmVzcyIsCisgICAgInBvcnJpZ2lub3VzIiwgImRheXRpbWUiLCAibm9uZXhlY3V0aXZlIiwgInRyaXNpbGljaWMiLCAibW9ycGhpb21hbmlhIiwgInBhcmFuZXBocm9zIiwKKyAgICAiYm90Y2hlZGx5IiwgImltcHVnbmF0aW9uIiwgIkRvZGVjYXRoZW9uIiwgIm9ib2x1cyIsICJ1bmJ1cm50IiwgInByb3ZlZG9yZSIsICJBa3Rpc3RldGFlIiwKKyAgICAic3VwZXJpbmRpZmZlcmVuY2UiLCAiQWxldGhlYSIsICJKb2FjaGltaXRlIiwgImN5YW5vcGhpbG91cyIsICJjaG9yb2dyYXBoIiwgImJyb29reSIsICJmaWd1cmVkIiwKKyAgICAicGVyaWNsaXRhdGlvbiIsICJxdWludGV0dGUiLCAiaG9uZG8iLCAib3JuaXRob2RlbHBob3VzIiwgInVuZWZmaWNpZW50IiwgInBvbmRzaWRlIiwgImJvZ3lkb20iLAorICAgICJsYXVyaW5veHlsb24iLCAiU2hpYWgiLCAidW5oYXJtZWQiLCAiY2FydGZ1bCIsICJub25jcnlzdGFsbGl6ZWQiLCAiYWJ1c2l2ZW5lc3MiLCAiY3JvbWxlY2giLAorICAgICJqYXBhbm5lZCIsICJyaXp6b21lZCIsICJ1bmRlcnNraW4iLCAiYWRzY2VuZGVudCIsICJhbGxlY3RvcnkiLCAiZ2VsYXRpbm91c25lc3MiLCAidm9sY2FubyIsCisgICAgInVuY29tcHJvbWlzaW5nbHkiLCAiY3ViaXQiLCAiaWRpb3RpemUiLCAidW5mdXJiZWxvd2VkIiwgInVuZGludGVkIiwgIm1hZ25ldG9vcHRpY3MiLCAiU2F2aXRhciIsCisgICAgImRpd2F0YSIsICJyYW1vc29wYWxtYXRlIiwgIlBpc2hxdW93IiwgInRvbW9ybiIsICJhcG9wZW5wdGljIiwgIkhhdmVyc2lhbiIsICJIeXN0ZXJvY2FycHVzIiwKKyAgICAidGVuIiwgIm91dGh1ZSIsICJCZXJ0YXQiLCAibWVjaGFuaXN0IiwgImFzcGFyYWdpbmljIiwgInZlbGFyaWMiLCAidG9uc3VyZSIsICJidWJibGUiLAorICAgICJQeXJhbGVzIiwgInJlZ2FyZGZ1bCIsICJnbHlwaG9ncmFwaHkiLCAiY2FsYWJhemlsbGEiLCAic2hlbGx3b3JrZXIiLCAic3RyYWRhbWV0cmljYWwiLCAiaGF2b2MiLAorICAgICJ0aGVvbG9naWNvcG9saXRpY2FsIiwgInNhd2R1c3QiLCAiZGlhdG9tYWNlb3VzIiwgImpham1hbiIsICJ0ZW1wb3JvbWFzdG9pZCIsICJTZXJyaWZlcmEiLAorICAgICJPY2huYWNlYWUiLCAiYXNwZXJzb3IiLCAidHJhaWxtYWtpbmciLCAiQmlzaGFyZWVuIiwgImRpZ2l0dWxlIiwgIm9jdG9neW5vdXMiLCAiZXBpZGlkeW1pdGlzIiwKKyAgICAic21va2VmYXJ0aGluZ3MiLCAiYmFjaWxsaXRlIiwgIm92ZXJjcm93biIsICJtYW5nb25pc20iLCAic2lycmFoIiwgInVuZGVjb3JhdGVkIiwgInBzeWNob2Z1Z2FsIiwKKyAgICAiYmlzbXV0aGlmZXJvdXMiLCAicmVjaGFyIiwgIkxlbXVyaWRhZSIsICJmcmFtZWFibGUiLCAidGhpb2RpYXpvbGUiLCAiU2NhbmljIiwKKyAgICAic3BvcnRzd29tYW5zaGlwIiwgImludGVycnVwdGVkbmVzcyIsICJhZG1pc3NvcnkiLCAib3N0ZW9wYWVkaW9uIiwgInRpbmdseSIsICJ0b21vcnJvd25lc3MiLAorICAgICJldGhub2NyYWN5IiwgInRyYWJlY3VsYXIiLCAidml0YWxseSIsICJmb3NzaWxpc20iLCAiYWR6IiwgIm1ldG9wb24iLCAicHJlZmF0b3JpYWwiLAorICAgICJleHBpc2NhdGUiLCAiZGlhdGhlcm1hY3kiLCAiY2hyb25pc3QiLCAibmlnaCIsICJnZW5lcmFsaXphYmxlIiwgImh5c3Rlcm9nZW4iLAorICAgICJhdXJvdGhpb3N1bHBodXJpYyIsICJ3aGl0bG93d29ydCIsICJkb3dudGhydXN0IiwgIlByb3Rlc3RhbnRpemUiLCAibW9uYW5kZXIiLCAiSXRlYSIsCisgICAgImNocm9ub2dyYXBoaWMiLCAic2lsaWNpemUiLCAiRHVubG9wIiwgImVlciIsICJjb21wb25lbnRhbCIsICJzcG90IiwgInBhbXBobGV0IiwgImFudGluZXVyaXRpYyIsCisgICAgInBhcmFkaXNlYW4iLCAiaW50ZXJydXB0b3IiLCAiZGViZWxsYXRvciIsICJvdmVyY3VsdHVyZWQiLCAiRmxvcmlzc2FudCIsICJoeW9jaG9saWMiLAorICAgICJwbmV1bWF0b3RoZXJhcHkiLCAidGFpbG9yZXNzIiwgInJhdmUiLCAidW5wZW9wbGUiLCAiU2ViYXN0aWFuIiwgInRoZXJtYW5lc3RoZXNpYSIsICJDb25pZmVyYWUiLAorICAgICJzd2Fja2luZyIsICJwb3N0ZXJpc2huZXNzIiwgImV0aG1vcGFsYXRhbCIsICJ3aGl0dGxlIiwgImFuYWxnaXplIiwgInNjYWJiYXJkbGVzcyIsICJuYXVnaHQiLAorICAgICJzeW1iaW9nZW5ldGljYWxseSIsICJ0cmlwIiwgInBhcm9kaXN0IiwgImNvbHVtbmlmb3JtIiwgInRydW5uZWwiLCAieWF3bGVyIiwgImdvb2R3aWxsIiwKKyAgICAicHNldWRvaGFsb2dlbiIsICJzd2FuZ3kiLCAiY2VydmlzaWFsIiwgIm1lZGlhdGVuZXNzIiwgImdlbmlpIiwgImltcHJlc2NyaWJhYmxlIiwgInBvbnkiLAorICAgICJjb25zdW1wdGlvbmFsIiwgImNhcnBvc3BvcmFuZ2lhbCIsICJwb2xlYXgiLCAiYmVzdGlsbCIsICJzdWJmZWJyaWxlIiwgInNhcHBoaXJpYyIsICJhcnJvd3dvcm0iLAorICAgICJxdWFsbWluZXNzIiwgInVsdHJhb2JzY3VyZSIsICJ0aG9yaXRlIiwgIkZvdXF1aWVyaWEiLCAiQmVybXVkaWFuIiwgInByZXNjcmliZXIiLCAiZWxlbWljaW4iLAorICAgICJ3YXJsaWtlIiwgInNlbWlhbmdsZSIsICJyb3R1bGFyIiwgIm1pc3RocmVhZCIsICJyZXR1cm5hYmlsaXR5IiwgInNlcmFwaGlzbSIsICJwcmVjb3N0YWwiLAorICAgICJxdWFycmllZCIsICJCYWJ5bG9uaXNtIiwgInNhbmdhcmVlIiwgInNlZWxmdWwiLCAicGxhY2F0b3J5IiwgInBhY2h5ZGVybW91cyIsICJib3phbCIsCisgICAgImdhbGJ1bHVzIiwgInNwZXJtYXBoeXRlIiwgImN1bWJyb3VzbmVzcyIsICJwb3BlIiwgInNpZ25pZmllciIsICJFbmRvbXljZXRhY2VhZSIsICJzaGFsbG93aXNoIiwKKyAgICAic2VxdWFjaXR5IiwgInBlcmlhcnRocml0aXMiLCAiYmF0aHlzcGhlcmUiLCAicGVudG9zdXJpYSIsICJEYWRhaXNtIiwgInNwb29rZG9tIiwKKyAgICAiQ29uc29sYW1lbnR1bSIsICJhZnRlcnByZXNzdXJlIiwgIm11dHRlciIsICJsb3VzZSIsICJvdm92aXZpcGFyb3VzIiwgImNvcmJlbCIsICJtZXRhc3RvbWEiLAorICAgICJiaXZlbnRlciIsICJIeWRyYW5nZWEiLCAiaG9nbWFjZSIsICJzZWl6aW5nIiwgIm5vbnN1cHByZXNzZWQiLCAib3JhdG9yaXplIiwgInVuY2FyZWZ1bGx5IiwKKyAgICAiYmVuem90aGlvZnVyYW4iLCAicGVudWx0IiwgImJhbGFub2NlbGUiLCAibWFjcm9wdGVyb3VzIiwgImRpc2hwYW4iLCAibWFydGVuIiwgImFic3ZvbHQiLAorICAgICJqaXJibGUiLCAicGFybWVsaW9pZCIsICJhaXJmcmVpZ2h0ZXIiLCAiYWNvY290bCIsICJhcmNoZXNwb3JpYWwiLCAiaHlwb3BsYXN0cmFsIiwgInByZW9yYWwiLAorICAgICJxdWFpbGJlcnJ5IiwgImNpbnF1ZSIsICJ0ZXJyZXN0cmlhbGx5IiwgInN0cm9raW5nIiwgImxpbXBldCIsICJtb29kaXNobmVzcyIsICJjYW5pY3VsZSIsCisgICAgImFyY2hpZGlkYXNjYWxpYW4iLCAicG9tcGlsb2lkIiwgIm92ZXJzdGFpZCIsICJpbnRyb2R1Y2VyIiwgIkl0YWxpY2FsIiwgIkNocmlzdGlhbm9wYWdhbmlzbSIsCisgICAgInByZXNjcmlwdGlibGUiLCAic3Vib2ZmaWNlciIsICJkYW5zZXVzZSIsICJjbG95IiwgInNhZ3VyYW4iLCAiZnJpY3Rpb25sZXNzbHkiLAorICAgICJkZWluZGl2aWR1YWxpemF0aW9uIiwgIkJ1bGFuZGEiLCAidmVudHJpY291cyIsICJzdWJmb2xpYXIiLCAiYmFzdG8iLCAic2NhcHVsb3JhZGlhbCIsCisgICAgInN1c3BlbmQiLCAic3RpZmZpc2giLCAiU3BoZW5vZG9udGlkYWUiLCAiZXRlcm5hbCIsICJ2ZXJiaWQiLCAibWFtbW9uaXNoIiwgInVwY3VzaGlvbiIsCisgICAgImJhcmtvbWV0ZXIiLCAiY29uY3JldGlvbiIsICJwcmVhZ2l0YXRlIiwgImluY29tcHJlaGVuc2libGUiLCAidHJpc3RpY2giLCAidmlzY2VyYWwiLAorICAgICJoZW1pbWVsdXMiLCAicGF0cm9sbGVyIiwgInN0ZW50b3JvcGhvbmljIiwgInBpbnVsdXMiLCAia2VyeWtlaW9uIiwgImJydXRpc20iLCAibW9uc3RlcnNoaXAiLAorICAgICJtZXJjaWZ1bCIsICJvdmVyaW5zdHJ1Y3QiLCAiZGVmZW5zaWJseSIsICJiZXR0ZXJtb3N0IiwgInNwbGVuYXV4ZSIsICJNb3JteXJ1cyIsCisgICAgInVucmVwcmltYW5kZWQiLCAidGF2ZXIiLCAiZWxsIiwgInByb2FjcXVpdHRhbCIsICJpbmZlc3RhdGlvbiIsICJvdmVyd292ZW4iLCAiTGluY29sbmxpa2UiLAorICAgICJjaGFjb25hIiwgIlRhbWlsIiwgImNsYXNzaWZpY2F0aW9uYWwiLCAibGViZW5zcmF1bSIsICJyZWV2ZWxhbmQiLCAiaW50dWl0aW9uIiwgIldoaWxrdXQiLAorICAgICJmb2NhbG9pZCIsICJFbGV1c2luaWFuIiwgIm1pY3JvbWVtYnJhbmUiLCAiYnlyb2FkIiwgIm5vbnJlcGV0aXRpb24iLCAiYmFjdGVyaW9ibGFzdCIsICJicmFnIiwKKyAgICAicmliYWxkcm91cyIsICJwaHl0b21hIiwgImNvdW50ZXJhbGxpYW5jZSIsICJwZWx2aW1ldHJ5IiwgInBlbGYiLCAicmVsYXN0ZXIiLCAidGhlcm1vcmVzaXN0YW50IiwKKyAgICAiYW5ldXJpc20iLCAibW9sb3NzaWMiLCAiZXVwaG9ueW0iLCAidXBzd2VsbCIsICJsYWRob29kIiwgInBoYWxsYWNlb3VzIiwgImluZXJ0bHkiLCAiZ3Vuc2hvcCIsCisgICAgInN0ZXJlb3R5cG9ncmFwaHkiLCAibGFyeW5naWMiLCAicmVmYXN0ZW4iLCAidHdpbmxpbmciLCAib2ZsZXRlIiwgImhlcGF0b3JyaGFwaHkiLAorICAgICJlbGVjdHJvdGVjaG5pY3MiLCAiY29ja2FsIiwgImd1aXRhcmlzdCIsICJ0b3BzYWlsIiwgIkNpbW1lcmlhbmlzbSIsICJsYXJrbGlrZSIsICJMbGFuZG92ZXJ5IiwKKyAgICAicHlyb2NhdGVjaG9sIiwgImltbWF0Y2hhYmxlIiwgImNob29zZXIiLCAibWV0cm9jcmF0aWMiLCAiY3JhZ2xpa2UiLCAicXVhZHJlbm5pYWwiLAorICAgICJub25wb2lzb25vdXMiLCAidW5kZXJjb2xvcmVkIiwgImtub2IiLCAidWx0cmF0ZW5zZSIsICJiYWxsYWRtb25nZXIiLCAic2xhaXQiLCAic2lhbGFkZW5pdGlzIiwKKyAgICAiYnVja2V0ZXIiLCAibWFnbmlmaWNlbnRseSIsICJ1bnN0aXB1bGF0ZWQiLCAidW5zY291cmdlZCIsICJ1bnN1cGVyY2lsaW91cyIsICJwYWNrc2FjayIsCisgICAgInBhbnNvcGhpc20iLCAic29vcmtlZSIsICJwZXJjZW50IiwgInN1YmlycmlnYXRlIiwgImNoYW1wZXIiLCAibWV0YXBvbGl0aWNzIiwgInNwaGVydWxpdGljIiwKKyAgICAiaW52b2xhdGlsZSIsICJtZXRhcGhvbmljYWwiLCAic3RhY2h5dXJhY2VvdXMiLCAic3BlY2tlZG5lc3MiLCAiYmVzcGluIiwgInByb2Jvc2NpZGlmb3JtIiwKKyAgICAiZ3VsIiwgInNxdWl0IiwgInllZWxhbWFuIiwgInBlcmlzdGVyb3BvZGUiLCAib3BhY291c25lc3MiLCAic2hpYnVpY2hpIiwgInJldGluaXplIiwgInlvdGUiLAorICAgICJtaXNleHBvc2l0aW9uIiwgImRldmlsd2lzZSIsICJwdW1wa2luaWZpY2F0aW9uIiwgInZpbm55IiwgImJvbnplIiwgImdsb3NzaW5nIiwgImRlY2FyZGluYWxpemUiLAorICAgICJ0cmFuc2NvcnRpY2FsIiwgInNlcnBob2lkIiwgImRlZXBtb3N0IiwgImd1YW5hanVhdGl0ZSIsICJ3ZW1sZXNzIiwgImFydmFsIiwgImxhbW15IiwgIkVmZmllIiwKKyAgICAiU2Fwb25hcmlhIiwgInRldHJhaGVkcmFsIiwgInByb2xpZmljeSIsICJleGNlcnB0IiwgImR1bmthZG9vIiwgIlNwZW5jZXJpc20iLCAiaW5zYXRpYXRlbHkiLAorICAgICJHaWxha2kiLCAib3JhdG9yc2hpcCIsICJhcmR1b3VzbmVzcyIsICJ1bmJhc2hmdWxuZXNzIiwgIlBpdGhlY29sb2JpdW0iLCAidW5pc2V4dWFsaXR5IiwKKyAgICAidmV0ZXJpbmFyaWFuIiwgImRldHJhY3RpdmUiLCAibGlxdWlkaXR5IiwgImFjaWRvcGhpbGUiLCAicHJvYXVjdGlvbiIsICJzdXJhbCIsICJ0b3RhcXVpbmEiLAorICAgICJWaWNoeWl0ZSIsICJ1bmluaGFiaXRlZG5lc3MiLCAiYWxsZWdlZGx5IiwgIkdvdGhpc2giLCAibWFubnkiLCAiSW5nZXIiLCAiZmx1dGlzdCIsICJ0aWNrdGljayIsCisgICAgIkx1ZGdhdGlhbiIsICJob21vdHJhbnNwbGFudCIsICJvcnRob3BlZGljYWwiLCAiZGltaW51dGl2ZWx5IiwgIm1vbm9nb25ldXRpYyIsICJLZW5pcHNpbSIsCisgICAgInNhcmNvbG9naXN0IiwgImRyb21lIiwgInN0cm9uZ2hlYXJ0ZWQiLCAiRmFtZXVzZSIsICJTd2F6aWxhbmQiLCAiYWxlbiIsICJjaGlsYmxhaW4iLAorICAgICJiZWF0YWJsZSIsICJhZ2dsb21lcmF0aWMiLCAiY29uc3RpdHV0b3IiLCAidGVuZG9tdWNvaWQiLCAicG9yZW5jZXBoYWxvdXMiLCAiYXJ0ZXJpYXNpcyIsCisgICAgImJvc2VyIiwgInRhbnRpdnkiLCAicmVkZSIsICJsaW5lYW1lbnRhbCIsICJ1bmNvbnRyYWRpY3RhYmxlbmVzcyIsICJob21lb3R5cGljYWwiLCAibWFzYSIsCisgICAgImZvbGlvdXMiLCAiZG9zc2VyZXQiLCAibmV1cm9kZWdlbmVyYXRpdmUiLCAic3VidHJhbnN2ZXJzZSIsICJDaGlhc21vZG9udGlkYWUiLAorICAgICJwYWxhZW90aGVyaW9kb250IiwgInVuc3RyZXNzZWRseSIsICJjaGFsY2l0ZXMiLCAicGlxdWFudG5lc3MiLCAibGFtcHlyaW5lIiwgIkFwbGFjZW50YWxpYSIsCisgICAgInByb2plY3RpbmciLCAiZWxhc3Rpdml0eSIsICJpc29wZWxsZXRpZXJpbiIsICJibGFkZGVyd29ydCIsICJzdHJhbmRlciIsICJhbG11ZCIsCisgICAgImluaXF1aXRvdXNseSIsICJ0aGVvbG9nYWwiLCAiYnVncmUiLCAiY2hhcmdlYWJseSIsICJpbXBlcmNlcHRpdml0eSIsICJtZXJpcXVpbm9pZGFsIiwKKyAgICAibWVzb3BoeXRlIiwgImRpdmluYXRvciIsICJwZXJmdW5jdG9yeSIsICJjb3VudGVyYXBwZWxsYW50IiwgInN5bm92aWFsIiwgImNoYXJpb3RlZXIiLAorICAgICJjcnlzdGFsbG9ncmFwaGljYWwiLCAiY29tcHJvdmluY2lhbCIsICJpbmZyYXN0YXBlZGlhbCIsICJwbGVhc3VyZWhvb2QiLCAiaW52ZW50dXJvdXMiLAorICAgICJ1bHRyYXN5c3RlbWF0aWMiLCAic3ViYW5ndWxhdGVkIiwgInN1cHJhb2Vzb3BoYWdlYWwiLCAiVmFpc2huYXZpc20iLCAidHJhbnN1ZGUiLAorICAgICJjaHJ5c29jaHJvdXMiLCAidW5ncmF2ZSIsICJyZWNvbmNpbGlhYmxlIiwgInVuaW50ZXJwbGVhZGVkIiwgImVybGtpbmciLCAid2hlcmVmcm9tIiwKKyAgICAiYXByb3NvcGlhIiwgImFudGlhZGlhcGhvcmlzdCIsICJtZXRveGF6aW5lIiwgImluY2FsY3VsYWJsZSIsICJ1bWJlbGxpYyIsICJwcmVkZWJpdCIsCisgICAgImZvdXJzcXVhcmUiLCAidW5pbW1vcnRhbCIsICJub25tYW51ZmFjdHVyZSIsICJzbGFuZ3kiLCAicHJlZGlzcHV0YW50IiwgImZhbWlsaXN0IiwKKyAgICAicHJlYWZmaWxpYXRlIiwgImZyaWFyaG9vZCIsICJjb3JlbHlzaXMiLCAiem9vbml0aWMiLCAiaGFsbG9vIiwgInBhdW5jaHkiLCAibmV1cm9taW1lc2lzIiwKKyAgICAiYWNvbml0aW5lIiwgImhhY2tuZXllZCIsICJ1bmZlZWJsZSIsICJjdWJieSIsICJhdXRvc2NoZWRpYXN0aWNhbCIsICJuYXByYXBhdGgiLCAibHlyZWJpcmQiLAorICAgICJpbmV4aXN0ZW5jeSIsICJsZXVjb3Bob2VuaWNpdGUiLCAiZmVycm9nb3NsYXJpdGUiLCAicmVwZXJ1c2UiLCAidW5jb21iYWJsZSIsICJ0YW1ibyIsCisgICAgInByb3BvZGlhbGUiLCAiZGlwbG9tYXRpemUiLCAiUnVzc2lmaWVyIiwgImNsYW5uZWQiLCAiY29yb25hIiwgIm1pY2hpZ2FuIiwgIm5vbnV0aWxpdGFyaWFuIiwKKyAgICAidHJhbnNjb3Jwb3JlYWwiLCAiYm91Z2h0IiwgIkNlcmNvc3BvcmVsbGEiLCAic3RhcGVkaXVzIiwgImdsYW5kdWxhcmx5IiwgInBpY3RvcmlhbGx5IiwgIndlaXNtIiwKKyAgICAiZGlzaWxhbmUiLCAicmFpbnByb29mIiwgIkNhcGh0b3IiLCAic2NydWJiZWQiLCAib2lub21hbmN5IiwgInBzZXVkb3hhbnRoaW5lIiwgIm5vbmx1c3Ryb3VzIiwKKyAgICAicmVkZXNlcnRpb24iLCAiT3J5em9yaWN0aW5hZSIsICJnYWxhIiwgIk15Y29nb25lIiwgInJlYXBwcmVjaWF0ZSIsICJjeWFub2d1YW5pZGluZSIsCisgICAgInNlZWluZ25lc3MiLCAiYnJlYWR3aW5uZXIiLCAibm9yZWFzdCIsICJmdXJhY2lvdXMiLCAiZXBhdWxpZXJlIiwgIm9tbmlzY3JpYmVudCIsCisgICAgIlBhc3NpZmxvcmFsZXMiLCAidW5pbmR1Y3RpdmUiLCAiaW5kdWN0aXZpdHkiLCAiT3JiaXRvbGluYSIsICJTZW1lY2FycHVzIiwgIm1pZ3JhaW5vaWQiLAorICAgICJzdGVwcmVsYXRpb25zaGlwIiwgInBobG9naXN0aWNhdGUiLCAibWVzeW1uaW9uIiwgInNsb3BlZCIsICJlZGlmaWNhdG9yIiwgImJlbmVmaWNlbnQiLCAiY3VsbSIsCisgICAgInBhbGVvcm5pdGhvbG9neSIsICJ1bnVyYmFuIiwgInRocm9ibGVzcyIsICJhbXBsZXhpZm9saWF0ZSIsICJzZXNxdWlxdWludGlsZSIsICJzYXBpZW5jZSIsCisgICAgImFzdHVjaW91cyIsICJkaXRoZXJ5IiwgImJvb3IiLCAiYW1iaXR1cyIsICJzY290Y2hpbmciLCAidWxvaWQiLCAidW5jb21wcm9taXNpbmduZXNzIiwgImhvb3ZlIiwKKyAgICAid2FpcmQiLCAibWFyc2hpbmVzcyIsICJKZXJ1c2FsZW0iLCAibWVyaWNhcnAiLCAidW5ldm9rZWQiLCAiYmVuem9wZXJveGlkZSIsICJvdXRndWVzcyIsCisgICAgInB5eGllIiwgImh5bW5pYyIsICJldXBoZW1pemUiLCAibWVuZGFjaXR5IiwgImVyeXRocmVtaWEiLCAicm9zYW5pbGluZSIsICJ1bmNoYXR0ZWxlZCIsCisgICAgImxpZW50ZXJpYSIsICJCdXNob25nbyIsICJkaWFsb2d1ZXIiLCAidW5yZXBlYWxhYmx5IiwgInJpdmV0aGVhZCIsICJhbnRpZGVmbGF0aW9uIiwKKyAgICAidmluZWdhcmlzaCIsICJtYW5nYW5vc2lkZXJpdGUiLCAiZG91YnRpbmduZXNzIiwgIm92b3B5cmlmb3JtIiwgIkNlcGhhbG9kaXNjdXMiLCAiTXVzY2ljYXBhIiwKKyAgICAiQW5pbWFsaXZvcmEiLCAiYW5naW5hIiwgInBsYW5pc3BoZXJpYyIsICJpcG9tb2VpbiIsICJjdXByb2lvZGFyZ3lyaXRlIiwgInNhbmRib3giLCAic2NyYXQiLAorICAgICJNdW5ub3BzaWRhZSIsICJzaG9sYSIsICJwZW50YWZpZCIsICJvdmVyc3R1ZGlvdXNuZXNzIiwgInRpbWVzIiwgIm5vbnByb2Zlc3Npb24iLCAiYXBwZXRpYmxlIiwKKyAgICAidmFsdnVsb3RvbXkiLCAiZ29sYWRhciIsICJ1bmlhcnRpY3VsYXIiLCAib3h5dGVycGVuZSIsICJ1bmxhcHNpbmciLCAib21lZ2EiLCAidHJvcGhvbmVtYSIsCisgICAgInNlbWlub25mbGFtbWFibGUiLCAiY2lyY3VtemVuaXRoYWwiLCAic3RhcmVyIiwgImRlcHRod2lzZSIsICJsaWJlcmF0cmVzcyIsICJ1bmxlYXZlbmVkIiwKKyAgICAidW5yZXZvbHRpbmciLCAiZ3JvdW5kbmVlZGxlIiwgInRvcGxpbmUiLCAid2FuZG9vIiwgInVtYW5naXRlIiwgIm9yZGluYW50IiwgInVuYWNoaWV2YWJsZSIsCisgICAgIm92ZXJzYW5kIiwgInNuYXJlIiwgImF2ZW5nZWZ1bCIsICJ1bmV4cGxpY2l0IiwgIm11c3RhZmluYSIsICJzb25hYmxlIiwgInJlaGFiaWxpdGF0aXZlIiwKKyAgICAiZXVsb2dpemF0aW9uIiwgInBhcGVyeSIsICJ0ZWNobm9wc3ljaG9sb2d5IiwgImltcHJlc3NvciIsICJjcmVzeWxpdGUiLCAiZW50YW1lIiwKKyAgICAidHJhbnN1ZGF0b3J5IiwgInNjb3RhbGUiLCAicGFjaHlkZXJtYXRvaWQiLCAiaW1hZ2luYXJ5IiwgInllYXQiLCAic2xpcHBlZCIsICJzdGV3YXJkc2hpcCIsCisgICAgImFkYXRvbSIsICJjb2Nrc3RvbmUiLCAic2t5c2hpbmUiLCAiaGVhdmVuZnVsIiwgImNvbXBhcmFiaWxpdHkiLCAiZXhwcm9icmF0b3J5IiwKKyAgICAiZGVybW9yaHluY2hvdXMiLCAicGFycXVldCIsICJjcmV0YWNlb3VzIiwgInZlc3BlcmFsIiwgInJhcGhpcyIsICJ1bmRhbmdlcmVkIiwgIkdsZWNvbWEiLAorICAgICJlbmdyYWluIiwgImNvdW50ZXJhY3RpdmVseSIsICJadWx1ZG9tIiwgIm9yY2hpb2NhdGFiYXNpcyIsICJBdXJpY3VsYXJpYWxlcyIsICJ3YXJyaW9yd2lzZSIsCisgICAgImV4dHJhb3JnYW5pc21hbCIsICJvdmVyYnVpbHQiLCAiYWx2ZW9saXRlIiwgInRldGNoeSIsICJ0ZXJyaWZpY25lc3MiLCAid2lkZGxlIiwKKyAgICAidW5wcmVtb25pc2hlZCIsICJyZWJpbGxpbmciLCAic2VxdWVzdHJ1bSIsICJlcXVpY29udmV4IiwgImhlbGlvY2VudHJpY2lzbSIsICJjYXRhYmFwdGlzdCIsCisgICAgIm9rb25pdGUiLCAicHJvcGhldGljaXNtIiwgImhlbG1pbnRoYWdvZ2ljIiwgImNhbHljdWxhciIsICJnaWFudGx5IiwgIndpbmdhYmxlIiwgImdvbGVtIiwKKyAgICAidW5wcm92aWRlZCIsICJjb21tYW5kaW5nbmVzcyIsICJncmVhdmUiLCAiaGFwbHkiLCAiZG9pbmEiLCAiZGVwcmVzc2luZ2x5IiwgInN1YmRlbnRhdGUiLAorICAgICJpbXBhaXJtZW50IiwgImRlY2lkYWJsZSIsICJuZXVyb3Ryb3BoaWMiLCAidW5wcmVkaWN0IiwgImJpY29ycG9yZWFsIiwgInBlbmR1bGFudCIsICJmbGF0bWFuIiwKKyAgICAiaW50cmFicmVkIiwgInRvcGxpa2UiLCAiUHJvc29icmFuY2hpYXRhIiwgImZhcnJhbnRseSIsICJ0b3hvcGxhc21vc2lzIiwgImdvcmlsbG9pZCIsCisgICAgImRpcHNvbWFuaWFjYWwiLCAiYXF1aWxpbmUiLCAiYXRsYW50aXRlIiwgImFzY2l0aWMiLCAicGVyY3Vsc2l2ZSIsICJwcm9zcGVjdGl2ZW5lc3MiLAorICAgICJzYXBvbmFjZW91cyIsICJjZW50cmlmdWdhbGl6YXRpb24iLCAiZGluaWNhbCIsICJpbmZyYXZhZ2luYWwiLCAiYmVhZHJvbGwiLCAiYWZmYWl0ZSIsCisgICAgIkhlbHZpZGlhbiIsICJ0aWNrbGVwcm9vZiIsICJhYnN0cmFjdGlvbmlzbSIsICJlbmhlZGdlIiwgIm91dHdlYWx0aCIsICJvdmVyY29udHJpYnV0ZSIsCisgICAgImNvbGRmaW5jaCIsICJneW1uYXN0aWMiLCAiUGluY2lhbiIsICJNdW55Y2hpYW4iLCAiY29kaXNqdW5jdCIsICJxdWFkIiwgImNvcmFjb21hbmRpYnVsYXIiLAorICAgICJwaG9lbmljb2Nocm9pdGUiLCAiYW1lbmRlciIsICJzZWxlY3Rpdml0eSIsICJwdXRhdGl2ZSIsICJzZW1hbnRpY2lhbiIsICJsb3Bob3RyaWNoaWMiLAorICAgICJTcGF0YW5nb2lkZWEiLCAic2FjY2hhcm9nZW5pYyIsICJpbmZlcmVudCIsICJUcmljb25vZG9udGEiLCAiYXJyZW5kYXRpb24iLCAic2hlZXBza2luIiwKKyAgICAidGF1cm9jb2xsYSIsICJidW5naG9sZSIsICJNYWNoaWF2ZWwiLCAidHJpYWtpc3RldHJhaGVkcmFsIiwgImRlaGFpcmVyIiwgInByZXp5Z2Fwb3BoeXNpYWwiLAorICAgICJjeWxpbmRyaWMiLCAicG5ldW1vbmFsZ2lhIiwgInNsZWlnaGVyIiwgImVtaXIiLCAiU29jcmF0aWNpc20iLCAibGljaXRuZXNzIiwgIm1hc3NlZGx5IiwKKyAgICAiaW5zdHJ1Y3RpdmVuZXNzIiwgInN0dXJkaWVkIiwgInJlZGVjcmVhc2UiLCAic3Rhcm9zdGEiLCAiZXZpY3RvciIsICJvcmdpYXN0aWMiLCAic3F1ZGdlIiwKKyAgICAibWVsb3BsYXN0eSIsICJUc29uZWNhbiIsICJyZXBlYWxhYmxlbmVzcyIsICJzd29vbnkiLCAibXllc3RoZXNpYSIsICJtb2xlY3VsZSIsCisgICAgImF1dG9iaW9ncmFwaGlzdCIsICJyZWNpcHJvY2F0aW9uIiwgInJlZmVjdGl2ZSIsICJ1bm9ic2VydmFudG5lc3MiLCAidHJpY2FlIiwgInVuZ291Z2VkIiwKKyAgICAiZmxvYXRhYmlsaXR5IiwgIk1lc3VhIiwgImZldGxvY2tlZCIsICJjaG9yZGFjZW50cnVtIiwgInNlZGVudGFyaW5lc3MiLCAidmFyaW91cyIsICJsYXViYW5pdGUiLAorICAgICJuZWN0b3BvZCIsICJ6ZW5pY2siLCAic2VxdWVudGlhbGx5IiwgImFuYWxnaWMiLCAiYmlvZHluYW1pY3MiLCAicG9zdHRyYXVtYXRpYyIsICJudW1taSIsCisgICAgInB5cm9hY2V0aWMiLCAiYm90IiwgInJlZGVzY2VuZCIsICJkaXNwZXJteSIsICJ1bmRpZmZ1c2l2ZSIsICJjaXJjdWxhciIsICJ0cmlsbGlvbiIsCisgICAgIlVyYW5paWRhZSIsICJwbG9yYXRpb24iLCAiZGlzY2lwdWxhciIsICJwb3RlbnRuZXNzIiwgInN1ZCIsICJIdSIsICJFcnlvbiIsICJwbHVnZ2VyIiwKKyAgICAic3ViZHJhaW5hZ2UiLCAiamhhcmFsIiwgImFic2Npc3Npb24iLCAic3VwZXJtYXJrZXQiLCAiY291bnRlcmdhYmlvbiIsICJnbGFjaWVyaXN0IiwKKyAgICAibGl0aG90cmVzaXMiLCAibWlubmllYnVzaCIsICJ6YW55aXNtIiwgImV1Y2FseXB0ZW9sIiwgInN0ZXJpbGVseSIsICJ1bnJlYWxpemUiLCAidW5wYXRjaGVkIiwKKyAgICAiaHlwb2Nob25kcmlhY2lzbSIsICJjcml0aWNhbGx5IiwgImNoZWVzZWN1dHRlciIsIH07CisKK3N0YXRpYyBzaXplX3QgV29yZHNDb3VudCA9IHNpemVvZihXb3JkcykgLyBzaXplb2YoY2hhciAqKTsKKworUmFuZG9tOjpSYW5kb20oKSB7CisgIHNldFNlZWQodGltZShOVUxMKSArIGNsb2NrKCkgKyBSYW5kb21Jbml0aWFsaXplSUQrKyk7Cit9CisKK1JhbmRvbTo6UmFuZG9tKGludDY0X3Qgc2VlZCkgeworICBpZiAoc2VlZCA9PSAtMSkgeworICAgIHNldFNlZWQodGltZShOVUxMKSArIGNsb2NrKCkgKyBSYW5kb21Jbml0aWFsaXplSUQrKyk7CisgIH0gZWxzZSB7CisgICAgc2V0U2VlZChzZWVkKTsKKyAgfQorfQorCitSYW5kb206On5SYW5kb20oKSB7CisKK30KKwordm9pZCBSYW5kb206OnNldFNlZWQoaW50NjRfdCBzZWVkKSB7CisgIF9zZWVkID0gKHNlZWQgXiBtdWx0aXBsaWVyKSAmIG1hc2s7Cit9CisKK2ludDMyX3QgUmFuZG9tOjpuZXh0KGludCBiaXRzKSB7CisgIF9zZWVkID0gKF9zZWVkICogbXVsdGlwbGllciArIGFkZGVuZCkgJiBtYXNrOworICByZXR1cm4gKGludDMyX3QpKF9zZWVkID4+ICg0OCAtIGJpdHMpKTsKK30KKworaW50MzJfdCBSYW5kb206Om5leHRfaW50MzIoKSB7CisgIHJldHVybiBuZXh0KDMyKTsKK30KKwordWludDMyX3QgUmFuZG9tOjpuZXh0X3VpbnQzMigpIHsKKyAgcmV0dXJuICh1aW50MzJfdCluZXh0KDMyKTsKK30KKwordWludDY0X3QgUmFuZG9tOjpuZXh0X3VpbnQ2NCgpIHsKKyAgcmV0dXJuICgodWludDY0X3QpKG5leHQoMzIpKSA8PCAzMikgKyBuZXh0KDMyKTsKK30KKworaW50MzJfdCBSYW5kb206Om5leHRfaW50MzIoaW50MzJfdCBuKSB7CisgIGlmICgobiAmIC1uKSA9PSBuKSAgLy8gaS5lLiwgbiBpcyBhIHBvd2VyIG9mIDIKKyAgICByZXR1cm4gKGludDMyX3QpKChuICogKGludDY0X3QpbmV4dCgzMSkpID4+IDMxKTsKKworICBpbnQzMl90IGJpdHMsIHZhbDsKKyAgZG8geworICAgIGJpdHMgPSBuZXh0KDMxKTsKKyAgICB2YWwgPSBiaXRzICUgbjsKKyAgfSB3aGlsZSAoYml0cyAtIHZhbCArIChuIC0gMSkgPCAwKTsKKyAgcmV0dXJuIHZhbDsKK30KKworZmxvYXQgUmFuZG9tOjpuZXh0RmxvYXQoKSB7CisgIHJldHVybiBuZXh0KDI0KSAvICgoZmxvYXQpKDEgPDwgMjQpKTsKK30KKworZG91YmxlIFJhbmRvbTo6bmV4dERvdWJsZSgpIHsKKyAgcmV0dXJuICgoKHVpbnQ2NF90KShuZXh0KDI2KSkgPDwgMjcpICsgbmV4dCgyNykpIC8gKGRvdWJsZSkoMUwgPDwgNTMpOworfQorCit1aW50NjRfdCBSYW5kb206Om5leHRMb2cyKCkgeworICByZXR1cm4gKHVpbnQ2NF90KWV4cDIobmV4dERvdWJsZSgpICogNjQpOworfQorCit1aW50NjRfdCBSYW5kb206Om5leHRMb2cyKHVpbnQ2NF90IHJhbmdlKSB7CisgIGRvdWJsZSByYW5nZV9yID0gbG9nMihyYW5nZSk7CisgIGRvdWJsZSB2ID0gbmV4dERvdWJsZSgpICogcmFuZ2VfcjsKKyAgcmV0dXJuICh1aW50NjRfdClleHAyKHYpOworfQorCit1aW50NjRfdCBSYW5kb206Om5leHRMb2cxMCh1aW50NjRfdCByYW5nZSkgeworICBkb3VibGUgcmFuZ2VfciA9IGxvZzEwKHJhbmdlKTsKKyAgZG91YmxlIHYgPSBuZXh0RG91YmxlKCkgKiByYW5nZV9yOworICByZXR1cm4gKHVpbnQ2NF90KXBvdygxMCwgdik7Cit9CisKK2NoYXIgUmFuZG9tOjpuZXh0Qnl0ZShjb25zdCBzdHJpbmcgJiByYW5nZSkgeworICBpZiAocmFuZ2UubGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiAoY2hhciluZXh0KDgpOworICB9IGVsc2UgeworICAgIHJldHVybiByYW5nZVtuZXh0X2ludDMyKHJhbmdlLmxlbmd0aCgpKV07CisgIH0KK30KKworc3RyaW5nIFJhbmRvbTo6bmV4dEJ5dGVzKHVpbnQzMl90IGxlbmd0aCwgY29uc3Qgc3RyaW5nICYgcmFuZ2UpIHsKKyAgc3RyaW5nIHJldChsZW5ndGgsICctJyk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgIHJldFtpXSA9IG5leHRCeXRlKHJhbmdlKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyICogUmFuZG9tOjpuZXh0V29yZChpbnQ2NF90IGxpbWl0KSB7CisgIGlmIChsaW1pdCA8IDApIHsKKyAgICByZXR1cm4gV29yZHNbbmV4dF9pbnQzMihXb3Jkc0NvdW50KV07CisgIH0KKyAgdWludDMyX3QgciA9IGxpbWl0IDwgV29yZHNDb3VudCA/IGxpbWl0IDogV29yZHNDb3VudDsKKyAgcmV0dXJuIFdvcmRzW25leHRfaW50MzIocildOworfQorCit2b2lkIFJhbmRvbTo6bmV4dFdvcmQoc3RyaW5nICYgZGVzdCwgaW50NjRfdCBsaW1pdCkgeworICBkZXN0ID0gbmV4dFdvcmQobGltaXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvUmFuZG9tLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvUmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwNjJlMAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9SYW5kb20uaApAQCAtMCwwICsxLDE0MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkFORE9NX0hfCisjZGVmaW5lIFJBTkRPTV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCisvKioKKyAqIENvcHkgb2YgamF2YS5sYW5nLlJhbmRvbSAmIHNvbWUgcmFuZG9tIHRleHQvYnl0ZXMgZ2VuZXJhdG9yCisgKi8KK2NsYXNzIFJhbmRvbSB7Citwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IG11bHRpcGxpZXIgPSAweDVERUVDRTY2RFVMTDsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgYWRkZW5kID0gMHhCTDsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgbWFzayA9ICgxVUxMIDw8IDQ4KSAtIDE7Citwcm90ZWN0ZWQ6CisgIGludDY0X3QgX3NlZWQ7CisKKyAgaW50MzJfdCBuZXh0KGludCBiaXRzKTsKK3B1YmxpYzoKKyAgUmFuZG9tKCk7CisKKyAgUmFuZG9tKGludDY0X3Qgc2VlZCk7CisKKyAgflJhbmRvbSgpOworCisgIC8qKgorICAgKiBTZXQgcmFuZG9tIHNlZWQKKyAgICovCisgIHZvaWQgc2V0U2VlZChpbnQ2NF90IHNlZWQpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHVuaWZvcm1seSBkaXN0cmlidXRlZCB1aW50MzJfdCBpbiBbSU5UX01JTiwgSU5UX01BWF0KKyAgICovCisgIGludDMyX3QgbmV4dF9pbnQzMigpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHVuaWZvcm1seSBkaXN0cmlidXRlZCB1aW50MzJfdCBpbiBbMCwodWludDMyX3QpLTEpCisgICAqLworICB1aW50MzJfdCBuZXh0X3VpbnQzMigpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHVuaWZvcm1seSBkaXN0cmlidXRlZCB1aW50NjRfdCBpbiBbMCwodWludDY0X3QpLTEpCisgICAqLworICB1aW50NjRfdCBuZXh0X3VpbnQ2NCgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHVuaWZvcm1seSBkaXN0cmlidXRlZCBpbnQzMl90IGluIFswLG4pCisgICAqLworICBpbnQzMl90IG5leHRfaW50MzIoaW50MzJfdCBuKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmV4dCBwc2V1ZG9yYW5kb20sIHVuaWZvcm1seSBkaXN0cmlidXRlZAorICAgKiB7QGNvZGUgZmxvYXR9IHZhbHVlIGJldHdlZW4ge0Bjb2RlIDAuMH0gYW5kCisgICAqIHtAY29kZSAxLjB9IGZyb20gdGhpcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcidzIHNlcXVlbmNlLgorICAgKi8KKyAgZmxvYXQgbmV4dEZsb2F0KCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG5leHQgcHNldWRvcmFuZG9tLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQKKyAgICoge0Bjb2RlIGRvdWJsZX0gdmFsdWUgYmV0d2VlbiB7QGNvZGUgMC4wfSBhbmQKKyAgICoge0Bjb2RlIDEuMH0gZnJvbSB0aGlzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yJ3Mgc2VxdWVuY2UuCisgICAqLworICBkb3VibGUgbmV4dERvdWJsZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuZXh0IHBzZXVkb3JhbmRvbSwgbG9nMi1ub3JtYWwgZGlzdHJpYnV0ZWQKKyAgICogdmFsdWUgYmV0d2VlbiBbMCwgTUFYX1VOSVQ2NF0KKyAgICovCisgIHVpbnQ2NF90IG5leHRMb2cyKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG5leHQgcHNldWRvcmFuZG9tLCBsb2cyLW5vcm1hbCBkaXN0cmlidXRlZAorICAgKiB2YWx1ZSBiZXR3ZWVuIFswLCByYW5nZV0KKyAgICovCisgIHVpbnQ2NF90IG5leHRMb2cyKHVpbnQ2NF90IHJhbmdlKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmV4dCBwc2V1ZG9yYW5kb20sIGxvZzEwLW5vcm1hbCBkaXN0cmlidXRlZAorICAgKiB2YWx1ZSBiZXR3ZWVuIFswLCByYW5nZV0KKyAgICovCisgIHVpbnQ2NF90IG5leHRMb2cxMCh1aW50NjRfdCByYW5nZSk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGJ5dGUgaW4gcmFuZ2UKKyAgICogQHBhcmFtIHJhbmdlIGUuZy4gIkFCQ0RFRkciLCAiMDEyMzQ1NjY3ODkiCisgICAqLworICBjaGFyIG5leHRCeXRlKGNvbnN0IHN0cmluZyAmIHJhbmdlKTsKKworICAvKioKKyAgICogUmV0dXJuIGJ5dGUgc2VxdWVuY2Ugb2YgPGNvZGU+bGVuZ3RoPC9jb2RlPgorICAgKiBlYWNoIGJ5dGUgaW4gdGhlIHNlcXVlbmNlIGlzIGdlbmVyYXRlZCB1c2luZworICAgKiA8Y29kZT5uZXh0Qnl0ZTwvY29kZT4KKyAgICovCisgIHN0cmluZyBuZXh0Qnl0ZXModWludDMyX3QgbGVuZ3RoLCBjb25zdCBzdHJpbmcgJiByYW5nZSk7CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIHJhbmRvbSB3b3JkIGZyb20gYSAxMDAgd29yZCBjb2xsZWN0aW9uKHNhbWUKKyAgICogYXMgUmFuZG9tVGV4dFdyaXRlciksIEp1c3QgYSB1dGlsaXR5IGZ1bmN0aW9uIHRvCisgICAqIGNvbnN0cnVjdCB0aGUgdGVzdCBkYXRhLgorICAgKiBAcGFyYW0gbGltaXQgdXNlIGZpcnN0IDxjb2RlPmxpbWl0PC9jb2RlPiB3b3JkcyBpbgorICAgKiAgICAgICAgICAgICAgdGhlIHdvcmQgY29sbGVjdGlvbgorICAgKi8KKyAgY29uc3QgY2hhciAqIG5leHRXb3JkKGludDY0X3QgbGltaXQgPSAtMSk7CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIHJhbmRvbSB3b3JkIGZyb20gYSAxMDAgd29yZCBjb2xsZWN0aW9uKHNhbWUKKyAgICogYXMgUmFuZG9tVGV4dFdyaXRlciksIEp1c3QgYSB1dGlsaXR5IGZ1bmN0aW9uIHRvCisgICAqIGNvbnN0cnVjdCB0aGUgdGVzdCBkYXRhLgorICAgKiBAcGFyYW0gZGVzdCAgYXNzaWduIHRoZSBnZW5lcmF0ZWQgd29yZCB0byBkZXN0CisgICAqIEBwYXJhbSBsaW1pdCB1c2UgZmlyc3QgPGNvZGU+bGltaXQ8L2NvZGU+IHdvcmRzIGluCisgICAqICAgICAgICAgICAgICB0aGUgd29yZCBjb2xsZWN0aW9uCisgICAqLworICB2b2lkIG5leHRXb3JkKHN0cmluZyAmIGRlc3QsIGludDY0X3QgbGltaXQgPSAtMSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBSQU5ET01fSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9TdHJpbmdVdGlsLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1N0cmluZ1V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkNzQzNQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9TdHJpbmdVdGlsLmNjCkBAIC0wLDAgKzEsMjEzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAidXRpbC9TdHJpbmdVdGlsLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworc3RyaW5nIFN0cmluZ1V0aWw6OlRvU3RyaW5nKGludDMyX3QgdikgeworICBjaGFyIHRtcFszMl07CisgIHNucHJpbnRmKHRtcCwgMzIsICIlZCIsIHYpOworICByZXR1cm4gdG1wOworfQorCitzdHJpbmcgU3RyaW5nVXRpbDo6VG9TdHJpbmcodWludDMyX3QgdikgeworICBjaGFyIHRtcFszMl07CisgIHNucHJpbnRmKHRtcCwgMzIsICIldSIsIHYpOworICByZXR1cm4gdG1wOworfQorCitzdHJpbmcgU3RyaW5nVXRpbDo6VG9TdHJpbmcoaW50NjRfdCB2KSB7CisgIGNoYXIgdG1wWzMyXTsKKyAgc25wcmludGYodG1wLCAzMiwgIiUiUFJJZDY0LCB2KTsKKyAgcmV0dXJuIHRtcDsKK30KKworc3RyaW5nIFN0cmluZ1V0aWw6OlRvU3RyaW5nKGludDY0X3QgdiwgY2hhciBwYWQsIGludDY0X3QgbGVuKSB7CisgIGNoYXIgdG1wWzMyXTsKKyAgc25wcmludGYodG1wLCAzMiwgIiUlJWMlIlBSSWQ2NCIiUFJJZDY0LCBwYWQsIGxlbik7CisgIHJldHVybiBGb3JtYXQodG1wLCB2KTsKK30KKworc3RyaW5nIFN0cmluZ1V0aWw6OlRvU3RyaW5nKHVpbnQ2NF90IHYpIHsKKyAgY2hhciB0bXBbMzJdOworICBzbnByaW50Zih0bXAsIDMyLCAiJSJQUkl1NjQsIHYpOworICByZXR1cm4gdG1wOworfQorCitzdHJpbmcgU3RyaW5nVXRpbDo6VG9TdHJpbmcoYm9vbCB2KSB7CisgIGlmICh2KSB7CisgICAgcmV0dXJuICJ0cnVlIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gImZhbHNlIjsKKyAgfQorfQorCitzdHJpbmcgU3RyaW5nVXRpbDo6VG9TdHJpbmcoZmxvYXQgdikgeworICByZXR1cm4gRm9ybWF0KCIlZiIsIHYpOworfQorCitzdHJpbmcgU3RyaW5nVXRpbDo6VG9TdHJpbmcoZG91YmxlIHYpIHsKKyAgcmV0dXJuIEZvcm1hdCgiJWxmIiwgdik7Cit9CisKK3N0cmluZyBTdHJpbmdVdGlsOjpUb0hleFN0cmluZyhjb25zdCB2b2lkICogdiwgdWludDMyX3QgbGVuKSB7CisgIHN0cmluZyByZXQgPSBzdHJpbmcobGVuICogMiwgJzAnKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgc25wcmludGYoJihyZXRbaSoyXSksIDMsICIlMDJ4IiwgKChjaGFyKil2KVtpXSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworYm9vbCBTdHJpbmdVdGlsOjp0b0Jvb2woY29uc3Qgc3RyaW5nICYgc3RyKSB7CisgIGlmIChzdHIgPT0gInRydWUiKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2ludDY0X3QgU3RyaW5nVXRpbDo6dG9JbnQoY29uc3Qgc3RyaW5nICYgc3RyKSB7CisgIHJldHVybiBzdHJ0b2xsKHN0ci5jX3N0cigpLCBOVUxMLCAxMCk7Cit9CisKK2Zsb2F0IFN0cmluZ1V0aWw6OnRvRmxvYXQoY29uc3Qgc3RyaW5nICYgc3RyKSB7CisgIHJldHVybiBzdHJ0b2Yoc3RyLmNfc3RyKCksIE5VTEwpOworfQorCitzdHJpbmcgU3RyaW5nVXRpbDo6Rm9ybWF0KGNvbnN0IGNoYXIgKiBmbXQsIC4uLikgeworICBjaGFyIHRtcFsyNTZdOworICBzdHJpbmcgZGVzdDsKKyAgdmFfbGlzdCBhbDsKKyAgdmFfc3RhcnQoYWwsIGZtdCk7CisgIGludCBsZW4gPSB2c25wcmludGYodG1wLCAyNTUsIGZtdCwgYWwpOworICB2YV9lbmQoYWwpOworICBpZiAobGVuID4gMjU1KSB7CisgICAgY2hhciAqIGRlc3RidWZmID0gbmV3IGNoYXJbbGVuICsgMV07CisgICAgdmFfc3RhcnQoYWwsIGZtdCk7CisgICAgbGVuID0gdnNucHJpbnRmKGRlc3RidWZmLCBsZW4gKyAxLCBmbXQsIGFsKTsKKyAgICB2YV9lbmQoYWwpOworICAgIGRlc3QuYXBwZW5kKGRlc3RidWZmLCBsZW4pOworICAgIGRlbGV0ZSBbXSBkZXN0YnVmZjsKKyAgfSBlbHNlIHsKKyAgICBkZXN0LmFwcGVuZCh0bXAsIGxlbik7CisgIH0KKyAgcmV0dXJuIGRlc3Q7Cit9CisKK3ZvaWQgU3RyaW5nVXRpbDo6Rm9ybWF0KHN0cmluZyAmIGRlc3QsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikgeworICBjaGFyIHRtcFsyNTZdOworICB2YV9saXN0IGFsOworICB2YV9zdGFydChhbCwgZm10KTsKKyAgaW50IGxlbiA9IHZzbnByaW50Zih0bXAsIDI1NSwgZm10LCBhbCk7CisgIGlmIChsZW4gPiAyNTUpIHsKKyAgICBjaGFyICogZGVzdGJ1ZmYgPSBuZXcgY2hhcltsZW4gKyAxXTsKKyAgICBsZW4gPSB2c25wcmludGYoZGVzdGJ1ZmYsIGxlbiArIDEsIGZtdCwgYWwpOworICAgIGRlc3QuYXBwZW5kKGRlc3RidWZmLCBsZW4pOworICB9IGVsc2UgeworICAgIGRlc3QuYXBwZW5kKHRtcCwgbGVuKTsKKyAgfQorICB2YV9lbmQoYWwpOworfQorCitzdHJpbmcgU3RyaW5nVXRpbDo6VG9Mb3dlcihjb25zdCBzdHJpbmcgJiBuYW1lKSB7CisgIHN0cmluZyByZXQgPSBuYW1lOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJldC5sZW5ndGgoKTsgaSsrKSB7CisgICAgcmV0LmF0KGkpID0gOjp0b2xvd2VyKHJldFtpXSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIFN0cmluZ1V0aWw6OlRyaW0oY29uc3Qgc3RyaW5nICYgc3RyKSB7CisgIGlmIChzdHIubGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiBzdHI7CisgIH0KKyAgc2l6ZV90IGwgPSAwOworICB3aGlsZSAobCA8IHN0ci5sZW5ndGgoKSAmJiBpc3NwYWNlKHN0cltsXSkpIHsKKyAgICBsKys7CisgIH0KKyAgaWYgKGwgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgcmV0dXJuIHN0cmluZygpOworICB9CisgIHNpemVfdCByID0gc3RyLmxlbmd0aCgpOworICB3aGlsZSAoaXNzcGFjZShzdHJbciAtIDFdKSkgeworICAgIHItLTsKKyAgfQorICByZXR1cm4gc3RyLnN1YnN0cihsLCByIC0gbCk7Cit9CisKK3ZvaWQgU3RyaW5nVXRpbDo6U3BsaXQoY29uc3Qgc3RyaW5nICYgc3JjLCBjb25zdCBzdHJpbmcgJiBzZXAsIHZlY3RvcjxzdHJpbmc+ICYgZGVzdCwgYm9vbCBjbGVhbikgeworICBpZiAoc2VwLmxlbmd0aCgpID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IGN1ciA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgc2l6ZV90IHBvczsKKyAgICBpZiAoc2VwLmxlbmd0aCgpID09IDEpIHsKKyAgICAgIHBvcyA9IHNyYy5maW5kKHNlcFswXSwgY3VyKTsKKyAgICB9IGVsc2UgeworICAgICAgcG9zID0gc3JjLmZpbmQoc2VwLCBjdXIpOworICAgIH0KKyAgICBzdHJpbmcgYWRkID0gc3JjLnN1YnN0cihjdXIsIHBvcyAtIGN1cik7CisgICAgaWYgKGNsZWFuKSB7CisgICAgICBzdHJpbmcgdHJpbWVkID0gVHJpbShhZGQpOworICAgICAgaWYgKHRyaW1lZC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgZGVzdC5wdXNoX2JhY2sodHJpbWVkKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGVzdC5wdXNoX2JhY2soYWRkKTsKKyAgICB9CisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjdXIgPSBwb3MgKyBzZXAubGVuZ3RoKCk7CisgIH0KK30KKworc3RyaW5nIFN0cmluZ1V0aWw6OkpvaW4oY29uc3QgdmVjdG9yPHN0cmluZz4gJiBzdHJzLCBjb25zdCBzdHJpbmcgJiBzZXApIHsKKyAgc3RyaW5nIHJldDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJzLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICByZXQuYXBwZW5kKHNlcCk7CisgICAgfQorICAgIHJldC5hcHBlbmQoc3Ryc1tpXSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworYm9vbCBTdHJpbmdVdGlsOjpTdGFydHNXaXRoKGNvbnN0IHN0cmluZyAmIHN0ciwgY29uc3Qgc3RyaW5nICYgcHJlZml4KSB7CisgIGlmICgocHJlZml4Lmxlbmd0aCgpID4gc3RyLmxlbmd0aCgpKQorICAgICAgfHwgKG1lbWNtcChzdHIuZGF0YSgpLCBwcmVmaXguZGF0YSgpLCBwcmVmaXgubGVuZ3RoKCkpICE9IDApKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFN0cmluZ1V0aWw6OkVuZHNXaXRoKGNvbnN0IHN0cmluZyAmIHN0ciwgY29uc3Qgc3RyaW5nICYgc3VmZml4KSB7CisgIGlmICgoc3VmZml4Lmxlbmd0aCgpID4gc3RyLmxlbmd0aCgpKSB8fAorICAgICAgKG1lbWNtcChzdHIuZGF0YSgpICsgc3RyLmxlbmd0aCgpIC0gc3VmZml4Lmxlbmd0aCgpLAorICAgICAgICAgICAgICBzdWZmaXguZGF0YSgpLCBzdWZmaXgubGVuZ3RoKCkpICE9IDApKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9TdHJpbmdVdGlsLmggYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvU3RyaW5nVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTA0ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1N0cmluZ1V0aWwuaApAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVFJJTkdVVElMX0hfCisjZGVmaW5lIFNUUklOR1VUSUxfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworY2xhc3MgU3RyaW5nVXRpbCB7CitwdWJsaWM6CisgIHN0YXRpYyBzdHJpbmcgVG9TdHJpbmcoaW50MzJfdCB2KTsKKyAgc3RhdGljIHN0cmluZyBUb1N0cmluZyh1aW50MzJfdCB2KTsKKyAgc3RhdGljIHN0cmluZyBUb1N0cmluZyhpbnQ2NF90IHYpOworICBzdGF0aWMgc3RyaW5nIFRvU3RyaW5nKGludDY0X3QgdiwgY2hhciBwYWQsIGludDY0X3QgbGVuKTsKKyAgc3RhdGljIHN0cmluZyBUb1N0cmluZyh1aW50NjRfdCB2KTsKKyAgc3RhdGljIHN0cmluZyBUb1N0cmluZyhib29sIHYpOworICBzdGF0aWMgc3RyaW5nIFRvU3RyaW5nKGZsb2F0IHYpOworICBzdGF0aWMgc3RyaW5nIFRvU3RyaW5nKGRvdWJsZSB2KTsKKyAgc3RhdGljIHN0cmluZyBUb0hleFN0cmluZyhjb25zdCB2b2lkICogdiwgdWludDMyX3QgbGVuKTsKKworICBzdGF0aWMgaW50NjRfdCB0b0ludChjb25zdCBzdHJpbmcgJiBzdHIpOworICBzdGF0aWMgYm9vbCB0b0Jvb2woY29uc3Qgc3RyaW5nICYgc3RyKTsKKyAgc3RhdGljIGZsb2F0IHRvRmxvYXQoY29uc3Qgc3RyaW5nICYgc3RyKTsKKworICBzdGF0aWMgc3RyaW5nIEZvcm1hdChjb25zdCBjaGFyICogZm10LCAuLi4pOworCisgIHN0YXRpYyB2b2lkIEZvcm1hdChzdHJpbmcgJiBkZXN0LCBjb25zdCBjaGFyICogZm10LCAuLi4pOworCisgIHN0YXRpYyBzdHJpbmcgVG9Mb3dlcihjb25zdCBzdHJpbmcgJiBuYW1lKTsKKworICBzdGF0aWMgc3RyaW5nIFRyaW0oY29uc3Qgc3RyaW5nICYgc3RyKTsKKworICBzdGF0aWMgdm9pZCBTcGxpdChjb25zdCBzdHJpbmcgJiBzcmMsIGNvbnN0IHN0cmluZyAmIHNlcCwgdmVjdG9yPHN0cmluZz4gJiBkZXN0LAorICAgICAgYm9vbCBjbGVhbiA9IGZhbHNlKTsKKworICBzdGF0aWMgc3RyaW5nIEpvaW4oY29uc3QgdmVjdG9yPHN0cmluZz4gJiBzdHJzLCBjb25zdCBzdHJpbmcgJiBzZXApOworCisgIHN0YXRpYyBib29sIFN0YXJ0c1dpdGgoY29uc3Qgc3RyaW5nICYgc3RyLCBjb25zdCBzdHJpbmcgJiBwcmVmaXgpOworICBzdGF0aWMgYm9vbCBFbmRzV2l0aChjb25zdCBzdHJpbmcgJiBzdHIsIGNvbnN0IHN0cmluZyAmIHN1ZmZpeCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBTVFJJTkdVVElMX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvU3luY1V0aWxzLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1N5bmNVdGlscy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTdhNjhkCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1N5bmNVdGlscy5jYwpAQCAtMCwwICsxLDU1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL2puaXV0aWxzLmgiCisjaW5jbHVkZSAidXRpbC9TdHJpbmdVdGlsLmgiCisjaW5jbHVkZSAidXRpbC9TeW5jVXRpbHMuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitzdGF0aWMgdm9pZCBQdGhyZWFkQ2FsbChjb25zdCBjaGFyKiBsYWJlbCwgaW50IHJlc3VsdCkgeworICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICBUSFJPV19FWENFUFRJT05fRVgoSU9FeGNlcHRpb24sICJwdGhyZWFkICVzOiAlcyIsIGxhYmVsLCBzdHJlcnJvcihyZXN1bHQpKTsKKyAgfQorfQorCitMb2NrOjpMb2NrKCkgeworICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7CisgIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJmF0dHIpOworICBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgIGludCByZXQgPSBwdGhyZWFkX211dGV4X2luaXQoJl9tdXRleCwgJmF0dHIpOworICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgaWYgKHJldCAhPSAwKSB7CisgICAgVEhST1dfRVhDRVBUSU9OX0VYKElPRXhjZXB0aW9uLCAicHRocmVhZF9tdXRleF9pbml0OiAlcyIsIHN0cmVycm9yKHJldCkpOworICB9Cit9CisKK0xvY2s6On5Mb2NrKCkgeworICBQdGhyZWFkQ2FsbCgiZGVzdHJveSBtdXRleCIsIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX211dGV4KSk7Cit9CisKK3ZvaWQgTG9jazo6bG9jaygpIHsKKyAgUHRocmVhZENhbGwoImxvY2siLCBwdGhyZWFkX211dGV4X2xvY2soJl9tdXRleCkpOworfQorCit2b2lkIExvY2s6OnVubG9jaygpIHsKKyAgUHRocmVhZENhbGwoInVubG9jayIsIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfbXV0ZXgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1N5bmNVdGlscy5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1N5bmNVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MGY4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvU3luY1V0aWxzLmgKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1lOQ1VUSUxTX0hfCisjZGVmaW5lIFNZTkNVVElMU19IXworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgX19NQUNIX18KKyNpbmNsdWRlIDxsaWJrZXJuL09TQXRvbWljLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworY2xhc3MgQ29uZGl0aW9uOworCitjbGFzcyBMb2NrIHsKK3B1YmxpYzoKKyAgTG9jaygpOworICB+TG9jaygpOworCisgIHZvaWQgbG9jaygpOworICB2b2lkIHVubG9jaygpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ29uZGl0aW9uOworICBwdGhyZWFkX211dGV4X3QgX211dGV4OworCisgIC8vIE5vIGNvcHlpbmcKKyAgTG9jayhjb25zdCBMb2NrJik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IExvY2smKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExvY2tUPgorY2xhc3MgU2NvcGVMb2NrIHsKK3B1YmxpYzoKKyAgU2NvcGVMb2NrKExvY2tUICYgbG9jaykKKyAgICAgIDogX2xvY2soJmxvY2spIHsKKyAgICBfbG9jay0+bG9jaygpOworICB9CisgIH5TY29wZUxvY2soKSB7CisgICAgX2xvY2stPnVubG9jaygpOworICB9Citwcml2YXRlOgorICBMb2NrVCAqIF9sb2NrOworCisgIC8vIE5vIGNvcHlpbmcKKyAgU2NvcGVMb2NrKGNvbnN0IFNjb3BlTG9jayYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBTY29wZUxvY2smKTsKK307CisKKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisjZW5kaWYgLyogU1lOQ1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvVGltZXIuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvVGltZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4YTlhZAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9UaW1lci5jYwpAQCAtMCwwICsxLDExNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJ1dGlsL1RpbWVyLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworI2lmZGVmIF9fTUFDSF9fCisjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgorCitzdGF0aWMgdWludDY0X3QgY2xvY2tfZ2V0KCkgeworICBjbG9ja19zZXJ2X3QgY2Nsb2NrOworICBtYWNoX3RpbWVzcGVjX3QgbXRzOworICBob3N0X2dldF9jbG9ja19zZXJ2aWNlKG1hY2hfaG9zdF9zZWxmKCksIENBTEVOREFSX0NMT0NLLCAmY2Nsb2NrKTsKKyAgY2xvY2tfZ2V0X3RpbWUoY2Nsb2NrLCAmbXRzKTsKKyAgbWFjaF9wb3J0X2RlYWxsb2NhdGUobWFjaF90YXNrX3NlbGYoKSwgY2Nsb2NrKTsKKyAgcmV0dXJuIDEwMDAwMDAwMDBVTEwgKiBtdHMudHZfc2VjICsgbXRzLnR2X25zZWM7Cit9CisKKyNlbHNlCisKK3N0YXRpYyB1aW50NjRfdCBjbG9ja19nZXQoKSB7CisgIHRpbWVzcGVjIHRzOworICBjbG9ja19nZXR0aW1lKF9QT1NJWF9DUFVUSU1FLCAmdHMpOworICByZXR1cm4gMTAwMDAwMDAwMCAqIHRzLnR2X3NlYyArIHRzLnR2X25zZWM7Cit9CisKKyNlbmRpZgorCitUaW1lcjo6VGltZXIoKSB7CisgIF9sYXN0ID0gY2xvY2tfZ2V0KCk7Cit9CisKK1RpbWVyOjp+VGltZXIoKSB7Cit9CisKK3VpbnQ2NF90IFRpbWVyOjpsYXN0KCkgeworICByZXR1cm4gX2xhc3Q7Cit9CisKK3VpbnQ2NF90IFRpbWVyOjpub3coKSB7CisgIHJldHVybiBjbG9ja19nZXQoKTsKK30KKwordm9pZCBUaW1lcjo6cmVzZXQoKSB7CisgIF9sYXN0ID0gY2xvY2tfZ2V0KCk7Cit9CisKK3N0cmluZyBUaW1lcjo6Z2V0SW50ZXJ2YWwoY29uc3QgY2hhciAqIG1zZykgeworICB1aW50NjRfdCBub3cgPSBjbG9ja19nZXQoKTsKKyAgdWludDY0X3QgaW50ZXJ2YWwgPSBub3cgLSBfbGFzdDsKKyAgX2xhc3QgPSBub3c7CisgIHJldHVybiBTdHJpbmdVdGlsOjpGb3JtYXQoIiVzIHRpbWU6ICUuNWxmcyIsIG1zZywgKGRvdWJsZSlpbnRlcnZhbCAvIDEwMDAwMDAwMDAuMCk7Cit9CisKK3N0cmluZyBUaW1lcjo6Z2V0U3BlZWQoY29uc3QgY2hhciAqIG1zZywgdWludDY0X3Qgc2l6ZSkgeworICB1aW50NjRfdCBub3cgPSBjbG9ja19nZXQoKTsKKyAgZG91YmxlIGludGVydmFsID0gKG5vdyAtIF9sYXN0KSAvIDEwMDAwMDAwMDAuMDsKKyAgX2xhc3QgPSBub3c7CisgIGRvdWJsZSBzcGVlZCA9IHNpemUgLyBpbnRlcnZhbDsKKyAgcmV0dXJuIFN0cmluZ1V0aWw6OkZvcm1hdCgiJXMgdGltZTpcdCAlMy41bGZzIHNpemU6ICUxMGxsdSBzcGVlZDogJTEyLjBsZi9zIiwgbXNnLCBpbnRlcnZhbCwgc2l6ZSwKKyAgICAgIHNwZWVkKTsKK30KKworc3RyaW5nIFRpbWVyOjpnZXRTcGVlZE0oY29uc3QgY2hhciAqIG1zZywgdWludDY0X3Qgc2l6ZSkgeworICB1aW50NjRfdCBub3cgPSBjbG9ja19nZXQoKTsKKyAgZG91YmxlIGludGVydmFsID0gKG5vdyAtIF9sYXN0KSAvIDEwMDAwMDAwMDAuMDsKKyAgX2xhc3QgPSBub3c7CisgIGRvdWJsZSBtc2l6ZSA9IHNpemUgLyAoMTAyNC4wICogMTAyNC4wKTsKKyAgZG91YmxlIHNwZWVkID0gbXNpemUgLyBpbnRlcnZhbDsKKyAgcmV0dXJuIFN0cmluZ1V0aWw6OkZvcm1hdCgiJXMgdGltZTogJTMuNWxmcyBzaXplOiAlLjNsZk0gc3BlZWQ6ICUuMmxmTS9zIiwgbXNnLCBpbnRlcnZhbCwgbXNpemUsCisgICAgICBzcGVlZCk7Cit9CisKK3N0cmluZyBUaW1lcjo6Z2V0U3BlZWQyKGNvbnN0IGNoYXIgKiBtc2csIHVpbnQ2NF90IHNpemUxLCB1aW50NjRfdCBzaXplMikgeworICB1aW50NjRfdCBub3cgPSBjbG9ja19nZXQoKTsKKyAgZG91YmxlIGludGVydmFsID0gKG5vdyAtIF9sYXN0KSAvIDEwMDAwMDAwMDAuMDsKKyAgX2xhc3QgPSBub3c7CisgIGRvdWJsZSBzcGVlZDEgPSBzaXplMSAvIGludGVydmFsOworICBkb3VibGUgc3BlZWQyID0gc2l6ZTIgLyBpbnRlcnZhbDsKKyAgcmV0dXJuIFN0cmluZ1V0aWw6OkZvcm1hdCgiJXMgdGltZTogJTMuNWxmcyBzaXplOiAlbGx1LyVsbHUgc3BlZWQ6ICUuMGxmLyUuMGxmIiwgbXNnLCBpbnRlcnZhbCwKKyAgICAgIHNpemUxLCBzaXplMiwgc3BlZWQxLCBzcGVlZDIpOworfQorCitzdHJpbmcgVGltZXI6OmdldFNwZWVkTTIoY29uc3QgY2hhciAqIG1zZywgdWludDY0X3Qgc2l6ZTEsIHVpbnQ2NF90IHNpemUyKSB7CisgIHVpbnQ2NF90IG5vdyA9IGNsb2NrX2dldCgpOworICBkb3VibGUgaW50ZXJ2YWwgPSAobm93IC0gX2xhc3QpIC8gMTAwMDAwMDAwMC4wOworICBfbGFzdCA9IG5vdzsKKyAgZG91YmxlIG1zaXplMSA9IHNpemUxIC8gKDEwMjQuMCAqIDEwMjQuMCk7CisgIGRvdWJsZSBzcGVlZDEgPSBtc2l6ZTEgLyBpbnRlcnZhbDsKKyAgZG91YmxlIG1zaXplMiA9IHNpemUyIC8gKDEwMjQuMCAqIDEwMjQuMCk7CisgIGRvdWJsZSBzcGVlZDIgPSBtc2l6ZTIgLyBpbnRlcnZhbDsKKyAgcmV0dXJuIFN0cmluZ1V0aWw6OkZvcm1hdCgiJXMgdGltZTogJTMuNWxmcyBzaXplOiAlLjNsZk0vJS4zbGZNIHNwZWVkOiAlLjJsZk0vJS4ybGZNIiwgbXNnLAorICAgICAgaW50ZXJ2YWwsIG1zaXplMSwgbXNpemUyLCBzcGVlZDEsIHNwZWVkMik7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9UaW1lci5oIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI2ZTJlNAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9UaW1lci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRJTUVSX0hfCisjZGVmaW5lIFRJTUVSX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCit1c2luZyBzdGQ6OnN0cmluZzsKKworY2xhc3MgVGltZXIgeworcHJvdGVjdGVkOgorICB1aW50NjRfdCBfbGFzdDsKK3B1YmxpYzoKKyAgVGltZXIoKTsKKyAgflRpbWVyKCk7CisKKyAgdWludDY0X3QgbGFzdCgpOworCisgIHVpbnQ2NF90IG5vdygpOworCisgIHZvaWQgcmVzZXQoKTsKKworICBzdHJpbmcgZ2V0SW50ZXJ2YWwoY29uc3QgY2hhciAqIG1zZyk7CisKKyAgc3RyaW5nIGdldFNwZWVkKGNvbnN0IGNoYXIgKiBtc2csIHVpbnQ2NF90IHNpemUpOworCisgIHN0cmluZyBnZXRTcGVlZDIoY29uc3QgY2hhciAqIG1zZywgdWludDY0X3Qgc2l6ZTEsIHVpbnQ2NF90IHNpemUyKTsKKworICBzdHJpbmcgZ2V0U3BlZWRNKGNvbnN0IGNoYXIgKiBtc2csIHVpbnQ2NF90IHNpemUpOworCisgIHN0cmluZyBnZXRTcGVlZE0yKGNvbnN0IGNoYXIgKiBtc2csIHVpbnQ2NF90IHNpemUxLCB1aW50NjRfdCBzaXplMik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCisKKyNlbmRpZiAvKiBUSU1FUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1dyaXRhYmxlVXRpbHMuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvc3JjL3V0aWwvV3JpdGFibGVVdGlscy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDM2NjgxCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1dyaXRhYmxlVXRpbHMuY2MKQEAgLTAsMCArMSwzMDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJ1dGlsL1dyaXRhYmxlVXRpbHMuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitLZXlWYWx1ZVR5cGUgSmF2YUNsYXNzVG9LZXlWYWx1ZVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBjbGF6eikgeworICBpZiAoY2xhenogPT0gIm9yZy5hcGFjaGUuaGFkb29wLmlvLlRleHQiKSB7CisgICAgcmV0dXJuIFRleHRUeXBlOworICB9CisgIGlmIChjbGF6eiA9PSAib3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZXNXcml0YWJsZSIpIHsKKyAgICByZXR1cm4gQnl0ZXNUeXBlOworICB9CisgIGlmIChjbGF6eiA9PSAib3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlIikgeworICAgIHJldHVybiBCeXRlVHlwZTsKKyAgfQorICBpZiAoY2xhenogPT0gIm9yZy5hcGFjaGUuaGFkb29wLmlvLkJvb2xlYW5Xcml0YWJsZSIpIHsKKyAgICByZXR1cm4gQm9vbFR5cGU7CisgIH0KKyAgaWYgKGNsYXp6ID09ICJvcmcuYXBhY2hlLmhhZG9vcC5pby5JbnRXcml0YWJsZSIpIHsKKyAgICByZXR1cm4gSW50VHlwZTsKKyAgfQorICBpZiAoY2xhenogPT0gIm9yZy5hcGFjaGUuaGFkb29wLmlvLkxvbmdXcml0YWJsZSIpIHsKKyAgICByZXR1cm4gTG9uZ1R5cGU7CisgIH0KKyAgaWYgKGNsYXp6ID09ICJvcmcuYXBhY2hlLmhhZG9vcC5pby5GbG9hdFdyaXRhYmxlIikgeworICAgIHJldHVybiBGbG9hdFR5cGU7CisgIH0KKyAgaWYgKGNsYXp6ID09ICJvcmcuYXBhY2hlLmhhZG9vcC5pby5Eb3VibGVXcml0YWJsZSIpIHsKKyAgICByZXR1cm4gRG91YmxlVHlwZTsKKyAgfQorICBpZiAoY2xhenogPT0gIm9yZy5hcGFjaGUuaGFkb29wLmlvLk1ENUhhc2giKSB7CisgICAgcmV0dXJuIE1ENUhhc2hUeXBlOworICB9CisgIGlmIChjbGF6eiA9PSAib3JnLmFwYWNoZS5oYWRvb3AuaW8uVkludFdyaXRhYmxlIikgeworICAgIHJldHVybiBWSW50VHlwZTsKKyAgfQorICBpZiAoY2xhenogPT0gIm9yZy5hcGFjaGUuaGFkb29wLmlvLlZMb25nV3JpdGFibGUiKSB7CisgICAgcmV0dXJuIFZMb25nVHlwZTsKKyAgfQorICByZXR1cm4gVW5rbm93blR5cGU7Cit9CisKK2ludDY0X3QgV3JpdGFibGVVdGlsczo6UmVhZFZMb25nSW5uZXIoY29uc3QgY2hhciAqIHBvcywgdWludDMyX3QgJiBsZW4pIHsKKyAgYm9vbCBuZWcgPSAqcG9zIDwgLTEyMDsKKyAgbGVuID0gbmVnID8gKC0xMTkgLSAqcG9zKSA6ICgtMTExIC0gKnBvcyk7CisgIGNvbnN0IGNoYXIgKiBlbmQgPSBwb3MgKyBsZW47CisgIGludDY0X3QgdmFsdWUgPSAwOworICB3aGlsZSAoKytwb3MgPCBlbmQpIHsKKyAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICoodWludDhfdCopcG9zOworICB9CisgIHJldHVybiBuZWcgPyAodmFsdWUgXiAtMUxMKSA6IHZhbHVlOworfQorCit1aW50MzJfdCBXcml0YWJsZVV0aWxzOjpHZXRWTG9uZ1NpemVJbm5lcihpbnQ2NF90IHZhbHVlKSB7CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICB2YWx1ZSBePSAtMUw7IC8vIHRha2Ugb25lJ3MgY29tcGxlbWVudCcKKyAgfQorCisgIGlmICh2YWx1ZSA8ICgxTEwgPDwgOCkpIHsKKyAgICByZXR1cm4gMjsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxTEwgPDwgMTYpKSB7CisgICAgcmV0dXJuIDM7CisgIH0gZWxzZSBpZiAodmFsdWUgPCAoMUxMIDw8IDI0KSkgeworICAgIHJldHVybiA0OworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDFMTCA8PCAzMikpIHsKKyAgICByZXR1cm4gNTsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxTEwgPDwgNDApKSB7CisgICAgcmV0dXJuIDY7CisgIH0gZWxzZSBpZiAodmFsdWUgPCAoMUxMIDw8IDQ4KSkgeworICAgIHJldHVybiA3OworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDFMTCA8PCA1NikpIHsKKyAgICByZXR1cm4gODsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gOTsKKyAgfQorfQorCit2b2lkIFdyaXRhYmxlVXRpbHM6OldyaXRlVkxvbmdJbm5lcihpbnQ2NF90IHYsIGNoYXIgKiBwb3MsIHVpbnQzMl90ICYgbGVuKSB7CisgIGNoYXIgYmFzZTsKKyAgaWYgKHYgPj0gMCkgeworICAgIGJhc2UgPSAtMTEzOworICB9IGVsc2UgeworICAgIHYgXj0gLTFMOyAvLyB0YWtlIG9uZSdzIGNvbXBsZW1lbnQKKyAgICBiYXNlID0gLTEyMTsKKyAgfQorICB1aW50NjRfdCB2YWx1ZSA9IHY7CisgIGlmICh2YWx1ZSA8ICgxIDw8IDgpKSB7CisgICAgKihwb3MrKykgPSBiYXNlOworICAgICoodWludDhfdCopKHBvcykgPSB2YWx1ZTsKKyAgICBsZW4gPSAyOworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMTYpKSB7CisgICAgKihwb3MrKykgPSBiYXNlIC0gMTsKKyAgICAqKHVpbnQ4X3QqKShwb3MrKykgPSB2YWx1ZSA+PiA4OworICAgICoodWludDhfdCopKHBvcykgPSB2YWx1ZTsKKyAgICBsZW4gPSAzOworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMjQpKSB7CisgICAgKihwb3MrKykgPSBiYXNlIC0gMjsKKyAgICAqKHVpbnQ4X3QqKShwb3MrKykgPSB2YWx1ZSA+PiAxNjsKKyAgICAqKHVpbnQ4X3QqKShwb3MrKykgPSB2YWx1ZSA+PiA4OworICAgICoodWludDhfdCopKHBvcykgPSB2YWx1ZTsKKyAgICBsZW4gPSA0OworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDFVTEwgPDwgMzIpKSB7CisgICAgKihwb3MrKykgPSBiYXNlIC0gMzsKKyAgICAqKHVpbnQzMl90KikocG9zKSA9IGJzd2FwKCh1aW50MzJfdCl2YWx1ZSk7CisgICAgbGVuID0gNTsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxVUxMIDw8IDQwKSkgeworICAgICoocG9zKyspID0gYmFzZSAtIDQ7CisgICAgKih1aW50MzJfdCopKHBvcykgPSBic3dhcCgodWludDMyX3QpKHZhbHVlID4+IDgpKTsKKyAgICAqKHVpbnQ4X3QqKShwb3MgKyA0KSA9IHZhbHVlOworICAgIGxlbiA9IDY7CisgIH0gZWxzZSBpZiAodmFsdWUgPCAoMVVMTCA8PCA0OCkpIHsKKyAgICAqKHBvcysrKSA9IGJhc2UgLSA1OworICAgICoodWludDMyX3QqKShwb3MpID0gYnN3YXAoKHVpbnQzMl90KSh2YWx1ZSA+PiAxNikpOworICAgICoodWludDhfdCopKHBvcyArIDQpID0gdmFsdWUgPj4gODsKKyAgICAqKHVpbnQ4X3QqKShwb3MgKyA1KSA9IHZhbHVlOworICAgIGxlbiA9IDc7CisgIH0gZWxzZSBpZiAodmFsdWUgPCAoMVVMTCA8PCA1NikpIHsKKyAgICAqKHBvcysrKSA9IGJhc2UgLSA2OworICAgICoodWludDMyX3QqKShwb3MpID0gYnN3YXAoKHVpbnQzMl90KSh2YWx1ZSA+PiAyNCkpOworICAgICoodWludDhfdCopKHBvcyArIDQpID0gdmFsdWUgPj4gMTY7CisgICAgKih1aW50OF90KikocG9zICsgNSkgPSB2YWx1ZSA+PiA4OworICAgICoodWludDhfdCopKHBvcyArIDYpID0gdmFsdWU7CisgICAgbGVuID0gODsKKyAgfSBlbHNlIHsKKyAgICAqKHBvcysrKSA9IGJhc2UgLSA3OworICAgICoodWludDY0X3QqKXBvcyA9IGJzd2FwNjQodmFsdWUpOworICAgIGxlbiA9IDk7CisgIH0KK30KKworLy8gU3RyZWFtIGludGVyZmFjZXMKK2ludDY0X3QgV3JpdGFibGVVdGlsczo6UmVhZFZMb25nKElucHV0U3RyZWFtICogc3RyZWFtKSB7CisgIGNoYXIgYnVmZlsxMF07CisgIGlmIChzdHJlYW0tPnJlYWQoYnVmZiwgMSkgIT0gMSkgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIlJlYWRWTG9uZyByZWFjaCBFT0YiKTsKKyAgfQorICB1aW50MzJfdCBsZW4gPSBEZWNvZGVWTG9uZ1NpemUoYnVmZik7CisgIGlmIChsZW4gPiAxKSB7CisgICAgaWYgKHN0cmVhbS0+cmVhZEZ1bGx5KGJ1ZmYgKyAxLCBsZW4gLSAxKSAhPSBsZW4gLSAxKSB7CisgICAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJSZWFkVkxvbmcgcmVhY2ggRU9GIik7CisgICAgfQorICB9CisgIHJldHVybiBSZWFkVkxvbmcoYnVmZiwgbGVuKTsKK30KKworaW50NjRfdCBXcml0YWJsZVV0aWxzOjpSZWFkTG9uZyhJbnB1dFN0cmVhbSAqIHN0cmVhbSkgeworICBpbnQ2NF90IHJldDsKKyAgaWYgKHN0cmVhbS0+cmVhZEZ1bGx5KCZyZXQsIDgpICE9IDgpIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJSZWFkTG9uZyByZWFjaCBFT0YiKTsKKyAgfQorICByZXR1cm4gKGludDY0X3QpYnN3YXA2NChyZXQpOworfQorCitpbnQzMl90IFdyaXRhYmxlVXRpbHM6OlJlYWRJbnQoSW5wdXRTdHJlYW0gKiBzdHJlYW0pIHsKKyAgaW50MzJfdCByZXQ7CisgIGlmIChzdHJlYW0tPnJlYWRGdWxseSgmcmV0LCA0KSAhPSA0KSB7CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiUmVhZEludCByZWFjaCBFT0YiKTsKKyAgfQorICByZXR1cm4gKGludDMyX3QpYnN3YXAocmV0KTsKK30KKworaW50MTZfdCBXcml0YWJsZVV0aWxzOjpSZWFkU2hvcnQoSW5wdXRTdHJlYW0gKiBzdHJlYW0pIHsKKyAgdWludDE2X3QgcmV0OworICBpZiAoc3RyZWFtLT5yZWFkRnVsbHkoJnJldCwgMikgIT0gMikgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIlJlYWRTaG9ydCByZWFjaCBFT0YiKTsKKyAgfQorICByZXR1cm4gKGludDE2X3QpKChyZXQgPj4gOCkgfCAocmV0IDw8IDgpKTsKK30KKworZmxvYXQgV3JpdGFibGVVdGlsczo6UmVhZEZsb2F0KElucHV0U3RyZWFtICogc3RyZWFtKSB7CisgIHVpbnQzMl90IHJldDsKKyAgaWYgKHN0cmVhbS0+cmVhZEZ1bGx5KCZyZXQsIDQpICE9IDQpIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJSZWFkRmxvYXQgcmVhY2ggRU9GIik7CisgIH0KKyAgcmV0ID0gYnN3YXAocmV0KTsKKyAgcmV0dXJuICooZmxvYXQqKSZyZXQ7Cit9CisKK3N0cmluZyBXcml0YWJsZVV0aWxzOjpSZWFkVGV4dChJbnB1dFN0cmVhbSAqIHN0cmVhbSkgeworICBpbnQ2NF90IGxlbiA9IFJlYWRWTG9uZyhzdHJlYW0pOworICBzdHJpbmcgcmV0ID0gc3RyaW5nKGxlbiwgJ1wwJyk7CisgIGlmIChzdHJlYW0tPnJlYWRGdWxseSgodm9pZCAqKXJldC5kYXRhKCksIGxlbikgIT0gbGVuKSB7CisgICAgVEhST1dfRVhDRVBUSU9OX0VYKElPRXhjZXB0aW9uLCAiUmVhZFN0cmluZyByZWFjaCBFT0YsIG5lZWQgJWQiLCBsZW4pOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0cmluZyBXcml0YWJsZVV0aWxzOjpSZWFkQnl0ZXMoSW5wdXRTdHJlYW0gKiBzdHJlYW0pIHsKKyAgaW50MzJfdCBsZW4gPSBSZWFkSW50KHN0cmVhbSk7CisgIHN0cmluZyByZXQgPSBzdHJpbmcobGVuLCAnXDAnKTsKKyAgaWYgKHN0cmVhbS0+cmVhZEZ1bGx5KCh2b2lkICopcmV0LmRhdGEoKSwgbGVuKSAhPSBsZW4pIHsKKyAgICBUSFJPV19FWENFUFRJT05fRVgoSU9FeGNlcHRpb24sICJSZWFkU3RyaW5nIHJlYWNoIEVPRiwgbmVlZCAlZCIsIGxlbik7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIFdyaXRhYmxlVXRpbHM6OlJlYWRVVEY4KElucHV0U3RyZWFtICogc3RyZWFtKSB7CisgIGludDE2X3QgbGVuID0gUmVhZFNob3J0KHN0cmVhbSk7CisgIHN0cmluZyByZXQgPSBzdHJpbmcobGVuLCAnXDAnKTsKKyAgaWYgKHN0cmVhbS0+cmVhZEZ1bGx5KCh2b2lkICopcmV0LmRhdGEoKSwgbGVuKSAhPSBsZW4pIHsKKyAgICBUSFJPV19FWENFUFRJT05fRVgoSU9FeGNlcHRpb24sICJSZWFkU3RyaW5nIHJlYWNoIEVPRiwgbmVlZCAlZCIsIGxlbik7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCit2b2lkIFdyaXRhYmxlVXRpbHM6OldyaXRlVkxvbmcoT3V0cHV0U3RyZWFtICogc3RyZWFtLCBpbnQ2NF90IHYpIHsKKyAgY2hhciBidWZmWzEwXTsKKyAgdWludDMyX3QgbGVuOworICBXcml0ZVZMb25nKHYsIGJ1ZmYsIGxlbik7CisgIHN0cmVhbS0+d3JpdGUoYnVmZiwgbGVuKTsKK30KKwordm9pZCBXcml0YWJsZVV0aWxzOjpXcml0ZUxvbmcoT3V0cHV0U3RyZWFtICogc3RyZWFtLCBpbnQ2NF90IHYpIHsKKyAgdWludDY0X3QgYmUgPSBic3dhcDY0KCh1aW50NjRfdCl2KTsKKyAgc3RyZWFtLT53cml0ZSgmYmUsIDgpOworfQorCit2b2lkIFdyaXRhYmxlVXRpbHM6OldyaXRlSW50KE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgaW50MzJfdCB2KSB7CisgIHVpbnQzMl90IGJlID0gYnN3YXAoKHVpbnQzMl90KXYpOworICBzdHJlYW0tPndyaXRlKCZiZSwgNCk7Cit9CisKK3ZvaWQgV3JpdGFibGVVdGlsczo6V3JpdGVTaG9ydChPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIGludDE2X3QgdikgeworICB1aW50MTZfdCBiZSA9IHY7CisgIGJlID0gKChiZSA+PiA4KSB8IChiZSA8PCA4KSk7CisgIHN0cmVhbS0+d3JpdGUoJmJlLCAyKTsKK30KKwordm9pZCBXcml0YWJsZVV0aWxzOjpXcml0ZUZsb2F0KE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgZmxvYXQgdikgeworICB1aW50MzJfdCBpbnR2ID0gKih1aW50MzJfdCopJnY7CisgIGludHYgPSBic3dhcChpbnR2KTsKKyAgc3RyZWFtLT53cml0ZSgmaW50diwgNCk7Cit9CisKK3ZvaWQgV3JpdGFibGVVdGlsczo6V3JpdGVUZXh0KE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgY29uc3Qgc3RyaW5nICYgdikgeworICBXcml0ZVZMb25nKHN0cmVhbSwgdi5sZW5ndGgoKSk7CisgIHN0cmVhbS0+d3JpdGUodi5jX3N0cigpLCAodWludDMyX3Qpdi5sZW5ndGgoKSk7Cit9CisKK3ZvaWQgV3JpdGFibGVVdGlsczo6V3JpdGVCeXRlcyhPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIGNvbnN0IHN0cmluZyAmIHYpIHsKKyAgV3JpdGVJbnQoc3RyZWFtLCAoaW50MzJfdCl2Lmxlbmd0aCgpKTsKKyAgc3RyZWFtLT53cml0ZSh2LmNfc3RyKCksICh1aW50MzJfdCl2Lmxlbmd0aCgpKTsKK30KKwordm9pZCBXcml0YWJsZVV0aWxzOjpXcml0ZVVURjgoT3V0cHV0U3RyZWFtICogc3RyZWFtLCBjb25zdCBzdHJpbmcgJiB2KSB7CisgIGlmICh2Lmxlbmd0aCgpID4gNjU1MzUpIHsKKyAgICBUSFJPV19FWENFUFRJT05fRVgoSU9FeGNlcHRpb24sICJzdHJpbmcgdG9vIGxvbmcgKCVsdSkgZm9yIFdyaXRlVVRGOCIsIHYubGVuZ3RoKCkpOworICB9CisgIFdyaXRlU2hvcnQoc3RyZWFtLCAoaW50MTZfdCl2Lmxlbmd0aCgpKTsKKyAgc3RyZWFtLT53cml0ZSh2LmNfc3RyKCksICh1aW50MzJfdCl2Lmxlbmd0aCgpKTsKK30KKwordm9pZCBXcml0YWJsZVV0aWxzOjp0b1N0cmluZyhzdHJpbmcgJiBkZXN0LCBLZXlWYWx1ZVR5cGUgdHlwZSwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IGxlbmd0aCkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUZXh0VHlwZToKKyAgICBkZXN0LmFwcGVuZCgoY29uc3QgY2hhciopZGF0YSwgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgY2FzZSBCeXRlc1R5cGU6CisgICAgZGVzdC5hcHBlbmQoKGNvbnN0IGNoYXIqKWRhdGEsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgQnl0ZVR5cGU6CisgICAgZGVzdC5hcHBlbmQoMSwgKihjaGFyKilkYXRhKTsKKyAgICBicmVhazsKKyAgY2FzZSBCb29sVHlwZToKKyAgICBkZXN0LmFwcGVuZCgqKHVpbnQ4X3QqKWRhdGEgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBicmVhazsKKyAgY2FzZSBJbnRUeXBlOgorICAgIGRlc3QuYXBwZW5kKFN0cmluZ1V0aWw6OlRvU3RyaW5nKChpbnQzMl90KWJzd2FwKCoodWludDMyX3QqKWRhdGEpKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTG9uZ1R5cGU6CisgICAgZGVzdC5hcHBlbmQoU3RyaW5nVXRpbDo6VG9TdHJpbmcoKGludDY0X3QpYnN3YXA2NCgqKHVpbnQ2NF90KilkYXRhKSkpOworICAgIGJyZWFrOworICBjYXNlIEZsb2F0VHlwZToKKyAgICBkZXN0LmFwcGVuZChTdHJpbmdVdGlsOjpUb1N0cmluZygqKGZsb2F0KilkYXRhKSk7CisgICAgYnJlYWs7CisgIGNhc2UgRG91YmxlVHlwZToKKyAgICBkZXN0LmFwcGVuZChTdHJpbmdVdGlsOjpUb1N0cmluZygqKGRvdWJsZSopZGF0YSkpOworICAgIGJyZWFrOworICBjYXNlIE1ENUhhc2hUeXBlOgorICAgIGRlc3QuYXBwZW5kKFN0cmluZ1V0aWw6OlRvSGV4U3RyaW5nKGRhdGEsIGxlbmd0aCkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGRlc3QuYXBwZW5kKChjb25zdCBjaGFyKilkYXRhLCBsZW5ndGgpOworICAgIGJyZWFrOworICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3NyYy91dGlsL1dyaXRhYmxlVXRpbHMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9Xcml0YWJsZVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhMmIxYgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS9zcmMvdXRpbC9Xcml0YWJsZVV0aWxzLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdSSVRBQkxFVVRJTFNfSF8KKyNkZWZpbmUgV1JJVEFCTEVVVElMU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImxpYi9TdHJlYW1zLmgiCisjaW5jbHVkZSAiTmF0aXZlVGFzay5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK0tleVZhbHVlVHlwZSBKYXZhQ2xhc3NUb0tleVZhbHVlVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmIGNsYXp6KTsKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK2NsYXNzIFdyaXRhYmxlVXRpbHMgeworcHJvdGVjdGVkOgorICBzdGF0aWMgaW50NjRfdCBSZWFkVkxvbmdJbm5lcihjb25zdCBjaGFyICogcG9zLCB1aW50MzJfdCAmIGxlbik7CisgIHN0YXRpYyB2b2lkIFdyaXRlVkxvbmdJbm5lcihpbnQ2NF90IHZhbHVlLCBjaGFyICogcG9zLCB1aW50MzJfdCAmIGxlbik7CisgIHN0YXRpYyB1aW50MzJfdCBHZXRWTG9uZ1NpemVJbm5lcihpbnQ2NF90IHZhbHVlKTsKK3B1YmxpYzoKKyAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBEZWNvZGVWTG9uZ1NpemUoaW50OF90IGNoKSB7CisgICAgaWYgKGNoID49IC0xMTIpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAoY2ggPCAtMTIwKSB7CisgICAgICByZXR1cm4gLTExOSAtIGNoOworICAgIH0KKyAgICByZXR1cm4gLTExMSAtIGNoOworICB9CisKKyAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBEZWNvZGVWTG9uZ1NpemUoY29uc3QgY2hhciAqIHBvcykgeworICAgIHJldHVybiBEZWNvZGVWTG9uZ1NpemUoKnBvcyk7CisgIH0KKworICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFZMb25nU2l6ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID49IC0xMTIgJiYgdmFsdWUgPD0gMTI3KSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIEdldFZMb25nU2l6ZUlubmVyKHZhbHVlKTsKKyAgfQorCisgIGlubGluZSBzdGF0aWMgaW50NjRfdCBSZWFkVkxvbmcoY29uc3QgY2hhciAqIHBvcywgdWludDMyX3QgJiBsZW4pIHsKKyAgICBpZiAoKnBvcyA+PSAoY2hhciktMTEyKSB7CisgICAgICBsZW4gPSAxOworICAgICAgcmV0dXJuICpwb3M7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBSZWFkVkxvbmdJbm5lcihwb3MsIGxlbik7CisgICAgfQorICB9CisKKyAgaW5saW5lIHN0YXRpYyBpbnQzMl90IFJlYWRWSW50KGNvbnN0IGNoYXIgKiBwb3MsIHVpbnQzMl90ICYgbGVuKSB7CisgICAgcmV0dXJuIChpbnQzMl90KVJlYWRWTG9uZyhwb3MsIGxlbik7CisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgV3JpdGVWTG9uZyhpbnQ2NF90IHYsIGNoYXIgKiB0YXJnZXQsIHVpbnQzMl90ICYgd3JpdHRlbikgeworICAgIGlmICh2IDw9IDEyNyAmJiB2ID49IC0xMTIpIHsKKyAgICAgIHdyaXR0ZW4gPSAxOworICAgICAgKnRhcmdldCA9IChjaGFyKXY7CisgICAgfSBlbHNlIHsKKyAgICAgIFdyaXRlVkxvbmdJbm5lcih2LCB0YXJnZXQsIHdyaXR0ZW4pOworICAgIH0KKyAgfQorCisgIGlubGluZSBzdGF0aWMgdm9pZCBXcml0ZVZJbnQoaW50MzJfdCB2LCBjaGFyICogdGFyZ2V0LCB1aW50MzJfdCAmIHdyaXR0ZW4pIHsKKyAgICBXcml0ZVZMb25nKHYsIHRhcmdldCwgd3JpdHRlbik7CisgIH0KKworICAvLyBTdHJlYW0gaW50ZXJmYWNlcworICBzdGF0aWMgaW50NjRfdCBSZWFkVkxvbmcoSW5wdXRTdHJlYW0gKiBzdHJlYW0pOworCisgIHN0YXRpYyBpbnQ2NF90IFJlYWRMb25nKElucHV0U3RyZWFtICogc3RyZWFtKTsKKworICBzdGF0aWMgaW50MzJfdCBSZWFkSW50KElucHV0U3RyZWFtICogc3RyZWFtKTsKKworICBzdGF0aWMgaW50MTZfdCBSZWFkU2hvcnQoSW5wdXRTdHJlYW0gKiBzdHJlYW0pOworCisgIHN0YXRpYyBmbG9hdCBSZWFkRmxvYXQoSW5wdXRTdHJlYW0gKiBzdHJlYW0pOworCisgIHN0YXRpYyBzdHJpbmcgUmVhZFRleHQoSW5wdXRTdHJlYW0gKiBzdHJlYW0pOworCisgIHN0YXRpYyBzdHJpbmcgUmVhZEJ5dGVzKElucHV0U3RyZWFtICogc3RyZWFtKTsKKworICBzdGF0aWMgc3RyaW5nIFJlYWRVVEY4KElucHV0U3RyZWFtICogc3RyZWFtKTsKKworICBzdGF0aWMgdm9pZCBXcml0ZVZMb25nKE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgaW50NjRfdCB2KTsKKworICBzdGF0aWMgdm9pZCBXcml0ZUxvbmcoT3V0cHV0U3RyZWFtICogc3RyZWFtLCBpbnQ2NF90IHYpOworCisgIHN0YXRpYyB2b2lkIFdyaXRlSW50KE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgaW50MzJfdCB2KTsKKworICBzdGF0aWMgdm9pZCBXcml0ZVNob3J0KE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgaW50MTZfdCB2KTsKKworICBzdGF0aWMgdm9pZCBXcml0ZUZsb2F0KE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgZmxvYXQgdik7CisKKyAgc3RhdGljIHZvaWQgV3JpdGVUZXh0KE91dHB1dFN0cmVhbSAqIHN0cmVhbSwgY29uc3Qgc3RyaW5nICYgdik7CisKKyAgc3RhdGljIHZvaWQgV3JpdGVCeXRlcyhPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIGNvbnN0IHN0cmluZyAmIHYpOworCisgIHN0YXRpYyB2b2lkIFdyaXRlVVRGOChPdXRwdXRTdHJlYW0gKiBzdHJlYW0sIGNvbnN0IHN0cmluZyAmIHYpOworCisgIC8vIFdyaXRhYmxlIGJpbmFyeSB0byBzdHJpbmcgaW50ZXJmYWNlCisgIHN0YXRpYyB2b2lkIHRvU3RyaW5nKHN0cmluZyAmIGRlc3QsIEtleVZhbHVlVHlwZSB0eXBlLCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3QgbGVuZ3RoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKworI2VuZGlmIC8qIFdSSVRBQkxFVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0LnNoIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxY2E3OAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0LnNoCkBAIC0wLDAgKzEsMzYgQEAKKyMhL2Jpbi9zaAorIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIG9ubHkgZG8gbm9ybWFsIHRlc3RzIGJ5IGRlZmF1bHQKK0ZJTFRFUj0iLS1ndGVzdF9maWx0ZXI9LVBlcmYuKiIKKworIyBkbyBhbGwgdGVzdHMKK2lmIFsgIiQxIiA9ICJhbGwiIF07IHRoZW4KKyAgc2hpZnQKKyAgRklMVEVSPSIiCitmaQorCisjIGRvIHBlcmZvcm1hbmNlIHRlc3RzIG9ubHkKK2lmIFsgIiQxIiA9ICJwZXJmIiBdOyB0aGVuCisgIHNoaWZ0CisgIEZJTFRFUj0iLS1ndGVzdF9maWx0ZXI9UGVyZi4qIgorZmkKKworaWYgWyAiJHtTWVNURU1fTUFDfSIgPSAiVFJVRSIgXTsgdGhlbgorICAjIE1BQ09TWCBhbHJlYWR5IHNldHVwIFJQQVRILCBubyBleHRyYSBoZWxwIHJlcXVpcmVkCisgIC4vbnR0ZXN0ICRGSUxURVIgJEAKK2Vsc2UKKyAgSkFWQV9KVk1fTElCUkFSWV9ESVI9YGRpcm5hbWUgJHtKQVZBX0pWTV9MSUJSQVJZfWAKKyAgTERfTElCUkFSWV9QQVRIPSRKQVZBX0pWTV9MSUJSQVJZX0RJUjokTERfTElCUkFSWV9QQVRIIC4vbnR0ZXN0ICRGSUxURVIgJEAKK2ZpCisKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb21tYW5kLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdENvbW1hbmQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5YjdiMAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb21tYW5kLmNjCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVyU3RyZWFtLmgiCisjaW5jbHVkZSAibGliL0J1ZmZlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKyNpbmNsdWRlICJOYXRpdmVUYXNrLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworVEVTVChDb21tYW5kLCBlcXVhbHMpIHsKKyAgQ29tbWFuZCBjbWQxKDEwMCwgImhlbGxvIGNvbW1hbmQiKTsKKyAgQ29tbWFuZCBjbWQyKDEwMCwgImhlbGxvIGNvbW1hbmQgMiIpOworCisgIEFTU0VSVF9UUlVFKGNtZDEuZXF1YWxzKGNtZDIpKTsKKyAgQVNTRVJUX1RSVUUoY21kMi5lcXVhbHMoY21kMSkpOworICBBU1NFUlRfRVEoMTAwLCBjbWQxLmlkKCkpOworCisgIHN0ZDo6c3RyaW5nIGhlbGxvQ29tbWFuZCA9ICJoZWxsbyBjb21tYW5kIjsKKyAgQVNTRVJUX0VRKGhlbGxvQ29tbWFuZCwgY21kMS5kZXNjcmlwdGlvbigpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdENvbXByZXNzaW9ucy5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb21wcmVzc2lvbnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3ZTI2MgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb21wcmVzc2lvbnMuY2MKQEAgLTAsMCArMSwyODYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibHo0LmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvUGF0aC5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJTdHJlYW0uaCIKKyNpbmNsdWRlICJsaWIvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgImxpYi9Db21wcmVzc2lvbnMuaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKworI2lmIGRlZmluZWQgSEFET09QX1NOQVBQWV9MSUJSQVJZCisjaW5jbHVkZSA8c25hcHB5Lmg+CisjZW5kaWYKKwordm9pZCBUZXN0Q29kZWMoY29uc3Qgc3RyaW5nICYgY29kZWMpIHsKKyAgc3RyaW5nIGRhdGE7CisgIHNpemVfdCBsZW5ndGggPSBUZXN0Q29uZmlnLmdldEludCgiY29tcHJlc3Npb24uaW5wdXQubGVuZ3RoIiwgMTAwICogMTAyNCAqIDEwMjQpOworICB1aW50MzJfdCBidWZmaGludCA9IFRlc3RDb25maWcuZ2V0SW50KCJjb21wcmVzc2lvbi5idWZmZXIuaGludCIsIDEyOCAqIDEwMjQpOworICBzdHJpbmcgdHlwZSA9IFRlc3RDb25maWcuZ2V0KCJjb21wcmVzc2lvbi5pbnB1dC50eXBlIiwgImJ5dGVzIik7CisgIFRpbWVyIHRpbWVyOworICBHZW5lcmF0ZUtWVGV4dExlbmd0aChkYXRhLCBsZW5ndGgsIHR5cGUpOworICBMT0coIiVzIiwgdGltZXIuZ2V0SW50ZXJ2YWwoIkdlbmVyYXRlIGRhdGEiKS5jX3N0cigpKTsKKworICBJbnB1dEJ1ZmZlciBpbnB1dEJ1ZmZlciA9IElucHV0QnVmZmVyKGRhdGEpOworICBzaXplX3QgYnVmZkxlbiA9IGRhdGEubGVuZ3RoKCkgLyAyICogMzsKKworICB0aW1lci5yZXNldCgpOworICBjaGFyICogYnVmZiA9IG5ldyBjaGFyW2J1ZmZMZW5dOworICBjaGFyICogYnVmZjIgPSBuZXcgY2hhcltidWZmTGVuXTsKKyAgbWVtc2V0KGJ1ZmYsIDAsIGJ1ZmZMZW4pOworICBtZW1zZXQoYnVmZjIsIDAsIGJ1ZmZMZW4pOworICBMT0coIiVzIiwgdGltZXIuZ2V0SW50ZXJ2YWwoIm1lbXNldCBidWZmZXIgdG8gcHJldmVudCBtaXNzaW5nIHBhZ2UiKS5jX3N0cigpKTsKKworICBPdXRwdXRCdWZmZXIgb3V0cHV0QnVmZmVyID0gT3V0cHV0QnVmZmVyKGJ1ZmYsIGJ1ZmZMZW4pOworICBDb21wcmVzc1N0cmVhbSAqIGNvbXByZXNzb3IgPSBDb21wcmVzc2lvbnM6OmdldENvbXByZXNzaW9uU3RyZWFtKGNvZGVjLCAmb3V0cHV0QnVmZmVyLCBidWZmaGludCk7CisKKyAgTE9HKCIlcyIsIGNvZGVjLmNfc3RyKCkpOworICB0aW1lci5yZXNldCgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoKCk7IGkgKz0gMTI4ICogMTAyNCkgeworICAgIGNvbXByZXNzb3ItPndyaXRlKGRhdGEuY19zdHIoKSArIGksIHN0ZDo6bWluKGRhdGEubGVuZ3RoKCkgLSBpLCAoc2l6ZV90KSgxMjggKiAxMDI0KSkpOworICB9CisgIGNvbXByZXNzb3ItPmZsdXNoKCk7CisgIExPRygiJXMiLAorICAgICAgdGltZXIuZ2V0U3BlZWRNMigiY29tcHJlc3Mgb3JpZ2luL2NvbXByZXNzZWQiLCBkYXRhLmxlbmd0aCgpLCBvdXRwdXRCdWZmZXIudGVsbCgpKS5jX3N0cigpKTsKKworICBJbnB1dEJ1ZmZlciBkZWNvbXBJbnB1dEJ1ZmZlciA9IElucHV0QnVmZmVyKGJ1ZmYsIG91dHB1dEJ1ZmZlci50ZWxsKCkpOworICBEZWNvbXByZXNzU3RyZWFtICogZGVjb21wcmVzc29yID0gQ29tcHJlc3Npb25zOjpnZXREZWNvbXByZXNzaW9uU3RyZWFtKGNvZGVjLCAmZGVjb21wSW5wdXRCdWZmZXIsCisgICAgICBidWZmaGludCk7CisgIHNpemVfdCB0b3RhbCA9IDA7CisgIHRpbWVyLnJlc2V0KCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaW50MzJfdCByZCA9IGRlY29tcHJlc3Nvci0+cmVhZChidWZmMiArIHRvdGFsLCBidWZmTGVuIC0gdG90YWwpOworICAgIGlmIChyZCA8PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdG90YWwgKz0gcmQ7CisgIH0KKyAgTE9HKCIlcyIsIHRpbWVyLmdldFNwZWVkTTIoImRlY29tcHJlc3Mgb3JpZ2luL3VuY29tcHJlc3NlZCIsIG91dHB1dEJ1ZmZlci50ZWxsKCksIHRvdGFsKS5jX3N0cigpKTsKKyAgTE9HKCJyYXRpbzogJS4zbGYiLCBvdXRwdXRCdWZmZXIudGVsbCgpIC8gKGRvdWJsZSApdG90YWwpOworICBBU1NFUlRfRVEoZGF0YS5sZW5ndGgoKSwgdG90YWwpOworICBBU1NFUlRfRVEoMCwgbWVtY21wKGRhdGEuY19zdHIoKSwgYnVmZjIsIHRvdGFsKSk7CisKKyAgZGVsZXRlW10gYnVmZjsKKyAgZGVsZXRlW10gYnVmZjI7CisgIGRlbGV0ZSBjb21wcmVzc29yOworICBkZWxldGUgZGVjb21wcmVzc29yOworfQorCitURVNUKFBlcmYsIENvbXByZXNzaW9uVXRpbCkgeworICBzdHJpbmcgaW5wdXRmaWxlID0gVGVzdENvbmZpZy5nZXQoImlucHV0IiwgIiIpOworICBzdHJpbmcgb3V0cHV0ZmlsZSA9IFRlc3RDb25maWcuZ2V0KCJvdXRwdXQiLCAiIik7CisgIHVpbnQzMl90IGJ1ZmZoaW50ID0gVGVzdENvbmZpZy5nZXRJbnQoImNvbXByZXNzaW9uLmJ1ZmZlci5oaW50IiwgMTI4ICogMTAyNCk7CisgIHN0cmluZyBpbnB1dGNvZGVjID0gQ29tcHJlc3Npb25zOjpnZXRDb2RlY0J5RmlsZShpbnB1dGZpbGUpOworICBzdHJpbmcgb3V0cHV0Y29kZWMgPSBDb21wcmVzc2lvbnM6OmdldENvZGVjQnlGaWxlKG91dHB1dGZpbGUpOworICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZoaW50OworICBpZiAoaW5wdXRjb2RlYy5sZW5ndGgoKSA+IDAgJiYgb3V0cHV0Y29kZWMubGVuZ3RoKCkgPT0gMCkgeworICAgIC8vIGRlY29tcHJlc3Npb24KKyAgICBJbnB1dFN0cmVhbSAqIGZpbiA9IEZpbGVTeXN0ZW06OmdldExvY2FsKCkub3BlbihpbnB1dGZpbGUpOworICAgIGlmIChmaW4gPT0gTlVMTCkgeworICAgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiaW5wdXQgZmlsZSBub3QgZm91bmQiKTsKKyAgICB9CisgICAgRGVjb21wcmVzc1N0cmVhbSAqIHNvdXJjZSA9IENvbXByZXNzaW9uczo6Z2V0RGVjb21wcmVzc2lvblN0cmVhbShpbnB1dGNvZGVjLCBmaW4sIGJ1ZmZlclNpemUpOworICAgIE91dHB1dFN0cmVhbSAqIGZvdXQgPSBGaWxlU3lzdGVtOjpnZXRMb2NhbCgpLmNyZWF0ZShvdXRwdXRmaWxlLCB0cnVlKTsKKyAgICBjaGFyICogYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCByZCA9IHNvdXJjZS0+cmVhZChidWZmZXIsIGJ1ZmZlclNpemUpOworICAgICAgaWYgKHJkIDw9IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBmb3V0LT53cml0ZShidWZmZXIsIHJkKTsKKyAgICB9CisgICAgc291cmNlLT5jbG9zZSgpOworICAgIGRlbGV0ZSBzb3VyY2U7CisgICAgZmluLT5jbG9zZSgpOworICAgIGRlbGV0ZSBmaW47CisgICAgZm91dC0+Zmx1c2goKTsKKyAgICBmb3V0LT5jbG9zZSgpOworICAgIGRlbGV0ZSBmb3V0OworICAgIGRlbGV0ZSBidWZmZXI7CisgIH0gZWxzZSBpZiAoaW5wdXRjb2RlYy5sZW5ndGgoKSA9PSAwICYmIG91dHB1dGNvZGVjLmxlbmd0aCgpID4gMCkgeworICAgIC8vIGNvbXByZXNzaW9uCisgICAgSW5wdXRTdHJlYW0gKiBmaW4gPSBGaWxlU3lzdGVtOjpnZXRMb2NhbCgpLm9wZW4oaW5wdXRmaWxlKTsKKyAgICBpZiAoZmluID09IE5VTEwpIHsKKyAgICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImlucHV0IGZpbGUgbm90IGZvdW5kIik7CisgICAgfQorICAgIE91dHB1dFN0cmVhbSAqIGZvdXQgPSBGaWxlU3lzdGVtOjpnZXRMb2NhbCgpLmNyZWF0ZShvdXRwdXRmaWxlLCB0cnVlKTsKKyAgICBDb21wcmVzc1N0cmVhbSAqIGRlc3QgPSBDb21wcmVzc2lvbnM6OmdldENvbXByZXNzaW9uU3RyZWFtKG91dHB1dGNvZGVjLCBmb3V0LCBidWZmZXJTaXplKTsKKyAgICBjaGFyICogYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCByZCA9IGZpbi0+cmVhZChidWZmZXIsIGJ1ZmZlclNpemUpOworICAgICAgaWYgKHJkIDw9IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXN0LT53cml0ZShidWZmZXIsIHJkKTsKKyAgICB9CisgICAgZGVzdC0+Zmx1c2goKTsKKyAgICBkZXN0LT5jbG9zZSgpOworICAgIGRlbGV0ZSBkZXN0OworICAgIGZvdXQtPmNsb3NlKCk7CisgICAgZGVsZXRlIGZvdXQ7CisgICAgZmluLT5jbG9zZSgpOworICAgIGRlbGV0ZSBmaW47CisgICAgZGVsZXRlIGJ1ZmZlcjsKKyAgfSBlbHNlIHsKKyAgICBMT0coIk5vdCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uLCBkbyBub3RoaW5nIik7CisgIH0KK30KKworY2xhc3MgQ29tcHJlc3NSZXN1bHQgeworIHB1YmxpYzoKKyAgdWludDY0X3QgdW5jb21wcmVzc2VkU2l6ZTsKKyAgdWludDY0X3QgY29tcHJlc3NlZFNpemU7CisgIHVpbnQ2NF90IGNvbXByZXNzVGltZTsKKyAgdWludDY0X3QgdW5jb21wcmVzc1RpbWU7CisgIENvbXByZXNzUmVzdWx0KCkKKyAgICAgIDogdW5jb21wcmVzc2VkU2l6ZSgwKSwgY29tcHJlc3NlZFNpemUoMCksIGNvbXByZXNzVGltZSgwKSwgdW5jb21wcmVzc1RpbWUoMCkgeworICB9CisgIENvbXByZXNzUmVzdWx0ICYgb3BlcmF0b3IrPShjb25zdCBDb21wcmVzc1Jlc3VsdCAmIHJocykgeworICAgIHVuY29tcHJlc3NlZFNpemUgKz0gcmhzLnVuY29tcHJlc3NlZFNpemU7CisgICAgY29tcHJlc3NlZFNpemUgKz0gcmhzLmNvbXByZXNzZWRTaXplOworICAgIGNvbXByZXNzVGltZSArPSByaHMuY29tcHJlc3NUaW1lOworICAgIHVuY29tcHJlc3NUaW1lICs9IHJocy51bmNvbXByZXNzVGltZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgc3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBTdHJpbmdVdGlsOjpGb3JtYXQoIkNvbXByZXNzOiAlNC4wZk0vcyBEZWNvbXByZXNzOiAlNS4wZk0vcyglNS4wZk0vcykgcmF0aW86ICUuMWYlJSIsCisgICAgICAgICh1bmNvbXByZXNzZWRTaXplIC8gMTAyNC4wIC8gMTAyNCkgLyAoY29tcHJlc3NUaW1lIC8gMTAwMDAwMDAwMC4pLAorICAgICAgICAoY29tcHJlc3NlZFNpemUgLyAxMDI0LjAgLyAxMDI0KSAvICh1bmNvbXByZXNzVGltZSAvIDEwMDAwMDAwMDAuKSwKKyAgICAgICAgKHVuY29tcHJlc3NlZFNpemUgLyAxMDI0LjAgLyAxMDI0KSAvICh1bmNvbXByZXNzVGltZSAvIDEwMDAwMDAwMDAuKSwKKyAgICAgICAgY29tcHJlc3NlZFNpemUgLyAoZmxvYXQpdW5jb21wcmVzc2VkU2l6ZSAqIDEwMCk7CisgIH0KK307CisKK1RFU1QoUGVyZiwgR3ppcENvZGVjKSB7CisgIFRlc3RDb2RlYygib3JnLmFwYWNoZS5oYWRvb3AuaW8uY29tcHJlc3MuR3ppcENvZGVjIik7Cit9CisKK3ZvaWQgTWVhc3VyZVNpbmdsZUZpbGVMejQoY29uc3Qgc3RyaW5nICYgcGF0aCwgQ29tcHJlc3NSZXN1bHQgJiB0b3RhbCwgc2l6ZV90IGJsb2NrU2l6ZSwKKyAgICBpbnQgdGltZXMpIHsKKyAgc3RyaW5nIGRhdGE7CisgIFJlYWRGaWxlKGRhdGEsIHBhdGgpOworICBzaXplX3QgbWF4bGVuZ3RoID0gc3RkOjptYXgoKHNpemVfdCkoYmxvY2tTaXplICogMS4wMDUpLCBibG9ja1NpemUgKyA4KTsKKyAgY2hhciAqIG91dHB1dEJ1ZmZlciA9IG5ldyBjaGFyW21heGxlbmd0aF07CisgIGNoYXIgKiBkZXN0ID0gbmV3IGNoYXJbYmxvY2tTaXplICsgOF07CisgIENvbXByZXNzUmVzdWx0IHJlc3VsdDsKKyAgVGltZXIgdDsKKyAgZm9yIChzaXplX3Qgc3RhcnQgPSAwOyBzdGFydCA8IGRhdGEubGVuZ3RoKCk7IHN0YXJ0ICs9IGJsb2NrU2l6ZSkgeworICAgIHNpemVfdCBjdXJyZW50YmxvY2tzaXplID0gc3RkOjptaW4oZGF0YS5sZW5ndGgoKSAtIHN0YXJ0LCBibG9ja1NpemUpOworICAgIHVpbnQ2NF90IHN0YXJ0VGltZSA9IHQubm93KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lczsgaSsrKSB7CisgICAgICBpbnQgb3NpemUgPSBMWjRfY29tcHJlc3MoKGNoYXIqKWRhdGEuZGF0YSgpICsgc3RhcnQsIG91dHB1dEJ1ZmZlciwgY3VycmVudGJsb2Nrc2l6ZSk7CisgICAgICByZXN1bHQuY29tcHJlc3NlZFNpemUgKz0gb3NpemU7CisgICAgICByZXN1bHQudW5jb21wcmVzc2VkU2l6ZSArPSBjdXJyZW50YmxvY2tzaXplOworICAgIH0KKyAgICB1aW50NjRfdCBlbmRUaW1lID0gdC5ub3coKTsKKyAgICByZXN1bHQuY29tcHJlc3NUaW1lICs9IGVuZFRpbWUgLSBzdGFydFRpbWU7CisgICAgc3RhcnRUaW1lID0gdC5ub3coKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHsKKyAgICAgIGludCBvc2l6ZSA9IExaNF91bmNvbXByZXNzKG91dHB1dEJ1ZmZlciwgZGVzdCwgY3VycmVudGJsb2Nrc2l6ZSk7CisgICAgICBBU1NFUlRfRVEoY3VycmVudGJsb2Nrc2l6ZSwgb3NpemUpOworICAgIH0KKyAgICBlbmRUaW1lID0gdC5ub3coKTsKKyAgICByZXN1bHQudW5jb21wcmVzc1RpbWUgKz0gZW5kVGltZSAtIHN0YXJ0VGltZTsKKyAgfQorICBwcmludGYoIiVzIC0gJXNcbiIsIHJlc3VsdC50b1N0cmluZygpLmNfc3RyKCksIFBhdGg6OkdldE5hbWUocGF0aCkuY19zdHIoKSk7CisgIGRlbGV0ZVtdIG91dHB1dEJ1ZmZlcjsKKyAgZGVsZXRlW10gZGVzdDsKKyAgdG90YWwgKz0gcmVzdWx0OworfQorCitURVNUKFBlcmYsIFJhd0NvbXByZXNzaW9uTHo0KSB7CisgIHN0cmluZyBpbnB1dGRpciA9IFRlc3RDb25maWcuZ2V0KCJjb21wcmVzc2lvbnMuaW5wdXQucGF0aCIsICIiKTsKKyAgaW50NjRfdCB0aW1lcyA9IFRlc3RDb25maWcuZ2V0SW50KCJjb21wcmVzc2lvbi50aW1lIiwgNDAwKTsKKyAgaW50NjRfdCBibG9ja1NpemUgPSBUZXN0Q29uZmlnLmdldEludCgiY29tcHJlc3Npb24uYmxvY2suc2l6ZSIsIDEwMjQgKiA2NCk7CisgIHZlY3RvcjxGaWxlRW50cnk+IGlucHV0ZmlsZXM7CisgIEZpbGVTeXN0ZW06OmdldExvY2FsKCkubGlzdChpbnB1dGRpciwgaW5wdXRmaWxlcyk7CisgIENvbXByZXNzUmVzdWx0IHRvdGFsOworICBwcmludGYoIkJsb2NrIHNpemU6ICVsbGRLXG4iLCAobG9uZyBsb25nIGludCkoYmxvY2tTaXplIC8gMTAyNCkpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0ZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIWlucHV0ZmlsZXNbaV0uaXNEaXJlY3RvcnkpIHsKKyAgICAgIE1lYXN1cmVTaW5nbGVGaWxlTHo0KChpbnB1dGRpciArICIvIiArIGlucHV0ZmlsZXNbaV0ubmFtZSkuY19zdHIoKSwgdG90YWwsIGJsb2NrU2l6ZSwgdGltZXMpOworICAgIH0KKyAgfQorICBwcmludGYoIiVzIC0gVG90YWxcbiIsIHRvdGFsLnRvU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK1RFU1QoUGVyZiwgTHo0Q29kZWMpIHsKKyAgVGVzdENvZGVjKCJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5MejRDb2RlYyIpOworfQorCisjaWYgZGVmaW5lZCBIQURPT1BfU05BUFBZX0xJQlJBUlkKKwordm9pZCBNZWFzdXJlU2luZ2xlRmlsZVNuYXBweShjb25zdCBzdHJpbmcgJiBwYXRoLCBDb21wcmVzc1Jlc3VsdCAmIHRvdGFsLCBzaXplX3QgYmxvY2tTaXplLAorICAgIGludCB0aW1lcykgeworICBzdHJpbmcgZGF0YTsKKyAgUmVhZEZpbGUoZGF0YSwgcGF0aCk7CisgIHNpemVfdCBtYXhsZW5ndGggPSBzbmFwcHk6Ok1heENvbXByZXNzZWRMZW5ndGgoYmxvY2tTaXplKTsKKyAgY2hhciAqIG91dHB1dEJ1ZmZlciA9IG5ldyBjaGFyW21heGxlbmd0aF07CisgIGNoYXIgKiBkZXN0ID0gbmV3IGNoYXJbYmxvY2tTaXplXTsKKyAgQ29tcHJlc3NSZXN1bHQgcmVzdWx0OworICBUaW1lciB0OworICBpbnQgY29tcHJlc3NlZFNpemUgPSAtMTsKKyAgZm9yIChzaXplX3Qgc3RhcnQgPSAwOyBzdGFydCA8IGRhdGEubGVuZ3RoKCk7IHN0YXJ0ICs9IGJsb2NrU2l6ZSkgeworICAgIHNpemVfdCBjdXJyZW50YmxvY2tzaXplID0gc3RkOjptaW4oZGF0YS5sZW5ndGgoKSAtIHN0YXJ0LCBibG9ja1NpemUpOworICAgIHVpbnQ2NF90IHN0YXJ0VGltZSA9IHQubm93KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lczsgaSsrKSB7CisgICAgICBzaXplX3Qgb3NpemUgPSBtYXhsZW5ndGg7CisgICAgICBzbmFwcHk6OlJhd0NvbXByZXNzKGRhdGEuZGF0YSgpICsgc3RhcnQsIGN1cnJlbnRibG9ja3NpemUsIG91dHB1dEJ1ZmZlciwgJm9zaXplKTsKKyAgICAgIGNvbXByZXNzZWRTaXplID0gb3NpemU7CisgICAgICByZXN1bHQuY29tcHJlc3NlZFNpemUgKz0gb3NpemU7CisgICAgICByZXN1bHQudW5jb21wcmVzc2VkU2l6ZSArPSBjdXJyZW50YmxvY2tzaXplOworICAgIH0KKyAgICB1aW50NjRfdCBlbmRUaW1lID0gdC5ub3coKTsKKyAgICByZXN1bHQuY29tcHJlc3NUaW1lICs9IGVuZFRpbWUgLSBzdGFydFRpbWU7CisgICAgc3RhcnRUaW1lID0gdC5ub3coKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHsKKyAgICAgIHNuYXBweTo6UmF3VW5jb21wcmVzcyhvdXRwdXRCdWZmZXIsIGNvbXByZXNzZWRTaXplLCBkZXN0KTsKKyAgICB9CisgICAgZW5kVGltZSA9IHQubm93KCk7CisgICAgcmVzdWx0LnVuY29tcHJlc3NUaW1lICs9IGVuZFRpbWUgLSBzdGFydFRpbWU7CisgIH0KKyAgcHJpbnRmKCIlcyAtICVzXG4iLCByZXN1bHQudG9TdHJpbmcoKS5jX3N0cigpLCBQYXRoOjpHZXROYW1lKHBhdGgpLmNfc3RyKCkpOworICBkZWxldGVbXSBvdXRwdXRCdWZmZXI7CisgIGRlbGV0ZVtdIGRlc3Q7CisgIHRvdGFsICs9IHJlc3VsdDsKK30KKworVEVTVChQZXJmLCBSYXdDb21wcmVzc2lvblNuYXBweSkgeworICBzdHJpbmcgaW5wdXRkaXIgPSBUZXN0Q29uZmlnLmdldCgiY29tcHJlc3Npb25zLmlucHV0LnBhdGgiLCAiIik7CisgIGludDY0X3QgdGltZXMgPSBUZXN0Q29uZmlnLmdldEludCgiY29tcHJlc3Npb24udGltZSIsIDQwMCk7CisgIGludDY0X3QgYmxvY2tTaXplID0gVGVzdENvbmZpZy5nZXRJbnQoImNvbXByZXNzaW9uLmJsb2NrLnNpemUiLCAxMDI0ICogNjQpOworICB2ZWN0b3I8RmlsZUVudHJ5PiBpbnB1dGZpbGVzOworICBGaWxlU3lzdGVtOjpnZXRMb2NhbCgpLmxpc3QoaW5wdXRkaXIsIGlucHV0ZmlsZXMpOworICBDb21wcmVzc1Jlc3VsdCB0b3RhbDsKKyAgcHJpbnRmKCJCbG9jayBzaXplOiAlIlBSSWQ2NCJLXG4iLCBibG9ja1NpemUgLyAxMDI0KTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dGZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKCFpbnB1dGZpbGVzW2ldLmlzRGlyZWN0b3J5KSB7CisgICAgICBNZWFzdXJlU2luZ2xlRmlsZVNuYXBweSgoaW5wdXRkaXIgKyAiLyIgKyBpbnB1dGZpbGVzW2ldLm5hbWUpLmNfc3RyKCksIHRvdGFsLCBibG9ja1NpemUsCisgICAgICAgICAgdGltZXMpOworICAgIH0KKyAgfQorICBwcmludGYoIiVzIC0gVG90YWxcbiIsIHRvdGFsLnRvU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK1RFU1QoUGVyZiwgU25hcHB5Q29kZWMpIHsKKyAgVGVzdENvZGVjKCJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5TbmFwcHlDb2RlYyIpOworfQorCisjZW5kaWYgLy8gZGVmaW5lIEhBRE9PUF9TTkFQUFlfTElCUkFSWQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdENvbmZpZy5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb25maWcuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjMGI5YQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb25maWcuY2MKQEAgLTAsMCArMSw2NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJTdHJlYW0uaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVycy5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCitmbG9hdCBhYnNvdXRlKGZsb2F0IHYpIHsKKyAgaWYgKHYgPiAwKSB7CisgICAgcmV0dXJuIHY7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC12OworICB9Cit9CisKK1RFU1QoQ29uZmlnLCByZWFkQW5kV3JpdGUpIHsKKyAgQ29uZmlnIGNvbmZpZzsKKyAgc3RkOjpzdHJpbmcgU1RSID0gIkNPTkZJRyI7CisgIHN0ZDo6c3RyaW5nIFNUUlMgPSAiQ09ORklHLExPRyI7CisgIGludCBJTlQgPSAzOworICBib29sIEJPT0wgPSB0cnVlOworCisgIGNvbmZpZy5zZXQoIlNUUiIsIFNUUi5jX3N0cigpKTsKKyAgY29uZmlnLnNldCgiU1RSUyIsIFNUUlMuY19zdHIoKSk7CisgIGNvbmZpZy5zZXRJbnQoIklOVCIsIElOVCk7CisgIGNvbmZpZy5zZXRCb29sKCJCT09MIiwgQk9PTCk7CisgIGNvbmZpZy5zZXQoIklOVFMiLCAiMyw0Iik7CisgIGNvbmZpZy5zZXQoIkZMT0FUIiwgIjMuNSIpOworICBjb25maWcuc2V0KCJGTE9BVFMiLCAiMy41LDQuNiIpOworCisgIEFTU0VSVF9FUSgwLCBTVFIuY29tcGFyZShjb25maWcuZ2V0KCJTVFIiKSkpOworICBBU1NFUlRfRVEoMCwgU1RSUy5jb21wYXJlKGNvbmZpZy5nZXQoIlNUUlMiKSkpOworCisgIEFTU0VSVF9FUShJTlQsIGNvbmZpZy5nZXRJbnQoIklOVCIpKTsKKyAgQVNTRVJUX0VRKEJPT0wsIGNvbmZpZy5nZXRCb29sKCJCT09MIiwgZmFsc2UpKTsKKworICB2ZWN0b3I8aW50NjRfdD4gaW50czsKKyAgY29uZmlnLmdldEludHMoIklOVFMiLCBpbnRzKTsKKyAgQVNTRVJUX0VRKDIsIGludHMuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDMsIGludHNbMF0pOworICBBU1NFUlRfRVEoNCwgaW50c1sxXSk7CisKKyAgZmxvYXQgZmxvYXRWYWx1ZSA9IGNvbmZpZy5nZXRGbG9hdCgiRkxPQVQiKTsKKyAgQVNTRVJUX1RSVUUoYWJzb3V0ZShmbG9hdFZhbHVlIC0gMy41KSA8IDAuMDEpOworCisgIHZlY3RvcjxmbG9hdD4gZmxvYXRzOworICBjb25maWcuZ2V0RmxvYXRzKCJGTE9BVFMiLCBmbG9hdHMpOworICBBU1NFUlRfRVEoMiwgZmxvYXRzLnNpemUoKSk7CisgIEFTU0VSVF9UUlVFKGFic291dGUoZmxvYXRzWzBdIC0gMy41KSA8IDAuMDEpOworICBBU1NFUlRfVFJVRShhYnNvdXRlKGZsb2F0c1sxXSAtIDQuNikgPCAwLjAxKTsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb3VudGVyLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdENvdW50ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4YzQzYgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RDb3VudGVyLmNjCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJTdHJlYW0uaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVycy5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCitURVNUKENvdW50ZXIsIENvdW50ZXIpIHsKKyAgQ291bnRlciBjb3VudGVyMSgiZ3JvdXAiLCAia2V5Iik7CisgIGNvbnN0IHN0cmluZyAmIGdyb3VwID0gY291bnRlcjEuZ3JvdXAoKTsKKyAgY29uc3Qgc3RyaW5nICYgbmFtZSA9IGNvdW50ZXIxLm5hbWUoKTsKKyAgQVNTRVJUX0VRKDAsIG5hbWUuY29tcGFyZSgia2V5IikpOworICBBU1NFUlRfRVEoMCwgZ3JvdXAuY29tcGFyZSgiZ3JvdXAiKSk7CisKKyAgQVNTRVJUX0VRKDAsIGNvdW50ZXIxLmdldCgpKTsKKworICBjb3VudGVyMS5pbmNyZWFzZSgxMDApOworICBBU1NFUlRfRVEoMTAwLCBjb3VudGVyMS5nZXQoKSk7Cit9CisKK1RFU1QoQ291bnRlciwgQ291bnRlclNldCkgeworICBDb3VudGVyICogY291bnRlcjEgPSBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRDb3VudGVyKCJncm91cDAiLCAibmFtZTAiKTsKKyAgQVNTRVJUX0VRKHN0cmluZygiZ3JvdXAwIiksIGNvdW50ZXIxLT5ncm91cCgpKTsKKyAgQVNTRVJUX0VRKHN0cmluZygibmFtZTAiKSwgY291bnRlcjEtPm5hbWUoKSk7CisgIGNvdW50ZXIxLT5pbmNyZWFzZSgxMDApOworICBBU1NFUlRfRVEoMTAwLCBjb3VudGVyMS0+Z2V0KCkpOworICBDb3VudGVyICogY291bnRlcjIgPSBOYXRpdmVPYmplY3RGYWN0b3J5OjpHZXRDb3VudGVyKCJncm91cDAiLCAibmFtZTAiKTsKKyAgQ291bnRlciAqIGNvdW50ZXIzID0gTmF0aXZlT2JqZWN0RmFjdG9yeTo6R2V0Q291bnRlcigiZ3JvdXAwIiwgIm5hbWUxIik7CisgIEFTU0VSVF9FUShjb3VudGVyMSwgY291bnRlcjIpOworICBBU1NFUlRfTkUoY291bnRlcjEsIGNvdW50ZXIzKTsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RGaWxlU3lzdGVtLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdEZpbGVTeXN0ZW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3ODU4YgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RGaWxlU3lzdGVtLmNjCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKworVEVTVChGaWxlU3lzdGVtLCBSYXdGaWxlU3lzdGVtKSB7CisgIEZpbGVTeXN0ZW0gJiBmcyA9IEZpbGVTeXN0ZW06OmdldExvY2FsKCk7CisgIGZzLm1rZGlycygidGVtcCIpOworICBzdHJpbmcgdGVtcHBhdGggPSAidGVtcC9kYXRhIjsKKyAgc3RyaW5nIGNvbnRlbnQ7CisgIEdlbmVyYXRlS1ZUZXh0TGVuZ3RoKGNvbnRlbnQsIDQxMTExMTEsICJ3b3JkIik7CisgIEZpbGVPdXRwdXRTdHJlYW0gKiBvdXRwdXQgPSAoRmlsZU91dHB1dFN0cmVhbSopZnMuY3JlYXRlKHRlbXBwYXRoLCB0cnVlKTsKKyAgb3V0cHV0LT53cml0ZShjb250ZW50LmRhdGEoKSwgY29udGVudC5sZW5ndGgoKSk7CisgIG91dHB1dC0+Y2xvc2UoKTsKKyAgZGVsZXRlIG91dHB1dDsKKyAgRmlsZUlucHV0U3RyZWFtICogaW5wdXQgPSAoRmlsZUlucHV0U3RyZWFtKilmcy5vcGVuKHRlbXBwYXRoKTsKKyAgY2hhciBidWZmWzEwMjRdOworICBpbnQ2NF90IHRvdGFsID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpbnQgcmQgPSBpbnB1dC0+cmVhZChidWZmLCAxMDI0KTsKKyAgICBpZiAocmQgPD0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIEFTU0VSVF9FUShjb250ZW50LnN1YnN0cih0b3RhbCwgcmQpLCBzdHJpbmcoYnVmZiwgcmQpKTsKKyAgICB0b3RhbCArPSByZDsKKyAgfQorICBBU1NFUlRfRVEoY29udGVudC5sZW5ndGgoKSwgdG90YWwpOworICBkZWxldGUgaW5wdXQ7CisgIEFTU0VSVF9FUShmcy5nZXRMZW5ndGgodGVtcHBhdGgpLCBjb250ZW50Lmxlbmd0aCgpKTsKKyAgQVNTRVJUX1RSVUUoZnMuZXhpc3RzKHRlbXBwYXRoKSk7CisgIGZzLnJlbW92ZSgidGVtcCIpOworICBBU1NFUlRfRkFMU0UoZnMuZXhpc3RzKHRlbXBwYXRoKSk7Cit9CisKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RJRmlsZS5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RJRmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWUzMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdElGaWxlLmNjCkBAIC0wLDAgKzEsMTk5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJTdHJlYW0uaCIKKyNpbmNsdWRlICJsaWIvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgImxpYi9JRmlsZS5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCitTaW5nbGVTcGlsbEluZm8gKiB3cml0ZUlGaWxlKGludCBwYXJ0aXRpb24sIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+ICYga3ZzLAorICAgIGNvbnN0IHN0cmluZyAmIHBhdGgsIEtleVZhbHVlVHlwZSB0eXBlLCBjb25zdCBzdHJpbmcgJiBjb2RlYykgeworICBGaWxlT3V0cHV0U3RyZWFtICogZm91dCA9IChGaWxlT3V0cHV0U3RyZWFtKilGaWxlU3lzdGVtOjpnZXRMb2NhbCgpLmNyZWF0ZShwYXRoKTsKKyAgSUZpbGVXcml0ZXIgKiBpdyA9IG5ldyBJRmlsZVdyaXRlcihmb3V0LCBDSEVDS1NVTV9DUkMzMiwgdHlwZSwgdHlwZSwgY29kZWMsIE5VTEwpOworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbjsgaSsrKSB7CisgICAgaXctPnN0YXJ0UGFydGl0aW9uKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrdnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+ICYgcCA9IGt2c1tpXTsKKyAgICAgIGl3LT53cml0ZShwLmZpcnN0LmNfc3RyKCksIHAuZmlyc3QubGVuZ3RoKCksIHAuc2Vjb25kLmNfc3RyKCksIHAuc2Vjb25kLmxlbmd0aCgpKTsKKyAgICB9CisgICAgaXctPmVuZFBhcnRpdGlvbigpOworICB9CisgIFNpbmdsZVNwaWxsSW5mbyAqIGluZm8gPSBpdy0+Z2V0U3BpbGxJbmZvKCk7CisgIGRlbGV0ZSBpdzsKKyAgZGVsZXRlIGZvdXQ7CisgIHJldHVybiBpbmZvOworfQorCit2b2lkIHJlYWRJRmlsZSh2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiAmIGt2cywgY29uc3Qgc3RyaW5nICYgcGF0aCwgS2V5VmFsdWVUeXBlIHR5cGUsCisgICAgU2luZ2xlU3BpbGxJbmZvICogaW5mbywgY29uc3Qgc3RyaW5nICYgY29kZWMpIHsKKyAgRmlsZUlucHV0U3RyZWFtICogZmluID0gKEZpbGVJbnB1dFN0cmVhbSopRmlsZVN5c3RlbTo6Z2V0TG9jYWwoKS5vcGVuKHBhdGgpOworICBJRmlsZVJlYWRlciAqIGlyID0gbmV3IElGaWxlUmVhZGVyKGZpbiwgaW5mbyk7CisgIHdoaWxlIChpci0+bmV4dFBhcnRpdGlvbigpKSB7CisgICAgY29uc3QgY2hhciAqIGtleSwgKnZhbHVlOworICAgIHVpbnQzMl90IGtleUxlbiwgdmFsdWVMZW47CisgICAgd2hpbGUgKE5VTEwgIT0gKGtleSA9IGlyLT5uZXh0S2V5KGtleUxlbikpKSB7CisgICAgICB2YWx1ZSA9IGlyLT52YWx1ZSh2YWx1ZUxlbik7CisgICAgICBzdHJpbmcga2V5UyhrZXksIGtleUxlbik7CisgICAgICBzdHJpbmcgdmFsdWVTKHZhbHVlLCB2YWx1ZUxlbik7CisgICAgICBrdnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGtleVMsIHZhbHVlUykpOworICAgIH0KKyAgfQorICBkZWxldGUgaXI7CisgIGRlbGV0ZSBmaW47Cit9CisKK3ZvaWQgVGVzdElGaWxlUmVhZFdyaXRlKEtleVZhbHVlVHlwZSBrdnR5cGUsIGludCBwYXJ0aXRpb24sIGludCBzaXplLAorICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+ICYga3ZzLCBjb25zdCBzdHJpbmcgJiBjb2RlYyA9ICIiKSB7CisgIHN0cmluZyBvdXRwdXRwYXRoID0gImlmaWxld3JpdGVyIjsKKyAgU2luZ2xlU3BpbGxJbmZvICogaW5mbyA9IHdyaXRlSUZpbGUocGFydGl0aW9uLCBrdnMsIG91dHB1dHBhdGgsIGt2dHlwZSwgY29kZWMpOworICBMT0coIndyaXRlIGZpbmlzaGVkIik7CisgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+IHJlYWRrdnM7CisgIHJlYWRJRmlsZShyZWFka3ZzLCBvdXRwdXRwYXRoLCBrdnR5cGUsIGluZm8sIGNvZGVjKTsKKyAgTE9HKCJyZWFkIGZpbmlzaGVkIik7CisgIGRlbGV0ZSBpbmZvOworICBBU1NFUlRfRVEoa3ZzLnNpemUoKSAqIHBhcnRpdGlvbiwgcmVhZGt2cy5zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbjsgaSsrKSB7CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4gY3VyX3BhcnQocmVhZGt2cy5iZWdpbigpICsgaSAqIGt2cy5zaXplKCksCisgICAgICAgIHJlYWRrdnMuYmVnaW4oKSArIChpICsgMSkgKiBrdnMuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoa3ZzLnNpemUoKSwgY3VyX3BhcnQuc2l6ZSgpKTsKKy8vICAgIGZvciAoc2l6ZV90IGo9MDtqPGt2cy5zaXplKCk7aisrKSB7CisvLyAgICAgIFNDT1BFRF9UUkFDRShqKTsKKy8vICAgICAgQVNTRVJUX0VRKGt2c1tqXSwgY3VyX3BhcnRbal0pOworLy8gICAgfQorICAgIEFTU0VSVF9FUShrdnMsIGN1cl9wYXJ0KTsKKyAgfQorICBGaWxlU3lzdGVtOjpnZXRMb2NhbCgpLnJlbW92ZShvdXRwdXRwYXRoKTsKK30KKworVEVTVChJRmlsZSwgV3JpdGVSZWFkKSB7CisgIGludCBwYXJ0aXRpb24gPSBUZXN0Q29uZmlnLmdldEludCgiaWZpbGUucGFydGl0aW9uIiwgNyk7CisgIGludCBzaXplID0gVGVzdENvbmZpZy5nZXRJbnQoInBhcnRpdGlvbi5zaXplIiwgMjAwMDApOworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBrdnM7CisgIEdlbmVyYXRlKGt2cywgc2l6ZSwgImJ5dGVzIik7CisgIFRlc3RJRmlsZVJlYWRXcml0ZShUZXh0VHlwZSwgcGFydGl0aW9uLCBzaXplLCBrdnMpOworICBUZXN0SUZpbGVSZWFkV3JpdGUoQnl0ZXNUeXBlLCBwYXJ0aXRpb24sIHNpemUsIGt2cyk7CisgIFRlc3RJRmlsZVJlYWRXcml0ZShVbmtub3duVHlwZSwgcGFydGl0aW9uLCBzaXplLCBrdnMpOworI2lmIGRlZmluZWQgSEFET09QX1NOQVBQWV9MSUJSQVJZCisgIFRlc3RJRmlsZVJlYWRXcml0ZShUZXh0VHlwZSwgcGFydGl0aW9uLCBzaXplLCBrdnMsICJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5TbmFwcHlDb2RlYyIpOworI2VuZGlmCit9CisKK3ZvaWQgVGVzdElGaWxlV3JpdGVSZWFkMih2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiAmIGt2cywgY2hhciAqIGJ1ZmYsIHNpemVfdCBidWZmc2l6ZSwKKyAgICBjb25zdCBzdHJpbmcgJiBjb2RlYywgQ2hlY2tzdW1UeXBlIGNoZWNrc3VtVHlwZSwgS2V5VmFsdWVUeXBlIHR5cGUpIHsKKyAgaW50IHBhcnRpdGlvbiA9IFRlc3RDb25maWcuZ2V0SW50KCJpZmlsZS5wYXJ0aXRpb24iLCA1MCk7CisgIFRpbWVyIHRpbWVyOworICBPdXRwdXRCdWZmZXIgb3V0cHV0QnVmZmVyID0gT3V0cHV0QnVmZmVyKGJ1ZmYsIGJ1ZmZzaXplKTsKKyAgSUZpbGVXcml0ZXIgKiBpdyA9IG5ldyBJRmlsZVdyaXRlcigmb3V0cHV0QnVmZmVyLCBjaGVja3N1bVR5cGUsIHR5cGUsIHR5cGUsIGNvZGVjLCBOVUxMKTsKKyAgdGltZXIucmVzZXQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb247IGkrKykgeworICAgIGl3LT5zdGFydFBhcnRpdGlvbigpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga3ZzLnNpemUoKTsgaisrKSB7CisgICAgICBpdy0+d3JpdGUoa3ZzW2pdLmZpcnN0LmNfc3RyKCksIGt2c1tqXS5maXJzdC5sZW5ndGgoKSwga3ZzW2pdLnNlY29uZC5jX3N0cigpLAorICAgICAgICAgIGt2c1tqXS5zZWNvbmQubGVuZ3RoKCkpOworICAgIH0KKyAgICBpdy0+ZW5kUGFydGl0aW9uKCk7CisgIH0KKyAgU2luZ2xlU3BpbGxJbmZvICogaW5mbyA9IGl3LT5nZXRTcGlsbEluZm8oKTsKKyAgTE9HKCIlcyIsCisgICAgICB0aW1lci5nZXRTcGVlZE0yKCJXcml0ZSBkYXRhIiwgaW5mby0+Z2V0RW5kUG9zaXRpb24oKSwgaW5mby0+Z2V0UmVhbEVuZFBvc2l0aW9uKCkpLmNfc3RyKCkpOworICBkZWxldGUgaXc7CisKKyAgSW5wdXRCdWZmZXIgaW5wdXRCdWZmZXIgPSBJbnB1dEJ1ZmZlcihidWZmLCBvdXRwdXRCdWZmZXIudGVsbCgpKTsKKyAgSUZpbGVSZWFkZXIgKiBpciA9IG5ldyBJRmlsZVJlYWRlcigmaW5wdXRCdWZmZXIsIGluZm8pOworICB0aW1lci5yZXNldCgpOworICBpbnQgc3VtID0gMDsKKyAgd2hpbGUgKGlyLT5uZXh0UGFydGl0aW9uKCkpIHsKKyAgICBjb25zdCBjaGFyICoga2V5LCAqdmFsdWU7CisgICAgdWludDMyX3Qga2V5TGVuLCB2YWx1ZUxlbjsKKyAgICB3aGlsZSAoTlVMTCAhPSAoa2V5ID0gaXItPm5leHRLZXkoa2V5TGVuKSkpIHsKKyAgICAgIHZhbHVlID0gaXItPnZhbHVlKHZhbHVlTGVuKTsKKyAgICAgIHN1bSArPSB2YWx1ZVswXTsKKyAgICB9CisgIH0KKyAgLy8gdXNlIHRoZSByZXN1bHQgc28gdGhhdCB2YWx1ZSgpIGNhbGxzIGRvbid0IGdldCBvcHRpbWl6ZWQgb3V0CisgIEFTU0VSVF9ORSgweGRlYWRiZWVmLCBzdW0pOworICBMT0coIiVzIiwKKyAgICAgIHRpbWVyLmdldFNwZWVkTTIoIiBSZWFkIGRhdGEiLCBpbmZvLT5nZXRFbmRQb3NpdGlvbigpLCBpbmZvLT5nZXRSZWFsRW5kUG9zaXRpb24oKSkuY19zdHIoKSk7CisgIGRlbGV0ZSBpcjsKKyAgZGVsZXRlIGluZm87Cit9CisKKworCitURVNUKFBlcmYsIElGaWxlKSB7CisgIGludCBzaXplID0gVGVzdENvbmZpZy5nZXRJbnQoInBhcnRpdGlvbi5zaXplIiwgMjAwMDApOworICBzdHJpbmcgY29kZWMgPSBUZXN0Q29uZmlnLmdldCgiaWZpbGUuY29kZWMiLCAiIik7CisgIHN0cmluZyB0eXBlID0gVGVzdENvbmZpZy5nZXQoImlmaWxlLnR5cGUiLCAiYnl0ZXMiKTsKKworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBrdnM7CisgIEdlbmVyYXRlKGt2cywgc2l6ZSwgdHlwZSk7CisgIHN0ZDo6c29ydChrdnMuYmVnaW4oKSwga3ZzLmVuZCgpKTsKKworICBzaXplX3QgYnVmZnNpemUgPSAyMDAgKiAxMDI0ICogMTAyNDsKKyAgY2hhciAqIGJ1ZmYgPSBuZXcgY2hhcltidWZmc2l6ZV07CisgIG1lbXNldChidWZmLCAwLCBidWZmc2l6ZSk7CisKKyAgTE9HKCJUZXN0IFRleHRUeXBlIENSQzMyIik7CisgIFRlc3RJRmlsZVdyaXRlUmVhZDIoa3ZzLCBidWZmLCBidWZmc2l6ZSwgY29kZWMsIENIRUNLU1VNX0NSQzMyLCBUZXh0VHlwZSk7CisgIExPRygiVGVzdCBCeXRlc1R5cGUgQ1JDMzIiKTsKKyAgVGVzdElGaWxlV3JpdGVSZWFkMihrdnMsIGJ1ZmYsIGJ1ZmZzaXplLCBjb2RlYywgQ0hFQ0tTVU1fQ1JDMzIsIEJ5dGVzVHlwZSk7CisgIExPRygiVGVzdCBVbmtub3duVHlwZSBDUkMzMiIpOworICBUZXN0SUZpbGVXcml0ZVJlYWQyKGt2cywgYnVmZiwgYnVmZnNpemUsIGNvZGVjLCBDSEVDS1NVTV9DUkMzMiwgVW5rbm93blR5cGUpOworICBMT0coIlRlc3QgVGV4dFR5cGUgQ1JDMzJDIik7CisgIFRlc3RJRmlsZVdyaXRlUmVhZDIoa3ZzLCBidWZmLCBidWZmc2l6ZSwgY29kZWMsIENIRUNLU1VNX0NSQzMyQywgVGV4dFR5cGUpOworICBMT0coIlRlc3QgQnl0ZXNUeXBlIENSQzMyQyIpOworICBUZXN0SUZpbGVXcml0ZVJlYWQyKGt2cywgYnVmZiwgYnVmZnNpemUsIGNvZGVjLCBDSEVDS1NVTV9DUkMzMkMsIEJ5dGVzVHlwZSk7CisgIExPRygiVGVzdCBVbmtub3duVHlwZSBDUkMzMkMiKTsKKyAgVGVzdElGaWxlV3JpdGVSZWFkMihrdnMsIGJ1ZmYsIGJ1ZmZzaXplLCBjb2RlYywgQ0hFQ0tTVU1fQ1JDMzJDLCBVbmtub3duVHlwZSk7CisgIGRlbGV0ZVtdIGJ1ZmY7Cit9CisKKy8vIFRoZSBHbGliYyBoYXMgYSBidWcgaW4gdGhlIGZpbGUgdGVsbCBhcGksIGl0IHdpbGwgb3ZlcndyaXRlIHRoZSBmaWxlIGRhdGEKKy8vIHVuZXhwZWN0ZWQuCisvLyBQbGVhc2UgY2hlY2sgaHR0cHM6Ly9yaG4ucmVkaGF0LmNvbS9lcnJhdGEvUkhCQS0yMDEzLTAyNzkuaHRtbAorLy8gVGhpcyBjYXNlIGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZyBleGlzdHMuCisvLyBJZiBpdCBleGlzdHMsIGl0IG1lYW5zIHlvdSBuZWVkIHRvIHVwZ3JhZGUgdGhlIGdsaWJjLgorVEVTVChJRmlsZSwgVGVzdEdsaWJDQnVnKSB7CisgIHN0ZDo6c3RyaW5nIHBhdGgoIi4vdGVzdERhdGEvdGVzdEdsaWJDQnVnU3BpbGwub3V0Iik7CisKKyAgaW50MzJfdCBleHBlY3RbNV0gPSB7LTE1MzgyNDE3MTUsIC0xMjg4MDg4Nzk0LCAtMTkyMjk0NDY0LCA1NjM1NTI0MjEsIDE2NjE1MjE2NTR9OworCisgIExPRygiVGVzdEdsaWJDQnVnICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgSUZpbGVTZWdtZW50ICogc2VnbWVudHMgPSBuZXcgSUZpbGVTZWdtZW50WzFdOworICBzZWdtZW50c1swXS5yZWFsRW5kT2Zmc2V0ID0gMTAwMDAwMDA7CisgIFNpbmdsZVNwaWxsSW5mbyBpbmZvKHNlZ21lbnRzLCAxLCBwYXRoLCBDSEVDS1NVTV9OT05FLAorICAgICAgSW50VHlwZSwgVGV4dFR5cGUsICIiKTsKKworICBJbnB1dFN0cmVhbSAqIGZpbGVPdXQgPSBGaWxlU3lzdGVtOjpnZXRMb2NhbCgpLm9wZW4ocGF0aCk7CisgIElGaWxlUmVhZGVyICogcmVhZGVyID0gbmV3IElGaWxlUmVhZGVyKGZpbGVPdXQsICZpbmZvLCB0cnVlKTsKKworICBjb25zdCBjaGFyICoga2V5ID0gTlVMTDsKKyAgdWludDMyX3QgbGVuZ3RoID0gMDsKKyAgcmVhZGVyLT5uZXh0UGFydGl0aW9uKCk7CisgIHVpbnQzMl90IGluZGV4ID0gMDsKKyAgd2hpbGUgKE5VTEwgIT0gKGtleSA9IHJlYWRlci0+bmV4dEtleShsZW5ndGgpKSkgeworICAgIGludDMyX3QgcmVhbEtleSA9IChpbnQzMl90KWJzd2FwKCoodWludDMyX3QgKikoa2V5KSk7CisgICAgQVNTRVJUX0xUKGluZGV4LCA1KTsKKyAgICBBU1NFUlRfRVEoZXhwZWN0W2luZGV4XSwgcmVhbEtleSk7CisgICAgaW5kZXgrKzsKKyAgfQorICBkZWxldGUgcmVhZGVyOworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdE1haW4uY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9UZXN0TWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY0YzhhCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdE1haW4uY2MKQEAgLTAsMCArMSwxMTYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZm5kZWYgX19DWUdXSU5fXworI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJzLmgiCisjaW5jbHVkZSAibGliL0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsaWIvTmF0aXZlT2JqZWN0RmFjdG9yeS5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCitleHRlcm4gIkMiIHsKKworc3RhdGljIHZvaWQgaGFuZGxlcihpbnQgc2lnKTsKKworLy8gVE9ETzoganVzdCBmb3IgZGVidWcsIHNob3VsZCBiZSByZW1vdmVkCit2b2lkIGhhbmRsZXIoaW50IHNpZykgeworICB2b2lkICphcnJheVsxMF07CisgIHNpemVfdCBzaXplOworCisgIC8vIHByaW50IG91dCBhbGwgdGhlIGZyYW1lcyB0byBzdGRlcnIKKyAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogc2lnbmFsICVkOlxuIiwgc2lnKTsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisgIC8vIGdldCB2b2lkKidzIGZvciBhbGwgZW50cmllcyBvbiB0aGUgc3RhY2sKKyAgc2l6ZSA9IGJhY2t0cmFjZShhcnJheSwgMTApOworCisgIGJhY2t0cmFjZV9zeW1ib2xzX2ZkKGFycmF5LCBzaXplLCAyKTsKKyNlbmRpZgorCisgIGV4aXQoMSk7Cit9Cit9CisKK3R5cGVkZWYgY2hhciAqIENTdHJpbmc7CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworaW50IERvTWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2lnbmFsKFNJR1NFR1YsIGhhbmRsZXIpOworICBDU3RyaW5nICogbmV3QXJndiA9IG5ldyBDU3RyaW5nW2FyZ2MgKyAxXTsKKyAgbWVtY3B5KG5ld0FyZ3YsIGFyZ3YsIGFyZ2MgKiBzaXplb2YoQ1N0cmluZykpOworCisgIGJvb2wgZ2VuID0gZmFsc2U7CisgIGlmIChhcmdjID4gMSkgeworICAgIGlmIChzdHJpbmcoInBlcmYiKSA9PSBuZXdBcmd2WzFdKSB7CisgICAgICBuZXdBcmd2WzFdID0gKGNoYXIgKikiLS1ndGVzdF9maWx0ZXI9UGVyZi4qIjsKKyAgICB9IGVsc2UgaWYgKHN0cmluZygibm9wZXJmIikgPT0gbmV3QXJndlsxXSkgeworICAgICAgbmV3QXJndlsxXSA9IChjaGFyICopIi0tZ3Rlc3RfZmlsdGVyPS1QZXJmLioiOworICAgIH0gZWxzZSBpZiAoc3RyaW5nKCJnZW4iKSA9PSBuZXdBcmd2WzFdKSB7CisgICAgICBnZW4gPSB0cnVlOworICAgIH0KKyAgfQorICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgbmV3QXJndik7CisgIGlmIChhcmdjID4gMCkgeworICAgIGludCBza2lwID0gZ2VuID8gMiA6IDE7CisgICAgVGVzdENvbmZpZy5wYXJzZShhcmdjIC0gc2tpcCwgKGNvbnN0IGNoYXIgKiopKG5ld0FyZ3YgKyBza2lwKSk7CisgIH0KKyAgZGVsZXRlIFtdIG5ld0FyZ3Y7CisgIHRyeSB7CisgICAgaWYgKGdlbiA9PSB0cnVlKSB7CisgICAgICBzdHJpbmcgdHlwZSA9IFRlc3RDb25maWcuZ2V0KCJnZW5lcmF0ZS50eXBlIiwgIndvcmQiKTsKKyAgICAgIHN0cmluZyBjb2RlYyA9IFRlc3RDb25maWcuZ2V0KCJnZW5lcmF0ZS5jb2RlYyIsICIiKTsKKyAgICAgIGludDY0X3QgbGVuID0gVGVzdENvbmZpZy5nZXRJbnQoImdlbmVyYXRlLmxlbmd0aCIsIDEwMjQpOworICAgICAgc3RyaW5nIHRlbXA7CisgICAgICBHZW5lcmF0ZUtWVGV4dExlbmd0aCh0ZW1wLCBsZW4sIHR5cGUpOworICAgICAgaWYgKGNvZGVjLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICIlcyIsIHRlbXAuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBPdXRwdXRTdHJlYW0gKiBmb3V0ID0gRmlsZVN5c3RlbTo6Z2V0TG9jYWwoKS5jcmVhdGUoIi9kZXYvc3Rkb3V0Iik7CisgICAgICAgIEFwcGVuZEJ1ZmZlciBhcHAgPSBBcHBlbmRCdWZmZXIoKTsKKyAgICAgICAgYXBwLmluaXQoMTI4ICogMTAyNCwgZm91dCwgY29kZWMpOworICAgICAgICBhcHAud3JpdGUodGVtcC5kYXRhKCksIHRlbXAubGVuZ3RoKCkpOworICAgICAgICBmb3V0LT5jbG9zZSgpOworICAgICAgICBkZWxldGUgZm91dDsKKyAgICAgIH0KKyAgICAgIE5hdGl2ZU9iamVjdEZhY3Rvcnk6OlJlbGVhc2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgcmV0ID0gUlVOX0FMTF9URVNUUygpOworICAgICAgTmF0aXZlT2JqZWN0RmFjdG9yeTo6UmVsZWFzZSgpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICYgZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICBOYXRpdmVPYmplY3RGYWN0b3J5OjpSZWxlYXNlKCk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzaworCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpIHsKKyAgcmV0dXJuIE5hdGl2ZVRhc2s6OkRvTWFpbihhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RQcmltaXRpdmVzLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdFByaW1pdGl2ZXMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwNTFjNwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L1Rlc3RQcmltaXRpdmVzLmNjCkBAIC0wLDAgKzEsMzA0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCitURVNUKFByaW1pdGl2ZXMsIGZtZW1jbXApIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZzOworICBjaGFyIGJ1ZmZbMTRdOworICB2cy5wdXNoX2JhY2soIiIpOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNTAwMDsgaSArPSA3KSB7CisgICAgc25wcmludGYoYnVmZiwgMTQsICIlZCIsIGkgKiAzMSk7CisgICAgdnMucHVzaF9iYWNrKGJ1ZmYpOworICAgIHNucHJpbnRmKGJ1ZmYsIDEwLCAiJTAxMGQiLCBpKTsKKyAgICB2cy5wdXNoX2JhY2soYnVmZik7CisgIH0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2cy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdnMuc2l6ZSgpOyBqKyspIHsKKyAgICAgIHN0ZDo6c3RyaW5nICYgbHMgPSB2c1tpXTsKKyAgICAgIHN0ZDo6c3RyaW5nICYgcnMgPSB2c1tqXTsKKyAgICAgIHNpemVfdCBtID0gc3RkOjptaW4obHMubGVuZ3RoKCksIHJzLmxlbmd0aCgpKTsKKyAgICAgIGludCBjID0gbWVtY21wKGxzLmNfc3RyKCksIHJzLmNfc3RyKCksIG0pOworICAgICAgaW50IHQgPSBmbWVtY21wKGxzLmNfc3RyKCksIHJzLmNfc3RyKCksIG0pOworICAgICAgaWYgKCEoKGMgPT0gMCAmJiB0ID09IDApIHx8IChjID4gMCAmJiB0ID4gMCkgfHwgKGMgPCAwICYmIHQgPCAwKSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IHRlc3RfbWVtY21wKCkgeworICB1aW50OF90IGJ1ZmZbMjA0OF07CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAyMDQ4OyBpKyspIHsKKyAgICBidWZmW2ldID0gaSAmIDB4ZmY7CisgIH0KKyAgc3RkOjpyYW5kb21fc2h1ZmZsZShidWZmLCBidWZmICsgMjA0OCk7CisgIGludCByID0gMDsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDEwMDAwMDAwMDsgaSsrKSB7CisgICAgaW50IG9mZnNldCA9IGkgJSAxMDAwOworICAgIHIgKz0gbWVtY21wKGJ1ZmYsIGJ1ZmYgKyAxMDI0LCA1KTsKKyAgICByICs9IG1lbWNtcChidWZmICsgb2Zmc2V0LCBidWZmICsgMTEyNCwgOSk7CisgICAgciArPSBtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDEyMjQsIDEwKTsKKyAgICByICs9IG1lbWNtcChidWZmICsgb2Zmc2V0LCBidWZmICsgMTMyNCwgMTUpOworICAgIHIgKz0gbWVtY21wKGJ1ZmYgKyBvZmZzZXQsIGJ1ZmYgKyAxNDI0LCAxNik7CisgICAgciArPSBtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDE1MjQsIDE3KTsKKyAgICByICs9IG1lbWNtcChidWZmICsgb2Zmc2V0LCBidWZmICsgMTYyNCwgMTgpOworICAgIHIgKz0gbWVtY21wKGJ1ZmYgKyBvZmZzZXQsIGJ1ZmYgKyAxNzI0LCAxOSk7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9mbWVtY21wKCkgeworICBjaGFyIGJ1ZmZbMjA0OF07CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAyMDQ4OyBpKyspIHsKKyAgICBidWZmW2ldID0gaSAmIDB4ZmY7CisgIH0KKyAgc3RkOjpyYW5kb21fc2h1ZmZsZShidWZmLCBidWZmICsgMjA0OCk7CisgIGludCByID0gMDsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDEwMDAwMDAwMDsgaSsrKSB7CisgICAgaW50IG9mZnNldCA9IGkgJSAxMDAwOworICAgIHIgKz0gZm1lbWNtcChidWZmLCBidWZmICsgMTAyNCwgNSk7CisgICAgciArPSBmbWVtY21wKGJ1ZmYgKyBvZmZzZXQsIGJ1ZmYgKyAxMTI0LCA5KTsKKyAgICByICs9IGZtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDEyMjQsIDEwKTsKKyAgICByICs9IGZtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDEzMjQsIDE1KTsKKyAgICByICs9IGZtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDE0MjQsIDE2KTsKKyAgICByICs9IGZtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDE1MjQsIDE3KTsKKyAgICByICs9IGZtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDE2MjQsIDE4KTsKKyAgICByICs9IGZtZW1jbXAoYnVmZiArIG9mZnNldCwgYnVmZiArIDE3MjQsIDE5KTsKKyAgfQorICByZXR1cm4gcjsKK30KKworVEVTVChQZXJmLCBmbWVtY21wKSB7CisgIFRpbWVyIHQ7CisgIGludCBhID0gdGVzdF9tZW1jbXAoKTsKKyAgTE9HKCIlcyIsIHQuZ2V0SW50ZXJ2YWwoIiBtZW1jbXAgIikuY19zdHIoKSk7CisgIHQucmVzZXQoKTsKKyAgaW50IGIgPSB0ZXN0X2ZtZW1jbXAoKTsKKyAgTE9HKCIlcyIsIHQuZ2V0SW50ZXJ2YWwoIiBmbWVtY21wICIpLmNfc3RyKCkpOworICAvLyBwcmV2ZW50IGNvbXBpbGVyIG9wdGltaXphdGlvbgorICBUZXN0Q29uZmlnLnNldEludCgidGVtcHZhbHVlIiwgYSArIGIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21lbWNweV9wZXJmX2xlbihjaGFyICogc3JjLCBjaGFyICogZGVzdCwgc2l6ZV90IGxlbiwgc2l6ZV90IHRpbWUpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aW1lOyBpKyspIHsKKyAgICBtZW1jcHkoc3JjLCBkZXN0LCBsZW4pOworICAgIG1lbWNweShkZXN0LCBzcmMsIGxlbik7CisgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfbWVtY3B5X3BlcmZfbGVuKGNoYXIgKiBzcmMsIGNoYXIgKiBkZXN0LCBzaXplX3QgbGVuLCBzaXplX3QgdGltZSkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbWU7IGkrKykgeworICAgIHNpbXBsZV9tZW1jcHkoc3JjLCBkZXN0LCBsZW4pOworICAgIHNpbXBsZV9tZW1jcHkoZGVzdCwgc3JjLCBsZW4pOworICB9Cit9CisKK1RFU1QoUGVyZiwgc2ltcGxlX21lbWNweV9zbWFsbCkgeworICBjaGFyICogc3JjID0gbmV3IGNoYXJbMTAyNDBdOworICBjaGFyICogZGVzdCA9IG5ldyBjaGFyWzEwMjQwXTsKKyAgY2hhciBidWZmWzMyXTsKKyAgZm9yIChzaXplX3QgbGVuID0gMTsgbGVuIDwgMjU2OyBsZW4gPSBsZW4gKyAyKSB7CisgICAgTE9HKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBzbnByaW50ZihidWZmLCAzMiwgIiAgICAgICBtZW1jcHkgJWx1Qlx0IiwgbGVuKTsKKyAgICBUaW1lciB0OworICAgIHRlc3RfbWVtY3B5X3BlcmZfbGVuKHNyYywgZGVzdCwgbGVuLCAxMDAwMDAwKTsKKyAgICBMT0coIiVzIiwgdC5nZXRJbnRlcnZhbChidWZmKS5jX3N0cigpKTsKKyAgICBzbnByaW50ZihidWZmLCAzMiwgInNpbXBsZV9tZW1jcHkgJWx1Qlx0IiwgbGVuKTsKKyAgICB0LnJlc2V0KCk7CisgICAgdGVzdF9zaW1wbGVfbWVtY3B5X3BlcmZfbGVuKHNyYywgZGVzdCwgbGVuLCAxMDAwMDAwKTsKKyAgICBMT0coIiVzIiwgdC5nZXRJbnRlcnZhbChidWZmKS5jX3N0cigpKTsKKyAgfQorICBkZWxldGVbXSBzcmM7CisgIGRlbGV0ZVtdIGRlc3Q7Cit9CisKK2lubGluZSBjaGFyICogbWVtY2hyYnJmNChjaGFyICogcCwgY2hhciBjaCwgc2l6ZV90IGxlbikgeworICBzc2l6ZV90IGkgPSAwOworICBmb3IgKDsgaSA8ICgoc3NpemVfdClsZW4pIC0gMzsgaSArPSAzKSB7CisgICAgaWYgKHBbaV0gPT0gY2gpIHsKKyAgICAgIHJldHVybiBwICsgaTsKKyAgICB9CisgICAgaWYgKHBbaSArIDFdID09IGNoKSB7CisgICAgICByZXR1cm4gcCArIGkgKyAxOworICAgIH0KKyAgICBpZiAocFtpICsgMl0gPT0gY2gpIHsKKyAgICAgIHJldHVybiBwICsgaSArIDI7CisgICAgfQorICB9CisgIGZvciAoOyBpIDwgbGVuOyBpKyspIHsKKyAgICBpZiAocFtpXSA9PSBjaCkgeworICAgICAgcmV0dXJuIHAgKyBpOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworaW5saW5lIGNoYXIgKiBtZW1jaHJicmYyKGNoYXIgKiBwLCBjaGFyIGNoLCBzaXplX3QgbGVuKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuIC8gMjsgaSArPSAyKSB7CisgICAgaWYgKHBbaV0gPT0gY2gpIHsKKyAgICAgIHJldHVybiBwICsgaTsKKyAgICB9CisgICAgaWYgKHBbaSArIDFdID09IGNoKSB7CisgICAgICByZXR1cm4gcCArIGkgKyAxOworICAgIH0KKyAgfQorICBpZiAobGVuICUgMiAmJiBwW2xlbiAtIDFdID09IGNoKSB7CisgICAgcmV0dXJuIHAgKyBsZW4gLSAxOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvLyBub3Qgc2FmZSBpbiBNQUNPU1gsIHNlZ21lbnQgZmF1bHQsIHNob3VsZCBiZSBzYWZlIG9uIExpbnV4IHdpdGggb3V0IG1tYXAKK2lubGluZSBpbnQgbWVtY2hyX3NzZShjb25zdCBjaGFyICpzLCBpbnQgYywgaW50IGxlbikgeworICAvLyBsZW4gOiBlZHg7IGM6IGVzaTsgczpyZGkKKyAgaW50IGluZGV4ID0gMDsKKworI2lmZGVmIF9fWDY0CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oCisgICAgICAvLyJhbmQgJDB4ZmYsICUlZXNpOyIgLy9jbGVhciB1cHBlciBieXRlcworICAgICAgIm1vdmQgJSVlc2ksICUleG1tMTsiCisKKyAgICAgICJtb3YgJDEsICUlZWF4OyIKKyAgICAgICJhZGQgJDE2LCAlJWVkeDsiCisgICAgICAibW92ICUlcmRpICwlJXI4OyIKKworICAgICAgIjE6IgorICAgICAgIm1vdmRxdSAoJSVyZGkpLCAlJXhtbTI7IgorICAgICAgInN1YiAkMTYsICUlZWR4OyIKKyAgICAgICJhZGRxICQxNiwgJSVyZGk7IgorICAgICAgLy8icGNtcGVzdHJpICQweDAsICUleG1tMiwlJXhtbTE7IgorICAgICAgIi5ieXRlIDB4NjYgLDB4MGYgLDB4M2EgLDB4NjEgLDB4Y2EgLDB4MDA7IgorICAgICAgLy8ibGVhIDE2KCUlcmRpKSwgJSVyZGk7IgorICAgICAgImphIDFiOyIvL1JlczI9PTA6bm8gbWF0Y2ggYW5kIHpmbGFnPT0wOiBzIGlzIG5vdCBlbmQKKyAgICAgICJqYyAzZjsiLy9SZXMyPT0xOiBtYXRjaCBhbmQgcyBpcyBub3QgZW5kCisKKyAgICAgICJtb3YgJDB4ZmZmZmZmZmYsICUlZWF4OyIvL25vIG1hdGNoCisgICAgICAiam1wIDBmOyIKKworICAgICAgIjM6IgorICAgICAgInN1YiAlJXI4LCAlJXJkaTsiCisgICAgICAibGVhIC0xNiglJWVkaSwlJWVjeCksJSVlYXg7IgorCisgICAgICAiMDoiCisgICAgICAvLyAgICAgICAgIm1vdiAlJWVheCwgJTA7IgorICAgICAgOiI9YSIoaW5kZXgpLCI9RCIocyksIj1TIihjKSwiPWQiKGxlbikKKyAgICAgIDoiRCIocyksIlMiKGMpLCJkIihsZW4pCisgICAgICA6InJjeCIsInI4IiwibWVtb3J5IgorICApOworCisjZW5kaWYKKworICByZXR1cm4gaW5kZXg7Cit9CisKK1RFU1QoUGVyZiwgbWVtY2hyKSB7CisgIFJhbmRvbSByOworICBpbnQzMl90IHNpemUgPSAxMDAgKiAxMDI0ICogMTAyNDsKKyAgaW50MzJfdCBsaW5lTGVuZ3RoID0gVGVzdENvbmZpZy5nZXRJbnQoIm1lbWNoci5saW5lLmxlbmd0aCIsIDEwMCk7CisgIGNoYXIgKiBidWZmID0gbmV3IGNoYXJbc2l6ZSArIDE2XTsKKyAgbWVtc2V0KGJ1ZmYsICdhJywgc2l6ZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAvIGxpbmVMZW5ndGg7IGkrKykgeworICAgIGJ1ZmZbci5uZXh0X2ludDMyKHNpemUpXSA9ICdcbic7CisgIH0KKyAgVGltZXIgdGltZXI7CisgIGNoYXIgKiBwb3MgPSBidWZmOworICBpbnQgY291bnQgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChwb3MgPT0gYnVmZiArIHNpemUpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwb3MgPSAoY2hhciopbWVtY2hyKHBvcywgJ1xuJywgYnVmZiArIHNpemUgLSBwb3MpOworICAgIGlmIChwb3MgPT0gTlVMTCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcysrOworICAgIGNvdW50Kys7CisgIH0KKyAgTE9HKCIlcyIsIHRpbWVyLmdldFNwZWVkTTIoIm1lbWNociBieXRlcy9saW5lcyIsIHNpemUsIGNvdW50KS5jX3N0cigpKTsKKyAgdGltZXIucmVzZXQoKTsKKyAgcG9zID0gYnVmZjsKKyAgY291bnQgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChwb3MgPT0gYnVmZiArIHNpemUpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwb3MgPSAoY2hhciopbWVtY2hyYnJmMihwb3MsICdcbicsIGJ1ZmYgKyBzaXplIC0gcG9zKTsKKyAgICBpZiAocG9zID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwb3MrKzsKKyAgICBjb3VudCsrOworICB9CisgIExPRygiJXMiLCB0aW1lci5nZXRTcGVlZE0yKCJtZW1jaHJicmYyIGJ5dGVzL2xpbmVzIiwgc2l6ZSwgY291bnQpLmNfc3RyKCkpOworICB0aW1lci5yZXNldCgpOworICBwb3MgPSBidWZmOworICBjb3VudCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKHBvcyA9PSBidWZmICsgc2l6ZSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcyA9IChjaGFyKiltZW1jaHJicmY0KHBvcywgJ1xuJywgYnVmZiArIHNpemUgLSBwb3MpOworICAgIGlmIChwb3MgPT0gTlVMTCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcysrOworICAgIGNvdW50Kys7CisgIH0KKyAgTE9HKCIlcyIsIHRpbWVyLmdldFNwZWVkTTIoIm1lbWNocmJyZjQgYnl0ZXMvbGluZXMiLCBzaXplLCBjb3VudCkuY19zdHIoKSk7CisgIHRpbWVyLnJlc2V0KCk7CisgIHBvcyA9IGJ1ZmY7CisgIGNvdW50ID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAocG9zID09IGJ1ZmYgKyBzaXplKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaW50IHJldCA9IG1lbWNocl9zc2UocG9zLCAnXG4nLCBidWZmICsgc2l6ZSAtIHBvcyk7CisgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcyA9IHBvcyArIHJldDsKKyAgICBwb3MrKzsKKyAgICBjb3VudCsrOworICB9CisgIExPRygiJXMiLCB0aW1lci5nZXRTcGVlZE0yKCJtZW1jaHJfc3NlIGJ5dGVzL2xpbmVzIiwgc2l6ZSwgY291bnQpLmNfc3RyKCkpOworICBkZWxldGVbXSBidWZmOworfQorCitURVNUKFBlcmYsIG1lbWNweV9iYXRjaCkgeworICBpbnQzMl90IHNpemUgPSBUZXN0Q29uZmlnLmdldEludCgiaW5wdXQuc2l6ZSIsIDY0ICogMTAyNCk7CisgIHNpemVfdCBtYiA9IFRlc3RDb25maWcuZ2V0SW50KCJpbnB1dC5tYiIsIDMyMCkgKiAxMDI0ICogMTAyNFVMOworICBjaGFyICogc3JjID0gbmV3IGNoYXJbc2l6ZV07CisgIGNoYXIgKiBkZXN0ID0gbmV3IGNoYXJbc2l6ZV07CisgIG1lbXNldChzcmMsIDAsIHNpemUpOworICBtZW1zZXQoZGVzdCwgMCwgc2l6ZSk7CisgIFRpbWVyIHQ7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWI7IGkgKz0gc2l6ZSkgeworICAgIG1lbWNweShkZXN0LCBzcmMsIHNpemUpOworICB9CisgIExPRygiJXMiLCB0LmdldFNwZWVkTSgibWVtY3B5IiwgbWIpLmNfc3RyKCkpOworICB0LnJlc2V0KCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWI7IGkgKz0gc2l6ZSkgeworICAgIHNpbXBsZV9tZW1jcHkoZGVzdCwgc3JjLCBzaXplKTsKKyAgfQorICBMT0coIiVzIiwgdC5nZXRTcGVlZE0oInNpbXBsZV9tZW1jcHkiLCBtYikuY19zdHIoKSk7CisgIGRlbGV0ZVtdIHNyYzsKKyAgZGVsZXRlW10gZGVzdDsKK30KKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdFNvcnQuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9UZXN0U29ydC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzM5MWE2Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvVGVzdFNvcnQuY2MKQEAgLTAsMCArMSwzMDYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvU3RyZWFtcy5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJzLmgiCisjaW5jbHVkZSAidXRpbC9EdWFsUGl2b3RRdWlja1NvcnQuaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKworc3RyaW5nIGdCdWZmZXI7CisKK2lubGluZSBjb25zdCBjaGFyICogZ2V0X3Bvc2l0aW9uKHVpbnQzMl90IG9mZnNldCkgeworICByZXR1cm4gZ0J1ZmZlci5kYXRhKCkgKyBvZmZzZXQ7Cit9CisKKy8qKgorICogZmFzdCBtZW1jbXAKKyAqLworaW5saW5lIGludCBmbWVtY21wb3JpZyhjb25zdCBjaGFyICogc3JjLCBjb25zdCBjaGFyICogZGVzdCwgdWludDMyX3QgbGVuKSB7CisgIGNvbnN0IHVpbnQ2NF90ICogc3JjOCA9IChjb25zdCB1aW50NjRfdCopc3JjOworICBjb25zdCB1aW50NjRfdCAqIGRlc3Q4ID0gKGNvbnN0IHVpbnQ2NF90KilkZXN0OworICB3aGlsZSAobGVuID49IDgpIHsKKyAgICB1aW50NjRfdCBsID0gKnNyYzg7CisgICAgdWludDY0X3QgciA9ICpkZXN0ODsKKyAgICBpZiAobCAhPSByKSB7CisgICAgICBsID0gYnN3YXA2NChsKTsKKyAgICAgIHIgPSBic3dhcDY0KHIpOworICAgICAgcmV0dXJuIGwgPiByID8gMSA6IC0xOworICAgIH0KKyAgICArK3NyYzg7CisgICAgKytkZXN0ODsKKyAgICBsZW4gLT0gODsKKyAgfQorICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChsZW4gPT0gMSkgeworICAgIGludCBsID0gKGludCkoKih1aW50OF90KilzcmM4KTsKKyAgICBpbnQgciA9IChpbnQpKCoodWludDhfdCopZGVzdDgpOworICAgIHJldHVybiBsIC0gcjsKKyAgfQorICB1aW50NjRfdCBtYXNrID0gKDFVTEwgPDwgKGxlbiAqIDgpKSAtIDE7CisgIHVpbnQ2NF90IGwgPSAoKnNyYzgpICYgbWFzazsKKyAgdWludDY0X3QgciA9ICgqZGVzdDgpICYgbWFzazsKKyAgaWYgKGwgPT0gcikgeworICAgIHJldHVybiAwOworICB9CisgIGwgPSBic3dhcDY0KGwpOworICByID0gYnN3YXA2NChyKTsKKyAgcmV0dXJuIGwgPiByID8gMSA6IC0xOworfQorCisvKioKKyAqIGMgcXNvcnQgY29tcGFyZSBmdW5jdGlvbgorICovCitzdGF0aWMgaW50IGNvbXBhcmVfb2Zmc2V0KGNvbnN0IHZvaWQgKiBwbGgsIGNvbnN0IHZvaWQgKiBwcmgpIHsKKyAgS1ZCdWZmZXIgKiBsaGIgPSAoS1ZCdWZmZXIqKWdldF9wb3NpdGlvbigqKHVpbnQzMl90KilwbGgpOworICBLVkJ1ZmZlciAqIHJoYiA9IChLVkJ1ZmZlciopZ2V0X3Bvc2l0aW9uKCoodWludDMyX3QqKXByaCk7CisgIHVpbnQzMl90IG1pbmxlbiA9IHN0ZDo6bWluKGxoYi0+a2V5TGVuZ3RoLCByaGItPmtleUxlbmd0aCk7CisgIGludCByZXQgPSBtZW1jbXAobGhiLT5nZXRLZXkoKSwgcmhiLT5nZXRLZXkoKSwgbWlubGVuKTsKKyAgaWYgKHJldCkgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgcmV0dXJuIGxoYi0+a2V5TGVuZ3RoIC0gcmhiLT5rZXlMZW5ndGg7Cit9CisKKy8qKgorICogZHVhbHBpdm90IHNvcnQgY29tcGFyZSBmdW5jdGlvbgorICovCitjbGFzcyBDb21wYXJlT2Zmc2V0IHsKKyBwdWJsaWM6CisgIGludDY0X3Qgb3BlcmF0b3IoKSh1aW50MzJfdCBsaHMsIHVpbnQzMl90IHJocykgeworCisgICAgS1ZCdWZmZXIgKiBsaGIgPSAoS1ZCdWZmZXIqKWdldF9wb3NpdGlvbihsaHMpOworICAgIEtWQnVmZmVyICogcmhiID0gKEtWQnVmZmVyKilnZXRfcG9zaXRpb24ocmhzKTsKKworICAgIHVpbnQzMl90IG1pbmxlbiA9IHN0ZDo6bWluKGxoYi0+a2V5TGVuZ3RoLCByaGItPmtleUxlbmd0aCk7CisgICAgaW50NjRfdCByZXQgPSBtZW1jbXAobGhiLT5nZXRLZXkoKSwgcmhiLT5nZXRLZXkoKSwgbWlubGVuKTsKKyAgICBpZiAocmV0KSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gbGhiLT5rZXlMZW5ndGggLSByaGItPmtleUxlbmd0aDsKKyAgfQorfTsKKworLyoqCisgKiBxdWlja3NvcnQgY29tcGFyZSBmdW5jdGlvbgorICovCitjbGFzcyBPZmZzZXRMZXNzVGhhbiB7CisgcHVibGljOgorICBib29sIG9wZXJhdG9yKCkodWludDMyX3QgbGhzLCB1aW50MzJfdCByaHMpIHsKKyAgICBLVkJ1ZmZlciAqIGxoYiA9IChLVkJ1ZmZlciopZ2V0X3Bvc2l0aW9uKGxocyk7CisgICAgS1ZCdWZmZXIgKiByaGIgPSAoS1ZCdWZmZXIqKWdldF9wb3NpdGlvbihyaHMpOworCisgICAgdWludDMyX3QgbWlubGVuID0gc3RkOjptaW4obGhiLT5rZXlMZW5ndGgsIHJoYi0+a2V5TGVuZ3RoKTsKKyAgICBpbnQ2NF90IHJldCA9IG1lbWNtcChsaGItPmNvbnRlbnQsIHJoYi0+Y29udGVudCwgbWlubGVuKTsKKyAgICByZXR1cm4gcmV0IDwgMCB8fCAocmV0ID09IDAgJiYgKGxoYi0+a2V5TGVuZ3RoIDwgcmhiLT5rZXlMZW5ndGgpKTsKKyAgfQorfTsKKworLyoqCisgKiBjIHFzb3J0IGNvbXBhcmUgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBjb21wYXJlX29mZnNldDIoY29uc3Qgdm9pZCAqIHBsaCwgY29uc3Qgdm9pZCAqIHByaCkgeworCisgIEtWQnVmZmVyICogbGhiID0gKEtWQnVmZmVyKilnZXRfcG9zaXRpb24oKih1aW50MzJfdCopcGxoKTsKKyAgS1ZCdWZmZXIgKiByaGIgPSAoS1ZCdWZmZXIqKWdldF9wb3NpdGlvbigqKHVpbnQzMl90KilwcmgpOworCisgIHVpbnQzMl90IG1pbmxlbiA9IHN0ZDo6bWluKGxoYi0+a2V5TGVuZ3RoLCByaGItPmtleUxlbmd0aCk7CisgIGludDY0X3QgcmV0ID0gZm1lbWNtcChsaGItPmNvbnRlbnQsIHJoYi0+Y29udGVudCwgbWlubGVuKTsKKyAgaWYgKHJldCkgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgcmV0dXJuIGxoYi0+a2V5TGVuZ3RoIC0gcmhiLT5rZXlMZW5ndGg7Cit9CisKKy8qKgorICogZHVhbHBpdm90IHNvcnQgY29tcGFyZSBmdW5jdGlvbgorICovCitjbGFzcyBDb21wYXJlT2Zmc2V0MiB7CisgcHVibGljOgorICBpbnQ2NF90IG9wZXJhdG9yKCkodWludDMyX3QgbGhzLCB1aW50MzJfdCByaHMpIHsKKworICAgIEtWQnVmZmVyICogbGhiID0gKEtWQnVmZmVyKilnZXRfcG9zaXRpb24obGhzKTsKKyAgICBLVkJ1ZmZlciAqIHJoYiA9IChLVkJ1ZmZlciopZ2V0X3Bvc2l0aW9uKHJocyk7CisKKyAgICB1aW50MzJfdCBtaW5sZW4gPSBzdGQ6Om1pbihsaGItPmtleUxlbmd0aCwgcmhiLT5rZXlMZW5ndGgpOworICAgIGludDY0X3QgcmV0ID0gZm1lbWNtcChsaGItPmNvbnRlbnQsIHJoYi0+Y29udGVudCwgbWlubGVuKTsKKyAgICBpZiAocmV0KSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gbGhiLT5rZXlMZW5ndGggLSByaGItPmtleUxlbmd0aDsKKyAgfQorfTsKKworLyoqCisgKiBxdWlja3NvcnQgY29tcGFyZSBmdW5jdGlvbgorICovCitjbGFzcyBPZmZzZXRMZXNzVGhhbjIgeworIHB1YmxpYzoKKyAgYm9vbCBvcGVyYXRvcigpKHVpbnQzMl90IGxocywgdWludDMyX3QgcmhzKSB7CisKKyAgICBLVkJ1ZmZlciAqIGxoYiA9IChLVkJ1ZmZlciopZ2V0X3Bvc2l0aW9uKGxocyk7CisgICAgS1ZCdWZmZXIgKiByaGIgPSAoS1ZCdWZmZXIqKWdldF9wb3NpdGlvbihyaHMpOworCisgICAgdWludDMyX3QgbWlubGVuID0gc3RkOjptaW4obGhiLT5rZXlMZW5ndGgsIHJoYi0+a2V5TGVuZ3RoKTsKKyAgICBpbnQ2NF90IHJldCA9IGZtZW1jbXAobGhiLT5jb250ZW50LCByaGItPmNvbnRlbnQsIG1pbmxlbik7CisgICAgcmV0dXJuIHJldCA8IDAgfHwgKHJldCA9PSAwICYmIChsaGItPmtleUxlbmd0aCA8IHJoYi0+a2V5TGVuZ3RoKSk7CisgIH0KK307CisKK3ZvaWQgbWFrZUlucHV0V29yZChzdHJpbmcgJiBkZXN0LCB2ZWN0b3I8dWludDMyX3Q+ICYgb2Zmc2V0cywgdWludDY0X3QgbGVuZ3RoKSB7CisgIFJhbmRvbSByOworICBkZXN0LnJlc2VydmUobGVuZ3RoICsgMTAyNCk7CisgIHN0cmluZyBrLCB2OworICB3aGlsZSAodHJ1ZSkgeworICAgIGsgPSByLm5leHRXb3JkKCk7CisgICAgdiA9IHIubmV4dFdvcmQoKTsKKyAgICBvZmZzZXRzLnB1c2hfYmFjayhkZXN0Lmxlbmd0aCgpKTsKKyAgICB1aW50MzJfdCB0ZW1wTGVuID0gay5sZW5ndGgoKTsKKyAgICBkZXN0LmFwcGVuZCgoY29uc3QgY2hhciAqKSZ0ZW1wTGVuLCA0KTsKKyAgICBkZXN0LmFwcGVuZChrLmRhdGEoKSwgay5sZW5ndGgoKSk7CisgICAgdGVtcExlbiA9IHYubGVuZ3RoKCk7CisgICAgZGVzdC5hcHBlbmQoKGNvbnN0IGNoYXIgKikmdGVtcExlbiwgNCk7CisgICAgZGVzdC5hcHBlbmQodi5kYXRhKCksIHYubGVuZ3RoKCkpOworICAgIGlmIChkZXN0Lmxlbmd0aCgpID4gbGVuZ3RoKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK1RFU1QoUGVyZiwgc29ydCkgeworICB2ZWN0b3I8dWludDMyX3Q+IG9mZnNldHM7CisgIG1ha2VJbnB1dFdvcmQoZ0J1ZmZlciwgb2Zmc2V0cywgODAwMDAwMDApOworICBUaW1lciB0aW1lcjsKKyAgdmVjdG9yPHVpbnQzMl90PiBvZmZzZXRzdGVtcDFfMCA9IG9mZnNldHM7CisgIHZlY3Rvcjx1aW50MzJfdD4gb2Zmc2V0c3RlbXAxXzEgPSBvZmZzZXRzOworICB2ZWN0b3I8dWludDMyX3Q+IG9mZnNldHN0ZW1wMV8yID0gb2Zmc2V0czsKKyAgdmVjdG9yPHVpbnQzMl90PiBvZmZzZXRzdGVtcDFfMyA9IG9mZnNldHM7CisgIHRpbWVyLnJlc2V0KCk7CisgIHFzb3J0KCZvZmZzZXRzdGVtcDFfMFswXSwgb2Zmc2V0c3RlbXAxXzAuc2l6ZSgpLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX29mZnNldCk7CisgIHFzb3J0KCZvZmZzZXRzdGVtcDFfMVswXSwgb2Zmc2V0c3RlbXAxXzEuc2l6ZSgpLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX29mZnNldCk7CisgIHFzb3J0KCZvZmZzZXRzdGVtcDFfMlswXSwgb2Zmc2V0c3RlbXAxXzIuc2l6ZSgpLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX29mZnNldCk7CisgIHFzb3J0KCZvZmZzZXRzdGVtcDFfM1swXSwgb2Zmc2V0c3RlbXAxXzMuc2l6ZSgpLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX29mZnNldCk7CisgIExPRygiJXMiLCB0aW1lci5nZXRJbnRlcnZhbCgicXNvcnQiKS5jX3N0cigpKTsKKyAgb2Zmc2V0c3RlbXAxXzAgPSBvZmZzZXRzOworICBvZmZzZXRzdGVtcDFfMSA9IG9mZnNldHM7CisgIG9mZnNldHN0ZW1wMV8yID0gb2Zmc2V0czsKKyAgb2Zmc2V0c3RlbXAxXzMgPSBvZmZzZXRzOworICB0aW1lci5yZXNldCgpOworICBxc29ydCgmb2Zmc2V0c3RlbXAxXzBbMF0sIG9mZnNldHN0ZW1wMV8wLnNpemUoKSwgc2l6ZW9mKHVpbnQzMl90KSwgY29tcGFyZV9vZmZzZXQyKTsKKyAgcXNvcnQoJm9mZnNldHN0ZW1wMV8xWzBdLCBvZmZzZXRzdGVtcDFfMS5zaXplKCksIHNpemVvZih1aW50MzJfdCksIGNvbXBhcmVfb2Zmc2V0Mik7CisgIHFzb3J0KCZvZmZzZXRzdGVtcDFfMlswXSwgb2Zmc2V0c3RlbXAxXzIuc2l6ZSgpLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX29mZnNldDIpOworICBxc29ydCgmb2Zmc2V0c3RlbXAxXzNbMF0sIG9mZnNldHN0ZW1wMV8zLnNpemUoKSwgc2l6ZW9mKHVpbnQzMl90KSwgY29tcGFyZV9vZmZzZXQyKTsKKyAgTE9HKCIlcyIsIHRpbWVyLmdldEludGVydmFsKCJxc29ydCAyIikuY19zdHIoKSk7CisgIG9mZnNldHN0ZW1wMV8wID0gb2Zmc2V0czsKKyAgb2Zmc2V0c3RlbXAxXzEgPSBvZmZzZXRzOworICBvZmZzZXRzdGVtcDFfMiA9IG9mZnNldHM7CisgIG9mZnNldHN0ZW1wMV8zID0gb2Zmc2V0czsKKyAgdGltZXIucmVzZXQoKTsKKyAgc3RkOjpzb3J0KG9mZnNldHN0ZW1wMV8wLmJlZ2luKCksIG9mZnNldHN0ZW1wMV8wLmVuZCgpLCBPZmZzZXRMZXNzVGhhbigpKTsKKyAgc3RkOjpzb3J0KG9mZnNldHN0ZW1wMV8xLmJlZ2luKCksIG9mZnNldHN0ZW1wMV8xLmVuZCgpLCBPZmZzZXRMZXNzVGhhbigpKTsKKyAgc3RkOjpzb3J0KG9mZnNldHN0ZW1wMV8yLmJlZ2luKCksIG9mZnNldHN0ZW1wMV8yLmVuZCgpLCBPZmZzZXRMZXNzVGhhbigpKTsKKyAgc3RkOjpzb3J0KG9mZnNldHN0ZW1wMV8zLmJlZ2luKCksIG9mZnNldHN0ZW1wMV8zLmVuZCgpLCBPZmZzZXRMZXNzVGhhbigpKTsKKyAgTE9HKCIlcyIsIHRpbWVyLmdldEludGVydmFsKCJzdGQ6OnNvcnQiKS5jX3N0cigpKTsKKyAgb2Zmc2V0c3RlbXAxXzAgPSBvZmZzZXRzOworICBvZmZzZXRzdGVtcDFfMSA9IG9mZnNldHM7CisgIG9mZnNldHN0ZW1wMV8yID0gb2Zmc2V0czsKKyAgb2Zmc2V0c3RlbXAxXzMgPSBvZmZzZXRzOworICB0aW1lci5yZXNldCgpOworICBzdGQ6OnNvcnQob2Zmc2V0c3RlbXAxXzAuYmVnaW4oKSwgb2Zmc2V0c3RlbXAxXzAuZW5kKCksIE9mZnNldExlc3NUaGFuMigpKTsKKyAgc3RkOjpzb3J0KG9mZnNldHN0ZW1wMV8xLmJlZ2luKCksIG9mZnNldHN0ZW1wMV8xLmVuZCgpLCBPZmZzZXRMZXNzVGhhbjIoKSk7CisgIHN0ZDo6c29ydChvZmZzZXRzdGVtcDFfMi5iZWdpbigpLCBvZmZzZXRzdGVtcDFfMi5lbmQoKSwgT2Zmc2V0TGVzc1RoYW4yKCkpOworICBzdGQ6OnNvcnQob2Zmc2V0c3RlbXAxXzMuYmVnaW4oKSwgb2Zmc2V0c3RlbXAxXzMuZW5kKCksIE9mZnNldExlc3NUaGFuMigpKTsKKyAgTE9HKCIlcyIsIHRpbWVyLmdldEludGVydmFsKCJzdGQ6OnNvcnQgMiIpLmNfc3RyKCkpOworICBvZmZzZXRzdGVtcDFfMCA9IG9mZnNldHM7CisgIG9mZnNldHN0ZW1wMV8xID0gb2Zmc2V0czsKKyAgb2Zmc2V0c3RlbXAxXzIgPSBvZmZzZXRzOworICBvZmZzZXRzdGVtcDFfMyA9IG9mZnNldHM7CisgIHRpbWVyLnJlc2V0KCk7CisgIER1YWxQaXZvdFF1aWNrc29ydChvZmZzZXRzdGVtcDFfMCwgQ29tcGFyZU9mZnNldCgpKTsKKyAgRHVhbFBpdm90UXVpY2tzb3J0KG9mZnNldHN0ZW1wMV8xLCBDb21wYXJlT2Zmc2V0KCkpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzIsIENvbXBhcmVPZmZzZXQoKSk7CisgIER1YWxQaXZvdFF1aWNrc29ydChvZmZzZXRzdGVtcDFfMywgQ29tcGFyZU9mZnNldCgpKTsKKyAgTE9HKCIlcyIsIHRpbWVyLmdldEludGVydmFsKCJEdWFsUGl2b3RRdWlja3NvcnQiKS5jX3N0cigpKTsKKyAgb2Zmc2V0c3RlbXAxXzAgPSBvZmZzZXRzOworICBvZmZzZXRzdGVtcDFfMSA9IG9mZnNldHM7CisgIG9mZnNldHN0ZW1wMV8yID0gb2Zmc2V0czsKKyAgb2Zmc2V0c3RlbXAxXzMgPSBvZmZzZXRzOworICB0aW1lci5yZXNldCgpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzAsIENvbXBhcmVPZmZzZXQyKCkpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzEsIENvbXBhcmVPZmZzZXQyKCkpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzIsIENvbXBhcmVPZmZzZXQyKCkpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzMsIENvbXBhcmVPZmZzZXQyKCkpOworICBMT0coIiVzIiwgdGltZXIuZ2V0SW50ZXJ2YWwoIkR1YWxQaXZvdFF1aWNrc29ydCAyIikuY19zdHIoKSk7Cit9CisKK1RFU1QoUGVyZiwgc29ydENhY2hlTWlzcykgeworCisgIExPRygiVGVzdGluZyBwYXJ0aXRpb24gYmFzZWQgc29ydCwgc29ydCA0TUIgZXZlcnkgdGltZSIpOworCisgIHZlY3Rvcjx1aW50MzJfdD4gb2Zmc2V0czsKKyAgbWFrZUlucHV0V29yZChnQnVmZmVyLCBvZmZzZXRzLCA4MDAwMDAwMCk7CisgIFRpbWVyIHRpbWVyOworICB2ZWN0b3I8dWludDMyX3Q+IG9mZnNldHN0ZW1wMV8wID0gb2Zmc2V0czsKKyAgdmVjdG9yPHVpbnQzMl90PiBvZmZzZXRzdGVtcDFfMSA9IG9mZnNldHM7CisgIHZlY3Rvcjx1aW50MzJfdD4gb2Zmc2V0c3RlbXAxXzIgPSBvZmZzZXRzOworICB2ZWN0b3I8dWludDMyX3Q+IG9mZnNldHN0ZW1wMV8zID0gb2Zmc2V0czsKKworICB0aW1lci5yZXNldCgpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzAsIENvbXBhcmVPZmZzZXQyKCkpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzEsIENvbXBhcmVPZmZzZXQyKCkpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzIsIENvbXBhcmVPZmZzZXQyKCkpOworICBEdWFsUGl2b3RRdWlja3NvcnQob2Zmc2V0c3RlbXAxXzMsIENvbXBhcmVPZmZzZXQyKCkpOworICBMT0coIiVzIiwgdGltZXIuZ2V0SW50ZXJ2YWwoIkR1YWxQaXZvdFF1aWNrc29ydCAyIGZ1bGwgc29ydCIpLmNfc3RyKCkpOworCisgIHVpbnQzMl90IE1PRCA9IDEyODAwMDsKKyAgdWludDMyX3QgRU5EID0gb2Zmc2V0cy5zaXplKCk7CisKKyAgZm9yIChNT0QgPSAxMDI0OyBNT0QgPCBFTkQ7IE1PRCA8PD0gMSkgeworICAgIG9mZnNldHN0ZW1wMV8wID0gb2Zmc2V0czsKKyAgICBvZmZzZXRzdGVtcDFfMSA9IG9mZnNldHM7CisgICAgb2Zmc2V0c3RlbXAxXzIgPSBvZmZzZXRzOworICAgIG9mZnNldHN0ZW1wMV8zID0gb2Zmc2V0czsKKyAgICB0aW1lci5yZXNldCgpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBFTkQgLyBNT0Q7IGkrKykgeworICAgICAgaW50IGJhc2UgPSBpICogTU9EOworICAgICAgaW50IG1heCA9IChiYXNlICsgTU9EKSA+IEVORCA/IEVORCA6IChiYXNlICsgTU9EKTsKKyAgICAgIER1YWxQaXZvdFF1aWNrc29ydChvZmZzZXRzdGVtcDFfMCwgYmFzZSwgbWF4IC0gMSwgMywgQ29tcGFyZU9mZnNldDIoKSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBFTkQgLyBNT0Q7IGkrKykgeworICAgICAgaW50IGJhc2UgPSBpICogTU9EOworICAgICAgaW50IG1heCA9IChiYXNlICsgTU9EKSA+IEVORCA/IEVORCA6IChiYXNlICsgTU9EKTsKKyAgICAgIER1YWxQaXZvdFF1aWNrc29ydChvZmZzZXRzdGVtcDFfMSwgYmFzZSwgbWF4IC0gMSwgMywgQ29tcGFyZU9mZnNldDIoKSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBFTkQgLyBNT0Q7IGkrKykgeworICAgICAgaW50IGJhc2UgPSBpICogTU9EOworICAgICAgaW50IG1heCA9IChiYXNlICsgTU9EKSA+IEVORCA/IEVORCA6IChiYXNlICsgTU9EKTsKKyAgICAgIER1YWxQaXZvdFF1aWNrc29ydChvZmZzZXRzdGVtcDFfMiwgYmFzZSwgbWF4IC0gMSwgMywgQ29tcGFyZU9mZnNldDIoKSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBFTkQgLyBNT0Q7IGkrKykgeworICAgICAgaW50IGJhc2UgPSBpICogTU9EOworICAgICAgaW50IG1heCA9IChiYXNlICsgTU9EKSA+IEVORCA/IEVORCA6IChiYXNlICsgTU9EKTsKKyAgICAgIER1YWxQaXZvdFF1aWNrc29ydChvZmZzZXRzdGVtcDFfMywgYmFzZSwgbWF4IC0gMSwgMywgQ29tcGFyZU9mZnNldDIoKSk7CisgICAgfQorICAgIExPRygiJXMsIE1PRDogJWQiLCB0aW1lci5nZXRJbnRlcnZhbCgiRHVhbFBpdm90UXVpY2tzb3J0IDIgcGFydGl0aW9uIHNvcnQiKS5jX3N0cigpLCBNT0QpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEJ5dGVBcnJheS5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0Qnl0ZUFycmF5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjY3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEJ5dGVBcnJheS5jYwpAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisjaW5jbHVkZSAidGVzdF9jb21tb25zLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworVEVTVChCeXRlQXJyYXksIHJlYWQpIHsKKyAgQnl0ZUFycmF5ICogYnVmZmVyID0gbmV3IEJ5dGVBcnJheSgpOworICBidWZmZXItPnJlc2l6ZSgxMCk7CisgIEFTU0VSVF9FUSgxMCwgYnVmZmVyLT5zaXplKCkpOworICBjaGFyICogYnVmZjEgPSBidWZmZXItPmJ1ZmYoKTsKKworICBidWZmZXItPnJlc2l6ZSgxNSk7CisgIEFTU0VSVF9FUSgxNSwgYnVmZmVyLT5zaXplKCkpOworICBBU1NFUlRfRVEoYnVmZmVyLT5idWZmKCksIGJ1ZmYxKTsKKworICBidWZmZXItPnJlc2l6ZSgzMCk7CisgIEFTU0VSVF9FUSgzMCwgYnVmZmVyLT5zaXplKCkpOworICBBU1NFUlRfTkUoYnVmZmVyLT5idWZmKCksIGJ1ZmYxKTsKKworICBkZWxldGUgYnVmZmVyOworfQorCit9IC8qIG5hbWVzcGFjZSBOYXRpdmVUYXNrICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEJ5dGVCdWZmZXIuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEJ5dGVCdWZmZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhY2RkYQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0Qnl0ZUJ1ZmZlci5jYwpAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisjaW5jbHVkZSAidGVzdF9jb21tb25zLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworVEVTVChCeXRlQnVmZmVyLCByZWFkKSB7CisgIGNoYXIgKiBidWZmID0gbmV3IGNoYXJbMTAwXTsKKyAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyOworICBieXRlQnVmZmVyLnJlc2V0KGJ1ZmYsIDEwMCk7CisKKyAgQVNTRVJUX0VRKDAsIGJ5dGVCdWZmZXIucG9zaXRpb24oKSk7CisgIEFTU0VSVF9FUSgxMDAsIGJ5dGVCdWZmZXIuY2FwYWNpdHkoKSk7CisgIEFTU0VSVF9FUSgwLCBieXRlQnVmZmVyLmxpbWl0KCkpOworCisgIEFTU0VSVF9FUShidWZmLCBieXRlQnVmZmVyLmN1cnJlbnQoKSk7CisgIEFTU0VSVF9FUSgwLCBieXRlQnVmZmVyLnJlbWFpbigpKTsKKworICBieXRlQnVmZmVyLmFkdmFuY2UoMyk7CisgIEFTU0VSVF9FUSgzLCBieXRlQnVmZmVyLmN1cnJlbnQoKSAtIGJ5dGVCdWZmZXIuYmFzZSgpKTsKKworICBieXRlQnVmZmVyLnJld2luZCgxMCwgMjApOworICBBU1NFUlRfRVEoMjAsIGJ5dGVCdWZmZXIubGltaXQoKSk7CisKKyAgQVNTRVJUX0VRKDEwLCBieXRlQnVmZmVyLnBvc2l0aW9uKCkpOworICBkZWxldGUgW10gYnVmZjsKK30KK30gLyogbmFtZXNwYWNlIE5hdGl2ZVRhc2sgKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0Q29tcGFyYXRvckZvckR1YWxQaXZvdFF1aWNrU29ydC5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0Q29tcGFyYXRvckZvckR1YWxQaXZvdFF1aWNrU29ydC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU5ODBlCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RDb21wYXJhdG9yRm9yRHVhbFBpdm90UXVpY2tTb3J0LmNjCkBAIC0wLDAgKzEsODkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvQ29tYmluZXIuaCIKKyNpbmNsdWRlICJsaWIvTWVtb3J5QmxvY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitzdGF0aWMgY29uc3QgY2hhciAqIGV4cGVjdGVkU3JjID0gTlVMTDsKK3N0YXRpYyBpbnQgZXhwZWN0ZWRTcmNMZW5ndGggPSAwOworCitzdGF0aWMgY29uc3QgY2hhciAqIGV4cGVjdGVkRGVzdCA9IE5VTEw7CitzdGF0aWMgaW50IGV4cGVjdGVkRGVzdExlbmd0aCA9IDA7CisKK3N0YXRpYyBpbnQgY29tcGFyZVJlc3VsdCA9IDA7CisKK3ZvaWQgY2hlY2tJbnB1dEFyZ3VtZW50cyhjb25zdCBjaGFyICogc3JjLCB1aW50MzJfdCBzcmNMZW5ndGgsIGNvbnN0IGNoYXIgKiBkZXN0LAorICAgIHVpbnQzMl90IGRlc3RMZW5ndGgpIHsKKyAgQVNTRVJUX0VRKGV4cGVjdGVkU3JjLCBzcmMpOworICBBU1NFUlRfRVEoZXhwZWN0ZWRTcmNMZW5ndGgsIHNyY0xlbmd0aCk7CisKKyAgQVNTRVJUX0VRKGV4cGVjdGVkRGVzdCwgZGVzdCk7CisgIEFTU0VSVF9FUShleHBlY3RlZERlc3RMZW5ndGgsIGRlc3RMZW5ndGgpOworfQorCitpbnQgTW9ja0NvbXBhcmF0b3JGb3JEdWFsUGl2b3QoY29uc3QgY2hhciAqIHNyYywgdWludDMyX3Qgc3JjTGVuZ3RoLCBjb25zdCBjaGFyICogZGVzdCwKKyAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKSB7CisgIGNoZWNrSW5wdXRBcmd1bWVudHMoc3JjLCBzcmNMZW5ndGgsIGRlc3QsIGRlc3RMZW5ndGgpOworICByZXR1cm4gY29tcGFyZVJlc3VsdDsKK30KKworVEVTVChDb21wYXJhdG9yRm9yRHVhbFBpdm90UXVpY2tTb3J0LCBjb21wYXJlKSB7CisgIGNoYXIgKiBidWZmID0gbmV3IGNoYXJbMTAwXTsKKyAgS1ZCdWZmZXIgKiBrdjEgPSAoS1ZCdWZmZXIgKilidWZmOworCisgIGNvbnN0IGNoYXIgKiBLRVkgPSAiS0VZIjsKKyAgY29uc3QgY2hhciAqIFZBTFVFID0gIlZBTFVFIjsKKworICBrdjEtPmtleUxlbmd0aCA9IHN0cmxlbihLRVkpOworICBjaGFyICoga2V5ID0ga3YxLT5nZXRLZXkoKTsKKyAgOjptZW1jcHkoa2V5LCBLRVksIHN0cmxlbihLRVkpKTsKKyAga3YxLT52YWx1ZUxlbmd0aCA9IHN0cmxlbihWQUxVRSk7CisgIGNoYXIgKiB2YWx1ZSA9IGt2MS0+Z2V0VmFsdWUoKTsKKyAgOjptZW1jcHkodmFsdWUsIFZBTFVFLCBzdHJsZW4oVkFMVUUpKTsKKworICBjb25zdCBjaGFyICogS0VZMiA9ICJLRVkyIjsKKyAgY29uc3QgY2hhciAqIFZBTFVFMiA9ICJWQUxVRTIiOworCisgIEtWQnVmZmVyICoga3YyID0ga3YxLT5uZXh0KCk7CisgIGt2Mi0+a2V5TGVuZ3RoID0gc3RybGVuKEtFWTIpOworICBjaGFyICoga2V5MiA9IGt2Mi0+Z2V0S2V5KCk7CisgIDo6bWVtY3B5KGtleTIsIEtFWTIsIHN0cmxlbihLRVkyKSk7CisgIGt2Mi0+dmFsdWVMZW5ndGggPSBzdHJsZW4oVkFMVUUyKTsKKyAgY2hhciAqIHZhbHVlMiA9IGt2Mi0+Z2V0VmFsdWUoKTsKKyAgOjptZW1jcHkodmFsdWUyLCBWQUxVRTIsIHN0cmxlbihWQUxVRTIpKTsKKworICBDb21wYXJhdG9yRm9yRHVhbFBpdm90U29ydCBjb21wYXJhdG9yKGJ1ZmYsICZNb2NrQ29tcGFyYXRvckZvckR1YWxQaXZvdCk7CisKKyAgZXhwZWN0ZWRTcmMgPSBrdjEtPmdldEtleSgpOworICBleHBlY3RlZFNyY0xlbmd0aCA9IHN0cmxlbihLRVkpOworCisgIGV4cGVjdGVkRGVzdCA9IGt2Mi0+Z2V0S2V5KCk7CisgIGV4cGVjdGVkRGVzdExlbmd0aCA9IHN0cmxlbihLRVkyKTsKKworICBjb21wYXJlUmVzdWx0ID0gLTE7CisKKyAgQVNTRVJUX0VRKC0xLCBjb21wYXJhdG9yKChjaGFyICogKWt2MSAtIGJ1ZmYsIChjaGFyICogKWt2MiAtIGJ1ZmYpKTsKKyAgZGVsZXRlIFtdIGJ1ZmY7Cit9CisKK30gLyogbmFtZXNwYWNlIE5hdGl2ZVRhc2sgKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0Q29tcGFyYXRvckZvclN0ZFNvcnQuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdENvbXBhcmF0b3JGb3JTdGRTb3J0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTE0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdENvbXBhcmF0b3JGb3JTdGRTb3J0LmNjCkBAIC0wLDAgKzEsODkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvQ29tYmluZXIuaCIKKyNpbmNsdWRlICJsaWIvTWVtb3J5QmxvY2suaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitzdGF0aWMgY29uc3QgY2hhciAqIGV4cGVjdGVkU3JjID0gTlVMTDsKK3N0YXRpYyBpbnQgZXhwZWN0ZWRTcmNMZW5ndGggPSAwOworCitzdGF0aWMgY29uc3QgY2hhciAqIGV4cGVjdGVkRGVzdCA9IE5VTEw7CitzdGF0aWMgaW50IGV4cGVjdGVkRGVzdExlbmd0aCA9IDA7CisKK3N0YXRpYyBpbnQgY29tcGFyZVJlc3VsdCA9IDA7CisKK3ZvaWQgY2hlY2tJbnB1dEFyZ3VtZW50c0ZvclN0ZE91dChjb25zdCBjaGFyICogc3JjLCB1aW50MzJfdCBzcmNMZW5ndGgsIGNvbnN0IGNoYXIgKiBkZXN0LAorICAgIHVpbnQzMl90IGRlc3RMZW5ndGgpIHsKKyAgQVNTRVJUX0VRKGV4cGVjdGVkU3JjLCBzcmMpOworICBBU1NFUlRfRVEoZXhwZWN0ZWRTcmNMZW5ndGgsIHNyY0xlbmd0aCk7CisKKyAgQVNTRVJUX0VRKGV4cGVjdGVkRGVzdCwgZGVzdCk7CisgIEFTU0VSVF9FUShleHBlY3RlZERlc3RMZW5ndGgsIGRlc3RMZW5ndGgpOworfQorCitpbnQgTW9ja0NvbXBhcmF0b3JGb3JTdGRPdXQoY29uc3QgY2hhciAqIHNyYywgdWludDMyX3Qgc3JjTGVuZ3RoLCBjb25zdCBjaGFyICogZGVzdCwKKyAgICB1aW50MzJfdCBkZXN0TGVuZ3RoKSB7CisgIGNoZWNrSW5wdXRBcmd1bWVudHNGb3JTdGRPdXQoc3JjLCBzcmNMZW5ndGgsIGRlc3QsIGRlc3RMZW5ndGgpOworICByZXR1cm4gY29tcGFyZVJlc3VsdDsKK30KKworVEVTVChDb21wYXJhdG9yRm9yU3RkU29ydCwgY29tcGFyZSkgeworICBjaGFyICogYnVmZiA9IG5ldyBjaGFyWzEwMF07CisgIEtWQnVmZmVyICoga3YxID0gKEtWQnVmZmVyICopYnVmZjsKKworICBjb25zdCBjaGFyICogS0VZID0gIktFWSI7CisgIGNvbnN0IGNoYXIgKiBWQUxVRSA9ICJWQUxVRSI7CisKKyAga3YxLT5rZXlMZW5ndGggPSBzdHJsZW4oS0VZKTsKKyAgY2hhciAqIGtleSA9IGt2MS0+Z2V0S2V5KCk7CisgIDo6bWVtY3B5KGtleSwgS0VZLCBzdHJsZW4oS0VZKSk7CisgIGt2MS0+dmFsdWVMZW5ndGggPSBzdHJsZW4oVkFMVUUpOworICBjaGFyICogdmFsdWUgPSBrdjEtPmdldFZhbHVlKCk7CisgIDo6bWVtY3B5KHZhbHVlLCBWQUxVRSwgc3RybGVuKFZBTFVFKSk7CisKKyAgY29uc3QgY2hhciAqIEtFWTIgPSAiS0VZMiI7CisgIGNvbnN0IGNoYXIgKiBWQUxVRTIgPSAiVkFMVUUyIjsKKworICBLVkJ1ZmZlciAqIGt2MiA9IGt2MS0+bmV4dCgpOworICBrdjItPmtleUxlbmd0aCA9IHN0cmxlbihLRVkyKTsKKyAgY2hhciAqIGtleTIgPSBrdjItPmdldEtleSgpOworICA6Om1lbWNweShrZXkyLCBLRVkyLCBzdHJsZW4oS0VZMikpOworICBrdjItPnZhbHVlTGVuZ3RoID0gc3RybGVuKFZBTFVFMik7CisgIGNoYXIgKiB2YWx1ZTIgPSBrdjItPmdldFZhbHVlKCk7CisgIDo6bWVtY3B5KHZhbHVlMiwgVkFMVUUyLCBzdHJsZW4oVkFMVUUyKSk7CisKKyAgQ29tcGFyYXRvckZvclN0ZFNvcnQgY29tcGFyYXRvcihidWZmLCAmTW9ja0NvbXBhcmF0b3JGb3JTdGRPdXQpOworCisgIGV4cGVjdGVkU3JjID0ga3YxLT5jb250ZW50OworICBleHBlY3RlZFNyY0xlbmd0aCA9IHN0cmxlbihLRVkpOworCisgIGV4cGVjdGVkRGVzdCA9IGt2Mi0+Y29udGVudDsKKyAgZXhwZWN0ZWREZXN0TGVuZ3RoID0gc3RybGVuKEtFWTIpOworCisgIGNvbXBhcmVSZXN1bHQgPSAtMTsKKworICBBU1NFUlRfRVEodHJ1ZSwgY29tcGFyYXRvcigoY2hhciAqIClrdjEgLSBidWZmLCAoY2hhciAqIClrdjIgLSBidWZmKSk7CisgIGRlbGV0ZSBbXSBidWZmOworfQorCit9IC8qIG5hbWVzcGFjZSBOYXRpdmVUYXNrICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEZpeFNpemVDb250YWluZXIuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEZpeFNpemVDb250YWluZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiNWMzNwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0Rml4U2l6ZUNvbnRhaW5lci5jYwpAQCAtMCwwICsxLDU1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisjaW5jbHVkZSAidGVzdF9jb21tb25zLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworVEVTVChGaXhTaXplQ29udGFpbmVyLCB0ZXN0KSB7CisgIHVpbnQzMl90IGxlbmd0aCA9IDEwMDsKKyAgRml4U2l6ZUNvbnRhaW5lciAqIGNvbnRhaW5lciA9IG5ldyBGaXhTaXplQ29udGFpbmVyKCk7CisgIGNoYXIgKiBieXRlcyA9IG5ldyBjaGFyW2xlbmd0aF07CisgIGNvbnRhaW5lci0+d3JhcChieXRlcywgbGVuZ3RoKTsKKworICBBU1NFUlRfRVEoMCwgY29udGFpbmVyLT5wb3NpdGlvbigpKTsKKyAgaW50IHBvczEgPSAzOworICBjb250YWluZXItPnBvc2l0aW9uKHBvczEpOworICBBU1NFUlRfRVEocG9zMSwgY29udGFpbmVyLT5wb3NpdGlvbigpKTsKKyAgQVNTRVJUX0VRKGxlbmd0aCAtIHBvczEsIGNvbnRhaW5lci0+cmVtYWluKCkpOworCisgIGNvbnRhaW5lci0+cmV3aW5kKCk7CisgIEFTU0VSVF9FUSgwLCBjb250YWluZXItPnBvc2l0aW9uKCkpOworICBBU1NFUlRfRVEobGVuZ3RoLCBjb250YWluZXItPnNpemUoKSk7CisKKyAgc3RkOjpzdHJpbmcgdG9CZUZpbGxlZCA9ICJIZWxsbywgRml4Q29udGFpbmVyIjsKKworICBjb250YWluZXItPmZpbGwodG9CZUZpbGxlZC5jX3N0cigpLCB0b0JlRmlsbGVkLmxlbmd0aCgpKTsKKworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29udGFpbmVyLT5wb3NpdGlvbigpOyBpKyspIHsKKyAgICBjaGFyICogYyA9IGNvbnRhaW5lci0+YmFzZSgpICsgaTsKKyAgICBBU1NFUlRfRVEodG9CZUZpbGxlZFtpXSwgKmMpOworICB9CisKKyAgZGVsZXRlIFtdIGJ5dGVzOworICBkZWxldGUgY29udGFpbmVyOworfQorCit9IC8qIG5hbWVzcGFjZSBOYXRpdmVUYXNrICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEl0ZXJhdG9yLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RJdGVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjVjZDYwCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RJdGVyYXRvci5jYwpAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgImxpYi9Db21iaW5lci5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK2NsYXNzIE1vY2tJdGVyYXRvciA6IHB1YmxpYyBLVkl0ZXJhdG9yIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgaW50PiA+IGt2czsKKyAgdWludDMyX3QgaW5kZXg7CisgIHVpbnQzMl90IGV4cGVjdGVkS2V5R3JvdXBOdW07CisgIHN0ZDo6bWFwPGludCwgaW50PiBleHBlY3RrZXlDb3VudE1hcDsKKyAgY2hhciBidWZmZXJbOF07CisKKyBwdWJsaWM6CisgIE1vY2tJdGVyYXRvcigpCisgICAgICA6IGluZGV4KDApIHsKKyAgICBrdnMucHVzaF9iYWNrKHN0ZDo6cGFpcjxpbnQsIGludD4oMTAsIDEwMCkpOworCisgICAga3ZzLnB1c2hfYmFjayhzdGQ6OnBhaXI8aW50LCBpbnQ+KDEwLCAxMDApKTsKKyAgICBrdnMucHVzaF9iYWNrKHN0ZDo6cGFpcjxpbnQsIGludD4oMTAsIDEwMSkpOworICAgIGt2cy5wdXNoX2JhY2soc3RkOjpwYWlyPGludCwgaW50PigxMCwgMTAyKSk7CisKKyAgICBrdnMucHVzaF9iYWNrKHN0ZDo6cGFpcjxpbnQsIGludD4oMjAsIDIwMCkpOworICAgIGt2cy5wdXNoX2JhY2soc3RkOjpwYWlyPGludCwgaW50PigyMCwgMjAxKSk7CisgICAga3ZzLnB1c2hfYmFjayhzdGQ6OnBhaXI8aW50LCBpbnQ+KDIwLCAyMDIpKTsKKyAgICBrdnMucHVzaF9iYWNrKHN0ZDo6cGFpcjxpbnQsIGludD4oMzAsIDMwMikpOworICAgIGt2cy5wdXNoX2JhY2soc3RkOjpwYWlyPGludCwgaW50Pig0MCwgMzAyKSk7CisgICAgdGhpcy0+ZXhwZWN0ZWRLZXlHcm91cE51bSA9IDQ7CisKKyAgICBleHBlY3RrZXlDb3VudE1hcFsxMF0gPSA0OworICAgIGV4cGVjdGtleUNvdW50TWFwWzIwXSA9IDM7CisgICAgZXhwZWN0a2V5Q291bnRNYXBbMzBdID0gMTsKKyAgICBleHBlY3RrZXlDb3VudE1hcFs0MF0gPSAxOworICB9CisKKyAgYm9vbCBuZXh0KEJ1ZmZlciAmIGtleSwgQnVmZmVyICYgb3V0VmFsdWUpIHsKKyAgICBpZiAoaW5kZXggPCBrdnMuc2l6ZSgpKSB7CisgICAgICBzdGQ6OnBhaXI8aW50LCBpbnQ+IHZhbHVlID0ga3ZzLmF0KGluZGV4KTsKKyAgICAgICooKGludCAqKWJ1ZmZlcikgPSB2YWx1ZS5maXJzdDsKKyAgICAgICooKChpbnQgKilidWZmZXIpICsgMSkgPSB2YWx1ZS5zZWNvbmQ7CisgICAgICBrZXkucmVzZXQoYnVmZmVyLCA0KTsKKyAgICAgIG91dFZhbHVlLnJlc2V0KGJ1ZmZlciArIDQsIDQpOworICAgICAgaW5kZXgrKzsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1aW50MzJfdCBnZXRFeHBlY3RlZEtleUdyb3VwQ291bnQoKSB7CisgICAgcmV0dXJuIGV4cGVjdGVkS2V5R3JvdXBOdW07CisgIH0KKworICBzdGQ6Om1hcDxpbnQsIGludD4mIGdldEV4cGVjdGVkS2V5Q291bnRNYXAoKSB7CisgICAgcmV0dXJuIGV4cGVjdGtleUNvdW50TWFwOworICB9Cit9OworCit2b2lkIFRlc3RLZXlHcm91cEl0ZXJhdG9yKCkgeworICBNb2NrSXRlcmF0b3IgKiBpdGVyID0gbmV3IE1vY2tJdGVyYXRvcigpOworICBLZXlHcm91cEl0ZXJhdG9ySW1wbCAqIGdyb3VwSXRlcmF0b3IgPSBuZXcgS2V5R3JvdXBJdGVyYXRvckltcGwoaXRlcik7CisgIGNvbnN0IGNoYXIgKiBrZXkgPSBOVUxMOworCisgIHVpbnQzMl90IGtleUdyb3VwQ291bnQgPSAwOworICBzdGQ6Om1hcDxpbnQsIGludD4gYWN0dWFsS2V5Q291bnQ7CisgIHdoaWxlIChncm91cEl0ZXJhdG9yLT5uZXh0S2V5KCkpIHsKKyAgICBrZXlHcm91cENvdW50Kys7CisgICAgdWludDMyX3QgbGVuZ3RoID0gMDsKKyAgICBrZXkgPSBncm91cEl0ZXJhdG9yLT5nZXRLZXkobGVuZ3RoKTsKKyAgICBpbnQgKiBrZXlQdHIgPSAoaW50ICopa2V5OworICAgIGNvbnN0IGNoYXIgKiB2YWx1ZSA9IE5VTEw7CisgICAgd2hpbGUgKE5VTEwgIT0gKHZhbHVlID0gZ3JvdXBJdGVyYXRvci0+bmV4dFZhbHVlKGxlbmd0aCkpKSB7CisgICAgICBpZiAoYWN0dWFsS2V5Q291bnQuZmluZCgqa2V5UHRyKSA9PSBhY3R1YWxLZXlDb3VudC5lbmQoKSkgeworICAgICAgICBhY3R1YWxLZXlDb3VudFsqa2V5UHRyXSA9IDA7CisgICAgICB9CisgICAgICBhY3R1YWxLZXlDb3VudFsqa2V5UHRyXSsrOworICAgIH0KKyAgfQorICBBU1NFUlRfRVEoaXRlci0+Z2V0RXhwZWN0ZWRLZXlHcm91cENvdW50KCksIGtleUdyb3VwQ291bnQpOworICBzdGQ6Om1hcDxpbnQsIGludD4gJiBleHBlY3RlZEtleUNvdW50TWFwID0gaXRlci0+Z2V0RXhwZWN0ZWRLZXlDb3VudE1hcCgpOworICBmb3IgKHN0ZDo6bWFwPGludCwgaW50Pjo6aXRlcmF0b3Iga2V5Q291bnRJdGVyID0gYWN0dWFsS2V5Q291bnQuYmVnaW4oKTsKKyAgICAgIGtleUNvdW50SXRlciAhPSBhY3R1YWxLZXlDb3VudC5lbmQoKTsgKytrZXlDb3VudEl0ZXIpIHsKKyAgICB1aW50MzJfdCBrZXkgPSBrZXlDb3VudEl0ZXItPmZpcnN0OworICAgIHVpbnQzMl90IGV4cGVjdGVkQ291bnQgPSBleHBlY3RlZEtleUNvdW50TWFwW2tleV07CisgICAgQVNTRVJUX0VRKGV4cGVjdGVkQ291bnQsIGtleUNvdW50SXRlci0+c2Vjb25kKTsKKyAgfQorICBkZWxldGUgZ3JvdXBJdGVyYXRvcjsKKyAgZGVsZXRlIGl0ZXI7Cit9CisKK1RFU1QoSXRlcmF0b3IsIGtleUdyb3VwSXRlcmF0b3IpIHsKKyAgVGVzdEtleUdyb3VwSXRlcmF0b3IoKTsKK30KKworfSAvKiBuYW1lc3BhY2UgTmF0aXZlVGFzayAqLworCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdEtWQnVmZmVyLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RLVkJ1ZmZlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDdlMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RLVkJ1ZmZlci5jYwpAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImxpYi9jb21tb25zLmgiCisjaW5jbHVkZSAibGliL0NvbWJpbmVyLmgiCisjaW5jbHVkZSAidGVzdF9jb21tb25zLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworVEVTVChLVkJ1ZmZlciwgdGVzdCkgeworCisgIGNoYXIgKiBidWZmID0gbmV3IGNoYXJbMTAwXTsKKyAgS1ZCdWZmZXIgKiBrdjEgPSAoS1ZCdWZmZXIgKilidWZmOworCisgIGNvbnN0IGNoYXIgKiBLRVkgPSAiS0VZIjsKKyAgY29uc3QgY2hhciAqIFZBTFVFID0gIlZBTFVFIjsKKworICBrdjEtPmtleUxlbmd0aCA9IHN0cmxlbihLRVkpOworICBjaGFyICoga2V5ID0ga3YxLT5nZXRLZXkoKTsKKyAgOjptZW1jcHkoa2V5LCBLRVksIHN0cmxlbihLRVkpKTsKKyAga3YxLT52YWx1ZUxlbmd0aCA9IHN0cmxlbihWQUxVRSk7CisgIGNoYXIgKiB2YWx1ZSA9IGt2MS0+Z2V0VmFsdWUoKTsKKyAgOjptZW1jcHkodmFsdWUsIFZBTFVFLCBzdHJsZW4oVkFMVUUpKTsKKworICBBU1NFUlRfRVEoc3RybGVuKEtFWSkgKyBzdHJsZW4oVkFMVUUpICsgOCwga3YxLT5sZW5ndGgoKSk7CisKKyAgQVNTRVJUX0VRKDgsIGt2MS0+Z2V0S2V5KCkgLSBidWZmKTsKKyAgQVNTRVJUX0VRKHN0cmxlbihLRVkpICsgOCwga3YxLT5nZXRWYWx1ZSgpIC0gYnVmZik7CisKKyAga3YxLT5rZXlMZW5ndGggPSBic3dhcChrdjEtPmtleUxlbmd0aCk7CisgIGt2MS0+dmFsdWVMZW5ndGggPSBic3dhcChrdjEtPnZhbHVlTGVuZ3RoKTsKKworICBBU1NFUlRfRVEoOCwga3YxLT5oZWFkZXJMZW5ndGgoKSk7CisgIEFTU0VSVF9FUShzdHJsZW4oS0VZKSArIHN0cmxlbihWQUxVRSkgKyA4LCBrdjEtPmxlbmd0aENvbnZlcnRFbmRpdW0oKSk7CisgIGRlbGV0ZSBbXSBidWZmOworfQorCit9IC8qIG5hbWVzcGFjZSBOYXRpdmVUYXNrICovCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdE1lbUJsb2NrSXRlcmF0b3IuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdE1lbUJsb2NrSXRlcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3ODRmYgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0TWVtQmxvY2tJdGVyYXRvci5jYwpAQCAtMCwwICsxLDExMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorI2luY2x1ZGUgImxpYi9NYXBPdXRwdXRTcGVjLmgiCisjaW5jbHVkZSAibGliL01lbW9yeUJsb2NrLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworVEVTVChNZW1vcnlCbG9ja0l0ZXJhdG9yLCB0ZXN0KSB7CisgIGNvbnN0IHVpbnQzMl90IEJVRkZFUl9MRU5HVEggPSAxMDA7CisgIGNoYXIgKiBieXRlcyA9IG5ldyBjaGFyW0JVRkZFUl9MRU5HVEhdOworICBNZW1vcnlCbG9jayBibG9jayhieXRlcywgQlVGRkVSX0xFTkdUSCk7CisKKyAgY29uc3QgdWludDMyX3QgS1ZfU0laRSA9IDYwOworICBibG9jay5hbGxvY2F0ZUtWQnVmZmVyKEtWX1NJWkUpOworICBibG9jay5hbGxvY2F0ZUtWQnVmZmVyKEtWX1NJWkUpOworCisgIE1lbUJsb2NrSXRlcmF0b3IgaXRlcigmYmxvY2spOworCisgIHVpbnQzMl90IGtleUNvdW50ID0gMDsKKyAgd2hpbGUgKGl0ZXIubmV4dCgpKSB7CisgICAgS1ZCdWZmZXIgKiBrdiA9IGl0ZXIuZ2V0S1ZCdWZmZXIoKTsKKyAgICBBU1NFUlRfRVEoYmxvY2suZ2V0S1ZCdWZmZXIoa2V5Q291bnQpLCBrdik7CisgICAga2V5Q291bnQrKzsKKyAgfQorICBkZWxldGUgW10gYnl0ZXM7Cit9CisKK2NsYXNzIE1lbW9yeUJsb2NrRmFjdG9yeSB7CisgcHVibGljOgorICBzdGF0aWMgTWVtb3J5QmxvY2sgKiBjcmVhdGUoc3RkOjp2ZWN0b3I8aW50PiAmIGtleXMpIHsKKyAgICBjb25zdCB1aW50MzJfdCBCVUZGRVJfTEVOR1RIID0gMTAwMDsKKyAgICBjaGFyICogYnl0ZXMgPSBuZXcgY2hhcltCVUZGRVJfTEVOR1RIXTsKKyAgICBNZW1vcnlCbG9jayAqIGJsb2NrMSA9IG5ldyBNZW1vcnlCbG9jayhieXRlcywgQlVGRkVSX0xFTkdUSCk7CisKKyAgICBjb25zdCB1aW50MzJfdCBLVl9TSVpFID0gMTY7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7IGkrKykgeworICAgICAgdWludDMyX3QgaW5kZXggPSBrZXlzW2ldOworICAgICAgS1ZCdWZmZXIgKiBrdiA9IGJsb2NrMS0+YWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKworICAgICAga3YtPmtleUxlbmd0aCA9IDQ7CisgICAgICBrdi0+dmFsdWVMZW5ndGggPSA0OworICAgICAgdWludDMyX3QgKiBrZXkgPSAodWludDMyX3QgKilrdi0+Z2V0S2V5KCk7CisgICAgICAqa2V5ID0gYnN3YXAoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gYmxvY2sxOworICB9Cit9OworCitURVNUKE1lbW9yeUJsb2NrSXRlcmF0b3IsIGNvbXBhcmUpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2ZWN0b3IxOworCisgIHZlY3RvcjEucHVzaF9iYWNrKDIpOworICB2ZWN0b3IxLnB1c2hfYmFjayg0KTsKKyAgdmVjdG9yMS5wdXNoX2JhY2soNik7CisKKyAgc3RkOjp2ZWN0b3I8aW50PiB2ZWN0b3IyOworCisgIHZlY3RvcjIucHVzaF9iYWNrKDEpOworICB2ZWN0b3IyLnB1c2hfYmFjaygzKTsKKyAgdmVjdG9yMi5wdXNoX2JhY2soNSk7CisKKyAgQ29tcGFyYXRvclB0ciBieXRlc0NvbXBhcmF0b3IgPSBOYXRpdmVUYXNrOjpnZXRfY29tcGFyYXRvcihCeXRlc1R5cGUsIE5VTEwpOworCisgIE1lbW9yeUJsb2NrICogYmxvY2sxID0gTWVtb3J5QmxvY2tGYWN0b3J5OjpjcmVhdGUodmVjdG9yMSk7CisgIE1lbW9yeUJsb2NrICogYmxvY2syID0gTWVtb3J5QmxvY2tGYWN0b3J5OjpjcmVhdGUodmVjdG9yMik7CisKKyAgYmxvY2sxLT5zb3J0KENQUFNPUlQsIGJ5dGVzQ29tcGFyYXRvcik7CisgIGJsb2NrMi0+c29ydChDUFBTT1JULCBieXRlc0NvbXBhcmF0b3IpOworCisgIE1lbUJsb2NrSXRlcmF0b3IgKiBpdGVyMSA9IG5ldyBNZW1CbG9ja0l0ZXJhdG9yKGJsb2NrMSk7CisgIE1lbUJsb2NrSXRlcmF0b3IgKiBpdGVyMiA9IG5ldyBNZW1CbG9ja0l0ZXJhdG9yKGJsb2NrMik7CisKKyAgTWVtQmxvY2tDb21wYXJhdG9yIGNvbXBhcmF0b3IoYnl0ZXNDb21wYXJhdG9yKTsKKworICBBU1NFUlRfRVEoZmFsc2UsIGNvbXBhcmF0b3IoaXRlcjEsIGl0ZXIyKSk7CisKKyAgaXRlcjEtPm5leHQoKTsKKyAgQVNTRVJUX0VRKHRydWUsIGNvbXBhcmF0b3IoaXRlcjEsIGl0ZXIyKSk7CisKKyAgaXRlcjItPm5leHQoKTsKKyAgQVNTRVJUX0VRKGZhbHNlLCBjb21wYXJhdG9yKGl0ZXIxLCBpdGVyMikpOworCisgIGRlbGV0ZSBpdGVyMjsKKyAgZGVsZXRlIGl0ZXIxOworICBkZWxldGUgW10gYmxvY2syLT5iYXNlKCk7CisgIGRlbGV0ZSBbXSBibG9jazEtPmJhc2UoKTsKKyAgZGVsZXRlIGJsb2NrMjsKKyAgZGVsZXRlIGJsb2NrMTsKK30KK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RNZW1vcnlCbG9jay5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0TWVtb3J5QmxvY2suY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmNzNjNQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0TWVtb3J5QmxvY2suY2MKQEAgLTAsMCArMSwxMDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvTWFwT3V0cHV0U3BlYy5oIgorI2luY2x1ZGUgImxpYi9NZW1vcnlCbG9jay5oIgorCituYW1lc3BhY2UgTmF0aXZlVGFza1Rlc3QgeworCitURVNUKE1lbW9yeUJsb2NrLCB0ZXN0KSB7CisgIGNvbnN0IHVpbnQzMl90IEJVRkZFUl9MRU5HVEggPSAxMDAwOworICBjaGFyICogYnl0ZXMgPSBuZXcgY2hhcltCVUZGRVJfTEVOR1RIXTsKKyAgTWVtb3J5QmxvY2sgYmxvY2soYnl0ZXMsIEJVRkZFUl9MRU5HVEgpOworCisgIHVpbnQzMl90IE5PTl9FWElTVCA9IDM7CisgIEFTU0VSVF9FUShOVUxMLCBibG9jay5nZXRLVkJ1ZmZlcihOT05fRVhJU1QpKTsKKyAgQVNTRVJUX0VRKDAsIGJsb2NrLmdldEtWQ291bnQoKSk7CisgIEFTU0VSVF9FUShCVUZGRVJfTEVOR1RILCBibG9jay5yZW1haW5TcGFjZSgpKTsKKworICBDb21wYXJhdG9yUHRyIGJ5dGVzQ29tcGFyYXRvciA9IE5hdGl2ZVRhc2s6OmdldF9jb21wYXJhdG9yKEJ5dGVzVHlwZSwgTlVMTCk7CisgIGJsb2NrLnNvcnQoQ1BQU09SVCwgYnl0ZXNDb21wYXJhdG9yKTsKKyAgQVNTRVJUX0VRKHRydWUsIGJsb2NrLnNvcnRlZCgpKTsKKworICBjb25zdCB1aW50MzJfdCBLVl9TSVpFID0gMTY7CisgIEtWQnVmZmVyICoga3YxID0gYmxvY2suYWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKyAgS1ZCdWZmZXIgKiBrdjIgPSBibG9jay5hbGxvY2F0ZUtWQnVmZmVyKEtWX1NJWkUpOworCisgIEFTU0VSVF9FUSgyLCBibG9jay5nZXRLVkNvdW50KCkpOworICBBU1NFUlRfRVEoa3YxLCBibG9jay5nZXRLVkJ1ZmZlcigwKSk7CisgIEFTU0VSVF9FUShrdjIsIGJsb2NrLmdldEtWQnVmZmVyKDEpKTsKKworICBBU1NFUlRfRVEoQlVGRkVSX0xFTkdUSCAtIDIgKiBLVl9TSVpFLCBibG9jay5yZW1haW5TcGFjZSgpKTsKKyAgQVNTRVJUX0VRKGZhbHNlLCBibG9jay5zb3J0ZWQoKSk7CisgIGRlbGV0ZSBbXSBieXRlczsKK30KKworVEVTVChNZW1vcnlCbG9jaywgb3ZlcmZsb3cpIHsKKyAgY29uc3QgdWludDMyX3QgQlVGRkVSX0xFTkdUSCA9IDEwMDsKKyAgY2hhciAqIGJ5dGVzID0gbmV3IGNoYXJbQlVGRkVSX0xFTkdUSF07CisgIE1lbW9yeUJsb2NrIGJsb2NrKGJ5dGVzLCBCVUZGRVJfTEVOR1RIKTsKKworICBjb25zdCB1aW50MzJfdCBLVl9TSVpFID0gNjA7CisgIEtWQnVmZmVyICoga3YxID0gYmxvY2suYWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKyAgS1ZCdWZmZXIgKiBrdjIgPSBibG9jay5hbGxvY2F0ZUtWQnVmZmVyKEtWX1NJWkUpOworCisgIEFTU0VSVF9FUShrdjEsIGJsb2NrLmdldEtWQnVmZmVyKDApKTsKKyAgQVNTRVJUX0VRKGt2MiwgYmxvY2suZ2V0S1ZCdWZmZXIoMSkpOworCisgIEFTU0VSVF9FUSgxLCBibG9jay5nZXRLVkNvdW50KCkpOworCisgIEFTU0VSVF9FUShCVUZGRVJfTEVOR1RIIC0gS1ZfU0laRSwgYmxvY2sucmVtYWluU3BhY2UoKSk7CisgIGRlbGV0ZSBbXSBieXRlczsKK30KKworVEVTVChNZW1vcnlCbG9jaywgc29ydCkgeworICBjb25zdCB1aW50MzJfdCBCVUZGRVJfTEVOR1RIID0gMTAwMDsKKyAgY2hhciAqIGJ5dGVzID0gbmV3IGNoYXJbQlVGRkVSX0xFTkdUSF07CisgIE1lbW9yeUJsb2NrIGJsb2NrKGJ5dGVzLCBCVUZGRVJfTEVOR1RIKTsKKworICBjb25zdCB1aW50MzJfdCBLVl9TSVpFID0gMTY7CisgIEtWQnVmZmVyICogYmlnID0gYmxvY2suYWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKyAgS1ZCdWZmZXIgKiBzbWFsbCA9IGJsb2NrLmFsbG9jYXRlS1ZCdWZmZXIoS1ZfU0laRSk7CisgIEtWQnVmZmVyICogbWVkaXVtID0gYmxvY2suYWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKworICBjb25zdCB1aW50MzJfdCBTTUFMTCA9IDEwMDsKKyAgY29uc3QgdWludDMyX3QgTUVESVVNID0gMTAwMDsKKyAgY29uc3QgdWludDMyX3QgQklHID0gMTAwMDA7CisKKyAgbWVkaXVtLT5rZXlMZW5ndGggPSA0OworICBtZWRpdW0tPnZhbHVlTGVuZ3RoID0gNDsKKyAgdWludDMyX3QgKiBtZWRpdW1LZXkgPSAodWludDMyX3QgKiltZWRpdW0tPmdldEtleSgpOworICAqbWVkaXVtS2V5ID0gYnN3YXAoTUVESVVNKTsKKworICBzbWFsbC0+a2V5TGVuZ3RoID0gNDsKKyAgc21hbGwtPnZhbHVlTGVuZ3RoID0gNDsKKyAgdWludDMyX3QgKiBzbWFsbEtleSA9ICh1aW50MzJfdCAqKXNtYWxsLT5nZXRLZXkoKTsKKyAgKnNtYWxsS2V5ID0gYnN3YXAoU01BTEwpOworCisgIGJpZy0+a2V5TGVuZ3RoID0gNDsKKyAgYmlnLT52YWx1ZUxlbmd0aCA9IDQ7CisgIHVpbnQzMl90ICogYmlnS2V5ID0gKHVpbnQzMl90ICopYmlnLT5nZXRLZXkoKTsKKyAgKmJpZ0tleSA9IGJzd2FwKEJJRyk7CisKKyAgQ29tcGFyYXRvclB0ciBieXRlc0NvbXBhcmF0b3IgPSBOYXRpdmVUYXNrOjpnZXRfY29tcGFyYXRvcihCeXRlc1R5cGUsIE5VTEwpOworICBibG9jay5zb3J0KENQUFNPUlQsIGJ5dGVzQ29tcGFyYXRvcik7CisKKyAgQVNTRVJUX0VRKHNtYWxsLCBibG9jay5nZXRLVkJ1ZmZlcigwKSk7CisgIEFTU0VSVF9FUShtZWRpdW0sIGJsb2NrLmdldEtWQnVmZmVyKDEpKTsKKyAgQVNTRVJUX0VRKGJpZywgYmxvY2suZ2V0S1ZCdWZmZXIoMikpOworICBkZWxldGUgW10gYnl0ZXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIE5hdGl2ZVRhc2sKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0TWVtb3J5UG9vbC5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0TWVtb3J5UG9vbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM0MjFkCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RNZW1vcnlQb29sLmNjCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKyNpbmNsdWRlICJsaWIvUGFydGl0aW9uQnVja2V0LmgiCisjaW5jbHVkZSAibGliL1BhcnRpdGlvbkJ1Y2tldEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGliL01lbW9yeUJsb2NrLmgiCisjaW5jbHVkZSAibGliL0lGaWxlLmgiCisKK25hbWVzcGFjZSBOYXRpdmVUYXNrIHsKKworVEVTVChNZW1vcnlQb29sLCBnZW5lcmFsKSB7CisgIE1lbW9yeVBvb2wgKiBwb29sID0gbmV3IE1lbW9yeVBvb2woKTsKKyAgY29uc3QgdWludDMyX3QgUE9PTF9TSVpFID0gMTAyNDsKKworICBwb29sLT5pbml0KFBPT0xfU0laRSk7CisKKyAgdWludDMyX3QgbWluID0gMTAyNDsKKyAgdWludDMyX3QgZXhwZWN0ID0gMjA0ODsKKyAgdWludDMyX3QgYWxsb2NhdGVkID0gMDsKKyAgY2hhciAqIGJ1ZmYgPSBwb29sLT5hbGxvY2F0ZShtaW4sIGV4cGVjdCwgYWxsb2NhdGVkKTsKKyAgQVNTRVJUX05FKCh2b2lkICopTlVMTCwgYnVmZik7CisgIGJ1ZmYgPSBwb29sLT5hbGxvY2F0ZShtaW4sIGV4cGVjdCwgYWxsb2NhdGVkKTsKKyAgQVNTRVJUX0VRKE5VTEwsIGJ1ZmYpOworCisgIHBvb2wtPnJlc2V0KCk7CisgIGJ1ZmYgPSBwb29sLT5hbGxvY2F0ZShtaW4sIGV4cGVjdCwgYWxsb2NhdGVkKTsKKyAgQVNTRVJUX05FKCh2b2lkICopTlVMTCwgYnVmZik7CisKKyAgZGVsZXRlIHBvb2w7Cit9Cit9IC8vIG5hbWVzcGFjZSBOYXRpdmVUYXNrCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdFBhcnRpdGlvbkJ1Y2tldC5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L2xpYi9UZXN0UGFydGl0aW9uQnVja2V0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZTFiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdFBhcnRpdGlvbkJ1Y2tldC5jYwpAQCAtMCwwICsxLDIyMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorI2luY2x1ZGUgImxpYi9QYXJ0aXRpb25CdWNrZXQuaCIKKyNpbmNsdWRlICJsaWIvUGFydGl0aW9uQnVja2V0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsaWIvTWVtb3J5QmxvY2suaCIKKyNpbmNsdWRlICJsaWIvSUZpbGUuaCIKKworbmFtZXNwYWNlIE5hdGl2ZVRhc2sgeworCitjbGFzcyBNb2NrSUZpbGVXcml0ZXIgOiBwdWJsaWMgSUZpbGVXcml0ZXIgeworIHByaXZhdGU6CisgIGNoYXIgKiBfYnVmZjsKKyAgdWludDMyX3QgX3Bvc2l0aW9uOworICB1aW50MzJfdCBfY2FwYWNpdHk7CisKKyBwdWJsaWM6CisgIE1vY2tJRmlsZVdyaXRlcihjaGFyICogYnVmZiwgdWludDMyX3QgY2FwYWNpdHkpCisgICAgICA6IElGaWxlV3JpdGVyKE5VTEwsIENIRUNLU1VNX05PTkUsIFRleHRUeXBlLCBUZXh0VHlwZSwgIiIsIE5VTEwpLCBfYnVmZihidWZmKSwgX3Bvc2l0aW9uKDApLAorICAgICAgICAgIF9jYXBhY2l0eShjYXBhY2l0eSkgeworICB9CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IGNoYXIgKiBrZXksIHVpbnQzMl90IGtleUxlbiwgY29uc3QgY2hhciAqIHZhbHVlLCB1aW50MzJfdCB2YWx1ZUxlbikgeworICAgIEtWQnVmZmVyICoga3YgPSAoS1ZCdWZmZXIgKikoX2J1ZmYgKyBfcG9zaXRpb24pOworICAgIGt2LT5rZXlMZW5ndGggPSBrZXlMZW47CisgICAga3YtPnZhbHVlTGVuZ3RoID0gdmFsdWVMZW47CisgICAgKigodWludDMyX3QgKilrdi0+Z2V0S2V5KCkpID0gKigodWludDMyX3QgKilrZXkpOworICAgICooKHVpbnQzMl90ICopa3YtPmdldFZhbHVlKCkpID0gKigodWludDMyX3QgKil2YWx1ZSk7CisgICAgX3Bvc2l0aW9uICs9IGt2LT5sZW5ndGgoKTsKKyAgfQorCisgIGNoYXIgKiBidWZmKCkgeworICAgIHJldHVybiBfYnVmZjsKKyAgfQorfTsKKworVEVTVChQYXJ0aXRpb25CdWNrZXQsIGdlbmVyYWwpIHsKKyAgTWVtb3J5UG9vbCAqIHBvb2wgPSBuZXcgTWVtb3J5UG9vbCgpOworICBjb25zdCB1aW50MzJfdCBQT09MX1NJWkUgPSAxMDI0ICogMTAyNDsgLy8gMU1CCisgIGNvbnN0IHVpbnQzMl90IEJMT0NLX1NJWkUgPSAxMDI0OyAvLyAxS0IKKyAgY29uc3QgdWludDMyX3QgUEFSVElUSU9OX0lEID0gMzsKKyAgcG9vbC0+aW5pdChQT09MX1NJWkUpOworICBDb21wYXJhdG9yUHRyIGNvbXBhcmF0b3IgPSBOYXRpdmVUYXNrOjpnZXRfY29tcGFyYXRvcihCeXRlc1R5cGUsIE5VTEwpOworICBQYXJ0aXRpb25CdWNrZXQgKiBidWNrZXQgPSBuZXcgUGFydGl0aW9uQnVja2V0KHBvb2wsIFBBUlRJVElPTl9JRCwgY29tcGFyYXRvciwgTlVMTCwgQkxPQ0tfU0laRSk7CisgIEFTU0VSVF9FUSgwLCBidWNrZXQtPmdldEtWQ291bnQoKSk7CisgIEtWSXRlcmF0b3IgKiBOVUxMUE9JTlRFUiA9IDA7CisgIEFTU0VSVF9FUShOVUxMUE9JTlRFUiwgYnVja2V0LT5nZXRJdGVyYXRvcigpKTsKKyAgQVNTRVJUX0VRKFBBUlRJVElPTl9JRCwgYnVja2V0LT5nZXRQYXJ0aXRpb25JZCgpKTsKKyAgYnVja2V0LT5zb3J0KERVQUxQSVZPVFNPUlQpOworICBidWNrZXQtPnNwaWxsKE5VTEwpOworCisgIGRlbGV0ZSBidWNrZXQ7CisgIGRlbGV0ZSBwb29sOworfQorCitURVNUKFBhcnRpdGlvbkJ1Y2tldCwgbXVsdGlwbGVNZW1vcnlCbG9jaykgeworICBNZW1vcnlQb29sICogcG9vbCA9IG5ldyBNZW1vcnlQb29sKCk7CisgIGNvbnN0IHVpbnQzMl90IFBPT0xfU0laRSA9IDEwMjQgKiAxMDI0OyAvLyAxTUIKKyAgY29uc3QgdWludDMyX3QgQkxPQ0tfU0laRSA9IDEwMjQ7IC8vIDFLQgorICBjb25zdCB1aW50MzJfdCBQQVJUSVRJT05fSUQgPSAzOworICBwb29sLT5pbml0KFBPT0xfU0laRSk7CisgIENvbXBhcmF0b3JQdHIgY29tcGFyYXRvciA9IE5hdGl2ZVRhc2s6OmdldF9jb21wYXJhdG9yKEJ5dGVzVHlwZSwgTlVMTCk7CisgIFBhcnRpdGlvbkJ1Y2tldCAqIGJ1Y2tldCA9IG5ldyBQYXJ0aXRpb25CdWNrZXQocG9vbCwgUEFSVElUSU9OX0lELCBjb21wYXJhdG9yLCBOVUxMLCBCTE9DS19TSVpFKTsKKworICBjb25zdCB1aW50MzJfdCBLVl9TSVpFID0gNzAwOworICBjb25zdCB1aW50MzJfdCBTTUFMTF9LVl9TSVpFID0gMTAwOworICAvLyBUbyBzdXBwcmVzcyB2YWxncmluZCBlcnJvcgorICAvLyB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAgLy8gY3JlYXRlIGl0ZXJhdG9yIG9uIHRoZSBQYXJ0aXRpb25CdWNrZXIsIGJlY2F1c2UKKyAgLy8gdGhvc2UgbWVtb3J5IHdpbGwgYmUgY29tcGFyZWQgd2hlbiBjcmVhdGUgbWluaGVhcAorICBLVkJ1ZmZlciAqIGt2MSA9IGJ1Y2tldC0+YWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKyAgbWVtc2V0KGt2MSwgMCwgS1ZfU0laRSk7CisgIEtWQnVmZmVyICoga3YyID0gYnVja2V0LT5hbGxvY2F0ZUtWQnVmZmVyKFNNQUxMX0tWX1NJWkUpOworICBtZW1zZXQoa3YyLCAwLCBTTUFMTF9LVl9TSVpFKTsKKyAgS1ZCdWZmZXIgKiBrdjMgPSBidWNrZXQtPmFsbG9jYXRlS1ZCdWZmZXIoS1ZfU0laRSk7CisgIG1lbXNldChrdjMsIDAsIEtWX1NJWkUpOworCisgIEFTU0VSVF9FUSgzLCBidWNrZXQtPmdldEtWQ291bnQoKSk7CisgIEtWSXRlcmF0b3IgKiBOVUxMUE9JTlRFUiA9IDA7CisgIEtWSXRlcmF0b3IgKiBpdGVyID0gYnVja2V0LT5nZXRJdGVyYXRvcigpOworICBBU1NFUlRfTkUoTlVMTFBPSU5URVIsIGl0ZXIpOworICBkZWxldGUgaXRlcjsKKyAgQVNTRVJUX0VRKDIsIGJ1Y2tldC0+Z2V0TWVtb3J5QmxvY2tDb3VudCgpKTsKKworICBidWNrZXQtPnJlc2V0KCk7CisgIGl0ZXIgPSBidWNrZXQtPmdldEl0ZXJhdG9yKCk7CisgIEFTU0VSVF9FUShOVUxMUE9JTlRFUiwgaXRlcik7CisgIGRlbGV0ZSBpdGVyOworICBBU1NFUlRfRVEoMCwgYnVja2V0LT5nZXRNZW1vcnlCbG9ja0NvdW50KCkpOworCisgIGRlbGV0ZSBidWNrZXQ7CisgIGRlbGV0ZSBwb29sOworfQorCitURVNUKFBhcnRpdGlvbkJ1Y2tldCwgc29ydCkgeworICBNZW1vcnlQb29sICogcG9vbCA9IG5ldyBNZW1vcnlQb29sKCk7CisgIGNvbnN0IHVpbnQzMl90IFBPT0xfU0laRSA9IDEwMjQgKiAxMDI0OyAvLyAxTUIKKyAgY29uc3QgdWludDMyX3QgQkxPQ0tfU0laRSA9IDEwMjQ7IC8vIDFLQgorICBjb25zdCB1aW50MzJfdCBQQVJUSVRJT05fSUQgPSAzOworICBwb29sLT5pbml0KFBPT0xfU0laRSk7CisgIENvbXBhcmF0b3JQdHIgY29tcGFyYXRvciA9IE5hdGl2ZVRhc2s6OmdldF9jb21wYXJhdG9yKEJ5dGVzVHlwZSwgTlVMTCk7CisgIFBhcnRpdGlvbkJ1Y2tldCAqIGJ1Y2tldCA9IG5ldyBQYXJ0aXRpb25CdWNrZXQocG9vbCwgUEFSVElUSU9OX0lELCBjb21wYXJhdG9yLCBOVUxMLCBCTE9DS19TSVpFKTsKKworICBjb25zdCB1aW50MzJfdCBLVl9TSVpFID0gNzAwOworICBjb25zdCB1aW50MzJfdCBTTUFMTF9LVl9TSVpFID0gMTAwOworICBLVkJ1ZmZlciAqIGt2MSA9IGJ1Y2tldC0+YWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKyAgS1ZCdWZmZXIgKiBrdjIgPSBidWNrZXQtPmFsbG9jYXRlS1ZCdWZmZXIoU01BTExfS1ZfU0laRSk7CisgIEtWQnVmZmVyICoga3YzID0gYnVja2V0LT5hbGxvY2F0ZUtWQnVmZmVyKEtWX1NJWkUpOworCisgIGNvbnN0IHVpbnQzMl90IFNNQUxMID0gMTA7CisgIGNvbnN0IHVpbnQzMl90IE1FRElVTSA9IDEwMDsKKyAgY29uc3QgdWludDMyX3QgQklHID0gMTAwMDsKKworICBrdjEtPmtleUxlbmd0aCA9IDQ7CisgICooKHVpbnQzMl90ICopa3YxLT5nZXRLZXkoKSkgPSBic3dhcChCSUcpOworICBrdjEtPnZhbHVlTGVuZ3RoID0gS1ZfU0laRSAtIGt2MS0+aGVhZGVyTGVuZ3RoKCkgLSBrdjEtPmtleUxlbmd0aDsKKworICBrdjItPmtleUxlbmd0aCA9IDQ7CisgICooKHVpbnQzMl90ICopa3YyLT5nZXRLZXkoKSkgPSBic3dhcChTTUFMTCk7CisgIGt2Mi0+dmFsdWVMZW5ndGggPSBLVl9TSVpFIC0ga3YyLT5oZWFkZXJMZW5ndGgoKSAtIGt2Mi0+a2V5TGVuZ3RoOworCisgIGt2My0+a2V5TGVuZ3RoID0gNDsKKyAgKigodWludDMyX3QgKilrdjMtPmdldEtleSgpKSA9IGJzd2FwKE1FRElVTSk7CisgIGt2My0+dmFsdWVMZW5ndGggPSBLVl9TSVpFIC0ga3YzLT5oZWFkZXJMZW5ndGgoKSAtIGt2My0+a2V5TGVuZ3RoOworCisgIGJ1Y2tldC0+c29ydChEVUFMUElWT1RTT1JUKTsKKworICBLVkl0ZXJhdG9yICogaXRlciA9IGJ1Y2tldC0+Z2V0SXRlcmF0b3IoKTsKKworICBCdWZmZXIga2V5OworICBCdWZmZXIgdmFsdWU7CisgIGl0ZXItPm5leHQoa2V5LCB2YWx1ZSk7CisKKyAgQVNTRVJUX0VRKFNNQUxMLCBic3dhcCgqKHVpbnQzMl90ICogKWtleS5kYXRhKCkpKTsKKworICBpdGVyLT5uZXh0KGtleSwgdmFsdWUpOworICBBU1NFUlRfRVEoTUVESVVNLCBic3dhcCgqKHVpbnQzMl90ICogKWtleS5kYXRhKCkpKTsKKworICBpdGVyLT5uZXh0KGtleSwgdmFsdWUpOworICBBU1NFUlRfRVEoQklHLCBic3dhcCgqKHVpbnQzMl90ICogKWtleS5kYXRhKCkpKTsKKworICBkZWxldGUgaXRlcjsKKyAgZGVsZXRlIGJ1Y2tldDsKKyAgZGVsZXRlIHBvb2w7Cit9CisKK1RFU1QoUGFydGl0aW9uQnVja2V0LCBzcGlsbCkgeworICBNZW1vcnlQb29sICogcG9vbCA9IG5ldyBNZW1vcnlQb29sKCk7CisgIGNvbnN0IHVpbnQzMl90IFBPT0xfU0laRSA9IDEwMjQgKiAxMDI0OyAvLyAxTUIKKyAgY29uc3QgdWludDMyX3QgQkxPQ0tfU0laRSA9IDEwMjQ7IC8vIDFLQgorICBjb25zdCB1aW50MzJfdCBQQVJUSVRJT05fSUQgPSAzOworICBwb29sLT5pbml0KFBPT0xfU0laRSk7CisgIENvbXBhcmF0b3JQdHIgY29tcGFyYXRvciA9IE5hdGl2ZVRhc2s6OmdldF9jb21wYXJhdG9yKEJ5dGVzVHlwZSwgTlVMTCk7CisgIFBhcnRpdGlvbkJ1Y2tldCAqIGJ1Y2tldCA9IG5ldyBQYXJ0aXRpb25CdWNrZXQocG9vbCwgUEFSVElUSU9OX0lELCBjb21wYXJhdG9yLCBOVUxMLCBCTE9DS19TSVpFKTsKKworICBjb25zdCB1aW50MzJfdCBLVl9TSVpFID0gNzAwOworICBjb25zdCB1aW50MzJfdCBTTUFMTF9LVl9TSVpFID0gMTAwOworICBLVkJ1ZmZlciAqIGt2MSA9IGJ1Y2tldC0+YWxsb2NhdGVLVkJ1ZmZlcihLVl9TSVpFKTsKKyAgS1ZCdWZmZXIgKiBrdjIgPSBidWNrZXQtPmFsbG9jYXRlS1ZCdWZmZXIoU01BTExfS1ZfU0laRSk7CisgIEtWQnVmZmVyICoga3YzID0gYnVja2V0LT5hbGxvY2F0ZUtWQnVmZmVyKEtWX1NJWkUpOworCisgIGNvbnN0IHVpbnQzMl90IFNNQUxMID0gMTA7CisgIGNvbnN0IHVpbnQzMl90IE1FRElVTSA9IDEwMDsKKyAgY29uc3QgdWludDMyX3QgQklHID0gMTAwMDsKKworICBrdjEtPmtleUxlbmd0aCA9IDQ7CisgICooKHVpbnQzMl90ICopa3YxLT5nZXRLZXkoKSkgPSBic3dhcChCSUcpOworICBrdjEtPnZhbHVlTGVuZ3RoID0gS1ZfU0laRSAtIEtWQnVmZmVyOjpoZWFkZXJMZW5ndGgoKSAtIGt2MS0+a2V5TGVuZ3RoOworCisgIGt2Mi0+a2V5TGVuZ3RoID0gNDsKKyAgKigodWludDMyX3QgKilrdjItPmdldEtleSgpKSA9IGJzd2FwKFNNQUxMKTsKKyAga3YyLT52YWx1ZUxlbmd0aCA9IEtWX1NJWkUgLSBLVkJ1ZmZlcjo6aGVhZGVyTGVuZ3RoKCkgLSBrdjItPmtleUxlbmd0aDsKKworICBrdjMtPmtleUxlbmd0aCA9IDQ7CisgICooKHVpbnQzMl90ICopa3YzLT5nZXRLZXkoKSkgPSBic3dhcChNRURJVU0pOworICBrdjMtPnZhbHVlTGVuZ3RoID0gS1ZfU0laRSAtIEtWQnVmZmVyOjpoZWFkZXJMZW5ndGgoKSAtIGt2My0+a2V5TGVuZ3RoOworCisgIGJ1Y2tldC0+c29ydChEVUFMUElWT1RTT1JUKTsKKworICB1aW50MzJfdCBCVUZGX1NJWkUgPSAxMDI0ICogMTAyNDsKKyAgY2hhciAqIGJ1ZmYgPSBuZXcgY2hhcltCVUZGX1NJWkVdOworICBNb2NrSUZpbGVXcml0ZXIgd3JpdGVyKGJ1ZmYsIEJVRkZfU0laRSk7CisgIGJ1Y2tldC0+c3BpbGwoJndyaXRlcik7CisKKyAgLy8gY2hlY2sgdGhlIHJlc3VsdAorICBLVkJ1ZmZlciAqIGZpcnN0ID0gKEtWQnVmZmVyICopd3JpdGVyLmJ1ZmYoKTsKKyAgQVNTRVJUX0VRKDQsIGZpcnN0LT5rZXlMZW5ndGgpOworICBBU1NFUlRfRVEoS1ZfU0laRSAtIEtWQnVmZmVyOjpoZWFkZXJMZW5ndGgoKSAtIDQsIGZpcnN0LT52YWx1ZUxlbmd0aCk7CisgIEFTU0VSVF9FUShic3dhcChTTUFMTCksICgqKHVpbnQzMl90ICogKShmaXJzdC0+Z2V0S2V5KCkpKSk7CisKKyAgS1ZCdWZmZXIgKiBzZWNvbmQgPSBmaXJzdC0+bmV4dCgpOworICBBU1NFUlRfRVEoNCwgc2Vjb25kLT5rZXlMZW5ndGgpOworICBBU1NFUlRfRVEoS1ZfU0laRSAtIEtWQnVmZmVyOjpoZWFkZXJMZW5ndGgoKSAtIDQsIHNlY29uZC0+dmFsdWVMZW5ndGgpOworICBBU1NFUlRfRVEoYnN3YXAoTUVESVVNKSwgKCoodWludDMyX3QgKiApKHNlY29uZC0+Z2V0S2V5KCkpKSk7CisKKyAgS1ZCdWZmZXIgKiB0aGlyZCA9IHNlY29uZC0+bmV4dCgpOworICBBU1NFUlRfRVEoNCwgdGhpcmQtPmtleUxlbmd0aCk7CisgIEFTU0VSVF9FUShLVl9TSVpFIC0gS1ZCdWZmZXI6OmhlYWRlckxlbmd0aCgpIC0gNCwgdGhpcmQtPnZhbHVlTGVuZ3RoKTsKKyAgQVNTRVJUX0VRKGJzd2FwKEJJRyksICgqKHVpbnQzMl90ICogKSh0aGlyZC0+Z2V0S2V5KCkpKSk7CisKKyAgZGVsZXRlIFtdIGJ1ZmY7CisgIGRlbGV0ZSBidWNrZXQ7CisgIGRlbGV0ZSBwb29sOworfQorfSAvLyBuYW1lc3BhY2UgTmF0aXZlVGFzawpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RSZWFkQnVmZmVyLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RSZWFkQnVmZmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNGIyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdFJlYWRCdWZmZXIuY2MKQEAgLTAsMCArMSw2OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYi9CdWZmZXJTdHJlYW0uaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVycy5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCitURVNUKEJ1ZmZlcnMsIEFwcGVuZFJlYWQpIHsKKyAgc3RyaW5nIGNvZGVjID0gIiI7CisgIHZlY3RvcjxzdHJpbmc+IGRhdGE7CisgIEdlbmVyYXRlKGRhdGEsIDEwMDAwMCwgIndvcmQiKTsKKyAgc3RyaW5nIGRlc3Q7CisgIGRlc3QucmVzZXJ2ZSg2NCAqIDEwMjQgKiAxMDI0KTsKKyAgT3V0cHV0U3RyaW5nU3RyZWFtIG91dHB1dFN0cmVhbSA9IE91dHB1dFN0cmluZ1N0cmVhbShkZXN0KTsKKyAgQXBwZW5kQnVmZmVyIGFwcGVuZEJ1ZmZlcjsKKyAgYXBwZW5kQnVmZmVyLmluaXQoNjQgKiAxMDI0LCAmb3V0cHV0U3RyZWFtLCBjb2RlYyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgeworICAgIGFwcGVuZEJ1ZmZlci53cml0ZShkYXRhW2ldLmNfc3RyKCksIGRhdGFbaV0ubGVuZ3RoKCkpOworICB9CisgIGFwcGVuZEJ1ZmZlci5mbHVzaCgpOworICBJbnB1dEJ1ZmZlciBpbnB1dEJ1ZmZlciA9IElucHV0QnVmZmVyKGRlc3QuY19zdHIoKSwgZGVzdC5sZW5ndGgoKSk7CisgIFJlYWRCdWZmZXIgcmVhZEJ1ZmZlciA9IFJlYWRCdWZmZXIoKTsKKyAgcmVhZEJ1ZmZlci5pbml0KDY0ICogMTAyNCwgJmlucHV0QnVmZmVyLCBjb2RlYyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IGNoYXIgKiByZCA9IHJlYWRCdWZmZXIuZ2V0KGRhdGFbaV0ubGVuZ3RoKCkpOworICAgIEFTU0VSVF9FUShkYXRhW2ldLCBzdHJpbmcocmQsIGRhdGFbaV0ubGVuZ3RoKCkpKTsKKyAgfQorfQorCisjaWYgZGVmaW5lZCBIQURPT1BfU05BUFBZX0xJQlJBUlkKK1RFU1QoQnVmZmVycywgQXBwZW5kUmVhZFNuYXBweSkgeworICBzdHJpbmcgY29kZWMgPSAib3JnLmFwYWNoZS5oYWRvb3AuaW8uY29tcHJlc3MuU25hcHB5Q29kZWMiOworICB2ZWN0b3I8c3RyaW5nPiBkYXRhOworICBHZW5lcmF0ZShkYXRhLCAxMDAwMDAsICJ3b3JkIik7CisgIHN0cmluZyBkZXN0OworICBkZXN0LnJlc2VydmUoNjQgKiAxMDI0ICogMTAyNCk7CisgIE91dHB1dFN0cmluZ1N0cmVhbSBvdXRwdXRTdHJlYW0gPSBPdXRwdXRTdHJpbmdTdHJlYW0oZGVzdCk7CisgIEFwcGVuZEJ1ZmZlciBhcHBlbmRCdWZmZXI7CisgIGFwcGVuZEJ1ZmZlci5pbml0KDY0ICogMTAyNCwgJm91dHB1dFN0cmVhbSwgY29kZWMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICBhcHBlbmRCdWZmZXIud3JpdGUoZGF0YVtpXS5jX3N0cigpLCBkYXRhW2ldLmxlbmd0aCgpKTsKKyAgfQorICBhcHBlbmRCdWZmZXIuZmx1c2goKTsKKyAgSW5wdXRCdWZmZXIgaW5wdXRCdWZmZXIgPSBJbnB1dEJ1ZmZlcihkZXN0LmNfc3RyKCksIGRlc3QubGVuZ3RoKCkpOworICBSZWFkQnVmZmVyIHJlYWRCdWZmZXIgPSBSZWFkQnVmZmVyKCk7CisgIHJlYWRCdWZmZXIuaW5pdCg2NCAqIDEwMjQsICZpbnB1dEJ1ZmZlciwgY29kZWMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBjaGFyICogcmQgPSByZWFkQnVmZmVyLmdldChkYXRhW2ldLmxlbmd0aCgpKTsKKyAgICBBU1NFUlRfRVEoZGF0YVtpXSwgc3RyaW5nKHJkLCBkYXRhW2ldLmxlbmd0aCgpKSk7CisgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RSZWFkV3JpdGVCdWZmZXIuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC9saWIvVGVzdFJlYWRXcml0ZUJ1ZmZlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzI5ODljCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvbGliL1Rlc3RSZWFkV3JpdGVCdWZmZXIuY2MKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWIvY29tbW9ucy5oIgorI2luY2x1ZGUgImxpYi9Db21iaW5lci5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgTmF0aXZlVGFzayB7CisKK1RFU1QoUmVhZFdyaXRlQnVmZmVyLCByZWFkQW5kV3JpdGUpIHsKKyAgUmVhZFdyaXRlQnVmZmVyIGJ1ZmYoMTYpOworCisgIGludCBJTlQgPSAxMDA7CisgIGludCBMT05HID0gMjAwOworICBzdGQ6OnN0cmluZyBTVFIgPSAiaGVsbG8sIHJlYWRXcml0ZUJ1ZmZlciI7CisgIHZvaWQgKiBQT0lOVEVSID0gdGhpczsKKworICBpbnQgUkVQRUFUID0gMTA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVBFQVQ7IGkrKykgeworICAgIGJ1ZmYud3JpdGVJbnQoSU5UKTsKKyAgICBidWZmLndyaXRlTG9uZyhMT05HKTsKKyAgICBidWZmLndyaXRlU3RyaW5nKCZTVFIpOworICAgIGJ1ZmYud3JpdGVQb2ludGVyKFBPSU5URVIpOworICAgIGJ1ZmYud3JpdGVTdHJpbmcoU1RSLmNfc3RyKCksIFNUUi5sZW5ndGgoKSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVBvaW50ID0gYnVmZi5nZXRXcml0ZVBvaW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVBFQVQ7IGkrKykgeworICAgIEFTU0VSVF9FUShJTlQsIGJ1ZmYucmVhZEludCgpKTsKKyAgICBBU1NFUlRfRVEoTE9ORywgYnVmZi5yZWFkTG9uZygpKTsKKyAgICBzdHJpbmcgKiByZWFkID0gYnVmZi5yZWFkU3RyaW5nKCk7CisgICAgQVNTRVJUX0VRKDAsIFNUUi5jb21wYXJlKHJlYWQtPmNfc3RyKCkpKTsKKyAgICBkZWxldGUgcmVhZDsKKworICAgIEFTU0VSVF9FUShQT0lOVEVSLCBidWZmLnJlYWRQb2ludGVyKCkpOworCisgICAgcmVhZCA9IGJ1ZmYucmVhZFN0cmluZygpOworICAgIEFTU0VSVF9FUSgwLCBTVFIuY29tcGFyZShyZWFkLT5jX3N0cigpKSk7CisgICAgZGVsZXRlIHJlYWQ7CisgIH0KKworICB1aW50MzJfdCByZWFkUG9pbnQgPSBidWZmLmdldFJlYWRQb2ludCgpOworICBBU1NFUlRfRVEod3JpdGVQb2ludCwgcmVhZFBvaW50KTsKKworICBidWZmLnNldFdyaXRlUG9pbnQoMCk7CisgIGJ1ZmYuc2V0UmVhZFBvaW50KDApOworCisgIEFTU0VSVF9FUSgwLCBidWZmLmdldFJlYWRQb2ludCgpKTsKKyAgQVNTRVJUX0VRKDAsIGJ1ZmYuZ2V0V3JpdGVQb2ludCgpKTsKK30KKworfSAvKiBuYW1lc3BhY2UgTmF0aXZlVGFzayAqLwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvdGVzdF9jb21tb25zLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvdGVzdF9jb21tb25zLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzMyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC90ZXN0X2NvbW1vbnMuY2MKQEAgLTAsMCArMSwzNDQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAibGliL2NvbW1vbnMuaCIKKyNpbmNsdWRlICJ1dGlsL1JhbmRvbS5oIgorI2luY2x1ZGUgImxpYi9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAidGVzdF9jb21tb25zLmgiCisKK0NvbmZpZyBUZXN0Q29uZmlnID0gQ29uZmlnKCk7CisKK2NvbnN0IGNoYXIgKiBHZW5lcmF0ZVNlZWQgPSAiZ2VuZXJhdGUuc2VlZCI7Citjb25zdCBjaGFyICogR2VuZXJhdGVDaG9pY2UgPSAiZ2VuZXJhdGUuY2hvaWNlIjsKK2NvbnN0IGNoYXIgKiBHZW5lcmF0ZUxlbiA9ICJnZW5lcmF0ZS5sZW4iOworY29uc3QgY2hhciAqIEdlbmVyYXRlS2V5TGVuID0gImdlbmVyYXRlLmtleS5sZW4iOworY29uc3QgY2hhciAqIEdlbmVyYXRlVmFsdWVMZW4gPSAiZ2VuZXJhdGUudmFsdWUubGVuIjsKK2NvbnN0IGNoYXIgKiBHZW5lcmF0ZVJhbmdlID0gImdlbmVyYXRlLnJhbmdlIjsKK2NvbnN0IGNoYXIgKiBHZW5lcmF0ZUtleVJhbmdlID0gImdlbmVyYXRlLmtleS5yYW5nZSI7Citjb25zdCBjaGFyICogR2VuZXJhdGVWYWx1ZVJhbmdlID0gImdlbmVyYXRlLnZhbHVlLnJhbmdlIjsKKwordmVjdG9yPHN0cmluZz4gJiBNYWtlU3RyaW5nQXJyYXkodmVjdG9yPHN0cmluZz4gJiBkZXN0LCAuLi4pIHsKKyAgdmFfbGlzdCBhbDsKKyAgdmFfc3RhcnQoYWwsIGRlc3QpOworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IGNoYXIgKiBzID0gdmFfYXJnKGFsLCBjb25zdCBjaGFyICopOworICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZXN0LnB1c2hfYmFjayhzKTsKKyAgfQorICB2YV9lbmQoYWwpOworICByZXR1cm4gZGVzdDsKK30KKworR2VuZXJhdGVUeXBlIEdldEdlbmVyYXRlVHlwZShjb25zdCBzdHJpbmcgJiB0eXBlKSB7CisgIGlmICh0eXBlID09ICJ3b3JkIikgeworICAgIHJldHVybiBHZW5Xb3JkOworICB9IGVsc2UgaWYgKHR5cGUgPT0gIm51bWJlciIpIHsKKyAgICByZXR1cm4gR2VuTnVtYmVyOworICB9IGVsc2UgaWYgKHR5cGUgPT0gImJ5dGVzIikgeworICAgIHJldHVybiBHZW5CeXRlczsKKyAgfSBlbHNlIHsKKyAgICBUSFJPV19FWENFUFRJT04oVW5zdXBwb3J0RXhjZXB0aW9uLCAiR2VuZXJhdGVUeXBlIG5vdCBzdXBwb3J0Iik7CisgIH0KK30KKworc3RyaW5nICYgR2VuZXJhdGVPbmUoc3RyaW5nICYgZGVzdCwgUmFuZG9tICYgciwgR2VuZXJhdGVUeXBlIGd0eXBlLCBpbnQ2NF90IGNob2ljZSwgaW50NjRfdCBsZW4sCisgICAgaW50NjRfdCByYW5nZSkgeworICBzd2l0Y2ggKGd0eXBlKSB7CisgIGNhc2UgR2VuV29yZDoKKyAgICByLm5leHRXb3JkKGRlc3QsIGNob2ljZSk7CisgICAgYnJlYWs7CisgIGNhc2UgR2VuTnVtYmVyOgorICAgIHVpbnQ2NF90IHY7CisgICAgaWYgKGNob2ljZSA+IDApIHsKKyAgICAgIHYgPSByLm5leHRfaW50MzIoY2hvaWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgdiA9IHIubmV4dF91aW50NjQoKTsKKyAgICB9CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgIGRlc3QgPSBTdHJpbmdVdGlsOjpUb1N0cmluZyh2LCAnMCcsIGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3QgPSBTdHJpbmdVdGlsOjpUb1N0cmluZyh2KTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgR2VuQnl0ZXM6CisgICAgaWYgKHJhbmdlIDwgMikgeworICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgZGVzdCA9IHIubmV4dEJ5dGVzKGxlbiwgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXN0ID0gci5uZXh0Qnl0ZXMoci5uZXh0X2ludDMyKDMyKSwgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGludDY0X3QgbmxlbiA9IGxlbiAtIHJhbmdlIC8gMiArIHIubmV4dF9pbnQzMihyYW5nZSk7CisgICAgICAgIGlmIChubGVuID4gMCkgeworICAgICAgICAgIGRlc3QgPSByLm5leHRCeXRlcyhubGVuLCAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZXN0ID0gIiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3QgPSByLm5leHRCeXRlcyhyLm5leHRfaW50MzIocmFuZ2UpLCAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgVEhST1dfRVhDRVBUSU9OKElPRXhjZXB0aW9uLCAiR2VuZXJhdGVUeXBlIG5vdCBzdXBwb3J0Iik7CisgIH0KKyAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qKgorICogR2VuZXJhdGUgcmFuZG9tIHN0cmluZyBzZXF1ZW5jZXMKKyAqIEBwYXJhbSBkZXN0IGRlc3QgYXJyYXkKKyAqIEBwYXJhbSBzaXplIG91dHB1dCBhcnJheSBzaXplCisgKiBAcGFyYW0gdHlwZSBzdHJpbmcgdHlwZSAod29yZHxudW1iZXJ8Ynl0ZXN8dGVyYSkKKyAqLwordmVjdG9yPHN0cmluZz4gJiBHZW5lcmF0ZSh2ZWN0b3I8c3RyaW5nPiAmIGRlc3QsIHVpbnQ2NF90IHNpemUsIGNvbnN0IHN0cmluZyAmIHR5cGUpIHsKKyAgUmFuZG9tIHI7CisgIGlmIChUZXN0Q29uZmlnLmdldChHZW5lcmF0ZVNlZWQpICE9IE5VTEwpIHsKKyAgICByLnNldFNlZWQoVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVTZWVkLCAwKSk7CisgIH0KKyAgR2VuZXJhdGVUeXBlIGd0eXBlID0gR2V0R2VuZXJhdGVUeXBlKHR5cGUpOworICBpbnQ2NF90IGNob2ljZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlQ2hvaWNlLCAtMSk7CisgIGludDY0X3QgbGVuID0gVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVMZW4sIC0xKTsKKyAgaW50NjRfdCByYW5nZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlUmFuZ2UsIDEpOworICBzdHJpbmcgdGVtcDsKKyAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGRlc3QucHVzaF9iYWNrKEdlbmVyYXRlT25lKHRlbXAsIHIsIGd0eXBlLCBjaG9pY2UsIGxlbiwgcmFuZ2UpKTsKKyAgfQorICByZXR1cm4gZGVzdDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSByYW5kb20gc3RyaW5nIHBhaXIgc2VxdWVuY2VzCisgKiBAcGFyYW0gZGVzdCBkZXN0IGFycmF5CisgKiBAcGFyYW0gc2l6ZSBvdXRwdXQgYXJyYXkgc2l6ZQorICogQHBhcmFtIHR5cGUgc3RyaW5nIHR5cGUgKHdvcmR8bnVtYmVyfGJ5dGVzfHRlcmEpCisgKi8KK3ZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+ICYgR2VuZXJhdGUodmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4gJiBkZXN0LCB1aW50NjRfdCBzaXplLAorICAgIGNvbnN0IHN0cmluZyAmIHR5cGUpIHsKKyAgUmFuZG9tIHI7CisgIGlmIChUZXN0Q29uZmlnLmdldChHZW5lcmF0ZVNlZWQpICE9IE5VTEwpIHsKKyAgICByLnNldFNlZWQoVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVTZWVkLCAwKSk7CisgIH0KKyAgR2VuZXJhdGVUeXBlIGd0eXBlID0gR2V0R2VuZXJhdGVUeXBlKHR5cGUpOworICBpbnQ2NF90IGNob2ljZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlQ2hvaWNlLCAtMSk7CisgIGludDY0X3Qga2V5bGVuID0gVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVLZXlMZW4sIC0xKTsKKyAgaW50NjRfdCB2YWx1ZWxlbiA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlVmFsdWVMZW4sIC0xKTsKKyAgaW50NjRfdCBrZXlSYW5nZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlS2V5UmFuZ2UsIDEpOworICBpbnQ2NF90IHZhbHVlUmFuZ2UgPSBUZXN0Q29uZmlnLmdldEludChHZW5lcmF0ZVZhbHVlUmFuZ2UsIDEpOworICBzdHJpbmcga2V5LCB2YWx1ZTsKKyAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIEdlbmVyYXRlT25lKGtleSwgciwgZ3R5cGUsIGNob2ljZSwga2V5bGVuLCBrZXlSYW5nZSk7CisgICAgR2VuZXJhdGVPbmUodmFsdWUsIHIsIGd0eXBlLCBjaG9pY2UsIHZhbHVlbGVuLCB2YWx1ZVJhbmdlKTsKKyAgICBkZXN0LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlKSk7CisgIH0KKyAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qKgorICogR2VuZXJhdGUgcmFuZG9tIHN0cmluZyBwYWlyIHNlcXVlbmNlcworICogQHBhcmFtIGRlc3QgZGVzdCBhcnJheQorICogQHBhcmFtIGxlbmd0aCBvdXRwdXQgYnl0ZXMgY291bnQKKyAqIEBwYXJhbSB0eXBlIHN0cmluZyB0eXBlICh3b3JkfG51bWJlcnxieXRlc3x0ZXJhKQorICovCit2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiAmIEdlbmVyYXRlTGVuZ3RoKHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+ICYgZGVzdCwKKyAgICB1aW50NjRfdCBsZW5ndGgsIGNvbnN0IHN0cmluZyAmIHR5cGUpIHsKKyAgUmFuZG9tIHI7CisgIGlmIChUZXN0Q29uZmlnLmdldChHZW5lcmF0ZVNlZWQpICE9IE5VTEwpIHsKKyAgICByLnNldFNlZWQoVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVTZWVkLCAwKSk7CisgIH0KKyAgR2VuZXJhdGVUeXBlIGd0eXBlID0gR2V0R2VuZXJhdGVUeXBlKHR5cGUpOworICBpbnQ2NF90IGNob2ljZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlQ2hvaWNlLCAtMSk7CisgIGludDY0X3Qga2V5bGVuID0gVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVLZXlMZW4sIC0xKTsKKyAgaW50NjRfdCB2YWx1ZWxlbiA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlVmFsdWVMZW4sIC0xKTsKKyAgaW50NjRfdCBrZXlSYW5nZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlS2V5UmFuZ2UsIDEpOworICBpbnQ2NF90IHZhbHVlUmFuZ2UgPSBUZXN0Q29uZmlnLmdldEludChHZW5lcmF0ZVZhbHVlUmFuZ2UsIDEpOworICBzdHJpbmcga2V5LCB2YWx1ZTsKKyAgZGVzdC5yZXNlcnZlKChzaXplX3QpKGxlbmd0aCAvIChrZXlsZW4gKyB2YWx1ZWxlbikgKiAxLjIpKTsKKyAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IGxlbmd0aDspIHsKKyAgICBHZW5lcmF0ZU9uZShrZXksIHIsIGd0eXBlLCBjaG9pY2UsIGtleWxlbiwga2V5UmFuZ2UpOworICAgIEdlbmVyYXRlT25lKHZhbHVlLCByLCBndHlwZSwgY2hvaWNlLCB2YWx1ZWxlbiwgdmFsdWVSYW5nZSk7CisgICAgZGVzdC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoa2V5LCB2YWx1ZSkpOworICAgIGkgKz0gKGtleS5sZW5ndGgoKSArIHZhbHVlLmxlbmd0aCgpICsgMik7CisgIH0KKyAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qKgorICogR2VuZXJhdGUgcmFuZG9tIEtWIHRleHQ6CisgKiBLZXkwXHRWYWx1ZTBcbgorICogS2V5MVx0VmFsdWUxXG4KKyAqIC4uLgorICogQHBhcmFtIGRlc3QgZGVzdCBzdHJpbmcgY29udGFpbiBnZW5lcmF0ZWQgdGV4dAorICogQHBhcmFtIHNpemUgb3V0cHV0IGFycmF5IHNpemUKKyAqIEBwYXJhbSB0eXBlIHN0cmluZyB0eXBlICh3b3JkfG51bWJlcnxieXRlc3x0ZXJhKQorICovCitzdHJpbmcgJiBHZW5lcmF0ZUtWVGV4dChzdHJpbmcgJiBkZXN0LCB1aW50NjRfdCBzaXplLCBjb25zdCBzdHJpbmcgJiB0eXBlKSB7CisgIFJhbmRvbSByOworICBpZiAoVGVzdENvbmZpZy5nZXQoR2VuZXJhdGVTZWVkKSAhPSBOVUxMKSB7CisgICAgci5zZXRTZWVkKFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlU2VlZCwgMCkpOworICB9CisgIEdlbmVyYXRlVHlwZSBndHlwZSA9IEdldEdlbmVyYXRlVHlwZSh0eXBlKTsKKyAgaW50NjRfdCBjaG9pY2UgPSBUZXN0Q29uZmlnLmdldEludChHZW5lcmF0ZUNob2ljZSwgLTEpOworICBpbnQ2NF90IGtleWxlbiA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlS2V5TGVuLCAtMSk7CisgIGludDY0X3QgdmFsdWVsZW4gPSBUZXN0Q29uZmlnLmdldEludChHZW5lcmF0ZVZhbHVlTGVuLCAtMSk7CisgIGludDY0X3Qga2V5UmFuZ2UgPSBUZXN0Q29uZmlnLmdldEludChHZW5lcmF0ZUtleVJhbmdlLCAxKTsKKyAgaW50NjRfdCB2YWx1ZVJhbmdlID0gVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVWYWx1ZVJhbmdlLCAxKTsKKyAgc3RyaW5nIGtleSwgdmFsdWU7CisgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBHZW5lcmF0ZU9uZShrZXksIHIsIGd0eXBlLCBjaG9pY2UsIGtleWxlbiwga2V5UmFuZ2UpOworICAgIEdlbmVyYXRlT25lKHZhbHVlLCByLCBndHlwZSwgY2hvaWNlLCB2YWx1ZWxlbiwgdmFsdWVSYW5nZSk7CisgICAgZGVzdC5hcHBlbmQoa2V5KTsKKyAgICBkZXN0LmFwcGVuZCgiXHQiKTsKKyAgICBkZXN0LmFwcGVuZCh2YWx1ZSk7CisgICAgZGVzdC5hcHBlbmQoIlxuIik7CisgIH0KKyAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qKgorICogR2VuZXJhdGUgcmFuZG9tIEtWIHRleHQ6CisgKiBLZXkwXHRWYWx1ZTBcbgorICogS2V5MVx0VmFsdWUxXG4KKyAqIC4uLgorICogQHBhcmFtIGRlc3QgZGVzdCBzdHJpbmcgY29udGFpbiBnZW5lcmF0ZWQgdGV4dAorICogQHBhcmFtIGxlbmd0aCBvdXRwdXQgc3RyaW5nIGxlbmd0aAorICogQHBhcmFtIHR5cGUgc3RyaW5nIHR5cGUgKHdvcmR8bnVtYmVyfGJ5dGVzKQorICovCitzdHJpbmcgJiBHZW5lcmF0ZUtWVGV4dExlbmd0aChzdHJpbmcgJiBkZXN0LCB1aW50NjRfdCBsZW5ndGgsIGNvbnN0IHN0cmluZyAmIHR5cGUpIHsKKyAgUmFuZG9tIHI7CisgIGlmIChUZXN0Q29uZmlnLmdldChHZW5lcmF0ZVNlZWQpICE9IE5VTEwpIHsKKyAgICByLnNldFNlZWQoVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVTZWVkLCAwKSk7CisgIH0KKyAgR2VuZXJhdGVUeXBlIGd0eXBlID0gR2V0R2VuZXJhdGVUeXBlKHR5cGUpOworICBpbnQ2NF90IGNob2ljZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlQ2hvaWNlLCAtMSk7CisgIGludDY0X3Qga2V5bGVuID0gVGVzdENvbmZpZy5nZXRJbnQoR2VuZXJhdGVLZXlMZW4sIC0xKTsKKyAgaW50NjRfdCB2YWx1ZWxlbiA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlVmFsdWVMZW4sIC0xKTsKKyAgaW50NjRfdCBrZXlSYW5nZSA9IFRlc3RDb25maWcuZ2V0SW50KEdlbmVyYXRlS2V5UmFuZ2UsIDEpOworICBpbnQ2NF90IHZhbHVlUmFuZ2UgPSBUZXN0Q29uZmlnLmdldEludChHZW5lcmF0ZVZhbHVlUmFuZ2UsIDEpOworICBzdHJpbmcga2V5LCB2YWx1ZTsKKyAgd2hpbGUgKGRlc3QubGVuZ3RoKCkgPCBsZW5ndGgpIHsKKyAgICBHZW5lcmF0ZU9uZShrZXksIHIsIGd0eXBlLCBjaG9pY2UsIGtleWxlbiwga2V5UmFuZ2UpOworICAgIEdlbmVyYXRlT25lKHZhbHVlLCByLCBndHlwZSwgY2hvaWNlLCB2YWx1ZWxlbiwgdmFsdWVSYW5nZSk7CisgICAgZGVzdC5hcHBlbmQoa2V5KTsKKyAgICBkZXN0LmFwcGVuZCgiXHQiKTsKKyAgICBkZXN0LmFwcGVuZCh2YWx1ZSk7CisgICAgZGVzdC5hcHBlbmQoIlxuIik7CisgIH0KKyAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qKgorICogRmlsZSA8LT4gU3RyaW5nIHV0aWxpdGllcworICovCitzdHJpbmcgJiBSZWFkRmlsZShzdHJpbmcgJiBkZXN0LCBjb25zdCBzdHJpbmcgJiBwYXRoKSB7CisgIEZJTEUgKiBmaW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyYiIpOworICBpZiAoTlVMTCA9PSBmaW4pIHsKKyAgICBUSFJPV19FWENFUFRJT04oSU9FeGNlcHRpb24sICJmaWxlIG5vdCBmb3VuZCBvciBjYW4gbm90IG9wZW4gZm9yIHJlYWQiKTsKKyAgfQorICBjaGFyIGJ1ZmZbMTAyNCAqIDE2XTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzaXplX3QgcmQgPSBmcmVhZChidWZmLCAxLCAxMDI0ICogMTYsIGZpbik7CisgICAgaWYgKHJkIDw9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZXN0LmFwcGVuZChidWZmLCByZCk7CisgIH0KKyAgZmNsb3NlKGZpbik7CisgIHJldHVybiBkZXN0OworfQorCit2b2lkIFdyaXRlRmlsZShjb25zdCBzdHJpbmcgJiBjb250ZW50LCBjb25zdCBzdHJpbmcgJiBwYXRoKSB7CisgIEZJTEUgKiBmb3V0ID0gZm9wZW4ocGF0aC5jX3N0cigpLCAid2IiKTsKKyAgaWYgKE5VTEwgPT0gZm91dCkgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgImZpbGUgY2FuIG5vdCBvcGVuIGZvciB3cml0ZSIpOworICB9CisgIHNpemVfdCB3dCA9IGZ3cml0ZShjb250ZW50LmNfc3RyKCksIDEsIGNvbnRlbnQubGVuZ3RoKCksIGZvdXQpOworICBpZiAod3QgIT0gY29udGVudC5sZW5ndGgoKSkgeworICAgIFRIUk9XX0VYQ0VQVElPTihJT0V4Y2VwdGlvbiwgIndyaXRlIGZpbGUgZXJyb3IiKTsKKyAgfQorICBmY2xvc2UoZm91dCk7Cit9CisKK2Jvb2wgRmlsZUVxdWFsKGNvbnN0IHN0cmluZyAmIGxoLCBjb25zdCBzdHJpbmcgJiByaCkgeworICBzdHJpbmcgbGhzLCByaHM7CisgIFJlYWRGaWxlKGxocywgbGgpOworICBSZWFkRmlsZShyaHMsIHJoKTsKKyAgcmV0dXJuIGxocyA9PSByaHM7Cit9CisKK0tWR2VuZXJhdG9yOjpLVkdlbmVyYXRvcih1aW50MzJfdCBrZXlsZW4sIHVpbnQzMl90IHZhbGxlbiwgYm9vbCB1bmlxdWUpCisgICAgOiBrZXlsZW4oa2V5bGVuKSwgdmFsbGVuKHZhbGxlbiksIHVuaXF1ZSh1bmlxdWUpIHsKKyAgZmFjdG9yID0gMjk5OTk5OTsKKyAga2V5YiA9IG5ldyBjaGFyW2tleWxlbiArIDMyXTsKKyAgdmFsYiA9IG5ldyBjaGFyW3ZhbGxlbiArIDMyXTsKKyAgc25wcmludGYoa2V5Zm9ybWF0LCAzMiwgIiUlMCV1bHgiLCBrZXlsZW4pOworfQorCitLVkdlbmVyYXRvcjo6fktWR2VuZXJhdG9yKCkgeworICBkZWxldGVbXSBrZXliOworICBkZWxldGVbXSB2YWxiOworfQorCitjaGFyICogS1ZHZW5lcmF0b3I6OmtleSh1aW50MzJfdCAmIGtsKSB7CisgIGxvbmcgdjsKKyAgaWYgKHVuaXF1ZSkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2ID0gbHJhbmQ0OCgpOworICAgICAgaWYgKG9sZF9rZXlzLmZpbmQodikgPT0gb2xkX2tleXMuZW5kKCkpIHsKKyAgICAgICAgb2xkX2tleXMuaW5zZXJ0KHYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgdiA9IGxyYW5kNDgoKTsKKyAgfQorICBzbnByaW50ZihrZXliLCBrZXlsZW4gKyAzMiwga2V5Zm9ybWF0LCB2KTsKKyAga2wgPSBrZXlsZW47CisgIHJldHVybiBrZXliOworfQorCitjaGFyICogS1ZHZW5lcmF0b3I6OnZhbHVlKHVpbnQzMl90ICYgdmwpIHsKKyAgdWludDMyX3Qgb2ZmID0gMDsKKyAgd2hpbGUgKG9mZiA8IHZhbGxlbikgeworICAgIGxvbmcgdiA9IGxyYW5kNDgoKTsKKyAgICB2ID0gKHYgLyBmYWN0b3IpICogZmFjdG9yOworICAgIHVpbnQzMl90IHduID0gc25wcmludGYodmFsYiArIG9mZiwgdmFsbGVuICsgMzIgLSBvZmYsICIlMDlseFx0Iiwgdik7CisgICAgb2ZmICs9IHduOworICB9CisgIHZsID0gdmFsbGVuOworICByZXR1cm4gdmFsYjsKK30KKwordm9pZCBLVkdlbmVyYXRvcjo6d3JpdGUoRklMRSAqIGZvdXQsIGludDY0X3QgdG90YWxsZW4pIHsKKyAgd2hpbGUgKHRvdGFsbGVuID4gMCkgeworICAgIHVpbnQzMl90IGtsLCB2bDsKKyAgICBjaGFyICoga2V5ID0gdGhpcy0+a2V5KGtsKTsKKyAgICBjaGFyICogdmFsdWUgPSB0aGlzLT52YWx1ZSh2bCk7CisgICAgZndyaXRlKGtleSwga2wsIDEsIGZvdXQpOworICAgIGZwdXRjKCdcdCcsIGZvdXQpOworICAgIGZ3cml0ZSh2YWx1ZSwgdmwsIDEsIGZvdXQpOworICAgIGZwdXRjKCdcbicsIGZvdXQpOworICAgIHRvdGFsbGVuIC09IChrbCArIHZsICsgMik7CisgIH0KKyAgZmZsdXNoKGZvdXQpOworfQorCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC90ZXN0X2NvbW1vbnMuaCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L3Rlc3RfY29tbW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDQ4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC90ZXN0X2NvbW1vbnMuaApAQCAtMCwwICsxLDE1MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEVTVF9DT01NT05TX0hfCisjZGVmaW5lIFRFU1RfQ09NTU9OU19IXworCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJjb21tb25zLmgiCisjaW5jbHVkZSAidXRpbC9SYW5kb20uaCIKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJ1dGlsL1RpbWVyLmgiCisjaW5jbHVkZSAibGliL0J1ZmZlcnMuaCIKKyNpbmNsdWRlICJsaWIvQnVmZmVyU3RyZWFtLmgiCisKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCit1c2luZyBuYW1lc3BhY2UgTmF0aXZlVGFzazsKKworZXh0ZXJuIENvbmZpZyBUZXN0Q29uZmlnOworCisvKioKKyAqIGUuZy4gTWFrZVN0cmluZ0FycmF5KGRlc3QsICJhIiwgImIiLCAiYyIsIE5VTEwpID0geyJhIiwiYiIsImMifQorICovCit2ZWN0b3I8c3RyaW5nPiAmIE1ha2VTdHJpbmdBcnJheSh2ZWN0b3I8c3RyaW5nPiAmIGRlc3QsIC4uLik7CisKK2V4dGVybiBjb25zdCBjaGFyICogR2VuZXJhdGVTZWVkOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBHZW5lcmF0ZUNob2ljZTsKK2V4dGVybiBjb25zdCBjaGFyICogR2VuZXJhdGVMZW47CitleHRlcm4gY29uc3QgY2hhciAqIEdlbmVyYXRlS2V5TGVuOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBHZW5lcmF0ZVZhbHVlTGVuOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBHZW5lcmF0ZVJhbmdlOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBHZW5lcmF0ZUtleVJhbmdlOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBHZW5lcmF0ZVZhbHVlUmFuZ2U7CisKK2VudW0gR2VuZXJhdGVUeXBlIHsKKyAgR2VuV29yZCwKKyAgR2VuTnVtYmVyLAorICBHZW5CeXRlcywKK307CisKK0dlbmVyYXRlVHlwZSBHZXRHZW5lcmF0ZVR5cGUoY29uc3Qgc3RyaW5nICYgdHlwZSk7CisKK3N0cmluZyAmIEdlbmVyYXRlT25lKHN0cmluZyAmIGRlc3QsIFJhbmRvbSAmIHIsIEdlbmVyYXRlVHlwZSBndHlwZSwgaW50NjRfdCBjaG9pY2UsIGludDY0X3QgbGVuLAorICAgIGludDY0X3QgcmFuZ2UgPSAwKTsKKy8qKgorICogR2VuZXJhdGUgcmFuZG9tIHN0cmluZyBzZXF1ZW5jZXMKKyAqIEBwYXJhbSBkZXN0IGRlc3QgYXJyYXkKKyAqIEBwYXJhbSBzaXplIG91dHB1dCBhcnJheSBzaXplCisgKiBAcGFyYW0gdHlwZSBzdHJpbmcgdHlwZSAod29yZHxudW1iZXJ8Ynl0ZXN8dGVyYSkKKyAqLwordmVjdG9yPHN0cmluZz4gJiBHZW5lcmF0ZSh2ZWN0b3I8c3RyaW5nPiAmIGRlc3QsIHVpbnQ2NF90IHNpemUsIGNvbnN0IHN0cmluZyAmIHR5cGUpOworCisvKioKKyAqIEdlbmVyYXRlIHJhbmRvbSBzdHJpbmcgcGFpciBzZXF1ZW5jZXMKKyAqIEBwYXJhbSBkZXN0IGRlc3QgYXJyYXkKKyAqIEBwYXJhbSBzaXplIG91dHB1dCBhcnJheSBzaXplCisgKiBAcGFyYW0gdHlwZSBzdHJpbmcgdHlwZSAod29yZHxudW1iZXJ8Ynl0ZXN8dGVyYSkKKyAqLwordmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4gJiBHZW5lcmF0ZSh2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiAmIGRlc3QsIHVpbnQ2NF90IHNpemUsCisgICAgY29uc3Qgc3RyaW5nICYgdHlwZSk7CisKKy8qKgorICogR2VuZXJhdGUgcmFuZG9tIHN0cmluZyBwYWlyIHNlcXVlbmNlcworICogQHBhcmFtIGRlc3QgZGVzdCBhcnJheQorICogQHBhcmFtIGxlbmd0aCBvdXRwdXQgYnl0ZXMgY291bnQKKyAqIEBwYXJhbSB0eXBlIHN0cmluZyB0eXBlICh3b3JkfG51bWJlcnxieXRlc3x0ZXJhKQorICovCit2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiAmIEdlbmVyYXRlTGVuZ3RoKHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+ICYgZGVzdCwKKyAgICB1aW50NjRfdCBsZW5ndGgsIGNvbnN0IHN0cmluZyAmIHR5cGUpOworCisvKioKKyAqIEdlbmVyYXRlIHJhbmRvbSBLViB0ZXh0OgorICogS2V5MFx0VmFsdWUwXG4KKyAqIEtleTFcdFZhbHVlMVxuCisgKiAuLi4KKyAqIEBwYXJhbSBkZXN0IGRlc3Qgc3RyaW5nIGNvbnRhaW4gZ2VuZXJhdGVkIHRleHQKKyAqIEBwYXJhbSBzaXplIG91dHB1dCBrdiBwYWlyIGNvdW50CisgKiBAcGFyYW0gdHlwZSBzdHJpbmcgdHlwZSAod29yZHxudW1iZXJ8Ynl0ZXN8dGVyYSkKKyAqLworc3RyaW5nICYgR2VuZXJhdGVLVlRleHQoc3RyaW5nICYgZGVzdCwgdWludDY0X3Qgc2l6ZSwgY29uc3Qgc3RyaW5nICYgdHlwZSk7CisKKy8qKgorICogR2VuZXJhdGUgcmFuZG9tIEtWIHRleHQ6CisgKiBLZXkwXHRWYWx1ZTBcbgorICogS2V5MVx0VmFsdWUxXG4KKyAqIC4uLgorICogQHBhcmFtIGRlc3QgZGVzdCBzdHJpbmcgY29udGFpbiBnZW5lcmF0ZWQgdGV4dAorICogQHBhcmFtIGxlbmd0aCBvdXRwdXQgc3RyaW5nIGxlbmd0aAorICogQHBhcmFtIHR5cGUgc3RyaW5nIHR5cGUgKHdvcmR8bnVtYmVyfGJ5dGVzfHRlcmEpCisgKi8KK3N0cmluZyAmIEdlbmVyYXRlS1ZUZXh0TGVuZ3RoKHN0cmluZyAmIGRlc3QsIHVpbnQ2NF90IGxlbmd0aCwgY29uc3Qgc3RyaW5nICYgdHlwZSk7CisKKy8qKgorICogRmlsZSA8LT4gU3RyaW5nIHV0aWxpdGllcworICovCitzdHJpbmcgJiBSZWFkRmlsZShzdHJpbmcgJiBkZXN0LCBjb25zdCBzdHJpbmcgJiBwYXRoKTsKK3ZvaWQgV3JpdGVGaWxlKGNvbnN0IHN0cmluZyAmIGNvbnRlbnQsIGNvbnN0IHN0cmluZyAmIHBhdGgpOworCisvKioKKyAqIEZpbGUgY29tcGFyZQorICovCitib29sIEZpbGVFcXVhbChjb25zdCBzdHJpbmcgJiBsaCwgY29uc3Qgc3RyaW5nICYgcmgpOworCisvKioKKyAqIGdlbmVyYXRlIGsvdiBwYWlycyB3aXRoIG5vcm1hbCBjb21wcmVzc2lvbiByYXRpbworICoKKyAqLworY2xhc3MgS1ZHZW5lcmF0b3IgeworcHJvdGVjdGVkOgorICB1aW50MzJfdCBrZXlsZW47CisgIHVpbnQzMl90IHZhbGxlbjsKKyAgYm9vbCB1bmlxdWU7CisgIGxvbmcgZmFjdG9yOworICBjaGFyICoga2V5YjsKKyAgY2hhciAqIHZhbGI7CisgIGNoYXIga2V5Zm9ybWF0WzMyXTsKKyAgc2V0PGludDY0X3Q+IG9sZF9rZXlzOworCitwdWJsaWM6CisgIEtWR2VuZXJhdG9yKHVpbnQzMl90IGtleWxlbiwgdWludDMyX3QgdmFsbGVuLCBib29sIHVuaXF1ZSA9IGZhbHNlKTsKKworICB+S1ZHZW5lcmF0b3IoKTsKKworICBjaGFyICoga2V5KHVpbnQzMl90ICYga2wpOworCisgIGNoYXIgKiB2YWx1ZSh1aW50MzJfdCAmIHZsKTsKKworICB2b2lkIHdyaXRlKEZJTEUgKiBmb3V0LCBpbnQ2NF90IHRvdGFsbGVuKTsKK307CisKKyNlbmRpZiAvKiBURVNUX0NPTU1PTlNfSF8gKi8KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L3V0aWwvVGVzdENoZWNrc3VtLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvdXRpbC9UZXN0Q2hlY2tzdW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3NjU2YQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L3V0aWwvVGVzdENoZWNrc3VtLmNjCkBAIC0wLDAgKzEsNDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidXRpbC9DaGVja3N1bS5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCit2b2lkIFRlc3RDaGVja3N1bShDaGVja3N1bVR5cGUgdHlwZSwgdm9pZCAqIGJ1ZmYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBjaG0gPSBDaGVja3N1bTo6aW5pdCh0eXBlKTsKKyAgQ2hlY2tzdW06OnVwZGF0ZSh0eXBlLCBjaG0sIGJ1ZmYsIGxlbik7Cit9CisKK1RFU1QoUGVyZiwgQ1JDKSB7CisgIHVpbnQzMl90IGxlbiA9IFRlc3RDb25maWcuZ2V0SW50KCJjaGVja3N1bS5wZXJmLnNpemUiLCAxMDI0ICogMTAyNCAqIDUwKTsKKyAgaW50IHRlc3RUaW1lID0gVGVzdENvbmZpZy5nZXRJbnQoImNoZWNrc3VtLnBlcmYudGltZSIsIDIpOworICBjaGFyICogYnVmZiA9IG5ldyBjaGFyW2xlbl07CisgIG1lbXNldChidWZmLCAxLCBsZW4pOworICBUaW1lciB0aW1lcjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VGltZTsgaSsrKSB7CisgICAgVGVzdENoZWNrc3VtKENIRUNLU1VNX0NSQzMyLCBidWZmLCBsZW4pOworICB9CisgIExPRygiJXMiLCB0aW1lci5nZXRTcGVlZE0oIkNSQyIsIGxlbiAqIHRlc3RUaW1lKS5jX3N0cigpKTsKKyAgdGltZXIucmVzZXQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VGltZTsgaSsrKSB7CisgICAgVGVzdENoZWNrc3VtKENIRUNLU1VNX0NSQzMyQywgYnVmZiwgbGVuKTsKKyAgfQorICBMT0coIiVzIiwgdGltZXIuZ2V0U3BlZWRNKCJDUkMzMkMiLCBsZW4gKiB0ZXN0VGltZSkuY19zdHIoKSk7CisgIGRlbGV0ZVtdIGJ1ZmY7Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC91dGlsL1Rlc3RQcm9jZXNzLmNjIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvdXRpbC9UZXN0UHJvY2Vzcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjg1N2QzCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvdXRpbC9UZXN0UHJvY2Vzcy5jYwpAQCAtMCwwICsxLDMzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInV0aWwvUHJvY2Vzcy5oIgorI2luY2x1ZGUgInRlc3RfY29tbW9ucy5oIgorCitURVNUKFByb2Nlc3MsIFJ1bikgeworICBzdHJpbmcgb3V0OworICBzdHJpbmcgZXJyOworICBzdHJpbmcgY21kID0gVGVzdENvbmZpZy5nZXQoInByb2Nlc3MucnVuLmNtZCIsICJscyIpOworICBpbnQgcmV0Y29kZSA9IFByb2Nlc3M6OlJ1bihjbWQsICZvdXQsICZlcnIpOworICBMT0coImNtZDogJXMiLCBjbWQuY19zdHIoKSk7CisgIExPRygic3Rkb3V0OiAlcyIsIG91dC5jX3N0cigpKTsKKyAgTE9HKCJzdGRlcnI6ICVzIiwgZXJyLmNfc3RyKCkpOworICBMT0coInJldGNvZGU6ICVkIiwgcmV0Y29kZSk7CisgIEVYUEVDVF9FUSgwLCByZXRjb2RlKTsKK30KKwpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vbmF0aXZlL3Rlc3QvdXRpbC9UZXN0U3RyaW5nVXRpbC5jYyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L3V0aWwvVGVzdFN0cmluZ1V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjNzlhOQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L3V0aWwvVGVzdFN0cmluZ1V0aWwuY2MKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1dGlsL1N0cmluZ1V0aWwuaCIKKyNpbmNsdWRlICJ0ZXN0X2NvbW1vbnMuaCIKKworVEVTVChTdHJpbmdVdGlsLCBDb252ZXJ0aW9uKSB7CisgIEFTU0VSVF9GTE9BVF9FUShTdHJpbmdVdGlsOjp0b0Zsb2F0KCIxLjMzMyIpLCAxLjMzMyk7CisgIEFTU0VSVF9GTE9BVF9FUShTdHJpbmdVdGlsOjp0b0Zsb2F0KFN0cmluZ1V0aWw6OlRvU3RyaW5nKDEuMzMzZikpLCAxLjMzMyk7CisgIEFTU0VSVF9FUShTdHJpbmdVdGlsOjpUb1N0cmluZyg3Njk1NzM4MlUpLCAiNzY5NTczODIiKTsKKyAgQVNTRVJUX0VRKFN0cmluZ1V0aWw6OlRvU3RyaW5nKCh1aW50NjRfdCApNzY5NTczODIyMzQyMzM0MzJVTEwpLCAiNzY5NTczODIyMzQyMzM0MzIiKTsKKyAgQVNTRVJUX0VRKFN0cmluZ1V0aWw6OlRvU3RyaW5nKDExMSwgJyAnLCA0MCksICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExIik7Cit9CisKK1RFU1QoU3RyaW5nVXRpbCwgVG9IZXhTdHJpbmcpIHsKKyAgdWludDhfdCBidWZmWzRdID0geydpJywgJ2onLCAnaycsICdsJ307CisgIEFTU0VSVF9FUShTdHJpbmdVdGlsOjpUb0hleFN0cmluZyhidWZmLCA0KSwgc3RyaW5nKCI2OTZhNmI2YyIpKTsKK30KKworVEVTVChTdHJpbmdVdGlsLCBGb3JtYXQpIHsKKyAgc3RyaW5nIHQgPSBTdHJpbmdVdGlsOjpGb3JtYXQoIiVkICVkICVkICUuM2xmICVzIiwgMSwgMiwgMywgMS4zMzMsICJhYWFhYWFhYWFhYSIpOworICBBU1NFUlRfRVEodCwgIjEgMiAzIDEuMzMzIGFhYWFhYWFhYWFhIik7CisgIHN0cmluZyBsb25nc3RyaW5nKDk5OSwgJ2EnKTsKKyAgc3RyaW5nIGQgPSBTdHJpbmdVdGlsOjpGb3JtYXQoIiVzIiwgbG9uZ3N0cmluZy5jX3N0cigpKTsKKyAgQVNTRVJUX0VRKGxvbmdzdHJpbmcsIGQpOworfQorCitURVNUKFN0cmluZ1V0aWwsIFRyaW0pIHsKKyAgQVNTRVJUX0VRKFN0cmluZ1V0aWw6OlRyaW0oIiAgXHRhYWFhICBcdCAgIiksICJhYWFhIik7CisgIEFTU0VSVF9FUShTdHJpbmdVdGlsOjpUcmltKCIgIFx0ICBcdCAgIiksICIiKTsKKyAgQVNTRVJUX0VRKFN0cmluZ1V0aWw6OlRyaW0oIiIpLCAiIik7Cit9CisKK1RFU1QoU3RyaW5nVXRpbCwgVG9Mb3dlcikgeworICBBU1NFUlRfRVEoU3RyaW5nVXRpbDo6VG9Mb3dlcigiMTExQUJhYkFCYWJBYmFCMjIyIiksICIxMTFhYmFiYWJhYmFiYWIyMjIiKTsKKyAgQVNTRVJUX0VRKFN0cmluZ1V0aWw6OlRvTG93ZXIoIiIpLCAiIik7Cit9CisKK1RFU1QoU3RyaW5nVXRpbCwgSm9pblNwbGl0KSB7CisgIHZlY3RvcjxzdHJpbmc+IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBTdHJpbmdVdGlsOjpTcGxpdCgiMWFhYSBiYmIgY2NjIiwgIiAiLCB0ZW1wMSwgZmFsc2UpOworICBTdHJpbmdVdGlsOjpTcGxpdCgiICAxYWFhICBiYmIgIGNjYyAiLCAiICIsIHRlbXAyLCB0cnVlKTsKKyAgQVNTRVJUX0VRKHRlbXAxLCB0ZW1wMik7CisgIHN0cmluZyBqID0gU3RyaW5nVXRpbDo6Sm9pbih0ZW1wMSwgIiwiKTsKKyAgQVNTRVJUX0VRKGosICIxYWFhLGJiYixjY2MiKTsKKyAgU3RyaW5nVXRpbDo6U3BsaXQoIiAgYSBiICIsICIgIiwgdGVtcDMsIGZhbHNlKTsKKyAgQVNTRVJUX0VRKHRlbXAzLCBNYWtlU3RyaW5nQXJyYXkodGVtcDQsICIiLCAiIiwgImEiLCAiYiIsICIiLCBOVUxMKSk7Cit9CisKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0L3V0aWwvVGVzdFdyaXRhYmxlVXRpbHMuY2MgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC91dGlsL1Rlc3RXcml0YWJsZVV0aWxzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTJjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdC91dGlsL1Rlc3RXcml0YWJsZVV0aWxzLmNjCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidXRpbC9Xcml0YWJsZVV0aWxzLmgiCisjaW5jbHVkZSAidGVzdF9jb21tb25zLmgiCisKK3ZvaWQgVGVzdFZMb25nKGludDY0X3QgdikgeworICBjaGFyIGJ1ZmZbMTAyNF07CisgIGNoYXIgYnVmZjJbMTAyNF07CisgIHVpbnQzMl90IGRzaXplID0gV3JpdGFibGVVdGlsczo6R2V0VkxvbmdTaXplKHYpOworICB1aW50MzJfdCB3c2l6ZSA9ICh1aW50MzJfdCktMTsKKyAgV3JpdGFibGVVdGlsczo6V3JpdGVWTG9uZyh2LCBidWZmLCB3c2l6ZSk7CisgIEFTU0VSVF9FUShkc2l6ZSwgd3NpemUpOworICBtZW1jcHkoYnVmZjIsIGJ1ZmYsIHdzaXplKTsKKyAgdWludDMyX3QgcnNpemU7CisgIGludDY0X3QgcnYgPSBXcml0YWJsZVV0aWxzOjpSZWFkVkxvbmcoYnVmZjIsIHJzaXplKTsKKyAgQVNTRVJUX0VRKHYsIHJ2KTsKKyAgQVNTRVJUX0VRKHJzaXplLCBkc2l6ZSk7Cit9CisKKworVEVTVChXcml0YWJsZVV0aWxzLCBWTG9uZykgeworICBpbnQgbnVtID0gVGVzdENvbmZpZy5nZXRJbnQoInRlc3Quc2l6ZSIsIDMwMDApOworICBpbnQgc2VlZCA9IFRlc3RDb25maWcuZ2V0SW50KCJ0ZXN0LnNlZWQiLCAtMSk7CisgIFJhbmRvbSByKHNlZWQpOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgdWludDY0X3QgdiA9IHIubmV4dExvZzIoKCh1aW50NjRfdCktMSkgLyAyIC0gMyk7CisgICAgVGVzdFZMb25nKHYpOworICAgIFRlc3RWTG9uZygtdik7CisgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL25hdGl2ZS90ZXN0RGF0YS90ZXN0R2xpYkNCdWdTcGlsbC5vdXQgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdERhdGEvdGVzdEdsaWJDQnVnU3BpbGwub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OGE2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvbWFpbi9uYXRpdmUvdGVzdERhdGEvdGVzdEdsaWJDQnVnU3BpbGwub3V0CkBAIC0wLDAgKzEsMiBAQAorBI0C0yqkUEtNjQLTJjpceEJEXHhDOFx4Q0FceENCXHhBQVx4QjRjYFx4RDV8QTErXHhDQlx4RENceEFBXHg3Rlx4MURceEE0XHgxQnhceDFCXHhEMWtceEUxXHgwMVx4MEVceEVBXHhDODJceEI3XHhGOCBceEJELnpceEVGSFx4RkIqXHhFOFx4QkRceEQ0XHgxNW9ceDgyXHhBMVx4MEZ9XHgwM1x4MDBceDE3XHhDN1x4RjdDZSpUXHgxRFx4QzR0a1x4RTdceDBDU1x4QkZbIlx4QURXe1x4QjlceEZGTE1ceEIyXHg4N1x4MDNceEZDXHhDMlx4RTJceDlDJVx4Q0JceEZGXHg5QVx4OTddXHgxNV9OXHhBM1x4OEYmRGJceEE2XHgxNzJceDk5XHhGOCtceEE0XHhBNVx4QUM0blx4MER9XHhBMC9bXHhCRFx4RkRceEM0XHhBN1x4QkNqXHhGOFx4ODVceEM2Vlx4ODdCXHhCQVx4ODVceDhBXHhDRFpceEZCVVx4ODRceEQ3XHhCQ1x4QUJceDg0SH1fdlx4QzRceEIyXHgxMVx4MTlceERCXHgwNlx4OTNceEI1XHhCRVx4OTJFXHhDRVx4RkFceDAyUkdceEU0XHhBM0hjSTRceEFCLlhceEE1XHhCOGFceDA2XHgxRS5ceEFEU1x4RkJceDhBJldceERBXHhDQTJeXFx4OTBceDg3XHg5NWxdclx4OTlceDg4Ylx4MUVVXHhDOFx4RTBsXHgxRiNoXHgwOFx4QThceDgwSVx4OUJceEMwRVx4MTklXHhERVx4RTVceEE2P1x4QzJceDgzXHhBMFx4RDZPMVx4RkJfXHg5NFx4RjhceDhGXHhENlx4RDlceDE2XHhFMlx4OTFceDFFXHg4RUxceDFGXHhBMllceDA1XHg5Q29NTlx4MENceDg2XHhFMlx4RTlceDlBXHhCMTZvXHhGNlx4RjNRXHhBMlx4RDhceEI4XHhEMFx4REJceDg2XHg5M1x4QUZlc2NceEEwaFx4MTJceEI5RVx4MUJVXHgxMlx4MDJPWFNceDhCWG5ceDBFUVx4QUJKXHhDRVx4QjJrXHhCMVx4RDdaJ1x4RTRceEI3W2B+NFx4MTFceEI0XHhDRGBceEY1JVx4MUZceEY5XHhFRVdceDg4XHhDNVx4MTQ8K09ceDFCOUI+XHgxMVx4OTU8XHhERVx4RDVceEE0QzxvXHg4RVx4REJceEVBelx4OUZHaVx4QUQmXHhGRVx4RjhceEI2M1x4RURceDA0XHhBMVx4RTJ2XHg4NkdceEFFXHgwOVx4OTFceEU0XHgwM0pTPVxceEQxXHg4MX1ceEVFXHhBMzw/XHg4N1x4REJceEMxXHg4Qlx4RkYpXHhFOExceEMzXHhDN1x4OEJceDA1XHgxQidceENDKVx4RDRceDBEXHg5MHtceEI5XHhCN0M2XHhBOVx4MTZceEUyXHhGOUQlXHhFOSFCdF1OXHhGQiZceEYzXHhDRVx4N0ZceEI3ZDhceEJDTlx4MTkxLE5tXHhBQmJceDkyXHgwMFx4RUFceEJDXHhEMFx4RDUhXHg5NTZceEY5XHg5RFx4OThceDg2XHg4MVFEbkxceEIxXHhFRnhYXHhBNFx4MUZaXHhFOXVmXHg3Rlx4RjdceDhGXHhDRFx4QzVQXHg4MVx4MTdceDE3XHhCMFx4Q0JceEFGXHg5Q1x4MDVceDhFXHhDNlx4REJceDA5XHgxQWtceEE2XHhGODIyXHhGNFx4QTR0XHhBMTsyXHhDQ1x4RUFceEZEPzBrXVx4RjhceEU0XHgxM1x4RDInWlx4OUZ+NVx4OUNceEZDK2tceDA3XHhFNGtceEI5XHhFRHhceDlCXHgxN1x4QTIiXHhBOFx4ODUmUlx4OTBceDFDVlx4RDNUXHhCN2JbXHg4MSkiOFx4RUFceEU2XHgxMlx4RTBceDg4flx4QjhceDg3XHhBOVhceEIwXHg4OFx4MTlceEE1LFx4ODhjbUBceEVFXHhGOS5ceDhBP1x4RjghXHhEOG9SXHhBQlx4MDVceDkzaDNceDEzXHgwQVx4OThfRVx4MTFceDgxXHhENlx4Qjg7UFx4RDh1PFx4OURUdj5dXFx4RjFceDBDXHhENVx4RjRceDBFI1x4ODd9XHhFM1x4ODlceEEyXHhDMlx4RUFceDg2XHg5RFx4RTdceEFGXHhBMVx4QzM7XHhEMlx4RkZceEE2XHhCMiFceEFCXFx4OTBpfG5ceERFXHhCQj46XHhDNlx4MDhceDFELFFceEMxO1x4MTVceDlEPlVWXHg4Rlx4RDM7XHhGQVx4MTJceEQwVVx4QTlceEQ3PFx4QzZceEZEWFx4OEZceDEwdlhceEYxXHhGOUg3XHgxMlpceDFGb0JceDhCXHhENlx4RjBceDA0XHhFQlx4QTJceEMxXHhBQ0hceEZFXHhDOV9SXHhGNVx4MURceEE4XHg4Mlx4QkRceEM2XHgxMVx4MTkjXHg5QVx4QThceDA5XHg5NVx4MDZceDk4XHhBOWZceEQ5XHgxMlx4QTBpXHhGQVx4RDNceEIyXHgwMVx4RTlceDA2XHgxNCJ+LiJ6XHhERlx4RjJZViN6XHhFQi1ceEZBJFtVXHhBNlx4RTIuXHhENlx4RDBrZlx4QTNceDgzXHhFMFx4ODZceEQ5XHhDMVx4N0ZPXHhFOVx4RjRceEVGXHg4MVx4MDZceEEzXHhERVx4QzhceEFDInRceDhCXHhDQXJceEU2XHg4MiQ4XHgwRlx4RTFceDA2XHhGOVx4QkJceDBDXHg5Rlx4QUEiOFx4OTRceEJCVVx4OERRXHhDM1x4RTlAJ1x4RjlceEJGXHhDRlx4OEJceEQ0XHg5OTVceEVCXHhFOXQzUVx4MTBceEQ3XHgwRFx4OURceDk0XHhDQVx4ODRceEMyXHhFMntceDBCXHg4OXJceEE2XHhDNlx4QUFceEU1Q1x4QzZVXHhBNlx4RDF0cWFceEEwXHhEN1JPXHg5Mlx4QzlceEJFIlx4RjlceEQxXHhERVx4OTNiXHgwNlx4RDNhZTpceEI3XHg4Q1x4OTlceEQ2XHhGRklceDg2XHg4Q3Z0WEBrXHhFNG1ceDkzd3pceDhBXHhDMlVceEZCYlx4QTJceDlBb1x4QUZceDhEXHgxOWtceEEycFBceDgzc1x4RkVceDBFXHgwRllceEEwXHhBN0UnXHhDMFx4MDJceEY0XHg5OEE1XHhGMlx4OEE/XHgwNCRceDg5XHhDN11ceDBBXHhGQlhceDk3Klx4QUVOXHgxMyNceEIzYVx4RDJ5XHhEMyNfQlx4QUNceDA1Olx4QUNceDkyXHhFQU9ceDA4SFx4ODhOXHgxQVx4QjlceERDXHhGQVx4MTFpa0pceDEyIVx4RTh1XHhDRCtceDg4XHg5OFx4RTNjXHhDQlx4RDk8MSVceDk4S0ROXHhDNlx4RjJceEI3XHg4Nm82XHg5MVBgXHg5Qlx4QTFceDBCXHg4Mlx4RUJceDE1SFx4QTBceEM0XHg4NVx4REZceEFDIlx4QTFiXHhEOVx4QTNiXHhCOEVceEI1OV9ceEY0XHhDQ1dIXHgwOSY1XHhFNlx4QkVceEYyXHgxOUZDXHgwRVx4QUJceEVBNlx4MENceEFENVx4OTAvJERceEIzXHg5RVx4ODFbOWpceDhBXHhDNFx4ODVceEFBQVx4N0ZlXHhEQ0c4XHgwMFx4REFceENGaVx4QkRwXHgxOD9ceEY1XHhBOH5AXHhDMVx4MDhceERGXHhFNVx4QUUsXHhERjB0XHhDQlx4OTJXOCZWXHgwMUZceDFBLi9ceDhEXHhBRlx4RDhceDg3XHhDRVx4ODB3Klx4MThJc1x4MTdceDE1XHgxN0RJXHhCNGFfXE5ceEI3N1x4QTduXHgxNlx4REZJRVx4RUZceDlFXHg4Q2Q3XHgxQlx4RjlceDk3XHhGOUVceDg2XHg5OFx4OUZceDFEXHhCNlx4OUZceDk0XHhGN1x4OEFKXHgxQVx4Q0RceDg4XHhEM1x4RDNceERFd1x4OTJRXFx4RjVceEM2XHhENlx4MTFjXHg4MVx4MDBceEU4XHhEOSInXHhFMVx4OUQ1XHhGQ1x4MTF9LFx4QjhceEIyVlx4RTZceEMwXHhCN2EvXHgxOH49R1x4QUNceDlFR3hSLFx4OUJceDkxXHhBMFx4RTlceDg1XHgxNEpceEIzXHhCMk9ceEVBM1x4QjJGXHhBN3ZvXHg4OFx4RkVtXHgxOCpnJVx4QTRsXHg5Qlx4RjBceEE1YCRceEVCb1x4RkM/XHgxMyJzXHgwRFx4OTF5XHg5Mlx4RTB1XHhGQVx4RDFwKylceEFDcGlceEUzXHhCNEwtXHgwQVx4RjEjXHhDRlx4MUFceDgyXHg4QVx4RTVceEVGODBceEM5XHgxN3pAXHhEMVx4OUFvS1x4Q0VceEU0Mlx4OTJNXHhFRlx4ODVceEJFKHpceDg2MFx4QzZceDAzdFx4MDJceEExXHhEMlx4MDlceDFFXHhCM1x4ODB0XHg4NnxceDhFfkZceEZEMWl8XHg4NF5ceDA3XHhDOVpceEJFXHg5MVx4QTdceDA2XHg5Qlx4QzdceDhGXHhGQlx4RDRceEI4NFx4RURceEEyXHgxMDgvWFx4ODlceEY0V1x4RjZceEUzXHhFRVx4OTRRLEhceEZGPm8zRVx4QTdxXHhFNVx4MTVceDg2XHhDRlx4MEZfXHhGOVx4RThOXHhDRH1ceEVCXHhGRFx4MEVceDAzRVppXHg4MyBceEE3RHx7XVx4RUVceEJBXHhFNFx4MDBSUlx4MUNceEZCalx4ODFceEYwe3dceDlGXHhBNkZceEJCXHgwMFx4MEN3XHgwMVx4RTFceEZFXHhDOFx4RThceEFDXHhEMThceDE5LFx4RTlceDlFXHhGRVx4RjBceEE0NW92W0tceDg2VVRceDAwXHhDMCpceEVGXHg5RGVceEU3cE5bXHhBNX5ceEYzXHhEQVx4QURceEUwXHg4NVx4QjBOYlx4MDlJX1x4QThCOmJceDlBXHgxMFx4QzJceENGXHhFODN8XHhCMVx4Q0RceDE3XHhFOFx4OTVceEE2ISJceEQ3MkRSXHgwM1x4QjdceEY0Ilx4QzJceDg4XHhGMVJsK3RceEE3eFx4MDRceDEwXHhDMUBcXHhDM1x4RTV9XHhERGBceEEyXHg5MVdceDdGJVNceEI3XHgxM1x4RkZceEYyXHg4Mn5lXHhEQ1x4RERceEExXHhDNVx4REZceEM2eHhceEFDXHhGMyFceERDXHhGRSlceENGQFx4OEVceDlDVVx4RTlceDAzbVx4RjdceEI1XHhDOFx4QUJceEI5XHg5NFx4MDJceDhDXHg5MTBceEU2XHhCQ1x4QTNceEZBY1x4MThceDgzdlx4MDlceEFGXHhFOXVceEUxXHhCNk40XHgxNlx4OEVceEQwXHhGQTtceEJGXHhERXQ6XHhEQXFceEM2flx4OTc5XHgwQ1x4OUMlPVx4MTlceDA5XHhGQlx4QzdceEIyLHlWXHhFRFx4QzZ9XHgwQVxceEZCLCpceEVGK1ZceEE4XHhBOVx4ODFceEFET0RceEY0XEBceEZFXHhBRVZceEVEXHhDOFx4QzVPW1x4RTZceEM3XHhFRVx4QzdceEEwXHgxMExceEZGaVlceEFFXHhENFx4REVceEU4OVx4RjZceDgzXHhDOFx4RjdceEI5LVx4QjhceDBBOHtBOFx4RjJrXHhGMFVceEFEaFx4MUZceEI1XHhFRlx4MTQiXHg4RTxVXHhGRVx4OTNceEJEXHgxNSxceEQzXHhDM1x4QjNceDBFXHgwOSlceEU0YFx4REFceEExXHhBN25ceDk2IGxceEM0XHg5MypceDFBXHg4RnhceENBXHhEQlx4RTZceEFCXHg4Rlx4MDRceEVEXHgwRV9ceEY5XHhEN1x4REJLXHhDQlx4QThceDE1IVx4MDZJXHhCNVx4QTJceEFBXHhDMitceDk5Y1x4RTNOXHhDMFx4MEVceDAzO0pJSXVceDhFXHg5Qlx4REIxXHhBQjlqXHhERlx4OEJceEYwXHhCRFx4RUNceEEyXHg5Rlx4MTFceEU5XHhGN1x4Q0ZceEJEeyRceEQyXHhEMVx4OTRHXHhCQX5ceEYyXHg4QlxceEJDXHg5RVx4RDJceDEwXHhCNVx4RjM6XHgwMFx4OEFLXHg4N35ceEM5XHhGRVx4OENKXHgxQlx4RUNceDFEe1N9P1x4OUZ1XHhEM1x4MThceERGXHg5NHdceEIyXHg4NVx4QjVNeFx4RkNceDE4XHgwMmtceDE0XHg4M1x4MTBceEFDWFx4MUJceEI0XHhBNlx4MEVceDBFMlx4REJ5blx4MTUjXHhFMFx4OUNceDAxSlx4ODVceEYwXHhDM1x4QzBceDE5LFx4QjUxXHg5RVx4RDhjUFZceEMyXHhEMVx4RkFceERDVlx4MTNQTlZceDEwXHhBMVx4MThpYVA4dldZXHhDRlx4RDBceDgwXHgwRFdceDFFXHhDMlx4ODFceEYyelx4RUJceEFFXHg4NVpceEE2XHhENFx4OTNceEY0XHhCN1x4MEZceEYyXHhBMlx4QjJ0d1x4OTZceEQxa1x4QjJceDE3XHg5N0ZceDk3XHg4NFx4RTUpXHhENlx4MEVceEQ4XHhFRk5ceEI5eVtceDA1XHg4MGlceDkwXHhGNlx4QkVceDE4eVJkXHgxRlJceDAyXHhCQVx4MTNxXHgxRVx4RjdceEU0XF1ceEYyXHhFNVUkXHg3Rlx4OURGZVx4MDRceDEwXHhCNC5ceDBGXHg5QjlceEU4VVx4MUUlXHgxNVRMO1x4OUNceDhDXHhDRFx4ODlceEQ5czAvOFx4MTVceEIxXHhEQlx4MER7XHhEOC9ceEJFXHhGRVx4QjJceDE3XHhENFx4MDVceEQwXHgxQVx4QzZceEFEXHgwOVx4QjdOXHhFREJlXHgwMDknXHgxMWNKLFx4ODkjeVx4N0ZceEVDXHhDRlx4MEZbXHhCRlx4QjNceEZFXHgxQ1x4ODhceEM0XHgwNFx4QjNceEY1R1x4OENceEFBJ1x4QzFceEVGVDVceDE5XHhFMyVceDhFSSBceEQ3VkJceEMxXHhCMVx4RDhceDAyXHhDQ1x4RkZceEJFXHhCNFx4OERAXHhERn1ceEQyXHg5NFx4MEFceEMyXHgxMFx4RTZceEQwXHhGQVx4REJgXHgwMFx4OTFceDFEXHhENlx4QUVceEM5XHhGRVx4OTNceEM0ZSI/XHhCRFx4OEVIXHhCNlx4Q0QhXHhFQVx4OUFCXHhCRVx4RDlceDhDUVx4QkQmXHg4RFx4RjNveiZceEJFXHhBQ3FGXHg4RVx4RjBceEQwXHhEMlx4MTlyXHhFNXNceDAwZlx4OUJceDlGXHhBM2VceDg5Vlx4QkVQXHhBOClceDg3RFx4MTRceDgzXHhCMWVXXHhBQiJceDk1XHhEQVFceENGMVx4RTZIXHgxMFx4MDhceEU4XHhGRjdceDEyXHhFMzpceDBEXHgwMlx4OEY9MkRwXHhCMVx4RUVceEI2XHhGMDNceEI2XHhBQUBceEFGXHhDRlx4OEVKOlYpc1x4QjlceEE5L1x4MUVVUllceEMwXHhBMW8rWHxceEZBXHhCNlx4ODdceEYyXHhFQmsmW1x4MDdceEE3XHhDOTBceDkwRiVceDEzXHhBQlx4QUZceDExTlx4QzZceDlGXHgwQlZceDFEYlx4RDhceEQ0XHhFNzRceEYyM1x4RkVceDg0XHhFOVx4QTNceEQ2XHhGNFx4RjVceDE5XHhCOEFceEM4XHgwMVx4RDBCXHhDNFx4RkJOXHg3RjtceDdGXHhGRFx4QTNIVFx4ODRceEM4VFx4MThXXHg3Rlx4OUZceERDXHgwRHFceEIyVVx4QTlUXHhGM114eFx4REFrXHhDMVx4QkZceEY0KVx4OEVoXHhEMlx4OEN7XHg5MFx4MDVfXHgxRlx4MDNhYFx4RUVceEQ1V3hceEJCXHhENVx4QTVceEYxbVx4MTdceDg1XHg5NzpKXHhERFx4RTRceEUyXHhCN3RceEM0XHg5OHhceDk5XHg4Nlx4RTUpXHg4Mlx4RTFceEVEVFx4QjFceENEXHgwQSNDXHg5NVx4MTZceDg1XHhBOFx4Q0JceDg5XHhDRGhceEMwaVx4QzN0XHhEM1x4RDZceDlFelx4OERceEVDXHg4N1x4QjlceEU0XHg4NWVceDk1XHg5MVZHXHhGNzl1MEMgXHhGNkFGQktceDExK1x4QjJpXHg4Rlx4ODdjXHhCRmAvXVlbPlx4QjBDbCdceEFFXHhDNlFuXHhENFZceEI2aVx4MDdceEJBKCtceEVGWlx4RTdceEIyXHhDQ1twXHhDMGpceDkwXHg4Qy5sKlx4RTJceDk3OyZceEQ5XHhCN1x4OERceDhBXHhFNVNceENFdFR8XHhBQ1x4QUVwXHhBQ2dceEYyXHhGQ1x4QjVceEVDYWNceDBFXVx4MDksXHgwOW4+I1x4MUFrZ1x4QzJceEQ1fFx4QjlceDhEZlx4MTdceDg1MXYnfCo9XHg4RFx4RkFceDAwPlx4QjJceEQ5XHgwNCZRSVx4QjBceEM0e1x4MThceDFBfVx4OERWOlx4QThceEVDTjRuKlx4QUVceEU0XHgwN1lLXHgwM1x4Rjhtc1x4MTcvXHgxN0pceEZEXHhGRFx4MTQvXHg4NlhceENFM1x4MUNeXHhDNFx4OERceDlCaVx4RjFceENBXHhFNlx4QjJceEU5XHg4M1x4RkRceDBGXHhDRFx4OEFceDlGXHgxRFx4QjVceEM3MFx4QkFVXHhGRFx4RENPUlx4RjdZMkkkXlx4QkRceEZDOyJceEU2XHgxMFx4RjRceEE1XHg4MFx4OEJceDEzXHhGNydtfVx4RDNceDhDXHhBQlx4RURceEUwXHhFN1x4MUVceDgxXHhEMVx4MUJceEMzXHhDQVx4Q0RceEIxXHhENE1ceEQ3fXdceDg1XHgwQVx4MDBhXHg5NFx4RTVceEE5XHg5Nlx4RDBceEEyXHgxOVx4MDNceEZEXHhEQU1ceEM4dyxceDExIVx4ODdceDBEJXYua1x4QUJceDg4PFx4MTJceEU2XHhFMTxceEFBLVx4RjZLYlx4MDNceEVGdCBkXHg4Qlx4MUFceEI1XHgwOFx4RDFceEY2XHhBM2lceERFXHhERlx4OTBzI1x4ODhceEUzXHhFOFx4QTZceEU3biZceEZFdlx4QzJceEY2XHhBMVx4RDJceERDXHhFNlx4RjElSFx4QjlXXHg4Nlx4RjNceDhEXHg4QU9ceDEwclx4RDNceDg5O1x4RDFceDkwKEhceEE2ZWlceEZCXHhDQlx4REJceEJBXHg5M3pceDAxQ1x4MUJceEIwXHhBMnBceDA0XHg4MFx4MDFceEVBXHhBME5ceEY5XHhFNVx4RTRceDgzXHhFRFx4MEVceEJDTVx4MDZceDhFXHhCRVx4MTRceDhBXHhGNU5KXHhBMFx4RDBceDE1XHhFQVx4REJISkFceEU3XHhFRXlULFx4OUVcXHhFMDFceEMwXHhBNkhRXHhBQVx4RjZceEJCXHhEMlx4RDBZXHhEN1x4RDJceDE4XHhDMnxceERGcFx4MTJceDBCXHhEMUx5XHg3Rlx4RDRceEE3XHgwMlx4ODNceDE4Zm1+XHhCOVx4MDJ6QXFceEYwXHhGNzJceEUway5ceDg3Mlx4OEJceEY2XHgxQ1x4ODRWXHhDOFx4QjdXXHhGN3VceEQ0XHgwQX1ceEYzXHg4Rlx4MDVceDFCWFx4ODZ2aFx4MTFCdFx4RjNiXHg4Q1hceEQzaTNceERBXHgxRVx4RTBKSHUqXFx4MENceEE1XHhCQ1x4QUIiN1x4REFceEFGZHF6XHhGOTBceDk4TVx4RjJceEVCXHgxRFx4OTBceEVBWVx4OEIzXHhEOVx4MTNceDk2Z1x4MEJceEJFVlx4QzV7T1x4QTZceDhDXHhGNihceDAzY09ceERCQUVceEZGXHhBMnlceEY0TFx4REI9Py5ceEJCXHhCMGFceEVGXHhFQ2lPXHhDNlx4RTdceERGXHhEMio0ZHBceEFCK3NcXHg4Qlx4MTVceDAwXHhGNWFceDE5XHhFQ1x4MEEgXHgwRHpceEQ0XHg4MFx4RTAlXHg5N1x4RERceEIwXHhDQjlceEM4YFx4MDFceDBCXHg5M1x4QkVceEM0XHhCMkJceEQ2U2FceEI4aElceDEyXHgwRFx4QTRceDgwXHg4NVx4OTNceEJBK1x4OTVceENBXHg5Rlx4RDU1XHg4MDNrXHg4RVx4QzFceDE1XHgxNE5zcmhMOVx4MUVceEU5XHg4N1x4RENFXHhCNVx4OTdceDk2XHhENlx4MTk3XHg5Qlx4ODFceEQ2Pjw1XHhCRVx4QUJceEE5XHhFQlx4Q0JceDg1RVx4OERceEU0W1x4OUIxXHg5Qlx4Q0NceDkwXHhGRmNceDE2MXxRVVx4QjJceDE4XHg5M1x4MUVceDg0XHhBQlx4QjhceDlGXHhDOEdceEI2XHgwNVx4OUNceEREMlx4Q0ZNXHhDMFx4QUVoc2pceDEyXHhBM05JXHhBM1x4QTRceEE2S3RceDBEXHhCQVx4ODZceEQxdm1ceEMzXHhBRFx4OERceEE3XHhGRFx4MURfXHg5MlV3XHgxRFx4QjNceDgyXHg4Q1x4ODdyXHg5Nlx4RDJceEY4XHhGQXlceDkxQ15HXHhDRVx4RDEtYlx4RTA2XHhDQ3xdXHhCNVx4RDIgXHhFRVx4Qjk3ckBmXHhCOXtceDE4XHg5MFx4QTdceDA4XHhENlx4RjciXHhBQ1x4QjE6Llx4MDhceEU2Wi1ceDEyXHhGQlx4MDFceEU2XHhFOVx4RjBAXHg4OVNceEQ3XHgwNixceDdGeVx4QzZceDgzXHhBRUdbM1x4MENPXHhGQVx4RDdceDkyXHhBRFx4QUMjXHhBRmdvXHgwMFx4QjRceEE2XHhFMVhceDAyXHhDOEJceEQwVGNceEE5XHg4Nlx4MUZceDA3XHhDRVx4OThceDkyXHhCQlx4RjFceENEUlx4OUZceDlCL1x4ODZceEY2XHhGQlx4RkE3XHhGMlx4RjNceDkwOz1ceDg2XHg5MXlceEU5JVx4RURUSlx4OTBNSFx4MDdsZVx4QkNceDBFXHg4QzxceEIzXlx4MEVceEMyXHg5Rlx4Q0JceDE4XHhBN1x4OUJMXHhFN1x4RUMjXHg4QzRVXHhFNSYjXHhFQ1luXHgwRVx4RkVceDBBJlx4RDRceEJBXHgxNVx4REVceDEzXHhFMTdceDBCbC5ceEU3Nlx4RkFceENGXHhDMixiXHhDNVx4QUZoXHhGOTs0L1x4REZceDFCXHhCNC5ceEZEXHgwQTBceEQxfEtceEE2XHg5MCoqfTxceEVDXHg5NFx4OEVceEQzY01IXHhGQVx4QUNceEYyXHhCOVs2MHRceDA5XHhFM1x4OEVceDgyXHgwNVVVXHhBMVRceEM1MFx4RUNceDFGXHg5OSBgdFx4MTJceDE4P29ceEMyXHhCMFx4MEI3XHhBMVx4RUNceDE1XHhDN1x4MUNceEYzXHhFOFx4QjFceDk1XHg5Q0dceEExVVx4QjdceEE0KVx4RUFlXHhDNGJyXHhEQVx4RkNceEU2XHhFQWR1XHhEOFlceEJCXHg5M3dceEQ3Ulx4ODAmN1x4OTZyXHhEM1x4QkFgXHg4RFx4RUNceDhBflx4RTZceDAyXHhBREtceEUzXHg5Q1x4MUZceDA3XHhGRFx4RDNfJVx4RUVrNlx4RTVAXHgxNVx4OTZnXHgxRk5ceEIyXHgwM0RceEQ3PzlceDlBXHhCNXhceEVBU199JVx4RERUXHgwNWk2S1x4OEFceDhEIjNVXHhEN09ceDA0XHgxMFx4OEZceDkzXHhDOFx4QjJ1XHhFOVx4QzRNSjVceEU4elx4QjBceEM1XHhBRFx4RkRceDlDXHhCRVx4QjJsVFx4OTl2XHhBMlx4RDBceEQ0XHhBNT1ceEYwXHhBQndGXHhENlx4OTdceEI2XHhBNFx4RkJceDlFXHhBQytceEZBelx4OEJ0eHpLeDw1XHhFOVx4RTMzb1x4QzNceERDXHhBN1x4QUNgXHhEOFx4QzRceDkxPFx4Q0JoMlx4RDJceDFFXHhGOFx4RjZceDk1enZceEMxXHhGNTtfYVx4RTc2XHhGNEdrVlx4MDRceEU5XHg4NFx4MTJceEQwXHhFM2JceEE2XHg5OVx4MDFceEY4XHhCNFx4MUF1d1x4QTNceEE1XHhEMCxceEI5Klx4OERceEU4TnY0XHgxNFx4QjZceDlBXHg5Rlx4RjBceEIzXHhEN1x4RkRceEU5XHg4RFx4OEJceDAyXHhBNVx4OUNceEU4XHgwMVx4QjBRXHhFMFx4Q0RceEQ0RFx4OEVceDlFXHhBNlx4Q0FMXHg5NVx4ODY9QWNceDEzXmVfXHg4QVx4MUJSXHg5OWBceEIyXHgxRVx4QUNceDFBXHhEMFx4RTJceEIxSlx4ODdVXHhFN1x4QTRceEYzXHgxMVx4RkRceDk5cVFceEQ4VWc4XHhDRCJceEMxcVx4OERKJjBceDFBXHhDMFx4ODNTe3FceENFXHhFOStceEVEXDZceDE5XHgxNFx4MEFceEUyXHg5OFx4QzJMdlx4QzBceEJGXHgxOUlMXHhEN14/XHgwQkBceDFCXHhCRCBceEQ1P1x4RjVceEVFXHgxRVx4RjhceDEyOGRceERCXHhFN2hceEIzdlx4OEFlXHhFQlx4RTg4WFx4QzFceERCVFx4MEZOXHg5MzJceDFFXHhDOVx4OENcXHhBRChXVmZceDhGcFx4QUFceENFXHgwME5ceEVDXHgxOVx4OUJceEM1XHhFMyN5XHhFOFx4RENceDhFXHhCRFx4QjZceEFFXHhDND5ceEE4XHgxMlx4ODh+XHgxRFx4MDFceDhGXHgxQ1x4MTNceENDLVx4ODhBXHhBRWpceDkyXHhGMHFceENFXHgxRShceDlFOE9ceDE2XHhFOFx4OENceEEzXHg5OFx4OUZceDk0OFx4RjVceDhELzlceEYxXHhCOCFceEI3IDBceDlCXHgwRVx4MUZRLGlCXHhDMzdceEI1XHg4NVx4QkRceEQyXHgwOHdceEE4XHgxOFx4REJceDdGXHhFNFx4RUJceDkzXHg5Qlx4QjFYXHhGNFx4OUNceDFDXVx4QjhceDA4XTpmXHhEMXpceENCXHg4OVx4ODlceEQ1Vlx4RjVceDkyXHgxOWJceEMwXHgxMFx4QUFceDBBXHhBOVx4RkQtXHgxNlx4RTNceEIxdG1ceDhFPlx4RTAyXHhEMlZceEI3XHgwOVx4RjhceEFBQ1p9XHg4Q1x4QkNMXHhDQlx4RTVceEREXVx4REYuQlx4RDJceEZEXHhCRlx4QTBceEE4XHhFQlx4QTEsVlx4QUFceEMzSj1ceDFFXHhEM1x4QTFceEM2NFx4OTh7XHhEN2YsM1x4QkJGXHgwMFx4MDlbXHhCMFxceDA3XHgwQVx4RTA/VFx4QkNyXHgxM1x4MTdiM01ceEIzXHhCRCpceEJBXHgwNUpceEM0RyVceDkxSFRceDE4XHhCNVx4QTRVXHhGMHJceEFELlRceDFDXHhFNWVceEQ3XHhGOGVceEZEXHhENVx4QkZFXHgwQlx4MDhceEVCOFFceEQxXHhGNFx4OTNceEExXHhGN1ZceEEzXHhBNVx4RUQ+d19ceEJBXHhGOVx4QzQ3XHhDOFx4RjdpXHhGMlx4QTluK15ceEU4XHg4NX1ceEUzTFx4OTBceDg2XHg4RHQsXHg5NkNceERDfFx4RDllWF9ceDBDXHhGM1x4RTNceDg0XHgwRTVceEM2XHhEM31ceEJCXHhCRkEiXHhBQjtLXHhFRVx4QjFceDE0XHhGQlx4QkNceEM2ZVx4RTdEXHgwM3JceEFEXHhGRnJceEEzXHhCRnYpXHhCQUFceEFBXHg4Rlx4RjZceDA0XHhCMV5ceDAxJFx4OUU+XHg5OE9FXHhGQlx4MDk6XHhERlx4OTVceDlESTlceDgzXHg4RFx4OENceDA1cj1ceERDXHhEOVZceEUzXHg5Qlx4QzRceEQxXHhDMlx4RTE5XHhEOVx4Q0JceDlGXHhFN1x4RUEwNFx4RDh0alx4QUJRXHgxM1x4MTdRalx4QzRceEIyKWBceEZCNlx4QzVceERCXHhCRlx4RDUzXHhGOFx4OTBceERBXHhCNiFceDk1cDJceDBCYFx4MThEXHhBMlx4RERceDg3XHhEQlx4RDRceDlGV1x4OTJceEU0Olx4OURCXHhBMEZceEM3bl5ceEY2XSVceDg4XHg5RFx4QjBceENCa1x4REVceEIyNlx4ODFBXHhDNkxyQUdceEIzXHg4REVceEUwXHgwNFx4MERWXHhCQ1VceDlFXHhCOFx4QzhceDkxXHhFMlx4MDhceDFBXHg5RSxceEZCXHhGRHZoX0xceDlGXHhGOFx4OUZceDk4XHgwNlx4Q0JceEU1XHhBM1x4RjZ0XHg4N1x4QkRceERGXHhDMFx4OUNceEIxXHg4NCZceEMzOFx4MUM2XHhGQVx4RkVceEMza0U6Q1x4QTY3aFx4ODFceENFXHgwQU1ceDBEOFx4Q0UoXHgxM1x4QzgmXHhGOVx4ODVceEU0dVx4RDNGTlx4QjhceEJBMVBJXHhEM1x4RUJceEI4XHhBNigjM30pb1x4RkNceDkzXHg4OWhceDE5XHhGQ3k+VVx4RkYnXHg4MzN2XHhBRVx4RUJceEREXHg4RVx4MTJceEJDfFx4QUJceEI0XHgxRlx4RDR2SVx4QjZceDFGfCNceEEyXHg4N1x4RjBWXHhBNCdMXHhDQlx4RTRceEJDXHg5Q1x4REFceDk3Y1x4OTR+XHhFRHdceDE4XHhBQlx4OEI5fVx4OEZceEY1I1x4RUFkXHg5RHZceEQ0XHhERVx4RjVceEJBVlx4OUV5Mlx4MUFoZ1x4MDJceDk0Llx4RDZceEVDXHhGNFx4QjhceDEzaFx4RDVceDE0XHgwOGdceEQ4XHhBQVx4QjVceDAzXHhGOVx4MDVceERGXHgxOVx4QUJWXHhCMlx4QjVceERBXHhCMlx4MDZceERDXHhBMS0rXHgwNlx4RkU+XHhDRVx4MDhceDE3XHg4MmVEZX5wXHhBRVx4QjBceDFCXHhEMT9ceENCXHhGQVs4fn4mXHgxOVx4RDFceEM2XHg5N1JpXHgwQlx4RjdceEMyXHhBOFx4QUJceENBXHhCQVx4MEM2XHhFQ1x4QzlceDhFQFx4QUM/XHhEMU9ceEE4Olx4ODFceEQ3U01ceEQyXHhCOFx4MTJceERGLnJceEZGSlx4RTFceDg5XHhBMmhceEI2XHgxQ1x4MURceEYzXHgwRlx4RTNFXHg5Rlx4RkNUXHhBQkhceDE5XHg4NFx4QTFzKXNceEY5XHhEQlx4RDheXHhFM1x4QTJceEY0Mlx4N0ZceEJEXHhDQkBceDE0XHhBRWpceEI4elx4MUY3XHhDQ1x4MDdceEU3XHgxN1x4RDdWXHhDOFx4REVOXHg4RmpceDBFaVx4MTdZZj1ceEJCXHhFN3JceEU3PydceEU5Xlx4OTBceEY0XHhEN1x4QURoXHhCQUNceEU3XHhGMFx4Q0JceERDXHg4Q1x4MTFceDlGXHhGMVx4MTZnXHgxOU5ceDk4XHhDNFx4RjRceDA4XHgxNU4lXHg5Q1VaUlx4RTIkV1x4MTZceEY3XHhBRFx4QjhceEFCXHg4NV5ceEVDcCBaXHhDOFx4RkVSXHg5Nkd+XHhEOVx4QTQoNlx4RDZceDFBXHg4Qlx4QTVceEE4XHhBM29ceEU2YmhceDkzXHhGQXVsXHgxNVx4OENceDk2XHgxMlx4RTRceEVFXHg4Mlx4Q0FceDkyXHg5Q1deXHhDRlx4RUZceDhGclBceDlCXHg5MXZceDE3fVx4MDdceERFXHhEMUNceERGXHgxNFx4OTlIMiNceDlGXHgxREBceDEzY0ozXHg4QVx4RTNFXHg5NVNceEMzNSdceEIwXHgxMlx4QUYiXHhDNFx4OTgoXHhGN3U8a1x4OEVceEE1c1x4RDRceEU2XHgxMFx4OThceDhCOSlceDA4XHg4Qlx4QkVceEVDSFx4QkJceEFFKlx4MDVceEEwXHhGNkpceDA0R1x4RURceDk3XHhDRlx4OTgnXHhCRVx4MUNceEY0XHhCNlx4QUNceEM0XHg5RVx4MEJceEY0IENceDg3Tlx4QzheXmdceEJEXHhGMlx4Q0FceEYxXHhEOVx4OTVceDg4XHhGNnxceERCXHg4Mlx4RjFceDgxXHhCN3ZwalNceDhDUVx4RjJceDgxSVx4OTNceDA1dzEyXHgwMVx4RjNceDlFXHgxNVx4ODgjR1x4ODdceDgwV1x4MEJceEFBXHhBQitQXHhDQzVceEFGLydceDEwXHhGNVx4N0ZceENCXHhBNVx4RTYrOFx4OTlceEEwXHhCNVx4QjZbXHhFRFx4QkU0XHhBRD1ceEZEXHgxRlx4MThceEVDViBceEJCXHg5Rl5ceDk1XHhCQlx4N0Y0XHhFNFx4RTNceEU5XHgxN1x4RTlceDk5XHgxOVx4RUMuXHhBM1x4OEZceDBGcX5ceEFFXHhERlx4QTVceEVFXHhBRUpceEMxXHhENnVDWVx4MDZceDFCXHhGRFx4QUJceDg4XHhBOSBceDhBLyxceDEzXHg4Q1x4QjlceDFDS0hbXHhEQnYuXHg5MEhceEY3cFxceDk3XHhERFx4QzlceDhGZnhceDE3XTAoXHhFNVx4RTFceEY5XHhDMmJceEM5XHhCQ1x4RTEqXHg4RVx4MERwWnZceEM2XHhGNWxceDhBXHhEM3g+dVx4Q0YwZlx4OEFOXHhCMmFYXHhFQVx4RDVceDA5XHhENlx4QzFDXHg5OFx4QkNceDFBPU1ceEZFelx4QUFceEJEQlx4RThceENFXHhERFtceDA5XHhEM1x4RERceEQ2YVx4ODlceDFDXHhBOD9ceEJBXHgwM1x4QkZceDk5XHhERFZceDA4XHgwMlx4RUNceEJCXHg4MVx4RDdceEZCXHgxMlxEXHhDOVx4Q0ZceEQ0LD9ceEU3XHhEQVM4XHhDMH5aOkNceERCXHhGRVx4RUVceDBCXHhGQVtceDEwXHhGQkpVXHhDOUFceEM3SVx4MTFceEFCXHhDM1x4REJvcUNceEZFXHg4OSZceDg4XHhCNlx4OUV9XHg5QVx4MERceEVFXHg4NVx4RUR9TU1ceDk5SztceDlEXHgwOVx4QTRZXHgwMVx4Q0FceEEwXHgwOFx4RERceEM5XHgwNXVceDg3XHhGNFx4QThlXHhFOCA+XHg4OU1ceEU4N1x4QjZkXHg5NldbXHhFMFx4RTdceDhDOFx4RDVceDgzXHhFQVx4MDBceEI3PVx4REEwXHg4M3pwXHhERntceEY5TFx4Q0VceEFGXHgwMVx4RTBceEY3XHg4Rlx4QTdceDlBXHhBRVx4QjJceEUxRzNceDlGXHg5MFx4QThceEU4XHhCMFx4RDdceDlCSlx4ODNceEM1XFx4MURceDA5XHhBN1x4QkJceDg1XHhCQntceEVFXHhGRFx4QjNYXHhGM1x4Q0RFXHgxOVx4RjVceDBGXHgxNlx4RTZceERBOFx4QTlSXHhFNlx4RTktXHhEQ2tceERGalx4RkM4XHgxNVx4RjFceDg0XHhDQ1x4QjA3OXdceEM4XihceEFFXHgxQVx4OTVceDkwfVx4QUJceDhFXHhDQlx4Q0JceEE1XHhFMlx4QzVceDk5J1x4QzJceENCXHg4OVx4QTdceEQ0XHgwRFNceDg5Ulx4OUNceDg2YFx4RTRceDEwXHhCQlx4RTJceENFXHgxOVBceEYySVx4MTM8XHhFOVx4RTghXHhDRThwL1x4OTNceEU3XHhEOFx4QkVceDk1XHhDOFx4MENceERFXHhGNlx4QUZUXHgwNkRceEZDO1x4OUZceEQxXHhBQlZceDFGXHhFNVx4RjFQXHg4QVx4RThceDhER1x4ODdceEJCXHhDQT5mJlx4RDBKXHhGNlx4REFceDBEXHhDNFx4QzJceDk4XHhGMlx4QjVceEZCXHhBNklceEJBXHhFQVZceEU4XHhGRFx4RTZceEM5XHgxQTtceDgyLlx4QkZceEE0XHg5RV90fFx4Qzd5fVx4RUFceEY1XHg5OFx4RDBceDhFXHhDQlx4QzRceEYwR1x4QjNceDlFfWIgZVx4N0ZceEZEXHgxQ1xuXHhDMHt4XHhGN0tWXDxceDFEO1x4MEZceEExXHhGRG5lXHhBNWNceDlBfnlvXHg5MFx4QjlceDFDN2BZXHhCMUV+XHg4MFx4OTU7XHhDQ1x4QTRceERDWn5ceEUwXHhGOVdIXHhCOVJceEJBXHhGQVx4RjBceEVBIFx4Q0NceDkzXHgwMlx4QThceEExXHgxRSlceEM0XHg5OVx4QjVwXHhGOFx4QkFceEU4XHhFQShceDBFRjdFXHhBRio2JzpuLlx4Q0VceEE0XHhCOFx4RDVceDA0XHhGMVx4QTJceEQzXHhGRW5ceEM4XHhDRFx4OTR4XHhCMX1ceEVDKENyXHhBQSFRXHg5QVVceDgwXHgxMlxceENBU1x4QUJceDE2XHhEQUVuXHhCQjRceDE1XHhEOVBceDk0XHgxOFx4REJPXHhCQWBMXHhBNSxGXHhCRVx4QTFceDA4XHhCRFpceEE1JFx4MEVceDEyckVceDE1Wlx4RjdceEYzXHhBRCEwOFx4RDlceEE3XHg4Rlx4MUVceEM1L1x4OTBKe1x4RjJceDBDdlx4MEJceDhBZipceDhEXHhDNi0iXHhEMVx4ODlceEYwXHhERlx4OEZpXHhCMSJceDlGdFx4RkV7XHgxQVx4RjZceEE1Z2BvXHhEMFx4RERceEQyXHgwNlx4QzRceEJFXHgwRUF4IFx4RTZceDg5XHgwNVx4MTNceEM0OFx4MDNceEEyXHhDQVx4OERrXHhFMlx4OTdjI1x4Q0UrXHg4RFx4RjJceENEXHhBOVZceEMwXHgxMVx4ODBceEU0XHhFQ1x4QTl1Y1x4RTJceDlCXHgwM2RceDg4XHg4Rlx4REEiXHhBQVx4REQ2XHhEN1x4RTBceEE1bW1ceEJEXHhFNVx4OURceEM0XHhGM1x4QzBceDkyXHhGRFx4MTBceDA3XHhFNihceEFGXHgxM1x4QjhNXHhBNnJceEQ5XHhBRFx4OTJceDgxXHhDN19ceEJCXHhBNDRceDE0XHhFQU9ceEI3I05ceEQ4XHg5N1x4QUVceDFGRlx4RUQ7XHhFRFx4RTNceEZFWFx4Q0RceDhBMlV7XHgxRnQjXHgwN1x4QTlceDEzXHg4Q1x4QkNOXHhBNy5rXHhCOVx4MDduXHhDNFx4QTRceEJGRlx4OTd6alx4ODVceEJGUFx4QjgzKFx4RDBceDg4XHhGNFx4RkRAXHhFOUhceDkzXHgxQVx4ODRceEQ2XHhFN1x4RjdceDk5XHhGN1x4MDEvXHhGOFx4MDlceDg1XHhBOFx4QjJlfFx4MDlceEU5XHhENlx4OUVceEY5X0NceEIyXFx4RDgxXHgxMlx4MTZceEQ4TFx4RjRceEJDXHhEMFx4RTN1XHhGQ1x4RjNceDEyUFx4RjNceDAyXHgxMlx4MEUpXHgwRXsoXHhCM1x4MTNceDhGXHg5NVx4MTEgXHg4MFZceERBXHhCQVx4QThceEQ4XHgwOXpceDhBXHg5OFx4Q0JceEFBXHgwMnNceDgxPVx4RjV9XHhCOC1ceDk1XHhFMVx4Q0VceDA3UFx4ODBceEQwT0xceEI2XHhDQ1x4OEJceDE1XHgxRFx4QTdceDE4XHhFMlghQ1x4MERceDFDVlx4MTNqXHhGQlx4RUVzJVx4QTEnXHg4NFx4ODlceDFBJFx4OTZUJ1x4QzhceEZCKVx4OUNceEU0O1x4OURpVlx4Q0JceEUzXHhFRVx4OEZceDEyXHhCOFx4QzhceEMxXHgwMXxceEI3bVx4RUU0XHgwNF1iXHhBM25ceDFCKTljXHg5QVx4RkRceEY2XHg4NFx4MTV7YFx4ODYtXHgxMCJceDlEIlx4RjNceEYxXHhGNENaRlx4RDZuUlx4MUZceEVCa1x4OEZceERCZlx4ODdceEYyXHhENlx4MTZWXHhBMT9ceEFEXHhBMFx4MDJzXHhEMFx4QThceENBPFx4OUZceEQza1x4RkFceEQ1aTRceEJDXHg5MSRceDk4XHgwNFNceEQ1J1x4QUVHXHhBMFx4QkVceEE4WVx4QTNceEM3RFx4RjdceENDXHhDNlx4QjhceEMwXHhGNVx4OTYyXHhGRDlgR1x4MURceDkxcWF9XHgwNlx4MUZvWFx4MTRYXHlceDgyXFZceEQ3OmQ6L2BceEQzKFx4QkV3XHhBQ1x4RjNpXHgxNVx4ODFceDhFXHg4MnBceEEzYn1PXHhEMlx4OTdjXHgxNFx4RTdceEJBP1x4QUVceDk2XHgxNFFoTGdwKzhceERGXHgxRERceDkwfmtceEM4TFwuXHg4REJTSX1dWlx4RjZceEI2XHg5MFc4XHg4N1x4QkJceERCUFx4OTBVXHgwMEh9XHgwNVx4RDBceEY1XHhBN1x4OTdceEYwXHhBNVx4RDhceDlGWlx4RDNceEMzNFx4MENceENCXHhENXBceENCXHhGQk8wXHhGRmRceEQ2XHhCNVx4QjZcXHhBN1x4QzNceEQ4M1x4QUJYLW9ceDlFOjQmb1x4RDVceEE4Jlx4QzNceEEzZFx4N0ZceERFXHgxNVx4QTNceEM1KFx4QkJceEVFXHg3RkdceEI1XHhBQ1x4QkVceEI3XHgwN0JceDA0XHg4RXhceEQyXHgxNVw2N1x4QjRceERDd1x4RTdRXHg4RiNceEJGO1x4RTJceDEzXHhFRHdceEZDXHgwQTlceEY2XHhFQWZceDA3RFxceENFXHhCNHlceDA0XHgwMkY6XHhDOFx4N0ZceEQyXHg4N1x4MEZceDgxXHhEOVx4RUJceDAxKVx4QTVgcGRceEIxXHg3Rnx4KyxceEIyXHhCRFx4RjcsSl5ceDFEMG4kJVx4RENceEZEXHgwNVx4Q0U2IStceEJEXHhGRUJceEQwXHhFQVx4OEVceERDXHhCN1x4ODZceEQ1XHhDRUVceEJCXHg5RVx4RjlKXHhEQlx4RTNceEM1Rlx4RTVceDhBMVx4RUVceDA5XHhCQlx4QzhEXHhBQVVceENBUFx4QkVceEE1U1x4RjNceDE0alx4QkVceDA5QTlceDBBXHhEOUVceDBDXHhGQSZceEE0XHhGOSdeXHgxNFx4REU1XHhBOT5ceDFDLVx4QTdceDE5XHgxMFx4RTldJFx4RDVceDg3XHg5MFx4RkJceENGb0UuSFx4QkNceEM2LVx4MEVWaSVTXVx4MTAjXHg4MmlHXHhEMFx4OEJceEUzXHhCOVNceEYxXHgwMFx4RDBceDFEXHhGM1x4MDdceDgxXHhFMjJceDhGXHhGQVx4OTJLZVx4QUNceDFFdFx4OTAxRmlqXHhGRFdceEQ5PVx4REZceEQxX1x4RDMtXHhBQy9ceEI2RktceDAxTVx4N0ZceDgycFx4ODIhWVx4RTFceEZBXHhEQVx4MDFBXHg5MT9dXHhGQ1x4RTNceEU3XHhDQVx4OEUmOFx4RTNceDBDXHg5RFx4QUFceDE3XHgxMlMkbDlceEE5fVx4QkNceDk1XHhFRVx4RUYiLWNceEQxXHhFRGAkXHgxQzdceEExclx4RjNmXHg4MFx4MURnTGtceDEycVx4ODhxR1x4QkVceENFKVx4QkZMXHhGMXs+XHhCRDNceDE0XHhGRFx4ODZceDlBXHgwRXtceEQxXHg4OFx4MUNUM1x4ODZceEQ2IHtAXHhFNFx4QkJceENETFx4RUJceEEzXHgxRGZceDkwXHgwN1x4OTI3XHgxMiJceEY3XHhFMCJceDE5XHg4NiRmXHhBODNceEQxXHg5N1x4REFceDg4XHgwMFx4QzVceEIwOVx4MTlceDFGUVtceEQ5XHgxNFx4OUVPXHhBN21MXHgwRVx4RUFxXHgwRCZ9XHgxRXtceEQ2KFx4RDIlXHhCOVx4RUFYXHhFQ1x4RDFceEM3UlJceEVCXHg5RC5DXHgxNVx4QTlceEU0XHgxMUZceDkwXHgwQS40SFx4OTNceEI2XHgwMVx4RUZceEYyXHhEQlx4QjdceDgzXHhEN01ceEUzXHhDRlx4Q0JceDgxZ2tOXHgwRThceEE3bjM6XHgxRFx4OEZceEZDR3pceEY3XHhBMFx4MEUjXHg5NFx4OTdceDk1Zlx4OUZnLDxDXHhFMDZUXChceEVDXHgxQ0dceEYzXHgxM1x4QjI6eVx4RkVceDg2SVx4RkZceEYxXHg5OVtqd1x4RDBceDA3cXVceEUyXHgwMT9TZlx4RTVceDgzXHhDNFx4RDNceEQzXHg4MmpceDEwXHhGQlx4OTFceEJCM2ZceDlFXHgwRVx4QzVceEMwXHhFMVx4QzZOR1x4QThceDlEXHhERVx4QjRceEM2XHgwMXdceEU1XHhGOFx4OTJceDA2XHhEMz5BXHgxQlx4QURceEM1XHhDM1EtfVx4QzBceEMwXHhFN1x4RTNceEUxXHgxRVx4OTRceDBEUFx4QTRceDFESVx4RENBel5ceEJDXHg4OVx4ODNceDFBXHg5ND9ceEEwXHhGQ1x4QUVceDBBXHgxNztuaT5ceEQxJVl4XHhCOFx4RENHXHhEMFx4MTBceENFXHhBNlx4OTNceDkxXHhFMFx4RjZceEQyXHhDM1x4QUNyXHhCQ1x4QTJceDBCVSNceDBFXHg5NVx4QjQsXHhDMVx4ODNqNFx4QTlceDhDa1x4MDBFQ1x4QjQ5XHgxRHltNlx4OTcgU1x4OTRceEM0XHhENDVceEE4XHg4MVVNXHgxOFx4QThceEM4XHhGQj9IIERceDE4XHhBN3BhXHg4Q1x4RTRceEZCXHhBOTBceDg5UVx4RkNceEUyXHhDOFx4QTF9XHgxMFx4RjZceEI0Rlx4QzRceDFBXHhERjtsY1x4QzVceEYxXHhGMVhceDEwcFx4QUZvdFx4QzYqXHhBNCFceEI3XHgxQ05ceDgwX1x4MURiXHgwRlx4Q0FceEJCLlx4RTFceDg3XHhFRlx4Qzhhflx4MEVceEI5XHg5NXc6XHg4OFx4Q0ZYXHhBMixceEJFXFx4ODZceEM4ZnhceDk4XHg4Q0dceEEyXHhCRVx4RkEgXHhGMFx4RDBceDA4XHhBNVx4RjhceDk5Vlx4RUR2XHhFNVx4OERLXHhFM25ceDA3XHhEN1x4MTBceDExXHgwOWRceEIwRkZHXHhEOVx4MDlceDA0XHg4M1x4ODNceDAzXHhGNlBZNWNceEI4XHhDMlx4MDlceDg1XHhDMlx4OENceEVCXHhBMFx4MDhceEFDXHhDRFx4MTY8NXFceEI5XHhFOFx4RkJBSVx4MEI4XHhFRVx4OUJceEI4XHgwOVx4QTBceDE0XHhFM1x4RkVceDBCXHhFM1x4MDNceDlBW1x4OEFceEZEfVx4ODhceDFEXHg5N15ceDEzXHg4Q1x4OUVceDE1UVx4RjBceEM3b1NceEIwXHg5OVx4MTdceEU1XHhERFx4QjhYXHgxRVx4RTE6XHg5Mlx4RkFudVx4QTBceEYwXHg4RFx4MTBMXHhGMlx4MEVceDkyXCNRZ3tFXHhFOFx4MTIvOVx4OENceDFBSW94XHhDRmp5Q1x4ODJceEU5IVx4QUZceEU0P1AqXHgwRU1ceEMwXHhFNFx4MUQoXHhERFx4RTNWXHhBQVx4RDhceEREXHgxQ1x4OTM1XHhBNmlceEI3a1x4QkNceDgzXHg4Rlx4OTZceEYwXHg5Rlx4RUEvXHg5N1x4MDdceEFDIFx4RjRceEMzK1x4RTJceEYzMD5ceENEXHhENGN0XHhDQVx4OTE3XHg4OE9ceEY2WD5ceDk2Ilx4RTlceEQxXHhGQVx4RjR9blx4QkVceEQ2dlx4RkVceEJDXHhFRFx4QTRceEUwXHhEQlx4RjNrXHhDMVx4ODZJXHhFOXpSXHhDOVx4N0ZceDE1XHhGNi1ceEMzN1x4QjBceEMyXHg3Rlx4QThceERCL1x4QTBceEQ2Z2ZceEMyXHgxRVx4MUNceDEwXHg4NFx4RUR+XHg4MFx4ODJ3XHgxOX0lXHhGN15ceENEXHhCOWF7LG5ceEE4XHg4NVx4REJceEE0XHg5MHRceEQ1XHgwQU9ceDk3XHgwMVx4OTZceEU4L1x4QzhceDFFZlhceDlCM1x4REJFPFx4MDhceEE0XHhGQlx4RUM9XHhDN1NceDhCXHhCRDZceEI1T1x4OTN3XVx4RUN4XHhGNlx4MUZceEE2XHhFREFceEEwdndceDhGXHhCMihceEQyRFx4QzdoUVx4QTMlXHhGNlx4RjRceEM4RVx4MTM1VVx4RkMkXHhGNFx4MTJ4XHhEMVx4RTJmXHgxM1x4MThaXHgxM1x4Q0FceEVFXHhGRlx4MUZYbl1rSnhceEZGd1JceEMwZFx4RkFceEJGRFx4Q0JKXHhDQ1x4MDRceEZGXHg4QVx4RUNceEIzVFglX1VUNlx4RkFceDkzaj5ceDlBKVx4QzBsXHhGNFx4MERwXHhEOVx4QTRceENDLFpceEQwXHgwQlx4MDNceDE4XHhCRSpceDE4XHg5OFx4MTdceDE1WCdFXHhBN1x4OURRXHhENkNceEZFXHhEQTxceDE4Z29ceEZBXHg4M1x4MTdAXHhGRVFzXHgxRlx4MUVceDBBXHhEMFx4OURceEMzbXZCUlx4MUJceENFXHhDQ1x4RDlceEQ5XHhGM1x4MDhceEIyXHhFRVx4ODQwXHhDN2BceENEXHgxRVx4QkNceEQyXHg4RSNceEIwPFx4RDBceDlFXHhDOCNceDg4a1x4QTlceDBFUFx4RTlceDEyXHhENlx4Q0FceEY0XHhGMFx4QkRceEJCXHgxNDRceEFEXHhFQVx4OERceDE1XHhFOSBceENFXHgwMFx4ODRceERFXHgxOVx4OUZDXHg5RFx4RThceDFEXHg5M1x4QTlceEZFXHhBQ1x4MDRceDAyc1x4RDZBVyxceDlGXHhGRlx4MEEnXHhGM1x4MEJceDE4XHg5Mlx4RTItKixceDlGOFx4QTJvM1x4RTlceDAwXHg4Rlx4QTBceEQxbS0oXHhFOFskcU9BXHhGOVx4QzJceENBXHhDNlx4RTZceEZEXHgxNVx4QzlFTFx4QkJKJVx4MDZceEY3XHhBNFx4MTdceERCXHhFN1x4MDJ4XHg4N1x4Q0FceEY2XHhGOCBzPUdceDhCXHg5QVx4OUVceEMyeVx4N0ZCXHg5RFEvS1x4MDRaNVx4QTJceEZDXHhCOFx4QzlIe1x4ODdceEFFXHgxMVx4RDA8XHhERFx4RkZceDgzXHhCQVx4OTEzXHg4QSBwXHg3Rlx4RDlceEE1dlBceEMwZlx4QkYre3JceEYwXHg5QkRceEM5XHhBRFx4RDNceDFCLFx4RURceDBBXHhCNFx4RTBceEFGXHhCQ1x4QUNceEMxXHgwMndceEMzXHhGRiRceDhDOW9ceEQ2XHhGNlx4MEVceEEzXHhBQiFAXHhFMFx4MTlnZWRceEQxXHhGQlx4MUREMVx4MTk6XHhDM1x4RDFceENGMyJceDg4XHhFRVx4RUJMXHhCQ1x4ODZceDE2XHhDMnY6XHhDQlx4RTRceEExXHhCQltWcFx4MUJceEVFRyJNXHhFQUtceDkyXHhGOFhceEVELVx4ODNceEVEb1x4QTdceDE2WVx4RkVceEREXHhFQTBceENDXHhENVx4QjFceEI3XHhGQzJceDlEXHhBRWZceDhDXHg4Q1x4MDNCLEJceDA2Q250XHhDRFx4OTlNXHhBQzVfXHhGQVx4RjB2Ylx4MUQmOVx4ODFceDFDXHhEMlx4RTMtXHhCRFRGXHgwQVx4QjlceDBEXHhERVx4QkNHKisxNjBceDg2XHhCNGpceEU2XHhDMUxceDBGXVx4ODVceDk2XHg4RiI+XHgxODMoXHhGRVx4QjEmXHgxNFx4OEVceDFEXFx4QThtLlx4MTg3aVx4OURKXHgwRE5iUlx4MENceEY5XHhCM1x4RDl8Jlx4MEZceEIyXHgxREFceDhDXHhFNVx4RUZceEQ3NWhceEQ2XHhDNlx4RTBceEVFXHg4Nlx4RUFceEE1WktceEQ2XHgxNlx4RThceEJGZXpceDE3XHgxQypceEI4XHhCMlx4MDZceERFXHgxM1x4QTFceDA1XHg4RVx4MUNceDE4XHhCQlx4MDFZXHhFN1x4QkJZdlx4ODZceDk2TURceDA0ZVx4RTFceEFDI2V9XHgwNVx4OTVceEVFV1x4OUZceEU5XHhBNlx4RkJAXHg5RVx4RDZkXHhDQlx4MEJceDFCXHhFRDFceEExXHhBN2ZnXHhFQ1x4QTBrXHhDMFx4QjBceEJDXHhFNHRceEY3K1x4MDdceEMzXHhDMGxceEQyVFx4RTRceEQyXHhDQ1x4MDNceEU3XHhCMlx4RDVceEUwXHhCMn1ceENCXHhDNyRnaCFHYVx4QjNceEUyYFx4RjRceEY5XHgwOF9jLFx4QTVceENELFx4ODFceEU0XHhDRlx4QUZcIlx4REJceEFFbmhceDE1XHhCMXZceDk2XVx4RUZceEU2clJVXVx4MDlceDg5XHhFRmRceDA0XHg4NFx4N0ZceEM2VFx4MUVceEExXHg5Nlx4MDJceEUxXHhFRXozc1x4OEJceDdGXHhBRlx4QzVceEJFXHgwQlx4MTAueFx4RjdceDEwKE0yXHhBNW8uI1x4OEFceEZBXHhFN1x4OURceEE5XHgwN0NeXHg4MyRceEMxPCJceDA3XHhEOURceENCZFx4MTFceDg1XHgxQVx4REFceDgwXHhCOVx4MTFceDk4XHhGQlx4RUJceEJEXHhEQlx4QzZOXHhCRlx4MERceEExXHhEODNjY1x4RkJceEUyXHhERkRceEFEXHhBRmQ8QVx4MTE3XHgxNlx4OERceDhCQVx4MDdceDE3c1x4MTFceDA5XHg5OWpceDEzVFx4MERMXHgxQyJceEYzXHhCNFx4RjFceDhBOVx4QkRceDgxXHgwRVx4RURceEVENVx4RDBoXHg5RFx4QzhceENDXHhGNlx4QjBceEVBe1x4Q0RceDk1XHgxQWtcWip4XHhCNFx4RERceDA0XHhFQlx4RDVceEE0XHg4RFx4OTRceDAyVSJceEFGXHg5Mlx4QzVceEI3XHhEQ1x4ODdceENGXHhBMVx4RjZceEM1XHhDQlx4REM8LFx4QkNZXHgwMlZOXHhBMFx4QzhceEE2XHhBNVx4QTJceEFBXHg5QVx4QUQtXHhFQlx4QTlceDEyXHg5NFpceEI4cVx4QzBfe1x4QzlceDBCXHhEOXRceDhGSlx4QTFceDA0XHg4Ri1ceEMxXHg4MFx4OUNPQC1ceEQ5WVx4MDhcLVx4QjdceDk1XHhGRlx4RkRceDAzXHgwRlx4QzVceDAxXHgxNlx4MUZnXHhGMlx4RTRceEMyMVx4QTZceDBDXHhFMFx4RkVceDlDXHhENVx4RENceEQ4XHhBRFx4QUJceDkwOjBceEI0Ylx4RkJceEI3XHhBMFx4RkFceDA4RSpceEUwXHhBOVx4RDlceDE0P1x4MTJ1XHg4NVx4QzgiK1x4RUNaXHhFNlx4RDEqXHhDQipceDgwT1x4RUNceDk2alx4MERceDE1IFx4OTJkXHg4NVBceEJCXHgwQUhceEZFMVx4QTZceDk3XHhGOFx4QzNceEIzZ1owXHhCRFx4MThceDg3XHgwM1x4RThceDBFXHg4MiVceERDJGxceEM2T1x4MTZceEQ0OFx4QzNceDk3XHhGOFVFXHg5RiBceDk0XHg4NkFsXHgwRFx4QTlceDA1XHgwQzpJeGVqXHg4Mlx4MTRNQyc2XHg4Qlx4OEFceEMwXHgwMlx4MEFceEQ5XHhENXAhXHhBRVx4RjZceDFFQmFceERDXHgxNVhceENCJXlceEJCXHhDMFx4MDlmXHhGMCNceDkyXHhBMVx4RjFceDk0XHhCOVx4OThceDBEflx4RENceEUyXHgwOFx4RDVceEYwXHhGM1x4QkNceDg0KFx4MEVceDEwTVx4MUVceDFBXHhEMTdceDk2XHgxMlx4OTdceEFGXHhCMlx4OUVceENEXHhBRFx4Q0FceDk4XHhCQmNceDlEXHhGNSVxREEyRlZ5XHg5RTlceEQyXHhGQ31ceERGSVx4MTJceEFBXHhEMkZceEQ0XHhFN1x4RTlceDhDXHhDOFx4ODZtXHg4M1x4MTRceEM2XHgxNX1ceDE1XHgwRFx4QjNceEI5YVx4RDd0XHhCOFx4MTJwVGkuXHgwRlx4RjNpXHhCM1x4QTlceERGXHhBOFx4Q0NceDg3XHhDMVx4QTBtLSpceEQwXHgxOVx4QkRceDlEXHgxMSVceEY5XHg5OSpceEFCXHhEQV5ceDhDXHhFRDlceEZEXHgwMVx4OTZceERGOG0wXHhEOVx4RTNceEE2XHhDNFx4OUFceDgwXHhCMCBceDgzXHg5MSlmXHgxQ1x4MDVceEUxXHhBOFx4RjZceEZEXHhDRVx4OTZceEFBOCxceEJEU1x4ODRceEZGXHgwNVx4OTdceEIyTFx4MUJceDlFLFx4MDlceEI0WVx4RTRceDAyV1x4RDJceEIyXHhBNVx4MTlceERFXHhFQ0xceEJBS1x4QkNUXHhCNlx4QkJceEU3XHhDOVZceEVCXHhEQVR1YzhceDgyXHhENFx4RjdGXHhFQVx4QURceDlEXHg5Q1x4RkRceEMwXHhFQlx4ODFceEMwP2JceDAzXHhGMWdceEM3Nlx4MUNceEEzXHgwN1x4ODcxXHhFOVx4QzZceDE2VXxceDExXHhGN1x4Q0VceDAyRlx4ODc7N1x4RkJceENEXHg4RitceEFCVlx4QjR4XHhCNlx4OEZRU1x4MDBceEQwXHg4NFx4RTg+XHhFNlt6XHg4Q1x4RjFceDEza1xceEVEUVx4Q0RyXHg4NFk5XHhBQlx4OTBsNFx4RkVtYkVLXHhFQVx4RDlceEU1XHgwRXVJO0xceDA2XHhEMVx4OTRceEEzSlZceDlCXHg5OW9ceEVFXHhEMThceDlBXHhCMFx4MDIzcVx4MTVbXHhBNmdceENCXHhCN1x4OTJceDAyK1x4QjdceEMwXHgxMVx4RURceDhGXHg3Rlx4OUVceERBTlx4QjlceEE0XHgxMlx4RTBceEY0XHhBM1x4MDJceDEyXHg4MmZxXHgwN1x4QjlceEYyXHhCNDhceEQ3XHhDN1x4MTdceDhBXHhGQVx4RDlceEI5XHhGRVx4OUJceDE1N1x4RTI3XHg5QVx4ODZceDE1XHgwQVx4QTNceDgxNFx4OEVceDA3bk9ceDhBTVVUOFx4MDZceEM5XHhFOGB2MFx4REUxXHgwM1x4QkUqS1x4RjZceEJGXHhCRipceDk3eVx4RTVceEQ3XHg5M1x4QkVceDBDXHhFQlx4RThceEU3XHg5M1x4ODRceEY1clx4RTVQXHg5Nlx4OURceEVDTUBceEU3J1x4QjErcFx4RjYxXHhBRVx4OERceEU3eGhceDkxXHhEQlx4REVceEUxXHhGN1x4RTlXXHhFQ1x4QTVceERDXHgwMFx4Q0EiU0dceEZGXHg5Nlx4MTNceEJCVVx4QUZceDAzXHgwOVx4OEVceDk4XHg5OVx4RkU6XHhDMFx4OTBceDk3XHg5NFdHLVx4OUYvXHgxNFx4MDlceDg5UiQ0elx4RjNceDg2XHhFMlx4OTJMMjdceEM5XHhFNVx4RkJceDkyfm1ceEVCXHgwMlx4MUFOKlx4QjZceEQ1Q1x4QTlceDdGXHgwNFx4OENceDlCXHgwM1x4OEJTRVx4OTJ5XHhBRWo6XHgxM3NceEIyJ1x4MTRceEFBflx4QkRceEUwXHhDMVx4OTJceDAyXHhEM1x4RDBceEE1XHhCMFx4OUFceENFRiRceEVBN1x4MDNceDFBXHg5MmBuXHhERX5sXHhDMzY7XHg5N0VceDg2XHg5MkZceDg2Ulx4QUZceDgzXHg5RFx4RUNwYVx4OUZceENFXHg4NlM+dU9ceEQzN1x4OTJceDkxaSNceEY0XHgwNFx4QkFceEFBcTZceEE4RFx4Q0JceDAzKVx4QjZceEM2d1x4OEFceDE5XHhBOFx4RkRceDg0XHhGNFx4ODdceEVGXHhDM0QrXHhENHNceEIzXFFceENEXHgwNFx4MTBceENBXHhDQldtJlJceDg2XHhGRlx4MENrXHhFRVx4RDRceERBXHhCNVx4ODhceEI0XHgwQilceDlDR18pdyZBNVx4RjFceDFFXHhFQ1x4REZceEQ2TFRceEMzKlx4OTFceDlFKFx4QjZceEJGXHhCNVx4RUFceDk3aFx4MEZcSlx4RTAwXHhCMFx4RDFceEFEXHgxN1x4RjhceEU5XHhDRFx4RkZZXHg5Mlx4QjVSXHhDMVx4ODNeZ1x4MDMsLidceEExdnJceEVBXHhGMipceDFGXlx4MDhUXHhDMFx4ODNceDBFXHhFNSJceDg3MVx4RTBceEQxXHg5Q1x4RkJceEQ2PFx4QzdceDgzXHgxMVJceDkxXHg5NHFceERGXHhCRVx4RERceEQ3XHgxMVx4RkFzXHhCMndceEE1XHg4OVx4RDNceEU1JFx4RjZBXHhBNFx4RDdWXHhENFx4RUZLS0wgY1x4QTJceEM2Plx4OUVceDk5XHgxQ1x4RjdUR1x4RURceEFGXHgxQlx4Q0NNXHgxRFx4RDZQXHg5NFx4MDdceEIyXHgxM1x4ODBceDk1YitceEJEUmFiXHhEMixceDkxXHhDN1x4RjZhJFx4RDRceEUwTE1ceEY4XHg4Qk1ceEU0XHgxRlx4RjNceDk3dlx4MUZCdlx4RDNaXHg4RVx4MDc1RzhNXHhEOVx4QTJbIlx4OTBceEUzMVx4MTRceEY4OEhceEFGXHgwMlx4Rjd7XHhCMVx4RDFCXHhGNFx4MTQgXHgwNlx4RTM7XHhCMGJLWFx4OTV5XHg4NHZceEQxXHhBN1x4MDdceENEXHhGNVx4OTJceENGY1x4QjdceDk0JG0/QFx4QTZceEFEXHhDMi9ceDA4XHhFN1x4MDBceEIzIjh1XHhEMlx4MUNFdlx4RkJ1XHhBNlx4MEJceEM2ez8nXHhENVx4MTBceEU2P0BceEUxXHhFOFx4QzVceEExXHgwOVx4QTd8XHgxMVx4REJceEQzWVx4MTBJZFx4RDZceEREV1x4OEJceDA0clx4Q0VceEU3bVx4MUNceDlCYlx4RTJceDEyUn0yXHhFNVx4QTZceEVCXHhDOWRceDgwRCZceERCZkNceEZGMlx4RjYqXHg4NVx4RDFceDhDXHhGOVx4MUVceEMxXHhBMjtceDgxNFx4MDBceEIxXHhCNXRceDA3aHpSXHg4M3pzXHhDOFx4QTBceERGXHhDRXBceDk2XHhFQlx4REVceDk4XHhGRGhceEJEXHhBRlx4MDdlXHhENlx4QURceEI4XHhGM1x4RjYyXHhEQVx4OUVceDgzXHg4OX1ceEU5XHhCRmBceDA3RGBMQlx4QjJceEUyX1x4RjVceEEwcVx4QjdceEZBPVx4QkFceERDXHgxN09ceEYyUFx4MDZ9XHgxRFx4OThceDBGXHhFMVx4MDY9XHg5OEJceEYzXHhFNlx4MENZIVx4Q0JxXHhDMlx4Qjcnblx4OEJLXHhEQXhMPlx4REJceEYwJW5ZXHhCRFx4QUVsXHg5MFx4QzhceDgwR1x4MUVceDBBflx4QzdceEJFXHg5Nlx4QzdceEJBZFx4REU9XHgwNlx4MTJZXHgxQ1x4OTJRXHhDOGpceDBFXHgxOTZceEY1XHhGOFx4MUVceDhDXHgxNVx4RkZceEQ0XHhDMmooXHhGNlx4QkRceEM4M1x4RDlceEZDXHhEQSQ5XHgwOU1qXHg5Ql1ceEM5XHg3Rlx4RjBceERBXHgwRXNceENCXHg4M1x4MEFzXHg4NFx4RkU9XHgxMlx4MUNceDExXHhGNFx4REFceEFEbFx4QUNceEYyYlx4RDY4XHhDQlx4RjJceEMxZVx4RTNrXHhFOFx4QkRceERGXHhEQlx4QzFceEYwXHhCQVx4REJceDg2XHg4QXRceEFBKFx4QjRceDg4XHgxOShceEEwZ1x4ODVceDk5XHg4N1x4MDNceEY5U1x4Q0VceDEwIVx4QkFceENCVVx4REY3a1x4OTVceEE4XHhBNnhceEI0XHhFM3UzXHhDOHFceDA1SmdceDBGW04pXHg5QW5ceDBCKVx4RURceEZCXHg4NVx4QzhiOT1ceDBBXHgxRUFceDFEXHgxNVx4Q0FZXHg4RTc6XHhGRFx4OTFceEVDXHhDRDI5Wlx4RUUpXHhEN1FceEJEM11sXHg5QVx4RkFceDA5XHhCQmA8XHhDMSxceEM1XHhFRlx4ODBceEVCUFx4RDBJXHg5Qlx4MEZceEYwXHhCRFx4OTNceEU3XHhGNVx4REYuXHgwNlx4MDNceDBDYVx4OUFZXHhCNlx4OTdceEM5eGsmXHg5OFx4ODgrTFx4MUZceDgyVjJceEY5Klx4RDU9XHg5QVBMJFx4MEZceEIxLFVGWlx4RkVceEIyLVNceDAzXHhCNyVceEFBYzlceEY1fjJceERFXHhFQ1x4MDNhXHgxRVx4ODkgXHg4QVx4RkZSXHg4MVx4ODQ6XHg3RjVGZlx4MEU4bVx4RUZceDhBXHhCN1x4MEVceEEyXHhDMFx4ODVceDA3XHg5QT1ceEI3XHhFMVx4QkFceEJDKVx4MDJyXHg3Rlx4RTVceEY1XHhDNkFceEIxXHgwRSJceEVGXHg5QVx4QTJceDlCXHg4RVx4QTE6XHg5OFx4RjNlO25ceEE3WjNceEUxSlx4QUVceENCXHg5RFx4RDRceDBFXHhEOFx4MEFceDEyXHhFQlx4RjdceEZCWVx4RDVBYFx4RjVceDg2XHg4OVFceEI4fFx4RDRceDgwPVx4QTZceEFEXHhGNVx4ODZceEIyXHhBN1x4MUFceDE1XHgxMVx4OUNceEE2XHhBOVx4OTcgU3xceDBGXHhBMVx4MEJceEU3XHhDMFx4RUYqOlx4MEVceEYyXHg4Qlx4QkVceEQxXHg4RVBceDg5XHg3Rlx4MDhYYDRceENERlx4OERuXHg5M1x4RDlceEU4elx4OUNceENFXHg5RFx4MTlceEQyXHhFN1x4MDgvXHgwRVx4RUJ5XHg5OVx4QzdwJlx4OENceDA3XHgwMklceEJGXHg5MXlNeVlceEQ5R1pceDA0XHg5Rlx4MEYzKlx4OTFceEU4XHg5OVx4RDlceDg1QFx4Q0ZceEUzXHhDMld4XHhFNFx4QzlnXHgxRFx4Q0VmXHg5NmpceEE0XHg3RlVceDA1XHg5Qj5ceEY3SSFEXHg5NFpXXHhDNVx4OUZceDhBel1ceDBDXHhBN3BceDAxXHgwMFx4MEN8XHg4NFx4MURceEEzXHhCM1x4QTBceEQ5XHg5M1x4RDZWUVx4RDZceDA2Tlx4QjZceEI3SXhceDlFNFx4QjUpZklceEQ2XHhFQ1x4OTRaXHhBMVx4QUVceDlBXHhCM0EzXHhDNnJaXHhBOFx4QkZceENFXHgxQyxceEUwOlx4QkVceEREIlNceDhDXHhDRk9kXHhEM1x4OERceDFDXHhDNFx4QUQ0aS59XHgwNVx4OEVceEU0VFx4OEVceDE0LVx4RDZceEM5XHg4MFx4QkNceDgyXHhGNmtceEUzJy5IS0NBXHg5Q1x4MTRiWFx4MTBceEYzTjpLXHhENFx4RTZceEYzXHg5MFx4MThceERFXHhFRFx4Q0ZceEJBbyJ3alx4QzVceEU5PV9jeVlceEZCXHg4Nlx4QUFceEIyXHgxMiNceDAzelx4RkFMXHg4N1x4MENVXHhCOFx4OURceDhEe1NceENFRFx4RDVceEVBKFx4MDV9OVx4MDFceEEzd1JsPFx4ODRceEIyS1x4RjVceDlDXHhGRlx4OUNLXHg4RFx4RDJceEE4elx4QTlceEZBXHhEN1NceDgzXHg4RlVFXHhGQ1x4RkMiXHhDQ2BceEVDfSBceDFCMFx4QTdceEUzXHgxQ11HXHg4Mlx4RThceENFRE9rXHhGN1x4QUVbXHhENFx4QjlceEFFXHgxQlx4REI+XHhDN1x4QjlceEZCXHhGRlx4QUMyXHhGQ1x4RENgXHhCOFx4Q0EwP3kjXHhGQSdMXHg5Rlx4MTdceEIxXHg5NVx4MTRceDAzXHhBRnpceDhGflx4REZceEQ3TFx4QUVceDBFXHhDMWJMNDtceDlCfVx4RjI9XHhCQnQ7WTlceEM5V1x4QzJceEQ4XFx4QUQ0XHgwQ1x4RjBDXHhDNFx4RERceEM2XVhceDkyXHhBQzhhXHg4RVx4MTJceDgwXHhBQVx4MEZuPlx4QkFceDFDXHhBOFx4MUFceERDXHhGM1x4REVceEE2XHgwOU9VXHg5NVVEXHhENFx4MDdzXHgxNFx4RUZceENGPDhceDA3XHhGOFx4QzcpXHhGQid+P1x4ODJceDkxXHhFMDlceDBBTFx4RjFceEVCXHhENVx4Q0FceEM0XHhEMlx4QzFceERCXHg5M1x4OERceDBDXHgxRUwtXHhERFx4MEZceEI3XHhGQyQkXHgxQkZSXHgxM1x4QjNceDlCXHhCNlx4MDFceDkzYThceEI0XHg4OTYnXHhEQWw/dlx4ODRceEFCIypceEFCXHhFQnNoXHhBQ1x4MURUYzVceEQ5a1x4MDJceDA1XDlceEE5XHhFNHZceENDXHgwNS1ceEQyXHg4RkBceEQyOXJceDhFXHhBQXdceEIxXHhBQVghXHhFMFx4RTdpTlx4RkQnXHhDQVx4QzlHL1x4MTFceDA4XHg4N1x4OEJUXHg5OVx4RjBceEREXHgwMT5ceEMzLVx4MTNceDlCXHgwNVx4QjdceEZCQGZ0XHhEMlxceEFGXHg4OVx4QkNceEUwXHhDRlx4MEElflx4RDVceEQxXHgxRHlceEQ4RVx4QjIjXHhGNVx4QUFzYVx4MUFceDEyXHhFMD9ceEQzXHhFNzhcXHhGNlx4RThKKlx4MEZceDE3UCguXHgxN1x4QUNhKVJnXHhBQUJceEIzICA4XHhGRTdceDlDXHhEQ1x4QkRceEUxXHhBRn5ceEVDXHhCN1x4MThceEExI1x4RjVceEJFXHhFQVx4OEVceDgzXHgwN1x4QzVceEU3aVo8XHhCRFx4RkMmXHg4MnFceDA2Tlx4MThFXHhGNVx4OTMpY1x4QTRzXHg4QVx4OURceEUyXHhGRVx4OTVceDlGXHg4RFx4OTUtXHg5M1x4RThceDkxXHg4M0pceDhCXHhGOVpceERGQlx4QjBceEU1XHhCRFx4OERceDA2dShceEM5flx4QjhceENDXHgxN1x4Q0RceEI5XHhCQVx4QjZeU1x4MTVceENGXHgxQVx4MERceEZDXHhDN35ceEY0LVx4RTM7XHgxQT5vNHc9JzFceDk2XHhEMVx4QzY9Rlx4ODBceDEwXHgwMFx4QzFceEVERS5ceEQ4XHhENlx4RkJpK1x4MDVceDk4a2NceEQ0aFx4REFceEYzXHhBNlx4MEZceDE1XHhERFtceDA1SG5ceEIzbkdceEJDXHhFNVx4QzUqXHg4Nlx4OUE0OFx4QzNTV1x4MTlceEE1cFx4OENceEVFd1x4QUNceEIzKlx4RUNceEM5XHg4Mlx4QkRceEFEIVx4OUZsaFx4QTM8YlpceEUzVFx4QUV0XHhDOD1ceDlBXHhCOVx4QjdceEFDXHgxNlxceEFDXHgwNHkwXHhCQVx4ODRceDhGXHhFMyF7XHg4OS9ceDAwMFx4OEM0XHg4MVx4MUEvbV48J1x4QTVceDlFXHhBRlx4OTNceEFFXHhDNlx4QzdceDkzXHgxMX5ceDE3XHgwQWcuO3l1Plx4ODJceEZCXHhCRVx4MTU4XHg5NENpXHhFQlx4ODNbXHhCN1x4RTJceEY1XHhEQlx4QTJceEU5XHhBM1x4RTYzXHhGOVx4MDIhXHhGQlx4MTFceEIxSVx4QTZfXHhGNlx4ODZdc0NVXHhEQlx4RjhceEI2XHhFNXFceDAyXHg5Nlx4MTRceEE3XHgwRVdceEEwKVx4RTJceEY4XHhDRlx4QjFceDk4I1x4RUVceDk4XHhFRVx4REZwXHg4Rlx4MUJceEQ0XHhFNiRceEZEXHgxNFx4RTlceDAwXHhGOVx4QkY8P1x4QTlceEY0KFx4REJrXHgwQ1x4RUUrXHhBNC1ceDBBXHhFMnxceDFFWFx4RjNceEUzXHg4RH1YXHhCQ05ceEExNiRceENFXHhBM3tceDg1eHROXHg5Q1NceDE4TVx4MEFceDk1Q1x4MDVceENDWDdceDFFXHg4M1x4QjJceEMzflx4RDYpaWk0Ulx4RTlMXHhDMFx4RUQkbi1ceDFDXHhGM1x4QjRceDhCJVx4OUVceDk4XHhERlx4RjVceDBFc1x4MENrcFx4Q0JceDBEcVx4OEVceEJCXHhFMVxceEYxWVx4OUFKXHhCOVx4ODRceEZDXHhEOU1ceEEwQVx4RERzNFx4OUJceDA2XHgwN1x4ODRDXHgxMlx4QkJceDhDXHhBQVx4RER2XHg4Qlx4ODBceDBBXHhGRFx4QThceEQzXHg5Q1x4QzlceDdGXHhBOFx4ODRceDhEXHg4MFx4RDdceEY2T1x4QjFbeT1ceEYxXHhFNlx4RjZceEQ4XHg4NHBceDk0XHhERlFceEZFXHhCMFx4RkQnXHhDNVx4QUFceEY2JVx4QUVceDhFfFx4Qjk8XHgxRVx4REFceDE2XHhBNlx4MENceEY3XHgwQlx4RDVceEREXHhFNlx4Q0JceEY2ZFhKXHgwOGZVXHhEQVx4RjhceEJBXHhBM1x4ODVceEM5ZVx4MUZceEE2KjknTlx4RDdceDg2XHgxRVJceDkwXHhGRWlceEVBTVx4RENbXE5ceDA4XHhCND5ceDhGXHhCODEqXHg5N0V5RVx4RkRceEIzIyIxXHgwN3hceEQ1IVx4OTBceEI4XHhBMlx4MTFceEQxXHhEQmMoXHhFRlx4MTNceEQwXHhFMVx4OEJceEUxflx4RUNceDlEXHhFOSlzXHhGRCpceEZEXHhEN1x4RkVGcmFceDlBXHg5Ql5jXHgwRVx4RDlEeFx4MDBceEU3XHg5M1x4MERceDBFXHhBRHlceDk5XHgwOHVceDAwXHhFQzAgSTQwLFx4MTdPPVx4ODdSXHg4RG1ceDAxeFx4MEJceDA5PFx4MDdoJ1x4OERoZlx4OTJcXHhCNFx4RDFPXHhGRHtceEJGTVx4RTFceEUwXHgxOFt6fWNceEEwXHhFNyc8RyJNLHtceDg2XHhEMVtceEY1XHgxNFx4ODlceEUyK1x4RThceEQ5XHhEQ1x4MDVceEFGOXlceERBSlx4ODBxXHgwOVx4RDQqXHg5M09ceEI0Pil8XHhCMlx4Q0FceEZCXHhBM2tceDgzXHgxQXVAXHgxNVx4RjZceEU0XHgxOG58XHg4Q2hceDBEXHg5Mlx4OUZceEU2XHhFQyVceDAzfVx4OUZlNVx4RDFceEExXHhDMVx4MDFceEVBXHg5Q1NceEU3XHhGQlx4MDdGXHhBM1x4OTVceEIxVzdceERBTmtceEJEWFx4QTZnXHhCMDZceEM2LFx4Q0JceEU5XHhGRlx4RTJceERCZVx4REJceEE4UFx4Q0NceEU2Mj5ceEJGXHhDMlx4RDNUXHhCM3JceDgxMHdceEFDXHhENnRceEQyXHhENVx4QjdjNmpceDE2blx4RUNUXHgxN1l4XHhFNzRceDE3XHg5QVx4QzQ6N31ceENFXHg4N21ceEVDXHhCRTNceEE2XHhBN1x4QzlceERDXHhFQlx4MTZceDk4Jlx4RENceEQxXHhFRVx4ODNceEEwPFx4RkVceDk1S0lhXHhGMFx4QkJceEQ2XHgwNjFceDg3XHhENFx4REZceDgwZlx4QTMqXHhGMXpfXHgwN1x4MTNceEUzIHlceEJEIFx4OTZceEMyXHhBOC11XHhFOVx4RjJceEU2XHg4MnxceDFCXHhCMFx4OEJceDE2XHg4MSlceDA0XHgwMFx4QUIkIFx4QTlceDgxXHhGMlx4OTFceDhDXHgwNFx4OURceEJBZmhceEM1XHgxQlx4Q0RceEQwXHhCNVx4RTBceDg4Rlx4MTBceDhEXHhBQidceDkyXHhCM1x4OUVceEI4XHgxMFx4ODhceEJFTlx4MUZceERBKG5ceDE2W1x4RUVceEFBXHhBOGggdyNceEVFXHhCNVx4RDlceEJDXHhBRlx4RDZceEFGXHg4QVx4OThceEVDOiBceEY3aVx4MDlna1x4RUF+XHhENnBceEQ3XHg4OSpBXHg5OVx4Rjd7XHhGMzxceDFEIlx4RjFOXHhCM1x4MDhyXHhFQVx4Q0QzM1x4OTdceEIwXHhGQSVceERGXHhDQV5yXlx4QUFceDk5XHhDQ1x4RDZiMVx4ODBgUFx4REVceDk5LFx4RjRceDhFXHg4N1x4RkRceEU1T1x4RURceEM3RlB3LFx4OTc2XHgxNVx4QUFceEY0XHg5Mn1ceEVEXHgwRVx4OUUhIlx4RDNceDgwXHg5MVx4ODRceDBDIzZceEI2eFx4MDZceEZDY1x4MDg4XHhBQlx4MTdDXHhFOCdceDFDMVx4QzBceENEaVx4QTZceEY3XHhDOFx4MDZBZVx4Q0ZceEJFdmZhXHhCNlx4RjgzXHhFMCxceDg3bFx4RUV6SVx4QTRceEQ4alx4RjIzTFx4QTl2XHg4RDRceEIwXHhBMlpceEU4O1x4QThzVlx4MUEqXHhEQ1x4RTRceDE4XHhENWtceEQ2XHgwMlx4RTdceEY0XHhDN1x4QzBceEVCU1BceDg1XHgwMlx4MThceDFDXHgxOVx4OEZceEEwXHg5NjpceENGc1x4QTNsXHgwMFdceERFXHhBM1x4OTJMXHgwMVx4MDdceEQ5QFx4QjdtXHhDMFx4QkJ3I1x4QzNceEQwXHhFQVx4RTkqXHhCMk9ceDFGXFx4REFceEMyXHgwRFx4QjVceDg1XHgxM1x4RkZceEQ4XHhGQ1x4MDVFXHg5NWdceEY4bypceEJGVVx4ODdceDFFXHhFRVx4RjlceENFXHhCQVx4QURtXHg4RVx4QTJceEY1I1x4MEJceEVGXHg5Q1x4OUJceDBCXHgwNFx4OEVceEE0NFx4MTRZXHhGOFpceERGXHgwNlx4Q0FceEYwZlx4RDNceEIyXHhCNXBceDgya1x4MTlPXHgxNVx4QjQtXHhBN1dceEE2XHg5MFx4MEY+Slx4QUJceDBEXHgwNlx4RENebFxceEZGNV8iPm1ceDFFZVx4RTUrXHgwQ1x4ODFceEFDW1x4MTJceEE4XHhFQSdceEZDXHg4Qlx4MTkqXHhCNkl+XHhCOEczXHgwN3FceEVBOlx4MEZceEYzXHhDN1x4RDRceDg4XHhDRldBXHhGQlx4MDRceEE5XHhEQ1x4RDJceEEzKlx4QUJceEY4QWRRXHg4NVx4RjVceDkzXHg5NGJhXHhDQ1x4MDczLnBceDAyXHgwNFx4QjhceDEwcFx4QkFceEMxXHgwN1x4RDVceDFDXHhEMVx4RTNceERBXHhFRlx4RDRceEQwXHg4NnBceERFKU5ceEMzXHhBMlx4ODlceDFFMmZceEQ5XHg5Mlx4MEZceEZEMFx4ODFceDhCXHhGOFx4RjNceEExbVx4QThceDlFXHhCN31sXHhCQVx4MENceEVBXHhGNVx4RDJceDk0XHhBMXtceDk4XHhGQ1x4OUF+Llx4QzVceDk2XHhGMFJceDAxXHhBMT0yfFx4RjVucFx4QThlXHhFMnpceDA1XHhFNFx4OUVceDEzXHhEN20nXHgxMT9ceEE1W1x4ODNceEE3XHhCRVx4RTdNXHhDNjt0Oy5ceEUwXHhENlx4RDE1ZFx4RTFLXHg5Nlx4MEVVcVx4OEFceEQwUTVceDhCNlx4RjdceDAzblx4ODE8XHhCRHZceEJCXHg4MmRceDEyPlx4RkRAXHhDM1x4QUNceDk0PkRceDE3XHhBMVx4OEFceEE3XHgxMVx4OUFMXHhCQ1x4OTEiTlx4MEYyXHg4RDJHXHhCQVx4RUZceEExXHg4Qi5SJ29kfC5ceEU5XHhCMlx4RDhceEZDXHhCN1x4Q0FceEVFXHhGOFx4QTVvXHhCNkZceDg1XHhDQlx4QjRceEVDXHgxNkF9XHhCQTtceEVEcVx4OEMtXHhEMXBceEZCaUlceEY0d1x4ODgmXHgxM2JceDkyZFx4MTRceEE2XVx4RDNceDFGXHg5MVx4REU9cVx4ODRceEVCXHg5NVx4REVceENGZk9ceERDX1x4MDYuXHg4QnxceDFBXHhFMVx4RTVceEIzXHgxOXZyXHgxQ1x4OENqXHgxMWUhXHgwRVx4RjlceEQxOlx4RDRLXHhFRlx4QzRceEYzXHhBNzU8KStceEZFblx4MTFfXHhGN1x4QjRceDA0XHhGRVx4MTlceDA2VztceEFBK1x4RkEsTF9ceEYwXHhEQVx4OUZceEMwR1x4QzNceEU4XHhCMVA2XHhDNlx4ODZceEE5XVx4RDNceENCXHgwNndceEYxXHhFQ1x4RURceEQwXHgwQVx4OThceENERFx4RTArPVx4OUQ4RVx4RjAyXHgwN1VceERFXHg4Qlx4OEZceDEwXHg5Q1FceEYwXHhCNlx4QTlceEU0S1x4Rjl0XHgxMFx4OUUnXHhDQ2NceDg3e1x4MTImZTJceDk0XHhCOUd1UD1ceDBBdlx4MTA+XHhFOVx4OTZceEFCXHhGOTRceDgxPVx4QUZXXHhDOCtceDlCan5ceEREX1x4QjZceENFd1x4QkU0XHhENlx4RjFceEQ5XFx4Q0FceEI4XHhFNFx4MURceEU1XHgxRlx4RjFdXHhFQlx4OTBceEMzXHhBOFx4Q0MnZVx4RURceDhBdFx4ODl0XHg5MVx4QjVceDBEYVx4QzJceEFGXHhFMVx4MURceEY2XHgxRlx4MUJceDlGLHNdXHhBOCFceEU5XHhFMDhceENEXHhEOVx4OTV2XHhGMVx4OEVceDg4XHg4NVx4QjBceEY3N1x4MEUqXHg5Q1x4QTJ2XHhDQVx4MTZceDFERV9ceEU5XHhCQ1x4RkF1XHhCRSZceDg4XHhCM3lceDFEKlx4Q0R8IFtHXHg4QUlceDlEclx4MDlceDhEP1x4QUQtXHhGRFx4ODheXHhFM1x4QkNceEExXHhDM2FceEI0XHg5RGZceEU5OFx4OEVFNVx4Q0FceEM3XHg5NXRceDgzKVx4MDRjXHhDRjZceDkxL1x4OEZBXlx4QTdceEE5TEpdclx4N0ZceDAwXHhDNll6XHhBOSdceDhCXHhGRVx4OEZceDkzXHhBMVx4MDhceEM0SzVFalx4QTJceDlDVFx4MUZceEYyXHg5QVx4MDNxXHg4OVx4RTlceDFEXHg4RX4+XHhGRVx4QjRceEFFXHhDRVx4QzlceEU4Ulx4QzhceDExXHgxM1x4QzFJXHhDN09ceDFCYSlHR3xceDgxX0lceDEwXHhBN1x4RUN4XHg4NXlceENGXHg5Rlx4OEVceDkyKFx4OEZceEQ2XHg4Nlx4RjJceDA5XHhGRXNceEExXHhBQ1x4ODVGXHg4NFx4QkRceEExXHhFM1x4QzFceEJDXHgxN0pceEIwOkhceDA1Xlx4OEJjXHg4MllceDEyXHhDQlx4ODFceDgxXHhCQWBceEVFXHhFQ1x4REZNXHhDNVx4QkFLdVx4QTlceDg4NzZceDk1eWxceEVFXHhDMVx4ODh2YydaZjd+XHhBRFx4QzlceEYxaEtpXHhGMFx4MDZceDlCXHg4RCxceDFDXHhCNlx4MUZceEU3d3hceDlCXHg4OVx4RjNceEYzXHgwNVx4RTlceEY5XHg4NFx4MDlceDBCXHhDQlx4RDBceERDJFhceEEzdjlceEI2TXlkXHgxNFx4QjFWXHg4N1x4ODBceEJDRTRceDFEXHgwQ1x4RTUuXHhDOFtceEQ1K1x4OEVceDgyclx4OENceEU0Llx4RjRceEQ4XHgxQ1x4MUFceEI2Iy9ceEIyXHhFMV0jOVx4MTU8blx4OTNceDlCP2tceEQxXHg5Mj9xXHg4Rlx4QzNceDFDXHgxQVx4Q0RceEFGXHhEMlx4MTlRe3B+ODVceEQ3antceDE1XHhBOVx4ODRceDA3XHg5RFx4QUNXN1x4QzNceEY3XHgxNVx4RjRceEZEYWBceDdGXHhEOVx4Q0FceEMxWlx4MTVceDlFRUZceDlEflQ9XHhFRFx4MTRUS1x4Q0VceDlCSD9pXHhEQVx4MUZGXHgwRiszXHg5Nlx4QjJceDlBXHg5QVx4RENgXHgwNlx4QTZceDE4XHhGRVx4MDRceEY1XHhFMVx4MTlceEE5XHgxOFx4RTBceEQ4XHg5RFx4QUJ5XHhGOU1ceEM2XHhFNlx4QzVjXHg5RTlceEEyXHg5M1x4QzFceEI4SnI6XHgxN1x4RkNceDgxc0dceEFBXHhCN1x4RURceDFFXHgwRVx4OUJnQVx4QzVoXHg4NHpceEMxXHhGMVx4MUJceDhDXHhFN1x4RUYjckpceEMxIFx4QjRceDhEXHhFN1x4RUNceEFDT0ZceEQ2XHhFN1x4RENceEI5XHhBM1F2XHg4Mlx4ODRrIFx4OUFceEM2XHg5NFx4RURTXHhBNVx4RjlceEEyXHgxM1x4RUNceDEwXHhFNVx4RURceDkzQFx4RDZceDFCclx4QzdceDE2XHg5Qlx4RkU2XHgwQUVceEMyKlx4RDRceEU3XHhENmJceEU3XHhDOVx4QURceEU4XHgxMVx4QkJceDg4XHhGQVx4QjZ8XHhBRVx4QTJRXHhEOFx4QzNceDBFXHgwMVx4QTYjK1x4QkRJIjspTlx4QTlceDg5XHhBMnJlXHhDNlx4MTVceEM2R1x4QzZJXHhGMSkvXHhEQT1ceDEzXHg5QUB5PFx4RjBlXHhGRWd1XHhEOFx4QzZceEZBX3pceEJBXHhFQVx4MUVceDgxXHgxOGFceDAwOVx4QUFceEZBU3ZBXHhCNVx4RjFceEZFaTdceDlBZlx4QzRceEVEXHg4Rlx4OURceDg0PFx4QUJceDFBYUQjXHhENVx4QTZceENCXHhERUFIXHg5Qlx4MDZceDA5XHhEN1x4RkNceDg0O1x4OTZceDlCSlx4N0ZceEM5K1x4OTFceERFXHhBRlx4QUNceEJBXHgxNTZceEI0XHgxN1x4OThceDBEQFx4RDFORVx4QzhDQlx4RERceDBBXHhBQihceDBGXHhEQV81XHhCNlx4MEVceEY1IlhzXHhBMlx4QzRqXHhCMDdceEI2SnV6elx4Q0E1UUxceEJEXHgwRmFceEJBXHgwQUh8b1x4QzBceEYyXHg5NFx4MUZceENFXHg4NHMxZ1x4ODdceEUxU1x4MDNceDE1MVx4MThceDkzN1x4ODZ7XHhEQVx4RUFceDAxUSpceDAyXHhDNVx4RUJceEY5XHgxMzZfS1x4RjhkXHhFOVx4MTY5NFx4MDJceEIzVVx4RENceDEwXHhCQ1wsXHgxMlx4QTJKXHhBRlx4QzBMLVx4QTZceDFDTlx4QjkrWlx4ODlceENDXHhDMVx4QTZceEVDdVx4RDdceEVGalx4QURceEM1XHhCQ3dceEJEXHhGNVx4Q0FceEY2XHhFOFx4OTJceDlBXHg4MVx4MERKXHhGMl1QYVx4RUFceENBfVx4MDF4dlx4RkJceEM2XHhENFx4QzZDQVx4RDhceDBBIlx4MUI7XHg5NVx4MTRceDkwflx4RUJceDgxXHhDQUJceEYxeFx4RjlceEE3QFx4QTdceEMzXHhFMlx4QzJOXHhCNXA+XHhDOVx4Q0JceDlCbFx4MTNceDFCXHhDNVx4QTdceDFGXHhFMT9ceDFFXHhBMlx4MDdiWFx4RDVceEREXHhDQ1x4RjJceDkzbVx4ODRceEM0XHgwQlx4RTdceDEyXHg4QV9ceERCXHhGQS1ceDg0XHhFNUk2XHhFNydceERGXHgwNVx4RUZceEUxckMkfVx4QTdceEY3XHhGMlx4QjRceDlEXHhCN1x4RkNxXHg5QSRaXHg5QnpceEIwXHg5NFx4MUZca1x4MUZceEY5VVx4OUZceDk4XHhFQmwvI3pceEQ1ZkpwXHhCRFx4Q0VceENFXHhERFx4MERceEQ4ZkxceEY1XHhGRVx4RjRceEEyXHgwM1x4MEFceDBCXHgwOFx4MDlBXHhBRlx4OEIkXHhFM1FxXHhGMj1ceDBDXHgxRFx4QTFIOipceDE4Wlx4QkZceEU0XHhEQVx4MUJceDE0a15ceDE4QFx4RkZzXHg4Mlx4OTBceDg3XHg4QVx4OTJceEVGImZceDEyXHgxMmJceDEzNEJceEU5XHhDMVx4QUFceDBCXHhGOFx4Q0QvXHgwMz07XHgwMWJjXHhCQVx4MTglTVx4QUR7J2BceDkzMFx4QkQ1XHhCMVx4RTQuazFAIE1ffEs1XHg5MFx4RjI6XHhCOVZceDlFPUBceDk3XHhERFx4OTExXHhDQixceDg2VW9ceEI0XHg5Qlx4QUM5XHg5Q1x4Q0RceEY0XHgwMFx4MDVFXHhCQiRceDlCeiZceENCVVx4RTZceDkzJW9ceEE1IFx4QzZZXHhGNlx4RDVceEYyXHhGOFx4OTgvNlx4QTYuXHhGMlx4QzdrayhceDhFMlx4MTRvPHxceDhEXHhBM1x4RjZceDgyXHhGMlx4MDdceEY4XHgxRjImXHgxQTpceEM4dFx4RTVceEZDXHhGQlx4OENsXHhGNFx4QzNceDkzUVx4RjFXR2xceENGNUEuXHg5QmxceDkyYWcoeShrXHg4RFx4QjNceEE2XHhCMFx4MDBceEY2XHhBNyJceDgzXHg4NVx4RkMuXHhDNXFceEQ1XHg4MTVRXHgwOVx4MEZceDEyXHg4Q1x4MTRhdDFceDAyUVx4QjksXHhCQVx4QUVceEYyXHhGQVx4MTZceEQ5XHg5Q1x4OUJceEQxXHhFMlx4QjVceDFDXHhCMFx4OEFIXHg4MF01fFx4RkFfd1sgXHhEOVJceEY1MVx4MTVceEM4XHhCQVx4OTFceEU2XHhGNFx4QjVceERDXHhGOCFceDFDXHhCRVN7TVx4ODRceDk3bVx4ODJceDE3SFx4RENceEY5XHhGMlx4ODFlXHg4MklsXHhCOVx4QjRceEEyXHg5NVx4QzJceEExXHgxOVx4REJceEM4XHhCOVx4MTVceDE1XHgwOFx4MDdceDk5XHhDQ1x4Q0JceEI4Llx4MDUoTFx4RDQ6SUp8XHhCNFx4QjVAXHhFMidceEEza1x4QUFceEQ3JVx4Q0NceEEwKVdceEZBXHhCRC46ZCdceEI3N1x4OUFceEIxXHgwOVx4ODlceEE1XHgwOGFceEE1ZFBceDE5cVx4MEV5XHhEMFx4MTFFXHgxMlx4RDBceDA5XHhGQWZceEFEXHgwN1x4MDVceDE3XHhDNFx4RUNBXHgxMFx4MEFceEU3SnhceDk5MC9ceEJDXHhEN1x4RDZceDBFXHhEOFx4MURceEU4XHhBRFx4ODRceEU2ZGJceEEwXHhEMlhceENGXHg5N1x4RTZceEY0e1x4QUFceEFBXHhCRTBceEEzXHgxN35RRlx4QzZceERDXHhCMDxpW2RceEIxKlx4OEVceDlFXHhBODlceDk0WUJceEQxNVVjXHgwRWNceDkyXHhCOFx4QTBceDEwXHhDNVx4RTRceEMwXHhFRFx4RUZceDg5XHhCNnJceDkzPlx4RkFbVFx4ODZNQFx4QUJceDA5XHhGMFx4OUFceEIxXHgwN2ZceDBBdlx4QTZlXHg5Rlx4OTNceEY2LVx4MUJceDE5XHhBQk1NXHg5Nn5EL2RceDhESickM1x4RDddXFx4QjJzXHg4N2ZceEVDMT1ceDgzI1x4ODB+XVx4OURtX0pceENBe1x4QzdtXHgxRm8+WExceEVCXHhCNFx4RUE8KD9ceDgzXHgwN1x4RjhceDAwa3NaWFx4QjBKXHg4RVx4MDZceEUxXHhDN1x4OUJIXHhGOFBceDk3XHg4NFx4Q0VceEU5XHgwNlx4RjRceEMzXHhDNlx4OENLXHgxMlx4OTglJFx4QjFMXHg4OVx4QjciXHgxMTBceEQ3XHg5NVx4OTJceEU3XHhCMFx4QTQhXHg4MFx4RjVceENBXHhENFx4QUQjXHhDOG9AXHgwM1x4OUZceEQwXHgwNVx4RThceEREXHhCRVx4MEZceEE5XHhCRThceEQ4XHgxRlx4RTVlR1x4RTlceEFGYFdceDE0QFx4RTVceDBGKlx4RTdceENFLlx4QzVceDlEXHhCQVx4MTZeXHgwQlx4QjdceEI2XHg4Q1x4RENceDE3XHhCNi1FXHg5QTNceDEwXHg4MUhceDhGOFx4RENceDgxXHhFRVx4QjdceEUyKlx4RTFaflx4MDhceDhCXHhFMUV9XHhBN1x4RDhceENBXHhDMCkzeVx4QUNAYCVceDBDYlBceEI2XHhBMC0nXHhFMzJbRFx4Q0VceDg2SVx4OUQ+XHgxN1x4QTUmXHhFQVx4MTZceEYzR1x4QzA+XHgxM1x4QjRuL1x4MEFKXHgwMVx4QkFNXHhGMlx4QjhceDExLVx4MDlceEVBXHhCOFx4MDlIXHhEN1x4RjdBXHgwOFx4REVceEU5JF9qZVx4QUFceDk2eSxceDEzXHg5Q0tTRFx4RDJceEMxNFx4QjRVXHhCMXRFXHg5NVx4RkVceDg5XHg4RkhceEU3JWpceEJCXHg5N2RceDAwXHhGN1x4RDlnXHhGNDVceEEyYFx4REFceDhEXHhGNHBgXHhBN1x4MEZXTFx4MEQ9I0knXHg4Rlx4MDUjXHhFQX1ceEYwXHhDNFJceEE0XHgwRFx4Q0JceDA4XHhGQ1x4QjBVY1x4OEVNXHg5NVx4ODQhfnZceEU1XHhEQjlceDE0eFx4RUNceDExXHgwMXZceEYwXHhCQyFceDhDKk1ceDA4XHgwN1x4QzlceEM5XHg5RVx4RkZceENFXHhBOSNceEY4XHhCMlFceEJFXHgwM1x4RERTJFx4OURceEQ4OFx4QjlceEM1XHhDM1x4QkFceDgxXHgwRFx4REJLXHhFN1x4RDdceDEzdlx4OUFceDFCXHhDOVx4QThceEFGXHhDMVx4RkVceEEzLVx4REEpXHg5OFx4QjlceDAzXHgwOEVceDlGXHg5M1x4RkNceDA2TElceEJCXHhEN0I2XHhFQ1x4QzB2ZXJoXHg5Nlx4ODRceEVGXHhDMVx4RENceDA3cFx4QkNceDg1XHhCMDBceDg5XHhEQzRceEQ1XHgwNFx4RjIxXHgwNFx4RDNceEIycUFceEVEXHg4M1x4RjAhXHg5Nlx4QjhceEM3XHgxNVx4QjNxXHhFMFx4ODYgXHhEMFx4RkVceEI4XHg4RFx4OTMyXHhBQlx4Q0FceEMyXHgwNExceEREXHhBMFx4OUVceEVEe1x4OEJ7XHhCNFx4QTRceEM3UmA5T1x4MDhceEREXHg5NFx4MURceEZBYVx4QzBceDdGXHg4RVx4QTJceEIyXHhEQUJceDlGXHhEMFx4MTJceEFDXHhDOTUuanxceEQ1b1x4RjRceEVCXHhGNm9ceEU5XHhGMSREXHhEOUFrXHhCRFx4MDlUXHg5QSFceEFEXHhBRFx4MThceDFGXHgwQVx4QjZceEZEXHgxM217aTlceDBDXHhCOFx4RkNceENEc1x4QUMmXHhDNVx4QUNceDAwXHg4OFx4MEZceDg5XHhDOXBMXHhEM1x4QjhceEMwXHhFNFx4RjJceDhBIlx4RDFyXHhCRVNceEI4XHgxNVx4RTZceEVEMVx4QUNqXHhCQ1x4QzZceDgxNlx4OEJceEYxXHhDMVx4MUNceDdGXHhCQ1x4MTNceDkzXHhDQlx4Q0NceDkzXHhFQlx4OEJceDAxPFx4QTJceDlBXHhFQlx4QjcqXHhCNFx4RkJceEM5Ylx4QzlceEQ4VVx4QTRceDAxXHhDNFx4ODBceEI4Klx4QkNceDgyXHhCQlx4REMrXHg4Mlx4RDBceEVCXHhEOWZceENFXHhENlx4RjJceDg2XHg4RXVceEFENVx4OEZceEIwXHhCQVx4MTVceDk5WVx4MEFceEM3N2BceEI5XHg5Mlx4RDckXHgwQzdceEI0XHg4MVx4QjcmSDpceEI4b0VLXHhFQWRceDlDZFx4RDlNKFx4RUJiR1x4MERqXHg4QXk7XHhBN0BceERGLFx4RUR+XHg4Mlx4QzNFXHhCOCxceEQyXHgxNjxceDlBXHhCQlx4QkVceEQxQlE4ZVx4RkNTXHgwN1x4MUZceDFGXHg4Rlx4OUFceENDaFx4OEJceDg1XHgwNFRceEM0VVx4OUJceEM3XHgwOHBceEIwXlx4REQmIjlceDlCXHg5RWtceDg5XHhFMlx4MTJceEMzXHhBQ1x4MTIqYFx4RjBceEM5XHgxNVx4RjNYRj4rXHhGNVx4OUVpa1x4QTlceDg4XHhCRlx4MUNceEZEXHhFQlx4RjNceEIyIFx4RDhsZFx4MTNceEI5ai5ceEZCXHg4Qlx4MEFceEU3bVx4QjZceDk3fVx4MTFQbVx4QjNceDE3MVx4MTdceDg3Y1x4QUJceDAzLlx4RkVceDEwXHhEQVx4Q0JceDFEZkxnXHhDMFx4RjZceERDXHhBNlBceDg5XHg5Mlx4QUV6JFx4QzRiXHgxM1x4Q0VceERCXHhGNGtceEUzXHhBQVx4RDlceEU3XHhCQ0RceEVEXHgxNHdGXHhBN1x4RDJceEJFXHg5RFx4ODdceEZDXHhFQlx4Q0ZceDgyXHhCM1x4RjhceDBFWlx4ODQ5XHhDRFx4OERceENGXHhBRWRceEI3XHg5Mlx4OTNceDE5XHhBQ1x4OTBtfFx4OENsXHhEREVceEZFXHgxM15ceEFCXHg5MVx4RUJceDlGXHhFNVx4QzNceEI5bFx4RjBceDA4XHgxRVx4RUJpXHhGQUdceDFEXHhFOVx4OTFceDEzXHgxMFx4MUJceEJFXHhCQ1BceERFXHhFNVx4MUFceDE0Y11ceERBR2ZceDE0XHg4OE0+XHg5N0VceDlCXHgxQlx4QjJceENDXHg4Nlx4MUNceEU5Ulx4MEVVXHg4M1x4RUZceDlGXHgxNHhceERBXlx4QjBrXHhFQlx4ODJceEQ1XHhDNlx4QkN9MjZuXHhFMlx4OEFceEFCXHg5N1x4REVceEM5aDgrXHhDOVx4RTVsXHhCQVx4QjNceEY3XHhCNnlceEQzXHg3Rj50XHhCM1x4MEFKXHg5Rlx4RkZceEZCXHhCMlx4OEJceEMzXHhBNjpceDgyXHhFRkZOXHhCNVx4RjksQEtceDlDXHg5QSNceDFCVFx4QUJceEZFSlx4MTc6XHhBMVx4RDFceDFCXHhDMVx4QzN6PVx4MDhceDhGXHhGQ1x4MDhAXlx4MDNceEI2Rlx4MUJAbylceEMwL0FceEE5XHhBOG9ceEZEXHgxREtceEI0XHhFQ1x4MDJGXHg5QVx4MTlceEVDXHhDODVceDAzXHhFNzZceEUzKihceDA3cFx4RDByVlx4QzZEXHg4MTR0aFx4MDRceDA5XHhCQjNceDg4XHgwRVx4Q0FceEQ3Jlx4OUVXXHhGMVx4OERceDFCXHg4NUtfKFRceDk2XHg4NkhceDg3K1x4Q0ZceDE0Mlx4MEJceDBGXHhDNVx4ODdceDlFXHg4M1x4REFGXHg4Q1x4ODQhXHg5NVx4Q0VceEU2XHhCMHNceEE0XHgwRVx4OUEzVm46XHhFOFx4MTlceDFFXHhGQTxceEQxXHhENFx4MThceDkxelx4QjdceEIwLXJceEFCXHhFRVx4MTlceDEyXHhERjJceDkyXHgwM1x4MTFceEIxXHhCRik5XHhFNVx4OURceEI2XHhEQlx4RTA9XHgxMl5ceEUxNFx4REJceEJDXHhDMlx4OTVceEIyMVx4ODFceEZFXHhFQVx4RTNceEJFXHg4Nlx4QkE8XHgwNzJceDgwXHhGOFx4RUZceEVGNXdceEI2NVx4QjJceEQwb3RceEE2XHhCQ1x4OTVLNUcjXHgxNVx4MEJnXHhFQVx4RTVPXHg5N1x4RDNceDlFXHhFOVx4OENceDA1WVx4OEZceEQ1XHhDQ1x4MUJceDk0XHg4RFx4OTlceDAxXHhFRlx4OENceEZFXHhCMlx4MTRsOlx4MEUwXHhBN3ZceDhCdFx4Q0NceEJBXHhBMj1ceEYzXFx4QjlceDA2d3lceEUwXHhGN1x4RDhWQFx4MEVbI1x4MUFyXHg5Mlx4OTFceDlGXHgwRVx4QkRceDk3Qlx4RTNceDdGXHg5OFx4OTRoV1x4Q0NIXHgwREZceDkxXHhGMiA2KVx4MTRceDA3fFx4MTdceEJEXHhFNVtceEFELVx4RUVceEUyJVx4RUElXHhDMFZbYFx4MUF1dGpceEYwd1x4QkZceDhBMipceEE5XHhBM1x4OTRYNGtceEQ3XHhFMVx4RDdceERCXHhGM1x4MTNceEZEYShceDEwXHhDMkhceEY4IVx4MDVceEI1P1x4MTdceDhGXHgxN1x4ODVceEE3Q1x4RkIzXHg4N1x4RkZceDFBXHhGQVx4MTZceEY2XHhERFx4MEFceDkzNVx4Q0FceEMwXHhGM1x4REVceDA2XHhFM1x4RTNeTjA2XHg5Rlx4QkRgXHhCNVx4RjFceEM3XHgxQkVceEUzcyxceDkxXVx4MDhceEJEXHhDMlx4MDJceDlGXHhGRmZkXHhDQndoPFx4OEZceEY2XHhCRndceDkzXHhDNX5ceEJCXHhDN1x4RjVceDBCXHhDN1x4QkVceDhBb1x4MDNceDgwXHhGN3dceEVEXHhDNipceDAwdlx4QkVceDBGXHhFNFRceEYzXHgwRV5ceDEyXHhCNTBvXHhDOVx4QTZceEY5XHhCMFx4QTBceDA0QGZceEU0XHhFQVx4QjRceDhGXHhEQVx4MTc7XHhDOFx4MUZceDgwXHhGN1x4RkVgN1xnXHhEOVx4OTc1XHgxQnRceDE4XHhBM0RceDk2XHgwNVx4MURceEZBXHhDOFx4Q0JceEQ2XHhGMT03biNceEY1XHhFNlx4RjAkJjBceDA4XHhDREdceERBXHhEQlx4MEErKV1ceENBXHgwNW5ceEVBXHhGQyJceEU4XHhBNFx4QkNiXHhBRFx4QUFcbWtpXHhENVx4QjJceEUyYSV5XHhCQVx4QzhceEExXHhBM1x4MDdtXHhGNWZceDlBXHhENGxceDgxXHhGRFx4QkM2OFx4MUV+XHg4OFx4RDFUaEgyXHg5Q1x4RDFDXHhDNjBceDhFdVJceDBFXHg4MFx4ODFgOnQkXHgwQlpceEI4XHhEMTVwWkZceEEzXHhGQi5ceEYzKztlXHhEMVx4RUUrcVx4QTlceEI4XTtcMltUVGBiXHhEMWV9XHhEQVx4QjhceEUwXHg4Mlx4RUZceEI2QFx4QjZUXHg5QTRceEJBKVx4ODBCJltceDg4d2NceEUzIjdbVVx4RjFceDkwXHhGNlx4MEU2XHg4OFx4ODVceEFBXHhGOVx4QzZdXHg5M3tceDFDXHhDNVx4OEF1dVx4N0ZceDhDXHg5Rlx4MTJceDA3aVx4QjVceEQweFx4RkZceEZBUlRceDhBXHgwMlx4RTdraSZceEJGXHhDRlx4MURceDhCWlx4RDIgNlx4QjBceEFBXHhBOFx4QzNceDhDXHhBQVx4OTRceEI3c1x4RENDXHg5MFx4QkZceEY5XHhEOVNceEMyaVx4QzVceEYzXHhFOXxceEZGLlx4RDdrXHg4NUBXfVx4MThSJkFceDhGXHhFN1x4ODEjK1x4ODJceDBFXHg5OVx4QzlceERCXHhGNVx4QkZceEZCXHg4MnspXHg4NFx4QTlceDk4XHhEQV1ceDE5XHgxRUxceEY4XHhFNFx4RURceDBGXHgxNVx4QjU4XHhFQjFceDFGXHg4OVx4MDVceEIzUlx4MDFUXHg5OG5ceERCXHhGNlx4MTRceDE3XHgxM1x4RTZ6I1x4QzNceEE5eilceEQyXHhDQ1x4QUJceDEwfVx4Q0Z5XHgxOCdceDBGXHhFM3lYXHgxRFx4OUNceEFGXHhEQlx4QzZuNVx4QjZceDlDXHgxM1x4OEVceEREOCk7XHhCQlx4MDFceEYwXHhBRFx4ODImXHhEQyAxXHgxNnF6XHhFNFx4OTVceEIwXHg5Qlx4QTNvXHhDNVx4OUJceDFCXHhDRVx4MUNceEYxXHhCRVx4MDVceDhBRyB7flx4RjBxcFx4MDZtXHgwQlx4RkJEXHgxNFx4QjdceEQyOkBpaVx4RDBceERGRFx4QjFceEFGXHhCOVx4QTRceEVFXHgwM1x4OTJceDA4WmVceEVEPkxceDhFXHhGNlx4MUV2XHg4Rlx4QjhceEJCXHhDRSlOJFx4MDRceENCXHhFM3BceEZFXHgxQ1x4QUNceDFBXHhDRlx4N0ZceEIyXHhDNFx4Q0MnUzpceDE1XHhGNFx4Q0NceDdGXHgwRlVyXHhENFx4MDhceDkwMlx4QzlceDg4XHhFRVx4ODFceEIzQlx4QjhGK1x4QzhceEExXHgwN1x4RThlXHhEMVx4OEFceDlCXHhCMlx4Q0VceEY2Plx4ODY8XHhEQVx4MTZsXHg4Q1x4MURceEVEXHgwRVx4QkJceDhDZVx4RjQ/SVx4RkQ1elx4MDRceDkzXHhDMTdceEM2XHg5N0hZXHhDRilceDBGXHhCMlx4QzY1UVx4QTNXXHhBNFx4Q0VceDhGP1x4MTdceEU2XHhCQlx4Q0NceEFERFx4Q0MmXHhFMVx4MUNceEY4XStceEU1MVx4REJceDE5XHhGRVdceEMzXHhEOVx4RjRceEJFOSRceEVFXHhFMVs5XHhFM1AuXHhEQlx4REVQXHhERjBceDhBXHg4Qlx4RjdpSGdceDk4XHhFMVx4QjZceDE5XHhBNVx4QjJAXHhEQ1x4RkFceDEzXHg5OGZhIShNXHhCMEFceDFGXElceEUwXHhCRDVceDg0XHhGQUBceDk4XHgxNFx4OTdceDlFeVx4RTlceEFFXHhCOHtEXHhGQ1x4N0ZceEQ1XHgwQVNceEQ1flx4ODBceEY2XHg5RmtceEMxZzhceEVEXHhBMFx4REY7XHhERVx4RENceEU2XHhDMVx4OTdceEE3XHgxOVx4MThceERDSmFceEY2XHhDM09ceDBBXVx4RjY4NVx4QThceEIybXpGXHhEQ1x4OUJceEE0XHhBQlx4MTNceEJCJ1x4ODRceDAwKFx4ODJceENEXHhCMlx4RjNceEMzRFx4MDVceENGXHhBMnsqdlx4MTgwZ1U+XHhCNFx4ODJceEEzP1x4RTVceDhDLzM2XHhFNyhceEQxXHhCOVx4RUZzXHhERlx4MDlceDFFXHg5NVx4OUVceEMzU1FceEYwXHhEQVx4QUZceEUzXHhFQ1x4ODJIKFdceEMwXHhENVx4MUZceDg3XHg5OEBTXHgwQlxceENDXHhEREduXHhDNlFceEEwfTJceEY5VVx4Q0J8XHg5Qlx4QjFceEE3KXhceDlGXHg5M1x4MDVceDFEXHg5QjVceDE5dVx4Q0NOZkJceERFXHhFNFx4Qzh6XHg5OS1hXHhEM1x4REVceDE0XHgxNlx4OTFceEY4XHhBNkpaXHgwRVx4RkNeI1x4QzdceEQ1dlx4MTVceEIwXHhBMVx4RjFceEFFXHhBOUo/XHg4RktaXHhFOFx4RkZceDBDXHhGMiheXHhDQVx4MUZceEY0XHg4MFx4Q0MxXHhBQntsXHhGNTRceEY4Jm9ceEQ0XHg4RVx4Qjc2e1x4RUNDXHhBNlVceEMzKlx4OERceEIwXHg5NVx4RTRceEFFXHhBRFx4MUNceDhGXHhEMlx4QzVceENEWV5ceDBFXHhEMFx4QkQ0XHhFQlx4QzhceEQ0XHhCQ3hceDgyXHhFM0tceDFBXHhEMlx4RUJceENCQihTXHgwRlx4QTZgXHhDRVx4QzVceDEwXHgxOVx4OEZceEM2XHhBQUtceEE0XHhCMlx4MTRceDA5XHhFNF1oXntceEM5clx4QUNceERDXHhEQVx4REI0XHgxRlx4RkJceEM1ckBceEI5XHhFMFx4OTB1XHg4Rj9KXHgwQnZceEQxXHhDRVx4RjZceEM3XHg4RG97XHg5Qlx4OTZceDlDXHhDQVx4REFceEU4IXNceDAxZlx4QTFceEEzXHhDOCpKUCRceEIwXHgxRlx4RDlceERBXHhGRFx4MURceDFBXHhDMlx4RUZgXHg4Rlx4Q0NceEM2XHhFQU1ceDFBXHhEMCVgXHhFNUphXHg4NVx4ODF4XHhBMFx4MDNceDk5XHhGRlx4RTVceDE5MFBceEVEXHg4OWZceEMwSTBuS31ceEYyXHgwMCkzXHg4OVx4OEJbT3NceDE1VUZceEE1Qlx4RkRceERBUixceDFDPFx4OEVceDgxXHhBRDBceEI2aFdceEVDXHg4Rlx4QTRSXHg5NVx4QTk6KEpceDk0XHhBM1x4Rjh4V0hceEUyXHg4Qlx4QzVceENEXHhBOFx4N0ZceEJGXHgwRVx4Rjh4JFx4RkQ5a1x4RjRceDA4aUpceEE5blx4QzRfXHhCN2RceDgxXHg5MVx4MDlceDlCfFx4MTl4XHg5Mlx4OEVceEM1JVx4RDAqXHg4QyElUVx4QkNTT1x4RDFSXHgxNFx4RTNceEJCXHhBRlx4RDc9aVx4QjRceDFBXHhGQlx4QzhceDFCXHhFQ1x4QjF+XHgxMlx4Q0FceEI4KVx4RkJceEM1XHg5RVx4RUVceERCaiciVFx4MDBnXHhBRGNceEQ4XHg4OVE/XHhFQ2VbXHhGNk5ceDkxSVx4MTBceEE4XHhBNlx4MTRceDFEXHhDRVx4QjZceEY5T1x4RTZceEFDa1x4MUVceDk1IFx4RTlceEVGT1x4RjhqXHgwQ19ceDAwUVx4QkNceEE3XHg5RVx4REZOXHhEN0wyPFx4Q0Y/XHg5RmEoOlx4Q0Rfelx4MTVceDA2XHgxN21ceEYwPVx4ODZceDhEXHhGOVx4MURceEE2Lj9ceEMxXHg5NVx4OUJceDg1XHhDRDpceDg4ZFx4MTUrXHhDQ1x4QzVceEE2XHg4Q1x4ODEmXHhERTtceDAzXHgxN1x4N0ZceEM4ZFx4Q0JceEI4XHhFNmIldlx4QUFLXHhCNFx4MTNceEJGXHhFOVx4MThceDg4LHFceEE4XHhCNmBceEY3XHg4NFx4QzdceEYyXHhERFx4MTFceDg0MVx4RjZceDk0XHhGNW1oXHhCNygyXHhCM3tceEYzXHhEOXxceEJGflx4MUZceDAyPlx4ODZEXHhGRVx4RkEpXHg4RVx4OTNPXHhBRVx4OTVceEQ3XHhDN1x4QjZceEM0XHhCMVx4OTJ2Y1x4OENceDExXHgxQVx4QjNceENFXHhCRSpEXHhFNTQoXHhBMlx4Q0I9a2IoXHhDRUFceERDNlx4RkEkXHgxQzBceEM1YFx4ODhceDA1XHhCQ1x4MURgTFx4MDhceEFEXHhEMFx4OERceEY1XHgxOWRoXHhERFx4MUYxXHg5RUJceEFGXHgxMFBceEFGTVx4QTVceDEwXHhERi5ceDBGXHgwMFx4QkVceDgxXHhCRXxceERFXHhDNVx4QTNceEZFIVx4QkNceDE1XHgxRVx4RUNceDhDXHhDMlx4RTBceEY2KSVceDEyXHhERFx4RDdceDBDXHhBRVx4QkIoOExaNVx4RUVgXHgxOCFceEVBXHhFRWxJXHhGQVx4MEZceEIxUlx4ODZceEYxXHhCMlx4OTFceEQwXHgwRFx4QUZZXHhGNFx4RjBceDgyQG5ceDFBIlx4OTh+XHg4QU1EXHhFQ1x4Q0ZwXHgxMFx4QkRUXHhGQ1JceEI2XHg5N2ZzXHhCRE1ceDE5XHhGRFx4RUJBXHhBRXspXHg4Mlx4MDhzXHhBRElceEFBXHhGOVx4QTBceDBEXHg5RFZoXHhBRlx4MTJ+XHgwQlx4ODNceEM3XHhCRFx4MDVceEQ1XHhCRi5ceDhEbTpceEZGXHhCRkVceDhBUFx4RUVceDA2Llx4MTBceDBFXHg4NS5CXHgwMVx4QkJceEIzXHhCMnI9XHg4MVdceEFGOCxceDg2QTFceDhGXHgwOVx4MUJceDA1XHhFRVx4QzdzXHg5QVFceDk3XHhCMnVceDExSC1SXHgxQUwnXHg4OVx4RkJWXHhGMVx4MERceEY1e1x4ODVceERGLkpceDFCdX5ceEIzXHhCMj1VO1lAXHgwM1x4RThceEI5blx4QjhceEUyXHhCNnNceEYxdXhIaHY1XHg5N1x4RDhceEJFXHhFRXtceEYxWVx4Q0FceEY4XHg4OFx4MERceEM5XHhFQlNceEI2XHgwRGxceDE0Xlx4OUFceEYxXHg4OVx4RDhceDgyK1x4QzhceDkwXHhENFx4RjZceEVFXHgwNFx4MTRceEE4SFx4QkF+XHg4OUBYXHg5QVx4Qjl8XHg4MFx4RTlceEQ2XHgwRVx4RTM+IFx4RUVceDEyXHhGNlx4OTJceEQwelx4OURceEFDXHhDOFx4MUVyXHhGN1x4MDdUXHhEM1x4QUVceDk5cVx4QzJceEVFXHgwQWt9aX5ceEEzXHg4N2hyXHg5RFx4ODV2bWhceEY5XHhEMD8sXHhGQzlceEFGXHhFMVx4OTNceDk5L1x4QkZceDdGXHg5MFx4RDBceEMzSFx4QzVceEUxXHhGQlx4ODNceEJGXHg4NTJceEVGXHhGQlx4QURceEU3XHgwOH5hI2hceEFDaFx4QTlceEUwXHg4NFBceEI5XHhGMVFoaHlwKFx4QUVWbnpceDA4XFx4OEFceEREVFx4Q0NWXHhCM1x4RUVceERBXHhGQVx4MEZWQ1x4REJFXHhFMSx8XHgwRVx4RDJceEVFXHhFQlx4QjdceDA0TTBceDkxXlx4RjFPL1x4MDM6SFx4QTczXHgwNlx4ODdceEJCXHgxRUJceEZEXHhCMFx4MUFSXHhDMVx4QjFdKVx4RTRlI1x4RjdceEMwXHhBNVx4QjgpXHhBMCxceDE2KFx4QTFceDgwQ1x4Q0RRVFx4RTBceEU1XHg3Rlx4QkZHYDxceEYxXHgxRFx4MTdceERBXHhFRDtceDgwXHhCQ2I+XHg5RVx4QjVceEJFXHgwNFx4ODZQXHhEMFx4REJceEM3XHhERlx4OERceDA2Ilx4RjguXHg4Qlx4QzNVXHgwMFx4RDJceEU5W3JceEY5XHhGQ2ZceDFDXHhCNW5ceEIwJWxZVVx4MTVceEMyXHhDNVx4QjVceDg5XHhGRVx4RTJceEU0XHg5RVx4RkZceDkyT1x4RDBceDA5XHhCNFx4RTRceDgxXHgwMlx4REZceEM4R15ceEMzXHgwM1x4QzY2b1x4OEJmXHgxQ1x4RUZceEU2XHhCRi5ceEYzXHhENlx4MTNoXHhENlx4MTBceDlDeCxceEM0XHhBOFx4QURceEYwXHgwM1x4ODdPeVx4QTV6XHgwRnc6WVx4MEJceERFXHhGMlx4RUVceEEzXHhGNVx4QkNTXHgwQVx4RERceDEwY1x4QkZceEI2XHhCMlx4OTVceDAyI1x4RkV8alx4RjMkXHgxRlx4QzVceEJFUFx4ODZceEFDfk9ceEEzXHg5MlpzXHgxOUtceEZCVnFceEMyK1x4OEZceDFGW09ceEEyO1x4QjY/XHgwRlx4RTJMXHg4MWJceDk4eW1yXHhERUtceDg2RVpceDBBXHhFN0ZbXHhBQzEhN1x4QUY/XHhGRCFceDA0XHgxRFx4RkZlXHgwNGRcXHhDNkBceDFEXHg5MVx4MDVceDEyMVx4MThkXHhFNVNceDg4XHg5NFx4RTZceDA4XHgxN1x4QjdiXHhCNlx4QzFceENEX1x4RUFceDk4XHhGN1x4ODdceEVFKVx4OERceDE2XHg4NzhceEU4J1x4OURceEQ3XHhCQ1ZUXVx4RjJceDhDXHhDRVx4QzRPXHhCQWtkSVx4MDhceEQzXHhFQlx4REJceEY2VEFmXHgxQlx4MTVaUVx4QkZceENFXHhCMFtAXHhEQlx4QjNceEQ5XHhEN2BKXHhENXxceEMyM1x4RUFceEFGXHhDOCtceEJFXHg4NFx4Q0VceEEyXHgwRVx4OTdceEE1VFx4RTNceDhDTlx4QTJceEYzXHhGQVx4QTVceDlCXHgwOFx4REJceEJEXHgxNFx4QkNceEExXlx4MTZMXHhGMCtceDA0XHhBQVx4OTFceDE0XHhENlx4RDdceEFCKVx4QUZceDk3XHhERjUvXHgxOEdceEQzXHhENFx4RDlceEZGXHhGMlx4OTYpYlx4MEZgXHg4Nlx4MDFceEE2XHhCN1x4MERceENFXHgxMlx4QTE3YjZceDgwXHhFQSthXHhDQVx4QUJ4bFx4RTdlIzJ5XHgwRFx4REZceENFQ1x4Q0VceEFGXHhFMFx4Q0ZceEExWXVceEJFXHhDMSJBRlx4MUNceDg1XHhDOCxhXHhDQ1x4OEVceEFFXHgwNFx4QjBceDhCcV1ceDBDXHhFNFx4RjFceEJEXHhCNGBceEI4W1x4QjRvXHg5MDVceDA2XHhCRFx4QzdceDg0a15ceEI2SndceEE2XHg4MDhceEZDXHg4M1x4QzheJVx4MDdceEFGRXBceEMxXHgwMlx4QkNoXHhCRVx4RDJceDA4bVx4Q0NsXHhCM1FceEQzcmZceEIwOVx4RUNceDk1XHgxN0lBXHg4M1x4QjA3XHhDNFx4RkJceDg2Mlx4MERceDk4XHg4M1x4QzMkXHgwMFx4RkZceEY0XHhEMWAqXHhCNlx4QTVOeVx4MDJceEE5XHhFQ25MUDVceDdGM1x4RUFceEU2XHg5Mlx4QTFceDhDIF5bP1x4ODVTXHhCQnYieFx4OUFcXHhDMiZrXHhDM31ceEMxIjJceDhGVFx4QzBSR2pceEYyVFx4MUJceDgwXFx4QTFceDk2XHhFQlx4OUZQb1x4QThceEU4XHhBNVx4RTFBXHg4Qlx4RTZceEUzbGRceEQwe1x4OUFceEIyXHgwNTtceEM5XHg4MUlKMHBceDlEcFZceEFBXHhENSlceDE0XHgxNVx4QzJsXHhCOFx4OUFceERDXHg5RjdceEI1OUpceDBFOHBceEM3XHhENFx4MUVceDg0XHhEMkkpXHgxOVx4QTNMXHg5RiJGXHgxNFx4QjNceEE1LF1ceDBEXHhBQVx4QzdceEE5RFx4QTBceEUyMlx4MTJceEMwXHhEM1x4QTlceDFCXHhCM1x4QTVceEU1LFx4QzhceEE3XHg5Mlx4QzV+XHgxOXdceEJEXHhDMVx4OTNGXHgxOVBceEY0XHhGOFx4OTJceEQxXHg3Rlx4RTVceEFGXHg4Qlx4RDQrNFx4MEYtQlx4QzFbXHg5QTtceEI5XHg4Q1x4MDRceDlBXHhEMFx4QzdZTFx4QjEwYVx4Qzc9XHhDQlhceEUzZlx4OURceEM1OTZceEZEXHhDNFx4RTlceDA0IFxkXHg4OFx4OEFceEYzXHhBMjtceEI3XHhBNFpceEQ5ZHNceDg2RFx4QUFNXHhDQ1x4Q0N+OFx4MEVceDE3KFx4ODJceENDLSRceEEzQ1x4OUJceDhGN1x4OUU9Zj9ceEJBXHhDM3M5blx4QUNceDBBW1x4QzU8XHhGNVx4MDhFbmNceEYzXHg5RFx4RkRSXHhDRlx4RERceEYwU1x4ODhceEYwR0BceEVCRFx4RTJnXHhEMXZfXHhGM1x4RTd3XHgwNVx4MDVpXHhFN1x4OTQtXHhEQVx4ODlceEIzXHhDQlx4RUY1O1x4QkN6WismLVx4RTg7XHhCNHZceDhCNmQ/XHhCOVx4MURKXHhDN15ceDEzXHhGNVx4RDlceEYxWFx4OURceDFBWlx4OUNceEEyXHgxNFVceEZFd1x4ODg+WFx4QzFvU2pceDg1LVx4RTlceEZGSlx4RTVceEYxXHgxRVx4OUVlWFl1TFx4ODlceEU2YFx4QjcqTV1RXHhDMlx4QTkjXHhBRFx4QzdceDk4XHg4Qlx4RDFceDBDXHg4OHA2XHhEMEVceEQ5Y1x4RDVlXHhENUNceEMzXHhCNlx4MDNFXHhGQVx4OTNceDg4XHhCMlx4QzRceEQwNlx4MTZceDA5XHhBQ2lceEQ2d09ceEFEXHhGQVx4QjBKXHg4M1x4MEZceEI0XHhGRShceDFCIVo0VFx4RDFceDlGIVx4QURceEQxXHhGRlx4RTdceEExM1x4RkZceDhEXHhEOVx4MDVceDFBVVx4OUZceEU3KFx4MEEyP0kgXHgwNWBceEU3XHgxRFx4QjRvL1x4RUJceDgxXHgwMlx4RDFceEQxUFx4MDVceDhCXHhDOS5ceDA0XHhFNGZceDkxXHg4Ml5ceEU0XHhERGh8XHhDMlx4RTlJIFx4QjVceEJFXHg5RH4sXHg5QVx4MURceEEyZChvXHgwN3peXHhBQ1x4QkZKXHg5Nlx4RDI9Ij5ceEUzXHg5MCJceDE2eS5ceEUyMVx4QjdceEJCMVx4QjArX1x4RER7PVx4QkNEXHg5N1x4RTJceDg3XHhCNlx4RUJHXHhBNjwrKVx4RjF2X1x4RTJEXHhBRlx4MDRceDA0XHg3Rlx4OUQ/XHgxMVx4RThceDg5XHhBN1x4MDNyXHhCQ1x4Q0JceDlDXHg5NGpceDk1XHhDNX5ceERDb1x4OUJLXHgwMVx4RDNceEFFXHg4OFx4OUF6XVx4RTVceDA0XHgxN3ZtX1x4RUVmXHg4RFx4Q0NDXHhGMVx4QjJceDE4QVx4RDg5XHhGNFx4REFceEQ4XHg4Mlx4QkZGXHgxNVx4RjlceDA1XHg4Nlx4QTVceDFDT1x4OTgxXHhFQ1x4RkRceEVGXHg5RVx4OUNceEY4O1x4QkM1XHhBNnd4XHg4MVx4MTZYXHg4MDs4XHg5M1x4QkZceEM0XHhDRDBceEM3XHhFMSdceEQzXHhCODs+XHhDNSdceDg5XHgxMVx4RTVjXHhFMHBceENBXHgwQVx4QzF2XHgwQ1x4MENceEI4XHgxQlx4Q0ZNXHg4M1x4RTRceERGWVx4QjVceEJEXHhEM1x4RUVFXHg4N1xceDFDXHhBRlx4QTFceDk0XHhGMVx4ODlceDgwXHg4M0JceERGWGBceEQyaHxceDFDXHg5NFx4MDNceDhBKWZwXHhGNlRceEVGLFx4RDc0XHgwRU9ceDBCVVx4RkEzXHhCQ1x4OUE1XHg5NTNceDA3XHhBM3FceEZDZjl1XHhGOFx4OTdENVx4MTEuXHhCMGZceDBDeildWUJceDk0Jlx4MUZceDA5Mlx4ODRceDBEXHhFRlx4QUJceDBBXFx4RTVceEZBXHhBOFx4ODFtXHhCREVceDlDXHhDMVx4QzNceDg4XHhBMGg4RFx4QTVOXHhERVx4MTdceDlFS1x4MTVceDA5XHhGRlVmSH5ceEIwSlx4MUFceDAxQlx4QkZceEE4XHhEM1x4QTRzXHg4Rlx4RkZceEIyXHhBMFx4MTgjXHhBN1x4QTVuPlx4QzFceEFBNGJceDg1XHgxM1hCK1xceENEXHhGOVx4N0ZceDgyXHhFNFx4ODJ5J1x4QkIzZFx4RDlceEYyWlx4RDRceDE5XHhGQlx4QzB+XHhCRGpceEU1N11ceDFGXHgwQVx4ODdXXHhFQy1ceDExXHhBOVx4OTZceDBDXHgwMVx4OEJceEI1XHhDNVx4OUFceEJGS25ceEE1NEtEaTNceEMxU1x4QzNceEY4L1x4QkVceDA5MFx4RDlceEQwXHhDRFx4RDgqXHhDMFx4OUZceEIxKChfXHhCRlx4QUQnXHhFNlx4Q0FceEIxXHhGQ1x4ODZceDg0WVx4QjRceDAzXHgxRVJceDFBXHgxMyhceEFBM1x4MDNceEQ0XHhGNlx4OEU3Nlx4OUVWXHgwNVx4RjhceEEzXHgxRFx4QzZceDBBaVx4OUJVdlx4RjRceENGXHhDOVx4MDFceEFEL1x4MEFceEVEXH1LKFx4MUJceDA0XHhFNkplLlx4OEFceEJFXHgxNkNceDgyXHhCQVx4MEI6XHhFN2R3Qlx4MTBceERCXHhGMlx4MUJUL1x4RUJceDg2Olx4OURceERBXHhFMlx4MTBceEE3Tlx4MUZceEU3XHg5MVx4RkZceEVFXHhFRFx4MDhceDkzXHhBNFx4RUVceEUxUTB3Xlx4QjhceEFBXHhGN1x4RDBceDk5PVx4QjF6XHhEOUQia1okSFx4RjdceEQxWC5ceDFDP1duXHgxRHNeMUBceDgyXHhBNlx4QjBceEJEXHhFQmFceDFCXHg5MVx4MTFceEMyXHg4RWxceENBXHg4QVx4QTV5XHgxMjlceDlGXHhGNVx4QTFEWVx4MURceDkxXHgwQnstXHhCOFx4MTZceEM5XHgxRVx4QTdceENDXHhDRipceDA5XHhFQkUoXHgwRFx4QTg+aVBceENFfVx4QzhceEVFXHgwOVx4MDRceEZEXHgwMDFceEY2XHhBM1x4MUFceENFaVx4RENSXHhCQUlceDFEQVx4RERceDk0XHhFQzBBblx4QjlceEE1LzdceDAxWFx4QTVceEIzelx4MTgzKVx4RUJmXHgxNFx4MENceDg0XHhGNVx4OTdceEYxXHgxN1x4QzIkXHhENF9sXHhDOFx4QzVceEI0R1x4RkNFXHg5MGtceEYwXHg5Mlx4RDFceDBCXHg5MChtXHhBRlx4QUJceDA2NVx4QkRyXHg5M1x4MTEwXHgxNFx4QUVceDgwXHg4NC5ceEE2XHgwRFx4MERceDk0XHhBQXxceDhGXHhEQlx4QUNceDAzXHg5N3hceDhGXHhGNCN6XHgxMFx4MURceEIwXHhFOVZceDBCWVx4QjFceEY3XHhBQVx4MTlceEM0XHhBMGJceDFFXHg5NFx4OEJceDFGXHg5RCxceDkycVx4Q0ZceEYyOyhceDgza1x4MEVceDAyXHg4M1x4N0ZyXHhERT9ceDFEXHgxOFx4OEZlXHgwRFx4OTlceDEzXHhBNlx4QkJceEFCPVx4QjZceEREZn51e05ceEYxXHhEQ1x4RjZceEJDUlx4RENceEYwXHgxNlx4QTBCWlx4QTliXHhEOVx4OEJceDBGXHgxNlx4QjBsTlx4OUVceEYxM1x4MTlceERFXHg4OVx4QURceEFDcVx4QUNceDk4XHhCMVx4OTZceDk3Llx4QURqLElRXHhBM1x4OTFceEMyXHhFNlx4OEVceDEzXHhFOUNceDdGXHgwOFx4OERceERFJzApXHgxNFx4MDVceEJFXHhBMVx4RTZdXHhFM1x4RDdceDE2Vlx4QUFdXHhDMVx4MENceEFGXHg4N1x4OEVceEJGXHgwNVx4RjNceEFCXHhBMlx4RkNceEM3flx4OTdceEE3XHhBQVx4ODZceEUxXHg5MFx4RDgtXHhBMUpEM1x4RDNceDlEQFx4RDlceEE5XHhBM1x4OTZffVx4OTdceEM0P1x4QzhCdlFceEFFQ1x4RTVceEQwXHg4RE1ceDkyd1x4RUJceEUwOVx4RDhceDk2XHgwNVpceEMzXHhFQlx4RkJceEJCXHhEQ1x4Q0U2QiFrMlx4OTZceEY4XHg4MFx4MTldXHg4M1lceEFBXHgxN1x4MEN4XHgwQThUXHhCRlx4RjZceDdGXHhFRFx4MThceDBFQF1ceEZBXHhGMVx4RTJceDA0XHgxMVx4QjhceEQxV1x4ODFceDhEQlx4RjZceEZEXHg3Rlx4RkVceEMxXHhGOXgpSFx4RTdceEUyV1x4QjhqMEIpXHg5MVx4MUFceEVEXHhEQVx4ODhXXHhFMVx4QkEnJlx4ODNceDgyXHhDQVx4OEVceEU2XHg5Nlx4OTRceDA1bVx4REVceEY4XHhFRVx4QkFhXHg4Q1x4QzJZXHhBRVx4OTlceDhFMFx4QUJceDE4a1x4OUFceEE3XHhBNmdTa1x4QTJSVVx4RDlceEUyXHhBNVx4QzJceEQ5W1x4QTRceERGXHg4M1x4OEJceEU5XHg5MnVceEVDblx4QUU3cTZceDFCd1x4ODBiXHgwRUdceDg3XHg4Q1xceDA4ZVx4RkJceENBXHhDN1x4RkFceDgwXHhGOFx4RTc8XHgxMmZceEFBXHhCNzpwZyVsXHgxRlx4Qzg5ZFx4QTVceEY2XHhFOVx4MDdceDAxXHhDRnBceDkwd1x4ODc0XHhFN2NrXHhBOW9IXHg4OFx4OTNceEYzYiNceEFCalx4ODNeXHhDMlx4MDVceDE4XHhDOVx4RDlceDE4M3RceEVGXHhGMlx4MThpXHhGQVx4OERceEE5YFNXXHhDM1x4MTZceDhGXVx4QzhceEFDXlx4OTFwXHgxMmJceERENUZceEEwXHhFRFx4QzFceDE3IFx4MENceDgwXHhBMVxkXHg4RFx4RDFceDlBOVx4RDJceDEwLmBTXHhEMVx4QzdceDhFIVx4RTVceDAwXHhGNVx4ODZvXHg5RFx4OTZceEM4TVx4RTIiXHhFQ1x4ODJceERFXHhBRFx4RDVceDExd1x4OERceDkwXHhEQlx4ODZeXHhDRFx4OUFceDE3XHhGQlx4RDRceEQ0LVx4ODhceDlEXHhFOFx4OTBceDhCdFx4ODQpXHgxNlx4QTJnXHhGNlx4MTJceDE3UFx4RDQ/XHgwNVx4QkNceEQ2R0NceEVCXHhERlx4QThceEZBXHgwMFx4MTZceEUzXHhCNFx4MTBsXHhDRC1ceDEwXHhCQVx4QjJceEZDc3RceDA2XHhEOFx4Q0JceEE5Jlx4QURceEI4aFIiflx4Q0VceEJGXHgxOXsyXHgxN1x4OEFceENFXHhCRVx4OEUtXHhBNlx4RTBeXHhBNVx4REIsXHhEMTlceEFFdFx4QjdceDlFdE0tY2g1LnlceDk4ZFx4RDNGXHg5OURceEFEXHg5Q1x4OTAjXHhEOTZuTyFceDhFa1x4OUZceERDMn1ceERGXHg5Rlx4Q0RceEEyXHhFQVdceEY4XHgwMGFceEY0Yy1ceERCJ1x4RkFmNEJceEUyWFx4Q0UrXHgwNHFkXHg5OV9ceDA1Xm9ceEVFfFx4QUZeXHg5NVZceDg3XHhCNlx4MTFceDk1XHhDOVx4N0ZwXHhDNlx4Qzg3XHhGQlx4OThceEU2XHg4M1x4REU5XHhDRTtab1x4MDZceEE1X1x4OTVrXHhDRlx4QUZceDE5XHhGQlx4RjZceEQ4XHhEOXppXHhCOS9ceEZGUFx4QzBceENGXHhDMFx4REJxXHhGOFx4QzRceDg5aFx4Q0VceEQzXHhBQlVaeVx4MUMhKTJceDg5dFx4MUFceDFCQFk1XHhEMlx4RjhceDFESlx4MEVceDBGXHhBQlx4MTdceDhDXHgwRntceEU1XHhDQ1x4OTBJXHhCNF0lVFx4RDlQXHg4NWdyXHhDM1x4N0Y7XHgxNSFceEM0XHgwNlx4QkFceEM0XHg4M1x4OEFZXHgxQWdzVFx4RjFceEY1flx4RDBceEVEXHhCQVx4MThceDBCXHhGNVx4QkFceDkxXHhDNjJBMkZceEE5XHg5NFx4MThceEY3XHg5RFx4ODZbezhceEJBND5ceEM4VE1ceDlEXHgwRF1ceDFCXHhCRVx4QjdceEVCXHg5Mlx4Rjl5XHhBNVx4QjRceEIxaVx4RTJceEQ0IEZJXHg5QX5ceEI4bVx4OTNceENGVlx4RDJpXHhENHhceDFEXHgwQ1x4RUU8RVx4RENceEM5WVx4MUNceEI3J1x4ODBceEFFXHhGMVpHXHg5ME1ceDlFXHhDNVx4RkJceDkwXHhCRlx4OTNHXHhGN1x4RDAwXHhFQ1x4RDdmU1x4ODhceDhEXHhBOFx4OTIsXHhFQVx4OUZceEYwXHhDMFx4RTBCXHhCQlx4RDlceEFCOldceEE1fVx4MDJceDlEXHhBMVx4RDlceEEwXHgwNVx4QTYzXHhERnNceDk1LTQgXHgxRF9ceDBFXHhFMiBMXHgwMSVceDE5XHhGM3t7XHgxRnJceEZCYFx4RjFceDgzXHhCMlx4OUIhaF9ceDlEXHgwQVx4RTJceDFFLl9ceDBEXHhGNVx4RjJzKVx4QzhWXHhEQVlGXHgxQVx4ODZpXHgwODpKXHgwNlx4RkM6STtceEI5XHg4Qlx4QUZvXHgwOVx4RkFceDFDXHgwMFx4RjRceEEyXHhCN19QXHhBNVx4REYkZFx4OURgXHg4MFx4RDVceEFDP1x4Q0FceEExNUlceEE4XHhDRWxOXHhDQkNiXHhDQjFceDA0cVx4RTVceDBEXHg4RC96YWIhXHhGRDlceEQwXHg5Qlx4RkNceDg5XHhBRVx4MDBceDAzXHg4QVx4MDNceDFGXHg4QTlceEI5XHhBMVx4OThMJVx4MDBceEM2XHhBRVx4ODZceDA0Rlx4RjFYP1x4RTdpO3xceEYxd1x4RTJceEI5eDBceEUyX1x4OTRceEU4cFx4RDUrXHhFQzhceEVCXHhBQVx4QkNSXHg4Mlx4RUQsXHgxQlx4QUErXHg4QVx4ODdQXHhGNkZgXHhFMGA5XHhEMFx4QjlceEYxXHhERVx4MTZpLlx4QUYtM1x4MUNceDFBeFx4RDNeXHhFMWciXHhDM00jXHhFMTFceDE4XHg5Mlx4MDg0O0tIaFx4QThceEI4IFx4QkEuXHgwNVx4OEU4XHgwM1x4MDNceEVBclx4OTBceERFP1x4QUZGIFx4QTdceERDMlFceDk5XHhCMi9ceEI0WFx4OUVceDFDXHhFNlx4MDgkUVx4MTkvXHgxMlx4RDlceEZCXHhFMVx4REVceEIwXHhCRm9ceDlCXHgxM34jXHgwRDVceEUwZFNceDA2LWl8XHgwMWxceEIyMFx4RDBceDE0LFx4OERceDE5WGlceEI2XHg4RFo4ZWpceEIzXHhGQVx4MUYhXHhBNFx4MDFceEE4WS5ceENFXHhFMlx4MTRceDkzXHgxNFx4QTklXHhGRUtceDEyYilceDlCXHhCN0Q9XHhCMFx4ODZcXHgxOVx4OTNPejJceDhFJ1x4RkNPQFRceEREMlx4OTRceDE4XHg4QTJjTlx4RUZceEYwdFx4OThGbFx4MTlceEJCXHgxRXNceEU5XHhDNyZAXHhFMVx4QjlPXHgxN1x4MTdceEY5XHhFMVx4QjFKXHhGOVx4RDE8VzhceEM5XHgwRUdceDAzXHg4Q1x4OERceEZBXHg4RVx4RTRceDlDXHgwRVx4RDFceDhEXHgwQjhceEMyXHhEQW1ceDBEeVx4MUQ/XHg5OFx4MTVceERDXHhCMFx4ODNceEIxMT5ceEU3XHhCNE9ceEZGUnNceEQ3ZVx4OUN4ZWghcVx4MENceEY5XHhDNFx4QkRceDEyUlxceERGfVx4MEFnXHhCQlx4MDVoXHgwOFx4MDYmTVx4MTRhXHgwODBceDgxelx4RDhceENCXHg5MFx4QjlceEVDXHhGNlx4QTF2XHg3Rlx4OTZceDE3XHhBMFx4MEU0XHgxQj5ceEFFXHhERXdceEU0Qlx4QTdCXHhGMFx4RjAkXHgwRlx4QkFceEY4XHhBMElceDgzUlZceDE5XHhERVx4QzJdXHhDNFx4OThceEYyXHgxQ1x4RkVceEFCXHhFNW5ceDlFfn5ceEE0XHhCQVx4MTFXcEtceDhCXHg5Q1x4QTBZXHhFRDtceEE0XHgwOCFceEIzYCdvXHhCNipceEFCXHhCRlx4ODQtXHgwNiY8XHhFQ1x4OEZsXHg4MklceDg3dVx4MDJ5XHgxRFx4OUZceDg5RUd8UWNceEI1IFx4RTlceDhBXHgxMFx4MDdceEYwXHhERkFceDAwXHhCNU1ceDg1XHhERlx4QkVceEIxXHg4RFx4OEJrP1x4MUFPTFx4QUNceDk3b1x4MTBceEI3XHgwRFx4OUZceERGWVx4RThceDg5XzZTXHg5OFx4QkJvXHhFN0hceEQwYzFceEVBJFFceDE4XHg5Mlx4QjNceEY5IFx4ODlpXHhBQU95XHhBQUJlXHhDOStceEQ0MUpsXHgwQ2tceDE4VVx4QzRceEU4XHgwOHc8SVx4RjZ9d1x4RDFceEUzXHhFOHJWXHhFRFx4QkVDNFx4MDZceDg3U1x4QjlceEYyXHhCNXpceEMwXHg4NFx4RkZ2XHhCNVx4MDBceDlCOlx4Q0JcXHgxMVx4MDhNXHgxRCJgXHgwQVx4QTVceEZGXHhBNy9ceDdGVlx4RkZceEZGXHhDM1x4RkZceEZEXHhFOFx4ODNceDk1XHhDMldceEMwRSNmV1x4QTUhZ1x4ODlceDhGXHhEQkZceDFCXHhBRV9ceEEyQVx4MDNceDE4XHg5OFx4Q0ZceEJGXHg5OHtceEM2XHgxRHVceDk3XHgwQ3F2XHg5Nm08XHg4OFx4OEIyXHhBND5ceEQyXHhDRlx4MDMtXHhBMzhceDE1VzVceDgxZUtceEJFW1x4QkJ+XHg5MFx4OUZCXHg5Nlx4MEMiLDdceDhEXHg3Rlx4RURaI1x4RTdceDE0Slx4MUFceEU0eVtceDk5Zlx4RjhEXHg5QVx4ODJceEYxSVx4RjBIQVIrd1x4MTReXHhBNVx4MDlceEIxXHhGOVx4QTRceDEwJFx4MTU/VlFyXHhDRlx4OTBceEVGJCRQIFx4QjJceEIxOFx4MUFceDFGXHg4OFx4MEZsa1x4RUVMXHhGRm9ceEQ0XHgxMFx4OEVceDgyXHhENU1ceEYxeDhceDBBXHhCOVx4RDVeUXksXHg4QWEuRFx4ODRCXHhGNV9ceEU4XHhFNlx4OEZUXHhCNFx4Q0RceEY4XHg4Rlx4QjJceEI0eFx4RjArIkZceDA3XHhGNlx4MTU4XHgwOT1ceEVEbHx2XHgwOFcvXHhCMThceEI0XHg5Q1x4ODhceDA0UExceEUyZlx4QjcoXHgxRlx4RkIqMFx4QTFcO1x4ODg/XHhFOFx4QkJceDk3XHhFMF1ceEUzXHgwMFx4QTFceEFFPVx4QkMsXHhDQVx4RDdceEYxXHgxMVx4MDBceEQzXHhDNFx4OEFceDgxOFx4QzlwXHg5RnlceDg3QEpfXHg4NiJceDg1OntceDhDXHg4OVx4MDJceDA4XHgwNzFceEQ5XHhDOU5CXHhBOXtceDhCXHhFRU9ceEU1X1x4MEZFXHhBM1x4QjVceEY0XHhGM1x4MERceDlFXHhGRVx4ODRceEQxZlx4RDdMXHhBNVx4RUFceDlDRlx4QzdceEIzXHhENVx4OURJMVJceEMwXHhEQVx4OTZceDA2XHgwRVx4MDd2XHhEM1x4OUVceDBDXHg4NFx4OUZceEQ4LVx4OURceEM0XHgxRVx4RkNceDEyXHgwQ1x4MDF6dlx4MERyXHhEN1x4MThceDAyXHgwOFx4QkZeN3xceEI1XHhCQ1x4REZceDk4O1x4RDZceDEwXHhBNFx4MDBbXHg4OVx4QUMnXHg4N3EiXHhERVx4MDAqdlNceEI3XHg4RVx4RTJceEI0XHhGNjNceDA5XHhDN1x4RDBceDk5YDNceEM5XHg5RVtceEMzXHhFMFx4ODhceDgyXHg5Qlx4OTJceEFGS1x4OEVxXHg5NFx4RDNceDEyXHg4MldceDA2XHhGQ0pceDg0XHhDODxceEQ1XHhGRVx4QzZceDhFPlx4QkI3XHg4MjhceEExXHgwRFx4OTRceDdGXHhGM1x4ODVceEEwXHhEQ1x4QUZceEREXHhDQlx4RjRceEJCXHg5NHdceDE0XHg4MEE3XHhDMFx4QkElNVx4MENceDEwXHg5MlVceEJCXHhEMVx4QjRTXHhCM3lbXHhEQihbXHhBOVx4RjVUNFx4QjJceDk4MkxceDBFXHhCMCZMXHhCRTdBcVx4ODdceEM3W3tceEY5XHhGMVx4QTRceEE3XHgxMlxceDlCT1x4RkZ1XHhCMVx4MDZWJSJceEExXHhBQlx4ODUsXHg5Rlx4OEVceEE0XHhFQ1x4OUNceEQzJVx4MEVceEZFJlx4RkVceDE0XHhEMmROXHhFMlx4REFceEQzXHhENVx4QTdceEYzXHgwQnVceEVGXHhEQSVceERDXHhBNVx4QTVceDg4dmppXHg4NFx4RkZDXHhGRVx4QTBceDlGXHhDN1x4OTd7SVx4RDJceEM2XHhBRFx4RTdxVVtceEZDXHg5MTtceDg2XHhBMixeXHg5Mm89XHg5M1x4MEYiXHhGMVx4OUNZXHhCMFx4QThceEMwaDRceDg5XHgwRE9ceEZFXHhCRl9ceEM4UEhceEQ5XHg4Q1x4OTFceEQxdlx4ODhceEY2aFx4QzdceEI0Ulx4OTJceDlCXHhEOFx4OTZceDg4RFx4QzJpOVx4QUQiXHhFOVx4RDN3XHgxNlx4RDR0XHhGOVx4QTZceEFEflx4QjlceDA2WmlceDBFXHgxNCBtXHhDM1x4OUVceDlGelg2XHhCMVJceDExXHhDOCJceENDXHg4NVpceEI3SCxceEE3Z1pceDlDLThceEQxXHgxQVx4Q0ZceEEwXHhDM1x4QTFlXHgwM1x4QURceEQ5Xlx4OTZpP1x4ODZceEE2XHhCMVx4OTR4XHg5N1x4MTJceEMzXHhFMVx4MEEzfl9ceEI3XHhBNWY2XHhCRW1VXHg4MFx4QjBceDlFMlx4MTg1XHhGQVx4OUF2XHgxN3BceEUyXHgwNHx+YCFceEM1XHhDRUJceDk4Q1x4RTNceDE1XHg4Mlx4QTlceERGXHgwQ18jXHgxMlJceDE5XFx4MDkyXHhBNFx4ODFceDA2XHgwNGQqXHhDRCBceDFDXHg5MVx4OEZceDg3cnFceDE3XHhEOFx4OTM3XHhEOVx4RThceEQxXHg4NFx4RkRceEIyXHg5NVx4RDl6XHhGQ1x4OTd4b1x4ODBceENGZVx4QjZceEJEXHhFMndceDBFXHhBOVx4MDNceDEzXHg4RjhceEI1XHhBMVx4QUNceEVGOlx4QUZceEJFXHgxQ3R2XHgwOVx4QTAhbSElbV1ceEI2XHhCMnNceDk1QyVceEI1XHhDRVx4QzBudlx4ODYhbVx4ODEgXFx4QkF6XHhFNjFfXHhCQ1x4MERbXHg4RTJceEZCSmxceEFBaGkuXHg5OHYvRlx4MThceEExXHhCMFx4RjUxQVxceEU3XHgwMlx4RkV1XHg4Rlx4MURceDBFYHxceENGXHhCRl9ceDlBXHhEN1x4QjRmXHgxMFx4ODR8XHhGNlx4RUU9XHhBM1x4MDUwXHg4MVx4ODVceEJBXHg5NFx4RUVceEYwXHg4Qlx4RjdceEVBXHgwRVF5alx4Q0JvPlx4RjdiXHhGM1x4MTFceDlEX1x4QkNceEI5YXxceEZBXHgwNWNsXHhFRVFceEU1XHhCNStceDEyXHg4Mlx4MTNLXHhDNFx4QTFnXHhERlx4MURceEEzXHhCNlx4QkJceERGXHgxOVx4QjRIXHhBNlx4RjZceEQ2alx4OURCXHhEMlx4OUQoXHhCNFJceDExXHhDNlx4OUFceDhGXHhCMjtceEU4flx4RThceDBFJ1x4RTRSdVx4QTlceERCXHhEQ1x4OTlceDA2XHhENGFceEMyXHgwOVx4ODRceEI2XHg5MVx4QUFceEVCXHgwMFx4RENceDFBXHg4RFx4QzdceEI2XHhEMFx4MTRceERGW1x4RkZceEQ3XHgxRFx4QUVXXHhBNFx4RDFceDAwXHgxMztceDg1XHgxQjBceEM3XHgxOFx4MDhiXHhFRVx4QTdceEVEXHhBNlx4QjlceEI4XHgxMlx4RDdceDg2XHg5RUdceEJCbDNceEFGXHhFMFx4MUNceDE2OVx4RkFceDhBOnMzSypceEVGXHhGQ1x4RjRceEI3NVx4OTgnXHhGQU1ceEJCMFtNXHgxQl0qXHhBQ1x4RDFgXHhDNDpceERGXHgxQVx4QzRceDlDXHgwQVx4QkVceEY5XHhGRDRzXHg3Rlx4MUNceDBEXHhBOCJceEY2XHhGOVpZXHg5OVx4QUZceEM5XHgxQlx4OTAyZFx4QThWXHhFOFx4REZpXHhBNmFceEY2XHg4OFx4OTU5Klx4RURceEIzKFx4OTFceEMwXHg4RVx4QjNceDkzXHg4RF1ceENGQ1x4RjFceERESVx4MDF4XHhCRlx4MEZceEExcWhceDg0eVx4N0ZceEZDXHhGRFx4QTgqR3pceEZEWFx4QjRceDE1c1x4Q0NceDA5aUlceEM3XHgxNFx4RjFceEI2S1x4RTJceEY3XHhEQlx4RjM1XHhDNlA9XHhDRVx4ODBceEU3NHF4e1x4MUFtXHhDNSxceEVDXHgwRnJgXHgwRlx4QjgtXHhDM1x4MTB1XHgwMFx4MTdceDdGXHg4M01aXHhFNlx4QTRceEQzXzNceEIyXHgwMFx4ODFuXHg5M1x4ODhceDhGXHgwQlx4RERceEVFXHhFQ1x4RDRceDk5XHgxQ1x4OTA9XHg5Qlx4QTVceERCXHg4NVx4MTZceEI5XHhFMVx4QUM6XHgwNlx4MDhWXHg5MlNceEYxXHhDRS1ceEI2XHhDNjVceDg5XHg5MldceEQ5VVx4ODc5XHhFNVx4MTZceEUzXHhBRlx4RERpO1x4RDNceDE1XHg5M1x4ODEgXHhEMGNceEU5clx4RTVceDA1LVx4RENceDkwZVx4QjdceEQ4XHhCOTlceEQ0XHgxQ1x4QkVceEQ0SVNceEM3fFx4RENeXHhBM1x4QTNceEJDXHhDRlx4MEJceDgwXHg5N1x4RjZceERCXHgxRlx4OEFceEFBXHhDRjZceDBCKlx4ODJ4d1x4RkRceERGXHg4Nlx4RTB3XHhEOVx4RUFceDgwPEIzY1x4QjJceDk5XHhFNlx4QjBWJ1x4RTBceEYwXHgxOSpceEVDXFx4QzRceEY0THpceDlDXHg4Nlx4RURceEZCXHgxRmRceEY4XHhBNFx4REJceDA2XHhDRCU7XHg4RVx4ODlHXHhCM1x4MURceENGJVx4RDVEXHg5MDNTOUlceDA2WVx4RjZceDg2XHhEMSJceDdGXHg4OFx4MTJNXHg4OXpceEEwXHgwOVx4MDRceDE4OFtceEI5XHhEMVx4RTZceERGXHhBOFx4RUNceEM3XHgxQ1x4OTZwXHhGMVx4MDFceEJDXHgwQVx4MTdceDA3ZFdceEFDZDxceEIxXHgxRThaXHgxMmRceDk5XHhFN1x4ODJceEYyXHhFQ1x4MUJceEQ0L1x4QTRrXHg5NVx4RThceERGakxceEFFXHg5NVx4RjYqXHhBNFx4RUVceEY3Slx4OTQ8QVx4RDZceDEwXHhCN3lceEE5XHhGMHhceEU3XHhGOVx4MERceDAxXHhERFx4OENBXHhFOVx4QjdceEEyXHg3RjZceDg5XHhDMlx4MTJceDE1bjtJNFx4RTNceEM5JTpVdT1DXHg4M1NceDA3ZG9ceERCOVx4RjFceDg2ZT1ceDg2O2BPXHgxRFx4MTZceEIwXHgxNVx4OTlceEU2XHhDQy1ceDgzKlx4MDZqXHgxRlx4RTdceEIzXHgxNHtceEZCXHhBRVx4MEJyXHg4N1FNXHhEN1x4QUJcXHgxQVx4QzdceDBBOFx4MTBceEY1XHgwRFx4RTBceEQzXHhEMFx4QjFoXHg5N1x4ODZceDEyXHhBOVhiP1x4QjEuXHhBMlx4RDBDXHhBQVx4ODlceDhBXHgwMXtceDEyXHg5QVx4Q0RceEMyXHhFRHpceEU1XHhGMFx4MDFNXHgwMUR8TVx4RjVqb1x4OUNceDExdFx4QUVceDgyXHhGQ1x4QkJceDFDa1x4MDFceDBGXHhFNSxceDhDXHhGRFx4QzUgXHhDQVx4OEFceEFEXHhDQzhceEM3XHhFQSclXHhGM1x4RjFRXHhBMFx4QzF0XHgxMjY7Ylx4ODRceEQ4LFx4RjVNPlx4MUFceDk0XHhEMlx4OTdIWGQ4XHgxOVx4QUZceEE2XHhCNVx4MDQ8XHg5NEh8XHg5QVx4QjBceEE3Xk1ceEE0elx4QkNceDBGaTdceENEWkdceERCXHhBQ1x4RkM1X1x4QzdceEY1XHhDMiYyXHgxMGBceDk2XHhFMVx4RTZceEUwXHhBOXt0Qlx4OUNkXHhCOFx4MTNceDBGXHhFRFx4RkVceDE4XHg5OCZceDFEMWxceEQ2U15ceEZFXHg5Nlx4MENceEM5XHgwN21ceEUwXHgxQVx4RkU3XHhCRVx4RkVceEVDVFx4OTJceEE2XHhGNyFceEY2cFx4QTVceDg4XHhBOFx4ODIvNDVBXHg4OGomXHhFNlx4Rjd3XHhDRjVceEM4XHhDNVx4QTVceEFFYzhceEZCWFBBXHg5N3BceDFGLktceEU3XHg5MyU8XHhBRFx4MDdceEQ5PFx4RUFceEEzRFx4RDNceDkxXHhBQ2dceEI3XHgwRlx4RjEjXHhENmJceDdGd1x4Qjk9dFx4QzE/XHhBNy9ZXHg4MVx4OTlceEIzXHhEOVx4MUNceDlCXHhGRVx4OTJceEVGS1x4MTZMXHgwRTZceEJGXHhFRlx4RkRceEM4R2dheUVceEQ1eVx4RDZ2XHhCQ1x4RDZceDkyJiJmXHg4RVx4OEVEYFx4RkNceENFXHgxOFx4QjIzLFx4MUNgXHhFRVx4OUU+InRceDlFRSZceDg5XHhCN2NceDlFXHhCMGZMXHhCRlx4REJLXHg4MElceEFEXHhBRVx4MTNRXHhCMVx4OENsXHgwOVx4QURqXHgwRVx4QTNceEEzXHhCMVx4ODlnXHgwOFx4QzZJelx4QThceDk2XHhDM1x4RjBceEQ1TXZceEVFXHhGOFx4RUNceENEXHg4MVx4Q0FceDFGXHgxRVx4RUZceDFDP1x4RUYgImNHXHg4N1x4RTJceEQ4XHgwRVZceEI2XHhENFx4OEZceEE1Z0BkXHgxRHVXXHhEMm5ceEVFXHhDOFx4OEJceEU2XHhDM3ZceDA0bEdceDgzLURceDBDXHhCQlBceDExXHgwMktIN0wyb2RceDlCQFx4QjMzXHgxQVx4RDJ2XHhERFtceEM1XHg4NVZceEFEXHhFRlx4REFceEFGXHhEMF9waDRJXHhCRFx4MTdceDlBXHhGQVx4OEFceDlCXHhBQVx4MUNceDFGZ1x4RjdhXHg4Rih3XHgxME9ceEVCXHhEQVx4QzZceDlBMVx4MER1XHhDM1x4RDJceEIyXHhCNFx4OThceEExXHg4M2pOXHhDNUlceDA2VVx4RDZIXHg5Nlx4ODZceEQ0eEdCUlx4QkNqZVx4REZceEFEXHhDNlx4MEFceERFKFx4QTJceDg1XHhBNVx4RDRceEYwblx4QUFjXHhGMFx4MTNceDFBXHhDRVx4RUFceDA2fFx4QzlceEYwXHhENFx4QzNceEEwXHhEOFx4REFceEVGXHg4MFx4RTJceDhEXHgxMlx4QkVceDdGXHhCN0RhXHgxMiMobFx4RjdbYVx4QUZKXHgwQWxocVx4OUZceEVCXHg5RWU0XHhCRn5ceDBBXHgwMlx4OUY7K01xXHhFQUw1UVx4OUZceDhGXHgxRVx4MTQxX3NIM1x4Q0ZceENDXHhFMFx4OTRceDk0V1x4QzFceEJGblx4RTRLXHg4Qlx4Q0ZKXHhFNEpceDE5XHhDRVx4RkZceEE1XHgxMlx4RTN3XHhEMFx4RjFceEFDU191XHhEMlx4MDVceEJFQFx4MENceEYzXHgxMFx4RDVceEE4YmtceEQxTVtSOFx4OERceEE5XHg4RFx4Qjk1UVx4RTZNXHg4MSpzXHhDMU5ceDg0XHg4OVx4QUVceDlBXHhFMlx4QzBceEY3XHg5Qlx4RjQxXHhCOV1zXHhGRVx4OEMuXHhEN1x4RURceDBFXHgxNFx4QjhceDhCXHg5M1x4QUNceDEwYlx4QTJceEU5YzNceEVGYXg7bzlOXHg4ME5ceDEyXHg4N1x4OEJwXHhDOWJceEQ3XHgxRlx4RDBceDFDUHdDQi5ceEQ4XHgwMXtceDFGXHg4Mlx4OTkgXHg5NzJceDEzXHhCOGxWQlpceEQ0MisjXHhFNlx4RDUoXHhEQkpceEQ0VnpeXlx4RTZcXHgwOFx4N0ZceEUzXHhFMlJceEM4XHhCQlx4RTFceEJBXHhFMVx4QjZceEZDXHhDMnNceERDPHlceEZGVVx4OTVceDg1SXxUXHhBOFx4MDdceDlEXHhCN1x4REJceEMxXHg3RnwvXHg5NEQsXHg4RGE+LVx4MUVUXHhGOVx4QjVceEE0XHgxM1x4QTZceENGXHhFRlx4RkVceDE5e1x4QkZceDFEXHhERlx4ODJOXHg5RFx4QjlceDhBIlx4MUJceEQ0XHgwMFx4QTQ4XHhCMVI6W0pceDBCXHg4MCJceDg3XHg4NFx4MUJceDBCXHhGRVx4MTJceEVFOUdceENBXHhFMVx4OEZ+XHhFMlx4Q0ZceDBGRSFceEIwdl5ceEE3SVx4MTdceEZFXHhFMW9ceEY0JVx4OEFceENCXHhENVx4QzVceEMxXHg4Nlx4QURceEQ0XHhBNV9zO0lpXHg4N1x4RDcxJ1x4RDJceEFDXHg5Q35ceDAyXHg4Q1x4MTZwUFx4Rjd8XHgwQlx4OEEhOVx4MTRceEQ3XHhGNVx4RjVceDFEXHhENlx4ODFPXHhGNnNceEREXHgxM1x4ODhceDk1XHhDRlx4RjRceEZCXHhGMmhceDhGL1x4MURoVFx4RUJceDFEcVgheFx4QjFceEFGXHhBMlx4QjJceDlFYENceEFGXHhBMHpKXHgwN1NceDE5XHhGQ1x4RUVceDkyXHhGMVx4RjYzXHhCNFx4ODRceDA2MFx4REFOXHhCQ1x4QjFiXHhCRlx4QkFKQFx4MDRceDExXHgwMHd0XHhBNiFceDlEXHhCNVx4OEJMXHhFMFx4OUU1Wlx4REVceEI0Jlx4MDd7d1x4QjNceEREXHhCNVRJXHgxMVx4ODJceDhEXHhFNFx4RDdceDk1VndceDgxXHgxMVc2XHgxNXIxXHhDMTxceEQxXHhCOVx4Q0RLXHg4MVx4MEN0JFx4OTJYXHhFRE9ceEE1XHg5QSZceEVGLVx4QjZceDBEXHgxRFx4RTlGXHhBOEt5ZVx4RTRceEVEXHgxMkVceDlBXHg4OFx4QzhceEQ2TFx4QUJxXHg4QiZceEE5XHhFOVx4OENceERDXHhBRGRceEI4blx4QzVQXHhCRVx4QjVceEY5XHhEM3h9XHgwOVx4OEZceEFDNlx4RUVceDFEXHhFQlx4Q0UvUTVBXHhGQVx4QkZceDA5eVx4RjNdbVVceDA1XHhERCtceEFCXHhCMk4/ayFpXHgxNzRceEFDaW9ceEFBaVx4QzBAXHgxMHRceDFBalx4QTVceEQ3XHgxNyE+XHhBQ1x4RkJceEM1XHhFMjBsXHhEMUxceERCXHhGRGdceDFBXHhERlx4OUROXHhEOVx4MUE1XHhBNFx4RTZceEYwKFx4MDdceDg5XHgwOVx4RDhceERCXHg5Nlx4MTk+XHhCMlx4OTRceEIwXHgwOFdceEEwXHg4NFx4MEVxXHhCNFFceDFGd1x4QUJceDgzXHgxMlx4RDBceEM2XHhCMlx4MDl2XHhCRVx4RTF+J1x4RUVceEE2WkZcXHhGNypfXHhBQ1x4Q0RceEU3Vlx4RTVLLjFceENCXHhDNlx4Q0NFXHhGMVx4OTlceDA1UC9ceEFCXHhGRlx4QzNceDAzXHgwNVx4MUEpXHgxRldceDE3OFx4QkNceEZEXHhGM1x4MTBceDlBXHg4MFx4RjlceEVDXHhCRWFceDk0XHgxRStceDg1XHhENVx4QkJceEU3OVx4RTdceDBBXHhCQlx4QURRXHg5RSkkXHhBMFx4QkJWLlx4RkVceDk2XHhBM1x4QzdceEI2bzwsXHhGMFx4QjU6blRceEE4XHhEN3hceDEzVkJceDE1XHg5Mzk0Nlx4QkFceENFXHhCNlx4QzBceEMxL1x4RUJEM1x4MThceDFDXHhCNVx4MUFsMHdceEFBQVx4ODFceDkyXHg5NiJceDg2RVdceEE3Slx4MTdceEIxXHg5RUNceDhCV05ceDg4V1x4OEFceEZDXHg5RVx4MTlceEY3XHhDOVx4OTJceDFBXHhDRFx4QkFceEQ1XHhDM1x4OEFceDk1XHhDMFx4OERceENGRnZceEFEXHhBOFx4RDVceDBFXHhCMlx4MURceDAwPWJKXHhDQlx4RTNceEQ5XHg5QjxceDgxXHhCRFx4Q0RceDg5blx4QTJceDkwT2NceEY0blx4QUFceEU2XHhBNE9ceEIwXHhEQVx4Q0E+XHgxQVx4RTAyXHg4NFx4QTZceEZCXHg3Rlx4RjMpWkY4LV5rXHhCRVx4OEJceEY2XHhEQVx4MTVceEU4XHgwQlx4RURceERGXHhFRCtceEQ3XHgwRl5ceEQxXHhERFx4QzFCIVx4QjhceDg2XHhERlx4Q0VceEU4LFx4RkV5XHg4Qlx4QUZceEIwXHhCRmxXXHhEN1x4ODgqXHhEOFx4ODIyXHg4Nlx4Q0NceEJFbSlMNlx4RUNceEIwXHgxRS9lXHhBMlx4RTh6dnFceDFCXHgxNlJceDFFXHhBM1x4Q0R9blx4RkNceEM5IFx4QTRceEE3XHhFMlx4QUVceEUwJ1x4RjFYXHgxMlx4QzlceDgwSVx4RDZxV1x4RERceDlBMU4vXHhDMz1ceEVEXHhDM1x4RUVceDkzLVx4REZceEE2XHhFN1x4OTAtdl1ceDBFIk5ceDBGUGRRXHg5OWg8P1dEXHgxOFx4ODkoXHhCNFx4Q0YkLjhceEE2XHhBM1pceDlGSW8wXHhCMFx4QjhceEVEdVx4RDJaP1x4QjBceDE2XHg5Qlx4QkFceEQ4fVx4ODVceEYwOFx4MTNceDEwXHgxMldceDA3XHhGNFx4OUEkXFx4QjdIfVx4OTNceDgyM1x4MUNceDgwXHhEQ0dceEYwPVx4Q0FceEVBXHgwMnU3XHhDMVx4MTc1XHgxQlx4RDVceDBEXHhGNlx4ODh6XHg3Ris7MVx4QTdceEY1X1x4RDhceEQwXHhBMlx4N0ZceEQ4XHhGOFx4QURceDhBXHhDQlx4RTEhXHgwOFx4OURceDkyXHgxMVx4MERceENCImdceDgyXHhGMVdceEIyXHhCRlx4MDZceDkwXHgwNFx4OTN+XHhGRVFFS3hceDA0XHhDN1x4RkNceEMxXHhCNlx4QTJceEU1XHg5RVx4OTZnXHhFNVx4RjhceDgzXHhDM1x4OTZnXHhDRlx4QjZ5XHgxNyFoMShceEZBXHg5NFx4QjZceEY0XHhGM1x4QUJceDE3XHgxRVx4MThgXHhCNFx4RENtWEE6d1x4OUJceDEwZVx4RDhceEUwPnpceDhEXHhBM1x4OEJceEQ2XHhCMlx4RkJTNXtceEYyXHhEOVx4MURceDEwXHhBQUo4XHhFMFNceEEyR3xceEVBXHgxNl9ceEUzalx4QTNceDg1XHgxMFx4QTRceEEzIlx4QTYrXHg5MFx4RTdceEU0V1x4OUFceDg1eVx4RjFceEQ3Z1x4MTUqXHhBNUJceDgyXHhCRFx4OTFceEI3XHhERVx4QTgqOVx4QkR1XHhDN21ceDlGXHhBRkVceEVBXHg4Mlx4QzJceDg0blx4Q0VceEFDW3FceEU4XHhGOFx4QjJceEY5XHgxRlx4QkRmXHgxRFx4QzhqXHhGMDphSzYyLVx4MDlceERDXHg5Q1x4RUVceDgzXHhEQllsXHg5NFx4QUZceEQzXHg5QVx4QkIyXHhFNEEtXHhGQXhceDgxPVx4QjAqXHhBMVx4MENceENEKCtceDk4XHhCNlx4QzlceDFFXHgwNFx4OUQiXHhEQlx4QzkrXHhGNVx4MTY/XHg4MFx4Q0NceDA2ZW8gXHgwMlx4MUQqXHhBNUJBXHhBOFdceDlFXHhGNzpSMlpXXHhCMVx4QkRceENCXHg5MVx4RjY1bVx4RjZceDhBXHgxMlx4MUFceDlGPVx4RTJceDg3XHhCQlx4OTAsfVx4QzZceEQ4XHg5Q1xceENCXHhGOXV0PVx4QTdceEMyXHhBN3dceEE1XHgwMFBceEI2XHhGREFceDg3XHhGNlx4OURZXHgwRm1ceEQ3XHg5NC9ceDBEXHhERFx4QzRceEY1Pmh+NFx4MTJMXHg4Mlx4QTBceDlDXHhDMlx4RkJ4XHg4MC5ceDFEIFx4OTBceEU1OFx4MTlHXHg4M1x4QzhceDAzdnRceDk3XHgxMkBBUlx4RkVceEYwXHgwNlx4MEJhXHhEN2JBXHhERUVceDFBUVx4OEVceDA3XHg5NVx4MEVceDhGIVx4RjBceEM2XHg5Nlx4QjRRXHg5Rlx4Q0ZceDk3XHhFRlx4RjdgXHhGMFx4RDRlXHhDQVx4RDhSXHgxOSBceEE3XHhBMFx4RDVceEQ1XHgxOVx4RTRceDBBXHhBN1x4RjhceEQ3XHgxNFx4RThsXHgwOFx4OERAXHhDNVx4RTRceDAwXHhDN1x4REZdXHhENlx4RTJwXHgwRFx4MENGXHhDM2dceEIzXHhEN2JceDExXHg4NVx4MDVKXHgxOVx4QzNceDA3P2ExXHhCM3lceEZCXHhBME5ceDgyXHgwNXZceEQyYFZceEVCZlx4RjZDXiJceDEzXHhFM1x4OThoYlx4OTQ5XHhFMlx4QTdkXHhFQ1BceEE5XHg4QVx4QUNceDA5XHgwRX5ceDA4XHhFQktCa1x4MTdceDg0OFx4RkVceDgwUnNceEY0XHhGMWpceDExXHhCOVB9aVx4MDFceDg4XHg4NzJHXHhBNVx4MDFceEMyXHg5MVx4RkFceDhEXHhCQkNceEZDQVx4MUVceEIwMFx4OTYvbVx4OThceEQ3XHhCMWpVXHhDRVx4MTdceEJGXHg5RCVceDg4XHg4RVx4RkFceDE3XHg4Qm0gXHg5NEAvXHhGRlx4QjJceDg2XHhCRlx4QkZceDBCXHgwOFx4RjlceEY2XHg5Mlx4MDhceEFCRkAlXHhFMTdceDBDXHhDQVx4ODJceEFGXHhGRSJceEI3XHhGNVJceERBSVx4OURceDlEXHhEN1x4OThceDdGXHgwRFx4RTlkNFx4MDhceEY3Xlx4RDlxXHhDRFx4QkJceDA1XHhCNE9ceDgwXHgxQlx4ODRceDg4XHg5M1x4Q0FceDk5XHhERFx4RjZNXHhFNkpceDlCXHhDQ1xIJGdceDgyXHhCQVx4MDdVMVx4QTVceERDXHhDNXRceDdGXHhCOS5DXHg5RVx4RUV1XHg5OFx4RUZceEIzekJceDg1XHhFOVx4RTBceEI4XHhFM3ZceDlCXHhCRlx4RkJceEVFXHhDODZceDFFXHhGOCI8XHgxQlx4RDJceEExOzhRSHRceDEyXHhEQVx4MUNgW1pceEM1XHgwNFx4OTFceEQxXHgxNVx4RUQpXHhDMlx4RTlceEU2XHhCMlVceDk0XHg5Qj51XHg4MFx4QkZceEFCXHg4NVJceDlFb0ZceEE1XHhCQ1x4Qjl0XHhDMmhCMSxXSFx4MTZceEVFXHg4Mlx4QTNceEJCXHg5MFx4RkFceEY2fVlceDhCZjRceERCa1x4ODlceDlDVVx4OEYiXHhFRFJceEZFZlx4RjFceDgxXHg5QzJceDk4XHg3Rlx4MTIzXHhDMVx4QTVceEZCOHBceEI5XHgwN1x4QTRceENDXHgxRFx4QUNceEExXHhERFx4QTZceDlEXHhEQlx4QTRceEU5XHg4OFx4MURceEFGV2VceENCXHgwQXxceDlDXHhDQiFceDgxXHhBMWBceDAwXHhFNFx4QTBceDFFRVx4ODNceEUzXHhFN21AXHg4N2JceDhFXHhBN1x4RDRceDkzXHg4RFx4QzZGXHhCQlx4OEJBPlx4OUR9XHg4MyJqXHgxM1ZceDkyJ1x4QTV7UVx4QTBxXHhGQUtzXHhEMG5ceDA5SVVceDBDXHhEQU0rZlx4Q0VceEZFXHg5MVx4MDRceEEwXHhGNFx4OEJceEQ5O1hceEU4XHhDOVx4RjM5XHhBOFx4QkJceEY1XHhFNFx4ODFeXHhDMWgoXHhBOVxceDA4XHhCOVlceDlGM1x4QjZceERDXHgwN1x4MEVoKVx4MDNneVx4RkFuPlx4Q0ZgKE5ceEExT1x4RkRceDgwXHhEM1x4QjhceEQxXHhDOVx4RUJWTlx4OTcyJCA1SkFpXHhCOFx4QzlLIFx4QjRceDBGelx4MUVCKjpceDE5J05ceEIwXHg4OHlceDFDXHhDM1x4RDBceEMwVmtceEIzSlx4QUNceDlBXHhEMFx4RTNoXHhBNnZceEUzXHgwMVx4RTlceEFGXHgwN1x4MUNceEYwXHhCQVx4QjVceDExXHhDM1x4RjJ5XHgxMyQgLFx4RTNceDFENipceEU3XHg5OXw1XHgwOVx4RTFiXHhFOHNceEEyXHgxOG1zflx4RTVceEVDXHhFRlx4RjRceDk1XHg3Rlx4Q0U4XHhENVx4MEF1T1x4MUFpXHgwM1x4RDdceDFCLlx4RTFceDlBbC5ceDlDOlx4RURYNGhceDBCUlx4MTRceEY4XHhCRlx4MTFceERGLWhkX1x4RkIiXVx4OUVVXHgxNFx4RjEtQFx4OTdceDhGXHhDQlx4N0ZceEEyJ1x4QUVceDA0XHhCQixXb1x4RThceEFDXHhFRG5ceDg5XHhFMVx4QzVpXHhEQzJceEY4XHhBRlZceDdGXHhERFx4ODhceDFEcGNceDE1XHhFNlx4OTRceEYxXHgxN2pceDE4XHhGQ1x4ODBSXHhBQVx4RUNceEFDXHg4Q3BceDlENyBceENGfVx4Q0RceEIxZX4zXHg4Qlx4Q0QjXHhBQnhceDAzflx4RjNceEE5XHgxMFx4RTJkXHgwNFx4OTY3cHlceEYzXHhFNltceEREXHg5Nlx4RDRAXHhFM1x4RTBpXHgxMEcyXHgwQ11ceDFGXHgwMVx4ODZceEJFXHgxNFFceEFBXHgxRVx4QUMhXHhGMFx4MUVaXFx4ODN8Qlx4QzJceDlGVS1ceERCXHhEOVx4QzFbXHhCMVx4RURceEM4XHhBMCFyXHg5MFx4MUZceDg3XHhDMWVceDFGOlx4RTVceDk4XHhFM1x4QjNceEIzSVx4Q0FzXHhGOHNtXHgwMVJceEZBXHhDNFx4RkRceDA1OVx4RkVceEEwXHhGNFx4Qzg8Qlx4QjEgX1x4RTJceEIyXHhENFI8XHg4M1x4ODhceEI3XHhBQVx4ODZceEQ4XHg4NlUkU1x4QTQpXHhBMFx4QTlOXHhGQ0ZceEJBXHg5Q2ZpXHg4QURceEI5XHg4MFx4ODJrXHhEMVx4REJQXHhFMVx4QTdceEFEXHhFRVx4QjdceEUxXHgwOWMxbFx4ODhceDFGXzRceDBDXHhDQilceEExXHg5RFx4OERkXHg4NVx4QkZceEFCXHhGMFx4RjlceENBTlx4QzNceDBCXHhFM0EgXHhFQVx4RERceEFERlx4REVceDlEXHhFOVx4QTlceDkyXHgxNlx4OTJ4XHg4NFx4N0ZmXHhFNklceEEwXHgxRFx4ODFwanwvMi5ceDE1XHhGQlx4QUNceDEyXHhEMlRPY1x4RTBceEVBIVx4RUJceEE5QVx4QkZceEJBXHg5MVx4QkRbXHhDNExrXHhDQlx4Rjk1XHhCRU1kXHg5OVx4RTBceDhCflx4RkVceEI5XHhDRlx4RDhceDFFRFx4QzhceEUzfkhceDhBXlx4MDNceEM0XHhERFx4Q0V9XHgwMVRceDBEXHhEMFx4ODhceEU4XHhFNVx4OTFceEMzWVx4QTlceDk5N1x4QkFAP1x4QjhtRlx4Rjloclx4RDVWXHhGNlx4MTBceEE0a1x4MDdceEY3XHhBM0hceDgxXHhEOWxceDBDXHhGQVx4RTVceEI1XHhCQVx4QzNceEU5XHhCQlx4Q0FceDE3XHhFQjBaKVVceDkzNlx4RjFceERCXHgwNFFceEFDXHg4QTBzXHhGOChceEZGYVx4OUZceEQzW1x4QzBceDE2ZVA2XHhCOFx4RTdceDFFXHhGRHpceDlDXHhCQzI8XHhFN1x4OThceDkwXHhFND5ceDEwXHgwOFx4ODRceEJBXHhCQlx4RDlQXHg5RVx4OUFxQlx4ODA1XHhCNVx4QjdceEQ0XHhCMFx4MDVceDg1b1x4RERgNVx4MDZceDg2XHhFRlx4OUFeVVx4MTZceDE3OVx4RUNceEFFRStceEJGXHhCMmxceEE5XHhBMFx4RTFgXHgwNVx4QkFceEI3XHgwRnZgc1x4OURceEU0XHgwNHJceEE4XHhDMFx4RTZceEFDXHgxNFx4OTBqLFx4QzlceEQ4YEdceEZCXHhDNVx4RkJceDk5XHhFRmEyOVx4ODNjXHg4RiB7KVx4MDUyXHgwNHEjXHhGNTZceDExZlx4RkZceERBclx4OUVceDFEXHgxNzBceDg3KERceDBBXHhGMlx4RjcrXHhBOVx4RTVGR0NceEJDXHhFQ1x4ODdceEY1XHhEMlx4Q0FceEMwX1x4RDJceDAzXHg4Q1x4Q0RERlx4RkRAXDtceDlBXHgwM1JceEQ1IiJrVn5FQVx4MUIuXHg4RixmXHhCOFx4ODBceDEyXCQuJylceDA3XHgxN1x4RjNceENEXHgwQlx4QUMxXHg4RVx4RERceDkyXHgwNCM/XHhDOFx4RjJceEM0XHgwRVx4RDlDXHhEMz5ceEVBMFxceEMyXHg4NFx4QTJceEE3d1x4ODBBXHg4RVx4REZHXHg5QVx4QzJceDBDdVBceDE2XHg4OFx4RUJceEI1XHhBRlx4RDZceDFDVk1ceEFBXHhENFx4REIySFx4REJceEZDXHhFQkxceDk4c3FceEVDX1x4QzE2XHhEMEtceDkzXHhGMixceEIyXHgwRVx4OUNeXHhCMlx4Q0ZceEE4XHhENVx4MTIpeFx4QTYrb1x4MEZceENCXHhGMylceEQ5blx4OEFceDBELlx4RUNITE1fRlx4RUVgXHhENi9lXHgxMFx4N0ZceENGXHg5NFx4RTFceEQxXHgxM0NceEUxXHgwMHpWXHg4QVx4RDdQMnZvXHhGMVx4MDdceDAxXHgxRVx4OUFceDBBXHg4MFx4MTJceEQ5XHhFQlx4QTdceDE2XHhBNnV9d1x4RjVceDk1OVx4RTJceEQ2QFx4REMsXHg4Ml5ceDFCZ1x4OTNceEY3XHgxQ1x4OEN8XHg5MFx4MEJceEJFXHhFNSptIlx4OTRceDg0K1x4N0ZceEVFXHhGRlx4ODZceDFBXHg4RDxTXHg4QytceEZEKEFkR2tceEZEXHhENDw3XHhDNFx4MEVceEU5XHgwQSBceDgwXFx4MUZceDdGXHgxQ1x4RTFceDFCXHhFOVx4MDFceEU5ejMqRFx4OUFCXHhBN1x4MUZceEI4d1x4QjRGXHhGRVx4OTksK1x4RDdceEVEXHhBNlx4RTlGd2dVXHg5QTdaXHhFMUdceEM3SFx4QkNceEYxe087XHg5QSxceEI5XHg4Q1x4N0YxXHhBM1x4ODNceEFFRFx4MEZceENFXHhERlx4OTRceDlGeFx4RDA9Sk93XHg5Nlx4OTJceDk4XHhCRlx4RUZceEIzKVx4RkZ0XHhGMlx4MDdceEE1M1x4QTVceEVGXlx4RjBceEJDXHg5Qlx4RjZceEJFNlx4OTZceEJEZlx4REZceDE0XHgxMFx4RDVceDAyXHg4Nlx4OTFceDg1XHhBOVx4Q0JGXHgwNydceDgwXHhGMlx4MDVceEUyXlx4QzlceDhETDhceDE0XHhGOWRceDFFXHgwQyRceEMwXHhEN1x4QUUsKU9ceEE0OVhceEJDXHhDMlx4MEFceEU2dlx4OTdceEY4XHhGODdceEE3XHgwMlx4RURMXHgxOUF3XHgxQUBceDhGXHgxMVx4MTJceENBXHg4MVx4RTNJXHg5Q1x4OTZceEQ4Tlx4OTBceEU0NFx4QjVceEFGXHhFRn1GdCFceEIyaWVceEZCZ1x4QjFAWVx4ODdceDhDelx4RkR8bmtceEI0XHhGQ1x4ODlceDgxWFx4RkZLXHhCQTNceENFXHhCQ1x4QTRceEU2XHhEQyBceDhCXHgxRlx4QkJUUlx4Rjh7XHhDMGtceEM5XHgxQkl3XHhEQnJceEEwXHgxNVx4MEZceDlEXHg5NWVcXHgwNFx4MTVceEJBXHhGM2dceDFEXHg4Mlx4QkVceDEzXHg5OCdnYlx4REFwXHgwMnpceDgyfTQuTzpEXHg5RFx4MDgzXHg5Qlx4MDRUXHhFM1x4MEFceDlEXHg4Qlx4RjdceEU0eFx4QTlceEI4d1x4MUN7XHhCNVx4MER6XHgwMTJceDlDSVFceDk2XHgxNVx4QTRkXFx4RUVceEI5elx4OURceEY4XHhCMFx4MENCXHhFQzYlXHgxOVZceEY2NVZMXHhBOEVceDEzclx4RDJzXHg5NVx4OEJceEVBXVx4RUFceDAyIVx4OENfWFx4RUJceEMwXHg5OChceEE3XHhFQVx4MUQkXHhBRWtceEMyLXZceDFBIlx4RkRceEZDXHhBQlx4QjRceEFDXHgwMVx4RkZceEQ5XHg5N1x4RUMqXHhFOFx4MDQlXHg5NFx4MTN7blx4MTZceDlEXHhDRFx4QkN+XHhBMFx4ODl7e1x4QTJceEZEXHhBN1x4QjdceEM5XHhGNVx4RkVceDEzXHg5NVx4RjE6XHgxNlx4QkVceDFDXHhCMlx4MTBceEFGOydceDhCXHgwQVx4QjRceEQ5XHhBQ1x4RjFceEE5bDxJXltceDg3XHhEMlx4RjheXHhFQVx4MUNceDFBXHhFNlx4MTdceEZBTXROUFx4OTVMXHhCQVx4RDVMakNceDFEXHhEQS0oXHgxN2dceEIxXHhGQ0VceEU1XHhDQlVceDg0XHhFN1x4MDdceDlCWk5DXHgwNlx4MDZsXHhCQ1x4RTNPXHg4MFx4QzRceEE4XHg4MFNceEJEXHhENFx4RkZceEFEbiFceDAyXHhGMFx4Rjh6W11ceEE5XHhCRFx4MDByXHhFRjJceDhEXHgwQ1x4RURjXHgxQUZtMVx4MURAXHhBOFx4QURceEM4TDlceDFBXHhFNlx4MTgsXHhBNSVceEU4XHg4MVx4RDZdXHgxRlx4OUIvXHhGNlwuXHgxQ1x4RjdceDk4IWRceDBBXHhGNFx4REI7Olx4RDhceENGcXE6UDI4XHhFQmFceEI0TVx4MDlcXHgxNjlceEUzXHhGQipceDE3XHg5MWpJXHg4Rlx4QTdceEFEdFx4MURceEZDQCdbXHhBQV1ceEYwXHhFRnUwXHgwMVdceDBEWFx4QzJJclx4RDNceEEwXHg4OW1lXHhDNlx4MDhceDA4XHhERFx4QjFceDhEXHg4NC5ceEIxXHhFMVx4RDFceEQ3XHhDMFx4MDZceDk1Jlx4RjlceEMwXHhFRFx4OTNceEFEcFRceEI5OWcwRlx4QzBceEM0J1x4MEUrXHhBMVx4Rjg1XHhDQVx4MDdceDEyXHg5N25ceENFbFx4OUZceEYzXHhDNlx4MTVceEQ2XHhBRlx4MEZHXHg5MCJlbVx4RUJceEY1XHhCQlx4OERCKFx4RjFkXHhCNVx4MTh2XHhEQ1x4MDlceDE0XHg5RCxceEY3XHhCM1x4QjYgXHhCOVJceEU5UFVceDBDXHhBQ1x4MURceEUyXHg4RVx4QkFceDhGXHhDRVx4QzZAXHhFRVNqXHhFRlRceEYxXVx4QkIoa1x4OEQzSSVceEI4XHgwQiJceDFFXHg5NFx4Q0YgNllRXHhEQ3pceEU1XHhBMVx4RUFvXHhGMVx4QkJFXHgxM1x4ODBSXHhFOE9hcVx4RDQ1PVx4QzRdUm5ceEVGX0dceDEzXHhEMFx4OEUlXHhCODxceEU3XHhDRF1ceDBCXHhGRVx4RTVceEIwe3BceEU3RVx4QzgmXHhFMlx4OUNceEUzXHgwNVtceEFDN2dceEMwXHhGNlx4MTZceDlFbkxceEE2V1x4QjNceDlBXHgxM1x4MTN3XHhGM1x4Q0FRXHg4Mlx4QURceEUwXHhGOGBceEZBXHgxMVx4QkF3XHgxRXdceDgxLGdSXHgxRVx4Q0MnfVx4RjhCY3NdXHgwRUlceDFBXHhBMllceEU1XHhDQzxceEMwXHg4Qlx4QjhceDEzRFx4QzJceDhDXHhBRlx4MDZceDA3XHhDOVx4QjNAXHg3Rlx4QjFceEFEOlx4MENceEU1OkZceDlDTilceEIwX1x4QkFBRDZaXHhBRVx4RENdaFx4REQiJUpceEIyeVx4MERceDFEcVx4MDlceDA5XHhEN3pEZCxceEI2XHg4Qlx4RTNlXHhERVNNWVx4QzJ7Lm0rXHhDRi1ceEU3IVx4RTFceDkxXHhCOD9lXHhGOVx4MUJceEM0XHhBMFx4OUZGVCYhbn08RVx4QUVAXHhGRlx4RDZ+XHg4M0tceEQ3XHgxNXJwd1x4ODg5XHg5QVx4RDRceERCXHg5OFx4RjIqXHhFMmVceEEwXHhERFx4QjFceDk2XHgxQVx4RTlceEY0NFx4MTh1JFx4QjFWXHg5MUtceENFXHhERlx4ODFceEVFdFx4RjdceEFCXHg5Nlx4QzQoXHhBNFx4MTVyXHhBNVx4MTBeXHhCOVx4MTFceEU1NFx4MUJ8XHg5OFx4RkRceERDJEhceDlEQVx4RUZqP1x4OTg7Plx4QTBceEEwXHg5OVx4QUVceEJET1x4RkZceDE3flx4QTNceDdGXHhCMlx4RkVjXHhBNVx4RENceEEyXHgwMH1ceEJDSUJceEUzOSZCXHhENCFQaFx4MTBnd1x4OURceDA3WUUrXHgxOCtceENDW2wpXHhCMlx4RERqalx4RTJceEExS1x4MThceDgyXHhGRVx4QThceEU2XHhGNVx4RTlceEZGXHhDOU9YXHg5Q1x4MTVceDA4XHhGRlx4QjNceEY5XHgxQlx4RkZceDgxP1x4Q0VceDk3XHhDQSI0XHg5MjE+WktceEI4IWkyNFx4OTBceEVDXHhGRFx4MThLXHhBM2x3XHhBOVx4RTJceDkzTVx4Q0RceEIwXHhFNXVceDk4clx4RTBkYFx4QUNtXHg5Nlx4ODhtXHg4MW5ceDg0XHhERGMoXHg5Rlx4QTRceDk2YVx4RTFIXHhCQ2ZEWEdceDlCXHg4Q1x4OUVceDE3XHhGM1x4REVfXHg5MSI4XHg5RFx4RUVceDgxfVx4MDhceEVBXHg5Q1x4OUVceEFDKVx4RTdceDFDXHgxM2hlXHg5Qi4jXHhFMU9PXHhDN1x4RjNceERDJXJceDkzXHg5Q1x4MUQqRVx4MTQiXHgxN1x4ODRceEQ3PCt3XHgwMjVceDhGIjZceEI4LFx4QTBceEREXHhEOHhceEVFXHhGNSdgXHhERlx4REN3Ylx4QUJceEMzXHhDQ2tceDEyXHhGMX1ceEQ3XHgwQ1JceEVFUFVceEY3XHhEOFlceDlBXHhCRV9ceDE2XHgwN1x4REZYXHg4NW9ceEE0XHhCMFx4QzBceDBFXHg5Qlx4RDBceEZGXHhDRSdwRWJceEUwXHhGOVx4Q0JceEY4MFx4OEZceDhCVFx4RjhAXHg5QVx4QjBceEFBcWZceDFBLFx4OTMuXHhBQVx4OTAqXHg5OFx4QjVceDlFYV5ceDg1XHgwMFx4QzVceEQwXHhBNVx4ODhceDEzaEtceEI2XHhFQ1lFMm4zXHhFNVx4OTVceEQyXHg4Rlx4RTYjXHhENlx4OTcqMF5AXHg4NF5ceDBDZUprXHhBQlx4RTFceEEyXHhBMlx4RkJceEU4OFx4QURceDBCcGNceDA5XHg5REFceEQzPVRceDg0JnlceEMwLVx4QTdceEJGXHhCRlx4RTVceEVGXHhDOFx4RUNceEFGXHhGRVx4RTdceDFFXHhFQU18ZFx4QTlceEQzXHhFMlx4MTRceEVEXHhDQlx4OTNceEY3XHg4QVx4RkVceDA1XHhCNlx4MEZceDhCXHhCNXdceEQ4XHg5QVx4QkNceEEzXHhERjRceEJCXHhCM0lceDhDXHhEOVx4QkU0XHhFMndceEEwXHhCMFx4QzlceEE2UVx4QjJceEU2XHgxQlx4MThkXHg5QXE1Ylx4MDVceEIzLlx4Q0VceEI1alx4ODMqXHg4M1x4OERceEQxRVx4RDZceDA4XHhFN1x4QjdceDk2XHg4OVx4MTBceDk3XHhBME44XHhFRFx4RkZceDlGW1x4QjJ2XHhBQ1x4QUUsXHhENSJceEZDXHhCRlx4MUFRUTZceDExXHg4N3BceDg1XHgwMCFYXHgwM1x4MTRceEJDXHhFMlx4MTlceEM3XHhCNFx4ODgmXHgxRlNceDA0XHhGNmpceDA1TVx4RjBceDA0XHgwNlx4MDFbXHg5Qlx4QkJceEREemVkPzFceEJDNHBceDBBXHgxRVx4QUQgXHhGOFx4QTRceEI0eGhceEMxXHgxQyxceDg2XHhFQW1ceENCY1x4RjE2XHhERldceENDOEtceDg0XHgwM1x4RDZceDBCXHhCMlx4OEM1XHhGM1x4Q0NceEJBXHgwRVx4MEVceEYzXHg4QVx4QjBceEYwTXxceDE2XHg4N2hceEU4XHhGQkRceDEwc1x4REZceDdGXHg5Mlx4RDZceDFBXHg5M2lceENEXHgwMS0yXHhFOHxjIH0kXHhEN1x4MEJceDA2XHgwRFx4RDhceDBDXHhCOFx4MEZceEY2blx4RDRoXHg5NVx4ODdDXHhGRilceEU0X1x4RkFceDE5XHhERlx4RDZceEZFXHhCRFx4RjFceEFERVx4RUFceDFCXHg4MUlceDhGWFx4QTJceEI0cVx4Q0RceDlFXHgwOVx4RTlceDg0Rlx4OTRJXHhENkFceEVCXHhFOFx4QjlceEMzMVRXXHgxQlpceEE4XHhGN1x4QUIxXHhEMFx4RThceDE1a1x4N0ZceDBBXHg5Qlx4OTJceEM4XHhFMFx4MTdceEJDXHg5MVZceEUwXHhGRlx4MUZceDEzTFx4QzlCXHhBMVx4MThgelx4RTNceDg0XHg5NH5ceEU5XHhENFx4QzNceDg1XHhGOVx4MDZceDhDXHhDNFx4N0ZOXHgxOCxceEE4JVx4MTFceEU2XHhCQlx4MDhQXHgxOS5+XHgxNz9FLVx4RTlNXHhDNlx4RjVceEEyJlx4MTRWXHhFNDtceEU5XHhGNEA+elx4OEVceEJCXHhCQz9FXHhBOHJceDkxZ1x4RDJceDE4YVx4QzgiXHhCRFx4OTVceEJDc1x4RURceEVBXHg5MmxUXHhFRlx4RjRgXHgwQ1x4ODY0Mlx4Q0RceEQ1XHgwRHVceDA4Plx4N0ZTXHhGRFx4RThzXHhGMlx4MTRceEU0XHhGOVx4OTBceDFBXHgxM1x4OTZpXHhCOVx4QjFhUFx4RDRceEE1XHhGQWdceEIyXHhDNzhceDlGXHhFMVc+Qlx4QjdceDFBXHhCMVx4OTlceEY3XHhCQlx4RjlceEMyXHhEN1x4QzZceDhFXHhENyl4XHxIXHhDNWdceDlEXHhBNWx7XHgwRFx4RDNceEI0XHhBMlx4RDlZclx4RUFceEE0R1x4MEU3NFx4QzFceDg5N3lPXHgxMlx4Q0FceEMzeDxceENBXHgxRGxceEU5XHhERlx4MThceEU1XHhCMlx4RjZceENBXHhENXhceEIwXHhDNVx4QjBceDEzXHhCOCBceERCfFx4ODZceDkzXHhCQVx4OEJceDE3XHhGMW5ceDkzXHhFN1x4RjRceEU2XHhBOCBceDA0RVx4RjZceEMyelx4ODd0JFx4RkFMLFx4RUJdfFx4REVceDhBXHhCRlx4MTI+eVknaVx4MTMoXHg5RVx4RjF6XVx4OEN4XHg4M1x4QUNncVx4RDhceEVGXHhFMzlDXVx4RUVceDExXHhBMTA8Ym1ceDhFXHhGQlNceDAyXHhEQ1x4RTBceDk0XHg4NFx4QkZceEJBXHhGMmNceEM2XHhFRj9ceDg4XHhENFx4MTB3XHhCRVx4OThceDBFXHg4RWFceDk5XHgxQkpceEYwXHhERHcvQlx4MUVceDBCXHhFM1x4QzRceEE3XHhEOFx4QkV+flx4QThceDBFXHgxQUtceDhEXHgxNC5ceEZGaVx4RTVceERDXHgwQVx4MDNceEY2XHhFQ1x4QjNceEZBPlx4RTRceDlCLVx4RTFceEZFXHgwNCx9XHg4RVx4RjhqXHgwM1x4RDVceENFcVx4QjRzXHhEQ1x4QUMuXHhDN1x4RjVceEREXHhGQlx4MDNceENEXHg5RVx4QjJHXHg5QVx4MUVLblx4QjRceDkwdVx4OUNaXHhEQVx4MTFceDA2Qlx4ODFceEMyXHg5NT1ceEY4XHhFMndceEJCXHg4OFx4N0ZceDFCQH1ceEUwXHg4QVx4REZrXHhEN0VceDlDXHhCRlxceEQwXHgwNlx4MThceDkwOTxQXHgxNVx4RjlceEFEXHg4NEhceDFDXHhGRTRceEY3Olx4MDFceEM0dTBceEIwclx4QkRceDFFLjtceDgwOVx4RUZceDgzXHg5N2ZceDgxXHhEQ34kTFx4QzJceEIwXHg5MFx4OTEgXHhCM1x4RDJmXHgwOVx4RDJBXHgxODFqXHhBRlx4RDhceDg3aFx4MTchXHg4Ri9ceEE1Klx4RDg2XHg5Qlx4QUJHXHgxRFx4QTQvXHhBQ1x4MERhXHhGRlx4RDRceEJCXHhFMXBceDlGXHhCN2hCXHhFOG5ceEQ5XHg4RVx4QjlceEM2XHgxMlx4MTBceEQ2XHg5Rlx4QzJceEM5XHhENzI2XHgxRlx4MTJceEVFX1x4MEUtXHgwRVx4QjU4WVJXOlpceDhBXHhENVx4MTFceEFFelRuXHhEQ11ceENDXHhDN3RceDkxXHhDQlx4QUNceEM1aShceDA5XHg5Mlx4MDY5XHgxNnRceDA0XHhCMTNceENFMFx4QzBceDg2VkNceDBGXHhFRFx4QTkqXHhFM1hRXHhDNlx4QTJceDA4XHhBMV9ZXHg5OFx4MTRQaFx4QUNZXHhBNT5ceEY4PDtceEU3XHgxQlx4QzFceEQzXHhDQjp7XHhDQVx4RUVceDkybFx4OTRFXHhFRVx4QzlceEVFXHgwMFx4MDVceDBDZj9ceEI0XHhGRmh0XHhEQyVceDhFKmpcYVx4QzFceENGXHhGRFx4N0ZVXHhFMFx4MTlceDkwXHhCRlx4OEVGXHhFMlx4MTZceDE3XHgxRGRceEVEXHhFQVxceDgxXHhGQlx4MEVceEIzXHgwOVx4OTZceDg0XHgxQ1x4ODV6XHhBM1wqXHhCMmExQFx4MTgnXHgxRlx4OEFceDkwXHhDN1x4RUVceEIzeFx4N0YrXHgwRlZRezQ3XHgxNFx4MDQpXHgwRCJbXHg4M1x4Q0RceEUzKVx4QjZ6XHg5OFxceDA0Z2BceEQzdmhceEY0eH1ceEMyXHgxNFx4RDRceDFBS1x4Q0JceEE5PFx4REJceDFCXHhCQT1ceEU0Rlx4RDV+XHhBNFx4RTlceENFXHg5MVx4RUZuXHgxNk19XHgwMitceDg3XHhDQVx4MUZceDlDXjhceDhBXHhGOFx4RjM/XnBceDlFXHhFNlx4RENmbUlceDE3XHg4M1x4REZceDA3e0FjXHg5MVx4OTFceDlFXHgwQ2AmXHhBN1x4RDJceEJBKUksXHgwMlx4RDhceDkxXHg5NVx4OTVceDAyV3VceDkxXHhGMlx4Q0VceDhEXHhGMFx4Q0RceERGXHhGQlx4REJceEUyPlx4OTJceEZEXHhFNlx4QkZceEE3XHhEMVx4MEJceEM2NjxGXHg5MVx4QTY4XHhCOVx4RDRceDkyJSNwXHgxMENdXHhFMlx4QkEvOFx4Qjg2XHhFMGs4XHg4MFx4QjNceDAyXHg4M0BceDhGXHg5M1x4MDNceDg0XHgxM31ceERDXHgxNFx4RTQtZlx4OTFBIlx4QjMlXHg4QVx4MDFFXHg4Mz44SVx4OThtXHhFN08hXHhFQlx4QUZceEIwXHhCNFx4RThceEM0aVx4MUF2KXBceEMyNFx4RjVceDlGJVx4OUZceEQ0JiZceDk1KGdceEVEPUJceEFFXHhGQ1x4MEErZFx4MDhCbiRceEZBXHhDN0lceEIxVyx7RVx4MTVceDEzXHgxQVx4RTVCXHhGNFx4MDFceERDXHhGQ1x4OUZceEZDLVx4RDd1XHhFMlx4OUYxXHhENlx4OTEtOFx4RDRceEVGXHhFRVx4QzJnXHhFRlx4RjF4XHg5QVx4RjUvOWJmXHgwNlx4QjJceDlDXHhFNlx4QjdceEMya1x4MEUsclx4ODIzXHg4Mlx4OURceDkydmpLXHhFRVx4OUFIXHg5M0woXHhFM1x4RDFceDE0XHhGMFNceDk5XHhGNVx4RTlceEI2P31ceEI0XHgwRTFceDFDXHhEMmlceERFXHgwMmhceEMzSVx4RTdceEJBXHgxQlx4QzZceEU2XHgwOVRceEIzXHg4RVx4OEJceEFDe1x4REVceDE3XHhFRFx4QTFGdlx4MTBceDk1fVx4MEVceDBFXHhERFx4QzUgXHhCRSVceEI4R1x4OEFqXHhGN0NceEQxXHhBMVx4RDRceDhCXHhCMFx4QTYmUkZceEREM1x4RUFkXHg4NG0jKFx4RUNdXHg4Rlx4RjdceDg1XHg4Rlx4QjVceEI2XHgxOVx4RUFceEE5XHhCNFx4QkRceDA5elx4MDZnXHhDOVx4QTNceERDXHgxM1x4QjlceERBaVx4QUZceENDPFx4QjlceEY3XHhCQ1x4Q0RceEIyXHgxMmJCK1x4MDBceDg4XHhCMFx4MTBceEQ2VVx4RkMlW2RceENDXHg4RWVceEVEXHg4OGhFUidceDEyXlNceEI2Mi9ceEE2XHg5MVx4QjlsRyhceDAyXHg4NzlceDE1XHhDMVx4RTlceERGXHhDMWVceEQwXHhEQipceDEyXHhERVxceEEzXHhGOFx4QUVceDlDXVx4OENceEU5aVJrXHg4MTdUXlx4RTk/XHhCNnhceDdGXHg5Mk1ceDhEaFx4QzJceDBFXHg4RVx4QTFceEQ1XHg4OVx4OTkuXHhFRFx4MTNceDE4IGFIXHgxOFx4QTlceEY2XHhFMFx4QTR5XHg5RD1ceEIwXHgxQjhUXHhBOVx4RjVceEYyXHhBNDNnXHhGNVx4MENceDhBXHg4OVx4QTdjK1RceDExLFx4REJceDhFXHg4QVx4RDVceDE4XHg5MVx4OURceDg0b01ceDhCNVx4OTBceEU5XHg4Mlx4REZceDE2X1x4MERceENBI1x4QTRceDFFelx4QTRceDEzTjV4U1x4RURceEYzUVx4QTR6XHg5N1x4RDRceERFfDZceEEwXHhGMFRuXHhBNVx4ODIhJ1x4QzdrXHhEMFNceEM3XmsoZmhuXHhGRlx4OTZaSFx4QTRceENBdDdDXHhDNkt+QFx4OTdBXHhEMlx4RDlhXHg5MUJyLVx4RjBceEJFN1pceDlGVX1ceEM0Z3hceEM3XHhEMVx4QUR1LVx4RTRceDBEXHhERTR9Klx4RDBceEM0XHhENlx4MDdceEQ4XHhBRVx4MTZceEQ4P1x4RjdceEU0MVx4RjJSU3F8XHhGMlx4OUZqXHg4N1x4MTZceDgyXHhCMXxceEIwcFx4QzRceEQwXHhFN1x4MERceDBGZDRceEU5XHhCRTBceEU4XHgxOFx4QUNVZDshXHg4Mlx4RTVcXHhEMmRceDk1XHg5MkVReVx4RkRceEEyXHhDMFx4MDUobEtceDgwXHgxMlx4RTVceEEyXHhEOFx4OTdnXHg4NFx4QzZceEY1XHgwMFx4OENZXHg4Qkk2XHgxM1x4RERXL1x4ODdceDBFZ1x4MENceDAxXHg5Mlx4RDIoNSpceEUzYkQ7XHg5NVx4RTBLcVx4RDlceDhCTFx4QjdceEY1XHhDQ1x4RUJmXHg4MjFlXHgwRVx4Q0RceDBDflx4Q0MqXHhCN1x4QzNceDkycFJceDAwUlx4OUJceEY4XHgxRG9ceDlDe1x4RkVceDlGTkFceEMwOFx4MTZceEYxIlx4OTJceEFCXHhDMUdceEE4S1x4ODJEXHg4QVx4QkNceDkzWXQ/XHhBNVhXXHgwQlx4RDZceDE5fDZceEZGXHhCNFx4MTAkfS1ceDhCXHhDMlx4OUR7XHhDRFx4RkRceDlCXHg4OVx4MTdceDkxWzZceDE5JFx4RkRgXHhGOVx4QkM8XHhFNFx4QzExXHhGN1x4RUJXXHhGRVx4MTBceDA0XHhFOVx4MDdceDkzXHhFM2luLmZwXHhCQVx4OTVceERFRlx4OTJceDgwXHhDNVx4QkNUXHhGM1x4RjhuXHg5NHd+XHhBQlx4OTNceDA2aVx4RjAlbVx4REJNXHgxMFx4MTFceEY1XHhCRVx4QUFceDg1XHhDOVx4RDNDWGBceEY3XHg4Rlx4QzFceEY4XHhEOFlceERER1x4RjlrXHhBN1x4QjVSYTBceDBDXHg4Q1x4QTdceEI2XHhGN3l0XHhCN1x4Qjk3K1x4OEZ7XHg4Q1x4RThceEE2XHgwQVx4QTktXHgxM1x4RTlceEYwXHhGQVx4MDlceEY2XHhFRl5ceENCTH1ceEFBXHhCRHNceEJBXHgxMmttJFx4RTJceDFDTFx4RTk5cFx4Q0F1XHhFQlx4OEI9XHgxM01ceEEyRFx4RjVwaFx4QjJKXHhCN3dceEI5XHhBQVx4Q0NbXHhFMFx4RDRceEQ2XHhEQiM3XHhBOThceDBDXHgwNUtceEUwXHhGNlx4OEJceDkyKTwtXHhCMFx4OURceENCXHhFMlx4MDZceENDXHhBQ1x4MURceEI4XHgwRFx4QTdceDE2XHg4NVx4OEZceEI5XHgwRS1ceEE5V1x4RDU3OVx4MUNceDlEXHhBMlx4RTdceEIzXHg5NkZceEZCXHhBRlx4QzZceEEzXHg5MVx4RDRceEIwXHhCRlx4Q0VceDFBJlx4OEIudFx4OEJQXHg5Nlx4MDhceDE2XHgwNFx4RERceDE2XHhCMlx4QTBceEEyXHhFM3g+Tlx4QUJceEEzXHgwRFx4MEEkXHhCMDRceEI4XHhDOVx4OEZbXHgxMFx4QjRmXHhBM1x4RTRceEI0XHgwNFx4MDNceEU0XHhGQ0NceDhGblx4QzZceEI2JVx4QUVceDhEXHhGOXVZXHhGQVBceEVBXHhGNlx4ODlzXHhCMVx4QUVceEE3d1YgN1x4RDQmV1x4QUMhXHhDMX1mXVtceEE5XHg5Q1x4RjlceDAwSVx4ODhceDBFXHgwMlx4MTNceEIwXHhFN1x4RTlceEM0XHhCNFx4OUN6XHg5N1x4ODBceDA2XHhCQVx4REFceEU2XHgxMTFceEZCXHhEN2dceEM1XHhBRT1ceEUzXHgwQVx4QUQnXHgwNFx4RTZceEREXHgwOTpfOFNGXHhFQlx4RkJceERCXHg5MWNceENEXHhGOVx4QUVceERDYFx4MDQ+XHgwMVx4MUZlVVx4OUJceEY2XHgxQVx4RjNceDFCXHhGRFx4QzNpXHhGNUlceDg1XHhBNVx4QkJceDFEWlx4OUJoXHgxNFx4MUNceEZDJVx4RjRceENDNmggW1x4Q0VkW1x4QjdDXHhCQVx4OUJceEJEXHhCN1lceEUyJ1x4QUVceDFDXHhGQjhGXHhFM0NceEIzXHhFRlx4Q0RceDFCXHhGNlx4QkZceEE5X0dceDg1QVx4OENceEI4fFx4RjFceEVGXHhFNVx4MTlceEFBXHgwMFx4ODZpXHhEQjFceEQ4e1x4MUM7XHhBMVx4MTFceERDXHgxQz1ceDgxJihceENFXHg4NSNceDgyXHhDQ1x4QzErRGxDXHhFME44XHhDRlx4MUJceEI1XHhGQ1x4REVceEIyXHhFN1x4QjMqXHhBRlx4MTdceDA0QiRceDdGT1x4RUQqXHg4MWxceEQyS09PXHhDMkBpXHhDRGlceDlCJVx4QjBceEJEXHg5Rj9KXHhBRFx4QUNceEU1Z1x4OTZceDg5LVx4RTdceEFBXHhDNFx4OTMvK1x4RkFbe1x4QUYwSVx4REJceEM5XHg5OFx4QzZceEIzXHhBMFFceEZGXHg3Rlx4QzRceEUzXHhDN1x4QkRceEQ4XHhDM1x4MTBceEY4RDBceEQ5XHg5NVx4MURceEE5XHg5Rlx4OUNWXHgwN1x4QTZceDBDXHhFNGM5XHgwRFx4OTdceEJCRlx4RkIuIDdceDhCOlx4QTNceDFDR1x4MTUrXHhGQT5ceEREXHhEQVx4RjVceDlFXHhERFx4RjBceEU0RUpceDA2XHhBM1x4MTNceEJEXHg4N29ceDk3XHhDMlx4QjRceEU3XHgwNy5ceEE2T1x4RjBceEIwXHhCMlx4MEJceEZGXHg5Nlx4MEQ7ZFx4RURceERGX1UlKVx4RkRQXHgwQVx4RTFceDEwXHhFOWV8XHhCQ1x4QkZtXHhFNVx4MDA8XHhENlx4MTJceEVFfFx4ODVceEQxXHhBNVx4OUZyaVx4QUNpXHgwMWNceEU1UVx4QkFceEEzeVx4RDRceEZFXHhGRlx4MUJceEM4XHhEMFx4QUZHXHhEREBceEVENlx4ODRceERCXHgwMFx4QTcyRStceEQzXHgwNVx4OEVceEE1XHhBRVx4QTJceDA5Py1ceEVDXHg5MVtLX1x4RkVuXHhBRFIvUlx4Q0FceEUwXHhCOURceEVCXHhDQVx4RDlceEIwXHg4M1x4QzdceERFXHhCMlx4OTBceEIyIFx4QzVceEM2Nlx4MTFnYVx4QzdceDg1XHgxOXBwKFx4QTlceDgzXHgwQlx4RkJwXHhCMlx4Q0FceENBYk5ceDgwXHhEMXRceEE2KFx4QTVceEMxSU5ceEM0Wlx4RjFceEExRDdceDE3RFx4MThceENCXHhBNlx4RkVceDhGXHgxNVx4MTZceERBXHg4RDouL1x4QzhceDg3fFx4MUJceEI0Xlx4QkRceEYyIVx4QTRceDA0Ilx4MTVceDlELTFIcFx4MDVceDBBST15XHhFRlx4QjV+elx4OENKXHhFQyVceEJCXHhBN1x4ODc2XHg5Nlx4MDBceDg0XHgwMlx4RjlceEI3XHhGRVx4ODNceDlDXHhFMj5ceEVEXHg4Q1x4REVceEQ2XHg5NFx4ODV5XHhBRFx4QkRceEEyXHhEM1x4MEVjUVUtXHhCOVx4QTlceDhFLVx4RDlceEVCb2hhXHhDMlx4MTU0XHgxMlx4Q0ZceEVGXHhFQ0coXHhERlx4QjE9ZGFceEUyXHhDRWZceEY1XHg5QVx4RDI9XHhEQ1x4RDdceEVBTFx4QjBceDEyL1x4OURceEIxYVx4RjlceDA4eDdnXHhGMENceDkzXHgwQlx4RDJ8XHhBMFx4RjFceDE5XHgxM1x4QkZceDFEXHgwMFx4RTVGVFx4QzhceEVGclx4QzRceDhBfFx4MDJceDlBMjhceDA2XHg5RDpceEJDdFx4RkNceERBXHgwQVx4Q0NceDA0KFx4RENceDgyXHg4NlxceDEwXHg4MmspXHhFNFx4Q0JaT1x4RUJceERFYFtceDFFRlx4REFceEIxXHgxNVx4RjlceDFFXHhGQkJceEI4LVx4OEJceDA1XHgxQSVceDFGXHhGQW40XHhBOW4iXHhGMFx4MEU3XHhFQ1x4RUFceDkxbVx4RjZceEZCT0pxayhceEU4XHhBNDRceEEyXHhBMkBceEI5XHhBNVx4OEFceEQwfn1ceEUyXHhFQlx4QkRceEJEXHgwQn1ceEVDXHhDRX5ceEREXHhEQjJceEUxJVtceDA1XVx4OEFceDA3KFx4RDZceEI3d1x4QjgpZFx4OENceEVFXHgxNlx4Q0JoXzZceEVEXHhDNlx4MURceEQyQ1x4QUNceDAwXHhFNFx4QjNceEM3O1x4OTU7XHhBMVx4QjVceEM5XHhBN2JHXHg5QnJceDk3fDF0TVx4RDBtVn5ceEI1XHgwMkk0XHg4Rlx4MERceEUxXHhDNypceDExXHgxOD1ceDk4ZVx4RjJceEU1XHhBN1x4RDhcXHg5QVx4OURceEE0XHgxQ1x4MUJiQFx4QzhceEJFXHhEOUlceEVEXHg5OVx4QzFceEU2XHhBMSpceDlFXHhDRlx4QzBceDhBS1x4RkRceEQxXHhFMlx4OTlceEYzXHhGOFx4QjdceEJBXHhCNVx4OEYlRz0vL1x4OEZceEZDXHgxQVx4RUE8XHg5RFx4QUFbXHg5Q1x4OEFceEZGaFx4MUFkXHhCMlx4QkVSXHg4Nlx4RjJceDA0cW53XHgwNlx4REVceENFXHg5MkpceEU4XHhDQVx4MDlceEQ3X1x4RUVceEEyXHhGRU9iXHg5M0ZceEIxZVx4OEZIXHg5Nlx4RDVTXHhDMVx4QTRceERCXHhBNXJceEJBXHhFQlVceENEXHg5QVx4ODJceDlCQiNceDFBQVx4ODVceEUwXHgxMlx4OTFceEVGXHgwQlx4RkNceDE5XHgwMkBceEQ1R1x4QTBceEU5XHg4MVx4QjlceEI0XHg5QVx4QjhceEY4XHhBQVx4RjBPXHhDNUVceDg3XHgxRVx4RjA6Ilx4QkJceERCXHg4Q1Q+XHhERitceDhGJn1ceEQ3XHhEQ1x4ODJnKFx4QURceEJFXHhDM1x4RDBceDAwb1x4MUFceDE2XHhGMVx4QzZceENDSlx4RDItZ1VceDEyblx4MERceDE2XHhCM05ceDk4O1x4OUV3XHhFNFx4MTRceEVFXHgxQVx4MEJceEJGXHhDM1x4OERceEQ0Vlx4OThceEMxXHhFNW9ceDgzXHhDQ1x4RERceDE3XHhCRVx4MTdceDEyXHhBM1x4QTRceDlGQ0EmLlx4MDRceEFBXHgxQ29cXHg5QTBTU1x4MUNceENEYVx4RDdtXHg5NVx4OEVceEJBXHg5N1x4Q0VceEM0XHhCMFx4ODUgXHgwRS1ceEQ1XHg4RVx4RjVceDk0XHhFQlx4OERceEE1YWdceDk0XHgxN1x4MTR3MkFceEQ1XHgxOVx4QjNceEYyXHhDQzggSlx4RjJceEIwXHhERSRceEVDb1x4RTFLXHhBRVx4MDlceDA4XHhFQlx4RTVceDE3XHhGQVx4RkVceDE3XHhCOFx4QjU2fidceEQ4XHgwME9ceEFFXHgxRiJNXHhDRVx4RDdIeVx4REUiK1hceEZDXHg4MFx4QTNceDBFXHhBQVB9VFg0eFx4OEFceERBXHhEMFx4MEQ4XHhCN1x4RDlceEFBXHhEQSNceDAxXHhGMFx4QjBTSVx4REFWXHhFQlx4RjAnXHhBMVx4MTJceDhEXSVceENDJlx4RThceEJDXHhCMzVceDg1XHhGN1x4QzdcXHhBQVx4RDdceEMzQlx4OUJceDE5XHhEQ1x4MEJceDdGXHhENmJ7My5ceEUxXHhGRlVceEVBcS9nMVx4RTZQcmlrXHhBRFx4RTJceDBEXHhEOHNceEM2XHgwMyBceEYyXHgwN1x4MTIrNSlceEIxXHgwRGYpXHgwMlx4RTVceEVCQlx4QjN3XHg5Rlx4RDBpXHhGMFx4MThKP1x4QjV8eCFceDlBUjl3XHhBMFx4MUJceEU3XHhCOG46XHhBNFx4MTdHdlx4QkJceEM1XHhCMVx4QjRceEM3XHhEMVx4RDlceEFCXHg5Qlx4QUY/XHhDOXFceEZBXHhGNjtceDBDKlx4RUFceEREXHhGN1x4RDFuXHhDNyViXHg4RVx4MUE2XHg4MjRceDBDblx4ODNceEFGP1x4OTFceDgySzRceERBOn41XHhCQ0pPXHhCNFx4QzNceEY1Ilx4MThceEE1WVx4MThRLlx4OTF6XHg5Nlx4RjlceEFBXHhGMFx4RkV0JVx4RjVceEQ0OFx4RDJDXHhCMFx4MUNdKDJceEQ5XHhFM0FmdzlSXHhBRlx4QjJceDBCcVx4RThceEJFXHhFM1x4MUFceEI3MkJceDkzXHgxMlx4QUUoelx4OUVceEVDXHhFMFx4RTFceEE4MFx4QjNceERDXHgxOHJceEQyK1x4MDJceEQ1aH5vXHgxMVx4QTNNXHgwRlx4MTBceDExVUhceEIzKFx4RTZceDg2a1x4QzRcLlx4QThceEMyOTsvYFx4QTBFVlx4QThceEJEXHhGMFFceDgwYVx4Q0Fxc1x4MDkgSzd9V09ceEUyXHgwQ1x4OEJceDBFUWhceEY5XHhGQ1x4RkQqXHg5QVx4REIrXHhGMVx4OTlceEI3UVx4MTlceENCXHhFRCp3WFx4MTQ8XHhDN1x4QzRQXHhGMVx4OENceEI4YTJceDg3XHhDNXFceEY3XHhGNlx4RDVqXHhFQj9ceDhBUVx4OUUgXHhGQXZceEE1WVx4RTFceEM0XHhFRFx4REZQKlRefFx4Q0ZceEVFXHhGM1x4ODJgXHgxNGRceENEI1x4RjNceEUwXHg4MEh3XHhGQlx4RTVceDAzc1x4RkNceEQxXHg4MFx4MDI6XHhCNHJDZlx4MTNceEM2XHhEMlx4RUZceDFDXHhBQVx4MDhceEIyXHg5MFx4ODFceDgyLlx4QUZxXHhGMWpceDE5PFx4MDhpXHgxOVx4MEJceEZEOVx4OEM5XHg4Q0x7RFx4RDFceEU1XHhBMltceDk0MUpceEFFXHgwQlx4QjBceDAxb1x4QkNceDE5bEFXXHgwQ1x4QTVDXHg4Q1x4QjhceEE3XHhDM1ZzXHgxQVx4RkFceEQ3XHhBRFx4QTI7IHAjXHhEMT9ceDk3XHgwNFx4OUJceEIzXHhGOVx4QjhceDBCXHgwMDd5XHhCQ3d1XHg4Qk1ceEVFLlx4QTVceEJDdlx4QzZyXHg5Q1x4MURtRVx4RTBceDgzXHhDRGBceDFGXHhBRFx4QTNceDE3d1x4OTBceDkwXHhEQ0dceEU2XHgwQT9ceENBXHgwNXVceDE4YXZceEI5PVx4RjZceDgzT1x4MENceDE4PVx4RjBceEI5XHhFM1x4MThkR1x4ODJPXHhEN1x4QTg3XHhEMFx4MENZXHgwNVx4RDZceEFDXHg5OVpKO1x4RkNWXHhENlx4MDAscFx4MDNceEM5Zi4rc1x4MDRceDkzXHgwNSJrOVx4ODVceEUyXHhBRlx4QjYmJl5ceDBDP1x4QjdZXHg4MFx4RTlceDAwXHhDQiFceEU1XHhFRURceDA4XHhCOVx4OTVceDgwJ1x4OTdiYFx4MTlmXHhDM1x4ODFceEQ4XHhFRVx4RkN3XHhGOU1ceDhDXHhERVx4MEZceDhGXHhCM1x4QzJbQEZ+XHhBNko4XHhFQVx4QThVWWBceDlFXHhEQlx4QjlceEJDXHg5Mlx4OEVceEFGXHhFNCcwXHg4NSBceEM3XHhEOCtceDBGXHhDMlx4MTJZXHgwRlx4RDVceEE1XHhCN1x4RUYkXHg5RVx4QTFceDk4XHhDN0xceDBFXHg5MF1ceDhDXHhCQztceEVFXHg4Q1x4QjRceDEyXHg5NVx4QkNWXHgxRFx4OEZRXHgxOVx4RURceEY4NFx4RUFceEVCJlx4MThCYDBceEI5ZVwzazhceDlCSzNcXHhCMlx4QTBceDE0XHgxQi0zXHg5MVx4OTVceEI3XHg5Rlx4REZceEUxXHhCOFx4RTJceENEN1x4Rjg4IVx4MEJceEY1N0FZWDNceDA5bVx4OTNnXHgwRVsuJz5ceEU4fEtceEZFXHgwOVx4ODdceEFDXHhFQ1x4RURxSnRWSFx4Q0FceEZCXHhDRDVceDlGXHhBOSVAXHhGNVx4RjFceEVBXHg4RVx4RDVceEUwXHhDNGxZXHhDNFx4QTVceEU3fVx4RTJceDg4XHgwMFx4QTVceDg0XHhGN2FceEVDXHgwMlx4REVceEU3a0NceDk3XHg4RGYwPFx4REZLWmUkXHhGQihceEE3YFx4OENceEE5XHhCNH1xXHhGOU5ceEUzXHhEQWlTXHg5M1x4REFceEMzXHg5Rk9LXHhCOVx4RjdceENEY1x4OTdceEVGXHg5Mlx4QkRceDgwdlx4RjNceEFCTVx4MEFceEFGXHg4NG5ceDAxXHhGMlx4MTQgXHhBOFx4Qzh4XHgxN1x4RjFVXHhGMVx4RjNceDFCXHhGMVx4Q0NceEU3XHg4RFx4QTlceDBBXHg5Q3lceENCXHhFMlx4RDBnXHgxQmZceDk0XHgwRDQ5RVx4RUNceDE5b1x4QjBceEI1XHg5Q0gsXHg4M1x4QkJbXHg5MFx4QTNceEIzXHhGNlx4QUU1OVx4QzVvXHg4Rlx4OEZceDE0XHhBNFx4MUVceEMzXHg5RVx4RjJceEFGfmVceEU5Wm9ceEZGVlx4QTlceDFEXHhDQVx4Rjc2XHgxQyhceEEwXHhGRm1ceEFBXHgwM0R5XHhEQ1x4QjJceDhFXHhGOWpceEY5XHgwNVx4OTJceDFFXHgwQ0BQXHhFQ1x4MDg1XHg5MFx4QUVceDAzVGBceDk5I1x4QkZceDkzXHhFQ2tceEFCa1x4QjBrXHhGNFx4Q0FceEYwXHhCMzpceEI1XHgwQlx4QkZceEJFNm5ceEYwXHhBNSFceDBBZlx4RkZceEJGTlx4RDh6TCVceEIzOlx4N0Z7VStceEVFXHg5MVx4MDBceDk1b1x4MDJceEY2d1x4ODVceEM4XHg4NjlceEUxUmlceEI5XHg5QVdceDFEXHhFNWNceEFDNlx4RkVceDFEXHhCNlx4RDNceEFFXHgwM1x4QThBXHhDRVx4QUJDXHgwM1x4MERceDExXHgwQT9yXHhDMFx4MERceEMwXHg5RFx4QzZaXHhFQ1x4OUZceDFBXHg5Q1x4QjlBXHg4NC5QXHg4MVx4RTFceEMzNl9ceDg3XHgxQVx4QzYzSlx4QTBKXHgxMTwhXHhCMVx4MUZceENFIFx4RDFceDBCXHhBMXlceDgxXHhCRDVwXHhGRlx4QTlSXHgwN1x4RDlceEVBXHhGRVx4OUNceEYwTTU1XHg4REVceEU4XHhCMlx4MTZceEI5XHhERjpceEIwIVx4QURceEFFXHhBOVx4RDgsXHhCNTBceDFDMVx4QjBceDlBXHg4NFx4OUVceEY0XHhDMFx4QzlceEFBXFx4MTVceDkxfVx4MDhceEEyXHhFRVx4OTVceEQxXHgxMi1ceEQwa1x4OTZceDlBb1x4QUFceEE4Wlx4QUJceEUxXHhDOE1ceDg3XHhCRVx4MTdceDdGX1x4OTBceDEzY3IxXHg4RVx4RjlceDkxV1x4OTZceEJGXHhEN1x4ODdceDkwXHhEOUZceEMzeFx4QURceEJBe1x4RUZceEMwYW5ceDExXHhCNGhceDk2XHhEMlx4OEUvMWJceEYwXHhCNFx4RjNceEUwXHhCQlx4RUFceEFDXHhCNFx4REEmUUVceEU0XVx4QjN+XHgwM0Z9fFx4QjdceDE4Qlx4QjlceENCNlx4QUVceEM1XHhCOFx4Q0NaWWAkXHgwQ1x4RTRoXHhDMX5ceEIwXHhGN24jXHgxNVx4QTVceDk2XHgwOVx4OEVceEUwYlx4Q0JceEE2XHhDQlx4OUVceEE3XHg5NFx4OEVceDA2XHhBQWJceDhFXHg5N1x4QkVjXHhCREtceEFBXHg5OFx4ODlceDk2Y1x4ODZceDBBXHg5MFx4QzlceEIzXHg4OFR3TVx4MDdwYlx4RDVceDlEQkpceEZDQSVceERFXHhERShceDE4XHhDQ3w4XHgwM0tceEE1XHg5RVx4QURWflx4MURceEUwXHgwRCdceDEzX1x4QUFceEJGXHhFQWVceDhEXHg4Qlx4RUVbQl9ceDBFXHg5MFx4QTFceDlEb3hceEQxXHg5NFx4QjhceEZDXHg4RSpceDE5XHg4Q1x4MENceDgyOlx4QThceEI0c1x4QUZlXHhGNVx4RjhxSlx4QTQkflx4QzExWlx4OER6cFx4QTJceEExXHgwNVx4QUMoXHhCOTthXHhFQ1x4MUZceDdGVzlceEQ0XHhBNEZceEZGXHg5OHRceDg4XHhCMVx4RTBceEJEXHgxQVx4RDlceDg3UnBceEU1XHgxM1x4Q0FceERFNG1ceEIyXHgwOFx4RUY0XHg5Nm1ceDA5XHg5OVx4MTRceDlDXHg5RVx4RkJceDg1XHhBQnByXHg4MjlceEI2TXFceERFXHhFNllvSGxceERFXHg5QVogXFx4OTQ0XHhCRFM5XHhFN1x4QkFceEZEXHg5RlVceEZEXHhEMm5ceDk0XHgxOVx4MERceEU1XHhEQ3luXHhBOVx4MDVceEY3LXxDXHhERmxceEI5XHhCRTlceEZFZn1ceDA1XHg5NSNceDlGXHhENlx4RjJceEI3XHhBQVx4OENceDFCelx4QjYye1x4REItSWVceEMxXHhDRFx4MUFceEVFY1x4ODZceDEzTSpceEI1XHgxNFx4MDdceDA2Ilx4OTE6XHhBOWpceDBEflx4QjdceDExXHgxOG80XHhENXRceEM2XHgwNEdceEUzXHhBRFx4QTVceEU5XHhGOVx4MDNceDEyPlx4MDFKXHhBM1x4RTlceDEyXHg4N1x4RjZceEQyV1x4QzlceEYzXHhEOVx4MUZceEY1Plx4MDVoXHhCM1x4MURceDlEXHhEOFx4OEJceEUyXHhBQXg6WCBceDBDXHhBOVx4RjhceDFCXHhCM3ZceDBGXHgwQzdceDgzXHhEQ1x4QzJceDk2XHg5MHs+XHg4M3FceEIwXHhDOFxceDk5KU5ceDg3TGBceERDUlFvO1x4RjhvXHg4Q1x4RTJceEY4XHhEM1x4MENceEEzZXJceDAyR1x4ODlJXHg5MVx4MDExXHhBOFx4QjI8XHhFRFx4ODVCNkZ7SFx4ODdceEE2XHhDMVx4OTNFclx4RThceEM2XHgwMS9gblx4QUVceEZEXHg5MVx4RDZceDA3ZVx4MENceEQ5Slx4OUFceDgyXHhCMVx4QzN7XHgxN1x4QzRceEZCXHhFNixceENDOFJceDk0XHgwM1x4MTkzUFx4QTRDXHhBRDhceEJBXHgxOVx4RjNceDk2a1x4QzF7XHgwOVx4Q0FceEY2XHhGOVx4QkFcNjNceDk2XHhGRlx4QjdceDg2XHhEOVx4RkVceEE3XHg4QnNceDBGPlx4RTM8XHhBN1x4ODhceEFFXHgxNFx4QUNceEZFXHhENFx4RkJceEY3XHg5M1x4QTRceEFGMVx4RER+XHgwQiZceEU4XVx4MDJceEI5XHhFMVx4QTVceENCV1x4OEVceEJEXHhBMlx4OUVceDE5XHgxM1x4MENTXHg5NFx4QzNceEM5XHhCMVx4QjdpXHgwRlNceEU0TitceEFDZ1x4MDg1XHhDNVx4QkJceEU4XHgxRlx4QTlceDA3Y1x4QjE0XHgxMFx4MThceDg2XHhBOWtceDlBXHhBRlx4QjJceEU5Ilx4QkFuXHhDMlx4Q0FceEYyflx4Q0NceEUwczB4bz9ceEI2R1x4ODRceEQyXHhGRFpiQ1RceEI1XHg5NWdceEJFXHgxRFx4RjlceDFEXHhEMlx4QjdnXHgwNTdyKlx4RTlceDFBXHgxQ0NvXHg4NFx4OUZceDk1XHhEQVx4QjZceDBBXHgxNlpceEQ1XHgwOSxceDFDXFx4RjF2XX5hXHg5M0dCXHhENlx4OTFceDE0XHg5OXJceEFEXHhCNlx4RURceEU4XHhCQ1x4MERceEMzXHhBM1x4QjRceEI0Slx4QjBrXHg4M1x4QzVpXHgwQlx4QUFTPHZceEY0XHgxRlx4MUZceEUzXHhGMlx4OTlceEQxWFx4QTJceEQwXHgxOVx4MDJPYlx4QUZceDgwXHhBMlx4REVWXHhBOFx4RUY4ZWJceEFEV1x4RjJceEI4XHg5QyZceEJCNlx4ODZceEVBXHhCM1x4RjhKXHhGMFx4MDckXHhCMVFceDhCXHg5Rlx4QkZceDA2XHgwM1x4OEQnXHgxOFx4QkQsXHg5Q1x4MEM8XHhGNFx4OTZceDg3XHgwN1lPJXhceEFGXHhGMlx4QkVceDAwXHhFNTxiXHhENTlceEY4Qlx4QUFceEQ2XHgxNFx4MEJceENGXHhDMlx4OERceDg4XHg4M0pHXHg5NFx4QTFceERERkVceDk0XHg5OXZceDg0K1x4OTVceEM5XHg4Qlx4QzhceEU2XHhGOVx4OTNceEQwXHhGNzFceEZEXHhEQlx4MUVceEY0XHhDOCZTXHhCNFx4OUFceEM2azNkXHhFMVx4Q0NceDAxXHhGNnRceEY4XHhDOVx4REJceDkzXHgwNFx4Q0ZceEQ4XnVceDE1Jlx4MTcmXVx4OTFceDlBSFx4Qzk2XHhBNlx4RTYkXHg4RShceEQzXHhDQlNceEJBTTBceEY0XHhCMXx2XHhBN15ceEVGLD5ceEE2XHg4Mlx4QkZGXHhBQVx4QjdzQVx4RDdceDdGXHhBRnViIDxceEY4N28+XHhGQ1x4MDJceEUzSVx4MDlceDhBbFx4RThceEM2XHhBMFx4MERceDkxXHhFQl5ceDhFXHg4Q1x4MUVceERCXHg4OVFceDAzLUhceEIyRWpeXHhGOD4mRFx4RUQ+Xlx4MDBXXHhGOExceENBXHhFMFx4RkZceERFVVx4RUQgXHhDNWRceDE2YVx4QzdceEY0XHg4NVx4MDFceEUzXHhEQ1x4OURceDhEXHhENlx4RDlCXHgxRVx4Q0VceEU1XHg5NVx4QkRceEZGXHhENV9ceEY0XHgwNVx4QTJceERBeFx4QTY9XHg4Rlx4QjNceDdGXHhBMlx4ODFceEMzXHhFNT5ceDkzXHgxQlx4QkZceDlFWVx4RDhqXHg4OCklXHgwQVx4QkNceEEyX1x4ODAgKidceEY2cXs+XHhCNURceEM4XHg4RVx4REVXXHg5RH1ceEEyRVx4QUZkXHhBOHlceEIyXHhEM1x4QzVhKjhbXHgwQlx4MTdceENGXHhDMm5ceEZDLVx4REY3KVx4QzFceEIyXHg4Q3AuaWVceEUzXHhDRFx4MEJceEVEcFx4QTFceDE5bFx4OEVceEQxIVx4RUFiXHgwRlx4REZceEZCXHhFQlx4RkRceEU3XHg4Rlx4QjlceDk2XHgxRFx4RURceEU3VHhceDdGIiVceEJEa1x4MTl0XHg4RShceEY2XHhDRGNceDlBXHhCREdceEE1JDFceEI1XHg5Nlx4MThceDgyXHg5QlNceDFCXHg4QmdceDkze09ceEIxXHhFOVx4QzUsXHg5OFx4QkNoXHhCMzZceEMyXHhBRVx4RjZceDk4XHhDMFx4OTdceDAwUENPXHg5NVx4MEFceEZEXHgwMFx4MDBceEEyXHhDMER+XHg5QWJ1XHhDMnRdXHgxMVx4REVceEMxXHgwQ1xiXUZceEFBXHhFN1x4RTM0XHhDRmYpLFx4MEFuQVx4RURGXHgxNFx4Q0Jlblx4RUFceDk5d1x4MTlceDBEXHg5Qlx4OTV5XHhGQ25ceEU0XHg4Q2o3XHhBRVx4RjlceENDRUM2XHhEQlx4QjZceENEXHhDQ3piXHhEOVx4QjJceDk1XHgxNyorNVx4QzdceEUzbjtceDBDSHFceEYwXHg4MCpLdlx4OTN9XHhEMFx4OTRceDg5blx4QjNceDkwXHhGQ2NceENBXHhFQVx4QzlQaFx4RUFIXHhFOVx4QTJceDhCXHhGN1x4MDdceDgxXHhDNFx4MEY3XHg5M2luXHhFNEVceDlCSDVceENCXHhFMi5ceDhDXHhFMlx4MDJceEE1XHgxOVx4QTggXHhBNVx4RDZceEE0XHhGM2VceEM4XHg4QXVceEYzXHg4RVx4MDYgXHhEMFx4RDlceEM5XHgwOVx4QkZceEY0XHhEMDFceEFGb1x4QzhceEZGXHhFNlx4RTYga1x4N0ZceEI4XHhBNj16XHgwOFx4MTN5Olx4OUEjXHhCQVx4RjY3XHhGRHpceERFXHg5NFx4OTNceEYxXHg5MylceEI0XHhFRSRceDBEXHgxOTxceDE3MVx4MEJceEREXHhGRFx4RTkhXHhGOVx4OUZceDE0XHhFQ1x4QjNceEQ1U1x4RjBceEVCMnFceDA0XHg4N1x4QUZceDgyZVx4REVceDFCXHg5Ql1pXHg4OHBceEQ5cV1HXHhEN1x4QjhceEI0XHgwN1x4ODdDXHhDMVx4ODBhXHhBN1x4MEJceDkxXHgxNlx4MTRMXHhDMlx4ODBPXHgxQVx4Q0NuXHhFQVx4MURaXHg5MVx4RDlceEMyXHhDQlx4ODV9XHgwNlx4QzMzXHhDNVx4REZ7JTZeQFx4MDlpXHhGMShceDlCYlx4REJceDA2XHhEMlx4OTZceERCXHg5MD5ceEUzcW5ceEYwYDl8XHgxQnNceDk0XFx4OTdceDBEXHhEQ1x4QjF6XHhEQktceDFCRlljXHhEMlx4RUN8XHhFQ3gmfVx4MTJgXHgwRVx4OUJceDg2JVx4RjFceEE1XHdZXHgwRT9ceDFFKlx4OTVceEFEXHg5Nlx4REJtL2RceEU2XHg5MFx4ODBceEQ4blx4MDBceDgxXHg4Qlx4QjRceDE5XHhDNEBceEIzXHg4RVx4RERceEIwIlx4REZceDFBXHhDN1x4RjFccGZceEIyXHgwOXhceEE5XHg5RFx4QzRceDA2XHhGRnJ2K1x4REZceEY1XHgxMlx4MERceDk1ZT5ZSndceEI4XHg4RFx4MTRceEQ2XHhBRWpceDE2XHhCRVx4RTlIXHhCQS9ceEU1XHgwOFx4OUMhXHhDQVx4OUVceEI3XHhFOFx4ODJceDhDXHhCN2hnXHhGOUk7XHhENVx4MUNceENEXW5ceEJFZVx4ODZYXHhDNU1JXHhDMFx4MTdoXHgwRFx4RDhJXHg4M2FceEZGXHgxRFx4RThceEQ1XHhCQVx4OEREXHhGN1x4RjAjXHgwN1x4RkElXHhCRlx4MEFceDk0XHhCOC5ZXHg5QVx4RUFceEE3P0B4XHhFNVx4RjlceDE2XHhFOVx4Q0ZceDk3XHhFNEN5b1x4MTZGXm9ceDk5XHg5QlpceEVDXHhFMVx4RDlceEQ0flx4MTBceEEzXHhBRiFZXHhGMFx4MTFlXHg5Qlx4MThceEVDd1x4OThzUFx4ODY6U1x4RkVceEY3XHhBN1x4RERceEYyK1x4QzhceEM0XHhFM1x4QzZceDgwXHhDMlVceEI3XHhBMlx4QUJceEE2XHg5RSwhXHgwQVx4QUFceDkzXHgwQVx4MUJ7VFx4MEYlUGBceEFCXHhDQ1x4OERQfFx4ODBceDhEXHhBMlx4REJceEY3XHhDQlx4RTY/XHgxQ1x4QkRceEY1XHg5M1x4OEVceERBXHg4QUtceDE5Slx4QjRceDg0XHg5NVx4MEY6eVx4Q0VceEJCXHhCMFx4RDlXXHg4NVx4MTFceERDXHgwMlx4RUJceEYwXHg4M0IjXHhDOFx4QTFsXHgwQ0dceDhEc1x4RDkga1x4Q0RceEJDXHg5Qlx4Q0UwZ1x4MDRceEM3a1VCflx4RTVceEIxXHhBMFx4Q0ZceEI5XHgxM1x4QjhceEQzZkFVXHgwNmZceDFEXHhENFx4RTl4XHhCN1x4MThzNlx4QjI9flx4RjdbLlx4OEJDXHhGRlx4RDRceEFGXHgxM1x4RUNhdFx4QTdceDkzTlx4Qzd2XHgxMlx4RDRceDA4XHg5NXxAPlFceDE3XHg5NVx4RDZpXHgxRlx4QjhXXHhBOFx4QzJceEUzXHgxMUFceDEyXHhCMVx4Q0NRXHhFOFx4OUFceDhFXHgxM1x4MDgmXHhENHtceEY0Q1x4MDljc3YjXHhDQVx4RTBceEJCQlx4RkZaXHgwRFx4Qzk3XHg4RFx4REFceDhBclx4MEVceDFBL2FdXHhEQlx4MUVceDA5XHg4NFx4QkFceDk2XHhGM1x4ODFceDk2XHhGNVx4QTFAXHhDNFx4OTc+T1x4RUFOXHg5NklVXHgxM0lceEJEPVx4QzdceDg4XHhEQjZceEFFXHhEQ3pceEQzZFx4RDdceDA0Wlx4RjRNLEdEXHgwM1x4RTE3VCBQXHhFQyBPXHg5QTdceDEzXHhCQSZceDE0LlpceDk5XHg5MU5ceEFEXHhBRlx4MTJceDExXHg5Mlx4RjZceEI1XHhBRG5ceEE2Wz9ceEExZ3tJdjFRJE5ceDEzXHhDMUJceDE4XHgwMlx4Q0RceEFDYlx4MDBceDkxXHgwN1x4OTNceEMwaFxceDhGXHhDOHBLL1x4MUZceDE3XHhENnhceEU2XHhCM1x4RERYXHhBMDdceEZEPlx4RUVceEU1XHhGRSVPXHhEQ1x4QjQ9Ulx4OERceDBEXHhBNC5ceEUzXHgxOFx4RUFceDkxXHgxOVx4ODJceERDS1x4RUFceEVBXHhFN1x4RTYkc3ZceEY3Klx4RDBceENBRENTWFx4MDdceDkxXHhDQS9ceERBYlx4QTJceEM1XHhFRFx4QTBceDk1XHgwMlx4QzZHXHhBN1x4QjZCanozclx4OUE1XHg5MFx4RERceEVCXHhEMSVceDhEXHhGMVx4OEVdIFx4OEZceEM0XHg5Q1x4RkRceEEzXHgwODJrXHhGNltceEZCXHhGOFx4QzhceDk1ciVYXHgwN1x4MDNceEFBXHhEQipceEZCMz5ceEQzXHg4MyZ6XHhBRFx4OTFeXHg5N1x4OUVceDkwXHhEQ1x4Q0NceEQ3XHhGRFx4RTNceDlCYTpceEI0XHgxMmtceEI5XHg5Qlx4MDNvXHhFNFx4RjBceEE3XHgwOCNVXHgxNiZceDlEXHhGNUEvXHg4N1x4RjdceDg2XHhBRDhceDgyXHgxQVx4OUFceDg2XHgwQlx4RTBIXHhFRFpqXHhEQ1x4QTZceDFEXHg5Mlx4QThceEM2XHhBMlx4MDBhXHgwM1x4QTNceEJGXHhDQTJceDExXHhGQlRceDg1XHgwNFx4QjlceDE1Z1x4QTVceEU3Tlx4MDhceDAyXHgxOVx4QURceDgxXHgxRXV+S1x4MEVceEY1XHhGOH1dXHhDMUtceEFFZVx4RDZMXHg4MH5ceEVGXHhEMVx4MDdceEM1M1x4QTBceDEyXHhGOVx4QjAmXHgwRFx4OUJceENERipceDAzIj4sXHhBNlx4OThceEQ0QVx4RDlceEM4XHhEMlx4Q0FceEY5Llx4MTlceENGXHhGRDZceEYxO1x4QjFLblx4RDRceDBDI1x4OTBceEY0XHhGM1BceEU4Xlx4RjRceDFGdlx4QzFceEFEXHgxNVx4RkYuUTRceDBDXHgxME9ceDA0X1x4RTZceEU2KVx4REFceDg0XFx4QTZceDk2a1x4QkRceEQzd3JaXHhDQVx4RjBaXHhFOVFceDgwXHhGOVx4MDdweFx4QzV7b1x4RkNceENFXHhCNlx4MDdceEMwXHg5NFx4MTVceEEzXHgxOFx4RjgnXHhDN2k5NVx4ODluXHgwRFx4ODNceEUzXHhEOFx4OUNceDE5XHhGM15ceEIyXHgwQ1x4QUNuaVx4MTNceDFCXHgxMGRceDAyLCwpXHhFNlx4RTJceENEXHhFMlx4QzRceDhGXHhGN1x4QzR8MERceEEzXHgwRlx4OTdceEU5Z0FdXHgxREJceEIzXHhDNFx4QjlceEUzXHhFRVx4MEI8XHhDQVx4RjFFR1x4RkFBJVx4RjdAXHg4N15yNlx4OUJceEU1XHg4N1x4RTJlXHhEOVx4MDJCXHhGNlx4QTJceEQ0XHhGMVx4OENMX1x4REZceEE5XHhFNFx4OTdceDA5XHhGMlx4REJceDlGXHhFMFx4QkI8XHgwN0VceDg4XHhCNDdceERERlx4QUZHXHhDRFx4RDVceDE1XHg5NXlceDBCcFx4RDR8XHg4RkM6bVx4RERceDBCXHg5Nlx4QkQrXHhCRlx4Q0ZceEI5XHhCQ1x4QzRceEE4XHhEOFx4OThceDhEXHg5OVx4QUMlXHhEMFw9XHgxMFx4QkFceDk1XHg5QVx4MDZceEUyTFx4OTRceEFGXHhFQipceDgwXHhFOFx4MDBceEQyXHg5QVx4RTFHWFx4RTZceEJGXHhCQ1x4REVceDE0XHgwNFx4RDRceEZFXHhCOVx4OURceENGXHg4Ql5ceEVESURceEZBXHhBM0pceEZBXUtceEE2IXJIUVx4Q0NceEU0XHgxRU9ceEFEXHhDQ1x4OUZceDlFXHhFMVx4QzYhXHg5QVx4OTRceEJENVx4OUNceEMxLlx4ODNceEI1XHgwQS5rXHgwRVx4QzBceEYwZCRceEVGflx4ODFceEIwXHhEMVx4RjVceEI1P2tTXHhGMkFceDA3XHhGMlx4QjhceDAzXHg5NVx4OTdceDg1aVx4QzFceDAxXHg4Q1x4RUJceEEwXHg5MlNceDExXHhENFx4RDlceEFDc1x4MDNFXHg5N1x4RjRceEI4XHhCQlx4OEVceEQ4JWp1XHgxRVx4QkNPMlx4MDlceDFDXHhDOVx4QjYrXHhBOVx4RkZceDFDXHhFMlx4RTBceEM1eGNceDE4XHg5OVxceEIyLEpceDE1XHhGOVx4MTk3RXpceDk2XHg4MVx4OEJceEJGXHgxNFx4QzZceDlBflx4OURceEY5XHg5NFx4RDJceENDXHhBNFx4QUNceDhGZStceERGXHgxRlx4ODUlXHhFMXNceEY1dlx4QTdceEFBXHgxRFx4RkZceDE3XHgxQTJceDBEXHhDOHpceEM2XHhGN3VceDA4U3IuXHhBNlx4OEFAaVx4OEUkakhceEFGXHgxMGVVIHpceDk0Qlx4QkRceDBEXHhCQyY0WFx4MDdceDhDXHhCQmZceEIzYFx4RThjXHhBMFx4MDRnXHhFNXVceERGY1x4QUZceEVEXHgxN1x4RTFYXHhCNlx4Q0NceEQ4a1x4RDZceERDXHhDRVhceEFEXHgwMFddbVx4QjJ1XHhBOFx4ODNceDgzXHhDQlx4MUJceDk3XHhDQ1x4MTNceEUzXHhCQ1x4RjBceEE2XHhBRWRHXHg4Q2tobVx4QUF+Tlx4QjZceEY4XHhENSNceDgzIlx4QURceEMwTFx4OTFceEVGIFx4RDVceDA0QVx4OERceEJGdlx4RTlceEUwXHgxOX52QmtceEFBcUFbXHgxQVx4QjB2MVx4MTFceEIxXHgwM1x4MDhceEQ0IFx4ODVvYVx4RkFceEY5LFx4RER9XHtceERDXHg5M1x4ODBceDA5MEk+XHhDN1x4MUVceEFDXHhGOXFUXHhBQVx4QTk7IFx4OEZHXHhFNFx4QjlwXHhDNFx4MEV4XHg5MVx4QjAlXHhFM1x4REJceDAxc1x4OTZceEM3XHg5Mlx4ODZceEMwXHhGOVx4RDNyXHg5QiVceEJDXHhDRlx4ODZceDA3XHhBN0VceEM4KH02KFhceDhDXHhFQWgmXHg5RFx4Q0ZkXHg4MyBceEVGKlx4MUZceERCXHhBNlx4RDMlXHhCRlx4OERWXHhCOVx4QUIvNGBceDE1XHhDQ1x4QTVceENFRlx4MDVceEM5XHg5Q21ceDhCTVx4MEFJM31MfVx4OUVUXHgxRXdVUStceDg4XHg4NFx4ODFceDkyW1x4MTRceDg3XHhERVx4RkJvXHhFN1x4MDlceEQ4XHhBRGFceEFCXHhGQ05ceDFDbVx4RjVceEEzXzJceDg0XHhCNjNceDAzVylceDgzU1x4RjJkXHhCNFx4MTRUXHhDMlx4RUZceDg3RFx4OUZceEEwXHhEMX1ceEEyZ1x4RTVSXHg4NCRceEE3XHgxMVx4RTJceENBZFx4QzJceEEzUnNceEJFXHg4Qlx4QTZqXHg4QUJceEJGMVx4OTNceDBBXHg5N1x4OERBXHhDRFx4OThceDlCXHgxMnlceEZFXHgwQlx4OEVceDk4QWZceEM1XHgwRFx4Q0VceDg2aUpgXHhCNVx4QzQuLSBceDFGXHhBQlx4OTNceDhEXHgwOFx4RTVvXHhCQiY7XHg5OVx4RTVceDg5STluTlNceDk3OGtpSVx4QTVceEQwXHhENlx4QzFceEEyXHhEM1x4RDMlXHgxOUMrOHVceDE5XHhEQlx4RjFceDhDXHg4Q1B7XHhCMmdcXHhCOVx4QTE6I1x4RTlceDk2XHgxMlx4RUNceEQ0XHg5Mlx4RjFceDFEXlx4RkUtYlx4ODdceDkzXHhDRVx4RTJceEY3XHg5OVx4MURCXHhDNlx4ODVceEVFXHg4M3lceERDRilceDA0XHg5Nnp6XHhERVx4MDBceEZEXHhBM1x4RjZceEExXHhFQVx4OEREaGNNWFx4RDZbKUBceEI2XHhFMkVceEYyKyxceEQzXHg4NFx4MENUXHhBNSpceEM0OjtceEM2XHhGNSJceEU5XHhEMil8XHhBRVx4MTFceEI4XHhERktceEVDb1x4Q0FCXHhERVx4QkQoXHhDM0doXHgwQVx4Q0NceEEwXHg5Q1x4RDNceEUxXHg5Qlx4MTUtNFx4QUJceDk0XHhBQ19ceEMwXHhEQ1x4OEYxMyJbXVx4QjJwXHhCQyNceDhGXHhGRiRceEYyJiFceEIyJFx4ODhceEE5XHg5N1x4RkE8XHhERVx4MDdceEFEXHhDQnZ6XHhDQWlceEJCXHhBQ1x4OTNtLmghTWZceDFBRlx4MTNceEFBXHhGRVx4RTBceERBXHg5QS5ceEU0XHgxQlx4MUVceDhCVCBceEVGXHgwMlx4MDNceEM2XHhFN1x4OURceEFEZ1pceDgxTEUwXHhFOX1ceEVGXHhEN1x4OEZceDhEOHtTXHhCRVx4MUFceDg4XHhFRlx4MUFfXHg5MSwsdlhaVVx4MENceEY3XHhERVx4QzB7Q2FceDhGLVx4QTRceDk1XHg5NTdqXHgwOTxceDhDXHhGQlx4QjNceEYzeVx4QkNJK1x4MDFmXHgwQ3RceDkwXHhFQVx4RDFBcVx4RkU1Mlx4RDh2XHhDMVx4OUJceDlFXHg4RXhceDBFXHgwMlx4OUU8XHhGNlx4QTZceDhEJFx4MTBceEQxIVx4RjRceEExXHhCOFx4QjhQXHgwM1x4MTRceEU3LFx4QjFceERGIVNceEI4XHgxQ3RceEJEXHg5RHVceEJDclx4QThceEVGUlx4MUZceEQ4RFx4QzRceDlEXHg4Mlx4RTlceEU4XHg4RFx4OUVceEYwUDNceDE0XHhCMVx4OUNceEIzXHhCM1x4OEZceEZDXHgxOXVceEYzXHhCRFx4OTBceDFFQFx4OEVceEI2I1x4OTdceEQzbFx4OTlceDlCXHhFNlx4OEMkXHhGNlx4RUNceDEyXHhDQ1x4OEFceEY1XHg4MVx4MTJceEZEXHhEOFx4QjVtSihceDFGXHhBOHd+XHgxRlx4MDVVXHhDQU13XHg5RDYkXHhDMlx4QTBGUVx4OTRceEEyXHhFOGpceEU5XHhCNz1ceDFEXHhCQUc1XHgwMlx4MTRceDhGXHg4Qi4xXHhEMFx4Q0RvJlx4RERceENCXHg5MVcuTVx4MDlceEVGMVx4MTFceEMxX1x4QzNqXHhEQlx4RTEoNHtceDg1XHg4NURvXHhGOFx4QUFjXHhDNlx4RTJceEE3XHgxRitmLUdceEIyXHgwQ1x4OEYsIyZRXHg4Q1x4QTNceEZFXHhGMG9ceDkydVx4MUFceEU5JmxceEE5XHg5MVZceEE2XHgxNlx4RDBceDk5XHhBNG1ceDg3XHgxRmdceDE0XHhDNjRceDk5XHhDNVx4OUQ8O1x4RTdLNlx4OURceDk3JVx4MUZyXHhGRF07XHhGMVx4MDcvXHgxM1x4MEZceEFBPFx4MEVmXHg4Nlx4RDZceEJGXHhDQlx4RkRceEYwbzBceDhFY2REXHhCRVx4QzFceEFBXHhCNkVceEEyXHhGNnpceEJEXHgwQlx4RURceDgxXHg5RFBceDg4XHhDNnloXHhCRlx4RTBceERBXHgxMlx4QTFceDA2XHgwRFx4QjRceDBFXHhGRFx4MThUbVx4MUVceEE2XHhCMVx4QTJceDdGQ05ceEVGYVx4RThceEEyXHhGRiNSXHgwQ1x4OTlPb1x4RUZceEZCKmtnXHhGRVx4QkFceDkxUVx4OTE3Slx4QjlvXHgwMVx4RjV+XHhCOCBceEJETlx4QzZceDBGOFx4OEJNdFx4OTRceEU0XHhCMXhceEVFLEVceDFBXHhEMns1XHhBRHd9XHhDQlx4OEN2R0YlXHhENlx4RkNceEY5XHhDMFx4MDlceDg1XHg5Q1x4RkNAXHgxNkNceEY1XHhFNTI8XHhDOFx4MTlceDA2XHhEM3VceEUyXHgxMklDXHg5NFx4QUZkXHhENFx4RDU/XHgwRnZceDE4Z2VgXHhEOVx4OUF0OEdPZFx4QUQyXHhFMStceEY5XHg4N1x4QUFceDBGXHhGOVx4QzdceEVCXlx4OTVceEYzXHhGNFdceDE3Jlx4MDFceEFGWG9tcFx4ODJTI1x4QjdceDAzfFx4RDBceEM0XHgxNVx4MEUic1x4ODd8XHhBMlx4MUEmViQ/XHgwRVx4ODdceEFBdVx4RTY4XkxceDdGV1x4QzdceDg0XHhBOHBceDEwXHhCMFx4RjclXHgwQ1x4OEZYL1x4MDFceDhFTFx4RjVceDkxRFx4RThuXHhDNlx4REJceDlCXHhEN1x4QjVceEUxXHgwMGVceDhGXHhEMVx4Q0RceDExXHg5Qn1ceDlDXHgxOFx4OUJceDExXHhCRnVceDA2XHg4MFx4REZceEM2XHhCNlx4RjgrXHgxRlx4RjBceDk1XHgwNlx4QUJceEJEXHhDNG9ceDlEXHgwMlx4OTNKXHgxNnluTmZceDFFK1x4OEJceENGQ21eXHgwOVx4OTNqMlx4ODdceEExXHhCM1x4Q0ZceDAzXHg5M0hmXHhBRS1ceEFGT19GXHhENVx4MTJceEY2Tlx4MTY2ITxceEQ0XHhFRVx4RkJceEMwXHhCQlx4MENgXHhDN1x4QjMle1x4QUNceEMzdFx4ODJXSlx4MURceEQyXHgwNFx4RjZ1e01ceEM5XHhBQWVQXHgwMFx4Rjl7XHhCNVx4QUZJXHgwRlx4ODdceEQ5XHg5Qlx4QzB5XHhENFhceDAzXHhBRlx4QjNceEM3XHhFNV1ceEJGVFx4MEVceEIyXHgxOVx4MDI8X1x4RTBLRXgnb1x4RTQqaVx4QjBceDFCXHgxNlx4MDdxVFJceERBXHgwNFx4OTVceDA2XHgwRlx4RDFceEE4S35ceEZCTVx4MTg4XHhGOVx4RDhceDk4ZE5BXHg3Rlx4Q0FceDA4XHhENFx4QjNceEE0JFx4QTBfaFx4MER5Klx4RThceDFBXHgxNENceEU4XHhGMTxceEMzXHg5MEhceDk2NFx4OUJceEQ2XHg4OXlceEVGXHhBRlx4MUZ9XHhFQ1x4MTJceEE5MXNceEJGXHg5NWZceDg0Jlx4OEE0XHhCM1x4QjJceEUyP1NceEYwXHhFMlx4Q0FceEI1XHgwRFx4QUNvK1x4QUNceDA4PFx4RjJceEU5XHhDN1x4Q0FceEQ1XHgwQlx4QjRVXHhFMFx4QUJceDA3XHhCM1x4QzlOXHhBNlx4QUNceDA0XHhDOVx4RkZsXHhFQVx4MTNceEU5K1x4REVceEQ5ID9ceEY2XHhEMihceDA0MFx4MThceEZGXHg4M1x4OEZceDA3XHhFQmZnXHhGMVx4QkZRXHgwNS4wXHhBMTpOXHhDRlxJUlx4RTBceEVCXHhCNFx4RUJceEYxXHg4Q1x4QUUrY1lAb1x4MTItaiRceEY1L3hceDBFXHhEM1x4REZceEVFSVx4MEVceEI4XHhDNVx4ODRlXHhFNFx4OTJceDhCXHg5QVx4RTFceDEwXHhGNCJYK1x4RUZ5XHhFMVx4MEVceDAzXHhFQVx4OER4XHgwRlx4ODAiXHhGOGJceDE0XHg5MVx4OUFeXHhFQlx4QjNceEFDXHhBRm89XHhFQVx4RDZceDAzXHgxMFx4ODFceEE4XHhGRSNceEU0XHgwRVx4OTZceEQwWlx4REQ9XHhDOVx4MTFceDk5XHgxMVx4QTlceEMwalx4QkQ3XHgwN0dceEY5XHhFMlx4MDhceDExXHgxNFx4QTJceEZBXHhERShceEUxXHhDOSVceEU3XHgxNnolXHg4MFx4MEU3ZFx4RTdceDEzUVlceEM3XHhENFx4MURceEM4XHhEMVx4MTJceDk0dVx4RjhceDhFXHg4NzhjXHhDQ25OXHhGQ1x4OTNgIlx4RTBceDFDLlx4RjdceEQ2XHhBMlx4OERceDEwXHg4OTVceDk1ZFx4QjZceDEwT1x4MUVceDBBXHg5MFx4ODZceEZDXHg4NVx4RkNceEVBXHhBMTRceDlDeUxceEFEL1x4RjBceEYwPFx4RkRmXHg4MmVceDk0XHg5OHRceDA2KVx4MDJceDEwXHhEREhceDBBXHhCQ089XHg4NSZceEYyXHg4NVx4ODdceEEzXHg4OFx4RTdQXHgwOVx4QTFceDE3XHhEN1JceDFDXHgxNixceEEwXHhGQVx4MDloXHg5Mlx4ODZceEM4XHhGRVx4QzVceEQ4XHhGRVx4RjdceDE1XHgxM1x4RERceDFDXHg5RiFceEU0XHhDN1x4QUNceEM5Ilx4QUFaYVx4RUJceEE4XHgxQVx4OUNbXHhBRTRkJV9ceDgyXHhGQW1ceEI1XHhFQVx4RDFceDFBNFx4MTFceDA3XHhGMDwrO1x4QzZceEE5XHhENFx4ODZceDFGR2hceDEyXHhCNlx4QUFceDlFXHhFRUtceEJGXHhFRm9ceEMzXHhCNmliXHhENlx4OTVceEQwT1x4RTNceEQwXHgxRFx4MEJceDBFXHhCOVx4RjEjbz5ceEI4XHg4MVx4OTlmaEFceDkxV1x4RkJceEJCXHhDNFVceDlEXHgxM1x4MDZceEY4XHhDMEpjXHhEMlx4QkNceEU2alAhTlx4MTdceENCU1x4MEMuK1x4QTkpXHhBQkxsXHgxRVx4QzdceERGJXlceDA5XHgwOVx4MDZceDFGUFx4ODRceEVBO1x4MEJceEUzXHhGQlx4RjFceEVFLTFceEY0XHg5RFx4OEZVXHg4Ri0qLFx4REVceDhCXHhDNDxzMFx4QTJceENFXHg5RVx4RDVceDlBX1x4MTkkXHgwRlx4MTlceDE2XHhFN1x4MDNceDA2XHhDQ1x4MTZUXHgxRFx4QzlceEU3XHg4NFx4OTYmQ1x4ODlceEM3XHg5MitceDlBRlx4RTlceDAyXHhCQVx4MTNceEVBXHgwOGpNLCogXHg4Nlx4OTNPXHhCMVx4QjM2XHhCRlx4QTRceENBXHhDOVx4OEVceDBGXHhEQVx4RjRceDFFXHhBOSFceEFFWFx4MUZceDk3cFx4ODRvXHgwM1x4MTFXXHhGRnA+e1x4OTNceEY4alx4RUIwXHg4Mlx4RTVceDAxc11ceDhFXHgxNlx4RjdceDFGKXpceDgwbz5ceDFFXHhBOFx4RThceEQ5IFx4QzBceEVFXHg5NGdceDg0XHg4QVx4OUYxXHgxN1x4OUJceENDXHhFM1x4MDhceEU4W3VceDBBNFx4REZceEMzXHhFOUx8XHhBOFx4MTgzXHhERFx4RjFceDBGXHhCRlx4RjUuXHhFMVx4OEJceDlDXHhGREUpXHhFOClceEIwIjNceEIyXHg4M1x4QjlceDkxNSRceEIxXHhGRVx4QTJceEY1Ylx4OEI/XHgwREpceERDXHgxOTBceDk0XHhDQUpceEI3XHhFOFx4RkZceDEyNlx4RUNceEVFXHhEMDVFXHhDM1x4OUYxXHg5RFx4MEYic1x4RDZxXHhGMFx4MEZKXHgxMF1ceDEzTFx4OTZtbVx4MTRceEI0XHg4QV4tXHhGMExtUlx4RjVceEQ1XHhEM1x4N0ZceEIzXHgxQmRceDkwdVx4RTJceDFCXHhBRlFceDA3XHg4Rig7c245XHhGQzIra31ceEZEXHhBNC5ceEU1XHhEM1x4QTRceDFCblx4OUFceDg4LXZceDgzXHhCNXtceDlEXHhBRTVceDhBb1x4OEZceEIxS1x4QUVoeXlceEJBZVNceDlGXHhDOFx4Q0ZceDhCXHhEMFx4QkFjXHhCODhceEZGQlx4QThceEVEXHg5Rlx4RDR9XHhEN1x4Q0JceDhCTlx4MDVceEQ2XHhFNFx4MTZceEEwXHhERUcgKVx4OEYlXHhEMlx4RkZUL1x4Q0E4KFwsTFx4QTFfXFpceEM0XHgwNV1gXHhBMFx4QUNceEU1XHhFNnBceDk5Qlx4QkFceERBXHhBRmVceEI5XHhBQmJceDE5XHhBMFx4RjZceDgyTVx4RDFceEZBXHhCNFx4QTdceEJBXHhGRTpceDFFXHgwRlx4QzNwXHhCNlx4REJceEI4XHhFNVx4RjBceEM4XHhFNVx4ODBceDFDb1x4QkFceEI2XHhERVx4REQ7IFx4OURceEU0UFx4RDZceEIxXHgxQVx4QkZceEZDcUt0XHgwMz9ceEZGPlx4Q0UyXHhFQzdceEI1WFx4OTNceEU3XHhFRHBceEZDOFx4RjQ1XHhDQmtceENFWFx4MUZceEE2aFx4QzlOXHhDMVx4RjNceEZBWFUqYlx4MUM6XHhCRjlceEY2XHhBMS94XHhDNlx4OEVceEE3cFx4QzE7XHhGOVx4QTdceEM1XHg4N05GPE4mXHgxQ1x4RDNceDhGXHhFOFRceDkxVVx4ODhceEZFTFx4MEZceEM3fVx4MTRceEMyQFx4QTJceDk1XHg4MFx4QTQvXHg4N0dceDhGXHg4Nlx4RkZceDBFLVx4RTl9XHhBNnRke2lceEI2XHhCNEY6XHgxMFx4REZceEIyRFx4RTVvXHgxQ1x4ODlceDEzXHg5QVx4RDFceEVFXHhDOCVZJlx4QjlceEI3XHhDN1x4RDN+XHhDNklceDhDIFx4MTBceDlDQSlceEY1TzVceDFCXHhBNUFceEYwXHhCM1x4QzdceEIyXHgxOCBceDE5XHhBM1x4QkFceEJCXHhBRVx4RUQ/XHg5NDVceDA4XHg4M1x4OTdceEU2XHgwNFx4QjVvXHhDM1x4RUNDXHg5Nlx4MTR5XHg4Qlx4QTRDXHhBNVx4QThceDBDXHgwMHBsU0tceDE1RGZceDhBXHg5RWZceEU4XHg4Q1x4MTQtXHg4MVZceDAwdU1ceEQzOlx4MDJceEFCXHhCNVx4ODNoXHgxQ1x4ODF4PFx4QkJceEQ5XHgxNFNceDAwUXBceEIwXHhEOV9ceEYxXHgxQWpeXHhDOFx4QTlceEI1XHhBN3VceEM3S1x4Q0FceEVCXHhCNVx4RDBceDlEXHhCN1x4MDJceEQ0e1x4Q0JceEE5XHhCMlx4RDVceENFXHhBOVx4Q0RceEMwY1x4QjEjMlx4QjBceDg3cVx4RTJceEY1XHhGMVx4MUJuXHg5M1x4QTlceEI5XHhFOU8/XHgwNDZceDAzcGchXHhGQVx4MEZceDhFXHhCQ1x4OENceDBCXHhBMiFceDAxXHgxN1x4MTRceEYyXHg5MVx4QjguYCRceEM4XHhCNFx4QzVceDk5XHgxQWBceEEwXHhDNFx4Q0NceEFFXHgwRVx4QUNceENFXHhGM1x4QjVceEQyXHg5NVx4RTRceDE4Y2ZceEExb1x4ODZceEI2XHgxM1x4RURyXHhDRDFceEI2XHg5RUpceEIzXHhDOVx4MDZTXHg4Rlx4MTdceEE3U1x4REVYXHg4Rlx4QTNaT1x4MEN+XHgxQ1x4QjlceDAwKVx4QURceDlDXHhGOG9ceEY0WVx4MUQsdFx4RDZceEQxSFx4RjdceDFBXHhEM1x4MDRceDA2XHhBOVx4MTZFOGlceEYyXHg4Rk1cXHgwRFx4RTRceEY2MTNceEZBe1x4MENceDhFXFx4MTFceENEXHhBMVx4RjJceEVERlx4RkJ1XHgwMF5ceEJFXHhCNlx4RTRjXHg4NygkPFx4RTNceEMwX1x4MUJceDAyXHhEQlx4MDJZeyxKXHgxN1x4RTlvLVx4QzU/LClceDlFJ1x4RDN6XHhCRFx4QUJceDhDT1x4ODkkXHgwNlx4RjdceEVGKFx4QkFceEU0XHgxRkNceEU5XHg4M1x4Q0FceEIxX1hceDhCIlx4MTY+IVx4REVceDhBMlx4MERceDgxXHhFQXVmXHgwRVx4MEZceDk5XHgxMlx4MDNceENCW0RceEM0Xlx4RjZceEQwXHgwQlx4MUFceDFEZVx4QkJceDAyXHhFQSlceEE0XHg5OFx4QjZceEE2XHgxM1x4QTdceEJEXHhENVx4RURceEI1MVx4MDlmXHhDM1x4RDAnJFx4MTFceEQwIVx4MDBZXHg5Nlx4RTlceDgwXHgxRlx4QkZceENDTVx4QTc5JFx4RDNTXHhGOHtceEJGXHgwOFFceENCXHhGRUotXFx4Q0JceEE3WFx4QThHXHhGNVx4Q0ZceDEwXHgxMkRceDgxXHhGQlx4MDY/XHhFRFx4RTZceEMzWVx4RTVceEE1XHg4QVx4MDdDXHhBRTF6XHhENFx4RDgtXHhBNlx4Q0NceDk3XHg4Q1x4RTNceEI0XHhBN1x4OEVceEU0Nlx4QkZKOVx4RjRceEU5XHhFOFx4MDFqX1x4MDJvXHhBOUlmXHhDQ1x4REZceEFEXHhFM2dceEVBemwvfFx4RjdceEQ5PiFceEVBXHhFRFx4OEJuXHg4MVx4RDZceEEyV2tOXHhFNFx4QzElbHpceERDXHhBMVx4REN3SFx4Q0RceEMwTlx4MTNDXHgwMlx4RDJceEIxPlx4ODIzXHg5OG1wU0BceENDXHgwRHZ8XHg4Qlx4ODJ8XHhGN1x4RUNceEU2XVx4MDNceEIwKXlceEJDXHhDN1x4RkV6XHhCOFlceEJCXHhDMVx4OEMxXHhCRlx4QThceERGXHhERUlceDBGXHg4MVx4QjlVN1x4REIqXHg4QVx4RDRceEM5XHhBQlx4RUZceEE1XHgwMHFceDA5eVx4MEI2XHg4Nlx4OTlceEUxXHhGNWZHXHgxRVx4MTlceDEyXHhBQ1x4REYgXHhCOVx4RDBZXHg4OFx4OTBpXHgwRXxceDBBXHhGMFx4QUFceDFEXHhCRlx4QTNceEQ2T0JGXVx4MUFceEVCXHhERFx4ODZceEU0XHhBNS5ceDk3QzBceEI5XHhGRlx4QzhceEJBXHgwMFx4QTRceDE5XHgxRUtceDk0XHg4OFx4N0ZceEI4XHg4MUF+XHhGN1x4QUZceEFCXHhGRlx4RDhlV1x4RjVceEJFJ1x4MDlceDA5XHhBRlx4QUVceDgwXHhGRmJceDg3XHhBM1x4OEIuXHhBQXNsXHgwMlx4QkVceEE5XHhDMlx4QzlceEJGXHhEQlx4OEF8XHhFNlpceEZDdlx4QzM3XHhCOVx4OEJceDhDXHhEOVx4N0ZceEVBXHg5OFx4QTZceEEyb1x4MDcuXHhGQjtceEEyQFx4MThceDlDXHg5NFx4MEZceEUxXHhEOChceEYxXHhDQlx4QzlceDBDJH1CPFx4RTQ/W19ceEREXHgxNltceENDXHgwQ1x4OTZceEI5XHhBMFx4MUNceDhFXHhEMWBPXHg5RHxmP0JceEFGXHhFNk5ceDE2XHhCOFx4OTJGXHgxQlx4QkUvXHhFRlx4QkZceDE4XHg5NzRceDA2XHhDQVx4QTZceDEyXHhEQ2dceDk2XHhENHBEXHgxOVx4MTJceDk3J1x4QTJceDhGXHgxRVx4RjQpXHgwMlx4QTFceEEweVx4RjFeXHgwRlx4RDhceENDZVx4QUVceDg1XHgwRVx4MTBceEFBXHhCQlx4OTc5T1x4RjlceEYxOVh4XHgxRVx4OTF+XHg5RFx4QUJFPlx4QTVceERGXHg4OUVceEIxXHhDOSlceDBBXHhFNlNceEFDXHg5MFx4QjgyL1x4RUY2XHg4MVx4ODJceDhFYlx4QzB8XHg4Nlx4MEJceEFEZ1x4RDlceEVBXHgxMzUoXHhBNVx4RkVpXHg5NiJmXHhGMU5ceDlBQUUsXHhDMXlceDk1XHhCREg5XHhGNlx4QjdceEEzXHhDNStceEI2XHhCMVx4MUY4XHg5QVx4RTdceDlBfmBlOVx4RkFceEMyIVx4RDZceEM5XHgwNVx4QkRceEI1XHg5MVx4RjhoUFx4RkFceDg5XHhGRixceEFDXHgxOVx4MEI2XHhDQlx4OENceEM1dFx4RTFceDFFQlx4RTh+XHhGMFx4ODdceEFFXHhDN01ceEZEXHgxOUBceDAwXHhCRFx4QjNceEFBMFx4Q0I6OVx4ODVPS1x4MTBceEY3Wn5zXHhDM1x4Q0NceEQ0XHgxNDJPXHhGOWMzQUJceEY4XHgxMFx4QTRceEE0XHgwNExceENFXHhBNFx4Rjl0TExAbUdceDhCb1x4QzVceERBXHhCQ1x4QTMpXHhCQlx4MDdceEY2XSlceDlEXHg4MzdceEUwXHgxQlx4MUZnXHhFOFx4REZlXHg4MFx4MTdceEQ0YFx4RDduXHhCME5ceDFEXHg5Q2ZceDk0XHhCRFx4RjlCXHhFND9DXHhGREtceEMyXHhCRVx4RjZceDAxXHg4NFx4RDglIVx4RUFceEJBXHhBN1x4OUFQXHhEQ1x4RjNceEYzXHgxM1x4MEYiXHg4M3dceEM1WXNUXHhEMlx4MTY5XHg5NEFIQVAkXHhGQ1x4Qzd8V1x4OEYpelx4RDNceENDXHhEQyxceDFCXHg5NUBceEY4XHhBRHZceEJBXHg4MVx4RTBkXHhFN2x+dGRKXHgwQlx4OURceEI0XHg4RFx4QkZceEZDXHhDOVx4REVceEJDS1x4QUV+XHhBM1x4OTRTXHhGQ0JceEIyJjtceDA3XHgxMFx4QkVceENGa1x4OER+VFx4OTRJXHhGOXlLV1x4MTlCXHgxQVx4MTVceDlFXHgwRVx4MDNceDkxXHg4NFx4OTNceDE4N1x4Q0U5fSZBR11qXHhDMlx4OTRceEJDXVZceEREVFx4QkE9TCZceEY0XHhFN1x4QUV9XHhCQWIzQVxceDA1XHgxNFx4QUJgTlx4RkRceDg3Mlx4REVceEI5XHg4Rlx4OTE1XHhGNlx4QkJhXHgwOCdceDBCXHg5Qlx4RERceDAzXHg4Q1x4OTZceDlFNVx4QzUzXHhGNVdceEY2XHhFQkE2cFx4QjJiXHhCQ0JceEY5XHg4N1x4OThIXHhBOVx4RER5XHgxNVx4QUFceEE2XHhFOFx4REVceEY5bFhceDAxXHg4MlFceDhEMlx4MUJ4XHgwQ1x4QkFCSFx4QThrQVFceENCXHhERlx4MDRceDFEXHg3RkplR1x4QTlceDgwTlx4QzhNXHhFMlx4OTFceEJBXHhDRlx4QTVceEE0XHhDQlx4RTlvXHhFMylCRFx4QTd3XHhFMShceDE1XHgxMlx4RTkjXHhCRnhIMFx4OEZceDg0RDlceEU1XHhBNVx4Qjh0Vlx4RjJceEZFXHhFQlx4MEE/XHhCNlZOXHg4Qlt7JVx4RTVceDk5XHhCOFx4QUJceDE5YDxceEZBXHhBQlx4RjNceEJDXHg4NjpceDlFXHgwQVx4MENGXHhGQitceEVGXHg4Rlx4RERKZVx4ODVceEM1XHg4M1x4RjNceEQ1XHhBQVxceDBDXHhEMFx4MTlceDhCc1x4RjNceDg1e2hceEM1XHhDNzBceEJCXHgwMFx4RkJceDhCXHhFNVx4QjlceEQ5VTYhXHg5NCpceDhCXHhGMFx4MTk8XHhCRlx4QzJceEQ4IG8mU0RTXHhBQ1x4QTNceEJBIypceEY4XHhGNjNceDBGXHgwRU1ceDk1aVx4RTdceENCXHhCQVx4RDhwclx4RjdceEFBXHhBNlx4QTdwXHhBMFx4RURceEYyXHhBNFx4MTlceEY3XHg5MiJceDBEXHg5MTcmfktlXHgwOD1ceEVEXHhCQVx4QzVwXHgxMUQ+XHhGMFx4RUJoR1x4QThceEFDXHhGMVx4MUJceEJBXHhGNlx4RURceEM4XHhDMlx4RjlHLlx4QTVceDhDXHg4M1x4RDJceDFDXHg4NzVceEU4Tlx4MTZ3Ilx4MEJoXHg4MDhceERCXHhFNVx4MDlceEJEJVx4OTVwXHhBNlx4MERceDgyXHhEQThceEQ3NWhceEI3XHhBNFx4MUFceDgwaiFceEExXHhENlx4OTRceDk1X1x4QjNceERFXHgxMFx4RjlceEMwU0lceDg5XHg5Mlx4QkZceEJBa1x4OTFOUmpSXHgxOW0iXHhCNnFceDg3XHhGNHVceDk2XHhGRlx4RkFceEIxYlx4RENceEVEXHhFNixceDgzXHhDRFx4QTJceEVEXHhGOHpceEM1WFx4RjlZXHhFNSNPXHhBRFx4ODZceEQyXHhDRlx4Q0M9XHgwNlx4OEZTXHgwOVx4RTRceEFCJlx4MDdceEJDXHhBN1x4ODlceEQ5XHhDNyhcJ1x4OTlZQVVceEI0XHg5RVx4QzZZXHg4N1x4ODFGXHhFMFx4OERkXHg4OFx4QzFceDkyXHgwRCAuQlRceEY4XHgwRVx4OUZceEMzXHhFRFx4OTNsOlx4MDNceEY4XHg5Rlx4RkVceDBEXHhGNlx4QThTXHhGQVVceEIzXHgxM0hceDFBXHhCOVx4OUVceDA2XHg4MiVceDgwXHhDRkVceDg2XHhBOFx4RTZceEFDXHgxRCJceEU5PFtceDFGW1x4MTl3XHhFMVJceEQzJ1x4RkRrMzIjXHhBQ0BceDhBXHgwNFx4QzlceEMwRXlceEZCP1x4RTZceEIyXHhGQlx4MTNceERCXHgwOW5MXHhEQTl0KlJ0XHhDRFx4ODhceENFXHg5Q1x4MTZIZFdceDk4NHhDXHgxRlx4ODhpW1x4RkJceEVEXHg4MEBceEQ4alx4OTRceDk0XHhFOFx4QzZceEIyXHhDM1FceEZDXHg5MVx4ODRceEYxSVlceEMxelx4ODRceEZEXHhDN1x4MERceEY0XHhCQ1QjXHhCOFx4N0ZceEUzXHgwQVx4QjlceEQzXHhEOVx4OEJceEE4XHg5NH12ZFx4QjBceEJBM1x4QzZLXHhFRFx4RERceDk1K1x4ODcteVx4ODMzP1x4RThceEQ2XHhCMWVceDE0Zlx4ODNceEM3XHg5MURLQ1x4OUE9QFx4REFceEEwJVx4RERceDgxe1x4Q0NceDE5RVx4QjFceENCKFx4MTdyXHhEM1x4ODVceDA3XHhFQlx4MEFceDk5O1x4MTJ1XHg4Q1x4MEU/XHg5Qlx4QkRceDBGQFx4ODZceDg2Q1x4QjJnXHhCNmlceEQwXHgxMFhceEYzImFceDFGXHhDMzdceDlDXHhBRTpceDg5XHhERGFceEUxc1x4RjMpXHg4NilceDgzXkh1dlx4RTdGTk5ceEJCXHg4MUpMXHhGQlx4RENceDlBPVx4RDNjXHhGMVx4RTJceEM3XHhDQURceDlEXHhFMVx4RTJQXHg5QytbYFx4MERceDk5SCdceEFFXHhGNVx4OUVceEY1XHhCN3ZceDAzU2ZOXHhERVx4RkVRXHhEQ2tceDk0fVx4OENceEZCPlx4RDdceERGe1x4MDgjXHhBMFx4RkRceERBLVx4REVceDhDM1x4RERceDlEXHg5MDhceDA1XHhDNm5ceEEweFZceDk3XHhEM1x4QjJceEQyXHhERUhceDk3XHgxRVx4MUVceEMwXHhERlx4OUFceEUyXHhCRVx4QUE/XHhFNlx4RUE8XHhGRG9kSVx4RDVceDBDXHgwN1x4OUIlXHhBOHVRZVx4MERceERCXHgxQlx4QUZceEJCKzJceDFFXHg4Rlx4ODdLXFx4QUVyS1x4QTZceEFFZ3RceDBDXHgwQlx4RUFNXHg5OFx4RTlceEE4Y1x4MERceEU0JFx4RjN7XHhGQ1x4OERpXHhCQiJceEUzXHhBMFx4MEZceEYxXHhBQnhceDFEXHhDQ2tceDkzXlx4MDZfd1x4RTFceEY5XHgxQVx4RDU4XHhDQ2tKXVx4RjFceEZDXHgxNn1ceDAyXHgwOCBceDEzXHgxOVx4OEFceDA5XHgxMlx4RERceDE4XHgwNDxceEIzXHhDMVx4MDFceEJDTlx4RjlceEM5XHgxOVx4MDY/XHhFM1x4RkNceDlFbVx4QzFceEQ5XHhCNEdceEE0L1x4MEVceDFBXHhFNFx4QjNceDBCXHg5NFx4RThceEU1XHg4M2RSPlx4Q0NceEZBXHg4Q1x4ODVceEU3XHhEMlFceEIzXHhGQVx4QTNceDBFXHgwRFx4QUMrPlx4QjhceEU3SDtceDExXHhCQ3lceDAxXHgxRXRqXHg4RUNceEY5XHhDQ1x4MDlceEE4O1NceDFBcHZBXHhEQzQiQ1x4RkVceEIyXHhCN1x4QTdceEI5O2s8XHhBRVx4RjhceDhBb1x4RTVceDg0QFx4QjFceDlFXHg4MSNceEFBXHg5NVx4REVceDgyXHgwRFx4MEFpXHhCM1x4REJceDlBZjFceENDXHhGMVx4RTdceEIzXHgwNS9hXHhDMytceDg0XHg4OFx4MTJceEY5XHhBMFx4OEZceEUxUFx4OEZceDhCXHg4OVx4ODZceEE1XHgxRFx4QTlLXHhBQlx4QjBceDgzIVx4OUZceDlBXHhBMFx4MDA5M1x4RTd9I1x4OUNceDhBXHgxMnhxXHhBNVx4MEZrXHhBOVx4MUZceDlGLih5Xlx4QUJ7XHhERVNceEMyXHhDNG1RY1x4ODVceEI1XHhFOFx4QkNceEQ4XHhBMGBceDE4XHhBM1x4RjAxXHhGN1x4ODRceDA5XHhBN1x4MUVceEUyXHgxOUJceDE5XHg5MD86X1x4RkVceENBXHhDRlx4MDhceDFCXHhCME9DXHhBNlx4QkZceDkxc1dceEQ0XHhCMVx4MThMXHg5Nlx4QTNceEE1XHg5Ny9ceDAzXHhCN15ceDEwXHhCM0RUbnU8XHhCRlx4RkJceDg5XHhBQVx4QUJceDg0XHgwMlx4RkU/SVx4QjNceEVCNzZceDk0MHlYNFx4RDgzXHgxNTdceERBWVx4RENceDk4eFx4OTRmXHg4QVx4MDIgIGlceEM4S1tceEFFOFx4RTE+XHhDRlx4QzcqXHhCNFRceEYxXHgxNFx4RENPXHgxQlx4MUM6XHhGQUxceEI0N1x4OENceENGXHg4NVx4QTQmMlx4MEZceDA5XHhFRFx4RjZceEQ3XHgxNFx4QUNceEZBfE9ceDFGO3diaFx4RjFceDFFXHhFRE1ceEFEXHg5RFNceDg1d1x4MTU2OjpJXHg4NVx4QTFceDk1XFx4OUM9XHhCRC5ceDg5SjBceDEzXHgwN1x4RThceDkzXHhCOThceDE4SFx4QzhceDAyXHhDM1x4MDBceEIzJ1x4RDJceEVBXHg5Qlx4OTFDXHhGQlx4MTFceDgxXHhBQ1x4QjZceDFELlx4RjBceDFCXHhGQlx4RTFceENCKlx4RTllXHg5OFx4QUFceEYxN1x4RTdceDE0XHhBMHpceDhEOlx4RjZceEI5bVx4RDZceDFEXHhBRFx4QTkrXHg5Q1x4MTM5YyJceEYyXHgwM1x4RkZOXHg5NDZceDFCUlx4RjZyc1x4RTFceEQzXHhGOFx4RjVceENGXDlceEI3YzRceDA3XHg5MVx4RjltXHgxNDVceEYzXHhDQ1x4MUQweXc6XHhDRVx4MERceDAzIVx4OURceDA3XHhBM1t0XHhCQlx4QjlceERFXHg5MWhceEJCXHhGQ1x4ODRceEVDNVx4MDlceDE3dk9ceEJFWVx4ODhEXHhGOVx4RjNceDAzYFx4RERceEUxJlx4MTRceEI2LFx4MTJceEQwXHhDQkYhTj5ceDExXHhCRVx4RkVceEZFXHhFNlx4RDhwXHhENlx4ODRceEIzUV4qXHg5OVx4RTguSVx4MUNceEM2Nlx4MDRceEEwQlx4RjBceEE2QXhceERDXHgxN3J8XHhBRlx4QTJceEQ0XHhCMFx4RDVceEQyXHhGQVx4QzJceEI1XHg5QitceEE2XHhGOVx4MTFceEU2XHhFM1x4OUVceDEwSFx4MDJ+XHhGOW9ceEY3b1x4RDE1UVx4Q0MnaVx4QjFceDBGXHhGNlx4RENceDk5IXJceEIwMVx4MTVCXHhDMjshXHhDN1x4QjhceDkzXHhFN1x4RUJceEZEXHhDMlx4QkVceEYzKDNhXHhENVx4RjY3Zk5ceDBDXHgxQkVceEMwXHhDMD9ceEZGXHhBNlx4QjZzXHg4RVx4MDRmXHg4Q1x4QzFceERGOkhceDk0XHhDMnlceEE4TFx4MUNzXHhEMlx4OUJceEJFXHgxRGgydVx4RUFceDg3XHgxNzxceEJGXHgxQVx4OEVceDgwXHhDQlx4RjJceDAyXHg4RUBOVTpceDFDSVx4OUE/XHhBMVx4RDZceEE5XHgwRldceEY3XHg4OFx4RkJceDhDP2tceDE4XHhBQVx4N0ZVXHhBNFx4MTlceDExKlx4Qzcgbzgyd1x4RUFceEZEXHg5MFx4ODlYXHhFQVFceEY4LmNeWGFfXHhFMlx4QjhceDkwRFx4Q0JceEU3blx4RjVceEJDXHhDRlx4MEJceDEzdVx4OUVceEFFXHg5QWd7XHhEQlx4QkVceEVFci5ceEFBXHhBRFx4QTUkSVx4MERgXHhCRVx4RjcqXHg4MFx4QzUyXHhCMmRceDAwREdsXHhCNiY5XHhGNVx4RTEpRlx4RUJUXHhEQjIiXHhBNlx4REVIXHg4N1xceDk4XHgxNXc+XHhEMW9ceDk0VFx4ODVceDA3XHg4NVx4RkR5XHg4Rlx4RTFceEJCXHgwMFx4RjZceDgwXHhBOShceDBGXHgwMlx4RDdceDFGXHg5MSFceDk4XHhFQ1x4REVWXHg4Qlx4MTlceEUyUFx4RjRceEREXHhCMXJLXHhENlx4OTdceDFFUEVceEUxdVx4MTJOQlx4RkJceEUzXHhDRlx4QTJceDk4XHg4Rlx4QjNceDEyclx4OUFbb1x4REVDXHhGQ1x4RDZceEE1XHhDQ1VceEQ1XHhFQlx4RUVceDg2RVx4OTdceEZGXHhFOVx4MEVceEMwKGBceEU4XHhGRFx4QjApXHgwN1x4QjZceEFBXHhFN1x4MTFceDEyIVx4QjNceEJDPFx4QTc0XHhDNF0mXHgxRSM9XHhCNFx4QkZceDg2U0NceEExXHhFQ1x4QjNceDA1XHgxNWZVUThceEU2XHhBRlx4RjRcXHhCRFx4RDNceEI4XHgxRlx4Q0U5KXB1XHg4QVVLXHhDNlx4QjhceDE0MFx4RTR0XHgwNFx4QzZceEQzXHhCRVx4QURceEY5cCNceENGXHhCOFx4MEZceERCb1x4QzJceDk5XHg4M1ZceENCcFx4QUJceERBSSYyXHg5Qlx4RTBPXHhGRVx4RkRceDE4fFx4RThoLyFceEY0XiRrXHhEMVx4OTckXHhGNFx4Q0JceEJGYVx4RkZeXHhGNHhceEIwXHhFOVx4RUJCXHgwOFx4RUFbOjNceEMzXHhFMFx4MDJceDdGXHhDNUFceEQzXHhCNkl2XHhBNFx4RjNceEQycVx4MTAqJ1x4OENceEE4XHg5OFx4REFceEY3XHgwMGJTWShceEJGQFx4OUZ9SCtceEEwXHhERVx4QjRceEZCdmt5XHhFNFx4MEZceDhFVTh4XHhBQVx4RUNceDAxPVx4RTBceEU1XHhCOFx4MTlceEMxXHg5RFx4RTJceEYzXHhGQVx4RTRceEY4IVx4RkZMXHhCMVx4RTM2XHhGNFFceENBYlx4RDF0XHhCNFx4OTdceDE1XHgxMVx4MDZceEU0XHg5OFx4RDJceEIyT1x4QkFwXHhDQVx4RUY7XHhEMTcjXHg4M1x4MTNceDg1XHhEM15ceDlGXHg4RFx4ODVceEFEXHhCNFx4OEJceEJFLFx4QTNceEE1XHhGOGpceDlFXHhCQlx4QzcvXHhGMVx4REJceDE0XHhCRFx4RTNMXHgwOF1NXHhBM1x4QjZceDlFXHhBQWNceEExXHg4M1x4MTdYXHhCN2BceEQ0XHgxOFx4MTR7XHg4Q1x4OUJceEI2XHhCRFVceDA3XHg5N1x4RDlceEE3SVx4MUVceEVCZFx4MDEyXHhFNj1ceDdGXHhEOFx4QTdceDlCWV0iXHhBQ1x4REFlJFx4MTRCXHhEQVx4QjROXHgwNVx4REEuXHhCM1x4RENceDhEX1x4RDMmXHhDRlx4MTRceDBGXHg5Qlx4OUFceEZCXHgxNkxceENDXHgwQVx4MDJFXHhDRlx4ODhceDg4elYgXHhDOFx4RUVceDhGT1x4QTVceDFFXHgxMFx4MEZceERDXHg4Mlx4OTZceEIwXHgxMzJceDAyWms5OFx4ODlceEJFRCRceEExXHg4MUxceDlGZSlceDA3W1x4MTRceEM0XHg5QUJceENBXHg5NWxceDFBZ1x4MTFceEE1XHhDQVxceDhDXHg5RFJceEI2Z1x4QTBNXHhCRlx4ODBceEE5XHg5Mj5hdDBOXHhBNVx4MDVceEM3XHhEMTlceDg3XHhGOCUsc1x4MEJwXHhGMlx4MEVaXHgxQzVceEY2XHhDQnNceDlEXHgwOFhceDhGXHgxNFx4QzVIJXVceENDXHhCRDlceDg1XHhFQ0pceEJDXHhFN1x4QjhjZ0dceEI2XHhCOFx4MTlceDhGXHhCRVJIXHhCQXRkXHhCMVx4RTdBXHhDMzJceEIwXHhERHpceDhFXHhEOVx4ODBceDA2XHgwMy1ceEQyLFBceDk3XHgxRFx4MENceDE3dldceEZBXHg4NEo2XHhEMV9ceEVEWVx4RUZceEUzSSJceERFXHhBMS1ceDg0XHg5NCd9V1RceEVEXHhEM09ceDg0XHg5OVx4RUJyXHhEMFx4QzNceEUyXHhFMkhceDg5XHg4RDhTXHg4M1x4QzU4XHg4N1Eme1x4MEVceDFDP1x4RjNceEU0XHg5MXtkXHhDRlx4MUJceDBEXHg5QlVceEI5XHg3Rlx4Qzg2fVBceDFEXHgwQTJJV0JceEZBXHhFRk9ceENBXHg5N1x4QzRceDBFMVx4QTdceEIzcFx4MEZceERGR1x4RkZceEUwXHgxNFx4RTBceDE3JmZVXHhCN1x4ODZYJ1x4RTVlPUlceDAxT1x4QUVceEYwVFx4QTUkKEBnXHg4OFx4Q0JceEUyV1x4MUFceEE3Qlx4REZFcVx4RTVceEVBalx4OTNceEE4XHgxMFx4RUZceDkweFx4Q0NceDlEVlx4RjdceERGXHhBRVx4RDJSXHhEM1x4QkM2d1FceENCXHg5Q1x4MEJceEY4XHhCRnpceEExWX46J1x4MDAiXHg5NFx4QzVWXHhERlx4QTRceEIyb1x4RjkpU1x4QURceEFCaH5ceEFCXHhGNy5zXHhEQVx4QkVceDg3XHgxQ1x4MDY+W1omc1x4RDNceDBDLlx4MDBEa1x4MDVJXHhBNVx4MTFceEQxLC5ceDhBXHg5OXxceDFEIlBceEMwblx4MDVFdVx4QkJceDkzXHgxOX1ceDAyXHhENFx4QkY8Slx4REFceDlFXHgwOVx4RDA6XHhDQVFLXHg5OC5ceEMzXHgxMlx4MTZceEZFXHg5QVRceDAzXHhENFx4RDZceDg5XHhFRSJHXHhDQVx4OTVceEM3VFx4ODYsXHg5OFx4RDVceDBCc1x4MEZYXHhBNCEiXHhBMSNceERDXHgwOFx4ODIuXHhBRFx4RUNceEE1Wlx4RTN1Tlx4QjBceEQ3OE9ONURceDBGY1x4ODVceEM4XHg5Rlwpclx4OTlceEJBXHhGMidceEU2XHhGQVx4RDI0XHhERlx4QjE0WVx4RERceEU1XHhGRFx4QTNceDBGZVx4QTJceDE4XHhFQ1x4OURaXHhGMlx4RUZVXHhENlx4RThceEREYFx4RDRceEIxXHg4RjhrRlJaMVx4RUNceDg1XHhBOVx4RDZceEJCXHhBOSZceEE3XHgxM1RceDg0XHg4OGhBXHg5MD1wXHhBOVx4MDdRXHhFQzhceEI1bkFceDhFXlx4QkNxXHgxOVx4MTRsXHgxN1x4RDNceEQwXHhFNX1ceDE0aGtceERCLlx4OUFceEM2Ylx4QjZRXHhBM1x4QkFceEU1XHg4Nlx4OUZceDk1PFx4OTdceEJGXHhBQVx4MDFceEM2XHhGNDVceEY0XHhERlx4QUVceDlDWzR5b0tAUihceDAwXHg4OVx4Q0FceDE2dUhSVVx4QzBceDkyXHg4N3VceEQ4XHg5RFx4RDBcXHhFNVx4RUZceEUyeFx4QTFceDA3Wlx4RDdjXHhBNFx4RTlceDk2IFEnXHhEOVx4MDFceDgwIFpceEVEXHgwOG5ceDAzS1x4QjVceEJDbVx4RTJceDAxMlx4OTFMI0tHYCNceEQ5e2dceEY3XHg5QVx4RTZceDhBXHg5OFx4RUFceDA0XHhCREFceDk4JFNaXHhBRH5ceDA5Llx4RUJgXHg5MXZPPVx4RENceDlCXHg4QWZ4XHhFNlx4RTRceDEzXHg5NVx4MUNceEJCXHhDOCNRXHhDQTNceDk1XHhCQVxIXHgxQ0tceDlDXHhDOHVceEFDRVx4MTBceDAxXHg5MldceEFCTlx4MDhceDAyXHhBRFx4QjBceEZCXHg4MVx4RUZPXHhGRVx4RTBceEZCXHhBOGJIXHhEQzpceEU3XHhGN1x4MTNceDg1VVwlelx4REFceDFGJlx4QjNceEM1d1x4ODRceEVGWFx4RTFUXHhENlx4RjFOXHhERlx4QUQ0XHhCNVx4RUV9Ym1ceDg4Nlx4MEJ9cVx4MEJceDk0XHg5NFx4OEJceEY5XHhCNl9ceDE0XHgwQVx4RTduXHhDQyFceERFLlx4OTY8OFx4RjNMXHhGOFx4ODdceDBFXHhBNCYkK1x4RTFjN1NceDgzXHhGM1x4MDVceDg0WUZceEMwXHhDRlx4QkNceENFR1x4QjhceDhDXHhEQlx4QjYjXHhENjUrXHhDMU4wQywsXHhDRlx4RDlQXHhDMHEgWlx4OTRceEMzXHhFM2drXHhBQlx4RUVceDlCXHhEMFx4QUReXHhEMVx4QjMlXHg4RjdceEEzXHg5RDBceEREI1x4ODhWXHhGOFx4RUFceEM2XHhDNFx4QjJTZUVjblx4QzdceDAzXHhBOENceEU0flx4ODNzXHhCNVx4RkZbXHhGQlx4OUVceEFFdVx4ODZOXHhFNHtceDFFXHhFNEl7Nlx4RkJ1Z05ceDE0ZjlceENGXHg4RE57XHhEMVx4QTJceDhDXHg4OVx4RjZceERDJFx4MUZ+XHhGNlZceEY1a1x4QUNUXHgwOWJiXHhGRlx4RUJTXHg4Nlx4OUU8XHgxRlx4QUNJXHhCMFx4QzFpQ1x4RjZceDg2XHgwOH0ubXhGKFx4MDV0clx4OEZceDA1XHgxQU9LXHgwM1x4Q0VFXHgwNX0hcFx4QzUlLFx4RDV2XHgxNVx4RjJceDhDXHhCNVx4REIxOXx3XHhDN0NceDhGXHhGOXBceDkyK1x4MTRceDgzXHhCQ1x4RDBceDA4LDtceDhCYlx4QUFceDhEXHhBNFx4RTlceEU3cVx4QTVceDBEXHg4M1x4QTVceDk2XHgwRFx4QTg4b1x4REFpXHhEQlx4OUVWXHhEQT0+XHhGNVx4RDJceDBEQFx4ODIyXHg3RipceDk0XHhBM1x4OEJceEYzaVx4MDZceEM0Qlx4QTNceEJCXHg4QjBceEVEXHhFRVtceDg2Z1x4RTFceEIzY1x4RUVceEIyXHg4RlIreVx4QjhWbVx4Q0I1XHgxQlFceEIyXHgwMFx4RUFceEI0XHgwMlx4QjE4Zlx4RkRceDg2XHhGRVx4QzdceEY3XHg5Nlx4ODNDXHgxN1x4RjRceEUzXHhEMFx4OEQlXHhCOVx4RDlceEVFXHhDMlx4QUJnXHg5NVx4RDkxXHg4OCEmJlx4MUEuXHhCNnNceDFDXHhGMVx4RkJuXHgwRVx4QURrXHhBN1x4RDNceEQ4a1x4ODFceEFDXHgxN15ceEI2VCphXHg4NzxkXHhERUc5X1x4MDg5dCtceDhGJlx4QkNceDAxUUgobDRceEYxd1VMSFx4OENceDhCXHhFN1x4QzlceEY4KFx4QTFhNlx4QkQjJlx4RkR9R1g4cSxsQ1x4RERceEUyXHgxNVx4MDZceDg0Pi5ceEMwXHhBMHAsbz1ceDlFXHhFOXRsJ1x4REFceEJCXDdbNFx4QjFnVzVceENEXHhGOVx4QzE8XHhGOFx4MDhceDhGYlx4QkJceEI0XHhFMVx4RjgyNndceEQxXHgxMVx4QkJceEM5XHg5NHlceEZCOihceEFFZ1x4QTdAXHhENlx4QjFKLVx4RER0XHgxNHVceDA4KipTXHhDOFlPXHhDNGhceEU1XHhFN2dceDAwUlx4OENhWmRceEQ4XHhGRldceEE2XHhFODdceEVCXHhBM3VceEJGXHg5Nlx4MTNYXHg4NVx4ODlceEUwTVx4QkJceEQ5XHgxMjNceEYzXHgwMVx4QUFIXHhGQVx4OUEgciBceDFBXHhENVx4REZceDk4XHhBRTpceEIwXHhCMlx4OTBceEYxZmpceEJGelx4RThWOy9ceEQycVx4MEVCXHhFRlx4RjdceEEyXHgxQnpceDgxXHg3Rlx4QUNmUExceEU5Z1x4MTE8RFx4RUNceEIzXHg4Q1x4MTRkXHhDOHNceDA0KFx4QjdceEEwXHhDNVx4QzNsXHhGQlx4RjA7XHgxRVJWN2tceEU1XHhCMVx4ODFIXHg4NHFceEQzXHhGM0FceDBETypJbVx4ODZceDhBXHhBM1x4OTZceDE5ZFx4N0ZUXHg5Qlx4MTMqXHhDQlx4QTAoXHhGRVx4QTJceDE0LFx4MTZceEUyXHhEN1x4ODJceERCXHg4Rlx4RDk6Ly1eN1ZceEYzKyFceDkyXHhDOVx4RUVceEI4ZFx4RjJaXHhFQ1x4OTdceEU4Q1x4MTRceEY2XHhBRnpceDE2XHhFRVx4RjE0XHhGMG9ceEU0XHhDNH4te1M7XHhFNHVceDlEcldeXHhDNEZceDFEXHg5MEM0MmhceEQ3XHg4QW5ZXHhBMFx4QzNhXHhGOFx4OThceEVBXHhFMFx4QzlceEJCXHhGNVx4OTVceEQwOVx4QTBKbFx4MEN7Xlx4MDVceDA3Mz59XHgxNFx4OTlhXHhEQVx4QUZceEY5XHhGRVx4MDFceEM1OVx4RjNceDFDXHg5M31ceEQ1XHhBMSNceDk5dlx4OUJceEVGXHg4MVx4ODJWSjNceEU3dDoqXHg5RVx4RkNceDA2NHt7TVwjey1hPlx4OTZceEQzXHhDNHUxcTJceDEyQVx4RjlceDlCXHhBOVx4QURceERCXHhBNVx4ODZceENGXHgxQ1x4MTNceEQ4XHhFOFx4RjdceDFCTj5ceEUyXHg4N1x4QkJ9XHhBNUdwXHhGOFx4OEVceDEyXHhFRVx4MERceEY4SWFQTVlceDgyZEhceEFDXHhBMVpgc1x4Q0JocWBceDk5XHhBNlx4OUUsXHg4RFx4QjJceDg3KFx4Q0FceEQzXHg4Q2hceEYyXHgxOFx4OEJceEYyXHg4RFx4ODRceDg0fVx4RjRceEY3XHhDQmhceEY1XHg4NHVceEE0XHgxQlx4QjRceDg2XHgwM1x4OTNzXHhDRlx4RDBceEJGSlx4OEUtIlx4QTNceEZCXHg4RjVceDBEXHgwMDV0XHg5N1x4MTdceEEyXHg4OFx4MEZceEM3Mlx4MTI9XHgxRlx4OENceEFEXHhFN1x4QjNceDk0Ylx4MUFceDE2XHhDMV4oXHhFRWJhXHgwQWRceEM1XHhGMFx4MUFceEU4bilceEU0XHg5NFx4QURceEVDXHhBRFx4OTRWXHhEQVx4OTdceENCXHg4OS9ceEVBM2NceEE1XHgxMEZQXHhEQVx4OTZ+Z1x4MDZlVVx4N0ZhXHg5NFx4MEZQdFx4RDlceEY3fXJceEYxXHhBNFx4QkJceDA2XHhDN1x4RUFceEFFXHg4RWB+XHhEQVx4RUJceEU2XHhCMFx4QzhceDg2XHg5M1x4RUZceEY3XHhBMlx4QTRceEE1T0lceEFBXHg5NkJNPFx4OEM6XHg5MWRceEZGPVx4QTFfXHhCRSV9XHhCMlx4REZceDdGOjNceEVCXHgxRlx4MUNceEE2UFx4OTJaXHg3Rl5AbDhceEI1XHhGMWQ6XHgwNyVjXHhERVx4OEVKXHg4Qlx4RjBaXHhERlx4RjVceDFFXTRceDg5S1RceEQ1OElqXHgxNWhceEVFXHhCMVZceDE1XHhBMntTXHg5Q0xceEMwTCZceEYzXHhEOFx4MTdceEY3XHhFOFx4RDU+XHhBRlx4RTBWXHhEMkVceEQwXHhFQWJceEQ4XHhFMlx4QUJtXHg5QVx4RkNceDhGXHgxN1x4OEZceEJFIlx4MTJceDhDXHhFOTM6XHhCQ1x4RjRceDAyXHhBN1x4RURceENFXHhEOXxceEFDYlx4OUFceEZBXHhEMFx4MDY4T1x4RTJMXHhCMFx4MTdceEQyXHhFNFx4QjdceDAyXHhBRFx4RDVceEJDcVx4RkRceDA3Olx4ODQqXHg4M0ZceDkzXHhDOVx4QzVceDFBXHhFQ1x4QUVceDg0XHhENlx4RThceEZEXHgwM1w+XHg5RVx4RURceDlBflx4ODRceDgwXlx4RkFDXHhBQ1lceEQ3b3FceDlBQ1x4MUNceEFEN1x4OThceEJBZGVceDFDXHhCQ1x4RUZceEEzc1x4OTZceEE2XHg4NFc4YFx4Q0ZceDAyO1x4MDZceEM0dlx4QUFceEEwXHhFRlx4RTZceDkzXHhFNFx4RThceDg0YFx4QTB+XHhBMURceEREQVx4MTdceEEyelx4OTNceEYwXHhENmFZXHhGM0BceEFEXHhDNVx4QzNceDE0XHgxOFM2QFx4RDdceDlCXHhDNVx4RDJceDA3XHhEMytmXHhFQVx4RTYoXHhCRXFlXHg5Nm5ceDlFXHhGNFx4OTBceEVGXHhENyVceENGKVx4MTNceEZEXHgxREEiI1x4RDRceEU2dlx4MEJuXHhDNStKNlx4QzdIXHhFNlx4QTFceEQ1O2whXHhGNFx4RkFFXHhGMFx4ODZEXHhDRFx4RUZceENEXk8sXHg4N1x4MDlceEY4T1x4ODBceEY1XHgxRi1ceEJBXHhERDJceEYxXHhCQlx4MDlceEZEXHhCM1x4MDdDXHg5NXVLXHhFQlx4ODFceEY5Mlx4QjdceEQwXHhGNlx4RTdceEQzJlx4ODJceEMwKVx4MTlceDFDeXQgTTZKXHg4NHtceEExXHhGQ1x4OTFceDBGKVx4RTN6d04qXHhCOVx4RkNceDAwXHgxRVx4RjJceEVBXHg5N1x4QTVYXHhDMlpceEE0XHg5OVx4QjY8LVx4MEFceEFFbm9ceDAxXHhFOHtceEYyK1x4QkJceEUyXHg4Mlx4MDE0XHgxRFx4ODdceEFEXHhDQVx4RjJceDFGPl1ceEUyXHhGRVx4QTVceEFDXHhEN1x4RkVceEVCLFx4QkNceEVEXHhEMVx4ODlceENDXHgxRlx4RjZob1x4Q0UqXHhEMS1ceDlBXHhGNiJceDk5XHhBOV5ceEYwe1x4QzdceDg2YjBceDlCJVx4QkFLXHgxMVx4REIpXHhFRFx4QTRceEE4XHhFQnBceEQ0XHhBMTRHJmJceEM4XHhEQlx4MDhceDFBXHhGM1x4RUJceEU2XHhCQVx4QjhceDA1XHhGRFx4OThceDEwXHhDQ1x4RUVceDE3Z1x4RTFEQldIXHhGRlx4OTRxXHhBQ086PFx4RjJyN1x4OENceDBGXHhCRFx4OEJceEE0XHhGRCVceEU2bmtceEQxXHhCNlx4MERoXHhERlx4RTdceEQ2ViJceDFGXHhFRUtceDEzXHhGNFx4QzdceDg3XHgwRlx4QjBiXHgwMVx4RDElXHhEQlx4QzBceEE5XHhEN1x4OUJceEZGXHhEM1x4Qzh3XHg3Rlx4OTggSFx4OTZceDBDWlx4OTV8MFx4RDZIXHhGN1x4MURceEIzXHhFRTtceDkwXHg5RVx4OUIqUVx4QzlceDlDOlx4MERceDFBXHhBNVx4RTRceEU4XHhEOD1ceDg1XHhEM1x4QjZceDFBUFx4QTgsXHhENlx4QjkiXHhDNSxQT1RceEMwXHhCOF5ceDEyPlx4QzlceEQ4XHhEMyJceDlEXHgwN1x4RjZceDkzXHhFMlx4RkJOXHg5Nlx4QjZceEVCXHhGRVx4RkFwXHhERlx4QTlceEJBXHg4NVd8SVx4RTFceEE2XHgxMGNceDFGXHhGQlx4MEVceEUyWlx4OTJceDhEXHg5Ml1ceDgxWEpceEY2Zzk7XHhCRlx4QkNceDE0TDlceEQyXHhFRVx4RDJceEYwXHhBNjlceDFENVx4RTBceEE4REdceDhCXHhGRVJceDAwXHhFRVx4QzJceDA2XHhDMGFBdV5ceDgwXHgxRjI/XHhFRlJceDE5XHhDQ1x4MUNceEU5Rlx4MTlceDgxflx4MDdfb1x4QjdceDAxO111fFx4MDIyQlRjXHgxNVx4MEQ8XHgxRFx4RDUme0wjXHhCQ0pceEI0XHhFRkxceEQxXHhCOFxceERCXHhEM3NceDhEXHg5NSFceEI5OVx4RjNceEI5SFx4OUJKXHhCRFx4QjZkXHhGOHN6XHg4N1x4RUMwXHhFRlx4RUFuXFtceEI4XHgwNVx4RkRceDk1dUpwXHgwQVUlXHhFMFx4QjVceDg2XHg4Q1x4OURceEUyXHgwRFx4OEZKe1x4OUFceEQ4XHhBNlx4ODFceEFFXHg4NFVceEEzXHg5NFx4QUVceEMxXHg5MllceEUzXHhFM1x4MEVceERCXHhCM1x4RDNceEMyXHhFRVx4MTJXXHhENDlceEE1XHgxNFx4ODFVXHhBRVx4RjJLXHhGQUFhXHg4MFx4Q0JRXHhFNVx4REFceEM1Slx4RTNceDBEXHhGNFx4ODVceDAzXHg5NVx4Q0V0Ulx4QkNceENEXjhceEYyXHg5QSdceENEXHhGQ1x4RjVCM1x4MTFceDg3XHg5Nlx4QzlceDhCTlx4QTZseFx4RTVvXHgxOFx4RTU+XHhDQVx4OUIwclx4MDRceEMwXHgxRFx4RkNCXHhGNFx4OUNceEQ2XHhFMFx4RTBceENEXHg4Qlx4RUNAXHg4Q1x4MTlceEI3dlx4RkEqYklWVipceDEwXHgxNHA4cFx4RjhceEM2XHgwRlx4QzZceDhEd1x4QzVceDk0XHg5N2BceEVEXHgxN1x4OTJceEJDXHhGNH1ceEQyXHhDNlBceERBXHhFNntceEZFXHhGNVx4QzBceDgxJlx4RTFceEZDXHhCNDdceEI0XHg5QVx4RkJceEE2XHhDQVx4QkJceDlEXHg4OVx4RDFXJl9ceDg2XHg4Q1x4QjdxeVx4QzhceDk2XHgwMFhceEFGOFx4Qjk3XHhGN1x4QjF3XFx4RTE6XHgwOGBceEQ5XHgwQVZceDk4XHhENlx4QThceEIyXHhERVx4ODhceDkxXHg4N1x4RTQjRlx4MDhTXHhBQVx4OEFceEM3T3hceEY5XHhEMlx4Q0RceEIwXHhCQ29Palx4QzdceEM1Klx4MEFceEFBQlx4QkNceDE1PFx4RTlBXHg4OVpceDhGXHhDNGBsXHhBRlx4MDFceDg5XHhGM1x4ODhceEY3XHhBOVx4Q0JceDEwTFx4OTR9XHhEMVx4MTckXHhFMVx4RjRceEVCXHg5Nlx4ODdceEE5NzFceDAwXHhENlx4ODhceEVDKkZceEIzcVx4OTlceDE3XHhBNlx4QzhceDE4XHg4RFx4RENtXHgxNlx4RjRceDFFXHhCRSBceEU4TFx4RkZceDg3XDV7XHhEOVRceEIzXHhFNk9ceEEzXHgxNFx4RjhceDBGVGUoaFx4OTdceEMzXHg5Ri5CSzJceDhGWlRAPU1HXHhDRn0uXHg4Q1x4Q0M7XHhFNlx4REN2XHhGNFdOJ1x4QkQ2TX1ceEVGXHhCRlx4RjRceDk4XHg5Q1x4QjVceEE4Kz54XHhBN1x4OUVceEJGZ1x4MDBceENDXHgxRVx4QzBceEM2LVx4REZceDBEXHhGNyVceEYyXHgxQ1x4ODBceEE4XHg5RVx4QjRZXHgwOFx4QTNceEZBclx4MTVceDk0XHg3Rlx4RkVceEQxXHg5Ml17UVx4QTRceEVEXHgxOVx4MTJceENBVVx4QkFXXHgwN1x4MDlceEVGXHhCRWRceEMwP1x4REVceEJCXHhBRidceDg3XHhDM1x4RDJceDkyXHhDOFx4RjZceDFBXHg5N15ceDg4e1x4RTNFXHg4Mlx4RjJceERDIlx4REFceEMyXHg5Mlx4OUFceEQ5XHgwMXtceDBDbFx4MDdceENGXHhERmlceDgyXHhBNV5fXHhDQyg4XHg4RFx4RTNceDhEUFx4REFceEQ3XHg5NVtceEU1TFx4QTdfLVx4RTBceEUzVnsqXHhERWIoXHhBMVx4MTZceEY1XHhDRE9ceDAxXHgxMlx4RTNceEVBXHhBNENceDhENFx4QTNceEVDSFx4RTNceEE2XHhFOHhcXHg4RFx4OTI+XHgxQlx4QzNceDgxXHg4MFx4QURceEYwXHgxNFx4QzdceENDXHhFOCEwXHhGMlx4QkVceENEOUlceDk1XHg5NnBhelx4QjlceEVEIzs0XHgwMntceEVEZ1x4Q0RceDlGXHhGRCRceEFBXHhDRFx4RjJceEZCXHg5RVx4MDRceDA5XHg5M1x4MURxXHhGRFx4REV9ZSo3XHgxQlx4ODNceEE0XHgwMVx4QTAlXHhFRlx4RkMqXHhBMlFceEVFXHgxNlx4REVceENEXHhERVx4RjRceENFXHg4M1x4RjZcQFx4MEUzWylHNjlceDAySlx4RkNRU1x4ODBTaWJceDkyXHhGMVx4MUJceDEwQ1x4MUFceDlFb0lfXHhGN1x4ODJceENFY0BceEEwXHg5NVx4MUNceEE4XHgxMFx4QzNceEVCNVx4QkZceEI3XHgxMVx4ODFceDkwXHgwNFx4MDRceDBBXHgxNVx4RjY3XHhFN1x4RjRceEEyRVx4ODRceDlDXHgxRVx4RUVceDkwXHg5Mlx4OUVceEFBZ1x4OTNjXHgxQlBceEJGQFx4QjhceERFXHhDQlx4REN2XHhEMlx4QTNceEZGXHhBOVx4OEQnXHhGRFx4RTdceEMyclx4QjJceEFBcVx4MDNceDFGXHhFNFx4RTdceERFXHg5QVx4QjIsXHhDQlx4MDE0XHg4RSlkey9VXHhDMlx4N0ZceDk0XHg4MzRceDlFXHhFRlx4QUZceENFXHg4RFx4MTN7M1x4RUFceDBEJlx4ODMvXHhCOFx4OTNSalx4OTFceDhEIFx4MURceEJGMilceEI3NVx4OTFceEU0Ulx4RjBceDBCXHgwMlx4ODJceENGXHhBQ1x4MDhceEFBRlJceEYzXHg4OFx4MDhceERDXHhDOFx4RDBceEYxXHhDNCNCXHhCQzhceDgyXHhDMmNceDg0XHgxMlx4MTAhXHg4QVx4OUVsXHhGMEdceEVGXHhCOTVceEY0XHgxNDN9XHhDNFx4OUVtXHhCMVx4RUVceDhDXVx4QTdceEIxQ1x4QUZceDg0XHgwOVx4ODBceEJGXHhGM1JceDlBXHhEMVx4RTNceDBBXHgxMVx4MURceEQ3ZFx4OENceEU5Z1x4ODZOXHgxMFx4MDZVXHhGN2QhX1x4QzZceDgwTFx4MDZaXHhBQVx4MEZ3R1x4RTlceDdGXHhGQVx4RTZpY09ceDkxXHgwN1x4QzVJXHg5NX1ceENEXHhCNnlceDlFXHhBOFx4RjJfXHg5Rlx4RjJceDE4WHVEXHhCODEyfFx4QjVceEM3XHhDNiRceDlEWFx4RTk4Wlx4REVceEEzXHhBRlx4MEQoJVx4RTRceERDLS5ceEJGXHhGQT4wXHg4OVx4MTNceDA0XHg5MFx4QzBUXHhGQlx4QzVceDlGMVx4RTdceDBGTS1AXHg4OFx4MDFceDEyXHg5Nlx4QkNceEE3XHhDNS5URFx4N0YzXHg4MyFceDk1XHhFMlx4OTFceEVCI2lceEI1XHhFRVx4REN9XHhFQlx4RDJceDE3XHgwMTVceEM0XHg4RFx4RjNceDFGP1x4ODhceEE1XHhGMW9lXHhEMVx4QzFceEI1Klx4ODZYXHhERlx4QjJrXHgxRCtceDAxXHhEQlx4REV3XHg4OVxceEFDXHhDRDdceERCXHhEQVx4OThceEIxfVx4QUVceEM4XHgwQlx4QkE3Y1x4QUNceEUxXHhFNlNnXHg5RFx4RDhceENBOVx4QzNceDk0XD1ceDkyXHg5OU5ceDBGSVx4MTRceDk0XHhENzxUXHhDRlx4RTVcXHhENVx4Q0FceEU4XHgwQVZceEFCWFx4QjhceDg0XHhDMn1ceERDJFx4RDMmXHhDNFx4OUIgNVx4RThceDg3XHhDRD9ceDkzXHhCNnJHXHgwRi1ceEU0XHhBRVx4MUNbWFx4RjgtZ1x4QzdceDFBXHhFOFx4MURyXHhGRVx4OENceEQxLlx4QjFceDk0Olx4QkM3XHgxMVx4REYlXHgxRVx4MDgmXHgwQkl5XHhBNVx4MUVceEU0XHgxQlx4QUJceDhBYVx4MEJcYlx4MDNceDgweVx4RjQ8XHg5NGdWXHhCOFx4OUZcXHhDMWlceDBEXHhFOFx4MURceEM0e35wXHg5Qlx4QjYuXHhCM1x4RjJ6UjIub3h5ZVQiYTEoXHhFM1x4Q0VceDA2XHhCRlJHJFdceDgyXHgxRlx4QjBceEFBXHhEQVM+XHg4NVx4RUZceEI1clx4MDFceDgzXHgxN1x4OTUpXHhEM1x4RDJmXHhFQVx4RTdceEM5cSQ1XHhDNDNceEVFUFx4QjNceEQyK1x4OUVceDk2VlhceERDQD5ceEUyQ1x4RER3XHhDNVx4OTNceENBXHgxQilceEQ3XHhDM1x4QjgvXVx4QkY1RFx4QzNzLU1ceEVGXHgxMFx4OTEqXHhDMVx4OUZceDEwXHhCMihceEVBXHgxQng3XHgxNEhceDgyfVx4MDRceEYye1x4QzZHM1x4MURZXHhFNVx4OTVyXHhFNWZceEI2UFx4QUFceEZBXHgwQ2pceDg2XHgwNlx4QzJceDA2XHhFOVx4ODUgXHg5MVx4MEZceEREYVx4RDdeXHg5NyhceEIwMWZMXHhDMHdceDk3eVx4OTZnfV9ceEJFYVx4MTJrXHgxNVx4MTlceDk0XHhEMFx4RDRLOjFceDk4XHhDMVx4ODNceEZDXHgxQlx4RkFceEVFXHhBNVx4OUNceDgyXHhFOVx4QTVceEVDXHg5Nlx4OURceEU0XHhCQlx4MEFceEM4XHhDOHhceEQ4XHgwOTNceDE2XHhCQ1x4QURGXHgwOVx4RkVceDk5XHhGMzJ4IGxceDBFNiFceEZBNnNlK1x4MDRaXHhGMFx4OTZAXHgwMjMzMDk7XHg4NE9FQztceDBDXHhCQTBVXHhDOFx4MTJqXHgxM2pceDlDXHg4RXRceEJDXHg5NVx4OER6XHhEOVx4QTlceDhEMFx4QjZ5XHgwMFx4QURceEMyXHg4RVx4RDFceDE0dVx4OUVceDBEXHhEOVx4REZceEI1XHgxRlx4QzhceEQ2XHhBM1hceENEWVx4REFceDEyXHgxRFx4MUZceENCXHhEQlx4OEZceEFEL11LXHg4MFx4MEJceDEzY3ZIXHg4MVx4QkRceDk2RFx4MURceDlGKC5ceENBXHhDNlx4RDVceEYwXHg5N1x4RjhceENGQ1x4QzVyWVx4Q0NceDg2XHhGMVx4QUVceERBJD1ceEQxSFx4MDhceEUxP1x4QkJceEQwXHg5M1x4MEZceEM5XHhCOFx4QjRuXHhFNlx4OTFwflx4RjVceEM5XHg4RVx4MDhMSVx4MTJceDA2XHhBNFx4QzhceEQyLV5ceDhEc1x4OEM2I0pceEY1XHg5Rlx4RjBceEQ0XHhBNVNceDhCaklceEEyXHhBM1E/YFx4OTlceEYxXHhEQ1x4MTBceEFGXHhBNVozdVx4RTlceEVEXHhCMTZceDlDXHhDMVx4Q0NceDA2XHhENVx4QTZceDkxJCNPXHgxQSNDb1x4QUFceEQzXHhBN09ceDEzXHg5Q1dceDFDXHhDRFx4RTNceEJGb1x4QUNceEUwXHhFRlx4OUJceDkwXHhEQ1x4MEFceEU4eEBceDE0VFx4OTBceEJCXHhENzpceEVEXHhCRlx4MUNceEQ2TVx4OEFceEI2Tlx4QTVceDA1XHgwM1x4Q0ZlXHhCMlx4ODVceDkxXHgxOFx4MTZceDBEclx4RjlceDhBXHgwRlx4QkVceDlBXHhBMlx4RDVceERDXHg4MFx4OThrelx4QUVxVihbXHhDMFx4RkJceDlCXHhFMilceEFDJVx4REVTRi9ceEQxXVx4OURceDgzXHhBRlx4RTIuXHhCNFx4MDdvXHhBMltceEFBSjhceERFXHhEMlx4ODZceDBBXHhENVx4QTlceDBCWFx4OURHXHhDRlx4QzlceEQ5XHhFMlx4OEZlXHhFMlx4MDdceDE0XHgxNVx4RkVceEJBbW5ceDE4XHg4N1EqXHgwRjpceEI2XHgxM2NceEUySlx4QjhceEVBXHg5MVx4QkJ7XHhGOFx4ODdRXHhBMVx4RUVAbTlceEVGPlx4Q0ZceEY3XHhFOVx4RTRceDAzJ1x4Q0FWKiNceDk3XHhDMExceDg4XHhEQlx4RkNceDE0XHhGN1x4QkNvXHgwNStdXHgwOFx4OTRIXHgxNmlyXHhCRFx4OTRceENFXHhENlx4MURceDlDPD9ceDBGXHgxQlx4QTdceEE4Z1x4OTBceEIwXHhENVx4QUJVUlx4QTZceDBDXHgwRiVBK1x4REVnXHhDNFx4MDN5XHhGM3U9emJceEU5XHhDMVx4MTRceDk3XHgwMHBceEE2XHgxQ1x4QjVeXHg4Qlx4RTJceEM2XHhENlx4MUNceEFBXHhEOFx4ODBceDFFXHg5ODVceEVCXHhGRVx4RjBceEVDXHhBOEBceDFBXHhGRllceDhDelNceDExXHhGRlx4MEFceDA0XHhCNVNQXHhBQ1x4RjVceEVFXHgxMi1ceEJFXHgxQ1x4RENceDlDXHgwOHIwdThceDhDJldceEYzXHgxNDo2XHgwOFx4QTVceEU5VThceEUxcVx4ODVceENCbU1pXHhCN1x4OTlhJFx4QjJceEQ5WEliXHhDMlxceENBXHg5M1x4MEVBXHhCRVx4RjBceEE4VmVvbFdceERDJFJceEVDXHhGNFx4MDBceEI1XHgxNiBceENBXHhGOVx4RDJceEUwXHgwMihceDlEOFx4RkRceEFCXHgwQ1x4QjRceEY2JFx4QUJRXHhGMlx4OTRceDk0XHgwOFx4QzZceEZBXHhCRlx4ODN5XHhCN1xceEJCU1x4OTVceDFGXHgwOFx4REVceEUzXHhDRUZceENFSlx4QzNceEI3XHg4Nlx4MTk1XHhGMlx4MUJfXHg4Mlx4ODdceEFCXHhGQlx4QkZuXHg5MFx4RTVceEYyXHhGMGojXHhFQlx4MEVoN1x4Q0ZceEQ2Vlx4QThceEEwXHgxM1x4QjgoXHhGMkRceEI2XHg4MFEiXHg5RD5ceDFBXHhCRmhceEU0XHhDNFx4RTlceEUyXHg4Q1x4MTN3XHg4MWdceDgxXHhEN1x4OTJceEY2XHgwNVx4MEE6XHhDNVx4RkFceDk1Tlx4RDNceEU4XHgxRFx4RjNceDFCXHhEQ2t3XHhERXhceEIzXHg4N1x4Qzc1XHg4Rlx4ODlceEFGXHgxQVx4MEV5Vk9ceEEzXHhBQ1x4RTJceDkwXHgwMlx4QUNceDFBb1x4RjZceDFEXHhCNHhceDFFXHhBRERceEQ4PFx4QzlgXHhEN1x4QkRceDlCXHg4NVx4QzlceDg4N1x4ODdRXHg5OVx4Qjl8SFx4QUJceDlFWFx4QjZceEVFXHgwNVx4QjdceEY2XHgwRlx4QjRQXHgwNVx4RUZceDgyXHhGM0pceDE2XHhEQlx4QUEnXHhFOFx4RTdceEU0XHhEQVx4RjRceDFGXHhGMFx4RDl9IUxceEEzXHhFN1x4REJoXHhBRVx4ODRceENFJm1ceEQ4XHgxNlx4QkRceDBCXHg4M1x4OEY0XHhCQWhceEM1J1x4ODlceENGXHgxOFx4QkNceEU1Vlx4OUFpJlx4ODlceDFDXHhENVs0OFx4QjcmXHg4RFx4MUZceEI0XHgxNFlvXHg4Mlx4OTdceEU3eFx4MEZceEI3XHg4MEVCXHhENFZoJFx4MEVceDk4XHhCNFx4MEZceDdGJ0FceEFDXHhBRlx4ODVceENGXHhCQlx4QkQ9QihceDBFN1x4RUJceEY1XHhDQWFceDFBXHhGQ1FceDgzXHg5M1x4MDZceDE0KVx4OTVoXHg5OVx4OTdceEQ0XHgwN1x4N0ZceEVBXHhFRFx4ODhceEEyLFx4RUZceEQwXHg4QWNceDhDcVx4RTRceENCXHgxNlx4QkFZXHhERFx4RTN9XHg5RHpLXHhFNVx4MDVceDBDWFx4RTlyS1x4Q0I8XHg5N19ceEExfnwrM0ZceDkzXVx4QzhceDA2XHgwMVx4Q0Uxa1x4MTBceEFCSFx4RTk1clx4QkJceEUwXHg5Q1x4MDJBXHhEQlx4QTZwXHhGQlx4QjBceDg5Nlx4MDZwR1x4OUFJXHhDNVdceEU3XHhCMVx4MDA2XHg4OUBFSlx4OEZceEQ3XHhBN1x4QjVceEEzKFx4ODZceDdGPyZceDk1XHhFOFx4Q0J1XHgxRlx4RUVceEI3XHhFRFx4N0ZSXHgxQlx4MEVceEIxRVx4QjNRXHhBOThceEE3XHhEQlx4RTh7IFx4RDZceDg4P1x4QjNceEREXHhGNFx4ODhceEU3XHg4RSFceDBEXHhGQSxceDFGXHhCMlx4OEJceEIyXHhEMVx4QjJfXHhFRlx4Q0JCXHhENUFceEIwXHgxRFx4ODhceDAwQlx4QTd1eVx4Q0RceEY4XHhGQlx4MTNceERERVx4QTRceEMzXHhFOFx4OTBceEQwXHhBMn1ceDkzXHhDRlx4QkRceERGXHhCQ1x4QkJceEQwXihceEZEJEpceEUzKmRceEZBXHhFOCRceDE2XHhBOVx4ODlceEVDXHgwOVx4RDF7XHgwNm9ceDk0XHgwRk5ceEIxXHgxMFx4QTV9KFx4MENceDhEXHhDQlx4RDlNQVx4ODFceERBQFx4RTlceEE1XHgwQVx4Q0ZceEVCXHg5MVx4RTFceERFXHg5RnNceEQ4elx4OUZceEI4XHhGN1x4QzBceENDXHgxQVFceEQxXHhEMCJceEIzXHhENFx4ODInXHhFNlx4MDRceEQwODlhdC8lXHg5N3NceDhDXHgxRVx4MDBrfFx4RDlJW1x4ODFceEZFXHhBQixceDk5XHg3Rlx4QUJQXHhFNVx4OERAXHhDMChceDg3XHhFOVx4ODgmW1x4QzIsXHhCNnhceEM4XHhENT5ceENGXHg4RSJ7XHhCMVx4RjJceDBGXHgxNlx4QUFceEQyO1x4ODZceEE2XHgxMTVceERCXHhBQVx4QjNceEFEXHhCRFx4QzlceDBDXHgxM1x4RjNceEMzXHgxOVx4OUNceDA5XHhDRlx4Q0J7bEZceEYyflx4MDlOXHhBRE5ceEJEXHhBQV0nKidceDBDXHhFMVx4QjBceDk0UHVOMitceDhDN1x4RUNceEFFXHhCNVx4OTI0XHg4MmJceDAwMlx4QkM7XHg5M2t0XVx4QzFceDFGTFx4QzFceDE4XHhFQi9ceDhEXHg5Rlx4MDN3XHg4Nlx4QjFceEEwXHhBNVx4MDVceDk4XHhGQlx4ODdLXHg5Q1x4MDRceEYyXHg5Qlx4RUJceEY4NVx4OUJceDEydFx4QUFceEI3XHhCMlx4QzhceDg5XHhGRlx4ODFceDFDXHhBMVx4QzNceEIzXHhBQVx4QkFceDE0MFx4MEVceDAyXHgwMlx4QUVceEJCXHgxOFx4OTcrXHgwNjFceENEU1x4ODZceDhGXHhFM1x4RENceEM4b1x4OEJ6LFx4ODB8XHgxMmhceDA5XHhFNWNceEY3XHhFMlx4OTZceDlBV1x4QUZceEZDXHhDMlx4MERceDE0XHhCM2hceDFCR1x4QjFceDExXHhEQ1FceERCflx4QzlceEE2PD1ceEEwPVx4RjdjajNceEE1dlx4QkQhR21ceDg1O1x4RTBabVx4RkYhXHg5N0VceEYzXHg5NVx4N0ZceDA2XHhFOVJceEE5KVx4MUFceEUwXHgwQ1hceDAwXHhEMFx4RkQqXHhDRlx4OEI5XHgwOVx4QjRceEE2XHgwNERceEU4XHg4RFx4OEVJXHhDRkVceDlFXHhGRlx4RjJceERBXHg5N0syXHg5OC1oelx4QzJrXHhFQlx4Q0VceDhFXHhFNVx4QzZceEJEc1x4MDdceDkyXHg4RFx4RjZceEUxfVx4OERaNj8iXHhFNiExXHhBQXZjXHhBRlx4RkNceDAzXHgwQXlceEVGXHhFMVx4OUVceEY3XHhDQVtceEJGXHhBQyRceDBDXHgxRlx4ODdceDg0XHhCRlx4RkZJXHgwNlx4OERceEU0fVx4QThceEIxKjxceEQwc1x4QjgnU2pceDg2XHhGNFx4Q0JuXHhEMFx4QzlceDE1XHg4Nn5ceDBDc1pceEM5XHhCMFx4QjBLNlx4QTBceEY4XHhFNFx4QUZceEUxXHhFM1x4QjZeXHhFN1x4MTRuSFx4MTk5XHhBRGBdXHg4N1JceDAyO3JceDAwXHhBNlx2NFx4RDBceDFGVilceEIwXHg4NVx4QTRceDEwXHhDRVx4OEJceEI0XHhFOVx4QzkmXHg4Nlx4MTlceEZGXHhGNzorXHgwOVBceDg1XHhBNVx4RDAnSlx4RTBceDE4XHgxN1x4OTVceEM2RFx4RTVceEMwXHhBRW5ceEEzXHg4QjZceEZFXHgwM1x4MTVceEEyNlx4MDVceERFXHhCOVx4QjAkXHhENklceEVGXHhBQ1c4XHgwNC5hXHhERnpceDBGSVx4MTFceDk2XHg4Q1x4RUNvXHhERXgubFx4QzMsXHgwMFx4MURceDE2MFx4QzZceEE4XHgxOGJEXHhGMlx4RERceDBGXHgxQVx4MERceEY1XHg5OUlceEREIFx4MDVceEZEZlx4RjdRXHhBRlx4Qzl7XHg5Q1x4RDBCb1x4OTRceEJBXHhGQlx4RjhceEU3XHg4Q1x4RDQne1x4QThceDEyaCY9XHhEOVx4QkNceEFEXHhBM1pceDkxUlx4ODNceEVGXHgxNk9mWVx4ODdceEJDMTZceEZDXHhFQ1x4OUZceEMwXHg5N1dceEJEPlx4QTNceEY0XHhGMlx4MUFlXHhCN1x4OThceDg5OVx4QUNKXHhGRFx4OTRceERDdSYkXHgxOFx4Q0RceDg0XHhDQVFtPlx4QjhceEI0JFNrXHg5M1x4OEJ9XHgxMlx4RTRceDE2XHg3Rn1tXHhFM1x4QjlceERGUVx4RDZceDExXHhEN1x4QTJceEYxXCZceDgzXHhDMFx4RjBrNlx4QkZDXHhCRllceEYzXHg4MFx4RDVceEMzXHgwQThceEZFRVA7XHhDN1x4QjZceEJGPl1ceEE1Qlx4MDNceDE2XHg5NEozXHhBM1x4OTMpXHgwOVx4RDRceDkyXHhCRlx4QTBFYlx4RUJ5XHhEOTtceEIyXHhCMH5tTktyS2VceDlFXHgwQkojXHhFNVx4RTNceDg3XHg4NiRceDk1XHhDNDJ9XHhBMVx4RDJceEM0XHhBN1x4QjJjUFFkflx4Q0MzXHgxQWdceDBFL1x4ODUtXHg4Rlx4OTMyXHhCRVx4ODJceEVFXHhGNlx4N0ZceEE4XHhGQlx4QjEqN1x4QzBceEFEXHg5M35ceDFDXHg4Qlx4RDJceEE1XHg4MCV0XHgwOVx4QUFceEYzaFx4MTJtXHhBOTNceEJFXHg4Q1x4MUEvcVx4RjhceDA5XHg5M1x4MTdWXHgwMSlceDkwXHg4OSFceEMxXHg4OFx4QjgrXHhGNVx4OEJiXHhGN1NceDkzXHgwQ0lceEFBbFx4MERceDA4cVx4MTAsXHhFRlx4Q0NRXHgwMU0jXHhCNylceEMzXHhCMVx4ODNTXHg5OUxceEFBXHhBN1NceDgzcVx4QjdceEQ3XHhGRlx4QjNceEU4QTxceEM1XHgxRTZceDBDXHhFNlx4QzlxXHhDOChceEFBZUJceDk4PFx4QTZNXHgxQVx4RERZN1x4QUZceDBBXHg3Rlx4QkNceDE0JXBceEQ4Tlx4RTBceDBEXHhCRVx4MUIwMVdMXHhFRXtkXHg4N1x4QkJceEZGZFx4ODZceEFCTmNceDkxXHhBQlx4OTRceEREUXZceDExXHhGRlx4OURceEIxLkkxKFNceDA2XHg4N1x4RDlrOlx4QjBceEQ5UVx4QzU2XHg5RFx4RURceEM3XHgxM2YseXNceDgyXHhCQ1x4QjVzdFAqXHg5NUpceEVFXHg4RVx4ODJceDBCXHhFRFx4MUJceDlFMVx4RUFEXHhBOVx4RkVceEM0Z21ceERFXHhEOCg0XHhBRlx4QTFrXHgxRFx4RjBceEU5XHhGNVx4RjlceEZGLVVceDEyPi97aWZceEZBXHgxN1x4ODdVblx4RjNceEM2XHg4MiZqLlx4QjFceDgyXHhCNFx4RTZceDlFeVx4RDFceDlDXHhDMk9ceEQxXHhGRVx4MDlceEUzXHhBM1FceEMzXHhERjVVKzxceENCXHhFMVx4RTdceEI0XHgwMCpceEMwXHgwOVx4MTFta1x4OTRMXHhFQVx4QTBceEFFXHgwOGFceDhCXHhCRj9ceEFDXHhGNllGQXBceEI0PzRceEUwXHhDM0BceEU1XHg4Q1x4QzFceEQwW1x4QzhceEQ2MVx4QjJceDA3XHgwMFx4ODdceEY5XHhGNFx4ODBceEE1LSQ+XHg4MVx4MDFceDFFaVx4RTlceEI3XHhDMVx4MTA3S1x4MUVceEYyd1x4MTBtO0lGXHhEQixtTFx4QTNceEYwXHgwOFx4OTYtXHhERD1ceDFBJlx4QThceENGXHhGOFBceEREJFx4QzFceDk2XHg3RiFLXHgxMlx4QzVceEVGXHhCRlx4QjdceEQ5XHhBOGZceEYxXHgxNGNceDg3XHgwMUtceDFGXHhGRFx4QjNceDEyXHhDQjByZlx4RjBceEZFSlRceEIwXHhENFx4QjRceEJCO1x4QkRceEZFdlx4RERceEQyXHgxQlx4RTAvVjNceDA0S1x4MDFceDA3XHhCRVx4QjZ5QVx4REFceDFCaVx4QUEyXHg5OHJCXHhFN2hceERDQkhceDkyXHhEOFx4QjlsKExOXHhBQlx4QUJceDhCXHg4MFx4QUVceDk5XHhGOT9jXHgxNVx4RUFoXHhBQ1x4MTBVXHhCNVx4RUJceEQyXHhFRGBceEE1cVx4QTROXHg5OVx4RTRbK3RceDg1XHg4NFx4OEFNN1x4QzlceEVDXHhBOFx4OUVeWFx4RUZceEY3XHhGOVx4MEJoXHg5Q1x4Q0U/elx4RTFvQVx4REVceEY4XHhBRkZceENDXHg5NFx4MTRceEQzUktceDE0XHgwQjtceEMzXHgwMT1ceERDQ3NceEEzclx4RjRDXHhFMUhceEMzXTZceEM1P1x4MUF2PGx0XHg3Rlx4RjBceEE1UUFceEE0XHhEQVx4MTRceDk0XHgwNjZceEEybVx4QzdYIVx4OTdceEE5REdceEY3LVx4MTJceERBTlx4QjZceEM0XHgxN1x4MDNceEIwJVx4QUNceEIyXHhERlx4MEFceEEwXHg5Qlx4MDhceEIzXHhCQVx4RTctOFx4MTIrXHg5Mlx4MTNwTVx4RERZXHhFMSswSFx4MDB+Tlx4MEVxXHhFMChceERCXHhDOHpceEE2XHhDN1x4RDNceDFDXHhBM1x4OEZceDkyUFx4RjZceEZDXHhGMFlceEVGXHhCMSFceDA0VFx4RENceEM0XHhCMlx4ODgsUlx4ODFceENBXHhBQlx4MDV7IVtceDhEXHhEN3xceEE3XHg4Rlx4OTFceEU4JFx4RERceDFCWVx4OUFceDBBXHg4Rlx4Q0ZjLlx4OUVRXHhGODlceDkyXHhDN1x4Q0FceDlCVlx4RDdceEI3XHg5RDRceEY5X31ceEFETlx4ODkzXHhEQVx4QkRZXHg5RVx4MTlceDAwXHhDMkJceDk3XHhFM1x4RTlceEFEIlx4QThceDFBTilaXHg4Rlx4RTZceEMxXHhENlx4RDRceDBCXHhFMFx4MUVceDg0IUZceEQ0XHg4NFdvXHhFNlx4MTVceEY2IFJceEVEXHhCOVx4RUZceEVFXHg5MVx4QzQ4XHhEOH57XHhBNGFceEZFd1x4QzczXHhCRFx4QTNHXHgwQlx4QTFceDE0XHhDQzpqXHhDMFx4RDhceEMyXHhGRkFceDg4XHg4Rk5CSlx4RUF6U1x4QjBceEMxMFx4QkJceDg5XHhEOVx4RkVceEI2Nlx4QzdceEQ5XHhERFx4QTZceDBCI29ceEQwXF5ceDA4NF9ceEMzWFx4QUVceEZFXHgxOFx4RDJceDBGXHhGNkpceDdGXHhGQlx4RTNjXHhFNi5ceDBFXHhGNHdceDFCTFx4OTBceERDLlx4RENceDFCbFx4QzZceDhBXHg5NVx4MENceEIzXHhEMVx4QkNceEU4dChceEYyXHgwMFx4RDhceDFDXHhDMVx4OUJceEIwLkJGP2NceDFGPUlceEU0O1x4QUNceDgzXHgxMlx4MUVceDEzXHg4Nlx4RTNuXHg4Rlx4MUNceEU5XHgxRlx4QTVceEJGJFx4OUVceEM2XHhGNVx4RTVceENDXHhBRFx4MDliXHg5NDM8alx4MDRuXHhEOVx4QUNceDAxXHg4Mz1YK0lceENEPHJkSCtceEY3dVx4RjhceEY2OFx4QTFceEU3XHhCN1x4MTVceDgxY1x4RkZceEU1XHhCMVx4RjhIXHhDOWVceEE0Ylx4RjNceEY5anU/XHhFQVx4QkFceDlCXHhGMlx4RTlceEE1I1x4OTRQXHg4Q1x4RkFceDhFXHgwMVx4RTVceDBBXHgxQ0FceEMyXHhDOVx4MDZceDA0XHgxQnBceENEfVx4Q0JceDE2MjVceDBBK0J0UT1XXHg4QVx4QjRceDAxS1x4QjdsX2ZcWmteXHhBMUpceEQ2XHgwQlJceEExXHhBMVx4RjBceEU2MFx4RjNceDAyNVx4OTJceEREaVtceEZCLk19XHg4QVx4ODdceDkzIFx4OEVceEI2XHhDQlx4ODdlTCxceEUzXHhDNywyXHg5QlpHRDlceEZBXHgwRVx4MDhceDE2alx4MEZZV1x4MDR3Y1x4MDdTSFx4RTlceEFFalx4OEVceEIzXHgxQldceEFBXHgxMHMmXHhGOERYaFx4MTkhXHgxRlx4MTVTXHgwRlx4REJvXHhBQlx4ODBceEQ3XHgxQ1x4Q0RceEQzXHgwNFx4Q0I2XHgwNVx4QjR9XHgxRlx4ODNlOX1ceEZFalx4RkFGaWVceEMzXHgxNFx4REJlXHhBRm4pd3JceDFGXHg5MVRceEQ3XHhFMnlceEEyXHhDM1x4ODNKc1x4QzlceDA4Ulx4MUVDXHhGQlx4QThceDAxXHhGOFtxXHgwNFx4QjhceEMxXHg4RFx4MEJceEJEXHhEQlx4RkEyXHhCNkZceDA0ZC08O1x4QzZceEEyXHhDQ1x4ODB4U1x4MUNceEY3e2ZceEFCXHhCMVx4RDJ7XHg4RVx4MTlceDBCZlx4Q0FceEJBXHg5NnRceEYzeDR2JFx4MEFKXHhGQVx4OTdhXHhDRVx4RTFceDk5NVx4QTFceEE0OzJlXHhDM0dceDk2XHhGNlx4MDBceEJCXHhEMFx4OUFAXHhFMVx4QjQhXHhEMFx4MTJceDg1XHhFNF1uYkVceDdGXHhFOFx4QTlceEZEXHg4RS1fXHhBOElEXHg4NVx4ODkycFx4ODhceDE0XHhBQkNceEVFXHgxMVx4OEVceEY3XHgxMFx4MDlceDEwXHhDRlx4MTcqXHgwQ1x4RTdceEVDXHhGN1x4REZceERCXHgwOSBceENBXHhBMVx4MUFceDlEU1x4MENceDhFXHhERFx4QkMsXHg5OVx4RjNceEMxXHhBMHdAXHhFQlx4QzNceDk3XHgxOTc6XHhFRVx4RjZceDk3XHg4OFx4RkFceDFEXHhBM1x4RjRtXHhCMktXXHg5Ri5ceEQ4blx4RjNceDg0IUBceEUyXHg5MyxceDgxXHhEN0xceEM4XHg5OHFvXHg4RDdceEVCbVx4MDhceDdGXHhBOT03Mlx4RjJceDFEXHhEQlx4QjNceEMxIHBoN1x4ODNTSlx4OTdceDgzXHhGQXooXHgxRlx4RThceDhBXHg4Nlx4RjVceDFEXHhFMFx4OUVceEZGXHhEQlx4RjJceEQ1XHgxNmtJV2VceEQ2MFx4OUZceDhEXHhCOENceDAwXHhBNVx4RjlceEJBKFx4RjdceERFS1x4RjVceDlCXHhFMlx4RTdMXHg5OTVceEY3XHhBNTVceDgwXHhBM2ljXHhGMmxceEI2XHhGOVx4QjBceEI5TVx4RDJceEQzXHhENVx4QUFceEYzXHhFRFx4OTNceEUyJlx4QUVceEE5XHg5MHFceEEzXHhGQ1x4N0ZceEQ0XHhFOG5ceEQzXHg4OVx4RERRXHgxNFx4RTdceEU2XHhBNVx4QjVJbVpceEE4JVx4RTRceENBN1x4QURceEJGXHhGQlx4QjBceDk3XHhFM1x4QTJmXHhCRFx4RTkreSNceDhGXHhGQ1VceDkyXHhDOVx4RkFceEI2XHhFNEJceEJDXHhCRVx4MDQnPlx4OTNceEUxXHg5NVx4MDJceEU2Ki9ceEEwXHhGND9ceDFDXHg4Rlx4RTlYXHhDOFQlXERceEJES1x4MDBceDkyXHhFMVx4MEJceENGZ1x4QUZceEZBXHhGOVx4OENceEZEUHhceDkzXHhGQ1x4MEJZXHhCNlx4RThceDkwXHhFQ1x4OUJceDhGXHhGQy8pXHg4OVx4RDBceDlFZVx4RUF1anhqVXFceDk4XHhCRVx4MTNceEYxXj1ceEMzXHhFOFx4MEZVXHgwMmNceEZFXHhGOFx4OURceEU1XHhDNlx4OUZceEZEXHg5Q0ZceDE0Qlx4QzdceDE3XHg5RVx4RkVceEExL1x4QzVceDFEXHhEQ31ceDAxXHgwMFx4RDlceEYxXHg5Q1x4QjBFPlExXHhGRWZceDgzaFx4OTVceEE3NVx4RDFoMFx4RDFceEUyXHhEOVx4QzFceEE3XHg4MlthZ1FceDE5XHhBNFx4OTBWL1x4QjBceEY0aVx4OERceERBe1x4OTNPXHg3RmtceEE5XHhERm1yXHg5MVx4QjdJXHhEMVx4RTdceEU1XHg4Q3BceEQxSipXPlx4MEFceEZCPVx4RjFceDkwXHg5OFx4RTRoXHhBMFx4QTBRP1x4QkZceDkxOFx4MUZceEVBXHhFOVx4RTJceEMyXHhEQ1x4Q0FSXHhCQjpceEVBXHhFRlx4MTRsXHg5QUVCXHhEOVhceEREXHhEQ1x4RkFceEJBXHhCMlx4QzFceDlFXHhEMFx4RkRceEM5LVx4MTdYXHhGM1JceDEyXHhEMDBceENDPlx4MDdceDFFXHg5Q1x4MENceEIwU1x4MTk3eTFceDE4XHhGMVx4MUNceERBYFx4QkV5XHg4MlVceEIwJlx4OTVceEU3PjBceDk1NFx4ODFceDFGXHhEM1x4OUVceDA1XHhBQVx4QkFValx4RTJ+XHhCN3hceDg4XHhDMFx4RkJceEU0XHhFRFx4RjBceEU0W1x4QTdZXHhBRVx4MDlceENBWWJrXHgwMlx4RjVceEUxXHhGNlx4QzNfbVx4RDNceEU2JVx4QUNAXHg4NH46S1x4RTR6I1x4QjB8XHhEOClceEUwXHhDQVx4MURFXHhBOClceDgySVx4QjJceDlESFx4RjlceEQxXHhCRGlceDk0Llx4OTBceDg0Llx4MEJceDkzXHhFRHtceDkwMlx4MTBceDA1XHhCQVx4Qjk1XHhGMFx4QUZceEIzXHgxMGBceERGXHhDNyRceDlFX1x4RTFceEMzRlx4OTlceEFCL1BceEYzJVJceEQ5XHgwRlF4ZFx4OUJ4XHgwMmFceENBcVx4RjJsXHhCQ1x4REZceEY3XHg4OFx4MDF0XHhCMlx4QjdxXHgwRlx4RUZceEYzeVx4RUF7XHg4MFx4RDFceEFCXHgwMVx4RDBceEQ0XHg5OVx4MEU0XHhCNlx4MTVceEZGXHgxRFx4OEJceEY2Llx4OERceDEyOmRceEVFXHhFOWZceEE5XHhDMlx4MUFceEVGXHg4NFx4QUJceEJFRjhPXHhDQ1x4Q0ZyXHhCMFx4QTVGXFx4QzlceDlDXHg4RGxceDg3XHgwRVdceDkwXHhBQU4pXHhDM1x4ODV0b1x4REZceEYyQFx4QkZceDAyXHhBRFo8XHg5N2ZceEJDYHUoXHgxMFx4QTM5XHhBNVx4MDAjXHhGNzJHKFx4RURceDA4Ilx4RUVceDEyXHhBMFx4MDIvNVx4RkZceEZGXHhGOFNGZFx4QzdceEY0XVx4Q0JceDE0XHhENVx4ODJoXHhGMVx4MDVceDhCXHgwNEImXHhDMFx4OEZceEREXHg5QVx4RDRceEQzUVREXHhGOWVceEM0XHhBNCVceEUyQ1x4Q0RceDk2XHhDNFx4RDBceDA2XHhGQlx4OUZceEE3VkZceEZGXHgxRFx4MEJceEMyXHhCQUQ8IFx4QjFceEREPlx4QkNceEE0XHgxMyxCUFx4REJceERGXHhCNVx4RUZceDlFXHhGRFx4Q0VceEUxXHg4NE1ceDlFXHgxQVx4RDdgXHgwNFx4Q0FceEUwXHhGOFx4QzdceENCJTRceDlDXHgxQz1ceEM0XHhDOVx4MENceEEzXHhBRlx4Q0FceDExV0FlXHhGOC1ceDk0XHg4RFx4MUVceDk4c1x4RENceEI3Ilx4RDVBM1x4RjRceEM5XHg5M1x4RkNceDkwZFx4ODdceEUxXHhCRVx4OUVceEZEI1x4RTBIXHgwMjMvR1x4MUY3XHhGNVx4MTl7XHhEQ1x4RDFceDgzMFx4Q0NceDBGIWBceEM1XHhCQiBceDFBXHhDOF5ceDg5XHhDOFx4QTFKXHhFNFx4RUNceEU2XHg5RVx4OTRgLURceEU3XHg4NFx4MURhXHgxNlx4RTFceDdGblx4MDJceEVCI1x4ODUwXHgwOFx4ODgzUEZceDE3XHg5MFx4MDIsXHgwOFx4QjhceEQ3QVx4RjNceDEzXHhFNFx4RENceDA3XHhDM1x4OEJkXHhGNkpKLVx4QTBceDE3XHgwNlx4QjBceEE5XHgwQVx4QzFceEE1XHhFNFx4QTB7clx4OEJceEVBXHhFNVx4RTNceDgwSVx4ODE6XHgxNlx4RDhceDgwdFx4MDNceEIwXHg5OEdYXHhGRihyXHhDOFx4ODFceDE4XHhGNlxceEU3NVx4RTZceDlBXHhDQlx4MTBceEYwXHg5OFx4RTNceDlBXHgwMVx4ODJceDk1XHhCOScrX1x4QkZceEE4V2oyXHhFN2dceEIwXHg3Rlx4RTVceEM3XHhEMXdceDhBXHg5OFx4OTdceEFDPVx4QzVceEIwXHhCRlx4ODVxXHhFNE1ceEZFYyBwXHhFRUlceEZDXHhEQ1x4RkVceEZFOmVceEI0XHhFQVx4RkRceDFFYVx4OTIrXHg5NFx4MEFceEE5VVx4QzZiXHhFRFx4RTFceEJFXHhFOFx4QkUwXzdceENBKFx4MURceDhBRVx4Q0RvXHg3Rlx4OTNAXHhGRU8pfWVceEU0XHhCMFx4MENceEVGalx4QjNceEFFXHhCOFx4RDAwXHgwMiBGLVx4RkFwa1x4OUJoXHhGQ1x4ODd6J1x4RTA4O0peXHgwRlx4QTJqXHhCRFx4MTBCVFx4RDRzXHhFQl1ceEJDR3VceDEzNFx4QzFceEM1alx4REY+XHg4QVx4Q0NceEU0XHg4OFx4RURfXHhGQ1x4QkJceEE0c09ceDdGXHg4Qlx4RUZ6XHhBQlx4OEFceDFBXHhCRj9ceDFBXHhFOFx4REVIXHhBRFx4ODVceDgzXHhFQ1x4MThceEIwPFx4QjktZE9ceEMyXHhCOVx4MDg5XHg5Qlx4MTNceDk0blx4REQmXHhBNVx4MEJceDFGXHgxNlx4QkFceDlFXHhCRnRceEIxXHg5MFx4OUMsOlx4QUFQOVFceEUyXHhDOFx4QTlceDBDZn5ceENGXHhGRFx4OThceEYzfFx4RDJceDA5XHg5RFx4RTI/XHgxM1x4RkFmXHhBQ1x4OUE1XHhDMlx4ODdceDA2XHhDRVx4MENceEVEe1x4RUJceDg1WVx4QzhceEJCXHhFN1x4OTdceEMwXHg5Qlx4MDJceERCXHg4OVx4RTBceEIzXHhGMG1ceEU1TFx4OENceEU0bzdceDFDZlx4QkFceEQyXHhEQVx4QUFceEFDXHhBMVx4QjYxXHhBQ0QiXHg5QVx4QzVeclx4Q0RceDA5aVx4QjU6XHgwMlx4QTZceDFGfFx4MEVceEQ2J1x4QzFceEQ0SU9ceEFFXHhCOUVceDFEaFx4Q0FceEZEXHg5Nlx4MDVceEY4XHgwQ1x4QzVvXHg4MGxceDA5XHhDMU9ceDA5Mlx4MTRceEZGXHhBN25ceDBBKWNceDlGbSJceEM5SVx4QjFyXHhBMFx4MDdceDhCXHhGRVx4ODY9XHg4RChceDAyXHg4MVx4QUFoPXRNXHgwNVx4RDlTXHgwMlx4MDFceEQyJ1x4MDF4XHhCMFx4RERceEYyeDlNXHg5NHhceEI0XHhCN1hceEU1XHg5QX5ZXHgwOVx4REVceDlDMVtFIVJbXHgwQlx4OUIxM2xceEFCX1x4RjBceDgzXHgxM1x4RDlceDk5XHhGOFx4MTRceEE0M1ZceEU2OV1DKVx4RENaXHhDQlx4OEZceEI0XHgxRkhceDhBKVx4OTFceEFGT1x4QkFHa1x4OUNTXHhCRVx4QUZceDgzXHhDM2lOXHhGMkJfY1x4QURceDg5XHgwOVx4RkIuWlFceDEwe1x4QTZceERDXHhGMTA5fVx4OUZceDExdlx4RjNceEZDb1VceEJGXHhFNFx4RENceDE3c1x4MEQqXHhFQlx4OENceDE5XHg5OFx4QUJceEQwXHg4MU9ceEJDXHgxN1x4ODk+Xlx4OUVceEZGZVx4RUVceDA4XHhCRVx4MDdceEU1byRceEIyXHhDRFx4MDZVXHgwQkdmXHhDMzVWXHg5Q1x4QkNceEY3XHgwOV5ceEMxXHhCQWRHXHhGMlx4QjElXHhENFx4RjdceDlDYFx4QjFceDg1SFx4OTlceEY4Zlx4OTFceDFFWiZceEFDYFx4OTN5XHhDQVx4OEJHXHg4RFx4QjZceDAyXHhBMlx4QzFaXHhDQ3NceDAzXHhDRFx4MDlceEQ0ck5oXHgwOFx4RTdVXHgxOFFceDg4XHg4M1x4MERceEI1XHhCNFx4OENceEQ1cVx4MDVceEM3VVx4OUFceDBGI1x4OTZOXHhBRFx4QjdceDhFXHg5RllceEM4XHhFQ1VceEYzXHhBQVx4MTc0d1x4QzZceDgzPVdceDE1cVx4QzZceEE0XHhERlx4QjBceDFBXHhFOWtYc1x4QTFtXHhFMFtceEU2XHhBN1x4QjdceEM0MVx4ODFceEIyXHhGM05ceEEwKG5ceEVFdVx4QTNceDA2XHg4QTdceEI3cFx4QzZceDExXHgxQlx4Q0JceEMzflx4RDhceDA3YVx4RDJceDAzXHg4Mio+XHg5QU5ceEYzXHhBOV5ceEFFXHhBNlx4RjMhXHg4NFx4RjZceEQ2XHgxQ1x4RjlceEFBXHg5QVBJXHhDN2hceEFDaFI7XHgwQl1jXHhBOS5ceEMzXHhDN1x4QTc0XHg5Rlx4OEFceDkxXHhBM2tceEVGcVx4QUJXSUBceEJDXHhFOFx4MTRceEVDTVx4MUNceEI1XHhENVx4RjBceEY1XHhGRjNceEE2XHhEMTpceEQ3XHhENVx4RTJceEUwXHhFQyhceDhBXHg5M1x4OEJceEFGclx4MEF5XHhDN11ceDFGT1x4QjZceEE2XHhGRlx4MDVceDg0Z1BceEE1XHg4MVx4MUVceDA2XHg4NEdceDkyXHhDRFdceDExXHhFNVx4QzFceEM0XHg5RVx4RDhTQ1x4RkVceEVFbVtuXHgxRlx4RUVceEI4XHhCMFx4OEZceDlDZFxceERFLlx4RjhEXHhCMFx4MURceEY1OCN8XHhEREVceDk4RFx4RjBceEY2XHhDNlx4ODVceDgzXHg5MnBdYFZceEJDdiYzXHhGREJyXHgwRlx4RTZceEFELFx4QjZceDFFXHhCRlx4RkFceDAyXHhERFx4OTdceEJFXHhFQlx4MDlFXHhDQ1x4MTRceDg1XHhGMjxEbVx4QjJiXHg4OWUkXHhGMlx4RDlceEQ0XHhBQ3xmXHgxQVx4QjVceEE0XHg5NVx4RkRceEYyXHhBND5sKVx4QUJQXHgwQyZceDBFJ1x4QjlceERDXHhENVx4QkRceEJCNFBceEM3XHhERlx4QkFceEUzRVx4RjdCZUtceENBSFx4OTFceDAxXHg4OFx4QjJceEVDXHgxN05ceDA3XHhFNVx4QTZceEI3ZVx4RENEXHhGQjpceDBDW1x4MThceDgzXHgwQlx4OUJceDA0VUNNXHhEMHleXHdceEVDXHhBRFx4QzRceDFDXHhEOFx4RkJceEZCWDxceEY0XHg5MVx4RTdBXHhCNVx4RThXXHhDMlx4RjRaXHhBM1x4OEJydUJceEIzXHhERGNceENDPUhyWVx4RDVceDE1XHg5Qlx4QkRceDlGUlx4MDEwXHhCRVx4MTFceEE2XHhCQWxceEQ1Tlx4Q0ZceEMwXHhFMFx4QkRhXHg5NFx4OEJceDE4XHgxQVx4REFceEQzXHg4OFx4RERvfVx4ODhceEQ5XHhFQ1x4OUNIXHg5MFx4QjdceEVDXHhCMVx4RDNzXHhDMlx4RkNceDEzXHhEMVx4MTBceDAxXHhENlx4Qzc0XHhCN1x4QjlceEQzXHgxQVx4MUJceEEyXHgwMFBKXHhGNnEkXHhCRFx4MTdceEEzVlx4OUZfXHhFMFx4QzdceDAxXHgxMVx4OENcXHgxNlx4MUFnT2ZceEQ1JnpceEQyXHhGOFx4OTgiU1x4MDRceENGeVx4OThceDkzXHhDM1QxZVx4OTE0XHgwMFx4MThceDFFbmZceDBDJHFceEJEXHhCOVx4MTggXHgwMFx4QTk1NVx4Q0FceENFXHgwNFx4MTBceDg0XHhGRFx4RUNDMi5ceEFFXHhBM2hceEM5XHhFQ1x4RTZyTnhlNlx4QkQ9VFx4ODYgXHhCNlx4MTNceDFEI29KXHg5Nlx4RDBRXHg5Nlx4QzNeXHhFMFx4RUNvXHhDQlx4MDFceEVBZ1x4N0ZceEM4aC1ceEI2Slx4QTdceEIxb1x4MDY9XHhEMkFceEZBXHhEMSpceDg3W1x4RkNmXHhGNFx4QUN6XHhBNlx4OEY7TVx4MTBtXHhFMVQ7dShceEUyRlx4QUMlXHg4MVZCbVx4QjhceEYyVFx4OUZceDFBXHg3Rlx4MERLXHhDQ1x4MThceDE3XHg5RVx4RDJsXHgwN1x4MUNNd1x4OUVceDlGXHgxM1x4QkNceENFXHhFM1x4QzlcXHhBQz5ceDgxcFx4QTlceDA5aCdVXHg4MyRjZFx4RTBceEM3LHpceDAwd1x4MTNceEQ1XHhGOFx4MUF9XHhFQlx4QUE0ZmBXcSRceEQ5cFAhXHhFQ1FHXHhCNVx4ODFceERDXHgwQ2kqa1x4MER4QVx4OEJceEFEZlx4MUFceEMxXHhGRFx4ODZmXHg4QVx4ODNceENGNVx4RThjPnlceENEXHg5Qn1ceEE3IVx4RjFDXHhERH1IXHg5N3VceDEyXHg5MVx4OENceEYzXHhFOUpceEYwXHg4REpceERDIyNceEVBeVx4RDhceDBFVkQkdlx4QkNvXHhCQUlceDkwXHg5Rlx4MDJceEFGK0lceEMyTVx4Q0ZsVFx4RkRkXHhDRlx4RTFceEY1XHgwRlx4RDRceENGXHhCQlx4QjdceDk1XHgwMFx4REJceEREXHgxMVx4QjVceERGXHhBQ1x4QTZceEQxXHg5Nlx4MTdceEUwXHhEM1x4MDNceDAwXHhDOVx4ODAvN0V4L1x4MUFAXHhFOVx4QjM/eVx4RDNceENDTlx4QTZfRCxceEZGXHhCNmVVTXYmXHgwQTZceEU0J1x4REZtXHg4M1x4OENceDE2XHg4RFx4RjA9XHhDNVx4QkU1NVx4MUFceDlBbHZceEI1XHhFMlx4QTUjIEVceEExXHhERVx4ODRceDFFXHhBQ1x4RTRZJVx4OUQvXHhGQ1x4QjZceEJDR1x4REJceEIxXHg5MD9ceDE4Ilx4Q0ZceDg0XHhBMFx4OUZceDhGXHhERlx4RThceERBLFx4MDhdXHg5QiNceEM2XHg4MnhceEQ3XHg4Rlx4QUVfXHhEQnJtZlx4QjI7XHhDRnpyMVx4QTRceDEwXHhDQVx4QjdceDkyXHhFNVx4OTlceEIwOVx4OTZceDkzXHhCNFx4QURALFx4QjlceEZGbVx4QTU8XHhDQ1x4MERceEFDXHgwQVx4RDFceEQ4XHg4NVx4QjMiJVx4RTd0UWBceEQwfVx4QkVceEEzPlx4OTdceEI4cFx4OThceDlFNlx4QkRceEEwXHhGQVx4OTVceEQ0XHhCRFx4RDJJb1x4OUFYXHgwMVx4RkRceEJDXHhGMFx4QzZceDA2XHhGQktoXHhCQ1x4RUJceDk4XHg5REJceEQxXHhDM1x4QjJceDg5XHhFM3F4XHhDOFx4OThceEYwXHhEOXJceENCXHg4Q1x4OTdKXHhDNFx4N0ZceEQ5XHhERFx4OTlceEE3XHgxOFx4QzJceEE3XylceEQ0flxENVx4RDFrPlx4RDU8XHg4QyJceEZEXHhBRFx4QTNceEZBXHhBRlx4MDh7VVx4RTdceDgwXHhFNFx4MDlceEYwXHhEQVx4ODBaVFx4ODg8XHhGNlx4OTNceERGNFx4QTBceEIyREdceEQ3IjlceDgwXHhCNURceERFQ1x4RjJmKVx4MDJceEZBXHg4Q2NceEI0XHhGQ1x4OTVceDEyXHg5OFx4RkZceDg4QVx4RDJceDA5K1x4MTNceDFFXHgwNlx4RThceDAwXHgxNVx4MEJceEFCXHhDMVx4OTZceEY1JFx4OTJceEEyRlx4QkYsWFx4QzhceEJGXHhDN15ceENBXHg4QmBceDAwXHhDNlx4OUJceEQ4XHhGNFx4QzBceERGXHhDMipceDExXHg3RndceDE2Nlx4RjZceEY5Ry1ZXHg5M1x4QjVZLVxceDA5XHgxN1x4QjZceEUyXHgxNT4tPDtceEExXHgxM1x4RTFceERDclx4RjRceDlFXHhGRVx4RDBceDkwXHgwMlx4OEVPLlx4RjBceEMyP2EjXHgxNkpceEZDfnVceEU2XHhCRlx4OEFPXHhFQVx4QzcqXHhDNHQgXHhDMlx4QTVceEQ5XHgxRVx4MEJVSGBceEYxR1x4QzYtNGlceDhCXHhGMFx4RUNceDg1Y1x4MDNceDE0UFx4QzdceDlBXHg4MkhNa1x4QjFceDg2XHg5RVx4MDVTXHhEMFx4MEFUXHgxRXs7dlx4QzlceDBFbVx4RERceEU5VFx4OUNmPmJceDFGaTUhXHgxMVx4RUNceDFCXHg4MFx4MDVceEU5XHg4RGJRW1x4QjVceEMwXHhGRlx4RUFceEI1XHhEM05ceEY4SDV3XHhCMytceENDXHhBRVx4QkJceEQ2NVx4QjVceDk1XHhBNFx4QzNoW3E5XHgxNlx4RjdGXHhBRFx4QkYwXHhBMz1ceEFFV1x4OUFSdVVceEI4XHgxMFx4ODVlXHg5QVx4RDFceDAxXHg4Qlx4OTEnO1x4QjdeXHhFNlx4OTZceDA3Tlx4RkE7XHhBNm9ceEFGXHgxNVleXHhGNVx4QjBceDAwelx4MDFceEFGXHhBMVx4MDJ4XHhDMFx4MUZceEM3XHg5NVx4Rjkkalx4ODZWeVx4MDRceDhFXHhBRU9ceDE1XHgwRlFceDlFXHg4RSVEbVx4MERceEY2XHg3Rlx4RjFceENDflx4MTc7XHhEREtceDA5XHhEM1x4QkRceEZGXHgxMVx4RDNceEEwRXxceEQyUVx4OTNceDgzKlx4QTNceDA2XHhDMlx4RDJ1XHhCRlx4OUFMXHg5QTY5a1x4OEF7RFx4OTJceDAwXHhFOTFsVSlceEExXHhCN0h5XHhDMVx4MDhceEREIHFceDg2KjNceDEyXHhBMVx4RkJceEEzMiZceDE1XHgwQlx4RjlceDk1XHhGNz5ceEY0L1x4MTVceEI5S1x4MDZceDE0XHhFM2lceEYzJ1x4REQ7UFY1cGtceDhDLXBceDhCclx4RTgoVTZceEIzXHhDMlx4RDRceEJDIFx4MENSXHg4MVx4QTJceDAzamUtXHhGRVx4RkFceDlFT1x4RjJceEE0XHg4QiV+XHhEOVx4N0ZPWlx4MDFceEYxXHgxQ1x4QTlceDk5XHhEOFx4Q0VceEY4fVx4RERceDBFXHhFN1x4QjlceEI0XHg5Mlx4MEVsXHg5QVx4QzBceEYxRT9RXVx4QzJceDg2XHgxOFNceDlEJzhTXHhFOHZceEJGXHhDN3gsXHhERmVceEZBI1x4MEJceEY0XHg4NVx4RTlceEZCXHhBNVx4RkNceEE3XHg4Nlx4RENceEMxXHhENFx4ODl3WjVceDhBaFx4OTVgS1x4QTZceEQ2Qlx4QzUsXHhDRFx4RjRceENFXHhENFx4OENceDEyXHhBQ1x4QTQwXHg5MlFceDE0XHhGQVx4RTRceDFFLVx4QjNceEU4QV5ceEVFLVx4Q0FPISgwPDI1XHgxOFx4OEVceEQyU2g5RG9ceDlBXHhBQlx4MEVceEQ2XHg4RFFceDE4XHgxNllceENCXHhFRC9ceEU3XHg4MVx4RUFNfFhceEI1XHhGN1FceDdGXHhBNVx4RjNceDE0XHhGQTVceDhGXHhERWhceERBXHgwRlx4MTRceDhCXHhFNlx4OEVceEFEXHhBRm9ceEVGXHhDMFx4OEFceDhGXHhFOVx4OEVmXHhFOFx4MUZceDE4XHg4N1x4Q0NceEQ3XlBceDlDXHg5Qlx4MEFceEYyXHhGNFx4QjhCYlx4ODFceEEwanN7MzFceDk3XHg4NFx4RDNceDBCbVx4QTZceEVFbFx4RjQ3M2lceERCXHhCMjlceEM5XHgwQVx4QkI2XHhCRFRceDE1Wlx4MEQnXHhFMVx4QkVceDgzcSVceEZDXHhBMFNceERBXHhGRlx4QUJceEI0bFx4MTZaWFx4MTJceEQwXHgwRVx4RTdceEUxXEtceDk5XHg4MVx4RDBceEU3XHgxOFx4ODBceDEzXHg5QyNceEM4XHhFOFhceEVEXHhEMFdceDAxXHhGMGJceDg3QVx4QzdceDA0XHg5RVd0XHgxOFx4QkVceEZDXHhCM1x4RTkhXVx4OUFceDhDXHgwMFx4QjVceEQ3XHg4OFx4QThceEFFJ1Bsd3hceEZGeGIjXnMkXHhFMFx4REV1XHgwNVx4RTBceEZFJFx4RkFceEZBXHgxRlx4QjJceEMwXHg5NCZceEY5RydceEVDXHgwRFx4RThceEVFeVx4QkRceDgwXHhFQ1x4QTNbVU15I1x4RTBceDkyMlx4QjIqeVx4ODlceEU5I1x4QUFceDhGUFx4RjY7XHgxQlx4QUUxXHhDNU5ceEU3UTlceDgxU1x4QUJceEQ5XHhGMyVuXHg4MkJceDhFXHhCMlx4MUQ2XHhERjFceDg0OEtoXHhCQlx4RTJceEZEXHhDNlx4QzRceEZFc1x4RkRceDkwXHg4N1RceEQ2c2t2QUVceDg4L1x4QzZceEE4QFNceDBEXHg4Q1x4RkRceEE0XHhBN1xJXHhGMVx4MENbQFZceEJDSVtceDhDXHhBN1Y+XHgwRlx4QzdceEYwXHg5MjNceDFGXHhCOGdLe1x4QTRCXHhBOFx4MTdceEE5K1x4RkFceEJFXHhCNVx4RUNceDA3Jl5ZNVx4QTY/dm9ceDFGaVx4QTlceEEwWFx4QjAwXHgwNjZceDlEXHhEMyouXHg5NFx4QjdceDBCLFx4QzJceERFXHgxRlx4Q0RqXHhENFx4ODgiXHgwOVx4MUQ6XHgxOFx4RkFceDlGSFx4Q0JceDBDdFx4RTYhXHhCOSZceDlGXHgwRFx4RjBceEYyXHhDRlx4ODNceDFEIk5aOVx4ODNceEM0XHhDRFx4REZ6TEAmXHhEMDhceEU5Pz9ceDA2XHgwMlx4QjJceDE3NVx4OUZceDAwXHg4RFx4OUQ9O1x4QjRceDEwXHhBNFx4QzlceEY4XHhGNFx4RTRceEU3dVx4RjZceERFXHhGMVx4QzVceDBCXHgxNGxceDgwXHgwN1x4QjRceEVGXHgwQVx4OTNceDkyXHhGRjElXHhCMVx4RTNceEMyXHhGN1x4RjRceEU2XHg4MFx4MUJceEJGcVx4ODUxXHhDMFBceEEwXHgwMlx4QzB3XHhFN1x4MEJceDA0NFx4MEVceEQ2WFx4QjQjSjpceEFEXHhBMVx4ODBceDFCL1x4MDdLc1x4RDdceDlCXHhDOFx4ODNceEJCXHg5NVx4QTZceDE5XHhBM3hceEY2WlJceDlEXHhDOFx4Q0RceDgwRnB4XHhDOVx4RkZ7MS50XHhEM1x4MDZceEI4XHhEOEVceDkwW0VEXHhBN1x4QTVceDBFXHgwMFx4Q0RceDhDXHgwRkA3XHgwRDNceDkzXHhGRlRceEM3XVx4RkNceENGWlx4RTZceDlFK1x4RUVceERCflx4ODRceEExXHhFNzVrXHhGRUZkJFx4QjVceEVGXHhFRlx4RENceDE1XHhEMlx4MDRceDBGXHhFN1x4QzZ8WVx4QThceEQwXHg4RVx4QjJceDlCVVx4MURceENGOHRceEYzXHg4M25eXHhERjVceDg1XHhBMlx4RjZceENEXHhCRHpGXHhGNlx4MDNFXHgxNFpceDk1XHhFNVx4RkRceEQzIVx4QjlceDFFXHg5QWJCQFx4RER9XHg5N1x4QjhceEQ3XHhCNVx4RTFceDFGXHgwMWVjXHgxRVx4OTdceEY1XHhBM1x4Q0RceDExXHhDRFx4QTlceERDXHhEQ1x4QzlceEE5XHg4RFx4RURceEFCIV9ceEYyMCJceDBDXHhBMHxceEQzXHg4N1x4QUJtXHgwN1x4MURXMyhceEEzXHg5Rlx4OTVmMVFceEM4JXdSXHg5Q1x4RERceDBDSVAsR35dTnhceEExXHhFMVx4Q0VceEZDXHg5RFx4RjVceEI2XHgxMFx4ODVceEQ0XHg5OFx4Q0NceDBFXHgxNFx4QTZWXHhBMVx4QjlceEZBIlx4QjNceEY3XHg4Rlx4QURceEU5J1x4QTdceDkzfFx4QzZceEQ4XHhGMTVceEVCXHg4Qlx4MTVceEI5XHg5NFx4MEJceEM3aWFceDE5XHhFN1x4RkZceDgzL1x4RDJsJFFceEMxNC9ceDE0eGk/M0FceERDXHhGM2FceEQ5XHhENiRceEI2XHhCOFx4RkFceDhELiNceDk0XHg4OFx4RURceEM2flYpcVx4MUVSXHhGNllceERCXHgwMlx4MTJceEM5XHg3RltmXHgxM1x4ODFceDlCXHgwOFx4MDNNQ1x4OTktbVx4MERvXHg5QVx4QjFceDg0XHgwMj1ceDk0XHg4RVZceEFGc1x4QjZCXHg5NFx4OTl1XHhDRVx4Q0ZceEQ3VyVceDEzXHg5OFx4QjlceEQ2OVx4QUJrVlx4QTBceENGb1x4QTRceEI2TFx4MDJceDdGXHhBNWJceEJBYkFceDlGXHg5Qlx4ODhAXHgwMVx4MTdceEMwXHgwRTdceDFBXHhCMlx4MEFceEZDXHhBRVx4QTRceEI3XHgxOG9ceDhDXHhBMVx4Q0VceEE2NVx4OTRceERCXHg4RVx4MDlcUkNceDA0XHg4QztAXHhCRVx4RDBceDgzXHhBMnNceEREXHhGM1NceDhEXHgwN1x4QUFceDE3R1x4QURrXHhDNVx4RUVceEEzXHhDQ1x4QkJceEY2Zlx4MUVrb0NOXHhFNyIsXHgwRFx4RDFceDkxXHhEOUJceDE2XHhDMFx4RTlceEJCXHg4QllceERFRUtceDAwXHhDMFx4OTNQNlx4ODA6XHhCM2tceEYxXHhDRFx4REFceEY2Plx4MTBtWG9ceDk1XHhFOFx4QjhceDk2cFx4QTNLXHhCMFx4QUEpYlx4QTZceEFFXHhCOVx4OUFceDg5XHhENDJuXHhGM1x4N0ZSXHhFNlx4MTBceDlBSzFceEI4fVx4RTVceDExXHhEOHR+XHgxOGVAXHgxQW1ceDA3XHhCMFx4N0ZGOlx4QTNceDk1RVx4MTRceEQwQVx4REVceDFDdFx4OEFiL3hceEVEXHg5Mlx4MUNceDE0XHgwQ1BceDlDXHg5RHBVSGdceEIzXHg4N1x4OTVGXHgwOFx4OEVceEI5dlx4N0ZJY2FceEUwXHhCQlx4MDBmXHg4OFx4RkJceEQwQVx4OTZuXWVceDk4XHg4NShWXHgxMHllLFlceDE5VXpVXHg5OFx4MDdceEQ1IVx4RUZceEU5RklZXHgwN1x4QjVceEFGUVx4MEFceEEzXHgwQTZvXHhBNFx4OTJaXHg5OVx4MEJdXHg5OFx4ODdceDA5XHhEMlx4RDVceDE4P2pwSlx4OTdceEYyfVx4MTBceDlEXHg5NFx4QzJ8XHhGOVx4RkQ/XHgwNVlceDA2XHgwOFx4Q0JBXHhGRCtCXHhGNFx4RDZceEQ3XHg5QVx4REJuU1x4MDFceDE3eFx4ODhtXHhBOFx4ODlceDBEXHhCMyhceDAyXHg5N1x4MTFceEJEXHg5Qlx4Q0RceDdGXHhDMFx4OURceEE2XHhFRlx4OTdlXHhGNypceDgyXHgxM1x4QjkyXHhBM1x4MUVceDAwXHgwN1x4MDk7SFx4QTBceEY5P1x4MDBceEE0cVJ0WFx4QzNceDlCXkpceEI0XHhEMlx4RTlceERDXHhBNy1ceDAyXHg4Qlx4QTV9Wlx4MDVceEQ1XHgwOVB2XHhFN21ceEE1XHhENlx4ODZceDA4YidceEFEOHlLXHhFMipceEM1XHhDQlx4QkJ2XHhBM1x4OTZceEU1XHhBMFx4RjRUXHhERlx4RUI0bDpceDE3WW5ceEU2XHgxMFx4QjNFa1x4QjVceDEydXgvO1x4QzRqXHhCMlx4RkF9XHg4OVx4QjRceEIyXHhBOFx4MTQmUVx4QTgjXHhGNlx4RURceEU3YVx4RkNYY1x4ODJ8MVx4RUFceDA1XHgxQlx4OTc7YzpceDBCXHgwNiFceEFGXHhGNmxceEM5XHhEQVx4QjZceDlENCAoXVx4OEM1XHgwOVx4OTZceDlGXHhCQlx4RjVceDlCXHhCNnpceEFFXHgwMi5ceEMzXHhBOFx4MThKXlx4OEMyXHhDNT5PXHhCQj9Calx4ODh9UFx4QTl+XHhEQlx4RDdceDlEXHhDMFx4OURceEIxYlx4QjNceDgzXHhFMFx4QjFceDkydyIgIlx4ODFceERBbVx4RDMrXHhBNlx4MERceDFFN2kvfWxceENCXHhCQlx4Q0FceENEMFx4QjlQfVx4OTRceEY2XHgxQlx4QzZhXHhDOFx4RTFceDg3XHg4MVx4QTFiXHhDRWxceDkyU1x4RTZRZ2A/XHg5RVx4QzNceDE2XHhFMFx4RDJceDE1Mj0zXHhDMlNceDg2XHgwNilceDk1XFx4OTlceEZCXHhGOXlceDBDXHg4OVM0Klx4MERceDgze1x4MTNceERBXHhERjtceEQ0W1x4RUZEJ2ZfXHgxM1x4RkNceDA0e2hceDlFYFx4QkFceDlFXHg3RmspU1x4QkFceEVFZ1x4OENceEI2I1x4MTcwXHg5RFx4ODBceDBCXHhDMnlceEE5KVx4RDJceEExXHgwMClceDBDXHhEOVx4ODhceDlGXHgwQlx4ODd0dSNceEM5Slx4ODVceDg3XHhGRT5ceDgyXHhGMVx4RTRceEY0KF9+Ulx4RUFceEM3bWZceEVCXHhENSkoIUh1djlceEYwXHgxOEdceDg1XHhEN1x4RTd0ZFx4OEV2XHhEMX1ceEZBXHgwQXpceEIwYiJpXHg5N1x4QTJrXHgxMFx4RENceDExV1x4ODBceDA4XHhBRlx4MTVceDlGXHhFNlx4MUZceDBGaVx4RkZjXHhBODFceEUxXHg4Nlx4MDVceDFCXHhBNFx4QzRceDkwWFx4MTFceDBDXHg5NFFceEJGVFx4ODhtXHhBQidTaVYiXHgwRilceEVBXHhBRDlHXHhDQlx4RTRceEE1XHg3RlxceEVDXHgwRlx4OTU5XHhDRVx4ODdgXHg4Rlx4QUNceDA3XHhFOSItXHg5QkxceDg4XHgxNVx4Q0NceDA4XHhCNFx4N0ZceEUwXHgwMFx4QTlceEM3XHhDRlx4RkUiXHhFRlx4MERsXHhGNlpceEM5N1x4RUZceEEwUlx4QTRceEQxXHhBRG1AXHgxOFx4QjVceEFCXHhCNVx4QThceEMyXHgwOVx4OEJceDgyc1x4OUFxL1VceEMzXHg5Nlx4MTZceEU4blx4OTNceDE4ZFx4QzZxb0xceEE3XHhDQ2RceEJBXHg4Rlx4ODlceDA5XHhFRlx4QkVnXHhDNFx4OUJ4XHhCN1JceDFCXHg3RjJceEE5KVx4QjhceDA2XHgwQVx4QUJceDhBXHhFNFx4RUNyRFx4REJceEQ2XHhCMHZceEFCOHZ6XHgxRVx4RjRceEU0XHg5RFx4MTJceDlBPztMa3hceDAzS1x4RUFceEMzXHg4MCY2XHg4MGcjXHhFMlx4QzBceEQ5XHg3RjVceDk5XHg4Mlx4MTchXHhDNzVKXHhFOVx4ODZvNGs7XHg5NVx4QjRHXHhCMlx4OUNpXHhFN1x4OUVCWyRjXHgxOXgtWlx4N0Z9XHgxMFx4QTZceEFDXHhDOVdceEFEXHgwRFx4OThceDhGXHhEOT9ceEU0e1x4RDdAXHg5Nlx4MTUpXHgwM1x4QUQ7XHgxMlx4QTRceDk5Nlx4OTlceEZEXHg4OUQyJ1x4RTRceEUwXHgwN0hMXHhGNlx4QUJceEVEXHgxNFx4OUZ0XHhDRVx4MUJceDk1XHhGM1x4MDFiN1hceEQ1alx4QTRceEMyXHhBNVx4MUVceDFEXHg5OGJFYUhQNVx4OTFceDA5XHhGOFx4MEJceDdGXHhDMVx4OTBceDFDZlE+RFx4ODRceEYzXHgwN1x4OENceEM1XHg4OFx4QzQxXHg4NFx4QTJceDA5XHgxM2M8XHhENm5ceDA1XHhEQ0pceDlGXHgwNGtceEU1QFVceEYwXHg4N1x4MDJHXHhFOVx4ODBceEUyXHg5Qlx4QkJceEYwUFx4MDlUXHhCNSBhXHg4MmknXHhFM09ceDk0XHg5NHJceEIxXHgxRVx4MTRceDhFXHg4QlRceEI2QVdZJTdceEE0XHg5NkEuXHhCRH5ceEY0XHgwMVx4RjZ9XHhBRmUxX1x4MTlLYFx4Q0ZceEMzMGZFXHhBOHdkXHhFNm1ceEVGXHhEOTlceEMwQFx4OTdceEZFXHhFMVx4MTdceDEzVDdceEUxbywxXHhERS1gXHhGQ1x4QTFceEU1XHhDRFx4QTRceDg5XHhENVx4QUE5fVNceDBFXHhCQm9ZI1x4MUVceEZFXHg5Mlx4RUZGMlx4QUVEWVx4OEV6XHhGRVx4QUFceEJGXHhFNS5ceDEzXHhCQlx4QjhceDE1Rlx4MENceDhEXHhBNTtOXHhCNVx4ODZceEJBXHhCNHxJXHhBNyVceDgyNHNceEUxXHg5MVx4MTFeI0l1XHgxNlx4MUVceDg3XHgwM1x4MDFceEM1XHhEOVx4MUZceEVDXHgwRFFceEQ5XHhBOFx4MTFQXHhDRVx4RjhceDE4XHgwOS9ceEEwXHhGOVx4MTdceEM2XHgwOFx4ODggXHg5RnJwXHgxQi9ceEM4XHhCNGBceENFXHgxQlx4QkZceDg2Tlx4QjAjXHhCMTVceDg4XHhERVx4OERceEY4XHhCMVx4RDZceENBXHhERFdceEQ0XHhDRXtceDg3XHgxMnhceEY4QHZceEEwcFx4ODBgXHhEMjVceEIzXHhGRFx4QTFceDFGXHg5N1x4QUFceEFDXHg4MiZBXHg4N1pUXHg4Rlx4MERceDAzXHhGMVx4QTM2blx4OThqXHhERVx4QjFceEI5XHhFQyhceDg4XHg5RFx4QTRceENEMTJceEE1aFx4RDVceDBBP2ctIlx4QkJceEREXHhERVx4RDZceEM2XHhBNFx4RjJceEU3aVx4OTNceEU0XHhBQ1x4MDM+fFlceEJEXHhBOXRceDAzJlx4RTZmXHgxQjR5XHgwRlVHXHhFREZceEFCQWZceDBBXHgwM2RceDg0XHhEMlx4RjVceEJCXHhDQlx4RTd4UVx4QjJceEZCOVx4ODhceDhFelx4OEYxXHhGMlx4QTJceDAyXHhGQSlceDBFXHhDN2dceDA4XHhFN1x4RTVceEJCXHhBM1x4RkJceDA5NFx4RTlwXHhGN0NceEE3XHhENFx4RkFOJDNNXHgxRlxceDkwWTE7XHgxRFx4RDBceDk5L1x4OUFceEJEXHgwRCRlMVx4ODZceDExXHhFRlx4OUFoXHgxMVx4ODdceDBDPl1ceDg3XHhEMlx4RjZceEY2XHgxNlx4RkJceDA4I1x4Q0RceDk4Oz5cXHhDQ1x4OEFceDkzXHhDQVx4OTJceEU2QVx4MTkzXHhGMz1ceDEyOVx4MTJceDg1ajpceEZEclx4RkFceEEzXHhDQlx4QzNceDE4XHhGOVx4RkZceEMxQlx4QkJceDgyXHhGQ1x4RTItXHg5OFx4RkEiXHhERGZceEZFXHg5Nlx4RTdceEM2XHhCNFx4QUZceEJEXHhBQ1x4RUVue2hceEVBciJRJ1x4QkVceDlCclx4RjhceEVEJFx4RTNceERCXHgwNyRiO1x4QzRceDEwQ1x4QTVceDk0XHhBOVx4QjdceEI5XHhGRFx4Q0FceDkxXHg4M3pKdlx4QzBceDkzKlx4OTNceDlEXHg5NFx4MTJceDAzSVx4QTZceDE0Wlx4MTdceDk3XHhBNFx4REREXHhBOVx4QjRceEZBVVx4RjBceDExXHhGNFx4RDJceDE5c1x4ODFceEZDXHg4RWhceEI2XHhCQlx4RjJceDAyXHg5Q25ceDE0XHhGN1x4MEFceEFDN2FceDhCXHhCRiJceDk0XHhEMFQqXHhFM0k4XHg4NVx4RDBceDlEI1x4RkJ9IVx4MUVJXHhEMFx4QzlceDhBXHgwOHRceEZGXHhBQURXXHgxMVx4MTJceDEwXHgxQzpLIjtXfkBceEJBXHhCM1x4QzBceEMyIUdceDk2ZVx4ODh5XHhEMVx4OThceDg5XHhFNTJceDk2XHhFOVA4Mlx4RURWXHhCNipceEFBXHhEM1x4QjdDXGFceDgwQ1x4QjVceDAwXHgwNThRelx4RDcnXHhBRHRceENDM1ZUXHhDRVx4RDk4XHhBOVx4RURceDhCXHg4NExBI1x4OEZceEUzOVx4OTBceEFBMlx4RUNceDFCXHhBN1x4QjkgXHg4NVx4Q0QzIC5ceDg5Y1x4Q0FceDg0XHhGRFx4RjNceDlBLFx4RjgmXHhDMFx4RjVceEE3XHgxQVx4QkJceDlBXHhGOVx4OUN9Rlx4RDBceEUyXHg5QiMxXHhCMFx4QTlkXHhBRWNceEQwMzJ7VFx4MTlVXHhCNFhceEU0XHg4RGlceEZGXHhFNFx4OEZceDFBTlhceDFCVXdceDhDXHhCMVx4REJ4LiB2NFx4QkYxbVx4RDlceDFEJ1JceDFBXHhEMFx4MDBceDFDXHhGOFx4OTE9XHgxN1x4QTJceDE3XHhGNVtceEQ5XHhDRnpceDA4XHhDNFpceDE4Xlx4OTJ1XHgwRVx4RTRceEU4XHhGQVx4QTBceEFDXHhGOEdYZlx4REFJTFx4QzVceDk4XHhGN1x4ODNYXHhBMlx4RjhceEQ4IFNceEY4XHhCNlx4RDNceDk5Q1x4ODFceEZGXHg4M15ceDA2XHg5MyZceEY5Q1x4RUJceEMxTiVceDk2XHhEQV5tXHhERFx4RDdPXHgwM1tqXHg4M1x4OEVfXHhGQlx4OUJceEE5d0hceEY3UiUsWVx4QTdjOXRceDgzXHhFQnkgXHg5NVx4QTZceEYwXHg5QVx4RjVceEE2blx4QzBceDFBXHhEMFB4TkNeXHg4Q29ceERDSVx4QThkXHg4Qlx4QjJNe1x4RjhceDFEXHhBRiBceEUwXHhDMF5ceDFDXHhDMFx4MUFceDAyN1x4RjQgXHgxMlx4MDVsJVx4RjRpXHhBQiZkXHhBMVx4OEJceEUyXHhCMFlceEMyXHhERVRceEMwOFZceEE5dFx4RjRceDBDW1x4RkRceEVFXHhBN1x4OUZceEU2XHhCMlx4RkJceDA3XHgwNGhceENEXHhCQ1x4QkVceEE5XHhDMFx4QzBceEYyMlJceDFDXHgwM1x4QURceEJFXHhCNFx4RTdceENFXHhDREhceEZEXHhDM1x4RjQ3XHhBQ1x4QTFceEYwXHhBMVVdXHhFM1x4RUZceEFFXHgwM1x4RjBceEQ0aFx4MDNceENDXHgxRFx4ODEkXHg5NFx4RjVceEE5XHgwM1x4OURbcFx4QUFceENFK1x4MUJceERFSVx4RjlceEE4LVx4OUZceDA0MFx4ODdyRlx4RjRceEZCXHhCMihceENEXHhCNV5ceEJDVlx4RDZceEFGfVx4REZceEQwR1NceDkwXHg3Rlx4MDVceDE1XHhDN0hceDAzXHg4RFx4RjBKXHg4OFx4MEJceENFVShceDg4XHhCRlx4MThceDg3ZVx4MDFsXHgxN0BceDA5ZFx4OTlceEFCMlx4RjRceEE2XHhFNlVEXHg5NiMyXHhGQ1x4RjdceDE2fVx4OTVceDEzXHgxMFx4Q0NceDAyXHhFN1x4ODl9XHhBMlx4MDRPRVx4MERceDAwXHhFQ1x4RTZceDBBXHhBMlx4OTdceEY0XHhBMlx4QTJzXHg4Nlx4QjRASVx4QjhkaVx4MDlNXHgwRDRjXHhDQVpceEMyXHhGMlx4RUFceEU1XHhENyJceEJBLEBceEE5XHhEOFx4QUF4XHhCNFx4MDdceEUzWSNceDg2XHhDRVx4OTRceEIwSFx4RTNdXHhENFx4MEZceDk2XHhGMEVceEVEP1x4MUVceEIxXHhCMVx4QjRceEJEXHhERFx4QzRceDk1XHg5RkFceEZBTFx4QkFceEY3XHg4Rlx4MTFceEE5XHgwMlx4MDFVN1x4MDVsTVx4Q0I1XHhFNnl8Olx4RjMoXHgxRFx4ODVbXHhFNFx4OEZzXHg5MFx4QzdceEQ4d1x4RURceDlBXHgxMlQ8XFx4MDA1XHhFM1A2XHhEMFxqXHg5MXRceDlCXHhFMlx4REYvflx4OUReXHhGQVx4MDhceENDYUxceEY1dFx4QkJceEU3XHgxN2BceEVDJlx4Q0NIXHg4QTtrXHg4Qm1aOndEXHgxMFxhMEp6XHhCQ1x4MERrLVx4Q0JceEFDXHg5OFx4QTNceDAzXHgxRlx4RDhOXHgxMlx4QjJ7ZS1ceEEyXHg4QVx4QzZceDE1XHhGQlx4QzY6XHhBNFx4QzdceEFGNWpZSWNceEI3P1x4RTZJXHhDMlx4OENOXHhDRVx4MEVceEE1aFx4RUZGXHg5RUZLXHhCNlx4OUFceEU3XHhCNVx4QzFceEMzV1x4RTVceDk2XHhCN1hceDlCXHhENXRceEQwXHg4N1RceEEyXHgxM0JceDk2XHgwQ1x4RTJceEJDXHhFNEtceEM1XHgwNDVceDFDXHhGOVx4ODRiXHhENEgsXHhBNVx4MDdceDBFXHhDQVx4RTdceEE0OVx4QzBeXHhCM1x4MEZQbHpub1x4QjBceDgyXHgwQVx4OUFceDA4XHhEMUlceEU5P1x4QjhceDExXHgxM1x4MDckMlx4QjhceDlEXHgwNlx4MTlceEUwXHhBMVx4MUVceDkxXHhEQSZceEQ1XHg5Mlx4RkJsXHhGMnFceDA4fFx4RkQmXHg4RVx4QjBceEUzXHhCRVx4QzJkXHhBMFx4ODleSlx4ODlceEM3XHhDQ1x4QzlceEI0XHhDNFx4QjBceEM3XHg4Q3tHMDI2QFx4RDdceEI4XHg5MFx4Q0FceEVEXHhCRlx4MTNceEI0RydceDFCVVx4Q0JceEI0QVx4QUInNVx4MTBceEFEXHgwQVx4N0ZceERBXHhCOFx4Q0RceERBXHhCMVx4MTdceEU1Ulx4ODRceEIyXHhDMVx4RUVceDExXHgxN1x4RjdceENEXHg4Mlx4QkZceEVCXHgwNXJceEVBPyhceEQxd29ceEUwI1x4RDFceDg5XHgxRlx4QTZceEY2XHgxQVx4RjJceDgyXHhDNFx4OTBceDE4XHhGRVx4RTVVZi1ceERDXHgxNFx4ODkpPFx4RUZSXHhGQXlceEFDXHhCMFdceERGRXI8XHgxQTFceDgyXHgxMG9ceDhEXHgwNFx4OTJceEFCXHhFM3VceDBGXHhDMlExXHgwMVx4QjVceEMwXFUlW1x4QkRWXHhDQlx4QTdHNURceEExXHhGNlx4RTVceDBGMFx4QjlceDgyXHg5MFx4RjVceEE2I3dxXHhCN1x4QjJceDlFXHg4NVx4N0Y6XHhBNFx4RkR6XHhCOTVnXHgxMlx4OEFceDBFXHhFNHpceEM5XHhDNFx4Q0RceEU0XHhDNlx4QUR6XHgwMVx4ODNceEJFXHg5OFx4QkJceDAzXHhDODFcXHgwNFpYXHhDRFx4OEJceEFFXHhEMFx4QThceDg3XHhCN1x4MDRQQURceEJETFx4OUM9XHhFQVx4QjVceEJBXHhGRUZceEQ3PVx4RkRceEFELE5NXHgwMX5JXHhCRUNiSmNceEMyXHgxQSZceENEU1x4ODddXHhERFx4QjJceEE0XHg5Mlx4RTZsXHhDQjhceERGXHg4Rlx4MUFtXHhBOFx4RTJ2XHhBNFx4RjUhXHhDQSo+U1x4MUZceENEXHgxMl9hXHgxNCMrXHg4Rlx4RTcrXHhFM09ceDEwXHhFQlx4OUFceEE1QVx4QzZceDk0Q09dXHhENlx4MDNceDlBXHgwQ1x4QjRceDA5JkNceEFCXHg5RGZceDBCXHhCQWVceEQxXHhCQlx4OTdceDg2XHhEN1x4OUFceDk4XHg5MSlceEI3XHgwRmpMYVhceEE3XHhBMFx4QzNceEEwVGFceEU2Qzp4XHgwOFx4MDBceDlEXHgxNFx4QjdceEU4dVx4RDRceDBFVidaJVx4QkFDRlx4MTY8XHhCQVx4RUUkIlx4Q0NceEM4XHhBREZceEZDXHgwMzM5Nlx4MDJDXHgxQlx4QzI+XHhERFx4ODBhXHhFQlx4MDNaXHhFOH0xV1x4ODdceEQ4XHhBOVx4RTNceEQ5OFx4QjFceEZFXHhDRFx4QURceDFDR2pceEFGMWdceEVEXHhFOVx4QTRbXHhBNVx4MUVceDlEIlx4QTZceDhGbElceEYwcVx4QzUhXHgwNVx4MDlceEIxXHg5RCVceDAwXHgwRTtceEQzXHhERlx4MEZceDEyXHg4NVx4RTBceEMzXHg4Mi1ceEZBXHhBMTAxXHhBQlx4RUVceEVEXHhBQlx4MDR9XHhGRlx4RDdceEMwXHgwOVx4RjBceEJEelx4OTRWXHhEOVx4OTFQXHhFQ1x4OTBceDBFXHhBRlx4OERceDE0eFx4Q0ZceEEwXHhGQVx4MDJceEI4XHhBMVAhXHg5OVx4MDZceDEyUW9ceDBBPTEuPGtceDg4K1x4Q0MmXHg4ODFnXHhERlx4RkFFXHg4Rlx4RkNceDAxdlx4QkZ3XHhCQ1x4RTRceEM3XHhFRFx4ODNceDk3XHgxOFx4MEJlXHhFQS0kNlx4MTJceEEzb1x4OUQ6XHgxM1x4OUNceEJCdlx4QzheVlx4QzBlR1x4QjlmPl9ceEVFXHhFMFBAXHhBRFx4RDRceENGXHhDOVx4RkZceEZGXHhERCtceDE5XHg4NWlXXHg4QzxceDEzXHhEQVx4OEFceERBbytDXHhDRlFceDAwXHgxM1x4RjhiXHgwQlx4REUuXHhGRGtceENCXHgwMVxceEZEJVx4OTRceEM3XHg4RUhceDhEXHhGM1x4RThceDA0I1x4MDhceDlCXHhGMkZ+XHhBMmVceEE2XHgwNlx4REVceEQ5XHhDNFx4RDNceDBFRVx4MDgkb2JceDBCXHhGNF07XHhDOUhceEY2clx4RTlLXHhDNVx4OEJcXHgwMlx4MDkwXHhEMFw2XHhCQUouXHhCRCRAXHgxQ11SXHhCRS5hLVpRSVx4MTFceDlDXHhGM1x4MUNbXHhFOVx4OUZceDk4XHg5NVx4MThjZFx4RTdceEQ3NFNceEExXHhDMVx4RTRceEVBXHhCMVx4MTIuXHgwM3gsXHgxQVx4MDF5XHg5RS9vfDNceDBGQVx4OERceENGXHhDMlx4REFceEE3dGNceEZBXHgwOCd3U1x4RDNceDBBOj9xXHgxQlx4RERvXHgwN3VceEY4XHg5M1x4RDFdXHhEMFx4OERDXHg4N1x4MTdnYChceEFBXHgxRlx4QTFceEY3XHg4RmtceEVFXHg5OVZceDg0Llx4QjRceEI0XHgwN0dceDlDYkxceERFXHBceDEzXHgxRVx4REN5PnlceEVBOGxceEVEXHhFNVx4RjBceEY3XHg4QVx4ODJGQmovSDpceDkxXHgwMlx4Q0NceEMxUXNceEQ3XHhFNFx4QTVBOVx4QUNceDgyQlx4RjNceEQxXHg5Mlx4QjVceEQ2XHhFOFx4RTVceDlCU2FceDk3XHhBODtceEQ5XHhDM1x4RThceDhBXHhGNTFceDFGbFx4QTU8QFx4QkUgZ1x4RDRceEExXHg4Q1x4QTRceDE3XHgwQj1ceENFXHhDNFx4MDdceEUzdFx4RTk1XHhDNysyXHhGNlx4OTFceEQ5XHhFRFx4OUFceDk2J3V2XHhGRmhceEZDe1x4MEJ1eFx4MENceDAzKTZceDEyXHgxNVx4QjlceEJGXHgxNlFceDkzXHhGQVx4MUNceDkzXHgxQmlTW1x4RTNceEQ1XHhCQ1x4QTJceDEzb0BcXHhGOFx4REJceEQ1XHhFQ1x4RUZkbVx4RUNceDg5b11ceDlDXHhFQSZceDAxbHpceDBEM010XHhBRVx4MDFceDg4XHg4Rlx4Q0F1XHg5OCBceDExXHgxMFx4ODJceDAxRXlceEYxYm1ceENFclx4OTlceEYyXHhDNlx4REVCXHhGNVx4RkNceEQxXHgxRFx4MTRceEM2TH1ceEM0XHgwM1x4RjVzeFx4MTJUXHhDNlx4N0ZceEE1O3pJd2M+XHhBNFx4Q0VceDFCT14pXHhERUA6XHhFQ3hceEQ3XHhEQ1x4QzlceEY4XHhDQykzXHg4MFx4MERlIlx4ODRceDA2YFx4QUVceEYyXHg5RldceEMzcjBceEUwXHgxRSdceEI4Ilx4RThceENFQXNceEVEcFx4QUZceEE4Ulx4OThceDk1XHhEQ1x4QkFceENFXHhDN09ceEY4LVx4MTMiUFx4MUFceEU5XHhDM1x4QjVceDhEXHg5RVx4OEJceDAzPSVzaGRceEJCXHg5MVx4Q0R2XHhFOVx4QjhceDFCXHhCM1x4OEJceERGXHg5QWNceEM3XHhCOCpCXHg5MVx4QjNceEE0aVx4QzlmXHg4OUlceEMxXHgwQlx4RDdsXHhFRlx4OTVceDkyLVx4QzNceDhDXHg4RVZceEMyKFx4MDFceDAyXHgwOFx4RTQkXHgwNnBceDg1XHgxNUFceEU5XHhDQTZceEU2XHhEMlx4QzdceEUwXHhEQSR7XHg4OHtuXHhDRlJceDAxdVx4MTRceEU4XHgxRFx4ODdbXHg4N1x4RUZGXHg4Rlx4ODJ4XHhFMVx4RkZWXHhFRldceEY5XHg4N1x4QkVceEZENj5ceDFFXHg5MGlceDE4XHg4Mlx4RkF+XHgxQntceDBBflx4QzRceDFFcGJUXHhBOFx4RTdceEVBLn5ceEU0XHgxQlJceDFBXHhCMVx4RjVceDhDXHhGNCBceEM0XHg4QTBceDk0XHhEMVx4MUJceERDXHgxMkZiXHg4N1x4QjVHXHhDMlx4QzFceEU5XHgwMFx4QjBceEJCXHgwQ1x4QjN5Mlx4MDJceDAxXHhBRmxceDA2XHgxRS5ceEQ4XHhFNTtceDkwXHg5N0Z6PGZceDA0O1x4MUZceDAwXHg5MFx4QTNceEI0KDVhXHgwQkxceEMwXlx4MDVceEFGXHhCRlZceEQ5Ulx4QTRceDAyXHhDOFFceEMwMFx4ODJceEZBXHhFN1x4ODlceEI4XHgwQ1x4QTk5T1kyUSFceEExXHg4QVx4MUV3XHhDRn1ceEYxS1x4MDI4XHhCNX5ceEVGXHgxNlx4RTlceEFDXHhGQ1x4QjVceDlEc2p5JFx4RTFceEE5XHgxQV50XVx4QzNceEFEXHhDM1x4RTYnXHgwNSlgXHgwM1x4REZceDE3dlx4OEVceEU5XHgxMiApXHg5QVx4OUVceDExXHhGRVx4REZceERCOlx4ODJceDhGXHg5QzRzXHg5Nlx4MTNceEZBXHg5MkpceDA5Nlx4RjRceENCXHhGQ1x4OUNceENDXHg4Q1x4MDYmXHhGM3JMXHg5MVx4MEZ6VyFceEM0XHg5Qlx4MTZqXHg4OHpceEU0Plx4RjRceDAxNVx4MUNceDkyXHg4QVx4OTYuXHhBNFx4MTZceEVEXHgxOVx4RDlGXHgwRlx4RTYzXHhCQVx4QTdceEUzMVx4REVceDAzXHg5Rlx4OTdceDlGXHhFNVx4OTlceEZEXHhCOUVceEM0L1x4ODVceEU3XHg5QzlceEJGXHhDMFx4ODVceDg3Qlx4QTBgXHhBMFx4Q0ZceEY3eFx4MTNceDBCXHhFMlx4REZDXHhEMFx4QzQ6Ulx4MDFceEVCXHg5N1x4QTJceEY4YUhceDBDXHg5NFx4QkE9XHhCMlx4RkRceDEyXHg4OWpceERCXHhEQVx4ODBVXHgwRFx4REJceDE2XHhFMUNceDgxXHhCQlx4QTBceEYyLVx4MENceDdGfjB2XHhBM1x4QTFvRVx4QkVceEIzQ1x4QjVPbVx4Q0FwNVx4MTlceDA1MVx4RENceEI4XHhBQUNceDBBXHg4NUltXHgxQVx4MDZceEM3XHg4Q1x4OENceEExXHhBMjNceEVFXHg4Qlx4QjdceEVBXHgxMFx4QTBceDlDXHhDQlx4QjAgW1x4ODIzclx4QUZ+XHgxMV1ceEE5XHhGNVx4QTBceEU3XHhDN1x4MTFceEFGXHhBNVx4OEZiU0xceDhGXHhGNFx4ODVceEJEXHgxNytceDk4UFx4RTFceDg2XHgxNlx4QTNceEVEXHgwMiwhXHgwQlx4MEZKZ1x4RURceDBCXHgxMGdceENBX1x4RDYodlx4RkFceEJCXHgwRi1ceENCXHhENFx4RjNceDgxXHgxQlx4QTZTXHhCNGdceEM0Q1x4RDhceEY5XHhCNnluXHhFRidceDg0XHhFNFx4MTR4XHhCN1x4RTUsWUFceEUwXHhGMlx4OEMnXHgxM1x4MTA+fHpceEExXHgxRFx4MTZceEJBXHhCNXtceEQxLVx4QzN3XHgwOFx4RDNceEY1KVx4MDZceENEZG5ceEI3XHhFRVx4MDFceEU1XHhENSZWXHhBQ1x4MDhceEJESnNOXHg5RHF8XHhCOFx4MUNceERDY1x4RTgtcidceEM4WFx4QjFceDk2XHg5RDt8XHgxOFx4ODlceDgyXHhCRlx4Q0RceENFXHgxNFx4QTVdL1x4MEJceEFBTUhceDE2Xlx4QjZceDAyXHgwN1x4RDZceEYxLFx4Q0ZceDAzXHg5OSdceEJGXHhFQVx4QTQ7XHg5Nlx4QkVceEREI35SXHhBRlx4MDZrXHhCMUZCXHhDMlx4MEMuXHhFMShceEY1XHhCQlx4RTEsXHhBQlx4QTBceENFPmEhOFx4RUVceEI0XHgwM1x4OTVceDk5eCldXHg4N3hceEUxVGBIRVx4QUVceDBBXHg5QSVceEE5XHhBN29ceEM2XHg5QUBceEZDXHg4Q3VZMlx4MERceDFGb1x4MEQkWlx4RDU2XHhGN1x4RkJceDg0XHg5NFx4RUZceEIzXHgxQlx4QURfXHg5Nlx4RUVceEU5aG5ceDdGXHhFRlx4QzJceDg5fVx4OUZFTjJceDgwXHgwRVx4RDBceEYwXHgwQ1x4RTZceEU1LWwjaFx4MUVceDkzXHg4Nlx4REE5XHhFM1lSXHhERlx4QkRceENGXHhGMStceDBFd1x4RDEgTWM/XHg5MCdceENDKVx4QzVceEE3XHg4Qlx4RDVYaFx4QkFceEVCR1x4REZceDhBOUtceEM5XHhCOVx4QkQxSWNceEE5Plx4QkI4XHhERFx4RTlbXHhCOXRsXHgxQlx4RkRceEM4YVx4RkVceDEyXHhCN2NceDlFXHhCRklceEIwZkg2VVx4MDNESFx4OURceDA5PS5ceERFalNceEY1XHg5RVx4OEQxVHd3XHhCOUlceEUwPVpceEJELDsnXHhBM1FceEFFXHhFRVx4QTNPXHhCNTtceDEwXHhCRS84XHg5OURceDk0dHBceDg4XHhFQlx4QTRceEEwXHg5M2JceEVCOVx4ODFceDEwXHhBRjNceEU4XHgwQlx4RkM/XHhFNVx4RjZceENBXHhGM1x4QThceDBEXHhFRk1ceDk0XHg5NzdAPVx4ODBceEI5PVx4RjRceEIyQ1x4MDdWXHhDMVx4MDlceEIzJFx4OUVceEFCPFx4OURceEI0XHhFQlx4RDdrcVx4RjJPXHhCRVx4OUZaXHhGRlx4MDRRXHgwMlx4RkNceEFDZzhceDlDXHhCM1FeXHg5NFx4OEFceEI4XHg4NmxceEQwXHgxQ1x4ODNCXHhBOTZceEIzYlx4QTZceDgzTlx4RDhmXHg4RVx4RURceDExVVx4QjhceEY4XFx4MDZceEUyXHgxRVx4RDZceDlBclx4QTFceDk0XHhCMFx4RkZceDlCXHgxQjBceEYxXHgxRmE5XHhDNyVOXHg5RVx4MUM9XHg4NmtceDg2XHhCOD9ceEI0XHgxRSRceEZCXHhENFx4QTNceEJGXHhCRVx4MDNceDFBXHgxNzh4XHgwM18gXHgxMF9ceEI1XHhGQ1x4RDNceEY1XHhDNzRceDFEXHgxOTdceENGXHgwN1x4ODlceDkxdFx4QjFceDAyY1w0XHg4RClceDg0Slx4RDJ+XHhFNEpceEQ4Rlx4RDNceEU1XHhDOVx4QTZceEE5XHhDRCI5XHhENTNceEI4Llx4RkJrXHg4Nlx4RjZceEQ2XHhDMFx4RDhceEIzXHhDMVlceDA4Ilx4MUVSXHhFOFx4Q0VceDg0XHhDMFx4RkNceDhEQUNceDg1XHhFNlx4ODRceEQzRVx4RTVceDE3XHhCM1x4MUZceDk4Rz1ceEM4XHhCOFx4N0ZceEI5Y1x4RTBceDhBXHgwN1x4QjhceDlDRVx4RkVceEI3XHhGMEspXHhFQ1x4MTlceENBZDUuXHgxRWVceDA0XHhCOWVceEI0XHhGME1cXHgxNSxceEJCXHg4MllceDlEXHgwQlx4QzZceDE3dlx4MEFpXHhCN1x4MDhceDBBUVx4MDhceDgxXHhEMlx4RDdceEE4XHhCRlx4QjJceDFGVlx4MThceEQyb1x4MTBceEVDXHhDM0tceEZGLU0qXHhCRi5ceEU0XHhFRVx4RjlceEExXHgxOVx4ODNceEVDeVx4RTUjXHg5NCdceDkzXHhFOVx4MEZceENCNVx4RjFOXHgwNmZceENEXHhFOFx4QTY5VFx4RkNceEMyXHhFQy1ceEVGeH1ceEQ3LVx4QkZceEMxXHgxMlx4OEVceEZGS1x4Rjg2XHhFMFx4MUYzXHhDMVx4RDBceDk2XHhBRUkkWVx4ODJceDFFT1x4REZceERCXHg4MFx4MDN5PFItXHgxMTNceEM5Y1x4QjRceEI0XHg5MG5hT1x4MERceDEyXHhDOGVceDg2XHhCQ0VceEVDXHgxNlx4RjA/XHg5Nlx4RDlceDdGXHgxRVx4QUVceEY1XHhBNVx4MUZpNHYrQVx4RjZ2XHg4RFx4MDdtXHgxOVZceDE2bS1ceEExXHg5QU9ceDFEOVx4RUVceERBXHhCNVx4QzRgXHgwNSZ5VDdJXHg4Rlx4RTlFXHhBRlx4MDNceEE2c1x4QkZcXHg5NVx4QTF8XHhGRlx4MDlbXHgxRVx4ODNceEVCXHhBQlx4RTVJKFx4OEFceDg2XHhBQlx4MTVceEQwdFx4QjBceDgxXHgxN1x4OEY4XHgxQlx4MTlceEFFXHgwM1x4OTNceDExXHhDMmJ2L1x4RkIpXHhDRlx4MTNceDhGMFx4MDNSXHhCQ1x4MTZceDE5dH5ceEVFZy5ceEVBJVx4RUFceEQ4XHgwNlx4QThceEY0XHhBOFx4OUFceEJGXHgwMDRceEYwXHgxQUJceDFBXHhBQlx4QjVceDk3XHg4M1x4RkFUXHhEMFx4OUVceERDXHhEMFx4RDJceEI3W1x4QUNceEQwVmNceEE4XHg5MFx4QjVceEU3Qlx4REZceENFV1x4RTBceEUxWSZceEVEXHhBQ1x4RUMxXHhEMFxceENEXHg4RUJceDkyXHgwRFx4ODdceDk0XHhDRlx4QzZkXHhFMyNEQVx4MUZceDgzWVx4OUJceEYwdFx4Q0N7XHhDMlx4RTRceDhBeiBceEUyMlx4QjFceEREXHhBRVx4QzlceERGXHg5OVx4QTlceEMxXHgwMS9ceDAxXHhFOVx4OUUyXHhBMjVceDlEXHhDNT5lXHgxOHtceEM0XHhDNVx4RDhceENCXHg4Rlx4RUJaXHhFOUJceEZEXHhDMlx4RTJceERCXHg4MGlFXHhGMlx4RkYodGZceEJCVFx4MUJceEE0LVx4OERceEU3d1x4RURceDBDXHhCMFx4OEVCXHg5NVx4QjlCMVx4RkNceEFDXHhCNGJceDg2XHg4MVx4QjVceEIyXHhFMnJceEVGXHhCNFx4OEZceDg1XHhEMlx4QURceEVDfFB0eFNceENEXHhGQlx4RDhceDhDZVx4QUZceEQ0aFx4RUQmXHgxOFx4RDRceDExXHhGQlx4QkJceERCXHg4RlFfdFx4QkRceEVCL1x4QURceEZDXHg4Mlx4MEZFXHg4RFx4MTR8XHhGMVx4MDNceDBCWVx4RkZceEI1XHhEQ1x4RUZceERCXHgxQSdceEZDXHhDNlx4QTFlXHhGMlx4RUIqXHgwNENceEIzXHg5MFhceEFCXHhBRGFceEQxXHgxRVx4OEV+XVx4REYyXHhDM1x4OEVceDgwXHgwNVx4OEN8PX5FXHhBNlx4RTdceEVDXHhCNVx4QzBceEMyJ1x4MThceEE1XHgwM1x4MUZceDg0XHhEMFx4MUJceEFBXHhGOVx4ODdceEZCXHhBNXViXHg5OEtvZ1x4QzQ1UFx4QTlqXHhFOEdceEE4XHhCQVx4QzhceEFBMlx4MUR9XHhENlx4QzNceEJCXHhDMVx4OUNceENFc1x4MDdIYlx4MUNceEI3JnpceEUwZ1x4QUFwVVx4RkFceEQ0XmNceEE3I0dceEY0XHg4Q1x4OTVkXHhBNVx4RkNOIVx4OERkM1x4RjBuXHhFOVx4RDR2XHhGNFx4MERZXHhCRlx4RDhPOlx4RjYqXHgwOVx4QzlceEZDXHhDQVx4QzdFMVx4MDFceEMxXHhEN1x4MDNceDFGXHhDM1x4OTQ1XHhEM21oeFx4MTItXHhCMlx4QUNceEE5NFx4MEJceDkyPitceDhDOVx4RERceEUyXHgwQlx4QzZceDA0KFx4RTcnXHhEQVx4RDFceEFCQFx4RUFceEYzXHhDQVx4QUElY1x4RTFceENEXHhCRFx4MDJIPlx4MUJfMVx4MTUwV1x4RDRceEVFT2JwZFx4Q0NceEQyJFx4N0ZceEYyXHhBN35RXHg5MFx4RDZceERCXHhERSpceEI5XHhEMlx4RjdceENBXHg4OUc9OFx4RTFceEM5XHhBRlx4MDBceDgwXHhENFx4QkMsXHhBNzBkXlx4RTRceEYyXHhBM3ZceDlDXHg5M1x4RUVfaTxlOlx4REJDJlx4QkZceDBGTFx4MEJceEE2XHhBOVx4MDBceDhDXHgxRHFceEE2XHhDMi1ceEU1XHhCNVx4QjQwXHhCQ1x4MUFceDkwXHhEQWdceDAxXHhENFx4MTlceEZCT1x4ODRceENGXHg5NFx4OEUrXHgwQlx4RDVlXHhFMVx4QjZceEZBXHg3Rlx4MUJceDAyTVx4ODZceDEwOFx4RTJdKjt9XHgwQlhceEI4XHhFM1x4OEZFXHhBRFx4OURceDFGXHhCNlx4Q0JGVlx4RkNbeVx4ODNKXHhCMFx4REJceEQ5XHg4RTxceDFGeylGLVx4OTdceEZDXHhDRlx4MUViXHhBMFx4RkVceEI5X1x4ODdceDA0XHg4NFx4MDErXHg4OVx4OTJceDk2NXtxcVx4QTZhXHhGQypdXHg4Mlx4RkFceEU4XHg4NyJYXHgwNEhceDA0XHg5MFx4QjQib1tceDhFYVx4RTFceDlDfERceEJEZFx4RjRceDkyXHhCRihceEYxXHhBOFx4MEFceDA1XHhCNVx4QzNceEQ0XHgxNFx4OENceDE3XHhGMlx4QkRVXHg4RFx4QThceEFGWS1tXHhENzlceEExXHhDOVx4RkMsXHgxOStceDhBL3dceDBEXHhCMDtceEQ5XHg5MVx4OEMzQFx4QjVceDkzXHgxOFx4QjlceDhFXHhBMDAwXHhEMVx4MUFceDlFIFx4MUNvYVx4OThceDAzXHhFOVx4QURceEYzJThuaGdceDFDXHgxRVx4MTNceDBCL1x4MUNceDE1alx4RkFceEJFXHhDMVx4QjFceEE2XHhDOVx4RjlceEVFXHgxM1x4MTRceEYyXHhDRFx4RkQgXHg5Qlx4QTJceDk1XHg5Nlx4RDJceEUzMlx4MUZceDkwXHgwRVx4RjdceEJGXHgwNlx4OEV+XHhDRlx4Q0JSbCF5XHhFRVx4MDRceEQwXHg5M3dceDA0c1x4QURceEMxXHg5MFx4QUVceDg0XHhBM1x4RThmXHhFN1x4OUZ7Wj4zYVx4MEVceEI2XFx4QzhceEZEXHhBQ0w1XHhEQVx4OUR8XHhEQlx4RTVceDBGXHgxRVtceEM5XHhFRTFceEM4UjBceDE5XHhENFx4RDlceDFCXHg4RFx4QjBceEZCZDVceENEXHhCOFx4RkJZXHhFOCdIJ0pceDkwXHhERFx4RDJceDkyKWFceDlCXHhDOFx4OTlnXHhCM1x4REJNXHhGRmhceDE5c1x4ODdceDk4XHg4OCxceDE3dW9ceEE2XHhGRlx4Q0ZceEE0MVx4RjIoXHhCM1x4QkFeXHgxMUFDXHhFMlx4MDZceDFEXHhEQl5ceEUzWzxXXHg5N1x4ODdGXHhGQVx4RkJceDE0XHhCOVx4MTJceEIzXHhDOFx4Q0RceEM0XHg4NkxwQVx4QTNceDEyXHhBMDk8Ylx4MDBceENDXHhCRUdceEI4K2ZceDBCXHgxOCFceEE0XHgwNlx4RTd3XHhBMFx4QjJSMlx4MDFceEVDYVx4OUMqXHg5MX1ceDkwXHg5N1x4QjlceEQzXHhGQkVtXHhDN1x4QzFceEUwO1xceEJFNWliSlx4RjdceDAxJFx4QjNQXHhENVx4RDlceEZCQmJbXHhBRlx4MDJceEQ4W31rXHhGQ20kXHhFQVx4MEZceDE0RVJceEJCXHgwQlx4MTZAXHhDNl9EXHhERFx4MDNceEJDXHg5Qlx4QkJceDE2XHhFMlx4MTE+XHhDRHx4XHhGN3ombVx4QURceEI5XHg4MVx4QThXXHgxQlx4QkM/WUpNXHhDQlVceDAwXHg4Qlx4ODJceDEzXHg5NHNceENDRjNceEU3XHhDMDpceEFDXHgxNUhceEU5XHhCM1x4OURceDA3XHhFOURceEREcVx4QUJrXHhGNHxceEM0XHhDRFx4RTVceDg1aDxceDkzXHhGRmRceEFCXHgwRlx4MUFceEIxXHhERVx4MTR2NFx4RTRceEVGXHhDMlYsW1x4QjVceDhCJ1x4RjlceERBOlRceEVDLFx4QTRceDk1XHhGRVx4ODJceDE5OkZceEI4Vk5ceDhCXHgwQVx4ODVceDlBXHgxNkNceDlBXHhFRFx4MDZdU2thJlx4RDlpXHgxMzVceEFFWl1jXHg5Mlx4RDZceERGXHgxNFx4OThceDFBXHhDMy1ceEU0IFx4ODBXW1x4RjhceDFGYFx4OUZceEM5XHhFMVx4RTZceENEXHg5Qlx4MDVceENGXHhFRlVceERBR1x4RUJKXHg5Q1x4OTlceDhCXHhEM0ghXHhEMFx4QjQyXHhFNEtceDA1InBceEVEXHhGMUBceEE1XHgxQiFceEFCXHhGQiZlXHhFOGVceEREXHhFNlx4QjVceEM3XHhDRlx4RURceDhGK1c6XHg5NVx4QTFceEU4XHhEMFx4MEJceEU2XHhFQlx4MTdeXHhGOFx4RjdAJVx4MTBceEZDLm1ceDkwXHgxN1x4RDBceENGZFx4QzNVXHhCM1x4RTJceEJCXHhFQ3BceEQ4XHg3RnRceDhEJFx4MTJceEU1XHg5QUEuXHg5QVx4QTVFXHhFRFx4RTBceDkwRUNYKW5ceEU3cVx4QjlceDhCXHgwQndSXHhCQVx4RUNceEFCXURceERDXHhFRVx4RjVKXHhBNS1ceDFFXHg4NFx4ODVceDlFXHhBRFx4RTN3JEdceDA5XHg5QVx4OTNceEREXHhBRlx4RjNXaV5ceEFDXHhEOVx4RjhceEUyXHhBNiVceDlDeFx4QTdceDk5XHhBRkhceDkxOkhGeVx4ODdceEY0XHgwRVx4Q0RceDA4XHg4RFx4QzZvXHgwMlx4RUNEXHg4NW1ceDBGXHhBM31ceERBXHg5QVx4RTQwXHgxMFx4REJgKSNceDgyaVx4MUFMZFx4OUZceEMyXHhBQi47XHhDRlx4QjAiXHgwQlx4QUJdXHhDM29ceEY3VVpceEU1XHg5Q1x4MUQ/XHhCQlx4OURceEQ4XHhFMkxceEVGXHhBRXZceDhCXHhFOFx4MThceEE5XHhBQ3hceEIxXHhEM1x4OEZceDAwMmNceDA5XHhFQVx4MTdceDE5SS5ceEY1c1x4RjRceEUxXHgxRl1ZZzxceEVFcFx4OTRceDBCXHgwMFx4OUVlXHhEN1x4N0ZceDEwTXJceEU2ZkVceDFENVx4MTdTV1x4ODA9XSBceEYxY2NceEQyXHhCQiJceEQ5XHg4QlFjXHgxQVx4QTlceDBCKWxceEE0XHhBNm5ceEQ4elx4QjlceENFdm1ceDk5Llx4RjUoXHhBQlx4OEJceDFEMVx4QjNceDA5XHgwQnJhb0pceERGLlx4QTRceEQxXHhEMXxceEM1RVx4QTFceDFFXHhGMFx4RjZ2XHhFMlx4MDlceEM1XHhDNVx4RjFtXHhCOFx4OEYtXHhDNlx4RDR0XHgxN1x4ODE6XHgwRFpceDBEKVx4QzlceEI0XHgxMFx4RDJceEU3XHg4MVx4OUZceEY5Ylx4QzdceEMzNFx4MURceEM3XHgwRlx4RUEpXHg4QVx4OTZceERFUCxWa1x4QjJceDk1XHhBQVx4N0ZpXHg5Nlx4QkJceEQzTlx4Q0NtXHgwM1x4QTlceEE5XHhGQVx4RUFceDhDYlx4OThKay5ceDA5LFx4OUFceDhEXHg4Rlx4MTNceEEwXHhGQlx4RjdSQFx4MUMnWTtceEU5XHhBRkQyKlx4RTNceEI1XHhCQlx4OUNceEFCXHhDN1x4QjB7JVx4QUFFXHgwOVx4RDcvPVBceEUzXHgwRFx4MERUOFx4RERkXHgwRFx4REZceDBBXHhFMjRceDEyXHg4Q1x4RDZuflx4Q0FceDA1XHhFNlx4OUJceEM2XHhDRFlceEEyXHgxQVx4Q0M1XHg4Qlx4OUJceDAxXHhDNT9ceEJGVG5ceEZEXHhFMVx4RkFceEJFflx4ODJceDE5MFx4N0ZceDFBSV9ceEFEa1x4OTBCSTZceDA5XHhCMU1lXHhGNVhceEVDXHg4OFx4RTFceDA3XHhGNVx4MTRceEY4XHgwOFx4RkVceEI1XHg5NFx4QzJceEYzS1RceEM0XHg4OFx4REI5SVx4QzZVXHhGQVx4ODdGW3pEXHhFNlx4MTFEXHgwQVx4RjRceEM3MSF8SFx4QkFceDE0RnFceDk3XHgwOVx4RjBceDk1XHhBRlx4RUMxIFx4RUNSXHg4MFx4QUZceEJBTlx4QjZceDlFI1x4MDkzM1x4QTZ1U1x4RjFceEE2XHg4OVx4RURceEJGaFx4ODdceEI0XHg4NVx4MDgubkZceEIzKHNZalx4Q0Z3clx4QjYzXHhENVx4MENzXHhBNH1DXHhEMkdceEU5SFx4RkFceDgxXHg4OH5ceDhFXHg5RX1ceEE1XHgwN1x4QzYmXHgxRlBceDBBXHhCQlx4QTJceDg2XHhBRVx4QUJjXHhFQVx4QjJwI1x4RTRRXHgxMlx4MTFceEIzMU9wWFx4MDQtJVx4RjVceEFEXHhBOFx4RjkuXHhBRFx4MThceEYyXHhDRCJoXHgxQ3JceEM3XHgwMVx4OUMrU2hceEYwXHg5Q1RceEMxXHhCQVx4QjRceDhGT1x4RTlceDAzXHhGMVx4RTRceDgyXHgxNXBceDkxXHhBOFNceDlDXHgwOFx4RTZceDlCXHg5NlBceDE2XHhGNVx4MEJceEMxXHhBMEBceDE5M1x4ODAgXHgxQmFceEJDXHgwNFx4Q0FoaFx4RDVceDFBVVx4QjVceEQ5XHhCMGZceEFDYD1ceEZDXHhDQTRceEVDO1x4MEFceDkyXHhBOVx4MTZceDBDXHhENVx4RkVbXHg5Q3AkSlx4MEJceDE3XHhEM0tceEY3XHg4M1x4MDNRXHhEOVJceDE1XHhBRFx4RjlFJlx4QkZ+XHg4OT5nZlx4MURceEJEXHg5MVx4QzVceDA5eFx4RkNceEQ5OFx4ODdceERBQlx4MDJceEMyYFx4RTdceERFakdLRFx4QjVceEJDXHhGNTVceENCYmFceEEzXHhEN1x4MDIoXHg5NFx4ODRceEE3XHhDQVx4QTNceEU4Slx4RjhceERDXHhCNFx4RjFceEUwXHg4NFx4RTZCXHg5NGNPXHhDRndceEE2NUA9XHhBQlx4ODVceEI1XHhEOXBcXHhCM0U7XHhFQS5ceDg3XHgxQkhceDA5XHg4Rlx4ODRceEIzdVx4OTJceEM1XHhEQz9ceEY2XHhEOFx4QTEjPFx4ODNceDE1XHhCN1x4QkFceEYwQlx4RDJceEU5XHhFRFx4MUVceDEyXHhFQVFceERCXHhFNFx4QkRceDBFXHgxQVx4MTNceDBEflx4OTNceENGXHg4RiBceDE3XHhEOVx4MDRceERCXHhCOFx4QTFceEQ2XHhDRFx4RThceEY1XHgwQyZKXHg5M1x4RDNceDFBXHhFMCx+XHhFMFx4MUJceEU4XHgwMFx4RDdOXHhENlx4MDZceDkzVWxceDA5XHg5NFx4MENHXHhFOVx4N0ZceDg0SmdceDE4T1x4QTM9XHhGQVx4Q0VceDE3XHhDRHJHXHgwMFx4ODRuMD9ceEJBRlx4OTZceEQzXHhENCdceEQxPlx4QTRceDlEXHhCQVx4RjVceDAwXHg4MVx4OURGXHgwMElceDhFXHhCQlx4QzdceDk2XHhCM0FceEM1XHhENFx4OTlceDA0QVx4QTlceDg1UFx4QzRceENFLCBceDgyQGo5XHgwNlx4OUJxXHhGRlx4QUZceDkxXHg4RV5GXHhCMFx4REJceDBFXHhFRXRceEYxOThceDEwXHhDNlx4QTA4RTVoXHg5Mlx4OEUxXHhFN1x4MEFceEM1XHg5MFx4RDZyXHhGRlx4RjJceEJBXHgwM1x4Q0UhXHg4MVx4QTEjXHg4OFx4QkVhXHgxN1x4OUVceEU5XHgxM1x4ODhceEIxXHhCMXZceEE0XHhBNjdceEU5XHgxMCJceEU1XHhFQVx4OUVceDEzXHg5M3dceEYwXHhDMCwla1x4MEY/XHhGRFx4RkN1XHhDNDhceEUyZVx4ODBceEFDXHg5RFx4Q0JceDA4XHhBQVx4MEJceEQxUidceEI3Llx4RUNceEZCXHg4OUtwXHhBOFx4MUJceDFGXHg4Rlx4OUJceDEzJlFceDE5InprNFx4OEJceEE0XHhGM1x4QzBceEQ1Ulx4RTlceDBFcFx4MTRceEFGXHgxRFx4MTVceEI5YVx4QTRceEIyXHgwMnNsXHhEN1x4QUNceEQyXlx4OTlceEU4XHgwRmp1XHg4Qlx4RDNXXHhEQ1x4Rjd3XHg4Rlx4RTliXHg4RCkodSt4XHhCRnNceEJFVXtceEM3JVx4REFceEUwXHhCMFx4MTdceEJBXHhFN1x4QTdceEY4XHg4OFJceEVFb1x4Q0VceEMyRlx4MDlceEZBNVx4RDdceEEwUFx4MDlceDg2XHgwN1x4QjZOSVx4MTFbXHgwM1x4MEFceDE0XHhBNEgnNlx4RkVeUy41XHhGOFx4REJceDg3Ilx4RTRceEJCXHhFNlx4QkE6SVx4QzNceDA3XHhCQ3NnXHhCMlx4OThmfFx4RjdIXHhGRE9ceDE1YWI5XHgwNFx4MDRceDk1XHhGN1x4RTNceDAxXHg4MFx4QjdceEMzMyBceDEzXHhBOVx4MUJceEY3XHgwQipRc1x4RDJceEJDYlx4ODJceEIzXHhENFx4MDBceEI2XHhFRFx4MURceEJGXHg5N1x4REVceDdGLVI9XHhFMVJceDg4blx4RERCV1x4RDZceDBDVipceDgwXHhFNGFNXHhCNUFceDBFXHhDM1x4ODFceEMxfGpceDg2b1x4QTBceDAyXHgxOSJceDk5VFx4MEZceDAwXHgxNVx4RUVwfUR8Olx4MDRceDFDXHhDQlx4OUZceDgwRFx4REVceEUwXHgwMlx4MDJxQ1x4QzA7XHgwOFx4QjhceEE5SF1ceDhGXHg4Qlx4MTJceEIzXHgxRVx4REJceEFDXHgxMFVceDBBXHgwMERceDkwXHhGN1x4MDcpXHhEOVx4RkVceDFGK1x4MDdceEUwXHhEMVx4RkFrZVx4RkRceDhDXHhBM1x4OTYnU1x4MUJceDBGXHgxNlx4OENBXHhBNVx4QzVceEI1XHgwOFx4MEEsXHhENVx4RTlceDFEXHgxQVx4QTZceDEyXHg4MVx4RThceDFBQi9nXHhBRVx4RkVceDg1clx4QjJud1x4REE1TERceDE5XHhDOFx4RjFceDg5XHhENlx4MDNIOFx4RUI9XHg5Q1x4MTEyXHhERCJceDg1XHg4RVx4RjlceDhEXHhBNVx4QUJceEYwXHgxNzZceEU1XHg4NFx4QzBgWlx4QUZceEU1aWNceEU0XHhDRVx4OURceEMzXHgxNipceEVEZVx4MEFceEM2dHZceDExV1x4RUZceEVBXHhBQUlceENGeFx4QUJiXHgxN3JuR1x4QTdceEU5Y11ceDk4XHg5RjpceDE4X3xgXHg5NVx4RDNceEI5RVx4QzVceEE1XDBceEYxXHhFNDFceERBXHhCOVx4MThceENFXHgxRlx4QTFceEY3XHhBQ1x4MTk0XFx4OTJ2XVx4QzRceDkyXHhENDZceEM2XHhCOVx4QTFceEM0XHhFRlx4QjlbXHhCQ1x4ODNCdFx4QTV2XHhGNlx4ODFceDg2Zlx4OEZIK1x4QkZceENBT1x4QkRceEQ5R1x4QUJEXHg5MVx4OUZceDlFM1x4RTY9XHhFOVx4QzhceEY1OFx4RTdceDEzQ1x4Q0NceEMxXHgxQlx4MUJceDA5XHhFMDw+Tlx4ODBoXHhBRlx4QUFceDlGXHg5QV9ceEZEcVx4QTZceEYzXHgwMVx4Qjc8XHgxRDdceEIyXHgwNFx4RjBceEQ3dVx4RjRReC5wXHhGOVx4QkFHXHhDQn5ceERGKlZceEYxWCxceDg5XHhCRkN+XHhDOVx4QTNceEVDXHhBQSNceEQ1XHhBOFx4RUNceEFGNVx4OTNceEFGXHhDRkxceDFCXHhCQlx4QjVceDAzUExceDA2XHhBOVx4QkZceEI5XHgwN3RceEU0elx4Q0JceDE5QFx4QUYmYFx4RjJceEFEXHhERlx4RDNceEZCdFVceEIxXHg4N1x4MURceEQ2XHgwMjYxblx4RTFceEE5bCdceEI4XHg4N1x4ODAhXHgxQlx4QTJ4XHhBNFx4QTlceDBEXHhGNFx4RUVceEZGZDtceDBBXHgxQ1x4MThCVndceEFBXHgwMFx4ODJceDhBVz5ceDEzXHhBQXVceEMwSVx4OEFceEY0dFw9NzxceERFXHhBMVx4RENceDg4XHg4M1VceDk0XHgxQ2FdXHhBQVtmXHhBQ2xGXHgwQ2ZceEZEXFx4OTJvZiZceEVEXHhEOEIkXHgwOHNceDA1NUdceDE5YGFceEZBXHhFMFx4MTZceDgySFx4RjV2fFx4MEJceEJDXHg4NVx4QUVceEY1XHhCN1x4QTNceEQ2XHhDQlx4OThGXHgxQXZceEMxXHhFMVx4RERceDg0XHhCNFx4RDFceDk1Llx4MDddXHhENVx4QTBSXHg4Nlx4QjlEXHg3Rlx4RENceDFFI1x4REZdXHhBMlx4N0ZceDg3XHhGNy5ceDEzXHgwQ1x4RUFceEE4XHhBRFx4RERceEJEUVx4QzhceEM4XHhDMFx4QzhceEVBT2xceEFDclx4RERZXHgwQ35ceEY1XHhFN1x4OTNbXHhGMlx4RDJceDEzMVx4MTVdXHg5NFx4QjIpS1x4RUY9XHhFQ1x4QTZceEE2XHhEQ1x4MDNceDAzXHhBNFNceEUxQXZceEEzWVx4QzhceDdGR2FceDlDXHhBRlx4QjhceDlDUVx4RjZWPzxceDg2ZVx4OTZcMTdceDA5XHg5MltfVVx4QzlceEU3R1x4REZceDBBXHhCNVx4MUE3XHhEQ1x4ODBceDhFXHgxQlBceDg3XHgxMlx4QzZ8XHg4QVx4N0ZceEY2XHhDNFx4QkRceERDXHhENVlceERDXHg5MHZceEJBXHgxQ1x4MDFceEE3XUcnXHhFMFx4QjRceEJGXHhGMT8jXHgwM2xceDlEQVx4QjlceDk0XVx4RERceEMxXHhGRFx4QzFceDFEXHg4QT1ceEI1XHhBMFx4QjdceDlGXHhGNFx4RTJceDEzXHgwOFx4OEJ4XHhFMFc5MGpceEY3Klx4QTQ7XHg5OVx4RTBceEM1XHhCNj5wVHVoVC49XHg5Rlx4ODVdXHgxRVx4OUZceEFBOSFceENGOi5ceDhEXHhDMVtceEZGcS9ceEZFXHgwM1x4RURceEYzT1x4QjJceDk0Y1x4OEZJXHgwNlx4MUEweFx4RkFceDkwJlx4OTRbM1x4OUZceEEwXHhEOENceEU1XHgwQ1x4RUVTQFx4QTVlT0FceDA1LVx4RkVHXHhFNFx4RjcrXHg4N1x4Q0ZHXHhCNVtceEFGNVx4OTBceEUwTylceEREXHhDMFxceDE1ZE1GY3xceEU0XHhDND1CXHgwMFx4Q0JceEE2XydceDA4XHhDRVx4MTJlOTpceDk5Jlx4MDVzXHg5NFx4MEZceDA0XHhFM1x4ODV+bXRceENBXHhCOFx4RkVsXHhCM1x4RDZceDAzJ1x4QTZceDlEXHg4OVx4QTBgXHhFRlx4MDFceEE1Z1x4Q0VceEQ5OG9ceEZEVmdceDgzXHg5RGcyXHhGOFx4RUZceDBFXHgwQ1x4MUUuXHgxQlx4MTRceEYwXHhEMlx4MDFceDBDT3VceDhGdnB0XHg5OVx4OURceENFXHhBNlx4RTZceEI2XHhBMU5ceEIzalx4QkNMVVx4RERnXHg4RShFXHg5Q1x4MDMpXHgwRTFvXHhGN0ZceEMyTlx4Q0ZceEQwXHhBMFx4MUVMKFx4QkZceDA2XHhCQlx4OERceERGflx4RTZLXHg4Rlx4RDJ6XHhFMlx4RTR8XHhBQVx4RDFceDk4XHhCRDhIXHhGN1x4RDdceENEXHg4Mlx4QkJceDlGVlx4OTMmOmZceEY1XHgwNVx4ODJceEYxK1x4OUJceEVEXHgwMVx4RjhceEJGXHhDMVx4RTBBXHhFOGBceDFCWVx4RjU8XHhDNmVceEM2XHg5Q1x4QzE7XHhBN1x4OUVZbVx4REVceEQ3XHhDNVx4QzM/XHhCRVx4MTBceEFBXHg4RVx4MDlceDBGXHgxNVx4MDdFXHg5NVx4QTVceEQwXHhDQVx4RDhceDlBXHhBRj1ceDA4XHg4QVx4QThceDhDXHhFMlx4N0YrJVx4QkZceEY1XHhDND1ceEU5XHgwM2JZXHhDNFx4RTYxdWBceEEzXHg5MVx4QTlceDAzXHg5RVsuXHhDQ3NTJUFzXHhBQlx4QTJceDAyXHg4OFx4OUJiVnd7XHhFNypceDk3NSBceERDUUU7M1x4RjVceDgwXHhCOVx4QzJMLmtceDk2a1x4ODIhXHhFQlx4ODheXHgwMlx4RTZceDgxXHg4M14gXHhFQVx4QzlceDE2TU1ceEQzXHg5NFx4OEJceEZBS1x4MTNceDkyXHhEMGhceEU2XHhFMydQXHhFNXMrclx4OTZceEQ5XHhGRVhceDA0XHhDNmwiS1dceDFBXHgxOFx4RjRceEI2JC1ceEM1XHhBM1x4Q0FceDBEXHhCNlx4QUNbXHhEMENceDBEXHhGN1x4QUUtW1x4ODdsXHhERFx4QTlceDk4XHhCMVJ5OVx4RUFceEE3XHgxRFx4QTlceEY3Plx4MDVceEJDXHg4NnFceEMxXHg5NVx4MTNCXHgxNVx4ODhceEI3UVx4RThKXHg5ODpceDE4XHg5ME9TXHgxRFx4RUFceDg3XHgxNVx4RDN3XHgwMjRceEZGZVx4OTdceDhFXHhEMFx4RDVceEY1XHg4Mlx4QTlceEM4L1x4QjBceDk1XHgwRFx4MENceDk3XHhBRnZCMGZ7XHgwQ1x4Qjc2KnsvXHgwQlx4QkJceEM0XHhCMFx4QUR7TyJceENCSVx4RTZceEQxTVx4MTJceEYyV1x4OEZceEE5NVx4MENceEU1XHg4MkRceEI5SVx4MEQoXHhEODRceEQwMVx4OEFBXHg4Nz90XHhBM1x4MERceDE5Qlx4OThAXHg5OTw0VTRceDg0XHgxNkRceDg5VXtceEE3XHgxQlx4RUYtXHg5ND1ceDk1XHhDNDpceEQ0cm5ceDBBXHhCNlx4Q0JceDk1L1x4MTIvXHhGRiFceEEyXHgwRDpceDhEXHg5MFx4MTc8XHhEMFx4RDZceENEXHhGQlx4OUFceEE2XHhEMlx4ODV3eCpceDA0XHg5M1x4OEZceDA2Ulx4MUJceDFFLlx4RTFceDkyXHhGRVx4QTNbL2dceEIyXHhFRFx4MUFceEU1QDc5XHhEQ2Bza1x4QTlUXHhGNFx4Q0VceDFEXHhEMDFceEY2XHgxNVx4QUY0XHhGOVx4QTQ+WVx4RTFceEMxXHhFNW1eXHhBNVx4QzFceEY4XHgxMlx4RDY/YXJceENGNTBceEE1TVx4RUU8dlx4RkZceEE4XHgxRlx4QjJceDFBXHhBRlx4OEFceDBGJVx4OUYmXHg4MFx4RTdjXHhFQ1x4QUFceEVDUVRceEM1Szk1XHhDQ1x4RDkpXHg5QUJceDlFXHhDOX5ceDk4XHgwOFx4MDFceEM3XHgwOVx4RDdceEJFXHhDQ1x4OTBceEI1XHg5Mlx4OUNgXHgxRFx4RTl4XHhCRlx4MUVceEEwQVx4QURceEVFXHgxQlx4QzZceDA0XHg5NVx4MUFceEIwP1x4MEN6fFx4QkJceEI3XHhEQlx4OTRceDg4XHg4QVx4QjhceDE3XHgxNFx4MTlwMFx4OThceEI1W1x4REJceDg4XHhGNFx4MDVBYFx4QUZceDk0XCZceDk1XHgwMFx4RjRceEIyXHhFQURceEYyXHhFOVx4OURceEQySWRceEYzVGVceDgxTFx4RTRceEZDXHhCMyZceDBFXHhBNFx4MDB5QFx4ODFceERGQVx4MTMvK1x4REVceEQ5XHhDRlx4RkNceEYyXHhGOTxceEJBXHhERkNceDg3XHhDRVx4RDlceEY3b1x4ODBceEZFXHgwNHtceDFGXHg4QVx4OUZceDk3Plx4OERceDA2XHg4MVx4RTRceDlBXHhERWVceDg5Z2RceEJEXHhGNVx4QzBbXHhEM1x4OTRceEI3XHhEMGNgXHg4M1x4OENceDkzTlx4MTAzW1x4ODFceDFGbFx4ODZceEFBY1x4RUZceERDXnc5XHhERD5ceDlFXHhBOFx4QkFceDAyUlx4MThUXHhDQ1x4RjMrXHhBMVx4RkJAcj1YXHgxOVx4Q0RceEE3XHhBNFx4QzdceDhEcVx4RkFceDAzXHhBOVx4ODNeXHhENVx4OTZXXHhCMFx4RTJTXHhENVx4OUVceDhGUSpceENGdDhdXHg5Nlx4REZ4XHhCRDJceEU0XHhCMVx4OUJfXHg4N2xceDFGXHg4M1x4Qzl+XHhDQVx4MTJ5XHhERVx4MTFceEI0XHgwQVx4RTNceEQ2N1x4QkNceEI1XHgwQVx4RjlceEIxd1hnN1x4RURceDg5XHg5Qlx4RjBceDkyXHhENlx4RUNceDBCXHhERlx4ODFDXHhFNC9ceDFDXGpceEMxXHhFQmtceERDXHg5Q1szXHgwOChceENCUDJceEM4K1x4RDJceEExXHhCNUhceEYyXHhFRlx4MTZceEQ5ViFceERCXHg4Rlx4RkRceEQ4XHgxNTxceEFCcVx4MUVceDk2J1x4OTdcXHhERVx4OTBceDAyXHhGOVZceENEXHgxNXRceDA3RHl+LztHXHhDQ1x4RjJceEU4OVx4QjZ0XHhBMVx4RkNceDlBV1x4OEVceEEwdnljaixceDgzXHhFNFx4MURceEFGXHhDMVx4OTJceDhCXHg4Rlx4RDVceEVBXHhBMFx4RjZceDhDXHgxN1x4OTRceEVCXHgwQlx4MTRceEVDXHhGNTZKXHhGRFx4MDBgWVx4QzhxRlx4MURceEZBXHhBRlx4QUFVM19ceEJBXHhGNlxceEE3XHhEOVx4RDFceEZEXHgxQlx4OERKJFx4RUFceEY0XHhEOHJceEIwOFx4MERZd2ZceENDXHgwMXNiI1x4RTBeXHg5OFx4RTNceEZGXHg5NFx4RTFceDAxX1x4QkYneFx4RjdceDk3XHg4QVB5XHhEQyVceDk1Kn0zXHhFOFx4RTVceDgxXHhGNHcmPVx4QTJceEI4KVx4OEZceEI1cVx4QTFceENCXHhDM1x4OTFceDAzXHhBMVx4OENmXHhGRCtceDdGR1x4Q0JceEE4XHgxN1x4MDJceDE2XHhGNVx4OTErSFx4QUZceDlBXHhFNFZceEE3XHgwNFx4RTJceEQ0TztceDA0XHgxRXZ6NVx4Q0F5XHhDMVx4QTNceEZFLWVceEU3XHg4M1x4MDlceEExUlxceEMzSFx4RDl9XHg5Ri8wdWFfXHhGOFdceDEzTSVceERFXHg5NzVdXHhDOFx4QzlceDA0J1x4RjFceDE0XHg5Q1x4OTFceEMxX1x4MDFceDlEXHhDNkVceDkxXHg5MlVaeVx4RThceEE4XHhDOC9ceEE0XHgxQipceENFXHhBMSxceEVEL3soXHhBMnJceDkyT1x4MTVceEEyXHg4RVx4RDhVXHg4MytDXHhCRCdceEQ5XHhGM1x4RjU6aFx4RERceENCXHgwMT5ceEZCXHgwQ3xceEFDXHhCQVx4QTNceENGQlx4QTczXHhCNlx4OEZceDk0XHhDRFx4QjRpXHhDRFFceEUxXHhFMGRceDBFXHhFRlx4OUFOXHg4RFx4RTBceEUwQVx4RTBceDFFXHhBQVx4Qzl3XHgxN1x4RkRceDFBXHhBM1x4RjVIXHgxN1x4QURceEVFIlx4QzFceDAyK1x4RkFceERCXHhCN1x4RDVceDk4XHhFMFx4MTFceDFDOVx4QjJceDg2Q1x4ODhceEM3XHgwNXcqXHhDOVNceEE2XHhCMEZlXHhCRFx4RTZceERFaVx4RTEoXHhERGxceDk5XHgxMlx4RjFceEZDXHg4MFBceDEwdUp+PypBXHgxN1x4QThceERCXHhGNU00clx4MThceDg3XHgxOF8vZnRwXHhEM1x4RkVvXHg5M1x4MTRceEZFMlx4ODlceDhGXHhFRHMqXHgxREFpXHg4OFx4MURceEUzXHhERFx4QzRceEI1XHgxOFx4QjdceDE2XHhEOVx4OTlceEQzXHhGOFx4QTcuXHhFOEBceEE0XHgwM1x4MDZceEJBIVx4RUN0aklceEFFK2pMXHhDM3ZceEIwXHhFQ2BceEE3XHgxQ1x4QzNceEJDXHhGMVFceDE3XHhDRVx4OThceDE2XHhGNVx4RENcXHhGM1x4MDM7XHhCMVx4REMoLFx4QzJceEQ2XHhGNVx4QTdceDdGQkM3XHgwMzd8XHhDRlx4MDh7YVx4QkZceEY4K1x4Q0ZceDE0XHhGMjBsXHhGMVx4ODVceEE2XHhERVx4RENceDg3XHhCQ3lceEExXHhEQX48PFdceEI4XHhBRThceDdGXHgwQ3dceDE5R1x4MDlceDA1M1x4RDVceDlFXHhERFx4MDFLXHhGRHpceDA0LD5XXHgwNCFceEZDNSlceEIwXHhCMG5ceDE5XHhDM3dceEEwblx4QUZceEEzXHhCRFx4QkVwXHhFNnFceEMyXHgwM2FceEE5YnRceEE2dEBceEFGcVx4RUJceDAyXHgxQkxceEIyXHhDM1x4RTlJXHhFMix1XHgxNCdceDAwKWgsXHhCOVx4RDJceDlCXHhCM1x4QTVceEY0XHg3RipEIVx4OTVceDlENVx4ODAqXHg5Qlx4MTVceDk3XHhBNyAzYXpceEM4XHhFOUFceERBfVx4RkVceEQ4XHg4NEpceERFXHg3Rlx4QTFceERFPVx4OENceENBWkdrXHhDOFx4QjdceEZCXHhBNTItW1x4QjlceEEwXHg5NWlceEE2VipqXHhBNC02an5ceEZBXHg5QTRceENGXHhGMlx4Q0RceDAwXHhBNFx4MEJZOkxceEJFXHg5MVx4RkE3M1x4RUJceEYzLFx4QkRceEJBXHg5MHo6XHhGNTo7fFx4RkNceDAyLVx4MDZceDhBXHgxMFx4RERceEIyTlx4OTJceDg4XHgxNFx4QzlceEFCJlx4RUNZXHhBMVx4RTNceDAybyRceDlCXHhFMlx4QkZceEFEVFx4RkJAXHgxN0dceEJEXHhEQVx4QTNceENEXHhENzBceDkyXHgwOFx4RTFrZHpceDk3Olx4OTU9XHhDN1x4QjhceENBbERbLjlceEQzXVx4RTRceEUwXHhFQTlyMFx4ODJceDFBXHg4OFx4OUFceDk4aUp0XHgxRFx4Q0NceEZDLVx4RDJceEEwSDhdXHhGM1x4ODkmVVx4MTlTOlx4QkFceEZCI3tceEE5WHJceEZGXHg5Nih3XHhBM1x4QzFceEVEYlx4ODd9U1x4MDlKXHgwOCVceDg0XHhBNHxceDk4XHhBM31ceDhCXHhGNlx4MURXXHhDOElceDlBXHhCOFx4QzhceEQxXHhFQlx4RTIyXHgxQ1x4ODBMXHhDMnhceEEybHB7XHhDMlx4RUVceENEXHhERFx4RUVxbXpceDAybFx4QzU6XHhBNE5ceEUwXHhFMlx4OUVceEREPWdceEZCXHhBQlx4QjhceEMzXHg5Rlx4Q0RceEY2KFx4MEJceDkzXHhCM1x4MTJceEI2KiI1SHM5XHhGN1x4MEZceDA3R1x4MTJceEUzYFNceEM3XHhFQmZceEE0XHgwNVx4MUVSXHgwN1lmXHhCMFx4RUVceDk4XHg5RS9XV1x4RjlceDgyWVx4MDdDXHhFMlx4ODRceEQxXHhGNFx4RjFceEU4ZFx4QzRceEQyXHhBRFx4QzJceERFXHg4MVBceEQ3XHgwNG9aP3RXXHgwM2tceDA4XHhCN1x4RDJceDlDXHhFRG9ceEQ4XHhDNFxceERBXHhGNlx4MUJuXHhFNlx4OTZceEY0XHg5Q2xceDkzXHgwRTBceDkxMVx4QjdceEYwXHhDMFx4QkFsb3M+QVx4OERlKVx4RjA2XHhERFx4OUQgXHgwMFx4REMxXHhGOVx4MEYzXHgxRV0nXHhGRFx4QUJceEM0XHgwMlx4QUNceDg0LVx4MTNceEE5XHhGRWBceEU1XHg4RVx4OTBbXHhBMVx4QkFceDFFbEBceEFEXHg5RFx4MTVceEVBS1wyXHg4NjlMXHhDRlx4MThceEQ0XHg5Rlx4RjFzXHgxRFdgTlx4QUZaXHhDQ2dceDgzV1ZceEY3XHhGOHovXHhBRTRceEVCTFx4MTdceEYwOFx4RTZceEEwXHhFRVxceEExbUkkW1x4RDVceEUyXHhEOFx4QTFceEIwXHhGQ1x4ODFHXHgxNFx4MDA1XHhDM1x4QUNceEE2XydpXHhCQlx4QjMud3dceENGXHhEMlx4QzFbXHhCOVx4MEV1Mlx4MThLXHg5MS5ceDdGXHg4NjNceERGVlx4QkZceEExXHgwQjVceDk2d1x4MTBceEFDXHgxRlx4ODVceEZEXHgwOChBXHhGMFx4QTRceEZCXHg4Q1x4MUZceDA2XHhDMXRuXHhCMFx4RjFMXHhFOFx4RjZceEFDXHg5OUkrdlx4MDB6RFx4QTFcXHhDNXFceENCXHgxRFx4QUJ7XHhFRlx4MEZOXHg4NFx4QUVceDk1XHhFQVx4ODFceEZDdV5ceEI0MD8rXHhFN1x4QTFceEMxUFx4OTFceEJDXHg5M3lceEY3XHg5N1x4ODRceDE3eVx4QjdrXHhFQlx4ODVceEQyXHhENVx4RUJceEQ2KFx4MUZceDAzXHhCNFx4ODlvZlx4Q0FceEUxXHhEOVx4QzRceDgzXHg4OWdceEFGXHhCQlx4QzNceDBFXHgwOFx4QTBVOlx4OUVceEQ1WFx4QkVceEQ1XHhDNVVUXHgwMlx4OERfXHhFRVx4QzNqXHhCNlx4ODhxXHhENFx4RTlceEQzXHhCN1x4RUZ4XHgxQURuK1x4MDh7XHhCNF9ceEZBXHhCNVx4OEFceEE5XHhCQ1x4RjVceDA3XHhCMlx4MDA0XHg5Nlx4QUJceDk4XHgxOFx4MEFceDA4XHhBM2tcXHhBQlpceEJCb1x4QTlceDFEXHg5Mn4talx4RjhceDg1XHhERVx4QzBceEZDP1x4MDVKXHhDQyFceEY4JVx4MDRceEVBXFx4QjFceDAzKnlceEIxXHhDNFx4MTBceEFBXHhCMVx4QjlsXHhFRlx4MDg9XHhFNFx4ODhceEZGXHhGQ0ZceDg2cFx4RDRceDA1OFx4QjFPXHg5Q1x4RTVceEE0WyB2XHhCNlx4MUFceDg1XFx4QTVceEYzUHFceENGUUZceDFGP1x4OTBZXHg4RVx4N0ZceEQ3YSpCXHhFNilceEYxQ2YuXHhCNFx4RThceDA0XHg5QVx4MTJceEEzXHgwNjc/XHhFMlx4RjFceEM5XHgwRlx4OTdUXHhGNUlceEJDXHhGQVx4OEJceEYwXHhBNStceDFGXHhGNVx4QTlceDlEXHgxQlx4MENxblx4MDduXHg4NzE5OVx4OUNceDA2S2Q7XHhCQSJceEJBJUt+XHhGQlBceDhDXHhEQzlceDE1cVx4OUN9XHgwNFx4QTdgYXBceEI4XHhFOVx4OTBceDhCXHhGNFx4QTlceDFEQ2tceDlBXHhCM3ZceEQwXHhCOGZMXHhFRjNceEU1XHgxQX1ceEIwXHgwOVx4RkRzXHgxMjZceEFCeFx4OTlceDExXHgwN1x4MDhceDE1XHgwQVx4OTRceEM3Olx4MTJceEQ2XHgxQVx4RkI1Mlx4QjhsdFx4QjVceEFGXHhDOVx4OURceEVFXHhBNlF7XHhCRlx4RDNrXHhFQ1x4QzRceEM2XHg5NXxceDkzXHgxNlx4MDFceEQ1XHhDRVx4MDVFXHhBQ29ceDBEXHhCRXhceEQyen5ceEFFZi02YXFceDA3X1hceDFCXHg4MytXRFx4MEV5Vlx4ODRceDEwXHhFOFx4QzZRbiVceEREYVx4RDJ9clx4RDElej9IXHhDMWVceEZBXHhENEBceENEXHhGOFx4QjJLXHhBM1x4RThceDBCXHgwRVx4RUZceDhDXHg5QVx4MTYhUXxceEE3XHhDNFx4MDFceEUxXHgwQT1ceEMzXkk0ZVx4MTlceEY0XHhCQ0BceDgzXHgxOXdceEYyIUd6Ylx4MUJJcFx4RUVceEQ5XHhCREpEXHhEQ1x4QjhceEFGKlx4RjFceEVCXHhENGlceEMze1x4RDZceEY3XHhDM1x4MDZrXHhEM1x4ODlceEZBPVx4RkE1Zlx4ODNceEUzXHgwMFx4ODZceDk2XHhDNVx4RDhceDhERVx4REVceDg2XHg4Q1x4QzBceDFFXHhDRVx4QkZceEIzSGRceEQ0XHhGQlx4MTVQalx4OENceEZDQXNceEJBXHg5OElceEVDXHhFM2lceDg0UVx4ODFceERBMlx4ODNceEZFXHhBQ1x4RjZ0Vlx4REFceEQ0Y1x4RUJceDEzXHg5MHJceEREXHg4N1x4RDFFXHgxRFx4RTZceDgzXHhCNnxceDk0MVx4RjBceDg5XHgwM1x4QUF5Slx4OENAXHg5MFx4MDlceDEwRlx4QTVceDFFXHg4REtceEM5XHg4Rlx4ODJ+XHhGNlx4OEVceEFCXHg4OFx4RjJceEJCXHg4QVx4QUZceDE4XHhERDNceEE4XHhERlx4RjImXHhCNFx4OTBceDhBXHhGNFx4RDZceDE3XHgwQ2NceDBEXHhCNWxYQ3ZlXHhERFx4MDdceDA1S1x4RkNceDE4XHg4MDtceDBDXHhGOVx4OTRcXHhCOFx4QTNceEY3QVx4RUVceEM0blx4RURGXHhDMnNceEY3XHgxQUMiI1A1XHgwNVx4RTBEXHhBNVx4QzdceENGXHg4NicyXHgwNlpceEIxR1x4OTVceEI1XHg4Rlx4Q0RceEE2Llx4MUFceEFGXHhENlx4REVceERGb1x4MTNgO1x4Q0IrXHg4MFx4RUFceEEycEg7a1x4Q0JceERDXHhFQlx4RkVPUVx4QjdceEY1XHhCQSVceEYzXHhDOFx4MTNceEE2XHhBNTBceDE2XHhBRDlceENDXHhEOFx4RUVLdFx4ODBceEY4XHhCNFx4OEYkXHhBOVx4MDlceEExWFk+XHgwRlx4MTlceEMxXHhEOFx4ODNceEFCXVx4QTdceEEzRFx4QjlceEVGXHg5Nlx4QUNceEY3SFx4QkVceDlCSVx4QThHXHhDMyFceEZFXHhBMlx4OTNhXHhEQ1x4MUVceDhCXHhDOHZEXHgwMFx4RkNceEFEe1x4OEZCZlx4RUZceDE0fFx4QzhceEM3XHg5Rlx4OURceDkyb1x4MDZceDg1XHhDMU5nXHhEQ1x4QjRceEM1XHgxRU1DXHgxQ1x4MENceEM0XHhGRVx4QUVceEU1XHhFMWVceDhCXHgwQWMgXHg4RSZceEZFR25ceERGUCN7YzlceEQ0XHhGQWgsNHV+XHgwOCdceEQ3XHhDNlZceEQzXHgxNl1ceDhCXHgwQlx4MDZceEZDXHhENT06XHhEOFx4MTVceDA0ezl4XHgwRXNceEI4YlZceDlGXHg5NnNceEQxRFx4QTFceEU1XHg4QVx4MTFceEE1XHhCOVF0XHhGMFx4MDBceDBBYVx4Q0ZceDAwXHhBN1x4RkNceDhCIy9ceEExXlx4QUJceEY2Wlx4QjA5XHhBNlx4RjVofF9YXHhEQVx4MENceEFEXHg4RVs7XHg5M3kyXHhBOFx4MTVceEI3XFx4QTc0XHhCNT1ceDg3XHg4OFx4RDdceEY2XHhGQVx4RDIrVk9ceEIyXHg5OWtceEQ3XHg5OVx4RTlfJVx4RkZceDk5Rlx4QTVMXHgwNlx4QTFQLkZZXHhFN1x4RjBceDk4aVx4QzJceEE0XHhEOFx4QzV2XHg5OFFceDlGdVJceDhBNU1ceDlBXHhDNlx4MTlceDFGXHhBM35WXHhBRlx4OURceEIzV1x4MEEgXHhGMFdceDAxZVx4QUVCXHg4MFx4MThceEEzXHhERlx4QTMrLVx4QzY+XHhCMFx4QUNceEYxZjBceEQxXHhCRlx4RjcwXHgwRVx4MENVfUlceDkyMFx4QzRceEJCWVx4MTFceDBBUTlceEZFflx4RkJceEVDXHhENFx4MDFceDkzdFx4MURtSHdPMX5IXHg5NVx4OEJceDFFXHg4NVx4MUR4SFx4RkZRR1FceEVFXHgxOFx4RDVceEIxXHhEMVx4OEUpXHhFN1x4N0ZceDk2Jk1ceEJFbytceDhBXHhGMlx4OEVceDlDWFx4QTdceDBGdFx4MDdceDk5XHhBOEViXHhFMlx4RTBceEUzXHg4MVx4RTRceEZDXHhDMFJceENBMFx4ODMzeFx4QTFceEVEXHg5N1x4RUJceEZFXHhCRVx4MDJceDFEY1x4QzB9XHhEQlx4MDNcKFx4MDVceDEzU1x4RkVceDA2XHhENVx4RDRceEJDXHg4QVgrXHg4Q1x4OTJ0XHhEOFx4RUV3XHgwNXZceEExXHgxM1x4QkVceDkwJFx4MDZceEI2Xlx4MUROXHhDQVx4QjBgXHhBOVx4MDNceEMwXHhCNlx4ODJceEE5XHhCRVx4OThceDdGSFx4RDNceDBBXHgxMSpBXHhFQWd9R1x4MTFceDg3XHhEMVx4QjBceEM4a1x4RjUxXHhGRVx4ODBceEFBelx4OTRceEQ0c3RceEQ5R2BwUVx4MTJceDhGS0tceEJBXHg5MFx4REVAXHgwQyBceEJGflx4MEEpXHhBOVx4QUFceEEyTFx4MTdceEZCXHgwQ2ZceEI0L1x4QTFceDg0XHhFNVx4RUFceDg3dVx4QTlDM1x4QjRceEJCJFx4RjdceDAzflx4QzlceEE4XHhERVx4QjRceEY2XHhFMDZiXHhFQlx4MEVceDAzXHg5Mlx4ODBceEYwXHhCNDBceDlEYVx4RjNceEQ3XHgxRlx4RTZceEVDXHg4NHFceEY0XHgwMlx4REU8XHhEQl1ceEY1XHhBNVx4QjVceDgzXHhCRnhceEE2XHg4RFJceDhFLFx4MDFSXHgxMC5ceDhEPFx4Q0ZceDFDXHhGRlx4RUVceEUyeVx4RTJEXHgwMlx4OUFceDg2Qlx4OEYrXHg4QTtceEI4XHhBMyNceEMxe1x4RkFuXHhDMVx4RkMnXHhCRVx4RTVceEMwXHhCQU9uXHhCQVx4MUFceEQxXHgxRVRceEExSX1ceEJFOmlceDAxXHhFQ1x4QjRceDAzVShceEIxMVx4RjJmXHhGQVx4OTRceDFCXHg4MFx4MDZceDE4XHhDNlx4QjlceEJDNDtceEQ3XHg4MFx4QkEpXHhDNVx4QTNceEMzXHgwN1x4OTVceEYwVTF3XHhGMjVceEE5XHhFMVx4Q0RceEFBdVx4MTVceDhDXHhDMDhceENDXlx4RDh4XHhCOVx4MTlceDkxXHhGRFx4QTVceEZFXHhEOCc9JFx4QjhceEJEXHgxOFx4OTlceEMwXHhBOCdceDA0XHhGRDpceDExXHg5MFx4MDhceDlEW3hceEQ2XHhGN3NceEExXHhFN1x4OUNceDkzVVx4Q0ZceDBGI1x4OEFceEY0XHhCOFx4RjdjXHgxOVx4QjFceEZFJTVceENCSVx4RjVceEJEXHg4Qlx4QUM4XHhFRWZ6VVx4OTVceEM2bFx4RjFwUVx4QUFceEMwNVx4ODFWLFx4QThceEU4XHhFMFR+XHg3Rlx4QTF9XHgxMGZceEZCUlx4RDFceEE1XHhFOVx4QzdceEMxb1x4QUNBLlx4ODFceDk1XHg4Q3hceDhGelx4RjZceEQzXHhCMlx4QzlceEREJ1x4RkRceDFDfHxmflx4RUJEXHhFQVx4QjJceDEyOlx4RThceEMyIVx4QTNceDdGXHg5RW1KXHg5NS5ceEM0XHhBNlx4QkJceDEwXHhBQzFceERDXHgwOHM1YVx4ODJceEE0a1x4RjNceEI5IFx4MENceEEzXHhCNVx4QzhceEUyXHhCMnhCc1x4MURceEYwdkd7Wlx4ODVJXHhFQ1x4OENceENFXHg5OFx4MTAkXHg5OVx4MTZceDlBXHgxQmFceEZEXHg4M1x4OTZceEM0XHhBOFx4RTNceDlGLlx4REJceEZGXHgwRVx4ODNceEREXHgxMlx4QjZceDkyXHhCNGdceEEycVx4Q0VceDFEXHhBNlx4RjFceDE0XHhERjJceEUyXHg5RFx4QzJceEE3X1JQXHgwMVx4OTVceDk5XHg4OFx4RTFceEY5T0tceEM5XHhFRFx4OTRceDk5XHhGQVx4ODdaXHg4RXFceDg3N1x4RDYnXHgwRVx4ODJceDEwXHhDQ1x4RTFceDk4VFx4MTdceDhCd2JceDA3XHgxN1x4RTBceDkyPVx4MDI3XHhFOVx4QjZceEEyN1x4RkU3elhvXHg5OFpMXHg4NmtceDkwRFhceDhFWTUiXHgxNFx4RkV0XHhCMltceEQ3PFx4MTZMXHhCOFx4RTlceDBDJExceDhBXHhFMVx4REZceDgzXHgxRm5ceENDXHhEQ1x4ODlNXHhFNlx4QjZceDg0XHgwNVx4OUF1L0F3XHhDNVhceDk5XHhEMjpceDgzLVx4RjlceEVCJ1QlXHhBM1x4RkRceEU0XHhENyBXYSNceEI2XHgxMlx4QTRceDlCQFx4MDdceEU0XHgxNVx4MTlceERCUVx4Q0ZyXHhFN1x4RjBceEU3XHhERWYqXHgwNFx4RTM8XHg5Q1x4MTJceDA0XHhCMHtceEY2aFx4RjRceEUxXHg5Qi0iXHhENFx4QTZrXHhGRFx4ODRceEE3OlpceEZDXHhERX5ceERDXHg4MDhceDhBZFx4QzBceDgxXHhCRkBFXHgwNFx4MTNdXHhDRFx4ODlceDFBXHgwRVx4REZceDkzXHhBMVx4QzNceDFBXHhCNENmXHgxOVx4RkZQXHg5Mlx4QjZceDFDfFx4RTRceENEXHgwN1x4QURceEE4fFY2XHhCMFx4Q0NccFx4RURceDE0XHhEMnQ3Y1BceDkwXHhEMFx4QkRceDg2QFx4REJceEUwTVx4Q0ZceEIyXHhFNTNceDE5XHhCQlx4RjlceEI5cVx4MTV3XHhDMFx4OTVceEQ0XHhENTt9XHg5OFx4QThceDg0XHhFMmtceDg3ejB3Y3I0XHhFMlx4RjBceEM2XHhCMV42XHg4MVx4RjNceDE2J1tdXHhDQVx4Q0FceENFXHgxQlx4QjZLXHgwQTBceENBXHhFNUl0XHhENUZceDlDXHg5OVx4Q0J9XHhFMlx4OEFceDFFXHhDMiRceDFBXHhDQlx4OTZceDk5OU1ceEJGXHgxOFx4ODBceENGXHgwRVx4RTVceDlDXHg5MkVceEY0XHhGOD5ceDhGPCtceEY4RVx4QTd8JVx4QUJceEQyXHhENlx4RkJceDgxI1x4RkNkXHg5Nlx4QzJceDFEXHhEN1x4MEFceEM0NVx4QzZceEI5OnpceDEyXHhCQ2dceEI2XHgwN1x4QzhvXHgxM1x4MENceEE3b2xMXHg4MlZceEIxXHhBQlx4QTBceDA1XHhEQVx4Q0ZceDBFdlx4MTgjXHhDOVR2XHhDMVx4MTVbXHhFOFx4QjVceEVBXHg5N1x4QjlnXHhCQWcuXHg5MFx4QjQtXHhCNlx4QjRfXHgxMlx4RThceDkwdFx4MEZceDkxT1x4RTJceEU0XHhGQVtceEQ3ZFx4QjZceEE3K1x4QTdceDg1NG5ceEZCXHhEQVx4QkUlXHg5Qi1gXHg4Mlx4RkJceEM5Tm9ceEMwXHhGQnFceDE1XHgwQTZceEVGS29ceEQxXHgwRlx4ODFceEIwV1x4QzBceEQ3XHhEMUBceEM5XHhDRFx4Q0VceDlFXHhGMVx4ODJceEY4XHhGQ1x4RDZceEE0WzNceEFCXFx4QUVceEVFXHgwQ1x4QzNceEMzXHgwMVx4RjdceEI1Llx4OTZceEUwXHhDOFx4OUJceEE5Tlx4MEJhXHg4Rlx4QTQiXHg4RmlceDAxK2BceDFEXHhDOFx4QzRceEIxIXVceEM5PWNceEU2Q1x4OEJNXHg4M0tqXHhCM1x4QThceEQyXHhBQnlcXHgxOTNceEY0XHhGRVx4RkRceDgxXHhDNFx4QzZceEVGJlx4Q0ZZJlx4QzRceDgwXHg4NVx4RThjXHgwQW5ceEFBXHhCN1x4OUZOXHg4MiJWXHhCRFx4OUJceDBBNFx4MTZceENGXHhGNlx4RDVceDg1XHg4MyxceEIyXHhGRlx4RTJceDkzXHgwQ1x4MEEwQVx4QTFceDEwYipiXHhEMlx4RDchXHhDOFx4MDBceEFBXHg4QVx4OTA4WVx4MDdceDk0Wlx4MDJceEFEXHhBNVx4MUNceEVCXHhEQVx4MTIkXHg5Q2VUaFx4OUU4cVx4QjBceEYzL1x4QzRceDFEXHhFNVx4QTVceDBDXHg5NSZceDg3THUnXHg5M1x4RTRfMzJVLEJceDFCXHgxOVx4QjIpS0ROWFx4OURETVx4MTUjXHhDNHZUXHhBNWVceEE5WzVceDBFJzFceEM1XHhEMFx4OTBceEQ4XHhBRVx4MURceEZCUUJceENFXHhFNFx4RkVqXHgwM1x4QTFceEM2XHhDOC0nSk5ceERFXHg5RFx4OERceDg2XHhDQVx4Qzh2Ylx4ODZceEI3XHgxN1ZceEM0XHgwMlx4RUUiXHg5Nlx4QzZceDA1XHhFNVx4QTZceDA2XHg5Qlx4REJ8XHhFNSlceEY1XHhFNVx4ODFceEFCXHgwN3ZceDAyXHhCMjFceDhFXHgwMjdceDEwXHhGNVx4RDMxJlx4REMnbFx4RTJceDE5XHg5QVx4ODhgJ1x4RDJbKmoxXHhBN1x4QzVFXHhCNVx4QTg9JFx4MDlGXHg5M1x4Q0JgXHg4OFx4RjZbVChceEI1Zlx4OUVbXHgxNVx4N0ZceDFCXHg5OFNceDk4XHg5Mlx4RThceEQ5LUNceEFEXHhCQ01ceEE0XHhFRVx4RjFVXVx4ODZceDFEXHhFMlx4MEZKXHgwMFx4ODFceEU2XHg5NFx4QUFceEY0P1Y2XHgxRFx4Qzg2IFx4Q0JceEY2XHhFN1x4REJ9XHhDQVx4RTFceEMxXHhCRVx4RENceEU2XHhCOTpoXHg4MURceDAySVx4REVceENCXHhDMCZceDg5UFx4RjlceEQxZ1x4OTYjXFx4RkRuXHhFRVx4Qzc+XHgxOVx4REUrXHhGRVx4QTBCXHhFMUQ/XHgwM0c2XHgwMlx4Q0FRMypceEIxXHgxMFBceDE0XHhGQlx4RjlqXHhENz9eXHhDOFx4QTlyXHhGNlx4RTlceEYwXHhFQUhceEUyXHg4QiRgXHhBNlx4QzBvXHhEQVx4MEJTXHhGMSJceENEXHhBNFx4OTNceEYxTlx4MDhUVzFyXHg5NFx4MDlkXHg3Rlx4RkVceEFFXHhBMlx4QjFzXHgxN1x4QUJceDk1XHg5OVhhXHg4RVx4QUVceEM5XHhFQlx4QjlceDA2XHg4OFx4RjdceEYzXHg5N0ZceEE2Y1x4ODJceEU0XHhGRjJceEZGXHgwRiZkc2lceERGIGVceDExXHhDQTZceDk5cDlceDhGXHg4QVx4OTIuXHhCOTtceENBXHhCMFx4ODZceEVFMFx4MTZceEZGXHgwOFx4MDIrXHhCN1x4QUZceEVFXHgxOVx4MEZceDAyJHFceEY2XHg4M1x4QzdceEYxXHhDQUVceEZEXHhEQlx4QkJceEU5XHgwME9cQThceDBEXHgwMFx4QUJpXHhCNVx4REFceERGXHhDQ1x4RTdceEY1XHgwRFx4Q0ZceDgxXHhGQk48XHhGMF9ceEY3ICtceDEyXHhFNVx4N0ZceEIwXHhBMVx4OUJceEE3XHgwQ1x4QUY0XHgxRFx4Q0NceEI2dlx4REY8XHg5NXRceEEyXHhCQVx4QjJceEYwLVx4RjNceEU3XHhBNlx4OThofVx4QTNceDExXHg4RVx4QjFoXHg5OVx4QzFceEUzdzQ+Q1x4OUJceEY4XHg5NjVceDEzaFx4MDVceEY4Olx4RjREXHgwQiRceEMzQ1ZDXHgxMzlceEUzU1x4RDFceEU3XHhBRlx4ODZceEI2QFx4QjVceENDXHhCOVx4MTVceEFEb1x4MDlceEVDXHhCQlx4QUMvWGxceENEXHhDQ1x4OTZceEVGP2NceEQwXHgxMFx4OUZZXHhFNlx4MUFceEI2XHhERFx4MEZceEZBYVx4RjZsYlx4MURHXHgwMlx4MDc+flx4MDVceEI5XHhGQ1x4Q0ZdXHg3Rlx4OURceEE4XHg5Mlx4QTJceENFXHhENWRceDlGXHhEQVx4QjFceEI1XHgxRiRRXHhDQ1x4RTFceEMyXHgwRHRceEM3MGtceEFCbVBceERDJlc8OVx4Q0JkNFx4ODRkPFx4QzNceEQ5MFx4RDMwWEBceEUzPlhceEVEXHg5N1x4REYoOlx4RDZveVx4QkNceDgyXHhFQm9ceDlBXHhGMFx4RTZceEQ2ZnBceDAzQlx4ODcoQFx4RDJceEMzP3tmXHhENFx4Q0FYXHhEMFx4QjZceEI2XHhCNFx4MERceEQ0XHgxNVx4OTRceEFDVlx4RThceDlBXHhEN1BceDkxTFx4OUFceEEzXHg5Rlx4QzRceEM5VVx4QTZceEFEXHhENVx4RkRceEI5XHhDNndkLVx4QjBYXHhDNlx4QjlceEVEXHgwMFx4RTVceDFDXHhBNlx4ODBceDBBXHhDQlx4OERceEZDXHg4NH5ceEY0XHhENFx4REFceDBDa1x4ODNceEFGSSBceDE5Qlx4REVceEY3eVx4RkJceEQ4eWBjXHg4MF0vXHgwMFx4MUJMXHhERSlXXHgwM1x4MEFceEZGXHhBRVx4Q0ZceDBDIXxceEEzXHgwRlx4Q0F5XHgwRlx4RjJceEZCXHg4Qlx4N0ZfJlx4OENceEJCXHhGQlx4OERceEQwXHgwNlx4OUVceEEzUWhceEYxXHgxRD1ceEM3NVx4OTFKOzRNXHhENFx4RTRfXHhFNFx4RjFbXHhFOFx4QjRlXHgxRlx4QTNceDg5flx4RjZceDg4MFx4RDFceEI0XHhFMmBceDk2XHgwN1x4QzUsM1x4QkVrMTJceEQzXHhFRlx4OENceDlFXHgxMFx4OTAxQlx4QTZceDkyXHg4RlJceEJFXHhDRlx4RTRceEQ2XHhBMXFceDhGXHg4RSMnTlx4RDJceDlGXHhGRVx4QzNxXHg4Mi5ceEEzeFx4MTRceEQ0XHhDQlx4ODlceEEzI1x4RkNPXHhGNTZceEY4XHhGRUx+XHgxQTF1XHg4RnF4XHhCODhceEU4XHg4M1x4OUVSXHhFRjRceDEwP1x4RkRceEUyXHhDRlx4QzRGXHhFNnVceDg4XHhCNFx4Q0ZceEFDaVx4QzFXXHhCQXtvIFx4ODNceDAwXHg4M1x4RTNceENBXHhBNiQ8R1x4OENceDFBPlx4ODJceEREdmxsXHhFMFx4REYsXHgwQ1x4MDFYXHhDRlx4RDMkXHhCMFx4MTJceEY4XHgwOFx4MThceEE3I3QjXHg4OHwxXHg5MSBceEUyQlx4QTBUXHhERVx4QjRceEQwXHhDNFx4RjlceEEwKnR3WF8tXHhBQlx4MTFceEIwJFx4MEZnVlx4QkZceEFFOihceDAyIlx4MEJceDA0azpceDk2XHhFRlx4QkZceEYxXHhDM11ceENEXHgxMlx4MURceEIzXHhGRFx4QzVceDAxL1x4MUVceDk0XHhGRVx4ODVJRCFceEUyXHhENFx4MDZceEEyXHgxOVE7XHhBRVx4OEVceEU5bFx4OENEXHhDQz1ceEQ1KFx4MUNceDkwXHg5Mlx4QjZceEE5XHgwM1x4ODVceEQ0XHhBOEZceEJCXHhEQlx4ODBMXHhDN1x4MEJHXHhGM2hceDFBWlx4RkNJXHgxQn1ceDA2XHhFQlx4MDdMXHhGNFdceEYzflx4MEFceEE1Xlx4N0ZceENBW1x4QjcpWFx4RDVceEVEXHg4Q1x4OTFceDA5XHgxNVx4RURKU1x4RjdkZVx4MDdbXHg5Q3JceEE1XHhFQ1x4MTRceDA0XHhBQ1x4RDJwLVx4RkFceDkzJ2NceDlGXHhDNVx4Q0VceDExXHhFRlx4Rjh1XHg4NmlceDgxXHg4RVx4RUUoXHhENFx4OUNceEVCXHhBOHFceENGXHhCOTpceENBfjUzXHgwMVx4QTVceEQ5XHgxRFx4QThxdSpceDhGXHgxRFx4OTdceEFBXHhDMVx4MDVceDBDXHhGMFx4QjdnXHg5M1x4QTlceDhBXHg5Mlx4QjFGXHgxOTVceDkwXHg5Q1x4MDRceEU3Vlx4QjlceDEwXHg4NFx4MTdceEQ4aVx4Q0VIXHgxMFx4QjRsXGM3TFx4RTVceDlCKlx4QThdP1x4MTdceEJBTylceENGXHhGRVx4QjN5XHgwQi95XHgwNVx4MENceEE4XHhEOV5ceEIyXHhENVx4OTRceDhCXHgwNWdceEVELz9ceDFEPHpcXHhGN0p6Xlx4RUMsXHgwNVx4RjlceEYxXHg5Qlx4MDVceDFDPDxceEE2PV5ceDhGXHgwRFx4MURceEMwXHhFMVx4QzZceEJBXHg4RVx4MDNceEU2KVx4OEU1XHg5Qlx4OEJceEVDbFx4OUUtXHhFNWZceDE4XHhEOFx4RTd1XHg5N1x4Rjl3K0tCKlx4ODdceDhDZlx4RUN4ICVceEI0XHhFQ1x4MUE1fFx4OTZUeFx4OTNceEYzXHhDRVx4OTdceEM0Slx4RURceDhETXVceEJBXHhDMk0qPVx4QzVCIVx4OTJceEUzXVx4RTVceENCYVx4ODFBWlx4QkNceDA1eFx4ODRceEJGXHhFRFx4MDdceEEwXHhCOFx4OERdXHhDM2xceEE2cVx4ODlhXHhBRlx4RjBceEM3XHhDNVx4MTFceEQyXHhBN1x4OUE3XHgwNFx4RjNceEEwXHhGMVx4RUJceDBDbVx4MEJceDBDXHhDNlx4ODFudlx4MTl0XHhBOVx4RjRceEUwS1x4MDdceEQ1b1dceDkyXHg5N1x4QTZceDhDXHhCNlx4RjRceDlDXHhDRkZceEE1XHhCOFx4QkNceEQzfVx4Q0FceEU0XHhCOHFceENBXHg5RFx4ODApdFx4MDNkXk9ceDlFXHg5QVx4REFceEE5XHhDRHA1XHhDNVx4ODhceDgybVx4OTE6d1x4QkJceEJFXHgwNExceEQ3XHgwRVx4OUZceEY1XHg5OUdceDk4XHhGRnNceDFDXHhGRG5ceDlBXHhDM1x4OThceDFCXHgxRFx4MUVceEU1XHhDNlx4OEFceEU5In5ceDFDXHhDMlx4QjddXHgxRFx4MTJVUVx4MURceDhFXHhGQ1x4RjE7L2hceEJDK1x4QzNceDBEW1x4QTJceEI1XHhDOV51ajlceDk0XHhCRVx4MTQ4XHhFM1x4MUZceDgxXHhGOFx4QURceEQ1XHg5RFx4QzkwXHgwMFx4QTF7XHhBMFx4RDlceDFGXHhDMlx4RkJceDkzXHg4N1x4QzcjQlx4RTgkXHhDNyg+bFx4RTAqXHhCMFJceDlGXHhFNlx4MDNceEExXHhDMlx4MDNceDg4XHhBMVx4MDhSXHg4M1x4RUU5XHhENEEqXHhGNFx4MTdceDg0XHhDM1x4QTJceDgwXHhFM1x4QTlceEQwZ1tXMzlceEQ3XHhFQVx4RDdceDEyXHhGMUlceDE5TFx4MUEwS1x4RUReXHg5OVx4QjdceDkwXHgwMlx4MDhVXHhENUdceEQxXHgxOVx4OTgje1x4ODdceDFDXHhEQTRceDFBT1BceEVFXyxceEQ4XHgwRlx4RDZceEQ4XHgxN1x4MEJDXHhFQlxceEE3Wlx4QUNfM1x4QkVceEY2XHgwNlx4MTdceEFCflx4RkVxXHgwRFx4MDlceDg2XHhBNlx4QTZceENBXHgwNlx4OTFEI1x4RkRceEI1Plx4RUFceEEyXHgwMFx4OEIqN1MjQVx4QjRceEY3Q1x4REVceDhCXHhENFx4RTFceEZFXHg4MVx4RjlceDE4NnJceDA2XHhFRFx4MEVceDE4XHhFRkNceEEyIVx4RTU7XHhGN1x4MTNceEMxXHg5MiVceDA0dVs6OlRceEVFXHgxRjNceEYyJ2BceENDQHFceEIxXHgxQlx4RDRceDg2XHhBMFx4QzVZTzE2XHhCQVx4REJdZFx4OTNceDFDXHgxOTdceEU0XHgwQ1x4QjlceEIxVjtMfFx4QTRNXHg5Rlx4QTFceEEzd1x4OUNceEI1Ylx4MTFSXHhERUBceDBGKFx4MURceEFDXHhEMVx4QTNceDBFXHhERFx4QzB6XHgwRUJceDg2XHg4OFx4RTBceEM4XHg5Qlx4OEFceEY5M1x4MDY3P35ceDlCXHg4QXgmXHhBRFx4ODBwXHg4QV1wXHhFOVx4Q0FceEYzRlx4ODZceEMwalx4QkZceEVBTVx4RENceEEyXHhEQlx4MERceEYxXHgwM1x4QThobHhceEIwXHg3Rlx4RTIvXHgwRiBceDgwYFx4RDdceEQyXHhDOFx4MThDflx4QkFceDFEXHhBOVx4OTdceERCcUdceERBZFx4QzVMXHhGOFx4MThceDFEXHhGQi56cyVceEY0Zl96XHhFRTNZdVx4N0ZceDEzXHhCN1x4REIzXHhDNUdceENDXHg5OSRceDk5UFx4RDY7XHgxNSZceDk3Wlx4ODEkXHhDQ1x4OTFvXHgwRW9ceEQ1WVx4MDZceDAxc3JceEFEXHhDNlx4QjRceDlBXHgxQ1x4RTJWXHhBRUZceDhGL29OXHhBNVx4QkZceEQzdXJceEZBXHhGQ2JeXHhGNFx4RjNceEZEXHhCMlx4RjBrKzxxXHhEMFx4RURceENGVlx4Q0Z4XHhERVx4RDNceDE0XHg5Qlx4MEU2Z2EqXHgxMyNMdlx4QUMnYnVLYFx4OTNceEIzXHgwRVx4RERzJWNAXHhERFx4RDZXXHhFRlx4MENKRlx4QjlceEEzYUpceDg0SFx4ODRceDlFXHhEQVx4RTRceEQ1XHgxOFx4REZceEY0RSRceDE1XHhGMFx4MTNceDk2LVx4QzFTXHgwMVx4RDVceEZEXHhDQ0pceEM2dkJceERFXHg4NGFceERCXHhDRFx4RkYrclx4OENrXHg4N1x4ODVaXHg5MVx4QjRbbSx5XHg5Mlx4ODhceEE1XHg4QXJceDA5XHg5M1ZNd1x4QzNceDBFXHgxOGxceENDUFx4MTlceEY4P1x4QTZceEJGTFx4RDVceENFXHg4NVx4ODVXT1x4QjJceEZDXHhDMVx4RTdoXHhGNTJceEVGXHg5Rlx4QkItXHhGNlx4RDVWPFx4RURceDA1XHhFN1x4QTBlZVZceDFFXHg4NVx4RTNceDEwXHhBQUtceDFGXHgxQlx4RTBceDhFXHhDRlx4MDdceENDXHhFOVx4QzVceDgzXHg5OFx4QjROXVx4RDNgI1x4MThceDdGZUtceEU4XHhBRlx4MTEwR35ceEZEMVAjXHhCMllceDk2KWJceENFXHhBQ1x4ODNceEQ1K1x4RUFceEVCXHg4RFx4MUVceEI4XHgwOTs6XHgxRVx4QjVceEUwXHgxMS9ceEI0XHhGNWN+M0tceEEwR0ZceDA2blx4RTNceDBDdEpqXTFceEFFeWRDTlx4OTlceDlBXHhDMyNceDdGXHg5NUI9XHgxQ3YgJ1x4ODQ4XHhGN1x4MUN0XHgxOHhceEFGXHhFMlx4OTdceDE4XHhDM1x4QTZceDkxXHgxMlx4QkVceDkxeVx4OTVceDg0UVx4OTBceEVFXHhBMVx4ODdceEU3QSA2XFx4RkR3MzU+XHhFRFx4MUJceEU0XHhFMWpceEU3N1x4OUJbKDVceDk0cylRXHhGNVx4QUQ2QjMoMlx4RDVeXHgxMVx4QThceDhCVFx4RjY7VVFVXHhDMlx4OENceDFBXHg4OTxceEI0N1x4RDZceDlCXHhFMVx4RThceDA4SX5sXHg5NiBxXzZceEI1XHgwRGFceDA4XHhCRlx4OThceEZFXHgxMlx4QTBua1x4MEVceEI0XHhGM1x4OERUXHg5RFx4RjhHRlx4MTBceEVFXHhDOFx4ODlceDhGXHgwRk5ceEI4XHhFQ3NceDAxXHhDQlx4RjZceEI3XHg4N1x4QkZtXHhDNy1ceEQzOXhceEY0XHhCMlx4ODFsXHhDRFx4OUVceEJBXHhBRnA9ezc/XHg5MFx4QURceEVEXHg4QXFceEZEcztceDAzXHgwRjVceEQ1Tlx4QzlceERCbk4zUC1WfEFceDBBXHhBN1x4QjhceEFEXHhENiY1eVx4MTZGXHhFOFx4ODlceEMzclx4QjZceEI5XHgxMSZceENGXHhCMiBceERCXHg4RHpceEMzXHgxMFx4OERceEQyXHgxRFx4RjI8SFx4QUNceDhFXHhCMSpceEE3XHgxQXg1aVx4QzhceDlCXHhEQ3BceEM0XHgwMVx4MDlceDg2SThceDhFXHhEN1x4QkRceDk3XHgxOXhceDk0XHg5QT9ceEJGM1x4MUJceDg2dlx4REQvXHhDRHxceEIzXHhFNy1ceDE2eVx4QjJceEIzXHhCRS9ceENCXHgwRFx4MTJ4XHgwMlx4ODZceDk4fWhceDgwXHg5N1x4MTlceDgyXHhGMlx4OUNyXHhCQVx4RTRceEVCXHg5Mlx4QjVceDg0a1ZceDAzbFx4MUJceEMwMFFceEYxMVx4ODVceEQ4Ulx4QkRceDE3XHhCRFx4MTJceDBCXHhBOFx4RDhceDFEO1x4QzBnZU57XHhGNlx4RTVceDg2NjRceEJEXHhFRFx4QjZceEQ5XHgxOT1ceEE5WXBceEUyXHhBNWpceEY3XHhDOFx4MTVceDhEXHhEMlx4RjhceEEwTk1ceEM0XHhBNVx4OTMlXHg4Mlx4MDZceENCXHg4RmdceDlDLFx4QTlNXHhDQ2lceDgzb1x4QzhceDEyXHhEMVwjU0RceEU3XHhDRihceEU2XHhDRlx4QkVBXHhDNnJceEQ0XHg4OChceEZBXHhDNVx4RDM2d0J3XHg5MFl1XHhEMDVqXHhDQVx4RjF5UVx4RkNaXHhCRVx4RTZceENDXHgwRVx4ODQ2XHgxNVx4MDVFXHg4NFx4QzRuXHhCNVx4MUVnXHhEOFx4QTNIe1x4RjBceDg4XHg4N1x4QzVceENCXHg4Mz1ceDAyelx4QjlYXHhCM0FceENFIlx4QzdLXHgxRFlceERBLycpQVx4QzglXHg5M2BceEZCXHhFRFx4MUNceDA5MkFceDhGNVx4RkNceEVFYFNralx4ODVceENCXHg4OW9TLVx4OERceDg1XHhFOVx4RTh9XHgxQTdceEVDXHgwOVx4MEVeaFx4Q0VceEY5MVx4QTZNXHg4N1x4RThceDFGTVx4MTRceDhDXHhCOUBceDdGfU5VPFx4RjJceEEyXHgwM1x4MUJceDEzPUBceDk3XHhDMVx4QjZceDgwclx4OENceEY4dlx4MTZFfldceEZDPEVceEVEXHg4Q1x4MUNceEMwXHhGRVx4MEVceDEwSVJoXHhGRHxceDE1XHgxOFx4RjZ7XVx4MDhceDkwaVx4ODhCXHhFN1x4RDBceEUyalx4QzlceEIzXHhDMFx4QkVceDE3Slx4RDdceEM1XFx4MEJSXHhCRFx4RDlNXHhCN3xceEExRlx4RTF4XHg5N2hceEUyXHhDMlx4QzNceDFGXHgxMlx4OTQ/dFx4MEMlXHhENlx4RDhceDgxXHgxNVx4RUQ3XHhFQVx4MEZceEJFXHhDRlx4RkRceDk3XHgwOVx4RjBPXHhFN1x4REE/XHg5MFx4MUVceEI2biIvYlx4Qzl6WStceEFBT1x4OURceDlDd1x4MTVmXHgwQlx4RjhceDkxal5VXHg5QVx4QzNceEMxSlx4OTlceEFFcFx4RDh4XHgxQVx4QTFceDFDaFx4QzVceEUxXHhBOVx4QjFceDhCXHhDOVx4RkRceENEXHhERkpceDhCQlx4RkYlXHhERFx4RkZceENBXHgwMHtceEEzXHg5MVx4RTB5XHhFRVx4RENceEMxOlx4MTFLXHhGRVx4QTI1XHhDMEpceEQ4XHhBRVx4MDJKPVx4RTNNXHg5Qlx4MDZceEI3XHg4Mlx4RjFceDFBXHhGM1x4RTFceEY0NFx4RDdceEQ5N1x4MURceEM1dFx4QkZceEJFXHhCMVx4QjRrWVx4MTVceEE2XHhGNlx4QzE5dlx4ODJceEZEXHhBOUlceEY2TXJceEY3XHhCOEZceDExXHhBMklceDAzXHhFNFx4QjBZXHhEQ1x4RjlceEZGXHgxNHInQFx4MDk5XHhGQVx4MEN8XHhBNFx4RkZgXHhDRlx4MTRceDkwXHgxRFx4RjdceEI3XHhGRlx4Q0VceEU5XHhFMFx4Q0VceDA4XHgwQ1x4ODRnXHhENipceERGLFx4MENceEYyXHg5Qlx4MTZceEM5Q2IwOVx4REVceDE0XHhGQVx4QkZceERDXHgxRFx4RkJceDkxWVx4MTFceDgxZ1RceEM1XHhFN1x4RUJBXHhFNDx0XFMuJlx4MUYtLVx4QTZceEFEXHg5NFx4RER5XHhBQXklXHhFOFx4QjdceEY2XHhGQ1x4RTJceEQxXHgxQ1x4ODlceEQ0RVx4QkJnXHhDRFx4QzZkXHgxQlx4MDlceEM4XHhFQXomXHgwOVUlXHgxNUxceEI2XHgxMWVHXHg4Rlx4ODdceEVDXHhCOEVceDE4XHgwOFx4MTVceDBFXHhDNlx4RjhceEFFXHhFQUJceEY4Llx4RDlceDg0XHg5OGlXXHhDOFx4RTA1XHhGMFx4OTc0XHg4NFJnVVxceEU1XHg4NU5nXHhFRVx4MTRceDgwY1x4MER8OkRefmdbL1x4MDR6XVx4RDVceEExXHg4OCVceDExXHg5RnVceEJEXHgxNzRceENCXHhFMV9ceDhDXHhGMnpceDlFXHhFNFx4MTI9XHhCN1x4Q0ZcXHhFMFx4ODZceEU4OXdceEUxXHhCQmFceEQ4XHhBMVx4MTRdXHhGQ1x4N0ZIXHhBRlx4RTJWSVx4OTNceDFEXHhCNVx4MDNceDkzXHg3RkRceDk3O1x4ODBceDlEXHhFMEd8XHhCOGFceEI0XHhBRFx4ODNEfFx4ODl7bG1wNFx4RDg9Jlx4ODZEXHhENVx4ODdceEYyXHg5NytuXHg5Ml8sXHgxQ1x4QzNceEIzXHhDOVx4QkNceEFCXHhCNFx4MTRceDA2OVx4REJceEI3NypceDAwXHg4OV9ceERGXHhEQVx4RDdceEQwXHhDMW9rWFx4RjVceENFXHgxNlx4QzVceDgwXHhBN1x4OUVceEE4Ilx4RUVceDk5blx4RkJceEZFXHhCNng9XHhFMFx4OTRceEI0XHhGNVx4MERceEFDIWNceDA4XHgwM25EMiZGXHhGM1x4RUVceEQ3RFx4Q0E0XHhFMVx4QUEnXypIXHhBOFx4QTlPXHg3Rl1ceEE1XHgxN3AqXHhBOHskVlx4RjZSXFx4RjNceDEwXHhERFx4RDNceEYzNFx4Q0J8bV1ceEQ2XHgwQjFbXHgwRVx4RjBceDk3XHhGMTtceDE4elx4OENceEI1XHgxMlx4OUFceEIxXHhBMlx4OUNceDgzXHg5QVx4REJceEEyXHhEMj5vYVFbNlx4QzAuTFx4RDRGXHgxNlx4RTZceDAyXHg5Nlx4MTBceDAwK3NceDBBdldceDgzXHgxQlx4RUEhImhceDlEXHg4MVx4RjBceDhEXHhCRFx4MTVceDE5O3BzXHhGMVx4MTNVXHg5OSVceDlGXHhBRFx4RTFjPlx4OTNceEExQ1x4OTZceDdGXHhDQlx4QThceDA1XHgwQlx4RTVceERDXHhCOXxceDEyXHhENVx4RjFceDBEXHhBOVx4QkI3XHhGQy9ceENFXHhFN1lceEM2cVx4MDdceEQ0XHgwOFx4QUJceEIyNlx4MUFceDA0PVx4MTJAXHgwN1x4QjZceEYzLlx4N0ZceERCfU5ceDk3cXBceEJDQFx4OUJ4XHhGQVx4MENceEJBPlx4OTFceEUwXHg4MFx4OEFceDAxXHhGQVx4RTFceDBCXHhDNEovQVx4QTJceDEzXHgwRVx4RTZceEFFXHhBQmpwTlx4ODZceEEyXHhCNVx4QjA5XHgxNFx4MTZceDk4XHhBOV9uXHhBMVx4QTFceEFFe281XHhBMSIiXHhBRjR4XHhGOVx4QjdceEYzXHhEMlBceDhEXHhCM0BceEVGR1x4QkZceDlFIFx4RTkgXHhEM1x4REMyXHhFRG5IZilceDA2XHg5M2ZceEIwYVx4MERceEE2I3pceDFBXHgwRFx4Q0ZceEI2XHgxQVc6Wi1xJVx4Q0VIXHgwQVx4OTNceEUyXHhGRlx4Qzk/XHg4Nlx4ODhqXHgwMEdceEU4MC1ceEZGXHhEQSdrXHhBRktceEJGXHgwRFx4MDZceEE5XHgxQTZceERBXHg5OVx4QThceEQ4R01WXHgxNmJceEE2XHhDOHRuXHg5Qlx4MDUxXHhGNFx4QUNceEM3XHgxRFx4ODlceEE5XHhFQVx4OERceEM0XHhCNFx4RUNceDlGKVx4MUNceEU0XHgxMFx4OTJTXHhBRVx4RkRceDgxflx4RUZceEEzYFx4MUVceEIwb1x4MUFceEVCXHg4QjJceDA3V1x4Q0JceEU3fVx4MTZ5XHg5Rlx4OThceEIzXHg4RHtceDBCXHg4OVJceEU4XHhEOS1ceEU4Xlx4MDVceDAwXHhGRFx4MEI1XHg4NFx4MTlXXHg4QVx4QUVceEQ4azdGXHhBRVx4RDh0XHhERXNceENCe3BceEEwXHgxOVx4QjM+XHhGNFx4MTAzXHhFRntceEU5XHg5RHJceEVCcCRceENDXHhEQlx4MTlceEIwXHg5Q1x4QTlceEI5RDpceDFGXHhBMVx4RDYpXHhEQlx4Q0VceEJES2JceEY3XHhGMXJceDg2XHg4Rlx4QkFceEQxXHg5NDFceDFCXHg4NFx4RjlceENCWFx4RUFceDgxXHhFMWNnXHgxM1x4RURceDExWFx4N0ZceEQ0JVx4ODhSeVx4OENceEZFXHhEQVx4MTUgKFx4RDhceDlGa1x4QUYsXHhFQlx4QTBceDg2XHhGMWcnXHg5M3hceEE1aFx4RjBceEI5S1x4OEZceEM3XHg5OGpceEQ3XHhEQlx4RjAzIlx4ODlceERFeVx4RThdeC8yXHg4NFx4OTRzXHg4N3EzZFx4QTdNXHgxMFx4OUFceDgwaiNceDBDdTRceEEyP1x4QkJceEI4U3ZESHRceEFEJVx4REZceDg3YVx4Q0QvXHgwM0VceENDXHhFRHw1XHg5OFx4RDJceDhEXHhCQ1x4OTFceEQ4cVx4RENceENEXHhCQlx4MUFceDk0XHhGNFx4RjZbTlx4MTJceENDQjxceENFPlx4RkZceDBEXHg4Mlx4QTFceEE0XHg4NFx4MTJQLyJceDk4XHhGMVx4MDdLXHhEQVx4OUNceDBBXFFceDEwMVx4OERceDgyfC9ceEREIko5OFx4RjFceEQ1eT1ceDlEXHhEN1x4RkV2M1x4QTItXHhDN1x4QUF2XHhCRkg1XHgwQThceEExXHg4RVx4REY3XHhCMVhceDdGXHhEQVx4RDlceEYzXHhDNDBceEI3XHhDMlx4RDRceDFFXHhBRlx4QzZcXHgwNVx4MDVfXHgxRVx4Q0ZceDkzXHgwRlx4Q0FceEYyXHhGRG4pXHg5RFx4QjNceEU2XHhDMSBtXHgwN1x4QzIwXHgwQ1x4QThCXHhBOFFceEI4XHhCOFx4OTFWIy1ceERGQFx4Q0NceEJEXHhDQ0poRFx4RUNyXHhBOSRoXHgwRlc/XHgxNlx4OTFceEY0XHg4Q11ceEQzXHgxNVx4QURceDEwXHhBNFx4QjVceEI5XHhFQlx4RDlHLTZceEQ4XHhGOVx4QkNceDgyXHg4NC9xL1x4RjhceEQwXHgwQVx4OEMmXHgxNFx4QjNceDE0XHhEMSNmXHhFN1x4QTAlNVZceEQxSFx4MDBceEEwXHgxM1x4RkJceDlDXHhFMlx4QTN+N1krXHg3Rlx4Qjk2XHhBMiBceEREXHhFRVx4RENceEYzXHgxN1x4RDFFXHg4Rlx4QzlceENBeVx4ODBTdlx4RkNceEY2XHhCNlx4RDRceDkxXHhDOC9ceEU4XHgxRGo9XHhBOVx4MDEnMShceEM3XHhCNlx4MThlXHgwOVx4QThceDA3VFx4RTlceDBGZFx4QjV2XHg4RVx4QzBceEZBXHhDRlx4OThIK1x4MTdjXHhCNVx4MDVceEUyNFx4MDRceEZFXHgxOFx4MTNceDgwRVx4ODI5Llx4ODhceEZCXHhDOHZuXHgxRVx4RDZceDkyWUZceEM1XHhGRCJceEY3XHhDNl0qXHgxQlx4RDd7XHg4QjVBXHgxNSRYXHgwMiJceEEwMlx4OEJceDk5XHhGMVx4RjNceEFGXHhGN1x4OTQncilIXHhBQkZKX1x4QTZWa3xIXHg4RFx4RDVceEM3fVx4RUJceDlCXHgxMlx4RkNceDhDdlx4QzhceEZBXHg4RVx4OEIoXHhBMyFceDhFXHhCRFx4QURsXHhDMFx4QkNceEY5XHhDRVx4MUNceDgxXHgxMFx4RTZceEUzXHhGRFx4RkRceDFDbVx4MUNceEMyKjVdXHgxNXtbXHhDM0JceEZEV1x4OUNceEI2XHhDOF1ceDkzPG9ceDBFT1x4OUJceEYzfFx4QUVceEVFeF4mXHhDQ1x4RUVQXHhCQTRceEMxXHhFMlx4ODZceDA2a0tceDhGNEhceDE5WkhceDgwXHhCRFx4QjJceEM0XHhGQ1x4MERceDhBXHg4Rlx4QjFceEQ1XHhCNlx4RkUkRFx4QjBceEZCXHhBRVx4RTBceDE1XHhBNVx4RkNceDAzQVx4MDZceEM4Olx4RTdAXHg5MDxceEM4am55XHhBN1x4MThceEJBXHhGMVx4RkZceEU1S1x4MUJceEUxXHg4MFx4Q0VceEQ2XHg4Mlx4MDZceDkwXHgwNl9ceDBBXHgwN3ZbXHhBMVx4MTBceEFEXHhCRVx4OThceEE4XHhFN1x4OTZceEEwXHhFRU1ceDE2ckYpXHg5MEN6Xlx4QUNceEJBXHhGNFx4QTJceENBXHgxQl1mXHhBRFx4RkRceEM2PVx4RUQ3bVx4QkMnXHhCNStrQGJMXHhFNVx4RDFceEVEXHhBM1x4Rjg6ZFx4RTcmRXZceDhFXHhBRVx4RENceDlDXGxceDFCPlBdXHgwN3xceDk2XHgwRFx4RjFceEQwXHg5RjJceEU5XHg5RU1ceEUyXHg5QVx4MEEwZFx4MENceDk0XHhGRi5ceEEzXHg3Rlx4RjZceEY2XHhGOFx4QTFceDAyZlx4QkUtXHhFNFx4QjZceDE1XHhGNlx4MEJceEVBTmpceEFCXHhFNCo0XHg4RFx4QzFceEYxLCxzXjZceDBGW1wnXHhFOFx4MEZBc3NceDBFRVJceDgyXHgxRlx4RUNceDgzXHg5QVx4RkFPXHhDNFlceEE1WnlceEE1XHg5Qlx4QjBceDFDXHhENlx4MEFceEYxPlx4QjFceDA1O1x4QzRceDhCXHhGNT9ceDEyXHhENjhceDA5XHhENlx4MDhceDAzYFx4RDAyXFx4QjNnb1x4QUMmXHhCNSpceDEyXHgxQVx4ODVceDEwXHhFNFx4MUJceEI4XHg4RFx4RkJceDhFL1x4OTNjMFx4QjF2XHg4Mlx4OENceDA3XHhFNTs5XHhFMlx4MEZceDA5XHhGM1x4OUVceENFXHhBMVx4RkJceEE1dVx4RjFceEE5eFx4OUJdXHhBRD9oXHhDMFx4MDFDZkNceEM3NFx4Qjk2XHhBQlx4RDhTXHgwMDdceDkxLVx4RDBceEZBXHhGN1x4RUJxflx4Rjk9UTtceEVBXHhEQyxceERGXHg4Nn5ceEY3b2RfXHgwM1x4QThceEI5XHhEQlx4Q0VLXjJceDA3XHhFMFx4MDhceDBGVVx4MTFceEM2Ulx4OENceDhCXHhEN1x4MDQ+XHgwNzI5LyhceEQzNlx4MDlceEVCXHhGNVx4MTdceEU5XHhEMFx4MENceDg5XHhCN1x4RjRUXkZceEQ3R1x4RDVceEQxXHhFRFx4QTI5XHhCRVx4OThWTzVceDk2XHg4Qlx4RkJceEREXHg5OFx4N0ZceDFFYFx4OEZceEUwXHhDNFx4QjA9MTtGfVx4OThceEE2XHhFQ3hceEExXHhBNVx4OTVceEQyXHhFNiZceDFCXHgwQlx4MDRceEIxXHhGRVx4RkRceDk4XHhDRSZceERFdzhceEQ3TFx4MTNceEEzXHgwQlx4QjdceERFbVx4MDhceDAyXHhBQ0t5XHg5NT5geVx4QzkxXHhBNVx4QTVceDBFYVx4QTZceEFCXHhBQ1x4REJceEM0XHhBQVx4RkNceEJFXHg5QjNceDE4XHhGRHNceENGRVx4RkVceEEwXHhENl82XHgxMFx4MTM7XHg5QVx4QTZceEM0XHhDQ1x4RTdceDA3XHhBQVx4QzFiP1x4QzhceDkwPFx4RjFceEE1VFx4RTlhXHhDMz1ceDE1XHgwQVx4RTlceDA4LytVXHhCQ1x4ODBceEQ5XHg4MFx4OUZceDA0Mj1ceEJDXHhBRD9ceEZEXHgxMVx4RUZceDk5XHgwNlx4QTZceDg4XHg4Rlx4MDFceDg1XHhBMVx4RTV7XHhCNlNceEU1Yz1FXHhEQ1x4Q0NceDBEXHhGOFx4REZlZyB6WntceEYwXHhCRVx4OTF+ZCxceEVGXHhDQ1x4RjBceEJDUlIlUTFyXHhCNVx4REZceDE4IFx4QzVvXHg4NSdceEIxb1x4QTNceEI5Zlx4QUJceEQ3el9uXHgxNFx4MENceDE0XHhFMF9bXHg4Nlx4QzBceEM3XHhDQ1x4QzV8XHhDMVx4ODJceEJDXHhFOVx4RDVceEYwalx4Q0ZceDBCXHg4Qlx4RTE4XHgwMlx4QzhceEEwXHhFRFx4MUQ9bVx4QjFceDgzXHgxRlx4QzFceEZCXHhFM1x4MDJceEMzXHhFM0VceDhFaFx4MURMXHhGNVx4RUNceEQ2XHgxMFx4QzdceEE0JVx4MEUiYTBceDg1XHhCOHBceEZBQFx4MUFceEQwelx4RjJceDlEJlx4REUuXHg4MVx4MDRceERCOVx4MTBceDA3Q1x4RDJceEVGUDp3XHgxOFx4MTRceEMwXHhCN1x4MEYwXHgwMFx4MDglXHhDOFx4MDNceDg4XHhBNVx4MDVxXHhFOVx4QTRtXHg4OENceDBFXHgwOFx4QkVceERDXHhDNi8nXHhEN1pceEYzUlx4RURceEM5XHgxMlx4QzJceEI2XHhGQlx4RjBceDA3XHgwQlx4QjlwXHhFQVx4QkNceDlCXHhDOSJceDE4a1x4QjlceEY4XHgxMlx4QTN0XHg5MFx4RUZceEU1XHg4M0tceERDXHhGN2hceDA4XHhDRWMnXHhBN1VceDk0Z1x4RURceENFXHhDRlx4ODNceEM0XHhCQi5ceEExS0hdXHg5RVRceDlCXHgwMk9aL3E4XHhFOFx4RDJGQlx4Rjd9XHg4QVx4OTNceDk1Ulx4ODhceDAwXHhCRCFXXHhGMlx4QjNceEZDXHhEN1MoXHhDNVdceEE0XHhFM1x4RDFceEU2XHg4Nlx4RDBceDAzXHg4MVx4OThceEFBXHhEQ1x4MDVceDlEXHg4RFx4QTMsXHhDOFx4ODBeXHhFNEhceDlBXHg3Rlx4QTVceEZGXHgwQ1x4MTJceDk5a1x4REJceEE4XHhGMFx4QzdceEQ5XHhFMVx4RDFpXHg4RCpyXHg3Rlx4QzNceEY1Z1x4OTQ3XHg5Nlx4RjBceEVEXHgxQm5ceDkzcVx4MDBpZFx4QzRceENDVFx4QjZceEI3XHhFMVx4QzEjXHhGQVx4RjFceDg5XHhDQixceEQ5YFx4MERceEUxRWJYXHhDOFx4OUJceEQ2SlxceDlDRlx4QkNceEQyXHg5Mlx4MTAqXHhBQV85XHg4NVx4Q0NceDk2XHgwMlVceDlGXHhEOFx4QTJceEMxZ1x4MDJOXHg5MkJceEQ1XHhGOEFceEUwXHhFN1x4QTFPJExceEYwXHhEOWR9XHhDMlx4REZceEYyXHhCN1x4MDZceEREXHg3Rlx4QzlceEFDXHg4QVx4MTBmXHgxOFpceDk3RjBceEY3PFx4QTRceEE0XHhEQVx4MDMtXHhGMlx4QzFceDg3XHhFQ1x4RjhceEI3R2VceEE3XHg5Qy9ceEI0XHhFOVx4MTVsYFx4QUJceEY0XHgxQVx4QTlceERGXHhDM1x4OUJKXHgwRVx4OURceEZEXHhDMlx4QjhkX1x4Q0N9XHgxQX1ceEU4XHhBRlx4RUU7XHhFOVx4QzQuXHhDQVx4RDVceDlFR3JceDBFXHhDQ1J9XHhDMVx4QjN7NyNvLlx4QzZceEJEXHhFRVx4QjBceEE2XHhGM1x4ODdBMFdceEM2XHgxNihceEIyXSZ9RyxceEE2NFx4MTdceENCXHg4Rm1ceDhBXHhBM1x4MDhceDk0XHhFRFx4REFcbVx4OEIqXHhFRFx4OEMpXHg5NH5+XHhDRVx4RkNceEFFXHg5Nlx4MTNceDEzXHhEQVx4RDkzZnBceDlBI2NceEYzXHgxNFx4MTVceEJBa1x4QkVceEY3XHhBNVx4QjdceERDXHhDQl1ceEY1Slx4RUFOXHhCMXpceDA1XHhDOVx4OTk1PGpceDg0XHhDMGs3XHhFMU4mXHhEM1x4QTFceDBEXHhGM0tdJXlceEM4XHhFNFx4OTBWJG1ceDFFVD0/XHhFQ0ZceDFELFdceEY2XHg5Nk1ceEVCXFx4RThceEY5QFBceDhDXHhCQlx4RUJQXHhCM3lceDFDXHhEQlx4QzRceDFBXHgxQVx4MTlceEY0YVx4QzlceEUzXHgwNUJceENDXHhCM1x4QkJceDAxcVx4RjhceEFEXHhDRWVYXHhERVx4QzgiXHgxNVx4RkFTXHhCMFx4RTBceDg0Ll1ceDkxXHhERVx4RDhceEExRVx4RkFceDk2XHgwRkFkalx4Q0FVXHhCRi5ceDlFXHhDNVx4QTBdXHgwRClceDhEXHgwNVx4RUQ/XHg5Nlx4QTJWXHg5NFx4ODdceDkwXHg4NFx4ODIjXHg4MV9ceEQxXHhGRlx4RTQ7XHgxQlx4MUFceEJDXHhDOVx4MDFFXHhGMVx4MUJceDFFXHhBNTtceDE5XHhGQVx4OTR3W1x4MTdceEJCRUooXHhGOUFceDhGXHgwMFx4MEFceEE2IENceEVGSVx4OThceDE1b1x4QkZgXHgwQV5ceEI5XHhDQ1x4RkZceEU5XHg5MVx4OEVceDhERlx4QTRqXHg5Mlx4RTUqXHhFQn1ceEU5N2VRXHhBNVx4OTNceEM2XHhEMVx4RDVcXHhGOVx4QzNceDExXHgwNVhceEMyXHhCNjhceEI2Nlx4QkNceDAyXHhDOVx4QzJceDA3XHhBQlx4REZceDlDWVx4QjRceDEwXHhDNlx4QjZ8S1x4QzdceEIyXHhEQVx4QzdceEQyeVx4REMyXHhCN2tceEUxMVx4Q0ZceDlBLlx4ODN9fHdceEY5bFJceDBFXHhDMGtaXHgwMFx4N0Z7XHhGNFx4MDRwaVx4MDFqXHhBRHhceEUwXHhGN1x4OUNceDk5XHhCQVx4MTRceDlDS0FceEQwXHgwMS5ceDA5XHhCRVx4QTJ5R2RceEQ5XHhFMWhceENBdy1HS2MsXHhGNlx4MTBceDk1XHhFMVxceEMxXHg5NVtceDgwXHhBRFx4MDJceEJBXHg4QVx4MDBceEEzXHg4MX16XHgxQmdceDEwXHg4RjlceDA0OjsnXHgxQVx4RkZceEFFXHg5N1x4QkEuXHgxQ1x4QjF1XHgwMlx4RjZceEZFb1x4MUNceEQzXHhGQ1x4QzZceDlBXHgwNVx4RkVhaFx4RUNceDExXHgwQlx4ODkqXHhCMn5XIDRceDk5e1x4ODBceEU2XHhDQ1x4ODRceDFCXHhDNlx4OTVceDk0XHhFNFx4QkJceDE4XHhBME5ceEQ4XHhEQlx4RjdceDBETVx4QzlceERDXHgwOFx4MDJceEE5XHhFQlFcOFx4OUNwN1ZceEExPVx4MEJceDEzXHhGNFx4QzZceEFGXHg5OU1ceEM4Nlx4QzMvXHg5OFx4MUJceDgxXHgxQVx4QTJceEVFXHhCMlx4RkR0XHhDM1h5XHhCRFx4MTJceEY4XHhGRVx4QjY9W1x4RURceEJGJlx4QUMkZlx4RDhceDFFXHgxN11ceEREdFx4ODNceEU3XHhGQVx4OTBceDk2XHgxMlx4RTNceDlCXHhFN1x4RkVceEZCXHhCQ1h9XHhGM1x4MThdXHhGOUVceEVCXHhFRVx4MDQ8L1x4OUNceDE0XHhDM1x4QTZceDBEXHhDQ1x4QTBHWEZceERGOUhceDBFUlx4OTNceDE5TVx4QTVceDA5JURceEUyTjdceEY1XHhDNiwyXHhDOVx4QjVDXHhEN1x4QkFceDg2XHg4NWlQc1x4RjZceEU0XHhFQlx4RUFceEQwLlx4Q0ZceDA2XHhEQlx4QkZceDlFXHg5MlpceEU3SFx4MDd7XHg5Mlx4MTgmXHhBNFx4RTVkXHhEQ1x4QzlceENEXHg5QUsgJ1x4MUVceEQyeVx4QTM4bXRceERGXHhCN1x4RUJceDE3XHg4Mlx4QTFceEU0WXRFTFx4OTBucUN+XHhDNDhjXHg5M1x4QTNceERDXHhEMHtceDA4JThceEI0XHgwMVx4ODJvflx4QjlceENFXHg5NVx4MTJceEI3XHg5M1x4OTU2aFx4RkJceEUxXHg4N1x4ODVceEVBXHhFRVx4QUFceDBGXHg4MVx4RENceEFCXHg4N1x4OUVceEU1XHgxQVx4Q0FDXHhBNy5ceENCfSpceEM3Rj9ceEJBXHgwNyAkXHhFRVx4RUE6XHhGN1x4QjllRFx4OTBsXHhDN1x4OUZceDkzQTFceDA0XHhBOVx4RjAsXHhBNWAjXHhFNV1ceDg1XHg4RVx4QjdxXHhFRFx4QjNceDg4XHg4RFx4QzJceDEwXHhEMyZceEZFXHgwQk0wRVx4RjRceEQ4WWVsXHhCQ0BceDBGbFx4MEN5XHhBNTYjXHhGQ1x4MThceEJDK3sxXHgwMFx4RUNceDBGX25ceDkzXHhEQlx4QjBceEQxXHhBNClBM1x4RDdceDkwXHhCMlx4QTBZXHhGOVx4QjBlXHgwRDZceENGbnBceENEXHgwM1x4OEIlXHhEQVx4MDZceEMxTVx4OTVceEU3UU83ckxMP1x4RjNceENBXHgwNlx4MUVNXHhGRVx4MTAsXHhDQVx4RkRceDlCY1x4MTlceERCXHg4Q2BBXHgwNk9vUz0gXHgxNy5TL1x4ODBceDhFflx4REZceDAzYlx4Q0YjOlx4RTJceDExXHhGRlx4QkV6XHhFQlx4QUFceERCXHhDRlx4OTJ9XHhDME1ceEVCTFx4QjZvX0xceEI5Q1x4RTQ3XHhEOFx4RjRceEFFXHgwQlx4OTdceEYySFxhXHgwMUNceEZEXHhBMHZceEY3cVx4MTVceEZBLFx4QTluXHhEOS5ceEUxXHhERVx4QzM0XHhFMnxceEJGXHhDOW9ceEU1XHg5MVx4RThceEYzXHhENFx4OTJceEIzXHgxQVx4Q0NMZVx4REEmXHhERFx4N0Z8XHg5OVx4RTRHXHgwNFx4RDRceEYydFx4RERceEY3IG5ZaFx4RDlceDk3Vlx4RThceDdGe1x4QTVdXHg5Rlx4ODFceEEwRlx4ODMrI1x4QTdceDhDXHhGNlx4MDd5XHg4Nlx4MDROXHhGQlx4OTZceDk5XHhFNVx4OTV4XHhFNGFHXHhCRDxceEFCXHhCQVx4Q0R5XHg5Q2ZceDgyXHg5NnBxXHg4Mlx4QUV6XHg5NiVfXHhCMlx4RTJceEUxXHg4N1xceEE2QypceDAyXHhBMFx4QjhceDEwRGRceEZBd1x4ODJwXHg5MzpYXHg4OFx4RjRceENCXHg4OVx4QjR3XHhFOFx4ODJceEE2Vlx4RDZ4Llx4ODh7eVx4MTBceDk1XHhFQlx4MDIsXHhEQ1x4OEZceEQxXHhEQ1x4N0ZbXHhBRFx4OTVoXHhEOVx4RkZceEY5XHhGQ21xbzU7VVx4QTlceEY5XHgwN1x4MDZceEZCWlx4OEJceENFXHhFRjFTXHhCMVx4OTRceEI1XHhBNVx4RTV0J1x4RDBvQVx4MTVceEI1XHgxNlx4RURKXHhCQlx4MEQwXHgwOVx4RUJceDhBO1x4RkZceEI1UDZ9XHhFQVx4RTFceDg3SFx4MEJceEQzM1x4OTFceEI2dVx4MDhrXHgxMlx4ODd6XHg4NFx4RjJAXHhGQkVrUFx4RkF+XHg5Rlx4RDV2JTVceDhBKyhceENDIlx4REZceEE3c1x4RkNpXHg5M1x4Q0UxXHhGRlx4ODIwXHg4MFx4QTVceDkzXHhGNlx4MTdceEQ4PyVceEIxXHhFQTRceEU0Jy9ceEZDXHhGMFxceEYwXHhDMVx4RUJceDg1aVx4MTBceDFEM1x4REVceDlGXHgxQVx4QjVjXHhENlx4OEVeXHhGN1dceEVDXHgwRVx4QjlceDg1XHgwNnhceEJEQVx4QUFtfFx4QzdceEU1elx4Q0IjXHgwMzJceEJBXHhBRlBgXHgxRlx4QUJtRlx4ODBXZFx4OTImXHhEOERnJVx4QUNceDFGXHhEOFx4MDRceEI4XHhDNVx4RDRceDkyZyR8bnhVPFx4MEVceERCXHg4Nlx4OTNceDExXHg5M1x4QkMoIyI8P1x4RDRceDA1MTUgVFx4RjRceEQ5XHgxN1x4N0ZtXHhBNStceDhCVFx4MERceDFEeyh1XHhDMlx4MDRceEVFXHgxNFx4RDFceEZEXHhBMntceEVDcnhceEQyZ1x4RjcpdFx4REVceEQ0XHhGRVx4MTVceDA0XHgxMlx4QkVceEFBXHgwMFx4MTgublx4MUIqQ0RceDA2XHg5OVx4RUJHXHhGNUlceEREXHhBQkdceEQ5XHhDOVx4RTlWXHgwMGkre1x4QTkpP1x4MENceEI0OStceDFDXHhFM1x4RkY/XHhGRS91XHg5NV1ceEU2XHg5M11dTlx4Q0ZzXHhGMldceEI5XHg4OVx4MTNLb1x4QTJbPld9fVFBcVx4RkZceDg4Klx4QTRceEI1YFx4MEVceEQ1XHhDM3YwXHhEN1x4RjBceDgyXHhGRWszXHgwMiJceEE0XHgxQVx4MDV+XHhBNTVceEJFXHhEQVx4OTdceEU1XHg5Mlx4OUZceEUzXHhFMXNceEE0XHhBQW1ceEE4Y1x4RkNceDgxRlx4QzNceEQ4XHhGRC5ceDk0KyJceDg2XHhCNVx4RUVceERDXHgwMlx4MURceERBXHhFOVx4Q0FceEZFXHhFRlx4RjNceDlGXHhGRlx4QURceDhBXHhFNHZceDEwXHg5RVx4QjNNXHhBRVx4MDlceDE2fEtceDFGZVx4REZceEY4XHhBMlx4RkV1XHgwOXxceEZFXHg5OCNceEE0XHhBMn1LXHg4Rlx4QUVxXHhGOVx4ODYgP05ceEUzaFx4QUFjZ1x4QUNDXHhEMFx4RDRceEU3XHhEMlx4MDlceEY4WTlceEY1XHg5NTl+XHgxN1x4RjRceDBEXHgwOW9ceEVBXHhDMVx4RThceEI0XHhCRVx4QkVceEFGXHhGNnpceDA2XHhEQlx4QTdceDFEQDNceDgyNlx4OERceDgzVFx4MEFceDlDLVx4REFceDk4VyFceDgyXHhDRlx4OTdceEM1XHg4OFx4QTFceEVDXHhCRVx4RURceEE5aVx4MERlfVZFZXtkXHgxOVx4ODluW1x4QUJceEVGXHhDQkVRXHgxRVlceEJCXHgxOVx4RkJceEIwXHhGQ1x4Q0NqKlx4MDAuXHhCOFx4QThUXHhCMlx4QkIuXHhGNlx4RDBBXHhCRlx4QzlceEY5e1x4RTJiKVx4MDNWNVx4RjlceENCXHhFM1x4OEZceEMxXHg4OURyXHhBOVx4OTUhXHhEM1x4RDlceEE3P1x4MTBceDhDMlx4MDFceDFFa1x4MEJceDlBXHhENlx4ODlceDkzNk5ceDdGSFx4QTRkS0hceEM3XHhFOVx4QjlZVGVceEREXHgxMj4vQlx4RDg6X1x4OUNceEI1Ilx4QjFceDg2NFx4RTJceEExXHhCNVx4QUNceDk0XHhCQlNceDFCXHgxMFx4MDdceEM0WUxceDFCYlx4N0ZceEU3XHg4Rl1ceDFGXHhGNlx4MDZSXHg4NVx4RjkseFx4RDNceEFGXHg5Q1x4OTZgXHg4QVx4MUJceDE5XHgxQlx4RTFceEI1XHhGMFx4MTlceEVEXHhBN1x4QjN+WWtlXHhDQ1x4QzRceEQ1XHgxMVx4QTZceDFFXHhDQVx4RDQzZFx4Q0JceENBXHhGQlx4RTVceEI3XHg5NFx4MDAtRFx4OEFLXHhDN1x4MEZceEMyVVx4RTlceDE2XHhCRFx4OTNceEZBXHhEQixceEI0XHhDQilWXHg4QVx4MEZceDkwXHhGQWlPLVx4Q0ZceDBEXHhFRmd+XHhGRlx4QkUqXHg4RTZceEM4XHhGNVx4REVceDEzXHgxMyFXXHhDQVx4QzZceDkyaEBceEQ1XHhEQX1ceEMyXHgxNlVceEQ2XHhGN0xceEU4XHhEODYgQ1x4RDV+O1x4MDhceERFXHhBMlx4QjRceEM3d1x4MURceEE2T09ceEVGXHg5RVx4QzJceDg5XHgxNVx4MEZceDBCSkJEXHhCOFx4RTJceENGLWdceENDIFx4QzZceEQwXHgxRVx4QTNaOVx4RUI3PS1qXHhBMFx4MDIoRFx4MDF+XHhBQklceDg3XHgwMlx4QzF1XHhCNVx4RDh9eW9ceEI2XHhEQ1x4QTVwXHhEOEthcFx4QTVceDA2V2BceDgyZFx4QjNceDlGb1x4QjIpXHgxN1ZiIlx4QkRceEI5XHhGNS1ceDBBXHhFMVx4OTlbXHhEN0c0XHhFRVx4OTQuXHgwMFx4QURceEI2eCN3XHhGQ1x4Q0RceEZDXHhGNlx4RjNceDhBX1x4QzZceDk2M1x4OThceEQzXHhFNlx4QjQ/XHg5MFx4Q0JceEM4XHhBRC1ceDE0XHg3RnRMXHhFNFx4MEZzXHg5Mlx4MEVceEM5XHg4Q1x4RDhceEU0XHhFMFx4OEFceEY3XHhEQlx4ODhceEJFN1x4QkIgXHg4NVx4REZceDgwXHhBMT4zTFx4RURceEIyXHhGN1ZceDBEXHhDNlx4RjJceDBCOVx4MDlceEE1XHhFNVx4QjlceEY4XHhCNzx+ZyJceDFEXHhBNVx4RDhra1x4ODNwXHgwRFx4QTlceDA1XHhCOFx4QTBceEEwe1x4MDNceEE0XHg5REpceDk3K1x4Q0VceEIwRVx4MDBceDlCWVhceDg3XHg5NFx4MUU0XHgwNFx4QjRncFx4QTZgXHhFRlx4MERceEU5XHg4MlFpXHhEM2kjXHgxMlx4ODVceEVCRCNceEQ0XHgxMFx4MDZceDBFXHhCRlx4QUJceDE0XHgwNW9ceERDXHhGNFx4QjRceENGXHgxNFx4OUZceEQ1XHhGRlx4OUNceEE2XHgwQUJceEFDXHgwOFx4RjBceEJEb2hceEU4XHhDRlx4MTFOXHhGOVx4REU7XHhEMVx4OTlceDg0XHhFRlx4QjFceDEzXHhDQSZceEFGXHg4QVx4REFceEZCMXlceEUzMUJceEI1XHhBQVx4QzFceEY1XHhDQ1x4QzJceDBCXHg5RFx4RjJceDE4XHgwOEpceDAwXHhEMVx4RTdceDkyXHhENFx4RjNceEU0XHhFOVx4RUVceEE1Olx4OUR5XHgxRlx4Q0UqXHhFRVx4OTBWPVx4OUVceEY5XHhGMlx4OTlzOmNceENGXHhCN1x4REVceEQ0P1x4RDdEXHhEQ0lceDAyN1x4MEVceEVCXHhDQkRceEY2JjdceEJDXHg4OVx4OUVceDhGXHg5Qlx4Q0VcbVx4Q0FceEE3Slx4OEJceEYzcTNceERCXHgwMFx4MDZceEVGYmZeWmh7XV1ceEMzXHg5RFx4ODFceEJDKXJGUVx4OTVrXHhBMCxceEVEXHhGRDNceEFGXHgwM1x4QURceEU0XHhEMytDXHhCOWtceENFeFx4Q0ZceEEwXHg5NXJceEIxXHhCNllceERCUFx4QUEiKUY6XHhGQlx4QkJceDFCXHgwRXszXHg5Q1x4OTBiXHg5RFx4QzNceDkzXHg5Nlx4Q0U0XHgwM0NRXHg5Qlx4QzlceEE1XHhEMGFceEYyXHgwOVx4RENceEY2elx4RENqXHg5NUlCXHgxQzBceDkwXHg5RlVqLVx4QkRceEVCXHhFQ1x4Q0FceDg1XHhBRVx4MEZceEVCIVx4RDl2SFx4ODVceENGXHhEQlx4RkRceEY1XHhCNFx4QzdceEQwXHhGM1x4RTM7XHgxMVx4QkJwXHgxM1x4MENceDkwXHgwRVx4OTJceDgzIzNfXHgwN1x4OTlTXHhFQXxceDk4XHg4RVx4RUVceDg4XHhDQ1x4QUJObDgoS1x4RTEjXHhFN1x4RkMzXHhCRHA4XHhDMFx4QkZMZUJceEUwXHgwOFRceEJEXHhBNlx4MTFceEI3XHgwMFx4RkVceDAyRTJCJmhDczRceDdGXHhGQ1x4Q0FceEVDXHhBN1x4QkJceEU4KFx4OTVceEUzc1x4QzNceDk4Vlx4RDRtKlx4RjBceEE4XHhBMFx4OTJHXHg4OFpceEExXHg5OHVceDA1IVx4RjNceDFGXHg4Nlx4RUFceEM5XHgxRVx4MEJceEY5XHhCOFB2OWtceDgzalhCYVohXHgxRVx4OERceDlELFx4OTlceDhBXHhEMVx4OERceEI1K1x4OTBceDk5XHhDQVx4RDRceDAwXHg3RiVceDAzXHg4M1x4MDlceENGOFx4OEU1fFx4MDhceEZCa1x4QjNceEM5PVx4RTJceEY4XHhERVx4MDdceEMwXHhCNVx4QTAzXHhDNkFceDhBXHgxNlx4MDZ8LDlMXHhDNik1UFx4OENceEUxeFx4RDBceEMzXHhDRXdrXHgwOVx4QUN2XHhEQlx4QjRceEVDXHhDMlx4OUJceEVFXHhERGJWXHhDQVx4MDVnXHhBQlx4ODE8XHhGRFx4MDFceDE5XHhGQykyXHhCM1x4QjlceDkwXHgwRTBceEI3XHhBMFx4MDNceEJFPlx4RDlqXHhGOVJceDE3O1x4OTdWXHhENVx4MDhceERCXHgxOFhceEVCdVx4OEZceEM5Qlx4RjhceEQzXHgwOSNceEQ0LFx4MDZceDg4XHhDMlx4MUV+Slx4RTFCMFx4RDhceEJCXHhENTJceEVFUCBceDE0JVx4OThceEIzQ2FceEIwaFBceEM2LDNceEExVVx4REIxXFx4OEZ3XHg5M1x4REIjXHgxQzVceEI3XHgxRlx4OEZceDBBXHhBM1x4MTJceEYzMz1+YSRceDg0XHgwRVx4QkFceEFFXHhGOEtceERGXHhGQ2VceEZDc1x4QUVceEVCXHhBN3tceEM3XHhDN1x4QjVceEVBIVx4OUVceDhDMlx4QTBceERFXHhEQlx4MTFyXHg4Mlx4RDFYXHhGM1x4RkRceDk2ajpeXWYvXHhFQlx4MTljXHhCRV5MKVx4QzBceDE0XHhFRFx4MDBceEE2XHg4QiNpXHhGRVx4QkJceEFCZWlceEE5dFx4RTVceENCXHg5M1x4OERceEMwcFx4Q0VceEUwXHgxOUBsXHhFMTtceEYwNFx4MDVceDg5XHhCM1x4REFceDExXHgwQlx4MTBceDE1XHhERGNceDkwXHhGNlx4RkFceDk0ZFx4OEFUXHg4Rlx4MThceEFFXHhEMFx4QzZceEZEXHhDQntceDE2XHgwNkhceEE3XHgwRlx4OTNCXHhDRk1ceEU0XHhGNWs8TUpceEIwSEtceEIwXHhEMSJceEIzXHg5NUNceENCZlx4QkRceEY2XHgxOD9ceDhEXHhDNVx4MUFceDE0XHg3RmFceEZCQi9ceEQyXHg4N1x4MTFceDgyXHhGN11GKm1ceEEwXHhFOVx4RUNceENGXHg4M1x4MTdJXHg5OFx4OTJceDAxXHhCMFx4Q0FceEQ4bH5JXHhFOHw4XHhCOFx4QjRceEZDXHhGN2ZceDg3XHhCQ2YpT1x4OTcpZ1x4QjVceEUzXHgxM1x4QzZceDlCXHhDMlx4QkVceDFCXHhFMHJ8XHhEOCZceEQ4XHhCQ1lceEQyQD5ceEE2eCJpblx4QUFceDlDXHhDN1x4QzMqXHgxN1x4QjFceEVGLGRwBI0Bi+qzOVMmjQGL5iN5MVx4RjVceEUwTFx4RTFceDlEXHhBNVx4MDVceDgyXHhBQXBceDhGUFx4OUUyXHhCN1x4QzhceEQ0XHg4RVx4RURceEExRlx4OEFceDlEZVx4MDdceDlCVVx4QUNceDFDRlx4RDFceDhGLVx4OThceEMwMCBceEM5XHgxOSBceEYzLFx4RkZceEUwfmxceEE5XHhFRiJceDgxL3VceEExXHhBQTZceEYxXHhFRSl2XHhDMlx4QjRceDkzXHgwOVx4QzZceEFFRy5JXHhENlx4QTFceEY5XHhFMVx4QUNceDAxS1x4QzZceDkyXHhFMFx4OUZceERCXHhFN0BceDA1PFJceDlBXHgxRlx4MDRceEY3XHhGOFx4QTRceDk0XHhFOC9ceEM4XHgwMlx4ODJceDA2XHg4NVx4MEVjXHhCMU1pXHhENFx4QkNVXHhFMlx4Q0ZceDE0RGVceDlDOE1mXHg4N1x4Q0VceEY3XHhBMlx4RTVceDgzXHhGMDVFXHhFOENceEI3XHhCN1x4MTdceDE3YVx4MUVceENGM1x4RjNceDBEYlx4RTdceENDXHhGQ1x4QkQ4cVx4MDI7XHg4MWBgOVx4RTdceDE2WVx4QjJceEI3UG5SXHgxMDFceERDXHhFNlx4RTlceDFBXHg5MFx4QUEoXHhENlx4MURceEJCWFx4ODk0Rlx4RjlceEEzXHg5QVx4QzdceEI5XHhGQXF0XHg4RFx4REZeXHhGMFx4QUQ3XHg5ODpceERGXHgxQ1x4ODhceDE0WWNceEY5XHgxRFx4QUYhb3hceEYwXHhFMmhceEEzXHhCM1YuXyVceDFFRFx4QkJceEJCXHgxMlx4REVceEQ2XHgxOVx4QURceDBEYlx4OTFceEZEXHhEM1x4OTJeXHgwQVx4Q0JQXHg5Rlx4OEJceDkwXHhFMVx4OTNeXHhEQn1ceDE2XHhGNEZceEU4ZVx4MDVceEQ1XHhCNVx4ODNceEVBKmRceDEwV1x4QTlceDhEMFx4RjRceERCXHhEMVx4MTFceEI1LVx4QUFHXHhBQVx4QjJceDE1XHhBRCJceEE0XHhBNk1ceDA5XHhCNCNceDg2XHg4OFx4MTRceDEzZVx4MDl2XHhDNFx4QUUtYFx4RTRceEFDbkFceEZDL1x4ODV5XHg5M1x4Qzl1LFx4RENoXHhCMC9ceERFXHhBNlx4RTRceDA5MXlceEIxZ1x4RjNceEEza1pceEFBXHg5NFx4MEVceEI2XHg5RHd0XHhBOUNceEJGXHg4RFx4QkVceDBBXC5ceEY3XHgwNFx4QUVceENCXHhCQ1x4RUFceDk4XHg5MFx4MUQjVlx4QkElI1x4MTJceDE0UjchXHgwN0VceDAwVVE+PVx4MUZceEQ3Plx4MDVeXHgxMDNZcHlceERGXHhGRSZXXHg4Qlx4QTRceEMxXHhDQVx4MUMlXHhENUE/dDRceEQ1O1x4QjBceEZGTytOXHgxOFx4RURceEYxXHhBMWJceEIyXHhBMFx4MUJBXHg4RVx4RkVvXHhEQVx4QkUyXHhBQzdGXHgwQlx4MERceEYzY1x4RTVZd1x4OTRceEQ5TXdceDBGIyhceEJDXHhGMVx4MDEsXHhBMVx4ODQmXHgxOT9ceEUxXHhEN1x4QkNceENDXHgxRlx4QjVBJ0EpKlx4QjBceDBFa2lsXHg4Q1x4RjVjXHgxNFx4QkZceERBVSlceEY4TFx4RURyXHhBQ01JXHhDOFx4RDlceEY3XHhFM3tceDg0XHhGQ1FceDEyXHhCRlx4OUNceDgxXHgwN1x4RUVceEREXHhENFx4Q0FceDk5eVx4QTZceEJCNlx4ODlceEQ3XHg4M1x4RkFceEU2XHhEMFx4QzhhXHhDNVx4RkVceDhFXHhCOENceDBBY1x4ODdceEIxXHg5MyNceEIwXHgwM1x4MTlceEM4XHgwRlx4QUQ3XHhFNlx4QkJceEUxXHg4MFx4Q0Fxblx4Q0ZceEI0XHgxNlx4OTRceEQ1XHhDMlx4MDdceEUwXHhBN1x4RjRceEFFc3FceDkxQ1x4QzR7XHhFQ0BceEVEXHgxMCFceEU3Llx4REYkXHhFNVx4QzFceEY0XHg5NmxKPlx4QzNceEREUVBceEQzdFx4MTNceDFGXHhDQ1x4OTFceDkyXHhCRVx4Qjk7XHhFOEE9XHhGM2BceDhGXHhBNlx4MUFceDE4XHhBM1x4QzZLPVx4QzhceDlDXHhDNVx4RTFceENGXHhEN2lceENEXHhGRVx4MTdCeVx4OEJceEU1XHhCNlx4ODBceDkwc1BceDEzXHhGNUgjU3pceDE5XHg4NVx4MDdOflx4MUVceDkwXHgwNFx4QjJceENDfVx4Qjc9XHg5Rlx4RTlceEU5XHhEMlx4ODRPXHhEMVx4MDVXcGZceEE5e1x4MDJceEEwXHg4N1x4MTAzXHgwMnxceEQwXHhGQ1x4OTVceDlGXHhBRVx4ODZceEM0XHhEQ1x4REJsXHg5Q1x4RjJ0PFx4MTgtXHgwOHlceDkyK1x4QTBqXHhENmxceDBDXHhCMn1ceDA4PmJceEZDPFx4QkFceERBXHhBNFx4RTNceEQ3XHgwMVNceEE0XHhFRX1ceDk2XHg5N2FceDkxXHgxMFx4QURceEY4XHhGQ1x4QkVDflx4Q0FceDEzXHhBQlx4OEJceEU4PSZceDAyXHhCM1x4MERceDg0Xlx4RUEwXHgwNlx4QUN3XHg5OVx4RjdtXHg4NzpceEQ1XHgxMWcsXHgwQlx4RjZceDgyXHhCNVx4QUZceDAyXHhCRlx4QzV7R1x4QUJZXHhDRmlceEYwXHhBNFx4RThceERGWCVceEJELnJceERFXHgwMlx4MTBceEUzXHhCNlx4ODRdb1x4QkFNXHhBQlx4RDlceEYzPj1ceENELVx4MDRceEMwXHhDNHdceEQ0J1RceEM1XHgxRGBceEIzXHhEQVx4Q0M8XHgwRlx4RDRceDhFfFx4RURceEZGL1x4MDlceDEyXHhGMVZgdFd+S0tceDlFKFx4RDZFXHhFMVx4RUUkXHgxMlx4QTFcXHg4NXFceERGOlx4OEZceDgwXHhGNlx4QzJceDFGXHg4Nlx4MENceEJCQVx4RTlceEIwTnNceEU4XHhFRH5dXHhFNkBceDg2XHhBOVx4RkZceDA1cWlceENDXHgwM1x4OThceEI3aFBceEUxKVx4OEE6ZTZceDk1IkhceEU4Q1x4MTdceDkyS3FVdnFceDFDLW9ceDg4XHgwQVx4MTFceEQzXHg4NVx4MUNceDhEXHhDMlx4RDdWXHhDMVx4RTRqXHgwN1x4MENceEYxXHhBN1x4ODEzXHhBOVx4QjRceEEyXHhFMFx4MTIjalx4QURceERBXHg5MVx4QzJceENFXHhFMjFBXHg4RFx4OERTXHgwRVx4QkJceEIxcltceEI1XHhDRV5mXHg5Q1x4MUZceEI0XHhCOUhceEYwXHhFQz5ceDlCUFx4RjZceEQ4XHgxNlx4RENzXHg3Rlx4OUNceEJDXHhFRVx4QzNceDE5XHhGNFx4RTNceEE0XHhDNGdYelx4QTdOXHhGMyZceDgxXHhCQlx4RDIsXHgwMFx4RjFceEYwXHg4MFx4QTlVXHgwNlx4RTBceEM0XW5PXHgxRVx4OTNceEI0dC5ceDAyXHhCN1FEXHhDRVx4MEZceDFDXHhBM1x4RTMgXlx4QTJceEQ5ZVx4RDFceDE4XHhDNSBceDg4XHgxNGJceDlCTVx4OURceEQwXHhFM1x4MDBEXHgwMVx4OUF5XHhGMEtceEUwXHg3Rlx4QjIrXHhENlx4OENsXHhGMCk4eVx4RDFceDA3IVx4MEZceEE2XHhCNVx4QTguLiJceDBCaVx4OTFjXHhCOFx4MEJUYVx4QzBceDE2XHg4NVx4OTRceDA5XHhCMFx4RERceEI4ezlceEZDXHg5QnJceDlFXHg4RU9ceDk4XHhDOVx4QURceEZDXHhFN1x4MDVceEVGUFx4QUVceDk0XHhBQ1x4RjlteFx4RDZceEMzdlx4REVPXHhCNlx4QzEgIlx4REZ+XHhGOSFceEQ2XHhEQ1x4QThceDE1XHhERjdVUFx4MDNceDgwXHhBNlx4ODZceEJDXHhFQ1x4ODApXmtceEQ4NXVceDhFXHgwRkZdXHhFQlx4MTVceEY5SFx4OEIuXHhGMHVceERDW1ZxXHgwNVx4QjJceEEwLWAtXHg4QSlceDFGYz9ceEY3XHhEMltceEI4XHg4QkFceDExblx4RkVceEMwXHg4OGlceDFGXHg4MFU7Mlx4RUQlXHhBNWVceDg5XHhBRlx4QjJeXHhBQlx4QUFceDA3XHhGMFx4QzRceEI1XHgxNVx4RUNceDE2XHhGQj9ceDE3XHg4OVx4MEVceDhFXHhEMVx4RURceEU0XHhCMjFceDlDXHhERVx4QTRZXHgxQlx4RUZ1XHhGOFJceEQ5XHhBQlM3XHhENDVceEZDXHhGRThceEYyXHhEN31ceEFEUzZceEE0Klx4MEZLXHgxMWM1Ylx4MDRceEI2XHhEOGBceDg4NzJceEYyb3NVXHg5Mlx4MEZceDg4d1FceDEzXHg4M1x4RjZceDA3XHhBNFx4RUZceEE4XHhFNVx4OTdceEM1Ylx4MDZCM1x4MUJceDk1P1xceEMzXHhBQVx4RUJceDg1RFx4MTZceEY3XHg4NkFceEQ0XHhGMVx4MUVdeFx4RUUgXHhDRlx4OEZceEZCXHg5OVx4RTdceDFCXHhBOVx4RDBceDFCSVx4ODl3XHgwQypceEJCXHg4RUJceEZCXHgwQyZceEIzXHgwNVx4ODNceEZFXHhENCdceEQxXHg4RVx4OERceEVCXHg5Q0ZceEY2XHhFQkRceDA3XHhBMlx4ODBceEUzMi5bYVx4MEV4KUZceDgwXHgxMlx4RDNJN1x4RTRceDk5XHhBRlx4RDJceEM4XHgxOFRdXHhDMWpceENGXHgwRmxaXHgxOFx4OEJceEJCMlx4OTc9XHgwNk08LTtceDE1XHg5NVx4QTFceEY5SVx4MTVceDBCZVx4RjVceDlERlx4RjRceDExVmI5XHgxNl5QXHgwNlx4OERiOFx4QjdceDlGXHhENjBqaFx4RkVceENBXHhCMVx4QkJceEMwXHhGOXRceERBc1x4RDNceENFXHhBOXE0clx4RDJkWltYXHhDM1x4RjRceEI5XHhEQVx4RTJceEY3XHhBOGJceEY4XHhDRld1XHg4MFx4REF5XHg4M1x4QzRceDBFZ1x4RjhceDdGXHhBMSJbXHhENmlzQENJXlx4RUVceDlCXHhGMlx4N0ZceDlGXHhBQlx4RUVceEMyflx4MThceDA2UDBceDBFVXNlXHgwMF5ceDhCOlx4RTVceEIzNjp3XHgxNFBceDFDZ1x4QUMwXHhENCpceEM5XHhCN1x4MENceEE1NFx4QjlceDBFXHg5Nlx4OUFceEMyXHhDQlx4RUFceDE0XHhDNzFceEI4ZFx4QjBUaFx4MTVceDBGXHg4OVx4ODc+XHhBQVx4MTZ8fVx4MDJzXHhENFx4OTEpRlx4MENceERCdVx4QUZceDkzXHhGNVx4OEJceDFBXHhDN1x4N0ZceEZFXHhDQlx4OTU4XHhGQVx4MUVdXHg4QjtceDFEOltceEIzXHg5NFx4RTFceDA0XHgxRDVceEE1XHhBMFx4MDlKXHhFRkJceEQ3XHg4MXhceEY0XHhCNlx4MEROXHgwMXZceEMxI1x4QjBceEFGbC1ceEQ0XHg5NH1JXHhFM1x4RTZceEZEKHxceEYyXHg4Q1x4Q0FceEI0XHg5Rlx4Q0NceEIyXHhDM3JceDlDb1x4Q0VceEY0XHg4M1x4OUNVXHhCNFx4RkNSXHgxQlRceDgzXHhENzVceEYzXHhDOXJceDAxXHhDQ1x4QzZceDk4XHg4MFx4OEZceDkwXHgxNlx4QjlzXHhFMlx4OENceEExXHg5NStceEU4XHgwOH1ceDA1XHhDMlx4QTNwX1x4RjZceDhCXHgwRlx4OTlrXFx4QjhceDE0XHhGNk5ceDkwXHg4Q1x4QUJVXHhEOFx4ODV+XHgxNCJceDBFXHgwQVRceEZFSlx4MTZ8R1x4RUJEaFFceEJDR1x4QUVceEE3XHhERlx4OTBceDg4RjdceDFBXHhBMFx4OER9XHg5MFx4Rjc7XHgxRlx4OURceDhBOVx4MDlceDhBXHgxQ1x4MDhceERBcGdceEQyXHg5Q1x4OUIvXHhBRVx4MDBiMVx4OEJHXHhGRlx4MERceEJGc1x4QTZceEUwXHgwQ1x4RkJceEFBXHhGRFx4QzZceEIzMVx4QUNceEM0aVx4QzFceEVDQigwXHg5Nlx4RTZceDAzXHhCMyBceERFXVx4QzZceEJGXHhCMVRceDA1Ilx4QTJnaVx4MDBceEQ4XHhEOFx4MEZNXHhDMHBceDlDXHhEN2BceDE4NVx4OURceEIxXVx4RDdceDkzXHgwQlx4MTJtV1x4RERceEU4XHhEN1x4ODdSXHgxNVx4MDVceEZBKVx4RUNceEIzXHhFRmxceERGXHgwOVx4OUI5XmRceEM5XHgwNGVceEM0cyhceEVGXHhBN1x4RjBceDlEN1x4MUVceDBGU3ZeVFx4QjNceDg4XHhGNDl7XHg4Mlx4RDlceEFCXHhFMz1ceDk5XHhCRj1ceDEzXHhCM1x4QkNceEQ4alx4MUNceEZBXHg4NUQnXHg5Nlx4QjlceEY4XHgwRVx4OURCcFx4MDc1XHg5Mlx4OEFceERCXHhCMlx4MDRceEQzXHhCNFtceEQ5aFx4RUZceEQ3XHg4NiFceEQ3XHgxQlx4QzJdQCRceEMwXHhGM1x4QTMramBceEZCOlx4RjFceDAxXHhFMVx4QjZceEVCXHhBNVlxXHhBOFx4OTgifFx4RjJ7XHhGMzhceEU2XHg5M1x4QzNceEMwXHg4NE5ceDA5XHhDN1x4RkZceDk4XHhBQVx4OEFceEQzXHhFRVx4OTNceEExXHhDQT1ceEUyXHhBQ1x4MUZceDA4XHgxRVx4MUNceDg4XHgwOVx4ODRceDFDXHhDNlx4OTNceEMwMVx4QzhVXHg4RFx4QzVceDlCXHhFQ1x4QTNeRGFceDhFQ0RceEMzXHhGRHJOXHhEMGFceDg4XHhCNitxXHhBMlx4OEVwPytEXHhCRSNceDlFfVx4RkRceEVFXHhFNCtceENGXHgwQyVKXHhEMlx4RTcxZC9RdVBqXHg5QUFJXHhCOFx4QUI6XHgxMTQ7XHhEMlx4RThceDBGIEk1Plx4QzVqXHhCMVx4RDhceDk4eFx4QUM3XHgxMSFceEYxXHg5NFx4MUJceDlEXHgxNUwuXHhEME1ceDgzXHhCQVx4QjAhXHhGN2dceEUzTiRuXHgxRlx4Q0Y5XHg5NFx4QjRLW29ceDkyfmJceEE5XHg4MFx4QkJrXHhEQ1x4RTdceDE3Qlx4QTAzXHhDQVx4OTNceDlGXHgwNGxceERDMlVceEYzXHhEMFx4RjYxXHhGM1x4MDVceDAxQlx4QzhceEJEXHgwRVx4OERceEQ0XHgxNVx4MTMpXHhENVx4OTFceDg5XHgwNntceEYzXHhEOFx4MEIwXHg4OVx4RjBYXHhCOTJceDE0XHhDRjtceDE5V1x4ODhceDE2XHhGQldVXHhDRlx4ODNceEMyXHhCQVx4RjZceDhGXHhGNy8kXHg5NFx4MEFceEQ4e1x4OTlceEE0XHhDMVx4RTJceENCVzFyXHhGQ1x4MDNGXHgxMlx4ODNlXHhDM1dceENGXHgwMiRceEQ0XHhDNTBMOVx4MURceEMwXHhDQ1x4Q0JxXHhCQ1x4QjNkXHgxNjI/KnxceDExXHgwMVx4QkFceEQ0XHhGRVx4QThceEE3XHhDM1x4QTZceDhGXVx4MTJceDE3XHg5N1x4QUFXXHhEMEZceEIyXHg4Nlx4MUNNXHgxRHlceEYwXHg4M1x4RDBceEU5XHg5ODhceDk0Km9ceDA5XHhGRVx4QURceDg2XHg5RC9cXHhENFx4RTdceEEwWlx4QzlceDlCXHhFNFx4MTZtXHhDQkd8XHg3Rlx4MTlceDAzQWpceEIwRlx4QUZNXHgwNFx4MDZceDAzWFx4ODhceDExXHhDNyBMXHhBNyZdJ1x4Q0RXXHhGNVx4MDNZXHgxQ1x4QTZceEFDXHhEMFx4Q0VceDlGXHhDOVx4MTduXHhFMlx4RDh5XHhBQlx4QUNceDAzXHgwMTpceEM1NjFceEZEXHhENDxceEY5XHgwMlx4RTZceEVDXHgxRlx4MDlceDk3XHhGNnVceEQ2cVVBbFx4RjlIXHhEQlx4RTZceDg2X1x4QjNreFx4OUJceERCOURceDE3XHg4OFJceEIxQ1x4MTBceENEXHhDNFx4Q0NceEYyXHg4OVNceEYwQGRceDkzXHhGRlx4MUVceDk1S1x4MEJceEI4VnZceEMzNVx4QTJTXHhCQ1x4RjBDd1x4OTRceDBGXHgxQUd9XHhBQlx4ODRceDgxXHhEM1x4RDhBXHhFRFMmXHhFMyg6XHhCM1x4QUZceDE4UVx4Q0FjR1x4Q0JceDlGOUVceEZCXHgwN1x4RjhceDkyXHhFRlx4RTRceEJBK1tceDA1XHgxOF1ceEQ4XHhGOVx4QzhceEQxXHg4QVx4RkFceEMzIVx4QzBceEI5cid8XHg5Qlx4QzdceDgxXHg3Rlx4OUFceDEwPDp4elx4REZceEZFbWZ2XHhDMFx4OUZceDkyXHhDQVx4OUZceDk1fFx4OENceEI1XHhDRVx4QTVceEMxXHg5RVx4ODJceERFXHgwNHRDXHg4RiFceEY1W1x4RUVceDg2XHhFMFx4QzZceEJGPTxceEU3bUYuXHhDN1x4ODlceEVGXHhDRFx4RDhceDkyUFx4RUN6XHhBNyBceEFDXHhDMlx4QTB+XHgxQVx4QTIjXHgxOFx4RThceEM4XHgwN1hceEEzXHhDNVx4REFceDlEIzVceDFEPFx4MDBceDlGXHg4MCdceEE5bXh0XHgwRlx4MDBceDlCXHhBOE1ceDhDXHgwQydceEQwXHhBMl5ceEM5JT9ceERDS1x4REVwXHgwOFx4ODRceEUxXHgxMiJceEZEXHhCOFx4QzhceEE1XHg3Rlx4QUNyZVx4RjInI1x4MDhceDlCXHg4RSpceEM1XHhEOFx4MDhceEJDXHhERVx4OEZceEM3UkhceEQ5e1x4MTBceDlCXHg4RFFceEY4XHg4Rlx4QjJeXHhGOFx4QkM7XHhFQVx4QzBiXHhFOFdceEU0dVx4OEFceDg2XHhEOFx4OTcqXHhGMFx4MUNceEZFNT1ceDA4bFx4RTRtXVx4RDRceEU0TFFceDgyXHg4N1x4RTdceDA3P1E+XHhBQ2tceDE3W1x4QjNceDA0XHhERlx4MEZceDhGXHhDNVx4RkRceDFEO098J1VpMFx4QjZceEFENFx4Q0JIXHhFMDcvXHhCNltceEJCXHhFQ1BceEE3XHhGM2dceDk3XHg4M1x4RkRVXHhDRWIrXHhGNVpceEIyRFx4OThceDAyXHhGMlx4MEVceEU0XHhGRWhceEMzXHgxOUVmQ14mXHhBQU1ceEVBaHVceERBYVx4QkQhXHg5Q3pceDg1LE1ceEY4dFx4QThceEI2XHhCM1x4QTBceEM2Olx4MERceEMzR1tceEI1XHgwQVx4RUFceDE2Til4XHg4Ql9ceDBFXHhENFx4QzRceEIzXHhGOGxceDA1NFx4QkZ1Q1x4QjEjJ0xpdHtceDFFXHgxQlx4MDdceDFGXHgxMyBceEJBOFx4QzA7XHhGMlx4RENceEE0XHgxMH1ceEM2XHhFMlx4QjBceEIwVVx4MEM5XHhDMlx4RTNceEYyXHgxMFx4RkRceDFEa0tceEFCXHhGOVx4OTdjXHhBMTpyXHhFOVx4QTl5Jlx4RTdceEIyXlx4OTRceEY5XHhFNlx4RUNnXHhDRVx4RDhceEMzIlx4OTVceEQ4XHg5QVx4QzBceEM4eVx4RkU1XFx4MThceEU0flx4OUJceDEyXHg4OD02XHg5NVx4RUZ5XHgxN2hceEZBIVx4QzhceDg2XHg5MV0mXHhEMVx4QzZceDk1KFx4RTZTLFx4RDBceDA5JEpceDk3XHhFRVJceDFGYFx4RUVceDEzUUFceDFBQVx4RDBceDEzXHhCNlx4QTgtX1x4ODJVXHgwMVx4RjdceEQ2XHhCMFx4RkUlT1x4MUVWXHhFMzh6ZmZLXFx4MTlceEIzXHhEM1x4OUInXHhEOVx4ODhceEUyXHgxOCpceEQ1XHhGMS1WXHg5RFx4QTdceDk2I1x4MDVceDAwXHhBNVx4OTUuXHgwOHtceDAwXHhFM1x4MTJceERFLFx4OTEzXHg4NHhceEY1NmhceEREXHgwMHtceEFFLFx4OEViXHgwRnZceEJCbmxceEIwXHhFNDZnXHhEMlx4REMmXHhFMVx4RUF4XHg5RVx4QkVceEJEXHg5MVx4RTlceDgyXHhGNjJXXHgxMFx4QzVceEUwXlx4Q0JceEVFRlx4RjRceEE5PzNceDkyXHhEQkhceDhEXHgwNlx4QTNceDBDXHhDNlx4QjlceDgwXHhBOFRceEY4XHhERVx4RTFceDg4XHgxN3BaXHhDMFx4QTRceDk2XHgxOVx4ODR5XHgxMFx4Q0FceDFFXHhCQVx4RDFjXHhGMEkuXHhCOVVsXHg3Rlx4QzdceDkwYVx4RjVceDA2XHgxRTlceDlFXHhENVx4RTZceEZFZDNfdlx4QjFceEY3UUBceDFGXHgxQ1x4MUJlXHhBMElmYFx4QjN2XHgxNFx4QTVceEVEW1x4OTRceEE1XHhFN1x4MTM/XHgwMVx4RjhceEM5XHhFQVx4RTcnXHhGNyZceEU4QVx4OTFceDFCXHg4OVx4MDBceEM2Y3FceEY1XHg4QlJceEQwXHhCQlx4MTVceEYwXHgxN1x4QjBzXHg5RkEsXHhBMWhceEVEXHhCNmJceDBEXHhDOXx9XHhERFx4RDJCXHhBRFx4Q0FdXHhCM1x4QUNceDhGXHgwRVN4T2hceEU0XHhDRlx4QkZceDlBXHhCOFx4OEZceDBFXHhGNktceEM5JmdceEZBOjtceDgxalx4ODFceERGJVx4ODEjYCdceEM4OVx4MDFceDE1Llx4OTI2Xlx4RDhceDA0XHhGQ1x4QjE5XHg4MjJceEQ0XHgwM2RceDg1Q1x4RjlbXHhERi5GJFx4OTllUWNCXHhDQV1ceEQ5Ulx4OUFceDdGXHgxMVNceEZDXHhBQ1x4QjQ+XHhBRVx4RDhceEY0XHgwNkFceDkzXHg5Mlx4QzRceEUxXHhFNlx4QzhceEJEbT1pXHg4RVBsXHhFQ1x4REJceDhEL31ceEQzXHhGNlx4RTZfZFx4RDJceDExXHgwNlRceEM5XHg4OFx4RTE4KFo3XHgxRFx4QkMkXHhGNVx4OURceDg1XHhBN1x4QjlceEYzXHhFQ1x4OUFceEQ2XHg4OVx4RTlceEEzXHgxQVx4MTNOXHhGM1x4OUFwXHgxNFx4RDRceEM1XHhEQVx4QTRceEI5XHgxN31ceDE5X3lceDk1XHg5Q3ZJXHhDNVx4RDNceDlDYFx4RDZceDgwXHhFMElceERBXHg5MFx4RjUpXHg3Rlx4RUM7XHgxNmdceDExXHg5Rlx4RER0XHhDQ1x4QURceEJDNkpceEQyRFx4RTVceEU3XHhDM1x4QTNBXHhGOTJceDBFXHhENTZfXHgwNFx4MUJZXHhBMSlceDBGXHgwQ1x4QzdceEQ4XHg5Mlx4RUJ2XHhFM1x4ODdceDFEXHgwMFx4QzdtXHhCNVx4ODdceEM2alx4QjBceDBDXHhEMlx4MDNceDk4Q1ZocUpceEQ3N1x4RDI8XHgxOVx4MDFceEQyXHhERVx4MUNceEREXHhGQyVceDhCXHg4RDZceDk5XHg4Mlx4MTVceEQ0XHhBRlx4RjMuXHg4M1x4OURceDFDXHhDQVx4QThceEQyMlx4QkJceDBFXHhEOClceEU5XHhBQ1x4QkFceEZFXHhBNVx4OTdceERDXHhDRlx4REZceDkwXHhCOC9ceEY0T1x4OThceDBGXHhBM1x4QTdceENCXHgwMlx4RkEgOVx4QjhceERBXHhCM1x4MDB9XHgxM1x4MUZIcjJIXHhFQmM+XHhEMFx4QTJceDE1XHhDOFx4REUtT1x4OEYgXHhGRFx4REZceEYzXHgxMFx4RjZceEVEd1x4OTVceEUzVFx4OEV2XHhGNHdceENBXHhDRlx4QzhceEMyMFx4MDBceEI5XHhENFx4RTZceDFEdlx4QzRceDA4bVx4QjhceDBCXHg5OFx4QUYyPFx4ODRceEFEIVx4RjVsXjZceDhGXHhBQVx4QkZORVx4RDVceDhDMjk5XHgxODliXHg5NGdceEE2XHhFOFx4RENIQ1x4QUI9Nlx4RjVceEMwXHhGNVx4QjRceEQ3XHgxRFx4RkFceDk0XHhBOVx4ODBceDhDXHg4Q1x4OEFvXHhERFx4OUFWXHg4REdaKyIhXHgwMlx4MDE9XHg5QVx4QkJ0XHgxOFx4QzZyb1x4RENceEU1XHg5MFlceEFBXHhGMUpceDBBLSNceEIxImFceEU5XHhBQlx4RTBceDg3XHhCQ1x4QzVceEVCXHhBRWg+VVx4QjhceEQzZ1x4MTJgPlx4MEZceEQ2U1x4MTQpXHhDNFx4QTk7XHg4RWpceDE1XHhCQVx4OTR1XHhFQVx4OTQwXHg5QVx4ODVsXHhFNypceEEydFx4RUVsXHhGRktceEY4fTVceEJCXHhGRDlceEJDXHhEOVx4MURceEY5aUpceEM0M1x4QTdceDkzXHhDRCZceEJGXHhEOWc0XHhGQVx4RkRceEI0XHhGQSBceEI5XHhCM1x4QkFceEVDXHhCN1x4Q0FceEZDbylceEVDXHhDNFx4MDNceEVFalx4OUZceEZEXHg5RU9ceEE4XHhDOVNceEE1LVx4Rjlnb1x4OUNceEVBXHg5N1x4MDVceERGTWEoXHhBOFx4MEVRQFx4QTBceDg2XHhBRTFceDE1XHhFOH4sXHg4Mlx4QkJdXHhCMVx4MERSOlx4RDBceEQ2XHg5M1x4OEVceEQ2Qm9ceEUwXHgwMVx4OUFceEQxXHhBQjVceERFJzhceDlFXHhFRlx4MThceDk5XHhEN1x4Rjh+XHg5Nlx4ODBceEYxXHhCRlx4RjJceDk4XHhFQ1x4OEYtXHhFMVx4QkVceEVEXHhCM3VceEFFNkslXltXKVx4MUFceEFGXHhBN1x4QTdceEU3aVx4RTFceDlGWVx4QURceEQxXHhCRVx4OEVpXHhDNlx4OTNQXHhDMlx4OTREMkxeXHg4QyhceDAyXHhCOFx4QUFceEU4XHgxQlx4MUZcIk9ceEY2W1x4N0ZceERFOStceEM2XHhCMmZceDgwXHgxQVx4REFceDAxT1x4QjVceDlFXHgwMlx4Q0NuV1x4Q0NnTihhflx4QzhGR3s1aGlceDgyXHhBNFx4ODFceEFGXHhBMFx4QTZceDlBezJwfGNceDlEW1x4Q0RceEFGXHgxNFx4RkFceDlCXHgxRFx4MTRceERCXHgxMlx4MUFceDBGXHhCRlx4OTY5XHhDN1x4REZceDhBXHhEN1x4RURceDhEXHg4MVx4REF4XHhENVx4Q0FceENDLFx4RDh3I1x4QjNceDE0alx4QzVSXHg5Rlx4MDlceDBCXHhEQVx4MDlceEJEXHhERFx4OThceEI5XHhDNzFceEQ5eVx4RkRceDFBXHhBMlRceEFFXHg5RU5ceDA3elx4QTNceDg2PjxceEU4SS5ceDg3d0tceEFFcy9ceDhCXHg4ODpceEFEXHhDMlpceDFCXHhGQVx4QzFceEI0O1RFXHgwMFx4MDF8XHhENyY1XHgxQyRceEFBXHhGRVx4Q0FceDlFXHgwRVx4QThceEVGXHg4N1x4QzRceDEyXHhFMFx4REVceDBFMFx4QkVceEE5bVx4RDdceEI3XHg5M1x4N0ZzXHhGQ1x4ODZceDk2XHgxMm9lXHg4Q1pceEJEXHhCNVx4ODQ0bHw7Rlx4MDdceDBCXHhDMVx4MDNceDk1YVZYXHhGOVx4QjNceEU0XHhDNFx4QzdceEE4Qlx4MDhceEM4ZkhceEEwYVx4OTRceEMyXHg5RV1ceEE0XHhFMVx4MTlceDE4XHhDM1x4RkJOXHhEMlx4MTNceDgyXHhDNVx4RTFceEI4XFx4MDBceEM5XHhDMzdceEFGXHhBQTlceEU1XHgxMFlceDg1XHg4Qlx4MEQrXHgwNVxceDg4WiNceEY3LFx4RkIgXHg3Rlx4OUZceEY5XHhCNlx4QjNceEJDXHhGRD1ceDkwXHg4OTdceEE3XHgwRVx4RTlceDAxXHgxNFJceEQ2XHhDMVx4RThceEM4XHhERiBIOFx4RjRceDFFXHhFM2lceEIwZlx4RUN7XHg5MFx4RTVYRVx4QjJceERDMFx4QzVceEU5XVx4REMlXHhDN1x4OUJceDg0OFlceEQ3XHhERU1BN1l4XHg5MVx4RjlceDFEXHhFMS0lUlx4N0ZnXHhCOFJceDEzUVx4RDdceDA1XHg5OCoiXHgwNUUjXHg5MFx4QzZceDk2XHhDQlNceEU3Vlx4N0ZceEIxT01jQ1x4RjlceDk1XHhFRFx4REVJXHhDMFx4RTNceDE4TFx4RjFceEFBXHhFM1x4OEYvXHhFOUVceEE0XHhFRlx4RDlsXHg4OTNceDEyXHhDOVx4Q0ZfXHg4RWIjXHhCRUFceEQ2dDZceDgwXHg4RVx4MDIiXHhCM1x4Q0NceDEzXHg4OVx4QjBdXHgwOShceEQ4XHhDNFx4RkQxS3JgXHg4Q0pja19ceDgxfVx4QTl7WFx4RDNiXHg4MTlceDA1XHhCOTZceEZDIlx4MDFxXHhCRV89XHhDRTxceDgzNFx4OERceERFXHhERixceEU3QHtceDkwOFx4MTVceEY2Klx4RENceEE2XHhCOSF2XHhBRVx4N0YqXHg4MFx4RDcuKHRceDBEXHhBQlNceEI4b0xceEZGXHg4RXtQXHhENSRceEY5XHhGOEV1JnE2Ilx4N0ZceENDXHgxMlx4RDA7Slx4MTVceERGXHhEMFx4RDFceEVBRT8gXHgwMThfIVx4OEZceDEyXHgwRidceERDXHhBQilceDg2SlQ4XHhDNVx4OEZEXHgwQ1x4Q0FceDA2XHhDQlx4ODB1eVx4MUZoXHg5Nlx4QjBceEMxXHhEN1x4QzdceDFFXHgxOFx4MERceEQ3XHg4MFx4ODFceDBCXHgwQlx4QTdBXHhCRFx4OTBfTFx4RUZceDBBX1x4ODdceEM3XHhGMVx4MUFceERCXHhERlx4OUFceDhCXHhEM1x4OTRaXHhDRmZceEJFalx4RTlceDk1XHgxMFx4MDVceEY0XHhBQ1x4RTR0XHg4OVx4RjFSXHgxRFx4MDJsXHg5Nz1ceDAxWVx4MDFbXHhDMFx4MTdceEZGXHhCMFx4OEI7PVx4Q0FceEVFXHhGN1x4QzBceEJBa1x4OENceDEwRCFceDAwXHg5NEpceEU0MFx4QkJpe2dceDlEa1x4MUNceDBGXVx4OUJceEU3XHg5NkxceEYwXHhGMVx4Q0NceEJFXHhBOXBceDA0XHgwRFx4MEJceEQ1VktceEJDXHgwOVx4REZceDE3XHg4Q1x4RUNHfl9zXHhCQVx4MTN3XHhEOVJSXHhCRFx4OEFceERBdFx4QzdceEEzXHgwN2lceEYwXHhBN1x4QTlceEI4XHg5OFx4QkVceDA0XHgxM1x4MDRceDFBXHhGRFx4RUZceDBGXHhFQlx4QTZXXHhENm5ceEZEMGZlRVx4QUNceDg2XHgwRlx4QzBceEVCXHhERiJceEFDXHgwMlx4QjNceEU4XHgwODtjXHhBMVx4MTlNTlx4REFYXHhBMU9ceDA3OFx4QjVceEE2XHhFM3JceENFQ1x4MUNceEE4XHgwQlx4MEY8XHgxNmgyXHhFOFx4MTFCXHhERVx4QkFceEM2XHhGMlx4OTRceEZFNlx4RjNceEU4XHgwNVM2RFx4RUZceEVEOFx4OENceENDXHhEQVx4RUFceDhGXHhGRlx4OURiXHhBNlx4QjdceDFCZitdUVVceEMxXHhCOWZceDlCe1x4RkNceEJFXHg5M1x4MEJceEE0XHgwOFx4QkJSXHhFRVx4Qzc5XHhEOFx4RTZceENFKEBaXHhFRXlceDBCUlx4QURceEE0XHhERiQxXWhceEVBflx4RENceDEwelx4QjNceENGXHhGNVx4RkJceEIwXHhDMUhFREJceEY0XHgwM0VNUFx4QjRceDBBbFx4RjJceDhBXHhEOFx4QTVQXHhBN0pceEVEXHhDNlx4OTJceDhDXHhCRFx4MTJceERCXHhEM1x4REJdfkFceEREaFx4RDVceEMxXHg5MVx4QjRceDE4WFx4QzNceEUyd3wrXHhEQlx4MTNceERDMVx4QzFceDEwXHhBNlx4OEVceEIyXHhEQlx4QUIqXHhBQ1x4MEVCXHgwMi9ceEZFXHgwMilceDg3cFx4QTJceDlBelx4RjQjXHgxOFx4RjFceEU5XHhDOFx4Rjg3Rl1ceEQyXHgxOTciPVx4QURceEM3XHg5MnJceEFEXHg5Mlx4QzUiXHg5OFx4RDJceDE0XHhDMjVgXHgxN1x4ODInXHhDQVJceDdGXHg4Q1hMXHhFQlx4RTNceEM3XHhCRVhdXHgxN1lceEVCXHg3RkhceEY3XHhDQlR1XHgxOStqXHhCQ1x4MTNIXHgwMVx4RjZhXHhBNVx4REVceEY0XHhGNk1ceEFFXHhBMFx4MDdxXHhFOVx4RDdceDExVi1ceEREVVx4RkNceEE0fVx4RjdceENCXHhBNlx4OTdceDkwXHhBM1x4QzZceEE4O2FceEJENlx4RkFceDEwXHg5OFx4QTJufVx4OThtXHhERFx4QzlceDk4XHhGRFx4MTBceEEyXlx4QTZdXHhDOVx4ODJlMlx4RjBWXHhCMlx4QzElXHgxRVx4QUJkNVx4RTFceEYyfVx4MDdceDgzTlotXHhDNlx4RDNGXHg4Nlx4RUVceDEzXHhGMFx4RDlceDlEdEBceDFFdlx4OEJceEZFXHgxQUBceERGXHhEQVx4RER+XHhDOCxceEYzXHhGM1x4RERceDgyXHg4MTg1Ilx4MUZsKVx4MTlceDEwSlx4RUJceDkyXHhEOCNceEZGI1x4QkNceEFDfFx4OTNceDBDbVx4QTlceEIyXHgwRTNueUtceDA5d2ZceEE3XHhCRCwiOVx4ODk+XHg5MSJ0XHhGQlx4RThEelZ+XHhEOFx4Q0ZceDBEXHgwQVx4RUVceEIwXHhFNVx4QUFceDhDXHhBRlx4QUQ8XHhGM01ceEQ0XHhGRVlWXHg4QVZceDA1XHg4N1Z6TVx4RjVceERGXHhDMVx4MDNQXHg4Q1x4MDJceDlBflx4QkJceENFXHhDRFx4Q0ZceEQ1XHhGRkJceEQyXHg5N1x4MTMjXHhBNFx4QTNceDlGXHhBOCdceDAwUDJqXHg4NVx4RjF0XHhCQ1x4OThrXHhDMV1ceEQxXHg5NVx4OUZceDk4XHhBRlx4ODBceDFBN1gsXHhBRXBRXHhFNFx4MThQXHhGMj5dXHhBQVx4OUNHXHgxMVx4OTNSXHhGOE9ceDE1XHhDOVx4RDBtWlx4QkJceEZGeFg1PydGJlx4QTJgNlx4QkJceDFCXHg5NFx4QjRceDhEXHhBNXFceEVEVWdceDE4XHgwRVx4QzNceEMzXHhFOFx4RUVuXHg5QVx4QjlceEZGXHhBNFx4RUMpPlx4QTZceDE2XHhBRSZjM1x4N0ZceEQzXHhDNlx4OEJcXHgxRlx4MEZceDdGXHg5M1x4QThceENBXHhCRWN0LXcgclx4Q0NceDBEXHg5RFx4MUVaXHgwNVx4QUFceEM5XHgxOVx4OTVJNVx4RkQwQ3tceEQzNFx4QjlceEE1XHhFNFx4Q0RceEE1XHgxRSNceEU3Llx5XHhDNCtceEU4fVx4RkNceEQ0XHhDM1x4ODFTaVx4MDViXHg4RVx4RkFceEY5XHhBM298XHhCMlx4QUJ1XHhGOFx4MTBceEU5XHhCRj9ceEQwO1x4MENcWVx4QUNceEJEXHgxMFx4RjFceEY1IV1seFx4RTZceEM3XHhFMFx4MUVceEJFXHhBNVx4QjBUXHgxQlx4MEFuXHhGRTZceEVBXHhEQVwgK1x4RkVceDgzXHhFQ1x4RjNceDhEXHhFNlx4RkQqXHgwQVx4REFceEI2XHhGQklceDhDXHhCMFx4OTZaXHhGMkVceDkxYVx4QkZceDdGYlx4ODFtXHhBOGQ6Ulx4QUNceEU3XHhGQjlkXHg5RVx4Q0EwMlx4QTlkXHhGOVx4RDdceEI2XHg5N1x4Q0RceEUwXHhBMntceDFGXHhGRFx4RUNceDg5XHgwNlx4QjJceDEwXVx4OEJceDBFXHhDMD9ceERFXiZSXHhFRkMpP1x4QkVceEY0XHgxMlx4MENceEQ4XHg5QlhceEZFXHhFNFx4OTElIVx4MUUmRFRceDlCVi9ceDFEYlx4RjJbXHgwMVx4QTFiT1x4QjF+XHg4NVx4MDlceEJCXHg4M1x4REZceEJCXFx4MDhXXHhGMVx4MDhceEEyXHg4MlBceDk3XHhFRGVceDBFYThceDk0XHhGMlx4RTddXHhCQ1x4MTVceEQ4dlx4QjZceEZEXHhCM1x4RERtXHhEMn1GXHhCNVBceENBXHhDQ1x4OUNUXHhBOTNceEIxXHhDOVx4MDMwXHhDOCJceDFGPVx4QTNceDFGXHg5Q1x4QjRlXHhENFx4QUJkXHhCQn1xdFx4Q0RceEJFXHg5N1x4ODRceDgyUVx4RjZceEJCXHhGRVx4OTdceENDPFx4MUUnXHhBMFgyPVx4QjRceEVCTlx4OEZceENGXHhBNHRceDAxUFx4MTFceEQyU1x4RTBceEU0Wy1ceERBXHhEOFx4QTFceDkxXHgxNmFrXHg5N1x4RkY2XHhCMXhceEM0dlx4RTd9dUssXHhCMFx4MUQmXHhFOVx4MDlceEYwXVx4RTZceEI1XHgwOGxceDFGXHgxRlhceEJDXHhBMVx4QjlceEFCXHgxMlFyI1x4RDUzXHhCRFx4QzFnXHhBNVx4RTlceEVGXHhCMUBceDAzXHhDNlx4RTRceDE4XHhERFx4OEJceEVGR1x4MEVceDA3R1x4RUJceEJDdlx4QzcjXHhDMlx4ODd5V1x4MEIyWFx4OUVoXHg4Q3lzXHhFN1x4ODA0UFx4OUVceDlBXHhBMlx4QkFyXHg4NFx4QkJ2fVx4REVceEM1Q1x4Q0RceDhEXHhENFx4RUZceDdGJFx4ODJceDk3XHg4OVx4MTJceDA4e1x4RTQ2XHhDOHFceEM0flx4ODRceDEyXHhBQT5XXHg4QUI4XHhFOVx4OUFTXHgxQlx4RjZhQFx4MThceEE2XHg5Rlx4MTFKXHhCMlx4QjZceEQ4fUJceEZCXHgwRDxceEUwXHhENzBceEYxXHhGN1x4MUFceEU2XHhCNFx4QTlceDAwXHhDQVx4QUZceDlBN1x4OTlFXHgwRlx4QTRceEE3dFx4RjJ5cFx4MDVceDFEMCZceEYzXHhEMXRceEI0XHg5OW9ceEQ4XHhCRlx4RDlceEMwViI+XHg5RFx4OTFceDBBWm5IXHg4NyNceDBCc1x4Qjk1XHhGN01ceEU5XHhFRW5iZ1x4QkN+Ylx4MUNceEJCXHgwRk9pXHgwQ1x4OTVceEEyXHhDNVx4ODdceDhCXHhDN1x4MDhceEQ5XHhDQmFceDBFXHhDQ1x4MTNceDg5XHhEMFx4MDJceEY2Ylx4OUJceEMwXHhDQ1x4QUZceEQyXHgwMlx4MENceEFGXHg4MDNyXHhGNFx4MEFceDk4SFx4MUZIKlx4QzZYTVx4REVNXHg5Q1BceDg5XHhCMVx4OEZqXHgwOD1ceEQ5XHhGOTx+XHgxOWJceEYzXHgxMlx4MDZceDhCSHpUXHhFM1x4QkVceDFDXHg5Qlx4Qjl3eVx4MDdmXHgxN1x4REJceDBCIlx4OEJceEUyP1x4QTlceEY4XHg5QyxLZVx4OUZGV1x4RjNtIlx4REVMXHgwRFx4RTlceDE3XHg3Rlx4QzVceDlCOVx4OUFceEFBXHhCNGQqQENceDkxaVx4ODZceDg5XHhEM1x4OUJuXHhFMixceDAwUlx4RDJceEIyXHhFNCVceDk2XHg4RFx4Q0FceEEzXHg4Qi9ceEFCZ1N+XHgwMmtceDkwXVx4QzJcXHhFRFp3XHhDN1x4Q0FceEQyXHhGMFx4ODlceENGXHgwRHApXHgxM1x4QkN6XHgxM1RceEEyfVx4RTVceEU2XHg5N1x4OTJceDExXHgxMVImXHg5Qlx4QkFceEU5XHhBQjVceEQ1cFx4RTRrXHhDQlx4QjRceEREXHhEMFx4Q0NceEIxXHhEOVx4Q0FKXHg3Rlx4OUVceEE2V1x4OTlceDFFXHhEQVx4QjBceDFFOnBceDhCXHgxMlx4OEZceEQ2XHhGOFx4QTVceDAxflx4Q0V5XHhCMDhceDAzLHAvI1x4QUZceDlBXHhGQlFLXHhFM1x4ODUjXHhFMlx4RkN4PXokXHhDM1x4QkEvOGNfXHhCM2hpXHhEMFJtXHhEMFx4QURceDBGXHhBRTNyXHhGNFx4MEZceDk4YjNceDBCXHhGOHNjaVx4QTFoXHhDMlx4QUFQXHhENVx4QjA9Plx4RUM4XVx4RDk8XHg4N1x4RDFceEI3UVx4RDlceEY1XHg5RVY+XHhBQyxceDk2XHg4RVx4OUJJblx4RjNceEYwXHhDNVx4RURceEYyXHhFNFx4RENnXHhBRlx4REFceDlGXHgxQ1x4RERceDhFN1x4QkVceERCXHgxQWpceEFCJlx4RUZceDkyXHhBMFx4QTJeK1x4MER2XHg4MVx4QTBceENBXHhFMGZceEQ0XHgwMmoiXHhFNXFceEQ4XHhCN1x4OTB2T01ceDhGXlx4QzZAXHhBN2A5XHgwQjx7XHgwNklceEY3d0xceEM2XHhFRlx4RjFqXHhCRiRzb1x4RjJceEExXHhFM1x4RURceDg5alx4RDlceEMwXHgwNFx4Qjh6XHhGMlx4RjZle3hceDk1XHgxQlx4ODJceEE3XHhDNkBceEU4MlRceEZEXHhDREZceEJBeFx4ODZceEE5XHhCQ1x4MTFceERBRFx4MDBeKWNceENBXHhBMlx4RkNceEJFXHg3Rlx4MTNvXHhFRFNTYlx4OTVceEMya2ZceDhGXHhDQVx4QUJceDE1XHgxQl1WXHhCN1x4QTNceEU5XHg4RHtHXHgwM1hceDkzXHhGM1x4RjhceDFDXHhEOFx4QkJOXHgwQlZceEM3XHhCN1x4OTRQMl5ceEZBXHhDM1x4OEZiXHhGQTNceDA4PkdceDlCT1x4OUJceEFDZVx4RjNCXHhFMDctXHhERFx4OTlceDFEMXtwKFx4RDdceDlEXHg5NU5ceEI3XHhFNzVceDg5XHhBMVx4RTNsXHg4NFx4MURceDlFXHhDNmZceDdGXHhGNXAzWlx4MTVceENCXHg4NFFyXHhENVx4MTZceDlCXHgwMlx4RDNceEU4XHgxNFx4OUYsXHhGNVx4QjAgXHg5MFx4QTlceEY3XHhBN1x4Q0RceDgzXHhERFNceEU4JW1ceEY2XHgwQlx4QzEhXHhBNVx4RDhceEU2XHhBNS5iXHhDOSZceERCSiZceDE3XHhGMXY6elx4RDR2XHhERlx4MDlceEIxe1x4QzBceEMyXHg4NVx4MDJceDFBNFx4REZceEFGeFx4MDJwXHg5Qlx4QzVceEYyXHhERnNceEVCN1x4RDZceEYyXHhCRVx4OUZceEQ2XHhBOXVceENDXHhCRVx4OTMtXHgxMlx4Q0NceEI2XHhDOVx4Qjk0XHhFNFx4QUJULDgiS1x4MTVAXHhFRFx4MDVceDk4eVx4Q0ZceEUyUlx4RURceDgwXHgwRlx4QTBxXHhCNCtceEMyXHhCMlx4MDhceDkxXHhDNlx4OUJceDE5XHhBMlx4OTZiXHgwOTJceDFFXHhBOGVedFx4MTBceEEzL1x4QTlYXHgwQnNceEMwXCNceEVCO1x4MDBQdG5ceEM4XHgxQVx4Q0FceEIyXHhDMlx4RjlceEQxQEdceEQ0XHg5NVx4RDFceEMxbi9ceDFCXHhDQ1x4QTJceEM2XHhCMlpceEE4XHhFOVx4RjBceEY5XHgxM19XLVx4OTJWXHhEN1x4RDJkQzxceEIxXHhBRVx4OTAiXHhFOT8rXHhFODdceEU2XHhDOVx4MDQwLFx4QTJceEJEIHl2OzJceEMxXHhCOFx4MEVKJVx4RDVceEJBXHg4RVx4QzJHXHgwQ1x4OTNceENBXHg5Qk9ceEZBXHg5OVx4MDJceEMxO1x4QzNceEM5XHhBN0dceDE5XHhBMGgtXHhDQlx4MDFvXHhGN1tceEU4LVx4OEFceEZCXHhDOVx4Rjc6eGY+XHhFQWNceEEyXHg5QVRceDgyXHgwRkFqTlx4RTFUYVx4QUYjJVx4RDhceDA5XHhBNFx4OTRceEFCXHg4N1x4MDZceDAxJVVdVFx4RTRceDdGXHhGM1x4RTQpXHgxMVx4Q0FceEZGXHhDRVx4MDRceEFBK1lceDBEV1x4RTVceEJGfVx4OEVceDgzXHhCQlx4MTAtXHg4Mlx4RDJceDExXHhDQ1x4QjRceDhGXHg4RVx4OTBceDk0XHhGM1x4QzBceDg1XHg5RGxceEY2LFx4REZlX1x4MTBceDBCRzRceDgzXHhCOWMmXHhDQlx4OEZceEYwXHhEQlx4QTE8c1x4OTZceDE3R3NqXHhCN1x4RTBceEY3OXY1XHhCOVx4RTZVXHgwN0B+XHhFMFx4QThceEFGXHhBOVRceDA3XHg4NV5ceEM3PVx4QTlceEZDXHhCNSpTXHhFOWtceDA3QFx4OURceEY5e1x4RTdpZ15ceDg3XHg5Nlx4QzVceDhGWlx4MUVceDlGXHgxNlx4QzdceDlEXHhDQ3hceDk5XHhDRFx4RjNceEU1XHhGQlx4QjhUXHgxN3U3bVx4QTdceDgwelx4RDFceENBUFx4RjNceEJBcnYhcFx4ODNceEU1XHgxNjRGXHgxRDZceDdGXHgxQVx4RkZceEIyXHhDNVx4RDFceEYxXHgwNVx4MUNceDA0XHg4Nlx4MTdmXHhEQk5ceEM2XHg5MFx4QTk1XHg4OVx4MTdKaFx4QjFAW1x4OUJceDgwbDJceEVDXHhEM1x4MThceDlBXHhBNmM1XHhEOCpceDlCXHhFMFx4Q0IhK1x4QzdceDhBXHg4Qlx4RDdceEQ5XHgxMlx4OEJceEIyXHhFOFx4MURyXHhFOVx4OTBIXHg5RFF3XHg5N1x4RDJceDA5XHhENVx4RDRWXHhDMkBceDBBXHhBODcnXHg5NVx4MTlceDg2XHg5Rlx4OTBceEJDaSNceDE2XHg5N1x4RDZceERDfVVceEQzXHhCMk9ceDlFXHg4Qmk7XHhGRGtceDA2XHhCNmNceENFaW9ceDhGXHhDRlx4QUJceDE0Jlx4Q0MnXHgwQ1x4QjJceEI3O1x4MUVceEE3UWdUc3JrMmdJXHhCQVx4QzZceDAwXHgwNFx4OTFlXHhGMkUzXHhEMlx4RkFceEMyXHhEQ1x4OUZceEFGXHhEODdBVVx4QkFceEJGXHg4N1x4RDhceDA2QVx4RkJqXHhDQnIqXHhGRFx4Q0ZceEM3LFx4RTZXcVx4QzYkIlx4QThceDlDI25bXHgwRlx4OTZceENGXHhDRVx4MDhDXHhCMVx4QTRceDg3XHhFRFx4MDBceEUzX1x4RDcjXHhGNHNceEY1Rk5ceEE0K1x4QTIzRVx4QzZkXHhENVx4QzR9W1x4N0ZxIlx4QTlceDhEXHhEMVx4MTNtXHhCMGFoOVx4MEQ4XHhEQ3lceDEzXHhBOFx4QkZceEUyXHhGNi9ceEJDXHgwRXdceEY2U0hLXHhDOVx4OTMgXHhEM1x4OENceDhDXHhBNjwwcy1ceDAwXHhFRmZceDhBQ0Z1XHhCN2JceEU3XHhGMFx4MUFceEM1XHhCNlx4MUZceDhGdVx4MDV6ZFx4QTBceEJEXHhCNXZceDk2Mlx4QkVceDlGRVx4MDBpR1x4ODR0XHhGOCRLXHhBRVx4QjlceEYxa1x4RDRceEQ5XHhGRFx4QThceEFDZVx4MUV1cmBceEMyXHhFQ2ZceENEcDlhPlx4QzY0XHgxNHYyflx4QzlceEU3XHhBMlx4QjBZXHg4NVx4MTgpXlx4RjFceEQxXHhFRUpceDhDXHgxQlYhYS1NaFx4RTlceEM3XHhFNTZuTD12Zlx4MERceDA3XHhDRTNceEYwQmw6XHhEN1x4OEVaXHhERVx4RkNceENEWGZceEI3XHgwODhceDAxRmNceDdGUVx4MThceEYzXHhCM1x4ODFbXHhCNjhceEZCJVx4OEExXHhCMFx4RDVceDk0XHhDOFx4OENceDBCXHhGRVx4RjApXHg5N1x4RENceDgzQVFceDEyXHhDREdceEZFXHhENFx4RDA1XHg5MXFNXHhERVx4RTVceDk4XHhENlx4Q0RceDkwR1x4ODlceDg4XHhFM31ceEE0XHg4OSNceEQyXHhENFx4RTQqXHg5N0hceENGXHgwM1x4MERceEU2XHhDQi9ceEM5REtceDA5XHhBNE9ceEM5Llx4MDIkXHgwRmlceEQxXHhCNlx4OUZceEQ3XHg5OC1NXHhFOFx4RDdPXHhDOVx4REFceERGalx4MTJceDkyJlx4QzZceDEzXHhFRG9ceEYzXHhFNlx4QTJceDgwXHgxMFx4OTBTXHhCNlx4Q0VceDAzXHhFMlx4OTFceDlFXHgwNWFceEMzPVx4MThceEI3XHhDQ1x4MUNceEE0XHg5NndceEZFUlpceEEwXHg4Q1x4MUZceDA5eFx4QTFqKjJceEYyXHg5M1x4QkRceDlBbmBceEVFQC5ceEZETlx4QTRceDFGXHhCOFx4RUVceEU3XHgxMVx4MEVceDExXHg4OFx4RkZaXHhGM1AjOVx4MTFceDk3TFx4MTQiXHg5NzVceEU0JzkmXHhFN1x4RTNxXHhCM0xceENGXHgxRmNyY1FceDlCXHhDMFx4RTFceDFEe31ceDlFXHgxRn1jXHg5RVx4MDdceEM4XHg4Mlx4RkVceEMyXHg5Q09ceENFQFx4RDNceEU4K1x4MDVceDgyXHhEMlxceEUxXHhDMVx4RTZceEZGXHhBNVx4MDVceDBGXHg5Rlx4QThHKlx4QzdceDhDJFx4MDN1XHgwNWlceDgxb3pceEREXHgxN29ceDAxXHhDRlx4OEJceEMzXHhCNFx4RUFceDk3ZFx4RDlceDEzXHg5OVV1XHg5OE5ceEMwfE1ceDEwXydceDFBXHg5QWJRXHhDM1x4RUNceEIwXHhCOVx4RTNceEIwXHgwM1x4RjM+XHhGQVx4MDhceDhCXHg4MVx4REN0XHhCOVNceDE1XHhDNFx4QzVceDgwN1x4Q0FQX1x4MTBceDA0XHgxN1x4MDNceEIxKlx4QjJ1XHhDMlx4QzcuXHhFNDV4L1x4RjVceEQ5XHgxNGhceEI0XHhEM1x4RkV5XHhCM1x4REZceDA5XHg4RVx4OEJceDg4XHg5RFx4QzJceEEyXHg4Mlx4ODNceDk1XHhBN0dceDFEb1x4MDZceEFFP1x4QkM+fjRceEY1XHhFMFx4QUZceEE5XHg4MFx4QjFceDBFUVx4RDVceEMwXHhBMlx4ODY9XHhCMHdceEJGXHhEMlx4ODhceDkwfG9ceEMxZiJceEQ2XHhDRlx4QTR1XHhGOTBceEZDXHhGQyVceDBGXHgxMVx4OTVceERBXHg5RFx4Q0N1XHhDQVx4OTlNMjFrXHhCOVx4MUFjVlx4QTVceDk5XHg4Nlx4MUFceEFEXHgxRlx4QjhceEZDYlx4QkNceEIwWFx4Q0ZceDhDXHhDNzpceEMzOFx4RDJceDFCXHhBQlx4MERceDFEMVx4MTRRQFx4RTgoXHgwN1x4QkQ8N1x4MTdQXHhGQlx4RjFceDlEXHhFQlx4OTRceERCXHhBRl9ceDA2XHhCNU1ceDg0XHhFRC5ceEQ0XHg5NyFxXHgxNFx4RDRceEEyXHg4MzgyXHhGRFpdXHgwRVx4MDJrXHgxNFZceEU5Vn5ceEM3XHg5OVx4RURceERDXHhCQV9ceEMwXHhCRCowXHhDNVx4MTBceEFDXHgxRlx4RUVceEJBXHhCQVx4OThceDFDXHgwRUVceEY0XHhBNVx4RkFceEU0OVR4XHhCN1x4QjViX1x4QUEyXHhGMHomUlx4MDRmK1x4Q0I6Rmt3JyZceERGXHhCRSVEXHhBNyZoYVx4QjRceDBEXHhENFx4MENceEE0XHhEQlx4RkZceDBCdFx4RTlceEU3VD5VXHg5OVx4QzBceDFFXHgxN1x4QkJceEU1fUFOXHhGMVx4MTZIXHhBOFx4QkRceEZGZlx4OTdceDEwV1x4OTVYXHhDRVx4RTIueFx4RUZceDBCXHhGN3YoUlx4RkRceEE4XHgwRj1ddH1jZDdceEM1dlx4ODJceEM4XHhFRVx4RTU7XHhFM1x4QzRceDg4XHhCRlx4RkVVS1x4REFceEM3XHgxMlx4RDlceDlGXHhEQVx4QjBceEUzXWlceEYyXHhFNlx4QzdceDFGXHhEMFx4RjFceEZBTzVceERBe1x4RUNceDAyZlx4RUFceEYzXHgxNGdceENBXHhEOFx4QjFNXHhBRVx4RTFceDk4SVx4QTBceDg3TCk8MnhceDFCXHhFM2ZceDhFXHhDRFx4MEFIV2FceEI2Ylx4MEVceDgxUFx4OTBceEMxXHhGOEtbXHhGNWlceEJGXHhCRVx4MDhNXHhBOTdceEFDXHg4RFx4MTFceDE2XHg4RFx4MDFceEFESFpceEY0XHg4QVx4RUQ3XHhFRVx4RUN6XHg5NVx4QUNceDhGXHhCNFx4QTFceEE1XHhDQTJKXHhCNVRTXHhGNVx4REJceEVDeUIvXHhERVx4QThceERFZDZceEUwXHhERTZceEJBXHhGMWRceEE5XHhFN0I/T1x4ODdceEUzSVx4QjhceEU1XHgwM1BbJlx4QzNceEJDa1x4QkFceDE4O2FceENCXHhERVx4QzIyXHhEMy5ceEYxXHhCNVx4QzVceDkyQHxgWV5HXHgxRj1tXHhFMlx4MERceEQ4J1x4MThceEVDbil7K1x4RTZceDk5KVx4OUUsPlx4RkNceERBXHhDQlx4RTBqXHhCRmNceEI5XHg5Nlx4RjdceDg4XHgxNmViI35ceEI3XHhDRDhceDlFXHhCRTtceEI1XHhCOFx4MEJceEUwXHhDMVx4QzBceEMzXHhGOVNceDAxeFx4RjlceDlCWVx4QTBceEU0XHhBQ01ceEVDN1x4MURKXHhFRGh4Qy9ceEEyO1x4ODVceEIyXHhCN1x4ODAsIlx4Q0JceEU5XHgwNFx4MURyXHg4NVx4MUFceDAxXHgwRlx4RjJ5dzRceDFFXHhGN1x4QjNceEFCIyZceDE4XHgxM1x4QkZceEVFJ2NceDAwdm5ceDhEXHhGRFx4RDVHXHgwRlx4RTgrWm5ceEMyIFx4MTVceEExXHhCQlx4MEFiVlx4Q0VceEI4XHhFN1x4MDBceDBCXHgxOVx4OTJceDkzXHhBOFx4QkVceERFO2RceERGXHgwMERceDEwXHhCOVx4MDhceEVCXHhBRlx4QTBQXHhEQlx4QThceEQzXHhENlx4REFceDlBXHgxOVx4QTlceEQwXHhCRlx4MEVceEM4PVI7XHhGQ1x4QzlceEQ4YHgzXHhFQn1ceDg5XHhEQWdBdlx4QjVceEJCXHhGMVx4MEFceEFFXHgxMlx4ODVceDhBXHgxRFx4MTBceDhGXHhFOFx4OEVma1hceDA1Olx4QjZrbVx4RUJceDE0XHg3RkUiXHgxN1x4QzA2RVx4QzNceEE3XHhFQT1ceEIxRjYzJVx4MUIhXHgxNVx4QkRceDhFXHhCOFx4RTdEXHhERVx4RUJceEE5XHg4MFx4RTdceDA2XHgwNFx4MEFdXHgwQVx4RkNceDk4bVx4RTNRazNIXHhCNyBceEY3QFx4MUN1XHg5OFx4QTRceENCTF9ceEQ3XHgwRFx4RjFlXHhEQlx4QkJceERFXHhFRFx4QkJyXHg4Rlx4RTJceEVGXHhFOVx4OEJceEVFXHgxRSBceDkyXHhCOFx4RjlceDgzKVx4QzRceDBBXHhENVx4QjZceEIyXHhBRSFkXHhGM00rXHhCND1ceDg4XHg5RmxceEVFXHhFODd4XHhDNFx4MDFceEI0XHgxQ1x4QjU5Llx4QTFXXHhENTFceDA0XHg4N1x4MDJtLUBeXHg4RFY1XHgxRWVceEY0eVx4RjVceEM3IVx4Q0VceDhCcFx4ODBceDFBQlFceEUxXHhDN0RceDg3XHhEODRceEE4XHhCMVx4OThceEQwW1x4QjRceEUyXHhCQkpCXHhCNlx4RTRceEZGXHgxRnhwXHgwOVx4OTVceEE1ZX5ceEY1XHg5QVx4RTFceDkxQlx4RTI+XHgxMFtNXHhGOVx4OTJceEI1XHgxMWBxXHg4NHNceEMzdFx4ODIlXHgxNVx4QzdceDg5XHhGMz0yXHhFQlx4ODJceDAxXHg4MVx4QjdceENDeCkyYFx4Qzl5J2tTdlx4Q0VVXHhBRVx4RjdceEMxXHgxNlx4OThceEM2XHhFQ1x4RDlceEFGXHgxQXlceEVFP1x4MUFrRFx4RTJceDE0XHhBMlx4QTIjXHhBMVx4RDlDJ1x4MEJNXHgxQXRvXHgxQVx4MTllXHhGRlx4ODJceEFFXHhBMSRceEVCXVx4RUR6XHgxRDlceDk5bDtHXHhCRCZceDBGXlx4OEJceDg5cCRceEIwXHhFOChwXHg5MGRceDk2XHgwMlx4RTRceEM3XHgwMnZceEU5XHgwRFx4QTJceEJFXHhFMFx4OTc5XHhCQlx4QjNceEE5XHg5Nlx4MUU6XHg4OVx4MTVceEFCO1x4OTQlV1x4Q0NceDBGXHgwRXZgXHhBMWRceEYwXHhCRGFNXHhDQVx4OURceENDXHgwM1x4RkZceEVCXHhGN1x4RTFmXHhCN1x4MEJceDhGXHhCNnY/PFx4MTMlTGRceDg4eVx4RTVceEI3JVx4QTJceDgzXHg5QVx4QkU2IVx4Q0RceDlFXHg4RjZceEU5WkVceEVFXHhGOXxceDE1e1x4QkFceDAwXHg4Mlx4OTdcZlx4MUNeXHhFOVx4RjVceEM5XHgxNFx4MTAzXHg5NjdnXHgxNFx4Q0JceEUwI2pceEI2XHhGRFFceDlGelx4RTFceEU4XHgxRVx4RkZceDkyXHhCOFx4RDlceEUyXHgxNFx4QkRceDAyWHFceEU3fmFceEJEYVx4OUNceDgyXHg4NFx4QTVceEEzXHhBQVx4MTNceEZBXHhCQVx4QUNceDkwLlx4OUZceEVCXHhFMUFeXHhFRVx4QjVceEM0XHgwMlx4MEUrXHhBRjxceEY1XHg4Rlx4QkVlXHhGQ1x4RjFTQzBceEE5Klx4Rjc1XHhBOFx4QUQvLlx4OEJVXHg5NklceDkwV1x4OThceDFCMlx4QzZ+XHhGNFx4Qzc5JXNceDFGXHgwOFx4Q0RceEU2XHg4NkVceDAya0hkZFx4ODRceEJBXHgwQT9ceEEwXHhCNlx4ODZceDFFXHgxRVRceEY2XHhGMFx4MDd2XHg5MF50XHhBRVx4OUFceDk2N2lceEY5XHhBRlx4ODIwXHhFNFx4Q0FceDg1ZVx4MTdceEY1XHhFMFx4MTZ4XHgxQlx4ODdceDlBXHg5RDREXHhFMlx4QkUsXHhGM1RFXHgwQ1x4RTNceEEwXHhBOFx4QkNceDA5XHhCM15UXHhDNVx4RjFceDE4XFx4RDRwUiZJXHg4Q0FceEZEXHgwQ1x4OURVXHhBRWtceDEzXHhEQlx4MDBpW1x4MEJyXHg4OVtgRlx4OTVceEU3XHhCMFx4RkFceEI4XHhEQVx4QTNceDA2MWRceEU0KVx4RjFceDBFXHhFQUtceDgwXHhCM0FrXHg5OFx4MEFceDA3K1x4QjEzXHg4QVx4RUMjXyZceDBEXHhFQVx4Q0VceDA3XHhERlx4RjlceDE2XHgwMVx4Qzl3XHhFRlx4RUFceEVGXHhCRlx4QUFceEFGcVx4RDJceEEyXHhEOX1ceEEwXHhBQihKXFx4MUFceERGXHhENWFceDhCXHg4N0VceEZEXHhENlx4RUFzOkxxXHhDNFx4MEFceEI1SVx4OUVceENERVx4QUJceDlGXHgxQlx4RDBceEJFXHg4M1x4QjFhXHhFRnxceEJFYlx4RkJceDk5aVx4ODlceDgyPCdsQlx4MUVceEMxSD9ceEFFTVx4OTZceDFDRFx4RUIyNmxceDEzXHhBMVx4OUFmXHhDQTU2QWtceDBCXHg5Rlx4QjFSXHgwNlx4QTQ7XHhBM1x4RTFceEVCXHg5Rlx4RTdceDAxXHg5RGkrXHgxMHdceDg3XHgxOVx4OTRceDdGXHgwMFx4OThsOFx4Qzk+NSJceEVDXHhDMWJhXHg5NVx4QUFceEJEXHg3Rm1ceDExXHhFQVx4QjFceENDXHg5OVx4RTJceEIxZ1x4OEZceEE3XHgwMlx4QzRceDExXHg4RHt9Llx4RkJceEJDdjYoN1heXHhCQnlceEI2XHhGMVNQXHg4M1x4RjZceDlGXHhBQlx4MUJceERBaVx4QjRceEM0XHhFQmVOXHg5MVx4QkFFXHg5Nlt6XHg5N1x4MUREK1x4OThceERDXHgxM1x4QTYwOlx4Q0ZceDFDXHgwMVx4QzhrOlx4MUVEJT9ceDE5KVpceEI1ZVx4RTFceEVGXHhCNlx4QkNceEQ0XHhDQlx4QzZceEFFOFx4RjZwJlx4MERwPntuaVx4MTJceDBCXFx4QTJceEE4XHhBOGwkcVx4QjNceEEwJ1x4RTZuYmxceEQ1aU1ceDhDXHg4MVx4MDEyXHhFOVx4QTYyKkxceDk0XHhENVx4MTBNMlx4MTBceDk1fXFkXHhCQlx4MUZceEFGXHhDQVx4OEZceDg0eVx4QTNmYFx4QTBceEIwIjVceEJDY1x4RjRnRVx4RDEtYVRceEYwXHgwNlx4QTZceENDIS5qXHhBOVx4QTB4dUlceDlGXHgxOVx4ODdceEYyO1x4QjlceDE4XHhDRiJpXHhCRVx4QURceDBEXHhGQlx4RENceDFBXHgxMlx4QjVceDFCXHhGNFx4RjZceEQ4XHgxM1x4QTNceEFFXHgwQzBceEM5XHhBRVx4REMjJk5ceEU4XHhFQ1x4RDRTLlx4MTFceEQzXHg5Mlx4QTNceEUyMHxceEM0R1x4QzNceDk2XHg5Q1x4QzkpXHhBNFx4OTRceDgycj1bNSxLXHgwME0/T2xceDlDKlx4QzZSXHhBNk1ceEY2XHhCRVx4MENBXHhFMVx4OTBceEFDNXkpXHhGRHBmTlx4QTBjXHhGN1AzXHg5Mlx4OTVBJCJEXHgxRFx4ODZceEZGXHgxOVx4OEJceDk1XHg5NVx4MThceEI4XHhCM1x4ODMkTlx4ODY3XHg4Mlx4RjhceDhDXHg4Nlx4OTRceEYyXHhGRVx4OTlceDAycFx4RjdceDlGXHg5OVx4MUZceEE5cFx4MTZceDk2Rlx4RTZ+c2Q0XHgxRFVhXHhCQ3NceEQzXHg5Q1x4RTRceEFGLVx4ODVceEYwXHhCMVh2XHhBOFx4QUNEXHg5Ql1nXHhDRVFfZlx4QTZrclx4RDlceDkyUGpceEQyXHg5QyRWY1x4Q0VceDAzLVx4MENceDlFXHhCM3RceEMzXHhDQSZceDE3ZVx4RUZceDEzXHhCNlx4QkJceDA1XHgwRThJXHhCM1x4QTdceEJGXHhERlx4QjJceEI4XHhBOVx4RDNceEY1XHhEQlx4RTBceDlFXHgwM3FVXHhEM1x4RUQ1XHg5RVx4QjNyXHg5MFx4RTVceDg3XHgwM1x4MUFceEZCOFx4Q0NceEQ4XHhEQVdceDAxXHg5MFx4RThFb1x4MDlceDE3fFx4MTdceDk2XHg4QilceEM1XHg4QXNceEVBXHhEQ1x4OTU9XHhDN19ceDkwXHgwMVx4RjhceDg0MWAvQWY1XHgwRFx4QzJceEJCXHg4RVx4RkFceENEXHgxNlx4MTBceEE5NkRceEFFLlx4QzBJXHhGM1x4QTU7XHg4RFx4RTMhXHgxNlx4QjhceEQxXHg4OVx4MEVceDA5fVx4RjVceEE2WFx4RDB0XHhGRTpYc1x4RjJ0XHhBMkxceDE4XHgxQkNiXHg4NFx4MEJceDE1XHhFMEFceDgwaFpceERBYFx4QUM9a35ceENFXHhEMC9ceENFRClceEI5ZW1ceDA5Plx4RDJceDEwXHhEMFx4RjNLZ1x4RjFmfW1fQlx4MUFnXHgxRitceDEwYEosVjRuT1x4MDdceEJGXHhBMlx4RTFceEY0XHhGQmVvXHg4RFBGTzFceERFXHgwMlx4QTNceDE5YVx4OERceEY0PVx4QkZceEVCXHgxQT9ceEFEXHhGN1x4MDVceDFCc1x4RUFceDkyW1x4ODJceEQ1XHhGMi9ceEI0XHhGRVx4OTJceEMyXHg4RG4/XHhBN1x4OENceEM3XHhEOVx4OEFceEFFfFx4Q0VceEE3XHgxM1x4Q0J7Wlx4QzdIXHhGRFx4QThceEIyakFceEIxYyBXXHhCQkxceEEyXHhENlx4RDFceEE1XHg4Nlx4QjVceDA5XHhGRFx4MUFUXHhFQ1x4RTQ/KTZLLlx4MEZceERFXHhEOHZceEIwXHg5Rlx4RkRERzJMXHg4Qlx4RUI8XHhGQ1x4MTRceDkyXHhGM1x4QUJceEVEXHhDND5ceERFXHhCM1x4QTdceDg3XHhFNVx4OEYpXHhDOFx4MTFceEQwK1x4QzF7O0RWXHhDNlx4QjgtXHgwN1x4QkFVPFx4OURceDAyXHhCRFx4MTZceEM1Zlx4OTZceDBBRlx4ODFceEU0XHhBMWJqXHhDMlx4QTZceDA5VVx4QTlceDhCXHgwN0JceEVCXHhCRlx4RjJgNyF3P1x4RDVUJVx4MUZfXHgxOFx4REFceEQxSVx4QTBceDAxXVx4RUJceDk5XHhBQX5ceDEwXHg4QU9ceENBXHhGNTMtMmBceEUyXHhGNVx4ODM8SFx4RUFceDAwXHhBNDxceDFBXHgxN1x4RUJceEMwRlx4OTlceEI5RVBceDhDXHhEM1x4OENceENDXHgwMS1gXHhERGZIXHhBOVBCXHhCNFx4QjlceEUzXHhDQlx4QjZceEVDXHhGMTdceDFGfFx4QzA1WFx4QzFceEM2XHhBMmJceEE5XHgxQkxceEU1XHhBNFx4RDMmK1x4MTdceDhBXHhFNlx4QUZceEUxclx4RTBceENCXHg4N1x4QjA5XHgwMDpceEE4XHhCMjVCXHhFM1x4QzRceDkxXHhGMVx4OURceDgzP1x4RkJceEIwXHg3Rlx4QTZceDBFelx4RjVceEI0Ilx4QkZHXHhFQlx4QTZceEUwa1x4QjBceEJEQFx4QjBmXHg5MW9SXHg4Nlx4MDVceDE0XHg5N3NRXHg4Rlx4MDVLM1x4OTUqaz0yXHhDQVx4OTFceDgwOk5ceEFFWlx4RERceEI5XHhCQVx4MTdceDlBeURceEI3V1x4OERceENFXHhCQVx4RDhceDgyXHhENnxPXHhBN1x4RDJceEI1XHgwOVx4Rjl1XHgwMVFceEQ0fFdceEQxXHgwMVx4RjZOXHhGM1x4OTNceDhEJFtceEMwXHhBOFo1XHhFRFx4QThceEZBXHhFN1x4REVceEFDXHhFNFx4QTdceDFEXHg5OT9ceEExXHhCQVx4QThceDExa1x4OTdLKlx4QUUsbSRceEUyNVx4RTBceEMwXHhBRFx4MTRceDkwXHhCOVx4QzZceDhGXHg5Qlx4QjBjXHgwOS9fXHgxOFx4Q0RceEM4Q1x4OThceERFXHhDNFx4RUFceEVBamRceEQ5Klx4REVceEUwXHhFMFx4RkZceENGXHgxOFIwXHhFQlx4QUNjXHgxNlx4QTV2LVx4QkNceEU0XHgxN1x4RTEkUFx4QjYlXHgxRlx4RkI7Jlx4REVceEZBXHg4NFx4RUNzXHhFOVx4QzRceEFGXHgwNVx4MDZceEI3XHhDOUBceDFCXHhDMF1ceEFCXHhGNFx4MDJceEI3XHg4NlNceEYxcVx4QTVceEY3clx4RjhnTFx4OTBceEFBXHhGQlx4QzVceEQ4XHhERVx4OTdlXHhDOH5ceEFEc1x4OEVceEJCXHhBQmNceDgxJ1x4RkNXXHgwMFx4RUZceDFCXHhDMHBceEFEXkQvXHhBRVx4MTQvRVdceEVFXHhBMF9nXHg4Mi16XHhFODkjXHhEMVx4MTBceDAxXHhFMFx4MTdmXHgwODp0XHhBQkNceDk5XHhFM2NceEUxbG1ceEUxXHg5NVx4QTZfXHgwRVx4MDIyXHhBNFx4RjdceEE4YFx4RkRceDFFXHhGRVx4MTVceEVBIVx4QjdceDk4IjVceEYzXHgxRkhceDFBXHg4RFx4Q0VceEFCKzBceERDXHgwM1x4QTIlXHhEN3Y9a3ZceEMyXHhFQVx4REFceEUxXHhDRFx4Qzg/XHhCRidBXHhENFx4RjNQYFx4RjZceDFEOEozVFx4Q0NceEY1XHhGMVx4QjFceEVGXHhFRkxceDhDVEhceDgzPVx4QkVceDFFXHhCRFx4RDhceDk0XHgwMVlceDhBNlx4MDBceDBFPFx4OEJceDA3XHgwRFxceDExc1x4OTdceEE0XHg4NVx4RjdceDA4Plx4RjdceENETVx4QjQld35ceEFBKVx4RjJceEY1MFx4MERceEYxXHhENFFrXHhCQSwkXHhBQm9CXHg5QUBceDk3azxceDAyez1ceDhBXHgxQ1x4MTZfXHhFMDpKUlx4QjRceDFCXHhFMFx4RjNceDE2XHhGOFx4QTldXHhFNlx4REQtXHgwOUBceEM0XHgwMVx4QThceEE5XHhCMFhceEExXHgxRFx4MTNpTFx4Q0ZceERGeWJceEM3WFVceEJEXHhBN3Y0XHg4Nlx4ODAhQ1x4QjZceDhEUy1ceEE5XHg4Nlx4RkNceEJBXHg5M1x4RUVceEY4XHgxQVx4MTJLXHhGQ1x4OURceDExXHhGRFFYXHhBMFx4QzJceDk4XHgwNFx4QTRceEEzflx4OTI0XHhBNHRcXHhBOFx4N0ZceEY5XHhCNFx4RDdceEQ0XHhGNFx4OEVceEVFXHhFNFx4REJceENDXHg5RVFRW1x4QjY0XHhGN1MgUFx4RDlceEVDP1x4MUNceEMwR198IFx4ODJceEMwaVx4RUZceEVCXHgxM2lceEMxflx4MDhceDk3XHgxNVx4RjM2XHhCQVx4RTFoXHhDNE15XHhEMmhceDk0XHhCRVx4ODlceEYxWEZceEE1XHhCN0lceENDXHgxRlx4RjFceEVBXHhBMVx4RENceEQ5anJmXHg5RSp6XHhDRVx4Q0ZceDk5XHhCNVx4QjZceEJFUipceEQwXHhDQVx4RDJCXHg4Qlx4REVceEY0IVx4RDlceDhDXHgwRFx4RENceEY1XHhCN1x4MThceEY1XHhFRFx4MTZeLFx4QzN7UWRceEI3XHhENVx4MDJceDFBXHg5MmhceDAyV1x4QjFceEUyXHhGNVx4RDZceDE0XHhFOWA/XHgwMlx4QkZceDBGXHhDNUIuXHhGQz5nXHgxM1x4QjNceEQwXHhGM2hceEQ3c1x4MDhceDBCXHg4RVx4QkRceEJGNE5pXHhGQlx4QTFceDBDXHgxM1x4OTBceEY2Xlx4OER4XHhFN1tyXHgxMlx4ODBceDExXHgxMlx4ODk5NzZceEI2XHhFNFx4MUFceDlDMlx4MTlceERCXHhEQ1x4MENuXHhERlx4REFceDFGXHgwOVx4QzlceEY2XHhGNFx4RUVceDg3c1x4ODNqQFx4QjllXHhBM1x4QzlceEQ3XHgwNFx4RUFceDlGXHhGMVx4RTJ9XHg4QVx4ODJceEQ0UVx4MEFceDdGKVx4OEJceDhEXHhGN1x4QzJceEIzXHgwMVx4QkFceEE5V1x4QzZceDk4XHhGOFx4QjNceEQwXHhERCNceENDXHgwODtceEREXHhGQ1x4MDNceEFFXHhBOVx4ODAuLVx4RUY+P1x4QzJceEREXHhDN1x4RTlvKH0uLVxceEVGXHhEQVx4Rjl8XHhENWMnXHgwOFx4MDZceEE3Ylx4RjlceEE0YFx4MTVceEQwXHgxMFx4MUVceDAxXHg5Mlx4QUElOFx4RUNceDhEXHhCNFx4QkJceEFGXHhDRFx4RjBceEE5djpceEQ5T2JceDFBXHgxNFx4ODVceEZEXHg5MVx4RjJceEZCXHhGNCtceDE1SVx4QjVceEI4XHgwQVx4MTFceDk4XHhCN2dSM3BmTFx4OEFceDk1XHg4N1x4OTNceDEyXHg4Mlx4QThceEM2Wlx4RUFCQlx4OUEgK1x4MTVceEY3YmZceEVBXHgxQlx4RUJceEIxXHhCQlB+OFx4REZceERGelx4QThceDhGXHgxNVx4OTRbZ1x4OEFhXHg4M1x4MDN9XHg4MVx4MTFceENCXHhBRFx4QzdceDA1XHhDOFx4OTlceEI0XHhGRFx4QjJceEZDXHhGM2tceDlBLWFceENDXHg5NVx4QzJjXHhEQVx4QzFceDgyTnVdXHgwRFx4QTF7e1JceDk5XHhFN1x4ODBceDEyXHg5RClceEI0LHtjXHg5RFx4RTNaXHhBMFx4QkZceENGXHhGNlx4RERceEIyXHgxQVx4QjZceDhFXHg5MFx4QjZceDAzXHgwM1x4OTlceEQ2XHhDNVx4RjNceDE5XHhFQVx4MUJceEVGXHg5RTU1XHhCNElceERDXHg5RFx4OEJceDlEXHg5OVx4QzdPRVx4MEVceEY4J1x4QTVnbVx4MEJceDhEXHg4QVx4RkVceEQ4XHhFOFx4RTlyIzcpX1x4OTkuXHgwN1x4RTBceEI3XHhFM1x4ODd+SFx4RTlceDFDXHgxMFx4ODgrXHhEMFx4MTlceEVCXHhDOVx4MTNceDkzXHhDQm5ceERBXHhFMlx4RTlceDE3eG9ceDk1XHhERVx4RDQzXHgxOFx4MENEY1x4QjZceEIyUFx4RjFceEQyXHhEMCk1XHhGMlx4ODZceEQzXHgxQnA5XHgwQVtceEZEJVx4MDdceEY1XHhEMVx4Q0RMXHhFQVx4QUJlXHgwRElceEUyXHhGQUtceDFEKncrTkYnXHhENlx4QjhGXHhGRlx4QkJceDlFfVx4QTNceDg5XHhFQlx4MDNceEJFXHhEOVx4RTZOXHhGRlx4RTdbXHgxN1I2XHgwMjRceENBXHhGNVx4RUZceEZGXHgwQlx4RkZceEFCIztceDAxXHhFOVx4RDFceDlEXHgwMlx4ODVceEUxO1x4QzZ0XHhGNVx4MEZceEYwZ1x4QzFceEVFJDtgXHg5MFx4ODRceEUyXHg4Q1x4ODlceDEzXHgwRlx4MTZceEMxXHgxOVx4RkNceENEXlx4OUFtXHhGNlx4RUJceEEwXHhCQlx4RUNceEI2LH1ceDFERVx4MURceDkzXHhCMlx4QkNceDkwXHg5MmRceEZBXHhBQ1x4MUUtXHhDRFx4OThceEQyXHhDNFx4ODVceDA3XHgwQ1x4MERceDAxXHgwMFx4QTlceEFBYVx4OTFIXHhGM1VYT3kpaFVKXHg4OFx4RDJmXHhEMS1tXHhCQVx4OUVceDAyXHg5NVx4RjhSXHhFM1x4MTJrXHg4RlVceEY5Plx4RjcjXHg3RmZceENGXHgwM1x4MEVHPU5ceDkxXHgxNlx4RDhceDFGXHhDN1x4QzhceEFBXHhCMlx4RThceEQ0K1x4RDVzV3tceEM3XHhGQVx4Q0ZiXHg4RFx4MENleVx4MTM/Rl5ceDgxXHhDRVJOXHhGQ0o+TUEyYFx4QzhxXHgxNGxjXHhBMjVceEREXHhGMFx4MUVceEE3XHhFMnxceDlGM3VceEU0Klx4RUNceEM3XHgwMVx4QTJceEQxX1x4QzdceEY2XHg4Q1x4QUNceEJGaic2VntceEFBXHhFQ1x4OThceEZFXHg5MVx4RENceEQ3P1x4RTY8NFx4QTExXHg5QXwtXHhDMVx4MUVceDFEXHg5OHxceDhFeFx4MERceEFFXHhERVx4RTk6XHg4Q1x4ODhUXHgxRGBZYkk2XHgxNUgkfVx4MENceEM2XHhBRVx4MEFTXHg5Qlx4QTVceDA5XHhEQ1x4OUFRXHhBNVx4RkRiXHg3Ri1GXHhBQWFWelx4MTZKWFx4QjFceDFDUlx4OTJceDk4XHhDRnRceDE0XHgwMFx4RDNjYFx4RjkuM1x4QzROZ1x4RTQ0XHhCMzwtVklceDgyIGdceDg2XHhDMk5ceDBDXHg4M2ZceDBDXHhFNVx4QThceEVEYlx4Q0NceDBGXHhERVx4RTNceEI0bDkqXHhEMH5ceEY0XHgwQVx4RkJceEE4XHhGMVx4OUIlXHg4MVx4MThbJlx4QjVceEQ1XHhEOSRGXHhBMVR7XHhGNFx4OTdTXHg4MUFceENGclx4RDZceDgyT1x4ODFceEMwS1x4QjZceEIwXHhDNEwgXHhDNyBceDBCXHhCNjc/XHhCN1x4OUZRXHhGRCt2XHhDNFJceDFCXHhCNVlceDBCXHhDMHRceDlEXHhGNVx4RTNceDFBXHgxMFx4QUVgXHhBNlx4OEVceDA3XHhEM1x4OUJceEMzXHgwMDFceENCTyAyXHhDMnpceENCXHg5M09ceDk3XHg5MkFceEE0XHg4MFx4MDJ8XHhGQlx4RjEnXHg4N1x4RDlceDFEXHhBM1x4QkZceEMyXHhEN1x4QjRceDkzXHhFODFhO2hwIVx4QkRceEI3blx4QTU0XHhERFx4OUVceDhDXHg4RFx4QjVceEU2XHhEMVx4MTN6SFlceDFBXHhERD96XHhBMFx4OEJceEY1XHgwNElceEMzXHg4MFx4REFceEZGXHhDNFx4RUFwSElceEUyXHhERlxceDkwRzhceEQ0XHhBQ1x4QTcjXHhGMGhceDlCXHhFRD5ceDBCXHg4OEpAXHg4NlROcFx4OUFceEZGMVx4OUVceEI4dCpceEU5XHgxN1x4QkN+WyJceEFEWWNBXHg5N1x4RUZYIXBceDk1XHhBQV1ceDAzXHhCQlx4MDdceEJCQDk9XHgxMFx4QzFceDg5XHhFQkRceDk5OVBceDE2XHhGQlx4QjFFXHgwRFx4QkZceEM2XHhDQ1x4QTJceENCXHhCNlx4QzZlXHhDRlx4MTZceEVBYVx4ODhceEQ3XHgxRjlceEQyXHhFMlx4ODd6TVx4QkE9XHgwOFx4QjlceEU5XHg4M1x4MEVceEVEXHg5OFx4Q0ZceDEwdXxceEQyXHhFRlx4RjdceEI1XHhEQVx4RDlceENEXHgwQ1x4QkFceEI4XHhENUAmXHg5MFx4RTlceEMwXHhERWUlQFx4QTRceENDXHg5QUVceENFXHgxOFx4QjVceEM1XHhEQ1x4QUVceDEzdlx4MTdceEJEXHg5Nlx4MTg4XHg4NFx4QTRceERGXHhBN1x4OThceDAwXHhEMjJVPFltXHgwRVx4MTRnXHgxRlx4RjhceDhCXHhBODQmIjtceEMyXHhBRVx4ODB4XHgwNVx4OTRceEU0dlx4RUZUWXdceEYzSzNceDE1XHhDQVx4QTJxXHgxRFx4QjlceEU4UVx4OURceDExXHgxQ1x4MTEjN3tceEQ1XHhERVx4RjBceDlDXHhBN0NscVx4QUEoTVx4OTdceEY3anhceEFFXHhCQiFceEE5XHg5M05ceEZFTVx4MUF3XHgxOFx4RkFqJlx4OTVceDA4L1x4QjlceDk5XHhFNEdceEVFXHhEQlx4QkFFXHhEODZceEEyXHg4MlhceEFFXHhCQlx4QjNpXHhCRFx4OTBceENBXHhGMlx4ODdUXHhGRT02XHg4MzdceDEwXHhBMFx4RUFceEFDXHhDNlx4QTBceEMxQVx4QjlceEREV3NceEVGXHhGNVx4MEVceEFFe1x4MDBceDE5XHhERj1ceERCVlx4RUIkXHg5OVx4QjNceEE0XHgxNUNceDEyflx4QkJceEQxXHhEQTRceDFEXHhBMFx4RkViXHgwMFx4MERceDhBVj1ceDkzbVx4OTVvXHg5Q3FceENDZ1x4RDFceDhFIVx4QUZceDA3XHhEMExceDg0XHg5MFFcXHhBRVx4QUJIWGhceEMyXHhEN0ZceEYzXHg5Mlx4OTZceEI5XHhFNVx4MUU6XHgxOVx4Q0FceEVFXHhBQlx4QThceDk0XHhFMFx4MDlceDk3XHhDQlx4QzM0XHhGMFlceDA1XHhBMVx4OTVceDg4Z1x4MUVceDgyXHg5Nlx4Q0VceDBCXHhDQVx4QURceDlCNl1ceEJEXHhEQ1x4QkNceEZFXHhCMFFceENBXHhCNVx4OERceEU2Slx4MDBceEExTG5ceEI4XHhCMlx4OTFceEY0XHgwRVx4MTRceDlCXHgwMGxceERGXHhENVx4OTFceDkyXHhGQ0VKdlx4RjRceEU1XHhDQWtyXHgxMV1ceEM3JlZceEM5XHgxMFx4Q0ZceDg3LFx4ODNceEM5MGtRXHhFNVx4MURLXHhBN1x4MUEsXHg4Qlx4ODYxXHgxN1x4QkIuXHg5MWUobVx4QUQ7XHg5QVx4Qzl8XHhDRVx4ODhceDAxXHgwQk5OZVx4OUFiXHhENFx4MENceDhDXHhEMlx4RkJceDE2Zlx4QTRceEIyUVx4MDhlXHhENCFceEJBXHhGOVx4RjZ1XHgwQVx4RkJzOFx4ODRceEVCXHgxQlx4MEZceENDPlx4RDIjVUdtXHg5MlM1bnBceDFDTFx4RUZceEUxXHg5QWdceEY0XHhFMFx4RDBceDAzXHhBMlx4RDVceDgzXHg4MVx4OUNceEE2XHhFNylceEEyXHhGQ1x4MDdceEFEXHhDOFx4QjlceDlGXHhDNllYXHg5M1x4RDJceDg0XHhDMVx4MUJceDFFflx4RUFlXHhFNVxuXFx4RjFpRj5ceEMzXHg4NDg2XHhGOFx4QjFceDhEXHhGRlx4QjZKXHhENFx4QThsXHhDMXlceDhGXHgwNlx4QTBceEU5W2hbY11ceEFCXHgxNlx4QzZceEMzXHhDN1x4MDZkXHhGMVx4ODNceDA5KWJPaVx4MEFceDFCXHhEQipZXHgwQVx4RTdceDAyM1x4RTlceEE4XHg4Qlx4MUJceEQ1XHhERDFceDA3XHgxMUNPU1x4RDh8XHhEOTBceEUweFx4QjBFXHg4RmxceDEwXHhDMlx4RDZceDlCXHg4Qlx4REN7SyRoXHg5Rlx4ODVfYFx4QjZceDhFXHgxQVx4RDRceEUwXHg5OFR1MFx4RTZceENBXHg4RWFceDgxXHgwRG8xXHg4Nlx4RDNceDg1XHhCRlx4MDRceEM5KlVceDkyXHg4MVx4MUVceDlGXHhDNShceDEyXHhFQ0BceEU2XHg5MEFceDg0Vlx4MDNSSUZceEM1XHhGODcmXHgxQntceDk2XHgxOShceDdGIipceEJGXHhFMFx4RUVceEJEXHhGRlx4RTNceEE4XHgxNGFceEY2XHhFMn0/XHgxMWRiXHhDNFx4QUNceEQ2XHhCNFx4MDJceEZFXXBceEQ0XHgxQlx4OTVceEU3XHgwNVx4RjlceEJGXHg5RlB+XHhFRidceERBKDRceEJGXHhEMVx4MEZceDEzJVx4QUVceEZCQFx4QTFceEY1ZFx4OTl+XHhENFx4RDZceEUzVVx4QjdOXHhCQVx4OTB4dlx4RkFtQ1x4OTVceDhGXHgxMyAoXHhCNDpceEJBXHhBM1x4RjRceDBFXHhFQ1x4RUUnXHhCRFx4QzZceEVEXHhBNVx4RENceEIxXHhCRVx4OEZceEZGXHhGNjhceEE1XHhBRGNceEUzflx4RkUyV1x4QTUoaGw4X1x4QzdceDE0XHhDRVx4QzJceENCXHg5Rlx4QUV2XHhERHNceDkxXHhCN3BceDFGXHg4NVx4ODVXXHg5OFx4N0ZceEY1XHhBQlx4MUFceDgyQWxSVUdceEVCXHhCMGdceEYzeFx4RDMoQ2NceDFFXHhENFx4REZceEQxXHgxN3xkXHhDRXkuXHg4Qlx4QjNceEMxeFx4MURceEI4Qlx4QzZceEYzdFx4RDR1b1x4MDhceEQyT0pceEEwXHhDNG1ceEM3XHg5MHpceEFGZVx4QjBceEY4N1JceEU5XHhEREtceEJBd1x4RUYxVFx4Rjk5P1x4RDhceDgwXHgxQ1x4MENceDBCXHhDMU1ceDEzXHgwNFx4RTdceEY3N1x4MURveFx4OUVceENFeVx4MEVXXHg5Rlx4QzdceEYzJ1x4ODcmXHhFMFx4RjVHXlx4MTModFx4RkJdTVx4MTc9VFx4OTZceEI5SFx4QUVceEQ3c1x4RTVUXHhFNlx4OTZceEEzXHhENCkhXHhEMFx4OTM1Jlx4RDRceEM0XHhENVx4RTdceERDXHhBMlx4OUIkXHgwM1x4OTNceENEXHhFQURoXHg4RH1ceDk0XHhCMFx4QkZpXHgxOFx4OUFceEY4XHhBMVx4OTVceEM0XHhGOFx4OUFQXHhFRlx4OTdceEExXHhBRFx4N0ZceDA1OVx4RURceDE5XHgwMnVceEVDXHgxRVx4QzZceEMyXHhDNlx4OEZceDhGR1x4RUVceEY1XHhENlx4QjBceEYzXHgwM1x4Q0VceDBBK1x4QTBceDAyXHhDNFx4RjdIV1x4OEJsMlx4MTFceEFCXHgwRFx4QjRceEU1dVx4QkJAXHg5RVx4RDRUXHgxNFx4MEVceDkwTlx4OUFceEU4XHg4M1x4QTd0XHgwOVx4RkE4XHg4Q1x4MDlCWD1EXHhERlx4RTRceDFDXHhDNk4+c1x4MDB0XHhBQlVceDFGXFx4QTVceEQzU1x4OUVceEZFJFx4QUN0JVx4RjlceEQ0XHhDQ1x4RkVceEZBeFx4RURtXHg5Qlx4Q0JFe1x4Q0JceEU4NFx4ODVceEVDXHg5NFx4RDdceEFDXHhFQlx4RkVceDAxXHgxMyBceEVFSyBceDFGIFx4Q0ZceEE0XHhERFx4QUFceDgzXHhCN2ZuXHg4Qlx4MTFceENEPFx4MEZceEFBXHg5NVx4MTJceDAzaiRkJFx4REZceEEzXHhBOFx4MDFceDFCMSFLJVx4RkEwXHhFQyFceEQyfGRceDEwXHhEQy5ceEE5XHg4NVx4Q0ZEXHhFRH5sUH58e1x4RDJceDBBXHgxQlx4RTVxXHhBOFx4RTEjSlBXRlx4RTZSXHhEQVx4MUVceEVCXHhGN1x4QTlUXHhEM2tceEVDXHhCQlx4OUZceEE2XHgxQVx4RjlcZFx4Q0JceEFBXHgwRDtrXlx4QTEjXHhBOVx4OEJQXHhEOFA5XHg5MHRceEQyXHhFOH1ceDBEXHg5Nlx4RTE1XHhGNlx4Q0VceERGQlx4QkYzXHgwQlx4OTBtbFx4RDBFM1x4OEVZXHhGNFx4MTVfXHg5Mlx4ODlceEE4XHg4MVx4ODRceEFGJVFceDg2XHgxMj9ceEUxXHhBNWl+XHg5OWVceDgxVVx4OTJXXHhERFx4QkFceEY5XHg4QktceDkydlx4RERceDhCXHgxOFx4MTBceEE5XHhBRVx4OEVceEFDe1x4OTFceEIyYVx4RTNceEVFXHg3Rlx4MDVceEExR0tceDFCXHg4RFx4RURCXHg5Nlx4ODZ8RFx4MEUrJVx4OTBceEM5XHhBMGtceDFFb1x4QzhceEM5WWtceDhCXHhEQVx4OTNSXHhGNixceEEwdElceERBXHg5OVx4MDl0XHhGOFx4RTVceEFGXHg5Mlx4MTRceDE3XHhDRFx4RTVsXHgxRWNceENDXHhGNFx4QUNRQTlceDdGXHhBN1x4RkZ4VDZEcFFceDEzXHhGN1x4QjFceEQ5fG5ceDkyXHhEN1x4RTR2XHg4NE5bK1x4OEFceERBXHhEMlx4OERceDA2XHhGRjFceDFELWEhXHgxQVx4QkEvZnVceDE3Jlx4QjlceDFEbFx4QzZvXHhFRk02Ti1ceEEzXHhDNmFceEZFXHgxN2xceEQ5eVx4QUVzXHhBRFx4MEVAXHhCNlx4RUN4e0tceEZCXHhGOVs4XHhCM1dceEY3XHhBM0JceDAxXHhDN1x4MUVceDlCXHhGRFx4OTBrXHg4QmFceDBBIlx4RURceEJFXHg5Mlx4MUNceDA3XHhGMlx4MEQkXHhGMFx4Q0NceEIyN1VceEJFXHgxMVx4QTNDQF5KOk5RX1x4OENceDFCdFx4RUNceDBDXHhENGRceEExXHhCQidceDgwXHhEQlx4QTVceEREXHhFOVx4QjhpXHhFMFx4QzVceDg5XHg5OFx4RUZceEY4XHhCOVx4MUNceDFFI1x4QkRceEZFXHhCOC5zd1x4OTVceEJBVFx4MTlceERFXHg5M0BceEEwXHhFRFx4QzVBXHg5MVx4QzJceDE1XHg5M2dceEVEbFx4RkYqXHhEMFx4RDNceEZCXHhFOF12XHhDMVx4MUNceDg1XHhEMFdceEM1XHg5MjtceEI5aVx4QURceEJCOi9bSU9ceEY5XHg5Q1x4MURceEFFTERceDE5XHg5MjdceDlDXHhCMlx4MENceEMyXHhEQ1x4RDFFXHg4Mlx4MEZceEU1XHhEQ3VceEUyXHhEMVx4QjdceEJDXHhDMVx4OEQ+XHhBRj57Qlx4QjA0OFx4ODFRQlx4MUFJLX4nXHhBM1x4QkNceDAyXHhDM3RceDA1XHgxNzRceEE2XHg5OFx4RDlJXHgwMVFceEE5d1x4RkNceDlCLFx4OTlceEU1XHhBQm1ceENGXHhEM1x4MDBceDk4XHhGQWVAXHg5M1Q3W1x4QURceEVEXHhGQlx4RERceDk0XHg4QjRceEQzXHg4MVx4QkNceDg2blx4Q0Q8QCBceDkyXHhFNChceDg2KFx4OTJceEVGXHhCQlx4REZceENGXHhCQlx4RTdceEZGXHgwNW9ceDE2XHhFQVx4OTFnJyU/XHhGMVx4RTBceDE3XHhCMixceERCTk1ceEQyXHhBMlx4OTdceEI5ZFx4RkRceEIyXHhCMSE0XHg4NHZceDlGXVx4MTRKXHhCNlx4REFceDgwXHgxRXJiXHhGRlx4RkJlXHgwRFx4REFceEE1XHgxN2dceEYya1x4RDU3XHhEM1x4QUZRc1x4QzgsT1x4RjNceEY2XHhGM1x4RTMhXHg4MTkwXHg4OU5ceDlBXHhDRVx4RjJ+XHhGM1x4ODBceEJCJlx4QzVceEJFYlx4MUR1XHg5NSpceENCLlx4QTBuIko6XHhENDZ5XHhDM3ZceDlCXHhFMS92b1x4RUVDXHhBMTtceDlFXHgwM1x4RTBceEVBXHgwM1x4RjMhXHhFMlhceEM0ekggXHgxQ1x4MThceDk5XHhBNFx4RjlceDg2XHhBNlx4QkZqXHhFNFx4QjFceDgyXHhCNVx4RUE5W1x4RTZceDE5XHhCMlx4OTlceDAwXHg4NmBceEUwXHhGMX5ceDFDXHg5QVx4RjJYeVx4QUF0XHhDMFx4RDNqXHgwQlx4MEQzXHhCQVx4MTlceEI1cFx4OTRceDAwXHhBM1x4MDhceEEyXHhEQmt8Ylx4OUJJXHgxRHBsVlx4OUVceEU0XHhBOFx4QURceEUzXHgxQlx4MTNXXHg4OVx4QjRhQFx4Q0FceEQ0cXlWQiNQXHhENVx4QURdXHg4Qlx4MUFceEVEXHgxMlx4RERwXHg5MCRceDA5bFx4OENceEU4XHg5MSdzXHhFN1x4RjRQXHgwRlx4QkZLITxceDk3XHg4MjhSXHhBOFx4MTZceEEzXHhDNFx4OUVceEQxSl9+XHg4Nlx4MTNUY1x4RkNceDA4XHgwOFx4MDFceEQ1XHg5MSxceEI0UFx4MDJceEE1XHhCQy9ceENCXHhFNz9pXHhEN1x4QTZceEM4XHgwRVx4QjlceDhCXHhDOXlceEYya1x4ODlceDlGJFx4MDhceDE1XHgxQVx4RDRceEI3XHg5OHp+Py5LXHhBNlx4OURceEREPVx4OUZgXHhBOFx4ODdceDgzXHhEMGFceEM0XHhBQ2hceDk2JFx4OTZceDEzXHhFQ1x4MTR5alx4QzhPdFx4OENceDdGOFx4OEJ1OWVceEY3XHg5RSVceDlGb31ceEFCfVx4RDFdXHhEQlx4QkE8XHgwOVx4RDdVYlx4Q0JPXHhFNzlceEVCJ1x4MENVXmJceEY4XHg5OVx4ODVceEE0RXJceDhCXHhDMlx4Q0ZceDBGXHg5MFx4RTdceEFEXlx4REVsXHhFM1x4RkFceDFCXHhFOFx4RjVceEMzTFx4RDJceEFFXHhEMlx4MTNceEM1XHhDNjJceDA4XHhCRVpceEEzXHg5Q1x4MEI2XHhGNlx4RTJ7XHgxRVx4QUJceEJDXHhGMFx4QkVceEE1XHhDOVx4QzIoXHhDN1x4ODMwXHhEMFx4OTBceDhGXFx4MTMwbTd3XHhCN1x4OTZceDgxMFk+XHhGM1x4QTVceEY1Zlx4QzQva3VceDBEXHgxQlx4RTNceEJCXHhENFx4RTZceDE5XHg5MFx4QjRceDE2XHhDMFx4QjBceDkyU05ceDdGXHhBMVx4MUMnXHgxRlx4QTdceDAxXHg5OVx4QTdceEMwXHhBNTZceEU0fHluVFx4REZ1XHgwOVx4QkJceERCblx4MUVceDA0S1x4REFceEIyXHhDNzdceEMwXHgxN1x4QzRceEE3NVx4MUNceDBGXHhBQlx4ODdceEFFXHgxQ1x4RjBrI0RceEIxXHhDOFx4MEVceENFXHhBNz1ceEM2dVx4QkJceDg0XHg5RFx4RjYwXHg5Nlx4MENceEVDfj9ceDkzXHhBN1x4QzZHVFx4MDcyMWZceENEXHhDQ1x4RDFceEFBR1x4REJceEJDd3VceDhEK1x4OTZceEFFXHhERFx4RTFceEI3XHhENFx4OTBceEE2XHgxQlx4RUVceEU4XHhDQmJceEVGXHhCRF1ceDhDXHg5M11ceEEyXHhFRjhceEY5XHhEN1x4QjBceDhEXHg4MEhceDhEXHhDRGNceEJBXHhFOURzXHhCMXBceDExXHgxMFx4QzhceEQxXHg4M1x4RkNceEYwXHg5MSN5XHg4M21RSDBceDkwO0pceDFFXHgwRlx4QzdTNCJceEUwXHhGQ1x4QTlZXHg4RUpceDE2XHgwOExceDlFXHhBMkxceEVDXFBceEI0XHhEMnVKXHg4OVhceEUyZiUwXHhEMmslOltceDlDflx4MTVceEY5e1x4RUJceEYxXHhFRVx4QTMlXHhGN1x4OEY8XHhFRUtceDgxIlRceENCKUhmXHhGNVx4RUVceDgyd1x4Q0Z8Klx4RkFceEY3XHgwMHA2XHgwNl9ceEY4ZVx4RjdceDkxXHhFMVx4RDJceENBXHg4NVx4ODJceDA1Q1x4OTVceEFFXHhCMFx4QTRUXHg5NFx4OUNceDA5NVx4RjhbXHhCN0dceEU4XHhFQWRbXHhGMk9BXHgwMlx4QUFceEI1PFJceENERVx4OEJceEMxXHhDM1x4MDZceDgxXHhEOVx4RDJceENDMHlOXHgwMlx4QTNceDBCXHhFRFx4QTdceEMzXHhGNlx4RDhceEVDXHhGNm46XHhCQUBceEU1YWFceDAzXHhEMVh7XHhFRU81VFYxXHg4MFx4Q0RceEIxXHhGNFx4MTVceEU4XHg5QkxceEJDXHhGMlx4QTJceDFFUF1LXHhBNFx4QjVceDEzXHgwNlBceEIwXHgwRUhceEFCXHhFNlx4QTFceEFBXHhERW5ceDk2XHg4Nmg9XHhBOFx4RUNKXHg4RmVWX3UoUVx4ODNJYlx4RjYvXHhBMlx4QzBceDE5Sm1ceDE2XHg5NldceEQwU1x4RjcsXHhFQ1x4QTRceEREIlx4QTQhc0dceEU1XHhCNVx4RTR9WVx4RUNhXHgxM1x4RTJceERBXHhBRFx4QjNceDk0UVx4RTZceDgzNClceDA5XHgxRVx4RTJceEExXHgwQlx4QzRceDhGXHhGRUhVXHhFMVx4MUJceEJGXHg4NURceEE0MFx4OEZfXHhDQkQ8XHhEQ1x4REZceEIxXHhGMlx4RjM5XHhBQVx4ODBceEU1XHgwMy9cXHhERFx4RURiXHgwQ1x4MUFceEQyd1x4OUU3NVx4RjlceENBXVx4MDhceEY0XHhGMFx4QjM+XHhFRFx4RUVceDFGXHhENFx4OTRceDBEelx4RDZ5XHhGRiI0XHhCQlx4MEFceEY2XHg5NFx4RDJceEUzXHhCNVx4OTZDXHhEM3tceEI2XHg4NF1ceEU1Ulx4OTRUMX5ceDg4bzVceDA1XHhDNVtceEJBXHhDM1x4MEI3XHhEMlx4RUM+XHg4N1VqXHhCQVx4OEZuNGNceDk5XHg5Nlx4RDFceEFBL1x4MTYqM2JceEVFIitceEY2XHhDQVx4REJ5XHhBM1x4OTZceDg0SXVceEExXHhFQVZceEY4XHg5N1x4MDFceERBRVx4QjNceEJDKlx4RjlceDA2MFx4RkZDLFx4MTZceDg2LVx4QjBceDk5XHhBMDkyXHg5Q1x4RTYiXHhDNXhceERFXHgxOH1oXHgwMT9NXHhDOVx4OTRceDhEXHhEOVx4QjJZZV1ceEQxVytceEU5PUdceEE4cWVceEM2OFx4RTNceEI2XHhENFx4OTdUIz9ceEE4XHgxQSRceDBFTHtceEY1XHhBRWpceDk5XHhFNDlceEQ2XHhDMTlyXHhERFx4MTIzUSZceEUwMVx4MURceEZBXHhGNlx4QThceDA3NSFceEMxXHhFMlx4RkVvclx4REFceERDXHgxQTpceENEXHg5OVx4OERceEQyXHg5MDtrXHhGMFx4OUZ2XHhGMFx4Q0VceEI3XHhCN1x4REZceEI1eVx4ODRceEFBbFx4MEM/YS9ceEE5JjdkXHhDQlx4MTZceDk2VUEmXHhCN1x4QTglXHhCNyhOXHgxNFx4OTZceEQwXHgxRXBceDk1XHgwNmZceEZGXHgwNlx4RTF5Vlx4RENceDFBIlx4QTd4clx4RkE3NVBrXHhFREdceEZCXHhDNlx4RERceEM3XHhEQlx4OUJceEFEMVx4ODNgWVx4MURceDFGXHhGN1x4Q0VceDAxXHhBMlZceENDflx4QUFceEFBXHhEMlx4MERceEUxalx4QjVceDgxXHgxRC5IXHhDN1x4QTBceEQ5XHhCMVx4Q0JceEY5XHg4MFNceEI1XHhERlx4MEVceEI5XHhFMlx4QThceEIwXHgxMkRceDk1XHhCNyUvPlx4MEVKXVx4OER0XHhGN1x4MUFceEM1XHhEQVx4Q0JceDFDXHhENFx4ODFceEZEXHgwNFx4MEJceEMyRC08XHhGRXsoVFx4OEZSXHhCRlx4OEEwXHhCRFx4RUNcXHhFQy4jQFx4QzRceEI2XHhBMlx4ODVceDAyWiAlXHg4RVx4RUJceDlEL09ceEVFXHgwQlx4RjdceDg4XHhDRVx4QjJceDhBNzpceDgzXHhGMnRceEI3RlpceEI1T1BceDBBaU9ceEM3XHg4RCVeZFx4MDhceEMzXHgwMFx4RkJceDk4XHhBMiVceEQ1XHhGMlx4Q0JceEREPVx4RTRceEI3Olx4QjBkKFx4QTJNXHhFNHBceDE5XHhEMFx4QkVYXHgwOVx4QzJceDgzXHgxRFx4QjlHVTNceDA3XHgwQ1x4MEFvXHhFMFx4OTlceDEyXHhGM1x4RDNceDBGXHhCMlx4MUJceEIyXHhEMlx4MUE/XHhFQ1x4RkV6XHhENFx4OEJnclx4MDQ9T1x4RkZXXHhCRmBceEM5KFx4REMwX1x4OUVceEMzXHhCOFx4QzBceDk1YVx4MEN1XHhDRFx4ODJceEUzcVx4RUVceEQ5VVx4RUZceEE5KVx4Q0RceDAzXHhGRFx4QzVZXHgwRFx4RTFceEQzIlx4ODJceDlDXHhFMlx4QjVceDA0XHhBMCNceEM5aSNmaGRceEM5RFx4MUVtLVx4RDY/XHhFQlx4ODVceDFGX1x4OEVceEE3dVx4OEZceEFFPWpceDg3XHg4Nz9ceDFDXHhFMnxceDA3UFx4RUZceEZFX1x4ODlceDlDXHhFQVx4OUZ6XHhGODJceEM1Q1x4Q0NqXHhDRVx4MUFceDhBXHhGOFx4MDF4WFZceDE2eVx4MTI+XHgxMytceDBGXHhEQ3pEXHgxQXVceEYwXHhEN30lSHRceEM4XHg4Q1x4RjEvXHgxMjxceDExXHg4Qlx4MDhod1x4REM3b1x4QjFceEE3XHhDMVx4RjRceDkxXHhCRElNXHhGMVx4MThceEQ0Rlx4RjdceEI0c2lceEMyXHhDOVx4MTVoXHg5MVx4ODhwXHg4M1x4QUFHXHg5Rlx4QzdceEM0XHhCNG9ceEQ1PVx4QzBUWWcnXHg4N1x4OEVBXHhDQl9ceEVFXHhDMFx4QjJceDlBXHhCQlx4OEFceDk3IFlceEU3XHhCN1x4RkY3XHhCQlx4RDNceEUxR1x4RUR7XHhERllceEVEMFx4RTVceDAxXHhCOShceDkzcFx4MDA8XHhEOG9ceDgwJERXXHhEQlx4RTZceEU3XHgxNFx4RUFceEM3RVx4QTVvXHhCQVx4RDVceEQ5Plx4Qjd3P1x4REZceEE1XHhGMVx4RTRceEZFJXdYXHhBRnhceEU1XHhDRVx4MUJ7XHhBQStceEJGXHhFQlx4REFceEY0JG9ceDgwXHhFQ1x4OTVceEJEXHgwMVx4QjVmXHgwM0pceEJGXHhEQVx4MDVceERBXHhERWtSQlx4QzA6XHhBRGZceDk0XHgwOFx4QkZceEUyWVx4RjRceDAybHcoXHhBOSJceDdGXHg4NFx4RDBceDkyXHhENlx4OTVceEZGMFx4ODdceEQ5W0cwXHhFNlx4OEVceEM4XHhCNVx4QzhWIE44XHhCOVx4MEJceEI5XHg5RVx4OTlceEVGXHhCRVx4OEFceEJDdVx4QTZQXHgxOVx4QzZ7XHhCNVx4QzhHN2J3Ilx4RkRceDhGXHhGRiNaXHhEN1x4OTFceDE3XHgwRFx4MTVceDlEe1RceENBaFx4OENceDExeFx4RDBceEE3XHhGQ1RyXHhCNFx4QThceEFCXHhGNlx4RUNceEUzXHhCMk1ceDhCXHhDRVx4REZceDk5XHg4M2VceEFCXHg5RFx4QzRceEU3XHg4REU1XHhFQVx4QkRceEFFXHg4NVlceEQzc1x4RjRceEYyXHgwNyZceEYxXHhBM1x4QUZNXHhEOVx4OTVceEJCZVx4QkFceDBGSS1ceDE3XHg5RFx4MEVceEVGXHhBRnQzVz5tXHgxRFBceEQzXHhBNVx4RTZceEI3XHhGREsiXHhERip3XHhBRVx4OTVceEU2XHhDOVx4RThceEQ4XHhENFx4OEZ0XHhBOFx4QjdiXmxeUWRceEQ5XHg4N1x4ODRceERDXHgwQVx4Q0ZceEE1XHhBM1x4QzBceERFXHg5RVx4MTVceDA3I3RceEJGSVx4N0ZceEYwXHhCRFx4QjJceDgyXHgwNFx4MDlceDlEQCVceEVBXHhBQ1x4QUFceEExXHg4OVx4MThceEZCXHgwOVx4MDElXHhCOTJ0XHhFQ1x4RkFceEQ4XHhEMlx4MENceEREXHhBRFx4QThceDExVFx4RUQ/XHhCOVx4ODZceDg1XHgwM0RuXHhFQlx4QTFVXHhDQVx4ODdjXHhFM1x4RTRceDhCNUFceEZBXHhDNFx4OUFceEY1XHgwRVx4QjdceEUwTVx4REN4czdceEUwXHg5Qi9ceEU4XHhBRFx4MEVceEEwXHg4NHlceENFXHgxNFx4RURHXHhBRGV1aVx4Q0QrQ1NceEZBIlx4QUZceDkzT1x4QzJceDlCXHhBNFx4RjJceDEwXHg4QnpEXHgxNCksXHhGRlx4RDFceEJGXHg5OXxceEJGXHhDMCpceEMwI1x4QTBceEUzRVx4Q0ZtXHg5Rlx4MTZiP1x4MTRceDg5XHhBRFx4OTd2eVx4MEVmLCtceDE2XHgxMlx4RTNceDlETGJceDBBXHhCNlx4QUFceEI1X1x4RjFceENEXHgwNVx4MTJceDlFRyVoflx4MDdceEZBXHhCM1x4OUZceDkxXm4wWlx4QzFMXHgwNFx4QTlceEI1XHgxRVx4OTBceDFCXHg3RjBceEQyWVx4MUU3dVx4QkR2XHhCRDZceENCXHhGRUw9XHhCRDtceEMyXHhBMm0/XHhDMH5ceDE3XHg4Rlx4RTl3XHgwNlx4Q0RceDBCZFx4Q0JceEY0XHgwMjpceDA5XHhGMHRceDA2XHgxMVx4QzRceDEzXHhBMUFceDA4Llx4N0ZYXHhFOVx4RTRceEY0XHhGNnVceENDXHg4Rlx4ODNceENBXVx4QTB4XHhDN1x4ODlceDA4Ilx4REZceEU1XHhFQjxceEYxXHgwMWFZXHg5OUokXHhCNnFceDE5XHgxOFx4OUF0XHgxNFx4Q0VceDhGIyhceEQxXHhFOVx4RUZceDBFXHg5MnRceDg4XHgwMlFnV1x4QzBceEY3XHg5RVx4QkJceEM1XHhDNlUvPjtceDlBXHgwMjlceEZFflx4ODheXHhCQlx4OERceDAwXHg4N3lceEE4XHhDRTBceENGXHg4NFx4REVceEEweD1ceEM1MVx4MDMuXHhBQlx4OTJ7XHhDMFx4RTlceEE3XHgxM1x4RDhceDA0X1x4Q0IgXHhCRiZceDFCXHhEMFx4N0ZceEE2XHhGQ0RceEU3XHg5QVx4RDFceDAzXHhGRFx4OTVceDk4XHgwOUJyXHhDQVx4QkJceDE0VkkrMjlceDEwXHhCNVx4OEZdPCZceDAzZ1x4QTJceEE2Xlx4RjhceDk2XHg5MFx4QzcuXHg4NVx4QTZceDgyXHgxRDFceEVDXHhEMFx4OTdceDk4XHhCQl1ceEYwXHhGRFx4RUIhX0lceDg0XFx4MDZceEI0XHhDM35DXHhENlx4MDdceERCXHhDRlx4QzZceERDXHgxNlx4MEJceENCXHhENlx4RDZceDk2XHhBOEltXHhCMFx4Q0ZgXHhDRjFceEU4XHgxOFx4Q0RceEIzXHgwNylceDhGXHg4Q1x4QkFLOiBceDk0XHgxN1x4MEFCXHhEMD9EXHhDQlx4RjdceEREXHhFN1lceEM0XHhFMjFfZVx4MEQ/emBceDk1QCpKaVx4MUNceDA1dk9ceENDSFx4OEJceEZEXHgwOFx4QkY6XHhFOVx4MDhgU1x4REZceDkzXHhFNDN9XHgxQXFkXHgxMFx4RTZiPS5ceDg1XHhEMkRceDEwXHhCOFx4RUQ4T1x4QkQkXHhCRlx4MEJceDAyXHhBN09ceDg2MFx4QTFceDlCXHhBMkZceDlEXHgwM1x4MUMiLGpceEI0XHgwMlx4QUJdXHhDNjlceEFCXHhEQlx4RTB0XHhGNVx4RjFceEZBXHg4MFx4RTVceDA4NUBceEMzXHg5Rlx4QjZZXHg5NVx4N0YuXHg5Nlx4QUUpXHhDOFx4QkZceEYxJ1x4OUVceDFDWSBceDkzXHg5NlYrWFx4ODBceEJEXHhCOVx4MDInXHg5NVx4OTBceEQzXHhDQVx4OTh9XHg5MFx4QTBceDkwJDNceEU4blx4RkRceEU4XHgwMyxceEUxelx4MDZceEE0XHhFQ2hceEVCXHhCMFx4MDJAXHhBNFx4RUJHdyVvWVx4QkZDXHhGRlx4ODA1ZVx4QjdceEE0RGpeXHhCQyxceEQ4Ylx4RjJceEZFXHhGNlx4QkZceEFBXHgxN1x4RUI2Y1x4MTF4XHhCM3xceEJBXHhERXZceEI1XHhCNFx4MDFEXHgwMndceEEwJlx4ODlceEU1XHhFNlx4MDRceDA1XHgwMSRceEM1STRTXHgxREdceEQ3VVx4RTJceDA0J2xceEVFXHhEOFx4RkZceEM0UVx4Q0NceDBBXHhBMWZceEE0XHg4QXhceEZGVmFBXHhFMF1ceDlCXHhEN2dceEU1XHgxOFx4MDRceDAwNFx4QzRceEQ0XHhBM1x4Q0ZceEJGXHgxOFx4RjZceDAzXT1ceDg1XHgxOVx4QkFceDg0XHhBOVx4QzhceENFXHgwN1x4RDhceEZFdlx4QTIjXHhBQlx4OTFceDFGXHhGQl5ceDhEcVx4OTdceEU3a1x4MThceEU5ZFx4RDF6XHhCN0ZqXHhBNFpceEVEXHhCMlx4MDFceEM2XHgxNVx4OUZceDg3XHg5RmtceEQzXHg5Rj5ceEJDXHgwMkNceEJDXFx4OTN8XHhFOFhpXHg4Q1x4QUVceDk2XHhBQVx4MDhceEUxXHgwRnNceDE2XHhENlx4RUJceDgzLlx4OTFceEY3OFFceEQ4XHhGOFtceEU4XHgwMlx4QzBOXHhFRVx4RjhceDFEXHhEQ1x4MTJceEVDXHg4NVx4MTEydFx4RUFlXHhDOFx4QTBxNlx4REReXHg4QVBceDkxXHhDM1x4MURceEIwZiZceEY3SD9ceEM2XHhDQl9ceEVDXHg4RVx4RjNceEE2NT5ceEVFL3RceDBEXHgxQixceEQyIlx4QTE3XHhBNVx4RjJceDk3XHgxNyZceEUzXHhGOVx4RjJ1XHg5NS1ceDEwXHhEMFx4MERVXHg4Mlx4OTBxXHhDNFx4RUZceDhEXHg5QVx4MTlceEQzXHgwNVx4QUNceDk4Rlx4RThceEUzelx4OUVceERDXHhGRVx4QjBJd1x4MDRDXHhERlx4ODdceEE1UVx4MUYlJ1x4QkJceENEUmRceDg5XHhFRFx4RTcsXHgwRilceDFFXHhCNlx4MDRceDAyXHgwRlx4RjdceEZBXHhBN1x4RERFXHhDOVx4QUZceEMyNHdmXHhDRCFceDkwZktceDkyXHhCQlx4MUNhXHhDOFx4Q0ZceEUwL21ceEREa1x4QTNceEYwXHhCNmBOXHg5MFx4QzNceEE2XHhDNlx4ODdceEFCXHhBMWRceEU0Ulx4QzI8XHgwMVx4MENceEIzXHhFQ0dceEZDXHg5NSZceDkxOTJceENBXHhEN1x4MTVceERFXHgxNkY3XHg5RFx4MDdceDgyXHg5Qlx4OTMhXHgwMXBceDhDXHgwM1x4OTZZXHhCOVx4RjBceDE0WFx4RDlqXHhCNVx4ODRceEM0XHgwQjJceEZCXHhFMGBUSlx4RDdTXHhGQlx4QzZ8XHg4OFx4RERceEVDLVx4QkQzXHgwOVx4Qzk1bFJceEYze1x4MTRceEZFXHhBRkVceEMwQEBceEYxXHg5RGFBXHg4MFx4ODZceDk3XHhFMHNzXHhEN3FceEM2XHg5MkVceEFDWVx4RDhceEI4XHhDMlx4OUJceEVDXHhDOF1ceEEyXHhBQ1x4RjlceEQ5VUFceDdGXHhFNiY/Rlx4MEJceDlEXHg5NFx4MTlceEUxaVx4QkNceDhGXHg4RWtceEJFXHhEN1x4RkNceDBBSlx4OTZtXHhBOHRceDhCXHhBMCpceDkxO2FceEE2L3dceEEyXHhFMSRceDlEXHhCOF0rcFomXHhGRUpHXHg5RlBceEY4XHg5NXI2XHgwRVx4MERceDkyaS5ceEEyXHhCOTYoIVx4RjchXHhCRlx4QzVxXHg4MVx4RUMzQVx4QTRCXHhCNVZceDhFXHgxNlx4MDU1XHhEQVx4QTNceEQ2Mlx4RTBgSiUiXHg4OFx4MUNceEVBXHhDNVx4MTlceDAxMlx4RTVceEQzXHhGMFx4QkJceEZBXHhDQ1x4RDZceEZDP1x4QjhceDlEXHgxMVx4REI1XHg4OCpceDk5XHhGN1x4RjY9XHhDQlx4MUZceDlCdFx4RTYzQVx4MTJceDBEXHhEQlx4RkVcXHhBNVx4OTRceDhCXHhCNjxqXHhCOCtWXHgwMHBceDAyXHg5N1x4OUZceDFBXHhBMFBceEI0XHg4OFx4RTI8XHhCM1x4RjdceDlEJlx4MTBuaVx4QjItXHgwOVx4RDNceDhEXHhDNVx4Q0RceEVEXHhCM1x4MDlMKTVceEM5XHhCNFx4RTVceDkxfVx4OTJceEI0XHgxM1x4QzFceDg3XHhCN1x4OTNceEQ4XHhFMSA3XHhDMVx4RjFceDdGXHhBQ0ZceEFBXHhDRFx4RDRceDhGV1BUfk8xLlx4Q0FceEFEaHBceEFGJFx4RUZceEVEXHhBOFx4RkFceEM5XHgxRFx4MUVceEJCfnYuXHhFMDpceDEzTFx4ODJceDg5XHhERFx4RkVZXHhDNlx4RDZceEIzXHgwOVx4MUZceEYzO1x4RjJceEJEXHgwNkhceDA3IT9ceDE4I1x4QUVceEJEZ2tceDFGXHhCRFx4MDFceEY3XHhDNVx4QUZceEREXHg5MVx4OEZ7XHg4MU9VXHhFNiRceEQ5ZVx4RkNZXHgxQnlxXHgwQ1x4RTRceEU4XHhCM2M+VmFrV1x4QjRdKlx4OTItTlx4OEFUXHhFRGhuRFx4RDJLZVx4MTJceDFEJ1x4RTdceDgwXHg4MyhceEY5XHgxQUJceEZGXHhGRFx4RDVceEQwXHgwNzdceEE3XHg5M1x4QzlbXHhCMFx4OTJceEI3V1x4QUJlXHhCMHtceEFGZEVceDlBLjlceDFDXHhBOFx4MDU8MFx4QkJceEQ0XHhDOVx4RENceDAzXHhBMFBceEQ1XHhBOVx4RENceEM1IVx4OENceDA3K2g9XHg5N1x4RTQjRlx4REFbXHhERFx4RkRJTFtceEU2XHhGM1x4MTM9Nlx4RTVceEEzblx4QjFceEVGXHgxRlx4N0ZceEY2XHhCOVx4QkZceDlBeClceDdGXHg4OFx4QTlceEMzXHhCRlx4RjZceENGXHhEOVx4MThCW1x4RjJnXHhGNFx4RUVceEU5Olx4MTZceDAwfilceEJEXHhFQlx4QjVhKyV4XHgwMlx4OUVceDFGXHhCOFx4OThtXHhGQVx4RTBceDhEOlx4RjlceDE2XHgwRlx4RDdceDk3RVx4RkFceDE1XHg5Mlx4RDYrXHhDNFx4RTNceEIwXHhDQlx4RjlceEI1XHgxMVx4QzJceEJBXHg5Mk1ceDFDXHgwMkJceEFBXHgxMlx4RThceDA2XHhDRlx4OUVMXHgwQ2dceDFEXHhGNSZgXHhDMFx4OTRceEE1XHgwNS0gYFx4QzJceEQzKVx4QkJweFRsRFx4QzNceDg2XHhFQVx4OUY9XHhGNlx4OTVceDk3Xjk2XHhCNFx4QzFceDE2XHg5Mlx4MUIofVx4ODI8XHgxNSonTFx4RUJceDA4XHhDQT89XHhGNzZhXHgwNFx4MDBceEUyRlx4Q0FceDAxXHhFNTgtXHhCQVx4MDU2XHhFOXpceEY4XHgxQ1x4QkJceDhFXHg4Nlx4RTZceEU3IVx4QTEvXHg5NkZVK1x4MTVceEM0Slx4MTlceEMxQDhceENGXHhBQlx4QUQlQHVceEI5XHhFRTlfXHgxRlx4ODkzbTtceDkyUVx4MUFceEMzZlhceDA4XHhCRFx4RjFceEVGXHgxM1x4QjJRXHgxOVx4RjVceEUxXHhDMG8kXVx4RkEzXHgwQjhceENBe1x4MUNSXHgwQ1x4MDdceEU4ZVx4OEFceEZBXHg5MydceEM3Tlx4MDFceEUzXHhEOVx4QkF4XFx4Q0NbfnlceDkxXHhGQS1ceDA5XHhGQ1x4Q0VceDFGXHgwNlRceDBFXHhGOVx4RkVaXHgxNi5ceEEzXHhEOFx4RTlceEJCXHhDOEVceDlBXHg5N1x4ODVqXHgxQVx4QzZceEE2XHg4Rlx4OEZhXHhCMFx4ODZceDgxXHhCMFx4QUQ6XHgwQU9ceDAxXHhBQ1x4RDNceDgyTVx4RTFceDA1LzVceEU5XHgxRiVceENEXHgxN1x4RjRceDFEXHhDQVx4QTh+XHhCN1x4MDRAXHhDRVx4QzRceEVEXHhCRVx4MEE5XHg5NFx4QjJceEY3XHg5NXBceEQ2XHg4NVx4RkFceDE4Ij4nTVx4QUZceDExXHhBQ1FceEE5SVx4OENceDkzXHhCOEk2Tlx4RENceEEyXHgxQVx4RjlceDFDVSJceDA2XHhEQWw5XHhBNjxPXHhCOUo0XHhEQVx4RTRlXHgxRDVceDE3XHhBNVx4MTdceDhGXHgxNlx4QUFkcFx4QjApM2A3XHgwQlx4QzdceEFDYXxceDFBfVx4RTdGKFx4RjNceDgwJT5ceEU2S1x4QUZceEFFXHg5RFx4OEN9XHhCNmFceERCblx4OUFceEFBckFnXHhDN0pDXHhBQlx4Q0ZpN09ceEM0XHg5RHRLXHg4NnhceDFFXHgwMFx4RUVceEIzXHg5NVx4REZceEE4blx4MDdceDhDelx4RDR4XHhFRDNceEU4XHhBQXFceEZFXHhGN1lceEY3XHhFMVx4RDVFSlx4ODFceDFFXHhBMzlceEI3XHhEN1x4RjZLXHhEQlx4RjhoXHhCMVx4QkFxTVx4RDNceEYwcjNceDEzXHgxQ1x4RTIgXHg5Q1x4RDZceDA1XHhCQVx4OURyXHhDRWRPXHg4MFx4RkVceDBBXHhFQVx4QTZceDgyZ1x4ODQkWVx4MDgoXHgwQVx4RkRceEUxekxceDkxemUnSFx4RjRceDA4Y2FceERCXHhENlx4OEZaXHhEMVx4OTdceEQ1XHg5NVx4ODc7UVx4MThceEQ2Jkt7QVx4Q0V9KFx4RTJceEE0aFx4QTU6Yj9ceEQ1XHhFMChceERGbFx4REFceDlCXHhFQlx4MEVceDE2XHhDRWddK2tceDg1NTk9XHhBQTRCMFx4OThceEU5YiYmXE8sc1x4QzFFRFx4RTVceEQ0XHhDQS1ceDEwXHhDRFx4MUNceDk1Slx4ODNceEZEXHg5Rm5ceEVFXHg4N1x4RUJceDk0XHhFQlx4MTVgdEFceDE5XHgwRFx4RUVceDA4Nlx4MDlceDg4e1x4OUNceEY4XHhGNGUyXHg4RFx4QTRceDg0UFx4MDFceEU5XHhCRiJeXHhBQ1x4QzBceENFXHhFNlx4QzRceEFFXHhBOHFceEQyfVx4OTZceDE2XHgwNFx4OTNceEFDXHhFM1x4MTlceEQ0aVx4QjNJXHg5Q21ceDA0XHhDMShnXHgxQVx4MDBceEI2Klx4MTVceEZCXHg3RkpceEY4XHgxOFwzXHhGRjNceERGXHhDMTVceEE5XHhDQVx4MDBceEM5SzxQOVx4MDFceEU4fFx4OURTS1x4ODBdaWdaXHg5NGxceEZGXHhCN35ceEEzcEVceEE0XHgwODZRXHgwRlx4MEVQXHhBN2xceDA4XHhGQVsiXHg5Mlx4REZceERFXHhBNlx4OTRceDEwXHhBMTtceEI1XHg4OFx4OTNceDhFMHldXHhFQVx4MDhcXHhEQVx4ODRceEVBSFx4RTJceDdGXHgxNXZceEFDXHhBMlx4RDJzXHgxQ1lceDkyXHhEQVx4QTgzXHg4Qmw6XHg5OFx4OTVceEJEXHhFN1x4MURceEVEXHhGNjBBLnFceDA5XHhDMlx4RUFceDE1XHhGRlx4MTVceEU3XHhDQVx4QjRceEU3JVx4RjZceDlGXHg5RFx4Q0RceEFFXHgwNFx4OUJceEExXHhEQ1JMXHgxOFx4MDhceEZFPVx4QTc8XHhFNVx4OUU3XHhDRVx4RThceDA4XHhFRUBceEM3XHg5MlEwXHg4RVx4RDdmXHg5NFx4RjFceDAzXHhBQ1x4ODlceDk3XHhGOUlceDBGIVx4QTVceEIxXHhGNC9NO1x4RjhceDk0XHhBRFx4RDZceEQ1LFx4MDRceDE5QTFtXHhGRFx4QURceEM1XHhCNWNceDA3S3JceEU4XHgxRlx4MUJceEFDXHhCMithXHhFNFx4MTZNXHhBQlx4OTFlNzoxXHhFOVx4MTNceEU3XHhFNUxceDFGXHhENlFvZ1FceEU4ZFx4QUJceEM2JVx4OTdceEFEXHg5Rlx4RDdceDhBXHhBQnJceEJCXHhFOFtceEY0XHhCMlpmXHgxRX5nXHhBN1x4ODhceEUyXHhCM1x4RDdceDAyXHg5Q1x4REFfIXhceENEXHhGRlx4RkYtfFx4ODBceDgyXHhFMlx4RDZceEY4WFx4RDUtXHgwQlx4REM8XHhGMFhceEY1XHhGRlx4QTJceDhCXHhGNVx4QjNdXHhCMFpceEUyXHhDM1x4RjVUXHg5NUtKXHhCQlx4RURceEIxXHgwNiJceEY3XHhENEFceDBETlx4OURnXFx4MUVVIGRceEIxXHhENFpceDA3XHgxNlx4RUNceDE2XHhBRWlzQFx4RTZceDExXHg5OT9fXHg5Q1x4OUZceDlCXHhCRFx4ODZceEYxNCw3XHhCOVJceEQ1LlpceEFGSlx4QTZceEZCY1dLT1x4RDdceEM5XHhBQTdceEI5XHhEN1x4RTFceENCXHhEM1x4QzVceEM2P1x4OERceEJDXHhDMVx4Q0JceDk2XHhFRVx4MTRceEI5bVx4RDJceEEzSlx4OEZFXHg4NFx4MEIuXHg4OVx4OTlceDkyXHhCRFx4RUFceEQ2d1x4REFTXHg5RjZceDk0XHhBQlx4Q0NceEI2XHgxM1x4Q0QgSlx4RTRceDg3XURceDg3XHhEQVx4OTlUJ1x4ODNceDAza1x4QzJceDk3XHhDN1x4QjhceEY0MU9ceDk2XHg5RVx4QjlceDBCXHhEOSxceENGXzk1XHhFOVx4REZceEJFcnpceDAwXHhGRFx4MTVceEM4XHg5MFx4ODFYNnNceEMyWFx4RDlceEEzXHhBOFx4QjRceEVFKlx4QTNceDA4RFx4ODZgXHhGQlx4QTRceDA5Q1x4RDBUe1x4MUNceEMwLFx4RERceEQ5XHg4OVx4RDFceEVEPnBceEE2M1x4MUE+XHg4Nlx4N0YpXHgxMVx4RDJceEI0XHhERSBceEQ2XHg5NVx4QjhceEQxXFx4QTRceDFDRlx4MTU5Olx4RTVceDBGSVF+XHhCN3h2XHhCM1x4MUE7SVx4MTFceDkxXHhBRlx4RUZceEZCKVx4RUFceDBCXHgwRnhkK0pceERBXHhFMFx4QjJceDdGOFx4OUYoXFx4RjNceDhDU1x4MTdceDg2XHhERDZceDA0XHhBNlx4OTNceEIzXHhBRVx4ODdceDBDXHhCOVx4Q0JceDEwXHhGRlx4OTI8PUBceDEyTypceEMyXHhCQ0Z+XHhGOVx4OTVceDhDXHhCNmNceDE1XHgxM1x4RjYrXHhFQ2MlXHhEQVhlXHgwNXR5XHhEQVx4MTZceERBc1x4QThceDlFXHgxQ1x4MTZceEI4XHhGMlx4MUYyLVx4OUNceEQ1Qlx4RDBkflx4QUFaXHhDMVgoVFx4OUFceEMwMk9ceEY4R1x4OTdceDBDTFx4OTVceDA4XHhEN1x4Q0ZceDBEXHgwMFx4MUZTJVx4MTJ9YVx4ODdceDg2XHhFMVx4RUNceDAzcFx4MUIuXHhCQVx4RkJXaFx4OENceEUzXHhFNlx4OUNceEVDN1NceEI3XHhGRlx4OTdceDA3OFx4Q0VceDE5Tlx4QjBceEQzeVx4RUF1XHhBNlx4RTNceEU1XHgxMFx4MDlHXHhCM1x4QUFceDhGXHhERFx4MTdceEUzXHg5Nlx4QjQ0XHg5Q0pceDlDezpceDFCXHhCOFx4OTlceDA0PVx4MUVceEVBXHhFRHxceDBBXHgwMktceDhEXHhBQ1x4ODZceEUwXHgxRVx4OUZceEY5XHg5M3YkXHhFQVx4MDhceENFXHhFNCwqT1x4OERceEREXHg5OFx4OUZceDgwXHhDQ1x4QkNceERDXHhCOTlceEFDSVx4QTBceDhEXHgxRFx4REJceEI3XHhDOVx4MEFceEMyUFx4QUYmXHhGNFx4MEVceEMyOzRHXHgxOVttXHhEOFx4QkFceEQ3dlx4OERBXHhEQVFceDlCLDpceEIzWGlceDkxXHhGMyRceDlDXHg5OVx4RUFHXHgxRixceEYxW1x4QzdIXTEoKFx4MThceERDYXc/XHhEMVx4RURceEFDXHhFNlx4MTNceDA0XHgwRVx4MENceEU5XHg4Mlx4ODd9MEE1flx4RkU5KThzXHgxOFx4MTVceEY1XHhCOXpceEM0SSRlXHgxNFx4Q0I3YjxceDA5SD9ceEMxXHhGN0RceEZESlx4RTNceDE4XHgxN1x4RTJceERBXHhDNlx4QjVceEI2XHhGQVx4MUR5XHhENDdHTFx4RjVceEZFXHgxNnpceEQ4XHhBMlx4MThceDk2a1x4Q0RceEVGXHhBQ1x4QkVceEVDXHg5NFx4QjJceDE3XHhENVx4MTJkR1FceEU2XHhGRC9LXHhDRlx4RUZceEM0d21ceDBEXHgxOVx4QjdceEIwXHhEMFx4QzJceDdGeVx4OURfaFx4QTdceEM0XHgwQlx4QjZ8XHg4RUlceEM2TVx4MURceEYyXHhBNVx4N0ZceEZBXHgxNVx4QTR8XHg5M1x4MDhceDk5XHgxRFx4OENqXHhGQlBceEY2N1x4RDAgXHhGNVx4MENceEIzXHhDRlx4QTlceEQ4XHhGNFx4QjF6OWxceDA4XHhEQVx4QjJceDkxTVx4RkJZYFx4MDZceDBDXVx4OTYjXHg4M1x4RDZceEQxXHg5Nlx4OTV5N3hOXHhEQVx4QURceEZFeVx4Q0NceDlCXHhFMlx4RDdceEU5RFx4QjVkKj8tT0Q/MFx4ODdceDFFXHhGRVx4RjQqa0dNXHhBNVx4OUVceDBCP1x4MDV7XHhGOFx4RkZceEM4VXJceEVCXHhCQylceDBCL1x4OUNceEQ0XHhEMnhSXHhEMVx4RTUpJDpxXHhDRlx4QTVceDAyXHhFRmdceEQ4ZFx4RDhceDBDXHhBOX5bZWxceEExXHg5NF52XHhDM0ZceEZEXHg5NmVceERFMVx4RkUuXFx4QTdceDE3ciUnYUpdXHgwRmFceEJDXHhEQVx4QTNEXHg5Nj5ceEE3XHhGODtceEYyWVx4MDBceEEwXHhCQlx4QTg6XHgxOVx4RUJceEZCQXxceDhFXHg4OVx4MEFceDlDY2VceEM2XHhCMlx4QUFceEJEWD9ceDg2XHgxM007MVx4RDVceDkxXHhDQ1x4Q0ZceEFEdFx4ODZceEY2XHgxRlx4QjlceEE5XHhGNVx4RTZceEIyXHgwQVx4Q0NceDE2dVBceDBBXHhGN1x4RDQjXHhGNGpfXHhERVx4MDJceEFCYjdlXHhENlx4RjFceEM5QlNceEE3Q1x4QzUrXHhBNlx4RkRceEVGXHgwOVkqSlx4QzNceEY4XHhEN1x4MEJceEFCXHg3Rlx4OENceERDXHhDOUNceEVDXHhBOFx4QkJNXHg4NzE6XHhDNlx4ODRceEI3MmtceDkzXHhCQ1x4RjNceDk2QjtceEVEXHhBNVx4RjZceEEwXHg4OVx4RkFceDAxXHhFQmBceEU3XHg4M1x4MDZceDk0XHhDNlpceDg3K1x4RTE2XHg4RVx4OThceEM3ZG46OVx4MUFceEIyXHg5Mn1ceDE1M1x4QzVceEREXHhCMkpceEQzXHhGRlx4RjVEXHgwN1x4Q0Q8XHg5Q1x4RTZceENBalx4RTJceEQ3XHhBQ1x4MUVceDlDXHg4MixceEMwXHhGQlx4QzQzXHgxQkJceEJCMlx4OEVceEE0fH1ceDAzKVx4RjFceDhGXHhGRkRceEVBXHhENFx4RkNceENDXHhBRVx4ODVKXHhBRlx4QzdceEE5XHhERlx4MUJceDAzWkdceEM0T1x4QzBbS2xceERGXHg3Rk5ceDhGZ1x4QjlceDAxJFx4OUNceENBLFJ1IkUmflx4MUNceDE4LkpceDE0XHhGM1x4QUVceEYzXHg5OFx4ODZceDgxMVx4RDNxXHhCNThceDA0ZVx4QjRceEUxXHhGMlx4Rjk0XHhCMFx4ODRceEQycVx4QUFceDg1XHhCRV9xXHhBQVx4RkU8XHg5N3FceEFDRVx4QUQ0XHhEMVx4ODA7Wlx4OUFceDhCXHhCRnNceDEzWVx4QURceDBEXHgxRVx4OUVtXHhERFx4MUZceEE1XHhDOVx4QThwXHhFM2pceDk3cVx4QzdGflx4RjZceEUxXHg3Rlx4QURceDg3XHg5QSxceDhCcVx4QUR2QVx4RjNceEVBXHhDNERceERGQlx4MTNceEVGXHg5Mlx4RkZceDBEXHhDMFx4OTZbXHhBNDw5XHhCNFx4RjJceDk4I1x4QkEkXHhBRWE4JGlceEU2XHg5N1x4QzBceENDXHg5OFx4RjJceDg3XHhEQlx4OTJceEI4XHgxM1x4QUVceEJDKlx4QjhceDBGXHhGNFBceEZFfFBAXHhEQ0FceEE4cFx4RjdceDFDaidceEMyMVx4QUJceDhBVyBceDA0XHhGRV9nXHhFRVx4MUVceEZDXHg5Q1x4QzJceDk0XHhEQlx4ODFNXHhGNyNceEMzZlx4MTFceEU1XHhGRlx4QTBceEY0XHhBMW5ceDgyLlx4MDhceEYyXHhCOVx4OUNceDkxXHhDMTFbKCBceDhGXHg4OC0oXHhERVx4RUUyXHg5RVx4RUNceDA5XHhBQ1x4MEVcXHgxOFx4QThceEMzSVx4RjIzXHgwMVx4RENceEY0Z1x4MTRceEM5XHhFMGInXHg4Q1x4QTJceEUyXHgxRXZceEYzKjtceERFXHhGQlx4OTU/XHgxQ1x4QjhceEM4bFx4QzlDXHhEQ15ceDg0XHhEM1x4ODcrXHg4MDg3I1x4RENceDk5XHhDRix0XHgxMVx4ODJceDE5XHg4Nlx4RDF9V1x4QTRceEFFXHhFQXtceEIwXHhBMVh5eFx4MDJrXHg4MVlQXHgxN1x4ODdceENBVFx4MDRoXHhCNFx4N0ZceEMwXHhENlx4QzBceEI0XHhEN3lceDA4IXNceEIzXHhBNFx4OThceEFCNHxceEUzalx4OERceEU4XHg5NVx4RTRceEIwcVx4OEZceEExXHhEQ1x4RTlceDE4XHg4NVx4RTVYXHgxM2tceDExNmNceEU5XHhBNChceDE1M1x4QURpXHhBOF1ceEFGXHhEOTNceDg4XHgxMFx4Q0I0PFx4REFceDlBXHhENkRceDA2YVx4RUVceDE5Z1x4OTRceDAzXHhDMFx4OURceDE1XHg4OD1ceEU3dU5ceEY1LFx4MTA4XHg4RmYlXHgwRlNceEZBXHg4N1x4RkRceEY1cEdceENCXHhFRFx4MEJceDg5T1x4MUZceDA2dlx4QTFceDkxQ1x4OENceEJEXHhFNVx4QzFlXHhBM1NnXHhDQms6XHhGREFceEY0UFx4RjJceEI4XHhCODBceDhBXHgwREM+XHhCOVx4MEVceDhFXHg4N1x4OTJceEQzZGRceDgxQDdSQ1x4Q0Z4XHhGRFx4Q0VfXHhFMFx4QTRceERGXHgxMVx4QjFceEVFXHhBM1x4QUNrNVx4MDUoXHhBNE1ceEVFblx4RTl2XHhDMVx4QzBceDgwXHgxQl9ceENBXHhGQzdceEFFb1x4QUFNXHhFQlx4QTZceEE5XHgxNlx4QTZceDAwXHhCRlx4MTFceENEXHhFNVx4QkF2XHg5RVx4RjRceEQ1XHhFNFx4RjZ+XHhGNVx4REJceEUxXHgxOVx4ODhceEYzXHhCQzdceEY0XHgxM1x4RjBlXHgwM1x4ODU3XHgwRVx4QTFceDAyXHhCRnlceEFGXHhDOEVceDlCXHgxQypceEJEc1x4QzFceDE3Rlx4RTVQPlx4MUNceEZEIX10XHg4Nlx4QkNceDE0UFx4QjZGXHhBQiRceDE5XHgwNHo/b1x4QThceEVDXHhCRjhceERCXHhFNFx4RTZceENFYV5ceDBFXHg5RVx4QUI9XHhGME9ceENFXHg4OVx4RTUtWHVOXHhDQVx4QzdYXHhENlx4REJiXHgwNVx4RkFceEQ2XHhGMFx4QzVFXHhEQVx4RTdceEU2XHgwN1x4Q0NkXHg4RlB6XHgxRHtceEI3N1x4QkE8XHgxNVx4OTVceEE3XHg5Mlx4RTNceEVDXHg5Mlx4RUE4XHg3Rlx4REU8JSdceDhEXHgwNVx4OEZceEQ0fFx4RkQpXFteJlx4OUNceENDXHhFNnJceDlGXHhBNFx4QjFZXHg5OVx4QjNFLVx4Q0QlXHhFM1x4OURceEMyXHhCN1x4QjlceEVDXHhFMFx4RUJceEE1XHgxQi1ceDkwJ1x4QzdceDExej8/XHhGQlx4RTNceEFCXHgwQ1x4QjdceEQyXHhFQlx4QThceDBCXHhDOEwgXHgwMlx4Qjh5IXYtO0BceDAyXHhBMlx4ODRceEE0XHgxRlx4MTZmXHhBMFx4QTFceEU5XHhEMlx4QzBceEUzXHhEOTRceDg2clx4MTRceEZGXHgwNTBeXHhDRFx4MDJceDgxXHgxM1x4OUFceEJBXHgwMVx4QUJceDE4XHgxNlx4OTE3XHhDN1x4RDlceDk5XHgxM2JceEU0Zlx4QTc5XHhGRXRceDA2XHgwMj9ceDA3XHhEOVx4QTQzP1x4RDc4TChceEZEXHhENlx4RkNceERCRltceDFGXHgxOFx4MDRdXHg5N1x4QkVceDgwXHhEMnxceEREXHhGNVx4RjVceEMzIlx4OEFMXHg5RXBTXHhBRlx4QzdceEU1XHgwNlx4MUVceDA2Ni1ceDExQlx4MTRceDkxXHgxOFx4OUQiXHgxQjBceEIwZFx4RkJceENCXHg4QyldOUgzXHg4NFx4QUZceEVFXHhFRVx4QUVceDBDXHhGN1x4QzNceDhEXHhCMVx4RjBceEQwXHhEN1x4RDQnXHhDQlx4QjFceEU4XHg5Rlx4QzJIXHhENzBceDk2SWRceDg1XHg5MDtceEMyKURceDk5UShceDgzU0xceEY2XHhFRlx4MDNceDE3fX1ceEM1XHhBRlx4MEFceEI4XHhEN1x4OTF7XHgwQ1x4MUVceERCXHg4Mlx4MTNceEFDU1x4QjlceEZEXHhFNVx4QUFJXHhDNVx4QzlIXHhCQnY6XHhEOFx4OTZvXHhGM1x4QjQmXHhBQlx4RkJceDAxcFx4QTNceEY2Qlx4QTJceDk5XHgwRFx4RTApXHhDQ1x4MDB+XHgwM31YXHhDQ1x4QjZ4XHg5ODIpXHhEM1JUXHhERFx4QzFceEEyXHgxRFx4RDQoXHhGNVx4MEFceDFEXHhFQVx4RDVceEY3a1x4MDdceDk4R1x4RUNpXHhCNVx4OERceEU3XHhDMnZceDk2U1x4RjZceDgwOmJceEU4XHhGNVx4RDVceEE5Vlx4QUZWXHhBRlx4QTlqNVx4RjBceEZGblx4RTBceDg3d1x4ODhceDFBXHgxOVx4QzVceDg5XHgwQVx4OEZceEEzXHhEQ1x4N0ZZKlx4QkVceDA4Z1x4Q0FrXHhFNS5ceDEyeFx4ODlURlx4QUJceEUzb1x4RThceDlCXHhFNVx4RjZceDBFQU5FbiJceDk2KFx4OUE+b19ceEQzYFNceEE2XHhDRVx4N0Z7XHhFMFx4Q0VXZk1ceEZDXHg4ND5oXHhCRVx4MTVceEE1d3RceDE3XHhCN0omazh6RFpceEMwXHgxMlx4MDZceEI2XHgwQlx4RUFceDEwJW1ceEI4XHhENlx4QUZceEM0XHg4RSpceEJEXHhDOFx4REYuXHhDM349WFx4QzE5XHg4QmRceEM5XHhFNVx4RUFceEU1dlx4QzZkXHhBQlx4RkRhbVx4RUYqXHhGNylsXHhDMklceDE1XHgxNFx4MTlceEI5IFx4RkJWXHg4RFx4QTVceEU5XHhEMFx4MER7XHhENFx4MUVceEE5XHhFMlx4RTF1XHhFRVx4ODhceEZCcFx4MTlceEUyXHg4Rlx4MDFcXHhFMkNdIFx4Q0RkXHhGNlxceDkzej5ceEE0XV5BIz1ceEQzXHg5Qlx4MUIkRHNceEUyXHhDMVx4MDhceDk5XHhFNlx4QzBVXHg4RVx4QzVceDgwXHgwNFRceDBCXHhBOFx4QTRzXHgwNVx4QUNceDE0XHhFMFx4QUNceDFBcFx4MTNceEZEXHhBQ1x4RjRhXHgxNFx4QUQ7XHhGNlBceEE2NVx4RjVceEQxPW9ceDEwXHhERFx4QzNceENDXHhDQVwkXHhDNChBPVx4QzcpXHhGRFx4OENceERCXHhGOVx4OTJceDg5fVx4RjZceEI5XHhCRlx4OTlceEIxOThceEJBXHhGMVx4RDhceDlFSlx4MTVceENCR1x4QUNQXHg5Q1x4OEVceDlBb2RceDE1XHhBNm9ceDgxXHhCQVx4RTFceDE1XHgwQ1x4OTVceEVBXHg4NF9ceEYwU1x4RDRceEUxXHhFMyEuR1x4ODBceDFBfVx4OTFceEQzKFx4Q0FceEU1XHhGNl08XHhBMlx4RUNUXHg5QVx4RDNHXHhDNlx4QzNkZWlceEYxXHhEN3dceDA0XHhFQVx4RDE9XHhDQ1x4MTNceDgyXHhDN1VceDhGXHhGMWBceEI5K0sqKlx4ODY3T1x4OERceEE1XHg5OVx4ODJVd1FSXVx4QkIoXHg5NWpLXHg3RiFtXHhCQ0BceEEyOFx4MUZQfktceDA0XHhDM1x4RkZceDgwP2tdXHg5RW5ceEM1MFlceEE4XHhGMGRceERDXHhBRlx4QzZ8XHhFN1x4MUVceDgzXHhBNFx4OEIoalx4RjVBXHhDMElmXHhCRlx4RDdtXHhFRlx4QzNceERFZFx4RjFceEU4XHhEMlx4OEZBJVx4Q0ZceDFEbjFsXHhDNi5ceDAxXHhFOVx4ODAsXHgwNFx4QzZceDEzXHgwQ1x4QjNceDBBXHhFOSxqSTw6XHhCQ3ZceDFCXHhGOWFceDFFSX5ceDBEcXdwWlx4QjBceEFBXHg5MFx4RTJceEFDXHgxRVx4RDhceDg1RlosXHgxNVx4RjBceEIwXHhBRVx4OTVceDE2QFx4REZceDE3X1x4REZceDk4XHgxMlx4Q0FYQlx4RUI8altceDhBXHg4MVx4QkFSXHhEOFx4OUNceEIwVVx4MTRceEM2XHgwRVx4RjVceEIzXHgxRlx4RURceDgxXHhGQlx4RTAxO1x4RTNsQFx4RjlceDlBXHg4QVx4MDZceDEzXHg5QjdceEQzXHhBQ1x4QTlceDFDXHgwOXxceEQ2Wno0XHg4N0FyXHgwQ1x4MUJ7XHhGQVx4MDZOXHhDOVx4RjV1XHgxNlx4QkJSeVx4QTlceEFFXHhFNlx4QThceDdGXHhGOFx4MEFceEVGXHhDRlx4QjhceDk5XHhGM1x4RjJceEM4XHhBN1x4QjdceDBBXXlceEI1XHhBMlx4OUF5XHhEOFx4QjFceEQ5KFx4RDFceDA3XHgwM1x4OTRcXHg4Nlx4Q0RceDAzXHg5RVx4RkJceEY1azFceENDXHgxOUlceDAwXHhFNWlfNFx4OUR6UlZceEREYVx4OURIP0BceDAxXHg4Mlx4RjJceDg0XHhGM1x4RjFceDhBXHhDNVx4MUZ9XHhGQVx4RTFceEE1XHg4OVx4QTRceEYyZlx4ODRceDhFUVx4OTBceDBFXHg5NCAoXHhEOChceEE0XHgwN01ceDgzWVx4MEJceDAweFx4ODBceEJFXHg5Rlx4QTNceDBBXHhBNl9nXHgxNnBkXHgwQlx4MTgpXHhBRG9ceEE1XXpceDE1XHhCMFlceDBEIlx4RDlceEU1Nlx4RkVceDhBXHg4RFx4OTlceDFDPXM2XHhEMkQpXHhBMVx4QjVceDExbVx4RUNceEVEXHg4MmJceEU5Llx4QURJQlx4OURrXHhBNFx4RjgvXHhFMT9ceEQ5XHhBNVx4RURceDlDXHhBRFx4QzZceEEyXHhCQ2pceEFEPlx4ODZwWFx4MDNRXHgxNlx4RTkiKD5ceDE2c1x4ODJceEY0fFx4Q0RceEY2XHhFNFx4RjVceEQ5XHhBQUtgXHhDOCwjRGJceDE4XVx4REUjXHgwNjBKaFx4OURceEYxXHhEMFx4ODBNe1x4OTNceEY0XHhGMVx4MDNULlx4RThceEJBXHhERlx4MDJceEQyS1x4OENceERBXHhBMlx4OTNceEM0XHhBRFx4RTlceEEzXHhBMVx4MEZceDFBXHhBN1x4ODdceEI3XHg4M1x4QjUrMVx4RTNkXHhCQVx4RTJceEYzXHg5Qlx4OUVceEJCXHgwRVx4RTZceDlEXHhCMVx4ODdcenZceEJBJlxceDgxXHhGQWJKXHhFQlx4ODlceDAxXHg5MVx4MUVceEMxXHhBMVx4QjNceDE2IVx4QTJceEJFXHhGMlx4RDJceDFGJVx4QkVceEFEaVx4QTJWUCVceEVFa1x4QzBMXHg4M3tceEFEXHg5OVx4QkRceDlDMHlceEVDTVx4ODUzXHhEN3RmJXxceEJFb1x4OTFceDg4MHZ5XHhBNVx4OTFceDk5QVx4QTBceEMycVtceDk1RWJceEY3XHhGNFx4ODRceDlGUFx4QTNVXHhCNl45XHhEMjlceENDXHhGMDRceEIzZFx4QkNceEE1U1x4MDghVlx4MEZceEEzXHhCRURceDA3XHg5MVJceDhDXHhDRTN9TkN2XHhDMVx4OTEjdDFceEFCcilceEJFXHg5QVx4QUVceDk3XHg4OFx4N0ZceDdGRFx4RDRceDFGXHhDMVx4RTZpXHhEOTcoX1x4ODhNXHgxRlx4RjlceDBCXHhFNFx4QzBceEQ5XHhBNnlceDFESVx4RjRceEY2XHhDNlx4QUFceDFBXHg4QkFceDA4dVRceEU1QzdceDA5XHg4MTNceEFGO1x4RjdceEMzXHgxNmhdXHg5Rlx4QTZceDlBN1x4N0ZceDhFXHgwOWBceEJGbFx4QjZceEFGIFx4RTZceEFBLCtpXHg5Q1x4ODQ1XHgwNmhwXHhBNzZceDFBXHg4QmxhXHgxN1x4MDJceEI2XHg5Q1x4OTVAXHhDRFx4QjNceEI0XHhFN1x4MDZceEMxXHhDRFx4QkRceEFEXHhFNVx4OUR6NVx4OTFSXHhGQTR8XHhDNTtceEMxXHhFQ1x4Q0NceENGXHhBOFx4MTdceDg0XHgxOFx4MUVceDEwR1x4RTNceERGXHgxRlx4OTBceEYzRX1ceEZCXHhGQlx4ODNceEY5XHhDQlx4QzI+XHhFQlx4MTNceEQ3XHgwRlx4ODNceENBXHJceEY1XHgwMFx4MURceEFDNkRwXHhDOCRceEQ2XHg4M1dceEI2XHgxMFx4MUVceEQ2XHhDRlx4RDBkXHhGOVx4QzlceEY2XHg5Nlx4QjBceDA0XHhCOFx4QTZbXHg4M0RceERCXHgxRVx4ODZceDgxXHhFRVx4MTFiWVx4RUM5XHhBRlx4RURceDlFXHhEOVx4ODFceEQyXHhFMlx4QzhceDFCSG1ceDA5KFx4RjVceERBXHhDQ1x4MTBceENDXHg5OVx4RURceEY4XHhDNFx4Q0FceDFEIFx4OTVceEE2UVx4Q0NxXHhGNVx4MEMzQlx4MTZceDkwXHgxME00XltceEFCXHgxM1x4RDFceEZESVx4RTcmT1x4RUFceDkxYVx4MTdceEVGXHg4Rj1ceDlCXHhEN3dOXHhBRi1ceDlGbTFpXHg4Rlx4QThceEUwXHgwNlx4QUNceDhFUlx4RjRceDlFXHgxM1x4Q0Z4XHgwMCVceEMyJ1JceDk3fiVPPlx4MDBbXHhGQlx4Q0NUa1x4ODZceDlFXHhDN1x4REI/XHhEMlx4RENceDE5XHhFMFx4ODNceDkxXHgxMFx4RDZceEI0XHhDOTlHXHg4NDVceDEyXHhDMjBceEZGXHg4OVx4QUFVM1x4MTlceDA3XHhGMlx4QUVceERCbHVceDlEPkJceEMzXHhFOFx4MUExXHgxQ0dceEIzOUBmXHhFRlx4RTdceEQ0XHg5NFx4RjhceEM2XHgxNW9ceDgxXHgwMVx4QUFuXHgwMFx4MTBceENFXHg4MGFceDFDXHhEQyNJOlx4QjR9XHhCNlx4RjNqXHhFM1x4OUVceEI2ZVx4OThceEZGXHhGOVx4RjhceDkxdzRceEYxXHg4RC1ceEI4XHhEOVx4OEMkXHhDMlx4Q0VceDE2XHhGRCpQI1x4RTZceDlEXHhFNFZceDk0MTZceDhBXHg5MFlzXHg4Rlx4RjIxXHhBN1x4OUJceDg0XHhCQVx4QjJceEY5XHg4RVx4QTl1I1x4REZceDgwR1x4OEZGXHhDRWNceDlBZ3NceDExLlRdeFU3XHhDOVx4RTNceDA2eUNceEVEI3FceDg0XHgwQzNBXHhDQlx4ODFtXHhFOC9ceEYxXHhCMlx4QjhceDBCO1x4RUNceEU3XHhCNVx4MDNceDg4XHhCNT1ceEUxZ1x4RTFceEFEXHhDRCZceEJDXHg5Mlx4QUE2XHhBMHFceEY2XHhCMVx4MDI2XHhGNVx4MDVceEIzXHhGRGhdTjlceDEwXzJceERBXHgwMlx4OTE8XHgwNFJceENGXHhDOFx4QjlwXHhGNFx4OThceDlFXHgxMWBceEU4bSpceDBBezo/clx4OTRceEU2XHhBRHU0XHhGMFx4QjFceEVBXHhDQ1x4MUZaXHgwOVx4RTZceEZCYzcqXHhCOFx4QUVSXHhBOV8rXHhFM1x4REJ0XHhBOVx4MUZceEYxXHhFNVx4QkZ8XHg4NE9ceEE0dlx4OTJJXHgwMFdceEZEclx4REVBXHhCQ3xceEREa1x4OEZceEU0XHg4RFx4OTI8XHhCMlJAcTg1a1x4RTNeSV99Zlx4OTRceDg3XHhBQntxXHhBQVx4RTNceEE1YihfXHhEOUBceEFCXHhGN1x4Q0VceEI3XHg5M1x4QTFceEMzXHhCNlx4MEJceEM2OFx4RDZOXHhCNFx4Q0RceEE3XHhCRFx4QzZceEVEXHhBQSRceERBXHhCM1x4OTBceEU4XHgwM1x4QjBAZFx4RDFceENCPlx4QzlceEM3PFx4RkF0ZGVceERCXHgxM1x4RjZXVnpceERDXHgxOVx4MTVwXHhCNVx4QjZ1VyhYeCBceEQ5dFx4RDRceDgyXHgxQ1x4N0Y+IVx4QUNceEM5XHhDOVx4RDRhXHgxQlx4MTlceEQ4QFx4OUFceEM1X1VceEEwXHhDM1x4MURceEFBV2tceDdGXHg4Nlx4QjFcXHhDQktLXHgwMDRceDlFXHhCM1x4REFYXHhENlx4ODZceEJBXHhBMVx4RDFceEIzXHgxQk9ceEY3XHhDRlx4RjVceEI3LSxXXHhBN1hceDk4Y1x4QUFceEUyXVx4MDF7JSFceEE5XHg5Nlx4MTBceEE0YVx4RjJAelx4MDZ7XHhBQjphXHhGRFx4RUJbXHhGRVx4MTZ6XHhFNmhhXHhBMlx4QTZceDFBfVx4QTJceENGQlx4RDhceERCXHg5RThceDk1XHg5RkFWXHhBRlx4RTJceEFBXHgwRFx4QTFceDA2JFx4QkVbXyZceEJDXHg5MFx4MTNceEE3XHgwNFx4MUZceDhEZVx4QUVceEFCQVx4OEVceDhCXHhGMUwhXHgxOVJceDlEXHgxNVx4RUZceEMyXHhGQllceENGdVdceDlCXHhEQVx4OERceEEyXHgxMUxtXHhENlx4MEIrXHgwQyFceDBGJVx4MDJceDE3XHhFMl9ceEQ5Rlx4Qjg/XHhBNFx4QTdceDk3XHg5Nlx4RDRceEU2JHNceDhEXHhBQ1x4RkZceEIwaFx4RUFceEYyXHg5M1x4RURSXHgwMFFYN1x4RjFceEU3XHhGQ1x4ODFceDEzXHhEM1x4OTRceEY0XHg5OVx4OUVceEEzUFx4MEZsXHhEMlx4MTdceDBFXHhDNE5NXHhCN1x4MTFceEM5XHgwQydceEI3XHgxRiJceEVDXHhFMFx4QjBceDgzREBceEYxXHgwMmxceDEwWlx4OEFceEE0XHhCMEVceDlDKFx4QzFceDkzMlx4RDdceEFGI1xceEFGIDoiWFx4QTNceEMzUFx4OTJceEIzXHg4QmJceEZDXHhFMFx4QzVceEZGXHhCNVx4RDRceDFFXHhDQlx4OThceEYxXHgwOVx4RTU6XHg5REtjXHhBOVx4QzY5Xlx4MEVceEQ1XHhFQkVceEVFXHg4Nz9ceDkyXHhDOFx4OURBNlx4RjVaOzdceDBFXHhGMnZBXHhCMWNceEI2XHhGOVx4RTE7XHhDQmJceEM0XHhDMFx4RDJceENBXHhEQXpceEY5XHhFRFx4RjJWXHhBNC1ceDkxXHhFMFx4RjhcXHgxNlx4QThceEM0JHhceENEXHhDMkVceDFCXHgwQiRceDg2XHhGMVx4ODhceDk0XHhEMFx4Q0ZceEY2JFx4MDRceDk5MFx4MDBceDk2XHhFM0dceEMyXHhENlx4Q0VceEI2X1x4MDlceEQ0XHhBNVx4RUZceEQ2XHhDQ1x4RTFceEFEK1x4QTByXHgxQlx4MTlceEZCXHhBOFx4QkNceENDdVx4RThceENCWy5rXHgwNVx4QjZceDBEVU1ceEU1XHhCRFx4Q0M2XHg4OFx4RkNceDkyXVx4RkFJO1x4RkQwfiRBWVx4OTdyXHg5RVx4RkIgXHhCNlx4QzhceDA0XHhBOXJceEFEP1x4OTNceEJGXHgxMVx4OUNceDlBXHhDMlx4QUJceEJDXHhFM1x4OTJLXHgxQj1ceEZDXHhBRFx4MDdceDBBNFx4MTI7Y1x4RUZcXVx4MTNceEE4XHgxMlx4MTVceEU3XHhFMFx4QzFceDFCJFx4ODg4cmBceEFDXHg4M1x4RERceENFLVx4QUJfXHgwNVx4RDljXHgxNTNceEI3XHhGMEkqXHhERjVceEEzXHg4RVx4QTdceEI3XHhGOHgmXHgwOGJceENFXHhGOFx4OUJceDkwWlx4OTRceDE1XHhCRFx4RjlceEQxXHhDQTtceEVDXHg5RSdceEMybURAVlx4MDczXHhBNFx4RUNxXHhDMVx4OENceEY4XHg4NVx4MDZoRVx4MDRceDE5LFx4RjVRXHhGNVx4MTQmXHhBRUxceDhFXHhFMyNceEE2dXBceEQ4e1x4OTJceDFBXVx4OTRSXHgxNlx4ODRceEE5blx4QjZceEVCXHgxOWJceEVFXHgxQjtjXHhFRVx4ODFCLFx4MTdceEFEUzd6XHg5MGVceDlDXHhGOFx4QTh7XHhFM1x4QTloXHhEQlx4RERceDA0XHg5RDRceDEyXHhDMUtLXHhENlx4QkRceDFBcFx4Q0FceEUwXHgxRl1nXHhFN1x4OThceEZGXHhCREJceERGXHhERmpceEMxXHgxMWlceEU2XHhCOFx4RDdceDk3Z1x4OTVceDAzXHhERGRceEExPFpceDFBXHhCMlx4OTJceDEwXHg4RVx4ODgvIG5ceDlEJktceEI5Ulx4RDUuL1x4RDBceEQ2XHhGMGFceDE0PVx4OEFceEY4XHgxRFx4QTFBfVx4MDNeWmBceEU4XHhCNTciKVx4OTFceEQ4XHg4RVx4MDNceDlDXHg5N1x4RDdceDg5XHhBRFx4RkZceDA0alx4QkNceEJDXHg5Q1x4RDZ1LFx4QjNceEE3XHgxRVx4QTRceDFCXHhERFx4QTEzbXRceDg5Qlx4RjdcXHhCM1x4QzRceDk4Qlx4ODcoXHhFN1x4Q0ZceEQzXHgxNXQgXHhEMlx4RkVceEQ5LVx4MTInXHhENkxceDlCa1x4QkFceEIzXHhCNiFceDlGXHgwOE5WPndceDE2XHg5QVx4ODZceDBEXHhBQ1x4QTVuXHhEQklceEM1XmNeXHhFQlx4RTVceEM1XHg5Q1x4RDlceDhFZG5ceEEwLmQhNEQoXHhDQVx4RDlceEJEXHhBOVx4REJceDAzXHhGOVx4QTdceEQ5XHg5Q1x4RDVceDAyXHg4OHlAXHhGMlx4RDc9XHhCMiYsXHhENVx4OUJmU3JceEQ4XHgwRD9ceENFQFx4REVceDFFXHhGN1x4QjVgXHhFRVx4MUFceDgxUVx4QkNceEZCXHgxQ1x4REFceEJBLVx4QkNceEM2XHhFQlx4QjBceDAyXHg5QVx4MDFiXHhCRlx4QjBwXHhCMWNceDAzXHgxQSdceDA2MjVceDFFXHhENVx4ODZceEYyXHhGMlx4QkFceERGXHhDM1x4OTcnXHg5Rlx4RDRceEY1elJceDA3XHg4NilqXHgxOVx4RkFceDAxXHg5OFx4RTVWXHgxOFx4RTNceEI2XHhDQ1x4RDhceEQ0XHg5Rlx4ODI8XHhBM1x4MDZceDBEOFx4OTFceEU4XHhBOFx4OTJceEI2XHgwN3VaKkBceDA0XHhENFx4OEJ4XHhDRFx4QzRvXHhFRlx4RjlceEJBOEFceDFDZ1x4QzFceDAxXHg5QVx4OTRceDAzXHg5NVx4RTU5Y25LXHgxRVx4QkJceEU1Z1x4RUJ4XHhCQlx4RjNceEU2XHgwNFx4QjQ8XHhBNHBAWVx4RkRKSVx4Q0FceEFGXHhDN1x4QTdceEExMWRceEUzZjx0XHhDNlx4RkZceEE1XHhFMVx4OENceDE5QFx4RDJceEU4XHgxRmtceEEyXHhBNl4qXHhBOVx4RDZceEQ4flx4RjZceDE2Xjg/XHgwOFx4MTZIXHhDOFx4Q0NyUD1VKFx4QTlceEIzXHgwM1x4RUNceDBBQ1x4RkRceERCXHg4OVx4Q0ZceDg5flFifFx4RkNcXHhCOFx4RUZceEI0XHg5M1lJPDF0XHgxNVxGXHhBQzNceDkwY2IhXHhENlx4MENceEI1XHgxQ3xceDk5XHg5Rlx4QUVceDlBXHhENlx4QTFceDFFXHhGMFNKXHgxMHs4XHhDRlx4QzNceDlCXHhCRjtceDE1bVx4QThoXHhGOFx4RTF1NCdceEUxXHhEM1x4MDJceDg5XHhEOTldXHhFNFx4RTZbXHhCNFFceDAwb3JceDA0XHhCNlx4QTdceEUwXHhCNH1ceEEzXHg5Nlx4MDhjXHg4NVx4Q0Q1LFx4MUVceEQwfVx4QUFceEM5VFx4RkZceEQyXHg4MDAyR1tceEU5XHhBRSFJXHhFOFx4Rjk/XHhFM1x4RTVceEY3clx4REYsNVx4RURceDBBYlx4QTBlXHgwMGRceERGXHhFM1x4OTFceEExJVx4QzY2XHhBRVx4RTlceEQ5XHhFOFx4RUExZlx4RERxXHhBNT80XHhFNlx4QUNceENDTFx4Q0QyMFx4RjBceERBXHhDMFx4RTR+XHhGMFx4OTVceEQxXHhCOGtceDhCXHgxQiNiQGpFW19ceDhDXHhFN1x4OTlTXHhCOEFceEYyJiQwXHgwMFx4MTZFXHhCMFx4RUVceEFCXHhFNVx4QTIzW1x4Q0VceEIxXHgxNkpceEI5aFx4QTZceDhFXHhGQ0BceEEyXHhDOW9ceEQ0XHhBMVx4QzhceEZCdjpaXHhEM1x4RERceEE3XHhFRFx4QjhceDk0XHg4NnlceDA5XHg5NVx4RjlceEQ1XHhDOCVtXHhDMlx4OEZceEYyWVx4MEFHbVx4MTR8XHg5M0JceDkxXHhBNTJceEJBXHgxQkd6bmFceDAxXHgwQlx4OTBceDE2XHgxQ1x4RDNceEE1XHhEM1x4QTZceEMwXHg5MTJOXHgwRFx4RjBHVDQgXHhERVx4RUZceDlDXHgxMlx4ODUiXHhEN3JceDlDXHg4Q3pceDgzXHg5N1x4ODIxXHhFOCVceEM4LFx4RTZ3dE01XHhEQVx4RkRceEE5YVJ3Y0ZccVx4RDZceDA3XHhBMFx4MTA7XHhFMFx4MTNifVx4MUJ5XHhFRVx4MTNceEIxUlNceEUwT0tuXHgxNlFceEJEXHhBM1pceEI1XHhCMVx4MDhceEE2XHgwNVx4Q0RHXHhBRVx4Rjg+QFx4MDBceEMwXHhGNVx4QjRceEVCdkYzXHgwRVx4MTdaXHhEMVx4MUZ+XHhEOElbXHhCNWpceDdGIHNceERCXHhGMFx4ODQvXHg4Mlx4ODQ2XHg4RlJceDlBXHg5RkRceEZDXHgwQ3ZceDBDXHhBNlx4QzdzeVx4RUY8XHhGQ1x4RjU0XHhENm1ceEEwXHhFOVx4RDR6XHhGOVx4RTFceDA0XHhCN1x4ODNceEZGXHgxOVx4QTVceDk5XHgwMHZceEU0WyomXHg4Rlx4OERceEYzRlx4MDZVbClceEYxXHhGRVx4OTZceERFMlx4RURceDA5XHg5RFx4RUVJX1x4MDBceEFFXHhDMlx4QUVceEJFXHhENVx4RUFceEVFXHhGNW1FYFx4RTVceEVFXHhGQVx4QkFceEQxXHg4MFx4RkVceEEyUVpceDBCXHg5RTtceEEyXHg5MVx4MUJFXHg4NVx4RTU8XHhBMFx4MENceDkwXHgxMypceEM0XHhDQVx4RDlceDgyLnl8aVx4MEVceEM5XHhEMWVceDBFLV5XXHhGNVx4QjBceDBGXHhBMUxtXHhBNyVLXHhCOVx4RUFceDk2JyVceEE5blx4MTNceEY3V1x4Q0JceEVGXHhEREJceDgwXHhBRVx4MTRceEMwXHg5RFx4Q0ZUVy5oMVx4MEJceEVDXHhEMmdceDAzXHhGMVx4RDNceDFBXHhEN1x4RDJceDg5XHhEM1x4RDNceDhEXHg4QTNceEVFXHgwQVx4Q0NPXHg4NFx4QjNRXHhFN2tceENCWVx4RDFceEFEfFx4QkJceDkyXHhGNXNoXHhERlx4REJceERCXHhCMlx4RDQ5XHgxOHNXXHg5MFx4RTZceDkyalx4RDRceEJDXHhCNHZAeFx4QkZceDhCOC40XHhFMChceEIyXHhEQUdceEEwJllnXHgwQ1x4QUJceDAwQ1x4ODQ/VVx4RkFceENBXHhDQVx4QjldXHgwRUlceEVDXHhFQ1x4QkJceEM2XHg4Mlx4RjJceDBCXHgxOV1rXHhDRVx4QjZceDE0aWxceDA2XHg4Mlx4RDZhI1x4REFceDdGXHgwOFx4ODJXXHg4NVx4ODhaMlx4RTZceEI5XHhBQ1x4ODlceEI1XHhDNFx4ODdqJlx4RUM4XHhDNVx4QTNceDk4XHhEOFx4OUZ8bFx4RjdceEQ1XHhBNVx4MUZceDkxXHhFMlx4OUZceEE5XHgxRVx4RDRceDAzS1x4QkZSXHhDNVx4QjRceDk4XHhGOVx4MDJceDlGXHhEMFx4MDlceEQxJlx4RDFceEQwa1RceDBGXHgxMVx4Q0ZceEM2XHhBNlx4RDhceDlFYj5ceEJEXHhGRVx4QTZIXHhEOVVcXHgwNVx4MTRceDA1XHhGQ1x4MDN7TVRceERDOFx4Q0Y0XHhBRVx4RDdceDkxXHhGMlx4QzRceEU4W1x4REFceEJEI1x4REFceEJBXHhCOFx4OTRceDlCXHhENFx4QzJceEFCXHg5Mlx4RThceDFCXHg5Nlx4RThmXHhCOVx4QTJceEI5Xlx4MEVceDkwXHhENVx4Q0JceEM0XHhBNlx4REFceEQ1XHgwRlx4MDRGXHhFOFx4ODBceEU2XHgwRFx4OTdceEI3XHg5NFx4ODVceEQyXHhDMT47XHgxMlx4RjhceDlBbFx4OUZceEZBXHhENlx4Q0VceEVBXHgwRlx4RjIkXHhEMFx4RUVceEZFXHhEQlx4RTdceEIzKFx4RTBDb2AsW05uWFx4MTVceEIwXHhCRTxqclx4MDZYelx4RUNceEQyfSlGXHgwME9ceDE4XHhGQ1x4MTRceEE3fk58RUt5aVI8XHhENlx4RDdceEM4XHhEMTZceDBBXHhDM3U5ZFx4RENceDEwIyd3bHVceEExXHgwQTVZXHgxMENdXHhDOFx4MEVceDgyXHhBQVx4RTZceEU5XHgwNTxceEE1XHgwOUFceDFEXHg3RjRceERCK1x4MUZjXHhDNj1OXHhCOFx4RDFceDA2Ylx4ODFceDE4XHhBRlx4RTJceDkwXHhGN1hceDg4TEtceEFCXHgxNV5ceEM0XHhEQzhBXHg4RFx4RDVceEY2XHgwMlx4RTZceDk0XHgxQVQ+YFx4Qjk8XHgwMSxceEE1XHg4RTdtXHgxNyJnbVx4RThceDhCSFx4OTNceEQyW1x4RTFpXHhGND9ceDk4IVx4MDVwXHhEQVx4RjVceDkxXHhBRFx4MThceDg2XHgwQlx4QzBceDFDR1x4Qjl8KTRceEMxXHhDRHlJXHgxRVx4ODRceEVCUiRceDAzXHhCNVx4RUNceEYzXHhDOTdceDlEXHgwMixYMVx4RTVceDhBXHhCNl93InVceDg0dkJceEM3clZceDg5XHgxN1x4OUZceDFGXHhEMVx4RDhceDA2XHgxMlx4OTJceDFBKVx4QkUoXHgwOVx4ODJ5XHgxOVx4OEFIXHhCQid2XHg5RlRceDk3e1x4ODdceEQ1XHg5QiVceENDXHhDQ1x4QzJceEIyXHhCRlx4MDl0XHhFMFx4MERceDEzXHhENT47XHhEMVx4QThdXypceENEXHhEOCVJZ1x4QjNceEE2XHhFRSVceEY4XHg4Nlx4RDNceDg2XHhDOVx4MTFQXHhEOVx4QTJPO1FceDg2XHhCNVx4OTFceEFDXHhCRVx4QjBceDFFXHgxRDczXHg5Mlx4MTJtXHgxQlx4QTNQWFx4QTIuKlx4OTBJXHhDMFx4QzdceEVDXHg5RlVceEEzTlx4MUFceDlFXHhCMFx4MUFceEJGJlx4OEZceDE1N1x4OERZVFx4RjZceEI2aFx4ODJceEJGLVx4OERceEZEeFx4QTlceEQzXHg5Q1x4QkNceDEzZFx4RDJNXHhEMFx4RTgmUVx4OTZceEJDYj9ceEZBXHgwNlw5XHg3Rlx4QjdNXHhFRFx4Q0ZceDgyXHg4OVx4MTBuXHhFQlx4OUEsXHg4NFx4QTZRXHgxRiYoK2RceEREXHhFNXBceEJGXHhBQlx4MDZceEQxXHg5QVx4MDQwVlx4MDcvXHg5M1x4QzFQXHhGN1x4QzVceDFBXHgwQlx4Q0NceERDXHhDN1x4OTFceDkzXHhGOTJceEZDXHhDQSNceDhBS1x4MUZceENBXHhFMFx4QkNIXHgwMk5ceEEwXHhDMD1ceEQyX2pceENGXHg5MFx4MUVzXHhDQ1x4QjhceDFCVlx4RjdceDhCflx4MTZ4XHhEQ2pceERDJ1x4RTlceEU0XHgxRT1ceDA0XHhFOVx4RDlceDg4XHg5MFx4MDQ+XHhGNFZ4XHhEOFArJktceEU2Ylx4MTY3dVx4QkZceEQya1x4QTNceDE3VDlNPVx4QkV4XHhENnxceEY5MFVceDA2XHhDMGkuIlx4REN+XHg3Rlx4RUNceEExXHhEMlx4OTZceEY3XHg5RFtceEI2XHhGQlx4RkIvTUJceEIyXHg5Nm5ceDFCXHg5NU9ceEExXHgwQSVMXHg4OExceDExXHhEMFl3XHhCQ1x4QUFceEM5XHg4N1x4RUZceDgzXHgxMmclXHhCN1x4QkFceDFCXHhENz9ceDFFXHgwNVx4MDhceEM5XHhBQmxceEQ5eVx4OUZmXHhGNVx4OEElOCZceDEyXHhGNT1ceDhDXHhCRFx4MUZceDg1OVx4MERceEM1XHhCNVx4RjRceEIzXHhBOUxceDExOVx4MTJaXHg4N1x4RDhceEU2MiIkRVx4RURceDg5XHhFOFx4OTVuXHhBRFx4QzdceDFBXHhGMFx4MDBceDlEd1x4Q0QjXHhCNVx4Q0VceENFXHhEQlx4OUNMXHhBRWoyXHhGOVx4RTJceEEyR0ZdXHhDNi5ceEZCXHgxOFx4OTVceDBBJFx4OEVceEQyXHg4QVx4RjFceEQ4XHhEMlx4QUZJR1x4Q0ROXHg3RiZ9Olx4OTFceDgzfFx4OTBceEY1XHg4Rlx4MDNxXHhCN1x4QUNceDBCYVx4OUVceENDXHg5RVx4RDNceDgyXHhFNmZ7N1x4QTNceEQ2YVx4MTJceDgzXHhCOFx4Q0NceERFLFpxXHgwQVx4RjNceEU0XHgwRFx4RkVceDk1XHgxQ1x4QzdoXHhBOFx4OURceEE4XHhGRW1VXHhBRUNceEMxOFx4OUNceEJEN0ojXHhENXdtIidceDkwXHgwQmluV1x4RkFHYVx4QjVceEQ3XHgwQ0tceEEyPlx4MDBhXHhEMFx4RjdceEY2XzpceERCXHgwQlx4RUFceEVCblx4QjhceDk1T1x4RTZceDhDR09PXHhBOFx4MTcgaGM9XHhEMFx4MTNUXHg5OFx4Q0JceEU0RFx4RkVceEVFIVx4QkZceEIyXHhBOGBAN1x4MDBceENCd1x4REJDXHgxOVx4OEFjXHg5Q1x4RDZceDlDXHg4M0FXXHhBNlx4MDVceEQxXHhFRlx4QUJKWVx4QjU0XHg4M3dceDg2XHhBN31ceDk2XHhDOVx4MUJceEIyblx4QUNceEM2Nlx4OEExXHhDME9ceDhGXHhGRDhceEQ0NVx4MDQ4XHgwMVx4RTFceDFCXHhFRVx4QTBceEI4XHg4Rlx4MEZceDkwJF9ceEIyXHhFM0kqXHhFNXxceDA5XHhDN1x4QkNceEI3UElceEQ1XHgxOFx4QThceEQ2XHhBQ1BceDhEXHhFNFx4OEZceENDXHhFRVx4QUFceDA3XHg5RVx4RDNceDFBXHhENTpceEU4XHg5RFx4QzBtXHhERFx4QzhceEYwS1x4RTlceDA3WXFceENBXHhCNlx4QzB7ITRceEMzXHhFMVx4MEVceEJFXHg4MFx4RDdceDg0XHgxRW9ceDg5ZVx4ODZceEU4XHg4OVx4RTYoXHhFM1x4ODdceEU4XHhCNVx4MDdceEU5K1x4RjhceDFBXHhGRks+b2tceDEzXHg5OVx4MTZceDk1aFE2XHhFNVx4RUZceEE2Nm9fclx4RjZceEY5P1x4QUJceEM4XHgwMFx4QjhceEExbVx4QjJceDAySSVceEZFd1x4QkJceEFCXHg4RmU8JVx4MUZwelx4RUVceDhEXHhCNVx4RDFOXHg5RFxceEFFVVx4RkRceEFCXHhDNFdceDhFXHgxNlx4RjBceEI5XHgxQVx4MTFjR1x4OEV7XHgxM1x4MUVceEMxXHg5MVx4ODdGVFx4RjNceEU3XHhCMFx4QkNaIFx4MUInJ1x4QzNceEJGd1x4RTNceEExXHhGNEhceEE1TFx4OTclXHgxQlx4MTNtXHhENVpceDgyXHhEQVx4OTA2XHhCQlx4QTdceEIwXHgxOFx4Q0RceENBMHpBb2NMeCpCXHhEQkdceDA4Klx4QzRBXHhFM1x4RURceDAzXHhBRVx4RkN8TVx4OTVrXHhCRnlceEEzXHhDMFx4Q0ZPLl5ceEZEKlx4RTZoblx4QzFceEM3XHhCRlx4QTlceENFXHgxQlx4MUZceDk0XHgwQVx4OTRceDk1IFx4MUNGXHg5RDArZHlceEM0Olx4ODYkXHhGNFx4RDFceEFCXHhFNlx4MENceEI3bV9ceEE1XHg5N1x4RjFtXHhFQ1x4MTlyW1x4Q0JPZE1ceDgwXHhDMFx4Q0JceEI3Ilx4RThceERCMEpceDE1XHhCNS5ceDg1XHhCMlx4RUIvXHg5N1x4QTFceEUxTy1ceEMxXHhBMU1ceEMyXHhFNC1ceDA4d0NaYGFIM1x4QzdceDg4ISxWXHhBRjNtXHhDRFx4OENceDdGXHgwNVx4RENceEFGXHhGRFx4RkJceEMwbVx4RTVZKFx4RDJceDlDXHhCQlx4Q0UkXHg5NllceENFLkRceEZBNFx4MUFceEJBXHhBOX1ceDg2XHhGMVx4RUVceDk4OHJceDkxQlx4QjZceDE0Mlx4MThceDhGRVx4OTFceEJEOUBceEYwclx4QzFceEIxXHg4M1x4OEFceEU0XHgwQlx4QTZceDEwXHg5NVx4ODZceEI4Plx4MTdOXHhGN3daLz0jXHhFNVxceEZEXHhCRFx4MDJceEIxPFx4MDFceDA3eFx4OTdceEZFI1x4MDJceDg4IFx4OTRceDlEXHgxNWo7XHgwQVx4OEVUXHhEQS5ceDA1Tlx4RTlceDE3XHgwOGFceEM3XHhCRlx4REM8XHhGQVx4ODlceEIwclx4QzFceDgyXHhCQVx4RjVceDgzXHhDRFx4ODRceERCXHhFNlx4Q0JceEMwd1FDXHhERlx4ODhceDAwclx4MTRceDkzfilceDg5XHhCRFx4QkMwXHhDOFx4QkJceEVGXHhEOVx4MEVceEQ3XHhFMVx4RUVceEU5XHg4M1x4RkNceDlDXHhGQTlceDkxXHhCQz5ceEZCXHhBMFx4ODdceENCXHhGNFx4RUFceEQwXHhCOD9ceEQ4blx4RTBVd1x4OTNceDEwXHhEMlx4MUF2XHhCM1x4MTZRJVx4MTRceDkyXHgwRTVceDk0XHhBOFx4RTRceEI2XHhBRFx4ODdceEY1cFx4OTZceDlDXHhBRlx4OTJceEMyK1pceDAwNnVceDgxXHhGMlx4RTVceEI3XHhGQjNQXHhCOVx4RjRceEMzXHhCMltceDFFXHgxRVx4QzUzQEJceEQ2Zlx4QTJceEQ5XHgwMlx4QUJceDlCXHgwRVx4RDdceEQ4XHg4OFx4OTRceEU4Klx4QjRceDA1XHhGRUNceEQ2LVx4QUJceDgwXHgxRVx4QzhYaVx4RjNceEJDXHg4MFx4MUVceDlDXHg5NCNceERCXHhGQVx4RThgXHg5OVx4QUFceEZFXHhBNlx4QTVceDhFXHhBMFx4Q0RceEY0XHhDMFx4MDhceDE1XHhGQzBceDE3MVx4RUVceDE2XHg4OVx4RUJceENEO1x4RkJceDhCXHgxMlx4MDBRXHhDQmVceEQ4L1x4QTFhXHgxMVx4QTJceEFDXHg5MVx4QjlceDA4JVx4QjhceEE5XHhFMUJceEJCV1x4QTFceENEXHgxM1x4OUJceDgyXHgxMCNceDA0XHg4MCtceEVEXHgwQVx4OTZceEJFXHg4OVx4MTlceEQ1XHhGRW9ceEI2XHhBRlx4OUJceDBDXHhGQmAiNkdceDk3Xlx4MTZceEQ4XHhFRlx4QkJceEVDXFx4RUZceDk5XHgwOEN4MFx4MDFsXD49XHgxRFx4RDJceDEyalx4QjNceDE4XHhFRFx4QzdrXHhCRC0jXHhDNFx4MTdceEVBXHhCM1x4MDdceDFEQVx4OUZceDdGM1x4RkNceEQ5UFx4RUZceEE1XHgwNWslLVx4RERKP2JceDA5XHhEN1x4OUEwJFx4QzNceDEyPlx4MEEiT0BCelx4Q0VceDgydFx4MUJceDE3XHgxNlx4RTRoXHhCN1x4QTBceENFYlx4Rjl3XHhGRVx4ODlceEIwXHhCOTckI1x4MEVceDlGXHhFMCZceEVGL1x4QjNceDhEXHhGRlx4OTNceDhFXHhEOVx4RUJceDA3XHhCRFx4RDBceEQ1XHhBNCpceEUyXHhGM1s9XHhCNjBceEVCXHhDN1x4QTFceEU3U1JceDAwIVx4OUFGXHgxMTVceEJCXHg5Rj5ceEVBXHhBRlx4RTFceEY3XHhEMCtceEU3XHhERlx4ODRceDg1XHgxQlx4QzlceENCXHhCRlx4RkZceEFEM1x4RjJ2XHhGM1x4QTdceDA1S1x4RTVceDE2XHhFRVx4OUFLXHhDRlx4ODNhXHhFRVx4QjdOXHhENlx4OEJHRVx4OENceEI3XHhDNFx4MEYiXHhBNnFceEREPFx4OTVyXHhGMVx4MDl3XHhEMk9ceEFEXHhCQlx4QkNceDAwJlJceEREXHgwOEpceEExXHg5MFZceDE0dWBtXHg5NjhceDg2XHhENFx4MENceEJDXHhCOVx4MDZceDlGXHhDMT5ceEFDe1x4OEJceDFFXHhBMEtGXHhFM1x4N0ZYXHhENDY8XHhGRHksYVx4MDdceEY1OHphXHhGQ1x4ODVceDFCXHgwOVx4MEZceERFXHgwQ2ZceEI4LFx4OTBceEM5XHhDOVx4MER0XHhBQ1x4OTNFdkJ1aVx4MDFceEYxXHhBRlx4RDE+Xlx4QTNceDkzLj1vXHgxN1x4RjktXHhBRFx4QzdvXHhFMVx4MENrXHg4NHNceEMxXHhDRlx4Q0FceDhCQFx4REIqXHgxQ1x4MUN+eVx4RjNceEQ1XHhBQVx4QjVceDhCclx4RUIyXHhFRlx4QkFIXHg5N1x4RjBceDg2XHgwOFx4RjVceEY2XHg4RVx4QTZAXHhGRlx4QzQwXHgwNFVceDhBQFx4MUVceEJFXHhENFx4RTd2XHhBMXAvckZceEM0MicwXHg4MVx4QTlWXHhBRlx4RDdceDA3XHgxNlx4QTBceEM5XHhENXF2XHhDNlx4RTVceEZDXHhBRTFceDFFXHg4NSdAPlx4QkZceEVGXHhEQ1x4OTg6XHgwQVx4OEVceEIwXHgxMC1mPlx4RUEoXHgxRSNja1x4RDFceDg1XHhBNFx4RTVDXHhDNzBceEVDLFx4QkJceEQxXHhGOVx4OTRceEE1XHgxMlx4QTZceDg2XHg5RFx4RkNceDk3XHg4RFx4QURceEEzXHgwNWtrXHhCOVx4MDJceEE1XHhDNS9ceEZBYlx4ODJceDg1XHhERUNceENEa1x4OUEqIjpceEY5L1x4MDZLXHhFMG5ceEVDOW5ceDhEXHhFM2xOXHgxOFx4REZceEExQ1x4OUJceEI4XHg5OVx4ODJRXHhGM1x4OEFceEY0YVx4REVceDFBXHhGN1x4RTNceDg0XHhBQlx4OTRceEI0dUdceDhFXHgwMiNceEFEWFx4QjlceEUwXHhBQVx4OTF4XHhDOFx4QUFceEQ4XHhCQy1ETEVJXHg4MUNceEVCXHhDM1x4OUR1P1x4QzdGVVx4QkRzXHhDMlx4RjJAN1x4QkVceEUwXHgwMlx4RDFceEJCXHhDOVx4RTJceEUxWVx4MTBceDhCRlx4RUQ2XHhDQVx4OTNceEM4XHhFNVx4MEFceEQ1XHgxMzpDXFVwXHgxQ1x4RENceEEzJTJceDkwXHg4Mlx4RDRceDk1X2BceEU4XHg5NFx4MUEiIVx4MTVceDFBWzNceEFFXHgxQUh9XHgwNitceEZEXHhBMlx4RDdceERFXHhBMDtceEFDXHhCMFx4RDlceDkyXHhBREZceDkyXHhDOFxceEEyXHhCOFNceDFFXHhFOVx4RDJceEEyUHtceEZCXHhDN1x4QUZUP1x4QjFceDhBcFx4QjJceEJCWVx4MTA7XHhBRlx4QUZceDFDRXlwSFx4RjFceDkyXHg5NUFceENDYVx4OUFceDkwXHgwNlx4MEZceDAyXHgwMlx4RjhceDhCfFx4OTUkXHhBOFx4MDdceDlFJVx4QzdceEZEJlx4MEZceEVCXHhDMlNceEQzbVx4ODRXXHhBOFx4Q0Z1TVx4QTNceERGXHhCQVx4RTJMSTVceDE4blx4QUZceEZGXHgwQ1x4QjNceDkwXHgxRDVceDk2XHhCRVx4MDFceDk2XHgwOFx4QjFbLmxceEQ2XHhGNVx4MUZvXVx4REZzcVx4OEZceEEySDdceDEzRlx4MEVceEYxc1x4MDBceEYyIlx4MUFceDE5XHhDRFx4RTNceEM5XHhBRlx4Qjk2XHhFOFx4RDlceEE1XHhGQXBceERBXHhERFx4RjVceERGJFx4ODhceDE5XHhBNFx4OEZceDFDelx4OTZ4d3pceEFEXHgxMFx4RjJHXHhGQ1x4N0ZceDAyXHhGMlx4QzgwXHgxMVx4MThceDE4KFx4OTJ1XHhDQVx4QTdNXHhGMj1ceERFXHg4RVtHVlx4OUVceDBFXHhERSFRc0ZceENCQFx4RkJuXHhBRFx4MUIhXHhDRC5ceEYwIlx4RjFceEVCSnlceEM5XHhEOVx4RTBceDEwIVx4Q0RceEJGU1x4MTZceEFCXHgwQ1x4QTBaYFx4QjZceDhFXHhCRGJceEUwXHhDN1x4QUV+XHhGNDZceDlGR1x4RDJceEI0XHhDNEZceDBFXHhCNSJceEU5cFB6XHhEMS9ceDhEXHg5Rj1ceEFEXHg5NWBkIlx4QzVceEEyXHg3Rlx4RkRIfFx4MEZceDAzNDhPXHhCQVx4Q0NceDA4Jk8pXHhFM1x4OTFceEVBXHgxQlx4RkRceEVEXHgxNFx4Q0ZceEVBXHhBMlx4Q0RceEJBXHhBNkhceDgzXHhERFx4MUNveFx4MEJceDlFXHg4Nlx4ODd4R2JHWFx4RDcjTVx4RjZceEVBaVx4QUJceEFBXHg5RlxceEQ2XHhGN1x4RUNceDBGXHgwN1x4RERceENBelx4OUZceDk3ZFx4QTFceEY1XHgwQ11ceEYyOE5ceEFGXHhDOGlmblx4RjdceDk3RGxceEM3XHg4Qlx4Q0RceDFDXHhCM1pceEFEXHgxNVx4RTROXHhCOFx4Q0NceEIzXHg4Rlx4QjlIeFx4MEYkXHgwNzVceDAxY1x4MDZceEE4XHhFMUVceEIwdWBceEEzcFx4RjdceENFU3RceDE3RmZceEMzXHgwM1x4OUUvXHg4Rlx4ODBPXHhGOFx4QTllXHg4M1x4QjZrXHgwMVx4OUFceDAxXHgxN1x4ODZceEYxcFx4QTQhXHhCOVx4MTJSXHhDNHNceEEwaFx4ODRceDFBVFx4Q0NceDAyOSBbWlx4QTZceEYxXHhGRFl0I2BceEU3XHgxQ1x4RERgXHg5Qlx4RUUqXHhGM0woXHhEMkBMXHg5Rlx4RERceDAxXHgxRWxceDAyXHhGOVx4MUVceEUzXHgxNF5PXHhFQjNceENEXHg4Mlx4MUMxPnBceEQ4XHgxNFx4OTVceEY1XHg5OFx4REZrXHhDOC1ceEY2XHhDMCdceDFDeVx4MEFceDk2XHg5Qlx4MTNceDg1XHgwQVx4ODZceEJEJjtlXHg5RThZXHg4OFx4OUViS1x4RkNceEFEXHgxQmplXHhBN34kXHg5RVx4QjkoXHhFMCc6XHg5MVx4QTBceEM4X1x4QTJceDg2XHgxOFcoXHg4Rkk7b1x4MDA1XHhCM1x4QUZceDhBXHhFRSBceDhFWCNceENGXHhDM1x4ODFceEY1eSVceEI2XHgwOE5qeFx4RUVceERFXHhGNFx4Q0RceENEXHgxRT1ceEFCXHg5Qlx4MTI3XHhGNFx4QUJHXHgwOFx4RUZbXHhDMDs9XHhBOFx4RTR0XHhGMVx4MDNQNVx4QjglXHgxRVx4QUNzXDNceDE0XHhDRlx4RDdceDgyIFx4QzZuW2pceDA3dktceEQ3RFVceEIwXHhBN1x4MTNrXHg5NVx4RUZlXHg5NUAtKVx4OUJceDlGMVx4QThceEZDXVx4MEU3Rlx4MDJceEYxZUxceERGdlx4QjJceEZGPVx4ODlceEQwXHgwQlx4RENceDA2XHg4OTlceDlGNjNceEY3XHgxMlx4QjM2XHg4NVx4MTFceDFBXHhBMFx4MUEiXHhFM0tceENDXHg5NFx4QjRoXHhDMVlceERDXHhCMUhpXHgxMFx4Q0JceEZFXHhEOFx4QzRceEZFcC5uXHgxRn1ceEY1XHhDNFx4RkZ6XHhDQ0pceDFFXHg5Q1x4RTJceDA4XHg5N3dceDAyXHhEM1x4OUNTXHgxQ1x4QjJceEY0eFx4RUVgXHhFRVx4QUJceEVFXHgwMF1lSGNceDAzaDowXHhFQlx4RjNceERBXHhFNlx4RjJceERETlx4RTVfXHhBMVx4Q0FceDk4XHhFOWFFIlx4REJceEI0XHhERFx4RjJceDExXHgxNVx4OEFceDBDXHhCNVx4REZLXHgwM1x4RkJceENGXHhBMVx4MTlOXHg5MVx4OEZceERCXHhERlx4QTZceDA5WFx4RjZceEE0XHgxOFx4QjRceDA3XHhCMWZceEU5XHhDNFx4Q0FceEEzQ1x4RDdceEFDPFx4RUZceEIzXHhERSRceERGJXRceEQ3eGJceDg2M1hceDhEXHhFMlx4OTAvXHhDRCRceENDXHhCQlx4QzlceEE2XHg4RVx4RDhceEVGXHg5M1x4MTFWZnxceDA2XHhFM1x4RTRceDAyXHg4Q1x4QURceEY3XHg5MVx4MDVceDk4XHg4RFx4OTg0T1x4OEVceDE2XHgxMVx4QjFkXHhFOFx4QzlceEE2XHhGNHVFV1x4QTYiIi46XHg5NFx4MTNceEQ3XHhDM1BceDhEXHhDOFx4MTgmXHhBMFx4OTlceEY2cVx4RUZceEY5dFx4QzN7XHgxNlx4MDVceDlEXHhBMU9ceEE4XHhCQzVceEREXHhCRFx4MTduVVx4RkRceDE5RVx4RURceDlGMlx4OURceEFFXHhENjhceEQ2XHhFRWxAUE9ceEY3IyxceDBBSVx4MDNceDE0XHhGOFdXXHhFNnllXHhCOVx4RUJZdlx4ODVceEQ2XHhGRE1ceEU0XHhCNVx4ODEkXHgxOGlceERGXHg5RVx4REFceDA4XHg5MSNceEZDXHhBMS54UyxceEM1UmohTERceEE1NElceDg0XHhERS9ceDExXHhBQlx4QjJSXHg4NytceEExXHgwM1x4MDhceEEwXHhFNVx4MDhceEMzXHhBNGpeXHg5N1x4QjFceEUybj1ceERDXHhFM2JceDBEXHhFODdceDBCPCtceDBFflx4RTdceEVFXHhCOFx4QTFceEFCa1x4RkJceDhEXHhEOFx4QkZceEI0OStceDE3XHhFRVx4QkFNXHhFNlJceDE2XHhDRFx4RDRceEY4XHhFRVx4ODNceDgzXHgwM0NceENBXHhCMFx4OTRceEZBclx4Q0VceDA1XHhGMFx4RjlrZ2RceDEzXHhCMFx4REQ8XHhENWxceDEwXHhBN1x4Q0RceEEzXHhEN3dFXHhGMl1ceEZGXHgwRlx4RkRceEVGXHg4MFx4OTFceEM4Nlx4RTRZblInJVx4RkJceDAyXHhDQVFceEZCXHhCQVx4MTFceDBGYmpceDk1XHg4OFx4QUVZblhceDg4P1x4Q0NceDFGTVx4REVceDgwXHhCMVx4RDBzXHgwQXclXHhCNS9ceDA1XHgwMFx4QTVqfVx4Q0JWXHgxM1x4RURceDAxXHhGMVx4ODRibFx4ODNceDFCIFx4RTE5XHgxNFx4QkMsXHhFOVx4QUZQXHgxRVx4RDd1WVx4MEZceEZBKlx4MTJceERBMkFWXHgwMHhceEI1XHhDNjpceEJGXHhGRjRceDFGXHgwMGVceDk5JVx4RDQsXHhGRFx4MTNceDlEXHhGM1x4MThadidceEMzblx4OEJceENBXHhFQ1FceDExXHhDMlx4RjFceDk1XHhDQlx4QzRceEI1XHg4Mlx4Q0RceDFDSlx4RUZ3UyJceEQ2P1x4OTNceDkxXHg4OFx4QzFnXHhCNFx4RUMuIitceEUwXHgxM3RceEQzXHgxOVx4OTNceEJCNVtkXHhCM1x4MTlceDhDSVx4MEVceEU1XHhDNVx4MTJceEUwXHhGRlx4RDJeazpceEJDXHg4RFx4QjVWe3RceEYwPVxEXHg4NC5ceERFXHg4Nlx4RjhdXHhGOFx4MEFceEE4XHgxNVx4MEFceDgwXHg4QVx4QjlceEY3XHg4Qlx4Q0NceEQ5XHhGNFFZTHtiaDR0XHhDMlx4QTFVXHgwQWhceEMyXHgwOFx4RTZGU3pFXHgxOFx4OUNceDExXHg4NVx4OEFpcVx4QkYgXHhEOTw1XHgxMlx4QTgya2NNXHgwNlx4QUJceDAyXHhDQlx4MDhceEUzXHhBRlx4MDJceDhFQ1x4RUNceDkxXHhFRlx4RjBceEQzXHhEMDc/MyYnXHg4OFx4RTNceDBBXHgxN2dceEQ2XHhCRFx4RUFceDk4XHg4OXxceDhBXHgwNXttXHg5QiJgXHgwOFx4OTJceDk0XHg4N1x4MTZceEYzdVx4OTFKXHhGNihceEMxXHg4Q1x4RUNceDA3Plx4QkNAXHg3Rkd1XHg4NFdceDA5I1x4MDE4XHgxNFx4QzhceDhBXHg4QklceEY0XHgwQlNceDgxKFx4MTJjXHgwNVx4Q0RceDgzXHhFNVx4OURceEM2RipceEFDXHhFMFx4RUVsXHhDNVx4MTBceEE2biVceDg4XHhBRlx4OTFceDBCXHhGRlx4MDN5OFx4RUZceDkzXHhCNVx4ODNeXHhBQ1x4RjBceDhDXHgwOVNceERGXHgwN1x4MUVceEFDXHhDQVx4Rjk7PVx4ODI+I1x4MEJceDk5XHhDOVx4MEVeXHhEOWE2aFx4QzFDS1x4RThceDFGXHg5MHp1XHhFN2FNXHhBM2xCSVx4MEM/XHg4RExceEFEbFtceEY4XHhGRlJceDg2J1x4REM5XHg5OTNceEQxaCVceDBBayMiXHhEQ1x4RjNceEQ2XHhGNFx4MDJceEYwXHgwM1x4RjZceEM4Rlx4QjJceDg4T1x4QTNceEJEXHgwMVx4QkNceEU1XHhGOFx4Qzc/eD5ceDk0XHhEQlx4ODgjXHgwN1x4OTJceEE0XHgwRlx4ODJceDg2XHgwNFx4OUNceEU3XHhDNlx4N0ZceDgwXHhCMlx4RTlceEFGTlx4Q0NceDE0XHhFN1x4MDJvXHhERlx4QjE1Y1x4QkNceDg5XHhERlx4QTdceEU5XHg4Qlx4QThsXVx4QkNceDEyXHhBOVx4OUJVN2JceEE2XHhENnZceEM1RFx4OEY4I1Alb25ceDAwb1x4QzFceEQwXHhGNlx4RTdceDlFMlx4MERceDBEXHhENCVceDlFXHgwMVx4RUFYXHgxNlx4RUJceEYzXHhCQllBXHg5OVx4RDYwXHhBM1glXHhCNGxceDEya1x4RTVceEJBb1x4QjJceDA1cFx4QjRKM1x4RjVceDk5clx4MUVlIklceDgwXHg5RVx4RERceEIyXHhGM04sXHhGQ25ceDlCXHhGNlx4OTdqXHhCMlx4QTJgXHhGN0VceDhFe1x4RDJceDg0SlUiXVx4QzhceEMyJlx4MDBceEU5XHg4QltceDk5XHg4N1x4QUJceDhBUVx4OEI5XHg4NVx4OUQjV21NXHhENFx4RUNceDAwVlx4OTNWXHg5Rlx4OEFceENBXHg5OFx4QjVceDE0XHg5QVx4QkJceEQxXHg4QWtceDhDXHhGOFx4REMiXHhCM1x4RDZceEUxXHhCQ1x4OTlceEEzXHhDMFx4RjRceDExXHhEQXtCXHgwM1x4RTBGXHgxQ1x4QTJceEE5aTlceDFDXHhGN1x4MURceDE5bVx4MDNceEUyXHhDOEh8XHhCQVx4RTQ9XHg5Q1lceDE3WFx4QTVceDkyXHg4RGNceDlBXHhEQlx4RTdceDA1Rlx4MDI8XHg5Rlx4MDZceDBGXHhBNGVceDBFLlFceEUxK1x4ODlceDkxXHhBOVx4RUNbXHhCRFx4REJceDAwWFx4RjVceEM4XHhCQlx4OTNceEZBXHgxMlx4QTFceEYyJkRceDk4XHg4RFx4MTkrMVx4RUVceDlCXHhFOXoyUm9ceDE4J1x4RDhceDE4MzteXVx4OTRBelx4RjRceDk0XHhCOFx4REJceDgzXHg4Q1x4QThiIlx4ODF8XHhERVx4OURceDAwelx4QzM9WVx4QzdceDAyfFpceDA1XHhEMlx4QkEnXHhBOVx4OTAjXHhFRVx4QkNmXHgxNVxceEU5XHhERVx4QTFceEI1XHhDOCZsXHhDOHhceEY1KFx4RUFceEFDamBceDgyXHhDMVx4QzJceDkyNVx4OTJceDA3XHhFQVx4RTFJXHhEQ1x4OTI7M1x4RkRtXHhDNlx4ODNceDBBXHhEMVx4OTFceDgzXHhFMFx4OTJceDk3XHhDMFx4OThOXHg3Rlx4ODI7XHhBNyxceEE1XHhERFx4RkZceDk5XHhERlx4MTRceEQ5XHhCQ1x4OTN9XHhFNVx4MDFWXHhGNiR7XHhENlx4RDdceEFDXHhENVx4RUQmXHhEQmRceEE0XHhCMExceDE1fVx4RjYmVi9ceENEVmwiXHhGQXtceEI5Ulx4QUNceEQ1XHhBMlx4OTdceDg1XHgxQ1x4ODlceEE3XHgxRFx4QTBceEY1XHg3Rlx4OTNceEJBXlx4MEJceDAyXHg5NWIhP1x4QTZceEE4XHhDQ0tceDhFPTdceEZDXHgxQSklMlx4REFceEU4XHhBRm1ceEY1SVx4QjBceENBXHg5RnhceDk0Klx4RThWXHhFRVx4QUNceEFDXHhBOHh4bVx4QjcgN1x4OUNceEEyXHgxQVx4MTUxXHhENlx4MDFRXHhFRlx4RkNceDE3JVx4QjBceDA1XHgxQ3BceDkyXHgxMFx4RUNTXHhFMVx4REFceERBXHhGQVx4MENceEIyXHg5MFx4QjFceDg1b1x4ODJCXHhCQlx4OERuXHhGNHczXHhBRFx4RjklXHhBRFx4OTBceDBBXHg5RVx4RTZceDBCXHg5Qy5ceDkzK2NceEU1XXJ9XHhERlx4ODRceEY4XHhBMThTe3lceEM0Zlx4RjlceDhGQ3NEUnNceEQ4XHg5Q1x4QTlceDk0UVx4MTRceDA0Wlx4QkRbXHhCMFx4QTlceDE2XHhFQnxceEFGLEdceEI2XHhFM1x4QTFLXHg5MkYjJURceDhGXHhDQlx4QjdceDhDeilceDAyXHgwRlx4OTVceDgyXHhCRVx4N0ZTImZASHlceDhGXHhCNmpmXHg5NSxwXHhERGRceDEwRUpceDgxXHg4NF5ceDk1SVx4MERLXHgwN04tWWJceDA1XHhEMzFceEM3XHg5RFx4RkQqXHgwNDtrS0tceDAwQVx4MDI3XHhFRDZceEM5XHhBMj9ceDFDU2hceDExXHhFMUxceEM4TlF5XHhFNVx4RENIXHg4MVx4QjI0XHg4MFx4RjVsXHhFMFx4QkRceDg1UClqXHhCMUxAXHhDQlx4QUVHXHhCM1x4RkVceDlBXHhDRHtceDg0XHhENVx4QzBceDk2XHhBNlx4MUJceEVBXHhBNVx4MURceDBBJ1x4QzNmXHhBRlx4MThceDA1Ylx4RDJceDEyXHhCNFx4QTVbSmxceEE3Vlx4RkVceERBXHhBN1x4OTdceEE3XHhDN1x4RjlceDFFXHhCQ1x4RkRceENCX3VceEJBXHhCOVx4MDlYXHhDNj5ceEIxMENceDlBMG5ceENDXHhENFx4RTVceEVGXHhCM1x4MUMpXHhGOVx4RDBceDBDXHhFMVx4RjVceDg5L1x4OUJceENCXHgxRXhceEY4ZVx4RThceEJCaCRceDFFXHhGRFx4MTVceDk0XHhDOFx4ODZ5U1x4OUMoezdceDBEJlx4MTJceEEyWVx4MUNceDg2LydceEI3XHhERFx4MURceEQ4LVx4QTUtXHhFRlx4RDNceEI3XHhDRFx4OEZceDA2XHhCM1tceEQ1XHhDM1x4OUVceEE2XHhEN1x4OUVceDlEVlx4QTRqYVx4QTRZXHhDRlx4QUNceDA3Xlx4Q0JceDk1XHhCQlx4Q0ZceDAwflx4RTdceDAzbVx4RkRceEFFQFx4QzhceEQ4XHhBNEBYXHhBRTEwXHg4RVx4MTlceDlEVlx4MTBceEI4MFxceEM5XHhGM1x4MTJceEJFXHhBNlJceDlFXHhFOGlDLU4oXHg5RVx4QUU+XHhFMF1ceEREXHhGM1x4RjNceEY1YVx4RTNCLkU3Xlx4RUVgXHgwRlx4ODk3bikqXHgwQ1x4OTJceEQxKyRibCdceEVBXHg4NVx4RjhceEQ1XHhCNlx4RDlrflx4REZceDE1K1x4QUJ9XHhBMFx4MEMvXHgxQlx4QjVceEM0KFx4OUQ5WFx4RDNceEE5XHhCN3ZHXHhBQlx4QzVceEVEJlx4MTlceDAwXHhDNGJceDFDXHg5NDlceEY1YDtceEM5XHgxM1x4OTUtXHhEMDMnXHhERVx4RjNceEFFXHgwNHVWXHgwM1x4MDJMXHg4RFx4MDBceEM4XHg4NVx4RDZoXHhCRlx4MDFZSlx4MDJceDkyXHg4NVx4OUFceDE5YFx4ODRceEY0IFx4MEEzXHgwNlx4OTZtXHhCM1x4RUVEXHg4RFx4MDNceDk1XHgwQlx4OENceDBDXHhGMiEzIG9ceDA1XHg4MVNceEMzYFx4OTNceDg2c3ZceDlEXHhBM1x4Q0NceDFEXHhFNlx4MTZceDBCb1x4OERFXHhGOFx4RDJceEIzXHg5Mlx4QzM7LFx4QUQyK284XHg4NixceDk2XHhCM29ceDkyXVx4MEJceDE3eHx1XHgwRlx4OThceDE0XHgxMCVwXHg5Nlx4OEFceDE5XHhCN1x4RUNceDBCYUpceERFcVx4ODlceEEyZ31ceDFGKnNcXHhFNVx4QzgpXHhGNVx4Q0JceEYzXHg4NVx4QzkgXHhDRFx4OTZceEVDNlx4RjQ1XHg4N25ceEYxXHg5OFx4Q0FcXHhENlx4Q0RceDFBXHhCMndceEI3XHhDNlx4RkJjYFx4OTdceEM2WX1ceEJBXHhGN2k1dmFceEJGXHgwNil2N1x4RDhceEU4XHgwMVx4QjAlXHhGRVx4OTlceEE0XHhEMVx4QUZceEIxQ1x4OTFceEQ5JVx4RDdceEQzXHg5MGpmXHhGOFx4RTRceERDXHhDQlx4RURceEQ1S1x4OEZceDE2eFx4OERceEUzNnt9XHhGOHIrXHgxNnNMXHhGQzpceEM3XHhBQlx4RjVceEJDM1dceEQ2XHgxNVx4QTBceEY1XHg5MFx4QTlceENBYEFceEEwK1x4RjJCXHg4Rlx4MEQ/XHhCMWpceEE3dlx4QThfXHg5QV1ceDBGIyFFSVx4OEZceEI3OFx4REZceEMyKlx4QUNceEYwXHhENVx4ODlceDkyXHg5RVx4QTEqMSBceEI4XHgwRlx4RkQgXHgwM1x4RTdceDlBIlxceEY3XHgwRVx4QkNceEU1XHhBRVx4QjV6XHg4NFx4RDFceEYxXHg4MnpceEUwXHhFMlx4QzlceEQyXHhDRURceEQwYVx4REUuYVx4MDFceEU5XHhERlx4MDNceDkxXHg3RllceDE3X1x4RDdceEEyXHgxQTpceEM5dyFceEQ4XHhEN1x4QzV7PHcqXHhGNlx4MDdceDA4XHgxRT9ceDFFXHhGNlx4OEVceDg3XHg4M1x4MENxXHhCOF9ceEEzXHg5RlxceDkwXHhFMFx4MDFceDA0XHhCN1x4Q0U9SyRbWlx4RUF3S1x4MDJceEUzIlx4QzVRWVx4QUM+bVx4Q0FceEE4XHhDQVx4OTBBPFx4MThceDk4XHg5OFx4QTIwXHg4RVx4OUFceDg3Llx4QUNceEY3O1x4RTBceEYxXHhENFx4MTNceEQxQVx4MTJceEI1elx4RTlceDEwXHhGNlM3XHg5My9ceEJFYlx4QzRceDg1XHhFMFx4OTNceEM2XHhEOStOXHhCRC9lXHg5MVx4OUNceEQ1XHgwQVx4ODFceEExXHgwN1x4RURceDlFXHg5QSJceEFCXHgwRFhceDg2VXdceDAyXHhGRFx4RTZYXHgwQlx4Q0VceEM1XHhFQlx4QjdhXHhCNnZceDk2YFx4MURceDAyXHhBMFx4MDVceDgzXHgwRFx4OUNceDgzXHhCOS9ceEEzXHhFMFx4Q0VceEQ4XHhBQiVceEYwXHhFNmlceEJGXDdceDA1XHgwQWdceERGXHg4RVx4RjRceEQxXHhEOVx4MEZceEREXHhFNlx4OTNceEUyXHg4OFx4MUZceEE1dlx4QTl2VFx4RUJceDAzXHg5Nk5ceDg1XHg4Nk5ceEZBXHhDRmBceEMzfUNSXHhBQ1x4QThCXHhEMVx4RDlceEEzWG41XHgwRDFceERGXHgxRVx4QzNceEM0XHhENFx4QTlceDhDRFx4MUZdXHgwQlx4RTdceDAxXHhDM1x4QjJvSVx4RUJefDNceEMyNFx4MUZceDAyXHhEN1x4MUVkXHhFOFx4OTlFXHhEMjV5KHxzXHhBRFhceDEzclx4RUYgXHhEOGM8XHhGMTZyR1JceDA5XHg4Rlx4RkU1RVx4RjNceEE2XHhFOGk+Z1x4OURceEZFIVx4OTVceDAzfG4zb1x4RDNmXHhGMF5ceERGXHhDN1x4RDdceEIwSEcjVmlceDBCUVx4OEMoWVx4RUUlZFx4QTc1aGErXHhFOVx4QzJceDAzInw8XHg5MGFceDg2XHhGNlx4OEJceDg1IVx4OEF7Wlx4QzIsXHhCRlx4MTQhVFx4MEVnXHgxMlx4QzFceDkzXHhEMlx4RjVceEUxXHg5RCZUXHgxNTZceEU2Q1x4RDdtXHhERSBceDAyXHhFQixceEQ3XHg5Rlx4REFceEU1XHhEMzlPbVx4QkJFXHg5NFVceEIyXHhCMVx4RjkrXHg4Nlx4Q0FceEM1XzZqXHg5QydceEE5VVx4MUVceEUwc1x4RkJceDE2XHg5MzxceDlFI1x4MUVceEU0KFx4MDROXHhCMXEqOVtceDlFXHhERDBceEZDXHg4Rlx4RTJceDk0XHg5NVx4QkFceEEzXHgwRlx4OERceEIyblx4QUVceDAyXHg5M1x4QTVceEVFVVx4QzZKVVx4QjUwXHhFRFx4MTZceENCXHhEMFx4OTIocFx4RTdLXHhENFx4MTNceDA0cVx4QzBceEQ1XHg4M1x4MTlceEJEMEJceEJCXHhFNFx4RDNceEFENFx4MDRceDk5XHgxNlx4RjRceEVDXHhBQVx4OUFceEJDXHg4RnBceDkwZVx4QjNceDgwT1x4OTFceEYzdlx4RjVceEUzXHhCM1x4RDBceEEzXHhCM1x4MENceDExXHgwQnVceEQwKFx4ODdceEU0Ylx4RTdceDgyXHhGRFx4MThceEIwMEZceEI4XHhBOH5ceDhFXHhBOFx4ODdceDAyXHhDM1x4REFceENFXHhBOVx4MUNceDgyVjVceDg5XHhGMUI2XHhBMlx4MUZSXHgxNVx4RENceEIwXHhFM1x4RDVceEYycURXXHgwNSlceDEze1x4Q0MsXHhDQ1x4QjI5XHhEOVx4RDEhXHhGNVx4QjlgXHhBM1x4OThdXHhEMjBdXHhERlx4RkJceEQ5XHhDM1x4MDdceEY0RVx4OThXXHg5OFx4RTRceDk5XHgwM31cNCFfXHhERlx4MENceEU2XHhCRURceEJCcFx4ODJceEU4P1x4QkFceEU1XHgwNVNceENBXHg4QTdIYVx4ODNceDAwYyNceEUzOEJzXHhGM0xceEFEXHhEOW5ceDFEXHg5Q1RceEY5XHg4Q1x4QURceDFDX1dceEMyXHhGMFx4QTdceEVGRFx4RTdkPlx4OUJceDEzVFx4RUVceEZGKl1ceEI3aFx4QkR1OHMjXHhFQmpceDBDXHg5OVx4QjZceDkzXHg4MT8yWFx4Q0JceDAyO1x4MUJceDg4dz9ceEE2XHhGMV1ceEY1XHhCQlx4Q0JceDkyXHg4N1x4ODJceDE0XHhFMlx4QThceDhDXHg5NVx4OUIzJlx4QzRceDFDXHhGMFx4RTVceERGXHhFMFx4QjE+XHhFNDI1Ilx4ODc1XHhDQ1BceDAzXHgwNVx4QUVceEMxWVx4RjBceEFCSXRceENDLjJ3VVx4Q0FDXHhFRiJceDBCXHhFMVx4RTVceEQ4XHhENVx4QkFceEZEXHhCQ2pceENBQFx4RTNfRFx4OEZceEZGbVx4QkVceEYwXHhCQ1x4QkRceDA4W1x4MTNceDgzWlFceEQxRFx4QzBceEZCXHhCQ1x4RThceEYxXHhBMVx4RUFNblx4RUNceDFFXHgwNjNceEMzKGxceDg2XHhENjJceDk5eVx4MEFceDk4XHgwN1x4RDdceEJFSVx4N0Z3XHhBREJceEY1XHgxOVx4MUJceENGT3VceDlBXHhBRVx4QjBceERGXHhFOFx4RjAwXHhCNFx4QjdceEMyXHhFNlx4OUVceDFEP1x4QkRHXHhENllORDhceERGXHhFOHNceEVEJlx4MDZceEQzXHhDOCRceEUzXHhBNEhNXHhBRFtceDBFTlx4Q0ZcXHhENVx4MDBceEY4XHhENixcXHg4NFx4MUVceEI3XHhGNVNPXHg4N1x4OTBceEFBXHgwRVx4QzIrXHgwMlx4OUE8XHg5NVx4MTVwXHg5N1x4MDlceENBU1x4RERceENDXHgwRihqXHg5NFx4OEF2XHhEMkV3XFx4QzMsXHhFNFx4QjNceDBDaFx4OUJceDBDXHhCNmVceDAyXHhCQ1x4RjU3XHhDRVx4RENpXHg5QnlxXHhCOVx4MDdceEQyXHhCQVx4RDlceEFFXHg5Nl1eOGBceEE5RFx4MTBceEQ1KU9OXHhGNVx4Q0VceEE0XHhENlx4RkNceEYwOFx4QTlceEFFXHg4Rlx4MTFaXHg5MVx4RTNrXHhCNSVceEI3XHgxN3BCVydceEZEYFw7VFx4QTUxeSpceEREXHhCRTpEXHhFRGdceDhDXi1oXHhEODZqY1x4OUZRZHotXHhBNTFuXHgwNlx4MDdceDBFXHhBNVx4RDhxXHhBMjZceEQ5XHg5Mlx4OUVceEU4fl5ceEQyNTtceDBCXHhGNlx4QjB7XHg4NzZceDBFZFVceEE3aFx4QkFceEQ2XHg5RVpceEQ3XHg5RSBNXHgwM1x4OUFceEMwIWBceDBEfVx4MTNGNlx4QjlceEVGXHhENFx4MTRCQVx4QUJceEEwVnZceEIwXHhGRlx4OUNceEJFb1x4QTdceDE3XHhEQ1x4RkNceDFGXHg5MkhceEQ3d1x4OEVceEYzJFx4RTA8XHg5RFx4QkVceDAzUUVceEFDXHgxN1x4MUJceDEwXHg4Q0BceEI2P1x4REFceEFEXHhGREBceDkxXHg4Mlx4RjZxXHhEOUQyciFceEMzXHhFRVx4OUVceEUxcVx4QzViXHhFNjxceEMxXHhFNlh7XHhCOSY2XHhDOXwxXHgxRVx4QzQjXHgwN3pceDlBXHhGM25ZXHg4M1x4MEFceEMzXHhFNVx4QTJceDgxKXM6XHg3Rlx4MDlceDEyXHhGQ1x4QkJceERENFx4MTdxXHg5MzdLXHg5QVx4RTZceDFEJlx4ODhceDBDXHgxNzdnXHhENWh5IFx4MEJceERBXHhERlx4RTdceDA5XUNPXHgwRmhceEI2XHgwNlx4QzdceERGXHhFNlx4RERceEZBXHgxMGBceEZCLVo/JStrVFx4MTdceEMzdmlpXHhCMlx4RTlceEU2SVx4RDdFOFIhZUJceEYzXHgwNlx4QkRceENFQlx4QTlceEIzXHhENG1ceEJBXHhCRVx4OUJceDAyXHg5Rlx4MEJceDkxXHhBQXRceEZBXHhDNlx4MDBRXHhCMVx4OUJceENDXHhBMHVceDA3XHhCOVtZLlx4ODModHBMXHg5Mlx4MEMkXHg4MFx4RjlceDE0XHgxMGs5XHhBMWxceDFBXHgxMlx4RURceEQyXHhGM1x4RkRceDA2XHhGQlx4RERceEFFXFx4MTJpP1x4RTZmL1x4MTRvXHgwRlx4QUFceDgxdVx4QzFceEU1XHhDN1x4OEVyXHg4Rlx4RjhqXHhENlx4QkVceDg2S0g0XHgwQ25ceDhEXHg4M1x4MDNceDBCXHhFRUFcXHg4NS1ceDhFXHhCMF5ceDg1Llx4REI/MypBPlx4RTNceDk3XHhDRVx4QjdceDBCXHhDRFx4QTBceDk2XHgxOFx4ODRceDhEXHhBM1x4QTlceDE0XHhBQVx4QjlceEIzKlx4RTlceDAxX1FceENDXHhCNEZrXHhBRDBceEZEXHhCQ1x4MTdceDlFXHhBNGVceDAxcFx4QzZjXHg5NVI4bFtceDEzXHg4N1x4MEFceENBQFx4RTFIXHhDNVx4RjlceDA5V1x4RTYod1x4RjdceDg1XHgwMFtceEEwXHhCOVx4MDlceDg0XHg4N1x4QjJceDhDXHhCQn5ceENGXHg4QXtceDkwXHg5NmMgXHhEMHtceDlEXHhDOVx4MDJceEE4YlVceEM2XHg4NTRceDBFXHhENWpceERCXHhDQURceDA1P1x4RDIiXHhDRFx4OUFpa1x4QTFKXHg4Mlx4RjJceDg0XHhFOFx4RTVceEJCXHg5MXNceDk1XHhBRlx4OTdceDAzXHhCN3JZXHg5OVx4MEJceEE2XHg5OFx4RTJnW3lceEU1XHhFQlx4RDJceENEOzdceDk5XHgwOSJceEI1XHhGNXcsQFx4OURceEUyXHg4OVx4RDNceDE2XHgxOVx4Rjh5XHhGRkJceEQ5XHhCQlx4QTMpXHhBOVx4MTRceEE5XHg5OVx4MDJSXHhDMVx4OTZceEE1XHhFMVx4REU8XHhBQVE2XHhFQm9ceEUyXHg4NyZHXHg5OSFceEVDMFx4OTV9XHhDN1x4QkNceDBDXHg4QVx4OTVceEJCdSRceEJBXHg4NFJ4XHhDOCI7XHg4Rlx4MTFceEY4XHg4Nlx4ODVdI1x4RURceEM2IT0zX1x4OTRceEVGXHhEMX1ceDFDXHhDQ1x4RjFceEU4XHgwRVx4MTFceEJDXHhFOFx4ODBceEI5QDJceEU2XHg4RjlceEY3XHhCNytceEEyXHg5Q31vXHhFMCFceEFEXHg5RGU/XkxCXHhEMS1ceEQ4XHhEOFx4OERceDFFXHg5Rj9ceEM3Nlx4RDY9XHhBN1x4RTJceEREVFx4MUZmXHhFNEpZJFx4QUVeXHhERCVceEJDPCRceDBDXHhCNFx4MDdyXHg4NXUuXHhGN1x4ODFceEM4XHhFOVx4ODFtdFx4OTFceDlCXHg5MFx4OTQ1XHhFQVx4QkRceEM4XHhDRlx4OTQ+XHhFRFx4QkUhXHhGM1x4OTVtXHhBRFx4RDhlaU5ceEY0eFx4RjJceDAzPlx4RTRvXHhGOFx4OTlceDBEXHg5Mlx4QjBceEQ4S1x4QjNceEVBXHhCRFx4RkZceDgyXHhFODhwb1x4QjFceDE5RUZceERGXHgwNVx4RjQ6XHhGMDd9XFFceDBCXHhDMV1ceEQyXHhGRlx4ODNceDFEOlx4ODQxI1x4OEJceEZFXHhCOCZceEYxXHhCNy0oXHgxOUpceDkwLlx4MDdceEMzXHhDOFx4OTI6XHg5RWNceDkwXHhGOFx4QkRceDFGXHhGMG9ceEIzXHg5QVx4QTFceDFBXHhFM1x4ODdceEY2X1x4RDZceEEzaVx4RTNnT1x4RURceEMzcFtceEI4XHg3Rlx4Q0RceDlDXHhEMFx4QjdceEQ1XHhDRWJceDlFXHgwRTNceEJGK1x4ODZ5XHhCNFx4RTdceDkwJFx4QTlceEJGXHhDMXVzXHg4M3ZceEI0XHhFMVx4OUNceDkyMEBceEI2XHhEMlx4MDFceEY0MVx4QUVceEE0LVx4MDc3JTk3aC49XHhEOSNceEYwXHhGRlx4RjlceDEyaFx4ODFceEQxXHhEQXBceEU5KFx4QUNceEJEXHgxRFx4MTREXHhEOUJceDhGXHg4QVx4OTFceEI0XHhBMChceDkyXHhFQ1x4OUIqJyxFXHg5RWlceDk3XHhDOFx4ODFceEI4XHg5Mlx4RkRceEU1SFx4MUNCXFVkXHhBRFx4RkZceERFPy1ceEFBXHg4M1x4MTlceEI0XHhCRlx4MEFceEEzK1x4OTNceEI5XHhDM1x4QTlceDExIVx4QzJceEQyXHhBOScldFx4Qjk4XHgwOFx4REZebTNceEQ3XHhFQVx4MTlceEYxMz0uXHhFMTE6XHg5M0tpY1x4OUNwXHg4OFx4MDA9XHhCN15ceEU5eVx4MDFceDE2Jlx4RUVceEMzXHg4Rj8gXHg5N1x4MDdea3ZceDlCbFx4ODhceDA3SmUkXHhCNVx4QjRKbDJceDkzXHhCMlx4RjhceDEwXHg4QVpceEY5XHgxN1x4RUQoTFx4RDFceDlBNlx4QUNceEY4XHhBMFx4MEJceDA3XHhGMFx4RERceDFCTiRCaStceDE5Q1x4QkIqXHg5NFx4RUVceERDXHgxRVx4OUJceEEzXHhEMlx4RjNsXHhGMFx4QjFceEVBXHhDRlx4RTNceEQ2XHhGM1x4MUVceDhCXHhERFx4RjZceEI0XHg4Ri9+XHg5RjtceEQ3XHgwOHZceEFFQFx4QkE0XHg4QVx4QjZceDkxcVx4ODBceEVDOFx4MTVceEE5XHhBMVx4OTFceEZGXHgwNVx4MEVceEZCXHhCRVx4QkJceDFGXHg5Mlx4RDlXXHg5MVx4REJceEY1XHhEQlx4QTBceDhGXHhCOSVGY1x4REZceEQxXHhDRVx4QzhuXHhFNiNceDlEQlx4Q0FceEYyXHhDMVx4OTJMXHhGQm5ceDlDXHgxMDBceDBCXHgwNlx4MDNceEZGbVx4MERceDA5XHhFRVx4OEFceEJCXHg4NzFSNDlceEMzS1x4RUFlXHhGMXtgXHgwRVx4RDUsXHhEMXJNXHgxQjpceDFEXHhENlx4RTVceDlDXHhBQVx4RUZceEZFXHg5OStZNVx4MDhceEYzV1x4MTZceEUxYz44XHhDNzxceEE3MUBceEVCXHgxNjlceDBBVipzXHgxQVx4Q0VXeDEqXHg3Rlx4OURceDkxXHhBOVx4RjZceEMwelx4OTRceDk3JWlceEVDXHg4MVx4QzFceEQyXHgxQ1x4ODlceDlEVVx4RUZceDlCXHg4MldceDAzXHgxRlx4MERceDkwXHgwM1pvTl1dXHgxRlx4QjFceDhBXHhCMFx4RDFceEE3XHhCRVFWflx4MEJceDFBXHhBQ3JceEVGOVx4QTdceDAzXHhEQVx4QzVWL1x4Q0I5Ilx4MUVceDg2XHg5RUlceDhDXHhERjNceDk5XHgxMHlceEVCXHhGRlx4MTdceDk0XHgxN2ZceEU5XHhBMUBceEQyXHhBM1x4RjAjXHhCN1x4RjhceEMwXHhBNjdceEM3RDtceDExaVx4RjZceEJBXHhEQlx4RjdIXHhEMlx4RTdceEM3XHg4Rlx4MUVYUlx4Q0VceDlBc1x4MDJnXHhFM1x4QTBIXHhCQlx4RjA6XHg5Qlx4RDRceDhBXUZrXHhCRVx4RENceEI2XHg5QVx4RjZceENEXHhDOCBceEI2KVx4QTNceEE5XHgwM1x4RENceEI2a1tceDg0XHhCOT03XHg5OVx4QzcgXHg4MCBceDg2XHg5NVx4RTgyXHhDOD5TXHhBQVx4RkYrXHg5N1x4MThoXHgwMDFAXHhFNyFKXHhGRihOXHgxQVx4RkUuXHhGMkBceEQxXHhGOVx4RTVceDBEYVx4MTVceDhEXHgwRVx4RDQuXHg5M1x4Q0FDXHg4RVx4MDRceDA3XHg4RVx4QzZceEEwXHg4NFUmOUIrXHg4QVx4MTRQMFx4RENceEUxXHhDMXNpXHhCRl9zXHgwMlx4REJceEY1XHg5N1x4QzVceEY2XFx4OTcwUmlSXHgwM1x4Q0NceEM5UyRceDkwXHhDQjxceDA0XHhCOVx4QzZceEM5S1BceDg1PVx4RTAmXHhFNlx4RDZceDEwKnlceDgwXHhCM1x4REFceEU5N1x4RjgtY1tibVxoXHhDQmpceEVEXHgwMiRceEJFXHhGQlxiaiFceEZGRVx4RTRceEIzXHg4OFx4Q0FceEREXHhDRlx4Q0E9Z0dceERBXHg4QVx4QkJceDFBXHhGNlx4OTI5XHhENFx4ODgwXHhBRFx4RTNceEMyXHhDM1x4RjRceDFGXHhFMzY6XHhERCBceENGY1x4MTFceDkxTFx4OEJceDk1ZVx4REFceEE1flx4REFceDAyXHhCMlx4QUZBRlx4QTlGXHhFQVx4QTdceEM0XHgxN1x4QjZceEM1JGE5e1x4MERceDkzXHgxOXszOnkjXHgwRlx4RDZyXHgxMlx4RUJceERBXHhCNF9ceEYwXHhCQVx4QjFceDE1QFx4QUNceDg5XHhFOVx4RUVwXHg4OFx4OUUiXHhBOVx4OUZ0XHgxMFx4MTVceEY3XHhFMkFceDg0XHhDRDdceEQyXHg4RVx4Qzg0XHhBQVx4RTZceDhDXHg4Nlx4RkZceEI0XHg4RFx4QjlZXHhDOFx4QTRFXHg5MVx4QTNceERCXHhBRlx4MUIlOFx4ODRceDFGXHhEMFx4RERXXHhCOFx4QzlceDlFXHhDQVx4MEZceEQ2c1x4RDhceDFDXHhDQlx4QTdceEQyXHhBM31wXHg4Rlx4RjdceERGPlx4RTlceDkxXHhBQlx4QzJyI1x4QjdceDhDP1x4MTEnXHg4MFFceDhBb1x4MDFceDgyLmEvL2hceDBCXHhFRTVceEUwXHhBMFx4Q0JwSFx4RTFceDlGMlx4RTVpR3JLXHhFQlx4MDlceDE5XHhGQkZceEE5LFx4MTRceENDXHg5MFx4ODV+c1x4RjEnKj9xXHhFOVx4MENgYFx4RDlceEU0Wlx4RDFceDE1XHhDMXFceEU2XHgxNVx4RDAofVx4OTgyXHgwM1x4Qjc5Y1x4MDJceEU3XHhBQVx4RUVWX2FceDk4Q1x4RTJceEFEXHhFM1x4RjdceEM4XVx4RjlceEM2I1x4OTEoblx4MEY8JFx4OUZceDlEI1x4MERceDlFXHgxQVx4MUJceDAxXHhBMChceEIyXHg4QWBTXHhFQ1x4OUFVXHgxNlx4OUNceEEzXHgxNlx4RUZxXHhEOTtceEFBMVx4QzEsXHhBN1x4QTRceEU1XHhERFx4ODJWXHhBMEFceEQ5c1xseFx4OTJceEQ0KlxceERFXHg4Q1x4QUFceDg4XHg4NVx4QUVceEY3XHg5Mlx4N0ZceEI0XHg4OFx4QkJceEE3JEdceDg3K1x4MDRceDFFJ1x4RUNceDA0Ulx4MERceEU2KFx4RTJceDdGXHhENkogPFx4QjRceDhDaFx4RDZceEU0QSRceEM4TGcic2sgXHg5OFx4RkNceEQyXHhBNVx4MDFceEVDNlx4REVceEIwZGFQXHhCQ1x4RUNceDA4XHhBRVx4QThrXHg4NFx4ODZSQl4ta3ZceEIyXHhBM1x4MDkvcVx4OTUmRVx4OUVceDkxXHhGN1x4MTYpKFx4ODBceDlGXHhDMU9ceEQ5XHhFRjBceEQ3S1x4OTJceDAxYlx4MTcyXHhEMFx4QTg7XHhEOVx4QTJceEU4XHgwMFx4MTRceEVFXHhFOVx4RjNceDE5PCt+TFx4RURceDhEXHhGMFx4MTRceEJEXHgxOHlceEJEXjFceEU1XHgxMU1ceEZFXHhGNlx4QjBceEYzXHhBQjFceDAxXHg4MFx4MDRceEZFXHg4OCw/KFx4MUVceDgxSTlceDFDXHgwRlx4Q0ItLCNceEQzXHg4Mlx4MTBIKFx4OTN7XHg5OVx4RTVaXHhFQVx4OENpTFBceEMyXHgxQlx4QzBceEI3cFx4RERqc1x4QjJxLXQzXHhEOVx4ODlceEU2alx4MTdceDExXHhBNFx4RjRceDFEZlx4MTVceDlEXHhFMlx4MTNceEIzK1x4RDBceEY5XHhGRVx4RUVtXHhEOFx4MEZceEVEXHg4N1x4RDEnXHhBMEF6KWFceEVDXHg5RFJceDkxfFx4RkNceEJCelx4QjlceEYyWlx4RDRceEUxKFx4MDB8Mlx4RENceDk4XHhERVJBXHhDNFx4QzZceEFBXHhCNVx4QkZceDhGXHgxMlx4OURzXHhEOVx4N0Y2XHgxN0hceDkzfVx4OUFceENCXHhBMFx4RDN5XHg5NFx4QzhceDg2bSZ5XHhGMX1TKlx4RDRNKlx4OTVceEVBXHhCNFx4RjZceDFFXHg5Q29ceDgwXHhGNVx4ODVceEVGc1x4QThIXHgwQVx4OTBceEVGXHhENlx4RDVceEVEK2xceEI2QFx4ODBceDhEYFx4RTA3XHg4Q1x4RTVvMURceEYyXHgwNFx4QjV5XHg5Q1x4RDVceDg5RyVceEZCXHhFOFx4QjZceEQ4XHgxNFx4RkRceDBCXHg4NF5ceDExXHgxRj5OXHg4MmtceEM5XHgxRVx4QTVceDg5XHgwQlBceEVEXHgxOVtceEZGP1x4RjZefFx4OUUyXHgxRVx4RTRceEMwXHhBOVVHQyZceEQxVCNWXHg4Qlx4RDBceEIyXHhGNFx4OTQ1JDVceDAyKFx4QzR1QmoyXHhGN1x4N0ZUXHg5RFxceENEXHhDM1x4OEZceEQ2XHhENlx4QzF4XHhCMlx4QkJceDgxXHgwM1x4QzJceEM3Z2pceEJDcFx4QUZceEVDXHhCOVFOXHg5RFx4RUJceEYxXHgwM1x4MUJceEUwXHhBOSJceEY2XHhFRDx8XHgwQ1x4MTI1XHhFOC9rc1x4RkJceEE0TkFceDgzXHg4Nlx4MUNgXHhBMVx4MENJRXdwXHhBOSNceDhGblx4Q0FceEVEXHhDOFx4RjhceERDXHgwQUtceEYyXHgwM05ceDE0XHg4RFx4OTJceEUyL1x4RDhceDA3XHhFQVx4QTFceERFXHhDRT4hSD5qKVx4RTIsXHg4QW1ceEQwXHhDRj9ceDBGXHg4RTdceEU4J1x4RDFkXHg4M1x4RDJceEU1XHg5NiFceEE3clx4MDdceEQ5Ilx4RjFaM1x4MENceDAxTFx4MTZCSi9KXHgwQVx4RTRceDg5XHhGN1x4RkJceDEwXHhFM1x4MUJzXHgxQlx4ODk5LltwXHhGRVx4OTVceEJDdlx4QzdceEE1KTFBXHgxRFx4RTFIXHhERVx4ODlWXHhDNXxceDE0XHhGMVx4ODFRXHhCQ1x4Q0FceDlGXHhGRFx4RjNceENBXHg4NVlceDBFXHhDMVx4MTV+QFx4MEV4XHg5NFx4RkJiV1x4QjlTQFx4MTdceDFGWVx4QkJjXHhBQ1x4ODlceEU0XHg4OVx4RUVceDFDXHhEM1x4OEJ8JzdceEFDXHhEMFx4QTFkXHgxRlUsXHhDN1x4QzBceEMwXHhBNlx4ODZceDlDXHhDNVx4QTlceDgxY3ZMXHhBNHZcXHg5MHhceERGUVx4OTJXV1x4OUFceERFXHhGNnNceDBGXHhEQ1x4ODMucCNceDA5XHhDN1x4RjNceEVCa2NceERGXHgxQVx4RTBceEEzSFx4MDlceEQ3fVx4N0YiXHg4RFx4ODljXHhEMVx4OEFceERBXHhFQixceEU3Klx4OEJceDAxXHg4OFx4RjhsXHgwNlx4RTFceEE5dXJYN1hceEZBZVx4RDk7XHgxMlx4QkErXHhGRVx4ODdceEZCXHg5Nlx4RjBceEY3XHhCRVx4QzNceDFBXHhBN1x4QjFceEVDPkRVXHhFNVx4MUNvXHhDN2VceEI2dFx4QzRceDg2XHhEMlx4OTlceDA4XHgwRlx4QkJceEFCXHhCMVx4RDk3XHhBMW5ceEM1KEVsXHhBMmRceEYxa3QkcEFceDA4XHgwNiNceEEzelx4QzhceDgwRFx4MTNceEM2PyJ5dlx4RDBceDg0XHhDMHlceDAxXHgwQVx4OUVceDFGYiZceEFBXHgxQlx4OUUqVFx4QkZceEE3XHg4M1x4REJceEU2VVx4QjdceEUzXHhFMFx4QzhceEJBXHhERlx4RkZtXHhDNGRceEUwNVx4QkNceEM3XHg4OVx4RDlceEU5REw6XHhDMiYkXFx4QTFceEZGXHg5NDAvXHg4RStceEJDJyVceEQ4XHgwMzJceEE4XHgxRHhceDlDXHhEQlx4QjBgLWtceDFGXHhCMlx4QzVceDBGXHgwRWQuXHhDMXp1Klx4RTBceEFDT1x4MEJceEU1dW1ceEZDPVx4QjBceEREXHgwMzlceDE0amRceEZFYVx4QzkjKmpceEY2P3ciXHgxOVx4QzBiXHhBOVx4OURceENGWVx4MTQ2XHhEQVx4QTZceDFEXHg5N1x4Q0ZceDgwXHgwOVx4RjgsTVx4QUE+XHgxQVx4OURceEIyXHgxMFx4REEvXHg4OE5ceEFDXHgxRC5ceEJGXHhGNlx4QkFTXHgxMC5CXVx4RkRceEUwTFx4QURceEZFXHg4RVx4QjBceEE4elx4RjBceEY1XHhGQ2V3XHg4MSdENWlceDBGXHhDQVZ1Olx4MDBceEY4KVx4QUZceEZGT1x4Q0JceDFDXHhCNFx4QzI4Y1RceEZCQVx4RjkzLVx4RjBceEY5XHg5QmI1XHg4NTJceEY0XHgwN1x4ODdceERBXHg5NVx4MDcyc0ZceDE4XHgwNVNceEQ1TWt6XHgwMFx4MDFceEIzVVx4Q0ZNXHg4QUlceDA2XHhCNlx4RTZceDBFVlx4Q0NaXHhEMFx4QzRceDg3XHhFRVx4MUQxfWVceEQ0dFx4OTIzXHhCNVx4MDVceEFGZlx4QUVceEIwfVx4QzJceEJGXHhCOFx4OTJceDhCeFx4QzFceDhEXHhEOFx4RDVceEYzW3JceEFDXHhGMVx4QTUyXHhGOVx4RTZPXHgwOVx4Q0VceEQ3VStceEYzXHhBNVhceEFGKD9ceDFGXHhFQ1x4MTFceDhEXHhFMVVceEU2XHhGQ1A9XHhCN0JdY3RceDk5YFx4QkFceDAyXHgxQnxceEI0UHhZclx4QUFceEFBXHhEOVx4RUJceDg4SFx4QzE+IGRxXHhFMFx4ODBceDlFKVQ/TSVceDAzXHg4OVx4QTJceEZFXHhERTxceEY3XHhBMFx4RTR7XHhDOERceEEzRyJQQ1x4OTJceEUyXHg5Qlx4RkN1XHg4Mlx4RTRLXHhFRlx4MUVceDBDXHhCMCZceDFEXHgwMVx4RUNceEEyXHhEQ1VqIFx4OEFceEJDeVx4MTZceEREM1x4RUFUXHhGMFx4QURceEU0XHg5N1x4RTMtXHgxRFx4ODg9OldceDEyXHgxMklceEI5XHgwOE1GXHhGRlx4ODZceDAyXHgwMVx4MUZ3XHhBQlx4MTg2XHg5Ny1ceDlGXHg4QVx4MTg0XHhDM1x4N0ZceEY5XHhGQVx4RkFceENBXHhCN0NceDg1XHhFQ1x4MTRceDBGKipqXHhBQVx4RDZceERFXHhDQVx4OERceEZCMlx4MDZceEIyXHgwQ0NceEJEXHgxQztXXHg4M3RceEJBXHhDQVx4QUZceEFDXHhDMFx4RTMkXHhGMlx4MDBceDk0XHgwQ1owXHg5NFx4MEZceEEyKnBceEE5XHg4RSVceENDXHgwOERceEVGXHhBRVx4QjhceENCKT1vXHhFQltceEZDXHhFOFx4ODFVeVBceEEyXHgwQlx4RkIpXHhGMTVceERBXHhBM3BceEYzYFx4RTdceEY5XHg4NVx4ODh6XHhDQ1x4RjJceEU1XHhFMlx4RjlceEU3XHhCNy1ceDhBXHhGRVVceEI1XHgwMFx4QkVVXHg4Rlx4MTlceDlGdXlceERGY1x4QjNceEFFUVx4Q0JceDlGXHhDN1x4MUVceEJFXHhGNzFfXHhBRT1ceDA3XHhGM1x4RjNYZlx4OTFceDg2XHg5NFx4QzM8I3BMXHg4NFx4MUJ4M1x4RjdceEFBLFx4REImN1x4REVceDBGN1x4MDVceDFGXHhDQlx4MTVceEM0bztceENFS0ZFXHhENjJceDdGLVx4MTM/eVx4MUJceEE3XHg5Q1x4MURceDlEVS4jXHg4RVFyXHgxNVx4MURDL1x4RjhhL21ceDE1SFx4N0ZceDg2XHhCOVx4RjlceDBFQ19UY1x4ODJSXHg5Qi9ceDlDXHhBM3hSXHhEOVx4Q0RceENDXHhCOFx4MUFceEZGXHgwN1x4QTRceEI2XHhFRVx4MUN9XHhCMzJceEExfHlceDgxXHg4NFx4QzBceEIyXHg4MVx4Q0RceEQ2XHhCMVx4OTMoT1dceEVDXHgwNVx4QkQsMHM1XHhEOFx4OUJceEQ5JXxiXHg4N1x4RTVceEM2XHhBN1x4RUVceEZCXHgxMn5ceEQ2XHhBN11ceEI2Xlx4MEFceEY2XHgwNmBceDA5SVx4RkZceDkyXHg4OClceEFBXHhCQVx4REVceDg3XHhBRFx4Q0ZrXHhGNSlceEJDXHgwOC1ceEJGJFx4MDdPJT9ceEI4XHhFM1x4RDNceDBBKmQpcVx4RTBceDBEXHg4NFx4OUNKIWhceDEwXHhGMUg6XHhCMVx4RjBceENEXHgwQmBPXHg4MFx4QTQsXHhFQ1x4RjNceDAyK1x4MDlceDhDMi5SXHhENFx4QUZAXHhDOTBLfixceDFGXHhGMDtJXHgwNlx4MTAzXHgwRFx4OTNFbFx4RUVceDEyXHhFN1x4MUNceEM5XHgxMDAyTTcwXHhBQkdzXHhGRlpceDkxXHhCNFx4QzVceEIzMlx4OEVceDk4XHhENVx4QURceEJDPGxceEI2XHhERlx4MDhceEM5XHhBOVx4MTFceEZDXHgwMTdceDBGXHhFM3ZceEFDK1x4QUQmWVx4RERceEI0XHhCNiBceEE4XHg4OVx4QThceEZCXHhCQlx4MENceDBEYVx4Q0JceDkxWlx4RTZceEEwXHhGN1x4QjdfXHhCMVx4QkI2VVx4ODdceERFU1x4MUMlXHg4RlR7XHhCOFx4MUJHQVx4QjdceEQxXHgxOFhceEQ5XHhDQ1x4QkZceEI0XHgxMSh3XHhFMHdceEFEXHgwRVx4QTdceDg5XHhFMUxceEI3XHhFQlx4RkRaXHg4RVx4OUU/VFx4RjJceEIzXHhCOF5ceEQ2dFx4RkFceDAxXyRceEFCXHhERlx4OUF5XHhEQVpceEM0XHhGMzVBXHgwQX5ceDhEXHg4NVx4RjdceDkwXHhBRFx4QTNceDkwXHhCOSpceDFEXHgxQVx4OENceEMxXHhFMVx4QURceDBFXHgwOCNceERGXHhGOVEpbFx4RDRceEM4ciBYXHg5MDxceEE5flx4QzNceEQ5XHhFRlx4OEFvaTlceDgzQVx4RkJceDFGMVx4QTFIVTZceDFGXHgwRFBceEE2XHhCQSpfXHg5Q1x4RDRceEM0dlx4RUEzXHgxMUxceEY4XHhFQ1x4OTJceERCV1lceEZBd1x4OTZ5XHgxQlx4QkZ3d3JceDlDTVx4MEJceEM0XHhBNFx4RjBceEI1XHg5OWlCJVx4QzRceEU1TFx4ODZtMFx4MDNUc1x4RTNXXHg5NFx4RjUkRUwoUlx4Q0JceDk0R1x4QjBQXHhCOVx4RUVceEExXHg4M2dceEZBXHg4NS1ceEE3NWdAZlx4RThceDFCP1x4QUJuXHhENlx4OURceERGXHhEOWtceDgyN1x4RjZceENCMFx4MDEsXHhGN1x4OEFceEJDXHg5N1x4OTlceDhDXHhDNVx4OTVceDk3dVx4ODgkV0VceEEzXHgxQn1ceEQyXHg4NVx4RjJceDEwXHhCQ1x4MEFceEU0Z1x4QzI6QGlceDhBXHhGNkFceDE5XHhERlx4Qzl9XHhBRSBceDFEXHhDMGZceEIxXHhCRFx4RTY0XHhGNVx4ODNceDhFXHhBNTFceERBXHhCRVx4RDRceENFfD1ceDBFXHhFNFt0LXRkfFx4REVNO1x4RjRceDAwPFx4OEVvb1x4RTR7MVx4RDBceDlDPXBmKlx4ODZOXHg5MytceEFFelx4QkZceDAzI1x4OTB8QW1ceDgxXHhDQ3JceDkwU2d4XHg4QSJ8XHhCNlx4QkU9VFx4OTJceDdGIlx4OUEvXHhDQVx4Q0ZceEVDXHhDQVx4QUVpXHgxQVx4QzZceDFGXHgwRGRceDlDXHhFNlxceEFFXHhFMFx4RTlceEY5XHg5M1x4RUJbXHgxNkdceEE0XHhDNVx4RkNceEUyXHhGRVx4RTlceDkzZFx4MDdceEM5XHhBQ2VceEI5XHg5RDBceEVBQ2BceEREZFx4MDdceERDXHgwMnBceEEzXHg4RVx4REJceENBXHhGNlx4OUNceENEXHg5Qlx4QzVceDkzXFx4QjJXXHg5MGo0XHhDRVx4MENceEE0XHgxNFx4OTkxXHhCQ0lBXHhGQndceEQwXHgwQVx4MENceEEyXHhGN1x4QUZoXHhBM1x4ODg0XHhCQ1x4RTZceEIyXHgxQXBceDlDXHhERFx4OEV8XHhGRVx4Q0VceEI3XHhGRnBceENCXHg4NDR+Vlx4QzNceDhBXHhGNVx4MEEnaVx4QzZceEU2XHhCNVx4ODZjXHhCRFx4MUFceDdGQlx4QzJceDBGZ1x4QjFcXHgxOCokXHhGMVx4MTZxXHgwNHxzXHgwM3xceDBDaVx4QUE8RFx4QkRceDk5S21ceDlBXHg5OFx4RDV8Wnx6XHhGQlx4MEFceEM2XHhCQVx4RDM7XHgwQVx4QzdOXHhGQlx4MThNXHhEQ1x4OTBceDBGXHhBRCUlez56XHgwMHlceDFGXHg5OFx4REV3K0ZceDgwXHg5Rlx4QTdyZlx4QTBceDg2LFx4RDBceDAyVFx4RkIkXHgwQlx4OTBceDhBXHhERWBceEE5XHgxNlx4MTgjQ1x4RDZceEE4XHg5NVx4RDRceEM1Vlx4OUJvRVx4REFceEE5eFx4QTcsTiYsalx4RTlceEYzXHg4NCNGUTRceEQ3XHgwRFx4QThceDgyUktGXHhCN1x4OTNceEIwXHgwNCtceEU0XHhBM3UwNFx4QUJceDk4XHhBQUtceEVBXHg5MnY7XHgwRFx4OTZMNilceENDXHg4MVx4QkJceEM1XHhDRFx4QzA5XHhBMGNceEZCXHhCMkJceDgzXHg5MFRceEQxWlx4QTFceDhBXHg4RmVceDE5XHhCOFx4RDJhXHhCMltceEFFXHhDQVx4RTRceEVBXHhGOVx4RkJceEM3XHhBNklceENCTCFTU1pceEFFXHhGNV9ceEI1J1x4OEJceDk2XHgxMHJceDhGXHhGNmkmK1x4ODlceEJFXHhGOVx4ODBtXHg4MVx4ODVeNFx4QzNceDg3XHhFRlx4Q0I8bVx4OUFceEY2XHhFMmEoXHhCOVx4RkVceEJDXHhEQ1x4OUFceEQwXHg4Rlx4QkNyQVx4OTZcNCxceEZGLSBceEMyXHhGNlx4RTRJXHhEQ1x4OUYhXHhCNFx4MTY7LVx4RjRceEVEXHhGNGxeX1dceEYwXHgwNFx4QUQteFx4QjdceENFXHhFOFx4OEVceEE4blx4MDRceEQxXHg5NGFceDgxekpceEJBOVx4RENceEFGXHg5RVx4MUZceEM5ZFx4MTdceDlEXHgwOUNceEExeFx4OUJdXHgwRlx4QTNceEZDTmMgMzlzXHgxMHxceEE4XHg5MzlceEY1XHhDNSJceERFMlx4MTF5XHgwMVx4QjFceDhGXHgxMUF6XHhDMHpQXHhEM2lceENCXHgwOFx4RDNceEI2XHhDNFx4QjR8TFx4OTNceDgyXHhCM01ceDFDN1x4OEVceEE2amxceEM4flx4Qjl5KFx4QjdiXHgxN1x4RUNceEE4XHgxOV8yXHgwQlx4RjVuXVx4RjZceEVGXHg5Q1x4RTFvXHgxMlx4QjJceEYwRmlceEFBYFx4OTlceEY5IVhyXHhCOWxceEY4XHhGNF9ceDBEXHhDNClceDBFXHhGNnVceEIwYVx4OTZNXHg4NUlMXHg5RHxceDlBQlx4MURceEIxOFx4MDRceEVCXHgwNlx4QTJceENBMFx4MDdceEQwXHhCRVx4RUUmXHhGNzpceDE2flx4QkZceEY1XHhGRlVceEI3XHgwMSxceDgyc1x4RTYwXHhDQ2dceEU5XHgxRF5ceDk2XHgwNlx4OTRceDlCXHhDRlx4MDlceEIyXHgxOFx4QzUhW1x4RUJceDE5XHhFOC5xXHhENFx4MDBXXHgxNitceDBDXHhENDhEWlx4REJ8XHgxN2NEXHhGRjlceEU1ImBceENFXHhFQVx4RDJceEIwXHgxOVx4RjlceDk1XHhBRFx4REJceEIwXHgwQlx4QjE5Ylx4QTVKUVx4OTZceEY1XHhGOFx4OTZceEU5J1x4QzZJXHhBNlx4RDlceDFGXHg5MFx4OTJDYlx4QUNceEFDXHg5Qlx4QzZceDdGPHRceEMyXHg5NCVceERGXHhGMFx4QUZceDBEOTtceEExXHhDM1x4OTM8XHhGMVx4RTBfXVx4OEFceEYzXHg5Qlx4RUZceEY3XHhGNVx4MDVceEVEd1x4MENceEFBTFx4MUJceDExXHhENVx4OTRceDlDXHhEQ1x4OTFceERCXHgwQnZceDA1YFx4OEU1XHg4NVx4MUU2XHhFN1x4MTFceEVBMD85XHhERFx4RkZceDBFXVFceERDJlx4QjFceDhGZlx4OEJceDFBXHhFMmxLOlx4RDZceDkxb1x4MUUxWStceEY4IFx4RTJaXHg5MFx4OEErXHg5Nlx4RDlceDAwXHhBQlx4RjhceEEzPl9oXHhGNlx4RTRceEQzXHhBQ1x4QTlceDA2QFx4RTVceEFCXHg5Mlx4MTdceEY4Plx4ODdceEY5XHhFRlx4RUJDXHg4OVx4QTd1aFx4RTVceDhBXHg5MlZceDA5V1x4MTRceEFCXHhDMFx4RTlceEQxXHhBOFx4ODY5aVp8XHhFRFx4RTZxXHhENVx4ODlFXHg4Q1x4QzRceDA5XHhCMWtceDkxW1x4MUFdXHhCQmtceEYxXHhDOFx4QUNceEY4T0w/XHgwNDJceDhEXHhCRHNIXHg5RH4kXHhBMVx4QjZceDExXHg5MVx4QjM7XHhCMFx4QjFyXHgxN2NceDBCXHgxRVx4QTZceEIwXHgwMHhceDBCXHhDNVxceEQ5XHg5Rlx4QzNceERGXHgxODhceEM4I1x4QjdzXHg5NVx4RjVceEM3XHg4N1x4MEZceEI4MHNWMlx4QTlnXHg4QVx4QkNceEU0XHhBOVVceEQyXHgxQUVceEVDXVx4OTlceDgzMztceDFCMlx4QTJceDk0LFx4RjM/XHgxNVx4RjZceEMyXHhFQlx4RkZceDA1XHg5M1x4MTlceEYxXHhBN3RceDgyXHhBOFx4MTNceENDXHgxMlx4ODhceEMxXHg4QVx4RUV4XF5wXHhCNVx4RTMkXHg4RFZceDlGPlx4MDFceDhGXHgwMVx4OUZRXHgwOFx4QTBceEFFXHgwQ1x4MEVceDBGXHhGNSRceEE0XHgxN1JJXHhDMFx4QzkpXHgxNlx4MDZSXHhEOFx4QzFrXHhBRWlEXHhBQVx4MEQzW1x4MUFvXHgxRTF7XHgxNE1ceDgxXHhCOVg0XHhGOF1ceDlGV1x4RkNceEUwXHg4Mlx4QzJceEM2Qlx4OEYjXHhBRlx4RDhceENFXHhFN1x4QTNwXHhGOCNceEMyLlx4RkFRXHhFMUxceDk2XHhCOVxceDk4TllceEQ1XHhGMlx4MURceEQzXHhGM1x4QzNceEIxMnE4XHg4Qlx4RDRceDg4fClDXHhEQ1tceEU2XHhBN1x4OUJceEI2XHgxMmtYZFx4MDFceEU0XHg5Nlx4RDJceDkyXHhGQ1x4QTBceDBESVx4QUFceDhCXHhDRFx4MEZQKmVceEEzSiVceEZGXHhCN1pceDhFXHhFOFx4REV0XHg5QXFYXHg5RWNKU1x4RDFceDg0XHhCMVx4MTVceDBGXHgxMFx4RTRceDlFXHhENlx4QTBceEYxXHhDOXJuXHg4OVx4OTVceEE4XHg5MShceDA4XHgxN2hWXHhFRUxceDA5XHgwRiNceEQ2XHgwOFx4QjIuXHg5Q1x4RDBceDA1XHhBMVx4MTBceEIzXHhFN1x4RENceDk5TmZceEZFXHhDRlx4REIlXHgwOF1ceEI5RFx4QkJceDg4XHgxQ3FceEE3XHhGQVx4RDZceEM4XHhGRTR8XHgwN1hceDA1QVx4RTdQXHg5Nlx4QzFceEVGXHg4NFx4QzJtSEVceEE0XHhFRFx4MDJceDAyO0ZEXHgwOFdceEQxe1x4OUZddVx4RDAoaFNceEI2O1x4OTRceEIyXHhDMlx4MTMhYFx4RjVfXHgwMFx4MDhCJC5ceDAyXHg5NHAiOzM3fltceEZBXHhFRVx4ODZceERELlx4MTJceENBXHhFMFx4ODJmR1x4RTRceDE0LERaOVx4RjhIMVdceDlBeDUmXHhBMThceDBCbCdeXHhFNWRceEIxXHhFNUpceEQxXHhFNVRceEUwJVx4MEFceEQ1XHhGOVx4QTJceEI0XHgxQlx4OEJceENGXHgxRExceEY5WVx4OTZceEY1XHhEQVx4OTJceENCXHhCMC9EXHhDOFx4MThceEQ4XHgwQlx4OEJceDgzXHg3RlxceEY5ZFx4RTBUfXtceEQ1e1x4MTZceDEzblx4MTliXHhGOGYqfVx4RThceDlGXHg5Q1x4ODUkflx4Q0RceEExQCJceDkzXHgxRlFceEEzXHgwOF9LXHgxMFx4ODVceEJCYVx4QUJceDhGXHg5Mlx4RkJceDkxXHhBRVx4OURceDBGXHhCMFx4RDNceEE4XHhBMFx4QTA1S3xceEMxXHhBREtceEQ3NXVceDk3XHg4Mlx4MTA4WVx4QjBeXHgwMVx4RTBceDg3cDVceEJCclx4RThceDhFa1x4Q0JceDFFXHhDQ1x4RTNceDgzXHhGQVx4QUJceEZFZ1dceEZDXHhGM1x4OUJXXHhFRiBceEZDXHg5RVx4QjNceERDXHhDNVx4MTFgXHhBRkdceDA3XHg4OFx4RjlceDk4K0BceEFBXHg5MVdceDE5XHhGMFx4RThceEE0IWFnXHhENFx4OEJceERDXHhBOVx4MTlceDkybFx4Q0VAd1x4MTVKQ1x4RkZceDBFZUtceDFGXHgwOFx4MThceEQ0XHhBNFx4RkRceEI4XHhGMFx4REVceDAyXHhDMlx4OUFceEMzXHg5RGJceEYwXHgwM1x4REJmXHgxQnIuXHhDM1x4MDFceEMyXHhFMVlceEVBXHhGMlx4ODhceEFFX0t3eVlceEYwS11ceDhFXHhFOUJceDE3XHg5Rlx4RUJceEJFXHhEMj1ceEI2XHhEOVx4QzFoXHg5RVx4QTFceEY5XHhCQlx4QUNTXHgxM11ceEJBXHhDOS1ceERGXHhBMipceENEXHhCNlx4MTlARFx4RjRceDFDTlEmXHhCNzN6bSZVXHhDMVx4MTJceDEzXHgwMlx4OTNceDEzXHhFMzJceDA4dCYmXHhFOFx4RDNmXHhEOVx4OUZtXHg5Mlx4Q0JceEQxXHhCRkdceEI1Uy5ceEE1Ulx4QUQgXHhENVx4REZhXHhEQlx4RDdceDExb1x4OEI6eFx4ODBceEI5XHgxNFx4MTIvXHg5NVx4RjlceDhGQVx4ODFceEQ1XHg5RVx4MENceEJDXHhDM3xnXHgwRnxceEQxKlx4OENceEZBXHg5RVx4QzRceDBFXFx4OTRceEY4XHhDNFx4Q0JceEQ0XHg4Q05ceDA3XHhBQVx4ODBceEVGZytcJFx4OTdceEIyXHhCMlx4MDF2XHg5Q1x4RjVceDhGXHgwRk5ceDg0bVx4ODRceENCXHhBRFx4RTNpXHhENVx4MDE9XHhFMilceEU5bywqXHhGODdceENFXHhFMlx4RDlceDEyXHhGQlx4QzBdVTZceDgxXHgxMVx4QzV+XHhDOVx4MTZceDE1XHhEOTRTXHhGRDxceDFGXHhCMVx4MTdceDhGXHgwRFx4QUZceEM0XHgxQnZOLTVceEJCXHgxQlx4RDI8XHhDOFx4Qjd1YVx4OENceEQzXHg4OSglXHg5M1x4ODZceDk3XHhCQXpceEU4YER9XHhDRFx4RUJLXHhEOFx4RTBqXHg5MmpceEM4XFx4MTJceDgwUVx4QTJceDhFXHhCRkteXHg5Mlx4ODNceDk3XHhFNFx4QUFceDE2XHhGMlx4Q0FceEQzXHhFOFx4QURceEZEXHgxQTpceENCIWFceDkxXHhBNT0qXHg4Ml5ceENEXHgxNTlceEE1Zlx4MThceDFELypcXHg5M1x4ODhceDA2XHg4Nlx4RDNceDA3XHhDRVx4MDlceDFGXHhENCFceEY5NFdceDFDXHgwM1xpIlx4MEJceENBXHhCNnFKc1x4RDVceDg3Mlx4ODZceEIwXHg5NCVpUE9HSVx4RThoeGpqaj9hTWJceDk2XHgwMVx4MTJceEREXHhBOFx4QjZceEY1XHhFRVx4MDdceENDXHhGQlx4MDdceEVBMlx4OUNceEFGXHgxRlx4RkFceEYxOGJceDBEXHhCM1x4OEFUQlx4RjciXHhDQ1x4OTRceDg0XHhGNVx4QjVVXHg4QT9ceDk2XHhDQ1x4N0ZceEU5XHhGOVx4MTcpP1x4MTRiJlx4MUNceEVFNFx4N0ZceEY3XHhCMCNceEY2XWFceEY2Y1x4OThceDg2XHhENFx4RUU9XHhCMFx4Qzg9XHhEMVx4MTBceDAxNmhceDlFeVx4Q0RQXHhDNlx4RURzSis8XHhBQiFceEVDXHhFNlx4N0ZdeVx4QUQ/XHhFM1x4RDZceEIwXHhDNlx4RjZceDA4XHhDQVx4ODNceEQyc1x4QUFceEFEXHg5MVx4Q0FceEM3XHg5Q1x4QjRceEREXHhFRlx4RjB0XHhFMnB5MjZceDgxVX1ceDBBXHhCNFx4RjNceERFKlx4QjJbXHhDQ1x4RjVceEZBJFx4MUNceEMzXHgwMEZceDExJkQpXHgwOHd2J1x4MURceDE0TVx4RDNceEZDXHg5M1x4RjRceENGcVx4OTVceDFBXHhDM1xxXHhENU9ceEQ5XHhFMDBkdiUuPVx4OENceEFDXHhBMVx4QUVceDBCd0hceDA4XHgxNDZceDBFXHgwRlx4QjlqXHhCMyFceDlEMFx4QTRceEFGXHhFMlx4QTJceDE4WHpceEU5RzVGY1x4RUYmXHhCMS1bXHhDN1x4QzFceDA1XHhCQVx4RDdceEEzXHhCMS9ceEIxXHg4Qlx4MDhceEM5XHhDNjFceDA1XHgwNVx4OUVvNVx4MTdceEQyXHhGRmJceEM1XHg4Qlx4REFrXHhDNGZceDk2XHhDQllceDA2J1x4MEJceDkxMEZgXHhCNVx4RjJDXHgxRFx4OTJceEExXHhBNlx4RDFwU1x4Q0ZceEE4XHhCNlx4QzBceDlDUUpceEVCNlx4RDBceEIwXHg4Rk5ceDdGXHhFQlx4QUVceERCXHhCOVx4RjlceENFbFx4MTRGXHhENlx4OTc9XHgwNVx4QzZceEFGZnkmXHgwMlx4RkJceEUyXHgwMVx4OTNceEYyXHhENVx4QTNceEYzSFx4OENceENCXHhEM1x4OTRceDA5XHgwNWdceDAxXHg4Qlx4MTVIXHgxM1x4MTZceEQ2UmFceDhCNVx4OEQpPX1ceDFENFtceENGXHgwNDNceEQ4Y1x4QUYsXHhFM1x4QUJceEFEKlx4RUZceEVGcFx4MUJbfiJceDk1XHhBMXRceEMzY2hceDBEXHhBN1x4OTRceEU1clx4RDNceEREXHg4RFx4RENceDAzN1x4MTRceDBBXHg5OVx4RkJmXHgwNlx4RkZceEI0XHhGRlx4RThrXHgwMyRqXHhEQ0Y3OjNceDg1XHhCM1x4RTlceDFDXHhCNXU+XHg4MVx4ODFceDg1XHhBM25ceEQ0Ulx4RTFceENCXHhEN1x4RUVceEJFXHhGQnpceEZEcFx4QUVceEY2d1x4RkZPXHhDN1JceEU5W1x4RUJceERGfiRceEFFXHhFODQ9Mlx4RTVceEIyXHhFQ1x4MTRceEU1XHhBRlx4OTNceDA2XHgwOFx4QTEgXHgxOFx4OTBceDg1XHhFOFx4RjlceDA1XHgwQ1x4RTktXHhDN1x4RjNceDlCXHgxQ1x4RDVceEFCXHhEMTNceEEwXHg4MFx4REVceDA2XHhGNVx4MEVceEUzXHhCOFx4RjZEMXJceDE2XHhBQlx4RTlceEZEXHgxQVx4RDE2Ulx4RUVceDE5XHg4OVx4ODBceEI5eiNceDg1XHg5N1x4ODYoXHgwRiNceEU4YVx4OTVceEJFXHhGN1x4ODlceEIwXHhCMG1jKlx4MDVtLVx4RURceEUzXHg4RVx4RDJceDBEJytceEU0Pmtjclx4RjZceDgwJShceDlGKz5gfTlceEE2ZVx4QTQrfFx4Q0JceERGXHg4NlxceEI2XHg4MFx4ODldXHg4MnhceEYwXHhDQ1x4REVceEQ1XHhENEpHIlx4MDknXHhEM1VceDA2VVx4ODRceERFXHg4N1x4RDJDbjJceENBP2hceEU2QC1ceEEwXHhDOXl9XHhBN1l1XHgxQSxceDEwYlx4OEUkXHgxRTpceDE5NkBceDhGXHgwRlx4REZCXHgxNVx4ODhceDlFXHhENFx4RTFBPmdceDE4XHhFQVx4MEZceDk4XHgxQmhceEYxXHhENFxceEM5XHgxQlx4OTN9XHhGNlx4RjVceDBDKVx4RUJdXHhBNWdceDg1J1x4RDd1XHgwMVx4RjVceEM4NVx4MTlceDAwNlx4MTlceENCXHhERlx4ODRceEVGbHBceERDRVx4MTdceEVFOVx4RTFceDkxXHhGN1x4RjkoXHhCMXZceDhGXHg4QVx4ODdkXHhGMVx4QjdceEJCXHhFQVx4OUZceDkzXHg4Nlx4RjFceEU4XHhBRlx4QzNceEY4clx4RTY8XHg4NVx4QTZceEU0XHhGMFx4RTYhXHg5M09tXHhFOW9ceEQxQ1x4ODRaXHhDNVx4QzhceEZBOT8oXHhDNlx4QjlceDlGdVx4OTBceDlEb1x4OTVceDlFXHhENVx4RUJTXHhFQVx4RDhceEI3XHhCOFM/KVx4MDBYU1x4RjNceDFCJFx4RkFceEEyXHg4Nlx4QTV2elx4MEVXXHhCQiVceDk3V1x4OTdceDk4XHhDN1x4RjNceEEwNT9ceEI0a31ceDBDPlx4RjZceDk4PGNxMWZoNVx4RTVaXHg4OXsgLlx4QkZceDFCXHg5NFx4ODZceEI0XHgwOUdceEYxXHhCNFx4RTlceEI0dkpceDgzXHhCMlx4RkZceEZGT0lceDEwXHg4Mlx4QTZ7IjJceEU0QFx4RkVceENGXHhFNlx4OUZceENFLlx4Q0M5XHgxNClceEUxXHhBOEpxe1x4RjlnIVx4N0ZceEQ3XHhBMVx4ODNceEJFXHhGOVJceENEXHhEMVx4RkZhKFx4QTAlXHhCNlx4RjE9XHhGNmpceERDdFx4RTg2XHg5M3pceEQzXktceEYxOUVceEUwXHhFRFx4OUF4aFx4MThAOVx4RDhceEE5XHg4RVx4QzlceEU2XHhFN3xceEM1XHg4MVx4QUZceDhCMFx4MTdceEI0KVx4ODZceDBEXHgxRChceDhEXHg4Rk1ceDkxXHg4NnVPXHgwMlx4RkNceEJEXHhBNidceEUxXHgxOCRceDk4XHgxMnxceDA5YFx4RjZceDBBXHg5Mlx4RjNceDgyKT11XHhDNF9ceDlGXHhFQ1x4OEJceDlBfVZmO1VceEFDXHgxOFx4OEU/XHhBRFx4Q0FceEUwMFx4ODlceDhDOG5ceEY4XHgxNFx4RkMxXHhFNnhceDBCXHgwMVx4OTZRXHhGRlx4MUF8XHhERVx4MEZceDA0IWUsUlx4RjhceEIwNzdceEJGWVx4RTVceENEXHgwQVx4OTZceENDIVx4RDdxXHhBNFx4QzBceDA4W1x4RTVceENBR1x4QjJceDlGXHhDRU1kYEN7XHhDNSdceENEXHhFMlx4MTVceDk5Mlx4QjdWWFx4QjFceEUwKFx4QjdceEFFXHgxMWNAdiArYlx4RkFceDE5XHgxM1NceDkyXHhGMlx4Q0FceEEwIlx4MThceDBERmdceEIzXHg5Mlx4MEEkO21ceDkwXHgwRlx4RUNKXHgwNFx4QUFbXHhDMlx4MTU5XHgxRVx4MUFceEQyRVx4Q0ZceEMxOlx4N0ZceDEzXHgxNVx4QjBceDA2XHg5Rlx4ODk9XHg4OCxceEUzKFx4RkRceDExXHhBREE9JVx4OUFbXHg4OCVsXHhBMFtceDA4XHgwRlx4MURceEFFXHhDNVx4QUZceEM3XHhBQ25ceDFEXHhBRVlceEM2XHhDN1x4RDZceDgyXHhDOVx4QjlvXHhERlx4QkZceDBDRjA1XHhDQl5ceDk2XHg4Mlx4QzJceENFQygkXHg4NVx4MEVtXHhGMlx4OEElXHhDOVx4MERceEMyXHgxQVx4ODJceDFCcSNceEJDN1x4QTRceEQ1XHhBQ1x4RTBceEY1IFx4QjYgWC45KE5ceDBEXHgwQSk5XHhGMnVFXHg5NnVceENGXHhFNTAwXHg4MVx4MUNceDk3XHhEQVx4QzZ4XHgwRmAwZ1x4MTBceENFXHgwOFx4RjU4XHg4NVx4RTlceDg4XHhFN3hceENDXHgxRVx4QjdceDk5LVx4ODZsdFx4RThceEY4XHhDM3VceDExJVx4QTNceEY1XHhDNFx4MDdceDg5XVx4MUJANCVceDFBN1x4RThceEE4XHhBOFx4RDBceEVCXHhCQVx4RjdceEJEXHhGRVlvN1x4ODIsXHgxMG5ceDdGXHhDMVx4QzdceEQ1c1x4OTdceEFFZFFceDFCQVx4RjBceEU3UWtceEU2XHhFMFx4ODlceEM2b1x4QjBceEZBXHg5MVx4RURceDkzXHhCRlx4QUVceEZFTVx4MDJceEVCXHhDM1x4QThYXHhGNlx4OEYwYypceDg2XHhCQ1x4OTVceDBGXzJ1LFx4OUEgKlx4QjdceERDXHgxQlx4OTVwUFFceDFGXHhFMSVceEU5fGNGXHgxRFx4OEZceDExXHhGQlx4MURceDBCS1RceEFDM35YXHhDM1x4ODdAXHhGQ2VLQFx4MEZCdFx4RDVceEI2XHgwQVx4N0Z4XHgxQUBST1x4OUJceEY4XHg4QVx4OUZceDgzXHg4MjVceEVCK1x4REJceDg2eVx4MENceEFDKFx4OEZIXHhCRjZceDFFXHgwNlx4MTFceDBFQFx4QThceEZGXHhGRjRceEYwXHhEMlx4OThceENBOlx4OEJmNVx4RDdceDlBaTZbXHhGNlx4REF5XHg5MFx4QTdaXHgxRlx4RDFod0tCXHgwRFx4RENceEY5XHhERVx4MUQ1TVx4RERceDA1QTJceEVEXHhBMCpRaVx4OUVceEY2UVx4QUFceDg4XHg5RCFaXHhGM3FceDE0fVx4RkJceEEyXHhGOEdceDFFXk5ceEM5XHgxM1x4MEZRXHhCQVx4MDE4XHhFOVZceDE3W1x4OTVceEYyXHhEM1x4MDZceEM1XHhDRlx4QjRceEU4XHg5N1x4QzhceEI3XHhCNFx4Q0NFXHhFQlx4ODhceDBBXHgxRmtceEZBXHg4RVx4MEEzSDZceDg2JFx4RDZdZ1x4QzRceDBGXHgwOFx4RUJceEI1UDNceEY4XHhCRlx4QkFceEQyXHg5OVx4MDBwXHgwRlx4QjdVY1x4QTZceEQ4RkxceEZCXHhGOSJ6MFx4RTNceDAxe1x4MTdceEU4XHhBQ1x4RDN8XHgxNSdceDE4OkVsXHhBNCtxRVx4ODNudCBceEUzXHhFQ1x4MDEtXHhCNGZceDFGY0dSXHg5OFx4RjN4XHhFRVx4RjRceDhBXHhDND1ceEYyXHhCNnFceEMzSiNceEY4aFpceDgyXHhBNFx4QkRceEIyZzFceDg2MVx4Q0U6XHhGQ1x4QkNceDlEQnhceDBEOlx4QjJceEYyfFx4QTRceEFDXUlceEY2XHhGOVx4RUZceDkxXHhGMFx4QzNceERDPlx4RTBceERFXHhDN1x4QkE8QFx4MEFceDgxLFx4MTlceEQyQlx4Q0F9XHhBOVx4RDJceEFDXHg4OVx4RUZceEMyXHhGMVx4MTBceERBXHhBNlx4REJyXHhDQlx4MTZMIFpuXHhFRFx4MEQ6a1x4QjRceDA0XHhBMlx4MERceEM4d1x4MTZceEQ3XHgxRlx4RUJceEVDXHgxOFx4RkJceDA4XHhFRVx4RTBceDkzbVx4RDlceEQ3N1x4RjlcXHhDOVx4QjRceDlEXHg4OFx4MUVmV1x4MEZceEI2RXR3dlx4REI2XHg3Rlx4RDdceEQ3XHhGOVx4OEQ2fF5ceDkwP1x4OUJceDFBXHhERnA6XHhDNEdceDBGXHgxQlx4REJceDhDXHhFNlx4OENceEU1XHhBQSB4X1x4QUJiXHhBOFx4RDFOUFx4QzBceDE4XHhFRSVceDkwXHgxNFx4QTQgXHgxRVx4OTNceEMzSFx4MDZceEExXHgxREJceDFCXHg4Rlx4MTRCXHgxM2QwQ1x4RTJceDgzXHg5MVx4RkJceEQzXHhBRVx4QjBceDg1XHg5RVx4MDhMXHgwNVx4OTBceEE0XHhEMlx4MTdceDlGXHgxOFx4OURceEZBVVx4OUNceEI4LFx4MDhceDhFXHg5M1x4MTNceDkyXHgwMVx4OUJMeG9ceEU0bFx4RDNvZ2xhKF1ceDk2TkdceEVBXHg4QVx4QzNceEVDXHg4OWUwXHg4Q21ceDkwXHhDNVx4OTZceEU2XHgxRFx4OTJceEY3XHg4OFx4N0YqXHgwRnxoaFx4MTFceEM4MCQlMFx4QzAoJVx4RDM2Wlx4OUJ6LFx4QURrXHhBRFx4QTFyXHhGMFx4OUZceDg3JFx4REJceEFGXHhBRlx4RDNceDAyXHhEM1x4QTMtXHhFRlx4QzRceEFGXHgwMFx4QjhceDkzXHgwQlx4QTZHXHhFN1x4QUJceEIxXHgwRVx4QjA3XHhDOVx4QkFceEI3XHg4OVx4RTQiXHhGOV5ceDBCOHRceEM2d1x4MTBQVjNceEZDW1x4RkNceEIxWycnXHhBOVx4RUVceDBEXHhDQj5oXHg5RTBLVFRceEU0XHhGMFNceEM0XHgxMXI4LUNceEQyUFx4REFceEJGXHhBQlx4QzJceDEzXHhERVx4MDYkT2YwK1x4QURPXHg5M1x4RDdKXHgwN1x4QjhrJ0JceDg4XHgxM1x4QkZceEY2NVszXHhCNzRceEVGXHhCN1x4OUZceEE3XHhGQ1JQJCFceDdGPVx4QTZceEUxPkJceEE0XHhFOVx4MDdvV1x4QTVceDE2XHhBOFx4QTBceEEwV1x4QzRceEJFelx4RjdHXHhCNVx4OTZceDE4XHhCQVx4RTJceEQ3Rlx4RkZceDk3XHhGOFx4QjVceEM3XHhDMVx4OTVceDE4XHg4M2BceDBBXHhBOV5IemJceDBGXHhGMFx4RjBMXHgxN2dceEE2XHgwNS1ceEFEXHhFNlx4RjVaXHhBMDZceEJDXHhDRjpceDlFXHg4OUJceEY3XHhBMVx4QkZIXHg5NzJceEUzXHg5MVx4QTVaXHg4Qlx4RTR2XHgwNVx4OTFceEYwdFx4OTBceDA1N1x4ODdceDg4JVx4Q0RceDk3XHg3Rlx4QzhXXHhFM1ZceERDXHg4RnhceEJDXHhGNVx4OTYuXHhGQ1x4OTVceDA2XHhCQT9ceEQ2XHg4N1x4REFVfDJceEEyXHg5Mlx4ODBGXHhERVx4QzBceDkxXHhFMlx4RjBceENFXmBceEU4bitceEI2XHhDNVx4RUJceDgzXHhDQVx4QTlceDk2JVx4N0ZFXHhBMEhceENDXHg4RlxceEIwJjVceDhCc1x4RDFceEVCXHg5NVx4OEVwUFx4OUFceEY2aXNObGBceENETFx4QUNceDEzXHgwMFZceEUzXHgwNlx4RDFceEY4P31ceEQ1XHg4RFx4RkVceEY4XHhBOFx4MTR5X0ZceEU1Klx4RDBceEY0XHgxOTkmXHhBM1x4RDVceDk3W1x4OURMXHgxNVx4RjVceEMyXHhENVx4QkZkXHgxM1pdXHhENX5DSDdceEU2XHhEOVx4QTZceDEwXHhGMFx4MDIuXlx4RTJceDA4Q1x4RkR9KldceDFBXHhBMzdceEYzXHhDN1x4OTRceEVBJlx4QThlXHhBRllceDA2XHg4RWdceDkzWVx4MEJceDA5XHgwRlx4MTVceEI1XHhCQitceEZCXHgxRlx4OEVoXHg4N1x4QjRiXHhDMDN8QC82XHhFRlx4REJceEYyXHhBNkdceEFGe1x4QjRceDlFXHhFN341XHhDNSY1NFx4REFceEQ0XHhCOVx4OEVceDAzYVx4OTFceDE1NFx4QjNceEI0XHhERlZgTVx4QzA5XHhBMFx4RDl1XHhGNFx4QTdceEQ0eSA7XHhEOVx4ODc3XHhDNFx4QUJFXHgxQmNbflx4OEV6MylceDg5XHgwRj19XHhFMlx4QjJceERDOjBceDE1XHg5NFx4RjBceDA2XHg5QVx4MURfYVx4ODZab3VceEQ5flx4QjdceEY5XHg5Mic6XHhEQVx4RTVceEFBXHhGOFx4MTFjNVx4MEZceEQwL1BLXHg5OW5ENi5TXHgwQWloJGtceEYyXHg4OVx4QzZceDA0XHgwQ1tceEJDXHg4QVx4QjFceDk0XHg4MS1ceEVGXHgwMFx4Q0VceEIxXHhCQlx4RTJceEUzN1x4RUVMVU4rXHhGMnosXHgwQVx4QTBceEExbnhceDEwPS5Yd1x4REJceEMxXHhEQVx4OENceEM0XHhFMSsvXHg5MFx4Q0NLXHg5MFx4MEJceEY1XHhGNFx4OEFwXHhFOFx4RjVceDg3XHhDM1x4MENceEFCUHFCTF1ceDk0c1x4QzZceDE3XHhDOVx4RDkuT1x4RDdceEFGXHhGRlx4QkVceDhCXHhGNlx4QUQxXHhCMS1ceDgwXHhBMVMsXHg3Rlx4QjZceEIwXHhGNCpceEVCXHhFN35ceDFGNkpceDBDXHgxMyVceENDXHgwQylceEQyXHg5NDxyXHg4RVx4ODl3dVx4QzNceEIwdlx4ODlceEUzXHgwOU9ceEY5XHhDQVx4QTZceEZGViNEXHg5MFx4ODZceDFBXHhCMjNceDExXHg4Nl5SXHhDQzJEXHgxRVx4QkV5XHhBOVx4ODZWNkNceEU1W1x4RUZceEJBXHhGOVZceDlEM250XHhEQVx4RDBceEVDd1x4MUNceDE1XHhEQyZOP1x4RDZceDFFXHg4MVx4MURceEMzXHhEMm1ceEE4Rlx4QURPc3tceDE2RSFvXHhDQ1x4QTRceEMzXHhFMlx4QkRceEQ5aVx4ODRceEQwSFx4QzRXXHhDQTssXHhENVx4QTZceDlDXHhFQlx4QjFceEQxSlx4RTZceEZDXHhGNlx4MTlceDFFXHhBRC0tXHhDREdYXHgxQzUjXHhERFxceEVEXHgwNFx4RDBceDlGXHhERi1ceDBDXHg4N1x4RENceDBFXHhGMyBdXHhDNVx4OTFceDk2VVx4MERUXHhFNWBceDhEXHhFOVx4RUVtXHgxNDc3XHhGQjZ2bGRceEI2XHg5Q1x4OURceEQzXHg4Nlx4MEVceDAwXHgxN1x4OTZceDE1Ylx4RDZceEMyXHgxRFx4RkZceEJFXHhBMFx4MERceEQ4XHg5Nlx4OEVceEU0Vlx4OUIibmVceEMzPVx4OUJceDA4XHhFQ1x4ODBceEJDUlx4Q0ZaXHg4NX1ceEZESCF5XHhENjU0XHhBRFx4MDJeXHgwQ1x4MEZIIVx4OEVceDhEXHhEOVx4RjVEXHhBOFx4Q0UmVSNceEE5JVx4OUJceDBDXHhCNVx4RDI6XHg5Qlx4RTdceEE0XHhCMGBBXHhDOVx4QzdmQUpeTlx4QUNceEU4XHhBQz1ceEQxXHhDM1x4QzJceEY2cFx4ODUia1FceEQzXHgwQVx4OEVHXHgxQVx4OEJceEM4Zlx4RkFgISFwXHg3Rlx4ODFceDE3XHhCN1x4QjVBXHhBM1x4QURceEQzXHgwQVx4RjZnOlx4QjJoXHgxQnFceEU1XHgxMlx4MDZceEJEXHhEN1x4OTU4XHhFQVx4QTZNP1JceDBFXHhCMFx4OEY0XHhBNVMhXHhFOExEXHhCM1x4RjFXXHgxNVx4RDBceEJEKlx4MDBWJ1lceEU0XHgxMVx4Q0NceDgwXHhFN2FdXHhCOFx4RDRceEREXHhBQVx4MTFceEJFXHgwNHdeXHhEM1x4MDVxXHhFQ2dceDkyXHhDNV1ceDg3XHhEOFx4QTMzK1x4RTdceDFDXHg4OVx4ODhceENENFx4OUZceEFCXHg5Q1x4RkRdNlx4RTlceDEzXHgwOVx4QzNOXHgwOVx4ODFvXHhGRFx4RURceEE1XHhDQ0tiXHg5MVx4RkNceEVCXHgwN1x4QzhceDEyXHhEOFx4OUY+XHhDRVx4OTNUQCxceDgxdyZcXHgxMTgyMGNiWiJceEU0XHhBMFx4ODhceEI5XHhEMlx4QjBaIVx4ODBJXHhCRlx4QzBceEVFXHhFRSNceEQ3N3BxXHgwOFJceDhFbHdceDg4TFx4QTdceEQyXHhBQitceEI0XHhEMWpceEVGPUBceEVDXHhFQlx4MUFceDkyXHhCNVx4OEFceDkxXHhERFx4MDRceEJGbm9ceDk4Mlx4RDhceEI2XHhBOVx4OTZFXHg5Rlx4Q0VceDgzXHhFQlh7XHhDNFx4QTZmNlx4RTNceEE5XHg4MFx4RTEiXHg4M1x4RDlceEY2MyxceEIyXHhGOVx4QkFaXHhDMDUkXHhEQlx4OTJceDdGXHhGQlx4QkZceENEXHgwMFx4OTdceDg3TVx4RDNceEJGO1x4MURceDlBXHhBRFx4MUJceDkwLVx4Qjk6c29uXHhENlx4REY9XHhGRHNceEU3XHg4QjZaNlVceEI4cVx4RDZceEQ5RFx4QjZceDE4XHhBRmNceEUwNVx4MEVceDFDXHgwRVx4RTZceDAxXHhFOFx4RDVceDBDXHg5OVx4QUIlXHg4MFx4OTNceDk3XHhCMTxceEZDPlx4RjchXHhGM1x4RTBWMFx4MERceENCIFx4REInKlx4QThyXHhCRih4cDY5XHgxQ1x4N0ZceEVBXHgxRFx4MDJceDlGXHg4MVx4MERgUVx4QkVzXHhFRVx4RjU5XHgxOVx4MDBceEFEXHgwNHNceEFCM1x4QURDX1x4MEFceEY3a1x4QURceEIxXHhGQ1x4MEVceDlGOVx4RTk7XHhCQkAmXHhEN1x4REJceEYxXHhBOFx4RjJ+XHhCRDNceDFDXHgxMXdTXHgwM1JCP1x4MTBtXHhGQlx4QTVceEEzXHhDRVx4ODl3XHgxOFx4QTBceDFBez8sZlx4ODZceEU0XHgxQlx4QjRceEEyOlx4RTNceDBFXHhCRjdceDBGXHhGMmFKXHgxNHpceDBFXHhBOVx4ODZceEU4XHgxMTJceENBXHg4RCtceEUxR1x4RURbXHhBQVx4RjBceEMwN1x4MTJceDBDXHhERDBceEFGXHhEOVx4MDFceEU0XHhDQlx4N0ZVXHhFRlx4OThceEYyXHgxMyZYMVx4RTl8XHg5RVx4RUNceDBEXHgxNkQsXHgwOFx4MDdceEJFXHhBOFx4MDlEXHhCN1x4QjdceEE2XHhFQVx4MUFceEJEPiFceENEVlx4MURceDA3Qlx4RkE0XHhDRVx4MUJceDE1XHhGOFx4QTRceDExXHgwMS5ceDFCXHhFRiZceEM2Olx4MDNOKnJceDFCRDFceDhFJy1ceEE4XHhDNUlceEI1XHhBOVx4RjEhYlx4MTkjJlx4MUZceEU5Ilx4RDlceDAxXHhCMWVceEU4e1x4RDN4XHhDMlx4OTdceEFFXHhCNVx4RkJceEJBXHhBOFx4MTNceEU1RmFceEI5XHhEQlx4RjdceEE3eFx4MTNceEI3XHhENlx4RjZedFx4MTFceDA0XHhFOVhaRVx4MDVQXHg4OVx4OEJceDhEbyxhXHgwOFx4QTVpYkptMlx4RUY0XHgxNVx4MUZceDkxeVx4MThceDg3c1x4REUzXHgwQnVXXHhCMFx4MDZceDEzcm9ceEQxJVx4QjV1XHg5Nlx4RENmdC47XHhBRFx4QTFceDhFXHgxNVx4OUJMOVx4MUVceEI4XHg4NFx4RUZceDFCdlx4MDk/XHhGN1x4RENSXHhERVx4QTMvZEwoXHhEMlx4OTVceEFBXHgwQy1ceEJGXHg4Rlx4ODFKbFx4QkJceDA0aSQlXHgwOVx4Qjg1XHhGM1x4QjgnXHg5MFx4MURmV1x4MUNDXHhERlx4OTBceERDXHhCM1x4RjNAXHhBQlx4RUVMXHhFQ0lhTlx4QzJUXHhERFx4RDVceDhDXHhCOFx4QTdbaFx4MERmelx4QThceDg0Mlx4MDRKXHhGQVtceDFEXHhCQmFceEIzdVx4OUM1XHhFRFx4RDkhXHhFMlx4QjVceDFCXHg5OFx4RUFceEVBXHg4NFx4MDVZOmQ4XHgxMlx4MTBceDEyXHhFNFx4Qzd7XHhFM1tceEZDX1x4MEUtXlx4QjFKSlx4MURceEE0XHhDRFx4QzJceDA4XHg5NFx4RUFceEI1XVx4Qzh9anhceENEK1x4OURceEZCXHhGM1x4RDd6MVx4QUU/XHhENVx4RjRceDAyXHgwRDZ0QmRceEYyXHg4N1dcXHhCN2xceEE1eVx4RTRceEE2XHgwRHtkXHhFQVx4OEFceEFFXHg5MFx4Q0UqXHgxNzwyUlx4Q0MlXHhBOVx4QTVceEU4eCRBIVx4RkZceEJDOlx4RDRdNWtceDgzV0A5XHhBQjJyMVpceDBGXHg4QVx4RTZ6XHhCMEZceEUyXHg4Ql1ceDkyK2ZsXHhDNFx4QzNceEE5XHgxRlx4MUFceEExXHhGRVx4MDRceDFEXHhDMVx4ODEgblEnJVx4QTFceEUzTVx4OUJceEUzbTNceDkyOVVceDgwXHhCNC1ceDk4XHhGMFx4RENceEM0alx4QUVceEM2XHgxN1x4QTlceEU1cltceEI5XHhBM1x4QjlceDE2NmQiXHgwNVx4ODRceEI4XHhCOVx4MTMjXHhEM1A2XHhCRWhceDAzXHhERFx4RDU0akhceEMxX1x4QUFdXHg5M1x4QURfYFx4MUJ6fSslbiNceEE3XHhGOHtxXHhCMlx4RTdceDEzXHg4RFx4QUJceEVDXHhDQUlXSFx4QUVceDA4XHgwQVx4QUFceDhGSFx4RTc3JVx4RjddXHgwRl4sXHhBMTNsXHhCNlx4RDlceEVGXHhFQ1x4RDJceEEzb1x4QURceDlFXHhGRDVceEJCKVx4QTlceDBDfH5ceDkzXHgxMnReOEtceEVEW1x4QTNceEMwXHhCQ2tceEY4XHhCQ1x4MUZ8V1x4MDAgbFx4MTRVJVx4MTBceDA5XHhEMy9nXHhDNVx4MDgxXHhFOFx4QzNmb29ceEExZVx4OUEgXHhDN1x4MDBCQVZceDBCXHhEMlx4QUJceEIxPlx4QjZceEQ0XHg4NVx4RkZceDA5IHV7MG9ceEE1LFx4QjM1XHhBNn5ceDk4Qlx4OTRceEZFXHgwMVx4Q0VceEExNVNceDlDLFx4QkFoXHg4RFx4MEVceEEyXHg4NCNceEVCXHhBRllBXHhENihceERFXHhDRVx4RjlceDg2XHhBOFx4QTlceDk3XHgwMHkEjQLJHPSJ0cCNAskYXHhFMFx4RTk5XHg4Qlx4MUFceDBDZEwuXHgwQUZceEE0Wlx4OUFceDgxXHg4Rlx4OUVceDk5XHhERlx4QjFceEVDM1x4RTVceEVGWkFceERDXHhBMChbPFx4OThceEZEXHhBNVx4RDJtXHhCRlx4MTBAXHg4NVx4RUVhXHg4Mlx4MDhceEJEb1x4QjNceEZBXHhGMlx4MEVceERCXHg5NVx4OUVceEE2Llx4RUVrXHhCQlx4QzdceDk2VSVceEUxXHg5RFx4ODNceEFEc3BceEY3Ilx4RjQ3XHhGNWtceEZFXHg4Qlx4RURceEZDflx4RjdceDAzZFx4RDhceENCXHhBRVx4RjkgXHg4Q1x4ODBceEE5XHgxNlx4OTkhalx4RTBceEY1XHgxM1x4OTZDXHhDQyJNXHhGNSYnXltdXHg5N1x4RDg1Zlx4RDdceEQ4XHgwRVxOXHg5NVx4MDVnN1x4RkFceEUzKlx4QkJceEYxe01ceDA4XHhFOFx4QUFceEIwXHgwQXtceDA1IFx4QkVceDg0XHhDRlx4QkZcXHgxQ1x4OUJKXHhFQlx4RERceEEyXHgxMlx4Q0JceDA4XHhERFx4OTQ5XHhGMlx4OUNceEVGR0Z7fFx4QkFceEEwXHgxRUZceDA3XHhGRWtceDFCXHhBOFx4QkE0XHgxOXpceEU0XHgwRlx4Q0ZceEExXHg5QVx4OThceEQ0bFx4ODRceDlGXHhBRVdceEE4d1x4RkJceEVEOFx4QTA+XHgwNFx4QUVceEJBT2ZceDA4XHhCRVx4RDlceEQ4XHhGMmZDXHgxRVx4RDJceENGXHhEMFx4MTRpXHg5Nlx4QjBMYFx4MERceEIyeFx4ODk5TFx4QTFZK1x4Rjc7eFx4QUN1XHhEOTI3QklceEIxXHhGMjpceDdGXHg4Qj1ceDA3XHhCM1p3VVx4MTNceDk2XHgwRlx4MURIXHhEM00kXHhENFx4ODFwXHhCMFx4REZVbVx4ODJceENBXHhGOVx4QTFceDAzXHhDNlx4OTJceDEzXHg4NVx4QkI3P1x4MTh5XHhBRVx4QURceEQ4XHhEN0RceEE4XHhFNFx4MUFceDFCLEJceDg2S3tceEM5U1x4MTNceENEXHgxQzM8XHhEMDlceDlEXHhDMVx4MDJceEU3XHg4OVx4MDVceEFCK1x4RDFcdVx4RjZceENBK3MpXHgxNVx4QzhceDBFLlx4RjRceDk3XHhDM1x4MDNceDk3clx4Q0NceEM4XHhGQ1x4QzBceEEzXHgxOVx4QjFceDgwXHg5NUhceDkyXHhBNVx4QzNceENGI1x4OEZceEQ2NVx4RjYzXHhCNlx4Q0I0XHg5NVx4RjlceDE3VVx4MDZceEYyXHhFMlx4OTFceEE3RzlceEZEXHhBQ1x4QTZceEU1c1x4QTUrXHhEQ1x4MEJceENDXHhDNEBceEVEJXhceDlBXHgxOVx4RTVceDAxQVx4ODdceDEzXHgxMFx4MDBceEFCXHg4MVx4QjRceDkwXHhCM1x4REFwPFpceDBENFx4QURceEQ3XHgxQVx4RUVceEU1XHhFNVx4QjRceDdGZVx4QkEyQlx4Q0VceDlEXHhFRmFNeyQ8I1x4QTZceEIzXHhBMlx4QjZceEUyXHhBOFx4MUFceENEXHg3RlMwXHg5OEpcXVx4QkNRXHg5OVx4MDdceDEzXHhDOXtceEQwXHhFQ1x4QTNceEE0XHgxRFx4ODJceEYxXHg4MiRceEU2XHgwMVx4OEEyXHgwMGVceEExXHhEMlx4MTJceERBXHhEMlFceEMxblx4RkQvXHhEQ1x4RkQ9bmknXHhGQ1x4QjRad3lceDA4XHhBNGg2c1x4QjhceDhFXHhCQVx4QkM2RFx4Q0JceENCWjRCXHhGOVx4RTBaI1x4ODEpXHhCM2RceDkwW1x4MTZiXHg4QVJceDA5XHg4OWJbZSFsXHhBQVE6XHg5MSlceEU0XHgxRFx4OTlTXHhGNUBceDlBSlx4RDdceDA2T1x4QjhOWVx4RjJceEIzI1x4OTJceEQ2XHgxMVx4QTlceDEySVx4Q0ZceEZFdlx4RDNceEFFXHhCRlx4QzRceDFCXHhENFx4RjBceDA1XHhCOFx4MTVwXHhDQlx4QjNceEZFOHVJXHhCNkNoXHhBQyhceEU4IFx4QkRceENGXHhERVx4RjZceEI2XHgwRUw+JFx4QzNceDFGWVx4MTh0XHg4OFx4RTNceEVBXHhDMihceEM3WFx4RDMyUlx4RjBPXHhFQWFnUFx4OTZceEQ5XHg4MVx4RTcqO1x4MTVpSFx4RDNceDE2eFx4OENceEJDXHhEN1x4ODFceDg5XHg4Q2NceEM2On1IXHhGNTJceDExXHgwMlx4QUJceEUxXHgxQ2lceDhBXHg4RjpceERCXHhFMG1ceDhDW1x4MThceEE3ZXdceDk0XHhFMlx4RjJceDkzXHhCQzhceEM3XHhCRFx4RkZceDA1XHgxOVx4OTdDXHhBOT06UFx4QjRceEVGXHhCMCtceDA0XHhGNlx4MTRAXHhFOVx4QjVceEMwXHhERVx4Rjh4TFx4Q0MnXHhDOFx4RDRceEJDXHgwN1x4RDNceEM5Ylx4RTcrXHhFNkdceEUxXHhGNF9ceDlFXHhCRjkkXHg4MzxzXHgwMkhceDFDKlx4RkJ5eGRNXHhDNlx4OTlNXHhFNFx4QkUgXHhFMCZceEQ2XHgwOCctXHhDRFx4RjBmXHhBNCBceDE4XHhEQlx4Q0FceDg2XHg4OE1ceEMxXHgxNztceDgxXHgxMVx4MEVceENEXHhENFx4QThceEU5XHhBMlNTXHg5N1x4ODBceDkxXHhBRFpDXHhFNVx4MTFXXHg5QVlRXHhFMlx4QzVceEJBXHgxQjxceEZDXHhEMktceENFXHhBMVx4RjNceEJBXHhFOVx4MTNHXHgxQlx4QUVnXHhGMlx4OERceDAzXHhENFx4ODBceEFBXHhDNVx4QTUhXHhEMVx4RkJceEU4XHhBOFx4QzdceDE5PT9ZLVx4MEZceDg1XHhEQlx4OURwXHhERk9GXHg4RFx4OTJVaHxceDA2XHg4MFx4QzhceDAxXHhCQVx4RThceDk3cVx4RkNceEI2Ylx4QjlceEJGXHhDRFx4QzRoXHhENlx4RkR9XHhFRFx4OUNceDFCXHhGOXBISlx4RTVZXVx4QjNceENDXHg5OFx4QUNJUUc/XHg4Q1x4QkJGeSdceEU5WSEuXHgxMFx4RjZyOHBceEM5XHg4MitEXHg3RlJWXHhBRFx4RDFceEExQVx4QTJceENCXHhDOVx4MDNceEMwXHgxMVx4ODNceEJDMlx4QzZceDAxNzBceEVBXHhFM1x4QTVceEE0XHhEMFx4MDh5bVx4QzRVcVx4QjNceEY3XHhDOFx4RjJceEE4XHgxRDBceDE1YFx4QzZceDgzXHg5NFx4QTJJXHhGMFx4MUVceDAxK1x4RTBceEQyXHg5NCguIzNceEU5XHgwRlx4MERceEU0XHgxNmk8Qlx4MTBceDk5XHhBMVx4MDhceEVBLVx4RjFceEFFVVx4QzVceDkzXHhCRFx4OUJiIVx4REE3XHhDNXlUXHhFQVx4QzBTXHhEQXBceDA2XHhDQ1x4OEJceEY2XHhDMzdceEVCXHg5Q1dceEE4XHgwQTdceDkwPVx4MDlceDAxXHhDMD9ceDlGZVx4QTlceDE0Xl9GXHg4NGBceDkxbFx4ODM/XHhBRFx4RUVceEQzXHhFM1pceDlFXHhBQ1x4OEN2XHhCNmBceEVBXHg4OVx4QTNNXHhGM1x4MThlXHg4MVx4RUNQXHgwQlx4MTdceEYwO1pceEZEIXFceDk1XHhDQXRqXHhDQ1VceEZCJ1x4RUFceDk0Ilx4QTBceDEzXHgxOTlceDAxXHg4N1x4RjZceDg1MFx4RUJceDAwXHg5QVRceEJGXHhDRW5DXHhERFx4MEFceEIwOVx4QjdceDhDXHgwNlx4RDkpclx4RDd3XHhDOH1AUVx4RUJceDg0Qlx4MUFceEIwdUVceDFDT0pceDgzXHhDN3JceEY0WSJceDBGXHhFNjovXHhERkZceENBV1x4OTIlXHgwOFx4QjNceDBGOlx4RjU/X1x4QkReR2VceEE3flx4MTVceENGXHgwMVx4MTJsXHhDNlx4QUQuUVx4MTVkXHhBRCktXHhBRUhCXHgxOEU+XHhFOVx4Q0FkXHg4Mlx4REZceEI3XHhEMVNceEQxQVx4OERceEE0XHg4RW4oXHhFN1x4RTBceENGXHhCN1x4MDRGd1x4MEVceEM3XHgxNllceDFFXHhERF1ceEQwXHg4QVx4RjRiXHhCOFx4QjNceDkxXHhDQ1x4REJceEU3KFx4RTBceEI1JGhceDlBdHBceEI4XHhBRVx4OTRhXHhCNlx4MUJceEEwXHhDQjBceEZGLFhceEU0XHhFOFNceEIyfVx4QjVceENCXHgxOVx4RDJKXHhEQ1x4RUNceDBDXHhGMlx4ODNceDhEXHg4NFx4ODRceEVCXHhBMVx4RDM/XHg5NFZceDFEXHhBN2JceDE3Tl1ceDAyXHg5MFx4OTRceEEwQFx4QTVceDA5XHhCQlx4QTlceEI5Jlx4OEJpXHhENTJ5RFx4ODB5YCNceDBGXHhGQWk+OS5ceEJBb1x4Q0JceENDXHhFQU9ceENDWEtceEI2XHhCN3NceEIwLlx4QThceEQxbFpuXHhDNVx4RDNceEU0XHgxNFx4QUVceERGLlx4MTlceDg2XHhEN3dceDBEXHhGRFx4QzNceEUxdzVceEU4XHgxN1x4OTRceEM5dlx4REFceEY0XHhFQmJceEU4fkRceDhGKVx4QkRUUyFceEQ5XHhCNVx4QjVlXHhDNFx4MENceDg5XHgxOHNceEY0XHgxM1x4QjJLXHhGRUdzXHhFRFx4OUMhV3tceENEXHhDN1x4OUFceEJFXHg4MFx4RDV0XHhGMF5ceDkzXHgwRjdceEIyLlx4RTFcXHhFRFx4RENuXHhCMFx4QzlceEM1RVx4OERceEUyXHgxNFx4MTNceEFDJ1x4RkJceEQ5XHhFOTNceDkxXHhCQVx4MDEyXHhFRn1ceEUwXHhENlx4RjBceDk2K1x4MEFhXHgwMitceDgxXHgwNlx4QjlceDhDXHhGN1x4QzJceERDXHhBMlx4ODBceEUxXHhCN1x4MEZKXHhCQlx4OTFceERCIVJceEYyXHhGRVx4RUJceDE2XHhBQVx4MUZceENBXHg4RVx4RjJMXHhGMlx4OTBceEVDN1x4RERceEEyXHhBRFx4RkFceEM5VVx4MUZceEFCXHg4MFx4MERceEI1XHhCMlx4RTFceEQ2XHhCNHRKXHg4RFx4QTJbNlx4RjhceDA1XHg5Qlx4ODhceEY2MyFceDdGXHhGMVx4MDUiWCVceEYzXHg5MkRceDgxXHg5Qlx4QTVceEM1MndceEM4XHgxQX5ceEZDXHhGRVx4Q0ZceDk5XE5QXHg5Qlx4QkNceENBXHhFRlx4MEJceEJCXHhDNDtceEVDeVx4MDFGKlx4QTlceERFbVx4QjBAK2tceDFCXHhGOVx4QUI6YyVceDk2XHg4OVx4QTFnXHgxMVx4RDZHXHhBMnJceEJCXHhDMFx4QzJceEUwfn1ceEI2XFx4OUNaXHhERXFceEM5Vlx4RTNceEI2XHg5MTdPXHhCRVx4QkRBcVx4RTRceEExXHgxQz4lXHhCMlx4OEFceEFEXHhGMlx4RkRceEFCXHhENVx4RjFceEY3XHgwMFx4RjAscG9ceDE3XHhENlx4MEFceENCXHhCQX07XHhBOFx4MURceDk1XHhFMn4lXHhFRlx4QTBceDE2XHgwRWNceDA0XHhFRnYnIm1TXHhERS5ceEZGXHg5RVx4RjJceDdGXHgxMFx4Q0RES1x4RkNceEUzXHhEN1x4QkJceDlBXHgxRHlceEZDXHg4NVx4MEFceEYzMjk7XHhERlx4RThceDg0XHhCQ1x4REFceDE4XHg4Q1x4RUZceERDXHhFRilceEZCXHhEOTtceEJEXHhFRDFMXHhBMVx4REQ4e1x4REVceDlENCdceEI0XHhFRFA+XHgxMVx4REJceDlCSFx4MDRceEUxXHhDM1x4OTNaMVx4QUJceEREXHhCQVx4ODZceEVGXHhGRFx4QUJWXHhBNlx4OTAoXHgwQ1x4QjhceDExVVx4RkUxNlx4QzBceDFGXHg4QVx4MUFDOVx4MEJceDFFNWtceDE4cDRceEY1XHgxM1x4QTRceEQ0XHg4MmRkXHg4Rl5qV1x4RkY5KVx4RkFceDFBNlx4RUFceEY4XHg4Q1x4RjVMXHhGQWpUYlx4RDdJXHg4NFx4QUNceEIyX1x4RUFceEM1XHg4NFx3XHhFM1x4RkZ9Tlx4MDBceEMwXHhCQ1x4MTBceEM1X1x4MERPXHhBMy49SVx4OTFceERBNl1ceEJCXHhDMFx4MDN7XHhBM1x4QjdceEI2XHgxM3o4XHhGRlx4QUZceEY0XHhDN1x4Q0NceEUxblx4QTRdXHhBMWFceEM4XHg5Rlx4RTZ+XHhDMzFceEY3XHhDNFx4ODhceERGPVx4MDhceEEwXHhDQ0FceEIwdzlKal5ceEI5XHhCQXJceDA3XHg4OVx4QzlceERCXHhGMVx4MDRceEUwOlx4OURceENBXHhBRFx4RDgwVGFceDA4XHg5Mlx4ODZceDBDXHhENVx4RUNrXHhFRFx4RTVceDA0XHg5RFx4QjhceDE3XHhGNEhceEVBXHgwRVx4QjNiKlx4RjZceDg5XHhBMyVLXHhENDlceEU5XHhGNFx4MUFceEIwXHhFQ3otJ1x4OUJceERBTVx4QTE5XHgxOFx4QTFceEYyX2FceDhGYlx4RDhceEU1W0RceDFEMVx4RjdceDgxXHhBRDM8XHhDOVx4RjRceEZFXHg4NVx4RThceDgxXHg5N3NceEI4XHhFQmBGXHhCOVx4MDJceENDXHgwRlx4OEFceDkwXHhFQVRiXHhERCMwXHg4QS9ceENFfVx4RTVceDE3XHhCNSxceENBXHhCQ1c8XHg4Nlx4MENceEExdFx4RDdceEI0cT0kXHhDQlx4QjdceDA1RXVceEQxXHhFNHVceDlBXHhCOVx4QkJceEM1XHhERlx4QjdTXHhGMVx4RTdceEI3XHg5RFx4ODRCNEB2XHgwMVx4MUZceDAwXHhEMFx4REZceERBSDM7XHhENFx4RDdceEFCXHg4OFx4QjVceEI3XHhFOXEgW0AjLFx4MDl0XHgwNlx4RTVceEU2XHhFM1x4MURceDhDYlBceEQyaS8jXHgwQ1x4MDFmYVx4OUFceEZDXHhDQjVceDFBXHgwRVx4QTZZXHgwOS9ceDkyXHhGQVx4RTQ2bFx4ODhAXHhDRVx4QTlFXHhGNFdZJ3pHXHgwNVx4QkJceDBEXHg4Mlx4MEFceEZCWFx4MUZceEFEYVx4Q0RceEQwXHg5M1x4MDFceENEXHhGRFx4QjhceEJBfVx4RkNwXHhEMFx4QzRceEE2XHhBOFx4RUZceDA3IFx4RUZceEI0XHhGNVx4OTdceEI0XHhEMmlceEE3Nlx4ODlceDg3XHhGRVx4ODRtXHgxQWh6UG5ceERCXHhCMFx4RDlAXHhENFx4RThceDk3XHhBOFx4OEJceDhCXHhDN1x4QTdceERBJVx4QUVceEM1XHgxMWA7XHhEQVx4QThzIFxceDgwXHg5RFx4QjZceENEXHhGOUotXVFceDkzXHhFMFx4RjEyXHgxMlxjXFx4RDZceDg1XHhCQVx4MUFnXHhFQ29ceDBFZVx4MERceENGXHhCRWdceDk3XHhCMlx4OEYrXHgwRFx4ODNceEZEYlx4MTJSOFx4OERceEI2SWVLXHgwQ1EjXHg5MVx4QzM4XHg4RVx4MUJceEUyXHhGQ2ZceDgzXHgwNlx4RUJceDA0XHhFQVx4QjNceDg2XHg4Q0VceDkxMyNceDhEQVx4QzhceERDV1x4MTJ0XHgxQXJceEQ3M1x4MEVlXHhGMFx4QjBceENDQ1x4ODJ5YHRceENEXHg4NCxceEMwXHg5MHxMXHgwN1x4MDFceEEyXHg4OVx4QzhceEQ3fjNceDAyXHgxRlx4OTNceEJFXHhCOVx4ODBceEFDXHhGNi91XHhDNHVceEVDW3dceEE4XHhDMlx4MTMlXHhGRm9ceEQ5WVx4QUJceDA1XHhCQVx4RUREUHVceEY3XHgxRFx4RkNceEM3O1x4QTVceDAyXHgwNlx4QzV6UFx4MDVceEE4XHg5Rlx4OTcrXHg4QmFceEY1XHgxNlx4MENceEIxXHhDRVx4RkNceDg2XHhBQnNceDEyXHgwMzVceDlEXHg4M1x4RkJceEJFXHg5NVx4RUNceEY1XHgwM1x4RkNceEQ4aVx4QTUsZ1x4QTdceDk1XHhGNVx4OERceENGP2BSXHhBRFx4MDM4Ilx4OTQmXHg5Qlx4MTgpLFxceEUwXHgxNFx4REZkXHhDRlx4QkNceEJDXHg5QVx4MEJceEVBJlx4QjVceENBXHg5RVx4RTZceDg2XHhEMF9ceEI1KkstOFx4OTdceDgwXHhCMlx4MERceDhCOXRlXHg5Mlx4RDlceDEyYUJyXHg4Mlx4RjhceEFFXHg5N3pceDFEXHhFN1x4MUFceDdGXHhDM1x4MDFceDE2XHhERC5gQFx4RTdceEQxXHhBQlx4QjE5Olx4MURceENBUktqXHhGNFx4ODdceEM2XHhEMTNceEFCXHg5MVx4QTJYXHhCM21ceDhFXHg5NVx4RDBceEFEXHg5NCVceEVFX1x4MUIxXHhFQig0XHhCRiFceENFXHhCNVx4RUZceDAyXHg4RWJceEVETFx4QzRceEM0XHhFRlx4OEZOXHhBQWVceDEwXHhBQlx4Q0FaKXZgRVx4QkJceDlGXHgxRVx4MUJ6XHhDQ1x4RTdceEYyXHg4OSReXHhGMFx4MTdceDhBXHhEOVx4QkRceEZBXHhFNkxceDE3XHhGQ1x4RUJceEYzOXFceDkwXHgxOFx4OTRceEJBXHg4QVx4QzNxcVVrXHg4Q1x4OEJceEI1a1x4RTUzUlx4MURceDg0XHhGOVx4RkUuOHJHbVx4QjNceEIzXHhGN1x4OUFceDdGXHg5Qlx4MDhceEUySFx4QzJceDk1UFx4MUNceEMxdFx4QUFceEEySklceEFBXHhFM1x4MDU2XHhCMFtjXHgxNVx4RjZceEY4Vk9ceDFFXHgwN1x4RTd6bmFceEI2XHhDNlx4RDZceEY0XHgxOWxceDhBXmFceDBBeFtceDkzKzlceDg1XHg4OVx4MTlceDAzXHhCM1x4RTZceEI1XHhGMVx4MDBceDhEXHg4RHVceDkzXHhDMXRceEQxXHhGRVx4Q0RuXHg4RnpceEE3S1x4QkY1XHg4OFx4RDhceEUzXHhBOHtceEUxXHhCNjltXHhFMVx4MEVwZS9ceEQ1SFx4QzNceDlBQ1x4OTRceERFJEBceEZDUU49XHgxQlx4RUFpXHg5RFx4RUV2XHgwM1x4QjlceDE1XHhDOENKXHhBNlx4MDRceENFXHhGQlx4MDBceDk3LVx4MDNceDA1XHhFNlx4MERceERBXHhBN1x4Q0YlRDJceDk3XHhBNGhceEIydVx4RDJaYFx4RUFceENEXlx4RTV0XHhDMVx4QURceEU3XHhDNFx4Q0JceEFCXHhFNlx4ODlceEZGXHhDNFx4MUNceEFBXHg4MFx4RUI4XHg5N1dceEUxK1V7XHhGRlx4OTJrXHg5NVx4OEFceEY4XHhBQWVkXHg4My5ycDBceEM2U1x4MEVceDlCXHgxOS5ceEI0XHg4RFx4MDZceEE0XHhCN20xXHg5QVx4QzV8KVx4MEY3XHgwOVx4MDhGXHhGOVx4RTFceEZGXHhCRlx4MDlceEM3XHhEOFx4RjhWXHhDNklceERDXHhERkx8YlBceDExXHhCNWRceEY1XHhEM1x4MDhYXHhDNVx4RjZceDEyXHhDOFx4MDFceEIzXHgxOFx4QzkqXHhDMjZceDg2V1x4MDdceDBBNlx4MDZceDE1MFx4RDlceEI2XHhCQ1x4QjhceDlDXHhGQl9ceEI3XHgxRi1ceEJEfVx4RTBubVx4RjVceEMxXHgxQlx4OTd+c1NceEEyIFx4MTJceDk4PFx4OEVceENBYWdceDdGTFx4ODBhK1x4QkFceEQ2XHhEOVx4Q0RceEU2dENlXHg5Mlx4QkVceDA1XHgxOVx4RTVceEVGIFx4QUZ4XHhFNlx4OTlceDkyekN0XHhFMmlIXHhEQ1x4RTFceEU2XHhDRFx4RENceDAyTDgzXHgwMFx4RDVceEMwOlx4ODhceEQ2PVx4MDdceEFCXHg4RVx4RDdceEVENFx4QTlceDEzXHhCQVx4RTZceEFGXHhCMFx4QUNceEI5XHhGQ1x4OTdWJVx4QjhceDk3XHhCMVx4QzNceEJEXHhCN1x4RkZceDFBczlceEU3I1x4RUFceDE2XHhDMztceEM5dlx4QTYsXHg4MVx4Q0VceDhBeVx4QThceDFEXHhDNnpceDkzXHhBM3tceEJEb1MiXHhDNFx4Q0JceDA2XHg5QyssSi1neVx4RTdsPVx4MTU3XHhGNVx4QzdceDg2OCMrXHg5RFx4RTBceDk2XHhCRihceDg1Tj0tXHg4M1x4MTVceEIxSVx4MTNceDA0XHgwNlx4RDJZXHgxNFx4RjhceDA5XFx4QjBceDhBXHhDMSJceDA5XHhDQ1x4RjhceDg4XHg4OFx4RTJVXHhENFhceEQ4M1x4RjVceDk5XHhFMlx4RTBceDFEXHhFMlx4MEE5K1x4OThceEMxMV9ceEUxbjVceERFZVx4RENceEQzXHhBMlx4RkFceDE0XHhDRFx4Q0JceDg3XHgwN1x4ODZRXHg5NkZceDBCXHg5MiVceDA5PHNceEVGXHhBMi9ceDFEXHhCMTlceEI4XHhDM1x4QzJceEQ3XHhCM1x4REZceDA3VVx4ODFceEUxXHhENVx4MENceEZGXHgxMVx4QjBceDA3OUd1QFx4MTdceEMxXHhBNlx4QjMxbSYhXHgwRVx4OEYoXHg4QiZGXHgwMzM2XHg4Q3FceEY5Nlx4RDNceDA0Ny5ceEVEa1x4RDNORFx4QkYxXHhENFx4OTN4XHgwN1x4MDdRTFx4ODNceDA2XHgwNVx4QThceDlDVlx4Q0ZceEZEXHhGN1x4MTBceEVDXHhGRS8yKFFceEFBXHg4Q1B6YFx4MDhceDg0TTdceEE1WmlceEQwXHhGM2FceDgxXHg5N1x4RjJSXHhBNlx4OTNceDBGa1x4OThceDhCXHhCNlx4QzFdRFx4QTlceEE4XHhCQ1x4OEZceDFEMTAoXHhBNE9ceDkwXHhBNnZceENGV1x4RkJSXHgwN0hceDgyXHhGQXF4WVx4RUFceEQ2XHhFMFx4Q0NceDAxXHhBQz1ceEU4XHg4M1x4QkRceEZDXHhBMkNceDdGXHhGRFx4QThceDBBR1x4QzFceDgzMFx4MDJceEVEXHgxQmNYXHhBQjlceDhCXHhGNFx4QkYgRllceDgxXHg4QVBXXHg5NVx4QUVceEEzJ3xceEI3XHg5RlNceEE5XHhFMFx4OEFiXHhGMFx4MEFceEY5cHtceEU1XHg5Ni9WXHgwQVx4OURceDkyXHhDRVx4RDlMXHhEMihceDBCblx4QzdhXHg5MFx4QkMnZDI/aVx4OUFceEQ2XHhBNlx4QkZceDgzKUdceEY2XHhFRVx4QjR1J1x4QUVceDE0Slx4ODhLXHhCQ1x4MDc5XHhBRFx4ODdNXHgwNFx4OUNqXHhCRFx4OThUXHg4RFx4MUE/Slx4MTNceEYwXHg4QVx4RjJceDAyXHhDNXZceEM0XHgwNlx4MEMjUFx4Q0FceEI0XHhDMFx4ODRceEM0XHg4M1x4RjZceEEzXHhBOVx4OTRceEIzXHhBMHpceEM4XHhCRSBceEQ2XHhFM3pceEIyJFx4RjRceDk4e21ceDAyeTNceEZDXHhFQkNceDlFcz5ceDA3WzBceDA2XHhEMWdceDE0XHhGNmhsXHhFN1x4QkJceENDXHgxQy4lZ1x4MURceDFBOVx4ODBYc1x4RjdceDEwXHgwRlx4REVceEJEb2lceEFEXHgwRFx4QjlceEE1XHgwNFFZXHgwOFx4RENbXHhCN1x4REU3SmJGS1x4QUZceEE2Q1x4MEFKRnZceEQ0Vlx4QzlmXHg5NWBceEM3Ilx4RTZceEU0XHhCMD9ceDg2XHhGN1x4MEJrXHgwOVx4RTJMXHhBRFx4RDZceEEyXHg4NFx4RDhceEY3V3dceDBBXHg4RVx4RDNceEYxXHgwQ1x4ODJceEIwdFx4OUIwXHg5QVx4QjFrXHhFMkhnXHhBQ1x4QzFceEMyXHg5OFx4RkFceDE4XHhBMVx4QTNceENGXHg5Nlx4QUFceEQzXHhBOVx4OEVceDA4XHgxRVx4ODdDXHhEMFx4OTNceDg3JGRceDEwb2BYW004XHhGN1x4ODBpXHgwNSZceDAyXHg5RHlIXHgxMVx4RjMqXHhDNFx4RkRceDA5XHg4NFx4MUNWJUlceEM1XHg5OVx4MEVceDk0YyNceDkyXHhGQlx4ODBceENGXHhEQVx4RDVceEFDRVx4OEVlXHhDM1x4ODZNXHgxMlx4ODk/XHhGNlx4QTkoXHhCNFx4QjFceEREXHgwRlx4REVceEVGXHhDNlx4MEV7XHhBRWFceEM1QlR8Ulx4MDhceDgzdzxceEI5TzdceDAwXHg4N1x4QTNceEJBT1dceDgyXHgxMlx4RDBceEExXHhCRVx4QjN9e1x4MDNjPFx4MTNceDg1TidceEE2aFx4ODFUXHg5Q1x4RTIyXHhGNVBdXHg5OFx4QTlceEQ4XHhDM1x4QkZceENGaFx4OTdceEMyXHhFOSZceEEzXHhCNG5ceDEwJlx4Q0R9O1x4OThceEQxXHhFMFx4RjUiTFx4RDhceEU4dlx4RUZYXHg3Rlx4Q0ZceEU2XHhBODpceEI2YV1ceERBSFx4RkZceEU0XHhEQWdceEEyXHhGN1x4OUJUNVx4MUZ1XHhGOFx4OTVceDA1XHhCRCtDXHgwOVx4REMuXHhFOCJceDkwXHg4RURceEM4XHhEQVx4RENUXHgxOFx4RThceEY1cVx4MDlceDE3XHg5Qlx4RDEnQFx4RENceEQxXHgxNVx4QjdceDlBXHhGODcpb3FceDhEXHhDMHcuXHg5RVx4OEVceEFEXHgxOVx4ODdceDFGWEJmflx4MDFceEEzXHg5Rlx4MEJceEQxXHhBQkdceEE3O1lceDlDXHhCMFx4RTRceDhFS1x4MDJceEY0XHgwMlx4QjZceEFDXHgwRSNMMDJceDkxXHhGRSd1Rz1ceEY5a1x4ODdceEE5IVx4QTUvZ2JceDlCXHg4QVx4REZceDEyP1x4OUNceEI3XHgwM1xceENCP3dceDkxXHgwMFx4REJceEZEJ1x4MUFceEQ2XHhCM1x4RTFzPlx4OTJceEI4XHhFRipceEFCXHhDM248XHgxQiVceEE3XHhCQVx4QjMhXHg5RVx4RDlceDAxXHgwQVx4QkZceEEzU1x4ODRQbDRceEFBXHhFOUdlRExceEEwXHg4NzdceDE1XHgwMiRceEExXHgwRVJceEIzXHhFMlx4RjNceDgzXHg5Qlx4RjVceEMxXHgwN1x4ODVNe1x4Rjd3Q3MrXHgxOVx4QzVzNVx4OEZceDA0SVx4RTlFJVx4MTRQXHg4NSpceEM3XHg4NVx4QUFceDE3OFx4RTlPXHhEOWlzXHhDNH5ceEJCXW4iXHgxQzRceEI5XHhBQ1x4RjRLXHgwMVx4ODFYelx4MUVceDBFbHFtXHhFOFx4RThceEQ2ZjhDXHhEQ1x4RURceENCXHhBRFx4REIqXHhBOVx4RTJceDA2XHhGNFx4Q0NceEQ0XHhDOE9ceENDXHhFQjhceDg0XHhCMVlceEU5VFx4OERceDgyXHg4Nlx4MUVceEM1XHhEMlx4ODQ3XHhCQ2VceDhGXHhFNFx4MDNceEQ2XHgwRlx4Q0Y9d1x4QzFceDg3XHhEN3VceEQ5XHhDQ1x4OUVceDlDXHhFRVx4RjcyXHhBMCtceDhEXHhDRFx4MURceDhDXHg5NVx4RTN8fS1ceDA4XHhGM1x4ODFjPlx4RTRBXHg4QUpceEEyXHgxQVx4MEFQXHhBRlx4RDk1XHgxNlx4OERceEY4RVx4MEF3XHg5MFx4RTQnXHhFQVx4MDM8XHhCQ1x4RUVceDFCI1x4OUFceEM3XHg5Q1x4Q0RceEE0XHgwOSlceDk2XHhERFx4QjNceDBFXHgxMVx4MDlceDg2XHhFN1x4REFceDk0XHgwOVx4RTBceDk5XHhGRVx4OTlceDhCP1x4REVceEZBLFx4RjZceDAxXHhDNjZceDhEbFx4QkVeXHhDM30rXHhGNFx4RENceDkwXHg5Q0lceEQxTFx4RDJBXHg5QSBceEEwXHhBMFx4OTFHXHhCOU9ceDk2ND9ceENDXHg4Rlx4QThceEI2flx4RUZEOFx4MTlceDk2P2ZceDBDZVx4QjNyXHhGN1x4QkVceDlFXHhCRFx4MEVceEFDXHg4NVx4QTUsWHBceEY5OEpceDFDXHgxMlx4ODVceEM5XHhDM1x4MDMtXHgwRUBceDlCPDZceEMyXHg4OFx4QTdceDgyKlx4RUYkSDVJclx4QjBceDkzXHhBRVx4MDFceERDXHhCQ3NceDA3XHhDRTtceEIwXHhDMVx4ODhceERDXHgwOFx4MDI3eFx4RDBceEI0XHhFRT5ceDk0Klx4QjlceEVGXHhGM1x4QUZKXHhERlx4QzhceEY0XHhGOXxceDE4XHhDRFx4OTNceDEyXHhCNFx4RTkqXFx4QjgrXHhFQ1x4QzdceEIxXHg5MztceDEzXHhDNVVceDdGXHg4NEBcdlx4MDNceEZGXHhDNydceDFCYjlOXHhBNVx4ODEgXHg4M2I7VywtXHhBRVx4QjRGXHgwMlx4MDFceEVDXHhGNl5ceEU5V2hGdmdceDExXHhDOFx4QjhceEZFXHg5Nj9ceDkyXHgwNFx4OTdceERBTDZxXHhENlx4RkZceEJBPFx4RTB8LkNceDBFXHg4Q3d4XHhFNFx4QjJceEU0eFx4QjZceEQ2XHhBRFx4QjdceEZCalx4RThceDlBXHhCOFx4QTlceDkyPVx4MDcgXHhDNlx4ODNceDhGXHhFNlx4RUQ8UVx4RUNzXHhCMl5ceEZEQy5ceDgzXHgxQVx4QjNceEYyXHhBNzNqMVx4RjNceDgyTDlceDg1Sj4qXHhFQmlceEU5XHhBRlx4OThPXHg4MVx4RTBTLyFceEM2XHhERlx4OTJceDhFXHhBOFx4QjZceDFFXHhCNFx4RDRTXHgxMiNceEE4Slx4MTNceEU2XHhEOFRceEVDdlx4QTJNXHhENlx4MEZceEIzXHhDQlx4ODlceEQ5WENZXHhEQ1x4QjlKXHg5Qlx4QTJceEQwIj5ceENGXHgxRXYuXHhFRFx4RDhceEZDUlx4QjRmXHhERFxceDA3XHg3RmdceEQ5XHgwM1x4ODZceENCWVx4MThZIVx4RTItLVx4MERceEZFXHgwN1x4QURjXHgwMVx4QUYgXHhFNFx4Rjd9XFx4QjRceDFBXHhEQlx4QTRFOFx4QUN0XHhGQSpceEZGe1x4RTN4XHhEN1x4QkNoJlx4RTlceEFGXHhCM1x4QjZceDAxXHgwRFx4RTduXHg5RCVceEVDXHgwRFx4MEVceEVGNWlceDEzRVx4Qzl0XHhGQWhceEE3RVx4Q0ZceDdGXHg4RVx4MTNceEIzWzdceEU2JEN1T1xceEI1R1x4OTNwXHgwRlx4QzdceENBXHgwQlx4RTJceEY1XHhFMVx4QUJceEIwXHgwRVx4RDlceDk1XHgwRFx4OUJceEU3XHgwOSFceEE2Slx4QTRceEQzXHg5OVx4QzVceEMzXHhEMFx4QjNsXHg4Q1x4RTg6XHgwMVx4ODdceEIyJFx4QjZceDlEIUZIXHgxOVx4QTBceDAwXHg4MVx4Qjc7XHg5NVx4OTVRY1x4QkRceEIxK1RceDkzXHhDRFx4OENceERCXHgwM0JceDFEZFx4QTJOXHhENFx4MDRkXHgxMFx4RjV3XHgwRFx4MDhceDE3XHhFNF9dXHgwNFx4Q0FceEE0XHgxNVx4QUFceDgxXHhGN1x4RDFLXHhCNFx4RjJceEU3XHhEM1x4RTlceDkzXHgxQW8tXHhCRVx4OTJceEZEcVhMcFx4RjhceEEzXHhCMFdceDAyXHhBQ1x4QUZceEIzXHhENlx4QUVceEYyXHhEQ1x4MTdceEJGXHhBOFNdJWZceEIybFx4OUFceEQyXHhDNVx4QzdceENBXHhFQVx4ODVceEU2XHg5NVx4OEZceDhEXHhCQ0NxXHhDNVx4ODdzXHg5MFx4MDVceEMwXHhGRFx4RkNceEVEY1x4MUUleVx4RDRceEZGfVx4Q0YlXHhDN11ceEE3XHhBRFx4OTFceEY5XHgwQWRceDFENVx4QURceFx4QTFSMlx4OTdrXHgwOUVceEExXHhDNlx4OUZceDkxXHgxRFx4QURDXHhFRFx4RTJceEM0XHhCOE1ceDkzPlx4OEEnXHg5M2JceDkxMFx4RUNMXHhBNFx4Q0VceDFBPFpUXHg4RFx4ODBceEI0XHg4OF4nXHgwOEJ4XHg5OVx4QzZceEVFXHhCQlx4QjdceENBXHhGQ1x4QjFceDExXHhENFx4RDl5T1x4RTFceEYyX1x4MTZceDFGXHg5NFx4QjJeXHg5MFx4MTM9YkhceEYxS1x4Qjk0XHhDMS9ceEI2XHhBQjVceDFEN1x4QTlceDk4XHhEMFx4MDMoXHhBNHlceEVEXHhGMk1ceDlBXHg4Qlx4RDNiXHg4OFx4Q0FceDgyZVx4OUJ5XHgwOVx4MUVceEZBXVx4REZceDlCXHhGQlx4QzNceDBEXHgxRFx4MTRceDA3SEhNVVx4MDVceEFDXHgxNFx4RURqXHhDRFx4MEVceEQ1XHg4M1x4QjBRZlx4QTlceEVCXHhDRFx4ODFFbThceEI1Mlx4ODdeXHhGNiI4cFBceDgzXHhCMFx4ODdceEREXHhCNVx4QUNceDgyXHgwNSc1Llx4RDJceEQwXHhDQ1x4MUZceEJEXHgwNlx4MTE6XHgwOVx4QUFceENDXHgxOFx4QTlceDlFXHhDQzF4XHhCNyZceEU3XHgxREh7XHhGNlx4ODRceDhDXHhFNlx4OUZtXHhEQVx4ODVceEIyXHg5NVx4RENyKHtYXHgwQlx4OTFceEY1XHhFQVx4Q0RceEQzXHhFM1x4QkNceEFCXHhDRFx4RTR3XHg4RVx4REZceEUwTGs6XHhDOXNHXHhEQWNceEJBSGdceEU0XHhCQ1x4RkNceDEwXHhGNVx4RDdceEExXHg5Qlx4RkRceEI4OVx4OTNSRWRceDkxXHhDQ1x4MEJceDAzXHhCNVx4RUJZXHhGRVx4RkQ8XHhDQ1x4QTZceDBDXHhBNzpceEY0aVx4QkNceEJEXHhBMlx4QTBceDlGXHg4QVx4REJCLFx4MDhceDlCXHhGNlx4QUJceDEyXHhEQXE0XHgwMFx4RTdceEY1XHhGOCFceEUwXHg4RVx4MDRceDlCLlx4OTlceEZGXHhEOXtceEM2XHhDOXNwIVx4OTMiXHhGN1x4MTRhXHhBNnxaXHhFMzZceDA1Ylx4MTVceDgyXHg4RnNceEEyXHhBQVx4QUZceEM0Wlx4MDhMXVx4QjVceEZFXFx4MDRceEVGXHg5RVx4RDlCXHgxMW9OUFx4RDEhU1x4ODhceEI2XHgxRlx4QTBceERDXHhEQlx4RTg0XHhGQ1x4RTlEXHhEOVx4RjZceDBDLlx4QzFKXHgxNFx4RTNceEJBXHhCMFx4QzRceERDXHgxOFx4MDRceEY5XFx4MDdQXHg4M1x4RkZMeiRceENCXHhDNVx4OTJceEU4XHgxMHo9XHhCMlx4MTVceDg3eVx4RkI1XHhCMlx4OEFceEVFXHg5MVsyXHgxMytceEMyXHgwN1NceDg3XHhCNFx4MTBceEQzQVx4ODNLXHhFRVx4MEJyR1x4MEZceDg2XHg5NFx4OURFLlx4RUFXXHg5RFx4QzhceEM3XHgxMFx4MTlceEYzXHg5NzxaOjNceEI1XHhDN1dHZVx4RUY+REJceDFEXHhERVx4MTUsXHgxOX5fXHhEMFx4Q0Q0Xlx4Qzh7XHhDQlx4QzBtXHhFRFx4RTdceDkwXHgwNkxceDkwXHhDQlx4QjclXHhCN1x4RjVeXVx4QzdyXHgxRnxceENCXHhCMVx4QTZDXHhBM1x4RTNceDhDXHhEQ1x4OUMpJVx4QjRvXHgwRFx4ODJceEM4dztceDA0UXpceDE2XHhCRlx4REZNXHhGNVxzXHg5QzNceDgzXHgxOWAoRlx4QkVceEFFXHgxRFx4MEZceEU0b1x4RENceDBBeVx4OTBNalx4OEFceDBDXHgxNj9ceDAxXHhEMFBceERFXHg4QVQuM1x4REU2Y0RceEM4XHhBRVx4QkFceENELlx4RDNceDBEXHgwMVx4QkVceEE1XHg4Rlx4OUJceDhGYVx4Q0NceEEwXHgxOVx4QkZceDk4XHg5NFx4QURceDg1XHhGNFx4OENhXHhGNEdceEQ5XHgxQ1x4RERceDhEXHgwRFx4QTBceEU1XHhFMFx4QUMsXHhGN1lceEZEJ1x4MERceDg3XHhDQ1x4RDBtU1x4RDhceERFXHhCM1x4QjJceDEwXHhENlx4MEU0XHgxNVx4QzI3XHhCMFx4MURceDAxXHgwQWRvfFx4RjJceEYwXHhFQ1x4QzRceEJGXHgwQ1x4MUQ+XHhDNFx4RjdceDExXHhBQVx4RTVceEVFXHg4NUdceDg3XHhFNlJceEIzXHg5MFx4OEYwXHhBRVx4OEFceDgxXHhFQTYjXHhFNVx4RER7N0VceDlBXHhGOGo7XHhFOVx4MDhBXHhGNVx4QjJceDlFPX1oQ1x4Q0FceEQ3bFx4QjBceEU0XHhFRFx4QURNXHhDQmdceEM0XHhCNVx4N0ZceEJBXHhCQVx4ODBPXHhENVx4RjI7elx4OUNceDk4XHhFRFx4RTlceEM2XHg4RFx4QzJceDFDJFx4OUVceEM5XHg4RVtceEYxXHhFQWpceEUzP2hceEVBXHhFNk1PXHhCRXxceEE0XHhCMlx4RTJyMFx4RjYsWVx4Qjg4PihceDFCQFx4OUJceDA0XHgwMVFceDA0Xlx4RkJceEIzXHhBQ1x4MTBceEZEXHhFRFx4MUJceEE1XHhDMyZsXHhERFx4QkZceEZEXHg4QVx4MUNceDk5XHgwNlx4Q0JceEEzPlx4OUFceDhFNVx4MERceEQ1XHhEMFx4QzhceDk1WSQvXHhDQ1x4MTRceENGXHhDMlx4QUZvXHg5N1x4OUFceDk4M1x4RkJceEVFXHg5NFx4OTBceEM4XHgxOFx4OUM8XHhCRlx4RENceDhDXHhBN0VceDA3XHhGRFJceEIzXHhFNFx4Q0ZceEUxblx4MDhBRlx4RDU/XHhDRFx4QTRceEU4SFx4OTNceEMxXHgwOFx4MDVoXVx4MDZceENCJlx4RENceDgxUFx4MTZXXHhDMD04XHgxRkVceEE0UFx4RUZceEI2XHhERFx4Qzc4XHhCM2hceEQwXHhFNVx4Q0ZbXHgwRlx4RjBceEYzXHhFNlx4QUFceDlEXHhBRXRceDA4XHgxRVNceEQ4N1x4ODdceEI2XHhGRlx4RTVceEIzXHgxM2FceDhGXHgwQ1x4RkZceENBXHhBQlx4MEQwXHg5Qlx4QkVceEIxXHhCMlVRM1x4QzROQElPVDBceEIxXHhDNVx4RTdLdjMtaVx4MURceDA2eVx4OEFceEM2ZVx4QjFceDg5XHg5Qlx4OThceEZEXHhEMCpceDlDKSxceEQyX1x4RUVceEQwXHhBMlx4Q0VceEQ0XHhDRDNceDE5XHhEMS1IXHgxRVx4QzlceDFCfntceEUwOSwiXHhENX1ceEVDQVx4OUVceDk3XHg5Nlx4Q0RceEU0XHg5MmlceDEydV5ceEE5XHhBRlx4QkVceERFXHhCQWRKLlx4ODZSXHhEQj1ceDhDXHhCOWlceEZEVVx4OTBceDhFI1x4QzBceERCXHgxMG9ceERGXHhERVx4QzlceDEyZ2NPXHg5Nlx4QTdmXHg5RFx4ODNOXHg5MX1ceEYyXHg5Q0hNOFx4MTFceEFCXHgxQlx4QUFceEQ5TWBceEQwXHgwQVx4OTNzXHhDQ1x4MTRvXHg3Rlx4OUNceDkwPFx4MUIjXHhBN1x4QkRceENBXHg4NmwkLVx4RDZaTlx4ODMialx4RUUxK1ZmXHgwNFx4OENvXHgwNFx4MDZceEI3XHhFNmQ0dXxgXHgwQWFceEY3SFx4RDJceERFXHg4NVx4REFceEI3MHRPXHhCNFx4Q0ZceDA5NFx4QTBceEU0XHhFQ1x4OEZCJ1x4Q0FceEZFXHhCQlx4QzEsXHhCRlx4REJceEEyXHgxNTFceEFEZlx4QUJceEVCXHgxRVx4OTl8XHgxMVx4MDVMXHgwMi5CXHg4N1x4RjRceEVDMiZceEMyd1x4QTF7XHhBQlx4MTV2XHhGQV9ceEY1XHhFMVx4QThceDFEXHhDNlx4REZIXHgxQWwkXHg4NixceDAzXHhBNFx4RjNceDAxXHhBQlx4OTRceEYxQ0lceEE3XHgwN1x4N0ZceDFFRU5ceEQzXHgwM1x4Q0FceDhGXHgxRVx4RThceEZEXHhGNFx4QTZTXHhEM1x4RERfXHgxOHc0XHhFMFx4Q0ZceEE3QVx4Q0ZceERFOFx4QjFceEE1XHg4NlRceEY3XHhEMURceDhDXHg4OFx4QjlceEREXHg4NGFceEFDYVx4RkZceEVEXHg5OFx4RTBtXHgwOFx4RDl6XHg4M0RceEQ5WFx4MEFceEI2XHhCM0FHXHg5Nlx4RENceDhFQFx4MUVceEVBXHhFNz55XHgwOFx4MTRRS20mXHhCRDAuTXpceEMyXHhBQlx4MUVceEQ4XHhFMlx4Q0NceEVBXHg5Rlx4QjRTRFJYPFx4RTZceEI5fVx4RkRceENEX1x4OTlceDFGRipceEJDbVx4OTVceDg0KXlceEE5Ylx4QjE9ZDNDYVx4QjhceEU1PDt4X0kwXHhFQVx4RDBTXHhDNiJceEYzXHhERlx4OEZceEU0XHg4OFx4MThceEQ5XHhEOFx4QUNceEUyXHhEQ1x4REJuXHgwRVx4QjllXHhDN0pceEI1JDVceDBFXUhceEFEXHg4Mlx4QjZfSlx4RTVceEZGI0xceDA4XHhBMVx4QTNveFx4ODNceEE2L1x4OTNceDhFXHg5N1x4QzFceDEwXHg4Rlx4RUJlNFx4RDlceEREJXJceDhDQUdceEEyXHhERVFceEU1RFx4RUNceEREXHhCM05ceENFXHhCRFx4QzRceDhEYlx4OTBpMlx4MUJceEEzXHg4RFx4RDRceEYxcFx4ODZceEREUFx4QzcoXHg5Nlx4RkZceEVBXHhBQU5OQFx4MEVceDExXHhEMFx4Rjd6XHgwRkRceDA2XHhBMVx4RTJceDEwXHhFNWNceDE4XHhFM249XHhGMFc4WFx4OTdceDk1XHhCNFx4QTVceEI0XHhENS5ceEZGW1x4QzFceDlEWWp1XHg5MFx4QzhkaFx4Q0J+KkogSnxceDlBXHhGQlx4ODZceDg1XHhGRG9SXHhDQlx4OTNceEYzJU1ceDhCUlx4QTBceDlDXHg4M1x4OUVfXHg5Nlx4QTkqXHhCOFdOXHg4OXJceDE0dFx4RUJceEVDdFx4QzZceDEwXHhBNlx4QTFgZlx4RjR+K1x4QTdVUlx4ODdceDdGXHgwMlx4MURceEY3Vlx4RDNceERCXHhCQlx4QTlceDk4eUNsXHhEN1x4RTdceDEyXHhBRXRceEY5RVx4QzM2LVx4QzVceENFXHhBN1x4QzZceEIxXHhGMVx4RTVceDgzXHg5MVx4REIsXHhDOVx4MTEqXHhFRiVceDAyXl5ceEMyRFx4QTNceDE5OFBceEFFXHhBNUJceEM0S2pceDgxXHhCMlx4MTVceEY3XHg4M29ceEVGXHg5OSFUMU9AXHhERFx4ODdceDkwXHhFNlYhXHg5QWFceDg0XHg4Mlx4ODgne1x4QzFXXHhEN0gtXHg5MFx4RjVzXHhDNVx4ODlfIVx4ODFceDA4XHhDNFx4RTIoNFx4RTlceEY2XHhGQlx4OUNceDdGXHg5NVx4ODNceDg3XHhDN1x4RUF1Wlx4MDRceDg2XHg4Q1x4MDNceDgxXHhBOVx4QUItXVx4OTZceEZBXHg5OFx4Q0J4XHhFNlx4RENuLVx4MTBceDkyMFx4MEZceDhDXHg4QTUgXHgwN1x4MDRceDhDXHg5MFx4QzNMXHg4Nlx4ODZUXHg4N19ceDEyXHg5Mlx4MUR8b1x4RThceENEXHhGRlx4OTcoXHhBMFx4REZceDhGM3w4bmYlTlttXHg4MVx4MDFFXHgxRVx4ODlceDk2Nl9ceDg1VVx4ODNJclx4RUJceDk1bVx4QkNLXHg5OVRVXHhCM0NceEM2diZsXHhFMFx4RUNceDg3MFx4MTNFMlx4MENceDA4XHhCQlZ0XHhFM1x4RkRceDEwTz9ceDE0XHhDN2NceEI4a1x4RDFceDA5XHg4NnI8XHhFOVpceEVGXHhBQlx4RjZceEM0XHhBMVx4ODdceDhEXVx4ODZceEJFXHg5Qlx4MDRceDdGXHgwRlx4QzJceDg5XHgwNlx4MDZceDlFXHg5QlZceEMxeFx4RkJceDlFXHhCNWhceEMxXHgwMFx4Q0FceDA2XHhFQ1x4MUJbXHgwRlx4RjNceERGMlx4RTE1Plx4OTJceEREXHg5Qlx4OTVceEM5XHhDNnxceEMxXHhDQlx4RUNHXHhGQ1x4RTY3Mlx4RDBceDE3XHhBQVx4OUVceEVDXHhBRlx4ODF0XHg4Mlx4RDhMTFx4REQvXHhBM1x4OTZceEI5XHhCMXEsXHg4NFx4OThceENBXHgwOVx4RjZtXHg4OEVnc0hceEY1XHgwRVx4QjBceEI5XHhDM1x4RDFceDk3KFx4MThceEFCXHhGRlZceEYzXHhBN1x4RUJceENCJ0FsKFx4OEVceDhEXHgwOD1ceEQxXHhFQ29ceDE2VFx4RUNceDkxXHgxNV81XHhDNVx4RjEuXHhDQlx4ODApXHhEQ1x4QkVceDlGbFx4REF9XHg5OVdceEVCZ1x4MUNceDhBXHg4NCxceEI1MFx4ODdxb1x4MEVceEU4XHg4NFx4Q0VOXHgwMCVKXHhBMlFceDEyXFx4OTlceEVGXHgxNFx4OEJceERFXHhBMVx4MTdceDk3XHhDOFx4RjlceEQyPVJceDAxelx4QzhceEQ5Q1x4MUNceDkxOnFZRWZceEU0XHhGRFRceDkyXHhGQXZjXHhGMVx4ODNceEYwUlx4OTNceEM2XHgwMFx4ODNceEEyTlx4OENceDA4XHhFRTYpXHgwN1x4MTNkRCE8XHhGMVx4RERVXHgxM1x4QTZceDgxXHhDRnhceDEwXHhGQVx4MURceDhCNVx4RjEuXHg4NCBXXHgxQlx4RUZceEE0Mlx4RjJceDAwe1x4MDNceDE4XHhEQ1x4Rjk+XHgxRlx4MDZceEUyelx4QkJceEQyXHg5M1x4MTQ0XHg4Mlx4MUNceDE1XHg4NilceDA0XHhGOD0+XHhCMVx4OEJceEFDXHhCRGNceDk4bVx4REZceEY4XHgwRFx4RTlceEQ3XHhDQ1x4Q0FceEJBYGxceEZDcmBceEU0XHgwRWdceEQwXHhBNHhceEVDb1x4REJceDgyXHg4NGRceEMyXHhGRXBceDlCXHg5QVx4QTNceDAxXHgxNzRceEMzb1x4QzhceEVBXHhDQiVlXHhFRUFceEMxQlx4RkJPQFx4RjZWS1x4MDFkXHhBQlx4QzBceENBK1RceDkxXHhDMyBceDBFXHg4MVhceEU1Wlx4MEFceDg1XHgxQVx4QzhceEI4flx4MDZceEQyXHhFN1x4MDQ+XHhCREUlflx4MDI0XHhFNVx4RjVceDEwXHhFMFx4QzJceEREXHhEQlx4ODVwZVR8OFx4QkJoXHhENkhcXHhGMFpceDAyXHg4NVx4QjNceEU1XHhCOVx4RTBceEY0XHhEOSdkY1x4QjhCclx4OEVaXHhBRVdSSlx4QzFceDg1XHgwMVx4MEZwXHhDMlx4MThceDk3TFx4QkZGXHhDNSVceEZDXHhEN1o7XHhGNlx4QzZceEY3elx4OThceEJDXHhCQTdceDBGVD5ceDBGXHg4QVx4OTJceDA1XHgxOSRceEU0XHhGOFx4OUVTXHhBOFx4RTVceEJFXHg5QVx4RDZceEExXHhCM1x4RDRceEYzXHgwMl1ceDE0N1x4OUJceEIxXHg4MEIgRmVceDk4XHhCOFx4RDBceEZEXHgwN1x4MDJceDE5XHhFNVFzbn1pXHgxN1x4RjZceEU3MzlceDhBTkFceDBEXHhFQlx4MTFceEJDXHg5QylzVVx4RUFceDk5XHhFRVx4ODBiXHhCOElceEFET01ceEYzXHg4M1x4RDE6XHg4MyVceEEwXHgwMlx4QzNrXHhENSFceEZFXHhFNk98XHg4OFx4RTRceEFBNz9ceDhDTFx4QjJceDhDXHg5QVx4MTJceEUwXHg5Q1o3U3lceDAzIGlbT25lXHhGMVx4ODRiXHg5NUpceEFFXHgxMVx4QzhYXHgwQiQmXHhBM1x4OEVceDg5XHhFMlx4MDJceEUyNG43ZFlEKiZceDk1XHhBMy9ceDA2XHhBQlx4QTFYXHg5MG5ceDgxXHhFRlx4MDlceEU0XHhERCVceDFDXHhDMlx4RENceEQ2XHhCRlx4QTAueVxceEVCXHhDMFx4RjBceDg4XHg5MVx4RjJceEJBXHg5QVx4RTRceEZGXHhFMFx4RTdceDg3JFx4ODFJXHhFQlx4QUZ9bEczXHhENWdKXHgxM1x4RkVceEI4XHgxNlx4QkZceEZEP3lceEM2XHhCMTBceEZBKWJceDA1XHhDOFx4QTJ+XHhCM1x4MDRceEU5XHgxQUdTMVx4RDZceEVFXHgxM3hceDEzXHg4OVx4QjNFXHhCQVx4OTNiXHg4Nlx4RkVceEFCXHhCQUtceEY3XHhGQVx4QThceEJGYFx4QUNOXHhDQ1x4RDFceEJCXHhENlB1XHhCQlx4MTQ2XHhCM0ZceEUwXHg4N1x4Q0ZYczxceDk5XHgwNFx4Q0FceEI5XHhEMFx4RjFceEFBXHg5RlNceDlEXHhGRVx4QUN1NFx4QzZYXHhENClceERDXHhFNlx4MDlceEM1Y1x4QjVceDFGXHgwRFx4RTFceDlCXHhCQlx4RjJceEU2XHhERlx4QTFFXHhCNm4rbTtceDA5XHhFQ1x4MTFceEE0XHhEOGVtTlx4QUE0XHgwRlx4QzUiXHhGME5ceEQ2XHhCMFx4RjlUXHhGQVx4MTVceEQwXHhDOVx4MDY6XHhDOVx4RDBceENCXHgwNFx4QUJceEVDXHhGQzJceEZDXHgxNVx4OEZ3ei5qXHg5Rlx4RDVIXHhEQ1x4RDBoXHg4MWtceEFFd1x4OTFceEZEXHhEQVx4QzdceENDXHhEOFx4RkR+XHhFQU5ceDA0UVx4QUFdXHhERU9ceEY4XHhBNyFceDAyQ1x4MUZceEIzTTFceDFBdFJceEMyXHhFMFx4RDRceDlFXHhDQ003XHhBMVx4OUFSXHhBOCJceEZDXHg5RVx4QkZceDAwXHhENH1ceEU2XHhDN1x4QjdceEVBXHhDRVx4Q0Nmd1x4QTNnI1x4RUJceEQzXHhCNkV2XHhGMFx4Q0ItZFx4QjYgXHhDN1x4OURSXHg4OFx4QkVceEQyVVx4MDFceEE0XHhEQ1x4RDhceERBcVx4MURceEYzXHhBRlJ0XHgwM1x4QTJceENDU1x4RUE9Llx4ODVceDg4LVx4RDBceEVFKksvXHhGMFx4OTl6NFx4QkZceEFCXHg3Rlx4MDlgMFx4MTIhdlx4RDdceDA0XHhEOVx4QzhceEVEXHhCME9dXHg5Mlx4QjU9XHg4OVx4MThIXHhFOVx4ODNiXHhFRV1qXHg5NTN1XHhGM1x4OEZceDBDXHhFMXhceDhEXHg4Q1x4QUJceEM5IidceDEyXHhFOVx4QTVceEY3Nlx4RjNceEE5XHg5MVx4MTVceDgwcXM/I1x4QTVceDE3XHgwMFx4QUVceEFFXHhFNUZzXHg4NVx4MUFceEJEZVx4MUN6QVx4MUU6XHhGOVx4OThDVVx4MTM3XHg5RFx4RDVnXHgwN1x4QzBCW1x4RjBceEZGLVx4OUFpXHgxRVY1XHg4OTpceEEwXHg4Mz5ceEQ2XHhCOFx4QTFceDBCXHhCQlx4QzRhXHhEN1x4QjU6Ulx4QzFceEJFXHhCN3B1XHhBOFx4Q0J+XHg4N0xAXHg4RilceEZEXHhGN1x4QkFvXHhEM3VceDAyXHhGRHBEXHhEQylceDBGKFx4QzZiXHg4RFx4OTI2ZkY4XHgwQlx4QzNceENEXHhDMVx4QjFkXHgwM1hceENGXHhBRVx4RDRLXHg4MVx4OENceDg5Y1x4QjhceEZGXHhGRFx4MTNceDk3XHgwMVx4MEFBXHg5N2hceEE4NVx4RjdceDA3XHhGN2w6XHhENVx4ODJceDg5XHg5QnJceEU1O3pceEZDXHhFMlx4MTNceDhDXHhBQVx4MDNTXHhBOFx4QzU3TVRceERDXHhCRVx4RjlceEMzKlx4ODduXHhGRlx4RENceEI0XHhDRCMjXHhFMlx4Rjg3LSljc252XHhBNk54Tlx4QjU6XHhERVx4ODRceDhEKlx4RDZtXHg5QkFceDhDYFx4Q0JsQlx4ODBceEEzXHg5MFZceEI4XHhGRlZceEY4XHg5MzZceEUyXHg4RG4nMVx4MDJceEEyXHhBM1x4QkNceDExXHgxQzhAXHgxQ0xceEU2XHg4QVx4QURceDhCXHhDNFx4OTFeXHgwOFx4MENwfFx4RjJceEI4XHgxQlx4QzZceEY3MVx4QjFceEY1UixceDEwXHhGRGtceEY0XHhEQ1x4MTlVWFd7XHhBNVx4MDlceDFBXHg5OVx4RDBceEU2dVx4OTNceEZGflRceEM1cVx4OUN9XHgwRE9ceEQwXHgxMEdceEIyXHhBMVx4QkRceEUwaFx4OUEvXHhFQSdceDFCPj4xXHg5MFx4RjJceEZGcVx4RDFSXHhDMVx4OUJ9XHhGMlx4RDVmXHhDMlx4QzhceDEwXHhGMXlceEYyLVx4QkIsfFx4RDJceEQ1XHhEMlx4QUVceDg4XHgxQ1x4ODFbXFx4QjQ1XHgxOVx4MDZceDAyXHhDMFx4MTdZXHhFQ1x4RjdceEE2XHhBN1x4OTZrXHgxQ3RceDk4YVx4OER1QVx4RjBceDg2X1x4MDVceDdGNHYtXHgxMClceEY4SmRceDE2XHgxRlRceDg4XHhFNz5ceEYwXHhGRVx4RUNceEY4KkxceEVDIzZaXHhERSxceEExXHg5MFx4ODhceDA3XHhFMVx4ODRceDAxXHhBN15ceEZCXHhCNC1ceEYzXHhDOHhceEZBXHgxRFx4RURceDk4fFx4OTVceDhEXHhFN01ceEYwaFx4ODFceDhCXHhDQTQjXHhEQjFceDhFIVx4OTchOTpceDBCXHgwQmxceDFGMTNceDA4Tlx4ODBceDE5XHhFNjVceEM0XHgwQ1x4OEVceERFXHg4MCNceEIxdVx4MUJceEJGIl9ceEM0O1x4OTJnUkhceEE1Zlx4QTcqV1x4MUVceEJEXHhGNFx4MUNceEFGXHhERFx4QjlceDA2fVx4QzJceDFBXHhDNFx4QjlceEUyMFx4RTE4IHpceEVFXHhEOT1ceEExXHgxNmNceEVGXHhBMlx4RjJceEYyPFx4MTNceDhGfFx4RDFceEVGVDRceEExXHhDNXxhQVFceEYwXHg4OFx4RUJceDA2XHhBNVx4OEZceEU4Jlx4OTlceDlEXHgxMlx4QUVceEU0XHg5MGBceEU0Ylx4QUVceDgydVx4OTBceDk3XHhDMT4veVx4RTdnOFx4ODlceDFBWlNceEZDelx4REViXHgxMDxceEVDXHgxMVx4RjlceEY3XHhCRUNgb1x4MUNceDA2T1x4RURceDk4XHhERlx4REZceDkyXHhGNVx4OUFceEEwXHg5N1x4OEFceEFGXHhEMFx4RjlceEJEXHhCM1x4RUNceEE4XHg5QVx4OTFceEE2IVx4MEJIXHgwMlx4MTJceEIzVFx4QjcmXHgxOFx4Q0RceEVCXHgwN1x4MThceEE5Wlx4QUJceEQ2NFx4Q0RceEFGXHg4QlZceEM0XHhFRlx4RDArXHhEMiUiXHgwMFx4MTNceEY2XHg5Rlx4Q0VceDBEXHg4OFlceDAzblx4MER1XHhBRVx4ODBcXHg5Rlx4QkYjXHhEMH4sXHhBQlx4QTFceDlGWCdceEQ0XHhBRVBMK1RceEZEaVx4RDJceEZGXHhBNTYpTStceEQxMFx4RjFTbVx4RUNwXHhGRVx4RTZzXHhBMmpceEU1XHhCRXJScXhxXHhCNlx4OUJceEZDelx4RTJceDkwQlx4RUNceDgzXHhEQyBceEYwXHgwOSFceEZGXHhDMSxceEY2OFx4QUVceDhFZlU2a1x4QUVceEI1XHhEQlx4RDFLXHhBQVx4MEFxJ1x4RjddXHgxQ1x4QzRLXHgxNyEjXHhCQnlceERCXHgxM1x4RjJceEZCXHhEMFx4QzRceERCXHhBQVx4OEJceEY4bVx4OURceEZGOlx4MURceEIxJVx4MTVceDA2bFx4RjRceEY4MlVxXHgxNFx4QzNceEIxXHhBN3A5SFx4OERQXHgwOVVZY1x4QUZceEM5XHgwOFx4MDUwNlx4RDZCXHgxMlx4MTRceDk5YVx4OTlceEU2XHhBMT9ceEIzXHgwMFx4RURceEU0XHhGM1x4RkRbXHhGMVx4QjZceEU4XHhDM1x4RjNceDE0XHhDQ1x4QURceEMzXHg4N1x4QTZceDg5XHg4Q1x4MTVceEUxNVx4ODRceEUzXHhDMVx4OER1VVx4RUNjXHhDQiZceDg1XHg4Q2xceDk2IFx4RkRceDEzXHgxRFx4ODdceDBGXHgwRVx4RDBceEZFXHhENFx4Qjh6XHg4RVx4OTNceDlEflpceEQ1QVx4Q0U+XHgwOVx4Q0RRXHg5RFx4RjRceDk1OHBceDgwNlx4MTZceEFBKVx4MEEoXHhCOFx4MEQlXHhDQjhceEZEelx4QjhceDg4XHgxRFx4REZceERGXHg4MVx4MTdceEJFXHhDQVx4RUIwXHg5OFx4REVceENBXHhDRTVwXHhBNlx4OUJceEE0KFx4OTJITHtceENGY1x4QjEmXHg4NU8mXHhGNHFKXHgwQkFceEU4Plx4QzNoWVx4RTE2Z1pUaVx4QTJceEZDUGdceEIzXHg5Rlx4MTRceDE2XHhDNjNceEYxXHg5RVx4MURNXHg5QzpcXHhFQ1x4MDZuXHgwQkBcXHgxRlx4QkNpXHgwNVx4QzAkMmhceDk1XHhGMV5zXHgwOVx4MDN3XHhFRFx4RTZceEY3YlVceENEX01ceDk4XHgxRCMmXHhEQmsoXHg4OFx4RDQiWVx4MTNceDkyXHg4MFx4QTBceDE5XHg5NT5eXHhBN1x4QzZlUVx4Qzh+XHhGRlx4ODRceDk4XHhFOVx4OTM8XHhFQ1x4QUZceDk1XHg5N1x4Qjh+XHhGN29ceDBDXSFhXHhEN1x4MTN0XHgwNjhceERFXHg4RVx4RTdceDg1USlceDlDWCNceEU4XHhCQUdceDlBOFx4OUQ6bk5ceENEIVx4ODNceDFCZ1x4OTU0XHhGNVx4OUU8XHg4Qlx4RDBHXHgxQVx4ODFceEQ0O1x4MUNLW1x4Q0JceERFXHhBNlx4RUQkXHhEQ1x4QTB5XHhDRilceDE0Wlx4RDVceDlBXHhCN3ZOYTJ8XHhCM1x4RTFceEVEeVx4MERrRFx4MDBceEY5LnFceEQxJ1x4RUZceEFFXHg5Q1x4MDByXHhGQVx4MDcgXHhDMENceEFDXHg4NkxceEJGXHhCOVx4ODBceEMwXHhGQ1x4MTdSXHhGOFx4MDFceDhBelx4QzZpK31ceDBFXHg4RVx4QjchbyBKXHhDMnhceDlDXHgwNkVWXHg5Mlx4OUNceEQ2JFx4QjEoIW9aK1x4OEQ7clx4RDNceEJFU1x4RkNceDBER1x4OTlceEY3XHgwRGdLTFx4OENceEE5cVx4RDRceDhGXHg5OCdsZlx4QzFceENFfiBceDFBXHgwNlx4MUJceEEwMlx4QjNceEU4VXlceDBFXHgwMVx4ODVceEU2XHhGOVx4REEnSmpceDhCXHhCRWU8XHhGNC4jXHhCRlx4RjJceEFBXHhDMlx4OEVOXHg4QmtceDFEXHg4NGU4XHhENlx4QjZceEM3XHhFQVx4RTlceDAwXHgxNX1ceDAyOyt4XHgxNDdceDdGXHhDQVx4QTNoZHZceDBCZ1x4RURceEREXHgwNVx4RUFtXHhDOVx4RjlceDg5XHhFOThceERFXHgxMVx4MTRceEY4N1x4ODBkXHhDRUdceEExXHg5Nlx4RkZNXHg5ODNceDk0XHgxQ1x4OUMmVyM/XHgxNzdceDFEXHhFMltceDhBXHhERltceEE0XHhGRl0yXHhEQlx4RkNceEZEOVx4QkFceEUwXVx4QTRceEI4XHhBNlx4RDl9XHg4MDxceEU4XHg5M1w4XHgwNT9ceEY0Olx4OUNceDBFXHhGRlx4RTVkXHhGNVx4OEMlbVx4QjZceEVFbSFhXHg4Ny1ceEQ4XHg4RjNceDkyXHhFMFx4QTVceEQxXHhERVx4MERceDBBY1x4ODVceERCXHhDQVx4QjNXK1x4OUVceDk2XHg4M113XHhBMFx4QkRceEZBfVx4RDNLXHg5Nlx4QkNceERDYVx4RUZceEFDXHg4MDt4XHgwRFx4RDYsXHhEQlx4RTJceDhDXHhCQ1x4OEYwakVceEM1XHgwMXFYOVx4MDRhXHgxMVx4MTlceEQ5RmVceEY5Llx4RjBceEFFXHhFRVx4RTRpXHhCN1x4ODBceDg1XHgwMnNceERGQFx4OUFZXHhCNlx4RDVceDhGXHhERVx4RDhceDlDd1x4RDZceEYwXHhCQ1RtVEhceEI1aUBceDFEXHg5Q1x4QUFceENBXHhCOFx4OTBMXHg5NVx4QTFceDBDXHhBRFx4OTImSFx4OTBceDFEXHgwRVx4ODBceDg4XHg5RElceEEyalx4RDhEXHg4MVx4RkRmP1x4QzJceENCaTNceEUwXHhCRlx4ODNceEQzXHhFN1lceDA5M29ceEFBXHgxQVx4ODlceEMxXHhENlx4ODhceERFXHhGRCtcb35LXHhGNVx4RTNceEY3XHhCOVx4REJSXHhDNXNWOVwvNlx4Q0Y2XHg4RCtceDA3XHhFOUJceEUwXHhGMyZAY1x4MTZceEE5XHhCRFx4QUVceDlFXHhBRFx4OTdceEFEXHhGOEZjclx4RjlIQjdceDA1XHhEN1x4OUZceEY5XHgxRVx4OTlpSVx4OERceEZGXHg5QVx4RTZgXHgwQ1x4QTdyXHhGQVx4OENWXHhGOGVlXHhDNFx4RURceEVBXHgwM1x4OEZWXHg5Mlx4ODliOFx4MUNceEJDPlx4RjJxXHhGRlx4MUQtXnh4XHgxNlx4QjZceEZCXHhBN1x4RDUxXHg5M1x4RENceDk3Vlx4RjBbXHgxRDxHXHhDNHtceEIxXHhGQmxUPVx4OThwNU5ceEFDXHhBQlx4MEZcXHhERVx4QTZceEVGa1x4RjBrXHhENlx4QzVceDBGO1x4OTdceDAxK1x4MEN9XHhBMDBceEE4XHhCMFx4Q0JceEM1WXlceEU1XHg5RVx4MTFkXHgxNFx4QjdcOUdceDAwbFI+XHhEQkJcXHhDQzIrXHhEOVx4MDhceDA3XHgwNVx4QzhHXzo7PEFDaVx4RDcjRlx4MUNceDE3XHg4RFx4OEFceENBMHNceDBDU2wiXHgwRVx4MDZceEM0XHg5NVx4OENceDA3QFx4MENceEE3Mlx4OUN5IVx4MTBGflx4RjhceDAwXHhENSFceERCXHhBNFx4RjNsXHhCNGYqXHgwQ2BJXHhGOFx4MUR7N1x4QzBceEI1TVx4QzQ+XHhEMVx4ODEgXHhDOFx4QTdceDA3XHhGNyJceEJGX1x4Q0VceDAyXHhCODZ0XHhFM1x4RTlceEU1XHhCQlx4RUVndlx4OEVceDhEXHg5OFx4MERceEEzQnFceEU0XHhERVx4QjNceDg1XHhBMitEXHgxNVx4MDcua1x4RkFceEE4IFx4RTJceEE5XHhEOHRQa20gXHgwNGRLXHg5QS1UXHhGQVx4MUFceDA3XHg4RVZceDkwP2kyV1x4ODh2Jl4gWlBceEZDaFx4RDlqKVx4OTBceEFEXHhFMlx4QzBceDA3XHhBNFx4OEJzXHg4QVx4ODVceEQxXHhCMlx4MTUzXHhEMlx4RkZceDk4VGVceDg3XHhCQ35ceEU1XHhGMm5ceEJFXHhGMFx4OUNceDgyXHhENGFceDEyTEB9XHgxOGVceDEwaVx4QTNceDAwVVx4Rjl7Jm1ceEQ2XHg5MUkuXHhCOFx4OThceEVEZ1x4RDkmXHhDOTdceEU2bi5ILVx4RjdceEM3XHgwNlx4QkJceEFEXHhCQVNceDdGXHgxRndgXHhGOGZceEMxXHhBQ1x4RUJceEMzVnVceDdGXHhCMFx4RERtWVdXXHg4RVx4QzBceEFBXHg4Nlx4ODVceEY4XHhGNFx4RThceEI4Vk1ceDkyW1x4QzhceERCXHgwNzZceDkwXHgxM1x4OENEXHhFQ1x4OTZceEM5XHhCQlx4QzVceEEwXHhGRlI7cVx4RDlceEJCXHg4NVx4RkMyXHgwNFx4RkJ0XHg5QWJceDhFPVx4RTBceERDXHhBMFx4RjY3XHhERFx4QTdceDk5XHhFNlx4RUVceERDXHhDOSAlenlceDhFXHhEQlx4OUZceDg4XHhGRG9ceEM0XHhFMC5ceEREWGxceEYwXHhFMlx4QjkjXHhGMlx4Q0RceERDXHhCMFx4QjJNXHgwNlx4OTVPRFVnYVx4RUVceEVFXHhBMFx4RkJQXHhDRlx4RURceERGXHg4QnZceEExVk9ceDkzXHg4NzBsMVx4OTZceDEzXHhFOFx4RUJceEEzXHhFRVx4RjFceERDXHhGRFx4MDZIeGdceEE3XHhFMlx4QTdceDBEXHgxRlx4MDAmUVx4RTFceEE3XHhCM1x4MUNceEUxPFx4ODkjXHhCRVx4MDhceDg0XHg5NDMuXHgwRVx4RThceEUwLCJceDk4XHgwRVx4RER8aFx4Q0VceEUzeHtceEFFXHhCQlx4MTBceEM4P1x4OEMzXHhCRlx4QzdceEFBXHgwNzZceEJGXHgxM1x4RkVfQ2FceDk4XHgxQ1x4RTZceEQyXHhCQlx4MDNceEY2TFx4QzZceEJGXHgwOGhceEY0XHhCNVx4ODFWXHgxOVx4QzVceEU3XHhCQVx4QTBcIUNceEVBXHg4NzJceEJBXHg3Rm5ceERDXHg4OUhceDg0VVx4QUJ5XHhCN1x4RDdceEMxXHg4Q2VceDAxXHhGOSlSXHgxMytceDAzVVx4QzJceEUzXHhCQVx4Q0ZceDlGXHhENlx4Q0JceEUyXHgxOVx4ODJceEEzcVx4RjhwXHhBQVx4QTdceEM2XHhGM1x4REZwXHg4Qlx4Q0NceDE1fXNceEI0XHhCNHF+XHg5Nlx4RjcyXm5JXHg4Q1x4QjNceEQ0Rlx4MTRNXHhDMzRceEFDKyZceDhDL1x4RUVceEREXHhDMVx4RTJZXHhFMXx7XHhGOFx4Q0JceDE5aVx4RjN5XHhDMlx4ODUxXHhGNVx4RERceDhDU1x4RDNceEM1XHhFOFx4ODQoXHhGNlx4MEZceERGfVx4ODJceEU5XHgxQVx4MEJceEFDXHhBQ2xceEQ4XHgwQi8sXHgwNHdjPlx4QjhceDFFWFx4REFceEM3ZkZceDBCXHgwRlx4RTRceDdGLzBceEI4XHhERHxceDhEfShceEM4XHgxOFx4MUZceEU1XHhDQ20jKSw3XHg4MV1ceDg0XHhCRVx4MTJceDFFXHhCNGdceDkxXHg4Qlx4QkJceEU0XVx4OUNceEE5XHhCMFx4QkZceEMxXzJtXHhGM25ceDBFXHg5QVx4QzBceDAxXHhDMVx4QjNMXHhFNlx4RDRceEQyXHgxMVx4Q0NceEY3XFx4RDlceEQwXHgwQlx4RkRceDg5blVceDkxXHhEMVx4OEFPfFx4QTZceDk5XHg4OVx4RjVceEIzXHhCQlx4RjB0XHgxRkhceEQ3RFx4ODNceEEwWlx4OEFceEIwQVRceEYwXHhBRVx4RTRceDFFPUtceEJBXHg4OFx4OEVceEIwXHhDQ1x4MDlceDhGXHhCN1R3M1dceDkyMlx4OEJceDBDXHhFQlx4MThceDhGXHhEQVx4QTFceEUxOHxlXHhDQVx4ODBceEZGXHhGQVx4QkVceEFCY3BIXHhCOFZceEI3XHhBRCBPXHhBNiJceDkxXHgxMlx4RDc7XHhCNnZ8XHhEMFx4QTNceDhDXHhFQlx4OTEgXHhBNn5ceEQzXHgxRlVceERDPlx4MENceEI5XHhDNFx4ODJceEY0XHhGRlx4QTdfXHg4OFx4QzcodVx4QUE+XHhDNlx4RUFceDE3XHhBRlx4OENceEFFXHhBNVx4QjR+KVx4QzNceDAzXHhCRFx4RUJceEU4XHhCN1x4RTRceEE1XHhGRFx4OEFceEE4XHhDOGx+XHhGOFx4MTZCa1x4OTZceEEwQVx4RkFceEMxXHgwRTV2XHgwNkhceDExXHhCMlx4QzF5XHhDMHdtXHgxNFx4QkU7XHhBQS49J1x4RDJceEQxXHhERVx4QjlceDg4XHgxRjVceEZEXHhFQ1x4OTZDXHg4N1x4RTBceEVEXHhERlx4QTFceDg0XHg5NVx4OTV8Nlx4RThceDA0KFx4ODZSXHgxNFx4RDk7XHhDNlx4QjhceEYzXHhDQ1x4Rjd8XHg5OFx4QURceDk4Slx4OTNWXHg4RVx4RENceDkzMlx4QkVceEYyXHhBNVx4Q0RxfGpceEQ5XHhFRkdceERCXHg5ODBceEQwXHhFMlx4RjBceDkycVx4Qjh4XHhCN15ceEYzXHg5Mlx4RjZTXHhCRDFceDgzXHg5Q1x4RTFceEFDL1x4REFceDg5IFx4MUNceEEzKy5ceDlCXHhEQVx4MTdceEVCOjJceEFCXHhCOWYuU1x4OTI1XHg4MXhwXHg4MEEyXHgxOFx4QjRceEFCXHhGQ1x4RENceERGXHhFRlx4MTQmXHhCQlx4MDJceEZCNlx4MEZceEM2XHhERFx4MENceDgxXHhEMylceEEyTlx4RkU+O1x4QjVXXHg5Q0tceEQxXHhBOH1ceEIwJFx4MEZceEY1XHgxNFx4RTVceEE0OyhceEQ2XHhDOEhQXHgwMDpceDE2XHhDOFx4MUFceEIyXHhCNFx4QkZceDA5XHg4Qlx4OTlceEY4I1x4RUNceEZDYlpceDlCZ2xceDFCXHhGREtceDg2R3xceDE3XHhBOVx4RDhceEZGXjE3S1x4MTJceEFDXHg5Rk1ceDFFXHgxM1x4ODk7XHg5ME1ceDhDXHg4Rlx4RDhceEM5XHhERFx4Q0NceDEwXHgxM1x4QTNBXHg4N1x4RDhceDg0XHhENVx4RjNceDkxXHg5M1x4QzdceEMyIFx4MTNceDAyXHhCM1x4QzlceEFDXHhEM1x4Q0FceDAwdCZfXHhFOFx4QTNceDFBeixceEYzXHgwOVx4RkRceDFBXHgwQ1x4QjNceDFDJFx4MEJceDg3OVx4RkFceEI5XHgxRFRceEMxXHgwNFx4QjlceDE0bmNcXHg4RVx4RTBceEE2XHhENEtUPVx4QkVceEJDMFx4ODdceEZFXHg4NWVoXHhCNlx4QTdceERFXHhDMUhDXHhGNWQ2blx4QkJceDExXHhDQlx4RDdceENBXHhFOTZmXHhDRlx4QURceEQzRUZceEQ1Y1x4MDloWUxwXHhFMlx4MEZceEQ0XHg5QTFceDgwXHhFRWRceEVEXHg4RmRceDhBXHhFQlNceDkyYFx4ODRceEU2RV9dS1x4MThceDE3XHhFNVx4MDlceDlFb1J9XHhGMVx4OUNceEZGXHgxRFxceERGaFx4OTJyXHhBRlx4RDFceDlBXHg5MidceEFFeFx4QjZceEE4XHgwRlx4MDlsO1x4RUFceEY4ME5ceEUxXHgxQSlceEJDXHg4NFx4RDlceEZFXHgxMFx4OEVceEVGXHgxQVx4MTVceEEzOlx4RDA7XHhDM1x4Q0FKXHhGOFZBXHhDQntceEEyXHg4Mlx4MDhceEE4XHg4M15ITFx4Q0NwXHhGQlx4QUVceDlEXHhBQVx4OUVceENEXHhGMlx4QUFceDFEZFx4QjErXHhBRVx4MDZceEZFXHhDNk9ceDk5XHhERlx4MDQ/OTpceDg3XHg4M1x4MTdceEUwXHhEQlx4RjcgXHhFMVx4MTRceEU2XHhCMlhceEZGajJceDBGXHhCNFx4ODZceDEyIVx4MEZceEQ5XHhBNnBceDFCXHhDNVJgKlx4OTl1XHhFNlx4Q0ZceEVBXHg4Rlx4QTFceDAyXHhFQVx4MURdNVx4QzVceEI4XHhCNj1ceDE0XHhFNEk5clBceEJEXHgwMVx4OEVoXHhENVx4QjlceEU3XHhBNVx4RjNceEIyXHgwOFx4MTVceDE2XHgxQVx4OUVceDAwZFx4MUFNTFx4OTlceEE0QFx4MThceEU4XHg5OVdxXHg4Nlx4QTdceEVBXHhFQnNceDEzXHg5NVx4OTcmdVZceEE5O1x4QUNCXHhCOVx4MUVceEE3XHgwQlx4RjE6XHg5RFx4MTUuUVdceDFDXHg5OFxceEExRTBceEE3Mlx4RURceERFa1x4QzkrXHgwMlx4RjdceDg1XHhFQXVceERFXHhCRlx4QjBceDlDXHg5N1x4QkJ8XHg5QSpceEJCXHgxMHVceEU2XHhFOVx4MThceDAwIVx4QjRceEQ4XHgwRGpRflx4RTlIXHg5Q1x4QkZceEZFXHg4RVx4MDcgJlx4RjVceEE1XHhFRjRqIVx4RjJceEJFXHhEOFx4RDVceEM2XHg5OVx4RkNceDE4ZFx4RDZ7XHg4NVx4REJJXHgwRT9ceENFXHhBOVx4MEJ5eH5ceEFEelx4MEUqXHg5N1x4QTlceDlENlx4QUNceEE1XHgxMFx4Q0YpXHgwMi58ekZceDk5Klx4OERceDlDXHgxRlk2e21ceEU0XHhCOT9ceDkzXHhGNnNCXHhGMVx4RjFhL3lceEQ0b1x4OThceDFEMVx4QkZceDhELHhceERCXHhGQVFceDkwXHg4Rlx4RDVceDAzaFx4RTZIXHg5MVx4RUVceEZFRVx4OEMqUyhAMVx4MUItXHhDRlNceEI4T1x4MEJceEJCU3RceEVCXHg5N1x4QkNcRlx4QUI6XHhERUo3VS5obEBceEQxXHgxOSFceEM2XHhEOFc8Ulx4QUE5UFx4QUFceEE0XHg5NVx4QjFceEMzXHhFQlx4RjhceENEXHhCRFx4QkNceEZEXHhFRVx4QjFceEJEQU1ceDgyd35ceEQ1N1x4QTFceEY2XHhDREdiXHhCMkIzRlx4QUVIXHhFMHNuXHhERSVceEQ3OmEiXHgwQlx4MEZ0XEk2XHhCNSlceEIzMnFceEZEZnw6N1x4QkFceEFGZ1x4OTVceEIyXHhEQ09ceDg1XHgxRXpceDhGXHhCQlRceEIxXHhGNFx4MTZgXHhGMVx4MDRceEZEXHhBQz1ceEM3XHhCQTQ6XHhCRFx4OTVFXHgwRTdNOFx4RUVceEZCXHhBQTNceEREXHhGOXhceDBBXHgxQ1x4OTFceEE1MFx4MDlceEQ1JnRcXHhDNGNceEU3Slx4QjJsXHg5MzVwflRTXHhERlx4RERceDE5M1lceEExIy9ceEUxSCBceDkzdTxtXHhGRXU1JjlceDBGXHgxRE5ceDk1XHhDMmgpVVx4OEFsI0F7X1x4RkNceEUyIlx4RUNwXHgwN109TWZceEJCXHhBMlx4QzNceDhFSURceEY5IXxceDkzXHgwOE9ceDlFR1x4OTdceDBEJmkwXHhGNlx4ODZceDk3ZVx4MEFceEVEXHhFRFx4MUNceEVGQlx4MTBceDAyXHhFMVx4QTRceEE3XHgxQlx4RkNaaFx4OTFzXHgxQTVceDkwXHhBQlx4RjJceENCPlx4RENceEZBXHhCRXFkXHhFQl09XHhGNlx4OEIuXHhCQlx4QjFceENEJVx4QjRceDlGXHhEMllceDE1XHg5RldceDk2Olx4RURSTjc2S1x4REFceEM4XHgxQlx4QzRceEI2XHhDRlx4Q0JceEIxXHgxRFBcXHg4RVVceEY4XHg5Qlx4MDNJXSxceEYzXHhCOFx4ODNceDg5XHhFRlZhXHhFMVx4MEJ3XHg5RnhceDBEK1x4OURceEU4XHhGRFx4RjRceEE1XHgwNFx4QkNceDE5XHhDRFx4MTNceEE0XHhBRFx4MTBceDBBNlx4RkVceEY5XHhBQVx4MTlceENFXHhFQ1x4RjhceEI3XHgwOFx4MThceEY2XHhGMlx4QTBBXHhGMVx4RDJceDE4b1x4MTVceEFBZ0VceDlBS1x4MDNceENBXVx4RjNceDBCVUZ0d1x4MEFceDk2XHg4RFx4MTJceDBBXHg5OVx4RjlceDBGXHg5NnVceDBFXHgxMFx4RThZXHg5QjpceEFGL1x4MEZceDE3c1x4QjVhXHg5Rlx4QkVceEJEXHg5RVx4OTRceEFDXHhCN1x4MEJceDE4XHgxNVx4OEIldUxceDk2XHgxNDhceEI1Llx4RjhceEM4ND5ceDkxLlx4MTVceDk0XHhBM1x4RDhceEU4XHhENkFceDBGXHgwNWJceEZEXHhGQlx4MEZgbz0jJ1x4N0Z+VVx4ODBkXHg5NXNceEU1Y0pceDE5XHhFMlpceDE3XHgxQlx4OTNceDk2XHhEN1x4RDBhXHhBMVx4Q0ZgXHgxQ0hceDkyXHgwRFx4QUIgXHhCNUFceEYzXHhBNVx4MEN7XHhGQ1x4Q0RpcVNceEQzXHhCOV14MVx4RDNceDgzXHhBNVx4QTkiTFx4RjZNXHhBOXJceEVBXHhCQ1x4OURFXHg4Q3NceEUwXHgwMGFceEZCXHhERUlIYFx4RTl3XHhCOFx4OTlceDA1XHgxRFx4QTk4XHhFMVx4Q0RceEIwS1x4RjNceEYxXHg5QlRceDlERFx4MEV7RVx4RUVceEVER1x4MDhceEY1XHhENnFceEIzXHhGRFx4OEJceEI0P1x4RUVceEZBXHg5MFx4RTBIaFx4RDA+XHhDMlsoLkhceEJDXHhGM01ceEMxXHhCNlx4OTlceDk1Um9ceDEyXHhDQzpceENEbFx4MDZceDBBXHhGRFx4RjRceEUxZFgiXHhFNiJceDFDXHhEQkNceEVDclx4OURceEIxTFx4RURceEUxXHg4NDs4O1x4RjNPc1x4Q0VceEU4XHhFQ1x4RjlceEQ3XHg5RVx4OTdceEQwXHhCNVx4MENceDBDXHhBNlx4ODRceEE3XHhDM1x4MTMyXHhBQVx4MUJdXHhDOGJceEVGXHg4Qlx4QjM+XHhFNFx4RDRceDlFXHhBRFx4RDV+XHhCM1x4Q0RceEFCXHg4REdceEYwXHhGRlx4RkRceDA5SDshUlx4RERceDk2TVx4QzJ5XHhFMVx4OUZceDFEXHg4RVx4OTUmaVx4MTJWXHgxNXM3alx4RTdceEM3XHg5NVx4MURceDgwM1x4MDVQXHhEMX1ceEVGXHhFQ1x4Q0ZceEQ3elx4REJceDhEXHgwQlx4ODhceDE3dFx4QkNceDFDXHg5Nlx4QjdwXHhFM1x4MENceEIxXHhFQVx4RjlceEE5XHhEMVx4QUFceDA2alx4RUNceDlGXHgxM1x4Q0NNXHhFMVx4MDY9cVx4QzBceEVBJVx4QzVceEZCXHg5NlZqXHhGMFNceEMxXHhBRlx4QTNceDhCXHhFNlx4MDZWXHhBMVx4QkVceDdGLyZceEMxfVx4QzRceDE2amBceDBDXHgxOFx4RjBceEZEXHhGQ05ceERDXHhDNmBceEU0XHg3Rlx4MUZceDkzUFx4RDRceEQwXHgwQlx4OTJceEE5JUM5XHhFQ1x4RUZceEEzXHhEMVx4RDJceEVCXHg4NFx4QzhVXHhFMlx4MDZxXHhFQlx4QjhceDBDOFx4QkJPaig0XHgwMUA0XHgwNVx4RDh4XHgxMn1kZmxceDA3XHhDQlx4RENceDgyU1x4ODdceENDXHgxRGxrPlx4RERceEI4XHhDRlx4MDZceEVBU1xceEY2XHg5NlwiXHg4Q1x4MDZ8XHhGODBceEIxbVx4OEJceENEXHhDMlx4RkFceEEyYFx4MTh8XHhENlx4MUVceEY5XHhDMVx4RjRceEIzXHhERlx4MDZceDhCXHgwN1x4RjBceDg3XHhDRlx4QTF0XHhBM1x4MUZceEI0XHhBMFx4RDYlRlx4RDVceEVCXHg4Qlx4MUZceEM3Q1x4ODFMXHgwN1x4OEFBXHhFRlx4MUVceDFBS0tceDg3Jlx4MEZceEUzcFx4MEVpXHhENzVceEY3XHgxM3JceDk2XHhBNC5aa0lceEM5XHhFQVx4OTFyXHhDNVx4Q0JceEQ2P1x4Q0ZceDkxXHg5N3NRXHhBNjFceDhFXHhBQz9yXHhGNVx4MEJXXHhFQlx4MENceDlEXHhFRFx4RjJceEVBXHhBNlx4REIhQFx4RjFDWFx4QUVTPSZgXHhGMVx4RDZceDkyelx4MTM2XHhGNFpceEMweVx4RjlceDFBVVx4RUZceEY0XHhEOVx4RUZceEY3XHhDQ1x4QTBceEEyXHgwNWdtZDdBL1x4MTNgXHhDODZhXHhBNFx4OTFceDEyXHhBOGtceEVFXHhDNiRceEYzXHhDM1x4QjJceDgxY1x4OTBceDE5XHhGRFx4MDUqNEAscFx4Q0YuXHhDRlx4RjNceEM1XHhCQyBceEFGXHgwRVx4MENceDFEXHgxMlx4RDFceEUzMntceEI1MVx4QjAiXHhDM1x4QTVceEI3XHhERlx4Q0JceEE1XHg5QWNceDA3XHgwMyA5S1x4OTBceEFGXHgwNVBceEY5XHhFMnxceEI5XHgwRio7XHg4MVx4REIgXHgxMy1NZF9ceEFCMl1vXHhCM1x4RkZceDEyR1x4RUJceEZEXHhCMVx4QjkoXHgxNVx4OENceEIwRVx4RDBfXHg5MVx4MENceEM3dlx4MENceEEyNlx4MDBceEI0XHhEOVx4MEJQXHhGM1x4OTdceENEXHhGOVx4MTlceEQ3XHhBOVx4MDZ0XHhBQlx4Q0RceEEyXHg4Nlx4OTM+XHhGN1x4RkEwZnNRYVx4RTYxaFx4RTdRXHhBNVx4Q0RceDg2XHhFMVx4OTJceEMyXHgwRHZceEMyZFx4MDIxXHhBRVx4MTFceDgzY1x4ODZceEIyXHgxQ1x4QkJOXHhDRixceDBCdDpceDE1XHhBOCVceEU0XHhCNTE0XHgwN1x4QTZhXHhEMlx4ODBjXHhGQ1x4QTRceDE0RFx4ODRceDAxXHhEMFx4QTRceDlGZlx4MEE4L1x4QzZRbVx4OTlceEVDXHgwQVx4MDhceDA5XHhGOVx4QUZceEE3REJceEFCXHhEMFx4MEZZXkVceEM4XHhCOVx4QzlveVx4ODBNXHhCMlx4QkIuXHhCOVx4QkRceDhEXHhEMiRceEI2I1x4RDRceEVCIFx4MTVceEFDXHgwNlx4MENceEY2fSw+XHhDMFx4MEVceDFGM1x4RUZceEI3XHhFM1x4OUNhXHhEN2ZFXHg4NSlceEY0aFx4MDB4MVx4RTNceEYzXHg5Q1x4MEVceEM2Q1x4QTFceDkxZ1x4MTBceEM2XHhGRk1ceDg4XHhFQ1x4QzZceDAwXHg5QmVceENGXHhBNFx4QURceEQxXHhBOWtoXHgxQ1x4OTJaYDxceEY3YVx4RDlceEI0XHhBNWdceEU0XHhDNVx4REJceEVFXHhFRlx4REFceEZCXHgwMD9ceENFXHgxOVRceEMwPiJceEE4XHhBMkwhJEpceEM5VVx4OTc+XHhDMF1ceEIxXHhDN1B2XHhGNFx4OUFceEFCc1x4MERceDg1XHgxM1x4OEF+XHg4RFx4QzNGKyVceENDXHg5Nlx4OEFceDFFXHgxQ1x4RjRceEU1Mlx4RTFDXHg4NnxAXHg4MFx4RTlceEM0XHg5RFx4ODNiXHhFQ1x4QTRceEEzXHhFMCZceEMwNlx4OTBceDhGQjlUXHhCN2RceDExcWxceDEzXHhERFx4MTZceEM5XHhCMVx4OTN0dFx4ODJceEYxMihceEIxfCtceERCNlx4QjdceEJDNSVceDlCJFx4MDRceERFNFx4RjMyU1JJKVx4QTRWXHg5NFx4OUJceDE3XHhBOVx4MTFceEIyXHhFQ1x4ODRLKFx4RDJceEE3XHhDQ1x4OTNxXHg5RFx4QTZceDhENy5ceENDXHgwRGFceDkyXHgwMFx4MTlceDlBXHhERkE4XHhDNXAwPFx4N0ZceDBEXHhGMDpceENFXHhCRlx4MDRceEJBXHhGNlx4RkVFKVx4MDJYXHhEQVx4QzhceDg0REBceDgzclx4QUZceEM2XHhGNVx4Q0ZceEZES1x4QzdceDEzXHhBQy0qXHhGRlx4OENceDBCZ1x4MTZceEI0XHhDNFx4QkVceDhEXHgxMlx4OUNhXHgwRlx4MEZGUlx4RjFqXHhEOFx4Q0YhZGRceEY3XHhDRERceDlGY2BceEUxXHhDNlx4OENceEQ0cz5JXHhGRitceDA0XHg4M1x4RjBceDEwWlx4OTIzXHhEMlx4MENINlNceDEyZFx4RkZceDlCT1x4RDQqejhceDFFXHgxQTFceEE2XHhCRFx4Q0NnXHhDOFx4QTdsXHhCQ1x4RDJceDhDXHgxNVx4MDJceDBDXHg4RCVceDA3XHgwNC5JXHhCQ1x4MTJceEI2XHhBMlx4MDJceENFXHgwMVx4QkNceEUwVVx4QzBJMm5ceEEzZVx4ODBceENEXHg4NFx4MDFceDhBT1x4QkFeXHhFMFx4QzNceDlCXHhFMkY3cFx4MTdceDFDXHgxRFx4RDJceEJGXHgwRH06XHg5N1x4MTlceEZBXHgwRlx4MEZceDFEMlx4RENceEFFXHgwRlx4RDY2LksxXHhCMFx4OUNceEI4XHg5NVx4OERrXHhGMmVceEI1P1NceDFEey5ceDExXHhDQlROXHgwOGwkXHhEMnhceEZDXHhCNzVceDA1Tlx4MTFceEI5V0JceDk4XHhBMWRceDFBXHhEM2ZceDE4XHg4MFx4MDFceEIzXiBceERCXHg4NHN8aV9ceEU5XHhCOVx4Q0FceDlBXHhFQUhceDAzXHg4Nlx4RjNceDA3XHg5RFx4ODNkXHhERi9ceEZEXHhDNFx4RUZceEFBOV0vXHhBOGdceENFXHhEOVx4QzMnXHg4QydKXHgxM1x4RUYuXHhGQT9ceDFDXHg4Nlx4QTFceDA5XHg4OFx4QjRgXHg4RVx4RTB5Jlx4QkNceDk3Nl5qd0xceDBGXHg4OFx4QzNceDFFXHg3Rlx4RjItXHhCOEdERlx4REVYYVlceDlDXHhGN1BceEI0bDl9XHhDNlx4MThceENDRCtceDE0XHg4RF16ZkFceEM3W2gvXHhEOGNceEYwSFx4QzdZIlx4RDBca2EmXHgwRVx4REYuQ1x4MUVceDFDXHhEM1x4MEZceEFCNTJceDhCXHhDMFx4OTlAUFx4QzVceEJBVlx4QzAgb1x4RTAwcVx4ODhceDE0MVx4QjJxI1x4MTVNMldRXHhCNUdZXHhDRVx4MTVceDBBPVx4Q0MySFBceDg3XHhBRFUqZyNceEE5clx4OTVceEYyRlx4MTJceEU5XHg4Nlx4RjAiTFx4QjJceDgzLVx4RjdceDBEXHhEOWtwXHgwRj9nYFx4MDBceDk0QW54XHhDMEpceEIzXHhBMFx4ODRceEUwXHhDNVx4MDNceEQ0QVx4QzY7XHgxM1x4MTNceDlGXHhDQWJYIFx4OTZiX1x4RDlceERCXHg5OVx4RTNceDgwXHhGRmxxXHg5QntceEZGXHhDMC5ceDFFXHg4RDshXHg5QjpceDA4XHhDQ0YtXHg5RFx4QTdceEI1XHg5MGM5XHgwM1x4ODVceDlGXHhBNS1ceEJDbCxceEUzXHgwRXRWMUtceEJCXHg4RVx4RTVceEVDXHhFNVx4QkMnW1x4OTFceDE3XHhDM1x4RDdceERGXHgwRlx4QjVceDgzQFx4RThDXihceEI5XHhENFx4QTJceEJGXHhEM1x4OTQjXHg4Rlx4MEFiR1x4MEN0XHg4OVx4QjRceDE3W1x4MEFceDFBS1x4RDRoXHhBNlx4RThceEFDalx4QTBceEMxVFx4QzAiXHgwQ1x4MUVAfVx4MUNceDE2Z1E9XHg4OVx4MTlceEVBXHhBQVx4QkJceDExXHhEOVxceEIxXHhDNlx4OUVqQFx4REZSPmlceENGXHg4MSBceDAxK1x4QzZceEYwMlx4RURceEM2XHhDOVx4OEQzXHhEMVx4QUVceDFDXHgxMlx4QjIuXzFceEEwXHgxNFx4RkZceEE2XHhDNGZceEMxXHg5QWlYXHhGRixceDAweDJkP1x4OEUpXHgxRVx4RDVceDhGXHhBQ1x4QjVYQ2pceDdGV1hceEU1J1x4RkNceEYyXHhGM1x4Q0J6eFx4MDhceEI5XHhGNyRceDg0XHhBNFx4QTZJXHhFOTEhNFx4RDVxPDtceEE4XHhCNFx4MURceDEzJWNceEQ1XHg4OGIwK1x4N0ZceEU2XHhFMlx4RDYgR1x4OER1XHg4Mlx4QzFceDBCXHhFRVx4RjhpXHhDRVx4RjdEXHhDOTZceDhCXHgxRXdceENFXHhGNmpceDkwXHhENVx4ODRFXHgwOVx4QTBceEM4XHg5NVpceEZDXHgwQVx4QTFzXHhDRS1ceEM2YCtceEUzTFVceDhGXHgxOVx4QjJceEM3XHg5M1x4RDZceDhFXHhEQ1x4RjVceEE2RFx4RDJceEVCXHgwNlx4QkFKXHgxNmBceEU0XHhENzxEXHg4M1x4OURceDk5XHhBRDpceEU1XHhBN1x4RDVceEYyUCdfXHg4OVx4N0ZceERGXHg4MWNceDg1XHhGNTBceEQ2XHgxNSZceEU1NFx4ODdgfXBceDEwYlx4QjVceDExUlx4QkFdXHg5OXZceDFGTFx4RkI/RFx4ODZmXHg5Qlx4QzF4ejRceDhBXHhBOFx4MDZ+XHg4RiNceEE1Tlx4RjMlXHgxMFdWXHhCNVx4RDlceDEwXHhFQkFceDk2e0ZceEMxWVx4MEJceDhDXHhEN1x4RkJceDFGXHhGN1x4Q0Q2XHhGRlx4RTVWXHhFRVx4RTdceEY5eiQxXHgxQlx4QTNceEYxZUxceEU3L1x4RDBceEZGXHhGRVNceDA0XHgwRFx4OURlXHhGQTlceDA3XHg4RVx4MUFceEQ0UVx4RkFceDk5XHhBRTBdfVx4RkZceDk0a1x4MUZHXHg4Nlx4MTJ1XHgxRFx4RDdceEE5XHg5MSxceEI1XHhFQVx4MDRceDE3dFxceDlCXHhERS13XHg5Rlx4REM8XHhCMFx4QjRceEM4XHg4QlVceDE3XHhCNG5YW1x4MEVceERCXHhDNlx4QTBceEUzUVx4QTRceDA2XHhEQVx4RUZceEU4X1x4MTFceEQ3XHhERDtceDA0JVx4QTVceDE4XHgwRnxFZ1x4ODJceEJCXHg4RXAwXHhGQWxceEY4XHhEM1x4OEM1XHhBMFx4MEFceDA4XHhCRURceEJBXHhFOFx4Q0RceEMwXHhBRFx4RTJsXHhGMVx4QjlceDg5XHgxQVx4RTRceEI5XHg4NSpceEFFXHhFRVx4QjlceEYyJ2EyT1x4RUMpIFx4REFceENCUFx4QjNaXHg4QVx4MEZceEEwXHg4REZPUFx4RjMxRyVrQlx4RjZceERFXHhENVx4RjZceDgzTVx4MUZceDkzXHhDM1x4MTdKXHhBRlVceDAyXHgwNnRyXHgxMFx4MUZceDEzV1x4RDhceDEyXHhGRVx4QjFceEZFPFx4RkNceDg5XHg4MkFceDk1Ilx4QTM+XHhCQ08qXHhFOGBceEZBd1x4Q0JsXHg5OFx4REJcXHg4N3l5eVx4RkNceEM5XHhEN1x4QjcsXHgxN1x4Qzl4XHg5MFx4QzFceDA0XHhEQVx4RURceEY1b2IzUWZceEQ0XHgwQmRceEY1XHhFNVx4QzNceDFDXHg4M1NceDg5XHhFQlx4RDJceDE3OmZceEVFXHhDRWpceEMwXHgwQVx4QkJceEI4XHhDN1x4RUFceDg4XHhFQlx4MDZceDEyXHhDNFx4MDdceENEOFx4OUVceDFDXHgxRFx4N0ZceENEXHgxN1x4QUNtXHhCN1x4RDhPXHhDQmtceDlBcSNceDFDXHg4RVx4QzNbfVx4QTFceEZBRzFceEVBXHhERi5ceEU3J1x4QUNkXHhCMzxceDE4TV5wXHg4RFx4QjIpRlx4QzghLVx4REJceEE4XHgxOVhkXHg4MVx4RUJceDFBQlkiXHhDRFx4ODBceEZBXHhGMlx4RDVceEExN1x4REVceEI3XHgxODZceDdGXHg5Nlx4RUEvXHgwQ1x4OUFceEZBXHhCNVx4QzVceEQ4XHhDRFx4OEMtXHhBRj1JXFNVXHg5NFx4OTNceEVDTzx7XHg5Qlx4OEZceEMzNFx4MDBceDEzXHg4N1x4QjFceDE3XHhCOVx4ODJceDhDXHhENFx4QURceEE0JixceDhDXHg3Rlx4MERDR1x4RjMqXHhDQ1x4RTFceDE1XHgwMS0gXHhDRkpceENBXHgxM1x4MUJceDA5XHgxOVx4QzYgM1x4QTdceEI0XHgxQ1x4MTdceEYxLFx4RjZceEY4XHhBQVx4QkNceEEzXHg4Rlx4QTdceEI1e3xceDhDUkE9XHhDOFBuXHg5Rlx4RjhlXHhCRmFBVzFceDEwXHhCMHxceDk1XHgxNVx4RTIwXHgwOFx4MDlceDFCXHhFN1x4QUZVZVx4QkZceEU4XHhBMlx4N0ZceDFGblx4QUFceDA1XHg5Nlx4ODNceERGPVx4RUZLXHhGRVx4RUFceDk4Olx4Q0JceEMwJ1x4QjJEXHhFOVx4ODRceENFc1x4MEFceEQ5J1x4RTN4Z1x4MDVceENBXHhGN1x4MDVfRlx4QzNceDA3XHhBRFx4QUVceEI3dlx4OTFceEUzOlx4RkRceDlFdFx4MEFceDg0R1x4RUJceDFGfVx4MUJceEMxRVx4MUFceEFFJlx4RDJceDE3XHhCQlx4MDMnXHhEMTdceERCXHhGMlx4N0ZceDg2blx4MDZeOjpceDhEWFx4RUFceENBXHhFNFx4RTdceEYzRVx4RUZceEJDXHgxMFx4RTlgcV9ceDFCXHhEN1x4MEJceDE0W1x4QTdceEIyM3FceDE5SVx4RDBceDEyXHhEMFx4RURceDA5Qlx4RjFzXHg4MDFHXHg5Mlx4MTJ1XHg5OU1yQzF4alx4MTNceEUwXHg4QTBceEFDXHhGMypceDlFXHg4Mlx4RDFceDFDTTk+XHhCMlx4MDhceDhDXHhBOG9ceDlCXHg5NlJceDlCXHg4QVx4QzRceEIwXHgwNFx4RDZceEJDVUBVcVx4QkFceEYyXHhCOFx4QkVceEVDXHg4MVx4RDBhR3JceEYxZn1ceEU3L1x4RTZceEFBXHhGNVx4QzNceEQ0XHhDOHRbXHhCN1x4OUM6XHhFOXJceEFBXHgwN1x4QTNceDExJFx4OTJceDk2XHg4N1VceENGNVx4QjdceEJFXHgxQz4lP1x4RjZlYyA8LVx4QjdceDhEXHhGQVx4MDhceERCXHgxOVx4RDFGXHgwNlx4RDNceEZDXHhDQmpUU1x4RkRceDg1V1x4OTNceDk3XHhGQlx4MEI6XHhFMHs3XHgwMFx4REVceEIyXHhFQVx4RDdceDlFXHg4QixceDEzSVx4MDlceEI2XHg4OVx4OTdceDg1XHhCOFx4MTNceEI5dXM2XHgxMFx4RTdceEZEXHhERTRZXHgxN3FceEYwXHhFQlx4QTB8LFx4OEFceDFBX1x4RDZceDE3VFx4RTBceDk0aFdceEFDXHhGNlx4RDJceDAzXHhFQTVceEM1XHgxQ1x4OUNceEFBelx4QjlceDBDZmxhXHg4MGtceEEzXHhCN1x4RTRceEEyPXdceERCXHg4QVx4REJWXHg3Rlx4N0YuXHhCNFx4RkRceEQ0XHhDOVx4QTNceEJCXHgwQVx4Q0ZceEUxX1x4MThceDhCXHhERFx4MDhceENGXHhGMnlceDFDXHhCRVx4MTg8cFx4QzRceEMyXHhGQlx4MEN8XHhDM1x4QTlZXHhGNFx4RTBceEQ4XHgwNVx4RDQ4TWdceEIwTVx4QzZceEMyXHhDNlgjKmJceDk2XHg4Nlx4MUV+XHg5Rlx4RjZceEUxXHhFNUBVfDdceEQ1Z1x4MDVceEJGXHg5NVx4QTJceEE2U1x4RjhceEY2XHg4Mlx4RDBceENEXHhDNCU4UiZceDlBXHhCNVx4QTdceEMxXHgwMlx4QUJceEQwLGRKXHgwNGhdfVx4RTZceENEXHhCNVx4RkV5R1x4MDJceEFDXHgwM1pceDgwXHgwM1x4RUZHXHg5NFx4QzRceDFGXHhFNk1tXHhDOVx4RjhceEI2XHgwRlx4RDIsdU8gXHhDQUFvJlx4QkY7Z1x4QkRceENFXHhCMU1ceDgweVx4RTF+XHg5Qlx4QjFceDFFXHhGMUFIXHg4RVx4QkJEXHgwQ1x4QjlceDlGXHhBMVx4QzdceEUzeU1GXHg5Qlx4RjJceDE5QVx4OTZxXHhEN1x4OTJLQlx4MEJceDE0fVx4QTV+XHhENVx4MDRoUFx4OTRceDEwOlx4RkRzXHg4NVx4RTlceDhBXHhEM1x4REJ1XHg5OFtceDBFXHhGMVx4QUZceEZGXHgxMlx4REVceEZFXHhDNDlceEM3ejRceEQzXHhBQk58XHhCMFx4REJceERFXHhGNVx4OUVceDlEXHhDMFx4QjdVXHhGOFx4RDVceEE4XHgwMlxHXHhCQVx4OTRgPVx4QzZceEZFKVx4OTZceEU3XHhFMFx4RkN+XHhBNHFceEMyXHgxMVx4RTRceDdGXlx4QUNceEZEUFx4MDZceEZEXHhGNC4/XHg5MFx4QTRceEEzXHhDRFx4RjJceENCbz1ceDg0XHgwOFx4RTZceERBQVJceDE2XHhFNDFyaHhjO2BceEY5XHgwOFx4MUVUXHhFRVx4QkVeQGdceDA5XHhBN1x4RUNceEI5MClceEVCXHhERmNdZVx4QzFXXHhCMlx4RTYjXHhCNHJceENFR1x4RTMoOFx4OEJMMkRceEY5NVx4QjlceDkxXHgxQj9ceDk3Olx4REVWIVx4RUZXdFx4RkNceDg5XHg5NVhceDg1XHhBQ1FpXHhCQlV+YUMiO1x4RDFceEYzXHgxMyZceEU2XHhERlx4MDEsXHhGQ1x4REV1U1x4Q0I4Y1x4QjhceDk5Rlx4QzJceDhFL1x4OUZ2XHhCNUMnXHhGMFx4RjNceDEzXHg5OHdceDA3I1x4ODNceDg1JVx4MTk+XHg5NVx4QTFceEUwXHhFN35ceEJBXHgxMVx4QTJgfFx4OEY8Xlx4RDlceDA1XHhBOVx4QkVceEM0XHhENFx4RDdceDgzQVx4MTgpXHhBQTtceEZEXHhFNjJceEQ3XHgxOVdceDE0XHg5RVx4RTFceEE0XHhBQVx4RDlDXHhDQjRwXHg4N1x4MDRceEEwXHgwQlx4OTJceDlEb1x4Q0RceDg0XHhBRFx4QUZpXHhDRGlceEVGXHhENj1ceDg0Ji9CQFx4RkEgXHgxMVx4MEJPXHhCRFx4RUNceEQyM1x4Qzg6aFxceEZDXHhFREw8XHg4QmlceEQxXHg5RiVceDFCXHhDMVx4QkEtLlx4QThceDAzXHgwNlx4RUEjXHhCM1x4MEJceEE3XHg5NF9ceEFETVx4MDlbTzdWK1x4OUQnXHhEOEVceEExXHhCMC1ceEYyR1x4OTFceDBFXHgwOFBfXHgwM1x4QkZceDk1XHhEM1x4QkQqXHhGRlVceEJEXHgxOVx4OEFceEVDd1x4QzNceEQ3XHhDNWEoXHhCQVx4RjM6XHgxMjJ4XHhGMVx4QUFceEU3ZSF2XHhGRVx4REYpXHhFN1x4QTRceEM4XHhFMFx4QUFceEVDXHhFRlx4ODZceEMxYVx4RUJWXHhFNFZceDgyPkNceEMxI1x4QkRceEQyXHgwRj1ceDBGOUVceEJEPjE4XHhDMVx4MTJ9XHhBMlx4QjlceEYxXHgwOXQ/XHhGNm1RXHgxMVx4OTVceEE1V1x4QTFIIFx4RjNceEMxXHg4MVx4RkE+XHhCQlx4QzBceDhBXHg5QlJceDlFXHhBRFx4QUJceEI1XHg5Qlw0XHhENmopaVx4QzRceDk0XHhFNVx4MDJceDlEVkJceEFDXHhFOVx4RkRceDg4XHg5Rlx4MDFceEY5JFx4QzU6XHhGRDFPXHg4RFx4RUQxXHg5NFx4MTdceDAzNVx4RkFceEM0WVx4QzRceDFBXHhCM1x4RUVceDhBWVx4RjFxXHhGQlx4ODlceDlDXHg3RmxPXHg4M21MXHhGRVx4QzdceDA2XHg5OS1KXHhDQzFceENFXHhDN25ceDExXHg4N1ZceEUwXHg4RDQvXHgxNVkgXHhFRFx4RjBceDk5eFx4RTFceDE0cFx4RkVceEM2eVBceEYyXHhDM1x4REZGXHhBRSRQeCwoZXFceEQzXHhDRFx4QjNceDlGVjxceDFGXHhGMFx4Q0FGXHg5MVx4QzFceEJGXHhDRVx4QTdceDBGXHhDNlx4MDhceDhDXHhDQ2RceDhFXHhDRTNoXHhEOFx4ODEiWFx4RUFUXHhGMVx4QTlceDFFXHg5RDhceEJDR1x4QTRceEIxXHg5Qlx4OTVHXHgxMzxceEQyRE5ceDlDLmo+XHg5OVx4QzhceERGLS1nXHhEQ2lceEM1XHg4Qlx4MEJceDgzXHhEMFBceEZCXHhDQVx4OEJceDdGQlx4RURceEMwXHhDOVx4QjlceDFGXHhDNlx4MTFceEEwXHhGNlx4MDdceEUwXHhBQnxceDA1XHhENWBNfVx4MENceEQyPlx4ODdceDFFPjZceEYwXHg4Qz9bXHhBQWVceDFBXHgxRDtceEI1XHhDMilceDk1VVx4OEVrXHhFQ1o5fWxceEM1ZXlEXHhBQkdceEIzXHgwQm5ceDA1XHg5MX02bi4sLVAyXHg5RVx4RUZceEVGXHhCOEcyXHg4Qlx4MDhceENGXHgxQVx4RDZrXHgxQlx4REVFXHhGQ1x4MTNPXHgxMzVceDBCXHhBNl14I1x4RENceEEzXHhDOFx4QkN6XHg4RVx4RjFceEZGXHhDRVx4MDRceEZDe3MzXHgxMjhceEYyXHg5NFx4MTBDMlx4MUIoSlx4OEVceDg0XHg5ODRhXHhBNFx4QThyXHhCNlx4OEE7XHg5OFx4MTFceDgxX1x4QTVoeFx4RkIhO1x4Qzk2XHgxMVx4QzhbXHg4Nlx4QTdceEEyRlx4MEJceERBXHgxNlx4REFceEYyX2whXHhCRVx4RDdceEUyXHhFNVx4QzRceEVGXHhDRls9QVx4OENceEY0XHg5Qlx4RjFceEU0XHhCNFx4OUUjXHhDNWZBIFx4QjVceEU5NFx4QTVzXHhDQURSXHg5QXpceENEXHgxOVx4ODdceDBCXHhCRFx4RDNceDFFUFx4OTVceEQ1dFx4RDdwXHhBRVx4ODBceEZDXHg4Q1x4MTdgXHhDNmVceEEyUGtceDg5XHg5OSRceEZDXHhGNFtceEJCO1x4OENceEUzXHg4RmRceEQ1XHhGQ1x4QTJceDE5V1x4OEF6XHhCNV4jXHhBMVx4RDFceDhGXHg5N2BceERFbVx4Q0ZmXHhGOSZceDA1eFx4OERceDFBXCtWXHgwOVx4MTlceENCXHhFRVx4QTZceDBFXHg4RHRceDA0XHgwQmlceEQzXHgwRFx4MDBRXHgwNEF5XHhBNFx4RTUgQlx4RjlceEZGWVx4RDIvXHg4RVx4OTdceEYyb1x4OUVceEY1XHhGQlx4QjRceEJCXHg5MC1hXHhBMW09Plx4QUQsXHgwMjpceDhDXHg5Nlx4MEQsZ1x4RDlceDEzXHhCNlx4QjNceEExXHg5RFx4RTFceDgyXHgwM1x4RUJceDBGSnxgbXFceEU2XHgwMW9ceEU2fWNceEZEcVx4ODJceDE0blx4MDNceEMzXHhGQVx4QjRceEM0XHgxQlRceDlDXHg4QVx4QzRceEQ3LFx4RTRlKiR5XHhBQnRceEYwXHhDOG5ceDgyfFx4MERceDE4XHhGQVx4RjJceDgxXHhEMU1ceENEJ1x4QTZBXHhGNVx4QjB8bFx4QjZceEMxXHhGNGVWXHg5Rlx4QzBceEE5IVx4QThsXHhEQ1x4RENceDEwMiBXXHhFMVx4MDJceEU3PVx4RjVceDg5XHhGOVx4QjZZXHhDRFBaXHhCMVx4RDdceEFBXHhGRFx4RDVceDA0clx4OTVceDk0akdceDAzPVx4MEQkXHhDN1x4QThceDk4LVx4MThceEI1XHhFNVx4QzdceEIyXHgxN0xceDE0XHg4RiFceDA0R1x4MEFceEE0XHhENWtceEU3XHgwQlx4QUNcYVx4MTg6eUlceDAwV1x4Q0JYXHg4OFx4RDlceDlBXHhFQVx4RENUdDZceEU1Olx4RTZceEE0XHhBOHRceEM3XHhDNzlceEMzXHg5Rlx4RjFceEU5XHhEQVx4MDNdc1x4N0YpPVx4OUM4az9ceEI4XHhCOGFceDA5Mlx4RUVceDA0fVx4OTJceDFFXHhBNTI8WFx4MDFDclx4QjdceEEzXHhDMVx4QkJceDFGXHhDRlx4MEZiXHhDRkhceDgyI1x4RkVceEI3Plx4RDZceDk1Olx4N0ZceDkxXHg4NVx4RjFceEIyXHgwNVdIXHg4MVx4RDA3XHhDRFQoXHgwQVx4QTlceDBEXHgwRlx4MUI0eVx4OTVceDlEXHhERU1ceDg3XHgxOWJceDhFXHg5NVx4Q0F0XHhFOV1hXHgxOFx4RjZYXHg5RVx4RjhceEI2eVx4QkNceDAxXHg5Qlx4ODZceDFBJVx4OTY5XHgwNFx4QTVceEFGMlx4QTdceEEyXHg4MiJ7XHgxN1x4MEI4WVx4MEMhXHhGOVx4ODZceEMwXHhBQ1pceDlCXHhDNXlceEYyXHgwRmJceEVGXHg4Q2VceDAzXHhFQVx4RDA9XHgxQihQLWlceDhFL3onXHhBOFx4MUJceEVCVjZQXHgxN1x4RTlceEI4XHgwRURceDhCW1x4MTlceENEXHhDNzxceDhEXHhFQ1x4OTNceDhEL1x4RkFceEFGXHhGN31ceEZGXHhFQiFOTVx4OEJceEZEK1x4MUZceEUyXHg5Q01ceEJCdz4qXHgxMDFceEY3cFx4ODBqSFx4QjFceEVCb2FceEY1XHhFRlx4RjRcOVZceEJBXHhDM1x4MDRceDEzVVx4QzRoKF1ceEJFYiBceDE4M1x4OTlceEZCXHhBQ1x4QzJceDlDXHhCOGZceDFGdFx4RTBceENFXHhEM1x4ODVceDFFXHhGRiJ4fVlceENFOGpceEM3XHg5MWpceEJDXHhBN2xceDA1XHg4NVx4REU2XHhGOVh0XHhEQ1x4RUFceEE2XHhFNlx4RkElXHhFMFx4MDV8XHg4N1x4QTJVXHhGQyRPXHhFMFx4QTBceEI4XHg5QVx4OTcnXHhEOVFgXHhENC9VXHhGRkRceDFFdERceDg2XHhDNU9ceDhFXHg5N2g+Kz1lXHg5QTZceEM4XHg5OX1ceDk3XHhBOFx4QjJNXHgxQz5ceEY0XHhBRVx4OEJceEEyXHhEQlx4RDYtXHhBNFx4OERceDA0bVx4OTJBS1x4MEQvXHhCNVx4ODNceDE4XHhGMlx4Q0ZceDFBXHhFNFx4RDAoXHhBRWhxO1x4RDZqXHhDM1x4MEJceEM4L1x4MDlceDhEXHhFNnNceDFFXHgwMnBceDA2XHhDNFx4OTRceDE1XHhGOHxceEQ2XHhCM0RceEYyNzNceEVCdVx4OTRjJlx4MUFceENDXHgwOVx4QTUoXHgwNVx4RUVceEZCL1x4QzhceEMzXHg5NFx4RjBceEVBXHhEQ1x4QkRceDA1XHg5N1x4RUZKem1ceEU0MHRWXHgwMlx4OTdhXHg5N1x4QjhceEY2YFx4QkZceEE4XHhGOXxceERCTFhnXHg5N1x4RURMXHgxMVx4RUFceDE0IWZJTzhceEM1bCNhXHhFRlx4QTVceERBXHgwMV1eXHhFQWpceEZCXHhENlZceDE5XHhDNFx4MUJceEJBdiVceDA1XHgwRlx4MDFpVjdceDk0XHhGQkxceEUwJFx4RkRceDlBXHhBRFx4MUIlXHhFNXZ2XHgxMlx4MDlceEIzXHgwRFx4MTVceEI1IyIsZlx4RDM+blx4QTVceEZCXHhBRFJceEJBO1stZlx4MTRceEYzXHhCNFx4MTV1aGRceDk4Plx4MTNceDkyLXRyXHg5RWNceEEzQ1x4ODVceEYybC9ceEM4XHgwQVx4QkMrR1VEYWJceDAyRFx4MDBceDAwXHhDQlx4RjdceDBBXHhGM1x4ODVceDlBXHhFMThRMVx4MEZceDhFXHhDRFx4OTZceDlEXHhBM1x4MDhQXHg4RklQXHhBQVx4MTVceEU0XHg5OVx4QzBceEE3XHhDMVx4QUNedVx4MDhceEZGZXBCOFlceEQzXHhBRXRaa1NDJFx4MUIiXHg4N0lceDg3XHg5QVx4OTJceDlFXHhFOVx4OTdceEFEX1x4ODdceDgzXHg5OStceENEXHg4Rlx4Q0JceDE4XHhDQ1x4QkNceDdGI1hceDBDXHg4NWZtXHg4NFx4RjlceDlGTFNfXHg4OFx4RkZceDAxcSswXHgxRFx4RUJceEQyLE5ceDFEXHgxQVx4QjJceEI0XHg5OFhceERDXHg4M1x4RUVceDAwfVx4RENceEVBPVx4RDE7XHg4OFx4RTRceDgxXHgwQlx4MTdMWlx4QjRceDk0XHhFQVx4QkZceDk2YmBceEZCOjJceEEyXHg5NVx4REJceEE3c1x4MTFwXFx4RUNceEM3XHg5Q1x4RkF0XHgxMVx4QjdqO1x4QTdVSVx4RTNlXHhBNCJceEQ5bVx4OEZURVx4QkZtXHhGODRceEEzIVx4OEIkXHgxMVx4RkNkeEFceDkwXHg4M1ZNXHg4MVx4ODFceEQ1XHhBNlx4MTIgXHhGQVx4MUZceDA4SVx4QzRceEJDV1x4QjlceEU4XHhEOVx4OTkvXHhCRFx4RjBTXHhBREhceEQwXHg4RFx4RTVceDgzXjdEXHhCRVx4RjVceERGXHg5MFx4RDNQXHhGOVx4RTA4JFx4OUNceEJCXHhDNV08XHhCQlx4RERceEQxbFx4QkVceEFGXHgwRVx4RkZceEM3XHhFNlx4QkNceEJCXHg4M1x4RkVceEJCXHg4MnRceEMzSkVceEMwXHhERVx4MEJrXzJceEUwcSxceEQwXHg5M1x4RDg4XHhCNlx4RjBceDk4MFx4QUNZXHhDRGpceDg1XHhCMlx4QzEjXHhCRFx4REVceEUyOjNceEY0Q1x4MURRXHhEMFx4MTdceDg0XHhBMlx4RTZceEJEXHhENUtceENDV0RceEE1XHhEOCUyXHhBRFx4QUZceDE0eFx4RDFceEIyVnNeaVx4QUIyXHhEQj5ceERFXHgxN1x4RUUvelx4Q0ZceEZDXHhGQlx4QUNceEY0XHhDMlx4RkVceEQxXHhBNFx4RjE7XHhDMFx4MTdceEM5aiZceEFBXHg5NFx4OUN5Xz96XHhEQ1x4RUVceEEzXHhDOFx4MTJceDAyK2xceENBXHhEMUpceEI2XHhCRkpceDlFXHhBNVx4MEVTOCBceEZEVFx4ODJceEMzXHhBRVx4MEJceEZDWlx4OThceDlEXHg3RiNJc3tceEE1N1x4OTZceDA3XHhERCVceEFGWlx4Q0FceDhEXHg5Qlx4RjFhXHhFMlx4MDFceDdGV1x4RThceDA0XHhBOFx4RkMyei5HXHhBQSNceDE2Lz5ceEI4XHgwRkdceDBDb3YqTlx4QTM9YFx4MUIyWFx4OUNceDBCXHg4Rlx4MTZceDE5XHhDMWRceEM2XHhGQVx4ODctM1x4QjZzXHhBQlx4RjVceEEwQCpZXHhCMWlceDhFVVx4MUFceDkye1x4MTZceDA5XHgxQ1pceEUxXHhCNFx4RUFceDk0TVx4RTR6WCcpXHhFRCkoXHhFRC02QVx4QTk3K1x4RjVceEM1XHgxRlx4RDZceEY2XHhGNCdceDE4ODBceDk4XHhFNlx4MENceDk0XHhCMlx4REJceEYyXHgxNnRceEU1Ylx4Q0VRXHhDQVx4QzhceEY1O1x4ODZceDkwXHhGOFlceDhFUFx4QjBceEREXHg5MDhceEMyXHg3Rlx4RjFceDkzIWtceEFBXHhEN1x4QUVceEI2XHhFM1x4QTdceEUxXHhENlx4QjVceDdGMi1CRFx4MERqXHhBMkRceEE4XHg4Mlx4MURceEEyXHhCQ1x4RkFceEU3LVx4RTFceEQ5XHg4RHhceEZGXHhGOFx4RkZceEQ3XHhDRktdXHgwM1x4ODREXHg5Nlx4QTM4PFx4MTJkXHhBN3JWXHhFQygmXHgxNFx4QjUjXHg5NG1XXHhCQ1x4QkNceDBDXHhBMEFNQ2o3SVx4QjJceDgzXHhGQVx4QkRceEZCU05pXHg5Mlx4MDJAKVx4QjBceEI4XHhFOFx4RkJceEEzXHg4M1x4OTVceEJCXHg5NWtceDlDXHhCQVx4OUZceDhFXHg5N1x4OEJXXHhFRFx4RTRceDk3e1FceDg4OHlGXHhEMlx4MURvXHhEMXRceEI4XHg4NFx4MDFceEE0XHg5NW9ceEExXHg4Q2E2XHhBRlx4REJWXHgwQ0FIPlx4MUZceDBGXHgxQmZceDA3XHhEMlx4QzZceEVGS1x4QzFUPidwIVx4RDZceEU5XHhEOVx4OTFceDg5XHgxMXZceEI0PVx4MEVceERFXHhGQlx4QkYrK2lceDk2XHgwNSlxXHg4NVx4RDhceDA5JVJceENGXHg4QlNceDFEXHg4Rlx4RDJ3XHhBRFx4QkFceEI0XHhERVx4ODhceDk1R1x4RUM2PVx4QTNgXHg4MmtceDg2XHg4NiN3XHhBQ1x4MDMyJlx4Q0ZceDAwWFx4MDdvU1x4QzJOXHhGN05ceDg0XHgxN1x4MTknXHhCOFx4RkRceDE0XHhCMVx4QjNceEM2XHhBMVx4QjBNTlx4RjBceDk2XHhFMWVceDlGXHg5NVx4MDFaXHhDQ1x4QzMwXHgxOUZ5XHhGRF9ceEVFIVx4Q0VceEUxZlx4RTRceEUzXHhCQ0BceEY4XHhDQVx4MTFceDBEXHgxRmVceEU4WFRceEJEXHhDNChceEI1XHgwMVx4OTRSXHhBRXRceEQwXHg5RVx4MDRceEUyXHg5My95dEFceEFCXHhGRFx4QjY8XHgwQlx4QzVceDg0bFx4RDFceDFGWWRBVFx4RDhceDBELTVceDFDJ1x4RkM5dVx4MThceEVBTWxceDBDQVx4QjhceDk5IVx4ODVceEVFXHhFRFhceEREXHgwMjlceDg1TEg3XHg3Rkp5XHhFN1x4QkVceEZBXHg4RFx4QjFceDE3XHgxRj5ceEQ5XHg4NTwqSlx4QzRceEFEXHg4OVx4MDBceEIxXHgxOTZceDlEXHhFMmJuXHhBMlx4RjFceDk1XnNceDBCXHgxM1x4OThceEZGXHhEOFx4MDZceEY3XHhGOFx4QTJceDBGQG1ceENEXHg5RVx4RDZceEY2XHgwNExjXHg4Rlx4RTRceDE4XHgwMFx4MDZceDFFdVx4OTdqXHhBOVdceEQ5am5maVx4MDVfXHhCOUtceDFFXHhCNDJceDk5XHhGM0lceEVFXHhDQ1x4OURceEVEXHhEM1x4RENceDFDXHhGMFx4RDE5IEVceEQ1RVx4Q0JceDg4NlJceDhBIFx4QkIjXHhCRlx4REVJXHgwREZxXHhFMFxceENCeU0kXHg4Mlx4RjJceEM1XHhEMlx4Q0VceEQyV1x4ODVceEY1XHgwNFx4QjdceENBYFx4Q0VceENBXHhBQ1x4Q0EwXHgwMVY3XHhFMFx4QUJceDEzXHg5OFx4QUZceDE2KHh9JF9ceEZBXFx4QTFceDhGXHhEQlx4QzhceEI1XHhCQyRceEZBXHgxQVx4MDlwXHhBMChceEY0cVx4QzBceEMwXHhERFx4Qjl4XHg4Qlx4QkYxeVx4RkJEcFx4OUNceEIxXHhDOGpceEM1anVpXHhENDNceEY3aT1ceEY5Plx4QjJceDg1XHhGODBceEMyXHg4NFx4ODhceDEyNVx4QkFZXHhCRmhceDhEL1x4Q0NceDE5XHhDMSlceEM0XHgwQVx4OURceDgyXHhFMVx4OUVAXHhBQkJceEQzXHhENjtceEQ5L1x4RUFceDFGXHhCQVx4ODZIXHhBQ1x4ODAyP2lceEI5XHgxN1x4REZceEYwXHhBRFx4OEFceEY5aFx4QUZceEFCXHhBOVx4Q0JEXHhCMVx4MTVceEVCXHg4Ml5AXHg4OVx4RENceEQyXHhBMFx4RjlceEMxPmdTXHhDRFx4RUJceEE1XHgxQW1ceEM2XHgxNFx4MERceENEclx4RjYyOyp+IVx4QUFceEU3XHhBMiwpXHgxOVx4RURceERFXHhBQyBZXHgxRSJceEZBVFx4RDdceDlEOVx4MERceDE5XHgxRF9ceDA4XHhBNFx4OTVceDkyXHg4Rlx4MDNbXHhBRFx4MEFceDFGJVx4MTJceEZCXHg5N1x4QjV+XHhDMVx4RkI9XHhGQS5ceEJEXHhBN1x4REJceDE1clx4OUM7XHg5Qlx4QTZUXHhDQkhceEJBXHhCOUM+by5YXHgwQzVceEUzXHhFQ3dceEQ4NFx4QkZceDk1XHg5QVx4RjZYXHgxQ1x4ODRiXHg5QVx4QzI8XHhGNFx4QTFceEZBXHhGOFlCXHg5OVx4OUJceEZEXHhFNFx4QTBceDEzXHg4Nlx4OUVceDk3XHgxMFx4RDlCMlx4QzErXHhDQlx4QjV8XHhEMFx4QkRceDgyXHgxOFx4QjhJXHgwQn5ceERFcVx4RDVceEE1XHhERktvXHgwRD5tXHhGOVx4MTdceEU2XHhGRFx4OTNRRmlceDg5XHgwMVx4QTN+Y0RceDdGb1x4QTRceDFGPiZceEIwSFx4MUJceEY4X1x4MUZceEM3eXdRXHgxQVx4MDVceEFEPSh3PFx4OTFceDg5XHhEQVx4QTBceEU5RFx4MDlSXHgxRlx4QThceEIzK1x4RDdceDlDI1x4MDZqb11ceENDQFx4MDZceEE0XHgwRFx4RjhceEVCSVx4QzhceDgwXHgxRlx4QzdceEExXHhCOFx4RkVLXHhERj5ceEJGXHhCRCtBdFx4RTZceEEzPVx4RkN9eVx4QThceDgxXHhGQVx4RDZceEVBXHgwMVx4MDJceEM2XHg4Mlx4RjZceEM3d0hceERGXHgwNiZceEE3XHhFMVx4OTdxIFx4REJceEM2XHgwQi5ceDA4XHhCM1x4RkNceENBXHhCRFx4OUZceDA0Ulx4QjFceDE5OVx4QjBceEVGXHhENFx4RThceEQ2XHhGOExceDhEJ1x4ODhceDBFXHgwMylvOVx4QzRceEZCXHhGQ1x4RENceDAzXHhENVx4QTlceEI2XHgwQVx4QjlceDg0Qlx4QkFceDFBXHhDME42XHg5Mlx4MTB3XHhFRFx4N0ZceDhBXHhFRlx4RkYsXHhCQ1x4QUZceEMyPVx4QkVceEU2XHgwQlx4OTFceEZFXHhGQVx4OTd6XHg5Rlx4ODdceDA1XHhEQ1x4Q0VceEQwQUtpXHhFRFx4MTRceENEXHhENlx4OEJceDA0XHhDMlx4RUVceDBBaFx4QzRceDFDXHg5Rlx4QzRceEFFXHgwQlx4MDlceEJGXHgwN1x4OTU9QHNceDExcFx4MEFceDBCXHhBMFx4QjNSP0BxXHg5Qlx4QjRIXHhCRFx4OTB8R1x4RkFceDg2JnRceEFFXHhCRFx4RjVxcVx4MUFceDEzXHhCNVx4OENceEVBXHhBRHgsXHg5N1x4MThceDAyZjs0cFx4REFceDk3XHhBMDJceEVCXHhBN1x4RENRXHgxMVx4QkJZbFx4Q0I0c0dceEFEXHg5QSZceEE3anZceDBFZFx4QTRceDEzW1tceERFXWc3XHgxQ1tceEU5XHhGOVx4RjBceDk0XHhERlx4MTYsXHg4RFx4QzJceEY1XHgxMFx4MDRceEY1XHg5Q1x4Q0FceDg0XHhCQVx4QkRIOVx4OThceDlFXHhFM0RceEM1XHhERFx4MUJceEFEXHg4NDdceEJCO1x4RjQiL1VceEE1OTImRFx4QkZceDFCXHhERVx4OENceDk2Ml9ceEEwXHhERlx4MER7aFx4MDBceDkxXHhENlx4OEVceDkwbDdlXHhGNVx4QTJceDEwUFx4RENceEQ1XHgxRFx4OTNceENEXHgxNVx4RDRceEYwYVx4QkNceEM1XHhCNlx4OTh8dWdYXHgwRlx4RkFceDgwdFx4QkZceERCbFx4QjZOXHg5Nlx4MUQiXHgwQlx4QjhceEUxIFx4ODZceEQzRVx4REUoXHg4QUoiXHgxNFx4OTBceENGXHg4M1x4QzJVXHhEMVx4QTBceDk4ZGJceEZEPEZaXHg5Mlx4QTZ+XFx4ODdceEZFXHg5NCBDP1x4OTJUXHgxMyBeXHgxM2kja1x4REJ3XHgwQlNWXHgxMUNceEUwdlx4QzJyb1x4RjBceENDXzNceDE5XHhCMVx4QjZceDA5Y1x4RjNceEI2J1x4RTNceDE5XHhCQ1x4MDlceEFFVVx4RDNWXHg5Q1x4REFceEQ3XHgwN1x4QkFceEIwXHhDQVx4ODZMcFx4ODBceDkyT1x4RkN3XHgwRlx4OTJceEFFXHg4OFx4RkY6XHgxMypceDk2XHgwNFx4QkVceERFalx4MEVceDBDXHg4RVx4QTVceEY4XHg5OVx4QjZceENBXHhBRlx4OTBceEMxXHhFMlx4OUZ1fE9ceDk3XHgxMFx4REVceDAwXHg5Qlx4ODRceDkwZVx4RTJceEU3bFx4OTZceEVEXHhERFx4QzNceDAzOlx4QTBceDhCflx4QjFceEU0XHgxMDxceDhGalx4N0Z1Nlx4RTdceEE5K1x4RUZceEE2XHg4OFx4MDc8K1x4QTJceEFCXHhCN31ceDgxXHgxMFx4RjdceEEwMXpYXHhDMVx4MTNeaVx4RDNceDA2XHhDMVx4MThuXHhFRjRceDg5XHgxNFx4MDRceDBFXHgxRlx4ODVceEEzXHhCQVx4OUYwSEZceENBTkNceEEzcFx4OUNceEI2XHgxOVRceDg2XHgxNlx4OTRceEZBXHhCQkxceEZGSXRqXHgwNz9ceDE3XHhCN1x4QzRceEI3XHhCRlx4QkFceEMyUVtceEMxL3d+XHhDNyNDXHhEMHdPXHgwQVx4RkVceEE4XHhDNVx4MUQpdmFCXHgwOFx4QTBLd1x4RTdceEZCfFx4Q0JMWF5ceENEXHhFNVx4RkZlXHgxNTxceEU5XHgxNmNceEE1XHhBMy1ceDBDZSRmYFx4QjBceDAwXHg5NzdceEY4XHhBQ1FceEU0XHhCRVVMNlx4MDVceDlGXHhERlstXHhBNmZceEIyXHgxRVx4MUE2XHgxM1haXHhFQVx4RUUiXHhFMUVrIFx4QkVceDE0emBceEUyXHhERFx4QjVceEQ0XVx4QUF2Vlx4MEMqQ1x4RUVceEREXHhCQVx4REVceDhCXHhGNlx4RjFceEY2d1x4QkZgLFx4RjFceEM4XHgwMVx4OTlceEMxXHhGMlx4OEZceDg5YmxceEE3U1x4QkMhXHhGNFx4MTUnXHhCMDlEZ1x4QjBoXHg4QXtOXHhFQ1x4RjRnXHhGM1x4OENceDkzXHhDREVceDhEXHhEQ1x4QTJceDk5XHg4MjlceEZBXHhGQlx4RERceEU3XHhGMFx4OTdceEVBXHhBMFx4QUZceEQ4XHg5QWlceEZFNlx4N0ZceEYxKkt8XHhFOVx4MDdceEU3XHgxMUlceDlBZVx4QjFceEY3LFx4QzZceEFFXHhFNVx4QTJceEQzXHg5Rlx4QjlXXHhENS8wSmZceEVFJUFceDk1XHg4Rlx4OThceDkwXHgxQSspXHhGMlZceEI2V1x4OERkXHg4OVx4MDF2XHgwN1x4OTVceEI2XHhCRVx4MUFceDgyV1x4QzN9XHhDQlx4ODB6XHhCOWtceEMyWS4tWVx4QTNceDExOVx4RDNceEY2XHhCRVx4RTRceEQwXHhEMTJceDA0PVx4MEZceDA3XHhGRlx4RjVceEYxJ1x4MEVceDkyXHhDMWBceEFCXHg5Q1x4QjBzW1x4MURUXHhGMXN+XHhDNlx4ODZceDE5XHhGNFx4QkVceEMxKX1ceEZDXHhGM2Y/R1p2c1x4RTRceDg2QEY+UyBceDEzXHg4OFx4MTFceDlCXHhCOFx4Q0JceEU4fVx4RjFceEVDXHhCRFx4RUZ3XHhDMVNceEI3XHgxQzZceEU5XHhDNmZceDFBXHhBMlx4QzlceEY4XHgxQVx4REFceDA5XHhGOFx4QzRceDFEXFx4QzFceDg1XHhCQlx4MURceDE4XHhERHNceEVEdUUgXHgxOVx4RURceEYzXHhGM1x4RTU3PVx4QjFceDkxXHhBMEtceEEzXHg4RFx4Q0VceERBXVx4Q0M8a1x4QzZceEY4Klx4OTZceDg4ZnB0XHhBRmdceEY2XHg4MVx4QTFceEEzXHgxNlx4RTFfXHhBRFx4N0ZceEExS1x4MDVceDgwX1x4RjVceDk3UElceEJEXHhFNFx4RjVceEFEXHg5NHFiXHhDRVx4RDNceDEwXHhBNVNceEEwXHgxNlx4RTFceDBCXHhBNVx4RDFOXHgwRnwtXHhCRVx4REFceEQ2XHhCN1x4QTRzRFx4ODNceDkyOVx4MUZceDFDW1x4Q0JceEVDXHhBNlx4ODExNUlceDk3aVx4OUYlXHg5NFx4QjdceEVEXHg5OVx4QjlceEUwXHg5QyZXXHgxRFx4OTNceDBFcSxceEU3MFx4MTRaXHhDQzVceEQ1Y1x4ODdcXHhCMnwjU1x4QzRUY0dceERBXHhDOCImR1dceEY3XHg4MFhceDBFTlx4QzVceDEwM1x4QjdCXHg4Nlx4QjRceDk0Y1x4QThrXHg5OVx4QkFceEM2O0NceDAyNCtceEMzMHdaPVZceDg2Zlx4QzRceEM0XHgxQVx4QjlceEZEbVx4Q0ZceEZEXHhBRlx4OUZceDlFXHhCMSZceEQwblx4Qjc3XHhDRGFceEE4XHhFREFceEI3XHhFMVx4RjdceDFBXHhDNHpceEMxPUdceEJEXHg4Q1x4QTBxaFx4RkJceEU4XHhCRVx4RENceEQ0XHhGM1x4RkNceDEyXHhERVx4MThjXHhBRFx4QTBceDA1XHhCMFx4MTVceDg4XHg4RHZceEVDXHhCMkFcXHg4Rlx4RkVceEEwXHgwRDEmZ2xFXHgwMVx4RUZceEFEXHg4NEQsXHgxRlx4OTUtXHhDQ3pceEU1XHgxRFx4QjZceEFGXHhFQVx4REF4XHhEMFx4RjJceEQ5Z1x4RDlceEQxXHhCMntTNSdceDhFXHhBNlx4RERceEM3XHg4RW5ceDkyLVx4RkVlK1x4QUFceEVGUFx4QzJceERFXHg5OVx4MDltXHhCNShceDg4XHhCMFx4MThRXHhBMFx4RjdVfFx4OUJceDA4XHhGODAoXHhGM1x4RTJceEEzbFx4QzBceDhDXylceDA4XHhFQnxceEUwTFx4ODRIeVx4REVceEQxXHhENUNeXHhDM0dceEJEVlx4RkZceDg1U1x4ODE0XHg4Qlx4RDY3R2JceDk0XHhDODpceDBDXHhERFx4RTJceEU1XHhERFx4MEVceEREXHgxNVx4QzVceEM1XHhBRVx4MUJOWztceEI1XHg5OFx4RDBceDE5VC5ceDg3XHhBNFx4QzRceDgxdFx4RDZceEI0XHhEM1x4ODgsXHhENVx4MDNFLit1XHgwNllceEJEXHhGM0lceEM0L3VceEY2XHgxMlx4RjBceDE0XHgwQlUqQGJwXHhFRFx4MTgzXHhFQlx4MUNSKl56XHgwN1x4QkEwalx4MThhXHgxNVx4RjlceDFDXHgwRFx4MUQtXHhCRXtceEQ2XHhDMlx4OTA6XHgwRVx4OTY7XHg4M1x4ODRceDlFXHhGQlx4RDFNXHhGQVx4MEZtXHgwMicgfjBceEYxXHg4RSJceEEwXHhFOGlrSlx4QjJceEI0Tlx4QTcmZlx4RTZceDg5XHhFNVx4RDFceDFEXHg5MmxceEY2T09ceDgwXHg4Q1x4N0ZIXHhCRlx4MTghJnJceDE0XHg4M1x4MDBceEY5bU5ceDg5MnVceERFXHhFOVx4RDJceEYye29ceEFBaVx4RURceEJEXHhGQn0rTXQiQVx4OEZ0XHhGRVx4RjRceEE2MFx4REFceDg5NXxceDlCXHhGNXhceEEzMVx4MDQ8Qlx4MTZceDhCXHg5Nk1ceDlEXHhGN11ceDE4JjM8XHg4MXxceDA4XHhEM0RceEE3XHg5Mlx4RjlceEUxXHg4NXdceEZEXHhBNlx4Q0JOXHhCMlx4RTJceEFFXHhCMWhceDgzXHhCN1x4MTJceDhGXHhEM1x4QkNceDFFXHhCRF8qXHhFNlx4OENceEQ2XHgxOVx4QkFceDlEXHhDNihuXHg4Nlx4RjRceEFGXHgwMDBceDA3XHhCOVx4REVceEMxXHgxOFx4QzdceEVGXHhCMjo9XHhERDZoSVx4ODRceENFJVx4RThkXHgwQlx4RUVceENFLnNRXXtceDE2XHhBOGJYNVx4QzRceDg2OUZceENEXHhFOCxceDEyXHhBOVx4MTdceEVEXHhFRFx4RkZ5XHhCQlx4RkE3Y1x4RjFceDlDZkJceEVBXHhGM1x4RDdmXHhFMlx4OTFcXHhBMVx4MEFkXHhFMjVceDBCNVZceDk0XHhEQjlceEU4NVx4Rjk7XHhERFx4QjlceENCcDhceEJGXHhGRlx4RkNceEZCcSEwdiRceEM0MFx4QzFceEUwXHhBNk9RL1x4QjBceDg4XHhDQVx4RTBgXHg4Nlx4Q0JceDhDXHhGOVx4RjhceDExJ1x4MDNceEE1XHg5MFx4QzdceEQ2XHhEQlx4QzUqXHgxMVx4RTVceENCXHhDMFx4MEVQXHgxQVx4ODc6Ulx4QzRceEMwXVx4RDhceEE2XHhGNVIpXHhGRlx4OTZceEMzSiNceDE0XHg5OVx4RTdkalx4QzBceDAwXHgxM1x4OTFceEE0XHg5RVx4QjclYlxceEE4clx4OUJceERBM1x4OTdceERBXHg5Q1x4RTBceDkxXHgwNy9ceDEwXHhDRlx4QjZceDA5XHhEMFx4ODggPVx4ODY6XHhDQVFnXHg5RGtceEY3XHhFQ1x4ODFceDA0XHg4NVZzXHg4MkltSlx4QzcjO1x4ODZyN1x4MDE5eV5ceDk5XHhCRVx4Q0FceEUyXHgxQVx4RUNceDE1XHhFM11ceDlCXHhFMXAtXHhDOFx4RTYoPFx4Q0Z1Z0ZceEQwdnNPOlRceEZDXHhGMFx4RDlceEMzXHhBQVx4MTVceEEzeShceDk5XHhEQVx4Qjlvclx4QTlceDAzXHg5RVx4QTAxXHhCOS8oXHhCRFx4ODNceEJEXHhFMFx4MDVXXHhBMVx4REUmXHhCOFx4RkUgNz9ceDBGRltceEEyXHg4QVx4QkJceDg0MVx4REVceEZGPDdceDlBXHhFNVx4QjdceDBGXHhDMWFceEVCXHhDQ1pceEU4KVx4RTlcXHhCNFdceEMzXHhGNVtceEUybyBceDFGXHhCRFx4RkY1SFx4MEFeXHhCMlx4MTNceDlCXHg4MFx4MDZceEZEXHg5OVx4OTZceDBCXHgwNlx4RjhceERFXHhEMFx4RTBhSlx4QjFceDk1XHhGMFx4RDJceEQ4VFx4RUFceEIyXHg5QzVceEQyXHgxNF9ceEUxXHhCNFx4MTZceDhGXHgxMGFceDA5XHgwN1x4MThceERBVlx4MEVceEVGXHhGQlx4REVwYjVMP3ZceEE2XHhFQVx4OUVceDE4ZEo1XHgwOFlceDdGXHgxN1x4OTdrSSl8XHhGRlx4RjZceEZBXHhBRFx4QzJceDBBXHg5Nlx4REJceEZCXHg4M1x4MTNceEExXHgxMFx4MURydEJzXHgwRFx4MTZceEVBeVx4QkNceEFGRlx4MUFceDhCXHg5RT1ceEFCTlx4QkY3XHg5MVx4RThceEY3W1x4ODJceEUwXHhBNHRceEUxXHhGNVx4QjRceEM0XHg4MHBceEVCI0kwXHg5MFx4MThceEIzSlx4RDc/XHhGMFx4Q0VlXHhEQ1x4RjhceEUxXHgxMFx4QTJceEI4XHhEN1x4MTVceEY0XHgxN1x4OThceEFBXHhEOFx4MDF1XHhFNVx4MDNceDk5XHhDQz9ceEI5XHgxQVVceDg5XHgxMFx4RDIsXHhCRVx4MUVceEZFXHhBQjYgXHhDN1x4RUU+K1x4QURceDk0XHhBRlx4QTI0XHgxOUJceDBDUVx4QjJceEE0XHhFNz00XHhFQVx4MEJceDE3XHhBNFVceEY3aVx4QURceEFEclx4QzVceDBGXHhCRVx4ODBceEUzNlx4OEJceDkyJFx4OTVceEQ3XHhCQVx4RTQzXHhFMlx4RTdceEQ2alx4MDJrXHhFNlx4QTNceEE5Mlx4RUNceEFGXHgwRHYhXHgwQlx4QkRceEZEXHhBRVx4MENceDE5XHg5RERceERCWlx4RUJceEIwXHhGOVNZfFx4REJceEY4XHhCNkFceDhCXHgxQlx4RUYgXHhERVx4QjRceERDXHgxNVx4OTdceDBBOlx4MUYuXHhGNjc9XHg5NHtceEI4XHg4QVx4MDJceDBCXHgxQ3dceEU1Nlx4RENLdlx4RDRceEJCXHhDMEpzXHhCOFx4OUIpOVx4Q0F7XHg5MG5zXHg4Nlx4RUVceEVEXHhDOVx4MEVVIDdceDEwXHg5Rlx4RDZiNVx4QTZceERDaGRceEJGXHhDRVx4QTlceEFFXHhENjFtXHhCRFx4OTdyUmBceEZEfVlceDAzXHhGRVx4QUFceDE0XHhCMWZceEY0JFx4OEFceEI2W1x4Q0NceDk5Zlx4RkJjbGxceEYzKlx4MENceEQ5XHhGQlx4OUJceENEVTBceEREXHg5RVo2XHhBM2dceEM2Rlx4QThCXHhBRFxceEFEOFx4Q0RceEY4XHhCRlx4RThkbVx4RjhceDgzXHgwOVx4QjFZXHhDQWN1Mlx4QURceENBXHhBNWo6XHhBQiFceDBFV1x4Q0ZceDBCXHhDRFx4RTVceDFFXHg4Nlx4QTVceEE3Vlx4RURwXHhGM1x4RTdceEMzXHg5ODlceEJEXHhCRUhceEU1XHgwQVx4OEFceDA3XHgxRlx4ODNceEZGXHgwQTw2XHhERVx4RENceDAzfVx4RjVceEZEXHgwMlVceEVEXHgwMlx4RkZNXHhFMm1ebH50XHg4RVx4RTZFfE43Q1BceEEwLlFiXHhFMVx4QjEzUlx4RkI5XWdbXHgxMy1dXHhFM1dCXHgxNThceEM0XHhGNlx4MDRceDBCXHhDN1x4OEFsXHhBN1x4RkNMK1x4RDEuXHgxOCxceDFCNlx4RDg4XHgwMl5Rblx4RUJceEFFXHhBRXVceEU2XHgwRlx4OTNceDFCXHhERiJceEIwXHg4M1x4RTNceEFBXHhDM1x4MDVceENDXHhGQkhceDE3bXtceEJDXHhCNltceDkwOF1ceDAxZFx4OEEoXHg5RH5ceDhBXHhBQ1x4ODdjXHhEM1x4MDc5T1x4QkNwLEFceDhBKS1ceDFDXHhCNnhceEQzXHhEQy9hXHhCNVx4RDJceEIwXHgxMVx4MDJBM1x4RTBceENBXHhCRlx4QzFceDg4XHhDNFx4MUNceEJEXHhCNDh2V1x4MEVceDFGXHgxNlcrXHhGQiVceDgzXHgxNyBceEJGXHgwOSNJOFx4QTNceEE5Olx4RUVceEMxXHg5NVx4OTFceDk4XHhGRTQ5XHhGRVx4QTlceEQzXHhCNFdceEIwXHhFNG1hXHhDM1QgXHg4N1lceEEwXHhEM1x4MUZEXHgwNlx4MDVceEI5XHhDNFx4RkYqeFx4RUR5XHhGMyEyXHhGQ1x4RDBceDEyXHhDN2dceDhFXHhDN1x4MEY/XHhBOVx4OUFceEUxYlx4MEJceENETCNceDBDWFx4MENceEE3XHhCMlx4RTZceEM3XHhGMFx4QzgkZ3JceENBXHhBM1x4QkJceEQ0XHgwNlx4MTMzSCdceEJEN1x4QUJceEIzXHg4NVx4RDlceDA0Slx4OURceEUyXHg5NE1ceEM1XHhGMFx4QjdVXHhFREdceERDXHhCQ1x4ODJcXHg5Q1x4OEFsP1x4RDJceEI1XHgwMVx4OUZceEEwKGtceERGfkZceEE5XHgxOF9ceEYzNlZLXHhEQVx4OTJceDEyflx4REFceEQwdihceEFFc1x4RjBceEM0XHhENFx4RUVceEY2XHhCMHliXHgwQXBceDk5XHgxOVx4QTdNXHg4NmFceEQ0XHg4Q1x4RTJceEM2XHg5MVx4ODVceDlCJVx4RTlTXHgxNEJceDlCXHhCRlx4OUZceDgzXHhDOVx4RUZceEQ4XHgwRVx4MEZLXHg5Rlx4QUI+XHgwQ0VceEJDXHhCQnVceEE3XHgwME9ceDE3XHhDMVx4MThceDk3XHhFMVx4OTlceEVDXHg5MiVceDBDXHhBNVx4REJceDhEXFx4MUZceDhDXHhEMVx4ODhceEM5XHg5QyZceEE1XHhENVx4QkZceDlCcVx4N0ZceEE3XHg5M1x4QTJceEFGTVx4ODFceEUxblx4RjhceEUzXHgwNVx4OThceEE1XHhGNVx4OUUiLVx4MDNceEY0e1x4OTdXXHg5QVx4OUZceENCXHhFOEsqXHgwMlx4OThceEU2XHhDNHlceDBDXHhGOVx4MDBxXHhDMFx4RTlceDhBXHg5MXRceEQwXHhGOFx4RURZbFx4REZ+XHg5NkZBXHhBNFx4MUVabixceEQ5Nlx4QjVceEQ3VENLXHg4Nlx4ODZceDg5Z1x4QUVceEJBTTFceEU4YFx4RDNceDBBXHg5Nlx4RkJceDE0XHhCMmJAXHhBMklceEY0XHhGOU1ceEEwdmlceDFDXHhGODFxXHhBNXl4bXRceDAzXHhGRFx4Q0RceDk5XHhCMXpceEQ2XHg4OVx4RUJceEI1XHgxOFx4QzlceEYyXHg4NVx4RkVuXHgwOFx4OUJuXHhBN1x4REZceEEwXHhBQVx4ODZceEM0XHg4NmhceDlGXHgwOV1vXHgxMHdkSlx4OEQ9XHhDQVx4RUNYXHhCRmpceDAyJz5GUFx4RUJpXHgwNjpceDg2XHhCNFx4RjFceEQxI11hXHgwNFx4N0ZceDg5XHg5MVx4MDBceEVGXHhCNVx4MDBceEY1XHgwNFx4MTlceDFFXHgxOWhceEM3LFx4OUVpRVx4OEZceEJCXHhGOD1YXHhDOVx4MEFceEI5XHg4Qlx4QjlceEE2QFx4RUJceEU1XHhFM3A+XHhEN1x4RjBceEZGOVx4ODdceEI1XHhFQ1x4RDNceEI5XHgwOSpEXHhFN1x4RTZceDA1XHhGOEpceEY4XHg3RlBceEJFOE1ceDA0XzdAXHg4Mlx4RkZceEE1XHhDMVx4MURvanpkLFx4QjZceEM1XHg5MFx4OERceEIzL1x4RUFpXHhERVx4MDFceEM3XHgwOVx4QjdceDBEXHg4MXFceEE5XHhGNFx4QzZnc1x4QzNceEMzXHgxOFx4MENvXHhENVx4ODdYXHgxOTdceDA2XHhEQlx4OEJceENEOFx4ODdceEY2XHhEQVx4QzZceDk3VFx4MUVceDg5alx4OUZDbFx4MEVceEM4Ylx4OTZceEZFW1x4Q0ZNUlx4MDVceDFBXHhBM1x4QTRceENBXHgwRFx4QThceERGXHhGOFx4MDhceEMzalx4REVceEQ5NVx4RDFceEJCXHgxMWBceEJEXHgxMnNceEVFXHg4M1x4QTRiVVx4QTNceDBBXHhFNVx4OERceDgwSyNceDg4eVx4MTVceEI3XHg5QmFaYFx4MTlceEIxL1x4RjFceEZFfVx4RjBceEQxXHhBNVx4RUJaOWhceEIzXHgwMlx4RkM1XHgwM1x4RDhceEVEXHgxQ1x4OTFceEQ5XHhCOVx4QzRceEE3XHg5Rlx4QTFceERDXHhBQVx4QThvXHg4Q1JceEJFXHgwM1x4RkZceEQ0XHhFOGl4XHhFRlx4QTdbXHgwMlx4QzZceDlGXHhCM2VceEQ3XHhBMlx4RUZceDEyXHhFN1x4RENJI1x4MUFLXHg5QVxMXHhCQyBOXHhCNVx4OEJceDlEKlx4QUZceEREXHhDM3hceEJEXHg5Nk5ceDE3J2JceDEyPlx4QzFFXHhFN1x4REFceDE0XHg4NVx4RjQ7Wlx4RERceEVGXHg3Rlx4ODhceEFDXHg4MFx4RjlceDA1XHhBOVx4Q0VceDA1Ni1ceENES1x4OTF8XHgwNFx4QjRceDE2JFx4QThceEI4XHhBQXZceDA2XHhCM1x4RjJceEQyXHg4RVx4RTIkY1x4QkRceDlFXHg4RFx4QTBceEM5XHgwOCBceERDQShceEUydFx4OTlceDFBSlx4MUZceEQ4XHgxRFx4MENOXHhFNVx4RjJceEI2XHgwMVx4REQyXHgwNVx4QzRceEQ5XHhCMlx4MEVceEMyUFx4ODVceDgwXHg5RFx4OEVbXHgwNlx4QzlceEFFXHhDM1x4Qzl8Vlx4MTJceEQ3bC5JXHhFOGpceEM3XHhBRVx4QzJBXHg4N1x4QkUzXHgxNFx4MDVceDhDOCpceDFGXHhGNVZceDFCXlx4QjdceEVCXHhBMT1ceDE1P1x4Q0VceEJCXHhFNFx4QjNceDAzamFceEY4XHgxRlx4RjBceEQydFx4RjhceDk1XHgxM1x4Q0ZceDBGXHhCQlx4MTFceDE0Wn0jXHg4Mmo/RFx4Q0JceDlGcFx4RjZceEJFXHgwRmJFdVx4OUVceDkzRVx4QzgyXHg4MVx4RThceERFXHhFN1x4MDVceEMwXHhFNy9ceDg5KzhceEU2XTdpNCZceDBEXHg5MVx4QzVceEFETi9ceDgwXHgxN29lXHhCNFx4QUFceDA2XHhDNVx4ODZceDAzXHg5RVx4QURceENGR1x4QTlceEY0enZceDgyRVx4RjdceEFCXHhDRVx4QjNceEEwXHhENlx4ODRceEQyXHhBRlx4OTFceDlCbStceEQ4XHg5RTBceEUxXHhFOW1ceEFGPFx4QjJHXHhFOVx4QUZceDBCXHg4NVx4QzlceEUzXHhGRFx4MDhceERCL3V5ZFx4RTlceEJCXHhGQlx4MTZzXHhDQW8tXHhCMlx4ODlceDk0XHhBMVx4RTVqc1x4REVdXHhCRVlGczxhXHhERCBwblx4OUFceEFDXHhGOTxceEMzZ1x4RTIrXHhCMFx4Q0FXXHhGMCZceEJGXHhGQlx4MTZuU35ceEM3UVx4QkRceDgyXHhFRFx4MDVjW1x4MUJceEUxXHhCNVx4RjVceEFDPFBceEU1XHgwRlx4MThkXHg5RFx4QjEiXHgxQVx4QjRXXHg5NVx4ODNceEY3bVx4MTM2XHhCQktceDk0XHhGOCpDZlx4MDY1XHhFN1x4QTUpXHgwN31ceEI2XHhDRGlhNTJgXHg4Q1x4MUVceDAzXHg5OHFceDA1XHhENVlceEU2XHhDMkpDXHg5N25ceEMyXHgwMztceEEzT1x4QkJceENFU1x4QTI2XHhFMGwiXHhBRFx4OTBceEQyZFx4RjlceEExXHgwN1x4OTJceEMwIXRceEM2TFJeXHg5OVx4Rjh1aVx4RTFceDg1XHhEQ1x4ODY4XHhBQipceEYwYVx4OTNceDk5eXJceDA0cVx4QjYhXHhBRTdceDBFQ15ceERDXHhCQ1x4RDZceEI2XHg4N1x4ODRceDgwaWMgXHg4QzBceEQwXHg4OTBceDg2LDRceEREXHhDNFx4QURceEZGeFx4QkZceENGXHhCMVx4RTBceEFBe1x4RDdhXHg5OStYXHgwRVx4REZceEREXHhBRFx4ODZceDA4XHgxNGRceDBEc1x4RTZceDgzXHhGRVFWXHhCM2Y4XHhFQVx4OEZceEZFXHhEQ1x4RTRpXHgxRlx4REVceEZEXHhCNVx4ODVceEU2LWpceEE2XHgxNlx4QjFYXHg4Mlx4RERceEVGLFx4REE4XHg5MFx4RUNceEY3XHg4M1x4MDFSXHhBOGFcXHg5RFx4MDdceEREXHhFMVx4RjJceEQzXHg5ODJyLFx4QkNceDEyIVx4MTNceEYyXHhFNUVceEVCPVx4OEZdXHg4MyZiXHhBQlx4QUZ2XHhEOVx4MEJlXHgxQlx4RDlceDAxXHhBRFx4MDlsOlx4QTg/XHhGMFx4QTJceEI1XHg5OFx4QTFjXHg4QjxeXHhDNWZCQVUtOVx4OTl4flx4Q0JbXHgwQT1ceEFCd1x4OTJceEQwXHhGQlx4MURCSFx4RUZceEY0XHg5NUAuXHhCM1x4Q0ZnWlx4ODVceDEyXHhFMVx4OUZceDg5UndFXHg5Mlx4Q0RceDg2I15ceDBCblx4QzhceDEwXHhDNFx4MUZceEQ1XHgwMCpNNV9ceEM4Llx4RjhceEI1XHgwOFx4RjM/XHhDN1x4QzBceEM1Qlx4OURceEE1XHhGQ1x4QzVOZVx4MTZceEFFXHg4N1x4MTdceENBSlx4QzVfXHgxNlx4QTVceDE2XHgwQlx4OEZceEU2NVx4RUZMdCpWXHg4NXtceDE1OClceDhCXHhFOFx4QjJceEQ5XHg4NFx4RjVMXHg4NyRceEQzXHg4OF5ceEQ0eEdceEYzXHhCMlx4RDNceEExXHhFN1x4QUFceEREXHg4Rlx4RTRceEI3J1x4OTJceDA1XHgxM2VBXHhGNVBceDg5XHhDNVx4REVceEVFT1x4ODRceDAyXHhFRVx4MTFhXHg4NVx4RERQSlx4RDFceEYyXHhBMVx4QzhceEFGXHgwRFx4QTQoOFx4MUZceEQ2ZylceDFFL1x4QTNqXHhFN1x4RDFceEIxWkpMLlx4QzZPZVx4RjBaXHgwODlceDA5Vlx4QzBcXHhDMlx4ODFceEMxOlx4RTkrZFx4RjNceEUxXHgwRVx4MThceEYwXHhDRFx4ODkvXHhDOUdceEE3XHg5RX5RXHhEMVx4QzBceEM3XHhDQlx4RDFceDg1YVx4RUJceEE4XHgxNVx4RDVUXHgwQU0yXHhGQlx4MUNceDdGUklceDA5XHhEQ1x4QUFceDk4NGlceEE5XHg5NVx4RTFceEQ0XHg5QShceDE3XHhCMlx4ODJceDEzXHhERlx4QTNceEJEIlx4QTRceEQ5T1x4QjNceEYyXHg4NVx4ODdaKVNXU1x4QkIiYlx4MERceDFCXHhEQmJceEZBd31ceEZCXHgwMlx4OUNeXHhCNVx4MDl5UVx4ODJceEMwcVx4OENceDA1OS1ceDE2XHgxMj5qTXxceEEwXHhEOFx4MURceEExRVx4QzVceDk5XHgxNlx4MDh4XHhCMVx4MUZceEI1XHgxRFx4ODFceEQ1XHhGOGFceDgyXHhBQ1x4RDlceDA2XHg4RVx4QTJceEYzLlx4QzdceDE1XHgxMFx4RTNceENDXHhDRlx4OEEoXHg4Mlx4RjRWTFx4QUVceDlBNlx4QzZceEI5KFx4OTkpXHgxRilqXHhGOVx4RTF6XHhCQi52XHhDN1x4RkRceERGdVx4QjNceEY2Jl9xRFx4QTRceEU4bE9ceDk0XHg5RFx4RkJlXHhBOVx4ODFbXHgxRlx4QzJceEYzTVx4QUNceDhEMVx4RUYvXHgxOHpceDg4XHhBOUxhdVx4RUNceEY2XHg5Qlx4MThGXHhDQVx4RjBceDFGQlx4MTlceEQ5XHhGNjBUXVx4QTRceEVFXHhGNWVceEIwXHhBOVx4RTdceDAzU1x4RDJceDk2XHhBN1x4RUZ6YVx4RkRceEM2aFpceEIwXHg4RFx4MERceDgxXHhGN1x4QTVjXHhBMVx4RjJ+XHgwRlZYXHgxMVx4OTVceDBBYlx4MTZceDBGXHgwQkVceEIxc1x4OEFceEQyeFx4RjI7XHg5MnhceDk4XHhGNHcvLCNceDg3XHg5QjZmXHg4NDlJXHgxRVx4MTNTXHhDOFx4MUNceERFXHgxNlx4QzJkIldceDhGXHgxRW1ceDk0J1x4REFceEI3PiZceDk4WW9ceEE1XHg4RVx4REUkXHhDOFx4ODZceDlGXHgwNFx4QjhceEZBMUA2WE1ceDlDXHhBN1x4RTF0WFx4Q0ZceEQzJyYzMy0vXHg5M1tceEZBUlx4OURRXHgwRWNceEZDXHhENDprWjxceDgzU1x4RTUoXHhDN2lceEJBXHhBN1x4QzNceDBEXHhBMVx4ODUiXHgwOGpceDAyXHhBMUpceDFGXHhCMEBceEYyVk40XHgwMlx4RUJPXHg4QzJceEI2a00qJVx4MDgyXHg4RXFrU1x4OEZceEQ5XHhERFx4QUJceDg3Z1x4Q0ZceEMxXHhFQ0E9XHgwRlx4RkRceDgycE9ceEFFS1x4RERvXHhDRlx4MEFceEI3XHhBOVx4MDdceDBGXHhDN1NceEY1dlx4OUJ7P2pceEU4XHgwOFx4RTNceEU3XHhGQ1FbXHhCMlx4ODJceDk1NFx4REVNXHhGRVx4OThceEYyXHgxM1x4RkVceEVDU1x4MDRqUFx4OTZ4Q1x4RDhceEFEXHhEQ1x4QTc/JVx4QjlceDgyXHhEMXJceEU4XHgwQj9ceDAwXHg4M1x4MTJceEVFXHgxRlx4Q0M8XHhGNVwpPlx4RUFceDFCUVx4Q0RceDEwKV1bSFx4ODlceDkwXHgwMVx4RjdceDkxVVx4MDRceEY5XHhENWRceEQ5I1x4QkNceEY4a1x4OTI4Jlx4REVceDdGTVRuWVx4MUVKMHNceEUwcXNceEE3XHhCMl9ceEJBXHg5MFx4RDFUXHhFN3dvXHgxOUFceEY5L1x4RDhceDBBIFx4RTBceEVBXHgxMVx4RjN4Nlx4QjZceDgxXHhCQURceEZCTkFceDg1XHhERi5ceDAwXHgwM1Z8XHg5M1x4RTcpXkhceDkwXHhGM1x4OTNceEE3XHgxRlx4MDRceEE5dFx4Q0VceEJCXHg5MUJceDFGN1x4REQ1XHgwNEpceDk0XHg4Q1x4RjNlaFx4QkJceEM0XHgxRVx4RUNceDE5Oi0wXHhGRlx4RkNceDEwK0k4XHhCM1x4RDIoalx4QzdceDlGXHg4ODlWXHg5Qlx4Q0VceEY0LFx4RTJceDlGbCZceEI1N3QlWE5iR2dceDgyXHgwNlx4MThceERDfWlceDkxVlx4ODJCXHhFQVx4RTZceDgwXHhGNlx4Q0NceDFEXHg5RVx4QzZceEVFXHhGNGVlMlx4QzhceEI4XHhDNVx4Q0FceEZCXHhFNUtceEU4XHhGMFx4OUFceDFEbSZceEVBIERceDgxKFx4QUZ3M1x4QTVHXHg4NHpLXHg5MnwtXHhEN1x4MTZrKVx4QTlYXHhENVVceDk2VFx4Q0RceEFCRipceDExblx4RjZceDEwXHg5Mlx4QjVceDAyflx4MDNceEQ3XHhBRnlceDdGXHhGRFx4OERceEYxXHhFOVx4MTRceDhBLFx4MTNceEI0IFx4REVceDg0XHhBN1lceDhBXHhDM1x4RUNceEUyXHg5OW17XHhFN2ctXHhFOVx4QTZrXHg5MShceEE4XHhDMiNceEE1XHg3Rlx4QjVceDBEXHhEMVx4RDNceDg0ZFx4MTlceEJCXHgxOVx4RTh6XHhDM1x4QkRceEM0XHhGRCZceDE4XHgxM1x4RkFceDg2XHhBMVx4MDclXHgxOFx4Q0JceEY4XHhGRVx4RkVceEQ0XHhGOVx4QTRceEJGJF9ceEI0eFx4QTRkWlx4QkVceEI2XHhGOFx4MTllXHhEQVx4Q0ZceDlBXHhFRXxceEU3XHhGQ1tceEI1MVx4MDdceEQ1XHhGNlx4RjQ3XHhCQlx4MDlceDlGXHhFMWRceEVCXHg4RVx4QUZceEVDXHhCRiRPXHg5MStceEE1XHgxMkI3XHhCOXNceEQ0XHhCOFx4ODZzc1x4QTMhQTZlXHgxNDNceEI2XHhGM1x4RkJ2XHhDMCZceEQyXHhENyN8XHg5NCVceDgyJVx4RkVceEI4VFx4RDFTXHhBRFx4OUNceENBXHg4OVx4QjhceEI4XHhBMVx4OTRceDE4XHgxRHpZWFx4RThtXHhGRTJceEYwNnlceEU3XHhGMlx4QzhceDEwXHhEQlx4REM2Mlx4QTQiXHhBMlx4QzBhb1x4MDdceEZFXHgwOFx4REVrK1x4RTdceEYxb1x4RTlceDhGXHhDNXZceDA1XHgxN0FAN1x4QkNceEZGdlx4RTJceEM0UVx4QzFceERGMGFceDg0ZVx4MUNceEUzP1x4OTZceDAyXHhENXdMXHg5QVx4RjJceEYxXHg5Nlx4QzVceEE5alx4RTVceEREYVx4ODZyXHhEQUFrXHhGMlx4MDdceEFDVlx4OEFceEZCXHhBOVhceDA5Xlx4RDdceDhCXHgwNipceEQ3XHgxMFx4Q0UzXHhEMUFva1VvXHhFQm5lXHgwQlx4MTFceEU1XHgxMlx4OTJceDEzIlx4RDhceDA5XHhBRWg/XFx4RDdceDFCXHgxRlx4QzdceDhBalx4RkVceDlBaElceEEyXHgwMlx4QjJceEY3eSJceDhGaFx4OTVceDFDeClceENGXHhGM2RjOmpceDAwXHgxRVx4RTFceEUzXHg5Nz1ceEZCXHgwOFx4Q0ZceDhDbVx4ODFceEY3XHg4NFx4MUJceDAzXHhDNWFWXHhERFx4OTFceDlFXHgxNFx4QjdceEUwXHgxM1x4MDZceDhEeG5VI1x4RUNceDg5XHhCMFx4RUNAXHgxRmVceEEwUFx4QzFceDA4XHg5MVx4MUQiIlx4QTFceEM2XHhBN2NceDFGI1x4OTdRXHhFRVx4QjVceEI2Olx4Q0NceDFEXHhCQVx4QzB6OVclNVx4MURceDEzKV9ceEQ1XHgxRFx4QkVceEMxXHhGN3VceEE5XHhBMFpJXHgxMVx4RjJBXHgwRElceEJFbUg0XHhEN1x4RThceDEzbyYjXHhGRFx4MTFceEQwLFx4REVceEQwPVx4QzZceDE4Xlx4QjAnY1x4RTFceDhGLlx4Q0RceDkxV1x4RkJwXHg5OFx4RjMvXHhBMlx4REVceEY5XHhEMVx4MTlFNVx4Q0MwXHhCOGNceDBFN15ceEEyXHgxMVx4MEVceDA0S1x4QTVceEU1XHhCNFx4MTJ8PFx4QjdceDE2VmFgXHgxM1x4QUFceEMyXHhCQVx4RTBceDkyXHhDMFx4RkZceDAzKWxceEVEXHg4Nlx4QjRLXHhENVx4RDNceEI4XHhDMFx4MEVydVx4ODhceDk4XHhBRlx4ODBceEEzXHhERnVceEI0N1x4RjdsXHhBMkxceERGXHg4MFx4QjlceENGanhceEYycU9ceEVFZjxceDk3ZFNceEQyXHhBOFx4OEZceDk5XHhFRlx4QThceEY3e1x4OTRceEYxXHhCNjR9a1x4QkY3XHgwNVx4ODlceENGXHhDMmFceEU3XHhGQydceEMwXHg4OFtceDEzXHg5RFx4OENceDlEXHhBMktceEUxZ0pOXHgxOSRGXHhBMmhmIXJceEQ2XHgxQz5XO1x4QUJceEYxZkJceEY2XHhGOSJceEE1XHg4MFx4QkVceEY4XHgxRjRceEM2XHgxN1RceEEzXHhENlx4RjFceEYxXHg4Mlx4RkFceEU4cVx4Q0ZceEQyXHg4N35ceEY1XHhENFx4RDFwXHg5OFx4MDAjXHhEQlx4QURceEIzInZJXHhGOUhceDA4XHhENVx4QzJceDg4Ylx4RDZLXHhCM1x4MUVNXHg4Mlx4ODNceDE4J3tceEU1XHhDOXQlXHhBNFx4REIzP1x4QUVceDE5XHhFQWBceDhFXHgwNz1ceDlCXHg3Rlx4RTNNXHhEMlx4RDFceEZCXHgwNmdceDg4XHhDRFx4QkZceDA1XHgxM1x4ODJAN1x4RTVceDAwXHg5QTMmNnwmczVceEFGeFx4RjkjXHhFOVx4QTZceDAxXHhBMV9kXHg4QVx4RjVceEYyJ1x4RjNceDFDXHg5M2o+O1x4RENlXHg5NVx4RTBceEI2XHhDRlNceEEzVVx4RjFceEIyS1x4RTJceENCPFx4RTlceDg5KSdceEJDXHg4M1x4Q0UvXHhGNFx4OThceEM4XHg5MFx4MUEoXHgxMC1ceDk0XHhFNFx4Qjc6XHhGRD1ceDAxR1x4OUZceEU4UFx4RkVceEM1XHhDOFNceEYxbF9ceDFCXHhCRUYuaFx4QTFceEUzXHhDNVx4QzhceDhDXHgxMVx4MDhceEVCXHgwRVx4MEQpXHhBNFx4QzhceEY0XHgwQVx4QjdceEM1XHg3Rlx4QkVceEU2XHhCRlx4MTBceDlFQVx4RjdwY1x4QzJceDg1XHhDM1Y4XHhBM1x4RkZceEE4MycpXHg4Rlx4RkFceDkwXHhEMmpceEU5bHFceDhFJFx4QjNceDg0XHhCRFx4QzhceEIxXHhBMVx4QjlceEREXHhGMSdRXHhERFx4QjJceEQwUWhebFx4QjBDOVNceERDXHhENGpKXHhDQ1x4OTFceDAzXHhGQ1x4ODdceEY2XHg5Q3hmXHhGNWNOXHhGRllceEM2XHgwOTFceEU5blx4QTJFZ1x4REReMFx4MEZceEFCXHg4QWBceEFFXHhENFx4QUZceEY1elx4QTBceDlFN3UtXHhFMVx4RjVIXHhCOVx4RjJceDkzXHhCOCJceEI4XHhEQSdUTVx4QzNceDA4XHg5Mlx4RDVceDk2XHhGNlx4RjlhXHhBN1x4RDNceDBCXHhDMFx4ODBceEJFXHgwQVcxXHhCRFx4QjhceEJGSjZrZ1x4MTBNXHhGNFx4RjJceDFFXHhBQVx4RjZceEUwTlx4RjBceENGXHhFMC0jXHhCN1x4RTEyXHgwNVx4RDJ2fXY7WTxzXHhCNFx4RTFceEI0QFx4ODRceEM4XHhBQytceEVFXHg5Q1x4OEJceDg0WFJceEUwSk57XHhBRVx4ODNceDA5XHhCN1x4ODRceDg2XHhFQ1x4REEhQlx4RTIhXHhFOFx4QkE6XHhDMVx4MENceEY2XHhFM1x4MEJceDFFXHgwRlx4MDlceEQwXHhGQlx4ODFzNlx4QTcuXHhBQVx4RjIlWilceEIyXHhBRVx4RkFceEEzXHhEQVx4RjZceDlFXHhFMlhceEMxXHhDMlx4OEFceEY1XHhCNlx4RjJceEJEXHhFN1x4MUZceERCXHhGRVx4MDFmXHgxQlx4QjRMXHg5Qlx4RjhceEUzXHhERlx4RUZceDlDXHhFNFx4OTRceDA0WkQ4XHgxNFx4QTNceEQxXHg4M1BceEVDXHg4NDN1S1x4MTlceDA5XHhFNVx4RTZceENEOFx4OUE4elx4RDlceEEzXHhBNlx4REVceEFGXHhDNiJceDFEMVx4QzllXHhBMVx4ODY9XHhFNXpceDg4THEwXHhERSZceDkzUlx4OUFceEU3XHhBNzpPXHhFMkFceDlCXHhEMF98XHhFM1x4QkIsXHhEMElceEQ3XHhGMFx4RkZceDhENVx4RjJnW1x4RkZceEFBajYnXHhEQlx4OTRceDk5XHgxOVx4RDQqS0lceEI2Vlx4REZceENGXHhEODdceDFEXHhGMlx4QUZceEMyXHhGMlx4MTRTXHhCNmNceEFFXHhDMiwoVnhJZlx4QkZceEQ2XHhDNHFceDdGXHg4OFx4MDVceENDXHhCOFx4RjZceDExXHg4NFx4RTlceEFBXHhCQVx4MUVceDBFXHhDQVx4QzQ1XHhDM1x4RTVceEExXHg4MFx4ODB8XHhBREZceEMyXHhBMSQyXHgxN29dMVx4QjVhXHgxMlx4Q0IxXyBceEI5PmtTWGFfK0NlXHhEQnNceEM1XHg5RFx4RkZceEQ4UVx4MDNceDFCXHhCQS8vXHhERFx4MTZceDg2W1FSXHgxQ1x4Q0YiXHgxMiNqV1x4QzJceEE1K1x4MUVceDlDXHhFM1x4RDZceEJFK1x4MTZceEE3XHhDRVlceDk2XHhGNVx4MDlceEE1XHg5OFx4Rjhpa1x4RUVceEUwdVx4QzhceEQ1XHhDNlx4RTQ8Wlx4QkFceDk3XHhBQlx4QkZceDgzQCJceEVGSlx4RTZ6XHhEREhceEFDXHhEQ1x4OTlceEY0XHhFMVx4MTVceENCRVx4OTZjPVx4RTguXHhGRlx4RDNceDBFXHg3RjdtPFx4OUVoXHhDOVx4Q0ZyZVx4RDJceDk5XHhEN0pceDg3XHhBN1x4RDdceEM1XHg5MVx4MERceDk5TFx4QzlKIFx4RjhceDFDXHhGRlx4RTcrNFx4MTFJdVpceDk2bFx4MTFceEM0XHhDRFx4RTBceENDXHgxMVx4RTB3NVx4MDZceERDXHhCOUNceEU3XHgwMWEwXHhCQVx4QURceDA4Mlx4ODVceEE0XHgxM1x4OTRceERCcFx4RDBceENBXHg5N1x4QjFceENBJVx4MUIsXHhBQlx4RDZceEJGbCBceEZGTVx4ODBceDE2XHhGNlx4QkJceDE5XHg4RVx4QTNnJ1x4RjlSSVx4OUZceDEwXHhFQlx4RjBceERENTJceDhDNVx4Qjh1XHgxOFx4QjJHXHhGMlx4MDZceDAwXHhGM0tceEQ3S1x4MTFxX1x4QzZceDk1XHg5RFx4QkZceEIzXHhBRXpceDhBXHhBNFx4RjNceEREXVx4RkFceDlGXHhGOVx4MTZceEQyXHhBMlx4QzdsXHhGOFx4OERceEJBXHhBNVlceDA3XHhEQiFceEMwXHg5QVx4QkJceEQ5XHgxNE9ceEE4UlJJcEFOb1x4RTdSTnZceEEyXHgwNlorQlx4QUJceEIxclx4ODJtXHgxN0xceDhCLFx4RTVceDE1XHg4OWVceEYwXHhERVx4MThceEQ5Vlx4QTNwXHhCOWFUXHhEM1x4QzFMVlx4MUNceEEwXHhBRFx4ODNceENFXHhDRFx4ODJceEIzXHhDNVx4QzNceEUzNE9ceEZDXHgxNUlWXHhGMTRceEZBP1x4QUNJXHgxMiVceDEyZmRceDBFXHhFMmdceEY0XHhCMlx4MUR1XHhBRlx4N0ZceEFGa1x4RjU0Ilx4RjRceDhGXHhGRFx4MUJceEREXHhFQlx4QzFceEEwXHg5MWdceEQ4SlgzMFx4QkZceDhBcFx4RkNceEIxNVtceEZBKVx4QUIxXHg4QVx4OTBceEJGXHgxN1x4QzNceDk2XHhEN1x4MUNceDlGXHgxNlx4RTFjcUg7XHhFQi1ceEQ1VVx4QTVceDEwXHgwOFx4REVceEZFXHgxM2tceEE0OkFlXHhGN1x4RjB+XHg5NFx4QURceEJET0FceDk1XHhCRXFceEZGXHhFMFx4ODJceDkyXHhGNG5ceDA2XHhEMlx4OTNLXHhEMnNceDg5XHhEM1x4RUZrXHgxNT85XHg5NVx4RTZceEQ4XEtEWVBJXHhEOVx4MUFjW1x4RTlceEMwV1x4OTNiXHhDNDQ3blx4OTkqdVx4QjFceDFBXHhERVx4QkNceEY1XHg4MXkxXHhCNFx4QTBceDFEXHhGOFx4MENceDgzXHhGQlx4RTYoXHhGQlx4RjlceEVGcFx4QTZkXHhGOVx4ODVQXHg5MTZ1XHhBNnNceEIwRFx4QzUyXHg5NVx4MTc/XHhDNUNMPFx4RDk+XHhCQ1x4QzBmaVx4OEJ8XHgxNFx4N0YuJVx4Q0NZXHgwNFx4OThceDBEV1khXHgwQ1x4ODBceERBXHhCRCdceEE0XHhDOVx4MTJceDExUVx4MUZceEQwXHhENlx4RDZceDA4Ri0ndFx4RjdceDA4XHhEN0d7R1RceEJBUVx4QTRceEE4XHhGMVx4RDBHOl1ceDhFMlx4OERceDFGXHhFOEkmXHgxMSJceDhCXHhDN1x4MDg9Vlx4MDhceEU5XHg4NFx4QjNceDhDXHhERVx4RERceEY3XHgxQTRceEY5MSlceEI2XHhGNERceEMzXHg4RnZceDkxXHhBQXBceDhEXHg5RS5ceEZBXHhEM1cnXHhCOVx4QUVPelx4MDJceEZELVx4QTBceDlEXHhENWRceDgxNjFceEREXHhGM0c1XHhERFJceDgyXHhEMlx4RjRceDgyXHhENlhceEI3PChuXHgwN2x5XHhGQi1ceEQ0bkVceDE5SDJceEFCOVx4QzU2XHhGNjhceEVGXHhFNyRceDk0XHhFMFx4MUVceEQxfntceEIyXHhEQ1x4OERQXHhEQjlceEQwXHhEOVx4OEZceEUzMVx4OTlceEVGXHhFRlFceDg2XHhDQ1x4RTNceDkzQ1x4REZceEEwXHg4QUlceEZBT1x4QTVBXHg5RXpceDkzfCdceEFDXHhENlx4QTdceEM4XHhFQlx4RTdceEFDXHhBMVx4MUZceEQ3XHgwNVx4RDkoKlx4RUFceEEyXHhDRFx4RjRceDE1XHg5MFx4QjhceEREXHhENVx4OENceEREXHg5M1x4QTdceDEzXHgwNzNceEQ1XHg5QS8vc1x4OTdceDFFXHhGMlA7XHg4OVx4RURceEQ5XHg5N1x4RjVceDgyXHg4RGxceDFDKCJceERCXHg5NVx4Q0ZHXHhDQVx4QkZceEREXHhEN1x4REZceDg0XHhEOFx4QTU4XHg4OVx4ODFceERFZVx4OURceEQzWE9ceEQzfmAmXHhDM15ceEVCXHhFOFx4OTVceEIxXHg4MFx4MDZceEQ1PF9ceDg2dFx4QjQnPFx4Q0ZceDE2XHg4MXBceDg5UFx4QjdDflx4QjRceEYwXHhCMFx4RDJceDgyTFx4OThEXHhDN1x4QTdWXHhDRVx4OTM9XHg4RFx4OTg6UFx4QjdVXHhERFx4MDBceEIzXHhENG1ceEJEdVx4QjNceEREXHhERlx4QjVceDBDOzNceDk1Vlx4QTRceDFGXHg5M1x4QTEgXHhDMlx4RkRceEY0XHg4MV9ceDlFXHg5Qlx4MDVceDE3XHhGN3lceDFCd1x4QTUtXHgxMilceEJEUVtceEVBM1x4ODRJIlx4MURceDkxXHg5OHZceEQwXHhGNENceEY0XHhBNFx4QjBceENFXHhEMVx4OUJceDE0XHhEMVx4RjJceDAzJVx4QzU/XHhDNlx4MDJceEExbVx4ODRceDlBXHg5Q1x4QUJceEFCXHg5QVx4QzhceDAyXHhDNVx4MEZceENCXHhDNFx4OUNceDFBXHhGQjFceDE5XHgwQ1x4QUFFXHg5Q2dceDlGXHhGNT9ceEM4Zi9ceDlDQ1x4RkF2Slx4RTRceEY1UFx4RkRceERBSFx4ODJceEYzQ2BceEJGWlx4Q0ZceEI3VVx4QUVyXHg4MF9ceEVBXHhBOFx4OEVyL1x4OTNceDk1O1x4MDQtXHhCQlx4OURRXHhFQT5ceDg5flx4Q0ZceDg0XG9ceDlCXHhEMFx4RjVceEZFXHgxRFx4QTBceDA4XHhCN1x4QkNceDhDXHg4RFx4ODVceEVGQlx4MTdceEZGXHg5M1NceEUxXHhBRVx4MUZceDEzKyAhKVx4OUR2XHhGQ1x4MEQuXHhFNChceDlFXHhEQ1x4OTNceDFFSlx4RERceDBETFx4RUZceEI0XHg5RndYXHhBOFx4RkNnXHhBN1x4QkFceDlDXHhDNlx4RUNceDA4XHgwMlx4MUJcXHhFN1x4QTJceEFBXHhBRVx4QzBkXHhEQ1x4RTZceERDXHhCN1x4MDRceEMxZVx4OEU4XHhEQ3pceDFGXHg5NVx4MDdceEFDXHgxOXxJXHgwMFx4QTdceDhEXHhBNVx4MTZceDg4XHhGQ1x4MDlceEY5XHhCMlx4ODFKZVx4RTFLXHhENVx4RDFceDFBflx4QURceEM2XHg5QVx4OENceEIyTyB2ZFx4QzlrXHhERFx4ODhceEFFXHhGQWdceENEXHhBN1x4MDNceDAxXHhFRVx4REJceENDXHhGMkdceERFXHhCNVx4MEIyXHhCQlx4MDNhXHhCQlx4RUFceDk4XHg5MVx4MEVceDhBb1x4QjVceEU0RVx4QURceDk5XHhDOVx4MDZceDk1XHhFNlx4QTgnXHgwQlx4MEZceEU3Tlx4MDdzXHhDQ1x4RjRceDFCXHg5N1x4OTdSXHhDQVx4QUFceDk2XHgwMm8sKVx4RDBceDEwXHhCRFx4MTRceEQ2XHhCRFx4QUY+MVx4Q0JceDlFb1x4QjlceEZCXFx4QTBceDhFXHhGMVx4ODVVXHgxMlx4QjNceEM4XHgwQVx4OUZfXHhDRVx4MTlvXHgwREpceDE2XHhDNlx4QjlceEY4XHhBNlx4RTlceDFEXHg5MFx4QzFceEQ0XHhDNFx4RTBceDgwXHhGMnIlXHhGQTdceDBBXHg5OHhceDFGXHgwMlx4RTNceEY5XHg5OFx4QzJSXHg4N1x4OENceEU0W1x4QjR3VVx4RDhGXHhCNnMtXHhFOVx4OTRceEZDXHhCRFx4MDh5XHhEM2skXHgxNkdceEE5XHhEM3dceEYwKFx4RTRuXHg4OVx4QzFceEU4XHgxNmhceEU0Xj1ceDgyXHhBMlx4RDlceDg3XHgwOVx4OURceEMyXHg4OFx4QzJfXHhDRmZceEM2XHhEMFx4OUQ6XHg4Rlx4Qzd4XHhGQUhceDA2LFx4MDFdXHhFNVx4RUNceDA4XHg5Mlx4MTNceEI2XHhFQVx4MTNceDE3XHgxN0hOR1x4Q0RceEU2XHhCQVx4QUQsXHhDRFx4QjV2XHg4OFx4OTFBWV5ceDFEO1x4QzhceEQ1XHhCOXxYXHhERlx4RTdgc1x4MERceEVGXHg5MFx4RTFceEEzXHhDMlNceEE4XHgxQ1VcRFpceDlDUFx4RjZceDA2QVx4QUQ3XHg5RXFceEREXHhFNTRceEZCOWNceDkzaFJceEE0U1x4QUZceEIxXHhEQlx4MTdceEU2Tlx4QTBceEMxXHg4NnJceEJCXHg5RH1ceDA5Y1x4OTNceDg2XHg5Nlx4OTlceDhENVx4QTdceEQ4XHhDOVx4RkV4Klw6XHhFRilceDg1XHhDOVx4RTdceDFGXHg5QSVceDFBVFx4RERceDExXHg5RTxceDA1XHhFNVx4OTlfXHg4MnFceEI3XHhDRFx4RjdoXHhGM1x4ODRceEQyIzMubFx4OEU+R1x4RkMhXHhEM1x4RUJceEZDKVx4QjZceDlEXHhGRlx4QjNceEQyaVx4QjBceEJDeUIkXHhDRTpceEM1XHgwNVdceDgzMk9bXHhGN1x4MTc2XHhBM01ceEVCL1x4OTNceENEUlx4ODM0XHhDMlx4MENceEIzXHg4Q1x4RDVceDkzXHhERlx4OTBqSjZceEQxQm5ceDlDXHhCMFx4RkJceDE0flx4OTVnXHhEOVx4QTg0XHhBRVx4QURceEIzXHhEOF5ceEMwXHhCQVx4RjBceDA1d1gwXHhDNUBDXHgxMVx4RUVceEUyXHg5NVx4OTdjXHhERTshYmRceDBGXHhEM1x4QjhceDFBYTNceEY1XHhEQVx4OEFceEQ2XHhDNkpceDEyXHhGNlx4RTlceDE4XHhCNFx4RDdceDkwXHgwMkZceDExXHhDQ1x4RjhnWiRNXHhBOVx4QkZceEE1XHgwNVx4OTRceEMyNFx4RjkpXHg4RTtceDkxIFx4QUV3XHhENVx4MTlceEU1XHhGREVceENFWnlceDlESlx4RUVceDhGXiZMXHg4NFx4REVceEVEXHhEQVx4MTRceEMzXHhFOFx4QTBceEI3XHgxNWcqXHg5RVx4RUN2Klx4OTdceDAzXHg5M1x4REZyXHhBOVx4MDlceDE4XHg5OX5ceDE4aFx4MDhBRW9yPXRrXHhFM1x4MTRceEEwaTVceEYzQWFceEJGQ19ceEVEXHg4Mlx4RkFceEJEXHgxNVx4OUZceDE2XHg5MWJcXHg4Mlx4RjBceDg0XHhDOFx4QUJiW1RceDA2T1x4REZceEFCeVx4QUNCMlx4QTVceEI0eEJ0XHhDRG9HXHhGNFx4OEJGflx4RTl+XHg5NVx4MDBceDBCXHgwNFx4MTBceEE3XHgxRDJceEQyXHg4MVx4MDFceEYyXHgwRlx4RTZeXHhDRHRIXHhDRVx4Q0JceDk4UT9ceDk4VyZceEEyXHhBMVssXHhGN19zXHgxOWdIXHg5RUAtXHg5NjlceEM3LVx4RThceEVFdlx4OTlceDgwMFx4QTVceEVFXHhCOVx4QUVceDFBXHhCNjhceEREXHgxOF9TXHhCRGxceDBFXHhGNFx4MEJceDEwXHg4OFx4RTBceENBcj1ceDlBXHg4Q1x4RTZceDlBUFx4REVceDFFbnpceEQ1XHg4QVx4MDJceDk2XHg4OExceEI2Wlx4RkNHMlx4MDVceDk2JVx4MDhOXHhGQ1x4OUZceDA4XHg5N1x4ODlceEUwQT5ceDE5XHgxMlx4MTQsXHhCOVx4MDcqXHhFNnBceENEcFx4REY1XHg5RXZQXHhGMlx4OTFceEExXHg5OFx4RkZceEUwZ1x4QjVceDdGVlx4ODMiXHgwM3JceDkzRm11XHg5QVx4QzVGPUtceEYxXHhBQ1hJIWJJI1x4QkJceDFEXHgwOVRceEQyXHgwMEtceDhDXHhFQnFceDFBOS5sXHhEMlx4RDRceDgxKFx4QUFceEFGXHhCRjMwOWN6XHhBN1x4RDNOXHhGMFx4ODhceDhBXHhGQVx4QUF2XHg4NFx4RTFTXHhCOG9ceEI2XHgxNVx4QTFceDA3YVx4QURceEYwXHhFNjZceDA3RHBceDkwXHhCMjRceDhEQ1NObVx4QjNceDk2XHgxRlx4RDk1XHg5OVx4RDNDcypceDlFXHhGOFx4RDIsXHhGN1x4QUZceERDXHg3Rlx4N0ZceEVEXHhBQ1tFfnZceDk0XHgwMVx4RUJceEQwXHgxM3FceEI4XHg4Rlx4OUNceEQyZlx4MEZceDhDXHhDRFx4OEJceEZCXHg4Nlx4MTdceERBXHhCMFx4QjBceEZCbFx4RUZceEQ2dWNceEZGWVx4QTdceEJCMFx4MDMzaUpceDBES1x4MUFceEJFI1x4RTlceDkyVVx4OEVIIVx4MUVOYVx4MDRceDlBRVx4RTJceEQ5XHhGMVx4MENceDhGP1x4QjBceDBEXHhEN1x4RDRceDAyXHgwM1x4Q0JceDg5TSRceEE3XHg4OVx4RjhceDk5XHhCMlx4QjBCYlx4REJGYVx4RTZdXHhBNSdUXHhCNChceDhCTlx4Q0IoXHhBQVx4OEM0XHg5Qlx4RDBceDhCXHhBQ1x4QzJceENBXHg4MmpceEFEXHg5OVx4MDZceEZGXHgwM1x4MUU8Tz9ceDk0XHgxN1x4MTNceEI5Jlx4OEZceENBXHhBOFx4RDUsXHhFQlx4QkFceEE0XHhGRlx4OTUvWldceDFGXHg5Nlx4RDJceEEzXHgwN0tceEYzXHhFQVx4QTRceENET1x4Q0MjXHhBMFx4OTNceERFLCpOXHg4RVZceDlEXHgxRFx4MTRceEY5XHhEQVx4MUNkXHhDMFx4RkNceEUyeU87XHhCREVceDA5XHgwNVx4OTRUXHhGQWc6Tlx4MEJ0VVx4MTV3XHg4MmhceDEwXHhEQmM0XHhBMlx4QkRceDFCU1x4ODBceEY0XHg4MVx4Q0R5XHhDRVx4RDZuXHgxRFx4OERpXHgxNlx4OTJfc2pceEU5bS1nImQrXHhEM2lceEIxXHhFQVx4OTF8STJceDAyXmBceEVEXHhGNVx4RTFceDBGQ1x4QkFceEZCXHhDNVBTXHhCNFx4QjRceDEyXHhGMFx4MTJceEUyaEdeXHg4Qz51XHg5RVx4ODN3XHhCRVNuelx4QkZceEM0XHhBOVx4ODZceEQ1OVx4RTloJHR2XHg4Qlx4MTFceEE3XHhERDdceEYzXHhDNFx4QkJceDdGRVx4ODAnXHhFNlx4OEZceEE4XHhEMFx4QkRceEJFNkRceDhCN1x4OTloXHhFOVx4QjhceEU1XHgxQShceDhBXHhGQXpceEUxXHg4QzVFXHgwMFx4RDVSelx4RUFceEQwL1x4OTRNXHgwQXhtRXw2XHhBNlx4REJceEI4XHhCQVx4QUFceDBGXHg5M1x4QjBceEMyXHhDRmpceERCQGBuXHhDMFchcFhUc2JceENBXHhENSFceDFCSFx4MDEhZFx4OUVceEIzdlx4QkVceEY0biw3XHhBOFx4RTQmXHhEOWhHXHhGOVx4MEZceEM0XHgwNmVKXHhDM1x4QjY4aVx4ODlceDEwXHhBMnFceDAzXHg4N1x4RjRceEI1XHhCNE9ceEMwbFx4REUqVlx4MDNceDg0XHhFOFx4MDRVNFx4QTZwJVx4OEZGNlx4Qzk8XHhCRFx4N0ZceEU1dlx4MEZAQFx4OTFceEQwSz1ceDBBXHhBMEkyXHgwRUdceDAxRlx4MDVceDFDelx4MEY0XHg4N1x4OUIkXHhCM1x4OTA9XHhCQkxceEJDVlx4OUJceDBBXHhDMVx4RDBceENBXHgwRlx4RkVAb1x4REVceDkxXHhCNVx4RkVceERCXHhBMEpceEU4XHg5Ri5ceDg4W0BceEE3XHhFRVx4MDZceEM5Ylx4MERceEM5Y1x4QkFceDA3XHgwN1x4RERceEI3TFozXHgwQXMmXHgwMlJceEFEXHhDMVx4MDhceDA3XHgxMidBXHhCM2pNbFx4RDhcPlx4MUVceEJEXHhERVx4OUVceDlEXHhGMVp9XHg5OFx4QTcgXHhCODpATHdceEYwXHhENVx4RTQjXHgwNlx4QzFceEU0ZDlceEE0b1x4Q0FaXHg4MFx4ODVceEY3XHhCRVx4QTVdXHhFMXJRXHhBOSE0XHhFRFx4MERceDkzLFx4QkVceDk4Vlx4OEFTL1x4QUNFXHgwNFx4QjheJVx4RENfXHg4Qlx4RDdceDE4M1x4MDNceDFDXHhBNVx4ODU/XHhDM1x4RkFceEJFXHg5Qlx4OEZceDA1XHg5Qm9bXHhGOGxceDBDXHhGRlx4QzZceEEzXHhDMlx4RUFceDgwc00yXHg5QndceEQzXHhBOVx4QUQpXHgwMTxIXHg4RTNceDk4XHhDNlx4OERceEI3XHhCOVx4MTJceDE0XHgwNlx4ODA3XFx4QURceEYwbFx4RDFDd1x4RDNLXHhCRT9ceDA2XHhFRlx4RERceENDYUVceEE2XHgwMFx4QTFceEU3RFx4QzFceEJDXHhBRlhceDg3W1x4MUIwXHgxNFx4MTVceEZGXHgxM1x4RDFKXHgwNFx4OTZceDhFXHgxM1x4RUQrMVx4QTRceDEyRFx4RjhceEVCXHhFODdceDhBXHhDNEZceEREXHhGMlx4OUVceEI5a1x4QTNceEM4XHhDOVx4QzdceEZBXHgwMlx4Q0FceDE0XHhDOVx4QTdceDk5clx4QjdJdVx4QTI4XHhFMlx4RUJceEREXHhBOFx4MTNceEJDXHg5NixKXHhDMlx4MDJhXF1ceEJGXHhFQmlfXHgxQVx4RUJceEMzM1x4RTY4XHg4Q2RceEQ1XHgxOFx4RjA+XHhGOFx4MDJceDkxeVx4REZceEE4N1x4QkFyXHhCQVx4RDJceEZFXHg4OFx4RTdceDlGXFx4RUZceEMxXHhFRlx4ODNceEQwXHg4OFx4RUQrXHhGN1x4MDVLIlx4QzRceDhBentldWN4NGxceENBXHg5MFx4ODIkemtceDhCXHhCMT9LXHhDQlx4RjIxXHgxN25ceDhCblx4RTFceEFEd1x4RjVceEZFXHhERlx4RjdceENCXHg5RFx4ODRceDFCcVx4QkJcdFx4Q0ZNXHhEOFx4OEJqXHg4RUJceEZBXHhDRCFceEUzXHhGOVx4QTlceDkxXHhDQlx4REFceDA1XHhEOVx4QzhZXHhFMilceEYzXHhGOFx4QkNceDk0XHgwNXxceEI4XHgxNEtVYl5ceEFEXHhFRklhXHg4Nlx4RjFceDBBXHhBMCNceEIyXHhGNVx4RjQqXHgxMFx4QzVTXHgtelx4RUNceEM3XHg5OVx4RDVceDlESVx4OTdceENEXHgwOFx4RTMvXHhERD9ceDkwXHhDNlx4QkRceDhGXHgwNm5ceDdGXHhBQ1x4RjdWTFx4Q0FdXHg5Nlx4MDVceEE2TjYjXHhGQiNceEE0Nlx4RkZceENDUlx4QUZceDFGXHg4Nlx4RjkwXHg5Qlx4RjlceDEwXHhEQVx4Q0FceERCXHhBMnVKWjRceEJEXHgxNXlceEI0XHgxQjFceEVGXHgxRXlceEJDXHg4NFx4OTBceDk5XHhERlx4RjNceDkyXHg5Qlx4MENceEIzXHgxNVx4RkJlal5ceEQ1XHhDQ1x4RUVceDA2XHgwNz9ceEMzXHg5OCdceERCXHhDNS5ceDkzXHgwNFx4QzFOXHhDNVx4QURceDA2XHgwNmZbKFx4RTNceEI0PFx4MDdceEVDVVx4MEZceEY0aVRceEJFXHg4RiwpQFx4RENceEIwViFceEFCaFx4REZceEQ1XHhBQVx4RjAqVFx4Q0YjXHhENDxzNVx4MTdXXHg5Q31jXHhGNUJceEVELVx4Q0RceDFCW1x4QjVceEQ5XHgxOE5ceEMxXHg4NFx4QUNceDk5XHhFMHlceEFBdFx4OUJceENDQ1x4RjhceDA2XHhGMnJcIFx4RDVceEI4XHhEOCtfdiwnd1x4OEVceDBEXHhBQlx4OUF+alx4REE7XHg5RE4qXHgwRVx4QTRceDBEXHhEQlx4QjVQXHgwOVx4Rjc7YFx4OTBIKyNceEE0XHhDQmNceEQxalx4QzBceEJGZXFCXHhCOFx4QUJceDlDXHhGMSRceDA0XHhFNVx4OTlceDk0aTJceDk1XHhBNi5ceENGLFx4RTBceEIwXHhFRVx4OEFceDA0XHgwM1x4OTlceEYyXHgxOFdyXHgxMVx4QTNceDg1XHhFQVx4Q0VceDEwJ1x4QTJceEEzXHg3Rlx4OTJceDEzPVx4RkJceDk4XHgxRFx4ODFceEExXHg4MjZLXHhFN1x4RTdceEY0XVJqXHgwN1x4QjJceEEyXHg5NVx4MEZceEI2Vz9ceDhEcVx4QjhceEI3XHhFMFx4REEzYV9ceDg4XHhDQVx4RjNPXHg5Njl2XHgxRmoyXHhDQVx4MDk8M1ZOXHg5Qlx4RkVceEZDXHg5NFx4Q0ExXHhFMVx4QTdceDlCeV1ceERCX1x4QzhceDgyXHhBNFx4RERceEYzQFx4MEFRWGdceERGQHF9XHhGM1x4QkJceEYxNWQuXHhBNFx4MUZVXHhGODg8NWFceEYzXHg4Nlx4QkRceEY5alpceDkzYnpceDlFXHhENlx4MDZceEQ4XHgxQlx4QkYgXHhDM1x4MEVeOVx4OUVceENDUlx4OThUJCxceDkyXHhDM1xrXHg5Qj9NXHhENVx4MUVceEFDXHgxMi8nXHhGMGVceEZDSmRceEY5elx4QkZceDhDfVxceDBEXHgwNVx4OTBceEI3XHhDMVx4QjNceDgxXHhGNVx4QzBceEE4Sy5ceERCSlx4RDBceDE0NVx4RDBceDgwT1x4OUNceDAxbFx4MEVjUlx4OUVceEMxXHhEMUxceEFFXHhFMFZceDAzfkNceEFEXHg4NFx4RDVceDEyXHhDMFx4REJceDBEXHg5OStISlx4OTBiXHhEOFx4QkJceDFGWlx4ODlwXVx4Q0JjXFx4QkF1eVx4OThCU3xceEJGPSZceEEzSlx4RTcpXHg4MkB8XHhBNFx4RUFceDEzXHgwNFx4RUVceEE0XHhCMFx4OUY2XHhFNlx4MDlceDgxXHhDQlx4QTRceDgyfW1ceEIwXHg5OVx4QkVGcVZceEZFXHhCRVx4MTRceDhBX1RceEQ3XHg5Rlx4RDhceENDTlx4OUVOL1x4RDNceDA2Ilx4QUNceDhEM1x4RDZceDFBXHhEOVx4MTdceDk2KVx4QzRceDE3XHhGNFx4RjRceEZEXHg4MnRceDFGXHhDQlx4QTRlXHhCRG5ceDdGZFx4Q0RceEJEWlx4RjBceDBGOVx4QkNceEQxXHg4Rlx4MTRceEVEXHhGOVx4OTQoXHhBM1x4ODZceEEzb1x4ODJqXHhBOTtceDgxXHhBMFx4QTNceEYxXHhCQ2xceDg3XHhBN1x4QkFceDBCc1x4QjRceEEzXHg5MVx4MUIgXHhGNyZceDE4KFx4MDROXHhGRVx4RkRceEU0Qlx4MDhceEJCVFx4MDVceEQwTFx4QzBceDE4Slx4RTB2XHhFOFx4MDVjXHhFQ2xceDAxXHhEOFx4RkR5IFx4QTJceEIxcTMxOX1ceEQ4SVx4RUVceEIyMltceEVEXHg5NFx4MURceDEzXHhCOVx4ODZceEYyXHgwRGNceEQzWVBceENEWVx4RDVceEMyclx4MThgXHhDOVx4MEFXLlx4OUNrXHhGMUZceDlCXHhEODNceEY2XHg5NVx4RjRFSFJceDE5J1x4RUNceDlCXHhBMylceDFFX3BYXHhEN1x4RDJaXHg3Rk9WPE1ceEFBXHhGRV9YXHgwM1x4QzF9XHgxNjl1XHg4RC5QQVx4MEVMXHhENFRceDA5bCQrXHhCNSVceEJFY1x4QTZceEU1XHhFN0xuIVx4RTRceDk1XHhGRiZiXHhFNFx4RjFceDFGXHhERlJceEJGXHhDNVdceENDXHgxN1x4RENceEM0OFx4QzUgQXNceEIwLiFceDFGXHg5QSNceDg3XHhBQlx4RTNySlx4RDdceEE1XHgxMWdQL1x4MDZceDg0XHgwN1xoXHgwQ1x4MDlceEY0XHhEMFx4RDJceEYwXHg5NFAoXHhFRFx4RkFceDE2W0xceEZEOWBceEVERTNkXHgwRC5ceDk2XHhFOVZXXHhGOVx4MDVGJlx4RDdceDlFXHg5Rlx4RTBceEI2XHhEQ1x4QzNceDAxXHgwN1pceDA4XHhDRjI8Slx4RUNceEM3ezonLFx4MDc7XHhGOHNceEM5XHgwNShceDE4XHhFMFx4RUQiXHhCNUsqXHhBNjBceEE5XHhFNlx4RTJceEQ4XHgxRXJceDlFXHgwRlx4OERceDlDXHhEQ1x4OTRIZy15XHhERVx4QkVceDA5KzNceDlFXHhDQVx4RjhUXlx4Q0ZceDBBdFx4Q0RceDlGclVBXHhENVdceDk0bFBceEVBYDdceEUzXHgwQlx4QkMlXHhCQVx4MDlBcVx4QzNceDg1XHhGNFx4RkZceEVBIWlceDE0blx4QzNFXHg4QTdceEM2XHgxM1x4MDRceEM0XHg5RVx4QzlKXHhBQTY4XHhGMlx4RjhceEI5XHgwMlx4MEFPIFg2ZFx4MERceEUxelx4MUNceDkwXHhBRFx4MURceEJBMVx4RjRceDBEXHgxRVx4MEI6XHhBNVx4RUVceEM5XHhFQlx4QTN7XHgxQVx4RjNMXHhDQ1x4RDFceEMwRF5ceEQ1XHg5NT5ceEI0XHg5MkZceEI4XHhFQzZceERBKVx4MTlceDg2XHg4MFx4RkZceERBMlx4QTAiXHgxMnpceDgyXHgwRlx4MDhceEYwXHg5M1x4RjBceEFBXHhBOFx4RTI0XHhCM1x4OTV7b1x4QzJceEE2cVx4QUVceEE5djhFXHhEM1tceDEyXHgwRTFceEMwTlx4QTB8Vlx4QkN8XHhEMFx4QzhceEQxXHg5NTA5XHhGRDIgXHg5RVx4QjBceEFFXHg5MiJCXHhEMFx4Q0JceEFCXHhERFx4ODVceEVFLVx4RTBBN1B9XHhCRVx4REJceDg1XHhDQnZOXHhFM3o7XHhCNFx4QTE+OFx4QTlceDg1aFx4MDlceEY5XHg5Rlx4Q0ZceEVBKVx4QTBceEI1NVx4MENceERCXHhBN1FceEY3XHgwRVx4RTFAXHg4NzZSXHhFOGs4XHhBN1x4RDZceERGXHhBNFx4RUVCXHhGNVx4QjFceDE5XHhGMlx4QTJceEZEXHgxRGNceDk4XHgxNl1DXHgwQypceEI3XHhGRVx4RDY8S1x4RTFceEUyXHgxOVx4REYvXHg4Mlx4RjJceEJBXHhFNnknXHg3Rlx4OUFqXHhERFx4ODNceDBFfVx4RTBceEUxXHhDNVlCXHhDQ1x4MDNLQVx4ODRceEI5XHgxMFx4QjFceDk3ZzNceEUzeVx4OTdzXHhFRjhceDk3K1x4QjMsVVx4RkNceDlBXHgwNlA5LlVceERCXHhEMktceEQxXHg4RVx4MDQtXHhENlx4MTBceDA2VFx4RUJgXHhFQ1x4Q0Q/XHg4MVx4MDJDZVlceEY5XHhGOS5ceEMxWVx4Q0FHUFx4QjZceDkyXHgxQlx4QjFIXHhEMFpAXHhDOF59XHhBRERceEE2Qlx4MTBceDBEXHgxNlx4MTBceERCXHhFMVx4QjNceEI3XHgxRjdJeVx4OTNceEUyJiosblx4RkM2TFx4MEJhXHg5MihceEVFKFx4OUNceERDXHhBQzZQclx4OUN8SFx4QUJceDFBO1x4MUVceEE1XHhGQ1x4MTlceDBCXHhGRXxceEJBXHgxM1dceEUwXHgxRlx4MENceEY1U1x4MDFceEM3dFx4QUZEXHg3Rlx4RUFGKlx4QUJuXHhCNVx4QzdceDkxXHhDOEpceDg4XHgwRmpceDgxXHg4NFx4RDBceDBGLWRceDg0IFx4MUZceEYydk9KXHhBQidceDFCXHhEQUxceDA2XHhEMFx4RkFceEJDTVx4OTBceEREP1x4QkNceDBFXHhGMVx4N0ZtUVNceEM4XHgxMlx4MDBceDE3WFx4RkNceEU1RjBceEVGXHhCMFx4MTdceENBTVNceDE3Qlx4OUNceEY0XHg4Qlx4QkJjXHhERlx4OTEwXHhBQ1x4QTJzXHhCNDdceDA3XHgwRVx4Qzd4R2hceDlFMitceEFBXHhEOFx4QkNmXHhBQ1x4QkZceDk3XHhBNWNceDA5XHhDMFx4MDZceEYxXHgwNmlceEI2XHgwRW1WXHgxN1x4Q0RceEY0XHgwRFx4OUJceDE0XHg4N1x4OTdceEE4fVx4OTJceDlCXHgxMlx4RUJceEFEPFx4REVceERFXlNceDlCXHhBNlx4RUJceDFDLV5ceDE1XHg5OFx4QUNYXHhDQVx4Q0NceDg1XHhENVx4QkNceDgyXHhGOFx4RDFceEIyXHgxMlx4OEF+ZD9ceEYwXHgwRlx4QjY0XHhFMVx4RDhxXHhCOFlPXHgxMTNceDEyXHgxRXBceEE4XHhFRnVceEExWlx4RUFceEVDXHhCRj0nMFx4MTdNRFx4OTBceDk2XHhFMFx4RjBceEREXHhCRjhYWzRceEIzXHhCMXpceDBFXHg5MFx4OENceEE0NVx4RERceEE2XHg5OE5ceEIxWGRjXHhFRXxJJ1x4QTlEXHhCNlx4ODFyXHgwRmpceEQ3XHgxRUU9XHhEN35ublVceDk3XHhFNVx4MUJceDk2YzlceEI0XHhCMyRceEQ5Y0RceDBFK1x4RDJ4WShuXHhEMFx4REZceEQyXHhERFx4RDBceDgzXHhFN1x4QUVceDAwXHgxMFx4RUQkXHhCRVx4REFceDAwXHgwQ1lceDAxXHg5Mlx4OThceEI1XHhGN1x4MDAzXHhCMHNceEQyW0ZceEMxMFx4MTlceDAyIVx4OEVceEUyXHhDM189NkZPRjtceDA1XHgwM1x4RTZceEEwVlx4MTNceEJBN1x4QkRceEI4XHg5N1x4QkEqXHhCNFx4MDZgXHhFRGRceEIzTlx4RUNceEEyXHgxQ1x4MDNceDg5XHhBQVFceDBFXHhCNyNceDk2XHhEM0tIb1x4ODRceEZEXHhEQmUrN1x4QUVceERCXHhDRFx4RThWXHhFQlx4RjFwamdFNVx4RkRUXHg5OUJceDEwXHgwQlx4OEZSTSlceEU0XHg5M3pceDFFNVx4Q0QhTFx4RTlceDE2UzdKVVx4RDdUXHgxMlx4RjVceEE5XHhCMlx4OUJceEQ5XHhGOFx4QUJceDg5XHhEMlx4QjVsXHg4N1x4OEVceDBGXHg5Q1x4RkJGXHg5QVpCXHhERVx4MURjVk5ceEUzeWRceDhGd1x4MTdceEU1R05YXHhFOVx4QTdceEU2XHhDMSRfXHgwRHtceDAwXHhEMlx4QUIzXHhCOVx4QjBceDAwXHg5OFx4RENYXHhCQVxceDkyWVx4RjhceEU0XHg4QVx4RUFceEUybXFTXHgwNStceEFGXHhDM0VceEQ0XHgwM1x4RDVceEJBNlx4QjNceEZBXHhBQlx4RkNceDE3XHg4MFx4MTgtXHhCNlx4RkEgXHhGQ1x4RTVceEIzNVx4QTFceDFCa1x4QTBceEExKlx4QUJceEMwXHhBNGskXHhCQU1ceDlBYlx4ODhfXHg5OFx4RDlceEZDdzJMXHhBNlx4RDVHXHg5NFx4OTlceDFFXHhCOF5ceDA1bFx4Q0ZNVV85XHgwNlx4MDZceDg2XHhENVx4MTdTXHhFRVx4ODNceEZBalx4RjFcXHhCMVx4RDhceEUwU1x4MEJceEExJipceDhEXHhCOFx4OTFOX2RceDkwIFx4ODBceEQ3YGFceEJFXHhDRlx4REVceDdGXHhCQSFGTFx4RDRceDk2XHg4RDJceEJDXHg4MVVceDAzXHg5OVx4OUF0W11ceEREXHgxMFx4RTk/XHhCRnwmJVx4MTBXalBceEZEInVceDgyXHgxRnxceDg5XHhFQlx4QTNBZ1x4QTdceENDbDQ2XHhCOFx4RUVceEY3XHgxNFx4MDFceDA0dlx4OEFceERFXHg4N1ZceDEzXHhBRT0mXHhFMFMsXHhBOVx4QjVkXHg5Qlx4QTl+XHhDMl5sXHgxMntceDAyXHhGMFx4MDc7XHhGMFx4MUZceEQyXHhENFx4RDlceEI5U1x4RTNceEI2WlVceEE4XHg4Mlx4OEFceEIyXHgwRUx8XHhGMVx4QUVceEUwXHhCRVx4OTBceEZGUnhceDExZkRceDk3XHg5NFx4OThceENBXHg4Nk0wXHgxN0NceEFGU1x4OTZceEI3XHhBQVx4OTBceEFCXHhENFx4QjJceEZGXHhDRFx4RUJceEEzN1x4QzJceEVDaFx4OTlceEI2XHhCQlx4QUV4SlpII1x4OEFqTlx4RDB1XHhFRTU3eEpceDA0XHhCNmJeXHhFRD9ceDhGdlx4OTFceERBXHhBQlx4RDRceDEyZFx4RkY1ZHpceEMzXHg5QVx4RjVCd1x4ODMzZVx4QUNceDBGXHg4NUNceEE5XHhDMVx4MDlceDE3XHgxNlx4OThceDE2cFx4OEEuUVx4OENceEE5XHg4Nlx4REQ9XHg4Q1x4OTJceEE1XHhBOVx4ODBceEJBTT1WXHhEMG9ceEYxXHhCOVx4OENceEJFXHgxOG9ceDEwXHg5NSRceDkyXHg5Q1x4MDJceDg5e1x4RUFceENGIHpceDA3XHhEQ1x4OTNceEZBXHgxQVYmXHhFQURqXHg4RVx4QTdceDAyXHgwNnhceENFWlx4MDVceDhFXHhFMVx4ODg2VEJceEYzLDxceEZEXHgwQ1x4Q0JhXHhDNHJlXHhGNlx4RjdceEI3TixceEE2eUdceEQxalx4QjRceDEyXHhGQipceEQ1XHgwNVx4MEVceEYxXHhCNVx4QUZceDgyXHgwMWIyXHhFNFx4QzFceEUwWXVoXHgxRFx4OTRceEJEXHgwMS5ceERBXHgxRFx4RkRceEZERDgmXHg3RkBceENBXHg5MldqXHgwMyxIdiZceEE0IlZceDA1XHhDQVx4MUJfXHg5NCdceEUxXHhDOVx4QkRceEM0PzxeXHhDNFx4RTFceEE2XHg5NTRceDgyUyEoX2VVXHgxNWg1Ulx4QTZrXHhGRF1ceEJBXHhCNVx4MUFceDExXHgxQ1x4RTgmXHgwQ1x4MEYkJ1x4RkNceEQ5M1x4MTRceEY0XHg5Qlx4RTRceEEwXHgxNlx4Q0U1K1x4RjRceDFEXHg4OUxceDg3XHhBN1x4RkUzXHg4N1x4QjNceERGXHg5OVx4QURceEJCXHhFM1x4MTJceEQzXHg4NVx4QzlFLHtceDE5XHgxQlx4QkZceEVFZFx4OTFceEQ5aVx4RDV2dVx4OTNoTVhceDlFWiYlTVx4OTZAQl5ceDk4XHhCODZceDkxXHhCNlx4QjFceDkzXHhGRlx4QkFceEFCe1x4RjlceDE3I0FceDlEQVx4MDJceEMxXHgxNTxceDdGXHhEQlx4RURCXHhBN1x4QTdceDk2XHhGOEdceEI0XHg4Mlx4MEJceDg5STBceEYwfWJceEMzX1x4OTlceDEwP1x4MERnXHhBQVx4RDRceDBGXHgxMVx4Q0RlM11ceEVEXHhDNlx4ODdceEFDXHg5QT9JOTxMcFx4QjZceDEwXHhBNzYuPkpceEMyXHgxQlx4OUZceDg1XHhBRVx4MDQnXHhDMjZceEU4alx4OUZZXHgxNENceDdGX1x4RDBceDg2SUF2XHhGQ1x4RjEiXHhCNlx4OTg4XHgxMztceEZDXHhFNFx4RkNPXHhFQlx4RjVVXHhCM1x4RkJceDlGXHg4N1AjMFx4OTJceDA4TVx4QzgrXHhEMmFceEU1JVx4QjFceEU3XHgxQVx4QTFceEM2XHgxOV9ceEE2XHg5MSxkblx4QjRUXHg4Rlx4QzRceEMyblx4RDRkXHgxNSNceDFEXHhFNk9ceEU5XHhFRjhceDEyXHg4Rl5ceEU1clx4RjdfcmQsNFx4RTJceDEydFx4QTFceDlEXHhBRV5ceEYyXHhEOFx4OTJceEU2XHhEMGJceDhBN2pceDk2NFx4RTZceDk0XHhFMFx4MTdwNVlceDk0XHhCMm5hXHhENFx4MERceEZCXHhFMFx4MTFceEI3XHhFOXFceDA2XHhDOVx4QzMkXHgxOVhGXHg4MVx4MDRceERCXHhCM3BceEI2VHl8XHgwQlx4ODVceENCXHhBRFx4QzhceDAzXHg4NjtceDlCXHhGNFx4RkVTXHhEN1x4MTNceDkyXHgwRGg4Klx4QzVhXHgwNVx4MDlceDk0W1FOXHhCM1x4MDZceEFCXFx4QzE9XHgxRENceERBXHgxMWBHXHg4OVx4MDZ1N1x4OUIiXHhBREE3XHhFNG4oMVx4MDdceDhDPURsXHhENHtmXHgwRFx4QjdceDA3bVx4OUVceDk3dFx4MDVGPVx4MTZZXHhBNFx4RjVkXHhGMlx4QTFEXHhCQVx4ODVuXHgxNFx4RDZceDg2XHhCRENceEE5XHhDQlx4OTlceEQwXHg4QnBceEUzYFx4RjRceEFERTNceDFCXHhBRlx4OTRceEQ4XHg3RkBceEM4M1x4OTdEeVx4QTUpcV5ceDBGXHhCOT5ceEM4XHhFQz8tRzFceEY1XHhEMlk9O05ceEVCb1x4OUJ2XHhGOUxlL1x4MDhceEQ4T1x4QTNceEMzXHhERU1ceDA0XHhGMWxceEMxXHgxMlx4ODJceEFFSDdeXHhCRFx4QkRucFx4RjBceEIwdnBceEZFXHgwNGNceENBXHhGOVx4RTFceDhDXHhDMVx4MUFceEIzXHgxMlx4MEJOXHhGNiZceEM2XHhEOVx4QTlUXHhEOWVceEI0XHgwQ1x4Q0RceDgzXHhDMGZceEUwX11ceEQyVEEyXHhBMi45KFtceDkweHhYXHhEM3lceEFCYmFceEFBXHhCRVx4RTVceENFQ1x4N0ZMXHgwNFhceEE1XHhCNlx4OTJceEI1XHhCNlx4RjU+XSdceENGXHhBMGZceENFXHhDQ1x4REF2XHg4RFx4QkZceDBFXHhCQ1x4ODdceDkxXHhBQnNNXHg4MFx4RjhceEJCNy95Xlx4OUJceEREJjJKMHlceEQ5XHgxMlx4RjJxNUZceENCRXhceDlDTlx4QTVceEJDXHg4QVx4MUVwMz9ceDA5XHhGRlx4QzJceDA0XHgxQyRceEE5KFx4OENuXHhDRlx4QkNaclx4RDBceDkxXHg5NkNXeGs9XHhBMVx4RTlceEMzXHhGNVx4QkJceEYxXVx4RTBceDA4XHg5Ri4hXVx4QzVHXHgwMlx4RTRceEEwXHgxQ1x4RjFceEIyTVx4QzY7XHhCMFx4MTlceDg3XHg4RnJceEJFMnBceENDN1x4QzVPXHhBRF5ceDBCXHgwRX1ceDBGXHhBRVx4QjB8I1x4RUFceDk1XHgxMVx4MTU+aXBELlx4MEJceDhCXHhBOVx4RjYgaVx4QjVbUlx4OEZceEE3XHgxNnchXHhEOCp0W3A8XHg5MTBceEI0dWJXXHhDRVx4QTFFXHgxQ1x4RjVuXHhCQ1x4RjckJFx4OTZceEVFXHhBMVx4RkZceDlBTlx4QzJXJlx4MDFceEVDYG1ceDFBNy5ceEJFIlx4N0ZceDA5clx4REFceEE1XHhBQiguRFx4RDFMXHg4Mlx4RkFceENDXHhFNW5hJlx4QzNiI1x4QkFceDg4XHgxN1x4N0ZVXHhCQVx4RDM7XHhBRVx4QzVmXHg4N1x4MDNceEQxXHhBQlx4Q0JceDFEaDNceEQ0XHhFQ1xceEFDXHhGN1x4MTZceEQzRCFEXHg4Q0xxYVx4QkZsXHgxM1x4RENceEZFXHhDQ1x4RkNceDg2SFx4OTgvNVx4MTNceEM1XHhDRXhceDkwUUd+XHhCNH1sXHhGM31AVlx4OTl4XHhGOVx4OThceEEwXnBceDhGa0JceDkwXHg5QUB7SVx4OTNceEJCXHhDQVx4MTRceEY4UFx4REVceDk4Plx4MTJceEJEXHhBNFx4MDBgXHhEMn1ceEFFPk9ceDE4fVx4MTRceEVFXHhGM1x4Q0ZceEU2cVx4OTRceDBFXHg5Q1x4QTlceEMxL1x4RTdceDExXHg5QkoqXHhDNiZceDAxXHgxMVx4MDUnXHhEQ1NceDE2XHg4Qlx4RjdjXHg5Qn1ceDhCXHhCMGxceEY1XHg4RVx4RDZceEREdV5CXHhCMFx4MEJ2XHhFRlx4MDRceDk2XHhCQVx4ODRtXHgxOFx4RjVceDg5XHhCRlx4QTFceDA1XHg5QWFceERGMm4sXHg5OFx4RUEtXHhDOTlpXHhGQ1x4QjhceEJFXHhDRFx4RDRceDgwVCBoRVx4QkVtXHhBMi5NVFx4MTlAXHgxQVx4MThUXHgxRVx4QTFSLlx4OTVceEY1MFx4RjJpXHhCN1x4MENceDk2XHg5Qz9QaVx4OUZceDk5ZFx4OEZ5XHg5M1x4MTY6XHgxOVx4RjlceEM2ZVx4ODNeXHhCMmJceDhDXHhCQ1hfXHhBQ1x4RDZceEQ4blx4QTVceEQwXHhEOVx4QkVceDA0XHhGOFx4QkVceEU0XHhBOFx4QTdeXHg5NVx4QzlceEI4XHhCQ1x4QjdvXHgwN1x4Q0VceEZFXHhBNlx4RjVBe0BKXHhEMlx4RjdceDBFXHhENFx4RTEuSV5ceDgxXHgxRFx4RDBceDhFXHg5MVx4OTJceEM3aEtceEVFYmFceDg0XHhFNidNJ1x4RDhrXHhBMFx4MEJFXHhBMUVceEU5XHg5Rlx4OThceDkyUkRceDE2XHg4QWlyXHhDNVpceDFFXHhEMD9ceDgzb1x4OUFceEY1XHhDQ0ZceERFbVx4OEJceDk1OVx4QjhpXHg5M3FrXHg5M1x4ODZceENBXHhFRlx4ODdceDhDXHg4QkF5XHhFM1x4QUFceDBCXHhGQlx4QTJceDlGXHhFNEdceEMzXHgwRjdceEQ0XHgwRFx4RDhceDFEQlx4QjZceEJEXHgxN0dceEM2Zi1YPlx4ODVceEY5XHhDRVx4QTNGXHhGMlx4QzZ7XHhENFx4QURceDdGXHg5N31ceEExXHhGMFx4QkRceDFBYlx4ODVceEM0XHgxQ0xSXHhDRlx4RTU3SVx4ODdceEJCXHhDQlx4OUVceDAwXHgxMGJceDBDLVx4RTdceEM2XHhDRVx4RUZceEFBXHgxRCJceDBFXHhFMVx4RjQuXHhEQVx4OUNceEIzXHhEMFx4QUVceDk5XHhDMHBceEJFXHhEQmlcXHg4MnlceEZDTlx4QzhceEIyXHgxOWMzeU5ceEM3XHg5MVx4ODJceEFEXHg4RCFmbVx4MEFceEFFXHg4OFx4RUFEelx4QzZzaHQ2JFx4OTlmXHhEMVx4Q0NzXHhDMlx4MTRceEQweEhceDA2XHg4RVx4QUMlXHgwMFx4MTZceEI4XHhCM1x4QkYzXHgwRlx4QjBceERDXHhDRFx4REJceEY5cFx4MTQtXHhBNlx4RjhceDgxJFx4RUFceEIwXHgxQ1x4RDJceEE3XHg4RFx4N0ZceDhBXHhFMHNceDdGXHhGQVx4ODBmXHhGNUlceEZGM35ceENDXHgwM1x4QTdceEE1XHhENlx4REVceEIyXHg4NVx4QkRceDlEXHg4Q1x4QkZceEEwOXRceDFEXHhDRkJceDg3XHhFMVx4OTBsXHhENFx4OEQ3d0FJXHg5N1x4QkRceDk1XHgxRVx4QTNceEU3TVx4QkVceEFBXHgwMFx4Q0VeXHhENlQzXHhDMC1ceEI1XHhCRVx4RDlceEE2W1x4MEFceEY1dFx4RTRceERFXHgxOU9ceEREXHhEQ1x4RjcnXHhFM2FceEYyXHhFM1x4OURxXHhFQ1x4RkRceDA1XHhFQ2l0QzhceDhCXHhGOVx4MUNhXHhBQVx4RjJceDg0XHhGRn5UXHhCM0RceEY4XHhCQlx4QURFRlx4RDA0XHhFOHI+XHhFQlx4QkRceDAxXHhCM1x4ODBceEM2JCdceDhDPlx4QzhgXHg4Rlx4MTVceEMxXHg3Rlx4ODJceDgxXHg4NFx4RDY3XHhFQVx4RjJceDgyXHg5N1x4OEFjWTcrJ1x4N0ZceDg0XHhFQVhceDA2XHhDRlx4MENCM3AnR1x4OUZceEZBXHhDM1x4QTB1RFx4RENceEQxXHg4RkpceDlBRFx4RkRceDgxXHg5MFx4REVceEI5O3ItXHg5RVx4MDVceEZCTVx4QkFTXHhGNSpceDg1NWV5XHgxMFx4RTRceEYzXHhBMFx4Q0NceEIweHV3fFx4QTlceDFFc1x4Q0ZceDE2LFx4REVceDg5Xlx4QjdceDFETFx4ODhceEMzU1x4RDdceEM3dnNceEU4XHgwOFx4RjVceEZGXHhBNlx4MEFsXHgxNFx4QjVceDAyQ2tceEZGISZceDg2aHYjXHgwMVx4RUNceEIyXHg4Qlx4QjhOflx4OUNmJFd2UVx4QTN8XHhGNVx4MDlceDhEXHhGN1x4ODRceDhBWlx4OENRXHhDNGp9XHhGNGtceERBPVx4ODBceDk0XHgxQ1x4RTNceDgyYFx4Q0NCRFx4RjIwUFx4QUJceEQxRVx4QTdceEQ2XHgwQmJceEY5XHhCQ1x4ODBceEQ2TXxceEZCXHhDRFx4QTVceDk0XHhGOFx4MTFceDBDZFx4QjlceEQ4XHhFRVx4MEFceDhEbFx4QUEnXHhDRWZceEZETDhceEM2KVx4OUNceEE0ZTtceEJBXHgxM1x4RDFceEU3XHhFMl1ceEMzXHhGM1x4MDd5fVx4RjJceEQzSFx4OTlceDAyXHhBNFx4RDkqezcmXHhERFx4OUNceEM0XVx4ODZceDgxa0VceEJDIXsxXFx4QkFmXHhEMXQjXHhDMV1ceDlGNjRsNFx4RDZmXHhGNCd8Z1x4MDdceDk1XHhCMDFceDgxVlx4MUVceDBGXHhEMlx4QzE/XHhDRVx4RUZUXHhGOC9ceEE5XHhDNFx4QzYsXHhCNVtceDgyXHhENFx4QzVceEU5XHhDN3lceERDOTwyXHhGQ1x4MEFceEMwXHhFN1x4RUFceDBGXHhFNnVceEQxXHhERlx4MUNceEQ3MilceDlDKVx4OEFceDBDXHg4RiR2XHg4QXFjKVx4OUJAXHg5Q3BceEQ1XHhDOVx4MTRceEI5XHhBRlx4REFceEVCXlx4RjEyMC5ceEM5XHgxRVx4OEVceEEzO0hceDgyXyRceEU1elx4OUFceDk4XHhGMnVceEU0M1x4MDRceDlGTStceDkwXHgxMFx4RDlceDE5XHhDQnlfJ1x4MTVceEY1XHg4Nj0qPlx4RjZfai5fXHhBM1x4QUFyXHgwOUJceDFGXHgwMlx4OTdceDgwXHhBRlx4RTlceEZDXHg5MW4pXHhBQVx4MDJTXHg3Rj8qXHg4M1x4MUZceDBGXHhCNlx4Q0RceDA2XHg4MSlceEFGZFx4MUVceDhEXHhBQkRSXHhBRVx4MDlceEU2XHg5Qlx4RjlceENBXHhGM3JceDk3XHhFOFx4RThceDA5YFx4RjhceDFGXHgwNVx4REMvK1x4RkZceDlEXHgxM1siXHgwNlx4RUYgXHhCNlx4REM7XHg5RTZ6eWJceDAxQlx4ODhceENCXHhERFNceEZFXHhEQ1EtXHhFNDFceDFDXHg5MFx4RjA9XHg5NVx4RjhrXHg4NHdfRFx4OUZceEY3XHg5Rlx4QjggXHgwNXhceEJCXHg5OVx4MTFddlx4OTJceEMzXHhEN1x4RDVceDE2VFx4QjVceDEzXHhCRVx4RDhmXHhGOFx4OUFceEE1XHg5NndceDFEYzxceEU3XHhFNVx4QjBceDk0KFx4REZceEMzMHZceDE0a1x4REM2XHhGRXBceENGXHhERlx4QTlnb1x4QTVceDg2XHhDOVx4QTZceEIxLFx4QkI9XHhFMVx4OTVceEUzXHgxQ1x4QzA6XHgwMXpceDA0XHhFMipwXHhFQz5ceEE5XHg4OFx4ODRceEQ5XHhCN1x4QjVceDhBMFx4ODVceEMxWntceERBXHhGRFx4QThceDAxXHhDOGJceERCXHhBRjlceDBBYVx4QThceEJEXHg4N0NceEE4bmU2XHhFOVx4OUNGXHhBQVx4ODBceEZEL1x4RTlIczlceDgwREdceEQ0XHhEMVx4Q0NlWktceDA1X1x4MTU5XHg3Rlx4RTVceEJEJFx4QTFceERBIlx4QzFceEM4XHgxNDtceERGZFx4OTltXHhFOVx4MTFceDAzXHgwRk5ceEJCXVx4MUJmY1x4QTYgJVx4ODBceENDXHhCRGNceEQyJlx4RkVceEQxXHhCMDtceDg2XHhEM1x4RjM1b1x4REJceDhDXHg4M1x4QTRceERDXHhCMVxceDAxe29ceDEwQlx4Qzc/dFx4MUFceEZEXHhFMVx4OTBceEZBalx4RjhyIVx4RTZceEIwXHgxQVx4RDRceEVFZmR3Xlx4MTJTXHgwNVx4MTdceEQxW1x4RTErI1k5XHgxMVx4RkZceDgycl88XHhCN1x4REZceEFGXHgwQlx4QTN7XHgxM1x4RUJceEM2XHg4Rlx4QTBceDgxXHhCQlx4REVPXHhBMVx4OENceEMwYVx4MUVceEZDWlx4QTJNa1x4QjJceDgzXHhFNVx4Q0ZceEYzXHgwRXhceEZEXHgxOVx4RjNsLFx4N0ZceEE0XHhBNDBaXHhDMlx4ODlceDE2WVx4OTdceEZFQFx4RjdceEQxXHhDOVx4RDVceENGXHgwRFx4OThceEI2XHgwMFx4ODFXXHhCMlx4ODNceEU3XHhEMFx4REFceEJBXHhBMz1ceEU1clRceDhGXHg5M1x4RTEzJlx4QTlceEZEXHhDOHxceEZCXHhCMFhceDA4XHhBQVRceEE5Ylx4QjlJXHhBNV98XHg5RFx4QzJUXHhENlx4MEUwXHhFNVx4RDhrXHgwQVRceEYxK1x4RDJceEUzJ1x4MENIXHg4Nlx4MDAxXHgwOVx4OTNceEZGI1x4RTI/XHhBM1x4RUNjLFx4QUJxZmkteFx4OTFceDkwLFx4RkRUXHgwRlxceEM2XHhDRVx4QjJceDgwXHhGRVx4OTBceDE5XHhEQ0RceEE0J1x4Q0ZceDE3XHg5QXRceEM3S1x4QUNceDhGXHhBN1x4OEE6RVx4Q0FceDg3XHhCMVx4QURceDEzUCFceEQzXHgxMFx4QTNceDkwZSNceEU5XHhGMUdAZnBceDA2QFx4RkNceEI5fVx4REZhUlx4N0ZceDE2XHgxOTd0XHg4QVx4Q0VceDEzblx4RDRceDk1XHgwQyJiXHhCMFx4Rjc2XHhEQWtceDE2XHhCNTNceENBXHhDN3V0XHhDRC9ceDg3XHgxRFx4Q0RaXHg5NVx4QjlJRlZceEQ1IGVLXHhEQ1x4MDVceERCd3JyM0AyXHhCNXJceDFEXHg5MFx4QjdceDBFPWYyJVx4RjZceDBFOlx4RDVceDkxXHhERkZceDE5XHg5RVx4ODJGLlx4N0ZceEU0XHhEOVx4MTNceEJDXHhCRSlcXHgwM3RaXHhDN1x4Q0RceEQwXHhCRVx4RjUsXHhEM1x4QzZceEIyXHhFMU5YXHhBM1x4RDNkXHhDN0RceEQ0XHgxMFFceEVEXHg4QSZceEZBfVx4RDR4UFx4QTVceEU0K1x4MDZceEFFJzFceEFEXHgwNFx4OTE5XHgwNlx4OTVceDkxXHgwOFx4QzNlXHhFMkNNU1x4RDQrXHgxMkZceEFEXHhBMEs9XHgxMlx4QjJ4T1x4QUFCP11ceDFGXHgxQlVsXHhDMlx4RTRceEU5b1x4MDZKXHg4N1x4Q0JceEU5XHhCNXVdTlx4ODNsXHhDRnFqXHhEMlx4OUNceEMwVVx4RDV2XHgwMlx4QTZceENBXHg5N1x4QzBceEU1XHg4NVx4MDZceDk5XHgwOVx4OENceEZFciYyXHhBQzVceEUzXHhGQ1x4QTJEXHhGMXhAIFx4MTlceDFBJlx4OUFceEYzXHhGN3pceEZEXHg4MGlceDBBXHhBN1x4RTNceENDPFx4RjNceEYyYSRceEJCXHhBOFx4OTBceEE3XHhCOCNXXHg5MVx4OEVceEYwXHhCOWVKNFx4OTZceDgyUFpceDhEXHgwM1x4OERceDA0XHhGNjBceDg2XHhDMVx4RDlHMD5ceERGNVx4RkRceDk1XHg4Qlx4ODFceDg5XHhDRlx4MDFceDlGWWNceEQ3U0JceEJBXHhFQ1x4QzdceDA3XHgwMiNceDk1XHgwQlx4QzAgOlx4QTM0XHhBMFx4REFceEI2J1x4OTRceEY2XHgwNlx4MDBceEM5XHgxM2JceDlGXHhFRGRceEE0XHhBOVx4OUNceEMyXHg5Rlx4QjRcPFx4RDlGP0BceEI0XHg4OVBHVlx4RjlceDkwXHhENW5ceEU3XHgxOFx4QkJceEQ5XHhBN1x4RkR5IVx4OURceEE0aVx4QzFceDA3M1hceEJCXHhEQ1x4QjJUUHNWNCdceEY3Zlx4RDRceDhFIVx4ODRceDBGRVx4MURYXHhENSwwXHgxOFx4MTFHXHhBNFx4MEQkXHhEQVxceEQyXHhGMTdQflx4QTlceEVGXHg5QWZceEU3XHhFOWVrXHgwOU1ceEIzLlx4OUJceEFETVx4MEFceEYyXHhFOVx4MUZceEIwXHhGQ3xyXHhFRlx4RDVqKWJceEE0dVV3XHhFNVx4QTlERFx4MTJceEUxXHg5M142J1x4OTc9MVx4MTludFZceEIwXHhCNGIpXHgwOUhceDk1XHgwMFx4QzBceEU1XHhDNERceDFEMEo7aFx4RTVceEUxXHhGOFx4RENceEM3XHhCOFx4QkZceEM3XHhENm9ceDkwXHg4NFx4ODFceEJCXHhGRFRceDg1XHgwNy5cXHgxODdgXHg4MFx4QThceEM3XHhDNFx4OTlceDA1OFx4QzVceDg3Klx4MUNVXHgwQVx4OEFUUGsrSlx4QjZceEVCRF9tWlx4RjRceEU2XHgwMFx4ODhKXHgwN1x4OEQhXHgxRFx4RjBceDk2XHg5OFx4RDE/TVlceDE0XHhENVx4QzFceDdGXHhFQ1x4Qzc7Y1x4REM9XHhDQ1x4Q0VceEVCXHhBRFx4Qjh9clwxXHhDMlx4MDlceDA4XHg5Qm9ceENBXHhBMlx4OThceDhGalx4QzFgXHhBMFx4RTBnXHhCM1x4QjNjblx4OUFceDk1XHhFRFxceDg2XHhCM1x4RUNCXHg5MyxceDkxXHg4RTlceEU1JVx4MEFUXHgwQVx4QTlbXHhCNzNceDk2XHhDQz5ceDE2XHhDNVx4QkZceEUxXHgwMi9ceEE1XHhDRVx4RkNceDlEXHhGNXlceEEzXHhERFx4RTJceDgyXHgwQVx4RTUmXHg4N1x4RUZceDgzd1x4RjFceEU2XHgwOVx4RjNceEEyXHgwMC5ceDhFJFx4RTd5XHg5Qlx4ODctUVx4RkNceEQwJTZceEFGXHhBM1x4QUNgRjluXHhCODNceDBEXHg4Mlx4MUVceENCXHg4RFx4Q0FceENDKGRceEI1U1x4OERceEI3NVx4OTRceEM3XHgwMVx4RDhceDE4Xlx4RDdceEIwJlx4MDJceEVFXSBceEE2XHhERVx4RTFceDhEXHg5RFx4OENkXHg5Nlx4RDhceERGXHhEMVx4RTZceEVGXHg5Qlx4RDZceEI1XHhBQVx4RDFceDkzXHhCMFkoXHgwQTlvXHhBOVx4RDV2JVx4MEFMXHhEQ1x4MTlceDlFXHhBMnJceERBQ1x4RkZSRTRceEVCODRceDg1KVx4RTRceDEzXHhCRlx4OEJtNjNceEFGcVx4QTk6XHhEQ1x4ODJceENCVlx4OTRceDg1XHgxQ1x4MTUlIVx4QzlhXHhFMTJceEQ1XHgwM11ceEI2XHgxNFx4OTA5XHhCNFx4OUNceDEyXHgxODZsXHgxQVx4MTlceEM4XHhGMlx4RjBceEE0XHgwQUhceEUxT2tceEM3X1x4OEZceEYzXHhERGo9XHhDQ2xceEY3PVx4REJceENCXHg5Mlx4RDZceEI1MFx4OTEsXHhEQywqe09ceEIzVFx4MURceDkwXHhGOVx4QzYhd1x4OTZbPFx4QTZceDBCXHhCQmk9XHhFQlx4QTRceEY3clx4QzBceDE5XHg5M1x4QjdOWSxceDAzcFx4RjFtXHg4MVx4QUJceEM1XHhDRVx4MDVceDEwXlx4QUR5XHhDN2I6XHhFQVx4MTFyXlx4OEQ9XHhEMlx4Q0JceEFFeFVHW1x4QzBXb1pceDg4XHhDOWsmXHgwRDZPXHhDRFx4MEFceDk2XHgxRFx4ODdceEE2Mlx4Q0JceEM3XHgxQmM7XHg5Q01ceDk2TFx4OENpXHg4Mlx4OERceEJBXHhGRk5ceEMyXHhBNzVceEY0Vlx4Q0VceDk4XHhEQlx4RDBceDA1XHg4OFx4RjFceDlFY1lceEU3XHhFN1x4RDBceEQ3XHgxM1x4QzNceEEzXHhBRUFceEUyXHg4Qlx4RENrRFx4MUJceEZEMlx4RTZceEExXHhGRFx4QjRceEYxXHhEOFx4QzE8XHg5MSo/VFx4RTFceEZGXHhGQlx4RjdceEI4I3RyXHhEQUcpXHg5M0lceEI3ZVx4RDhceDBGXHhCNDZfXHgxMVx4OUJceEQ1XHhEOWVceDBFXHgxQlx4RkVoXHgwMUFceEExXHg5Q1x4MDUgXHhFNlx4MUI9KFx4QURceDBCN1x4ODleXHgxMFx4RjhceEEzQ1x4RDVceDgwVDlpXHhGQmZceERFXHhCRFx4QzdceDhEWj5ceEQ5XHhENlx4Q0VceDA3dFx4MDFceEU0Jlx4OUI2XHg4MVx4MDVbTnZceDFCXHhCRUVGQidceEJBJlx4OENceDhCeDRrXHhBN1x4MUQ/XHg5Mlx4MThceDlCXHhBNmBMXHgwMlx4MERceDlDL1x4OTBqXHgxOVx4OTkjWyJceEY2XHg4QnJFXHhFQlx4QzBXXHgwQlx4OEZGQ1x4QzFceEUxOlx4OTlceEY0XHgxQlx4QTVceEUxZ04/XHhFQ3tceEEyXHg4M1hceEJFIj1ceEVFL1BceEM1OFx4OTBceEIzXHg4Qlx4Q0ZceEVBXHhBRVx4RDNeeVx4MTVceEU1XHg4NFx4OEJkXHhFMlx4QjFceEUyXHhDNE9ceEY1b2QiXHhFRlx4MEVWXHgwMCYkXHhENntceDlDXHgxQlx4MUVceEE3OyJceEI0fE8uXHhCNCBceEFFXHg5MFx4MTZceEY3XHgxMlx4MUFiXHg4MkNcXHg5MUVceEU4Ri5ceDk3XHg4RTNceEQyTiBceEEyXHhBNFx4RTdceEEyIFx4MTJZXHgwMVx4RTFceEZBXHg4MGdceEQxXHhDNz9uXSwpbFx4RDhceEEyXFx4REFKRFEyZFx4MDVceEIzUyJceEQxN1x4QUZDQTJceDlBdHpceEM4XHhBRC9ceDlFXHhDRTZ6elx4QzZwXHhBRFx4RjJvXHg4Nlx4MUVfXHhGNF9ceDEyLlx4MTNceERCYFx4ODJIWmFceEU5XHgxQlx4ODQyMFx4RTJceDhFIFx4QkV9I0hceDAwLVx4RTZcXHgwRFx4MDFceEQyblx4OTReXHhBN25ceERFXHgwQVx4QTBiQFVceDExQ1x4RENceEY2XHhGMUUuXHhCNTAtXHgwOXFceDk2XHgxRlx4RUJceEU0NVx4OTVceEQ0XHhCMlx4QkNceDA3XHhGOVx4MUJPXHhGQlx4QTJceEI1XHgxNFx4RjNceEEwblx4RjgkXHhFMGhceDAyP1x4RDRceDk0XHgwMnUsXHhBMVx4OTJcXHgwRWh3XHhDMXFceEUzXHhGNFtceEUxXHhEMXdceDEweUxceDFBI1x4QkNceEZDXHhEMTZKXHgxM1x4RURceDkyXHg5N096KVx4RkZJWVx4RTJceDFGXHgwN1x4QkZ4XHgxOFx4QTIpXHgwMlx4QjJceEExXHgxQ1lceDk1XHg4QihceEM1XHhCMGszXHgxRGlceDEyXHg5NVx4MThcXHgxRVx4MUNceDBFMVZqXHg5NFx4MDRceDhBXHhFOFx4MEJceDk5XHhBQVx4REI0QFx4RTUhV3pceDlBXHhDOFx4RjA4NFx4MUNxXHhCRlx4MEZzXHg4QlxceEY2clx4RkVIIixceERDLFx4RERceEQzXHhGQlx4QzJQOk9ceEMyXHhFNlx4QURceERCXnBTXHg3Rk5ceEIyXHhCOEFceDBFcVx4MDhceDBFXHhBM1x4RkZceDBDZ1x4RjMwXHhGMCdceDAxXlx4QzJceDdGXHg5N1x4ODVceDhDV1B2XHgxOVx4OEZceEU0XHhFRShceDkxXHhERntceDE2XHg4Qi9uXHhGNFx4QTJceDExMlx4ODZceENBXHhBMFx4QUFjZ15ceDk4XHgwM1x4MDNMYFx4QzFxXHhGNH5ceEUwbVx4MUUtQlx4MDlceDkzKVx4RDRceEM1XHhDMFx4MTdTXHhCMlx4RkFaKT10XHhDMlx4QkJceDkwIlx4ODdoXHhBNFx4MUNceEQ1XHgwNmdLXHhGRFx4MUNFXHhFN1x4QUNceDE2XHgwRlx4OURceEMzYldceDlEXHg5OEVceDg4SVx4MERceEI2XHhFQVx4ODFaXHgxN1x4MUJceEM5XHhBOVx4MDRceEI0XHhFRVx4ODNceEIwJ1x4QjVceEY5QDxceDg4dElceDhEXHhBM0RDXHgxRSk8Ylx4RDU6PmhceDhFXVx4ODFceEEwXHg4NVx4MTdceDgxXHg5QzxceEMzXHhDOEtEXHgxNWhceEY2SFx4QUZGeFx4QjJceEIyXHhFNFx4QzZceEVCalx4MDNSLVx4QTVceDkwdFx4RkJceEY4XHhBMlx4RjFceEQxXHhEOURceEMxdVx4Rjl3eXMjXHgwRkZceEI1XHhCNXJceEQ0c0FceDFFPVx4MDJceEY3XHhEMlx4MTBceDg4XHhEMVx4OTBceENBXHg5Nlx4RDJceDg2I1x4MDJceEFGXHhFNFx4MDFOYVx4RjBceDA4XHgxMExceEQ5aFx4QTM2XHhGN1x4RTFceDA1Rlx4OUYmXHg5Q1x4QTlceDgzXHgxQ1x4QzNceEUzYlx4MTRceEQ5c3VceEIyXHhBMlx4RTVceEE1XHhDOVx4RUFceDFEbVx4REJceDk3IDFceEYxXHg4NVx4RjVceEYwXHhENmRaXHg5OFx4RjhlMWBeXHgxRFx4RDNceEE1XHg5OVx4RDI/XHgxRlx4MUE/aFx4RjB8XHgxRlhceEMxSSpYS0xceEEzXHgxNFx4OTBceDlBXHhEMFx4RjBceDFCOFx4RkVpXHhEOVx4QzFceEJBXHhGMlx4OENceEUxXHhBMlx4OTFceDFFXHhBMVx4RThceEI5XHgxQyVceEY3XHhDMFx4RTchXHgxMmBceDgwXHhGNVx4OTlceDlCXHgwRFBLXHg5OFx4N0Y5fFx4ODZ7OiRceDBBclx4QUVceDAwKy9OXHhCNFx4MDJVXHg4NDJceEU0XHgwRlx4RDU2fFx4MTdceDE4XHhENk1bXHhBRlx4MUNRXHhGMVx4OUJceEU3XHgwQm5yXHhDNFx4RkRhM1x4QjRceEYydGo7LFx4REJceEJBXHhDM0pceDEzXHgxQVx4QTV3JVx4QzZceDFFXHhEMVx4ODcqTlx4RjFceEIyXHhBRFx4QkNceDlCXHgwOHptXHgwN2YyXHgxQ1x4MDNsRVx4MUJceDBFRlx4QkZPbXxceDFCXHgxM1x4RTVgXVx4MDkkXHgxMVx4MDQyXHg5OVx4QURBbFx4OEVGXHg5OFx4RDJ+XHg4Qlx4MDhceEFBXHgwOFwodFx4QUFceDg3XHhDQlx4QjF2XHg4OUNTXHhFRlx4MEQtXHg4MWRceDlGXHgwN1x4RDg3TyNceERCXSNceENCXHgwQjJceEVDXHg4QWNceEYwaFx4ODhselx4Q0VceDg4eVx4RDZceEQ0XHhEQlx4RTJceEI5Y1x4RjJIXHhFNlx4RTFceDhCXHg5QVx4MUZceEU0QVx4RTFceERGKVx4OUVceDE1TjlceEZFYVx4RTZceDlBXHg4Rlx4QURceENBXHg5MzRoXHhBM1x4OERceDAxXFFceDBES3BceDk5XHg4OFx4QzFceDkyXHhBQVx4REVceEUwXHhDQ1BceEMwXHhCQ05ceEQ3XHg4QWBTXHhBNHdceDA2XHhFMidpMVx4RjVceENEaVx4RTJceDA0LFx4QThceENGXHhFMFx4QzBceDkzXHgxOFx4MUZceEVGXHhCRVx4OTZceERELVx4RkJceDBDXHhGRFx4QjF1XHhCM1x4RjhceDBGXHgwN1x4ODE9XHhEQlZ2XHhDQiJceEJDXHhEMUE6YiJceEQ2XHhGOHNceEIyZFx4ODRceDhDXHhBOFx4QzZceERGXHgwMC9ceEM4Olx4QUFceEYyXHhBOCldc1x4RjR2XHhERFx4MTdJXHgxRFhceDg4XHgxQlx4ODdceDE5XHhFMGBceDhEXHhCNGxceEM5Vlx4MTRcMjVIXHhGNDtvXHg5RFx4RTlceENCSlx4MDN7XHhCRnJceEVDXHhCNVx4MDBceDhBLVx4Q0RceEMyaFx4OUZceDBDXHhFMSAqXHgwRHhceDhDXC89XHhBRDtceEMxSFx4QTZceEZFKF9ceEI0XHhEQVx4QkJcXHhEOF9ceEYyOVx4RjlceEM1XHhEN1x4MDhBXHgwMUVceDkzXHhBMlx4REZ9XHhFMXlceDAwXHg4MFx4RjhceDkxXHgwQlx4RDNceEMyXHhEOFx4RkJceEYydm1SXHhBOFx4MENceDAwXHhENzNtXHgwMVx4MEVceEY5XHhFMlx4Q0RceEY4XHhCQ1x4RkZceDk0O1x4RDQ2XHhBNmZceDExXHhFN1x4RTJceEI4XHgxMlx4RTB5XHg5Nlx4MTNceEI1cVx4MEFceEVFXHgxM11ceEY2XHhFMFx4Q0FRXHgxNHpceEVBXHgwOVx4RTZceENFXHg4Nlx4QTRceDE3XHgxNFx4RjBceERGXHgwMlx4MERceDgyXHgwRlx4QTN1XHhDMVx4REZceDhBQFx4RDcvPlx4ODk7WmZceEYwXHhCNVx4OTRceEE4K1x4RTBceDlDXHhGNFx4QUZceERDXHg4RFx4QzQ8SGFceDE2XHg4Q1x4QjdceDgxIlx4RUJceEUyO1x4OENceENBKFhceDkwMlJGISJCIlx4MDRceEQ1JFx4RENOXHhBQ1x4ODdUNDNceEJGXHgwNFx4QTB2Zlx4RjhceEY5fVx4QTkjXHhEN1x4MUZceDBCXHhGQlx4MTF0XHhBN1BceEUydlx4QkVceDgyXHhFNlx4OEE+W1x4ODApZFx4QzlceEM0XHg4OVx4OTZceDg5blx4ODdceEU0XHhCMVx4QThceDlGXHhERVx4QThcXHhERXVceEY3XHg5RVx4QjNceDkxXHg5NVx4QzdceDgyJlx4QzFceENGXHhGQldceDBDalx4OEYjYWRceEZCV1x4RThceDg2XHg5MXlmXHhFN1x4OEEsXHgwMlx4MDhceEZBb1x4QjlceEU5aVx4RTg6eVx4MDhceEFEXHg4REJceEU5XHhCRFx4RjBpIlx4QzZaXHgwQlx4QURKXHhCN1BceEI3XHhFMlx4MTJceERBSVx4QTVceEMzXHhFMFx4QzlceDk3SFx4RDBceDhFXHg4QVx4OUNnXHhFMjowOFljWVx4OThceENCJjZceEMzXHhFRFx4MDFceDlGOiBceENGXHg5Mlx4QzAzO1x4QTdceDBCXHhBNVx4OUZceEE2XHhENFx4RkNceEQ4XHg4OFx4RjJceDlGXHhFN0owXHg4Nl5ceEI3PFx4QzZuelx4QjY6XHhDRFx4REVceEM4XHhERGZceDBCMFx4QTVIXHhFNVx4RUJceDE2XHhDRH1ceEQyLjZceDhEXHg4QmRceDgzbFx4ODY3aVx4RkNceERCK1x4OUVceENDXHgwMlx4QzJGXHhFMT9ceDFEXHhCRSVceDFGTVx4MDdceDFEXHhFN1x4OTd6XHgxRkxEXHg4RVIlXHg4N1x4MTFzXHhGN1x4RjZiXHg4Qlx4ODJiXHgwOVZHfFx4QzZceEUwXHdlXHgxOU9ceEE4XHgxOFx4Q0RceDhEJlx4OTNceEQyXHhFOFx4QTlceENEXHgwOVx4ODIoR1x4QkVceDgwXHg4Qlx4Q0JceEI4K1x4ODNceEQ3eik6XHhFRVx4OUJceENFK1x4REJceDg2XHhEQitceDAwXCpceDEzXHgxQnJceEZFXHgxQ2VceEU4MndceDEwMlx4MDM9Slx4REJoXHhFOFx4ODRceEUwSVx4QjAhXHgxQWBaXHgxNSJceEZCLlx4QTdceEIwXHhGOFx4Q0RceEE3W0BceDAyXHhDQVx4QjRaXHhBMFx4MEJceDA5VFx4QTcpXHhFQ1x4QTk3X1x4QzRjXHhBMVx4MDRceDgwXHgwN1x4RDhceEZCLDtceERCXHhEOFpceDg4XHg4RVx4RTBceEFEXHhFRDBceEY1Ylx4ODV8XHgwOXdceEE1Tlx4RDZceEI3XHhDOWFceDBDXHhBMlx4OTBceEMzXHgwNVx4RjRKXHgxMlx4RTlceEMxXHhCRklceEM0S1x4MEI5XHgwNVx4RDdceDE4ZVx4RTRceEMwJlx4RTBceDkyXHgxQnFceEJBZFx4OUVceEJGSVx4MDMqXHhFQVx4RTJceEQwXHg5Mlx4QURceDhGMlx4RUVSe1x4N0ZceDFFXHg5M1x4RkNmc1x4RTJceDg0XHgxODNceDkyXHgxN2FETlx4OTdceDA5XHhFNFx4OThceEZBXHgwRVx4ODhceDA0XHgxMVx4REJzXHgxNlx4MDBceDk4XHg5Q0xceDA4XHg4Mlx4RjB+XHhDM1x4RUF7XHhDMVx4QzVceDE1XHg4MX1+XHhFNFx4RkZdQ1x4OUVceDkxXHgxQlx4OThceENGXHhGOVx4RkFlXHhEQlx4QkRjfFx4RDZPXHg5RDwnXHhDQVx4OUJceEI1XHg4QVx4QzQyXHg4OFx4RTVceEIxYFNceEJEXHhGRjY0Ilx4RTVceEI0XHg3RjdceEI1XHgwOFx4RjVNXHhDQlx4OUJceDg4XHgxN1x4QURceDg1XHhEMzBceDk3XHhCOVx4QjlceEQ0XHhDQWlxXHg5Nlx4RjhEXHhERkNLe1x4RDg3Ulx4OTVhXHgxMFx4MUZceEU4XHgxQlx4RUZeblx4QTh7XHhENlx4QzRceEFEQVx4QUZceEI2XHgxQWlceEQ0XHhEQ1x4RTNceEI3XHhCMFx4RDRceENBXHgwMlx4QzJceDgxXHhGMlx4QTNceDEyXHgxQ3R1UXJBQ1x4RThceEY3XHhEOVx4OTlceDk1R1x4QUNhXHhFRUMyXHg3Rl1ceEM2eFx4REZqXHhCRVx4MDE2blx4QkRceEVDXHhEMUZceEY0RVVceEYyOG1ceDEzXHhEOFx4RjhceDE2XHhGOFVceEEyUH1dXHhFM0FfXHhEN1x4RjVceDg1Jlx4MDlceEJEXHhENVRceEE3XHhDQ1NOXHhBNlx4ODVceDFEXHhGM1lceDE0XHhERlx4RTdceDA0XHhGM1x4MTBceDk0XHhFRlx4REZceEUzXHhFNWpceEUzcFx4RThceEI2XHg4OVx4MENceEFBXHhFQlx4RDYqXHg4Mlx4MDRadUxceEMwXHg5QUZoXHgwOVx4RTBceEYyXHg5MVx4MUZceERGXHhCOGBBb1x4QUJceENEXHhCMlg8XHgwQVx4RDNsXHhBNlx4MEMtXHhBNlZceDFBXHgxRjlceDFFIlx4Q0NeKSBxXHhERilceEEyN2xceEM3XHhCRVx4OUI5I1x4Q0VXWFx4ODRMXHgxM1x4QjEpXHhGMFx4RUVceEJCXHgwNCslaVx4OTVceEM5XHgwOVx4MTVceDg4WVx4MDdceDg1KFx4RjJPXHhGQmZceDA4XHhGQitLYlx4RUJceEY0XHhDN0duIVx4QzJceDgxXHhCNnBceEUyXHhGODtceEU3PGFceEIyK1x4Q0JceEE3XHhBRVx4OTVceEQ0XHgxQ1x4MDNceEM5VFx4MEJceDEyXHhCRFx4RDVrXHhFNlx4QkZceDBGKThceEE1Mlx4RUFceEQ4XHhCM1x4MEN3XHhCMnpceEI0XHhBQXhceDhDXHhENXNsXHhFMlx4ODRceEZGN1x4RjdKXHg4NyQ6bFx4QUNceEIxXHhEMXwzXHhDMU5ceEM5XHhERVx4RjdceEFCOlx4RDJceDAzXHhFNVx4RjVceDhCXHg5OUx1d29ceDEyYT5ceEU2aElceEIwXHhCMVx4RTRMTj5ceDlBcDtEL1JceDEwXHg4RTpoXHhFQVx4QTlceDFGXHhBNVx4OEZ8XHgxRSdDZjdceEE1XHhDMVx4RUFceEExX1x4QjBceEVFKj5dLlx4RkNceEM3KyVKXHhGRVx4QkNceDhCXHhCNFNceENGXHhCRlx4OTFceEJBY1x4RTQmXHg4RFx4QkMlJnoyXHhFQ1x4MUNceEVFIlx4MTFceDg1MUlceDhEdFx4QjJceDgwXHg3RkFceEM1XHgxRFx4MDNiekl0Z1x4QzBaXHhBRlx4MTdceEFDXHg5N1x4OUZceENEeFx4ODFPXHhDOVx4RjFceDk5aVx4QzFceEY3Zlx4MThRRFx4Q0NceDA0XHg5NkFceEY0XHhFNFx4OTZfU0x1XHgxN1x4RTknXHhCMlx4QkJceEUyKFx4MDZceEJDYTxceEEzXHhEMFx4MTdOXHhDOVx4MTdsXHgxNzdceDAxNCtceDk0aFx4MDhceENEdlx4RDJceDlBNVFceDFCK1x4RTVceDEyXHgxQXxceDEwXHg5M1x4OTlceEM4XHhCMVx4OTdKXHg5Nlx4RDQoMFx4RjdceEM0fEJceEYyXHhBQkhceEM4XHhBMFx4REVceEI1XHg5Nlx4MDJpXHg4Qlx4ODhdO2lceEJCXHg5OFx4ODVQXHhCOHNceEFBJlx4QTZceDgzXVx4RTNKXHgwOEdceDE3XHg4Qlx4RDRRXHgxNidceDBCXHhCMVx4RThMIVx4MUQxO2M8XHhGQ0E+XHhDRVx4Qzc+X1F1XHhFQz1ceEVFXjJceDgyN1x4MUZceDkxXHhCQlx4MTdceEM3eVx4MThMNVx4QjdceEMyXHgwOFx4MDM3QkhceDlGXHhDNFx4Q0FceENEXHhBM0JRRlx4QzJceDBDXHg5QltwJVx4QUVceEJDLVx4MDNceDFEXHg5NzImXHg5RTR3XHg3RmRceEI1XHgwOVx4RUVceEE0LVx4Rjgra1x4REJceEJGdk9ceEYybVx4MEJjRFx4RDI/XHhCNzFceDE0XHhENlx4ODRceEM2XHhEM3FceEY2XHg4OCh0XHhCOVx4QTFxXHhFNVdceERBOFx4RjlceEE1XHhFOFx4Q0FSJVx4RUNceDA4XHhGNVx4RDRceERCXHg5MFx4OEIvX1x4QjA1XHgwRFx4MDhceEU4XHhDQ3wtXHhBMlx4QzknNFx4RDkrXHhDRVx4OUIuO1x4RDBceEY3XHhCOFx4OTRceEUybFx4MUEqXHgxRFx4ODQ0XHhGN1x4ODlDXHhERlx4MDlceEVBXHg4N1x4RjFjXHgxMVx4MDlceDg1TUp9elx4OEZceDlFXHhFRlx4QzhwXHg5Nlx4RTJ8XHgwOVhceEQ0XHg5MFx4QkNceEUzOFx4QjVbXHg5Q2tceEQwXlx4RTBceEVBXHhCNlx4MDJceDlDUV5ceEEycFx4Q0FceERBJVx4MDJceEU0eVx4MUF5cFx4QzRceEZGXHg5Rj1ceDBFXHgwNFx4QkZceEM5XHg4MFQmXHhEQjtceEU2XHhDQUxceDFBXHhERFx4ODRceEU4XHhEOFx4ODlceDFCXHgwOFx4RUFceDgxWFx4MDhceDEyXHhDNktceEJEXHhCMFx4QTRceDkyI1x4ODNCXHhCRVx4RTRceDFEXHhFQkdceDg1PDVceDE0XHg4RmFDN1x4QzdceDBEXHhGQ1x4ODNceEY0XHhCQlx4RThceEEyXHhFRFx4RjlyXHhCM1x4RUZceEM0XHhDRlBceDE1XHhDOS5ceERGXHhGMDVceEZGXHgwMlVceEQxWEBceEY3XHhDOVx4QTBceEE3e1x4QzVKXHgxMiJFXHhGMFx4MDY3XHhFQkZceEFGP1x4ODVwXHhCRHovXHg3Rlx4OTlceEI4XHgwRlx4RTNceEJGXHhDNUZceEQ5ZVx4MURceDgxZFx4QzhceEI0XHhCQ1x4RDdceEU2XHhDOVx4QzU2TzpceDhCXHhBRFx4MERNXHg4MFx4RTVceEZFaCxceDFBUlx4RTRceEM0XHhEQlx4Q0NceDBCXHgwQktceEFCKl1ceDlFXHgxNFx4REY9XHhGNVJuXHhDQ0xpMFx4ODknXHhGMFx4QzVceEJDXHgwMVx4MDFceDg3XHhBM2dceEU4RFx4QkNceDEzXHhEN1x4Q0NceEFFXHgxOVx4RDBnXHhFRSlceDA3XHhEMVx4QTFgXU1ceEZBflx4RThceEY1IUBRXVx4QzVqXHhGM1x4MDF1WSxceEVFMlx4MTV2aFx4MTRQXHhBNlx4MUJceEM0O1x4QTJceDg3XHg4OWZBXHhBM1x4RjNceEU3XHg4MlsrWnxceDExXHhDREZceEM3XHg5MUYmYyFceERFXHgxMVx4OUZceEQwXHgwRlx4QkZceDkyXHhCOVx4RkVceDA1XHhFQ1x4RjJceEUyKFx4RURceEJDJVx4MTZceDkwXHgwNlx4MDlIXHg4Rlx4QzJceEE1XHhFN1x4QjZceDhEXHhCOF1ceEM0XHgwN1x4RjBceDEzMFx4RjJceEY4XHgwOVx4MEZgXHg4OVx4RjJsXHhEMlx4MEFceEFGXHg4NFx4REFMXHg5Q1x4OTJceEUxLFx4RUNceEZFXHgxOFx4ODM8XHhCOVx4MTB5XHhGMVx4RkM8XHgwOVx4QjRoXHhBRFx4RjJceENFKVx4QTdceDk0XHhBMlx4QjFceEExXHg5RGBceERDXHhFMVx4RTNceDE2XHhBOFx4MUNceDA1clx4MTJceEJDXHhDM1lceDExLlx4RTdceDBBXHhBQylceEUxXHgxNmxeXHhFOFZceDAzXHhCRix8XHhDQVx4OTRceEM5S1x4MDBceEUxXHhFN1x4OEJceDE5XHhCRXlceDA5ZVx4RDg6U1x4QzA1OFx4MDlceEVBLVx4QUZceEM0XHhDM1x4RjVceDgzXHhGN1FceERFXHgwNFx4MTBceENFXHhBNDMgXHhBRmBceDk5XHg4RFx4RDBceEMyW3FnXHhGNlx4QjNceEZBXHgwRFx4MDlRXHhEMFx4QkNceDlCXHg5RWNceERBXHhBMFx4OUVceDk3XHhERVx4MDBceEQyXHgwQVZceEFDXHhDMVx4MTdceERBXHg4NiU0XHhEQVx4Q0VnXHgwN1x4REMgXHhBQlx4RDFceDA0XHg3Rlx4QzVceEE0XHhBMFx4ODFceEQ3fVx4ODJceDAyXHhFRVx4OTRceDA4XHhGNlx4Q0VceEI2XHhGRVx4OTNceERCXHgxRSlceDA5YVx4RDVceEU5bVx4QkVceDg2XFtzXHhBMlx4RjRceEQ4XHhBRi1ceDA3RVx4RTZCbVx4RkJceEVGXHg5Rj9ceEJGQ0tceEU3XHg4RVx4RjVtd1x4RUZceEZFXFx4RDRceEUzXHhGM1x4MTdceEQyaEVceEMyXHhFRkZSXHhEOVx4RDVceDBDXHg4Q1x4QTNceEI0XHgwMldceDAxXHg4QT4qaThndW5SJlx4RURKXHgxNVx4OERceDE5XHhEOFx4RkVceEUxXHhGMFx4RjJNfFx4QjRceENEXHhFM1x4RkJBPlRceDBFeSJceDAxNUotXHg5OFx4REFENXxceEUxXHhDMFx4QThJXHhDRmJceDg2XHhGM1x4OUIpOClUXHhBRlx4QzJ+O1x4RjlRXHhBQ1x4MEJceDgzIFRceDkxZjFceEI2XHgwNlx4QTNceDE1bVx4Q0VcXHhCQVx4QjRceDk5R1x4OUFceDk5Xlx4QUJceEI5XHhFMlx4ODVceDE4XHg5Rlx4RTVceEQ1XHhFMVNceDAwXHhFOHJceEE4Qlx4MEVWXHhBRlx4QzJceEU1XHgwNlx4Q0ZceENFXHgxNjtceEM5XHhCQXVGXHg5RSxceEVCXHhBRFx4RjhceDlDaVx4MDB3XHhDRWBCXHhENFx4RjkoXHgxQVgjISFceEJBXHhGMVx4REEkXHhBMVx4RkYyXHgwNS1nJ1x4QThNXHhCQlJjNFx4QkRceENDM1x4OTVceEUxd1x4QUFceDE1I1x4MTVceEFCZl84XHg3RipceEZDTmkhXHg5Mlx4OENjXHg5Rlx4RThceEREXHhFNlx4OURceEFBXHg5Q3pceEQ2cFx4RDZzXHg4RTxceDA3XHgwQVx4MTlubFx4OTJlXHhGNUlNbVx4QTFcelx4MDVceENEXHhGMC5ceEZDXHgxMFx4RjRceDlBXHg4RTBceEJEXHhFMCUlXHhGQ1x4MTVceEY5XHhFRGV3XHhFOFx4QUVceEIwXHg5Rlx4ODBceEY1XHhCMVx4RDdceERCIVx4OERceDkyNixceEQzbVx4Q0FceEQ0QFx4MEZVXHhEQVx4REI5S1x4MEZceDA2XHhGRUd7QFx4QUVceDk5XHgxQlx4RkVceEJEXHhDMlx4MDZhXHgxMVx4QTdceEMxXHhBNFx4QzZpXHhERV9ceEM3TVx4Q0ZceEY3XHhERTpceDA2XHhFQVx4Q0NceEU3XHhBNCMkdF5TXHg5MVx4RDhceEQyc1x4QkZceDhBXHhFMVpceDEyXHhBOElceDdGXHg4OClDXlZrXHhCRlx4MTk/UWlceDg5XHhEQlx4MUMhXHgxMFx4MTlceDk0XHg4Mlx4RjU4XHhDOVEsXHhGRFx4ODlceEQzXHg4NHdceDk5XHg4OFx4RkNceEY4XHhCNHRceEUzXHgwNWBceDA2dVx4RDVceEVDXHg4QUJceEEwXHhFNlx4MDRHOj1ceEM5clhceEI4XHhGRlx4QzVceENEXD9ceEM0fVZceENEXHhGQ1x4REFZXHhCQlx4RDRceEUxISo2P1x4QjhEXHgwQm1ceDFCXHg5MEhceDg4XHg4RVx4ODU2XHgwNGBceEEye1x4MTRceDBCXHgxQW1ceEYyXHhCRG9tOVx4RjZceDE2Olx4MDVJVVx4MDhceEE5XHgwREhceDFEXHhBNDRMXHhFRVBceDExXHgwMlx4QzYiflx4RTZceENDalx4ODVuXHgwMFNceEMwR2VceDEyXHgxRlx4QjhgXHgxMFx4ODhceEQ1XHhDNVx4MUEyXHg5OVx4MUNceDg1RFx4ODRceENGXHgxRjBceEZBXHg4QVx4MTJceDE5XHhERFx4QjZceEE2XHg4MVx4RDc6XHhCNlx4RjExUVx4OTlceDAxXHg4OVx4Q0RQXHgwRlx4OURceEI4WFx4RkZceDBFXHg4RVx4MDghXHhDN1x4QjVceEE2XHhFMFx4MUZuTlx4MTZ6fFx4QkZceEVGXHgwOXNYXHhCMVx4OEYwXHhFMnRceEExXHhGRlx4MDRceEIxXHhDM2p8XHg4M1x4RDNceDlEQ1x4RDlnIVx4OTBBXHg5NEFceDFCXHhCNlx4MTVceEZGUlx4OUVISFx4RTVceDk5XHhDNVx4RTFceDA3XHhEQVx4RDFceDAyZkBceDAwXHgwN1x4QTdceDFGXHhFODVceDBFXHgwMFx4RkNceEREbVl0XHhGQlx4ODdceDFFXHhFQVx4QTZNXHg4Q1x4RUVceEEwXHhEOHZceEJFflx4MUZZXHgxQVx4RDJgcDNJb1x4QjlceEEwZFx4RTUzXHhFMVx4QTY1XHhEOEpceEMwSl9ceDk5XHhEQnZceEQzXHhFOFx4RjhceDkwbGZceEM5XHg4QVx4QzEzXHg4QSlqXHhERVx4RkVceEVDXHhBNCRceDEzRFx4OTFceEI2XHhEQlx4RkRceEI4XHg5N1x4QkREP1x4QThceDBDXHhFNFx4MEQ6XHgwMFx4RURZLVx4QTh7XHhENFx4MDdsXHgxMm9ceEE3XHgxN1x4ODRceDA3XHhFRVx4MEJceEVDaVx4RENEXHhFQ1x4RTVQXHhENFx4QjZceEIzXHhGQ0lceDk0XHg5NndceDg5XHg4RVx4QkJceDhBXHhCMlx4QkFceDA4NVx4QUZQXHgxQ1x4RDlFXHhEMVx4OTVOUVx4RDlceEIwXHhGQ1x4RTdceDg4XHg4Q11ceDEzcVx4MThkbFx4QjZceDBCSVx4QzhceDFDXHg4MnZceENEXHgwMlx4RTdceDhGJFx4OTlSXHhFMC5aXHhCOVx4RThceEMzXHhEOVx4MDdceDgxXHhFQ1x4RTZceEE0XHgxQ1x4MDJceDg3XHgxRlx4MEVceENFW1x4MDdceEVGXHhERlx4MUZeXHhFRFx4RDdceDgzXHhGNlx4OUJceEE4XHhCRVZceEQwK1x4RTNcNFx4MTlceDAzQVx4MTlceDkwVUpceERCXHhCQVJceEY2XHgxMFx4OTNceDk5XHgxOVx4QkFceEMxT1x4RkRxZ15ceEQxXHgxNWZceEJDe1x4REZceDk5XHg4Q1x4RDhceEZEIVx4ODFzNytceDhCXHhFOGFceEQ1XHhEMExceEUwXHg4MVpceEFEXHg4RltwXHg5Nlx4ODZceDk0KmFrXHhFOFx4RDVceDg5XHhFN1x4QkFceDE5XHhCOVx4RTNgdnhceDk0RXxceEVDZiFceDlGXHhDM1x4RENrY1x4QTdoXHgxNlx4MTVceEVBN1x4RDdceERCcz9ceEZFXHhCNiFceEU1JVx4MDNoXHhEOVx4RjBceEU4XHhDMVx4QUFceEJBUFx4OUNceDE2MShceEM0XHhDNCVMPVx4RDNceEE0XHhFNVx4OEZceDkwXHhGM1x4OTNceEQxXHhFOWtceEJEXHg4RH1ceEM3Nlx4MENceEE3XHhCQlx4RjVceDAyOFx4RUUoXHhGNlx4OTJceEIzXHhDNVx4RUQ7XHgxMG9ceEI4cSE+XHgwMSFceEY2Nlx4QkNceEYzbVx4RDZceENFc3JceEE3VWlceDAwXHhDNFx4MERceEMxXHgxMFx4QTVceEY5blx4OUZceEUzXHgxMUkwXHgxMVx4OTd4fURTXHg4MkBceEQySVx4OUJceDBCXHg5QTUzXHgwMFx4MEVIXHgwRSpceEYzXHhBMFx4MEN0YFx4OEM0LW4wXHhEQlx4RDdEXHhDNDI/XHhDRFx4RkJceEM5XHhBNShbVDlceDhFXHg4M0pceDAxflx4ODNceERBXHhGNXxceDlCXHhBNVx4RUZceEQyPVx4RTBceEExXHgxNFx4MDVCXHhERUhtfFx4OTBceEE5TVx4MTVceDk3XHhGNVx4MDdFXHhDQlx4QkJjXHhFQVx4RkRceEFGXHhGQlx4RTRceEU5RTNbVUpceDhCY1x4RTkqfVx4QjBoZlFIXHg5RDhceDkyXHgwN2BceEI5Olx4Qzg3XHhGRlx4MDRqRiNceDg5XHg5OVx4MUJceEQ2V1x4QzBceEY1XHhFRFx4RTghXHgwMTRceEREXHhCRUJceDhGR1x4MUJCVlx4QzdEcyBceERFXHhFQylceEJGXHhDM1x4QzRTeUE3Rlx4RjRfXHhBQzRceEZFXHhDMHIyX3RceEU5XHhDNj5ceDFCXHg4Rlx4MEFceDAxXHgxMlx4RjRceEM2V25ceEY0XHhFM1x4RjJceDFCXHgxNlx4QjhceEFDXHgwRVMxXHgxRH5ceEJCLVx4QzJceENFJFx4MURceDgye1x4MTBXX1x4RDBceEQyXHg3RlFceEU3RkFceEUwXHhGOFx4RDZxXHhBMlx4OEYhXHg5Rlx4MDVceDhGU2dceDExPVx4Q0FoXHhENVx4QjZceEY3XHg5MVkkXHhGOGQ2XHhENCZceEM3XHg5Q1x4QzZceEVBNFx4QjNceDk1XHhCRFx4QUJKXHhDOVx4Q0RceERFXHhFRFx4RTFceEY1O1x4RjNyflx4OUVceEM3XHg4MiA9XHgxQlx4RURceEM4XHgwQVx4OTlceDlGX1x4OTBceERDIFx4OTVceEVEXHhDOSxceDg4XHgwOFx4Q0ZceDA0XHhBM1x4OTdceDA2XHhBOFx4QzciXHhBRlx4QUVceEJEXHg4Q0BceEIyXHhDNyBceEEyXHgwM1x4OEQzXHhFQlx4RDRoVFx4QjZceEIyXHg4MUxaXHhFQkhAXHhFM1x4QjRRZSEnXHhBQ1VceEE4IDJceERCXHgxOVx4RThceDg5XHhERlx4QkZceEUyXHhCN1NceEFCXHhGMlx4QkVceEUzXHhCQidceEVBdFokXHhDNlx4QkVceDE2bipceDFGXHhGRjRdXHhDQlx4RTNkXHhDRFx4MEYhXHhENlx4RjZceEQ2fFtceDlBXHhCMVx4OENJXHhGM0RceEJGVlx4OTJceDg4XHgxRHhceEZBXHhFNVx4RUJbXHhBMyhceEY2RVx4RTV9K2JBXHg5M3NceEVFXHgxNFx4MEFRXHhFQlx4RUY9Ylx4MDMsXHhFM1NceEM4PXRceDFCXHgwN1x4OTUgXHhBNVx4RTdceEQ4UVx4RTJceEJFJFx4MDFceEU0XHhBNlx4ODVceEM1XHhBNlx4OERceERBXHhEQlx4OUZceDk3UFx4RkNbXHhBRVx4QTRceDBDXHhEN1x4ODE2XHhDQzUkeFx4QzRceEIxXHhDM1x4MDRIXHgwMHROaVx4OEVJVCIuXHhDNVx4QjZceDk5XHgwMFx4ODZceEJGXHhGQlhceEVFJ1x4QzFceDk5QFx4QzlceEI4XHgwQnM7XHhDNVx4RTRBXHgwQ1x4OTZceDk2XHgxMGlceDgxMFhceEFDdVx4QjFceEE5XHgwOFx4RDZceDFEMFx4MUZceERGT1x4QUNceDk4XHhEMFx4MDVqXHhDN1x4RjIuXHg5Rlx4QTc2XHhERlx4QjVceEY1NFx4OEVceEZEXHhEMlFceDFET1MgRVx4MERceEE0XHg5MjVhXHhCQVx4RjVceDBGWmtJXHhEOFx4RjZceDA1XHhEMEtceEUxPFx4OUZYXHhBOGpceEFDXD9ceEI5XHhGNlx4RDdceEU0TWxceEI2XHhEOVQ7XHg4NCJceEI5XHhFM1x4RENceEE2KzdceENCXHg4OFx4RENfXHg5NldceEFDXHgxQS9ceENCN1x4QzNceEUxXHhBRFx4QTBceEM2XHgwQVx4QjZnXHhGMV1ceEQzVHAkW1x4QUZceERBXHhBNk9ceEY1XHhCMEhceEFCXHhBQlx4OTdceDBFXHhDRl5MaVx4RjFceEQwXHhCRlx4MUFceERCXHhFMFx4QzhceENDXHgwMVx4QjBceDA5KmlceEQ0XHhBMC0vXHgwRmJceEUxXHg4Qlx4RkI3XHgwMVx4RjlQXHg4Rm1ceEZCXHhFQyFceDk0XHhDOVx4Q0I4XHhDRFx4RjcjfFx4QUZceEIzXHhGQVVceEQzWnp1XHgxQlx4MTlceEIxXHhBRjpceEY2XHgwM2ZceDdGXHg4MVx4QjNceENEXHhDRENceEE1ZSZceEJDYXVceDhCXHgwN1x4RUJceEVDTm5eUm1qXHhERFx4MEFceEM4T1FceDkwXHhCNVx4QjZceEU2XHhFQlx4MTJTPFx4QTVgOlx4MEMhXHhENFx4MUFceEYyXVx4QjRceEJGXHgwQVx4MUNeJlx4QjVceEZBXHhDNFx4MDJceDBCXHhGQ1x4ODJKXHgxMFx4RTBceEU3IVx4MTFceEUwXHhBQ35YXHhBMFx4QzJceDhEV1x4Q0ZceEZCXHhDMH5ceEZDUFx4N0YoXHhCNWkjXHgxRlx4N0Y/XHhCOFx4MDQ9XHgwRlx4MUNceEYxXHg5Ml9ceEY3XHgwN11ceDg3RFx4RjdceEZEXHhDMFx4QzJceEYxX1x4OTdgLFx4OERceEYxXHhFN0FceDE1XHhDQlx4RThceDgwXHgwOCtceENFPFx4QzVceDkxXHhFQ11NcFx4RTdceERDb1x4QjJZXHgxMT5ceEEyTVx4RjhceDA4W1x4RkFceEM2XHgxRVx4RUNceEMxJFx4QTFceDg1XHg5RVx4RkVceDhDXHhCM3ZceDFEXHgwQVx4QkJceDExXHhBMFx4OENceEVCXHgwRVx4QkNWXHhFMF9ceDFDXHhCRUNceEIyXHhCRlx4RTlceEVCajtceEMzXHg5RVx4MDBceEY1a1x4MDhceDBGXHg4NVx4QjRceEVEV1x4ODNJXHhCNSNpX1x4ODVceEE1Ylx4MEZceDBCXHhCQVx4OThlXHg5RSpNfVhceDhBXHgxRFBceDk3XHhFRFx4QUItXHgwRTRDXHhDRFx4QTlceEZDPlx4QTRceEExXHhGNE5ceEFFXHhFNzFceEExNVx4Q0RceEUxXHg4NGJceDg0XHhGM1x4RERceERDPFx4MTYhXHhBRlx4QzJceEJCXHg5M1x4ODlceDE1XHg5QSxceEQwXHgwMDxceDkzXHgwOFx4QUVceDdGRlx4MTRceEI2NFx4REYxXHg4OEJceEU1XHhGNVx4QTlceEM3XFx4RDI8XHg4Mlx4QTFceEJFXHgwNVx4MDZceENCXHhBNCtceDk3d3VceENETlx4QkJceEVDXHgwRFx4QkMtR1x4MDRiXHg5NVx4QjdceEIxaEZQS0FceEVFXHhCQVx4QkRceEQ1XHgxRFx4QzJceEUxXHgwNlx4QzhceDBDXHgwM29ceDFFWVx4ODM+Y1x4RDlfXHhCRkNceDEwXHgwMS9ceEQwXHg5M1x4RTJceDA0M35ceDAxXHhEM2o5XHgwQVx4RjFceEI1Ylx4MDZceEE5XHhEMFx4RURceDkwXHgwM2IvXHgxNlx4OTUrXHhDNElceEMyXHhBRFx4RDRceEQ3XHhBRlx4QjNceENCXHg4MFx4REJceEJEZFx4OThceEM4XHhEOVx4QjhJXHhFRlx4QjE/XHhGM1x4RUFceDgxXHg5OVx4QUFceDlFRlx4MDlceEUzXHhCOSc6VmlceEYzXHhBRFx4MEFceDgwXHhGM1x4MEFceDFGO1x4RjlceENEXHhGN0hceEZCXHhCRVx4RjVceEREXHhGQVx4MEVceDBCckhdXVx4QjZceDBGXHhBOVx4Q0QzYVpcK1x4ODBceDEyXHhDN1x4QjVZYlx4RUJceEZDXHg4MVx4ODVxXHhBMlx4QzJceDBFXHhCN1x4QURceDlFTVx4QkFceDkzXHhFQlx4QThceEZBSlx4Q0FceEU2XHgwM1x4MURUXHhBMFx4RkNceENEJlx4MEVceEY3XHhBRURWXHhDN2NceEYxXHg4NFx4MDZDXHhENFx4OUFceEQ0XHgxM09ceDgwXHg5M1x4OERceDAwXHg4NVx4MTJceEEzXHhDNiRceDE5cXN+XHhGQ1x4QjdceDk3XHgwQVx4MTFceEREJD1ceEUzZ2swdVx4OUVceDBESFx4OUVceDBFXHhFNVx4MDNceDgzXHgxRnNZXHhENlx4QjZceDE1XHhENGtceDgyXHhBMFx4QzhceDhBSFx4RUQnXHhFOFx4OTJceDAwXHhFRVx4RjZceDFEXHgxNFx4QTMiXHhFQ1x4RkJceDdGfVx4RTJceEQ4bXw9XHgwNFx4MDRceDlFXHg5MVx4MTBceDA5XHgwN1x4RDBceEI1XHhFRVx4QjZ5IyVceEZGPVx4RjFceEJFcVx4RjJceDk0XHgwQjFceDE3YFx4OTNceDk1XHhCMFx4QzZ8Q1x4MThceEM2Plx4ODlNXHhEMFx4MUZyXHhBOVx4RkZceDA2XHhBNVx4RDNceDk5XHhEOFx4MUZjXHhBNVx4RDM7Ylx4OUFceDE4VXNceEI0XHhFQ1x4MUQ7XHhGM1x4OTgyT1x4QTJWd1x4MTJceEI2cCBceDhBXHhCRFx4QThIXHgxRFx4OTQ4OSxceEREXHhCQlx4RTJceEIzVnU8XHhDOVx4QTFceDEyXHhFMFx4MDZceEM0XHhFNCBceEI3XHhEMjFceENGXHhBRVx4RTNceDE0c1x4REFceEE1XHg5Nlx4QjBGXHhCQlx4RjNceEM1U1x4RUZhS1x4RjVceEZEVVx4OTdceDE1XHg4NXpceDgzXHhDQ0NceEREXHhDOVx4QzRmXHhBNlx4RDFceEY1XHhDMFx4QkF+XHhEMGA5LVx4QzBceDlCXHg5OT1ceEMwRElDK0lceDE0XHgxN1x4RTZceEYzKlx4OTFceDE3XHg5RVx4OEFYU1x4QzIgcFx4MEN4XHg4QVx4MDdceDdGXHgwQVx4RUFceERCXHhEMCRTUjBceERCXHgxQ1x4OEIxXHhGNlx4REJceEYzXHg5NzIuWVx4MDRceEE4QFx4RjgxXHgxRVx4OUFceEUxMnlceDFBZVx4QkRceEIzXHgwQ2FceDg2KytceEZEXHhFRVx4QzVceDhENENGZ1x4Q0JceERCXHhCQ1x4RDQjSVdceEVGXHg4Q1x4OURceDA1XHhERm9mXHhGN3NAd1x4RTBceEZBXHhEQVx4ODZceEU2XHhFNlx4OUFceEE0XHhBN1x4ODFtXHg4NH5ceENCXHhFQVx4Q0FceEMxXHhDN1hceDFBRFx4MDNceEY1XHg4RFx4RDclN2xpJ15ceDFGXHgwQVx4QkVXZXNuXHg5Qlx4MDA7XHg5MVx4MTIwZ1VVXHg4QVx4QTJceEVCXHg4NVx4MDQuXHhENnZceDg4R1x4RjVceEQxclx4MEFxXHhFNnRceDFEXHg5QVdceDE4UVx4QzVceDg1JVx4Q0ZceEQ2XHhBMjxceENFdVx4MUFceEYwdlx4MTJwXHg4QXdceEFGO3tceEREWit+WW1ceEREXHg4Nlx4RkJnJlx4RDlceEU0XHg5MlJ3XHhDNFx4MENvZVx4MDRceEJFXHhDQ1x4REZceDg4flx4OTcwXHhBNVRceEZBXHhGRnRxXHhGMT1ceDk5XVx4QkRceEU1XHhGN1x4QkZceDE1XHgwMlx4RjU6X1x4QUFceDEwXHhGQ1x4MURceDg2Xlx4RUMrXHgxQlx4RDY0XHhEQVx4QTJceEUzKTNGXHhCRDdiXHhDNFJceEZDZD9bXHhGNFx4RTF4MFx4ODZ7XHhCN1x4QkQ6XHhFMFx4MUZceEI2XHgwOFRceDE0XHg5NFx4MUZceDFFXHhDQ31ceEUyXHg5Rlx4Q0ZceEJCXHhCNmxceEQwXHhDRVx4RTFceENCNVx4RTJceERCXHhDQlx4RDFceEE1XHhEQVx4RDNceEE3ZzpceEVEXHhCMFx4RThceDkwXHgwM1x4RTdceEE3XHgwMC1ceDBCZ1x4QzFceEI4XHgxQkV4YFx4MDNceDlEXHhGOC5ceDFEPmwxXHg5RkhceDA0XHhCQVx4MDFceEMyXHhBNiNAVlx4QjVceENBXHhGRSs0LCtceEI3aXFZXHg4OE1ceEE1Z1x4MTFceDAyXHhBN3JceDkzJFx4QUZQcVx4OERceDhFXHhGRFx4MTJceDE0XHhFN1x4MUZlXHhBNTVceDE4XHhFRUJaaSc/XHg4RjhceDgyZTUjXHhDMypbSFx4RkFHXHgxNFx4OUNdXHhBN0xceDkwXHhCMlx4RkRceDk0dFx4RkVceEVCQztceEYyRFx4RkNceDlDXHg5NFY7XHhGRVx4ODhceEIzXHhEM1x4MERceDBDXHhBRlx4QzFceDk4XHhGRlx4RTdceEIzXHhBOVx4QUJceEEyelx4QzdceDhFXHgxNCt8XHgwRVx4RENceEJFXHgwNVx4RUZceDEzXHhBNVx4ODlceDgxXHhGNlx4QjFceDEyXHhDMVx4QTU4KFx4OERceDhGXHhBMG4kXHhCRlx4REMkXHhERlx4RjdceDgwXHhFOFx4QThceEREXHhGOFx4RURceDA2XHgwREFceDFDXHhDRU1AXHg3Rlx4OTVceEE3MVhceEE4K1x4QUZceDlFXHhBOFVceEMwXHgxM1xceERCXHg4MVx4RTBceEUyXHhERlx4QTlDXHg5Nlx4QTB2XHgwQVtceEU3XHgwMFx4RTEvJ1x4OEJceEFFXHgxOFx4RDVceDhCXHhCRFx4OERceDBDXHhEQ1x4MTZceDA0XHhFOFx4ODJceDA0XHg5MFx4MTheXHhGN1x4ODB8S1x4QjFceDAyXHhBNlx4OUJceDFDXHgwN0FceEIwXHg5Rlx4RTRceDBEXHhFNVx4MDN6XHhGRFx4RjhceEE4XHgxNVx4OEVceEE5XHg4NVx4MERvXHhEMDpceDFFa1x4MUMuXHhFOVx4OTBceERFPSlceEM2TT9ceDA2XHgwQVx4MDM2dFx4MUJceEEyXHhFRFx4Q0RyXHgxMlx4MEFceEI2alx4OTFceEFGcUlceDBDXHg3RlRceEZBTlx4RTUwXHhDQVx4MDNceEEwXUdceEM0Mlx4REFceDA4XHhBRlx4RTBceDk5V0kuRlx4QUJceDEzXHgxQzxceDE4XHhCRlx4QzJceEE0XHgxMFx4MDRceEQyXHhGOVx4MEE/XHgxOFx4Q0ZceDk3XHhCOVx4QjFceDgzXHgwQ1x4RjhceEVFXHgwOFx4QTdceEY2PFx4QzJceENBaFx4QkVceEMwIVx4QzUjR15ceEM0L11ceEFEXHgwQVx4QUZceEM1XHhCOVx4REZceEJDIVx4OTRETFx4OTZceDEze2lceDk5XHhDRFx4MTBceEJGXHg5MmBceEU5XHhDQzhceEM2XHhCMlx4QkVceENBPFx4REFceDAyXHgxN3xceEIxXHhEOVx4RTVceDg1bVhceEU3fFx4OENceDk0IkRRXHhCNlx4OUFceEQxXHhGRlx4RDVfXHg5QVx4MEMgUlx4RkVceDhGXHhBQlx4OEUiXHhFOFx4ODRceDkxXHg4MVx4RDFceEE2eFx4QUJceDg0XHhDM1x4QzRceEJCXHhFRlx4RkJceEM5XHg4RFx4QTREXHg5Q3BceEE5XHhCNVx4QjRceDExfnRceEQzNVx4RUJNXHhBRHNceENCXHhEOE5ceEFGXHhENjRceDE0Tlx4QjhceEU3XHhDMX5ceENGXHhGN1x4QzJWbnk0XHhEREFIXHhDRlx4Q0EiXHhGQiVceEZGXHg5Mlx4OTFceDE3YFx4OTlceDlFXHgxNjhceDdGXHhEM0FzXHhGNFx4QjdceEM5YFZceEI4VTpwU3xceERCW1x4MTgjV1x4OTBceEMxXHhENlx4QzNOPFx4MTBceDBBXHhENWNzXHhGNFx4ODBceEVGXHhGQ1x4Q0M0XHhDNC5ceEEyO1x4RjVgXHgxN1x4MTZceDE1XHg5MFx4RUQvXHgxRFx4RDdceEM3VVx4QTRceDE5XHgwNVx4Q0QuXHhCMFx4RkNceEQzXHhDQzVceEQ3XHhDNjI2VFpceDkwIlx4RjFceDg0PVx4RDVuXHgxQipceDEyXHg5MFx4RUMyRnBceDgwZUMsXHhFOVx4OEZiXHhGMlx4Q0FceEYwXHhFRnE4LlNceEIzKUU/XHhDMlx4ODhceDE1OVx4MTJceDBFXHhBMFx4QTdceDg2IVx4QjF9eFx4MDZceEE1T1x4RUJceEFBX2VceEVCPFd3XHg4OT1ceENFXHhBQ1x4ODBceEJDaVx4MDA5XHhCM1x4OTQnIlx4MDhceDkyeDhceDk4XHgwMVx4QzE/XHgwMVx4QzRbLVx4QTF5Tlx4OTRceEM2YmpceEJBb1x4MEZceDBESVx4RUZceDEyRlx4QTBceENGIlx4Q0JcO1x4RDlceEIyXHgxQytSXHgwNlx4OEZceEUxLilceDk3elx4QTBceDg0XHhGQ1x4N0ZceEJBXHhBNS0sXHhFNTdqXHg5Nl1ceEQzclx4RDhqaFx4QkMnLVx4MDY3bnx4XHg5Qlx4MDcmXHg5Rlx4OTdceEZEXHhDNlx4QzNceDlDbnBceENEXFx4RjdceDA3X1x4QkRceDgzXHgxN1x4RDJceEYzXHg4Rlx4OTdceEQzZVx4OTdceDlGKlx4QTQ6XHgwNlx4RjZceEQ4aFx4REZHXHgwOFx4QzJsXHg5QVx4QURceEMxOFx4QzhceEU2XHhFNG1ceEFEXHgxMVx4QTcyTVdjdFx4RjVceEU2XHhCOVx4MDlVNm9ceEFFXHg5Mlx4OUMtXHhDN1x4Q0ZdTlx4OEZceEVEXHhDRFx4RDJceDAyQnR1XHg4M1x4QkZ2XHhEM1x4RkNceEI2elpceDFCTFx4QzVceEY4XHg5MFx4QzcheFFceDEyXHg4RnBceEI4XHg4QWh6YnNceEY5JFx4QUEpXHhBQ1x4OUNceEQ3I1dceEYzXHgxRF8tXHgxNm9qXF9ceEUzP1x4QjlvXHgxMXJceEVGXHg4OUJceEVFXHhBNDlceEJEOFx4Q0ZceERCQjI4XHhFMVx4RDFceEUwYlx4QjVceDBEXHgwMVx4MDlceDFGXHhCRXVceDBDXHhCMCxceDgzOlx4RUFceDk1YFx4QTVceDkwclx4MTRceDFDL1x4RUFceDFEKGVceEJBUlx4RDlceEM4NVx4RUVJXHhGQ1x4MDg5XHhEQVx4MDZceDkzXHhBNlx4QjhceDgwXHgwRVx4RENceEFBXHhCRVx4RTdceEJGI1x4RkIjPFx4RDRceEFDVVNceEZETiJFXHg4Q1x4MDJceEFCXHhCOUZceDlCXHg4RVx4MDZceDk5XHgxRVx4RTNceENBXHg5NVx4RjhceDE2XHg5N1x4QzNeXHhFNSVceDFCXHg4QVx4OEVGXHhEMVx4MDBlXHhFNFx4OUVceDgzXHgwMFx4MEFceEJFXHgwMD5ceEEyeClceDEyTVx4RjFceEMyXHg4M1x4QzRIXHgwOUtceDg1XHhFRVx4OEZceDhDXFx4RkNceEU2XHhBMjlceEE1MVx4OUQqOmZtZFx4OTBceEY1XHhEMH5ceDBFXHhGNlx4RTJVW1x4ODFceDBDXHgwOVU9WntSXHg5N15ceEU0Slx4QTBceENBXHhDMFx4OTBceDhDIVZceEIwXHg4OVx4OURbLmNceEMxXHgxNUFnPEtceEM0XHg5N1x4MTIiXHhEQnVceEZCXHhEM1x4RUYqXHhGNHBceEJGbVx4Q0JceEE3M1x4QTd8XHhFQVx4QkNceEZCXHhCMVx4QjkwXHhCMlx4OUFceEE0XHgxRE5ceDE0XHhDMFx4QzZceDkwXHhGOC1ceEE3MVx4QzNceEVBXHhDQ1x4QjluZTpceEU2XHhFMGNceENEXHhCNlx4OTg/bF5PXHg4RVx4MTJceDgwXHg4QVwgXHhGOVx4ODImc1x4RkViXVx4OEY3fVx4QTAyXHhERFx4RDReXHg4Nlx4MTFceDlCXHg4OFx4MERfXHhDNlx4MDBceEUySVx4ODlceEFEXHhCNVx4OTdvXHhFMFx4OUVceDBGXHg5MFZceEE4XHg5NVx4QzF2Ilx4QkVceEI0XHhEQlx4RjhceDA0XHg5MFx4QUFceEVBXHg3Rlx4QjNQdFpceEIzXHhBRG9ceEIwJCxceEY3XHhDNVx4QzhceENCXHgwMlx4ODBceEM2XHgwQ1x4RkMrQlJceEE2alx4OUZceDA0XHhFM1x4QjAxXHhDQ1x4OERceEQxXHhENVx4MUJDXHg5RTxceDFBXHhGQj5ceDExXHhFOFNceEZDfChceEQ0XHgwQTFpM1pceEYxXmZceEMxXHgxMFx4ODhceDBDXHhDOV5ceEZBXHhBN1x4RDdLXHhFOVx4RkNceERCXHgxOVx4RURceEI0XHhGMz5ceEZFXHg5Q3NyXHhGOFx4OTM0SHFLXHhDNVx4QzJceDFEUlx4RTF0WGVceEU3P1x4OUZceDg1XHhCOVx4OThceEUydlx4ODJ6I1x4MUZlXHhBMlNceEJDXHhDMC5ceEIwZlx4QThceEU5XHg4Qlx4MTFQXHhCOVx4QTRceEVCXHhBNFx4MTJpPlx4QTRceDFEXHhEQVlceEM3UVx4Q0V4XHhBMFx4Q0VceDhCY3NPXHgwRVx4ODlceDBERlx4QjhceDhFVVx4QThceDA0TFx4QjdtXHgxQ1x4ODZceDgyXHhGRTVceEU2N1x4RTBceEZEXHhFMFx4RTRceEVFXHg5RFx4RURKIElceEZBXVx4MEZceDE5XHhBQ1x4RTczXHhFRFx4QjZceEQxXHhBM1x4OENyWlx4QzBEXHhENFx4QzU4OVVceDAzXHgwMlx4MEVceEQzXHhCNVx4REZceEUxXHhBM2hceDk0VVx4QTB3XHhCQ1x4QTNceDk0V1RceDFGXHgwRFx4Q0FceDlDXHhCN1x4RjYyXHg5OVx4RURceEM2XHhGQ2p1XHhFQVx4RDEkSSZceEY2XHhFRE9ceDlFXHgwNVx4RTRceEZBXHg5RFx4RjJceEZBXHhBMHwxXHgxOFx4OTQsXHg4RCt9XHgxQzw3fFx4QkJceEIxXHg5OVx4RUY3XHhFNlx4RTFceDlDIVx4QThceEQ4Qlx4RjRceDhGXHhFMVddXHg3Rlx4OUJHfVx4RDI7XHg4M1x4RDhceEY3XHhENFx4QkFiXHhDRFx4QjZrXHhGQVx4Q0NceEU4MFx4REYjXHg5RCk/XHgwMlx4MUY4Qlx4QTBnXHhFMVBceEI3XHgxMVx4OTNceEIzXHhCQlx4QkJceDlBXHg4Nk45XHhBRntceEE5JFx4QzdceDg1N0JceEM1fVx4RThceDFCXHhDOFx4REVGJVNceEFBL2FceERGKVx4OEVceEVEXHhDM3RceEJEfnlceEI5XHhDRFx4QkZceDdGXHhENVx4QzNceEE5XHhCMzdceDk5R1x4QkZceEE5ZWBceDgyXHhDOFx4RUY4XHhEOGRdXHhGNVx4RUReQzRceERCXHg5Mlx4QTQxNStceEZCXHhGMFx4QjNceEIyXHhGRVx4MTlceEU1MEx5M1x4RkVceDhEXHhEMlx4MTdceDdGXHhEN3xceEIzXHhFMCVDelx4MDJceDhFXHhDQSFceEIxXHg5Qlx4OUNceEQ2XHhDN1x4MDEpXHhCNlx4RDJjdiRceDk3XHhERlx4RTVceEJCN1x4RTdceDBGeWJKcVx4RjJzXHhBRFx4ODNJXHhFOVx4RkNceERFXHhBMFx4QThceEIyXHhDRVx4RDh3XHhBMmpaXHhBQVx4OTlceEMxXHhEMFx4QTNceEMzXHgwNlx4RjRgXHhEM1x4RDNPXHhBMilceDlGRlx4OUNceDAwXHhEQ1x4RjQgXHhDNWhceEE4XHhGQz1ceEQ4XHhBRVx4QkFceDgzXHhFMlIsXHg5N1x4REJaXHgwMlx4RjlceEE3XHhGRVx4MEUjSnNceDAwXHg4QVx4RThceDg1XHhDRmtceEExZFx4QjZ4XExfXHgwMHE6XHgxMVx4RUFceDE5XHhCNiFceEQ4XHhGN1x4Qzd+XHhERFx4RDlceEZGXHhBRFx4MDJceEM2dGN4JCpceERDXHhDQ1VaXHhDQ18tXHhFMkVQXHhEM1c4I1x4RUZceDgyXHgxMlx4OTRceEE3MVx4MDRwXHhGNVx4QTBceEREXHg5NEdceDE1OVx4Q0VceEY2XHhEM1x4RDlceDdGK1x4RUFceDAxblx4OEZceDg3XHg4RFx4QUJJUDMuKVx4MTZceEJFXHhCOV9GXHhFQlx4QTVceEFDXHg4RVx4RERceENCclx4Q0NceEE4P0hceEMyXHhBOVx4QzlyXHhGQihceDBFM1x4OTkva2hlJmpceEUzXHhCNyNceEIxXHhEOFx4QzdceDk4XHhBQlx4RjlceEZBXHgwOVRceDlBRFx4OTZceDBEXl5ceDA3XHhFMlx4RUNceEM4TD5hO1x4MDZceDg5XHhCMU1ceDAxVlx4MURceDBEXHgxQiZceEE0XHgwQWwqXHg4MVx4MUFoXHhBMUlceERCc1x4MDVUXHhBRihceEZGXHhBMmFceDA4XHhCNlx4RjNceEQ0XHhBMFx4QTlsXHhBRlx4RjlceEFBcVx4QTN8XVx4REJ5XHhGRFx4RURceEE0XHhBNkJySSVceEU1XHhCOFx4QTZceEU1XHhFRVx4MDRceDhBKy1ceDExIlx4OTAoXHhEQ1x4RDFceEE4XHhENVtXa1x4REFceEQ2XHhENlx4MTFceEFEXHg4Mlx4MTVbXHhENlhyZzFceDE3XHg4Rlx4RDFceEE2XHhCOVx4RURcXHhCOThceDAyXHhERFRceEMyQUhceDA2Q1Y3XHhDODx2XHhFNFx4ODBceEE3KnxceDBFXHgxRVx4QzFceDFDXHg4Nlx4RDIraVlceEEyWFx4ODBceDFFXHg4NGdceEYwb1x4MTIqXHgxNFx4OTJceDg5SEFceEI0XHhFNVx4OURceDk3U1x4QURceEFCTFFceDBGXHgwOXRceDA5O1x4RDhJXHhBQ1x4RThvXHhGN1x4RDdMXHgwMT5rXHhBNWFceDg2XHhDRlx4MTBceDE5XHhBNE9nNVx4RTVSXHgxRFx4RkFceDk1XFx4ODlQXHhEMFx4QkN5XHg5Qi1SXHhFQ1x4MDR0UVx4RUU2XHgwM1x4MDRceDgzO1x4ODhceEVGaG5ceEUwXHg4Nlx4RkUgXHgxQVx4Q0VAXHhDMiQyUlxHL1VOeFx4MEJicFx4N0ZceDFEbERceEJFXHhGN1x4OURMXHhGRFdceDFFWVpceDBBXHhDRWVceDk4VGRuSlx4MTRceDk0LiVceDAwXHhFQVx4RjBceEIxNiIlXHhGNHs4XHg4OFx4QjNIMlx4RTQ5XHhDRWdrXHhEOWY1XHhFN1UkXHhGMFx4OUFdXHg5Mlx4OEJGZjFceDAxXHhBRFx4MDBceEYxXHgwOEtceDgyMFx4RDVceEM3aFx4OTJceEY3XHg4Mlx4ODNxXHg3Rlx4OTdceDBBXHhBRVx4QzJceEYxW1x4RThceEFGXHhCMjVceEE1Oj4/Slx4RUUsXHhCNVx4QzZceDg5XHgxQy5ceEE5SG4oblx4OTkxXHg5QVx4ODUwXHhEMVx4RkVceEFFXHg4MFx4MTZIXHhDN1x4RTNceEFCXHhBRlx4REJceEIyXHhGQlx4OTZJXHgxRkJceEMyXHhGM1x4RDhceEIzXHhDRHRceEExbFx4ODNceEU3J3MtXHgwRGRceEI2XHhBN1x4QkVceEEzXHhBRlx4Q0JceEMxXHhGNFx4OTctXHg5N1x4QzhceDBCXHg4NWhceEM4UTw0XHhDQ1x4RUVceDhEXHgwOVx4MDJyXHhDQ1x4MDByXHhCNGI0XHhCNnFeXHgxMFx4RDdceEM1LWFceEU2WFx4MTVYQVx4RTRceERCXHhBQ1VceEExXHhERSRceEQ1XHgxMmxceERCXHhFRVx4QTVceDlBR3xceDg1UFx4OEJeXHhBMWBceDlFXHhBQ1x4RjNceEM1XHhCNVx4REZYTlx4MUFceENGXHhCQlx4OUFLXHg4Q2dceDg1M1x4QjdceEU0XHhCRlx4QzJceEQ4XHhFQ0d5XHg4NVx4OUVceDg0XHgxMFx4RjVLTFx4QTJceEYxUlx4ODNceEE1ZVx4OTFceEM2XHhDMWpeelx4REJceDg1elx4QjVceDFGXHhEQlx4RjlceEFEXHhCMlx4MURceDA0dDdLXHhBRVx4ODBceDBCXHhERVx4RDNceEE3XHg5RFx4RTl1Zlx4OEEgXHg4OVx4RUVceDk2XHhERlx4RTRlV1x4RUZceDhEXHgxMlx4MEJiI1x4QjJceEJGXHhGOW9ceDgzXHhDQ1x4ODAzN1x4QjdmaVhceEYyXHhCMVx4RUNceDA2IUcwPFx4RDNceDk5flx4RjlceEYwNThceEU4XHgxOVpceEY1XHgxRHYiS1x4MUNceDAwXHhBQS9ceDkzXHhCQ1x4RENceEIyLFx4MEJQXHhERFx4MEJceEM3XHgwOFx4QURceEE4PVx4MEFceDhEXHgwOVx4QjNceDhCYFx4QTVceEEzXHhCNlx4OTZceDkxXHg4MFx4MDZceDg1XHhBOFx4RkJceENCVVx4RjB8KkFTXHgxNCxceEMzXHhCM1x4MDlceDkxOi9ceEQ3MChceDFDXHhGNFx4RURKWVx4RjNceEVEOFx4ODhceDlFXHhFQlx4MDBceEQ5Plx4QTZzXHg5RSxceEMyXHhFRVx4RTFDXHhGQVx4ODBQXHg4NH42VFx4OTcgXHhDNFx4RURceDk4XHg5NzI9XHg5OF5ceEQwXHhDQlx4RUFkVSBceEE0ZThiXHhCRFx4RTF1Tlx4QjJUXHg4RVx4QzhceDBFXHhFN1lceDlBOFx4OEVceDE3XHhFOSZceDg5RilGXHhERVx4RThceEZCcVx4REJceEEwNnVceDAzKFx4RjVceDk4eWJceEY2XHhDMlx4ODcwXHgxNDxDXHhFNFx4MEJceDE1XHhCQ1x4OTNceEI0XHhBNlx4MTBceEU3XHgxQkZceDE0XHhCQ1x4MENceDE5I1x4MDVceDk0XHg4Rlx4QzJ+XHg4NCtAXHgwM1x4OUFceDFDU1xceEMxKFx4REIvXHhCNFx4MTJVXHhCNlx4QTRWezZceEI3dlx4ODFceDAxXHhDNFx4RDNVXHhFMVx4RkFceDk4fFx4MDQuPlx4QkMkXHhERTFceEExXHgxNHJceDk5XHg4RVx4QzAmXHhBMFx4MDg+RC1balx4QzJceERDV0pBK29ceENFXHhFQ0NceEIxU1x4ODkhUDBceEM5WXdceEQ4W2lceDEyX1x4RjdceEMwXHhGOVx4RDJceEQzK1x4MEFceENFXHhBNlx4QzNceDgzXHgxRHBceDE0Ylx4QjgwXHhBNFx4ODlceEU0XHgxRVx4QThceDhGXHhDMEd4XHhBMFx4RjhceEM4SFx4RkQ7PypTXHgwNFx4QzNceDgwVVx4MTJceEYybVx4ODhyXHg5N1x4MTZceEEzKlFceDkzQUBceEU4XHhGMGpceERCXHhBQTZceEQ0e1x4OTRceENCPWdceDFCb1x4OTJceDk0Onp6WVx4RDdVXHgxMlx4OUNceENDXHhDMWBceDBDXHgxRiVceEE5XHgxRFx4RDlceDAxXHhGOFx4QzklXHhDQ1xceDhFXHhCMlx4QzdceEQzIS49XFx4RUVceDk0SFx4REZpXHhBQ1x4RkRgLXt1XHhFNFx4OTUtLFx4QjBceENCVjJceEU1XHhGNFBWfVhceEE4XHgwM1x4RTdceEIwXHgxQlx4QTlceEVCQ1x4REZceDkwMVx4OTVqUFx4RUFceEU3XHhFM3ZceEQ1PVJceENFLTtceEI2ZVx4REVDXHhBN1x4QzFceDFBfVx4MEY1XHg5NWJceDBDXHg4Qm5LXVx4Q0ZceEQ0LDBceDkyXHhEOUhceDlBV1hceEJBKSlWLVx4QzZceDE1bz1ceDBCQmlwXHgxNE9ceDExZi5ceEVCXHhFMFx4QzJceDA2XHg4QVx4Q0FceENGXHhDMFx4RTBLXHhFMFx4MDVceEFDRFx4RjdceDkwXHgwNlx4OTBceDg4SC0rXHg4Qz9bXHhBMExceEZBIFx4RUVceEYxM345XHhFNlx4MDNTfnlceDAwRGw2XHhFMVx4MTFceEVCXHgwRixceEExXHg5Q1x4OTlvXHhCMihceDlEbHlceEY3XHhDOFx4OTZEXHhBRVx4RjRceENFMVx4RjlceENBNFx4OUJceDFGXHhGQ3tOXHhEMVx4QTRceEJEXHg4NiVceEYwXHhFNHhDXHgxM2RBXHgxNFx4QzNceDlEXHgxOW19XHhEMlxceEYzNDpceEM5byRceEFCVHN8XHhERU1ceEJFNH1ceDBFXHhBQz1iN1x4RjRceEYyXHhDNVZqXHhBOERceDgyXHgxQVx4QUMqXHhBNFx4RTZXXHhCNFx4ODlHTC9lR1x4OTh7XHgwQipFXHhEOVx4QTlceEU3XHg4Rlx4OTZceEE0XHgxMFx4MEQhalx4OUZceEUyXHhCM1x4MEJceDE2XzJceENCXHhCNFx4QkRceEZDXHhGNilceDhCXHhCQVx4RThceEYxXHgxQlx4QzlceDFDXHhBRHVceERCXHg5Q1x4QkRceEM5Mlx4QUJceEQwXHhFN31ceEQ4QCdceEE0XHhGOCVceEM4XHgwRSc3XHg4NVx4RDlceDlGXHg4Rlx4ODVceEZCQ1x4ODZceDhFXHhFMVx4QzNceEI5XHgxNWVceDA1XHgwRFx4OUUubVx4RjJceEI3XHhEMlx4OUVYXHhGQlx4QjJceERFXHhDNXVceEY4LyRRXHg5Mlx4RkFceDBDYVx4RDVceDA2XHhBQWdceDAzYFx4QkYhXHhBOVx4QzFceEQ4XHhFNEVoXHhBOFx4QzZceDhDXHhFNFx4OURceEI0XHhERVx4OUVAXHgxRlx4QkRPYVx4OUF1UVx4QUVceEFFXHhERVx4OUUzdVx4MEZuXHgxQlx4QUFceEFGXHhBNldsd1x4QUF3RFx4MENWPEtceDBBXHhFRVx4RTBceDdGQFx4MDBQdFNceEJGNGdceEUxXHhEOVx4RkNceEQxXHgwRFx4MTlceEZBWVx4RDJceDA2ZV5ceDg2XHgxNlx4RjhceDkwJ088XHhDQVx4ODFtelx4RjdceEY2OTBceEE5XHgwMjxGTl04XHg5M1x4RDJceEE1Wlx4ODhceEI2Q1x4ODhceDBCKHlceEI4XHhBOEtceEE2XHhENVx4RDUjbVNceENEbGkyXHhGMlx4RkRceERBXHhCOFx4RTJceEUxXHgwM1x4MTBceEIwd1x4QTdceEFCXHgxOVx4OTlceDg1SyRceDBFXHgxQipKXHgxNlx4QzRjOFx4Q0VgXHhBM1x4ODY8XHhCNmpceDExPjlNXHhCMFx4OTM7flx4QTJJXHg4NUQjWVx4RUZhRD98XHgwN3FceENEXHhCM1x4ODJceDkxXHhENFx4Q0NceEY2XHhERVx4RDVceDBFXHgwRVNpXHhGRnJceEYwaVx4QTAqXHgxNVx4RkJceEQ0XHhFRC5ceDE1LVx4OTRyQG9zQiBceDE3NVxceEY3XHg4Qlx4RDVceDE5XHgwNDhceEEwXHg4MVx4RkVceDEyUzBOXHg3Rlx4RDlceEQ5XHhENFx4Q0ZgJ1x4OENceEMweF9ceDA3XHgwQlx4QUNceDhDXHhEQ1x4ODkxQ1x4MEVXXHg5RWdceENBXHgwRFx4RkNceDdGXHhFN1x4REIhXHgwNkBdXHhDRVx4QTRceEI3XHhENDdceEEwXHgwMnlceERBXHgxOVx4RjIrXHhBRlx4QURceEY4XHgxNVx4RURceDFGXHgxRFNceEZGXHhFQiVceEZCXHhBMU1ceEZDXHhDOFx4OEJtWm5ceEZFXHhFMXNceEU0blx4RkJceEMxXHgwMm95XHgxMVx4RUVceEVFXHhGOWBceEJDdVx4RTB0XHg4MFx4RkVceEVBXHhGRlx4ODNWXHhENmtceEM4MVx4OTVceDFBXHgxRVx4MTNceDBFUyd0XHg4RVx4RDlVXHhERFx4QjlceEU4N1x4MTZceDk1XHhEMlx4RjNceDFDXlx4QzhJXHg5Ml5ceDE4XHhCQ1x4MTBceEE3XHg5QVx4RDI1L1x4OUZceDhDPD1ceEYxZlx4QzgoXHhFQ0JceDE0XHgwMFx4REEtXHhERFx4RUVceDk5Ilx4RjJuVFx4RjhceEM5dlx4QjdceENEOFx4RTIwXlx4RDdceDk2XHhBN1x4MEFceEQ0XHhCOVx4RjBceDkwL1x4OUVceEZFXHhFRVx4RjBceEMzXHhGNFx4QkNceEVEVVx4REYnXHgwRFx4QkNceDE5Plx4ODZceEM2XHg4MnY2XHgwRCJceEVBXHgxRl1ceEYyXHg5Rlx4Q0VceEU0XHhBNDVxNm5PNVhceEMwXHgxM1x4RDhSSFx4RDBceEE4Jlx4QUVceEFGXHhDMVx4MUVceEU5XHg4OE9ceDkxcnZceDlGXHgwRTtceDg1XHhGRlx4QzFceDhDXHgwRVx4QTkkcFx4QjFceENFXHgwQVx4RUElXHgxN1x4QkRceDE4ZFx4MERceEM2WkNpWjZoXHhENlx4MDlgXHgwODlEXHg3Rlx4QUIqXHhEQVhzJ2hceEJEM2xceDk3cyglXHhCQ1x4QUFceDFCS1x4QzhceDEyXHhEN1x4QzRceDlDXHg4Nlx4OTBceEE4XHhCOVoqXHhGRlBjM1x4RTdcQ1x4RTNceEUxXHhCOFhLZVx4RTZceDFCXHgxOFx4QTAmXHgwOVx4QTFceEM0XHhCRk5ceEFBb1x4QzR+XHgwRVx4RkRceEMxXHhFRmcgXHgxRlx4ODdceEY1UVx4QUNceEI0XHg4MHNhXHhBRT5ceEYwUUE1flx4RjFceEIzXHg5N1x4ODknXHhGRlx4RTBceEUwXHgxNFx4RTZceDA0XHg4M1x4RjRcXHhEMVx4RTNceDBEXFx4RkJceDhGXHhCQ1x4ODlceDkwXHhBRChceEE4XHhBOVx4QThceEVCaVx4ODBSXHhBMVx4MUFceDEyXHg4MShceDk4XHgwM1x4ODRYXHhGQiZceEQwWlx4MDh+XHhCNVx4RTJceDk0XHgwMyFceEYxXHhENFx4RkRceEI3XHhBQ1x4QjFceEZCZXxceEYzQlx4QTFceEVGJFx4MUFkXHhFOVx4QUZ8YVx4RkRceEE1P1x4MUZceENEflx4MDZDXHgxRlx4OTlceDAwXHgwMmJceDlEXHhENlx4QzFceEQxXHgxM1x4RjhhOCpceDg2RFx4MTY2LFx4ODhceEYzXHhDN1x4MUVXXHhFRXFceEFDXjJceEVFXHgwN1x4QThOfVx4OTlceDlGXHhCMlx4RjNceENDQSZceDgwN1x4QUZhKlx4OUFceEUwcnNceEI5eXZceEExXHg5Q1x4RTAqXHg5Qlx4REZceDhFQ0lceEExXHhBQVx4MUJceEUyXHhBOVx4OThceEU0XHhBRVx4QjZceEM2Xlx4MUZceEE1XHhGRlJ+XHg5Mmh0XHhCQlx4QTVmdFx4RUJceDBFcF9MXHhERHBceEVDY1x4RkJceDA3Qlx4QzRceEJEUFx4RDBGXHgwRFhLXHhGOFx4MDFceEJCXHhBQ19ceEM1XHhCMlx4MDRceEE2XHhDOVghMXFWXHgwMFx4OUFceEMxXHg4NFx4QTNgXHhCQ1x4RDBceEFDXHhCN1x4OTlSLVx4OERxZlx4RThceDBFXWVceDlFXHhERk5ceDFEXHhFMFx4MUJxQFx4RkZceEFEIzxceEE5XHhCMTdYU1x4QjhceDkyXHhENVNAXHhCNFx4ODJUeSJMbS1ceEEzVVx4ODZceEZGXHg4Q0JceDhEXHg4RVx4REVceENFXHg4MFx4MTRrKVx4QzMrXHgwMSVceEFGXHhGRlx4QUYjXHhBQVx4RkJceEI3ISZceEQ2XHg4N116XHhFM1x4MEVceEJDYVx4RjBceEEyXHhCRFx4RTZceDlFXHhDNSA9Y1x4RUZceDFFXHhCM2t2XHhCRlx4MENORlx4OTFceEFGXHgxNVx4MDFceDlGXHhCRGRceEFCXHg4OVx4QzhceEU5XHhBRFx4RjhceEM2RFx4RjhceEZFaFx4MENceENFOFx4RkVceDlCOz5ceDEzXHg4MVx4RkVceEQ0XHgxRFx4RDNceDEzWlx4RjdceDE0JjtceEREXHhGMVx4QkJceDhBXHhGQ1x4QzJceEUzQWRceERFXHhCODBceEI2XHgxQlx4MTZKNFx4OEZBXHg4Mlx4QjhceDBBXHg5N3oiXHhCQVx4RDFceENCNWFrejtceEVGXHg4OVx4QTZceDdGJFx4RUFceDlBPFx4QzVSK1x4MDI/XHhBRFx4RDJceDk3XHhGNVx4RDRceDA3XHg4NzJTXHgwQm9ceEYyXHhDMVx4MDInXHgwOExnXHgxQ11ceDBDXHhGRlx4N0ZsS1x4MUFceDFEXHhFNFx4Rjh5WFx4QUZceDE5XHg4Nlx4MDRceEMxLFx4RTZWXHhGN1x4RDhWX1x4RDYpXHhCNlx4RTAsXHhGN1x4QTRceEUwM1x4REVyeixnXHg4MFx4MDRceERCI29ceEVFXHhEMVx4RDFceDA3XHhEN1x4RTRlXHg5N2tceEEwXHhERVx4MUZceDExXHhGM1x4RDNceDE0XHhFMT1ceENFUXRceDA4XHhCQ1x4MERceEYwXHg5OVx4RjFceDFEd1x4QjVceDBDSVx4RjNceEI4XHhDM3VXXHhENVx4RkZceEYwP2RceEI1XHhFQVx4N0ZkXHg4QVx4QjFsXHg4Nlx4RTlceEI5XHhDN1lceDBBXHgwOSlceDg5clx4MEFceEY5VzNmXHg5MFx4Q0JceENGXHhDMlx4RkFceEE0X1x4QUNceEE4XHgwMlx4QkNceDFCXHhEQ1JceEEwXHg3Rlx4MERceEYwXHg5Mlx4RDlceEJCXHhEMExcJ3BceEM0XHhBQShceEU1XHhEQ1x4ODlceDBCXHhBNUpceEUxXHg4NFx4RjVNXHg3Rlx4OEZQXHhFQmU3XHgxRmtceERGRFx4RDFceEM3XHhBRixceEJGXHhBRVx4REQqXHhEMlx4OThceDg3MzBceDhEMD1ceDg3fFx4QkRVXHhFQXRceEM0XHhDOHlKXHg4OVx4RTBceEI2XHhDM1x4QkFceEMydlx4QkJgXHgwM1Z+XHhGMmheXHhGMHNceDlGXHg4Rlx4OTJceEY0XHhDQ1AiXHgwOGtceEU4XHhFNlx4QjNceEM1XHgwQnhhXHgwOFZceDg2XHhCMVx4QjNceEFDVSh6XVx4QUNceENGXHhEOVx4RkVceEE1XHgwM1x4QTJceDA4eVx4MDJceEU2XHhDM1x4RUNceEQwXHhFMDdceDk1KyVceEIyJURceDhBXHhCQlx4MTVWXHhGOFx4RURceEFGXHgxQ1x4RkNceEI1UEo9XHgwRVx4RTJRXHg4MFx4RDhceDk2XHg5RFVceDBFXHgwMFx4RjFceEZBXHg4OVx4REJceDA3ZVx4RUNceDk4XHhBRlx4RjFwXHhENHlXXHgwN1x4OThceEMwSlx4OEIkOFx4QjlceEVFXHhBN1x4MTdceEIxXHhENlx4ODBceEI0RVx4RjB2RVx4MDFceEZFXHhGM1x4MEI2XHhFQSlJXHgxN1NceEFEXHg4OVx4RkRceEVDXHgxM2ZceEQzXHhFRVx4MDZgXHhCM0RHXHgxMlx4QkJceDA3XHg5Mlx4ODVceDA1XHg5M1x4RDlceEI5eH59WjQqXHhDOCtceEVGXHhGOFx4OEVceEZBXHhEQThceEQ2YF5ceDgxeFx4RkFceEM4K1x4RUFceEI5XHgwOVx4RkVrU1x4OTJceDFEXHhBQyJceDgzN1x4RkV9XHgwNm11XHg4NmJceEVGXHhFNlx4QzVceEIzSFx4Q0NceDA4XHg4Mlx4RUYgXHhDMlx4MDVceEQ2XHgwQ0gyU28pXHhEMlhceEUzXHhFN292Xlx4MDElXHgwRFx4QzVceDhBTlx4MDIsXHhGNlx4RjE6XHg5M1x4OENceDgzR0hceDk0XHhCQydceEZDXHgwRGNceDk5Q1x4QjBceEIyQWZceDdGXHhDN3loXHg5OFx4Q0NceEQxZFx4QUJceDAyXHhGNFhDXHg4RFx4MTlceEZGXHg5M1x4OEZceDlBX1x4QTFceEEzXHgwQ15ceDFCXHhGN1x4QTFUXHgxMlx4OUU7XHg5Mlx4QjdbXHg5OE1ceEQ4XHhEQ1x4RTFceDhEKlx4RDhceDE1aFx4QkZceDk5Wlx4OTVceEIydFx4RUV2LVx4MTZ1XHhBOTRoXHhEQlFceEYwXHhGN1x4QjFceEI3XHhEMSZceEFEIVx4ODBceEE1XHg5MVx4OTRceEY4XHhCQy1ceEREXHg5Mk9+XHgxMVx4QUFJQFx4QzNceEUwXHg5RCRceEFBXHgxOVx4MTlceEQ2XHhBRGVceDk0W1x4OUJsXHgwM1x4RTVdUVx4RTRkXFx4RTJceENCXHhGNTtceEM5XHg5RFx4RkFceEUwfFx4QTk7IVx4QTglXHhCRFx4MDBceDFDXHhCMlx4QjRceDFFXHgxRFtceEZGXHhGNT5ceDg3XHhFMlt4dVx4QzRceEUxXHgwRkxMXHg4RC1ceDlBXHhENFx4QTdQb1VceDhGJXhceEJDXHg5RFx4MDVceDBBaiF1XHg4OFx4OERceEYzXHhBMVx4OEFceEFCXHhERFx4ODR4XHg5NVx4QjBceEQyXHhCMVx4REJceERFNmBAXHhCQSBceDFDLFx4QURceEIwXHhFQnNLT1x4RDUrc1x4QjQ+XHg5RFx4QjRceEVCJlx4RkJceDg3XHhGMlx4RUJceDE1alx4QzR6XHg5Qlx4QzBceDA0MWBceEE1QFBrQlx4RTddXCVceEE3XHg5NW5ceDk5TllceEUyXHhDRlx4OTk1YmBBXHgwMSFFNVx4RkZceDBCXHhDOWtceEU2XHhDM1x4QTdceEFFXHgwMlx4RjNceEI4XHhDRFx4RTBceDhBXHgxOVx4QzdceDgzXHgxNFk4XHhCNFx4RkJceENCS1x4OUFceDE3VVx4OUVceEFCQ1x4OEFceEVBXHg5MnhceDEyXHgxMlx4MEJceDlBMjZgXHhBRVx4OUVceDdGXHhCQnRtXHg5Qm02P0xZXHgwRVx4QTVceDhEXHhFMXhceEI2XHgxQitceEQ4XHgxOC1ceDhGXHhEQ1x4QjdceDlCKVx4OUNtYnxZJXBceEEwXHhBMzdceEI5XHhDMlx4MTJceDE5XHhCRkVceEZFTXJceEZFXHgwMlx4Qjd5XHg5Nlx4QjVceEUwJyBBWVx4RTckXHhBMFx4QjJAPnBceEE0Ojt1XHhFNCRJPHtceEE0XHhCOVx4QjkoXHhGRTBceEZBXHhGMX5ceEE1XHhERWdceDk2XHhFRlx4OEFceDlGWlx4QUJgXHgxMFx4RjMyXHhBNFx4MTVceDAzeFx4ODNceEIyaDRceDE3PFx4ODNDXHhGOFx4OEZhX1x4MEZceERFXHhFMD1ceDAxR1x4QzNceDA2XHhCOFx4QjA+XHgxN1x4N0ZceEM5XHgxMjBceDgyXHg5NWYmXHhERDVceEZCXHg5OFx4MTBceEY3XHhGOVx4RjlceDAyT1x4MDNsXHgxMGBceEJDXHg4NFx4ODZceEFFXHhENlx4ODFceDdGXHhCQSxOXHhGOVx4RDVceEUyXHhFRmNceEU3XHhGQlx4RDlceEM4XHhENlx4RjV1XHhDMVx4OENzXHg5NVx4OTcoW1JceDE4Olx4OUV2aVx4RER0XHhFRVx4MURvXHg4QXFOXlJceDExZVx4RjJjKmZPXHgxQlx4Q0ZbXHg5Q1x4RUJbXHhCQ05ceDlDXHgxNFx4QzNceDk2XHgxQkhceDA4XHhBQVx4QUNvXHhEQVx4ODNceDE2clVCXHhDRiVceEQ2P1x4RUFceEI0IzAuXHg5MVVceDEwXHhDM1x4MTBnXHhFQi9ceEM0XHhBMH1ceEZBXHgxMFx4QUJceEZFNVx4MDF6L1x4ODVceEQ4WFx4OTVceEU4XHhCNlx4OTN8XHhCNVx4ODFceEFBXlx4OTc6Qlx4OTJceEE0Wi1ceDlCXHhGRi5ceDgyYlx4RUFceDgzXHg4OFhceDAwdGdceEIxLFVjXHgxQ1x4QzFtXHhCQVx4RkJceDg3XHhBRVx4OTFceDhFXFx4ODIxXHgxMnlRXHhEMVx4RUVceDhGXHhGQkBceDk4XHhDQ1x4QjRceEE3SVx4MTFceEZFXHhDRlx4Q0FceEMxXHhFOFx4QzhceEQyUVx4QzZsM1x4MTBceDgxXHhFN1x4Q0Vmd1x4QjZCbCZhXHhFOVx4RUE9VFx4RDdceDhDL1x4MUNceEY2XHhCMndVPiRceEI4XHhFMGd8XHhGOFx4QzE+XHhDOUJfXHhGRFx4MThceEQyXHhFRlx4MUJceDAxXHgxOFx4Q0RceDg1Wlx4Q0ZceEQ5XHhCQlx4ODlceEUxXHhCRlx4OTlceEYyXHg5RkBXO1x4RERceDkzXHhCQ1x4RURceDAwXHg4MVprXHg4OFx4QkRONnJceDg3VjYkSy9ceEYzXHhGMlx4QkJFXHg4RFx4OTdceEJDXHgwMG9ceDAyT2NceEUyXHhDNlx4RERoXHhEMFx4RjNceEZEaVx4RUNceEM2XHhFRVx4QzlceDE4Q1x4QTRceEY0XHhCQSpceDlDR1x4RUVceDEwQlhVXHgxMlx4RURceDBEd1hRMlx4RTVceEY5XHg5QTZPXHgwM0twXHgxMFhceDBFXHhDQTdceDAwN1x4QjcycUpceEExXHhENFx4OTJceEFBPVx4QUNceEYzWzR4XHg3Rlx4RDBceDk4XHgwQ0VceDBCXHhBNVx4RTdceEUzXHhGMVx4MUJceDhBUFx4ODZceDgwXHhGRVx4OTNceERGXHhBNlx4OEFceEJCRVx4MDZ5KmNceDFGXHgxMVx4MDZceEVEXHgwMFx4QkReXHhEOFx4RjE6XHhCQTxmXHg4Q3hceDk1OFx4QUJceEM5Wm9ceEYyXHgwQVx4RTZceDhEXWpceEQ1XHhCNFx4QzJceDBEXHgxNFx4OTBceEYwXHhBMFx4OEJceDhFe1ZceEQ5XHg5OFx4OThceEZFLFx4RTJceDk3XHhGMC43XHhBNVx4ODBceEE1XHhFRilVZ3poUVx4QjVceERBR1x4RjFceEY5XHgwM20rXHgwRlx4MTA0XHgxMkpuXHhEMFx4QzNceENFXHhCMlx4OEVceEMxXHgxNFx4QjFZXHhFREBceEFBXHgxMlBceEUzQlx4MEY4Vlx4MURceEI4XHhDQlx4RjlPXHhCN1x4RkZkS19ceEQ4VFpcfEklXHhCMiZceDlEXHhERVx4QkEyXHhBNCJceDg4XHhEMlx4Q0VceEZBXHhGMDVceEE3XHgxNlx4MTdceEFDcDJceEY3MHVceDE5bVx4QjFkXHhDM1x4RTFceDlDXHhCOVx4QkRiXHgxMFx4RjlceDFEXHhCQ1x4OEFceEZCKTpceEI1XHhBOX5ceDhDXVx4ODFceEQyXHhDNixceDAxXHhDQ1x4QzNceEY1XHhBNVx4RThceDEyXHgwMFx4RDhceDE4XHg5RVx4RkNvXHhCMlJceEFEXHhEN3BceEQyXHgwRlx4OUJmY1x4MTFeXHhFRFx4RjRmXHhDQlBiTVx4ODcgLFx4QjlceEQ3Olx4RUFkd0hceEUzJi9tXHg4OFx4Rjd9XHhGRFx4MDRceDA2XHgwNFx4RDdceENGL1sqXHg5NkxceEFGXHgwN2hceEJEXHhFQVx4OTZPXHgxNDIjX1x4MDdceDkxSlx4QTRceEFGLVx4MEUxXHhFRkBceDhFXHg4RFx4MDVceEQ3SjNceEUyXHhGM11ceDA5XHgwQ1x4QzhdXHhCNFx4RTFceEJFfFx4ODYyIFx4Q0VceEVFXHg5RFx4QzFceDk3XHgxMVx4RERceEI0XHhFN0JtXHhCQ1x4MTJceDA5XHhBOTdceEUyXHhDRkBceDA1cFx4RjlceEZDXHgwMTFceENDXHgxRVx4N0ZceDgwXHgxQWJpXHhGOFx4QjVceENGXHg4NVx4QUJFOFx4MEJceEZGXHhFRlx4QjdceEIzXHgxQThceEExWFx4OThsXHgwNlx4RDBceDkzXHgxN3BceDA0Ulx4RjcxXHhCRDhceDhGXHhEM2hzT1x4QzlceEE3XHg4N1x4MDFceEQ3XHhGQVx4OTFceEU4QkRdT1AhXHhCOFx4OUJceDA0PFx4QjlceDFGXHg4OF9ceDA1K1x4QTNceEM2XHg5QXpceEM5XHgwNVx4QTVceDAyXHgxRn4yeXBceEFCXHg4QW1FXHhGNjRceEQ4TiBgUWpyXHgxOVx4RUR+ZVx4ODNceEM0XHg5OVx4MURceDg0XHhFRFx4QkEzXHgwNkJWXHhCQTMwXHg4Rlx4QjhceDBFM1x4MTBCXHgxRSF8SFx4MDRceENBXHhENlx4RDhceEFEXHg5RVx4QzhceDhBeFx4MTNceDlFXHhBMDVsKnBceEE2eVx4QjA2XHgxOVx4RTZxZFx4RjNceDEyTVQ9PnxIXHhFRFx4QzByXHhGQ1x4QjZceENCXHhDNmRceDg2XHhCNFx4MTFkXHhEMnYzXHhFQVx4QTQtXHgxMVx4Q0NceEY0XHg5Mm1ceDg4RFx4OEZceDkyNlx4RDhceDk5XHhDNVx4QTZceEI1XHhGNlx4ODlceEU5Nlx4QzhceEZEXHhFMlx4QzBceEJCaFx4MEZceEUyXHhBMVx4MTBceEJFXHhCOGhceDE5XHhCQVx4RDlzXHhFMmtceEJGJFx4RjVceDA0XHhEN1x4MTRceEEwLlx4Q0NceDA3X1x4QzF0XHhGOVx4RkQqL1x4QUZtXHgwN1x4RDI+XHgxQ1x4RjVceEFBelx4RDJceDk0YSdceDE2XHhGQlhtXHg4MFx4ODRKXHhCN1x4QjdceEE0XHhGNlx4OTIzXHgxRHw6c1x4OTNRUVx4MUFceENFc1x4OTRceDBEXHhDOVx4RDhceDA2XHg4Mlx4RkMqXHhEQVx4ODRceEVGXHhCNFx4MTJceEMyQVx4RTNceEYwJCxceENCXHhBRlx4QkVceEYyXHg5Q1BceDBDXHg5N1x4OTQ7XHhDRlx4Qzd3XHhBN3RceEZGXHhCNGJceDgxXHg5RFVceDgze1tceEFGXHg5MFx4RDBZdmlceDBDPzZceEI1XHg4QjtceEU5byw8XHhFMEhceEY0XHgwNFx4RjdceDkyXHhCNlx4MTBERDJceDE3XHgwNjFceDBEXHhCM1x4RDZceEM3dzNceDgwYThceEEwXHhGN09ceEZCXHg5NVx4QjhceENGXHg5OFpceDBBXHhEMEtceEM2XHhGMHBceDBDNFx4QTFceEMwanJceEU4ZFx4QjVceERDXHhFRV91XHhCOVx4OUVceEEyTTUhXHhFOVx4RTBzJU9ceDk0XGJceEFFXHg4MjFceEMxXHhEMkZYeFx4OUFceEYyXHhDMFx4QTZceDgwOVx4MENrXHhGQVx4RUVceDE5XHgxMVx4MDB+S1x4OUNcXHhGNi9ceDhGKVx4MUJceDk1JiJceEM3XHgxMlx4QUVceEM5V1x4ODdceDhDXHhFMFx4RUJYc0JceDlCKlx4RkE0XHg4Q1x4QUFBZ1x4REFiXHhBNFx4RkZceDlGXHg5MFx4MUFceEJCMFx4MDlceDBDdXBceDk3YFx4N0ZceEU1MDJceERDQFx4RTBceDgzUS5WXHhGN3tceERFUzdceDgwXHhBNj5IXHhGN1x4QkFceEQzLFVxXHg5Nlx4QkN2XHgwMVx4QTVjXmdeXHhEM09xXHgwNVx4OTBceERBIlx4OTZceEY3XHhBQ1x4MDBceEQyIVx4REVPXHhBM1x4RUNceERFb1xceEYwIlpceEI1VFx4QzdceDBGXHhDRlx4QTdceENBXHg4Rlx4RTFtXHgwNVlUVjxceDE3NUBceDg5XHg5OCtceEQxXHhCRlx4RUFceERDXHhDN1x4QkVDXHg4MVx4RDZceDFEXHhGOVx4QjFceEUyXHhGMVx4RDlceEY1XHgwMGpceDA0JFx4MTNceEFEXHhDOVx4MEVceDE2XHhDNFx4ODJWTFx4RjhceEEzXHhGQj9gVlx4RTNmUlx4RTFceEM1XHgxMVx4MTJceEY3XHgxOVx4RURWXHg5NkZceEE2XHhGQ1x4QTZdaFx4MEJceDEyUlx4MTd6XHgwQkNKXHgxQVx4QkNceDhEXHgwM1x4RDdqXHhCMydceDlGVFx4MDFceDE3XHhCMy1LXHhFRFx4RTZceEM0XHhBRFx4QjZceEM1XHhGMFx4OUMoeFx4Q0NceDFCIFx4RkVceDE4XHg5OFx4OUQqXHhCOFdceERCXHg4OFx4RDI+XHhCRlx4REFceEIyXHg4RSVceEMwO1x4ODJceENFXHhBQ1x4MERceENCXHhBRVx4ODMiO1x4QTBceEFDXHg4RVx4RjFceDAwdDZceEZGWzJceERBXHgwRSsocSZceEI1XHhBMWhceEFCXHhCOThceEM5XHg4NHIodlx4MURceEY1XHhGOEpceDBDMVx4RTJUXHgwOFx4MDdceDgwXHgxNVJceENGXHg4QVx4RUZxeEV6TVx4RTR9XHhBOFx4OTNceDE2XHhBMW1ceDA3LHlceEY3bVFceDA0Zlx4RDlceEQxQFx4QzJceEM5XHg4QVNEXHgxOFx4RjcvXHgwRlx4RTVceEVDb1x4OTk1XHhGRFx4QkNceEIzXHhDMlx4QzNWajtFWFx4QkZ1bklceDE2eVx4ODlceDlEXHg5MH5iXHhDOVx4RThceDFCXHgwNlx4RTNceERGJlx4RDZceEU1XHhDRFx4RkVceDAyXHg5N1x4RjdceEY5XHgwQ1x4RjVceEFBXHg4NHpceEUzXHhBNVxeaVx4QkIpXHhGOFx4ODhceEM5XHhCNm1ceDkyXHgxMmtceEUzXHgxQ1x4OTBceEJBJ1x4RDVceERCXHhEN1x4Q0RceEE0OFdceDgwXHhDOVx4QkQ0fDdceEEyXHhGM1x4MTRceENCXHhFNlx4QTVceENFXHhBRFx4QTJceEMxXHgwQ3J2e1x4QTlceEQwXHhFOVx4MUNceEY1K3VceEE2XHg4N1x4QTZGXHhDRnFYXHhCNktvXHhEQUd+XHhFOFx4RjNwXHhDQVJceDdGXHgxNyhceEE0XHg4QVx4QTROJVx4RkUrflx4RkJceEY4e1x4QjAxXHg5QVx4RjJceEQ3d1x4RjErXHhBQ2tceEY2XHg5NnVceDE2cFx4QjFceDhCXHhERDdceDlBXHhBNlx4MURceEJBXHgwQmVbXHgxNFx4OTRceDg1XHgxN1xceDAwXHgxQVx4MUUiQVx4RTlceEVEU1x4QzZceEUzXHhGRWNceEE5XHhFRD5LXHg5QmVdJ3ZceDkzZlx4MDZcXHgwNlx4MDIkXHhDMVx4OTZceENDXHgwNlx4RENceDFEdztceDEzXHhDM3JjXHgwQVx4QTZceEE5XHg4NFx4MDYvXHhFNlx4MThceEMwaFx4RDNRXHhCRFx4RjhceEVGXHgxOVx4MUFceEU2XHgwM1x4RTJaLFx4QkVMXHgwRFx4MDFceEI2RFx4QkZceDExalx4RUNYW15ceEVEXHhBN1x4QTNceEYzXHg4Q3tceDg0XHhENV1ceERCXHhFOS1ceEQwdXNceEZEeVx4QTZceDFFOFx4QzQzXHhFMytUVCF7eFFceEIyXHgwOVx4RTFceEY4bjRceEE0XHhDOVx4QjRceDBEXHhEMydceEM2XHgxOVx4RDJceEI1M1x4QzQwXHhGM1x4MTdceEE5dlx4RDBceEI4elx4REVceDgxXHhDQ1x4MTAzXHgwQlx4RjZceDA0XHg5QlpceEU3XHhEN1xceDg5SFx4QjdceEE4XHgxMStceEIxQlx4Q0FeXHhERVx4RDZceDA4XHgwQyJceEExK1x4RUVceDFCXHhBRF1ceEI5XHhEOVx4RERceEQ1XHgwN1x4QTBpXHhGN1x4QUVceEYyXHhGRS1ceDhCJyRceEJFUXZ7XHhEOFx4OTVceDA1XHgwQlx4MDJDXHhEQVx4MDRceDAybFx4RDkkXHg4MkNJXHhENXQ/XHhBM1x4OThceEVFWFx4RkJceEY0IFx4QkJBXHgwNzV1XHhFRFx4RDhceEQxXHhGM1x4QTdMPGtceEFBXHhDN1tceEY5VFx4REM+KFx4MTclXHgwNiFceEM1KyNfUDRWXFx4RkZceDBFdFx4QTdceDFFXHg5N2dceEU4aVx4REVHMVx4OTJceEU0LkBceDdGXHg4Mlx4RDUmXHhCRVx4QUNceDA3XHhDQzJpN1x4QUNceEIxNVx4RDVceEE0XHhFRlx4QzFceDAzLVx4MThceEJFXHhFREVceEEweFx4MDFceDEwMixceEFGXHgwQyJceDE1XHhGREtceEZDUyxDXHgwQjRceDdGJFx4QzF9OFx4RjdceEIyXHg4RVx4RTdceDBGa1x4MUVceEZGXHhBQVx4RDZceENCP2ZSXHhENW1ceEI5WWclXHg4RFdPXHhGMzBceEU1Nlx4RjNnXHg4OFx4QjVlXHgxRFx4N0Y6XHgwM1x4MUNceEFDXVx4RjRceEY4S1x4RDNceEJFYlpceDlEXHhBQVx4MUNceDEzXHhGODRceEFEXHg5M3QzXHg5OUhceERFbn5ceEYzUlx4MDA8XHg5RFx4OUZPXHhFMFx4RjRceDEyXHg4MFx4RDhyXHhGNzJceDAyXHhEQXh4XHhCNVx4OTRceDE4XHhCQiE9XHg5Rlx4MENceEZDMSNceEMzPlNceEQxWEVceEVDXHhCQnhceEExYlx4RjNceDAxZm9ceDAwXHhBRS5ceDA0XHhENFx4OTdJXHhGM2JceEQwXHhENCQlXHhGMVx4Q0FceDkwJWhceDA4XHhEQXlceERBXHgwOF1ceDBGXHhCRmNceDk0XHgwRWNceEZGXHhBMFx4RDhceEJGXHgwQS1jKFx4OUZceDlEXHg4MFx4MUYtXHhEQVpceEI5XHhCNFx4Q0JceDk2XHhEN1x4RDYhXHhCQzlceERBdUo2UzJceDFCXHg4RFx4RDVceDExXHgxRlx4RkRceDk1UFx4ODNceDk0XHg3Rlx4RDBAXHhEMFx4QkE3KFx4RjM5OVx4RjRceEQ5XHhDQ1x4QTVceDE2XHhFNTFceENGTFx4QkJceERBZFx4RDNceENFU1x4MDZceDhBXHhENSNceDhBKlhceEJCIVx4RkZORVx4RDZceEFDXHhERi5ceEE4XHg5MVBceDE1RVx4OEZ6XHg5Nlx4OTdzO1x4QUJWYVx4QkZceEE3dVx4MTlceEU0XHg5MFx4OUZoXHg4NXhceEY2WSpceEJCXHg5N1x4RjRceEQwTFx4RDhzRl5ceEM2XHhCQkNceDk1XHgwRjgnXHhDRVx4QkJceERCclx4QjRceDg5XHgxOSNceEJFdHcoXHhCMFx4MEQ5XHg4MVx4QjJceDFCXHhCQ1x4RDlceEI4XHhGRVx4RkFRQk9aXHhGQVx4OERceDBEXHgxRSpceDlGR1x4RDJceDExXHg4NCBceEY1XHhBRFx4OUNceDkzW1x4RURgXHhGMyNceEJCXHhCREtFXHgwMXJCXVx4OTFceEFCXHhFRHlXXHg5Q3tceEYyXHg4MTI0XHhFQSVceERCTlx4RDhceEZBXHhGRlx4QUFceDE0XHhBOVx4QTdceDhFXHhFOFx4ODRceEQ1XHhEMjttXHhFREFceEYxXHhDQlx4OUFceDEwMy9ceEY4XHhENllceDhGPlx4QkVceDhBLVx4RTlceEQ4Ilx4QjZceDdGXHgwQ15ceEE4XHhBMFx4OTRceDkxS35ceDlFXHhBOTNceEMzXHg4QkhceDgyXHhDNFx4MENceEYwXHgxQVx4QkJceEIwXHhBRXlceDE4XHhBN1x4OTlIMlx4QkFceEFBXHhBOVx4RUQuXHhGRlx4RTVceEFFXHgxMVx4QURceEFGXHgxQ2NceEZCXHhDNjImXHgxQVx4RjckXHg5QUVceEY0XHgxOC8wXHgwMFx4QjVceEI0R1x4MTBceEI2XHhBMlx4Q0VZRytceEFDXHg4QVx4ODhceEU1XHhFMlx4QUEhXHgxOFx4MTUuclx4MDlceEZEelx4MDNUW1x4QTJceEJFXHg4Qlx4ODBceEQyXHhFNy1ceEVEXHhFQlx4MDdyWEJceDk2QXZYMkRceERCYVR3dnovXHhBMlx4RjJceDg0XHhEQzxceEU0XHhGQjhceDkzc1x4MEFNYVx4RjZ0XHg4NVx4QzIvXHhERFx4RTRSXHhDQ1x4RTNceEU1NHVceERDXHg4NFx4ODFvLmhRXHhDMWFRNlx4QTdceEJGXHhGQiktXHhBMWEgXHhFMFx4QkJceDE3W1x4RENceERDSWRceDBCXHhCQ1x4QjhceDEyTVx4MUVgXHhGOGRceDg1XHhCRVx4RUFceDFFXHg4NFx4OEJceDg5XHg5N1x4RTVceERFXHhDMVx4OEZceEY5UD9EXHg4MFx4RjRceEJEXHhEOERceDBFIVx4OUZceEU1XHhCQ1x4MERceDkzWVx4RjNceEU0JFx4RDBceEMwN1x4QUJceEJGeGF9XHhDQVx4QUVceEU2XHhGQVx4RDlceEU2XHgxOFx4RjZceEFEXHhBNFx4OUFceEI0SVx4MUVYXHhCMkc9XHhBQTE2XHhBOVx4MEZLVyt0XHhCQVx4RjhceEU0UC5ceEY4XHhCOVx4QjZZb1x4RTZceDA3L1x4QjEtWVx4MDcjSHpvXHhFRlx4QUE+RGcxXHg4OVx4QjV1XHgwOVx4RDFceEVGXHgxMlx4QkRceEM5VVx4OENceDFEYVx4ODEzXHhDMFx4RUVceENBc1x4OUJceDk0MjlHXHgxRFx4RDFKXHhDQXdceEREXHgwOFx4RDAkXHgwOVx4RERceEJFXHhGNFx4QTcoXHhCNlx4QTRceENEXHg3Rlx4RUZceEFEXHhERlx4RDBBXHhCMVx4OTRceDE1UVx4OUFceEY0WD19XHgwMlx4QkRceEIxXHhENFx4MURceDgwXHgwN1x4RjhFNm50M1UrXHg5RFx4ODZQTHV5XWRceEJCXHhBMlx4QjF2XHhFRFx4Q0FceEQ2XHgwNlx4RjZPLjUoXHg5QVx4RDdsXHhFMWtceDkwXHhFNl9ceEUxXHg5QkNceEQ1XHgwMFx4RDBceEJCJTlceDg3XHhDRXhceEMzXHhDMlx4OTJceEM1JFx4Q0NceEM5XHg4Qlx4QTd5bFx4MUJceDEyXHhEMlx4QkJceEZDLk89XHhCNVx4RDlceEI1WE9UXHgxOFdAXHg4RFx4OEJceEY5XHhEOVx4RjlceEY4XHhERFx4OENlXHhEODtjXHhBOVx4RDlceDFDXHhBOXYtXHhFRC5ceEJDXHg4Qn5ceEVBXHhDN1x4RDAmdFx4QzlceEU5XHg5N1x4REJWXHgxNClceEQzXHgwOVx4OTIoYVx4QjdceDBGXUZIXHhCN1x4RUZceEExQFx4RDAmXHg5RFx4OERceDE5amhVXHg4OFx4ODRceDkwXHgwMVx4RjNceEJGXHgxRihUXHg4Rlx4RTBceDE0XHg4NzhceDk1XHhBRFx4MDFceEQyJFx4RkF7XHg4QidceDE3XHhEQlx4REE0T1x4QTFceDA3XHgwQnRceEE0QVJceEFGXHhDNVRceENBXHhEMlx4RkJceDA3fEYhYDBceEI3XHgwMVx4OUFceDhFeElceEQ1Mlx4QzZceEQ4TyRceEQzXHg4M1x4RjhceEEzeGZSUFx4REZ5Q1x4QUZGXHhFM1x4Q0RceEE5XHg5MFx4QzdceEFDbWFceDFCXHg5QTtceDExXHhCOVx4RENceDBGXHg4NVx4ODZceDE5XVx4MTZ3XHhEMnVceDA1b1x4OUNceDgxXHhEMEFceEREMVx4QzBceDdGcGx4XHgxN3Y5alxYXHg4NVx4ODZceDA0NVx4RENceDhDXHhFRVx4QkVceDE5VVx4MEZ6XHhCQlx4QzRceDg2XHg5MVx4QzFccFx4MDRceENDRlx4ODFceDE3TVx4RjJceDlBRVx4QjhceEEyXk5ceEU5XHg3RjpceEM5XHgwRVx4RkZceENFXHhFN1IvXHhBNmhceDFGXHhGM1x4RDNDUFx4RjFceEIzXHg4Rlx4OER7MVx4RDRceERCTlx4QURceDA3XHhDMFx4QTE7bVx4OEJceDhBYFx4OEJceEVCXHgxQlx4ODdceEYwR1x4RERRXHgwNURceEJBRlx4QzZTXHgxN1x4ODhceDFGXHg5NVx4QjdtWSY3YTZdRlRceEM4XHhBRlx4QTlceEE0XHhCOFx4MTFceEM5XHgwNFx4QjFceEZCc1x4REVceEJDPVtGe1JceDhDXHgxRmBceDk5elZceEY0Q1x4Qjl5N0tceDBBXHg5Nlx4REZBd1x4MDBceENGXHhFRGdsXHg5OFx4QjY5XHhGQlBceDE0KVx4RTlqXHhCOFx4RUFIXHhGOGUpXHgwRVx4MDlceENDZFx4Qzh2XHg3RiQoXHhBRE5ceEQ0XHhFRlx4QkFFXHhGQ3RceEZDXHg4Mlx4MEFceDBFXHhFQkVTQVx4RDlXXHhFMlx4MEY0VFx4MUMhXHhBOF13XHg4Mlx4REVceDlGe1x4QUFtXHg4OSlceDFENlx4QUZceEEyXHhCMlx4QTBceEFGXHhDQ15ceERCQFx4ODBceDg4XHgxQ1x4RTFceDAwXHgxRFx4RDBceERBXHhGRHBceDBBXHgxOFx4MTlfL1x4ODVocFx4MTVceEM3NyVceENBXHgxN1dJXHgwN09ceEY1XHg4Q1x4OTFceEVBNzQicFx4MEFceDE2KVx4RkJ4XHhCRFx4RTIiXHhBOVx4OTBiXHhDMEhhXHg4OFx4ODN4XHhENGw9XHgwQlx4QzJceDExXHhCQlx4MUNceDgxR1x4MUNceDFFPSlceEZGXHhFMVx4ODB4XHhEMTckfSRceDFBXHhFQlx4QUZceDEyXHhFMWhceEY1W1x4MEVceDgwNTRceDBEXHhGQ1x4RDVceDBDXHhBM0xceDBDI1x4RkQiXHhGN1x4RUVceDAxXHhFQlx4QjZceDA5MjJceDk2XHhDQV5ceEM5XHgwQVx4RjNceDhGXHhBMSlceDkxRVw9XHhFNVx4QkR0UFx4QTJkXHhBOVg+XHhBMHc0XHg4Mlx4ODRXMWZLYFx4QUNHXHhFNlx4ODNceEU4XHgwQ1BceEEySlx4OEFceEE0XHhGMlZceDhBXHg5N19ceENBXHhBMX5ceDBCXHgxQiR+XHhGQVx4QUNiXHhCQzVceERFPUJceDE1UFx4RDAoXHg4QVx4RUJceEJFXHg4QVx4OUEqUlx4OENceDE5XHhFQjNceDg0SF9vI3c1ezNceDhGXHhFNlx4MUJdYlx4MDRceEY4XHhFRFx4ODZceDlGXHgxQ0RxXHg5RVx4OTlceEJBJVRceDE3aVx4MEZceEY0RFx4ODQ6XHgwQjhceDdGXHg4Q1x4QkJiXHhDRFx4OThceEUxXHg5RTNceEY1XHhENFx4OTNceENEXHgxNFx4QURceEVCXHhBN1x4ODlceEMyXHhFNVx4RERceDAwXHhGRlx4QUFyXHg5Qlx4QzFceEY1XHhBNFx4QTRceDBGalx4QUN7XHhEQlx4RThceEUzXHg4M1x4RENceEJEblx4REQuIlx4RTZceEY1XHgwN3xceEQyXHhDRFx4RDVceDFDXHhCOVx4MEJaXHgwMVx4RkRVXHhFQlx4RDFGd0o5XHhCOFx4RDJAXHg5Mlx4ODRceDg5XHhBM1x4QjF3XHg4RVx4RTFJXHhGMVNceDAwXHgxNFx4MUQ8XG1ceEU5P1x4RkFceEI4WHpceDk4N1x4QjQzUFx4MUNceEI3V1x4RUNceEQ5XHhFQ1x4RjRMXHg5N1o/alx4QzJceERCLVx4ODl+XHg5OFx4RUQoO1x4QzdceDg3XHhDOVx4OEJDXHhFNFx4MEVceERDXHgwN1x4RThceEI2Tlx4RTlgXHhGMFx4QTlceDE0dkFceEVFXHhCRX5VXHhEQlx4OTNceDlCXHhDQlx4ODZceEY5e1tceDlDXHgxOFx4OUZceDgzXHhERFx4RThceDFBTUdjUVx4MDVOXHhFRlw9XHhFNFx4MDhLXHgxN1x4MUFwXHgxRCVceEY1J01ceDk4fVx4OTVceDg4XHgwNlx4REJceDkzZ1x4QUE0clx4OEJNVHVceDlFJl9ceDBFfVx4QUVceEREXHgxNUpceDE2XHhFNHVceEIxXHhEOFx4MDY1X1x4RTVceEI4bnZ8XHhGNzFbXHhERVx4QkEnVXNceEIyUFx4OENceDE4XHgwOVx4ODVceEIzXHhEMlx4REVceEMxXHgxNjJceEY5XHhCQzNceEZEXHgxOFx4QTVceERFb1x4MTFRXHhBOVx4MEYiUVx4MDZceEIzXHhCRSBJXHg4QmVceDkyXHhEN1x4QzZceDk2XHhFRndceDgyXHhBMlx4OTdceDBCXHhFN2ZPenZceEM4XHhCRFx4OTVpZFx4RkVceERCXHhBQkJceEE3XHhCM2oxXHg4NFx4RkZceEJERFx4RDg7XHhBQ1x4OTZceEJDXHgwMy9ceERCXHhDMFx4QTJceEFEIlx4MURceDkxXHgwQlx4Qzh+XHhGQ1x4RDRceDEza19ceDBFc1x4MDRceEI0XHg3RipZJFx4Q0F8XHg4N3tceERFW1x4QjFceEY4XHhGQlx4QURwZ1x4QTdceDg1VDNceDFEXVBmXHhEMlx4ODNceDBBVVx4OEJceDgyXHhFNVx4RUJceDg0Ylx4RTddXHhFMFx4MEJceEUzKVx4QTB+flx4QTMgMVx4MUVceEJBXHhCRlx4QzlKXHhFN1x4RDNceEUxXHgwMVx4QzdceEFBXHg5RCs2PnRceEQ2XHg5MFx4QjJceEI5XHhBN25ceDg0RnIxcFhkTFx4QzJceEYzXHg4RVx4RjFceEI5XHg5MFx4RjR+XHg4MUJceDE4XHhBOVx4RDVOZTo8XHhGRFx4QTRAZ1x4QUZceEM0dFx4RTlTXHhCN1BceEQ0XHg4QVx4RTdHdXVceEIxXHhBMlx4OERdXHhFRVx4RkVceEU3XHg4MWwvXHg5MVx4MDdceDEzb1x4REZceDBBY1x4RENceDAwXHhFQippWVx4QjA1XHgwN1x4Qzl1XHg5NVx4QjlceEQ2XHhBQUdceDE5XHgwMVx4MTlceDE1Llx4OTY1XHgxQTxceEU0PVx4RTFceDkxXHg4OTg5XHhEMVx4QjNceEI4KUBaXHhBQVx4QzhceEFDXHhENlx4QzNceEQ4Oj17YUtceEE5XHg5MFx4QUVPXHg5MFx4MDVceEJFXHgxNlx4MENceEVBaVx4MDBOWlx4MDlceEI5clx4ODNceEEzTW1ceEU3SVx4QURIXHhEQ1x4RERceEQ3UkZceEE3XHhEMVVceEYyIVx4Q0FceDA5MVx4MDQsaFx4MEFceEUxTlx4Q0FceEY2XHhFMHxceDhCXlx4Q0VceENFd1x4RERceDg3Ilx4RTlyXHg4N1x4MTRceDg3WnRceEFFdlJAXHhCQ1x4MEFceDBBXHg4N1x4QzBceEVGXHgxRlx4RDFXXHgxNVx4Qzk7Y1pceDgwXHg4NFx4QkJceDFEWFx4OENGXHhGMFx4RjZyXHhFQlx4QUJ8XHhDMVx4RUQ4Klx4MURceEMzenZceEZEXHhCMFx4MUVceEFFXHhFN1x4RDZceDE0P1x4MTZceEI0Vlx4QzMkQVx4OUFceEY4MnhceDhDIFx4MERceEY5XHhCQ2RceERGZ1x4RUVceEQ1dnIwbVx4QjlceDk5XHgwRlx4QzBceEQxXHhFMFx4QjlceEZCXHhDRlx4RENceEM3JVx4MDNceDg5XHhFQlx4QjBceDBGXHhDQ1x4ODRrXHhCNkRceEM0QVx4MDExXHhENFx4MTRceEFGQVN+dlx4RkYqYihceENBXHg5Q1VceERFPVx4QTVHaVx4QUN5SVx4QTVjXHhGRFx4OTZceEY3WVx4MEMxXHg5N1x4N0ZyXHg4QVNceEVGXHg5M0t4U2wlbU8xXHhEN05ceDBDflx4RjEmXHhGOFx4QkFceEREXHhFQlx4MDRSJFx4QzZceEEzU1x4Q0F4XHgxM1x4QTBANlx4OUR9XHgwOFx4RjlceEVDXHhCRVx4OUVceDE2XHgxMFRceEJGXHgxOVx4RjFceEM5XHg4Q1x4QjJceEUxXHhCOVwnXHhBQ1BceEREXHhEODtceDgxXHg5NFx4REZnXHhBQSJceDE2J2hceDAwXHhFOFFeXHhFN1x4QUNceEFFQlx4ODFEUFx4QUVceEE2XHhEOU9ceENCXHgwQVx4MEVceDEyXHhEQktceDBDXHhBMG9ceDhEMTpDXHg3Rlx4RDd1Ylx4MTBceEY4aHZceDFEXHhGNicoQlx4RDRhXHgxN3JceDAxXHgxOTZceEZGPmBceDFCPlx4RDdceEZGXHhCRFx4QTNceDlCL1x4OUJceDhETFx4RDFceEMxKlx4RkVueVx4RTAyM0deXHg5MFx4ODZceEZGRVx4RjdceEQ4XHgwNlx4QTZceDA4XHg4RVx4MDVIXHhDRlx4MTM9PXxceEEzXHg4MFx4RTJceDhEclx4RTFceEQ0XHg5Rlx4QzlceEMyXHhENmpceEJEdFx4RTJceDk0XHg4Mlx4RTJceDFBUVx4ODBceENEPlx4N0ZceDFGXHhENEI9XHhCMXhceEIzXHg5RFx4RThwXHhGQ1x4RTJceEQ4XHgwM1x4QTZRXHgxMScnXHhDOVx4RDFceDA0XHgxMlx4QjVceDg3XHhBNVx4MEZeP1x4OENcXHhFM0BceDhDXHhDNVx4QzFceDhCXHgxM1x4RDFAXHg4N0lceEJCOlx4QTM1XHhEMFx4QTVceEVDXHgwMlx4MDJceDA5XHg4MVx4ODRceEU1XHhBRDlceEIwXHhFNlx4QTZceEFFXHhCMWdYeFpceEIyXHgwOVx4RDcmWFx4RjdBXHhBRVx4RTEzXHhGMFx4ODdceDkxXHhFQVx4OTYzXHgxN1x4RjJceDk5XHg5Qlx4ODQoXHgxNlx4OEVceDg1XHhGRVZceDkyXHgxQlx4RUJnXHhDNlx4QUJceDkyXHhCQVx4OUJ9Tlx4RUJHXHg5OVx4QjVceDg2XHhGNlx4QzFceDE4LCVceDFDXHhFNUQ5XHhDRlx4OENceEVBMnYiXHhGQndceDA3XHhFOFlRXHg5N1x4N0ZceEM5XHg4MGlJVlx4QjdceEVEXHgxN0lceEQ0SFx4MTJceDE0XHhDQ0l4XHhENFx4QkVceEQ3XHhBM0FceEU4aFx4RUJEXHgwN1x4MEZceDgyXHg5MVx4MTAifVx4RjBceEIxXHhCN1x4QUJceEVCdk9ceERDXHhCNFx4QTZceEE0MCdceEYwXHhEQiNdNGVceDBBXHhGM1x4RkNceEFDXHgwRFx4QjhuXHhFQVx4QzhceDk5OTpceEI2XHg4Qlx4QzVceEY4XHgxM1x4QUVceEVDXHgxMVx4RjZwXHhFRmgjZlx4QTlceDk0XHhGRVx4RTVceEIycnM+XHg4Qlx4QjlpXHgwQ1x4OENceEE0XHhFRlx4MENkXHg5M1x4RDhceDk2XHgxNTJceEU2XHhCNlx4OURceEVDXHhBMixceDgxXHhCN1x4MUVfTzlceDhBRFx4MThceEFEXHhCQVx4MUNceDBEXHhBOFx4RUNRXHhGN1x4MUVceEUzXHg4RHkkKSlceEU4XVx4MDZ2XHhDQn1ceEQzUFx4QTNceENEWVx4OUFlXHgxM1x4OTBceEY1XHhDOFx4RjhceEM2XHhCMFx4MDFceEI4XHgwMFx4ODBceEFEXHg4OTBceEVFXHhFOVx4QThceEE4XHhBRi5ceEU1Yj5ceEMyXHhDMyNGdndceEREXHhBN0BvXHgwRFx4ODVceEJDXHhFQjxceDAyXHg5QVx4Q0JceDhEUlx4RTZceEVGO1x4QkFceEJFXHgxRUhceDk3XHgwRitPXHhFOVx4QzdceEEzY1FceEMwXHg5NVx4QTJceEE4OFx4MUUwV1FQXHgwMWw+XHhFOFx4ODlceDk2e1x4QUFceEM2XHhBNVx4OTZKLVlyXHgwNFx4QUVceDlBXHhFOGRceEFGSFx4ODlceDlGXHgwMG0/XHhGNmJceEU0bFx4QTVceDhCaFx4QzFceEI3XHgxOUgqXHhFQlx4QzVceDkyZjJceDA3XHgxQlx4MTI4XHhFQ1x4RUZceEQ2NFx4MThceEEzXHhCMVx4MURsXHg4Mlx4OTlOalx4QkE9XHg5RFx4MDhceEE2P1x4MDhBJFx4RTA0XHg4OSxceDFCXHhBMXJVL1x4MDRceENCI1x4QjRceEExXHhEQ1x4QTRceEZGLlx4ODVceENBSlx4ODZceDkwXHhENFx4OENceDlGTFx4OENceDAwTCNceDkwOlx4REUwUVx4REJceEE3bjJceEQ1XHg5OVx4RkFceEYwXHhEQiAxXHhBQVx4RjNceDAydnVceDgwfVx4RTJceDFDXHhFQ0ZceDk2XHg5RSVceDFBXHhENFx4RjdVXHg5NHRceEMzXHhCOFx4MTZceEUxXHg5NVx4Q0JceDlBXHg4ND1ceEJGXHg4OVx4OThceEQyXHgxMmBceEExeVx4RTNceDE5fCg4XHhERiBjXHg5QVx4QUNceEI3XHgwNlx4MEZceEQ2XHhCOVx4REVceDExXHgwNytceDAyXHhCQlx4QTJceDA2XHhEOW9ceDk4XHhDQ1x4OEU9IVx4QTFceEUyR1x4QzNceEU0XHg4MFx4RDNceEVFXHg4Nlx4QkFceDgxX3NbXHhFMXd6R1x4QzRUXHhDRFx4Q0FceEJCXHhCQ1x4QkNceEQ3XHhCRW42XHhEM1x4MTVceEIzXHg5NFx4OTFceDlFXHhFOHtceDBDXHhCQVx4QTlceEY0XHhEMFA3blx4OTlceEExIFx4RkJceEQxXHg5NVx4MUJceDFER1x4ODZceEU5W1RceEI2XHgwRlx4RjdceEYwblx4OTZceEJGSGh5XHhGNWdceDBCeypceDEzXHhFM1hceEUxXHhGOWpceENCUVx4MTlceEU2QVx4MDhceEY3XHhCRFx4OUVceEJDXHhBMlx4QzZceEUyXHg3Rlc/XHhFMndceDFDKmxceEU2Qlx4RjNceDgzT1x4RDFceDE1XHg4RXhceEJFOkhceEJDXHg4MFx4RDBceEVDXHhFOVx4Q0JdQ1U9NjRceEJCXHhDMFx4OTJceEMwZFx4QTNceDhDOGFceDExXHhFN1x4MTJceDk0eVx4RTVceEM2XHg4MidceERFXHhCQkZceDk5Y1x4MDhvXHgwNyBceEI1XHg4NFx4RjdCXHhCNVx4QzRceDg5XHg4OVx4RUNceDBDXHg4MFx4RTBdXHhBMlx4QTRceDA4MVx4QTRceDk0XHg5OVx4OTNceEIyXHhDRlx4MDlceDFDXHhDMiV4XHhDNFx4OEFiXHhEOFx4QzRceEFDPlx4RUFceEY5MTpceDg4Olx4QjVceDFEXHhCQ1x4REFceENDfFx4MURceDE4XHhFQVx4RURHXHhBQW5ceDhGXHhBQlx4QjZceDBBN1x4RkZceDEye25ceDFCXHhCNlx4MUN0fVx4RjhceEVBe1hceDBFXHg4Rlx4QkFHXHhCNVx4QjZceEU1XHhGMlx4QjhceEEwXHg5MVx4REFmXHhCMklceENBXHhBOFx4OUVceDFBVCpceEREYTpceEMyXHhDQlx4QTlceEZFXHg4RVx4OTJceDA1I1x4RTI2XHgxOVx4OTZ3XHhDNTA3M1x4QjZceDhBXHhDRkR+RFx4OTFnXHg4NFx4MTU8XHgwN1x4RDJceEMzXHg4RVx4OTZceEUzS1x4QzFceEZDfjlceEQ4XHhDNFx4ODJzXHgxOVx4QURceERBXHg5RFx4Qzheflx4OEFceDFDaFx4RDhceEVFdjpceDgxJVx4QzNceEU4Mlx4QTdNXHhEMlx4MUFceDgxXHhGMWVCe1x4RDNceEQ1XHhBMFx4ODhceEREaFBceEM1OkY1XHhFNFx4RkJceDE3XTZceEM5XHhCRFx4OUZCXHgxMlx4RDFceEQ1Z1x4OUVceDhCXHhERkt0Ulx4QzN9Q1x4Q0JceDg1XHhFMFx4QjBceEJFXHgwNVx4OTVceERCXHhBOFFceDg2XHhFQjtfXHhDRUtfXHgwNlx4REJceEIwXHgwOFx4RTJceDFCfVx4QzlRXHhCNlx4MDkvXHhFNVx4MEIocFx4QUJceDlFXHhEMEd7Mlx4RDF3XHhBN1x4REJceEQxXHhFMlx4OThceDBBXHhGRlx4RTNceDFEXHg4M2BceDk4NCtceDA1XHgwOVx4MEVceDkzXHhCOVx4Q0JceEMwXHgwRFx4ODQgXHgxRn5ceEZCXHhBMFx4RkZTXHgwMllaXHhCRVx4MEZceEJGay9ceDk4XHhFM1x4MDdceDE0XHhFN1x4RDFceEQ0XHhCRVx4MUNceEJCXHhDN1x4OUNaXHhEQ2xceENDXHhCOE9ceEUwXHhEMFx4MDlceEVCXHhFQlx4RTJaK1x4QTBceEU2QVx4QThceEIxWVx4QUVIZVx4QjJceEE4XHhDNnhceEZBXHgxRFx4QzVceEIzXHhGRXJ5Vlx4QjZceEREXHgwMVx4OEZceDlDSU1ceEYwXHhGOFx4QTZ5U1x4N0ZceDk3XHgxNlx4MURgIVx4RDNsd1x4RThceENEXHgxOTJceDA3XHhGRVx4QzJceDhGXHhDOFx4OUUpJk5Qai5ceEU3b3BceDhBXHhBRVx4MDZWXHhDQVx4RUVceEE4KVBceENBXHg5OFFceEI2XHhFM1x4MDNceDk5XHg4RFx4RUZceEI0XHhBQ0pceEI2XHhBQklceEVFXHg5NFx4RUFceDlFXHhDMFx4OUJceEZFXHhFRk90Slx4QzNceEZFW1x4QTBceDlDaFx4MTd9XHhGOVx4MTdceEMxXHhDNnNceENDXHhGOSdceEM5XHhDQ1x4QzNceEU1XHhEOVx4QUFTXHg5MVx4RTVceDBBXHhCNSxceDhGXHhDMHpceEVGXHhGMlx4Q0FZZFx4OTVceEIzXHhDRlx4QzBceDAzXHgwN3o5XHg4OFx4MUJceEMzXHgwQlx4QkNceEU1XHgwQVx4RjRVXHgxQ1x4QzJceDk5cVx4RDhJLFx4OTcvXHhCQVRLJFx4QTZceEZFLVx4QTJceERDblx4MUYmelx4QzNceEU5LlhceDBBXHhFRlx4ODFceEFFY1x4QkFceDBDXHhFOG0vXHhGRFx4MThceEI5XHgxNl9ceDgzXHgwQVx4RTROXHhCOVx4OURceEFCS1x4QTJceEVEXHhCMVx4Q0FceEFEXHg5MFx4QzVceDExXHgwRkBceERDeVx4MDUkPVx4ODFceEMyXHgwQVNEIVx4OTBceDhFXHgxOVx4RTJZXHhGOEZceEQ4XHgxMj8yIXNceENEXHhCNVx4MURceDBFV15AXHhCRChceDEwI1x4MDlceDk2Olx4MUJceDgxNjJ6XHhGMVx4QURceEE0M1x4QkMpXHhGNlx4RkVUVVx4QUZceEQ2XHg4Q3dceDg1XHgwM3JceEVDXHhDRlx4QkVceDA3XHg4RihceDE2TFx4RDdceEM1XHhGN3pceDg4XHhCM1YiXHgxRlx4MUZceDhEYVx4OTJceERFQVx4RkN3aVx4MTNceDk4P1x4OTh3MVx4RkJgXHgxOFx4OTVceDk5XHg4MVx4OEZceDA4XHhENlx4OUYrXHhBQ1x4Q0FceDEzZFx4RUNjXHgxQj5ceEFBXHhBNyVceEQyXHhDQVx4QkR1SUolXXZceDg3RGcgVS17XHg5RVx4QkQiLVx4QzdmIFx4RDVceEU4XHgxQ1x4QzJceDA5NFx4QUVceEVDKFx4ODJceDFFXHhDQlx4MDZceEE2Klx4Q0ZJXHgwMFx4RjNceDA5YFx4RkUmXHhFNDNceERCXHhEMFx4OTFceDg4XHhEM1x4MDltQyBceDAzQENDXHhCOHRceDA2XHg4NFx4N0ZiXHhDQiRceDE0XHgxMVx4RjFceDg0XHhCOVFeXHgwMV83XHgwN1x4QTRceDA4VGpceDA5XHg4Q1x4QzJceERDUFx4RjdceEIwXHhDN2JceEM3NVx4QzNceDFFXHgxOFx4ODVeLVx4QjdceEMyXHhGM1x4OUVeO01ceEM0RnpceEI2XHgwQlx4MTNceDlGXHhBOVx4RjdceEY3XHgxRlx4RTlceDA0XHhEMFx4RDFceDAwXHhCOFx4MEQrXHhGOUE2I2tceEI1XHgxN1x4RTZceEM1YzBkeFx4QzNceDlBXHhBNFx4QzZceEI0XHhGRlx4RTVceDFBXFx4RThceDdGXHhEQlx4OURrdVx4MUNceEU4cUc3M1x4Q0JcZVx4RDRceDBDXHgxRVx4ODIvXHhCQ1tceDBDYFx4MEFceEVEXHhEQ1x4MURceEMxXHhBMVx4Q0NHXHgxMTdWNCtceEMxXHhDRlx4ODRceDBEOH1ceDBCXHhFRVFceEZCXHhBRlx4QzF0RVx4RTJWKFx4ODFyXHhCQzMkXHhEMlx4QjFceEE5XHhFNFx4MDVceEI3XHhBMlx4RUNXc3lceDk1XHg5Mlx4QjBceEY2fF5ZXHg4M1x4OUZceEFBNXJceENEXHhGOVx4OTRceERCIFx4RjlceEM3PFx4MDVceDg4XHgwQ1x4MUNceEEwXHhBMjUnXHhGQ1x4Q0EtXlx4QjlceDE2XCxceDhDMFx4RUFceEMyXHhDRVx4QzdceEJEXHg4MlJceENGXHhEMzZceDFDJFx4QjlceEJBXHhCQndxXHhENjded342XHhDOEZceDk3XHhDMlNceEM5Y29TIlx4QjRceEYzS1x4ODBceEFEXHhEOFx4ODZceEIxX1x4REZceEZDXHgxMSlceDkyXHgxQWV+XHhBQk1ceDgwVlx4QjdceEI4LzFceDBGXHhEQlx4RTFceDBCaV1ceEE5XHhEQ1x4MDlceEI4XHhGQVx4OUFwXHhFQVx4OTFceEE0XHg5OCpceEM2dlx4Q0VceDEyXHhDRlx4MTlceEI1XHhFOVx4RTQ/XHhCRlx4ODJeXHhBOVx4QjJceEUyQko2XHhCMVx4QzhEYmN6XHhFQiJceDgxXHgxQVEjXHhFMlx4QkVceDgwXHg5OTN8N2dSTlx4RUNtXHhDMlx4Q0JceDhBXHhFOV5ceEJGXHg5RFx4RTN4XHhFRFx4QTcrIFx4QTNceEREXHg3Rlx4QUVceEI4XHg5Mlx4QzhceEUzWFxrXHg3Rlx4OUNceEE3N1x4OUNceEZDXHhCQ1x4MTVPc1x4MUFceEI0Nlx4REZQXHhBM1x4MDgrNVx4QTBceDg5XHhFRkRceDBEXHg4RFx4MUFtXHg4OFx4ODVceEUzcVx4QzZ6Q1x4QzR4XHg5MT5ceEExXHgwMmlceEQ5XHgxM2pceDhCXFx4QkNceDBGXHhEQVx4QjdceERGXHhGQVx4RDQnXHhEMFx4MENceDgzXHhCMlx4QkVceERDLCRnS2BceEU5SVx4ODNceEYxXHhGQURceENFXHhDQ1x4ODB1WXNceEE2WVx4ODMzbD9ceDk2QFx4RUNceDlGVEY4VShHXHhENFx4RDlvXHg5QVx4RUFceEJGXHgxMl0rXHg4Rlx4OUJceEIycl1ceEMyXHhCN15ceEE1cFx4OUFIXHgwMVx4RDdceDg2Mi00IShceDEyRFx4QzQgXHhFQWFmXHgwN3FceDk2XHhDRF1wXHhEM3BceEJDXHhGNVx4QzFceDFFXHhEQlx4RDFceEUzYlx4RURceEU3XHhDM1x4MENceEJGXHg3Rlx4OUZceENGP1x4MUZceERDUidceDk1XHhFMlx4QUFceEU0XHhGM3hceEFCM1x4MDE9XHgxM1x4RUZwXHhGRVx4ODlceEE4SVx4OThceDA5IVxtXHhERVx4QjFceEI0XHgxQTlceDAxM1x4OEYiXHg4MFx4REYgXHhERFx4ODhDXHhBMFVceEUyXHhGMFx4OEFceEI4XHhBMVx4MTYmXHhCQlx4MDRceDAyTFx4ODlOXHg4RFx4ODZceEVEXHhGNVx4RDRceDFGXHhBMTZceEU1XHgwMVx4QkNceEIxXHhDRlx4REZEXHhFMGdceEE4Mlx4QjNDXHhCOFx4RjFceEVBX1x4OTNceERGYFx4OUQ6XHg4N1x4MDIiXHhEMnBceEQxXHhGQlx4RjhceEE0aVx4MTNYXHg5M1x4Qjk4cVx4MTA7XHhBRVx4OUEyXHg4NGFceENFXHhBRlx4RTgjXHhBOFx4MUNceEU1XVx4RUFceDA1cHhEXHhCNVpceENESFx4ODNoVVx4QzZVXHg4N1RPcFx4Q0ZxI1x4RkVIdFx4RUVceDg1O1x4RDRceEIxNlx4RUNceEU3XHhCNEhceEVFdlx4RkQrXHhGRjxceEJCXHhCNlx4QzdceDgxLVx4OTdceDgwLl9hM3RceDg4XHhFRVx4ODJceDE2XHhCOCZceDg5XHhDOWhceDE0XHg4M1x4RDRceEI1XHhCNXVceEVDe1x4MDJceEZDXHhBM1x4OThceEUyXUJceEYycFx4RkRceEREJVx4RTRceEUzXHhDNVx4RTFPXHhDRVFnXHgwRFx4RkJceDlGXFFceEVGXHgxM1x4MDlceENGJVx4ODFceEFDXHgxQ1x4RTgnNW1ceEM0XHhCOFx4ODJceEQ3XHhDQVx4OTB6XHgxRVx4QzA+V11ZXHhFREM0XHhCRVx4QTNceERGSSQgXHg4M1x4Q0ZceEJFNlx4QjZceERBKHF2XHhFOVx4REQyPFx4RThceEE5ZVx4N0ZMXHg4RFx4ODZkXHhERGRceDBDPFx4OTNceDg0TUNceDBCT1x4RkZMXHgxMid5XHhBNlx4QUV5XHhCMVx4RTlceDlESlx4RUZceEEyNVx4Q0RceDE2XHhFQnRzXHhBRGVCXHhDNVx4MUNceEM0XHhFMlx4MDBceENGd1tNXHgxNlx4MEUwXHhFQVx4QkVeKGpceEZBI1x4MERceEYzXHhGMVx4MUQkX3RceEVEXHg4Qn1UXHhFRVx4QjllXHgxNVZceEM4blx4QUZgXHg5QjFceENCXHg4RFx4QTdceEI2XHhCOWVceEM4XHhERlx4RTNmYFx4ODJceEU4XHhBOFx4QkRceEZEXHhBRThceDBGXHgxRGZceEFEXHhBM1x4QzNceDA0KiNceDA4eHBceDlGXHhDMlx4RjdceEY2XHhGQVx4RENceDE2flx4OUNceDkwXHg4Mlx4QzNceEZBXHhFNlx4MUUuXHhGRjZyXHhGOSxceEE1Xlx4REZ+b1x4RUZceDAxXHhBOVx4OTJwXVx4QkFceEZBKydmXHhEM1x4Q0YkY1x4ODdceEFFNUhceEQ0XHg4M3pceDg2XHgwRlx4Q0ZceEM3Nlx4Q0YkXHg5MXtceDkwXHhGRSJkXHhDRmtceDAxXHgxRVx4ODhceEMwXHhCM1x4QjVceEI1XHgwQVlceEI1XHhBNlx4OTlxXHgxMUFceEJEXHhGRFx4QjNceDgxXHhGNlx4REF4NnI1XHg4M19ceEZFXHhENVx4RUNceDA5XHhBNFx4QjZmT1x4QjlceDhFUVx4QkZceDhBT1x4ODBceDFGXHhCNl06XHhFOUxceEM4XHhDN1x4RjhceEMzXHgwOVx4OERceERCXHhDQk5ceEJBXHhBQSxceDA5alx4OERceEE3XHhDM1x4OURceEU1d3VBXHhENVx4QjBceEYzXHhFQVx4RkFceEVDclx4RDZceENDXHhDNHk9XHhENVx4MTdiXHhFOFx4QTFceDBBMDNSV1x4RUR9LFVceEE4P1x4MTU+XHg5M1x4Q0NceEZCXHgwQlhceDlEXHg5MiR9XHhFQlx4QUJceDBCXHgxMVx4QUZceEVEXHgwMWFceEIxXHhEMHNceDE1XHhDOFx4Q0RKXHhBOERceEJDXHhFOF1ceERCXVx4ODBceDAxWVx4RER5eEJceDE4XHgxN3ZceDEwXHg4Rlx4QjFceEQwXHhEMlx4MDlceEJDXHgxNVx4RTRceDk2YVx4MThceEQ5XHhBNFx4OTB2dFx4OTVceDE3XHhEQ1x4QUZxXHgwOFx4MTBbSFx4RDdceEVGXHgwNlx4MEZ5dFNDVFx4QTlceEJDZHRceEI5aFx4ODF7XHhCRlx4RjhceEY2fVx4RDZceDdGXHgxNT11RVx4QjZceEU3fndceEFGQFx4ODNceEM5XHhDRW9ceEU5dlx4RDVceDEzXHhEQ2cwXHhFOFx4ODVceDA4XHgwNlx4N0YtaFx4RjRceDkxXHg5NlNceDFDXHg5N1x4REJgXHhDODlceDE0d1x4QTdceEUyXHhBNFx4QUNceDAxWFx4QTZceEEzXHgxOVx4MTdceEM3XHhCMVx4MTFceENFXHhENFx4MUJceEZFXHg5NzBceEEyYyRceEUxXHhFQlx4OTFceDkyXHhFMVx4RDVceEY0XHhCNjdNa1pQXHhCQShceERDZCImIFx4MEVbXHhBMFx4MTBceEQyYyNJXHhCNFx4MUFceDFEZFx4OUZceDg0XHhEQidHXHhCMFx4QkVceDE2fj5YXHhBNlx4RTJVXHgxN1tceENCXHg4Q1x4RDcwXHg5MVhceEU5XHhEOEpceEMxXHg5OFx4RTRXXHhDNlx4OTBceEE1XHhDRFx4OUFoRyZceEUxXUJOJ3JceEE2XHhDRkl1XHg5RScrSj9ceEUzXHhCOVx4RURoY2FeXHg5NCtceEY0PVx4MDFceDlCTSlWXHhEMFx4MUY6V1x4MEFceEZFXHhERSxXWT1ceEUxWVx4RTFlXHhGQTJceEFGIVx4QzY9XHg4OFx4RTBceEYyXHhENVx4ODE6Qm5ceEVGXHgxNFx4QkEuXHhGNXV5Zlx4RUZmXHg5RVx4OUJgPyZceEFBIkxceDlFXHhEN1x4QzRceEVFM1x4REJYaDNceEE0eFx4QjEkKlx4QzBceEExdlx4RjhceEY4YHZceEQ3XHhERVx4RjgiXHhCQzdceEEwXHhERVx4ODFceEUxXHhFQ1x4RDhceEYzPi9+XHhDMlx4RDhceEE3XHhEQUZceEIwX1x4RTRKXHhEQk5ceEQ5TiBceDAxN0NceEE4J2ZceEQ0XHhCRlVceEUwQ1V0XHhCRVx4RTBceDlCXHhCNlx4MTM1XHhGNTFceDA3PSpceDE1XHgxQlx4QjddXHgxQjZceDkzXHg5RFx4OTRceDAyXTtceEE4XHhFN1x4MDNceEJCXHhBRFx4QUNceEJDXHhCRFx4RDZceENEUlx4QThceEM2XHhGMFx4RkN+XHhGRUkwdztceEVGXVx4QThceDBGXHhCNFx4ODc5XHgwN1x4OTFXXHg4Q1x4RDdceERCXHhERVJceEM0XHgwNlx4RTVceDAwS1x4MDVrPFx4OUFZXHgxRFx4RTlceEVCXHgwRVx4QzNceDlESFx4OTJceEZDbVx4QjEpXHgwRD59XHhFRFx4RDZgMFx4OUNceEVBelx4MTFceERBXHhGMFx4MUNceENDXHgwNiZceEFEXHhERGRceEYwXHgxNTdceDk1XHg5M1x4QThLXHgwRlx4QTVceEVCXHg4Rlx4MDlceDEwXHgwM1x4Q0MoTDNceEQ2XHhBN1x4MDdceEFGXHhEOXBceEU0XHhFRFx4OTlMXHhEQjkwVntceEE1XHgwNnh1N2VpXHhFMERceEJCXnZceEVFXHhGRlx4REIkXHhDMlx4MEY0XHhFQlx4RTdceEI5XHhGQSlceEIzXHhCNm1ceEJFQVx4QThceEM4XHgwM1x4MDdceEUyXHhDNiMuTVx4MEFceDg2fUhceEQ5IEBceEQ0enhjXHhDNUxceDBBXHgwMiBjXHhFMVx4MTZpclx4OTRceEQ5Tlx4QTkvXHgwNzVceEFFXHhFRFx4RTBceENBXHg4MFx4QTJceEY0XHhEMlx4RUFQUz52XHgxRFx4RTFceDA3XHg4NVx4OTg9XHhEMndceEU0NVx4QkU4XHgwRm5ceDlEXHgwMTpceEIzXHhDRlx4QUZceDFGXHhFRTxceDhGXHgwN1x4OTVceEYzXHhGMlx4MDVceDE3XHhFNC5QdFx4ODY3fFx4RjBmX1x4QjlMXHgwM1x4RTlceDgwe1x4MDZceDkyXHgwNjFmaytJXHgxNFx4OEFfKVx4Q0Z7I19ceEEwXHhCN1VzXHgxOFdaXHhGRFx4QzlfXHhFRDpMelx4RDlceDA3bzxceDFFXHg5Qlx4MTFceEY3XHhDRlx4REFYXHgwNlx4REViXHg4OVx4ODZyWFx4MDJoXHhDNGY5XHhDRlx4MUIlXHhCOVx4RjRceDkxXHgwM1x4RjBGIHhceEIwPlx4REVceDA2XHhDRFx4QzdceEM0XHg3RiBceEQ4XHhFNypceENCXHhFN1x4Q0ZceEQ5XHhDQj5cXHg4N1x4ODV0XHg4RVx4RDJLNlx4RDZceENFXHgwQVx4QjFceERCXHg4RVx4MTU9ZFx4OUFceEY4KVx4QTlceDFEXHgxQmFMXHhDOUNceEI0XHgxOVx4ODVyXHgxNFx4OTlceDE4P1x4ODVceDAzXHg5MmZceDhGXHhGNlx4QjVceEY5XHhENlx4MThceEREXHhERlx4MUNceDAxXHhGRlx4RDlJOlx4RkNceDBCL1x4RUFBIFx4QkRceEFEXHhBQVx4QTJceDlEaFx4QUZceENFXHhCOVx4MERceDAxRlx4QzRceEZDXHhDRlx4RTBXXHgwNVx4QjRceEMzXHhBRTxceDhDXHgxNlx4Q0NceDExXHg4RkRceEVBXHhEOFx4MERceDk5XHgxQ1x4OEJceEFBXHhCQT1ceEFFNzpceEU1XHhDMFx4QTRceEZBSFx4MEFceDhCJyhNXHhCMWkpXHhCND47XHhGNm5iMVx4OTRyXHhGRGZceEQyaFx4MUVMXHhBOX52XHhCMyVceDE1XHhCRlx4RTVceEU3JltceEY4dVx4QUVUXHhFRXNdXHhFRDpnXHhDQ1x4RUJceEQwXHgxNVx4RDZceEExRXBTcFx4OUVYPVx4REFceDBCXHhBNU9ceEVFQFx4QjhceENELFx4QzJceDlEdVx4QTliQFx4Rjk2XHhFNl9EXHg5NTFceDFFXHhCRFx4MTV2XHhENlx4QTNceEExLFx4Q0FceDA1XHhBNTdceEU5XHg5Mlx4MUJceDk3ZFx4QjJceEQ2XHhCQS5ceEQzXHhGMktceEY2XHhCRFB3XHg5Qlx4MDV5XHhGQVBceEJGXkBceDAwYVx4RUUkXHg5NVx4MEFceEUxXHhEMVx4QjRceEY4XHhGRkhceEMxeFx4RkJVXHhGRj12IW1ceDg1Nlx4MDlceEI4Wlx4RThceEU2XHhDNFxceEU5alx4RTBeXHhBOVx4RThLXHhENFx4MTlceDk5d1x4RDdRXHgwN1x4QjNYaVx4RDBRU1x4RjNceEQwdlx4MDdceEJDXHgxQy9ceDA2XHgwOEFceEQyaVx4RDNceEMyTVx4QUMlXHg5MC5ceDhBXHg4OFx4RUZOXHgxNX5dZVx4RThceDBBXHhBOFx4MDhceEU3XHgxNDk6XHhFQlx4QTVceDE1XHhERVx4RjRceDgxbjFceEI2XHhEMVx4OUFceEZGIVx4QzJlXHhBRFx4QUU8W1x4OTZceEFBXHhBQiRceEQxXHg4Nlx4RTkiXHhFQjUrXHhCMF1ceEI5QFx4QkNceDFFXHg4OVx4OEFhaVx4MDlceDdGRVx4OUEkNGdceEJCXHhGOVx4Q0RceDA2XHgwOFx4QjZceEE5XHgwRFx4OTMgXHg5N1x4QzRceEY5a1x4Q0JceDdGXHgwMVx4RjlceEUyXHhCRG9ceDAwPiZceDhFXHhDRVx4Q0JceDlGXHhDQlx4RUJceEZFXHhDOFx4RjA6Tz5tXHhDNFJceDFBXHgxMklceDkyXHhEQVx4RDJceEYwXHg4NGJceDhBXHgwMWcnXHhBRFx4QjVceEE4WE9ceDA5XHgxN1x4ODN3XHhFMFx4OUNvfW1ceDhEXHhGNlx4REUtXHhFMiRceEY2XHhFMVx4RENceEYyJixceEI5XHgwQTxLXHhGMFx4RUZceEQ4QVx4QTNceEFBVm4yUlx4RjRceEUzQHZceEVCZyFDXHg5Nlx4QUFceEIyVlx4RUVceENBXHgwQWA9XHhCNFx4QzZceDlBXHhBM0g/bnNceEJEXHgwOWJceEY2XHhCODRyV1x4OTI9XHhBRFx4QjFceEQxfVx4RTBMXHg4MVx4REZceEIwXHhDN1NceDgzXHhCQlx4ODhceDE4JS1ceEQyXHgxMm5ceERGY1x4QTRceEJCXHhEOSdceDk4XHg4Nlx4Q0RceEQxXHhEMVx4MTBceDE1XHg5NkhceEVFXHhBQi1ceEYxS1x4ODVceEQzalx4OEReS1x4QkFceEMyTmdyL1x4RTJwXHgxRUBceEZDXHhEOVx4Q0NceDA3Tlx4MUNBXHhDQWVceEUwXHhERm8mVVx4QjlceEE2XHhGRFx4OURceEMxXHgwM1x4RThLZVx4RjJ9a1x4MEZceDkxXHhGQ0hceEFFXHhFMFx4Q0VceDhGU1x4ODNoXHhGNFZceDAzXHg4N1xjZlx4RjdceEUxXHhERlx4MTlceDk0XHhGNGE7XHhCQ1x4OTlceDlBelx4QjFceEZBXHhEMVx4RDBceDE1XHgxQlx4ODlceDhBXHhFNE5ceEIzXHhFQVx4OEVceEE4RFx4RThceDFDLVx4MDh1aFx4OTVceDFBeVx4OTk8bVx4QkNceDgyYVx4QkZceEU0XHhEMVx4QkVceEJEXHgwQ1x4RjhceEJFXHgxOFx4Q0RceEU3XHhERFx4Q0JceEY5XHhCQ1x4QjRceEVEXHhFMFx4RjRtdSxceEU3XHgwM3tceEVCXHhCMFx4MTlceDAwXHhFQVx4QTRceEQxXHhBMVx4RkU6Olx4RDJzXHhENm1qXHhEQVx4MTZTXHhCRFx4RjVceEVEblx4ODZBXHg5OFx4QTZOXHhEM1x4ODdVQD9QZHRceDlCXHhEMlx4MEVceDA2XHg5RDxceEUyXHhCOSVceEMzXHgwQVx4OENceDg0XHhDMVx4RjJceEMyMlx4QTJceEMzXHhBQlx4MEFceEMwXHgwQ1x4QUFJflx4OTZceEYwUEZwe1x4RjZceDdGOC1ceDEyXHg5RFx4MDlSXHgxRThceEZCXHgxOVx4RDFceENGXVx4MUJceEVFYVx4MDJceDA2KVx4RERceDk2XHgxQ1x4RUJceEE1XHg5N1x4MUIxMFx4QTNceENBXHg4RWF9XHg4OHdceDE0XHg5QlVhXHg4Rlx4OEZceDdGXHhFMjlceDEwWFx4RDI0XHhCQVx4QzhceEQ0XHg5MFx4REVFXlx4RkJeaVx4RkVceDAzW1RceEVEXHhGND9ceDBBXHhERVx4Q0ZceEEzXHhCNFx4MTlceDhCXHhGQlx4QUJceEE0XHg4Qy9ceEFFLSZceEE2XHhBMVx4QTkxXHhEM1x4MDV0IihceEQ2XHhCQlx4ODYkRyZceEY4Slx4QzdceEI0XHhFRVx4QURiXHg4N1x4Q0RceERFPVx4RTFrXHhBOSJ7XHhDQVx4QTlceEU4XHhDRkk8XHhDNlx4OTNceEUwXHhGND1ceEM1XHhENUFNXHgxMlx4RUZceDE1XHhEQTlceDA1XHhFQlx4QTVlX11nXHgxRFx4MEJceEEyXHhBQmBceEI0XHhERCJceDE4XHgxOFx4MENceDgyXHhCNVx4QTBceEFEXHg5OVx4RTZceERFXHg4MFx4QzZceDE0XHhBMFx4MTlceEJBXHg5NVx4OUUuMVx4RUIuXHhDOFx4MENceEVBXHhCNjJceEExXHhBRFx4RkRceEFCKjpceDEwXHg4MnRceDk1XHhFRlx4RDFceDhGXHg4NFx4RTdhXHhGNlx4MTVceDk3NHlVXHhCNVx4QjhceDkyXHhBNFx4ODhceEQ1XHhERlx4MUNJeFx4MTc2XHhDM1x4RkNceDhFXHg4MVdceDFEXHg5QVx4QTBceEZGXHhCODpceEI3XHgwNlx4OEVgfVx4QTJceDFGXHg5OVQ6XHhEMFx4QzEwXHhBMml5XHhCRlx4QjVceEYxXHhGQlx4QTBceEE2clx4RkJceDEwSV9tXHgxNCdiRlx4QjJceEE4XHg5RFx4Q0RceDg1VVx4RjJqXHhDQlx4OTItXHhENVZceDE0XHhFRlx4QjNfXHg4MS5ceDEwYE1ceEI3XHhCQlx4OEVceEY0XVx4ODlceEVGYFx4RDVceEM3V1x4MEIvXHhCMjlceDg3XHhCNyojXHgxNzUsXHgwM1o/XHhDOFx4RDJGXHhDRFx4MUJceDEyXHhERlx4RDdceEFCfFx4OUImXHgxQ1x4OUNceENBXHgxM3BdXHhDM0xceEYyXHhDM1x4RDNceDExSWVceDkzXHgwMVx4OTV5VVx4MUJceEVGajJceENBXHhFRlx4ODBceDhCXHhCMSdceEI2NFx4RjBSXHhCMCVceDk4XHhGQ1x4RkQ5JDtceDg2XHgxOFx4RjBceDk0XHg5N1x4Qzk+OXFceEM4M1x4ODlceDE1XHg4Nlx4MURceDE1Rlx4MDBuXHhDQlx4OEVceEVBXHgxRCpceEJDWWdceDA3XHhDQidceDBDbVx4OTNceEZBUTdceDFCXHhFQ1x4RDNbXHhERVx4RERceEMxXHgwRlx4RDZceDE4XHhBQUBceEUyXHhGNVx4MEZceDE3XHhENVx4OUJceDExS1x4REZceEVFXHhCMFx4OThceEQ1XHgxRFx4REJceENGXHhDMV5ceDFDXHhCMzAmXjFceEU1XHg5RFx4QUZPXHg5OFx4RDJ7XHhFNlx4QkNceEEyXHgwRkdceDhDWlx4Q0VceEUxXHhDQ1x4OTRceEZGXHgxQlx4MEVceEZGXHg4RFx4MEJceDg2XHhGMlx4RkRaXHgxN1x4MTN7XVx4RDB7UFx4QjFiMVZceDg2XHgxMkVceDA3XHhGNFx4ODhceEVFalx4OTRceEY2XHg5RFx4RjlceDlBblx4ODU+XHgxRi1ceEEzY1x4RUZceERBQ1x4RTNceERFXHhFQ1x4Q0FceEE5XHg4RVx4ODdceEM2XHg5Mlx4OEJRXHg5Rm9LPFJUXHgwNlx4RDN+XHhCMV88XHhCQWlceEQwXHhEOCR9Vlx4QzZceEJCVHRceERDQktceERBXHg5Mlx4QjlPXHhEQVx4QzZ0bFx4RjNceEUxM2BceDkxXHg5N1JceDg2YHB+XHg4NkxceEQ3blFceEEwXHg5RXRNXHhDNEZceDdGXHhCN1x4OThXQVx4RUVjXHhDNFx4MEZceEE5XHhFQlx4RjR1XHhBRlx4MUVIVlx4OTRceDE3IFx4MDRceEVDXHhGNlx4OEI6XHhFM1x4Qzg9XHhEQlx4OTVceEQxXHhEMFx4ODJcXHhFRVx4QUUtXHhFMVxceDlEXHhCQkRceEZER1x4QUZgSVx4QjNuXHhCNVx4QTdceDkyVFx4MDhceDlEJFx4ODllXHhFQVx4RTBQXHg5Qlx4ODZceEU5Llx4MUNceEM0MF5ceENCXHhFRFx4RUNLXHhDRlx4OEJeXHhBQVx4MTI1XHhDQ1x4OUZceDExcVx4ODhceENBXHhFNlx4OEFceEMzXHgxRFx4ODBceEQxXHg4MVx4QTdceDlBYUlceENDZERsSlx4RUV5XHg5RFx4OTNVXHhEOVx4QUFceEU1Nlx4QzJceEQ2XHg5Mz93XHgxRFx4OTVceDA2Olx4OUNceEZEXHhBMyVceEUwXHhBQVx4OUFceDhCXHhGQVx4ODhceEQ5XHhCMlx4RUN7XHhFOFx4RDRceDBGXHhFQ31ceDBGJ1x4MTQ0XHgwQVx4MDZceDE4XHhGNTpceDk5OVx4ODFceDk0XHhCRFx4RjVvXHg5N3JceDk0Nlx4RTRdXHhGMVx4OEFgXHhBNVx4MEVceEM0XHgwMVx4OTNceEI0XHhCNFx4OUZWXHg5RFhNXHg4MFx4QTFHXHhFOXBceDBFXHg4MVx4MDZceEVBXHgxMyVceEM3VFx4OTc4XHhDQ1x4RTh9XHhCRlx4QkU1NVVVXHgxNlx4Q0NoXHhDQ1x4MURceDE5XHg5RFx4QkM2XHhDM3xceDAyXHhCQlx4QkVceDA3XHhEOFx4RUErK1x4RDVqWFx4MDRceEI5Rlx4MDJMXHhEMlx4RDRceEI1XHhFOFx4MTVceEExXHgxOFhtXHgwNVx4RDk2XHhDOVx4QTJceEI5alx4REFVXHhDQlx4MDRceDg5QVRceEE1XHhDRV9uXHhEMVx4REEgPnxceDg5XHg5OWlCXHhGMlx4QTNceDAzXHhFQ0BxX1x4RkFceEUzRVx4RTFoXHg5NFx4MENceDA2XHhCQylceEY3aVx4MTZoXHhEOFx4RTZceEI1X1x4MERRXHg4Qlx4QjZDXHhCRFx4RUJceEU5XHhBOVx4RjhceEE1XFx4MDdceEUwXHg4RFx4RDZceEJCPVx4RDB8XHgxOFx4MTl8XHhFOVx4OEVceDhBXHgxNVx4QjgvXHhDMlx4ODBceDFEXHgwRj5ceEFDXHhCMFx4OUYzXHhEMlx4ODBHXHhFQVx4OUJceDhFXHgwN1x4QzlrIEtceEYzXHgwQlx4RTJ2XHhGRlx4QTRVXHhDRVx4OThceDEyXHhFNFd1ZFx4QUNceDlEbVx4QTJceEREXHgxQ1x4RTI1WGhceENEXHgwNFx4QzJceDk5N1x4QjVceDAxIlx4Q0U5XHhDRlx4QURceDg2XHhGRVx4MDIjXHhCQypceEYxXHgwNGhxPGUsXHhFQVx4QTU1XHhGMlx4RTdceDg2RFx4MUFceEQ1XHhCOCp9XHhENFx4MURceERBXHhCQVpKXHhDNFx4RDReXHg5Qlx4RUFceEUwXHgwQytceDFDeVx4RTBceEFGXHhDQylxXHg5NVx4RDUhXHhEOUpYT2tceEFDXHhDNlx4QTJceEVGXHhERm9LXHgxM1x4RjhkXHhERlx4QTBceDg5XHhDNzRceEVFXHhEMn53LVx4QzRceEQ3XHhGQVx4REVceEFBXHgwMEFceEY4XHhFRFx4QjFtTFx4QTdceDAxXHhFMCpceDBCXHg5NjdceEZDRlxceEY0XHhFQVx4QkR5XHhBQlx4OEVceDA4XHhBQlx4QTdceDAxVCpceDk1bVx4MTdceDlEXHhCN2BceEY4XHhDQXhceEYwXHhBOWUnXHhCQiAxXHhEN1x4ODJceDg0XHhFNTFFRGh7TVx4MUZaQlx4RUVceEZCXHhDOFx4RDhRXHhGMWZceEZFXHhEOFx4MDlceEVCXHhGQlx4OUVceEVDXHg4RVx4OTdceEM4XHg4NVx4RDFceEFCWX1ceDg0XHgwQVx4ODBceEE3JVx4QTFNXHhEMTdceEY0XHhGNlx4QUJceEIyXHgwMlx4QjRceDlBXHhDMyJceEExXHhGNFx4QzNceDgxW1x4RDBceDE2XHgwOSFceDkzNlx4RDN4XHg4QntceEM3alpceEJFW1x4QUFceDAyXHgwQV9ceEVDXHhFRlx4OTU4OFx4REZgRlx4OTFceEYzXHg4Rlx4MURceEUyUC5ceDg3XHhCQVx4Rjg/XHg5Nlx4QUUzSFx4MDVaXHhBMVx4OERceEFDXHhCQlx4MDYlXHg5Nlx4OTZceEY4XHhCM1x4MDFceDE3XHgwQUpceDFFXHg4OFx4MTV8XHhFM1x4QjNceDA5UVx4RDBceDA1XHgxRjZceERGXHhCRlx4QjRceEYyMVx4RkVceEI1XHhBQVx4REJqXHg5OVx4RDRceEEyXHhBRlx4QUZ6XHhDQlx4QzV2Y3UpOFx4OTJsMyBceENBXHhENVx4MTBwXHhGRFx4QkJceDE4KmdceDEwXHg4QVx4MUZceEJEXHhGNFx4OTZceEZFdVx4MDFceEFFYH5kL15ceDBCXHhBOVx4RUMrXHhBN1ZceEQxXHhBNFx4REM/eVx4QjJceDlCXHhEQ1x4MEMkXHg4MTopeSxFXHg4OVx4RjlbIl9ceEMwQlx4ODF8XHhFMlx4RjQqe1x4REJceDBBXHhDMkg9QVx4RTYuXHhFMHFceDE5XHhBOFx4RDdceEVDXHg5QVx4QzYgLVx4RTJ5XHg4RTlceEVBUV1ceEIyOmxceDlCMFx4RkVeXHg5MFx4RDlceEQ1XHhFQilTW1x4MDYjXHhCMFx4RUNceDBFSFx4ODNceEYwIlx4ODggIyRceEMwXHhCQzJceDExXHhDMzpceDhDPCVceEJDQFx4MDFceEFGXHhENjdceDAwXHhGOFx4QjZfXHgxQlx4RTFceEQ0XHhGMm5ceDBCUU87Ilx4MUQha1x4QkI2Ri5ceERBQlx4RDYidFx4RTBceDlDXHhGOFx4ODNceEFBXHg5NytzfWpceDAzXHgwM3tvXHg3Rlx4OERceDA5XHg5Rlx4RkYmNzxceDBFI1x4QUJnXHgxQk9ceDE4XFRceEVFXHgxQ1x4RDVceEE3XHhGQzUkXHhGMFx4QTdceEM1JVx4RDBceEREVlx4QzdceDkxXHhGMUJceDFDWVx4QTdQXHg5N21tZEpceEQ2XHgwOVx4ODBceEM3XHg5RVx4OEVbQCxlcFx4MTU5XHgwOVx4QTlceEYwXHhFMWpceDA0XHgwNjJceEY2eFx4RDVceDgwXHhBQlx4Q0NceDlBXlx4ODY3XHg5OGJceDAwXHhDRFx4QTNceDkwXHg5MVx4QjBGXHg5Q1x4ODVceEVDI1x4RjdceDBBXHhDRF1ceDhBXHhCNzRZV3xceDdGLlx4QTZVfnBceDEwJ1x4RjVsXHgxNFx4RUVceEJGXHhFMDFvXHhGNlx4RTZceDk1XHhCOFx4QjNceDBBXHhDRFx4QzNNXHhCM35ceEI2XHhEQlx4OTMkXHg5NFx4QkZeXHhFNUJceDkyXHg4N1x4MDBceDk2I1x4RDhceEFBXHhCOXlSTCMtMFx4MURceEQ1XHg5RVx4MENceENDZ1x4RDVsXHgxQVx4REQ6XHhBOTgxVFx4RjJceDhEXHhBNFx4RkRceDEyXHhGRlx4QzBceEZGYDpceDk0eTFEXHgwNlx4QTJceENCXHhDQVx4MDVceEI2bUBceEFFXHg5Q1x4QjdxNlx4MDg2XHg4Rlx4RThceERESFx4QjlceENCM1x4OEFDXHhFM1x4RjB8XHhFN1x4MUFceEY3XHg5QVx4ODBceEI4XHg4QnBKXHhFN2lceEY4XHg4RHRceEMwXHhGNjNceEQ2fFx4RjhceEYwWVx4QUZceDE1MSFceDgwKVx4OTEpXHgwRVx4MUJxXHgwNVx4RThceDBCZFx4RTJceEYzbClceDg4XHhBOXhceDFDMFx4RDFBXlx4RDVceEM4UVx4RjQmXHhDNlx4RTBceEE1XHhDM2dta1x4MDZceDEyXHgxQlx4OEIrXHhBOFx4RUJceEQ0XHhDQX4iXHhGNSNceEYyQFRceDAxXHhDMVx4RTJceEJEQkZceEM3XHg4RFx4OTlceERFXHg4NDVGXHhFM1x4OUJaKFx4MUJceEQyXHgwOFx4RUJceDg5XHgwMFZceDA2XHhERlx4ODdceEE5XHhCM3ZceEE0XHhBQXldXHhEN0JceEIxXHhDN1x4ODQwXFx4RDJceEIyQUlceDE2OkBEXHhFN1x4ODhceEQ3OFx4OENceEY3XHhBRVx4QzBceDg5XHhBNG9ceEFEZn5ceEJFZlJUIk5ceDhBXHhENn5ceEU1XGxceDk2XHhFN2dceDk0XHhCQiVceEM4XHhGQVx4QzhceEU2XHgxMlx4REYkY1x4OEVceDE4XHhBQ1x4OEQsXHhBQVx4ODQ0Sz5ceEM5XHhBOFx4QTZceEIwXHg4QXlSXHg4Qlx4RTAxXHg4NDhceDlFXHhCN29ceEQ5LVx4RThceEM0XHhBRUJceDk5Slx4OTRdXHgwMzZceDg5XHg4NFx4QjgoXHhCMFx4OUVceDk2VihceEE2XHhFMlA7dDJceERDe3BceEY2XHhEM0lAXHg5Rlx4QTNceEJCMVx4RjZceDExXVx4Q0JceEQ5eFx4ODIkeGl6XHg5Nlx4RENceDA5XHhGN1x4QzNDXHhGM3pjM1x4QUZceEYyXHgwNVx4RkZceEQ3Yl59XHgwNUJceEEyXHhCQ1x4QzZceENEXHg4M1x4RjlwfVx4MDZceEJDXHhEMlx4OURceDkzXHg4OFx4MEVceEZDZ1x4QTZceDlDXHg5Q1x4RTRAXHg4NVx4RjkhXHhBQlx4MUJceEIzXHgxNFx4ODBdXHhFM0NceDhCXHhDRlx4RDFceEFBXHgxQVx4QzVmdFx4MDIhXHhEMFx4OUEkXHg4NVx4QjknJlx4RkZceENBXHgwOCJILyxuT1x4QkFceEY4VFx4QTAkXHhDRVx4RUZceENCbFx4OThceDAyXHgxOVx4QjBceERDXHhBMlx4MDZceEZFXHhENC10XHhENFx4QkFceERCXHg5Rn5ceEMyQVx4RDVceEY4XHhGNGNceEFFbVMuXHhBN1x4RUFceDk4Ilx4RTgzXHhDN2ZceEQ1XHhDRl5ceEI0XHgwN1x4QzZheVx4MTFceDk4XHg5Qlx4RTlceEI5XHgwODxCXHhGOFx4RkFceDg5XHhDM1x4Q0NceEI0XHg5Qlx4OTInXHgwNFx4QzVsXHhCNlx4RDBceDEyXHhDRlx4RDZceEJEZ1x4ODlceEQyXHhGQVx4RjlwXHhDM3E3TFx4MERceDBDfjQ7XHhBMFx4MUEoXHhCRFx4RUNceEMwXHhCMFx4QjZceEEwXHhGNFx4RkFceDAyXHg4MEZceDExXHgwNnZeUlx4OEMgYlFceEVGdFx4QUZPWFx4MDJmXHhBRVx4REVceDlBXHhFQ2FceEFCZUVceDAzXHhENlx4RDRceDkzXHgxRS1ceDk0XHhGQj9ceEQ2e2BceEI5KVx4RjRceEFDXHhENGRceEQ0KFx4Q0R0XHhCNVx4RUM4XHg5OVtgXHhDMW9ceEU1KEw2XHgxNlx4QjE/L1x4RjNceEM3Jlx4ODVTXHgwRVx4ODlTXHhFNE1ceEYyXHgxQW5ceEFEXHg5MVRceEM1XHhCQ1x4RDByXHg5QVx4MDVceDBFSiRceEEzMzVceEM0ZVx4MDFceEE1XHg5N1x4QkNceEFEXHhDNFx4MDZoXHhCMFx4ODdceDkzXHhGQlx4OUVceEZDPlx4OUNceDkwYiVceDE5cy5ceEQxXHhCRlx4OUJceEU3Tlx4QUVceDEzXHgxOVx4OUVceENFWlx4Q0RceDBDNFx4QkUkXHhBMFx4Qjk1XHgxRlZiXHhCNlx4QjdceEU4XHhBOVx4QzMgXHg5RFx4MTNceEYxOFx4QzFceEZBL1x4MTRceDg0YVx4QkFceEI1R1x4OTRceEE2XHhCQ1x4RjRceEYwXHg4Mi5ceEI0XHg5N1x4RUFceEExXHhCQVx4QTZ4XHhEQjBxXHhEQTRJXHgxM1x4ODNceDAxXHhFQ1x4RUVceEE4XHhGOVtceDFCLVx4RjRceEM3XHgwM1x4RUJceEIwXHg4NVx4OENceDFEXHhBM1x4RDZceEVCXHhGMlhceEZDXHhCN0VceDE3XHg4Mlx4OTNceDFCeFx4MThceEFCXHhENlx4RjVceDFBXHhGNlx4OThceDlFW3xceEI2Llx4MENceEI3XHhEQ1x4QzBceDA5NStceEI5IFx4MTFxYVx4OEZyXHg4MFx4MTVraVx4MTlceDA5TVx4QzBceDkwXHgxOFx4RDVceEVGR2hceDgxMVx4QzlxZFx4Q0RdXHhFQ11ceEJDXHhCMlx4ODVceEFFXHgwMFx4RTlceDk4XHg5QVx4OTJceEMzQVx4MURDXHgxQ1x4RDBceDAyXHgwMX5OXHhFQ1x4QjVceENDXHhDMFx4QkRceDhFXHg4MXlceDA0XHhCNHtceEVCclx4RjZVXHhGNiJceDhFLFx4OUR3dlx4RDJceEM0XHhFRjhkYVx4QTBceEFBXHhFQlx4MEJceEY0XHhBMDBceEE2dVx4RjlceENGXHhCMlx4ODR+LVx4RjdceEQwZ1x4RTBceEUzIFx4QjRceEUyXHhDMTZceEIxXHhFRiNceERCXHg4Qlx4QTRceEFBaVx4QTBceEUyXHgwMFx4QzJceDFDXHhDRlx4RDNceDAwI1x4OTZceDlFYVx4Q0ZULVx4MEVEXHg4RFx4Q0RceEQzXHhGMFx4RkJNXHgxOG1ceDgzPFx4RkZceDk1WmNceEVGXHhEMT5ceEMwXHhGMkxjayxceDEzQVx4QjR6UFx4QzNceDFGW1x4QkNceDlFXHhCRWdceEIyXHhBNVx4OEJceDE0XHg5RTtceEM4XHgxQ0tceEUyXHhDOVx4OTlceEYxXHhEQyJkXHhDMXVceDdGXHhCOVx4MDJceEFBSFx4OTRceEJCRlx4OTRceEY4XHg5RCBceEI5XHg4Q1x4RDNceDhFNVVceDA0XHgxMDFceDFBSWpceEQxJXtYVVx4Qjk6XHgxQ1x4QTVceERDXHgwNUhceDBEXHhENnJceEZEeVx4QkNAXHhGMFx4QzFceEZBJ1x4OEZceDk0XHhCOVx4RkVceEQzP1x4ODJ4KVx4ODcgXHgwQVx4MTRceDE0XHhEQX49XHhCRlx4QkRceDg2XHhGQ3JNXHhBOXVceDlFXHg4Rlx4QzVjU1x4RTdceDE4XHgwNDFULUBceDFCXHgwMj14XHgxRnBceDAwXHg4Nlx4OTZyPVx4Q0JceDg5XHhGOVx4OEZceDA0XHg5QmlceDFCWVx4QkJceEVGXHhBNCpceDhEXHg5MlF0U1x4RUJceEUzXHg5RCBceEVENVx4QUZceENEXHhDQnxceDAzXHgxMG9ceDA0XHhBNFx4MDcgXHhFN1x4RDhceDg3fldceEE3XHgwQm5ceDhEQVx4RjFceEJDe0xceEIwemx+Wlx4QjlceDhFXHhFREM9XHhBMVx4ODN5XHg4NURceDBGXHhEQThceEY3XHgwNlx4RUZFXHg5Nlx4QzBceEI1MVx4OTJceDEzXHhERipceDBDXHhDN1x4ODJceEFFXHgxOShceEJEXHg3Rlx4REYoelx4QTYpXHgxNVx4OERceEFBZVx4MDVceEI1OFx4OEJMZFgjXHhDM1x4RkRzXHhBOSJHJVx4MUZRXHgwQmwpXHhBM1x4REJ+XHg5RCgmOlJceDAweVx4OUJceEVCXHhCNVx4OTdceDhFWFx4ODBceDk1XHhCOVVceEZEYVx4MDB7XHhEMUJceEY5ZFx4RkVceERESHdceDkwe1x4OTdceDFCTyBceEZGXHgwRFx4Q0ZceEQ1Vlx4QUFceEZELFx4OUFZXHgxMVx4RjZMXHgxOHZ5XHhCQX4oVXlceDFFXHhERVx4QURceDBGXHhGRjNJXHhEMlx4MUFSXHhDQlJceDhEXHhCNVx4RDdceDlFXHgwQVx4QkZceEJCMVx4RjgmXHg4OFhceDAyXHhDRVx4QUFceDE4a1x4QjBceDFBeSlDSj4vXVx4RjBceEQ5XHhFQUR3Ylx4MTRceDE1XHg4OXteTltceDFBXHgwOFx4QUNoXHgwQVx4MDBceEZCXHg5N1x4QTJceEYzXHhCQlx4MTdTXHgxRFFTXHg4OFx4MEJceDE3XHgwQXhceDFBXHg5Nlx4QTJceEI0IVx4MTNceDE5XHhCN0VkXHhCNFx4OTRceDkxXHhDRWJceEYxXHg4QVx4QTBpdlx4RDdceEJBJWN3YFx4QzNTXHgxRkpceEEyI1x4QjhceEUyXHhFRFx4OURceEU0flx4RUVhIkhzXHhDRmtceEJFXHgxNlx4ODNyXHgwNlx4RkJceEM2P3BceEI5XHg4Qlx4RDdceDBCXHhDQjtAXHhCQVx4OTNwIlx4QzFceDkxXHhDQlx4MDNceDdGPE5ceDlEJFx4QjRuXHhBN1x4QjQuXHg5NzRceEYwRVhuJlx4RERceEIwTFx4RjhceEE1XHg4RSBceDBBXHg5Q1x4OThoXHhFNSdceEJEXHhCM1x4QzFLXHg5MzpceEI4XHgxRVx4MEJceEM5XHg4RFx4QjRceEU5XHhFNVx4RDZTXHgwNFx4QkM5QzpceEIxXHhBQVx4RkVceENGXHhCMVx4QUVceEQ0XHhGQjpBXHhBM0ZceDFEKVx4ODhceDBDXHhGRVx4RDNceDFBXHhCM1x4RDNceDgwXHhEOVx4OUFceEFBR2g6XHhFN1x4OTRGXHg5OFx4MTdceEZDLzRXXHhGQzBceDk5a1x4MDFlXHgwRVx4MTQuXHhBOFx4RDlceDFGWlx4ODNmI1x4QkRoXHhBRFx4QkVoXHgwRXpceEIyXHhGOFx4MDdceEJBRlx4RkYyKFx4RThceEI3XHhCQ1x4OTlceEZFXHg4QXZceDExXHgxRHNceEYwXHhEQ1x4RDBceEFFXHg4MVx4OThceDE3XHhGOVx4QUNceDhCXHgwRVx4RTcxXHhEOVx4RDIoXHgxOFx4OTVGaVBceEM5XHg4Mlx4RDVceDk5XHhDNlx4Q0FceEQ5XHgxMlx4MUVceEM1QVx4QUI8XHgwRlx4Q0RceEM3XHhCM1x4OEQ7XHhDOFx4ODBfXHhDRXFceDgyLlhIXHhBM1x4RkNceENFXHhCQ2suTydceDBDXHhBQVx4RTJceEQzWUdceEVDaFx4RTRceDhBcTNceDkzK2pcO1x4MDhceDBFajNrbktgXHhEOElceDFGXHgxM049Tlx4MDA6XHhEQlx4MEFceEI5XHg4M01ceDgzXHgwNFx4OUFceDBEXHgwMVx4MDh6Zlx4RUFSOVx4QUNceEM2XHhCQ1x4Q0NceDAwXHhDQ1x4Q0VceDhGVVx4QTJceEZDXHhFMlx4OUFceEFEVixceDg5XHgwNFx4OEFFXHhFMVx4QUJceDhGPXRceDE5WFx4Q0ZceEMzfFx4QkNceEQ1XHhFOVx4OTFceDg0Y1x4MTh8XHhGMlx4RUJceEY4XHg5Nlx4MTZceDlGX0BoJ1x4RkI8XHhFRFx4RDkuXHgwMVx4QkM1c1x4QjFceEJBXHgwOWBceDBBVVx4REJceEQ4VFx4MDRceDhCXHgxRm1VXHhBNVx4OEJceEUyXHg4Mlx4QzdceEQ5JFx4QjY2TVx4RDBTXHhGNlx4N0ZFXHg4NiZceENBZlx4REJceDE5aXxdWydQSVx4QjhceDkwXHhBRlx4ODNQXHhBQmdceDE3XHhFN3FfYFx4Q0JaXHhDOFx4MDZceEVGXHgxRFYsXHhDQzFCXV1ceDk5alx4RjlceDAyIUl2XHg5OEBceEQzXHg4RloxW1x4RTBQQlx4Q0VceEFFTFx4ODBBXHhBMT1ceDhGXHhFRlx4QjE/ZVx4OEFTXHhDOVx4QjRvXHhCMTMpJUBceDdGXWJceDhEXHgxNTxceEZFXHg5Q3IsXHgwNlx4ODk4XHhDRVx4QzJceDkyV1x4OEYgXUtfIFx4QzdceEU0XHg5MG9ceEYxXHhBQi9ceEQ0cCV+XHhEQVx4MTdceEQ1XHg5Q1x4ODY9XHhGN1V9XHhGRlx4RDNPXHg5MFx4OUZceEQ0XHhCQVx4OEE6XHhDRj0xNVx4OTMxR1x4ODhceEJGXHhFMVx4RDhlXHhCN1lceEY4XHhDOVx4MUE9XHgxN2lceEI5NzpceEMya0cwXlx4RTUpXHhCNVx4OTc1fWZceDBEXHhBRlx4QzQmKyBceDlBXHgxM1x4OEYzXHgwM2RceEM1XHhEMkxceDhBXHhGQ1x4ODVceEE4OVx4QUEkXHg4Mlx4RDZceEJCXHgxOXNCXHg4OVx4Rjd9YTR0XHg4NkRceEYzNVFTXHhGNVx4MThceEMyXHhFQzBceEEwS3dceDg0XHhBRVx4OERceEUxL1wlXHhFQnZ3XHhEMFx4RDBlMVx4ODY7XHg4M1x4QkFceEQ4XHhBRVx4REJceDA3XHgxMFx4OTZceEIwZVx4RTJceDhDXHhCMzk/T1x4QzRrXHgxQiFceEVGXHg5OFx4OTdsXHhBMlx4RTBgXHhBOEhHXHhCMVx4RjdHXHgwMFx4MTdceEMzQ1x4QjRceEE3XHhEMG5ceEU1XHgxNV9ceEZCXHhENVx4QThceEExMVx4MTBceENGUi5ceDBCZ34oXHhDQVx4QkYgXHg4Rlx4OTlceDdGUFx4QkZEXHhGMTVweVx4QUZceDhCXHhGMFx4Q0ZAXHg4ODlceEE4XHgwQlx4OUR4XHgwQVx4OERceDhGUVx4OURPXHgxMUJCbVx4RDRfSVx4RjhceDBFXHhBMlx4QjJXXHhBOVx4MDlOXHgwQlx4QTJceDhDXHhCN1x4Q0JceEQ5XHhBMmxceDE2XHhBNlx4RjZceEI3XHg4Q1x4RTViXHg5NFx4QzIyXHgwMEdceEMwTVx4MUVceDBEXHg4RiVceDk2XHgxQUFceDgzXHg5Qlx4MDl9XHhGM1x4QUJceEM3XHhENFx4OTlceEYwXHgwNFx4QzJwPlx4MDdceEZDXHhEMFx4OEZceEMwXHg5MTxceEM2bF1ceEQ2XHhGOFx4MTRAXHgxRFx4QkE9XHhENlx4MTdceDE3XHgxRFx4MDJceEVDTFNceERBb1x4REYkXHhGN15ceDk3XHhFQVx4ODRnXHhBQj1ceEEwXHhDRlx4Q0NceEQ0a3dbXHhGRlx4OTNceEZGXHgxRFx4RThceENCQE9ceERCXHhGRlZceDdGXHhCM1x4QjhceEVEXHhCMVx4MEVceDhEXHgwOHxceDlBXHgxRVx4RTNceEFDXHhDM1x4QkE+XHg5RHNceDAyXHgwNntceEREfVx4Q0NEXHhEQlx4RjUqfFFceDgwXHgxM1x4RUJ1XHgxNVx4OEVceEFCX1x4QjNceEI4XHgxQVx4QThceEQ0XHg5QitceDg3XHhGOVx4RDBceDk4XHhBN1x4ODdMXHhDRkdFXHhCN1x4QThceDg4XHpceEJCXHhBRlx4MDFceEU1Slx4REJceDkxSlx4OTVceEVDXHgxOF1ceEQ1XHhERm1ceDBCXHhFN1x4QTlNXHgwRHJceDFGXHhGRFx4RkVceDkyXHg4Mlx4RUVceEQ5Nlx4OUNfXHhFNFx4OEJBXHg5QVx4Q0FceEU3XHhBNV5ceDFEPlx4QUVhXHhEQlx4QzNceEZCXHgxQylCO1x4MUNceDEzXHhCMlx4MTByLUNceEIyXHhEMlx4Q0FceENEVlx4QUZceDA2UFx4RjZyXHhGQyc4XHgwQlx4REJceEY2XHhCRFx4QkRceDAxLyZceEE1Rlx4QzJceEM4XHgwOFx4REU0XHhCRVx4MTVVJSBaXHg4NFx4QzNceEI4Jlx4OTFceEQ0eVx4REFceEVEXHhGRFx4MDJceEFBXHhEMlx4MTNiXHhCM09ceDE4TFx4OUNceDlCXHg5Mn5RNVx4QTdOXHhBNFx4MDVceEMwXHg4RVx4MEFbYXxceEQwXHhDRlx4QzFceERDcnhzRFx4QTRceDhCbCpuXHhBNFx4QUY/XHhCNVx4RDZceEZFXHhEN15ceEYxXHgwRlx4RjMnTl5ceDlFW1JiXHhFMFx4QTBBJ1x4Q0Q7XHhBMyhceDE2XHhEN1x4QzlceEUxXHgxQyV4XHhERFx4QUE7YFx4RkJceERGaDRDXUhceEM5XHg4RkFceDAzXHhGRHhCXHhBRS9ceEZDXntOXHhDRFx4Q0JceEQzXHhCOVx4RDFceEYxaVx4QTZceEJBXHhEMSt0XHg5Q1x4MDFULXBceDg2XHhBMi5ceEE1QVx4QUM5XHhDN1x4ODlceEYyJ1x4OThkXHhDN2tceEE3XHhBMV1ceEM4XHhBMmBzXHhGN1x4MTclXHg5MFx4RERceDlFaCdceEZFXHg5NFx4QzVceEUyXHhDMzhceEQzSFx4ODloYVx4REZceEQ1NVdceEIxT1x4MTBceEJCfjE8fFx4QjRceDg2XHhGNVx4QTRceDBFXHhFOFx4RERceEYxXHhCRWlceDA0Nlx4OUJceEU1XHhBNDpzcFx4RThCT1x4RjJ1XHhDRlx4RDZceDE4XHhGNnBceENFXHhDNFx4OEVceDFGU1x4RERceDBDXHgxM1x4RDBceDBGXHhEQ1x4QUJceDlBXHhGRVx4RTZtXHgxMCVceDg2XHg4MFx4OEVRXHhDNlBceDlEXHhFQlx4REJceDhEWFx4MUVbXHhGMFx4QzJceEI1XHgwOGpPXHgxN0VceEY1Klx4MTNCXHhFN1x4RURceDhFXHhCOFx4ODR2JUM2XHg5OXFceEY4XHgwMFx4RUV1UFx4MTNceEZBXHhENVx4RDMoKFx4OTAgTG5ceEIyQGhceEJDTFdceEQ3T1x4RThceEM3aVh4XHg4MUpceEU0ZWdceDk3XHhGMmpceEEwXHhDOWtceEE4XHgwOVx4MEJceDE2XHg5Mlx4Q0QjOVx4QjZceENGXHhDMVx4RDhceEE3XHg4Qlx4QzJceEFGXHhFN1x4QjlceDhBIzZceEFDXHhFRFx4MUZceEZEbnBceEIxP1x4RkJceEJCXHg4MVx4Qjg6XHgxN1x4MDBceEJFXHgwRmlceEE0XHhCQ3lceDAzflx4MTRceEYwXHhDMm44XHgwNFx4Q0FceDExXHhGNXJceDg2cFx4RDJfXHgxQlx4MURceERFdFx4REZYXHhCOFx4Qjg7XHhCOFx4RjBlai9ceDAzXHhGOFx4MUMyXHgxQlx4QkJceDE2XHhDMUd0XHhDNVx4RUJceDBER1x4QjZ9XHgxRFx4RkVEXHg4NFx4REZceDg1XHhFQlx4QUNceDg1aFx4MDNceDdGKFVceDE5XHg4Rlx4MTRceEJCXHhGRXZceDE0XHhDN1x4MDBceEI5N1x4QTlsXVx4RDNceEUybVx4QURceEZFXHgwNHIkXHhGQ1x4ODlceEMyXHhFMGxFXHgxNHtceEYzXHhFN1x4RTY1XHhDQmV8XHhCRVx4OTJceDExOVx4OURceEU3XHg5Nlx4RTdceEQ2fVx4QkVceDExXHhGRHpceDlEXHg4OWlceDAzQWp7XHhBMFx4REJceEZEMVx4QUQqXHhCMEplTFx4RkZceDA3XHhDMT1ceEVEbHlceDA0XHhDRDNceDEzXHg5QVx4QUUqXHg5N1x4RUEvXHhBNFx4RDdQXHg5NFx4MUJceEE5XHhDQ1dceERDXHhDQlx4QUVceEJBXHhFMCJceEZCXHgwOFx4OTJceEQzXHgxMFFceEIzXHgxNlx4MERceEE5XHhBMn5ceEZBPSBceDg2XHg4MFx4RjBAXHhCN1x4QkZceEI2I1BPMFx4QUZceEZGXHgwOVx4QzFceDgyb1x4QjBceDg1SStceEY0XHhCRVx4MENceDE5XHhBMVx4RDNceDg2Ylx4QTRceEZBXHhEMlx4QUFceEU4OFx4Q0FceDk0elx4QjRceEEwXHhDRFx4QUNceENBdE9TXHgwRmNceEU4XHhERlx4RUVceEUwd3doXHhGRiRceDA0XHg5N05ceEVCI1x4QzVceDA4Qlx4MUQjP15ceEQwXHgxNS1ceEQwXHhDMVx4QURceDBFXHhBRlx4QTlceEFGXHhDMlx4QThceEFEPVx4QjlceEY3XHhDQ1x4OTZceDA5OE5ceEE2d1x4MEZHXHg5OFx4QjVceEU0XHgxMVx4MTBceDg5XHhEQlx4RjdceEQwXHhEMktceDgwXHgwMlx4QkJceEM1XHhBRFx4QTZhJnVceEFEXHgwNlx4RjBIe1x4MDclXHhFOVx4RTM7Nlx4QTJceDBEXHhFM1x4QjcnXHgxMlx4MUE7XHg4NVx4QTItXHhEQm5CN1x4QkJceDA0QFx4MEFceDkwR05ceERCXHg5QVx4RTZceDhGUnxceDE3eFx4QTAzXHgwRFx4RjJTXHgwQlx4QkEnXHhGRXpceEY4XHhGNU9ceEU0JjZceDFBXHhFQ1x4RDdqXHg4OVx4MTBkZ1x4MDFceDE0XHhDNFx4ODc8Z2o3XHhFMVx4RTUhXHhFQVVcXHg5NUVceEU5XHg5QjBeLFx4QTFceEQ0Q1x4RkZWUyZceEE2XHg5MFx4QzNceEE5XHhDRkBceEE0XHhDRlx4QzdceDkwSllyXHg4NVx4QkYmcy56MVx4MENceEYzXHhFRlx4OURceDg1XHhBMVx4QkJceDBEXW0pXHhGRVx4RTlceDkyXHg5MDJhSmxceDlFXHhCRlx4Q0Zzflx4MTJceEU2XHg4OSlceEY2XHhFRlx4OUMsXHhCQVx4RkVgQFx4QTdaXHhBRmAhXHhCNFx4MEVceDk3TFx4OENceEE3XVx4REJceDA0XHhBNlx4OTVceDkxXHhFOHRceDA3XHhBN3xmXHg5OXEsJG4pXHhEOVx4OERceEMxaFx4REZceDlDcmxJPEtceDE0XHhBRFx4MURoXHhBQlx4ODlceDAxXHhGMlx4OEFnMFx4QkJceERDXHhGQVx4MDInXHhCRVx4QTNceEFGbVx4RDhceEMzXHhFOEY9XHhFOVx4RkRwXHgwNVx4RjZceEVGXHhENn1lXHhCOFx4RTJceEU1XVx4Q0VLW0ZhXHhCRFx4QzZceEI2S1x4ODEgeFx4Q0VceEZEYU1ceEMzXHhFN1FceEYxZV9iXHhFQVx4RUFceDE0XHhGRFx4MTFyXHhGNDFceEI5XHg4M1x4RTdceEZFXHhDOVx4MTBceEQ1XHhGNVx4RTFceEY1WVx4ODlceDhBXHg4NDZceENBQlx4RDdceDg1XHhGQzZceEZBRV1ceEE4XHhGMFx4Q0EoI1x4RkFsXHhFQVx4RTQ7XHg5NnJceEM4XHgxRVx4MDNceEMyXHhDOFx4Rjd5IUhceENDL1x4OEVceEY0XHhDMTVceEZENlx4RjRceEFGXHhGMFx4RTNKXHg4Nlx4QTNceEM1Mlx4QTdeNjUmXHhEM09ceEJGaFx4QzBceEVGXHgwQ1x4RTZceDkzXHhBMFx4MTFceDhDXHgwMFdceDgwN1RFI3pceDk1VkdceDg4XHg5M1x4ODZceEIyO11ceERBUWNceENBelx4RkF9XHg5Rlx4RUEzXHgxM1x4QzhceDk4XHhCNFx4RDJceEJDLFx4Rjl+XHhBRVx4QjFnXHhGMVx4MUJceDlBXHhCN1x4QzJ7XHhCMURceDgzclx4ODNceDk2XHhBN2tceDE4Klx4OThceEUzNDArXHhGRVx4RjFceDhBXHg5QTtceEI5c1x4Q0NceEFBXHgxQzVBXHgxQSFwXHhFNFx4ODcsZlx4RTlceDg0XHgwRlx4QUZceEZCXHhFMVx4QUZceDgwXHhDMD0qXHgwOGFceDdGXHhBOVtceDg0XHhEMXBceDFDVXlqXHgxOTJKTFx4Q0F1XHg5RGhceENCXHgwRVx4QjlkaFx4QzdceDkxUn5ceERBdnlceDg5VVRceEE5ZFx4MDVceEEzXHhCQVx4ODJceEZCXHg5N1x4MEQuOHBtIlx4MDVceEM0XHg5Mlx4REFceEJCXHhDN1x4MTg2XHgxMlx4OTBceEExfVx4MUEpXHgxMlx4QzBceDhCXHhCM1x4REVceEQ2XHgwMVcgXHgxQVx4MThceEFEOlx4QThceEQxXHhBNUFaY1x4QjZceDk0LVx4QTMvXHhGMVx4QURTXHg5MWUoXHhDQ1x4QzFceDlBXHg4MFx4RURceDE5XHgwRlU3XHg5MjZceEJDXHhEMVx4QzJceEY0SjUhXHgwRVdceEYwXHhBRVx4OUFceDE0XHhGNFx4RUNceEVEXHgwN1x4RDRceEIxXHgxQVx4RkZoXHg4NVx4RjFceEUyXz8xeXdceDg1ICRceDA2ZVx4QzdceEYwUFx4RDRceDEzXHg4Mlx4RjdceEMwXHhDNFx4MTBceEJEXHhBMFtceEE0XHg5Q1x4QjlceERCXHhENVx4RkVceDhGXHgxOFx4QkZnWVx4QzNQXHhCMlx4MThceEQwc1x4QzJjclx4MDdceDE4fVx4N0ZIXHgxQ1FiWFx4MUVSXVx4ODRceEY4XHhCRCpTXHhFNlx4MEIyOFx4REVdXHg5NFx4REFceEQwfFx4MEJceEFESzxceEMxXHgxMCJceDAxVVx4OUFceEQ2flx4OTZXTDN5XHhDRlx4ODRCL3NceEM5XHgxOFx4REYvXHhCNTdceEJBXHg4Q18uXHhEMDlceEI3akYhXHg5OS5ceDE2blx4RkZceDkwXHg4QytiXHgxNFx4RjdNXHhEMTskXHgwNVx4RkFceDFDaVx4Q0JceENCXHgxRlx4RkJceENFXHgwOFx4QjNceEUyZFx4MTMmXHhCOWN4PFx4MEU8bVx4QjdzKFx4MDRuSlx4RUZceDkwXHg5NVx4REEtXHgxOHtceDlBXHhGOFx4RDJceDhCXHhDNH1ceERGXHg5QjlceERFXHgxRklCXHg5NVx4MUFceEE0PFx4ODFceEEwXHhCM1FTXHhEMi1VRFpceDFFZ1x4RTNceDA4XHhFNlx4MTBceEU1QWVceEU2aXlceDk2eTtceDk2aVx4MUJceDg3XHgxOC5ceEQzP1x4ODA6XFx4RThceEFBXHhBRVx4MEJceDA0XHhGOFx4RkFMcTxceENEIFx4ODRaelx4QURceEQ4XHhEOVx4OTZceEU3c1x4MDJgXHg4MVx4QTB3TFx4MUN7JiFceEYxXHhENVx4QkNceDg2XHhFNVx4ODlJXHgwM1x4QjhceEY5RFx4OUJceDE2XHgwRD5bXHhBNFx4MDIsZFx4MERiK1x4QzIhWShceDFDaFx4QkVceEJDXHhBNnU8alx4MTVceDkyUVx4QjNceEFBXHhBNFx4RURceEJDXHhDMFx4QkZ7XHgxMVx4MTU2XHg5Mk1ceDEyXHhDQ0lceDBCXHgxMlx4RDlceEMwXHhENFx4QTdPXHg5NWhtXVx4RjVceEZBXHhGQVx4OUF+XHgxRlYlXHg5NX1ceEM1XHhBQVx4MEQyfVx4QUErKTJceEJGS1hceEEzXHhDRFx4RjZceEZFRTdceDEySFx4RjRZXHgwOVx4MUZceEU0XHhGOVZceDhFQU9ceDhEJVx4REF6XHhDN3lceEZFd1x4RTFceEUwXHhDMlx4QTJceEYxXHg5Q3lceEIxXHhCMW8sekh+XHhBNDs4QVMqXHhDMzZXXHhCQkNceEVGXHhBM1x4MDBceEVFXHg5M1x4MUFceEIzXHhCQ1x4QzgtXHhFNVx4QTdceEUwXHhBMDtceEJCXHhGNFx4OTJceDEyXHhEMk9ceEMzXXRceEE5UVx4RUJceEQzNlx4OUFceEYxfVx4RDc8XHg4N1x4OTBhXHgxMXg5MVx4RDdceEFEPFx4RTBceEMyXHhCN3FvXHhGRlx4RTJMT1x4REJceDhFZG8yXHhCODlceEQ0XHgwNlx4ODhceEQyXHgxM1x4QTJceEU5XHhGQW1gXHg4N1x4QzhceDAxXHgwRWhmXHhENlx4RkFceEUwRDNceDk1XHhGRVx4RDlceDk5bkdceEUyPFx4RDFceEZBXHhDQUxceDBBOCxceEQ5XHgwQVx4OTI/c1x4MENceEYyTyNkUTxceEQ0KVx4MUI8XHhCNFx4ODFvXHg5QyNceDA0XHhBOX1ceEUwXHhGNlx4MUNceDAxN1x4RjRceEFGTHJceEUxeVx4QjhceEVFXHhFNlx4OUVceEE1XHhCQVx4QjlceEExXHhCQVx4QTlNXHg4NHBceDg1XHhFMFx4MDM/XHgxNFx4RTIvXHhGOFx4QUZceENEXHhFOXxyXHgwM3BGXHhBNlhceDlFXHg3Rlx4QzVBXHhBNlx4MTgzXHg4NVx4QTJAXlx4OUNFXHg4Rlx4QTdceEIwXHg5QW8zXHgwNzpceEM5XHhCQVx4OEYjfVx4QThceEYwXHg5NFx4MDBvXHhENyJceEYyXHhGOFx4QzJceEZEXHhFOFx4MTgiclx4MTM5Zlx4MDJaJ1x4QjVDXWU1XHg4Nlx4OUJceENDXHhEOFx4Q0NrXFx4MThceDBDXHhCOFx4RkZceEI0XHg4NzZrSlx4QjJceEM5XHhDMzA/XHhEQllceDAwQSdceDBDW0Y+N1x4MUZceDk2XHhDQz9GaE5ceDhDXHhBNk97XHgxQlx4RkZceEYwXHhCMlx4QjNceDFCXHhGQWVceEQxUFx4N0YjXHhFMTkwYFx4OTZceEZFXHhDQ1x4Q0N7XHgwQW9ceEYwXHg5Rk5cVlx4RTFlc1x4QUZceEJCRHZceDkwXHgwM1x4QkVceEJEXHhEOG9ceEMwXHgwM1x4RERceEE4XHgxRDpceDAyXHhDRSlceDgzXHhDNFx4Rjd5XHg4Q0xceDFDe1x4QkNUcFx4MTRceEZEXHg4QVx4MDZceDlGXHhEOT9ceDFBRFx4RDIyeFx4QUFceEQ1XHhEQlx4OENceDAya1x4MUZhXHhBNlx4RUVmXHgxRVx4QjBceEY4XFx4Q0FsXHhGND5ceDBBYFx4QkRceDk4XHg5NXJceEQxXHhGM0lceEVFXHgwM1x4RjlYLXNXQyxceEQyXFx4RDJ8XHhBQ1x4RjhceEREXHgxQ2dNXHhCOFc0XHhCMFx4MUNceEVDXHhBMDlceDBDXHhBM0UjXHg4Q1g8XHhBNFx4RDBkXWxceEM1flx4QTdzXHhGNzpceDA0Q3xceDA4XHhERFx4ODNceENGXHhERFx4MDlmIlx4MDM7IFx4RkUyflx4MEJceEE2XHhBNlx4ODMheFx4MDBceEU3XHg5QUdceDA2MFx4QjJceEM3XHgxQnVceDE0XHg4M1x4MERceEVEXHgxNVx4ODdzQ1x4QzRceEEzXHhENVx4OURceEQ1JVx4OEFGKF1gWE9ceDFEMVx4REFGXHhDMlVceDExe3pceEVBXHhGOVx4QkRceEJDM1x4Q0FMZlx4QjhceDE3Tlx4QzdoXHhFRTRceEVCXHhEQnVceEJFXHhCQlx4RUZceEREXHg4NVx4RURceEY2XHhEQjdceDBBXHhGRVx4MDFceEMyXHhGNVx4QkFceEMxXHg5MUBceEJFXHg3RihXbVx4OEQwclx4OTZceDA0XHhFQzloIlVlXHhGM1x4QURceDBBcFx4MUFqXHgxQnlceDlGXHg4Qlx4OTJceDhDXHhEMVx4MDRrXHg4Rlx4RkVqXHhEQlx4QzhceEYyS1x4QjZceEY4XHhDMFFceDAxXHhBOFx4OTBceDAyOFx4RkJceEQ2XHhBQ1x4OUFQWlx4RjBceDAwJlhceEUxXHg4OFx4MERUbihceEMwXHhCRVx4QUNLXHhBMnhPXHhENV5ceDFDO0tceEVDXHhGQiNceEY1XHg5MGNceDFFXHhFN1x4RjlceDk3XHhCOFx4REJceEFEXHg5MFx4QTNWIVx4OUVMKFx4QkNceDE0XHhBOFx4OTRceDA0SndceEExKFx4QUZceDBFXHhGNVx4QTRBLlx4REYwOltceDE2XHgwMFx4MERpXHgwNFx4OENpXHhDOEJceEY5UltceEQxXHg4Qlx4QjBceENDXHg4NFx4RERceERFXHg4N1x4RDVceEJBbFx4QkNceEZFbVx4RDhceERCXHg4RnBqXHhGND5bXHhEM1pceEI4XHgwMktceEM2XHhBNE1ceDg2XHg4M1x4MENceEIzXHhGN1x4REFceDFFSlx4OURceDA1TktceDBCXHg4N1x4QkJHQDFfXHgxNVx4OTdceEM2XHhFRHFKUlx4OTZceDkzWVx4OENrXHhBQ1x4OTZfXHhDNlx4OURceDdGXHg4OFx4MThceEM5dEBceDkwYXdceEYyU01ceEEzP1x4RUVceEM4WnpceEEyXHhGMyJceDBBI1x4MDhceEQxXHhDQVx4OTlceDE3XHg5M1x4QTlxXHgxQ1x4QjlceEVCXD1ceEJEXHgwMz9ceEU3XHgwNlBCXHhCQmZceEVEXHg5Rlx4RERceERFM1RceDgzXHgxQlx4OTFGXHgwQVx4ODhceDhCXHhDM1x4RjNFXHhGQ1x4ODBceEYwXHhERV1ceDhBXHhDMFx4MDNceEExXHhBN1x4QzhceENEalx4RDdFZlRceDE5I1x4RDZceEJGXHhFOTFceEI4XHhCMVx4Q0NMXHgxRSFceDkyRj94XHhFRWh5XHg5MnVFXHhBRnc2JVx4QjZceDAwXHhCNVx4QkZceEQzXHhDMlx4QzhceENBTWBceEMwXHhDOH56XHhFNUNceDk3XHgwMURFeFx4RUZceEI4XHgwRVx4MDl8XHhBMlx4MEFceEE3XHhBRVx4RkNceDBGPlx4RTdWXHgxMFx4RjVQW1xceDA2eChceEU0XHg4MVx4ODRceEE1bWM3KzNqM15hXHhBQTVceENDXHhEQ2RceDkwMlx4RTBceEZDXHhGNFx4ODN6OktEXHhCQUZceEI3XHhFNlx4REREXHhDNVx4ODQqXHgxQVx4QjItXHg5MFx4QjJceDAyZlx4QTNceEM0XHg5MWIpXHgxRFx4RERceEIwXHgxMVJceDBCXHhERDJnZTs2W1x4MTlceEIzXHg4N0JceDkwXHhERSVmXHhFNkJceDk3XHg5RVx4RENceEQ5XHhCNlx4MTVceDFFXHgwN1x4RTFceEU2cXVceEI1XHhERlx4RTVYRlx4QzZceEM4XHhCQlx4QjUyXHhGNlx4QkNceEI1XHhBMFx4RUJ0Tlx4RTZceERBXHhGQVx4MEM4XHhCMlx4QzRceDA5XHhBRGVceDEyKlx4MERceEQ3InJceEIyXHhBN1x4QkFceEQwXHhBNVx4OTRceDg0XHhFNlx4Q0JceEE3IVx4OTlceERBXHg4Mlx4RUFeXHgwNVx4RjZceEY0XVx4QURceDA1XHhCOVx4OTJceEE3XHhGOVx4MENceEUzXHhGNFx4QTJceDdGXHgxNDl4IVx4ODNceDkyVVx4MTdceDgzZFx4Qzd2XHhFQWtRR1x4RjZceDA5XHg5RmhceDBEL1x4OEFLXHhERFx4QkVRNFx4RjU/Ilx4RjVceEFGbVx4RTR6elx4MERNPVx4QTdceDlDXHhEMkRceEU0XHhDNlx4OTZ4QFx4RTFceDBBXHg5RXNceDlDXHhCRlx4OTUmXHhGRFx4RTVceEZFdlx4MThhXHgxM09ceEQyIlx4MEFmXHhCNiBceDgxNFx4MDBceDFEXHg4OVx4MERceDFGXHhDNFx4Q0MuZlt1XHhDQ1x4OTlWXHhCNFx4ODkoXHhGQlx4OEZceDlFXHhDRFx4ODRceDBBNCNceENCXHhFOVx4RkQjXHhBRFx4QjFGXHhBOE40XHhENFx4RDJceERCeUAnXHg4RVx4RERceDk1XHhFOWJIPFx4Qjd7Q1x4ODQsYDFceEE5XHhFMFx4MENceDgyXHhDOVx4RTRFYVx4QjhceEU2VFx4QUFceEY3fSlceDE2XHhEQlx4RUNceDk1XT4jXHg4M1x4RjhceERBXlx4REYoXHhCNT5QXHg4MWFceDEyXHhGMlx4MTU2Ylx4QTFnXHhCNy1ceDk2RFx4QzNceEZFUFx4MUYzXHg4MmBceDhFIyEuXHhFQlx4QzVceDkwXHg5M1x4ODBceDk1WFx4QkFceDE5aVx4RTZceEM1Nlx4RkRceDlGXHgwQ2BpXHhBNW5ceENFXHgxOFx4RjhxdVx4QzRceDgyeFx4OURceEUwXHhCRkdPXHg4RHVceDhGQ1x4OTNceEExXHhGN1x4QkJceEE1XHgwRElLXHhEQlx4MTFIKlx4QTAhd1x4MEFLXHg5QVx4ODRceERCWi5pXHhDRFx4RUNceEM4XHhGN1x4RDVtOVx4QkVceDlBKFx4ODBceDE1TVx4RTdceEY3XHhGN1x4MTFceDk2XHgwMVx4OUNoXHg5RWlceERDK1x4QzhceEJDI3pceEFBXHg4NVx4MDhceEYzXHg4OSJceDdGM1x4RERceEJCXHhCMmVceEFFXHg5M1x4OTVaXHg4OFFJXHgxN1M/SFx4MDJceEVDXHgwM1x4MTlbXHg5NFx4OTJceEFGXXgxUlx4RjhceDAyXHg5RnBceEExJlx4RjRceEE3XHhCN1x4RkUlQ1x4OEZceDlFZHVBPlx4MTZwXHhBMjpceEY4XHhCNzVceDk0XHg4M1x4MTNceEY2Ulx4RjZceDhCWzpceDA1RF1ceDE3XHg5RClUXHhFNz5HPlx4QkI/XHgwOUZceDgwXHhCRlx4MDg3WjljS1x4QTdceEY0XHg4MFx4OTdceERBXHhCNlx4MDJceEFDXHg4OCxceEIzJ1x4QkJceEY5XHhFMDpsXHhDM1x4REZceERFO1x4QzRCM1x4ODVceENEXHgxRHY9XHhBOWRceEExXHg5Mlx4MDggXHhGQVx4OTlGXHhDRFx4MTJceEVCRVx4QjJceEM1KFx4QzVceEU5XHgxNVx4REFKXHg4MVx4ODgqXHhGRVx4RjRceEU3XHg5MklceEY0VFx4MEVceEU5XHhFQzBceEJCXHhBM1x4MEVceEJBblx4OEZceEE4XHhDNlx4ODFceEFDXHgxRFx4ODBeXHg5Rlx4QzNceEM5XHhBOFx4OTNceEI2fFx4QUVnflx4OTVceEFGfTJceDhEUmdceEU3ZFx4QjA8XHgwNVx4RDhceDgxXHhDQi5ceDk2Xlx4RDdoXHhBNS5ceDg5bFx4RUMtXHhDMlx4QzNceDlBXHgwQ1x4RkEsRFx4RDhceEE0NyAgXlx4REZceDlGXHg4NkNceEEwN1x4RDBceEQ1YWNceEEzRlx4QjNceDA2PEFxSFx4MUZceEQzXHhFRVx4RUE3LkZSXHg4N1x4RkI7XHhEMWFceEIzfVx4QjRceDAxKlx4OUNceDFGQ1x4RDNceEJFXHhBM1x4RjBceDg1XHhBOXZceDA2XHg5NFx4QzheXHhFNVx4RUJRXHgxNFx4RjJOXHhDQlx4RURceDhBXHhFQVx4QTZceEE2K1x4RURzbFx4OEZWSVx4QkVYXHhCNlx4RDdceEUwI1x4OUVceDgxUVx4MDdceEYxXHgxRVx4REVceEJEckdceEU5e1x4QkVceEZDXHg5OStGRmtceDFGXHhBQzxceDA0XHgxMlx4OENceDFDXHhBMlxfXHhCRDZmXHg5MDNceEYxXHhERFx4RDZceENGMVx4QUVceDE4XHhEM1x4RDhceEQ1XHgxMVx4OTFceEFEXHhBMlx4REJceEI2Llx4RTFdXHhGNlx4QUR6XHg5MFx4ODdAMFtbXHhEOVx4OEFceEI0XHhDNzpceDhDXHhFOCpceEVGRT9ceEU2eVx4OTAjXHg4Rlx4RDVceEUwXHhDNltceEMzXHg5Qlx4MTlceEMxXHgwQjRceDFDNXFceEEzXHg4MkRceDhEXHhCRFx4MTQ2XHgwRlx4QzNceEJEXHhDQWkxZFx4MDFceDA2LVx4ODBceEJDXHg5MVx4QTRKXHhCN0FceDk1XHhEOHRceEI3XFxaXHhFRlxceEZDVSxceDgxIFx4REJceERBPlx4QzBceEIzIFx4OUN8XHg3Rlx4RERceDBEXHhDRVx4OUJceEI1XHhFMCRceEQ1XHg4Mlx4RDN8OVx4QkRceEQxXHg5MVx4MEZceEREUmNceDA0JFx4RkVQXHhGN1x4MDg0XHhBOFx4QTlLY2pceENCXHgwMFx4RjdceDEyXHgwOVx4RTdyXHg5OVx4QkJceEE3XHhEMFdceDg2XHgxRVx4MDlceDk3XHg4ODxceEQzXHgxM1x4MURceEY2XHhBMFx4OThceDA4XHg4Qlx4Q0JpXHhBQVZceDE4XHhGNVx4REFceDk0XHgxRVx4RjlceDlCJSpceEFEXHg4NVx4OTI/I1NPXHhCQ1ZceDk1d1x4MUNceEUxQ1x4QjhceDA4XHhCOFx4MERWXHhBRlx4QTVceEM1XVx4RDNceEYwXHg4RGVceENEdVx4MUE8XHgxREtceERFa1x4RTBceDlEXHhEMFx4QjlifVx4MDlceEQ4XHg4NVx4QjV7XHg5NEVceEQyXHhFQ1x4RTVceEE2XHhFRVx4OTdceEI1XHhENXxceEZCYVx4OEZzcFJRTlx4MTFceDFDZT5ceEQzN3xceEVGXHg4OVx4MTA4XHhERlx4OTZHZ1x4REFHXHhCMkN2XHg4OWRceEZDXHg4M0pceDE5XHhGNGFceEQzXFx4QjBceEE5XHhDQ1x4RDVlXHhBRTZceDlCXHhBQlx4Q0VceEM1XHhCM3VceDBCXHg4Mlx4QTNbXHhCNFx4MDJceEMxXHg5RFx4RjJceDhGXHhBNFx4MDJceEU5bUNceERGXHhDQ1x4RjJceEE4TyhceEY5XHg4OGVceEZGXHhFNClceEExXHgxN1BceEI5czJceEZCXHgwRFx4MUQjXHhBMFx4MTUgXHhDRlx4OUJkXHg5NFx4MDhceDAwOmldWVVceDA2XHg4MFx4QzdtXHhFNlx4Q0JceEQ4XHgxOVx4RDUiJlx4RkZceEMxXHhGNWtceEZGMFx4REVjOGVceEZBXHgwOFx4Qzcwe1x4ODR8T1x4RTZrXHhENlNceEIwK1x4ODBceDhFXHhCNmVceDE5XHgxMlx4OTJuXHhDNEMzTVx4ODd2aFx4RDlceEI3I1x4RTNjXHhBMlx4RENAXHg4QStceEY1XVx4QzZ0XHg5Nlx4RTdceDg1XHhGRVtceEY5Tlx4Q0FceENGdCMsXHhCOFx4Q0VceEFGXHhDN0RceDgyXHhGOFx4QTQqdlx4OTNceDAyXHhBNVx4QzBceDgzXHg4RFx4RjNceEU3XHgxMFx4QzlceDkxaCVceEVDXHhFOVx4RjZceEI3P11ceEFEKVx4QzFceEQyXHhGM0RzXHhEOVBceEExXHgxM24vXHgwMVx4QTRceEYxRVx4QURceDhDOlBceEM5RUUqXHhBN1x4OTBceEM0XHhGRlx4QzZceDgxXHhEQlx4RTBceENFXHhFRFx4RTNSXHg4NlZceDE3XHg5NVx4OTNceDlEI1x4OTBceEE4fFx4QTdceEU1XHgwNTdceEMxXHg5OVx4RTdceEFDXHgxMixceEVGXHhGNlx4Q0RceEJEXHhFNlx4MERceDA4fFx4QzZceDgwXHgxMVx4MUFtXHhDRFx4OTRceDhCVVx4RTBceEVFXHg4Qlx4MEYvXHgxQlx4RjUxP1x4QzZceDgyXHhCNlx4OTU0XHhCOFx4QTBsXHhCMlx4RjdceEVFU1x4RDdceDk2XHg4NTBceDFGXHhBRHxKXHhGQU9ceEI4XHhGQ1x4MURceEJGXHgwOVx4OThceEQzfFx4MTl7XHhBMCBceEIzXHhFRFx4ODRceDBFXHg4N1x4MDZtXHg5RSE5XHhERlx4QzBMXHgxNFx4QzddXHhDNFx4RDJceEIwXHhERFx4QzhceDE3XHhGNlx4N0ZceEQwR1x4MUNROGRceDFGXHhGNVx4QzhyXHg5MzFVXHgxQlx4RENWXHhENVx4OTdceDkxXHgwMEYpXHhBMlx4QTZceEUxXHg4MFx4RTBceDA3XHgwNlx4REJceDBGXHgxRGpceEZEZ1x4QkFceEUwXHg5QXtceDFGXHhDQTlceDBDXHhEMFx4ODBceEM2ZVx4RjFceERBXHhCOUZceDhGXHhEQ1x4Q0RceEEwXHhBQVx4RkFceDAwXHhCRlx4MDJceEE1XHhGM1x4QzNceERBXHg5MjFceDgzXHhENyRdXHhEN1x4OEFceDk1KW5ceDg0XHhDMWZceEFDXHg4MSdceEUwXHgxN1x4MUNceERCR1x4MTNceEZCXHgxRVx4MTQuWFx4ODdceDkxXHhBN1x4ODFaXHg4RVx4OTYjXHhCNlx4MTRPPFx4Rjd+XHgxMVx4RTVceEVBXHgxRVNceDA4XHgxMVx4QzFceDg5XHg5Rlx4RUM9Qlx4RTZ6XHgxM1x4QUFhRlx4RUJceDE4XHg5MHFzXHhGOVx4QzlceENEXHhDQVx4OTkiXHhGMUZ+XHgxRW1VXHhEMlx4RTB3XHgwNFx4MDdceDBBXHhEMztceDk3XHhEME9lXHg4OFx4QTFhXHhCOVx4REJgXHhCMXFceEQ0XHhCMVx4MUJceEFDOVx4MDlceEM1XHhFN1x4MTJceDEyXHhDNThcZVx4OEJceEM2KldceDA2M1VaXHhCMlx4MDhceDg2XHg5NS5ceEI5XHhDNVx4RDhceEMyXHhEMVx4OTNrXHhDRFx4OEM8XHg5MVx4Q0FceDk3XHhGQTJceDhBM1x4RDF6dFx4MTdceERCXHhDRnVceEY4XHhFMFNceEE1XHgwRVx4QTZceERDXHhBMSx7bVx4RTdceDBDKmpceEY5YVx4OENRXHhENlx4RTNzXHg5Qlx4OTV8XHhDNFx4RjZceDE0fTNceDg1XHhENFx4QzJceDk5XHhDMkZceDFEYFx4Q0FqVjtceDk3XHhEMFAiMlx4MUVceEM1XHhDRlx4ODBceEI5KWdceDE0XHhGM1x4ODhceDkwXHgxMTdwP04xXHhBREF4alx4RURceDFFXHhDMSNceDAxXHhCRFx4RkYhXHgwMlx4ODNoXHhGMHVceERBXHhDQStceDFETVx4MDlceEVBXHg5NHtWXHhGQ1x4RENceDg0XHhEMlx4OTk5XHhGNlx4RkUrXHhDRVx4MEVceEVFXHg4QVx4RkFceDFBXHgwMFx4QjM2XHg4MFx4RUJlXHhENVx4QUQzQ0hlXHhBMnFceDFEXHhFQ1x4QzNceDE3XHhBMl5rL1x4Q0JceEI4XHhEQlx4QjdceDFGPEBceEQwXHg5M1x4RDA/XHhFNDlceEZFXlx4QzdqXHgwOSp4XHg4NDxceDdGXHhEMGhceEFEXHgwRGNceDE2J1x4RTZjK1x4ODdpXHhDQVx4RDhceDAxXHhCNVx4MDYgXHhDNlx4ODZmXHgwOFx4RTRceEQ2XHg5NF1ceDhCK1x4MTZceDgxXHg4M1x4Q0JceEZEXHhGQkMzXHhBQlx4ODIycVx4MEJceDA1XHgwNFx4Q0YoXHgwMVx4QzhTXHhCMHptXHgxNFx4QTBceEQ2PVx4ODk1XHhGRmBceDlDXHhFM0Q1XHhBOFx4OTYiUlx4REMkXHhBMlx4OTk9XHg5MGhceEFGXHhEMFx4QTY4XHgxMnMtXHg3Rlx4RUVceDBEdlx4OEEvXHhCMlx4QkQ/XHg4N1x4QjRceEJEXHhBM1x4MEQjXHhFMGtceDBDLVx4RDUnXHhENFx4OUZceERCSVx4QUZceDgxIjBceERFIFx4OTFceDhGY1x4RDVceDlGPlx4QjdceDEzXHg5MTZceDlCXHhBNFx4REZceENBTzZbKlx4QkVceDA0YDQjXHhCOXdceDAxKFx4MTU9LFJceEM4XHhGRFx4MTEmXFx4RDJceEMxP1x4QkJLXHg5QzpUXHg4RVx4QjhceERDXHg4QVx4RTVceEY2XVx4RDhceDE4XHhFNFx4Q0JceEYzXHgwM1x4Q0IkUn5ceDg4XHhCQm42XHhFQypceEMyXHgwMVx4MTZceDAzXHhGNyVPXHhGNFtceEVDXHhDM1x4OTlceEY2PioyXHg5Qlx4RTdceEMyIVx4RENVR1x4MTBsXHhGRTFceEREIVx4ODJceDBFb1x4RDRceEFGXHhGMzxceEE1XHhGQlx4RDNceEM4XHgxQ1x4Q0NceDEwJ1x4RjFceDEwZVx4ODVnXHg4Rk9hIFx4ODdceEZBXHhCQ0FceEE4J1x4OEVxWFx4RTlzPFx4QkVDLUc6XHhDRDpceDE3cFx4MUNceEU2eEJceDBBa1x4RDkoXHg3RlpceEMxXHhDMFx4Q0NceEZERFx4QTRceDAyXHhBOFx4MEVceDhGXHhGMVx4Q0JyXHg4M1x4QTVceEVBXHg4MTxceDg3XHhFRlx4RTNLNlAieFx4QzFceDkzTS48XHhFQlx4QkRceENBXHg4OFx4Q0VceDhDXHg4MmpFXHhFOVx4RTlceDFGXHhCN1x4QzZceEYxXHhFQVx4MDRceEY3XHgwNHBceERGb1x4MDJceDAyXHg5REtceDFEXHhGNDF2TFx4RTJJXHhDM0ZfXHgwQ1x4RDRIXHg5RVBoXHgwMHFceENGXHgwQ3hceDlBXHhGN1x4OUVceEREXHg5OVx4MTZeXHgxMFx4RjdceEI4XHhBRThTXHhFRVx4RjdFXHhDMVx4MUZceEFDXHgwM2VceEJFZlx4OUZceEVFYVx4OTRjZ1x4QzVceEM2XHhFM3BsXHgwRlx4MUM4XHgwNVx4QjFceENCXHhFMlx4OEJceENCXHg5QlBceEVDXHgwMFx4OURceDlGc1x4RDhceDA2XHgxM1x4RUU/XHhGNkFceEVFT1x4RDJceDg4LFx4RDZceEY0XHhEQU1XLilgXHgxRFx4QTRhXHg4Rlx4RTRceEIxXHhBNFx4REVceDBCYjNkXHhBOFx4QkZceEMzXHgwRlx4REFceEExXHg5MFx4QzVceEY2XHgxMVx4REJXXHgwQ1x4ODN6XHhBOVpceDFGaFx4OTFceEE4XHhEOWlceEI1XHg4N1BceEM4K0F7XHhBQlx4QjJceEEzWDhceEZCc1x4OURpXHhFMVx4RkVceEIybkYpXHgwRVx4QTdiXHhEOFx4RjRceDk4XHhCOHQxXHhDMVx4OUVceEREcH0iKFx4RjQnXHgxRFx4MThBXHgxM3RceENDXHhENm1ceDgzdFx4QTJceEQzXHg5Rlx4MUJRXHhFRFx4QjRceDgzXHhBNFx4N0Y7XHhEQ1x4OEFceDg1ITlceEE2RT5ceDlBaTtceDg5OFx4RDleQlx4OTZceEE1XHhEMlx4QTNrXHhFQVx4OUVceEMwXHg5M1x4RjlceDg4XHg4Nlx4REJceEUwXHg4N1x4RTY+XHg5OVx4QTNceDFGXHhBMXtceEU3eypycVx4RkVceDA2XHhBMlx4MDZceERCJldceEUxXHhBRlx4QzBsXHhFOFx4RDY7XHhGNVx4RURceDhBXHhBOVx4QTk/XHg5RCJxYVx4QUROXHg5Rlx4RUZceEJEclx4RjdceEM1cFx4OTNxWVx4OTghXHg4NXlceDk4XHhDMlx4QjRceENGXHgwRSdceERFQjVTX1x4RDhceDlBXHg4OVx4MDlceEQ1XHg4N1lceEU4K0FceEY5XHhEMCdbWVx4RjNceDhDXHg4MiFEXHg4QTBceEEwNVx4RjRceENFSVx4RjBceEUxemZceDEzXHhBOUJceEEwTGtceERCXHgwQ1x4RDAvIVx4QTBceDk1XHhGRClceEM2KzdceEE4XHhBM1x4MTVceDlCXHhEQlx4QjJsXHhGQlx4MDRceDBEXHg5QVx4RDllXHgwQ1x4RjRceEFDXHg4MCRceEQ1ZFpceDlFXHhFRFx4RDJceEVDXHhEMFx4ODRceDlFdTJceENEXHhENlx4MDZceEI0XHhFRUZceDhDXHgwMGhceDBFXHg4Mk4qbXdLXHhGQlx4RkVceEI5KFx4MDBRXHhBM0FgXHhBRkpceEQ2XHg5Q1x4RDdceDBDXHhEOFx4RUJKXHgwM1x4MUZceDkzXHhCNlx4MTJceDhGIltnYFZceDkzXHhEQUN+Y01ceDE0XHg4RFx4OUJceEY3XHhEMVx4RDhceEE1XHhBRFx4MTVwalx4Q0ZceDhFXHgwNVZyKVx4RkIvXHhCQmJceDAxXHg5MVx4QTJceEQ5UnVmXHhDRlx4RDNceEJGXHhBM1x4MDNceEEwXHhGRkFceDhDIVdceDE5XHgxQlx4MEZceDhCWFphJDFceDExeFx4ODc8Qn1neklceDAyXHhGNHAvXHgwRFx4OUVceEQwXHhFOVx4OUNceDBBbVx4OTNceDk3XHhBRFx4RjZceEE4aWF5XHgxMlx4ODJceEJETVx4RDhceEQxXHhBNVx4RjZceDk5XHhBRVx4MTYrIE0gcVx4QjJceEE2XHhBRFx4QzJceDE1XHhGQ1x4QTFceDA5OVx4MDdRXHhGOD1ceEREXHg4Qlx4ODNceEIwXHhDNlx4OTRceEJGXHgxQ1x4QTdceDA5XHg4MVx4MThceDAyXHhEQVx4OTJeXHgwRVx4QzFxeyk+XHgwNFx4RkRceEVBfEVEXHhDMTNceDBGXHhDM0NceDk4Y1x4MEJaXHhGQ1x4QUZceEZFXHhFRERceDg5XHhERVx4RDV0XHhFRVx4REUgXHhEMVNceEQ1XHhGMlx4QzhceDBCbkZceEE2MVx4QjFceDhDXHgwNm9TXHhCOVx4OERceDhCXHgwQ0NceEFEUldceDkze1x4MDFcIFx4QUJceEE1SFx4MDFceDAwXHhFMVx4QkJceEI4ZVx4MUNceDhDPVx4RkZYXHhBMk1ceEMwXHhBMlB8ZFx4QURceEE3XHhCRENOXHhDMlx4REJceEU4XHg5RTRceDhCXHhDNidceDAxKS9ceEFFXHg4NFx4RUVTXHhCNjZceEI3XHhCQVx4QTZ+XHhEN1x4MUVceEIxNFx4QkZceDg3RVx4MUZceDA0XHhCRlx4QjQ7WFlceEE4XHhDNVx4OURceDEzXHhEOFx4QUJceEJFXHhGNVx4Q0RceEQxXHhERnRceDk3XHhCRWVceERGXHg5Q3VlXHgxRVFceEQ0XHhGRllceEY1X1dceDA0XHg4Q1RceEY2XHhBRlx4MTQnXHhBQ2RceDBBXHgwQnlceDFEUzgzXHhDREtceDBBT1x4Q0FceERBXHhFM1x4QTFceDgzLlx4MDN8XHhBRFx4QUR8ZFtceEU2P1x4RjJhXHhGOVx4QzFAXHg4RFx4MEZUXHg5OSZceEEzRFx4ODlceDBBTlx4OENxXHhBQVx4RjNRXHhGQVQ+XHhDQ1x4QTdNXHhBOVx4OTVceDFDXHhGMFx4OEE6N1x4RjZIXHhENlx4OUZceEU3UUhceEIyXHhDMlx4OThceEM2XHgxN1x4RjlceEI3XHhBQ1x4MThceDAzXHg5NVx4MDc7XSNceEIwXHgxRHQ3XHhCNFx4QjNSLlx4MEZceDA5XHg4RVx4RTFceDg5XHhENVx4RDBceDgxXHhBNVx4ODlXdlx4OEZ0XHgwQVx4ODNceDg4ZS1ceEZEbFx4MTJceEFDXHhBMlx4OUJdVFZlXHhDMlx4Rjc6XHhCOVx4QTdaXHhFQlp4KVx4RDJceEJFXHhDMVx4ODFceEE4XHgwQj5ceEQ2WChceDhCXHhEMlx4QzFceEI0KVx4MTUoXHg4OFx4RDNceDkyXHgxRFx4MUR1XHhCNSloXHhGQyBceDg3XHgwRlx4RUJceEQ2RFEhXHg4RVhiXHhGM1x4OTVceEYzXHg5MD90XHhFNlx4ODdceEY1XHhBRlpceEY4XHgwQVx4QzVceEY4XHhBQ0tKamVFXHhCOFx4Q0N8ckJceDA3XHhFNT9ceDAwXHhDRlx4MDRceDE5XHhBNlx4MEVPXHhFRFx4RTRCXHhBRT5VXHhDMVx4QzJceEE4XHhGQVx4QjFWKlx4RDZceERCXHg5RSRceDkxXHgxOVx4QkZceEU0XHhEOFx4REVNXHgxNVx4MEZceEE2XHhEN1x4QjlceDBCXHhFN2BDXHhDQzlceEVEXHhBNyZ3XHhEQ1x4QzAzTEZlXFx4RDVceEQ3ai1ceEFGXHhCRFx4MTBceDhCXHhBNVx4MUNrJVx4Q0NfcFx4RUFLXHg5Rlx4REInXHhCRlx4OTYjXHgwNlx4RjBceDE1Ylx4RTNceEFEfFx4RkVFXHhCRVx4QzJ3XHhBMFx4QTFceDEzPk9ceEQ2XHgxM3dgVlx4OURmXHgwRD9ceDA4XHhEMlx4QzNceEFFXHg4MmBceDFCXHhDRFx4RkJceEJEdFx4MUJ1XHg4NVx4REM2XHg4NVx4MERceDE1XHgxNlx4QjhOXHg5RClceEYxXHhGNVx4MTMjfiZjJVx4OERRXHhDNnJsXHhCM1BceEMxTSdceEMxXHg4MVx4MEZceEU3XHhEMlx4RDBoXHgwNElceEQxXHhGRlx4MUNceEYzQVx4MUVceEY2RUxceDEyXHhBOH1ceDg3Rk0mXHhGQVx4RUVceEU2XHhENVx4ODVceEJEPVx4OUNceDkwXHg4OVx4MDNceEJDV1x4QkFhXHgwRVx4MTZceEQyXHhBOVJoXHgxQSIwalx4RUNceEM1XHgxMmIvXHhENy9ceEZGXHg5OFx4QTlceDlEXHhERVx4RTdceDAxSVx4QTVceDkwXHgwRlx4OTBceEE5XHgxOVx4RjNceENBXHhEMypceDkwXHhCRlhceEFGXHhDMlx4QzNceEE1VyN7XHgwNlx4Q0FceEM3XHgwMVx4OUVceEQzXHgwNlx4REVceEFFXHhCOThceDAxXHg4NVx4QjZceDlDLFx4MUZceEJDXHhCNVx4RjUkRFx4RkNceEMyXHgxRUNceEUxIVx4OUJNXHg5QjdceDhCUFx4QjRceDEwO1x4OTV0XHg5NVx4MURceEIzeXBceEU3XHhEMlx4QTRceENGXHg4NGNceEZGXHg5RVx4MURceDAxXHgxNlx4RTlceDAxXHhEOVx4RUEgXHgwQ1ZceDgyaFx4Q0NSXHg4M1x4QTJceEI5XHgxQVx4ODVceEZGXHhDOVx4QkFceDdGOFx4RDFceDFCXHgxQlx4OUVceEEyXHgwQlx4OTVceEU3XHhFOXNnRlx4ODJceDkzXHhGNFx4Q0JiXHhCQWBVXHhGQ1x4RTNJVVx4MDIhOSFceDEwc1x4RDhsXHhCRVx4RkVUIFVceDkwXHg5OVx4ODU8XHg5OUlceEVEZFx4QzlKXHhFMVx4MDNceEI3TVx4RTZceEMzXHhCOX1ceDk2XHhEOVhEQl1DXHhEQVx4MTVceDlEXHgwNFx4MTRceEMzNVx4Q0VceDg0QVx4MERceEEzXHhDQXhceEQwXHhGRkNTcVx4OTRceEJGK1x4RjNceERFXHhGMipceDA2XHgwRlNsXHg5NFx4ODdceEREXHhCMVx4OTdKXHgxOVVceEQzXHhGRiF5XHhBN2xceEQyXHg4M3lbaVx4Qzk8XHhEMndceEQ2XHhDMVx4REJceDhEXHhBOVx4QzdCXHg4NVx4RUVceDgyXHg5N1x4MTFceEFGXHhBRllceEYyXHg4QnpZXHhFQVx4OUZceDA4XHhGMlx4ODIvXHhERlpceEU2XHgxRVx4Q0FceENELVx4QkNceDlGdVx4MERceEZFXHg5Q1x4QTRceEUwXHhEQ2RceDk4XHhFQVx4RjQnZ1x4MUV9XHg4RSVceEVGXHhCOVx4OEVceEU0XHhGM1x4QTNceDk3XHhFQlx4RDlceEUwXHhFMVx4OEVceEJEV1x4OTVoXHhEMVx4RTlaN3BceDhEeUpceDExWVx4QkZHXHhDMihxXHhFM1x4RUNceERGXHhGNlx4QjZxXHg4Nlx4QUMsXHg5M1x4RDFceDEzXHhBNFx4RUJHNFx4QkNceDBEfVx4OTJceDhEJVx4MUNceEE4RFx4RjIqXHhCQlx4OUZceEUwXHhFQlx4RkIqXHgwRlx4QzFceEFCXHhCQVlceDg3XHgwN3BceEZDaFx4RTk4Qlx4Q0NceDE3XHg5NmxceEEyR1x4RERUXHhFOTNQXHg4Nlx4QThceEMxXHgxOXNceDBBXHg4OFZjXHgxRmQoXHg4Nlx4RDZceEVFTHdRXHhFOFx4Q0YmTlx4RjVceEFCXHhCQVx4OTRceEY3Y1x4RDJceDE1XHg4MVx4RDZceEIxXHg4OFx4ODRceEFFXHhEMC5ceDg3NVx4RjZOXHgxMS5ceEZFXHhBOFx4OTFceEQ1NFx4RTlkSlx4MEJceEQ2PFx4QjdceERDYlx4RUZceEQ0TFx4MDlceEU5XHg5Mlx4QTVzO0dceDg0XHhFM1x4QUJJXHgxRlx4QkFceDFEXEdceEI2XHhBNEFceEE1XHhDMyQoXHg4OFx4OTJJXHg4Q1x4RjZwXHhGMlx4Q0J9XHhFRlx4OUVceEZBXHhGRVx4ODRceEVFRFx4MTZceDE5XHhBMlBceDhBXlx4RkJceDBCR1x4QkVceDBFXHhBMFx4RjIlXHhEMShBVCJceEI3Xlx4RjUwfi43XHhBNFx4MENceDAzXHhDRFx4OTBceEI2Ulx4QTRXXHgxQyZNXHgwMlx4OUFceDFCXHgwMVx4QTVhXHg5QVx4OEI5XHhCOVx4QjBceDE0XHhDQVx4QkZceEIzflx4OEUjXHhEQ1x4MTRceENEezJceEQyXHhFQUdFXHhCQ1x4RDRceEZCPS1ceDlGXHg4Q1x4QjZceEMzXHhGN1x4Q0UhI2ZceEQ2WWogeCppOFx4RDJceEZDXHhGRFx4RDRkXHhBMlx4MENVM3t+XHhBNDZceEE5XHhCN1x4RDFceDAySlx4Q0YuXHhCQlx4OTFQelBrXHgxNVJceEY1XHhGNmtceDhDXHhDNlx4ODIsXHg4M1x4MDJceEY5Z0JceEMwXHgxQWhceENEXCo5XHhGQlx4MDNceENEXHhGMFx4RjVceDA1XHhERShnXHg5N1x4OTJ2XHhEOVx4MTZceDg0XHgwQk9RQSJceERGXHgxMVx4QUFceEM0XHg5QVx4MThceDA3XHhFMVltXHhDRVx4MTRceEZEXHg4QVx4RjN5eVx4QkVceDlEXHhGNm17XHg5N1x4MTVceDBGXHhCRFx4MDckMlx4RTZDIXVceEQ4XHgxMnhceEU1flx4OTZceEFGcFx4MTVaPVx4QTdmXHhGOFx4QkVyXHhGOVx4ODBceEI4clx4OEJdXHgxQkpceDExXHhFNGdceEFCXHgwNFx4RkRceEIxXHhBQVx4RkVhXHhDQkMvWFx4N0ZceEZEXHg4OVx4OTlceEMwdklceDgwXHg5OURceEFDXHhDMVx4QTFceDFFXHhGQlx4MTJceEQ3XHg5MFx4ODEwXHhENlx4MUFceEY1b1x4MUMjXHhCMFx4Q0J6O3VceDA2YFx4RTlceEJEXHhCNTlceEE0XHhBMlx4QUVceEU2J1x4MUZlXHg5OVx4RDI6XHhBODpceEQ5UVx4QjdKQVx4OTRceDFEXHhGMTNceEI0ZjZRXHhDMFx4MDhIXHhFM1x4RjZceDg3WVx4ODJceDFBPlx4MDdoXHhDOFx4ODNceEI4aVx4QUImWlx4RDlceEU0XHhBRVx4RUZceDA2XHhBN1x4ODlceDg0aXAzI3NceEMxXHhEOFx4OEVceEI4XHgwMkNnLFx4Q0NceDBGYFx4QUZceEEyXHhGNVx4Q0ZceENCXHgxNyBceEYyZ1x4MUV4XHhDM1x4OTFwXHhBM21ceDFCXHgwNzpaM1x4REI0bj1ceDhGXHhBRlx4QkNceDg0XHg5Ni1ceERDY1BceEIxXHhERk9ceERFO1x4RTFsXHg4MVx4QjVceDFBXHhBQ1x4ODQ5XHgwNVx4MTFceDA0YWdceEQybklceDg5XHhDNWZceEE3Rlx4ODNceDFFXHhBRGZceDEzXHg5RVx4RTRceDlGXHhFRVx4RjNceEQ5XHhBN2FceEVCIFx4MUR7XHgxMFx4RTZceEVDNUlceDlBXHhDQlx4MTlceEQwXHhFMWIsXHg5M3FceDA2XHhENFw6cVx4RjA1TVx4RkFEK1x4REZceEVCYVx4MEZceEEwRlx4ODVceDEzXHg4RVx4ODZeLUh7XHgwNlx4RUFAXHhFMW1ceEE5XHgxRlx4OTJceEM1XHhEMFFxXlx4OTZceEEwXHg4RmZpXHgwMVx4RjdceENCXHgxMjpceEU1XHgwOENceEEzeVx4MUNceEZGSF9DXHhERXhceEQ0XHhDRVx4QkZceDEyXHg5M1x4ODdceEIyW2BceDhFXHg5RFx4RTIwXHg4MFx4QjJVOnFceEVEXHhCQVx4OUVceEEyXHg5MVx4RDUwXHhBM11ceEVCXHhENHMpXHhGOGlceDk1XHhEMFxIXHhCOVx4QkVceEVBOis8YmNKOHVceEM1Vm9ceDAzXHhFOUNceDk1XHhDNltceEJDXHgxOSorTlx4MTZceDhBXHhCNlFceDhCXHhDOVx4MDJIdVpceDgxXHgxNiFceEI0XHhFNEtceEQ0SVx4Q0ZceDA1XHgwRT9ceDkxeUVceDlFbVx4Q0NceDkwXHhGMidceDg2XHg4OTcyXHhCNlx4RDZceEY3XHhBNlx4OURceEU1XHhFOVx4Qjk0cGshXHhFQ1x4OTd1MWxceERCejZceDAyXHhDQ1x4MTVceDFEXHhFN1x4QjNceEU0XHg4M1x4ODdwTDhceDAwXHg4NVx4MTMuXHgxRmI5XHhFRElceEQ2XHg4MFx4QkNVXFRceEVCTEhjXHhDQlx4QjRhXHhBQVx4RTVceEYzLFx4RjBqXHgwMF1FXHg4Qlx4RjBceEZDbChceEZCXHhCNFx4QzIpXHhFNlx4OEJQXHgwRCl8XHhDOVx4OURAXHg5NEBceDE4XHhCN3EvXHg4Nlx4RTJTblx4RkQ7XHgxN1x4OTBceENEU1x4RDliNUhceEIwfFx4RkRhXHgxOVx4RDhceDlFXHhGRSBnXHgwRkZceDBEXHhBNDhceDA0fVx4RTRceDgyXHhFRlx4RTVceERDXHhEMUwxXHhEOVx4MDZceDFCXHhDMVx4Q0ZceDhCczNcXHgwMFx4RUJceEVEZFx4QURceEI5XHhDRVx4RkZceEE5XHhFMlx4ODBceDlBXHgxQ0N4XHg4OFx4QTFceEY4XHhCMCluXHgwN1x4RTVceDE3JFx4MDRceEZBdHRceEZGXHhGRlx4Q0RLXHhBMFx4MUI1XHhBRFx4QUFceDE2Xlx4RkJceEQyXHg4MFx4QTJceDA3XHhFRFx4OURceEExbVx4RTFceEE0XHg5M1x4RDFceENDXHhDNlx4QTh1XHhEMndceEE4XHhDRFx4OTFceEY3XHg5NVx4RkFceEJFXHhDQVx4QTNceEM1XHg4MVx4OUNceEIxN0tdXHgxN1x4MTFceEM0XHhFRVVceEI1XHgwN1x4RkRceDgxXHhFQSRceDE3XHg4Ri5ceDE3alx4RTNceDg4Ulx4OURceEI5XHhBRlx4REU1W09ceDExXHhENztceEIyXHhDN1x4RjY7XHhBNFx4OTlceERBXHhCRFx4MERceEM4c1ZceDFGKVx4QkRjXHhFN1x4ODlceDhBXHhBQypceDlBXHhGNDxceDBGPkFceEFFWlx4RTA2XHhFQWdtXHhDOVx4OTJceDAyZVx4Q0JceDhGTVx4MTJceEIyK1x4QzhceEJFM1x4OTBceDFEXHhGMVx4QURceEJGTVx4RjBceDE2XHg4MkJceDFGXHhGRlx4QUIpXHg4RFx4OUNceEQ2c1x4RkFceEQzXHhCQVx4QkNceEE5XHg4Q2BceDBFXHgwRW1ceEE1XHhCMVx4QTFceEYzMlx4QUZceDlBWUJceDFGWlx4MUJceDBEdzRceEIzXHhCN1x4QjJceEZGSFx4MUFceDlBRjxceDlCPC5ceEM5eTBceENGXHhFM3NceDlCPiRyYmRfS1x4RTJceEY4KEdeXHgxQydwIGxceEIxXHhGQVx4QzFTXHhEM0E9XHgwMlx4MTl1V1x4MUFceEFGXHhGMFx4QkFdXHg5RFx4MTBdVFx4QzJceDAxalx4RjhceENFXHg5Q1x4QUNceEVFYXlSJVx4RTE6clx4RUVceERBek1ceEQ1WV9pOVx4MTVHOFx4OURceDgzXHhEMFx4QURceEMxZVx4MURceEEyXHhDRFx4RkJceEZDXHg5Qlx4RDhceDE0TFk/U0dbXHhERVx4QUVceEQyUlx4OURLJVx4MTFceEUwU1x4RUVceEIxXHhCQlx4MDlceDhFXHhDMlx4MENJXHhBMlx4MDdceEM1LU9nXHhDOU5ceDg2XHhGRVx4MDFuXHgwNVx4Q0ZceEE2M2RceDAyXHg4RFx4QUJvQCBceDkyXHhEOFx4QjVceEIyIFx4MDRceEYxXHhFN1FFK1x4RTFceEI2XHhGMFx4RDIuSVk5K1x4MEFLQ1x4RDcsXHg5MWlaR1x4RTJceEE2bmxceDlESlx4QTEgXHhEQ1x4RjAvXHhFN1x4MDc0XHgwOS5ceEFBXHhBMFx4QzFfXHg5OFx4QkJceDAxXHhCMGVceEQyXHhFQlx4RENceDgzZ1x4RDVceEMyXHhFNj1ceEI3TFx4MTNnXHg4Nlx4QjRceDAwXFRceERFPVpceDg3Z1x4RDdceDFDYlx4ODVceDlEZTd0XHhBNFx4QkFceEJEXHg5MCMwXHhDRVx4MDlceEM5XHhCRlx4ODFceDAwP3pceENCXHg5Mis2UH1fbFx4RDdceDhFXHhBRFx4OTJceDA0XHhDOFx4QUZceENGXHg5Qlx4OUVceDhBXHhERFx4ODNceEY4XHhGN1x4Q0FLXHhBOFx4RjArJj89XHhFM1x4OUVceENDTGIyXHg5M1x4QkZMXHhDNTtceEE0XHhEMlx4QURceEI1XHhEOFx4QzJceDlFXHg4NCxBY3BRXHg5Mlx4MTJceDgzb0RceDExXHgxMlx4Q0V3XHgxRVx4QkVceEI5JzZceEU5e25ceERCXHg5Q1x4MDdceEI0XHg3Rlx4QjRceDFEXHhCRVx4QTJBO1x4OTBceDhGXHg5QVx4RUVceEI3elx4QUFceEYzXHgxMlx4MTlRdlx4RkVRXHhFOVx4MDhceEIya1x4OEVceEM0XSFceDExXHhBM1x4OEVceEQ1XHg5Rlx4RTJ1XHgxRjdvXHg5OVx4RkJceEVDQVx4QkVceDk2QWdfXHhFMVx4QTRceEJGXHhCNFx4RjVFXHgxRlx4OTJceEYwXHhCRlx4RTQ3Klx4Q0JEXHhCRnA8XHhEM05ceDk0flRceENEXHg5OVx4MTRsXHhGQ1x4QTlceEIzLjpQXHhDMVx4RkJceENDXHgxNFx4RDA6PVx4QjhvTixzV1x4OTQoXHhCNVVceDExXHhFM0pceEI3XHhGN1x4QzMsUFx4RkFceDFGXHhFRlx4QjFceDAyeFx4MTJceENBXHgxM1x4RThzX1x4QjVceDhBXHhFNFx4QUJHXHgwMlx4MTIgV1x4QUVceEY1XHg5NVx4OERceDgzXHhFOVx4RDlceDk0XHhCNFx4QTckelx4QTZceEFFXHhCM1x4RDguMFx4MTNZXHhBM1x4Q0JceDExXHhEMjVceEFFaFx4QkZceDk0XHhCM0dceEM3XHhCQVx4RDBrYVx4QjFceEQ1XHhGQjRceEZGXHgxRVx4MERceEZFZFx4QTVceEYyKThceEIxXHhBRlx4MDBceDA3XHhEM1x4RDEmX1x4RERuPU5ceEVBdVx4MTJceEI4XHg5Q1x4OEVceEI4XHhBM2YsXHgxQlx4QTZIXHgwOFx4QzFceDAxXHhCQlx4MUQuXHhCNlFceDgwXHhFRlx4MTdceDFBXHhDNVx4MUFceDBCXHhEMnBceEQ3XHhCM1x4Q0Nub1x4OUJceEU0XHhGM1hceEM0XHhFN1x4RDVceEZCXHhEMFx4OEMlMXlceDA4PExceDg5Rlx4QjRceEMwR1x4QjRceEFBXHg4MVx4QTJceDFDXHg4OFx4OTNceEQ4XHhFM1x4OEZ6WFx4RjRHIDJrTD1FXHhBNnNceENCXHg5Qi56XHgxOVx4REFceDExXHhFRXxceEZFXHhCMnRceDkzcFx4QTZceDlEXHhBNlx4RTZpXHg4Q1x4QjJmdTtceERFQGx0XHhFQlx4RjVceEQyXHhGMl1ceDhBXHhGQ1x4REJceEJBXHg5NGd+TFx4MUJwXHhBNl4lan5ceDhCXHg5Qlx4RDhceDAyXHgwMERceDFCOFx4Q0JceEY1QVx4QUJceDlCcVx4OTRsdkBmXHgwQ2RceEU1IWdceDhCbVx4QThBW1RceEJDXHg5RVx4MDVceEM5XHhDN1x4QzUrXHhGM19Oe1x4OENhWzlwXHgwMFNceEZGXHgwNlx4Q0JceEM1XHhGQVx4QzFFXHgxOFx4MEE6ZkxceEYzXHhGNyNceENFXHhDMFx4RDZceDFCXHhGMlx4MDh4UG5ceDk1XHhGMnBceEU2XHg5NkxceEExXHgwOU5ceEZFXHg4Qlx4OENceDlCX1x4MTdceDE5XHhGMlx4QjlceEJCOVx4QURceEU5XHhDMl1lO1x4ODQsXHhFMVxpPVx4QzdLKVx4Q0ZceEE5XHg4Mlx4RTY5MFx4OTlceEYyXHhCNVx4RDlceEJBPlx4MEZceEJBXHg5OE1ceEJGI2pOe1x4QTZceDA1Slx4QTBiLFx4ODNceDFCZm5ceDA5TVx4OEM2JVx4MTVceEQ4IWdceEY1XHgxOVx4MTFceEZDXHhENVx4RDB2XHhBRFx4RTFceDFEXHg5Rlx4OTdceEMyXHgwNlduXHg5OVx4RThceEY4XHhDRShceEVFZFx4RDhceEIzXHhCOVx4QUMoXHhBNlx4RTEwXHhGN1x4RTlTZ2xceDk3K2pceDg0QVx4RTlceDEwXHhBNEdceENEXHhFNlx4MThceEQ0eFx4RDhceEUyXlx4MThceEVEXHhGN1h+XHhEMFJceDk0XHgwRDcsZlx4RENceDAzXHhERVx4MTlceEFGelx4OERceEYzXHg4RilWXHg5Qlx4RUJ8Vlx4REI4Ylx4RDZceDBFXHg5MVx4RkJceDg2XHhFMD5ceEFGTFx4RkFceEI3XHhGOTFsXHg5N1x4RjI0XHhCM1x4ODAlYG1ceEEyXHhCOVx4QTVceDhDY3UnXHgxMXA2b1ZwNFRceDFDXHgwRVx4RkNGMlx4ODRceDBETVx4MThceDE2XHg4MF9ceDk0XHhBN1x4REFceDBBUVx4MTV1aFx4QThceDExRVx4REU5ZHNdXnZ0XHhBMFx4RTZceDAzXHg4Q1x4Q0FceEI5MF9ceEExXHhGM1x4QjFceEMzXHhEQV5ceDBCfn0hInZceEFBXHhCOVx4OUZceEVGXHhDRFx4QTRceDdGPlx4ODhzXHhCNUlceEIxXHhBMlx4RUFceERBXHgxOFx4OEZceDA4XHhBRkhpXHhBQ1x4MTBHNlx4QzlceEVBXHhDMykxXHhCN1x4OTZceENDXHhDOFx4OEZITDlCak1ceEM0dTNNJFx4ODRceDFDXHhBQVx4RjFceDEwXHhCOVdceEI2XHg4M1x4MENceEMwXHgwQ2tceDEwIVx4OTJceDk4XHhFRnVceDA2XHhEMlx4RURceDg2KCt+XHgxM1x4Q0JwbUZceDFCXHhDQ1x4RTlyXHhBQWt7XHhGOFx4MDh8XHgwRlx4QzNceDE2QVx4OTZVMF5ceDE3YTV5SSRceDg3Klx4QkJceEYzXHhCRFx4RTRBQC5ceDE3XHhDRldiXHhGQTFceDk4Zlx4MUR1WVx4REYgNGh+XHhCMFx4QThmXHhCRFx4REFceEMxXHgwRSZ0IVxceEUwL1x4MDJceEZBXHhDOXJceEY1XHhFNHtceENEXHhFRVx4RDhceEVFXHhDRHdceEU2XHhDRFx4QjJceEVFXHhFMlx4OENceDFCXHg5Rlx4QURPXlx4RDZceENDXHg4MVx4QzNWKTxceEU0XHgxMFx4QjROXHgwOFx4OTFceEZGXHhGMEhceERBeFx4QUZceEI3S0JVXHgxMjs0XHg5RVx4OTBceDBGXHg5OVtceDA0XHhBRXs1XHhEM1JcXHgxMEpUXHg4NXJceEFEXHhBMSZceDg0XHhBMylceEQ3P0xceDEzXHhDRVx4REVSXHgxOVx4RDlceDkxXHhFMXBceDg0XHhGMVx4RERceEY1XHgxQ1x4ODRceEU2XHgxQilbXHhEQnhceEZDXHgwQ1ZDXHhEQlx4QTNpZVx4QjFceDgyXHhCRFx4RTNhU1x4RjZceEZFXHhCRi9HdFx4OTBceEU4XHg4RVx4MEZSXHgxMUFceDkzcFx4OEJceEM3XHgwM1x4QjdceDlCXHg5Rlx4OEVceDkyXHhBN1x4RjlceEZGXHhEMlx4REVceDgyXHhEOUZceEJEd1x4OTEuXHhCNFx4REZtXHgwMlx4QzNceEQxXHg4Rlx4REUrXHhBRFFceEY3XHgxNW81XHhEOFpEXHgwOVx4RDNceEQ3XHgwODxceEIxXHhEQ1x4RDU8XHhBRlx4RjJceEMyMFx4QjRceEZCKE1ceEY4XHhGQVx4RjRceDBDXHg4Qz1ceEY3XHg5M1x4RUIiXHhFQVx4QkJceDg5XHg3Rlx4QThceEE2X1x4ODVceDFEYy1ceDFDN1x4QjZeXHhGNFx4QjZRXHhGM1VceDg2JXNceDE3WD1JXHgwRHA3XHg4Q1x4QzhceDgzNVx4RjBceEZEUVhceDkyTVx4MTRMXHhGN1x4MDJceEVCXHg5MnRceEIwXHhBOVx4QThLVVx4QzNGXHhGQSdceEYzZVx4OUVceDgxbVx4QzZceDAyUDhceDgzPUdpLkhceDhDXHg5QzFKWXZceDE5XHg4QSVceEU0I1x4QUZceEU4XHg4OVx4RTVYXHgwQlx4Q0ZceDE4XHhEMXpceEM4XHg5NFx4QzJceEQxPVx4RUJceENBXHg5Nz9ceDA4XHgwMVx4RTZceEI5XHhEOFx4RkRHJlx4RUVceDk2diJceEI2K1x4QUNceEU4Uzg0XHg4OUNRLV1ceEVDXHhGRVx4MEV3XHgwQmVceEMwXHhDNFx4RDRceDE0XHhDN0JceDA3Jlx4RDBceDg3XHg4N01cXHgxNVx4RjFceEYzXHhBM1x4RDZceEM5XHg5OHRceEQyXHg4RElceDFFXHg4RUlceDBBXHhDRVx4MDJceDlDM1x4RDFceDBGYyBceEFGZEpceEJBXHhFMVx4RUZceEIyXHhFMVx4ODRceEUxb1x4RjBceDg0XHhBQlx4QkRqXHhCN1x4RjJceDA3bVx4ODVceEMwXHhBN1x4QjAnXHhBQ1x4MDFceEU3XHhBRlx4RDlceEMyXHgwQiJceDFEXHgwRFx4MDBceEFDXHhGMyhrXHhERlx4OUZceDExJEVceEExXHhDQ1x4Q0F1QClcYFx4RENceEREXHhERSN3XHhCMFx4MTVuXHgwMjVMIlx4QzJceEZFXHhCMFx4OUZceEYwMVZceDg0XHhEQ1x4MDNtXHhFRFozXHhBMiNceEFCXHgxRTtceEY1XHhDRVx4MEEpXHhCQ1x4MUJeXHhGMydceDBBXHhBQ0MqeVx4QzlceDE3XHhFMFx4ODNaXHg5NFx4RThceDE3XHg5RGxceDhEWVx4RDZceEFEXHhDNTRpU1x4REJceDA5XHgxMlx4MDJceERCXHg4MVx4MDRceENDTlx4OThceERDXHhERlx4QjRceEMwXHgxOFx4OURceDhEXHgxMThceDdGTUZceDA3XHhBMFx4QzFceDg3XHhEQS1hcVx4Q0NceERBXHhFMVx4MDIoXHhCNjZJXHhCNFx4RUNceDg1XHhGN1x4RERceERBXHg4N1x4RTRceEVGfmlAPVx4OUZceEVCUlx4QkFceEYzclx4QjBceENEXHhCRlx4RkJceDBDXHg4RDlWXHhCMW56XHhGN0U3XHhFNFx4QTNceDk0Wj9ceDFDXHg4QlBceEFDXHhDRnxceDlFXHhDOCpceDk2XHhDNltWXHgwNF8lcEJceEZGaTxceDEzXHhBMiNceEYwXHhGQ1x4ODJFXHhGRFx4ODFQXHgxMlx4QjQrMVx4RkZceEU4c0ZAVmRceEVGOjpceDk2XHhBN1x4RjlyZWVLXHgwNVx4QUFceEQ0VVx4RDEoXHhGQlVceEQ5XHhGNmFEXHhFNlx4OTBceEMzTkVceDk5XHhEQVx4REFceDlGXHg4MFx4OTVceEEyXlx4RTBceDAyXHg5N1x4QzBaXHgxRVx4MDIwXHhGQjs/JzhceDg0UVx4RDRceENBXHhCNUxceEFDWlx4MEJceDE0XHhDMlx4QTVceENGR1x4RjFceEEzcVx4QjVceEVDPXdceEFGXHg5M1x4MUMkXHhCRlx4MENceDBGXHgwRDAiXHhDRmUuXHhGRVx4RkVnXHgwRkd8XHhDNFx4OUFceEJGXHgxMlx4OEVceEZBXHhGRVx4RjlceDFFXHhCNyBuXHhBRVkyN1x4REFceDg4XHg4OFx4RjNoXHhBMSJDXHhGRFx4MEFceEI4M1x4OEFceEYxXHhBMlx4QkVceDk5XHhGOCtceDlGXHhBNmNMXHhBM3VceDkyXHhFMVx4MTZ+XHg5NFx4OTVOLFx4REZceDgyOFl9XHhDMVx4MUVAXHhBRlx4QUQuXHhCNDw9PFx4QUJEXHhEOFx4RDBceDE2bFU2XHhCNVx4RTBPPlx4MDBceDgzXHhFRFx4OTVceEZDVFx4QUZzXHhEQ1x4QjlceDk1XHhBMVx4MEVceENDXHhDQlskNFx4RUZceEU2ZFx4QzlceEUxalx4OURkXHhERDtceDdGXHhCQk1ceEQyO1x4RTNceDBBV1x4RTJ4blx4QkVceDAyXHg5OUg8Vlx4RTJceEJFR3B9bVx4RkVceEE0Klx4QjZceEZCXHgxRVx4REJ3XHhBRFx4QTFceEUzXHgxRiFdXHg4MVx4ODRxOFx4QTdaNVx4MUEgXHhBMlx4MTdceDA0XHhGQ1klXHhDNVx4QkVceEJDXHg5RDJceEJBXk9ceDFBXHgwOFx4QkN+XHhCMVx4MDZceDEwYX5ceEE5XHhDNVx4RDV7XHg5Rn56XHhFQlx4OTdceDE3XHg4RFx4QzdceEEwP0pceEI4XHg5NFYtXHg4NHRMXHhGQyxceEM2N1x4MTJ1LWcoXHgwMFx4REFceDEwXHgwOVx4RkFceEY2TDJceDA2KFx4MEVceEFCXHhBNFx4QjBKXHhCMlx4QTdBPFx4RjBceEQ1X1x4RDNceEQ3XHhBN0UjXHhDMVx4MUVceDlELlx4RjRxOFx4RThceEE1XHhDRlx4QzJ4XHg4Nlx4MURceERGc1x4QjZWXHgwRVx4ODB4XHhBQVx4QjhceEJFeFx4OTBHXHhFMX0zXHhFRVx4MEFaV1x4QjVceEU0XHhBNVx4MEFceDhCO1x4RDk2XHgxM1x4QzFceEEzdFx4QkFceDg5XHhBMlx4ODJDXHhDNWFceDExXHhFNlUtXHhGRlx4MERBXHhDQ1x4ODQgIVx4OUJceDE4XHg5NVx4QkFceEZFXHhCMFx4QjgxXHhFNCVceDFBXHg5QTpbflx4QjlceDlCXHhCOVx4ODgzUndXe1x4Q0JWXHgwRVx4RTlmIVx4Q0FceEFEXHhCQVdceDkwXHhGRSdceDk0XHgxMWJceDlFPVx4MTdgXHgwMFx4QkFxXHgxQVx4ODBLXHhEQlx4QTFceEQ2YVx4QTVceDFFXHhFMVx4MEJJaDU0XHhGRFx4MURceERGXHg3Rlx4QzBceDBFLVRceEUyXHhEN1x4RUZceDA3Y2kvXHhBRk5ceEQ4Y1x4RTlceDBBXHhFQ1x4OTlxQFx4RjRSeVRceDgzXHhFMXFceEZFXHg4OVx4QTdceEJDOVx4OEVceDgxXHhCQVx4MTNJVVx4ODYzXHhERVx4MDQ7XHhGQVx4MDdceDBBXHgxOFx4RTlceDhGXHhFRiJceDg0XHg5MVx4RDhceEQ2S3dcXHgwRHskXHhBM1x4MTRceEFGXHg5RXVceDAyXHhEOX5iXHgxMFx4RjRceEI1P1x4RkNceEQ0XHg5NXFyXHgwNHVOXHgxRTFceDAzfFx4N0Y2JldceEJDXHhEOFx4RTlceEQ3U1x4OEZceDhGXHhDMlx4QjFceEFFXHgwRDxceDgySlx4OUJceEE2XHhGQ1x4QjZceEUxRlx4QkNceDk5XHgxNlx4Q0ZceDE4XHhCMU1ceDFGXHg4OFx4QTFceEE1XHhDQVx4Q0JceEQxXHgxMjtceEM2XHhFNFx4Q0FceDA1XHgwMSwgXHgxQ1x4QkIjXHhDMVx4ODJceDhEXHhFOExsXHhDNFx4QTRceEQyXHhCMURceEM2XHgxMFx4RjVceEE1ZUVwRFx4Q0ZBPVx4QzJceDgxXHhDNz1ceEQ0aEZceENGa2FceEU0IDRceEFBdnlceDE3O1x4RDRceEQ2UVx4ODhaXHgwNWVceEQzKUhceDFGXHhCM1x4MUU9XHgwM0RvT0NceEZBXHhGMTg1XHgwM1x4Q0ZRXHhBNlx4MUQkN1x4ODJceDlBXHhFQUVceEZFXHhEMFx4OEZceEFBXHhBRVx4QkZceDAxXHgxNVx4OEFceDA0XHgxOVx4MTBceEQ0eFx4QjdceDgyXHhCMlx4QzdceDg0XHhDQ1x4MTZceEU1XHhCMlx4RUFceEQ2XHhBMVx4RDgmZFx4OTVceEExXHhBNjZ6Mlx4MTVceEEwKjZceERGO1x4QjBUflx4MDlceEFDIFx4MDR7Olx4OUZceDE0LW1ceDlCRVx4MTJceEY0XHhGM1x4RjlceEQxRlx4MUJceEM5XHhDNlx4MEY4XHhDOFx4QjB6LnBceEQ5XHhDRVlceEM0XHhDQ2tyYyNceDhBXHhBOC9ceEMwXHhDMlx4MDZceEJGKlx4QThceEMzXHgxNVx4ODg4flx4MUZceDlBXHhENlx4OTVceDFDKVx4ODZceEU5XHhEOGkjXHhGQ1x4MTM2XHhDQk5ceDE0KCdiTVx4QTJocDhceEI1XHhDOVVceDE1XHhBRGRGP1x4OENLXHhBMVx4QkNceEU4XHhFNDhceEVBXHhEQUNceDEzXHgwRlx4QjdceEFEKFx4RUZTXHg4Nlx4QjU1XHhERVQ4XHg5NlVceEI4XHgwMkhkXHhCRGpjXHhDOXtceEU2KH1EYVx4QkRceDk1XHg5RFx4MDhQVSVceEJGXHhCMFx4QThceENFXHhEMVx4QzBceEI1XHhERlx4REFCXHgxQlx4OTFceDk0MTAkXHgxNFx4RThceEJFXHhEOFx4MUYzXHg4OFx4QjhceEJGKyNceEM4XHhGNFx4RTRceEI0bVx4N0Z4XHhENytceDFEW1x4RjAjXHhERlx4QThceEVEXHhCNlx4QUFceDA2JVx4RkJceDk1XHhEMlx4OUJpXHgwRFx4ODZ2QVlVXHhFMFx4RDdceDAxXHhDQlx4RjJNXHgxNktJXHhDN3NceDg5eVx4QUE6XHhCQ1x4MDhMeDJceEVCXHhCOXNFYXxceDAzXHgxQlx4ODZceDAzXHhFN1x4MURceEMzXHhBMlx4MEN6T1x4RUJceDA4XHg5MFx4QjdceEE5XHhBQ19PeypwXHg4OVx4QUVEXHhENFx4OTEwXHg4Mlx4MERceDgzOCtceEMyXHgxQ1x4RThceDA2XHhBQS4pXHgwQllceEE5VmRceDk0VFx4MDdjXHgwN1x4QzFceEVEXHhBQT9ceDBBSiU+MWJceDlFXHgxN1x4MThceEI1XHg5OVx4OUZuXHhBM1x4QjVceEU4XHhEN1x4OTRceDkyRVx4Qzdeclx4MDdceDg0XHhCOFx4OTA9XHhGRFx4RDFceEM4XHhBNk9QQHZdIVx4MDdceEY2XHg5QXRceDk0XHhBQXRYXHgxQ1x4MDVceEJBXHg3Rlx4RjNceDBGc3FceEU5fSNceEUxXHg5Q1x4RDVceEYwXHhDRFx4RkZceEE1XHgwNCtceDg4XHhCOGhceEQ4IV86aFx4OTQtM1VceDA5XHhGNVx4MUF1XHhDN1x4RkFjXHg5NTxceEVFYlx4MDggM3VceDA3XHhCQkJceDg3XHhCOEdceEYydSdWXHhBRFx4QjlceERDXHhEQUpQXHhBMSBceEYwXHg5Rlx4REV2QVx4RjlceEM2XHg4NzYtI1x4QzVceEQxXHhDRXVceEQ2XHgwNlx4QzVceEE1XHgwN0ZbQlx4QjddXHhFMVx4RjJceEI1c1x4RkFYXHhFRVx4RUZxXHhDRjJceDhGXHhDNEFceDE0XHg5NiBTXVx4QkR7dFx4QjB+J3dNXHg4QlQ4ZVx4OTNceDdGXHg4NVx4RTRceEYwXHgxRVx4MEVceDhBMnJfXHgxQVx4ODVceEU0XHg4MFx4OTcxXHgxN1xyXHgxOFJxXHhGNFx4QkJceDkwXHgxMnVceENEXHg4NVx4OEZceEVCXHg5NFx4RjhceDlFXHhFM1xceEYwXHhBOWdceEJDflx4ODhceEM3Ny9ceDAwXHgxRlx4OTA/XHgxMmJceDk4XHhFRVx4Q0ZceEM4XHhEMmdceERDbVx4QzlNXHhERWVKZ1x4RTBRKFx4QkRceDg4R1x4RDVceEM2XHhCN0tceEFGLFx4MDhceDEyXHgxRlx4QzVCU1x4MDZzXHNdXHhCNVx4Qjl0cmhMXHhERVx4QzNNfFx4RkZceDE3XHgxNlx4Q0FceEY0XHg4Ny9ceDg1XHhCOGlceEUxXHgwRVx4RDJceEFEXHgwOFx4RDkiXHhDMVx4OTRceEU3XHhEOFx4RjlPXHg4OVx4RkNvXHhFMSUtXHhCMlx4RDVceEE2XHhCM1x4QzBEXHgwRlx4QTYiXHhDOEJceEFEXHhENWh3SVx4RjBoQlx4QkU6XHhGQlx4RTV1XHhDNlx4MThceEU2XHhENlx4OUFceEQ2XHhFOVx4OUJceEVEXHhBMFx4OUQqXHgxMFx4MTIiYlx4QjlOVlx4MDZceEQ5X1x4QkEnXHhGRlx4OUFSPnZceEVFLFx4OEZceEVBR0RXXHg4Mlx4MEFceDdGXHhCMVx4RUQpXHhBOVFceEM1XHhEQz1ceEJGXHhBM1x4QzRceDhFXHhCN0xceDFGQVx4QTFceEQ2XHg5Mip8XHg4RlUmY1x4MEVceEM5XHhCQlx4OUFceEVBRnhceEQ4UVx4QjRceEI5UFx4RjRceEZGXHhGNFx4QjBceEZBXHgxMlx4RThceDBFfFx4QzZ9SFx4RDVceEZCXHhFM1x4QzczXHgwNVx4MTZceDE1XHhERlx4QTdceDExV0hceDhGXHg5Mlx4MDNbXHhDRFx4ODFceDgzXHg4M1x4ODlceEVDXHhERFx4MUZceEJGblx4MTlceEE5XHgxNVx4MEFceEZEQUFceDAzXHhERiNeSlx4RTVceDhFXHg4Q1x4RDJceDkzRyNceEQ3XHgwRnFcMFx4MUVceEIwQFx4RTgjNFx4QUY1XHhBOFx4ODdceDE4XHhEN1x4RkNceEMyJlx4RjI+XHhCNjtSXHgwQVFIXHg5MHhFUVx4MEJnXHg5REMsXHhEQ1x4ODhceEZDXHhFMFx4ODVceEEwXHhGRVx4OEZceDdGXHhDMFx4QTBceEI3XHhEQVx4RTNceEYwXHgwNHZTMlx4OTIoXHhFMHFceDk0XHhFQlx4RDVceDE4WFBceDBFXHg5MHNceEMxcUpceDFGXHhCRFx4OEZceEUyXHgwMFx4OEZwXHg5MFx4Q0Z8XHg5Nlx4MURceENDI1x4RkFceDFEXHhEM1x4RjZceEY4XHgxMVx4OUFceDE0P1x4OURTcFx4OTU6XHg4MFx4QTlceEExZFx4OTRceDBCcFx4OUVceDkzXHhBQ1x4QTdceEY0XHhCMUxceEFEXHhBQ1x4QjRceEVGXHhCQ1x4MDBceEE0XHgxN1x4RENfYFx4RjdceEZCZ1x4RDY0KXhceEQ0XHgxOFx4QTR4XHhFQlx4QkF1XHg4OFx4OEQyXHhFQlx4RUY3cmJceEY4OFx4REI+MVx4QTlceDkwXHhDRlx4OEQoQjp7RkxjXHg5QVx4OTBceDg4XHhEOT1ceDBEXHhFOVx4MTZceDFFXHhBQ1x4MEFceEIzdFpJXHhEMFx4MUQkXHhGQjtceEQ5Mlx4OTJceDlCXHhBNXBceDFDXTRCXHhEM1x4MDNceDgwXHhCNC1ceEY2XHhEQlx4MEZceEUwXHg4RShhJlx4RURceENGXHg5OEJ3XHhGNVx4QTlceEQxXHhGRlx4QzNceEI0clx4MER1fTp7XHhGRVx4RDRceDk2aVx4OTVceEVFXHgwRlx4ODAhXHhDRDxdXHhGMVx4QkVceDFGeVx4MDNceEI2XHgwNFx4QkNceDlCVTlceEVDfFx4RjlceERBdlx4OEFceDg1XHhCQVx4RTBceEQ0XHg5Rlx4QTRceDFDZVx4MUFceDFFVFx4MEFceDk5XHg5NFx4QzRceDg2XHgwNlx4QzNceEFCXHhGMFx4RDZceEY1Zlx4ODlceDEwXHgwRlx4RjlceEJEKiErQVx4OEZYXHg4OFx4OTVceDlGZUdceEI4XHhEMFx4RDAhXHg5Nlx4RDJceDFGTFx4MTBceDBBXHg4RFx4Q0RSS0kjPFx4QzRceDhGLi5ceDA5XHhCQVx4MDZceERFU1ZceEE4I3tceEFCN0dceEFCXHhENVx4RUJceEVFSCw/M1x4RDVceEJFXHg5QVx4ODlceDhCTlx4MDFvWFx4QUMpcFx4RUR4XHhFNFx4QkJceEI5XHgwQyZaXHg4M2tceERFXHhGOVx4MUQwXHg4QVx4REZceEFFXHhCRi1ceDg3TVx4ODNceEM1MzVceDA1XHhGNVx4RTJceDBGbVx4OUNceDgwbFx4MTAlXHg4OFx4Qjd8XHgxQ1x4Q0VceENFXVNceEI4XHgwNzcpXHg5QVx4OTZceERGaVx4MUFceEJEXHhDN3BceDk5XHgxMFx4RTlXXHhCN1x4ODVceERCXHhDQ2RceEI5XHhFNi9ceDhGXHhCMl1ZYVx4MUJaUFx4Q0JcXHhEOFx4QzdceENFXHhBRmlceDhBXHgwNnlceEQ0XHhCNVx4RTZoXHg4MGRSXHhDRFx4RDBceDE0KVx4MUVceERBXHhFQlx4MThceEFBXHgxN1x4REZceEE0X1x4MTdceEIzXHhDQ1x4OENceDk2XHhCOVx4MTFCRFx4RUJceDE0XHgxNmchNkF2XHhCQlx4RDl2c2AvJlx4MDNHXHhENVx4QzFceENGZlx4MEI2XHhFNlx4RkQnXHg4Nlx4QzUmXHg5Mlx4MURceEY0KnNceEREXHgwQjRrMFx4RjFceEUxOnonXHhCMlx4Q0RTXHhEQlx4QjJYXHhGRC1ceEQ4XHhFQlx4OEJceDE5XHhENip5XHhBN1x4OEEgfFJceEFDd3NceEI4XHhFMlx4RENceEVEZlx4QkRceEMzSjBceEExPHtwXHhBMlx4QTg+XHhDQlx4RDNTPlx4MTRceDg3XHhBNVx4QkMrM1x4ODVceDhDMlx4MTh2XHhFMjVceDE0XHhEMFx4RDhjXHgxQ0tceDk1S1x4RDVceEQ1XHgxQ3ZceDExXHhEOFx4RDlGKlx4QUFceDhFXX5ceDFCdjxceEM3Jlx4QTJDXHhEOFx4QTN7XHhCQyhceEMyXHgwNFx4OUQuXHhFOWpceDE5XHg4Q1x4QTJYXHgxN1x4RkNceEIzT1x4REJkIVx4OTlceEIxXHhDRVx4ODNceEU3XHhCOVx4QkNceDAwQ2JceDlCXHgwQ0BAbVx4ODNceDk0Klx4MDdAXHhEQTxceDE4OlVlXHhFM1x4N0ZceDAxXHhFQTxceEZBNlx4QkVceEFDXHg5OVx4ODR8XHhERlx4RTlceDhEXHhEN1x4RDZceDk2XHhDM1BceEE4IW5ceEY3XHgxRlQ5XHhCRV9ceEYwM1x4MUZMXHhDMlx4RUZdXHgxRlx4OTZceEY2XHgxRlx4RjNceEJDMVx4RjlceENFKlx4QjNceEJCPlx4MThceEJDXHgxQlx4OTNceEEyXHg5MUpceEQyXHhGNFx4QTFeWlRceEVDWUEhXHhENlx4RjVceEIxWVx4MTM+XHhBMWJObX5keVx4Q0RPelx4QUVceDE1WFx4OEVceDlDXHhDRFx4RTFceEI0YjpceDk2XHhGRVx4QTg/XHhDRE42fkhfXHg5N1x4RDdYXHgxNW1ceENBXHhCNVx4QzZceDA4XHg5Nlx4QzhceEVFa1x4MDhceDFBSkRceDlCXHhGMHJmTlx4QjZceEFGXHg3Rlx4QjdceDgyXHgwNSRceEM0b1x4RjlceDEwb1x4REVceDA1XHhEQlx4RjNceDkwXHg5NnZceDlELTRRXHhDQmxCXHhEMVx4QUZceDA2clx4RDQyXHhFRlx4QkVceDlFR1x4RjZceDE0XHhFNFx4OTFlXHgwNVx4ODZFXHg5RCtZQlx4RkZceDA0XHhDQlx4QzlEXHhFQXlceEI1XHhEN1x4RTVceEU0XHg4Q1x4MTBceDAya1x4QTNceDhBXHhEOElceEVEQX5ceEIwVlx4OUNceDBEXHg4RkAkXHhGNVx4QThceEFDRFV7XHhCRlx4OThceEY2WVx4RUVZb1x4MTRceDAxXVx4QjhWPGVceDBDQFx4RjdceDgwXHhBMDMzOjxceEM0XHhFQVx4QTRceDg4XHhDRWV4U1x4OTI/XHhGQVx4RjhuXHgxRFx4RTFceDgwIlx4Q0IjOFx4ODgocyxlKFZ1XHg4Q1x4MDRceDlCXHgxRFx4RTZceEI4c1x4OTQqPFx4MDZceDFCXHgwMVx4MERceEZBXHhDRlx4RkJceDlEXHhENFx4OERceEUxP1x4RjlceDhBXHhDQVw3e1x4QzhceDg5Zlx4RERceEVEXHhBRlx4Q0QybFx4RTFceDhDXHhBRlx4Q0RceDg2Li1ceEQyXHhEN3ItXHgwMEhceDhCXHgxNVx4MDkxW1x4MDlceDFDYU1ceEFBYlxceERBXHhGQyphXHgxMlRjX1x4MEVKXHhBN1x4RjhceDgzXHhENzhceDBBXHhGQzpceERFXHgxM1x4RDNceEFEXHg4N1x4MTIqXHhEM1x4MEJceDk4XHhFMiglXHg4Q1x4REZceEE3XHhDMlx4QTZiXHhFM1x4QzUsXHhCOS1yQ25ceEVBXHhCNlx4MTh3TmBaa1x4RERceDFCXHhDMylceEQ4XHgxRGo3XHhDMjRceERGJlx4REY7Vlx4RTZceENFXHhCN1t0XHg4RVx4ODBceDBFXHhBOVx4QkZceEQyI1x4ODZceEFFXHgxMDdceDg5XHhDNj1sXHg4MXB3XHhCOSFceDhDaVx4RERlXFx4RTVceEVCfmNQeVx4QzlceEFBXHhDOWdceEM0XHg5MFx4MTdPXHgxMGdceDE1XHg5RlZceEExXHhBM1x4QTQ9XHg4NVZceDg4XHg4QyVuXHgxNVx4RDQuSlx4QTk8XHhFRlx4REJceDhGZ1x4RkNceERBXHg3Rlx4QTNceDFEWi5ceEMxLVx4MDJceDEzbVx4MDZceEVCX1x4Q0ZIXHgxNVx4Q0JceEYzRFx4MThceEY2XHhCMWdceEVEXHgwRFx4RTczXHhCRjFceDlGXHhGOFx4OEUzXHhGRFx4QTJ7XHgwRlx4ODhWUm5gXHgwOTE9XHg4QVx4N0ZceEJDXHhGNFx4RUFceDk2XHhENFx4RUJceEJDXHhENlx4MUVmeVx4QTlmMVx4RThgXHhBQlx4QTBceERGICVceEI0XHgxN1x4RDh8OzMjXHhBM3UlWGZceEVCXHg5NVx4RUM/XHhEM1x4QkJceEQ2XHhGQVx4MTNceEExXHg5MFx4RUJceDBEXCNceEM5XHhDNChceEYxNERnYFx4RDRceDFGXHhERlx4RUNSXHgwMz5ceEQ0XHhGM1x4QjcuXHhCQUdceDFCXHhGNylceEU3XHhFNkJceEQ1WFx4QTc4XHhDQidceEYwXHgwQVx4QUVceEQ4XHhERTF5XHhBNWZceEQwXHhBOVx4RDZceDk3XHhENVx4QzBceEQ2clx4ODJceEU1ayJceEJFXHhFNlx4MUVOXHhGMlx4QzBceEI5XHg4MGBceDgxTlx4QThceDhGaFx4OEQ1dVx4QkNEb2hceEEyXHg4MFx4QTFceENEPlx4RjJceEE1dFx4RTRceEZCc1x4REZzXHgxRnN8fVxceEIxXHhEOFx4OUNceDlDcFx4MTIvXHg4MFx4MDlceEY3XHgxOFx4RkZceEM1ek43XHhFRG5ceERCXHhEM1x4OTl5K2lceDhCMVx4OTVceDA4UV5nXHhGMlx4QTlMXHhDMytceEQxXHhDMlx4RTNceDA4OVx4QkQmXHgxRVx4RkNceENGTzhqXHhFNjhceEM3XHhDQVx4MUJceEVDXHgwOFx4QURceDBDXHg4OEFceEFFTDB4XHgxRFx4ODlceDk5XHhBNVx4REUiYzlIXHg5Mlx4OEJyXHhFN1x4QTQ8UDRceEMzRlx4ODZceDEwdyNceERGNFx4Q0UvXHhGNXVceEFCXHhEMVx4MEZceEIxXHgwMlx4MDRceEVGd1x4OENceEZBXHhCQVx4RjRceDg3b1x4MTZceENFKjpRUHpceDBBXHg4OFx4RDlceEJFXHhGOEx1V1I3T1x4MTdPNlx4OTFMXHhGN1x4Q0FoXHhBOS50cm1ceDAxWidceDA1Z1x4RDJ1XHhFNFx4RjcvOVx4QjdrXHhCQ1x4RTBceDhEXHhFNFx4RTR3XHhEREhceEZGXHhBRFx4QTJceEQ4XHhENlx4QTJceEZBXHhEMVx4QjBjW1x4MEJceDBDXHgwN1x4Q0VceDE1XHg4Mlx4RDhceEJCXHhEOV9uPFNceEEzXHhDMlx4RDlmXHg5MVx4RDlceDgyXkArYW5ceDgyXHhDOFNrXHhDNnwuXHg5N1x4OTBceEZDXHg5MVx4RDdceDk0IiJKLlx4RjZceEI4XHhBQnc9XHhBOVFceDEzXHgwNzphXHhENlx4ODRceDhEYFx4RTVXWlx4RUNuXHgwOFx4MDRceEEzdytQVlx4MUJceEI5XHgxQVx4QkJceEMzNFx4QjA1b1x4OUNceEVDXHg5MVx4ODFRcVZuXHgwMktJXHg5NFx4RERceDBEXHhCOFMvXHhDMFx4RTVceDg1XHhBN35ceEZGSFx4RjJceDBFXHgwRlx4QTA8N2QkSVx4OTlceDE1XHhCNGtGSnxZZVVceEQ3XHhCOTlceEY5XHg4Mlx4RkFceDhBXHhBM2FceEFBXHg4NH5ceEY1XHgxQ0hceEMxXHhDQUJ3XHg5QnpceERFKGhceDk5I1x4MEJceEYySVx4QzdceEM5dFx4RTQsXHgwM0lceEM5XHg4NUxceDkyVVx4MEQ/XHgwN1x4RTNceDE3eVx4OUVceEFGXHhEQy9ceEJGW1x4RTNceDE3X1x4RjNceDkwXHhDN1x4MUVHXHg4MFx4MEFceDFCXHhGRlx4OTBjXHhBNSlceEJDNVx4Q0VceERCXHg4RFx4ODBwXHg5M1x4QkU1XHgwRFx4QUE6MFx4MTEpXHhCMWZceEQ2TFx4QjlceEI0XHhGRlx4MDVceDBEXHhERFx4OEZceDlGXHhFM1x4QTRceEI3XHhFREU6XHhERVx4RTJceEM3XHg4Qlx4MUVceEI2XHhBMHRceEU2XHg4MDBceERGX1x4RjlceEVBXHgxQn06XHgxMVx4QzE0XHg4RFx4MTBceDlFXHhDRlx4MDNceDAxXHhFNmpceDA4XHgwNVx4OTBceEM4XHhGRXxceDk4XHhCRHhQXHgxM1x4REVUXHgwM1x4QjdceDg0XHhGRVx4QjNceEJGXHhCMThzXHgxMFx4QjFceEU5XHhGRVx4QzlceEZCXHhDQj9ceDlDXHhEMlx4QzRceDk5NDdceEY4XHhCM1ZceENDRFx4MTNRe1x4QzNceEEyXHhDNDJceEFDXHg4NFx4RTBuXHhCOFx4MUN5bSp+XHg4MVtceDg0bFx4MEZhXHhGQlx4RUVjXHhBQ2t4Y1x4RjZceEIzXHhFN1JceEExQCkoXHgxNXpceDE3XHg4REctXHgwMlx4MDZceEVCL1x4ODdceDBDXHhFQz5ceDdGXHhEOG1HXHhCQSJceEM3alx4ODZceEQ1Plx4QzVceEEyXHhBMFx4QTdceEU4PVx4OTk9W2dceEREcy5TdVx4ODVceEY5XHhERVRceDgxXHg5RVx4QzdqXHgwQ1x4RjcxXHhCN1x4OTdRXHhGQVx4QjRceEZBXHg5Q11ceEE1XHgwMk04XHhFMVx4RTJEI2hceEVEXHhGQ1dceEI5XHg5NVosaHZceEY1XHhCNVx4ODYyXHhBRlx4RjctXHgwNEIxfVx4OUJZXHg4QzF8XHhGRFx4QjRdb15LXHhDQ1x4OUJceDAwXHhFQXlkQVx4QzFceEY5XHhFRFlceERBXHhDNC5ceEZFW1x4RDU8XHhGN2JceEExSVx4QzdceEREXHhGQVx4RkJceENGXHg5Rlx4N0ZceERGXHhCNFx4RTUpXHg5MVx4MEVceEE5XHg5MFx4RUNceEY5KVx4RERceEEyXHhEMSxceDExb1ZceEFDXHhDMEBceEUzIVx4MDNPXHhGQ3JceDE3XHhFMChceDk3TXBceDhCXHhEOVx4QTZWXHg4QVx4QjdceDhCbVx4MTZceEI4XHg5MEhceEY3MytceDk3KzJFclx4QzhceERBflEoXHgxNVx4ODVceEU1XHhDNVx4RjFceERGXHg5RFx4QTNceDA5XHhFQUhceEI0Ny5ceENFXHhFN1x4ODlceEFFe1x4QkIpJ1x4RTcrXHhFN1x4ODE7QVx4QTFdXSBceENGXHhBMlx4QTBceENEXHg5RVx4RTRxXHgxNlx4QjdceEEzXHgwNFx4QjdceEZDXHhFRlx4Q0VceEFGXHgwMnpCI1x4RDBceEVDXHhGMVx4Q0ZceEE3XHhEMlx4QzJceEU3XHgxMlx4RTFceEJGcVx4QjdceEI1XHg4NSVceDhFXHgxRSJceDk5XHgwRlx4MDNceEUzRVx4RTJ6XHgwQ1x4RjdCW1x4MUQmQlx4QjZceEEzXHhCQVx4REFcXHhBRlx4MEZceERGXHhCRlx4QjFceDA1XHhDN2RceDgxUE1ceEUxXHhGRUZceDhCPVx4ODZceERFXHgwNStceEQyXHhCMFx4RjNZXHhBN1x4MERceEFGXHg5M1x4OThceEEzXHgxOFx4ODRceEZEQ1x4OERceDlGXHhEMVx4OUZPOyFYXHgwQlx4OThceEIxSmdceDBEdlx4RkZceEFDXHg5N1x4QkNceDE2XHhBMlx4QTRceEM2XHhGOFx4OThceEU5XHhDMlx4QzVdd1x4RTNceEZBcFx4OUVuXHhDMVx4MDQsTFx4ODJEQFx4Q0JceDAwXHgxQy1ceENDXHhFNVx4RkJceDAzLGZceEZEXHgwRW1kXHhFMVx4RUVhXHgwQ1x4QjNceEE0XHhDNTFVXHhDRFx4QTJceEJCXHg5MFx4MEFceDhCXHhENVx4RUNceEVDXHhBMm0mXHhFMVx4RjBceEEzXHhDMFx4RUJceDg2XHhFOVx4ODJceDhDXHhFOFx4REJceEE4L0h4XHgwQT47XHhFM05ceEFGPVx4RkFeXHgwRFx4RTFceEFEXHgwRT9ceDg0IFx4REVsZ1x4QTN+fUxceEY3XHg4N1x4QjhceEMzMlx4QzlceDBBcnc/XHhCQiJceDg5UVx4QkZ+XHhEMVx4OUJRNFx4RTR4XHhGNS1ceERFWVx4OThceEFBXHhFM1x4OTZceDFCXHhGN1x4RDBceDFDUjZceEVBezNceEVDKFx4QzlXXHhDNlx4MUNceDk1XHhFOFx4OUZYaVZGSkZaXHhBMFx4QUNceDk2M1x4MTlceDg4XHhFMVx4RERceEFFXHg4Qlx4RjZceEJBJVx4QTRceDkwM1x4MEFceEM3XHhCMVx4OTJceDEwR1x4OTlceDBCMFx4MUJceEYwXHg4MTx9XHhCRVx4RDE7XHgxQS5ceDhDXHhGMlx4ODZNXHgwRFx4Q0NsaXhceEI1XHhDNXFceEU0XHhFQ1x4QjFceEQzXHhBRVx4RDBceEIyXHg5NX09XHhBQkFceDlBXHhCOFBOTi9ceERBXHhFOVx4RkFiXHg4QiNceEE5KWRceDgwXHhCNWdceEFCXHgxN1x4RjZYXHhENDEyXHgwRlx4QjNzXHg4NlBeXHhGQU1ceDgxVFx4MUNceERDNlx4MTBsVVx4QTBcWVx4RTRHXHg4RWlceEJGXHhDRFx4MTBceEY1blx4RERcfmlyXHhBRlx4MDFceEUyNVx4QkYuXHhBOVx4QkE2XHgwQ1x4MTlceEFBXHhFNVx4RjR7XHgxNlxceEZCXHhBNT5ceEU4XHhDMlx4ODlceEM4XHg4RFx4RDkiSlx4MDVceDg4XHhFNFx4QjJceDA4XHhFRERceDk5fnhceEEzXHhBRVx4MDRceERBXHhCNVx4REFBXHgwN1x4Q0RceEEzXHhFQ1x4MTFceDA2XHg4MFx4OUZceENEKFlLXHhDMT52YlNceEY0XHgxRmczXHhDRm9ceEVDXHhFNVx4OTQlXHg4Q1RceEY3XHhDMlx4QkZPXHhBRlx4RTVceEQ0XHg5MFx4RDZqXHhBNzFXXHgwMVJceDhCXHhDMVZceEY2XHgxQTE0XHhBNShceDlCMkQmXHhCN05fXHhBNDhceDA0O1x4QkFceDBCXHg5NVx4RUVceENFXHgxOFx4QUR+XHhDNlx4RjRceEIzXHgxM1x4OUFceDAxZVx4RkVNXHhGNjlceEM4XHhFMjZceEU5VVx4OENceEFDOD1ceEZCZTVceDhFXHgxM1x4Q0ZceEYyXHhCNFx4QkNceDgydk5ceEM5XHg4MVVceDEzdCNVOFx4RUJceEUyXHhGRlx4QjhceEQ5IFx4MDRWaFx4RjhceEQ5XHhFMFx4RkRceDgxXHg4MVxceEVFakRceDg0XHg5MFx4RkZ6XHhDRFx4MDNceEE0XHhDQ1x4Q0JceDk0XHhBNFx4MUNceDE3QlhceDlEXHhBRVx4Q0NNXHgwN1x4REVceEM4XHg4M1x4QTl4XHhCOCFceDk2XHgwMFx4QzNTYFx4OUNceEU3LVx4QzVceDkwXHhBQVx4QTdceEEyOFx4QzBceEQzSCI6XHgwMEd9XHg4Qlx4QTdceDA0aFx4RUFceDE4XHhDN0hceEY0XHhFRVx4RTFceEZBa1x4ODJKOGtceEUwWFx4QjQkXHhGODNceEEyVVRceEE1eVx4QkREMztceDE2XHg4QVx4RTZceENFe1x4RTgEjQJ0TCGXIKWNAnRIamdceEI3XHhDMVx4RTRceEQ1XHhBOFx4QzFceEMxXHhFQlx4ODVceERDXHhGQ1x4QURceDlFXHg4OFx4QTA+XHg4MidceDAzXHgwQk8sQjNXKSRceDg3XHhBMVx4MDY4XHhFQVx4ODlceDAxLVx4ODBceEYyXHhBN1x4QUNceDFGQlx4N0ZceDA5bHRceEJFVVx4Q0Zsb01JXHhFNFx4QjBceEFEXHgxMSVceDhFXHhCQjxceENEXHg3RiNceEQ1XHgwNlx4ODlceEU2Wlx4QTcgaVx4MDdceEU1XHgxOWdceEQ1XHhGNCNceDA3Nlx4ODktNFVceEY5XHhCNFx4RDZyXHhERVx4REMgXHhDOFx4RDFceEM1XHgxOFx4QjBceEExXHhCQlx4OTFdXHhGQVx4RjBGXHhBMVxTXHhFM24+XHg3Rlx4Q0RceEM4XHhGRlx4MTZceDFBXHhBQVx4QUVceEIzRVx4ODhnJ1x4RDVceDk5XHgxRlx4RTFceEY2XHgxNz5ceEM5XHg5Mlx4QTNceDlBXHg4NVx4QTRceDBCXHhFMXhceENFXUFceEU3XHhGMFx4Q0QgXHgxMlx4ODVceEMxXHhFNFx4N0ZceEQ1XHgxMFx4RThceERCXHgxQVx4QzdTXHhGNVx4MTNceEU5eWxceEIwXHg4NHZceEM4eVx4RjNceDA4YH10XHhCOT9vXHhDRVx4MTYtXHhBMDNIXHg5MjcvKFx4REJ3XnZceEVEXHhCODkiJ1x4OTg9XHg5OVx4RTVceENGUlx4OERceEI0XHhDQU5ceEFEXHhEMH5ceEI4XHhBMFx4OThceEI3Z1x4OTFceEQzblx4OTBBXHg4NDlceENDXHhGRVx4MUNceEEwJF1pWihceEU1MUNceDdGVlx4OUFceDkxflx4MDRfXHgwMlx4RDJceEZEXHgxMVx4QkZceEQ0XHhEOT9RXHhFMlx4REVNXHhFQ05QXHhDMn1jUldceEVBXHg4NFx4QUM8XHg4N1x4ODhceEFDRTRceEM4XHgwNlx4OENceDE3e3VceEEyXHhDQlx4RDEoXHhCQVx4MERceDlBXHg4M1x4OTJceEU2e1x4QTB7c1x4QjlcXHhEMFx4QTBceEQxanNceEUwXHhFNlx4QTRceENDXHgxOG9ceEQ2aVx4OEFceEMwJD5ceDk4XHhGNlx4OTlpXHhBMFx4MEFceDk2XHhBQVx4QkNceEQzeStceDlCLVx4MEVceEYyXHhCOVx4QjMgXHhBNVx4QTh5J1x4RkUmXHg5MjcjYFx4QkVceEZCXHg5Nlx4MDJceDBDXHhCRlx4MDNfXHhDQiVMXHhDQmZMflx4ODJceDE1XHg5MVx4OTBceEQzb1x4MTQhXHhDRFx4RDUkfEtceDk4Nk1NXHhEMlx4MTRsXHg4RFx4OENceDFGenFuXHhBOG1ceEIwXHg4OVx4QkU+XHhBN1x4RUYvXHgwNXVceEYyXHhGOCJQXHhFNFx4RDdceEFGXHhGOFx4QUNceDdGXHhGOT5ceDlFXHhDRlx4QjhceEREXHhCNFx4RjdceDlBUVx4ODcmXHg5Nlx4RDBceDk5XHhBRlx4RUFceDAwXHgwRVx4MEVDXHg4NWhceEJEXHhCQ1x4QzhceEQwLHBceEEyTHlceEU4XHhEMFx4REFZaj4kXHg5OVdQXHgwMVx4OTNceDlBXHhEMVx4RDFceDFFXHg4N3ZceDEwW1lceEQwZ1x4ODd0XHhEREdceEE3W0NceEUxc0pceEQ2XHhGOVx4OEZceEFEXHgxRFx4MERceDBGXHg4RFx4MTBceEM2RkVceDFGLmhceDg1ZC9ceDhCaVx4ODVceEE3XHg5OVtceENEXHgwNWJceEY4XHhEN25ceDgwV1x4RDdceDk4X3pceDhDXHhGNVx4RTddXHgwQVx4QjRceERBSWhhXHg4OVx4QThceDFDVl5ceDlGXHhCQUgpeVx4RTlceEI0XHgwMVx4QTZceEUwT1x4QzBceEE1XHg4RFx4QzNceDE1XHhCRFx4QzJceDA3R2ZceDA5XHhFNVx4RDk0IFx4RDlgPWJceDBEXHhDMFx4RTdceEU2XHhBRWNceDAyXHgxOVx4MUNceEI1Tlx4RTNceDAxQFx4OEVnXHgwNkNhXHg5OVx4RjJceDlFVVx4QUREXHgwNlx4QkNceEZFXHhEMVx4MThceEE1XHhFRjVceENBXHhGQWVceEU4Jlx4RkZUXHg5RFx4OUNceDhEXHhFOVx4MDFceEFGIFx4MDdRXHgxRlx4OERceDBFWlx4QjhceEMzXHhFOXYpXHhGMX18MCVceEVGXHg5MnRceENDXHhGOFx4QTYuXHhBOSlceDA0M1x4QjJceEZGXHhCOFx4ODZceDFFXHhDNVx4QThceDk3XHg4Rlx4QzVceEQ3XHhFNWhceDg2XHgwRVx4QUNeXDFceEQ1LFx4ODMkXHhCQlx4OUVCXHhDOFx4QjdceDA5Olx4QTRceDkxXHhBMVx4QjZ4cjYrXHhBQm9eXHg4M1x4OEJceDg3O1x4OUVceDEzbVx4MDJceDFGXHhCNn1ceEMzQFJFXHhCRkxuXHhEQ1x4MTdceEJCXHhDN1x4QTlceDE3XHhBM1x4ODdceDBBQXhceEUwIFx4MDVceEIyO0BXIVx4REFceDkzcFx4OEJceDkxXHhGOVx4QTBceEFFXHhFNVx4RDdxXHgwMVx4QTgqXHhFMFx4RjdtXHhDRDNceEUwPTRceDkwXHgxRFx4REVhXHgxMFx4RTBceDA1flx4RkNTKFYlLnBmXHg4M1x4Q0JceEQ0XHgxQlx4QThceEIzXHhBOTdceDBDXHhDQlkhXHg4RFx4ODkxXHhCOXpCOVx4N0ZceEQ1QFx4OUY4aUxceEFEXHhFQzFceEQ0XHg5OFx4QkRceEIzXHg4NVx4RENceDgzXHhFRVx4OTRceDk1MXcpcFx4RDJEQHNceEU3LUJJXHhGMG8nJVx4MDdceEM2d1x4QzcvXHhGRVx4MTNxXHhFQk1DXHhFQlplPlx4RDRceEIxWlx4OTdmKFx4QURceEFBXHhEQUx3Klx4QkFceEQxclx4OTB9XHhFRlx4RTRceDEzXHg5Qlx4OTZceENEXHhDMFx4MTFceEEzXHhDRF1bRVx4QjQsXHhGRFFceDA1XHhBRVx4QzFceENGJVx4RjBiXHhERlx4QTg+XHhFRi9ceDk3XHg5OUdceDkxXHgxOVx4QjV4XHg5Mlx4MTN4XHhFQl9ceDk1XHg5Rlx4RkRceEJFXHhBNT5PXHhDNVx4RkFceDlCI1x4RjVceEJFP1x4OTckXHhGMnU1SyNceDA0XFx4OEVceDA0XHhDNFx4OTNceDgwaFx4MTl7R1x4QTFceENCXHhGM19ceDdGOVx4Qjl4XHhEM1x4QTBceEVBXHgwQlx4MEVIXHgwRipceDg5XHhGOFx4QzU/Ylx4QjdceEREUlx4QzZceEZDXHgwOFx4QUNceDFERVx4MEVceEREW1x4MTRbXHhGMjpFclx4RkIvXHg5NFx4MUZaYFx4QzFceEZCYFx4QzZceEE3XHg5OFx4QkJGPFx4REFceDlFXHhBRlx4RUM0XHgxQVx4MDRceEU2XHg5N1x4QjlceDk2XHhBM1x4QzZceEEye20iXHhCMlx4OUFfXHhCNFx4QTMgXHhFMVx4QzJceEFFXHhFNlx4OTRceDA2XHhBQz5CenMweFpceDFCXHhGN1x4QTRceDk0XHhCOVx4RkRceDE1XHg4QVx4RDV5Ilx4OUJceDk2QFx4ODBceDEyXHg4Rlx4RDZceEU4XHhBQ0RceDdGXHg4NTxceDBEUVx4MUFceEMyRXhXXHg5OVx4RDkgcVx4RkZSXHhGN1x4RkJceEQzaidceEI5XHgxRlx4MDZceDAwXHg4N1x4RjlceDlDXHg5Rlx4OTVceEEwXHgxMFx4Q0Z2fUVceERBOlx4RTJceDk4XHhGNFx4OTU0YFx4QkNceEZFVVx4MDVceEM5WFx4OTh7fVx4RTg9XHhFMGpceDlBXHhBRFx4Q0RiXHhBRVx4RUZceEQ4XHgwMVx4MTU1XHhCNlx4OUVceEJFXHgxN2JceDlEXHgxMylceEQ1TUNceEFEXHgxNVx4MDMnS1x4RDk7TTZ4XHhGRlx4RjR1TUl8M1UpRVx4REFsdlx4RTJceDFDXHhEOFx4QzhceDAyXHgxNFx4REZceEU2XHhGQlx4RDVceDA4XHhBQlx4RDNqXHhEQWFceEU3XHhGNFx4MUFceDBBYmtceEMyN0w5XHhENihceDlCXHhBMVx4MURceDg4XHg4OSlceDkwXHgxMmxpcVx4MTIlXHg5MVx4OERYXHhCRFx4REE9T1x4OUJceDk5K1dceEM0XHg5Nlx4MTVceDFEXHhFRlx4RkVOXHgxMFx4RTRceEZGXHhEMVx4RTRceEI5XHg4M1x4MEFceEJDXHhBQlx4RkF4cFx4ODRceEQ0XHhDOHxceEJBXHgwRC9ceENCXHhCMFx4OTBceDE4XHgxQ1x4OTJfXHhEMVx4RUM6XHhCRlx4RDBrXHg5RFx4RkNceEY0WFx4MURceEEwXHgxMFx4Q0ZceEYwXHhDQyJceERGIFx4MUY2WFx4OTJceDAwXHhCNSZTO1x4QUJDVEpvXHgwNFx4ODdceDBFXHhDQ1x4REN5VFx4QTdyXHg4Mlx4RDJceDg2NFx4QkQ/XHhCN0xceEM0XHhERFx4OERceEI3XHg4Mlx4MDRceDE2T1x4MTQodFx4OTgpXHgwNy9ceDhDM1x4MDdceEE5XHhFQVx4REZrXHg4NVx4MTBaXHg4RVx4OTNceEU0a1x4ODNDXHhGMn1ceERGY2xceEJCWVx4RkFceEVCZ1x4REJVXHgxRUFceEQwUFx4MURceDFFXHg4Nlx4ODhYalx4MTFJRzw3Pk9ceEE1X1x4OEJceEM0IVx4REFvXHg5QVx4RTFceDk5V1x4OTQlKHBKY1x4MThceENEXHg5OC53QHZnXHgxMFx4RjFceDBGYVx4ODFceEU3XHgxRVx4RUJJXHhGRF1ceEM2XHhGRVx4QjFeXHg4Q1x4RjJuXHhCQ1x4MDhceDE4XHhFRVx4QUVoXHg4OVx4RTNceEEyXHhDQzFceEU1XHhEMlpceDkzWFx4RkIpYj1ceDgwXHgxMVx4Q0NceEEyXHg4MUZceDlFXHhFNVx4MDlceENBL2g+MmR4XHgxRVx4QkVSXHgxQlx4QTllXHhFNXFveVZoXHgxQlx4OTRceDkwXHg4Qy1ceEJEOkdceDlDXHhDMlx4RERceEYzI1x4OUJceDk2U0ZceEE2fU5BXHhFNlx4QzdceDhFXHhCMVx4RUFceDE1Ylx4MTAvXHhBQUttXHhDQVx4OTVceDkxXHg5NVx4RUNceEJCTlZceDFDe1hceEIydFx4OEZceDlDXHhGOVx4Q0UlSFx4MTRceEY1Tlx4OUNzUChOXHg5NVx4OUJFU1NceDk0bStceDk4bVx4OURceEY3XXtceEExXHhBQVx4QzdceEJEIDdpXHhGNFx4OTZBXHhEMFx4MTdceDlGVmNceDExXHhGRlx4RENNXHgwRVx4RTlvXHgxOFx4RTBceEI2XHg5MX1kXHhGQlx4RkZceDBFXHhDQlx4Q0RceEJCNlM5XHgxMj1ceEM4PFx4QjRGXHgwOE9Oalx4QUFceEE2XHg5Q1x4MUJceDkxXHhEMG5ceDBBQHRceEYwXHhGRVx4QzlceEI2XHhFOVx4ODE6XHhDM1x4RkVfXHgwNlx4Q0JceDk4XHgwRVx4RTBceEZDfVx4RDZceDk5XHhCM1x4OEVceDAxXHgxQlx4MTJceDk0XHhEMF1ceEY2YXNrXFx4OEJxXHhFN1x4QkJWXHhEQVx4QkRceDhGKHRceDFDXHhCNUtceDk3M1x4MEZceDE5XHhCQTFceDBFXHhFOEFqXHhFN1x4OUZceEEyYCVceERFXHg5RFx4QkJceEJBXHhDQWdceEREXHg5ODdhXHg4OVx4QTA9M1x4Q0N+XHhCRVx4QUZceDlFZlx4QzZceDk2SVx4MEJceEUxSCBcXHhFQ1x4QkJceEJGXHhEQlx4RjhceDFBXHhBRVx4REZceEQzZSBkXHhDNlx4MTRceDlBXHhFNnwjXHhDNFx4RTFceDgwXHg5QV9ceEE5bFx4RTJceEVGXHg5MFx4RTlceDAxXHhDQSFceDFFXHhFOU5ceEZEL1x4QjRmIVx4OEZceDk5XHhGN1x4RjJceDg3XHhERC9ceDBCXHhEQndceEE0JFx4QkY9XHg5RFx4QjktXHhFQ0RceEREXHhBOFx4RkN5Ylx4RkMlXHgxQVZceEE1XHhDRSlsPVx4RTBceEZFX1x4Q0RceDg0S1x4QjRceEZGYVx4ODFFXHhBM1x4QkRceEREXHhDRFx4RjRceDExXHhGRVx4RjRceDgwekJceENEXHhBRFFceEUwXHhFQ1dceDg4XHhFMWJceEZGXHhDNVx4QTRceEUxb1x4REU2XHhEOVx4RjZXY1x4RjRceEMwYFx4OEVceDE5XHg3Rlx4RjNceEU3YVx4QTFGXHhCRlx4QjJceERBXHhBM1x4OTMlRVx4ODNceDlDXHgwRlx4RjBceDk1XHhBQ1x4RjBceEMwVFx4RkImXHgwOFx4RUFceEM3XVx4MTZceEM3XHg3Rlx4MDVceEExQVxBQz1ceDhEMUZceDk0XHhEQVx4QjNceDlCJVx4MEQkXHhCNVx4MDNceEIwXHhCRVx4RTgqXHhFOHRmIVx4MURceEM1a0NjXHhGOFx4QzlceDFFXHhDRVx4QTJceEU4XHg5Rlx4Q0NyXHhCMFx4QzZceDhGXWpceDExXHgwOVx4Q0FceEE2cVx4OTlceEZDLFdceDEwSVx4QTlceDA0S1x4RUZceDFCXHg5NlRceEFGXHgwOFx4RTRENlx4Qjl1XHhBMlx4RjZceDEzNUFceDhEdFx4QjlceDBDXHgwNFx4RjFYKFx4RjFceEQ5XHhDQlx4Q0NsQlx4Q0IoXVx4OEZfTSZceDEyXHg4NFx4RDhKVkBceEI4XHhGMFx4OEZCXHhCM1x4QjRceDE2RFx4QjJceDlEUFx4RTNxXHhERlx4QzdiNVx4OTFhfVx4MDJWXHhGNF9ceEFGXHgxMFx4MERceEI0NVx4MURceEMwPlx4QkJceEI0XHg5MVx4OTlbXHg3RmRgPlx4QUNNWFtceEJEXHhCNmRceEFDXHgwM1x4Rjg5XHgxOVx4QzJceEZEXHgwMFx4QkRceEUxI3ggdiZRXHhEQzJceDBGXHhCOFx4RTNceEQ0XHhFQUxceDE2XHg5Rlx4MTVceDlBITpceEZBXHhEMlNyXHhDRSAhXHhENVx4QjJceEI1IGVceDFGXHhCMFx4RUNceDk4XHhCRVFRXHg4NFx4RTRceEQ0XHhBQ1x4QUJceEJGXHgxMkRceEUwVlx4OTBceEQzXHgxNDAvXHg5Mlx4QzBceERFXHhFQVx4QzRceDg4XHg5OXNjXHhFN1x4OEJceEM2XHgwNFx4ODJceEY4X1x4RDJceDg3XHhBNllGXHhBQlx4QzlceEUyXHhGN1x4MDRceEMwXHgwOVx4RDZceEMyXHhGQXlceDkyXHhFQmNceDhGXHgxRVx4RTdceEM1XHhFN3dceEVFKlx4QjNldVx4QUQsXHgxQ1x4OEV8XHg4NFx4RkFceDlFaVx4OTZceDAwXHg4RVx4MDRPYGZceEZBXHg4Nlx4QzVceEZFUVx4RjA/JVx4OThceDExMVx4ODJceEIzXHgxNyBceEREIVx4Q0ZyXHgxNlx4RDNceEU1QFx4QjhceEVGXHg4RlY4XHg4OVxceEZEXHgxNH5ceDkxXFx4MTgobVx4QURceDhEM1x4OUNceEM3XHgwNCNcXHhERHdceEY0XHgwQlx4MTdceDlCXHhGOVVJXHhBMVx4ODZceDlBXHg5Mlx4RERceDE5elx4MERuXHhBNzJceENGfU5nXHhERjpceEY4XHhBNldceDlCIFZTXHhEN1RAXHhENW1ceEZEXHhBRXZfflx4RjRzXHhFNEpceEIyQ1x4ODFceEZBdllceEMwcjdceEMzXHhBMVx4ODlceEFDYSY1NVx4RDEuXHgxQlV5XHhBNFNceDBGXHhERVx4MDUhYlxBaH0nXHgwNVx4OTRceEQ2elx4RjFceDkzXHhDRjhceEVDK1x4REZHXHhDQVx4RDkjXHhCOXFceDlCNlRceDE1JFx4QUFceENDN3tceDAyXHhEMVx4MDZceDE0XHhDRVx4OTVceEREXHg3RkBzXHhFN1x4QjBJXHg5NSNceDgyXHhBMFx4RDRceDA3XHg5RktceEZGXHhDMU1PXHhCQ2NHMj97XHhDMlx4QTJceEZFXHg4NVx4RjZceDhGPFx4RjJceEU5Plx4Q0RceDkxSlx4RUYhK1x4RjdceEIxXHhCMmRceEVFXHhCMFx4QUUuXHhBNmxceDg5XHgxQ0pceEJEaVtDeDBceEZGIVx4OTMhVSN3XHhEM10sXHhEQVx4OThceDhBW1pceEYyXHhBMyhceEE5Y1x4QzJceEI1Rlx4OThceEUyXHgwNlx4OTQxW1x4MDF8WVx4RTJceDBCXHhEMVx4MTlceEI5XHhCNW1ceDEzXHhBQiwrXHhBQ1x4MDhceDgyXHgwNFx4ODlceDhFIlx4ODRceEQwXHhFMW5ceDlDS1x4QUJceEE5XHhDNlx4QjFceEI3clx4MUVceDkwXHg5Rj1ceEYyUjhceEZGXHg4M1x4RTBPXHhEN1x4RjdceDgyXHgxNVx4RTVceEM5XHhDREtCYDpceEZBXHhBNndceDA3XHgwQi5ceDgyXHhCOFx4RkFceDAxXHhBRFx4OEZceDA3XHgxRlx4RkVceENBalx4MTBceDlBXHhEMy00fDFceDA1XHg5Rlx4RjNceEZDSVx4QkZceDA2XHhGQ1x4N0YvXHhCNVx4QjVceDkxXHhBQVx4MTVIXT9ceDhFMzx8KFx4RDZceENDXHhDNlx4OUNGXHhENlx4MUJceEQyR1x4MUE/XHhCQlx4QjVceEI2XHhDNlx4MUJceDAyPVx4QTBeQzdceEZCTVx4MTlceEZBXHhFQmxceDAwMVx4QTlceEMyXHg5RHVdXHg4RFx4RDc+XHhDQ2tDYEV8fFx4ODdceDg2XHhFNE9ceEVGXHhBQ1x4QkMgXHhEOFx4OUNOXHgxNVx4RDBIXHg4NVx4OUJceEJCZHBceDlCXHgxRFx4RUU8XHhFQ1x4ODVceEFGXHhEM1x4MUNWT1x4MTY6XHgxMmFjdzcgSlx4QzJceEMxXHhDQlZceERBXHg5NFNceDhCTTRceEREXHhFMlx4MUZ1XHg5Q1x4MEIpXHhDN1x4ODZceEJGXHhCOGg/d1x4QkM1XHhDQlx4OTAlXHhEN1x4RDVceEQ4JE83XHhGMjtXXHhEQlx4MEJceDg3XHhBNnhceDg2XHhDQ1x4Q0FleFx4RkJceEZGall2PVx4RTkjL1x4MTJceDk3XHgwNVx4OTc/TktAXHg5NVx4RENceEVDXHhCRlx4RjFceDk2XHhCRFhceDkxQlx4QzJceDFDXHgwMlx4Q0YzXHgxMFx4MDRWXHhCRFx4QTVceENDXHgwQ1x4MURceEFBUVx4QURceDgxXHgxRHBceEI1Plx4OTlceDFGXHhEQVx4MDEhTVx4QTdceEYyXHhGOTchXHhBMlx4RDhceEQ5XHhFQVx4QjRceEREXHg4MSVceDBFXHgwQUxceEFBXHhBRFx4QTVceDAwd1hceDlEJHdceEUyXHhCNVx4QkNOXHhBNVx4Q0VyLz5CXHg4MjRceDA3XHhBMVx4ODJyXHgwNVx4MTdceDE3SjFeXHhFOVx4RjhceDg2elx4RjZ5XHhGMlx4MTJUXHhCQVx4MDNceDlCWlx4OTV5am9ceEVDbDJtXHgwMFx4QzRrXHg4NVx4RUFceDk2OnVceDk0NFx4Q0VUXHg4QVx4MERceEVCXHhDRFx4RTlBXHgwOFx4RkZdXHgwNFlceEYzb1x4RjhLXHgwNVx4Rjcialx4MEJFXFx4RkRceEY5XHgwRHhceDA1XHg5Nlx4RDJceDlEeVx4MUJlXHhFMlx4OUJtLz4iTlFceDBFXHg4MFx4ODlceEYzXHg5OFx4RkMuXHgxOVx4Q0NceEIyXHgxNVx4QTZ6clx4MERceEZBLlx4RkNceEZGLmhceEY2XHhEMVx4MUZceDgyXHg5MyBceEE5OFx4OTVceDAwYVVceEE2NEdDXHhCQ3FhXHgwRnRceDBCXHg4NFx4OTBceEJBXHhEOFx4RDNceEQxXHhFNVx4MUFceDg0P1x4Q0JceDBFR0tceEJGPiUjXHhBQSpceEQ0XHhBMlx4RTM9XHg4ODNceEZDXHhGRlx4RERceEExPFx4RTNceEE4flx4MUFceDg3XHhFMlx4QjRMXHg5NFx4MTVceDlFXHhGNzRceDk4XG9lXHhEOVx4QUVARHJceEI3VExlXHg4NVx4RTVceEFCXHhBOSc+S1x4QUFceDk3XHhBOFx4Q0NXKlx4RkZceEQzYVx4Q0RpXHgwRVx4REJceDgyXHhENz9ceEQ4XHg4MEdceDg3XHhDQ0lceDlDXHhBMUJceDgyXHhEMFx4QTlceEI0XHhDRFx4RDB5I1x4QzdceEQwXHhBQ0BdXHg5MVx4ODBceEZEblx4ODY2ZFx4RERceDhGXHhERkdceDk3Rlx4OUVceEU0XHg4N15mXHhGOXNceENCIlx4RjNpXHhFQlx4OEQoK1x4RDFceDkwWEZceERCXHgxM1x4QUJceDFFXHhBN1RceDhBXHhGN1x4MTNceEE1XHhEQWBceEQ1XHhBMlx4OEFceDBDXHhDNFx4MDZceDg0Llx4MUJceDk3XHhEQjpceEFFXHg3Rlx4OTVceEY3QVx4QUVceEI4XHgxNndceDdGIFx4RjNceDk4Jlx4OThceEQ0Q1x4QjhMXHhGNiRsXHgwQypceEZCXHg5RSlceEJCXHhCNFx4MTBfXHhEMlx4REJceEEwXHgxQVx4MERceDg1XHhCRFx4OUQ5RFx4RTEsXHgxRlx4MUJbXHgwNVx4RDNceEU1XHgxMFx4RThbcy1ceDEwRVx4QjR3XHhGQVx4OEZceEMzJVx4QzVTWFx4QUQoSFpceDAwXHhCRTtceEU1RzBceEI5YzxceDAwW1x4MUVceDBGUVx4QUZceDk4ZFx4QjRceEJCXHhBNVx4OTJceEFGXHg4NiVceENCXHgxNVx4RUZceEIwa1x4MUUuT1x4OThceEU5e0FceDg3XHgxN1x4QkJceDlBKlx4OTJceDAzXHhGRFx4QTNceDFEXHhBQ3xceDE4T35ceDA2Rz9WXHhFRFx4RjZceEZBb1x4OTBceEREWUlILVx4RUZceDg1XHgwNFx4MUROXHhBMVtceEU2XHhFODhceEYxXHgwOVx4RjlceEZGXHg5RWdmXHgxMFx4MTVceEVFXHhCOFx4QUFceEUyXHgxMkRceEM5Slx4MDBceDBGN1x4RkRceEUzXHhGRV1ceDFEJVhceEFCOFx4QUJceDhFdU1ceDBEVn1ceDhFZlx4QkMhXHg5Mlx4OUY5XHgxN1x4RkU+dVx4QzFVXHgxRFx4MDYkeFx4QTRceDA1XHhEMD5eXHgwNlx4QTU1XHgxQVx4OUJceENGXHhDQlx4RTRceEYxWXNOXHg4OFBDXHhGRVx4MEJceDA2XHhGMGNceDBDSFx4Q0FceEFBXHhBMzdceDlCXHhCMFx4QkFceDBCYD52S0tceEY0Jlx4RjJceDA2XHg5QVx4QTlMXHg4Nlx4RkI2XHhFRnJceDE0RXtceDlCXHgxNWZceDg2XHhFOVx4QkJceERCNlx4OThceDhBWXM8XHgxN1BceEQ1XHhFNlx4QTRceDhDXHg5QVx4RkVceDAxZFx4OENceDk1XHhCQkxceEQ5akBwXHhGNlx4OTVFbHJceDkyXHgwMVx4RjN6dytCXHg4OFx4RDJKXHhGNVx4RTFoXHg5Qz9YXHg5OEVceDEyaFx4ODFsQnxceEZEMFx4MUNceDAwXHhBOVx4QzV4XHg4NFx4Q0RaLzJceDkzXHg4OVx4RjlNXHhFNlx4OEZceDkwXHgxN1x4QTR6RFx4OURceDFDXHhGQVx4MDhuXHhDMFx4RUF3Olx4MDFceEYyWlx4RjhVXHg5QVx4MTU1Q1x4RjVceEQ5XHhDMlx4MURvRFF+RjpceDA0Y1x4MDlceDk0JFx4QjVceEM5M1x4REZceERCXHhDRlx4OTU3XHhDRVx4MDhceDg3XHg4Qk1ceDFEXHg4NVx4MTJceEMyXHhGRDRceDEzXHg5OFx4QTBWXHhCRWVceERDXHhBMmpceEUyXHgwNlx4RjNSXHhGNFx4QUJceEU1eFx4RjFceDgwXHhGOG5ceEMyXHhBMFx4REZceENBXHhGNlx4RUY7XHg5MVx4QkNceEUwRmtbU1BceDk2XHhBQ0FceEY1XHhGRVJceEMwXHgwOH5OXHhBRUd2M1x4OERceEZFXHhBRFx4QkRceEM3XHhDREZceEVDXHhCRFx4QjY1XHhDOFx4MUFceDlEXHg5Rlx4MTJceEY0XHg4MyEkbVx4RTNceEJDV3xceEJFXHhGNFx4OTlMXHhBOFx4MDhmXFRceEFEXHhBNVx4QkFceEU0XHhCMHxceENGVVkgXHg5OWg2Pj0+MVx4RTRceEYwXHgwRWxceDhBXHhCNTE7XHg5M1ktbGQtXHg5N1x4MERceEUzQVx4RUZ7KmwoXHg5NyJceEFBXHg5NUJceEIwXHg5RFx4MEFceEExXHhDOVx4OUU/XHg5Q1x4RjckXHhDMytbd1x4QUEsXHg5QmRceEU5bFx4RTVceDFEXHg5Q1x4QTgtXHgwRFx4RDJceEUwXHhEMH1ceEMxXHhDMlx4MTJceEVGXHhBRFx4Q0NceEYxPFx4MUFfXHg5Rlx4OUNceDBDXHg5Nlx4RjZceDFGXHg5RSRceDhDKlIkXHg5QVx4ODNceDlCbVx4RUVfXHhGM1ZPNi9sXnxRXT9KSUlceEY3XHhCMVx4QzdceDgzXHhDQj1ceDk3Pk1aXHgwMn1ceEY5XHhBOD9ceEIyXHg4RFx4MThceEMxQ2tceDg4XHgxRVx4RUNkWFx4OThceEU1XHhEQlx4RDJJXHhEMWg4XHhFRlx4ODIoVFx4ODVceDA3XHgwOFx4QzBceEQ4VnphXHhGMmJcXHg5NFx4QjJceDAxXHgxMlx4RUMlXHhENElceDA0XHg5OUFceEFGVE5ceEY2XHhDRFx4OEJceEE1M1x4QkI3XHhCNVx4QUV6XHhBN1x4QkZKXHg5Qlx4Q0FceDExXHg3RmJMcitceEQ1XHJceDk4XHgwM2ZceEY1XHg5NFx4RUJceEIzXHhFOTVceEY4XHhBQVx4QTlceERGXHgxOVd8JnRceEJBXHhCRExcXHgwOFx4MDZgXHhEOVx4MTd6LWpceEFBXHgwRUFceERFXHgwRVx4OEJceDBFXHg4MT90Oy0iZVx4MTA6XHg5M1x4RDRceEI2Xi9ceEQ0XHhCMlx4QzNceDExXHhBMiFceEFGPlx4MDU1LFlceDk0XHhCMVx4RjlceEQxdU5ceEE5XHhDNVxgXHhBNFx4QzVceERDXHhFRlx4RkJceEE3anlceEFGR1x4MDRPWlx4OEQhRFx4MDlcQlx4ODNceDk5XHgxMlx4RThceEI0XHhDQVx4QUFeaF9ceEI4XHhEN1x4MDhceDBCPFx4MEVceEMwXHg5QiRceEUxXHhFNHZceDFFXHgxNlx4RkNceEFDXHhCRFVceDk4XHhCQ1x4MTBceEVGXlx4RDNceEE1XHhFM0xceDk2XHhGM1BceDAxXHhFMGFceDlFJFx4MDNZXHg4NFx4REI+XHhGNElceEMzXHhENFx4QzZceEZBXHg5NVx4Q0J9XHhEM0ZceEQzXHg4NVx4Qzc5IFx4OThceDBGIFx4RkFceEVCXHg4Rlx4RjUxKVx4QjBceDlGXHg5RUcsXHg4MW12XHgxOFx4QUVceDgwXHhCQVx4RTNceEQ3XHhDRE00S1x4MENceEJGcyJrRVx4Q0VBZVx4OEYmSFx4OThceEU2R1tceEU4XHg4NFx4QjUkXHg5NCdceDBFcEJceDk4aVx4MDNKb1x4QkNceDBDWlx4QkRceERDRlx4QzBceDkwXHg5QVx4RkJceDlCXHhCQitceERCIEh3W1tceEFBXHgwNlx4MUNceDgzXHhEOVx4RTN7eDJcXHg4NVx4RTBceDExXHhGOFx4RDVkcVx4MTNceDFFXHhEMyQ8XHhCMDNceEE3XHhGNFx4OTRceDFBRlx4MUEyaFx4MDhceDkxSVx4RUV7XHhCMVx4RkNceDk0XHhFRFx4MTVceDA2XHhBRlx4OEYhXHhDRFx4MDV+M1x4Q0N6RFx4MTNsXHgxQVx4QThceEFGI1x4OTdceEE3XHgxNFRceEY1XHgxMFx4OERceEQyXHhFRHRWXHhFM1x4OUJubHRceERFXHhCOWJceEI3XHhDQVx4Q0FceEVCdS4rXHhERTdceDBGSiFceDg2XHhFRlx4OTZceDBCXHhGMlx4REFceDkxaVx4MDd8XHg4OWRceEJBXHhBN1x4OTlceDk4XHhBM1x4MTQ1Q0F3XHhFNlx4OTZceDg0XHg4Rlx4RkRceDk5XHhDRCRceEI1fVx4REQ8Rlx4MEQiY1x4QkZceEY3Y1x4RkNVT1x4RjhnXHhFMFx4QUZceDA1XHhGRlx4RTVceEQ1XHhCRVx4ODI5XHgwRE9ceERESWFceEUxQ2RceDk4XHhEMVx4REZceEEzXHhEOFx4QTNceEQxXHgwRVx4MUVceEY0XHhCMFZceEUyXHhGRFx4OUFceEUwXHg4OFx4RTVceEQxbXdWXHg5Nlx4MDhceDlCNlx4N0ZceDE4alx4Q0FceEE3K1x4RTRceEZEXHhGQlx4MUVceEI3TVx4RDlceEUwXHgxQnlBXHg4MD9ceEVEXHg5N1IlRFx4QkRceEI2L1FceDEyR1x4QzRceDBBXHg4MFx4OENceDg1XHhGQV9ceDhGXHhGRHJceEY1e1x4MUE8I1x4RkNceEE3YjtoXHhFOFx4MEJceEM5R1x4RkImXHg3Rlx4OTBceDA4XHhEQ1x4ODg5XHhDMHFceDBEXHgxNFx4QzNcXHhDRWlceEI5VVx4RkFceEI4cDJceENDXHhEN3NceDBFXHg4RVx4RkRceDkzcCtceEI5XHhCN1x4QjVceEQxXFx4RUJceEREPlx4RThceEQ2Jlx4RjgoXHgxOWYuXHhFMlx4RjFceDA5eVx4MDJceEUwN1x4RTRceEI1XHhERFx4QzdceDBEXHhEMVx4RDJTXHhEMGVUXHhGRlx4RjdceENCXHhEN1x4QTVceEIwYVx4MEFceDFCOFx4QTE1XVx4MDhceEIzXHg4QiRceEE1XHhCN1x4RENeXHhGMVx4OERceERCXHhCMFx4RjJceEVEXHhDM3hdXHgwMVx4OUJceDlGNFx4QTlceDg1XHgxRFx4MENceENEXHhCNVx4RTdnXHg4Rlx4RDcgXHhCRFx4QzBtXHg5NVx4RjR+XHhDQlx4RDJrXHhDN2hceDE0WEJcXHhDOVx4OERceEIyb1x4QzdSXHhCN1x4QzNceERDXHhCNExceDBDXHg4RUJceEIzVH5ceDAxXHgwMGVceDE3XHhBMmohXHhCQj5ceEM0XHgwMFx4QTJceEMwXHg5N1x4MDJwXHhBQ1x4RTF8W1x4MUZceDlEJVx4RjJceEMwXHhCMFx4QTExLXosXHhGQ1pceEFDLlx4RjkvLVx4QjQ/SztceEYwXHhCOFx4OERceDFCXHg4Mm5ceDFEV1x4MUFceEY2XHhFQVx4RTFceEQydXlceEY5ZldceEFEXHg4Rlx4Q0FceEQ2XHhBNVx4Q0UiXHhDMFx4RERdLFx4RkVceEU2Ylx4ODc5XHg4OHdceDk1XHhGMFx4RDVceEE5XHg4OVx4OUFceDBBXHhGQVx4ODhceDAzXHhERlx4QTlceEM0NVx4RUJceEZEXHhEQVx4Q0ZceDkyXHgxMzlceEZBM1x4Q0RceENCXHg4Q1lceEVCdklcelx4OENeXHhERFx4RkRceEUxXHhEMFdjIlx4MDklXHhFQVx4QkNceENEOFx4REVceEQxWiNceEYyYVx4RDJ8XHhFOVx4Rjk6YFx4QzlceEUxXHgxN1x4MUJQXHhDRVx4ODJceEQzXHgxMkVceEIzXHhBRlx4RDE0by96P1x4RDhceDgzXHg5OVx4ODhceEEzMSJuXHg5RkkzSFx4MUNceEFDXHhEMFx4RURceEY0XHhCN0o6XHhFQmlceEEyNy5za1x4OThceDgxXHgxQnRceDE5XHgwRVx4RTVceEI4XHgxMlx4RTZceEU3Ylx4RkVceEIyXHhFQlx4QzFceEUwXHg4RWBceDFFXHhERFx4RkZceDhBOlx4QTlceDBEXHhFNVx4MEU3V1x4MDdceDE2XHhFQSVceEI1XHhERSpceEY0XHgxNkYsXHg5MUVceDkxNSNceEZBXHhEN1x4OTBceERBXHg5N1NceEZBRVx4Q0ZWXHgxMVx4OURceEEwYVx4RTZFVVx4RDJaXlx4MDFceDEwXHhDQyBceEY0XHhCQlx4RTNceEI2XHg5RVx4MEUnJ1x4RDFceDg3XHhFMTlceERDXHg5Rlx4RTFrJlx4QjZceDBFXHhFQlx4ODdceDk5bE1LKV5ceENGXHhCNVx4REZceDhDXHhFMlx4MDNceDg3YWFceDFBdztceEUzXHgwRmhceEYwXHg5QVx4QjBceDlCXHhGMFx4RTFceDE0V1x4RDInXHg5RElceERFXHhDQ1hceEE4XHgwOVx4N0ZceEJDXHhBOVx4QjdLXHhFOFx4MTVceEVGezVceEE4XHgwNTBceDE3WFx4RkFceEE5XHgwN1x4RjNceEU2M1x4ODBceEI4XHhCOVx4RDB3XHg4N1x4Q0NceDBFXHhGM203TVx4QjQgQlx4RTlceEVEeVx4OUYiPlx4MTdCXHhGQlx4OTFUXHhDQUNceENCXHhERlx4MDE7OFx4MDJceDExXHhBNFx4QkUpU1x4RDlceDE0XHhDNlx4QkRceEIzcVx4RjBceDE1XHhEN1x4ODFceDk3O1VceEQ5d1x4RkFfXHhFN1t+Qlh0XHgxQ1x4RDlqXHhCRFx4QzFceEZFXHhCMVZAYVx4QjlceEQ2TTZ4MFx4REJ2XHhCNVx4RTZTPH1ceEIyXHgwN3hceEM5YlRceEIzXHhGRVx4QjVceDlFaitceDFEXHhGMFx4OUVceEEwYi9MY1xceENCXHg4OVx4ODRceEE2XHhBRVx4QzlceEJGXHhDM1x4OTlpXHhGNypsNlx4QTlYcVx4RThceDgzXHg4N0VMXHhGM1x4RDZceEM4ZHJceEZFXHhCME5ceDk2di9ceEUzXHgwNVx4RDltUHtPXHhFMlx4QkVceEU2VkBPQDxceEQ0XHg4NVx4OUVjXHgwRFx4QTlceDFGXHg4Qlx4MDFceEQxIFx4QjZceERBXHhCQ1xceDg0SFx4MEVceDlDXHhGMVx4ODJhXHhFNVx4REZ0XHhGMTxceEE0K09ceDA3QFx4RTdceDlDfVx4RTdceEM5Q25ceEJEXHhDRFx4QUU4XHhCRlx4RDdceDE0XHhDM1x4MTBceEU5XHhFNFx4QTFvWlx4MTZceEEwXHgwMFx4ODdceEYxXHhDM1x4QUZceEEzXHg4OVx4QkZceEZFYCZALTRceDE3XHg4NV1KXHg4RFtceDE3VSRaXHhDRldceDdGXHg5RFx4QUFceEVDTXJceDAzXHgwOFx4RDhceDk2XHhDQmtyXHhFQVx4QkZnXHhBRXtceEY2eXZrXHhERlx4QTFqXHhCRVx4RjJceEUyXHhFQVx4QjhceEE4XHgxMlx4RkZceEQwJFx4MDVceEM1XHhDNSBceDFFX1x4QTNceEQ1XHgwRUxPXHhDQyhceEQzXHhCOFx4QTZceDk3XHhDRlx4MERceEU0ajlceEFEelx4QTVceEM0XHhGNlx4RDY2JVx4QUNceEFEMVx4RjAoKFx4RjdTMF5NXHhEMnlceEQyVUpceEYzXHgwRFx4MDdQXHhCQnFceDAzXHhCN1x4MDRceERDXHhFRVx4QjkvXHgxMiBceEZFWFRceDgzXHgxNlx4Q0NceEMwXHhDRVx4RTJTXHgxRVx4QkFceEFDOVs6flx4MUNceDAzXHg4RHNceEE5XHhCQ1x4RUFfXHhCNFx4QTVceDlDXHgwOVx4MDdceENEXHgxMFx4Q0MuKlx4OEInXHgwODpMXHgxOHlceEJFXHhGRVx4MDIgTlt3XHg5OVx4Q0UvXHhGNG9ceDdGWy1Ed1IlIVx4ODFceEY1XHgwMj1ceEQ1PFx4RUFceEQ2XHhFQlx4OTl1XHhFMFx4RUNceDgyXHg4MVx4MDZceDg2XHhEMlx4QjNceEMxZFx4QTBceEE5XHg4QVx4RTNceEE4LU1ceEZGXHhFQl9ceEE4XHgwQlx4OTVceDk3XHhDN1x4RjJceEEwbVMnXHhEOFx4RkVceDFDXHhDNG96XHg4NnVceEQ4XHhDMWFwXHhBMFx4QTVceEQ5XHhGOVx4MUZceEY3XHhGRElceEMwXHg3Rlx4QzdceDE5XHhDMFx4MUNceEM0SVx4ODFceDE3Q1x4QjdceENEXHhCRFx4OTZceDgxSVx4OTRceDdGXHhEQi1ceEVGOy0vQiBceEMzb2tceDk1X1x4OTA/MVx4QTVRKV5ceENEeEhceDhBXHhGMFx4RjdMXHgwOFx4OENceDk5XHhBNFx4OTRceDg3VyNceDgzXHgxMlx4ODdceEU1XHg4OFx4QzhceEQ5P1x4RUIyO1x4OEFceDlBXHg4MFx4MTJKc29ceDExUFx4QjRSXFx4QTFceDAyXHhDQWJceEVBXHhBRC5ceERFXHgwNmBNNlx4RjdceDFERFx4QUREXHhFOVx4REZceDkwXHhFNjtceEY0XHhEMVJceDE2XHhDM1x4RDlWblx4QjhceEJEXHhGM2lIWlx4RDl0T1x4MDRceEVFcVx4MEJceERDXHhFME9ceEQ5XHhDRXRceDBDOlx4REZceDE5UmpFOlx4MEVvXHg5Q1x4RjdceDBBXHgxOFx4MTdcXHhGMjBceDFFXHgwQ1x4RDkmXHhBNFx4OTlFXHg5NVRceEZDclx4RERObFx4RTVceEFBXHgxMVx4ODFceEEwK1x4ODFceENDVnAjfFx4MDBceEQ0fWxceEFCXHgxMFx4RTVceEMwXHg4Rlx4QjQnXHhDNVx4RTE4Xlx4MDA+MFBceDAzXHg5Q2B+XHgwMVx4RTkrXHgxQ2hceDlCLDFceDE1Z1x4OUJceENEXHhEQXNuX3lceDhDXHhDRlx4Q0NceEE0P1x4MDRceDAxXHhENE9ceEE0XHhDMXBoXHhDQ1x4QkFceEJCd1x4RTZQXHhBQVx4QzFUXHg5OVx4RjBceDgwXHhEQVx4QkZceDEyfVx4QjFceEM1XHhGM1x4OERKXHhBN1x4RUJceEM5T0NceEIwXHhBNVx4RjdceEFCXHg4Nlx4MThxXHgxMVx4RENceDk4Slx4QURmX1x4OTdceEEzXHhDMyxceEJCUFxceEQxV0xceEI4XHg4RihceDEzXHhBRFx4RTJceDE4XHhGNVx4MUUmXFx4MTZQXHg4RFx4MDFzXHhGRFx4MUJceEI4I1x4ODc+IyI7cFx4QjVceDkzXHgxQ1x4Q0J8eFx4RTNXXHhFMVx4ODhxXSxceDlDXHhCNFx4MThceDkwXHhDM1x4OTY9XHhDRlx4RkNceDk0XHhEN1x4MEJceDhGeVx4RERceEY5XHhFNVx4QzVceEY4XHhBRllceDk5XHg5QVx4QUZceDBFXHhBQlx4RUNceEI1XHgwNSNceDA0IVx4Q0JaXHhBN1x4ODZJXHg5RFx4QjJceDg4blx4QzUlXHhCQ1x4RkJceDlGXHhGMFx4MTF7WVx4OTJceEIwSlx4OTJceEMyXHgxOVx4OTZYXHgxN1x4MTV6XHgwOVx4MTIibVx4OUZlXHhBMEVceEE4XHgwOUgpXHhDQmFceDA1SFx4RDFceERESVYkXHhBRlx4MUNVXHhGNFx4OUJceEY1XHhBOVx4MTlceEVBXHgwRlx4RjBceEVCXHhCOVx4ODlceEQwXHhDNFx4QzRzXHhBRlx4Qzd0XHhGMVx4OTFceEVBbCZceEVEVz4qXHhERlx4OUJceEU1XHg4OVx4OTRceEU2XHhDRlRceDkzXHgxMzZceERFW1x4OEZceDlFS3o9XHg5RSVceDhDXHhBRlx4QjhceEUxXHhGMGstXHhBRFx4MDNceDA1YXhceEZGXHhGN29ceDFFXHgxMnJceEUwNlx4RTVceDlDXHgxM3NIOFgvXHgwQ1x4RDZceEFFUVx4ODRVXHhCMFx4RUMoXHhCOVx4MEJceEQzXHhENFx4RERceENCXHg5OCJceEY5XHhBQlx4ODFceDAwXHgxMFx4QTBceEVGXHgxNF1cIVx4RDJceDg4XHhGNFx4REFceEM3XHgwRVx4MTRceDgzXHgxRXdceEM4XHhBQlx4REYidVx4RTlceDhBXHhBMlx4QjFceEMxXHhDRVx4QzhceDlCXFV8XHhCNlx4RERIVzBQXHhBMVx4MTB0XHhBRHhceDBEXHhENTxceEEwIlx4ODJceDFDXHhGMStaXHhENlx4RDJceEVDfVx4RkRBXHhFMGVqXHhFMkQgcVx4RDdceDkycz9ceEQ3KEtpXHhDRVx4MUZZXHg5Mlx4RDdceERBXHhGNVx4OEVIe1x4QjFceEEwXHg4MFx4RURPXHhGRFx4QkMjXHhEM1x4MThQXHhBRlx4QUNceDgxMClKXHhEQ1x4MUVCXHhFMlx4QUVyXHhGRFx4RUNPT1x4RjRJXHhFNHhceEJEXHhGM1x4MENceDg5XHhFMHlceEJCZVx4Q0NceEQ0XHhCOFx4OUJceEJBfVx4RjUqXHhGRVx4QTNceEE1U1x4OUZceDE3R2NceEQ4PVx4QjNceEFGWDxceDFEXHhBRVx4RDBceDlDSVx4RTImXHgwMlx4RUVceEVCTVx4Rjk+XHhGQjJceDhDXHhCN1x4RjBMXHhBQlx4QTBwXHg5M1x4Qjk9W1x4RDFceEUxXHhCM01ceEYzXHhBMDhceEQyXHg4RVx4QURceEFCXHgxRFx4OTYkSVkgXHhGOVx4OTNIXHgwOSVceEZFXHgwMlx4ODFVXVx4QjlceEJEXHgwRFx4Q0NUXHg5NVx4RDFceERCKlx4QThceERBYVx4RkZqLXtceENDXHhGNVx4Q0ZceDkxXHhCNzktdVZhZlx4RTFceDEwXHg4OFx4REFceDBBT2tMXHgxM25ceEMwXHhFOFx4QUZceEU3XHhEQ2VvXHg5OVx4RTBceEEzXHhDRlx4MDFceEQzJFx4ODB2XHgwRVx4MTRceEU1XHhEMFx4MTRceEMzQVx4OUFceEU2NFx4OUNceEEzOSJceEE3XHhCQSFmXHhBOGpJTVx4QjFceEE4Y1x4OUV8XHg4M1x4Q0FceEZBcVx4QkIiXHhEMStceDhCXHhCQVx4ODVceEZFXHg5OF5ceEExXHhGQ3xRMVx4RThceENCInBceEI5PVx4RkNceEI1XHgwRlBceDFCLlx4MEV8KlxceEVEXHgwNFx4OTJceEE4Z11ceDlDRnxceEFBXHhFNCZUelx4MTZceDhDLlx4RkFkXHg4RGtceEU0PFF5eDBoXHhENVx4QkZUXHgwOFx4RjNceENCdVx4ODRceEFEXHhGM2d2e3NceEY1XHgwQVxNXHhGMzxceEM0XHhCOFx4MUQqXHg4NFx4QUM8XHhFQ1x4QTFceDBCXHhFNFx4RTVceDA0XHhGN1x4OUFceEYyIFx4MERceEJGdFx4QjkwXHhEMVx4RDk+OFx4MUFWXHhDM1x4MTlceEZGXHhCRlx4QUZ+XHhEQVx4MTc+XHhCQlRceEU0XHgxMFhceEYxQ1x4REQ+Zlx4QkZceEE0XHhFM1x4RTkqL1x4MDZceENGXHgwN1x4MDJceEUzXHg5MFxceEEzXHhBQ1x4OTRceDg0Tlx4MEVceDFDXHgwOFx4MTJZXHhFNlx4QTlceDdGeFx4RkFceEEzXHhFOVx4MTNcS1x4RkVceDlGXHhFRHtqXHhFNFx4OTVceEVCXHhCRlx4RjJceDk4LVx4MDR+XHg5OHBceEJGJVx4QThceDE2XHgwRlx4QkVceEQwQlx4ODhceEQ4XHhERClMXHg5N1x4REEjXHg5Mlx4MDRceEVGXHhFMVx4REYjXHhGNUVJXHgwQ1x4REMhcVx4QUVceDE2XFx4MURceEUyXHg4NztceEMzXHhFMFx4RDVceEM3XHhBMzBceEREXHg4MFx4MUFceDgxXHg5Nlx4MEJceDBDXHg5Mlx4ODVceEZDXHgwQ1x4MEFHKFx4QUInXHhDNlNceDlEclx4MTZceDk0XHg4OV9oXHhEOVx4QjNceDA5Nlx4RTh4XHg5M29TXHhDQVFdelx4OTFceDBEXHhEOFx4MENceEY5S1x4QjV8XHhFNVx4OTNmI1x4MThceDlGXHhGQ1lceDA2YHo0Zi1AZHpmcVx4RDVceEFEXHg5NFx4RkVceDE5XHhDNFx4QUFveUUwLn1ceEYxSlx4QTBceEIyXHgxMUZceDlCYCFceDAzXHhGRFx4RjNceEY3Tlx4OTNceDkzXHhENV8mOlx4ODBFJ0hceDk0XHg4M2RMXHhDRVx4QjJceDA4Olx4MThQXHgwNWkvXHg5OVx4MThSblx4RDhWXHhBM0dtU1x4RERceEIwXHhFMyo7XHgwMlx4QUJceDhBXHg5OVx4RTNHcVx4QjNceERBS1x4MDBceDE3XHg5OVx4MTJceEI2cnBceDgxK0pceEQxXHhENlx4RkY0XHhBRFx4QkNceEEyQVx4QkFaXHgwM1x4OTZceEE2OFx4MENTXHhGN05ceDhGXHg4MVx4REQ8XHhFM0tceEEwXHgwRVx4MDM9Ilx4OUZceEM4Wlx4OTlceDAyXHg4NnpCL0ZceENGXHgwNVxxXHg4Q05JXHhCRVx4RjBceEJBdFx4RjdceEFCXHhDNVx4ODRceDA4Y1x4OEQmXFx4RkRceEU0XHhBMz5ceDA2a1x4Q0NceEE1XHhBRFx4QkJceDhEei48XHhDNFx4MTdiXHgxNlx4QzVxXHg5Rlx4RDJsXHhDN1x4Q0NceERFXHhERGRceEJEXHg4OW5OKVx4QzA4XHhFRFx4QzdceEZBclx4QzZceEU5XHhDRlx4QTJceEE1XHgxN1x4MTlceDE0QFx4RTAxXHgwNENceEMzfXVceDE2XHhBMkFnXHhFMFx4MEVvZFx4RUVceEZCRlx4RTI1XHg4OVx4OTdceEYxKVx4QUYxO1x4QkRceEQ3OVx4QjBceEM0XHhENVx4RDhceDgwXHgwOHJJXHg5NFx4RjdceDhFXHhENFx4REJgXHhERFx4RkRceENEXHgxMVx4RjRceENDXHg5NFx4MDItXHg4NUVceEM3Ylx4MTdceEZDXHhGM1x4RDE7XHhEQzxceDkxQypceEM4XHhGNlx4OTJceEM2XHhDMlx4MThceERDeFx4RDZceDA1ZFx4QjcpVlx4QUFceEVBQVx4MDgnXHgxNFx4MTVceENCU1J6XHhGQSpceDhCXHg4OGlceEI3amBQXHhEQVx4Q0ZceDAxaVx4MUJceEY2ezdceDEzTGJceEE5XHg5MC5ceDA1Ylx4RkFceEZCXHgwMVx4OTZceEZFXHhGQlx4RTdcQF9ceEMzNlx4QTMyYlx4QjBceEU0XHg4Rlx4ODhceEQwXHg4NDFkdlx4RTdceDgzXHhFQjZceEVGXHhBQlx4ODBceEY4YFx4MUFceEY3XHhEM1x4QUNceEVFMFx4OTNceEYwcndceEQ2XHhDQlx4OUFceEIxXHhGRVx4QUVceDBBXHg5ND56cGJceDk5XHg5RFx4REVceEYyXHg4RmdceEY3XHgwQXs7XHg5MFx4MDh2OVx4OUNceERFU0pceEM1XHhBMVx4QUFceDg4XHhFRlx4RTJVMFx4OENGXHhDOVx4OURYVFx4Q0NceDk5XHhBN1x4RTNceDA1UiFcXHgwRlRceDBGZ1x4RDZceDFEXHhEOFx4QTRceEUwXHhBNGNceEJCXHgxN1x4MTA3clx4ODJceEVDXHg5MXotMlx4MDJceEQ3XHgwRlx4RkV7XHhGODBSXHgwNFx4QkFceENEXHg5OFx4QkFceEJDMlpceERGT1x4OTRceDlFXHhBQVx4ODNceDA1XHhENFx4ODRceEUzXHg4OVZkXHhCMUZceDBCXHhDNnpceEI1XHgxMFx4MERceDA2bFx4RkIhc0EmXHhFM14nXHhFRUR3XGs4XHhCOWNceEVFXHhBQlx4OTIgXHgwM1x4OEFceEQ1XHg5N1x4MEVceEE5XHg5Qlx4RTdceEYyWFx4QUNWXHg4NVx4QkZceDA1XHhFQyFsJTtceEUxXHhDNFc7c2pIXHhBMVx4OUQieTNceEFCflx4QTRceEM2Q1x4ODdceDFFXHgxRlx4QTdceEQzXHhDOFJceDkwNFx4OTVceEMzZFx4REZHVlx4REI/XHhCNFx4QzZAXHg4MFx4Qjc0XHhEMSh5Xlx4RkVXXHhENlx4MUR1YHVceEFEZzpceDE5XHgwOFx4RkFceDlEXHhEQlx4QUVceEY1fFx4RDdETWFceEE0XHhBN1x4QkZceEJEXHhDMVx4MTVceEM2XHg4M1x4Q0R2RUJceDg1XHgwQmBodzVNXHgwQnxceEUzXHhDMWZceDlBXHgwQVRceENGTDQpXHhCMlx4QzVceDFCXHhDQiYkQlx4QjNgXHgxNVx4MDBceEQ1XHhGRVx4RTlceEExdVx4QkNceENCL0VceERCIFx4OTFceEZEWFx4QTgoXHg5Mlx4OEUmOytceDFBWnRceDBDXHhBRVx4OTc8XHg4NjBceDE0XHhCOE9ceENFPVx4MTYrXHhFMVx4REZmWFx4MDRIXHg4Nlx4REQoIFx4Q0I/XHhEQ1x4QzZceEQyXHhCMVx4MTF9XHg5NylceEYxXHhENVx4ODhceEFGXHg4RVx4QTVceDBDXHhCOXB1RFx4REFoXHhBNXpBZlx4RTZ4XHhDMVx4QUJceERFXHhBRSQiXHg5M1QmXHgwNlx4QkZ+Q1x4RENOLlx4RkZceDg0XHg5NVx4OUZXJVx4OTQoMmZceDlDXlMzXHg5Rlx4RTRcLXRceEZDXHhDQVx4MURceERBXHg4MVx4RjVceEIyJFx4QjdceEM0XHhDRVx4RTY9XHg5MVx4QkVceDA1XHhDNmdceEQ0XHg4OGU3XHg4Q1x4MDJceERBXHhBRlx4MDNceDBCXHg4OFx4RUJceDk0XHhFOFx4RDZceEQ5XHhFMipceEZFXHgxN3FceEJFXHhFM1x4N0ZceDFCXHhBRUVceENBe1x4QzhceDBFXHg5RVx4Q0NceEUyXHhDMlx4RDRceDFEWVx4MEFceENFXHhBODBceEU3dUw2XHhEMT9ceERFXHg5Nlx4RDMqXHhCRlx4Qzk4XHgxRVx4RkVceDAzXHhEQmNZXHhBMlx4QjR5XHhCRS5ceEE3XHhGQlx4MEVceEQ2XHhERFB7aVx4QzglXHgxQyx1LSRceEQwXHhFQlx4MTdceDg0XHg5NVx4MDBceERFX1x4MDBceDE4XHg4OTxceEI0K2dceERGd1x4QTRUXHhGOVx4QkVceDk3LVx4MURceEE4XHhCN1x4QUFrelx4QkZceERGXHg5MjRceDk3Tlx4Q0UvXHgxOFx4QTFceDA1UVx4MUJceDAzXHhGNmZceDlBXHhCMl48XHhFQlx4N0ZceEM2XHgxRU8iXHhFQT1ceDgzXHhBRVx4OUJceDBDXHg5RjpceDk0XHg5RFx4MENceDhDXHgxMTpyS1x4MDFceEYwXHg4MnVuXHgxMltKXHg5Nlx4MUZceEQxXHhFNTFceEMxcnxceDkwXHhDOFx4QkVZaXN7M1x4ODg7XHhFMDMlXHgxRlx4OTNxXHg4MDpceEY1XHhBQW1CflFceEExXHhDN1FceDE3XHg4NFx4RTE+L1x4OENceEU2QVx4RThceDhEXHgxMVx4QUJceDBCIlx4REJceDkxOFx4ODVMXHgxNVdSXHhGOFx4OUNceEYxTlx4RUJEXHg4MkJceDlGXHg4OFx4QkUpXHg4NEg6flx4QUVceEE1TVx4MENceEYwXHhGQVpCXHhCMlx4RkVceDkzXHg5N1x4RkUmPVx4QkZceEQ1XHhBM1x4ODc0XHgxOVx4QTRgRFx4QTg6XHgxRlx4MDhceDA1XHhGNl9ceDlBXHhBQVx4Q0FceEU5XHhERVx4OUIrXHhFQVx4MTc5XHhFQ09ceEY4XHhBNVx4MDhceDAxXHg4Qlx4QUFceEJEXHgxN1x4OENceEE0XHhDOTxceEJEJUwnXHhCMVx4RkVceDA2LFx4QTVGVE1ceEY3MnJdXHg5MVx4QTNceDgyXHgxRVx4MEVceEVBXHg4Rlx4MEE9XHhBQVx4OUVFXHhGNj5ceDkxXHgwNVx4RTFceEE4SFx4MEZceEQ5UFx4MDVKPDQpXHgwRVx4QzJceEQyXHhGN1x4QUVpRlx4Q0RceDgyaVx4RDNceEE2XHg4QVx4MDdDXHg4MEpceEUzXHhCQlx4MTBceEVCSlx4RjZceERDXHg4QVx4QUZceEI2XHhEOStjRlx4RjRceEFCXHhBMFx4RUVXeVlceDkyPVx4ODlceEIwXHhCNlx4Q0FceDA5XHhFOFx4MDFceDlGXHhBMXZceEQwXHgwQlx4RDFceEU4TFtceDg5XHhGRVx4MEY4XHgwMFx4OEVceEFBXHhBNVx4ODRceDBCXHhCMSJceDEyN1cmXHgxMFx4MTlceDBGXHg4REZceERCS1x4QkRceEM0XHg4M1x4QTZ+XHg5MVx4RjJceEQyOlx4ODYwOi5ceEY5XHhBNDJceEVGXHhEOE1uXnRceDBGXHhCMEBceEEwXHhCM1x4OTVceDE0ZD5ceDFEXHg5Rlx4RjhceEI1XHg4Nlx4MTdceDBGXHg5N1BceDk0aVx4QTBceDE4XHg5Qlx4RTJceEI5XHg5OFx4QzlceEUwXHgwRFxceDAyXHhGQlx4ODFQKFx4RDVceDA4XHg4OVx4OUFoXHhCN0lceDhEKTVceDhFXHhCOFx4MTdJXHhFQlx4QTdceEY4XHhENDVceEIzXHgwOGpCXHhFRVx4RUZceDEyNXxceEVCXHhFOFx4RUFceEREVVx4Q0JGXHhFQlx4MEI/XHhFOFx4RDZceEQ3WVx4RENceEY4XHgxNlx4RDZHVVx4RDZceDg5OXxuJlx4MEZdXHhBQVx4RkIsLFx4RDBceDE4XHgwRUNdXHhBMFx4MEZceEU5XHhENSVceEIwSlx4MTRCXHhFNVx4QTNceDk4XHhCMFRceEE0XHgxM1x4QThJU1RceERDKVx4RDlIXHhENlx4OUJceEU3XHhBMlx4QzAoXHhBM1x4RDJAXHgwQlx4MEJceDhELlx4MERceEJFXHg4Q1lceDlFNlx4OUJceDE4XHgwMT5QXHg5ME5oXHgwRVx4QjhceEFCaVx4RURceENDXHgxNXVceEM3XHhCNFcpXHhGMnRpXHhEOVx4RjRceDE3XHg5QVx4OENceEE4Jlx4MEFkXHhCMlx4MEJRXHhGMmpYXHhGRD0rXHhGQ1x4MUFceEQ5XHgwN1g3XHgxMlx4RDZceEFFQ2VceDg1XHhBQ1x4Q0FxXHhEQy9ceDgyXHgxMFx4QjVceEVFQFx4OTNceEY5Jlx4OTExXHhDMlx4REV8Klx4RUEmdjhceENBXHhBOEpceEYxNUxceDlBXHhDQlx4QUI1XHhGMVx4MDV9XHhDOVx4MDMsIlx4MDN0X1x4RDZceEU0XHhFOFx4OTJceDA0XHhENXRceERDXHgwMVx4RTBceDg4WFx4QUQ9XHgwRlx4QjRceDg3VVx4OUQzM1RceDFBWyhceEIxXHhFRVx4QzRceENFXHhDOVx4OTFceDE3XHg4Qlx4RTAsTlx4OTEkWFx4RDJceEI2aFx4QkRSXHgwNVx4RDNYXHhGNlx4REZceDk4XHhEQVlceDgwXHhCQkRMR1x4RjdceDgyQ2VceEQyIDtceDk5XHgwOVx4OUVceEM0aE5ceEM2XHhERkFceDg4elx4RkZceEE1IVx4RUZceEMxXHhEMVx4RTBdXlx4MDctXHgxOEVceEE4XHhBQ1x4ODVceDE1XHhDOFx4OEFceEEwXHgwNFx4RjRceEYwNVx4RjZceEFDXHhBOFx4RjFceEFCXHg4Ni5jXHg3Rlx4OTdceDFEXHgxNFx4MThJXHhEMlx4OTVFVD1ceDE4XHhDOVx4MURqXHhCQStceDhFZD5ceERDXHgwMlx4OUE7XHgwQlx4QjJceDlCXHgxMjJceDFBR3pceEI2XHhEQVx4QTZabzVceEJCXHhCM3dceEEzXHg4MUpceEVDbFx4QkQxelx4OEZ9XHhGNlx4RTFzeVx4MUZceENCXHg5RUBceDEyQ1x4OTl2Qlx4Q0E9XHhERVx4MDMtXHgwNFx4OUNceDg1QFx4MEFceEE4flx4RDlceDhCXHhENVx4MDV8XHg4MVx4MURHZ1x4REVceDhCXHgwOCZceDlEXHgwM1x4QzFceDAyT1x4QkNuXHhBN0BceDkwXHhFRDFceEVCXHhGNVx4QThPLzxceEY1TjBceDA4MFx4QURceEEzXHg5QXZzNVx4QUVceDBGXHhBRFx4OUErIGYrMlx4OUV7XHgwOWg4Slx4MDMofDpceDkzXHgxQThceDFCXHhBRVx4MEFceDFCXHgwRnx3XHgwQkBceDBBXHhBMlx4RTFceDE3XHg5OWlceDdGXHhCQ1x4MDllXHhFQTppXHhEQzBceEJFMmVjXHhGOGhceEQ0XHg5NVx4QTclXHhGOHZceEE2XHhBM1x4Q0J+XHhCRVx4OUVnY1x4QkVceDhFXHhEMXEiR1x4RkZceEM0XHgxQlx4RjBceDA4XHhCMlx4QzRceEU3XHg4Q1x4Q0RlXHhGRVx4ODVceEQ3a1x4MDJceDdGXHg5RFx4RkRceEEySWFceDBFXHhDOFx4RDdceEZGXHgxRlx4RDdceERFXHhFN1x4MERceEE5XHhCRlx4QkVceDE5XHgxMlx4RTUtXHgwQVx4QTNwXHhFNFx4QzFceEI0XHhFMXZ0XHhDOVx4Q0ZceDg1XHhBMFx4REVzI1x4MDdceEExXHhBN3heM2ZceDBFXHhDM1x4OTNceEY2VnJbXHg4Qlx4QzIvUlBceEZCMVx4ODlxXHhEMFx4RTU3J1x4RTFceEEwXHg5M1x4RDJxXHhCNFx4MENAcFx4QkZaXHg5N1x4RUNceEUyXHg5MFx4MDNceEUwLFx4QjVceDgySEp6XHg5N1x4OUQ9LVFceDhDc1x4QjFceDBEelx4MTJceEU0PFx4OUVceEQ0XHgwOFx4MTNlLlx4MUJwXHgxRFx4RDclXHg4RFx4REFceDhCXHhCOTtceDEyYTIlXHg5N1BceEFGXHhFMlx4QkRceEU3XHhGRVx4QTVZXHg5MFx4RjNceDg2XHhERllceEQwWFx4ODJceEI4XHgwOUNraFx4RkFsXHhFNlx4OUNceDE4NClceEYzXHhFRFx4QThuPFx4QjM/XHgwOVx4QTBcXHhBNVx4ODdceEI2XHgxMydJXHhFQVx4Q0RefVx4MTBceEMzM1x4ODYrT1x4OEFceDhEXHhBRVx4MENyMW9ceDE3XHhERVx4OTFceEIzOmlzXHgwRVx4RDlceENFclx4QTZceDAwXHhBNDxgXlx4RDJceEIxXHgwQlx4QkNceENBXHg4OFx4MENceEM0XHgxQ1x4QkFceEQ0XHhERUlceEMwXHhCQXpceEIwXHhFMlx4Q0VceEZEd2A4XHgwM1x4MEMxXHg4NS1ceERFXHhCRUxjXHhCMVx4RDIkXHhBMlx4MDJceDgwXHhDQm5ceDExXHg5RmR7XHg5Rlx4REZceEFEXHg3Rlx4OTNrXHg4QVNPXHhBOTdceEU5fFx4Q0ZceEZCIFx4ODZceDhCcFx4QTVceENBXHhEMFx4RjlLcVx4QjZ7QVx4OEM2elx4MTZceDE2XHhBQlx4OTU0XHg5Nlx4QzBHXHhBQVx4OTRceEEwXHhCOWZceDE5XHhEQ1x4QjdceEUxUVx4RjlCXHgwN1x4RjhceDBBXHhDQzluXHgxNFx4MDVceEMxXHhCRj92XHhFMFx4REZwXHhCMihceEZFXHhGOUdceDkwXHhFRFRceDdGXHhDM1x4QkQrXHhFOXJceEMzXHhDMWxceDg3fHdceDAzXHhBNlhceDgxXHhBM1x4MEJceDk1XHhEMnlceENBXHgxRlx4ODRceEI4XHgxNnNENUxceEM2XFx4REZceEExXHhCQ1x4QTBceEM3YFx4OTJceDg3Tlx4MTMwOVx4QTglX1x4RDRlL1x4REU0XHhFRFpceDBGXHhGQlBfXHgwNVx4QkFceDlCXHgwNSNceEZFQj1QX1x4MDhdXHgwQVx4ODd7KWNceEZFXHhFOVx4RDhqXHg4RFx4QUZceEQwXHgwQ1x4OUFceEZBXHg5MVpceEU3XHg5OFNceDk5XHg5Nmp9PVx4OTNceEE3XHhGOFx4ODRubFx4RUJceEYwMzdMXHhBNFx4OUFceDk5K1x4MTBBXHhCOSBceEE3XHhEQlx4MTFceERFYzNceDlGT1x4ODFceEUxdlZceEYxXHhBMlx4MUY9dz0yXHgxRVx4QzRceEE4XHgwMERceEQxXHg4N1x4QUQlXHhBN1xceDBFJFx4RjVceDA1ZSBiM1x4RUFceEE0UFVceEY4XHhFRDhCT1x4QThceEZFXHhFNVx4OUZiZFx4QjNceDAyMlx4MUVeXHhDMUtceEVEXHhBOVx4MERJXHhBMFx4QzltXHhDMVx4OEElXHhGMlQxXHhBNlx4MEFceEM0PFx4RkFceEYxXHg4QSBPfl17XHhGQlx4QTFyXHhGQ1x4RERceDkxXHgwRlx4RDNceEMza04/XHg4MGRceEQ1XHhCOVBceEE0XHg5QkZGLnRceEI3XHg5Q1JceEI3XHhFM1x4ODJceDlCXHhENzE3XHhGM09ceDBCXHhEQVx4ODBceEQwVlx4ODBceEIweVx4MDh3XHhDOVBKLVx4REZJXHhFNm5ceEM4PVx4QjAmXHhENlx4OUZfXHhBNEdceEJBXHgwNlx4QTNDXHg4NHwqXHgxNGxceDhGLVx4QjVceDFEJFx4QTBceEUwTFx4MTBceDA4XHhGOVx4RUZceEIyXHg4NFx4OUZceDFDXHhDRVx4MEZwXHhDNSBceEY0XHhEN1x4MUJceEQ5XHhGOVx4OTBceDhDXHg5Nlx4RDZ3XkhiLHFZXHhBMC5cXHhBN1x4REI7XHhEOFx4RTBceEUzYHFceEM1Kip2PDolXHdceEZBXHgwQlx4Q0I+XHhDQ1x4RjhyXHhEMVx4MENceDE4XHhCNVx4MEZsXHgwMFx4RUZceDg2XHhCMGBceEQxL1x4QzFceDFCOlx4QTJceDg5XHhBM1x4REJceEFEXHhCRVx4MERRRSBceDlEeVx4QjVceEQwXHg4OFx4MDRceEU0XFBceEFCXHhEREtceEU1XHhDN1x4OEVceEIwXHgxQVx4QzljXHgxM1x4QzRceERBXHhGMFx4QUVceDhDWVx4RDZceEIxXHhGMVx4ODJceENCXHg5NF5sXHhFRFx4RDA+XHhDRVx4QkZceDFGXHgwMV0hLjBceDgwXHhGRD5ceDhENkZoXHhCM3VceDA3XHhCMyo8O1x4ODg2eUFceDg4XHgxRlx4QTQpW1x4RDNLXHhFMScpMVpceEEwd1x4MUNceDAzXHhEMlx4RDJUelx4MUYlXHhENFx4RjFceEVBXHhEOFx4QjZceERBVVx4QzVceDE2ZVx4MEZceEUxXHhCMFx4Q0FceEQ2J1x4QUFceEYzY1x4MURTP1x4QThceDE3XHhCMWFceEZGdi1ceEFFXHhDNFx4QjhceERFXHhDMVx4MENceDgxMlx4QjJceEE2XHg4Qlx4MDYxXVxceEU0dVx4MDJceEJBR1x4RTBaXHgwM2lceENDXHhGOVx4QURceDE2XHhDRSlceEY4clx4RjIpXHhGM1x4QTVGXHhDMypceEVDT1x4QUJceEY5N0RceEFGeVRceDAwXDNceEM1XHgxRFx4RERZXHg5QVx4QkVceEI0XHg5RVx4QUVceDAyXHg4MU4rQ3JceEJDXHhGQWshZlx4RTNceDg5XHhEMVx4ODRrXHgwQ1x4OENceEQ4XHhBRFx4QzdYXHhERFx4QTVceEEwXHhERGxceEU2O1x4RTlceDkwN1x4QjZceDkyYSpceDhCc1x4RTBceDk2XHhDNGtceEUwXHgxOFx4QjRceDBBJlx4Q0ZceDA1XHgwMktceEQ2Ylx4QzAlXHg4MFx4MEZceDhGXHhFMlx4Q0FceDlFXHhBMFx4RUZceEIxXHhFOH5ceDhDXFx4QUNceEI2XHg4RVx4RDVceDAwPVx4RDVceDFDXHhGMFx4MTFceERCXHhBQVx4QTFvWV9ceEQ0XHgwRVx4MUVceEJFXHgxQ1x4MTQxOlx4QTBceDBDaVQ4XHhGRSFceEUxVlx4RTNceERDXHhGQlMgXHg5N1x4RURvXHhGRSVceDFEXHhBNlx4RkJceEJDXHhDOFx4QTh+XHhGRFx4RUQnTCVceEUyWVx4Q0NyXHg5MDBceENEXHhFNFx4RjRceEI4XHg5NEFceDExXHgwQVtceDBCJlx4QzZOXHg4OVx4RTdceDE4Tlx4RTNceDkyXHhBQT5ceDlDXHhBMlx4ODhceDg3Xlx4QzJceERBXHhFQlx4QzEmXHhDNVx4QkJceDhFXHhBQ1FrXHgxOUhceEQwXHhDNCx8XHg5RGNceDEwS1x4MDdKcSFceDE2Ylx4RkJceEUzJDlceENGXHgxMkhgXHhEMUtrXHg5NEtceDdGcFx4QUYlXHhGNnE8XHg4Nlx4OEZxXHgxMVx4QzdceEY0XHhCQ1x4ODBceEJDbXdNXHhCQi81XHgwREF6XHhDNEdhXHhEQ1x4ODJKPFx4QTErXHhGRlx4MDhceDFEXHgwQ31ceEJCXHgwNyNceDhBP1x4RkE7XHhEN09ceDg5XHg5Qlx4QkRceEExXHgwOVgnXHhDRVx4OTRceDk3IVx4RjRceEExXHgwMWRceEY2LVx4RDdRXHhDQlx4ODJceEY5XHhENVx4MDJceDAzXHg4MWBceDBEXHhFNlx4MDdfaFx4RjA/XHgwOVx4MTlceDFDV1x4QUNmXHhDQU9ceDg4Ulx4QTdceDkyXlx4MDIjR1x4MTJZWlx4RjlceDhEXHhBM1x4RDQhXHhEMUtceEQ0XHg5NVx4QjN7XHhBQ2lceEU5XHhCMFx4RTg/Jk11XHhEOFx4QjRceDA1XHg5RFx4OUJceEU0WypmMFx4MDR8Ulx4ODh8XHgxMyVceENEXHgxNlx4OUZceEYzRVx4QURGXHg4RVx4RTdceDk5XHgwOFx4QjJceEMzXHg5QlhceEJFNlx4RERNXHhEQVx4MDJceEYzNFx4RUJceEQxXHhGRS1ceEY1XHgxOFx4N0ZceEY4XHhCOHxceDBFXHgxQnhceEUwWVx4OEFceEY4XHg4QipceEZEXHg4NFx4RURceEJCZlx4MUNceERCbSNceDhDMy5ceEU1N1x4QjlceEUxfFx4RERceEQyMVx4MER9XHgxMFx4RDljXHg4RVRceDhGXHgxN1x4MTNceDhBXFx4OTAnMFx4RUNceEQ3XHhFQVx4QjBceDhCXHhCQVFceDAwZFx4QzlceEE5XHg5MCgkOFx4ODItKlx4MUNceEMyXHg5RjhceEVFXHhCNFx4OTBceEM1XHg4MnNOXHhDNVpceDAwXHhDM1x4OTBceEFBdlx4RDRceDg3QDBkZlx4RThceDA3XHhCM1x4MDZceDBDclx4OUZceEM1XHhCN1x4RDVceDhGaFx4RDNceEI2U1x4RDU6XHhFRVx4QzFYKnVceEE3XHhEOFx4QTZceDgyJVx4OENceEQ0XHhGM1x4RUNceDExXHhGQVx4MTdHN2pceDkzXHhDQVx4OTFceEZFRllPXHgwNlx4RDVceDA0XHhGNFx4RjRceDA0XHg5RFx4RDFEXHhBQlRgR2QjXHgxOVx4QjREMlx4OUQpXHhEMlx4MENceDkxZlx4MUFceDgya1x4MDhceDhFXHhCM2FceEM3XHg5N1x4N0ZceDBEXHhCN1x4RUNsIVx4MTUoWVx4OTgsXHgxMlx4QjRceEE1d1x4QkJeXHhDRlx4MDZceEQ1XHgwRFx4RTBaXHhBQlx4QjNceDk4UVx4OTFceEQ1XHhDOVx4RUZceEY0XHhEOVx4RUVQXHg4NVx4REFceEQ0Pz1ceDlBV1x4MTB2XHg4NFx4QjJceEU3cVx4MERceEIwXHgwQlx4RTJceEJCXHg5OTZBXHhEOFZva1x4RkNceDEzXHhEOVx4MTNceEQ4XHhCOFx4RkJceEVEO1x4RDRlXHgxRlx4Q0VceEQxXHhBNFx4OENceDgyXHhCRWIkXHhEMFx4QTFceEIwXHgxNWslXHhERFx4OEJceDg0XHhCOVckXHhFQVx4RUFceEREXHhFMHYiXHg4NVx4QzJceDA1XHhCNE5ceDFEXHgwMVx4REVceEVCXHgxQ2BLXVx4QTlceEFCTFx4RjlceEYyXHhEM1x4QjRceEQ0XHhBM1x4RERceEQ4Vlx4REZkXHhFNFx4ODVceEM0Ylx4OEJceEIwXHhGOFFceDk1XHhEQyZceDE0XHg4RFx4QzA/XHgxNlx4RjItXHgwMlx4OTZYXHhDNFx4Q0FceDkxXHhBQ1x4QzdceDk2XHgxQ1BceDBCSFx4QjNdXHhBRVx4ODJ+XHhERVx4QjdceEUwXlx4OTZrXHg5RDhceDEwXHg4RFx4OERfXHg4N1x4OTdceEJDXHhGRlx4RjdnXHgwNlx4QTRceDlDXHg5QX5ceDBFXHgwQ1x4MDQ6JGhCXHhCRWJEXHgxNlx4N0ZceDBFXHhEM345d1x4RUZmXHhDRDpQXHhDM1x4MThGQmVceDg0XHhGMVx4QzhceDE4XHg4Qlx4OTZpXHhEOVx4QjdceDg4XHhDNVNceERFXHhEOFx4QTVceDA2UWhceEY1XHhEQ1x4QUIrXHg5MFx4MEJuakZceDlEa0BePFx4ODVceEJGQXlceEE0KVx4QTRceERCR1x4QjVceEY0XHhBNlx4MTleXHhGRV9ceDkwXHgxNFZ+XHg4Mlx4ODVceDBCd1x4RTZceEY3bFx4QzRceDgxXHhCNXxceEFCXHg5RDtceDhDPlx4MTNQXHg5NFx4QjBceEI1XHgwMk5ceDA0Plx4QTd+XHhCOTZceEUyXHhBQ1x4RUVceEMzXHgwN1VceDBGWVx4QUI0XHg4MVtceEUyXHhBMlx4RTJceEMyXHhGNVx4REEyXHhFOClceEJFelx4MDlceENGL1x4RTBgXHgxQVx4N0ZceDAwU0NRXHgwNFx4QTZceDBBXHhCMVx4OUR5XHg5Nlx4RjBzdlx4RjhEdlx4Q0NhXHhENlx4ODJceEI1XHhFN1x4QUZjPlx4RkI6LFx4MDdRQlx4RUFceEJGXHhDRVx4MEFceDBGXHhCRjl7XHg5MFx4QzNceDhCWlx4RURceEZEXHg5Qlx4QjBceDFBXHhCN1hceEY1OFx4ODhOXHhCMFx4QTNceEUzbFx4OUZjelx4OUNceDg3XHhFQlx4RUNceEJEcVx4RTBceDEyXHgxND0/XHg4M1x4QTAnI1x4QTdjR3JceDhBXHg5NGVceDlCXHhGNzdceEJEYFxceDhCeCRceEYxfFx4RURceDlGNm1ceERGT2dvXHgxNCtceDEyXHhCMlx4QUNceEIyXHhCMl5ceDg5eFx4MDM3XHg4NC5ceDhFXHgxMlx4REFceEZFXHhFM1x4QzU5XHhFOFx4RTkoJFx4Q0I+XHhFMlx4RUVceDFCXlx4RjBpdVx4RUJceERGXHg5MiNceDg5XHg4Q1x4RUZTXHgwQ0RceEU2XVx4QzZfXHhBRVx4QkJceEQ1XHgwQitceEFEXHg5Nlx4MEJceEYwXVx4Q0ZAXHg4REtceEVDXHg5NFx4RjdceDA2XHhFQlx4MEFceDlDXFx4QUNiXHg5Nlx4OThceDk5JVx4RjFceDBEUzR0XHhBRlx4RjdSXHhGNVx4QTJceDgwQ1x4RkMoXHgxN1NceDlBcFx4RTkqXHgxRiFceDFGWnc8REhceEI4RVx4QkMkXHgwM1x4OThyXHhCQTZceDhEXHhCMlx4MTQ/LFx4OUIkfSd6XHgwOFx4MTluXHg5Qlx4RDZceDkwU1x4MTFceEJCXHhBNVx4QzhgXHgxQlx4RjhceDA3XHg5N1x4RjErXHhGM1x4OThceEIwYFx4QkMwXHhDRVhceEM3XHhENVx4QjNceEEyXHg4Qlx4QzJceEYyXHhFRlx4QTNVXHg5MEFceDEwUVtuXHhBNChceEFDe1x4OEFsInVceDBCXHhENFx4RTdceDlBXHhBNVhceDgwXHhGOVx4QUZceERDLFx4REJceEY2Olx4QzY5XHhBMnxceEEzXHhCMVdXLlx4RTNceEMxXHg4RT5ceEQ2XHhFMCtceEFFXHhCQVx4ODlceEVCXHhDNFx4RkFMdzBceDBCTCB9XHhFNVx4ODdceDFEXHhERiVceEM2XHg4MS5ceDgzN1x4OTBrXHhGNX5ceEQ2XHgwQ1x4QzNTXHhCN3JceDEzXHg4RWNceEMxXHg4MFx4OTM5Z1x4ODdceEI1a1x4QzhceEIzXHhBOFx4Q0VceEJCaGJceEI0XHhBNmBceDE1dFx4MERceDlBXHhBMCFceEMxXHhBRlx4MUFceEExXHhBQ1x4QzlceDFFOFx4RUJceEU2XHhCOUNceEIyY1x4RjNKXHhFNVx4MURceEM2XHg4RHs8VVx4MThSM1x4MDAgVFx4RkVceEREXHg3Rlx4RkRceDE2XHhDQ0BceDgzXHhFM01dZVx4QkZceEZFTyJceDhFXHhCM0FceEREY1tceEExZ1x4RjEtXHhDQ1x4Q0VceEE5XHg4MVx4QzlBXHhDQ1x4RUR7XHhEN1x4QUFceDhFXHhEM3w7V1x4Q0VceEU0XHhFMnE+XHhDRFx4RjlceDk3W3BceDgwXHhGQlx4ODZoXHgwRURceEVCXHg4OVx4MEVceEFBXHhCRlx4MURceDdGR1x4RUVWT1VceEQwXHgwNik5PDIvV1x4RTlLXHhCQmhceEVGXHg5MEtCW1x4OERceDAxYkJGblBoXHhGMlx4QzdceDBBXHhGMlx4RjdceEU0XHhBRlx4QjhceEYwXHhCOFx4ODk6XHhBQ1x4OTVceEIyXHhFMjk1XHhCRFx4ODZceEU0bFx4RDdceDgwXHg4NmBceEU1XHg5Rlx4OUZceDBFXHhDMVx4Q0RceDEwXHgwMlx4QkY0Klx4RTNceEZBdVx4RUR1XHg4QVx4MUZceEM0eVx4RDd4XHhCOVRceEVFXHhCQkZceDFFXHhFRFx4ODgsXHhCOXZceDAyfTRUXHhERVx4OEFceEI3XHhEQ31ceEQ1XHhDMlx4RjdceEMxXHgxN1x4QzFceEJDXHhBQVx4N0ZfXHgxNVx4ODFceEYwXHhERGNceDg4Rlx4QkVceEU0XHg4Mlx4RjdceEYxXHhCQWtceEExOlx4QTd0XHhCNzVTN1x4Q0Y4XHgxODFpXHhCQXhceEVCXHhGN1x4RTlceERCcFx4ODdceEM4XHg4RVx4RURceEE0Mlx4MDMkXHg4NjpceEEwXHhBNlx4MUZceEY4cVx4OUNceEIxMXxceEY0ZkBceDA2NERceEI5SFx4Q0ZceERBKVx4RjA+K1x4QUMiXHgxQlx4RDlceDFBX1x4QUJceDFCXHg4QyhceEUzXHhERXYyTVx4RDl8L3FceERBXHhGNTJceENEXHhFQlRceDBCNlx4RTk7XHg4RF9ceDBFPWA1XHg4Rlx4RDJyXHgwMVx4MUNceEJBXHhEM1x4QTNceDE5XHhGQShceDAxUVx4QzlceEU4Rlx4REZAdlx4QzZceDA3XHhGRFx4MURoejdceDhBXHhFRmNceEQ4XHg4Mlx4QTYkRFx4RkNVXHg5NFx4MTJceDBCXHgxQlx4RTBUXiRceDgwfjFceEEyXHgxRk9ceDA5XHhFQSMiXHgxMlFceEY3bFx4REZceENCXHhFNSBceEEzdixceDhCXHgxNGpceEFGXHg4RTBceEMxXHg5OFx4OTBceEFFVFx4OTJceDlEXHhDMFx4OTZceEI2XHhERWUhMFx4RUVceEFFXHhFRl1ceEY0JFx4RTRRXHhBQlx4QTB9XHhFQ2ZceEE5XHhDN0FceDkzM1x4OUV3XHhFM1x4MTFceEQxXHhGNlx4QjVceDAyTVx4QjRYXHhENGNceDAzXHg4REFceDAyXHhCRVx4OEJceEU0XHg4Rlx4RTdceEJBXHhFNGJceEUwfFx4QzJiQEFceENEe1x4MDlceEY3XHg5RENceERFXHhFOVx4RkInXHg5Rlx4QkJceEIyXHgwRFx4RDJceDA0flx4MTRceEJGXHhDNVx4RDhceDBGXHhFRFx4MERceDEwRzVrPFx4ODRGVlx4QzZceEY3XHhBRX5ceEY5Rlx4QzJceDAyXHhCNi5ceEVFVVx4QkVceDkwXHhCQlx4OUVyXHhCQVx4MUJceDg4c1x4QUQsXHhCQVx4RTVceEEzT1x4QUJceEUzaFx4MTBceDlEXHhFODdceDE5XHgxRTxceEE1XHhERFx4OTVceEFDeFx4OEZQXHhFQWw+XHhERk9ceEYyXHgxRVx4REFFXHgxQ3FceDE5XHgwNWdFRFx4MTlceEIzXHgwMVx4RUV9XHhEM1x4RDJceDlGdFNceEFFOFx4RTlceDE4Ylx4MDlceDhEXHgwOFx4QkRceDBFXHgwN10qXHgwMyNceERBXHgwRFx4QzZEXHg4Q2BNa1x4QThceEEwXHhCRn5gXHhCNXtPXHg5QXlceEM1XHhDMVx4MDdceEJCPVx4RUVNXHgwM1JceDAxPDVceEY5XHgxOExWXHhBN1x4QzBceDg0XHhBMEBceENCN1x4MTVHXHhEMlx4RjRxXHhBRFx4OTdceEIxXHhDNFx4QUZqXHhEN1x4RTRceDA0XHg4MFx4RUJceEJBUnFceEU4SVx4MUZceDk4PyRceDBFXHhFRFx4ODc3XHgxRExceEYwXHhCMChCXHhENlx4MEFceERCXHg4QlFceERBaFx4Q0ZceDkzXHg5OFx4OUFMXHhCM1x4RjN3XHgwMVx4QzdceDAzVGRIVFx4RTFAXHg4NFx4MEJaXHg5MmNjXHhCOFx4MDNceDg2WFx4Q0JBYktceEQ0Ylx4MEFceDhBXHhGOWJceEREXHhBM1x4QUVceEUwXHg5MFx4MTVQKS1JXHhEQUhceEM1OFx4QThfXHhFQUNceENBXHhGOE5ceDg2LFx4OTJceEZFalx4Q0NceEQ5XHhEQVx4RENFTFx4RTAgXHhDMm8pXHhDNVRceENDNWZceEQxNVx4OERceDhDXHg4NVx4RTRkXHgwQVx4MTNceDBBXHg4MFx4OTNceEFBRnVceENFXHhCNlx4MDFceDFFXHhBOFx4MDdceEQ0KVx4QThEXHgxMVx4MUVrKlx4RDVceEI3XHg5NVx4MUE4XHhEMFx4MEFceDlGXHhDMVtceDk4XHgxOD1ceDg2XHhENFVceDg0XHhEMFx4RDEoJSR7NVx4QURBXHhEQVx4MDdceERFW1x4RjduXHg4OFx4QUVceEMzXHhGMTlceEY4aFx4MDNceEUzXHhEOW1ceEIyZyxwWVx4QUNceEIwXHgxNFx4OUNceEIwXHhDOFx4RDRceDBFXHhCRVx4QzY6JUBceDlEaDRceDhEXHg4NWFceEY3XHhDQVx4MTdceDkwJVx4OUZyMVx4MUFceEEzYFx4RTNceDAxLVx4RjVceEY5Mlx4MDlceDFEXHhBQVx4QzZceDFDR1x4QjFceDk2XHhCNlx4OEZWXHhFRjd+XHhFNVx4QkNOOyNceEFGXHhDMyotXHg4Q1x4RTBceDAxfFx4MTNceEZEXHhDMihceDhEXHhDN1x4QjhceEUzXHhGRFx4MDYqXHgwQ19DXHhCOGlceEI1XHhENEBHYVx4QzBceDk3XHhGMSJ6Zlx4Q0Z3QWJceERFcFx4QkJceEY1XHgwQlx4QUNceEM4XHhEMVx4REVceDBEXlx4QzJ4QkZceEFCXHhERlx4Q0JceDhBPFx4ODQ9XHg5RC5ceDgyTy5ceDkxKkBceDE1XVx4ODNceDExXHhBRFx4RURRXHhFN1x4QzZaXHhFQSJyJ1x4MENceDBGXHhDNkJceDBBXHg4Nlx4QjNxXHgxRlx4QTFceEM4XHgxRVx4OTBceDkxXHhFMFx4RUZzXHg4Q1x4OUVceDE5NEhceDEzXHhGQW9ceEYxbFx4Q0JceENDJiZceEExQHVqXHgxQ1x4RDBzXHhCRSNceDlCXHg5RXpCXHg4Qlx4RTZceDhEXHhGMVx4ODUoXHgwMlx4RDZceDkyWVx4OTRUXHgxQVx4RUNceDE0XHhFMT57XHhCNktucFx4QThceENFKVx4RTBceEZDXHhCOFx4MDJceEU4XHg4Qlx4RUFceDE0XHhDRlx4OTdcXnVceDAxYFx4OTFiXHhCMFx4QkZceENFXHg4Q1x4QTVceDlCalx4ODRceEFDXHgxNlg/XHhFM1x4RjJceEE1XHg5Rlx4RUVceEJGYVx4QkJceEIwXHg3Rlx4ODJceDAxVlx4RUJceEEwaWIzXHhGN1x4OEV8X0pRP1x4RjZzXHgwM1x4QzlpXHhBMVx4RUNceDgzWFx4RTQuXHhFQVx4QUFJXHhERnRceDkyYFx4RUM7RVx4MTEiJ1x4OTBceEUyXHg5Rlx4MUVRXHgxMlx4QzRceEFCX1x4RUNAXHhFRlx4ODlSZ0lzXHgxQiE6VFBceEFGXHgwQWtceEVDXHgwODxceEM1XHgxQlx4MDJceEY3PD9ceEMyXHhDMlx4REFceEVDXHhEMFx4QzBceEMyXlx4MDdbT1crU11ceDk2XHhERVx4MDlceEM2XHg4RTg/elx4OUFceEZEUilNZFtceDE0VFx4QjVceDA1XHhDQmMpKlx4MDNceEM3bVx4QUJceEREXHgwMHpceEE4XHg5MzBceEIzXHhCQlx4MTIhZiUlXHg5MFx4OTBkXHgxQVx4RDhceERBXHhCMVx4RUQ2QVx4MERceEM0R1x4QjlKL1x4MTZyXHg4Q1x4RDVceDgxIj5ceEVBXHhEQyxceDgyQ1x4QTk9SkUnalx4RDR2XHgxMlx4MDBceEY2XHhFQ1RceEZEXHhDOFx4QkIrKyhMXHhCMGNceDA5XHhFN3JceERBXHhCQ1x4MTIgXHhDQVZceDg0XHhDQytceDg0X3BceEE3XHg4NG1ceEY3XHhENlx4QzRceEM2XHhFQWZceDE1XHhGMFx4RTZ8XHg5Mlx4OENceEVFXHgxRFx4RDJceEMyTyZceDhBd1x4OTVceEY4XHhBN1x4QkRceEIzYFx4QUZceDAzXHhBQzwkXHhDMlx4QTNceEJCO1x4MTBceDhGR1x4QkJceEVBXHgxM1x4QTRceEY5XHhGOFx4OURceDEyXHhGRCdceEY4XHhEMVx4RDVceDFBaGNYXHhCRFx4OEI8XHhFOVx4RkZceEQzJ1x4RjdceDA2XHhEOVx4RTNceDk0RFx4QThrXHg4NVx4RjZceDkxQlx4QTNceDA5fCRceDEwMzNceEY5XHhBRFx4OUZceERDXHg5MVx4RTlceEU5XHgwNlx4Q0NceDFDXHgxMlx4MEZzXHg4MjNceDdGb1x4QTNceEM0XHhGMlx4QThceEU2XHg5M1x4MDNrMnlceEMxUVoiJVx4QTBbXHhBMVx4QzZceEQ1XHhFQjtceEQ3VFx4RjJceDhBPlx4MDdceEM2XHhDMlx4MUZceDA5XHg5MVx4QjZceEZDNFx4RUFceDEwUHVceEIzXHhBMVx4OTUuXHhFOHpceEREXHhEQlx4ODlceDAzXHgwRlx4OEFceDBEXHhFMzlceEYyc1x4RTVzTlx4RUVuaFx4MTZceDdGVlx4QUFLaGUkXHhFM1x4OURceDBBXHg5My9ceDlEXHhEOFx4Q0FceDhBXHhGOVx4RjM2XHhBMWNceDhEaUFceEY5XHhBRXRceEE2XHhBN1x4QjNceEFDeFx4RURceEZBXHhCNCVceEI5XHhEOW5UfmpNXHhDNDtceEJCP1x4OURceEMzXHhFQ1x4Q0NceDgzXHhDNVx4QzAoXHgxRSw7Plx4QTN9e19ceEREXHgwOFx4Q0EkP2BceENCXHhFMFx4OEI6Q1x4QzdBZlFceEY2XHhFRGskXHhGNT5WXHgxNzpvOFx4ODh9IVx4RjBceEJGXHg5RVx4OUVCXHhERlx4RENceEVEaVx4MThyXHg4MyFsXHhGQVx4OUNceEUyXHg5OVx4OEFceEFBRlx4N0ZceEVEXHgwMlx4OTV5XHhFOVx4MDJ5Z1x4MTUpKG9ceEE1M1x4RDRqXHgwRUh1V1x4RTBceDkwOVFSXHhGNVx4QUEyXHhGQktceEYyQ1x4ODFceEYxXHg4RVx4QTFceDgyezN3XHg5Q1x4OUZ2XHg5RFgxXHgxMCdceEMyWlx4QTRceDA3J1x4OUF+azFceEVGXHg5NFx4RDQuXHgxRlx4RThceDhBXHg5MjxceDBDTFx4RDZLNVx4QkFceEREXHhDQVx4MDZceEU0XHhCQlx4REFceEEyWVNceEIwXHhFQ1BceDBDWlx4MDJ6alx4REVceDk5XHhDOWtdZVx4OUZceDk2XHg5NFx4RDJ9XHhCQlx4QzNjXHhBMlZceEEzblx4RDF6QSR5XHhGMiZceDgyXHhDMlx4OTVceEI0IFBceEM2XHhDMFx4MDlceEEzXHhERFx4RDQuTlx4MTdceEU3VixceDg5LFx4OTEzXHhCQVx4RjZceDA2fGJceEY2XHg5RHkiXHgxN1ZceEJBXHg4RFx4MUI6XHhBMVx4ODJceDA4M1x4MTRceDE1IVx4RjFsMW14alx4OUVceEY1KHxxWjVceDk5XHhFNklceEU2XHhCNDpceENBXHhFNFx4QzVceDA0XHgwM1x4QTZceDBFXHhDRjZJXHgxRFx4ODhzP1x4QkJceDE4XHgwQVx4MUZceEYzXHhEQVx4RjBceDg0XHgwMVx4MTNceEVFXHgxMVx4RjhceDlCXHgxQ1x4RjNdXHhFNkBceENCWVx4Q0RlXHhDRlx4RTBRRlx4OTRceEExXHgwQ1x4RUNyXHg5Q1x4OTBceEY5XHhENlx4OEMkXHg5Rlx4RkRceEU1XHhGMVx4RURceDEyXHhFMVx4QkM/XHg4NnBceEE2SVx4REZceEIyXHhGRllceEFEQFx4QTFceEU1Mlx4MUJfXHg4MVx4RUNceDBGc1x4Q0VceEMzSlx4RTNceDhDXHgwN1x4N0ZceDhDXHgxNVx4QThceEE3XHhBNmVceEQ1XHgxOE5ceEU3XHhDM1x4OTB1XHhCNVx4MDl7XHhDQlx4ODFceEY5XVx4QTB5e1x4QkIvXHhDMVx4ODQgXHg4NVx4QkVceEVGXHhDOVx4MUNceEQyXHhFRlx4QURdXHhBMlx4MEZceEExXHg4NVx4MDc0XHhCRk5ceEMyR1x4RDNceEQxIDhCXHhENHJceEVBXHhEMUVOXHhFNFx4OTdceEZCLFx4MDlceEFFXHgwQUVceEYwNVx4MDZ8XHhFMlx4MENGXHg4OX1ceDEwbVx4MDNceDlEXHhBRiZceDBDcVx4OUZiXHhGQlx4RjRceDFEXHhDQiRtXHhCODtSXUN2XHgxNlx4RkVceDlFa1x4OEJgXHhBRGFceDkzXHhFNlx4ODBceEZBXHgwOFx4RUV0M0tKNlx4OThceEJBJ1x4ODBceEVCZD5aXHhCRFx4QzUxZVx4QjJceDE3O1x4MTl6XHhBQ1x4RUIhXHhGQjpceEY3XHhCN1x4REZUXHhDMTxceEQ1XHhFRENceDA4JCltXHhCQ2IuXHhCOS5ceEZGXHhFOFx4RjRceEFGXHhDNFx4QjVWbFx4QzZceEJFXHgwNG1ceDBBelx4RTFceDAxS09ceEZBXHhBQlx4REQmXHhGRCJceDlCXHhEOUhceDhBXHgwMlx4N0ZceEUxXHhDMlx4MDFceEE0Y1x4QUFceEU4O1x4RkEpXHgwNVx4RjYiXHhGRVx4REF1XHg4MSgzS05ceDk1XHg4RjZceDEyXHgxNFx4RjVQXHgwM3kwYVx4OENceEEwXHhDQTFceEZBQVx4MENceEU2XHg4QVx4ODdceDkwXHhCQVx4RjRceEQzXHg4QVx4MTVceEIwSFx4Q0NceDlBXHhBNVx4QkUjJVx4RERceDExXHgwRm9IX2ZqXHhCNXxceEUxXHhGQ1x4MDFceEYzU1x4QzMrJlx4RTZceDE5XHhBQyRceDkwXHhFOFx4RTFceEREXHgxMlx4QjRceERBXHgxNEhNXHhBM2QoZ1x4RkFceEJCXHhCMlx4ODlceDk1XHgxMlx4RDRceDhCXHhDRVx4RUNceDkzaClDKVx4Qzc4TDFdTFx4QzNFZVx4ODlceEQ1XHg5Q1x4QjZceEY5XHhDMmRIO1x4QTQ2JlVceEU0XHhCNH1ceEZCQlx4RDZyOSZceDlGXHhBQlx4OTFceDFBXHgwQUdceDBCXHhEN2dceDE5XHhFMFx4QkE1QGojTFx4MTZceEVGXHg5OFx4QTZceDhEc1x4OUJceDk3XHg5Nlx4QkRceEM0XHhERFx4RDk3JjJceDA3cFx4RkVceDhBXHhCNVx4MDBBXHhCRixceEE1XHgwMVx4MUJceDlCXHhBM1x4RkNMcThceEU0XHhDRFx4QjI9LFx4MTVceERDXHg5OGNceDk4XHgxMkxIXHhGMSBceDFFXHhGM3VceDFBaVx4MUNYUVx4RTI1XHhDQlx4MTRceEJFXHgwQzRceENGXHhCMVx4RURceDA4PFx4RUUwXHhDQ1x4QzFceDBEK1x4QUZceDAxXHhBMFBceDhEXHg4NztceDhBYlx4QzBdaFx4ODJceDAzXHhFOFx4MEVceEI2MV9ceDg3XHhCOENlSlx4QzlceEUxUCpceEREZVx4MEZceEFCXHhGQ1x4QkRceDEyXHgxN1x4RERceEUxXHg5OFx4RTQ+XHg5MVx4QkZceEIwUFx4MEVceDlCR1x4QkZceDE3XHhDNlx4RjlceEYwXHhEOFx4QzQrXHgxNVx4MURceDAzdWxceEREVF9ceDBGI1x4OTFceDE1Wk9ceDhEXHhFRlx4QzgsRFx4RDZceDE5ID5MXHhDMVx4QzhceDBBS1x4RDh3JTdceDA3Jlx4QUNceENCI1x4OTFceEQ3XHgwRFx4QTkzXHhGRXBceEEzWGdceEM2XHgxMk9ceDlGXHhCOVx4RjhuKVx4Q0JceDA3LVx4MUFceEZFXHhEMWB+XHhCREtCXHhDNlx4MUZceEFGXHhBOVx4MTBPQUxceEQ1MFx4RkFvXHhEQlx4QTlceDA2XHg4N1x4MDJTTG0iXHhCMlx4RDJceEVEOEJceDFFNG9ceEMxXHhBM2NceEQza0JceDhDXHhDN3JceDgyJVx4RjBceEY0XHhDNlx4MDFceDkyXHg5OVx4REY8bVx4RUM4XHg4RUVceEU2XHhEN1x4MUZceDE3bmhceDhBXHhDRTdmXHgxNlx4MTdceEUzXHgxMGdceDgzXHhCQ1x4Q0JceEE2XHgxQTxceDBGXHgxNTc+XHhBQ1x4MDhceDg3XHhDQSRceDFBXHhCNFx4MTBceEJFXHhCRFx4QkU4O1x4MURDdVx4RkNceEJGL1x4OENceEQyXHhDRFx4RjFceDgyXHhBRFx4ODheOVx4MDV8XHhBRHxceEQwWFx4RkVceDhDOlx4MTN4Llx4QTRceEYyXHhFNmJceDg3XHg3Rlx4QTlceEM5Yy0pXHhFNUZmXHhENFx4MTVxXHhDNzBJelx4OTRHXHhCRFx4ODRoXHhBNVx4RjRceEVBKVAuXHg5QTR2XHg4QVx4MUZmSFx4RTBceEFEcVx4RTJceEE4XHhBQ1x4QTRHblx4OTBceEU1XHhFQVJjXHg5OCdceEFDVFx4ODZceEM3XHg4QWZceEMxVVx4Q0IjLz1ceDkxPVx4ODBceDE1XHg5QVx4ODBceDE0XHhFMS5KXHg5OHRceDk1OFx4RkU5XHhDNlp+KVx4RkFceDlFXHhBQXBceERBJ1x4MDRceEFGXHhGRlx4QkF9NFdceEZDXHhERlx4OENceEJEXHg5NFx4OTBceEVCJ1x4RUFceEM3XHhGRl1ceENFXHhBN21vXHgxRmpceEY4b1x4MTZeXHhBMVx4ODlmXHgwOFx4QkZceERFSjZceEM3XHg4N1x4RERceEYyXHhEQ1x4MDU5Ilx4MDVceEFCV1x4MUVceEM3XHg4NGdceEE2XHhEMFx4MTBceDEzXHhBRDF3RVx4RjBceEE4XHhBNVx4QTRceDA0XHg4NmJceEI0Q1x4RjRceEUwQ1x4MEFpXHhEMVx4Q0VceEU1XHhBNFx4OUZceEU0XHhFNlx4QzBceDhETW51XHg4QVx4QkJWXHhCN1x4MTdceDA1XHhGRVx4MUZceEUzIlx4OTQjXHhCQ01ceDkwUFx4QUFceEY3c1x4RTRceEVES0ZCXHg5M1x4RTRceEQ5XHgwRFx4QkFceDgwdiBdQ1VceDk0SVx4MDdIPWdqXHgwQlx4QURceDAzXVx4MDA0XHgwOVx4QTQiXHg4OFx4QzZceEI4XHhCQlx4OTBceEYxMzlceDkwRDJbOlx4ODBceEY4JVx4MTRmTVx4RDl+XHhFRFx4QzRceERDXHhDOVx4QjdceEEwPFx4OUJ+XFx4RTYkXHg4N1x4QjRceEQ5XHgwNGhceEFCXHhGQ1x4OTlceEFBSlx4RDBceEYzXHhENVx4Q0RceDE1XHhGMHRceEIwfVx4RTFceEMxXHhDMlx4MENceEM4WVx4QzlMXHg4OCJceDExNVx4MTRceDlEXHhFRlx4QUR8XHhGNlx4QjBceDBFXHg4NCZceEUyY1x4MDVceDA0XHhEN1x4MTFceEI0XHgwQ1tceDg4IFx4MTVceEI1XHhCNlx4MUFceDk3XHhGQlx4MDFceEVDXHgxRlx4MURceDgzSV1ceEFGbiVceEQwXHhBNVx4OThAXHhBQVx4QzlceDEwXHhCNVx4MUFceEQxXHgwN1x4QkRceDdGTlx4RUFceEI3XHhBNTRceEExdFx4REROMWJceDhCXHhCQitceDA2fU95XHhGOFx4Qjh1XzpceDk4XHgwMlx4QTFceDBCP1x4OTlceEQ2clx4MTlceERDXHg5OFx4QTJceDk1XHg5Q1x4RTJceEYwXHhFQVBceEJFSlx4RUVceDhCXHhFOVx4RjF4XHhCQ1x4QTBpXHhGRFx4MEIwXHgxMzFDXHhFMGNceDgwXHhCMVx4Q0VceDlGQS1EXHgwRlx4OEFceDhCXHg5NVx4RkJceEU3XHg4MXVceDA5XHhDN1x4MTJceERGXHg5OVx4RkNceEY3XHhDQiB7XHhEOVtceDEzLXdceDlFXHhCRFx4MUNceEJGXHhDMlx4MDd2XHhCRF1ceDg1XHhERmVceDlEXHhFQ1x4RENceEQ1XHhCNnZceENFNy9ceDk4XHhEQVx4OTVceEU0XHhEOHJVRVxAPVx4ODJ+XHhCQVx4MERceEE4XHhBMCxceERCbjRceEQyXHhDRnpceDg2XHhFMTZceEYwXHhDQVx4MDlceEM4JVx4RTYrQlx4MTVceEJFXHgwNHhceEZDL1lmXHhBQlx4OEFceDg5XHgwOVx4QzdceDBFXHhEQitceEJGZ1x4Rjc3MFx4Q0I4XHgwMFx4RThceDhFXHg4Rlx4RjNceEVGXHgxQVx4QkI5WFx4RTVJPVx4RUJceERGP3olXHhERlx4RDBceEM2e0ZceDkyJEtYSkk2XHhEOVx4QTdceDgzXHhEN1ptXHhDRFx4RTRceDk4XHhGNlx4Q0VVXHhCN1x4RjYoXHg5MjRceEUwNCpceDE4KXpceDg2dVx4RDdceDkzXHgwQVx4RDdbe1x4ODBceEMyXHhCQVx4ODVVbktceENFXVx4RUJCXHhFNFx4OTJoU1x4QkNUYFx4RUNceDAyNFx4OERceDg3XHhGRVx4RUJceDk1XHhBNVx4MTZceDg3XHg4OVx4RTlceDgyXHg5MVx4OEZWXHhCRFx4MTBrQlNceDFGXHhEN1x4QUN3XHhFRlx4RDggXHgwNFZceENGXHhCOVx4ODZceEUwXHhFQ0hRZkxceENEXHhBMlx4QzJceEIyPlx4REJceDlGXHhFMFx4RUJZWlx4QkNceEQ2XHgxQlFceERGXHhBOFx4MTR1dFx4QjFceDBCZWYwXHgxN1x4QTNceDgyXHg5RFx4MTVlXHhGNDpceEZFbVx4QzJFQ1x4Q0FceERFXHhEOXlceDgwdTRceENCXHgwNkFceEM0XHVceEVGXHgxNmRceEY5XHgwMmVBR1x4OTBceDE0XHgxMVx4OUVceEZCXHgwNEZvJFx4MUY/XG9ceDE1XHhCMVx4RjhceEIwXHg5NWpYXHhBN1x4RTlceDg1XHhGOFx4RjdceEM2XHhBMz9OXHgwMEFDZVx4ODdceEFELVx4RUZceDg2aFx4QjhceDBBZ1x4OTYiXHhEQlx4RjRceDhCWlx4QkE0XHhFNVx4MEFceDFBIlx4RDh7Nlx4ODJceEUxNTVceEUzXHg4QVx4REFceDFEUHlHXHhEQzdceEFBbStceDExXHhEMVx4Q0ZbXHgxNFx4MDMqXHg4REpceDhDXHhDOFx4RThceDg4NFx4MDA4XHg5QTxceEQ4XHg5N1x4OTJCXHgxMDRceDhCXHhBNnZceEU2XCJcXHhBRFx4RTZceEMycEFceEE0XHgwOXJyYVx4OTNceEU5XHg5NFx4N0ZceDhBaFx4MUJceEVDVF1ceDAxXHhENFx4QzVpTFx4MUVceDhCbjUzPVx4QzBceEJDP1x4RkFceEYwXHhBMVx4MTVceDAzL1x4QzdceEIyXHg5Mlx4Q0NceEZCXHgwQ18oXHgxQ1x4MDdceEQwXHg4MntceDhEIVx4ODFceEU4YSFrXHg5Q1x4QUU5XFx4ODJceDg3UVx4QUZceEM0XHgwNkhceDg5NV5ceDA2XHhCRkNceEI5TUJUXHhGRlx4RDdceEU5XHhDRWpceDk5Z1x4RTlceDk2XHg4OCFceDlEdFx4QUFceERFdnZiIlx4QkNceDg0XHhBNlx4REZceEVBXHgwN1x4Q0V1TSZceDgxXHg5Nk9eXHg5N1x4ODNceEMyXHgwMiNceEQ4XHgwQlx4QzRceDgwQFx4QThNXHhGOVx4OThMXHhCNFx4MENceDhEXHhERjNceERDXHhBMVx4OTRceEQyXHhBRVx4MTVceEFDXHgxQT9ceDgxSnxceEMyXHgwRCw3XHhFQTlceEM4Mlx4RjFceDgwXHhCRFx4RTBceEUwXHg4NVx4RTlceEJGXHhGMlx4QzJceDE2XHhCNSFceEZCLVx4QjlceENGXHhDQmVceEIzWlx4Qzk1Tlx4MENceDlGXHhFM1JceENDckBceDg2Y0ZceENEL1x4RUZceDlGK1x4OTFceEZDXHhGQylceEFBXHg5QkxceEU4XHgwMz1ceEY2XHhGRVx4RjZceEJDXHhERVx4RDldXHhBRUNceEVDXHhGOFx4RENceDg5JVJceDg2XHhDRn1ceEY1XHgwQVx4ODhxZVx4RDRceEJEXHg4N1x4MEZceEU5d1x4QjhceEYyaFx4RENceDkxXHgxMlx4RTRoXHhCMzJceEU2XHhBOWNQXHhFMVx4MTlceEJGKlx4QUNceEY2NVx4QjdceEU5eyFceDhEalx4QzYyPlx4OUFceEY5Ulx4QkZceEE0XHhGN1x4RjRceDFGYyVjXHhFQnVceERFXHgwQVx4RjlceEQ2XHg5M35iSlx4ODJceDhGXHgxOFx4OTdceDlDXHhBOFx4RERxXHgxQVx4Q0FceENDXHhCNFx4RDNceEEwXHhDN1x4QTlceENCMXJeXHgxNlx4Q0IoXHgxRlx4MTl6PGhRXHhDOFx4MEN7XHgwNVx4OTNceEJGXHhGNFx4ODRceEFDXHhBMFx4REZceDE0XHhERFx4QjIuSFx4RjdceDA4XHgxM09ceENFXHgwQlx4MEZceDAxM1x4QjUvXHg5OVFceEEwe3dceERDaH1QX1x4RTMzMGl2cVx4OENceEZEXHg4NXVjXHg5Q1x4MTNceEUyXHhFM1x4QUFceDEwRDxceDBFXHg4M1x4RjBceDkxXHhGOXVceEE1XHhBOFx4MDlceDhCMXFceDFFcVwwdVx4QTYkXHgwOEJkXHhFQlZiRVx4RkNceERGdlx4QkJceERGXHhDRTxceEI4NSdceEMzRFx4QjFceDg3XHg5M1x4RjVceDlGQ2pceDhEXHhDQjRmXHhDN1x4QkRceDAzKiRjXHhBM2NpXHhBN1x4QTVceEZEXHg5Q1RceERFXHhFMXtceEQyeXxceEYzXHgxRVx4MEFceEY3XHhENXBceDkyXHg4Mlx4MUFceEFGXHhFMFx4MEZ7QkRceDE2XHhBRVx4QTdceDEzKlx4RDJceDBGTFx4Q0VceEIxLm0pJiBceEM0XHhDOWZceDlFXHg5QXZceEM2clx4QzdceEY2XHhENVx4OENceEYxVjpceDdGPFx4QzdceEY3XHhGMlx4ODZceENBXHhBMlx4QzZceEQ3XHhGRihceDhBaVx4OTdCfVx4ODZceEQ1XHhFMVx4OTdceDBCXHgxOEdceDE4LFx4QTVceDkyXHhCQVx4QjVceEQyXHhEMFx4ODNceDgxXHg5M1x4RjZ3XHg4Qlx4QkZCPlx4MDNceDE0XHg4RFx4OTlceDBCXHhCQVx4OEVceENBXHhDMylceEQ3XHhBNVl+XHg5Q1x4RjdceEI5MVx4MEVceEUzXHhEMlx4QjY1IE9IXHgwMVx4RDhceEM4XHg4Q1x4RTdRXHg5NzpeI1x4ODRZXHhDMFx4RUJNXHhDNFx4RkZceDE2PklmS3tWXHhFM1x4ODlcXHhCRlx4RTRuXHgxQ1x4RTZceDg2XHhBRjp1XHhCNlx4QkFTd1x4MTNceEZGXHhGQX5nSiJceEI4fmxceDkxXHhFNFx4MDlwe1x4QUYkfTpceDE5XHhCN0hAXHhBQlx4QjNceDA4O1x4Q0U/XHg5QWdsXHhFNlx4OUNceEREXHhFQ1x4QjFVXHhENlx4RURceDhGXHhERn1ceEYxXHgwMWlHXHhFND1pXHhERlx4ODBceDgxXHhDRFx4QTVceDFFXHg5QVx4RTVcXHhCOVx4RkNceEYzeVx4Q0JceEMzfH1ceEUyLlx4RkNceDEzXHhENVx4QzBceEQ5XHg4MVx4QjM9XFx4RkVQXHhEM0hPXHgxMWpceEUwXHg5MFx4MENceEJBXHhCOVx4MTZPXHgwNzBCXHhBRjhceEIzXHhGRURceEYzNCZceDE5XHhGQXhCK1x4RkZceDEzXHhGMlx4OTB6XHhFOHV9XHhGRFx4QTlyXHhBN0tceEVFPFx4ODR8XHg5Q1x4QjBfO2xceDk2XHg4N1x4QTd2XHg5NVx4QUFceEIxXHgwRi5ceEM5XHgxMXxceEQ3XHg4Q1BvXHhDRFx4QURceDg4XHgxM1x4Q0U+XHg4OV9MVFx4RDZceEU2XHhBNkI8ZFx4MTlceEVEXHgxOUBceEQ0XHhBRnRceEE1XHhFRVx4RTFceEM2K1x4ODdceEVFXHhBM1x4RDNUXHhGQyBMLD5OXHhERVx4ODRceEZBXHgxM1x4QTNAXHhGQlx4MDFtXHhEQVx4RkNceEU4XHg5M1x4RkIuXHg5OXRceEFDTlx4RTBceEQzTVx4MUMlYVx4RDZceDg4XHgxMkchZlx4QzZceEFGXHhEM0NceEI1XHhDQ1x4QUJceEY5cVx4RURceEQ4RFx4QkJzXHg5N1x4ODJPayBceEUzdFx4RDFceENDXHgxRE83fl8hPWBxXHg5NFx4MEJceDhFQ2U8XHg5MVx4RkRceDhDXD9ceEMzQmtceDgzXHhFQntceEFEdlx4QTNceEU1XHhBMWpceDBDXHgwN1x4QzlceEMwaycnXHhFMFx4OTdceENCXHg5Rlx4RkJceEY0XHhBRjNceDBETVx4OTVceENBMVx4OTFceEZCXHgwNlx4RDdceEQxXHhCOFx4MTBceDAxXHhFNC1mU1x4RjFceEMxYFx4OTFxXHgxRUZceDEwXHhBMlNceDBBXHhCMVx4OTNFXHhENjdceEEyXHg4QVZceEVDXHhBOC5XXHhFMlx4ODZceEEyXHg5Rlx4QjlceEJDM2ZceDA5M1x4REJceDk2XHhFOFx4ODZceDkyXHg5Q1x4MUN+XHhEM2JceEJBXHhCNFx4MURceEFDPVx4MTFceEU2XHhCODFceEUxQnI6XHg5QVx4MTVceDE5XHg5NXpBXHg4Q1x4ODVceEY0J1x4REJceDlBXHhDN1x4Q0VwQlx4ODlceDBBXHhCMFx4OTVqQyJceDA4aVx4QzZceEI4XHgwOXhceENGXHhGMFx4RDVceDEzWW9ceEE1XHhGOHtceEU1XHhFN1x4MDc+XHhGM349XHhEM1x4Q0U0XHhGRlx4OTRvXHhGRFx4RkQyXHgwOHZceEQwXHg4Qlx4QjRceENGXHhDNjRvOSVGSlx4MENceDBCXHhGRCNceEI4Vld2XHhFNDZIXHgwNVx4OTFBdFx4MTFceDgzXHgwNXlceDEyJFx4QTI3XHgxRVx4OTFceEY5XHhCOFx4MTBceEI0I19ceDgyXHhCRGU0XHgxRFx4QjZceEUxNE9aXHg4NTAnY1x4RTlXelx4RjlceEU1XHhCMVlceEM1XHhDOFx4QzNceEZDXHhCQlx4RTNHXHhGN1x4QUJceEREb1x4QThceDExXHhBOVRNOlx4QkFceEU2Plx4QzVeXHgxMVx4OENceEJBXHhENFx4OTBceDgzXHhBRlx4MDUgXHhEN1x4MEJceDFFXHgwQmdceDFETFx4RkVceENGXHhGQVx4OUNceEMxfSh+XHhERFAmXHg5N1x4RThWXHhDNlx4REFceEEzT05ceEEyXHhDQnh6PFx4Q0VceEVFIFx4OEVceENBXHgwQzBKXHg5QUNaaCV5XHgxQlx4RURceEM2amVceEU3XHg5NFx4N0ZxRlx4RTlceENGMU0sXHg5QVx4OTBKXHg5Qlx4RTJceEFEXHgwMVx4QjlceEFFXHhCQVx4OEVceEMzXHg4Nlx4RTBVXHgxN0VceDAwV21ceEZGXHhGQ1x4ODNceDhBXHhGNVNceEM4XHhBODBceDk5XHhEQShceDlGM2BceDlBWnRQXHhCMlx4QTFceEJFXHhCMVx4REZceENDXHg4Q1x4MDBceDA2QVx4QkJceEJEIFx4MUJceEFEY0NceEM3XHhDQVx4MEVceEYyXHhEOFx4QURLXHg4RC0rXHgwMFx4RUNceEUzdlx4QkV3UVx4QjZceERGXHhDRlx4Q0ZceEUzcllceEZGXHhBMUMlXHhFQiBceEYyXHhDNFlceEE5XHgwMj5ceEYyckVnYlx4MEZceEM3XHg5MW1ceEIxXHhDNVx4OTZceEI5I1x4ODBceDg2S1x4OUNceDE4LVx4QzVceEVEXHgwQ1x4MDZCXHhBRlx4RUNceDA0XHhFMi9ceEI4K1x4RUVceEI5IDRPY1x4RTFceEM2XHhDQ2EuXHg5RFx4RURuXHhBRlx4RENceDgyW1x4ODlceEQwXHgxMFx4RkVceEVDVlx4MTVceEFCXHhFNldceEVGUVx4MThceEE1XHhGRiZUXHg5MHhceDdGOlx4MTY4XHhFMFx4QjdceERGXHg5MFx4MTRceEE2cFx4QjhceDgxPlx4MEJceDBDa1x4ODlkXHhGRkNceEQ3XHgwMFx4REVMXHhGQ2tceDlCRWpceEQzVkxceEFFXHhCRVx4Q0RceDA3XHhENFx4QkVeJGdceDlGXHhCOFx4MDZceDg2XHhDRlx4MUNceEU4XHhEQ1x4RERceEJFXHhGNlJceEMzZFx4OEVceEI1XHhBRFx4RkZceEFDXHhGNXdceEQ1XHhDQ1x4QzdceEY0XHgwQy83XHg4M1x4QTRceDBGUFx4RERNZkRceDgxWFx4RjZDNVx4QjRceDhEUixceDA4XHhFQjtAXHhBOTQ1XHhFQlx4RDZ4XHhENjhYXHhCMD5ceEEyXHhDM1x4QzdjXHhDQVx4Q0FceDlDVzVceDBBZ31SZ1x4QjFceEE5XHgxRlx4QTUkfFx4OTlceERDOFpkXHhBRWdkR3pceDAycHhceEIxLGtgXHg4MzNceEFEVjBceEFFSDJceDAxXHgwOVx4OEZceDFBXHhFQ1x4QzBceDgwZlx4MUZceEVGXHhBMlx4QUZceEE1SlchXHgxRWFceDkyTndceENCRFx4ODJRXV1ceEVFXHhGRVx4MDRceDhDO1x4RDBceEVBXHhEN1x4ODVceERGL29ceEU1XHhCRVx4Q0FceEJBbXg3RkhUXHgwNSVceENDXHhCNFx4RUNceEZEXHgwNFx4MTMjXWRZXCxlXHhDN1x4OUNceEM5ZFhCXHg5M1x4Q0FIXHhGMVx4MTIkXHhEOEJceENFXHg5Mlx4MTBceEVFM1x4RDBceDE4XHhGM1x4OEVceDA0J1x4QTBceDk5XHhFRVxceDFGXHgwMVx4QzNceEZDJFx4QTJceEE3XHg4MFx4RjBceEYyXHg4NVx4MEZceEJGJFx4OUZceEU5XHhFQVx4RUZceEVCXHhBOThceENEXHgwN1x4RUFceDA5VVx4RjdceEY1Tlx4OEVceDBDXHhEN1x4QzVceDhEXHhCMyhceEFBOmtYcCQ0XHhBQltceEQwXHg5M1x4QzRRXHhCRlx4RTdeXHgwOVx4OTlceDdGXHg4MyNceEEzfGRlXHhBOF1ceENCNmtceEIzKmRleTNceDlDYGJ3XkkhXHhGNUdceEYxVlx4Q0NceDAzVlx4RENceEQxR1x4MDRUY0FceDA5XHhEOVx4RUZceEZBXHg4QVx4Q0VceDg0XHgxQ1x4RTlvOlx4QTlceDBCXHgxM1x4MTNceDgzQ1x4RDFceEZEJlx4MEZceEVBeVM8XHhEQ1x4RDUyXHgwOURiXHhFNXlceEVELj9ceEJFXHhDMlx4REM+PFx4MEVceEU3LS5ceDFEXHhFMG1RXHhGOFx4RDF7W1x4ODRNRFx4ODlBJUNceEJCXHhGOFx4RDZceDg0XHhBMVgnXHhBNyoqfXlhTFx4OEF4XHg5OFx4MTZceDg3XHg4MFx4QTdceEU0WVx4ODFceEIxXHgxNVx4MTRrXHhCNUxqXHhCOFx4MEVceDBCXHhCOCBceEQxXHg5NFx4QUNceEVGXHg5Nm9ceEQ0XHhFRFx4ODdceDA3XHhDNzVceEFBdXNceEJFXHhCNFx4MURceEYyalx4RTlceEIxXHhGRF1ceDE3e1x4RTNBXHhFRXNceDA3NFx4RjZceDk0Q2FceEI5XHhFMVx4RjNceEYwUENceDE2Z1x4Rjh8Ulx4QzFDXHgxM1x4RUR+XHg4QiNceDFFXHhGRFx4RjRUXHhFMVx4RENceEI5XHhBNkFwXHg4NiZceEE4XHgxMlx4RjJceEY1XHgxMVxceEREOEJceEE5S1x4RDBceDk3XHhCRFx4MTVceEZGXHgwRVx4MDFceERDZlx4RURKRVx4QjRJXHgwM1NwXHhFRVx4ODl2XHhCOUlceEZCXHgxQVx4QUVceDA3bVx4MDRceEFGXHhFQlx4Q0FceEIwR1x4RkJceDk2KWhceDBEXHhFRFx4ODlRXHhDOFx4RDRceEE0XHgxM1x4MTUqXHgxMFx4ODFceDE2XHgxNVx4OEV+XHhDOFx4RDVXIFx4RDQ2VmFceDA0XHhCM1x4OTVceEIyXHhGOFx4MDQhXHhBQlx4MThceDgxXHg4QSpuXHhBQj4jXHhEM1x4OEYxOVx4QzVxXHhBQVx4QzR9XHhEMlx4MEZTXHgxQlx4QTJceENCXHg4RFVceDk3LFx4QzJNXHhDN3UnT1x4OThceEVCXHgxQ1x4ODRceEVCXHhBQlx4MTckW1x4QjFceEU4XHg4RVx4QzhceEMyPVx4RjJceDE5e1x4RkFceEEwXHhGREVceDFCXHhGQVx4ODJceDhGP31ceEVBcDVHXHhENVx4QTY/XHgxMlx4RDZceDBCXHhFNT5ceDA5XHg4OTRceDA1XHgxN1x4QkZcZVx4MUZuKFx4Q0ZceDFFQC1ceEUyLF5ceDA3T1x4MUNceDE2XHhENVx4ODhceDlDXHhCRmNceDAzeVx4RDZceERFayxceEM2XHhCQ0RMdE1JXHhDM0xceEFBNVx4MTJTY1FceDFFXHhEMFx4MDFPXHgxMHVceDFBXHgwRlx4REY1XHhGOVx4QThceEU3K1x4MDNceDg4elx4MDhwZ3VXIFx4QzVFT1x4QTRceDA0XHB1Xil1c0xceEY0XHgxMlx4QjhceENEXHhCNFx4OTciNlx4MDNceEEyXHg4RVx4ODcrQzJceDEwXHhGQVx4QjlceEEzM1x4MDlceDgzXHhGNFx4OTNceEM4XHhGM1d2L1x4MUVceDkwXHhEOFx4RjRdXHhBQyVceEM3O35DXHhEM1x4RDJTXHhFRFx4QTdceERCXHg5RFx4RTNceEU4XHhBMFx4MENceEEyJDFceDBCXHhEQ1x4Q0NceEVFXHg5NFx4RDc3XHhBOC5ceENCXHhEMVxceDAzclx4OEJuQ01uLVx4QjhVXHg4N1x4N0ZceEFGXHgwQlRceDg5XHgwMVVceEM2XHg5NDFceEZEdk9ceDEyXHgxNlx4RDZceEEzXHhEOVx4QzFceDgyXHgwQ1x4RDJceDdGTVx4MUNceDExM3JceENCJVx4RUJceERFS1x4MUVceEI0XHhCRFx4QUJceEQxQmZceDBCXHhBQlx4QjhceEVFXHhDNFx4MEVceDk5XHhFMFx4MTI+XHg5N1x4RUJceDFEXHgwRFx4MERceDBBXHhDMjJceEJBXHgwQ004XHhGMVx4REZceDFGXHhGQlx4OEVceDk0XHg5MFx4QTNceDk0XHhDOChceEI4XHhGMlx4ODVceDgzXHhCOVx4MUV3XHhCNiZceEYyXHhBMFx4MDVceEExUFx4MTlceEFGL1x4MDlceDk0XHhGRFx4RTg9XHhDNjRceEYzUVx4QzBceDA3LipceEQwWEY3WUprMllceEE3XHhDN1x4QjhceEJDXHg4Rj1yXHhBOVx4RTEvLVx4QUZceEMyXHg4NFx4QjlceDE2VTszPlx4RDVceDFFXHgxNSFceEY5XHgwMTVceDgwTDFceEJCXHg4QzJceDFCXHg5NFx4QzJpXHg5Qlx4MEZceDA5XHgwOCFceDk2XHgwRVx4OThEXHhFMi1NXHhCQXNceENEXHhBNFx4QUFceDFFXHg5M1x4MTRceDk0PFx4Q0VceERGXHgwQ29UNHZ2XHg5NFRceDlFXHhCOFx4QzFwXHg4RFx4OThceEI0XHg5OVx4RjdKXHgxRW9ceDgyXHhEMlx4QUJceDE2XHhFMj50Klx4MTBceEM1Ilx4MTNceDA1WnZrR1x4MTF3XHhGMFx4OUFwXHg4Mlx4RjNceEM1XHhFQlx4Q0RceERFS1x4MTdceERGQ1x4MEJceDE1Ylx4RjdPI1x4OUJceEFCXHhGOVx4RThJXHg4RVx4RTlcXHhEMn4qXCZVMzJceERBXHgxQ1csXHgxQVx4QTdceEU5XHg4MVx4Q0FceEMzXHhFNVx4ODRceEEwXHhGNFx4MTRceEIxSVx4MTdceEQ0XHhFNGxdcFx4QTlIXHhBRlx4MTRceDEyXHhGQVx4RTdceEIxaFx4QzImXHhDMVpceEU0XHg5Q1x4QzJXbFx4QjBceEQ2bithLVx4N0ZceERGXHhFMVx4RTNceDlCXHgxMlx4OEEqR1x4RjBvZjFceDFBIlx4ODZ1XHhGOVx4ODdceDExWVx4OEItXHhBRHtceEEwXHhFOVtceEEzXHhEN1x4RDlceENEVlxceDhGXHhBMVx4MTNceEIwXHhBM1x4QTVceDkzXHg5RF5ceDFBXHg3Rlx4QzM4XHg4Qi0tJExyXHg5QTpceEEyYVx4MDFceEQ4XHhBMlx4RjhceDk2XHhERFx4Q0JceEI2XHhCMlx4QUJjXHhGNlx4QzhceDk5XHhGMlx4QkNceEI4Vlx4MUZceDAwXHg5Q1x4RDlceDBDWFx4RjVmXHg4OVx4RDFxXHhBNVx4QjlceDk0XHhBNkZceERGXHhDN1x4OTRceEFBXHhEN1FceEVBXHg4QVx4RUZceDEyXHhBMFx4ODlceEI0R2RceDk4KFx4ODFceDE3bVx4MTIyXHg5RVx4RDNNXHgwNlx4N0Z3UDIzRlx4QzNsYlx4RjJceEU0XHg4RVx4MTJceEZCXHhGM1x4REF3YVx4Q0NceDg5XHhGMz1ceEU0XHgxMVx4RUNceDkwVVx4RUVceEMyXHhEM1x4RTZceDg1XHgwNVx4QTlceDk5azRceEYzXHg5MVx4QzkzN1x4ODBceDA3XHgwNVJceEVDXHhFNGJ7XHhCMDBceEIxeVx4OTVceDgyXHg5Nlx4QkNsLlx4QjhceENFXHg4NyZ3XHhDODhceDA1XHhEMDlceEU4XHhDMytceEU0XHhGNlx4MEJceEY4XHg4MFx4OERqXHhBNFx4OTFceDgxXHhCQlx4RjVVXHg4NVx4RURceEVFQVx4MUZceDhEXHhDNlx4RDN5XHhBNVxceDA0bFx4REJceEMyXHhGMFx4REZceEMyXHhCOHIoXHgxRFx4RTFceDE3XHhBQVx4QzlceEEwXHhBRVx4RjhceEZEXHg4RFx4RjFceDk5K1x4Q0RceDFCXHg4Q1x4MTU1YVx4RUYjXHhDRVlceEI5WVx4QUZceEU1XHhBMjVceDAxL1x4OEZzXHhBN2JtXHgwNF5ceEZBW1x4OUVxclx4QTlcXHhCRDxceEM5XHhDOSNceDEyXHhGNVx4QTN7XHhFOVx4MDhceDAyXHhCQ1x4QjRceERDXHgwQ2BtXHg4RngmXHgwQVx4RTlBXHg5NFx4ODdceEMyXHg5QVx4QzkoXHhDQmRceEM0T1x4RTVceDFENj1ceDg3XHg4RUVceEI1XHg5NFx4RUJceDgxXHg4NVx4QkI8XHhGMUJkSlx4MDBceEUzM0tOXHg4Mlx4MTFceEMwRlx4OUNceEZFaTRceDFEXHhDMnhceDBEXHhDRVx4MEIwZUhceDFDPUtceDA3WT8uXHgxM1x4MTE8QFx4RDRceEMzXHgwRlx4MUFiRzRceEM4fVx4RkRXXHg5MVx4MDVceDEyXHhCOVx4OTNceEUzTjglXHgwQ1lceEI2XHhBMUZ2XHg5MVx4OUFceDg0XHg5N1VceENEXHhGRj9ceDFGXHhDOVx4MDFceERDXHhFRFFceEI3XHhGMlxceDg1RFx4REZceEFGXHgxNVx4RkRceEE3PCpLXHhDNiktNm40XHg4MFx4QUVRXHhEMFx4QUNceDk2XHhDMzJceEMxXHhCRTY4U1x4MTRceDFFbFx4RTVceEVEZ1x4QTAtXHhDMFx4MUMzSyVuXHhGOVx4RTFceDA0JC1ceEJDXHg5MVx4QjhceDlBXHgxNFx4MDNtXHhBMVx4RENceDAxfjM9PCFceEJEXHhDNVx4RDZceEM1XHhDM31ceEExLVx4RjlceEY5XHhGNVx4OTJceEEyXHg3Rlx4OUJ7XHgwNFx4OUIuXHgwRlx4RDhNUiBceEVDXHhEQVx4RDNNU2lceEY5XHhDRkxceDlFXHhEQ1x4Q0RceEM2Olx4RkF3XHhDRTtceEVGXHhCQTFfXHhEQlx4OUJIXHhDNVx4QzliXmdceDA4XHg5NzNhXzVceERFT1x4MDZceEUzV1x4N0Y8XHhDRUhceDg2VFx4ODBceEQ3MVx4RUJceEQ5XHhDNlx4OTF4XHhEM1x4MDk8Mlx4MTE4XHhCOFx4QzcyXHhCRVx4OEFceDgyNXJceDBFXHhEQlx4RDlceEUxVVx4RUNXYFx4OTlceEY4XHhDNlx4OUMxXHhCNlx4MTNceDE5T1x4ODl6XGVceDFBXHg4RSUydlx4OEJ2XHgwOVx4RDJceERDfD41XHhBRDJAKFx4MEJceDE0XHhCRlx4MDRceEMwXHg4OG1TXHhEN1x4RjNceEIzJFx4OTRceERCKFx4RDZwXHgxN1x4ODRceENBXGlceEQ2XHhBRlx4MDdceEMyXHgxQlRceEIxVFx4RjJceEE1c1x4RTNceDFFXHg5QWdtLVx4RkVceEUxXHhCMFx4RDBceEFBRCJceDFDXHgxMFx4RUNceEI0XHgwQ2tKSnJXXHhCRFx4REFceEZBIixceDk3KiBdPFdceEU4XHhGMVx4RkRceDk2XHhFOVx4MEVceEM0XHgwN1x4OTBqU1x4QkZHXHhCMVx4RDhceDlDXHgwOFx4RURceEVFXHhCNVx4MDFceDFEXHhCMFx4MEZceENDXHhCMFx4MEQ2LFx4QURceDA0XHhFOCFceDg2Ulx4MDZceDAxXHhCNzNceEJDXHhDNVx4QzhceDkzXHhDOSpceEVBXHgxMVx4MEFceDFGXHhCRVx4RDAyXHg4Mlx4RDBceDA0XHg4NG1HXHgwRlx4ODVceDhCXHhCQlx4MTVtXHhBM1x4MEFmXHhGNipceENBXHgxNlBceDFBO1x4OEJceDg1XHgxQmIiXHg5MUVceEMzXHg4RSNceDAwXHgwNFx4RTlceEREXHhFQVx4QzRceEI2T2tWXHhCOVx4QThceEQ3XHhDN1x4OUN5XHhEMFx4QjlceDFEcypeXHhFOD12Mlx4ODBceDA4OU1pXHhFQ1x4QUN0SFx4QjZceDE0fGNKRFx4MUMzXlx4QTJceDBFNUJceEFCXHhDMlx4MDhceEMxXHhCRFx4RURceERCXHhCOWdEXHhEOFx4RTJceDA5XHhCQVx4QzkrXHg5QVx4QzJbXHhCRlx4QTBceDlFN2pMXHg5OTZceEZDW1x4MUVceERDOlx4MUMiLVx4QjBceEE4XHhERFx4OTlceEM5Zlx4QzNceDg3XHgwMVx4MThceEVEXHhCN1pceDExXHhENDJceDFCXHhBQzlceDlCXHhCOVx4QUNceEEybFx4MTdceEE4PVx4MUJceEFGXHg4Q0lceEY2XHhDRlx4OERceERBXHhEQ1x4RTJceEEyKyBXXHhDNlx4MUFiXHhGRFx4MEVceEMzMVx4MDJceEMyXHhCNlx4QkE8XHhFRFx4QkRceEYwXHhCNFx4QjBYXHhFM1x4MDNceDlDMF9XXHgxOHFgXHhDRFx4RjlceEY3XHhFQVlceDEwXHg5OVx4OUJjXHhDM1x4N0ZceDkwXHhCOVx4QTAvXHgwMlx4RTZIXHhGRlx4RDRkXHg5MH5ceDA4XHgwMFx4MUN9fFx4MDNceDhBXHg5M2dfRlx4MTNfRmtceEExWFx4Rjk6XHgwRFx4REFceEQ5Nlx4QjBceEE3XHg5QVx4REJceEFEXHg5QyxceEY1Rlx4QzNceEE0XHgxRFZceEYxRVx4QjZceDk2NkpceDFBXHgxOVx4QUYxXHg5RFM0J1x4OTBceEZGblx4RTVceDkyXHhCNyBHXHhEQyhceEMxQUZceDgwLlx4OTZceDkwXXhceEMzXHhDNFx4MDhceDk1XHhGNjQiO1x4RUNzXHhENFx4RURceEMySFx4QURceDAxL1x4QkZceEU1XHhBOFx4MDNVXHhGRDBceDk0XHhENlx4ODVceENCXHgxMzd6XyJVXHhGNVNxSVFceDFBXHhCNFx4ODVceDE2XHhFNVx4MEZceEMxV1x4MUFceDEwXHhDNFx4QzlceEJFSFx4MEJceEQ4XHhDOChceEVFRFx4RkVceDgwXHhGMFx4RDFceDA3KVx4REVDXHhDMGdceEU1XHg5NFx4OTdceEI3ZVx4QjZceEEyT1x4QzZoXHg5NW9KMFx4QTUzXHg4QVx4MDNceEUwQ1x4QjRGXHg4RX1ceDlDXHg5MmYsYlx4REUyNFx4OEJceDFCXHhCMGdceEY2Vk9ceEUyXHhDMlx4QzUhXHg5OFx4OTgoXHhFNVx4REFceDgwblx4QkVjRFx4MEMoXHg4RVx4MThceEVFXHg4Nlx4Q0VceEQyN1x4ODBceEZBUFx4QzdceDk5XHg5QVx4QzNceDE1OFx4RjdceDFEI1x4QzJeXHhFMzJceEM4XHhCMlx4RTZceENBIVx4MEJ4XHhBOVx4RENUXHgxQVx4RkNceDA0XHgwRFx4QkVceDlBXHg4QVx4RDRceDk2XHg4Njd+XHg4RVx4MDJSXHhDRFx4QjA0T1x4OTktXHhCMFx4REVceDAxXHg5ODJceEI3Wy9ceEQyXHg5RVlceEU4XHgwQVx4OTFceDlGXHgxRWJceEFGXHgwRVx4QTZceEQ3XHhBNlp1XHgwMFx4QjBceDgzc1x4OTJceEY1XHhFNC9ceEI5eWVcXHhFMlx4QThceDgwIn1ceEM2YjNGdVx4QTZpXHhERlR0S1x4RTVceEI0JGFceDFBXHgwRnpceEMzKlx4QjJceEJDXHgwMlx4RjcyZlx4ODlceDA4XHgwQVx4RTlceDg1XHhENlx4OTFdXHg5Mlx4ODFceDA3XHhBOTM6ZFx4QUNceEJFXHg5QWNceEUwXHhBMlx4MUZLQVx4RTUlXHhEQlx4REZceDg0XHhGNWJceDFDXHhCM1hqUlx4MEJ8XHg5RFx4RDZiYjZceEU0XHgwNlx4MDdceENCXHhBNWhceEM1a1x4RDNceEVBUFx4RThceDFCXHhBNDBceDk2XHgwOFx4QjhceEFDXHhBQVx4RTRceDFDXHgxMklceEEzXHgwOVx4RTNxXHgwMlx4MTBceDFCXHgwM1x4RTlEXHhBQ1x4RkFceDEzW1x4REJceEI1XHg4N1x4MDNceDAxXHg4QVx4MEUxPmFceEYyXHg4RFx4QUJsJFx4RENqXHg5Q1x4OTVceEQ1WFx4RjNVXHgwMmhceDA0XHg4Qi1ceEVEZlx4RkJceDhBRVx4RTFceDlEXHhGQU99XHg4MFx4QTNceEYzXHg4OVx4QjBceERGY09ceDFFXHhERlx4RERMMVx4OTVEXHhGMFx4QUVceEI5XHg4NFx4RTNceDFFZVx4MUNceDA5TiBceDFEXHhDMW9ceEExXHg5Mi5sXHhCRFx4MTlceEI0VFx4ODlceDk0XHhCRlx4RDZJXHhBRVx4QjRceDE2XHgxODFceDk3XHgwQ1x4RDRdXHhERFx4MDhceDk0XHg4OFx4RTBceDk3bCNceERDXHg4Mlx4OEZceDhCXHhBRlx4MUZceEQ1XHhBM1hceEU1XHhFM1x4QjNqXHgwOFx4REJceDBFJlx4OTl+XHhBQ1x4RkVceEQ3XHgwMltEXHg5Qlx4RjlceEFFa1x4QkJaXFx4RUNceENBXHgxMFY3XHg4RFx4MDZceDE1QVx4QTRceDE3XHg4QVx4QzQoS1x4QzBmXHhBOVx4Qjk6XHg5Q1x4QkMwXHhCQVx4RkVEXHgwQ1x4QTEwXHhCRWlceDFCYFx4QkNceEE5XHhDNlx4QTArXHgwRU9ceDBGXHhBNVx4MDBceEUwXHg4NHxceEQ3XHhBNS1ceDkwLW9ceENEXHgxMFpceDlCXHgwM1x4MTBceDgxXHhEMzdceEE1XHg4NFx4ODNceERCLlx4MUJceDEwXHhFOGZvIFx4QjVceEIzXHg5RkQlPGtceEMzXHhBN3hceDAxXHhDMVJceENFXHhEOVx4OEFceEUyb1Q+XHg4RmFJclx4QjNceDBGXHgxMFx4QUZceEIwXHhBMFx4Qzg5XHhGQ1x4OEFRcGZceEM4XHgxOFVceEY2XHhDQVx4RTVceEQ0XHhDRVx4MUEtXHg4RT1gXHhBRU5ceEM4XHhDQ1x4OTBceDhGc1x4RTRceERFXHhGOVx4QzBceEMwdlx4OENceEZFWkZceEJBXHhDQVx4RUVceEQ0M1x4QURWW1x4QzZKYG91SFx4RDNceEJCXHhBQ3hceEI1SVx4QzJZXHgxRFx4MDk1XHg4MVVceEVBdlx4QUJceDlGXHhGM2lceDE5Plx4QTZceDg3VU1ceEM1cVx4QjFceEY1XHgxMHpOcFx4RDdAXHhCNlx4RkJceEY4XHg5Qlx4RDg3Ylx4QjhceDgxRFBceDhER0d6a1x4RERqXHhCQVx4REJceEVCXHgwQ1x4RDBceERGVVdceDhBXHgwMSxceEEyXHg5QjRceEEyXHhCRHBkXHgxOFx4QjFceDA4XHg4NFx4RjNceDBBcD9ceEVBKDtceDEzXHhFNlx4QzNceDEzXHgwNWBceEJBXHhGNlx4QjloXHhFRlx4MERceEIxXHhENFx4RjVceEI3XHhFNVx4REJceDkzXHg5ME9xXHhDOFx4OUFceDlGLFx4OEVceEUxXHgxNlx4RkVceENBXHgxMypceEM3XHhCNlx4QzBceEYwXHgxOFx4QUMxXHgxRlx4ODRuelx4RERceENDXHhDOFx4QTNceEUxXHgwN1x4REUgXHgwRlx4RjRceDExUVx4QzEnfFx4RkNceENBXHhDNXlceEZEcFZkXHhDRlpsXHhBNFx4MTdHJFx4QjRceDBGXHhDOVx4QUNHXHg4OFx4MEFPXHgxRlx4MUJjXHhFMlx4RDhceEU4XHgwNVx4MDI8I1x4RjJceEQxXHhBRFx4MDgoMEVvXHhBMyhceERDXHhGQiAoR1x4QThceDBFXHhBNFx4QkNceEZCXHhGNlx4RTBqXHhGMVx4ODIyUlx4ODhceEY1XHg3Rm5LXHhBQVx4OEFceEMyXHhFRVx4RTkyXHhERVx4RjJzXHgwRFx4RERceEQyXHg4M1VeeVx4MTBceEYzLWh3a1x4RTBceEE2Olx4MEZceDlGXHgwNlx4QURceDg0XHhGRVx4RTUsXHhBQ1x4RkNceEIzWlx4MDFceDg1XHhBM1x4QTlQLFx4RThceDkyXHhEM3hceDlCPnFMN1x4RURceEE1OFx4Q0JeWFx4OUZBXHhDNlx4OUJceEMxXHg4OFx4RTRceEM2XHhFMFx4MTNceEJEXHg4MzRceDk5XHgwOFx4MTlceEM1XHhBRVx4QjJceEFEXHg4Nlx4RERceDhGXHgwNlx4QjJceDFEXHhDOVx4QzhhXHhBQlx4Q0FceDFGXHg5NGtceDg1c1x4QThceEZCRFx4QkJceEQ5XHhCMVx4N0ZkcVx4MDhceDhEXHgwNWM2XHhDOFRceEExXHhBNFx4OTUwcFx4MUZceDE3XHgxMCxJdCpceDkyelx4RTRdXHg3Rlx4OEJYRS9IOFx4OTI+XHhCOFx4Q0RceEE1XHg5Q1x4MEZceDg1XHgxRFRceERBKVx4ODJceEVFJ3g/XHgwNlx4RUNBdVx4QzQjUVx4Q0Y+XHhDNFx4QUZtTE9QXHhDMSFceDkyXHhDNlx4RkRceENEXHhBODBceEJFdCtceEQ0XHgxRlx4MTlPSlx4MUFceENBXDVceEFFflx4MENVXHhFNVx4RUJceEY0Ilx4MTRWXHhEN1x4REJceEU5N35ceDhFXHgwNVx4RDNtXHhCN1x4RDVceDhCXHgxOVx4QUFDXHhERiVceDBBXHhFQVx4OThceDFFMVx4QjhceDFGXHgxQlx4RUJceERCXHgwOFx4MUZceDlGblx4MTFceDhFXHhCMFx4QzNZXHhGRFx4RUYrXHg5MjRceEM3YVx4Q0RceEEwXHg5Qlx4QkFceDAxXHhBNChceEZDXHhDNzZceDE0KVx4QzRceDExXHhGOFx4OTRceDk1M1x4MEFceDgyXHgxQStceEQ4T1AzXHg5OFx4RDBWXHhDMGdHXHhBMXRceEQ0ZzFceDkxXHhBQSFceEREVSlceENCXHhDOFx4REM3XHgxNlx4QTBceEJGJFx4QUJqXHhCQ1x4RTZQXHgxOVNceDk0XHhDNlx4RkJlXHhDRFx4Q0VceEJCXHgxNFx4MThceEJGfVx4ODNceEU3L1x4OUJzXHhFRVx4MUVceDFEP1x4RjRceDBDZWoxXHgxQS9ceDhEXHg5Mlx4Q0U7XHg5RiFceEQ4XHhFNVx4MUFceDFCI1x4QzY8XHhDNUtceDEzXHhDRFx4QTd+XHgxRTBceDBBXHhENWVceEM2XHgwNENceDAwXHhFN1x4MTRRXHhFRlx4QTAoXHg5MyxwaENceENFeGhceEQ2XHg5NnB7KkpceEYzXHhCMWtceDA5XHg4Q1x4RENVXHhFRjBceEVCLVx4QUQ7XHg5M1x4QTlceDAzXHhGRFx4MURceEFGXHhDMlx4RjJceDk2NV1ceDgwXHhBN1tceEZBXHhBNjNceDhDXHgwNFx4ODlceDkxXHhEOFx4QzBceEM5eDlwXHhBRlphXHg5N1x4ODBJXHhDRFs6XHgwQlx4RjVceEJCXHg5MFx4RjRVXHg5NCRceEY1XHg4Qlx4MEJVXHhGQjhdXHg4Nlx4MDJceEFBXHhCOFx4ODlceEZFXHhEMFx4OUJceEFDXHgxQlx4MTg7eFx4MDU9XHg5NVx4MTlceEQ1e1E1XHhGMzpceDA5XHhFOXYgXHgxQ1xnXHgwN1x4QTZ3XHhGNUpceEQwczhceDlEXHg4NFx4MDRceDA5XHhCMlVceEEzJlx4Q0NhXHgxM1x4QTJceDFFXHhEQ1x4REZceEY3XHhGMlx4RUZceDFDJzwtXHg5Q0JmXHhCNlx4MURceDkyJVx4QkZceEZGXHgxRVx4RDdceENFXHhENVx4RDYvZlx4QjJceEM2Iz5ceDFGXHg4Mlx4RkJceDg4Nlx4OTB9XHhGNXxceEQ4XHhFM1x4RjcsXHhGMlx4RDhceDg5WVx4RjcsXHg5MS5eXHhFN1x4QjJWblx4QjdceEJEdlx4ODE8eCpbXHhGN1x4MURceDBCXHgwRlBceEVBRUl8XHg4NVx4N0ZceDg3ci59XHhCOFUzR0VceEVDXHhDRldceEVEXHgxMyBceEI1XHhENlx4RTdceDg1XHhGOVx4QzE5XHhDRVx4MDNceDE2XHhEMzxceDAyVVRYXHhFQX5eXHgwM1xBXHgxOFx4MTBceEU4XHg5NzpceENFXlx4QzMxXHhGNHtKSFx4QUJtXHhFNFx4QUFceDFFXHhEQWZceEUzQ1x4OUMzXHgxQSRiXHhCN1hHXHhCNFtceEYyXHhCQlx4RkZceDhGXHhENlx4RDFceDgyXHhGOVx4QTNceDA0XHhERlx4OUFXXHhGMWhceDhGfFx4REFceEUxclFZXHg3RjtkXHgxNmFGNFx4RjdceENCXHgwOVx4RTVceEIxflx4MDBceEZDXHhCQ3RtIFx4RDA6XHg5Q15sXHhDQVx4QTdceEEwXHgxN1x4Q0FceDgzYFx4QzRceEQxXHhDQilceEFGPmlWXHhGQ1pceENCXHhGNlx4MUZceEQ0XHhGMFx4OUFCXVx4QUJceDAyamFceDhGXHg3Rlx4RDI8I05LXHhDQVx4MDRLdFx4MTFceERCRil6XHhGQjhceEFCXHgxQytceEFFXHhDM1x4ODc5XHhEMlx4Qzh6XHgxRFx4QzdceEVBUlx4MEYsYlx4RDFceEFBXHg4MW5ceEFEZ1x4QkRceDhBXHg5RCVceEY5clx4QjlceDg3XHhFOFx4OTFceEEyJFx4OUFceEQ2XHg4Mlx4QTJ8XHgxQlx4QTl7XHg5MXBjXHgwNlx4QURceDE4XHhBMVx4OTZ4Mm1dV1x4QjZceEY2XHgxRWlceEI2fj9ceDg3XHg5NkJceDhCXHhDQlx4MEFceERBXHhDM1x4QTFceEVFPFx4QzBceEE2XHhBRlx4RjB0XHg5RThceEVFXHhERTdFT1x4OUUtXVx4QzBceDk3XHgxQnJceEQ2XHhFM1x4Q0JlOlx4MUNXXHg5NypyXHgwMTFceEREalx4RjBceDEyXHgwOTZtIFx4ODBceEY0XHgwNFx4QTZceEI2SUlceDk3XHhDQ1x4ODF+IVx4ODBceEVGfTFiT1x4RDZUXHhEQ1x4Q0ZceDhFLkRceDg1fWxceEE2WFx4RTBwMy9ceEVBXHgwOVx4MUJceEZBJ1x4RjlceEJDWmF1UyFceEZDXHhCRVx4MDhLXHhFNVx4RTlceERBNFx4RUZceDgyXHgxMlx4QjFceDAwNl5ceDE2XHg4RVx4ODNceEY4XHhBNjlQXHhEOFx4MDU3Llx4MDJceDhEd1x4MUNceEU0XHhEQlx4QjlceEM1XHhEMlx4OThceEE3XHgwN1x4OThceEZFXHhGRVx4REJceDFEXHg4MU5hXHhBOVx4RUFhMVx4QkFceEQ4XHgwNFx4MDdceEM4XHgwOV9jRFx4ODZceERBXHgxQlx4QTZceEFEXHhCOVx4OURceEI3Wj9ceEI2aFx4MDJKXHg4Q1x4RTVceDgzXHhFM1x4QjglXHhEMFx4MUFceEU5XHhFNm1ceEExXHhGRlx4RDZceEM2dlx4ODF+WVx4ODVceEI3XHgxNFx4QkJceDE2PnVceEM4V1x4QjFceDhGXHhDQ1x4OTZceEVEXHgxNlx4QjBbXHhEMHIzXHhDRFx4MTVceDk2XHhEQS1ceEYzXHgwOFx4OTBceENBN1ZceDgyXHhEOVx4RUFceDlEXHhCMn5ceDhCXHgxNVx4QUZceDlDXHhENFx4ODZceDBFWFx4OTNLV1x4RjlceDg0XHg4Q1x4QkRgXHhENVx4ODNLXHgwNjdceDlDXHgwMlx4OUJceEQ2elx4QzZceDE5cVRoXHhCMlx4RjZeXHg4NT9ceDk4WVx4OUY7TWteI1x4MEVceEM1XHhCMVx4MTFceEZGXFx4OEFPXHg4MT9ceDg2XHg5RVx4RjlceDE0QVx4RUVdXHhBQTVceDA5a0ppdVx4OUQiOVx4OURceEY5Wz5ceEUzXHg5RFx4QzA9XHhFRHlceDE1XHgxNG9ceEJEXHg4Qlx4MUZ6XHgwMlx4OTFbXHhFM0VceEI2XHhCRlx4RUFceDhDXHhEOFx4MDNceEY4Slx4RkVceEFFXHgxMihceEU5OmhceDkxXHgxNFx4QzRaXHhFM0JceDlBXHg5Mlx4RjAzc05jTlx4RDZceEU5XHhGNlx4QzRceEQ0VUhceEUwXHhFMVx4ODV5XHgwNFx4QUZceERGXHg4Qlx4MERRXHg4MzFsXHhEQ1x4OEVceDg1XHhCNVx4OEQmLlx4OUR0KVx4QjlceEZEXHgwQVx4RDVceEMwOVx4QThbXHhBRlx4QjBJXDBceDFCRFx4N0Y+XHgwOFx4OTkrXHgwM1V+XHgxNVx4OUVceEM5XHgxRGBceDlDXHhEMFx4MUVceDkxXHhCNlx4QjdBXHhERE1ceEZGXHhEMVx4QTIoXHhBMFx4RjZceEMzcVx4QjQzIlx4RDJceEU3O1x4RjlceEE3XHgxNFx4OEVPXHhGNCpNXHhCNVx4ODhceEY5XHhDMlx4RkRceEREXHgxNklceDFGXHgwQlx4MEJceDFEXHhFMlx4RURceEUybFx4ODNceDE3XHhDOVx4MDMpNHVceEE3XHhBQ04qXHhDRFx4RUZceEJGXHgwNFphXHg4Q1x4RTFceEVCW1x4MENceERFXHg4MFx4MUIhXHhCNV5qXHhEQUJceEM5aVx4QkZceEEyXHhFRFx4QUNfXHhBOF5ceEE3XHhCM11ceDAyfVx4REZceEQ3XHhCQ1x4RTNceEMwXHgxQ1x4OTJceDhCXHhEM1x4RjUtM1x4RkNceEU2Rlx4OUJceDg5XHg5Mlx4MDlceEM3XHhDN0ZCXHhGNFx4REZceDEwXHhBMG5ceEIxfVx4MDdceEQ1XnFuXHg3Rlx4MDRceEQ4YFx4RTFceEE0XHhDQT0yZWJXbFx4QzVceEY1XHhDQlx4RjBbXHg5NFx4Q0RceDAxI1x4RENceDFFLWEwTVx4QTZNXHhCQlx4RkFceEJCTntceDE3XHhBN1x4Q0JVXHg5Nlx4QzIpXHhBM1x4RjZceEU1RFlsXHhCRlx4OTBnXHg5NVx4MDRceDlDYzYxXHhDQnZPXHhGNFx4RTVhI1x4RTJceDE0XHg5Mlx4QThceDk5N1tceEFGXHhGNFRceDFEXHhFMVx4QTRceEJBXHhCMzhceDExXHg5MVNceEVBXHhFNlx4QjVsU2wnXHhDNmdceDk3XHgwMlx4ODd6XHg4NFx4QkVceEFCXHg5MmdceDE3XHhBNnhceEJEXHhGN1x4RDlceDExWzNceEVBLUZceERBXHhDNVx4MUZceEMwXHg5NVx4ODRceEM5XHhGNVx4QURceEQ4Y1x4QkFceEU1XHhGRGpceEY0KSZceDE0NkNOXHg4MHNceDgxXHhCNFx4OTlPXHhDNHFQXHhDNFx4ODhceEE0aWFceEFEIVx4RUVceDg2XHhGN1x4OTdKXE9ceEM5XHg5OFx4QzlAXHgxNEdceDFGd1BceEUzVFx4QThceEJBXHhDMlx4REJceDg5XHgwOD10XHhCNFx4QjlNXHhDQ1x4MUR1XHgxRVx4RkNceEVEXHhDMlx4QzJceEQyXHhFM1x4RDVhXVx4OUNceEIyXHhFNlx4QUZdXHgwM1x4RDJceEZGXHhFMXBLXHhFQlx4RjVceDFGXHhGRkNceEREfVx4Q0ZceEI2XHhFOVx4MTVIXHhEQkwxXHhBMUNceEUyKlx4OENROlx4MUN8ZmozWVx4RjhrXHhGRHtceDgyblx4RDJceDkzXHhBMmdceDEzXHhGRFx4MENceEY4XHhFRlx4QTdceEM4XHhCMVx4RDY+KytceDBCXHhEQ1x4MDdBMVx4RjQ4XHg4NFx4RUZceEFGKVx4RTR7VTQ8flx4QzFceDA3KVx4ODVceENDa1x4RTYgXHhCNlx4MEQ9XHhFN1hceEQ5XHg5Nlx4QzBhJ1x4RDRceEUxLFx4MEZceDgwUFx4ODFccVx4RkIhXHhBQ1x4QzhfXHgxNWpceDA0XHg5QUhceEE2XHhBQlx4QUNceEEwXHgxOFx4QzJceEJGZ1x4RjBceDlCXHgwQlx4Q0NceDFBXHhGOU5ceERDRmtceEM1XHg4OFx4QzJ7XHhFOTknLVx4QzVceEU5XHhDOVx4OTZceENGXHhFNERceDBBNEpceEZCXHg4N3NceDhCXHhFQUVxXHhGMVx4OTJceDhCc1AvXHhBNlx4QUVeb1x4RjVceEVBXHhFOVx4RjhceDEwXHhCNVBceEE0XHhGM01wXHgwMFx4RDNceDE2fVx4RUVceDk5IWdceDkwe1x4RTFceDBGXHgwMEJHXHhFQVx4OEZceENFUVx4ODJceERCMmZceDAyXHgwMlx4RDgiXHhBMFx4ODFxXHhFNlx4ODdHXHhGN1x4QUJceEU2XHhDOVx4QTdzXHg4Nlx4ODNceDk1b1x4RjdceDFEXHhDMlx4OERceEUzXHgxRHpwXHg4NWJTP1x4QzBBIVx4MEEmaVx4ODZvXHg5N1x4QkRreXlceDhCdlx4RTgyXHhCN0RceDE3cmJceEM1XHhDM1x4RTJceDA2XHhDMVx4MEJceEJEXHhDNTlceDg5bEFceDk1XHgwQjxpXHhCNFx4MEZzXHhCOFx4REFceDk1XHgwOFx4RDZceEUwXHhDQlx4RjBceEYyXHhDOFx4QzdceEJGXHg4Rk1ceERDXHgxQ2xceDk4XHgxRVx4MDJceEE3XHgxNC1HXHhBNVx4MDRlXHg4Qlx4MTNceDg2SVFceEM0Jlx4OUVJb2dceEZFNVJ3L1x4RUIoXHhFOVx4QkZIXHhFMlx4RkNYXHhEQ1x4MTF3XHhDQVx4MEVceEEyXHhENl5ceEQzXHhGQVx4OUFceERBdlx4MURceEJEXHhFOFx4RURceEMzUVx4RUVOXHhDNFx4OTBceDAxXHgxMVx4RjNceDA3XHhDMHRceEYyXHhFQyVceEU4XHhFRlx4MDBSXHhCRVx4ODFceEM3XHg4OFx4RUQ5XHhDNFx4QkY1OFx4QjhceEUwLl1eZFx4RDBceDhEaFx4QjBwe19wXHhFMlx4OTczXHg4NmhceDkxXHg5N1x4MUNceEU3IFx4RjdfXHgxQ1x4RUQwXHhGMFx4Rjg6XHhEMlx4QjJceEZDcVx4MDNceDA2Z1x4QzVceERBXHhENUJceDkwX1x4OThpXHhDM1x4MDJceDhBXHhCQysuXHg4MWRyRzhceEVBXHhCNlx4QUFceEExXHhGNlx4N0YnXHhCNlx4RjlVP1x4QUZPXHhEN1x4MTJceEM0XHhERVx4QzVceEI2Llx4ODdceERBXXNceERGVVx4MUUrXHgwNFx4RkFceDBBXHg4M1x4RkY6XHhFMidceENCXHgxNVx4Qzk6XHg5MFx4MDJceEY5XHgwNUZceDAzXHhBMlx4RjhceEFEXHhGMVx4RTZceDkwKTVUXHhDQjFceDhCXHgxMFx4QjMkVFx4MDNceENEYFx4QTNceENCXHhDMFx4QUU+XHgxRlx4QThceEJCXHg5N1x4RjBceEU4QFx4RERceEU1a1x4QzlceEFFXHhFOWhceDdGXHhBMVx4MEJceEY0XHg4OFx4QUR0PDpceEFEXHhBRlx4MER2XHgxQ1x4MEJceEUwMFx4RjJceDFCXHgxNVx4OTFceEQ2P1x4OUNceEU2XHhDQlx4QkVceEY2XHhFMVx4RERceEU0XHhGMlx4OEFceEREXHg5QVx4MDFceEVBXHg4MVx4OEFceDE5XHg5RkZceEVCIVx4MTZXcVx4Q0JjWj1ceEM0Llx4QTZqXHhENTxceDhBXHg5NkhCIFx4RUZceDk0XHhGRlx4MUZceEI0XHhFM2MsXHhGQVx4QjdceDE0XHhGNFx4REJceDhCXHg5Mlx4MEFceDg4XHg5QStWYC19XHg4Rlx4RkZceDA4XHhCQlx4QTlceEI2J05fXHhFNFx4RkFceEZCXHg5MFx4MUYqNFx4QkRceEZDV1x4REZceEEzMFx4RDJobS5ceEVCXHhGM1x4RjhiXHg3Rlx4MTdBXHhDOFx4OUJceDhGXHgwQ1x4RUZceEY1XHhERkRKKFx4ODdceENCXHgwNVx4RUVceEMwXHhBM1x4MTRQdVx4Q0ZceEFGXHgxOFx4RDBceEJERVx4RERnXHgwN1x4OTdceEMzXHhDNFx4MERceDhBXHhEOVx4OUFqXHg4Q1x4QjNKXHhCRkQyU2JceDBBXHhBQVx4RjkxVlx4REZQXHgwOVx4MTZceENDXHhEMlx4QkRtJ1x4RTh9XHgwNFx4MEQmalZceEQzXFx4RDBceDlFXHhGQVx4OTNceDgyXHg5QVx4OTMsWTZceDBCYCFAXHhEMFx4OTF4RHtceDA1MFx4RDFWY1x4MEF8XVx4QTFya1x4ODdceEQ1XHgxRFx4OTBceEFDXHhBRVx4ODVceEM5TFx4QTlceEE5XHhCMlx4MDRRXHgwRSRuXHhDMlVceEJGNzVgXHgwMlx4OENceEU0XHg4RXkqXHgxQ2JceEE0XHhGNCBceDg0XHgwQUxceDFDXHg4MytCXHgxRlx4QkVSXHhCMCVceEY4XHgxRVx4OEZBbnxceDE3XHg5OVx4OUFceEU3Rlx4QTVceEEyXHhENlx4QUJceENCXHgxRHpceEZCalx4MEQvPWB8Klx4OEFceEE1XHhGQVx4RUVceEM1alx4QzRceEExXHhCNFx4ODlceEE0XHgwMVx4QjIrXHhCMFx4QjdceDEzXHhBRlx4MTBNXjxceEFBXHg5My5ceEIxXHgxM1x4MUNmXHgxRDJceDg1XHg5RFx4RTgwXHg4Rlx4QjNceEJDXHhCQVx4ODlceDg0XHhDQm1ceEQzXHhCMlx4RDJ1XHgwNisiV1x4QzljXHhCNVx4QjJceEU2XHhGNFx4QUFceEM3XHhDM1x4RTlceDhCXHhBQ1x4QTNceDlCXHhFNSllXHhBMFx4Q0RceDA1XHhDOVx4MUNceDE4UjNceERCXHhFM0VceEUxVlx4MDYoXHg4RFx4QUJHXHgwM2hceDlGXHgxQVx4QUNceDEyXHhGNzFceEI1XHhGQlx4MTQ1I1x4OTdceEU0XHhCOTZceDlGXHgwM1x4QTZyLlx4MERoelx4RkJceEFFI1x4RUIhXHgwQyxceDBGTFRceEJDXHgxOWZceEU2b11ceDg1XHgwRGpMXHhEQVx4QkZceDE2XHhDMmFceEI2XHg5MVx4RkRceEZCOTZceEY4XHhFQVx4RkRceEMwO1x4MUJceEI5XHg4RW1ceEQ3XHhGMVx4MDFceEJBUlx4MUZ9dz8pLktceEREWFx4MTZceDdGXHhENFx4MThceEQ5XHhCQlx4QUJNXHhBMVx4QTJ0XHhFMU1mXHhBOVx4QkVceDg5V1x4QkZKXHhDRFx4MEZceEJCXHg4MFx4RThceDFBXHhDNDQwXHhCOFx4ODJPXHhCMytceDEyRzdceDgzJHJceEZEXHhFMlx4RThceEY3XHhFRVx4RUVceEZCbFx4REIrXHgxQV5kXHhFQzVFXHg4QyFceEVEe1x4QUVceDlGXHhFQmtceDE1XHhFNVx4MDRceDhDXHhGNFx4QzRyQ1x4QjIlXHg5MFx4QUNceDlBXHgwQXRceEREXHhEOFx4RUJceERGbFx4RURceEY3XHhDNFx4OUQqXHhBQlx4ODhceEEwYlx4MDJSNEhceEIybn5ceEI0XHhGRmZceENGXHhFOF0ndVx4RjUlXHhBN1x4RkI3XHhCQ1x4RkFceDBFXHhEQi5ceERCfFx4OTVceDlCXHgxRFx4RTNceEQ4VFx4QjNzXHhFQlx4RjlceDgxXHg4Nlx4Q0FKXHg4NHolfWxceDkyZF4xXHhCQ1x4OEZqXHhFN1x4QTlceEQyXlx4QjNLWVx4MThceEMwXHgwRlx4QzlceEZFSlx4RkJceEJDXHgwOFx4MEFOXHhBM1x4Q0Y+JEdceDAwXHhCQlx4QTVceERFXHgwN1hrXHhEOFx4RTNceEU1XHhFQVx4QzFceEFEXHhGNlx4ODNfXHgwRVx4RjZceDgwXHhEQlx4RERceERDKFx4QkFceDhEI1x4RERfS1x4OEEkdmNceEI4XHhBRFx4RDknfD1ceEM5XHhCOFx4QjkmXHgwQVx4MTBceEIzZ1x4RTNceEFDXHhBQlx4RUFgXHhDMlx4Q0ZceEZCXHgxRVx4MURceDg1ZVx4RDVceDhGXHhCOFx4RkNceDg2XHhBN1x4MTA8Vlx4RjhcXHg4Qlx4QUJceDlGXHhGQVx4QzBceEUyXHhENVx4QTFRYFx4RTU3XHhERlx4RTdceEYxXHgxN1x4QzNceEI3XHhCMFdceEZFXHhDMlx4MDNceEE4XHhENTVceEQwQlx4RjZvaSpkXHgxRlx4RjNceEY0XHhGQ1VceDFCXHhCRVdceEQ2XHhFRnBAR1x4QTNceEYxXHhBRFx4RDEjXHg5Rlx4RDI0XHgxRUIlaWh9XHhCM1x4MEJceDlDZ19YMlx4MUFceERBXHg4NVUrOlx4REZceEM2XHhEMFx4MEVceEE5XHg4NGtceEM5XHg5NVx4QjUyXHg4NFx4QkFceEVGSVx4MTVbXHhGQ1x4OEFceEM5M2lceDlEXHhEOFx4OEN+XHgwMVx4REU4XHhDQ2tceEQ4XHg5Mlx4QUFceEE5SF01XHhDMTRceEMxXHg4QUVceEM1TFx4OTd6XHg4NSJceDlFXHhDRVpzXHhEQVx4RENceEZFXHhBQ1x4MURceEY4XHhFRFx4MDhceDFBXHhFN1x4QTYnXHg5Q2pceENCXHhDMFx4Q0JceDg1XHg5NnwrXHg3Rmp8XHhDQ1x4RjVceEMyXHg5NWJQXHhCN1x4MDlceEFEXHgxMWJceEZBXHhGQSFceDlBXHhGMFx4QUZceEMwXHhERVx4OTBceEU1XHhGM2hQTlx4OUVceDFDXHg4Q1x4MDRceEE0d1x4Q0JYXHgwMk9ceEVBXHhFMVx4RDkiXHgxRlx4RDUkXHhFOFx4QzMhKnxdT1x4RkVhXHgxOVx4OTBceEZCXHhBMlx4MTQ7XHgwQ1x4OTEwXHhFNVx4Q0RceEU4XHhERVx4OThceDFBT1x4QzZceEI4Ilx4OTI8XHhGQVx4RUVTXUZceDgzXHg4QmBceDkxXHhGRVx4OERceDFGXHhFQlx4ODFceEJFXHhFRVx4MDNceDg4TVx4RDlceDgyNDpceDhFXHhGRUpceDgwXHhCMVx4MEFceDBEMShceEY0XHhGQVx4QzdkPzhceDg5XHgwRmI/dlx4QTNceDBBViFceEY0XHg4QVx4RUJceDE3Nlx4RjNceDg1XHhGMFx4QjNceDkwXHhFMFx4QzdceEY0XHhGQVx4RjFceEMzXHhGMFNceDE4XHhFRlx4OEJceDg1TFx4RTVceEFDXHg4MHRBTkRceEFBK1x4RjFceEE4bDFPNFx4Q0ZceEEzXHgwOGZnXHhCQlx4MDAyXHhGRTViXHhEQVx4QkRceEI0ZVx4QjhceEFDXHhCRlx4QjVceDAwXHhFRVx4QTJceEY2XHhCNFx4QjhceEZGYFx4QUJceEE3Ilx4MDlceEE2XHhGNE5AL1x4RjlceEI5ZGBceDlFXHhFNlVceDAwPFx4QjcsXHgxOFx4QUZceEU2XHg4N1x4QzlOXHhBQWtceEI5d1x4RTlceEEzXHhEM3lceDBFXHhFMVx4OENceEJBXHhFNVx4MTdceEFEXHhEQnA5XHhCM1x4RkJceDg3UW5ceEJGXHhERFx4MTFceDBDJFx4RjVceEVCXHgxN1x4OTNjfHZeWFx4MDJceEQ1XHhBQlx4OTVceEJEXHg4Rl1zXHhGRjRvXHhFNVx4QTJiXHg4OFx4QTBceEFGXHg4MyNceEJDZVx4OUZceEY2XHhGMXFceEY4Zlx4MDFceEM4UzlceDlEXHgxNllsXHg5NWc7XHhCQkNceDkzL21eXHhCNyVceDlDXHgwMVx4MURceEQzXHg5NFx4QUVceERBXHhGRVxceDEzOVx4RDJceENDXHg4Qlx4REZ6XHgwRVx4REVceDhCfFx4OUFKXHg5RFx4ODBceDBBXHhEOSRceDlDdlx4QzZceEE5XHhCQSBceEM1XHg4RVx4QTNceDAzXHhENzBceEZCXHg5OFx4ODdtXHhEQlx4MTNNXHhBN1tceDEyXHhGMlx4QkNPXHhFMFx4QTNceEI5MSRceEIwKlx4OEJceEYyYVx4OEZhTlx4QTRceEY0b2ZmXHhEOFx4OERIZVx4ODFceEEwXHgxRXdceEIzKFx4QUNceDE3XHhBMlZceDlEXHhDQ1x4OThceDg4W1x4MTVceDhDXHhBMjxceEYyeWF4XHhCOVx4RDNlXHhDQ1x4REJ5TkYlXHhFOFx4N0ZceEY5XHhCQVx4OTBaXHg4QVx4QjZceEE4XHgwOVx4QTE6XHhCQVx4QTBceEU2XHg4QmRceDlDI1x4QTBceEU4XHg4MVx4RTlceEZFXHhBNVx4RTg/I1x4REZceEZDXHgxOUhceEU2LFx4QzFceENDXHg4NipceEM3XHg5Rlx4ODRWXHhCNVx4QzhceDlGXHhGQVx4RDZceDg5XHgwOFx4QzVceEI3R1x4QzNceDhGXHhEMFx4MUNTXHgwRHlceEJFa1x4RjhceEY4XHgwOFx4RDkwXHhEOVx4MERoXHgxOFx4MUR+XHhDNlx4MURceEY5XHhBN1x4MTBceEY5XHhBMVx4OEFceENCXHg4MGlceEZGLFx4REQ8WFchYGEtXHhDQVZANGVyXHhEN25oK2hceDA3XHhCM1x4MEEyNmY5XHhCQUVceEMxd1x4RjR7XHhCRipceEI1NSFgXHhBQ1x4OTFceDlCXHgwNVx4RDhWe2FceDFGXHhGRVx4QTBceENBXHhDNlx4QzVgXHgwMlx4RTZceDdGXHhFQ1x4QjNceEJBXHg5RFx4OTRceEFFXHhGNlx4OERceDBFXHhBMFx4OURceEEyQFx4ODlceEVFXHhGOFx4QjlceEU2ckB3RXFYXHgwQ3FceDAxXHhBNFx4RTE8XHgxQVx4REJceDlEXHg4NUZceEE5XHg5NHVNXHg4Mlx4QThceEQ4XHg5RmxlXHg4M1x4MTlceEIxXHgxNisqJS9ceEZFdVx4MDU6XHhBN1x4QTJceDk1XHhFNlx4RjUsXHgxMmtIXHhCMVx4OER0Llx4QjBceDlBXHhFRFx4ODJceDE1XHg4OVx4QUFQUV9ceENBI1x4ODJceEQ2XHhDRnJceDgzXHhBQn5ceDhDXHhFNlx4QUJceDk1XHhCMj1ceDE2XHhCMFx4MTRceDg5XHhFN3pceEUze1x4QTZEXHgwQ1x4QzZceEQyXHhERVx4REZceEMxXHg4MVx4OERceEEyXHhGOFx4RkFWXHhBOFx4RUVceDk3b2tceEU1XHg5RVx4MDV8XHhCOVx4OERceEE3aVx4REFmXHhGRkVceDgwXHhFNFx4OTRceEZEXHhENVx4RjhceDA0b1x4QTR+Plx4RUFceENFXHgxN1x4MUEoXHgxQVx4MEVoXlx4Q0NceEU0XHhDNFx4RTlDQVx4RjBceEE1XHhEODtceEYwXHhGQ1x4RkRceEI4XHhDQmdceDk1XHhENFx4RDJceEJEXHg5RVx4QTheL1x4RjFceDgyQFx4QjZ6XHhCQVx4MDhceDA0XHhENiRSXHhGQ1x4QzZceEU3XHgxMFx4MTBceEVEXHhBNVBDXHhCMFx4RUVbYFx4RkZceERDM1x4MTBceEU2XHhCQlx4OTVceEE4XHgxRG1FWFx4MENUXHhCM0NceEY1XHgxN1x4QTRceEM3XHhCM2FceEVFbm51XHhCNFx4RDZceEZCelx4QjhceDhEXHhGQ1x4QjZceEM1XHgwMFx4RDBceDlBLC9ceEFEVnhceEFCXHhGMVx4OEJceDBFImR1XHhBMVx4RURceEJEXHhBQVgyXHg4M1ZceEM1NVx4OURceEU2XHhEQlx4QzNceEJBXHhGMVwjXHhCQntceDkyb1x4OUZrfVx4OEI3XHhFOFx4ODZceEE1XHg4OF1ceEE4XHhFOFx4OUJceEE4fCtceEYwSVx4QzIucFx4OERceEMyXHhCMFx4QUJceEQ2fXd5TVx4RDhceEE5XHhDQ3VceENCXHgwOFx4RjdceDBCXHhDQVx4Q0FceEUxXHhEMVx4MDkmXHg5Nlx4ODRvXHhENVx4RDVceEM2XHhGQlx4QkQqXHhFMVx4RURceDk4XHhGQ1x4RDRceEU0XHhBQVx4QTZceEQyNFx4MDJfTi9ceEFGTzxNXHg4OVx4RUUsXHg4N1x4RjBceEVFbFx4QTktXHg5RVx4OUVXPCVceEJDXHhFMyNceDk5eFx4RkUrXHg5NFx4RDdceDgyYVx4RjVceEY5R1x4MUNceEY0XHhBNlx4QzVceEU3QDlceERDKm1yXHg4N1x4MUNceDlEXHhFMlx4Q0ZceEREXHg4OVx4OUFceEFCOFx4MEJceDBEcFx4MENceEI1XHhGMVx4QkVceEU1XHgxMVx4RTVceDA4XHhFNkJceDBDXHhBRiAvezVceERBXHg5M1x4QjVceEM4bSVceEI5XHhGMFx4N0ZceDg1QVNceEVBXHhDOVx4MDRceDhFXHhCM1x4QjNqXHg4Qlx4RTJceEI1XHgwODlceEQxJVx4RjRceEM4XHhENlx4RDR8XHhCMlx4ODBQPlx4MTFZXHgxNEZdXHhDOFNceEY1bXRceEM5XHhGRFx4RTRgXHg5QlRceEFGcU1ceDE5XHhGNlcxXHg4Mlx4OTVZVnBceEU4RypceEE4aVx4OUFceDE1XHg4OUtceDkzQFx4RTBceDhER15ceEM0XHhCMX5ceEJGR1x4OTVceDkzTEQtXHg4MFx4QkVSXHhEQ1x4RjlceDk3SF5ceEZCO0RceEJEXHgxQSJaXHgwNFx4QjJceEY4XHhCNVx4Q0MlXHhDNVx4MDVnXHhDNEpceEY2XHhDOVx4REZceDFGayRceDAyXHhGOVx4ODcpblx4REJ8XHgxM1x4RDNceDgycV0oXHhGQnpkXHhGOVx4QzNceEVGSE9ceEUyey0pXHhBMFx4OTRceDgwXHhDNVI8XHhGMVx4QkVceDFCU0pHXHhGNVx4MDdceEY2XHgwRExceEIzfT9ceEE0XHgwQV9ceEEwXHg4MjdceEEyXHhCRVx4MDk8XVx4QTZceEY3XHgxMFx4MERcXHgwRFx4MDZceDAwXHg4N1VceEQzXHhEM3RceDBDXHhEOG1cXHhDQnxceEI1Ylx4MURceDg2eVx4RUVceDg3XHhCOH51XHhFMnpceDA2XHhDQVx4RTA3bVx4QzNLXHg5Rlx4OTIwXHgxMFx4MTlceDlCXHhEOVx4MTVceEQwXHhDRlx4MUEkXHhDMFx4ODJceDAzXHhFMFx4RTdMOlx4QUNceDE2XHgwNlx4RDlceEI2XHg4N2tceDE5XHg5NS5ceEJDXHgxNHFPOFx4RkVceDkzeT1ceEYwfVx4QjBceEVBW29ceDBFXHhDM3pceEUwZVx4MDY4MFx4QkRoXHgxRVx4QzRceEY5XHg4MUNEXHgxRlx4QkVceEUyXHgxNy5cVUEkXHg5OVx4N0ZceEIyXHhCOH1ceEMzXHg4OH08XHgxMVx4MTZceEM0XHhFOFx4OTdLXHgxMFNceEM3Wlx4MEF1I1x4QzRceDhFV0pCXHgwRlx4QjhceEM0XHhEQVx4MTdQX35ceDk3XHhCRjBceEFDXHg5N1x4MTZceDk4XHhDQi9ceEM4XHhGNFx4ODBceENEfi5ceEUyXHhERSRceDkzTlx4OTZceDEzXHg5M0tceEIyXHhEQ1pceDk5K0tMaUxceEQ3OC5QXVx4OTE6XHgxRVx4OTBceDEyXHgxMVx4OTAiJFx4MTFceDE2XHhBMlx4MEQ3J1x4OUZfPVx4OTRceEFDTFx4MDVceERENFx4Q0RceDhEXHhGMGFxXHhEOVdceDgxXHhFODJceEI3XHhCRGwnXHgwMHtceDlBXHhFRENceEI0IVx4QzJceDkxTW5qeFx4RTBceEVCXHhDQ1x4RjhceEZCJlx4OTdceEY5XHhFRlx4OEFceEJBMlx4RDY6XHhEMVx4RUFceEUwXHgxNFx4OUFceEFDSmJlKFVceEI0XHg4OFx4QzNceDk1XHhFOXB0XHg4M1x4RURceDEzXHgwMlJhXHhEOW1ceDg2O2UgXHgxNFx4QjBceDg1byBceEUxVlx4RjBWXHhGN1x4OTFUNVx4MTNceDExXHgxNVx4OEVIXHgwNlx4MEZ1XHgwMFx4RjVwMltceEI1XHhBQ1x4MURceEY5XHhGQj5ceEQ3Ylx4RURceDhCXHhCN1x4RUFceEQ3XHg4RFx4RTZcXHhGOVx4QTI1XHhEN1x4ODdceDA5eVx4QkYuXHhDQlx4RTlceEIzL35UXHhFRlx4QkFceEUyIlx4ODRceDg0UCBZQFx4QkVxXDlceERDSFx4MEFeX1x4RUNceDk2XHhDMlx4MTY3QFx4QzJLXHhFN1x4QUQ8N1x4QjkoO1x4RkRceEY0QVMxXHhEMlx4MENWXHgwOTBceDkxXHhDQXpOXHhFN1x4RUY6JWlceEY2Zlx4Q0VceDBBYVx4MTVceENCMUJceDAzI1x4ODc8XHhGNWlnXHg5N102XHg4NFx4ODJceEVEalx4ODI0XHg4MVx4Q0NYXHhGMDFfN1x4Q0NceDg4XHhFOFx4Q0Q5XHhEN1x4QzRceEY2XHhBMlx4OTZceDk5U1x4MDNceDk2Slx4RjNRXHhEQndceEZBXHhDRFx4RDlceEE5XHg4Nlx4OEZceDBCXHgxQl1ceDFCWExceEUwXHhCQy1TV0NceDBEVk4hXHg5MFx4RTdceDA0XHhBMHdceEQzeEF9J1x4MThJMFx4MEFgXHgwMlx4RDNceDk5XHhCOGdceDE5UipceERGaVx4ODJceEQ0XHhDQlx4QzBceEQ5XHg5QVx4RDBceDlGXHgxQlx4QjQ1XHhDMjRceEJBXHg4Q1x4QkFceEI4XHhCQlx4N0ZceENFXHhCRlx4OUFceEM0PCcyXHhGMFx4RENceDBEXHg4Nlx4OTFjXHgwQVx4QTNceDdGJlx4RjdceDE1TyVceDBBXHhBMVx4RUFyXHgxMlx4MTM2Rlx4MDRSTGlceDhEO1x4OUVceEVBXHhBOVx4REZceDE3IFx4Q0JceEEwXHhBOVx4MDQmXHhCMUlceERCMlx4RTdceDAxXHhBOFx4QzlceEM2XHhCNEdceDA2XHhCM1x4QTEoXHhDNlx4QkVceDhEXHhGMU9ceEJFPmFceDhBXHg4MjtceDEwXHgwRVx4QzdceDEzXHgwQTRuXHhBRlx4OEJbXHg4QU1pNFx4ODB0K1x4MURceEE4XHhCOFxceDFGXHhENVx4ODFceEE1cWRceDA1XHhDQTVceEY0XHg4MWFceDBFXHgxN1x4MENceEMyNktceDhBXHhFM1x4MUNceDg2XHgwNFx4OTZqPFx4MEZceEY4Vlx4QjlyXHhEOVx4MTJgXHhDNmh1XHhEM1x4MTQvXHg5RFx4QTJceDlEXHhBMTRceDgzW1x4RTRSXHhDQkBceEJFcHJceDg2SU5DfFx4QTgnXHgxMVx4RDFceDdGXHgwN1x4QkJCe3FceDAzXHhDQ1x4RDFceEI2XHgxQ1x4OTFceDhEXHhBMFx4QTRCM1IkXHhFMVx4QjElT0lceEFBXHgwOFx4OEFceEY1XHhBMFx4RjlceEI3XHg5M1x4OUNMXHhGQXtceEFEXHg4Rn1ceEZFZFx4RjlceEFFXHhDOFx4MDFceEE1XVx4RkNceEZFJW9ceEJGOWEqXHhDN1x4RTRceDgyXHg5N1x4QkVceDg3XHhBN1x4REUzXHg4Q1x4OEZceEEzXHgxNVx4QkZceDhEXHhFQVx4ODVceDA1XHhFNFx4MEZceDFCXHhGNEdMXHgwMjlcaHlceEY3XHgxQVx4MTdceDBBXHhBRlx4RUN4M0VceDAzXHhGOVx4RUNceDk2ZVx4RjZceDgwXHhBQTtceEYxXHgwNlx4QzV4XHgxQ1x4ODNceDg3XHhDNFx4MEN9XHg3Rlx4QUVceEMwXHg4MVx4QkJceDlDc1BMOVx4QzZceDExJlFceEE4XHhERUlceEM3XHhDNFx4MUM/XHhGRmRceDAzfFx4QjlceEE0XHhBNFx4QjFceDA4TFx4OEFsdFx4RkRceDk0SFx4MDdceDgwXHg4M1x4QkRceEEwXHhCNi1ceEM3XHhDQXVceDkxaVx4OTBceERCR1x4OTFUXHhDNFx4OTNhMkhuXHgxQTdceEFBQlx4ODAtXHhFOVx4QjlceDBGXHhDRkR6XHhFOFx4MUJFXHgwNWZceDFCXWhceDE5XHgwMFx4RkIndkZceDA3Ylx4OThuYmpceEQ2J21ceEE5L1x4RkNceDkzXHhBRnQ6XHhDOUJceDA1XHhFQmRceEUzbVx4RTMmXHhDOVx4RkE8Xyd3XHhGOFx4QkRceEJGeVx4ODBceDA3XHg5MVxceEUzXHgwMlx4RjBceEZEJVx4RTRceEVBXHg4NFx4RTZceDk5XHhFQlx4OERceDEyRlx4ODVceDlEOFx4OTNceDA1XHhENlx4Q0JceEQ4amdceDFFXHg3Rlx4RjFceEU4fFx4MTBceEFEXHhBMClUXHhCN1x4MDhceDkzXHhCNlx4ODVtQFx4OUZceDg3Qlx4RDdceEE5c1x4RUQjVE9ceEQ2XHgxQXVceEMyXHgwQlx4ODNceEE2XHgwOWJceEZDN1x4QTZceDhCXHhFRFx4RTY4XHgxQlVceDhGXHhDMWZceDBERGZceDkwRkdceDgyc1x4MUZceEQ4QFx4ODFceEY5XHhCNlx4RDZceDEzXHg4NWNceEVDXHhDOFx4OUNGQiNceEQ0XHhEMFx4ODEvXHgxRFx4REFceEZGPVx4RTVceEVCXHhCOVx4RDBceEFEPydceERDXHg5RVx4RTRceEM0WVx4MUNfXHg5NFx4RjlceDk0XHgxN1c2fU8vXHg5M1x4QkF5KUBceEMwXHhCQVEhXHhCM1x4QjkmYCFceEEzXHg5Q1x4QjZceDg0XHgwMGdceDhEXHg5Q1x4QzRceDE4Olx4QjZceDA0XHgwNSJceEM2XHhGQ2hceEYxLC4ucFx4QjhtXHgwMVx4RDI3XHhBNlx4RjNceDg1XHhGN1x4MDRceEZFXHhCQ1x4QUFceEFFViJzXHhCRFx4QTBceEMxXHgwNkxLUlx4MUVceEVDSlx4MDhceEVGXHg4MVx4RTFceEQ5XHhBNThceEI3XHhFRFx4ODRceEU2XHhEN35LIFx4RDR1XHhceEE3XHhEQlx4MDNceDE3PFIwPFx4QzZceEVBNFx4MUJceEUyXHhBOHdceDgyXHgwRVx4QzlceEM3XHhFQVx4MUJceDkwXHg4Mlx4QTJceDlFXHhDNHxceDhDXHhDMFx4MDhceERDXHhDN1x4OTdwXHg5MFx4OUVHI1x4RjdceEVGXHhGMVx4Q0M3ZE9ceDA4cVx4QjlceEMzXHhCRlx4ODZceEVEXHgxQSltXHhGQlx4MUFceEQ5XHhBRVx4ODE7XHhFNFx4RERceDkyXHhFOFx4QzJceEMxXHhCOVx4RUZceEY1XHhCMDxceEM4Pl9ceDBBTXM5XHhGRmpoXHhFQlx4RTQlXHgwNlRiJnBGXHhBRFx4OTVceERFXHgwOFx4RDVceDhGdyNceDhGPWFceEM0XHhGMFx4QkR0YlYpM2RceDFEXHgxOVx4ODMkXHhFMFx4MUJceEI3XHg5Qj5ceEEzXHhEMXJceDE2XHhCMFx4RDB6XHhEQU9ceEI0XHhBNlx4QkVwJjJiXHhCOS1ceEZGQlx4QzhceEQ3OEE/XHhFRlx4MDRceDFBXHhCNil5XHhFNFx4QkRceEIxXHg5Rlx4MTJceDFDRURaXHhGRFx4Q0JceDFFXHhBQVx4QTdceEY0XHgwQU1ceERDXHgwOHc5fjovPiguXHg4MElceDlDXHgxMHtceERCXHhFNVx4OEFceDAxSlx4OTVceEJBXHhFQWB+Ulx4QzNNXHgxOCFceEYzXHgwMTtceDlFXHgwRVx4REVceEQ1dXhceEEwXHhFQlx4MUQzXHg4Mlx4ODJceEVEXHhGRnQ5XHhCQVx4MEVceENDXHgwNyVceEU1XHgwQVx4Q0NoXHhCMVx4QThbXHg3Rlx4QTZceEU0XHhEQVx4QUNceDhGXHhFQ1x4OTJceEJFdlx4OEZceEMwN1x4REJceEE0XHhGMlx4REZceEJBXHhCMl08XHgwMzRceDk0XHhDQyFceDBGXHg4MVx4MTBpXHhCNVx4OERceEIzcDpceDkyXHhFMVx4QzUkXHg4NFx4ODI/XHg4MFx4REFPXHhEOV9ceEEzLDN9XHhGQ1x4RUReXHhERENmXHg3Rlx4MTlceEJGXHhGRE5ceEYyQ1x4MEVceEI0SFx4QTNceEQzXHgwM0dceEY2cVx4MUVceEI4OVx4QjBceEI1XHhCRn5LRSpjXHhBMGIoX0ZUXHhGNXRceEFEKXpceDlDQGdceEMzLFx4RDVceDlEIFx4REEgXHgxMVx4OUZceDE5a1x4OThPXHhCQSxceEExU1x4RkInXHg5Nlx4Q0VceDk3XHhEOFx4RThceDg3T31ceEE2XHhBQ1x4RTdceEZDXHg5Mlx4OEJceEM5XHgxRW1ceEE4XHhFRlx4QkNLXHhFMlx4RTZceEVDXHhEMVx4QzlceEEyT0lceEZEXHg5N1x4QzdGR3lceDFFXHhGOVx4OUFceERGIVx4RDVmXHhBRVx4RTZceEQ0XHhCRFx4RjlceEFFTytceDg4XHhFRVx4QjNmXHhFNyhRWFx4RkQ3XHgxNlx4MENceEQxXHgwMFx4MDE8XHhEMVx4RDA1d1x4QkVceDFFXHhBQVx4Q0JceDE2XHgwQlx4REVceDEwL1x4RUZceEE1XHg4OFx4QjFZZFx4MEJceEZFNi5lIFx4Qzk0XHgwQ1x4RTdceERFXHgxOVx4MERceDAyXHhFNVx4QzNOXHhCQlx4RDN8XHg5Q1x4RTl4XHhGNFx4ODNceDk2XHhEMVx4RDN+XHhEQ10rPDRceERDJFx4RkIlXHgxMFx4QTFHXHhFOUYmZnFceEEzXHhCQndbSVx4OEEhXHhCQXVyXVx4RjlceEEzXHhDNFx4MDdQXHhBMlx4MENUXHhGM0JceDBGXHhCNlx4RDlceDEwXHhCMSxceDE4XHhCNVx4ODNceEUyXHg4NDBceEE5djcmcVx4QTJceEYyO0V5T0VjXHhDNVx4RkJceEI1XHhCRVx4Q0ZceDE3XHgxQnJDRDtceDhEXHgwNFx4QkVceDE0XHhDRlx4QzFceERFZVx4MEVceEQ5XHhGRVx4MURceEI3blx4Qzcjblx4RTdceERDXHhDNCN+e1x4ODkqUEh1XHhGM3JceEY2SVx4QUZceEY5XHhGN1x4MENuXHhBQ1x4Q0NceDFEXHhERlx4REYsXHhCQUR2Ulx4OTdceDgzXHhEQVx4RjRceEIyeFx4QTldXHhEMlx4RjBsOlx4RjBceERDXHhENnVrZ24pMlx4MDZceDg4XHgxQVx4OUZceDA0XHhGQVx4QjdceDkzXHhFNHFZOC5ceEU2XHhCQlx4OTRcXHgwQ1x4RkZ2XHhFMVZceENGOVx4OUNceEY0bFx4QzNZXHhBM1x4MTNceDA5XHgwMlxceEJCXHhBQlx4REFceDBFRlx4RjRceEM2XHg5Qlx4ODAsXHhBQ1x4OERceDgzXHhGRFx4Q0JlXHg4RFx4RkFceDg2SjJ5RFx4MDVceDgxXHg4Mlx4RkRceEFEXHhDQlx4QURceDEyRlx4RkFceEQwXHhCMlx4OThceEFGXFx4MDBceEY4XHhFQlx4OUFOIlx4OTlceEM5RytceDAzXHg4MVx4OThceEQyYlx4RjJceDBCRlx4RUZceDBEXHgxRVx4QkZceDA4Plx4QTl+JVx4RkNQXHg4Rlx4REJceDlEXHgwOC1ceDkxXHgwNFx4RkJceEYxXHhBMVx4RDdUVS5rXHg4Nlx4REFceEQ0XHgxNlx4Q0JceEQ4U1x4RjJcXHhCOVx4ODRceERCfm1ceEU1XHgwMmwiPlx4MDg8XHhFQ1x4QkJGXHhBRFx4QzVceERFZlx4RkQ7XHgxNFx4QkJceEYyXHg5MFx4MTBCXHg4MTQ8XHhBN1x4QUFceDE3aThceDBDXHhDRVx4QjFceEMyNERceDg0XHhCNVtceEVBXHg4Nlx4QzVceEVGXHhBRlx4RjBceEYxTVx4ODNEaTRceDFBfFx4OTRceEQwJWd7XHhEMCNceDAyJVx4MTFceEU0XHgxNlx4QjdceEM4XHgwMzZceDE3XHgwQWhLcmYrXHhGOVx4RjZceEQ3XHgxN1x4RURceDkzXHhENVx4MTJceEI5XHhCOVx4N0ZfXHhENFtceEVBfDJceDgzXHgxM1x4QzBceEJDalx4QkRceEI3WVx4QzRRSkkgRVx4ODkvXHg5Ri87XHhDMVx4RjhceDE1XHhFMj9ceEVCXHhGNlx4OUFceDA1XHg4QVx4RTdceEVEYFlceEQ2XHg5M2JceEYzXHg5Qlx4RjhhXHhGN1x4MUJceEMzXHgwOVx4RTBceEQ3XHhBRkVceEExb1x4QTBceDA1e2dceERDIitceEM1SFx4MTNceEMwXHgwQVx4OTRceERBe1x4RTdceDE2QFx4QkRfa1x4RjBMXHhCOVx4ODk+XHhFOFx4RjkoNlx4MEJceEIzXHg5OFNceDhGXHhGMDUjXHg4Nlx4MUVceEQxdlx4QjNtVVx4RTNoXHgxNVx4RkJ+Rlx4RkFbN1x4MUJgXHhBM1x4MUZceEU5XHg5Q1x4ODBVXHhEOVx4OURPXHhFNUZceDBCXHhDNVx4ODEnVmRceEFDYXlceEE3XHhFRVx4ODBceEYycFx4QkVceDBGXHhDRidceDA0KVx4QTZceEJCXHg4OVx4ODVIXHhGM1x4QzBhXHhEMlx4MTd9XFx4QzdceDk0NSxoW1x4MEVceDE0cFx4QTVceEJBXHhCOVZceEJDXHhEMlx4RjI5eFx4QkNceEEyXHgwOVx4MERfXHgxM1x4OTRsXHg4NFx4QTR6XHhDNzlceDE1Z0dybnEoXHg4Q1x4OTJceEUzdkdIXHhEQ1x4RDgyRVx4MDNNXHhEOFx4RUFoXHhEOVx4RUNceEIyXHhBRlx4RDVceDExXHg4Mlx4QzQkXHhFQVx4RkZceEUxSFx4QThceEY1NVx4RDdceDFFXHg4RjxceDA2XHhFNVx4ODJkLlx4QzZceEE3XHhFRVx4RDZceEEySlx4ODhyV0NceERBXHhCM1x4RTNceEIyYGJceEIxXHg5RGBceEQxaFJceDk5XHgxRFx4MURceEVFNlx4MDdceEQxaVx4OEZVXHgwNCouIkxceDk3XHg5MFx4RDJOXHhCOFx4RUNceDE2ZVx4MUNceDAzXHhBQ1x4MEVceEM3XHhDM1x4QjdceEQ3XHhGMCdceEZDXHhEMDFfTVx4MUZceERBRlx4RUNceDk4clx4RURceDkwXHg5NVx4OTZceDhEXHhDNFx4OERceERCXHhDRFx4RDd4XHhDOFx4RTZceEMyXHg5OTBceDFCXHgxNFx4OTVXXHg4RFx4RUVceEYwXHhGOVx4OURyXHhFNms0elx4RkRceEYzXHhDNyVceEEzTVx4RUZceDlDXHhFNVx4OTJceEZCJjpWSFx4QUFceDA2XHhDQjBceEIySFxceDFFXHhBQ1x4REU5XHhBNlx4Q0RceEVBYUdlXHhCQlx4Q0ZNXHg5RVx4QkJrXHgwQVx4ODJceEQ4WVx4MDhrXHhEMDNceEU3Y0JceERBXHhGRFM5XHg5Mk94XHhDRFx4ODJceDg2XHhCOEFceERFM1x4RjZHXHhFRlx4ODJdXHgwMVx4QjJceDk2RFx4MDRceEJDXHgxOW9wUlx4OEJceEJDXHhCQVx4ODcwXHhDNFx4OTlceDlBO1x4MDMyXHg4MVx4MUQnXHhBN1x4QzRceEVGbFx4QUNceDA1YSZuXHg5MDBceEM4XHhERkNpXHhFMVx4RTROfCgjZFx4QUJceEI4dVx4ODkgXHhEQVx4MURceDk3XHg5Rlx4OERceDdGUDUlbFx4QTFVXHhBNlx4OUIvXHhEN1x4RkJceDhDXHg3Rlx4QzQhODpceDA2XHhCMEhceEM1XHgwNlx4ODVoRVx4RTBnaE9ceDEyXHgxN1x4QzBpXHgwNlx4Q0JaMlx4QkVceENGIlx4QzZvYlx4QzFzXHgwQ2BZR1x4RkNceEVCXHhDNixceDBBXHg5RFx4ODdceEEzXHg4MVx4ODVceEM3P1x4RDMrNzEkXHg5RlRceEVCc1x4MDRceDlDZ0ErXHgwN1x4MTNceEI4XHgwQVx4RDdceEEzM1x4MTJceEIwXHhFQzdceEU3Klx4MDRceEFEXHg5QTlceEQyXHgxMUhceEVGXHgxMVx4OTdceENCXHgwQVx4QjQ7XHgxMFx4OEFyeVx4REFceEQ4XHgxNVBceDhEXHgwOFx4QUJceDAyXHgxMnpceDBGP1x4REZ8YDNOY1hRIlx4QTZceEUyKVx4QzhVXHhGM1NceEYzXHhCOWFceEE3XHg4MVlceERFXHhGMl5BdFx4QzhceEMwXHhDMiBceDg5XHg4OFx4RkNceDBCXHg4NFx4QzZceEMyXHhCRFx4RTghXHg5MkdceEVBXHhDRVx4QkZceEQ2XHhFQnxceEUxXHgwQz9ceDg4XHhBQlx4RThceEQwYFx4RTd1Zlx4MTZceEJEXHhENFx4QUYwW1x4RTg3elx4REEnXHg4NCVceEYwXHg5MVx4QUNgOVx4RTBceEE5XHhCNVx4ODZTXHgxOVx4MDQoXHhBN1x4QjBceDhDXHg4Nlx4OThceEMxeVlceEI0XHgwMFx4MDJgbVx4ODVceDkwXHhCNVx4RDVceEE0XHg5OVx4MTNceEQwXHg4N1x4RDkpXHhFRiRceDFBelx4QzRceEYxXHhBMVx4RjhceDhGalx4RjM7XHg5RUJceDFEe1x4RTRceEZGZVx4QkJceEIxXHhDRFx4RDFnXHg5QVx4MUJceERGXHhGMlx4OURXXHgxNU5ceEFFalx4QTVtXHgxM1x4RThceDFEXHhENlx4OEZuXHgwQlx4MTI0VWtceENDXHhENlx4RTI3XHhGNFx4OTRceDExKGtgXHg5MVx4MDFqXHg4QjkkXHgxN0x6XHhBQnJceDE1XHgwMUxceEVEXHgwQjtPKFxceEVEXHg4Mlx4MDQzXHgxM1x4QzdceEQ4RXhceEFGXHhGQz1ceDAyXHhCRVx4QURceDlBXHgxMlx4MEZ7XHhBN1x4Q0JceDgzaFx4OENceEE1XHhCMCxceDFCXHhFOStceEMwIFx4RkVceEMzXHhBRlx4OEZceEIzXHhBOVx4MURceEE0XHhDQVZceERCXHhDND1ceEQ5XHhBOG5ceDA4XHhBQ2lceEE3XHhDNFx4MDNceEE2QCBceEE5fFx4QTVceEEwP1x4ODlceEE5XHgwMmxceENEXHhBMVx4MTJfXHgxNGdceEY3XHgwRlx4MEFiZVx4QzY9Plx4MDZceDgzV0dBXHhDOWdceEM3ISRceEE0XHhBNVx4MUZceEU4XHhDNlx4RER1Qlx4RDRiOFx4QzJceEEzXHg4Nlx4OTBceDkwd1x4RDR0XHg5RFx4QTZceDg2PVx4QzJceDkwXHhGRlx4MTVVXHhDRFx4REI+XHhFQVx4REJceEUwNiEpXHhCN1lVXHhGMExgTFx4RUNceDFFTFx4QTJceEFEXHhGQlx4QjNhbVx4QzRceDlEQkZceDk0XHg4Mlx4RjVuX252Ulx4MDVMXHhCM3JKXHhCM1x4QzVceDhCNXcnQlx4RUFceDg1XHgwM1x4RUFceDgxRFx4OThceEI2L2BceDlDXHg4Nlx4MDJceEMyXHg4MFx4RDZceEVFXHg4RF4iR1x4REFceEIxRlRceDBDXHhBNHR+XHhBMVx4MTBneFx4QjlceEQ3Qi9ceDk4Llx4RDhceDk1XHg4MEtceDk1Nlx4ODJceERGZHVceERCS31BXHhFRElceEI3XHhDOVx4RjBceERDMU5ceEI1XHgwQS59XHgwOVx4QThceEI4XHgwNVx4RjlceEIwdlx4RUY8XHhFNFFzYmduU31ceDgzXHgwRFx4MThceEE4XHhFMG9ceDg1cjVZQFx4QkNceEUwXHhGMlx4RUJceEJEXHhGM1dceEEwXHgwMlx4RDFceEEyP1x4OTdXXHhBMVx4RDZ2XHgwNVx4OTh4XHhGQlx4RkVceENGXHg5Mlx4QzBceDgxXHg5NFx4QUJceEE3V1x4RjhceDg2dXhceDhGXHgxOFx4QkRQXHhDQ1x4QjEhPFx4QjFceDlEXHhEOUdceDBCM1x4Qzg4XHhCRktceEMwXHgxNFx4RTk0XHhGRVx4OURceEIwXHhDNyZceEVGYlx4QzZceEQ0XHhGNFx4QjhceEMxXHgxOVx4MUNceDA3XHhFOVx4MUNceEMyXHhDNlx4MDhceDBDbVx4RkRceDhBXHhEM1x4RENceEY2WFx4OUVceEIwNVx4MURceEMxXHgxOU9ceEY5XHg4Rlx4RDVceEY3XHgwQ1x4N0ZceEE4XHhFRVx4QkJceDgzXHhCQVx4REJceEY0XHg4OVx4Q0JSXHhDOVx4ODBceDA5Z1x4RDZceDA5XHhDNGJceDg1R1x4MUNceDlCXHhENXlceEFCXHgxNVx4QkRceDAxT1x4QUYoUFx4RDhkXHhFRlx4RDBoXHhCM1x4RDlUIFx4RjJceEIxR25ceDlFX08iXHhGQ1x4RjdceEQ1V1dceDE0LVx4OEF9XHgwMVx4QTFWXHg4NERceEQ2TVx4OTV+e1x4OUNceEJBTj1ceEZFc1x4ODZceEI5XHg4Rlx4QzJceEYwfFx4QzdceDg4XHhGREJceDAyXHhENFx4RDhceEY2a1x4ODM/XHgxQVx4RkJceDBBKFx4RDNceEI5XzYiXHhGNCliV1x4N0ZceEZCLFx4RjJceEE5XHgwQT9ceEREKU9ceEVEXHhGMVx4RDFceEJEO1x4ODJceEQ0XHhFOEBceDE4XHhDQlx4QzVceEFCXHhCRlx4RTZceEUzXHhEQlx4MDdceEI4XHg4QzZceDhCUHdceDEyT1x4RjVceEI1fVx4QjRAUXsjXHg5RGJceEMwXHg5Mlx4QjNceEUwXHgxNlx4Q0NRXHgwQ1x4RjVEXHhCQlx4N0ZceDg3XHg5MFx4RUEmRVx4MTNceEI4XHhFOVhceEY1alx4OERceEM2XHhCNC5ceDE4XHhGNFx4ODNceEYyXHg5N1x4RjN7U0FceDg1a1x4QTNceDk0XHhENFx4QzBceDBDXHg5Qlx4RkZceEM3XHhFOFx4REMzXHhGRlx4RUI6XHhGQkpceDk5KVx4MTJceDg3XHhCQ1pceDk1XHg5QkFceEFDXHhBQVx4QTlceDk3XHg5NVx4Q0ZceEFGXHhGOVx4RjEyXHhDNkErXHhGMVx4REFceDlBPlx4RjdceEIzXHhCOFx4OEZceDBGelx4ODhuXHhDRUhceEEzXHgwOFx4OTZcXHg5MyRDXHgxOFx4OEJceEE3ZlRgXHg5QVx4Q0VceDlEXHhDNFx4MThceEY3XHg5QzRceDk4XHhBQmd3Xlx4QjZceEYzXHhBRVx4RUZceEJEXHgwOVx4QTdceDg0d1x4OUFceEQySFx4REFceEQ5Pl5uXHg5Q3FFXHhBRlx4QkZFXHhGMFx4OUNceDAzXHg4NipKXHhBNlRceEJDXHgxMVx4RTlceEY1LVx4QUZPXHg4MVx4MTdceEU5XHg4RVx4QTRceEMwXHg5MVx4OTNceEY4XHgwOHVceENDIlx4QjZceDlBW1x4Q0VceDg5XHhFQ1x4QThceERCXHhFQyFceENGXHhFNlx4OUNceEQ1XHhEM1x4Q0RceEUxXHhDNlx4OTFceDlCXHhFNVx4RERSXHhEMVx4QzJceDlDXHhGRlx4QjBxXHhGRVx4QURceEEwQVx4ODdceEQ0XHhBMlx4OEZceEExSm96XHhDNVx4OTdceDE0XHhGRVx4OUVceEVDUlx4QzNceDhDXHhCQ1x4OTlceEYxdGg8XHg5OVx4RkZrXHhFMlBceEI2XHgwQjxceEE1XHg4MEFceEY1XHgwRVx4RDFLaFx4MERceEYyXHg4NUs6RVx4QjNceDgxXHg4Mlx4QTZceEIyXHhCNFx4RjVceEY5NG17XHhBMThceEE3XHhGQzY5Zlx4RkRceEIzXHhFQmd8XHhBRTFsXHhBOVx4Q0R1XHgwNlx4RkJceEM1a3tceEUxMFx4QzZceEU0XHgxRFx4OTV9XHhBN1x4MDFceDhGXShtUlx4OENceEJEXHhFRl9ceEQxX1x4RDZceDFBJlx4QkZceEQ3XHhCQ1x4MTZceEE0XHg4NUFceDlDXHhEQSJceEYzQVx4RENceEVDNlx4RjBceDkzXHhCMlx4MTFceEUxW1x4RjBceEI0XHhEQylaNicnXHhDRlx4RDV5XHhGNFx4OTZceEZBbFx4OERcXHhCQVx4OTBceDE3Pj1ceEUxXHhEMVx4RDVceEVDXHg5RHhtXHg4RmRceDEzJ1x4OEFceDA2XHgwOVx4MTlVXHhEMlx4REYofFx4MUIvYFx4MEZOXHhBQ25ceEYwXHhEN1x4RkNceDhCXHgxRFVceDFCVVx4MTJ4XHgwMVx4QjNceEZBXHg5N1olXHg4NmxrXHhCNltceEVFRVx4QURceEY5I1x4RjJjPlx4RTkxT1x4QkRceEMzK1x4RERceEJFXHhDMlx4OTdceDkxXHhDMVx4RDlceDk4XHgwRVx4RkJceEJGJVx4RDBVc2BceDE0TEhCa1x4QjhKXHg4MWBceDAyO1x4QUQvXHhDQ1x4RURceEIwLCxBXHhFQVx4RDB9XHhGRE8iXHhEQjZQXHhEMlx4MDJceDA0U2RceEQ0XHhFNUwkXHhBMnBceEQxXHhCM1x4QkRceDk5cVx4OTZlXHhBRVx4QThga15ceDg0SFFceDgyV1x4MTdceEI4XHhFQVx4RUFceEMySFx4MEJ2XHhGRFh5XHg5Rlx4MTNceEZDXHgxNVx4MDlceDhCXHhEMylNXHgwQkxceEE3XHhGM1x4Q0FceERDXHg5QVx4ODBceDE1XHg3Rlx4RUZceDA3dWRceEREXHhEQVYyXHhGQkBceEU0XHg5NFx4RjE3eUBceEUxXHg5MFF6aVx4OEY0VDlceEZCW1x4MTFceEVCTGV5KnpceEEwXHhFRVx4QTNceEM3XHhCN1x4OTZJXHhGQ1x4MTRceEYwXHhFQVx4QUFceDkyXFx4MUNceEI0XHhDMVx4QjlceEE2X1x4MUV4XHgwRVx4ODZceEI5XHhENTclXHgxOVx4MDNceDAwXHhCMFx4ODZceEMxXHhFN1laOFx4RURdXHhFM1x4QkE3XHhDNlx4RUIkNlx4RDE4MVx4ODZjXHhBNlx4QTJceDhFXHg5Q1x4QUJceDA0XHhEQ11uQ1x4QTBMM1x4RTRceEU2XHhDOVx4RURXXHhFNDVceDAxVl5ceDAzMWVBXHgxQTF1XHg3Rlx4QjVFVWt9XHg5MVx4Q0YrfnVceDE5IFx4RERVXHhGM1x4RjJceEJEPlx4ODdceEIwKlx4RkVceEVFXHgxQ1x4Q0FceEVEXHhBQnJceEU1XHgwMlx4MERdK1x4QjNceDk3XHgxNlx4QTJceEQwXHg4Rlx4RTgqYixceEY3XHhCMFx4RjdceDBEXHhGMHgnaVx4RDZceDg1Ulx4RTFceEREXHg4Mlx4RTBceEQ1XHhBM1x4OERPXFx4QzBceEVDXHgxN1ZHXHhEM29ceEUwXHhDQ1x4RTBceEZEXHgwQ1x4ODFCXHhFNFx4MTRceERBWFx4RTdceEQ0X1x4MTBHXHhGQ0R5XHhDRWdceEQ0XHhFMlx4QjdceDBEXHg5QllceEQwb3lNUFx4QjNceDAzXHg3Rlx4Qzc7XHg3Ri9ceDg2Sj9ceEE1e1x4ODRXXHhGRktceEU2XHhBOVx4OEVceDAxXHhGOVx4QTYqXHhDMFx4RTZceEI3QFx4RjM9a1x4RjVceEI2UVx4QUZceEExXHg4OVx4MEVceDk0XHhDMTpceDk3XHhCRVx4QURceEQzXHgwRVJceEYwXHg5MFx4OTZceDk2XHhCQ1x4RDlLXHhERVx4QjBceDAzRy1mXHgxOUZceEEwXHg5Q1x4MTdceEJDY1x4Q0NxP1x4QzlceDA2XnRceDhFOFx4RkFvXHhFMlx4RjVceEVGZUpnXHgxQzVceEU4XHhFN1x4MTlceEY3XHhGMFlceDFGI1x4RTBVVFx4QTlceEE4ZFx4RjJmXHgwOXpceDkxXHhDNlx4RjlAXHg4RVx4Q0EiXHhCNH1ceDg4Nlx4ODBceEVCXHgxRFJceDE5XHhDRlVBXHg5RVx4REJqXHhCNVx4RDlceEUyeXt8XHhGOVx4QzBceEE2O1x4RkZceEJEXHhERFx4MDUlXy5ceDhEUFx4RDlceDgyeFx4OEVceEJGTFx4QTZceDkyZDlceDFFXHgwM31ceEVGXHhGQVx4ODlceENGXHhDRGxGZVx4RDJceEQ5XHg5QikqaG9ceEVGXHhBOFx4RERQXHhDMlx4ODlceDAzd1x4QjMvXHhEODxceEFFQlx4RjRceEI1XHhCNCArXHhBOVx4MUVceDAyQFx4RThceDg5J1x4QTlceEE4XHg4OGZceDk5PFx4RTQ1SSRceEIyWFx4QTkrXHg5NVx4RjNAXHg4RVx4ODVceDlFXHg4MG5rIVx4MEY8enNceEVDLn4gXHhBRFx4RjhceDhCLFx4MUFceEI0XHg5Nlx4RkVceDE2XHg4Nlx4MDIzKVx4MDJceEJGXHhCN1x4QUJceDBBXHhBM1x4REZceENGTFx4OTlceDhCI1x4MENceDEwXHhFQ15ceDk5XHhDQlx4OURceDEwXHhCQVx4QTZceEE4XHgwOGFceDBFMFx4OUVceDlFaVx4MTFceEFDXHhEM1x4MUQ8XHg5RFx4MTFceEJDbVFceEY4XHhBMz9xXHhDMkYuVVx4OEFRYy5ceEM2XHhDNFx4MURceEJGXHhFOF58XHhDMitceDExXHgxQlx4QzdceDE0M2pkVkdceDA0XHhERVx4OTFceDFBXHhERlFceENCM25ceDA4XHhDRT9ceDlBKVx4QkE6X1x4QzJceDg2XHg5MVx4OTdceDgwXHg4QzYxTlx4RkJceDFGXHhDQlx4QkFceDE5RTNceDBFcFx4QjJSRD4rXHhENFx4QTc6XHg4Qk1ceDE2Wlx4OEFZXHgwMFx4QThceEFGXHhCQlx4OEFceDAxXHhDN2VceEY2XHg5Qlx4N0ZceDBCXHhGNVx4QzZceDhCXHhERFx4RTBceDlGXHhENURceEQxO1x4ODBceEZEXHhBMlx4RjVceEQ2XHhFRFx4QjFceDAwXHhBNFx4ODleP1x4MTUlXHhGNVx4QjRceEMzfVx4QzgpXHhFOX5ceEMzXHhENlx4Q0JceEJDXHhCMWN5XHhBM1x4N0ZzKHpceEM0J1x4RDRceENGXHhBQlx4MURceEU0XHg3Rlx4OThceEFEXHhBQVx4OTVceEYyWll1Y1x4QzEuXHg5QVx4ODJceDE5OFx4RDlceDdGKlx4QzAjXHhEOVx4QzNceEQ5T1x4MUMqXHhDOVx4QTl9XHgwNCpiblZceDA3XHhEMVx4QTB9XHg3Rlx4RkJceDBFalx4RDB4XHgxQlx4Q0JceDgxXHgxNVx4ODRceEI5XHgxRlx4QkJ+JmV1XHhCQXVIXHgxOVx4RDRceDhEXHgwQmojPVx4QzciXHhFNVx4QzVceEEzXHhGMlx4OUQ2XHhBNld0XHgxMlx4QTJceEE0XHgxN1x4ODJhJk1aXHg4Nlg5XHhFMFx4MUVceDFFXHg4N01XZ0xCXHg4Rlx4RDVYXHhEM11ceEVGIFx4QjB3XHgxQXFceENFXHhCQ1x4OERceEVBXVx4RDhjXHg5MVx4RkRceDFCWVx4MThceEVGJ1x4OUQiX1x4Q0Q5XHhFRVx4RENUXHhCQkV1aFx4QkZoXHhGNFx4MTFceEM1XHg4M1x4RDJCK1x4OEErXHg5NDZNXHgwQVx4QzBNXHhFNktceDA2XHhERFx4RkVceDBBNVVceEVDaFx4N0ZceEE5XHhCMlYlXHhERlgycVx4MDNceENEXHhGNFtceEFGN1x4MDUxXHhBNVx4OEJceEU2XHgwNFx4RkM7XHhBM1x4QjVceDBCXHhFOVx4QzVceEJCR1x4QzdkYlx4RjlceDdGb1x4QzBceDAyXHgwQW5ceEJEXHhBM1x4Q0NceDhGXHg4Qlx4OUJceDBFXHgwQ1x4MUR7XHhDNXovXHhBM1x4ODZ4XHg4QVx4QjdbTVx4RDgqXHhBQjhhXHgwN1x4OTRceENDXHhBMFx4OEZceEJDXHhCNi1ceDE2XHhBMll0SHtceDAxXHhENVx4QzhVXHgwMCNyXHhBMlx4Qjh7VUdceEUyXHhDMjJceENFYFx4QzZceEI2XHgxN1x4ODE0IVx4OUI4YFx4RjNceERDXHhCMlx4OUFhXHgwMSlceEE1Xlx4RkV5V1x4MEZFXHgxNVx4ODFceEJFalx4RTRceEYxIlx4MUZceDE1XHhGOVx4RTlceEMyXHhEMk1ceDA1TVx4RDRYdFx4RERceENFXHgwNmZSLFx4RjFWfFx4MDggXHgxMjhzaFx4QUM7UFx4RjBceEQ2Q1x4QzhFXHgwOTlceEYzN1x4QkZYJiNceEY2XHhDNFdceEIyKlx4QjRceEZCXHhFMlx4OEEsXHg4RDpceDg3Y1x4RjVceEMzQV9ceEUxUVx4QkJceEU3XHgxN1x4REZceDg1dVx4RDhhXHg4NVYoXHgwOH1ceEY2b1x4QkZWXHhCN1x4RTRceEE1XHgxOFx4QzBMXHg5RW9ceEE4bnlceDgxXHhCMlx4REJ+UlpceDA4XHgxNk5IXHgwNlx4RkVceEMyXHhGMlx4RDViLSczXHg5MVx4RTQ9WVx4MDBceEU1XHgwMFx4ODRceEMzPlx4OEJEXHgwQlx4RDNceEUyXHhCQ1x4OEZceEIxfVx4QTVceDA5V1x4RTJaPlx4OTVceEMwXHg3RmJceEQyXHhGRVx4MThceDAwXHhBNFx4RDEgNFx4MTdceEE2ICpeXHhBRVx4MENceEVBXHg4NFx4OTZYd1x4MDFceDA1YzdceDFCcjBceEUzT1x4RENceEI1dFlIXHhEQlx4MEVceEJBSlx4RUVceDg5XHg5QThceDEwXHhCQVx4QUJceDFDb1x4RkRDJSFIXHgwMVx4MDNceEQ2Zlx4MTZceEQwZVx4QURceEY5XVx4RjRceEEzVVx4QjJceEMxXHhCNlx4MUVceEM2XHg5M1x4RDJceDlEXHgwN1x4RDdceEIzXHhGNmNceDE3XHgxQVx4QTZceEUwXHg5RXdceDgxXHhDOFx4QTFkSzsgXHhFM1x4Q0NceDlCe1x4RjN7XHgxRnVceDlDXHgxQVx4RUNOdVx4MTItYUxceDgyXHg3Rlx4QkVJXHhBNFx4RUNXXHhBMVx4RThceDEyXHhCMlx4RTFceEJEJVhceDdGXHhCNjxceEZFXHhBMyZceDg3XHhCQ1x4QzBceEQwXHg4Nlx4RTdXMVx4QTI/XHhCQlx4OEFceDkyXHg5N1x4QTFceDFBXHhBOFx4QUFwXHhBRlx4OEFceDFDXHg5NVx4RjZceDEwXHg4M1x4RDRceERDXHgxQVx4MEZYXHhENGVceEM1XHg4QVx4QjJoXHg5QVx4MEFceEY1Y1x4QzN2XHhCOXJceEE5XHhFMkZceEE1XFx4MDdceEU0XHg5MUNwXHg4M3pceEVDYlx4MTJceEY2eEJceEE2XHhCRFx4RDlceERCXHgwOFx4QTNceDBBJ1x4OURceEE3XHhBOFx4OTVceEIwXHgwMlx4REZGTzJceEUwbFx4QThiXHgxNE51XHhEOFx4OEZjZVx4RjZceEU5XHhFM1x4RTRceEE2XHhBNTZtXHgwQ1x4QjNceEJFLVx4MUZEXHhEMlx4ODNcXHhEOFx4QUNceEJCcVx4OTJQXHhCMX16XHgwN1x4RTFceEE1XHg4NVx4MTBceDkyXHhGRVx4OUNgd3BuZlJceDE3XHg5Mlx4MEFceEVCTWR3PFx4Q0NceEM2XHhDQlx4RjZceDAydFx4QUZceEM5aGJAYVx4N0ZVXHgwNFx4OENceENFXHhFQSFuUFx4RER8elx4RjhceDA5S1x4RTJceEVDWFx4OTNXXHg5QVx4REQ3XHhEMjpceDFFXHhCQ01ceEJEXHhFNVx4OTFceDkyT1x4QkYhXHhGQVx4RjVceEVDSnlceEE0P298XHgxRC9ceEVDYl9ceEQyKUVceEE2IVx4QzdceDAxXHhFQ1x4RjZceEJEXHhBRVx4ODZ6XHhFRlx4OTRceDhCXHhDRFVceEI2XHg5Nlx4OUNceDgycVx4QzJeXHgxNkVceEYzXHhGRVx4OEZ+N1x4OEJceEMxXHhFOVx4RDBceEExVVx4OURceEJGXHhFNHpceEY0XHhGMD9GXHg4RFx4N0ZCLk9ceEY3XHgxNlx4QjlceENFWFFceEQ2XHg5M1x4RkM4XHg5NVx4OENceENBXHhFRFx4OTZceDFFN2JceEZGXHhBMVx4MURceDA2JTZHXHhDMl4mXHhBQlx4QjJceEFFXHg4OFx4RTVceEYxXHhEOC9fXHhFOFx4QkR7OFx4RDRceDBFXHhBOVx4RDUnXHhGMS48XHg4NFx4QTVuXHhBNSxceEI0I0JceEQwXHhGQVx4MEMuXHhERVx4MDZceEQ3XHhFOFx4QzlceEM4XHhENlx4OTZceDk5XHg3Rlx4RTNceEQ4Slx4RTUzMl5ceDkzXGR1XHhGQkc2XHgxRlx4MDl8XHhBNjtceDAycERceDFCXHhDRFx4RTZEdFx4QkMpXHg5Qlx4MDlAXHgwOUk2XHgwOE1ceDlBXHhGMlx4MDdcXHhGRi5oXHhENVx4ODdceEU0Nlx4OTczXHg5RlJceDg4XHhEM1x4RTMnXHgxNlx4Q0N+XHg5ODNceDgyXHg5N1x4RDhceEZBXHg4M1x4RjUrXn1ceDBEXHg5MFx4RDZceEEyXHhEMFx4QkVceEEzUlx4OThceEQ0XHhERVx4RTFceDgzb1x4MENceDA2XHhEOFx4RTFceEY3XHg4MVx4RTdceDE1IFx4MERceDhDXHhENlx4MUNceEJCV1x4OENceDkyXHhFNFx4RERceEQ1XHhFNnRceDFGMVx4QTJceDA4XHg4REhOcVx4N0ZceEUxXHhCOVx4RjhceEM3XHhCQlx4RDFceDBENmdceEM0aFx4Q0UxXHhBNUxceDg1XHg5MldnQVx4MUNceDlGRlx4QjRceEU1XHhBN1x4MURceEJDXHg5M1x4RjlHJlx4OENceEQxdlx4OTZwXHgxRlx4RkRgW1x4MTV+QHAhXHgwQVx4QTFceDA5XHhFMi9ceEM2XHg4QVx4ODN+XHhFMkpceEU5XHhERlx4QzZCXHg4NFx4QTBceEVBXHhBM1x4OTlceEM2XHgwNlx4QzdceDBGXHhENiheXHhBRFx4RDIkXHhBRFx4RjBceENFXHhEQlx4QzJceEE4XHgwRjlhXHgwQ1x4RDNceEExXHg5Nlx4ODNceEUwXHgwOVx4RDBceEE5XHgwOEM2XHhEQVx4ODVceEM3XHhCRFx4MDNceEZBXHhEMkBJXHhGOS9ceEM2XHhDNWZceEY0Jlx4RTVceEEzMVInXHhENVx4MDRceEUzXHhGOFx4RUJceDg0XHhGMFx4QjYvXHhCMmdiXHg5NkxWXHgxMlhuaUxceDkyJ1x4QzIoXHhDNF04XHgxOFx4OEFOXHgwMFx4QjRKXHgwNlx4RkVceEE5XHg5Mlx4OTlceEZCXHgwRFx4MDVceDhBXHhBNFx4ODBceDFBSlx4QzNceDg3XHhFRlx4MEJceEUyPVx4REMwX1x4RjVceDg2XHg4NVx4RjZceDg1XHhBNFx4MTNceDlFXHgwN1lceEI3UmFBXHhFMlx4REJceEEyJlx4ODRceDAyXHg4QVx4ODFceEUyXHhDN2EiXHg5NVx4QzREXHhENDBceDk5XHhEQlx4RDJceEY0XHhFN1x4QjFuXHg5Q1x4RkNqXHg3Rlx4MThJXHhDQVx4RTlceEEzXHhCRFx4ODBceDlGXHg4OVx4RkFaXHhBNFx4RDlceEU0XHhEMlx4RDcpXHhBQlx4QjFceEU2XHhERlx4RTJceERFdUVceENFXHhFQWFceDk0XHhFOVx4OTlhJ1x4MTlceEY1Olx4OUNceEZERFx4RjZDc1x4Q0RceEYxXlx4ODlceEMxbjAgdi9zXHhCRVx4RDZeJSxceEJEaSdceDk5RGJceEVCVFx4RDdpLlx4QjFceEEwXHg4QlFceENFQ1x4QUJAXHhEREhceDgwXHg4MVx4ODRceEE4Slx4RkRcXHhFRWNceEUyUn5oXHhEQ1x4RkNceDkwXHgwRFx4OEJcXHhDNlx4ODkwXHg3Rlx4REFIN0siMVx4OUFceEUyNnJZXHg4NVx4MDFceEI1XHhFOFx4RUQlWTgiXHhDM1x4Q0JceDhCVFx4OTdTXHhCNFx4ODZceDAwdVx4REJmSlx4OUVpXHg5Q1NfT1x4OURceDhEXHhEOVx4RjlceDA2YVx4QkMtUlx4RDB2W1x4ODJceEU5MFx4RTRceEZBXHhFM1x4OTJceEUxXHgwNiRFXHg5Rlx4ODBceERGXHhEMVx4MDZceEZDXHhDM1x4RjlceEU2XHhBNlx4MDVceEFEJFxJXHgwMCZceEY5XHgxNlx4MTB5XHhFNVx4OEVceDE5L2tceEY3ckVceDgyXHhCNltceERFXHhCQVx4OUJceDlEXHgxQ2dceEU0KFx4OTZceDE1XHg4OEdceERCXHhCRF5ceDgyXHgxRlx4QzdzXHg5OShceENCXHgxNVx4QjBHXHhDMlx4QzZceDhFZ1x4RDNceEEwXHhGQVx4RDBceDEyXHgxMlx4MUVceDkzXHhFNylceDA2XHg4Rlx4RTVceEI0Olx4MEI6XHhFQ0ZceDExXHgwODVceEZGXHg4NlUlXHg5Q1x4RjVceDg4Olx4RUZceEJCXHhCM1x4QUNsXHgxM1x4RDBceEYwXHgxMFx4MTdceEZFXHg4RDhceEU0I1xceEYxXHgxMlx4QkJgXHg4NVx4MTNceDlCXHgwMkxceEY2fCpceEU3XHgxRGpceEFFVVx4QkZceEUxXHgwQlx4QkVceEEwXHhEN3BjXHg5RE5ceDBEXHhBMVx4OTNceEYyXHgwNyJIXVx4Q0RofVx4QjVQXHg5Rlx4QkJUXHhEM1x4RjB7XHg5M3RWYlx4RTFceEQxXHgwNDxBXHhFNVx4MTBaXHhBQilceDE3XHg4QVx4MURwXHgxMVx4RUFceDAyaGBceENBXHhENlx4RUNzXHhGNVx4MUZceDkyc1x4RDRceEUzUUNceENEXHhBM3Y5XHg4QVx4Rjg1UUR7ZzVceEIyYFx4MDRceEE1KVx4RkFceDBDXHgwMFx4QTlceEM4dDZceEE0XHhBQlx4MUZceDk5XHhENFx4QjVceEZDXHhFNVx4QzY6Vlx4OUZeWVhceDE3XHg4MkJceEQwNWBceEFGZ0UxXHg5NFx4QjdwXHhENVx4RDBceEREK1x4QkZceDdGXHhGNlx4MUVceDBGXHgwQlx4QTJceDBBSDsyXHhCRFx4RkJkXHhERVx4REZUXHhDNHJceERFXHhBQ1x4QzVceEVGXHg5MFZceEJGXHgwQnFceEExXHg4Q1x4RURceEE3XHg4Rlx4RkVceEQ0XHg4QVx4QzlceDE2ZVx4REFceDA1XHg5QVx4QURceEU1SmRmXHhDRmFceENGXHhEQ31ceDkxXHgwQydceERFXHhERlx4MTFceENFXHhFNUtIXHhDMVx4OTNceENDdj1vXHg4Qlx4QUNceEQ4XHgwNVx4RkRceDlCXHhEME9MXHg4OSghb0ZceEE1XHhGN1x4RDZhTlx4OEVceDA3NmpceEZBXHg4OVx4MDZJRDBceDgyXHhGOVx4QkZceEExXHhFMlx4ODVceEJGR1x4RUNceDg3XHhCRkFobFx4RTVceEYwYFx4RTVceEUwKVx4QTVceEQ1LydTblx4RDFceEUzXHhENlx4QzdceEEwXHg4Mlx4QzdceDkzNlx4MDhNZ1x4ODZceEM4XHgwNyJceEJFVVx4RUZceDExXHgxMFx4RkZvXHhCOVx4QUNceEU1XHgwM1x4RTVwNFx4RTNceDBCXHhDNVx4QzZceDhCVFx4OTlRXFx4RDlceEM2alx4OTFwXHhDMHNceEY2XHhENWJceEMxXHhEOVx4MDdceEQ3XHg4RVx4QURceEM0XHhFOGhceEREXHhEN1x4RTFceEY5Xlx4OTc3b1tbXHhFRFx4RDFceDhGXyMxXHhCOVx4MDQlQlx4Qjk4XHhBQlx4QjJ5XHhENWBceDA5XHhCRFx4QTlceDg5XHgwNFx4QzJceEI5XHg4N1x4QjVOXHgwRVx4RjRceDBCeVx4MUNCXHhBMlx4RERceEZDUVx4QzZceDkyfFx4RjdceDE1XHhFQlx4QzdjdVx4MUFceDE0XHhDM1x4OTlceDhEXHg5MkdceEQ4flx4RDA+XHgwN1x4OThceDhDXHgxRVx4QkQ9Klx4ODlqJEpQXHg4RVx4QTdceEE1XHgxMVx4MURceEQyY1x4QTBceEEwKlx4RjFQXHhDQz9ceEFDXHgwQS5hXHgxMFx4RURYVVx4RDRceEI0UFx4MEJceEVFXHhCNlx4OTFceDAxKlx4Qzg7XHhDOD5ceEJFeVx4ODZceENGXHhDNEpceEQ0XHhBRjlZXHg4OVx4QThnJlx4RENceEE2XHg4NCpceDFFXHhDQ1x4OUVceERFXHhBQyJceEM5XHg4M2A+XHhENHdceEY1fmM8XHhFMjNceDFEXHg4Nlx4QTcjdzRceEQzPCxceEM4XHg4M29ceEQ2XHhFQmpceEZGTlx4QTZceDlCVlx4MURCXHhFMW5ceEQ0XHgwRHdceDhCXHhGRFx4RjdceEE1XHg5RFx4MDZceEE4XHg4MTZceDBDPVx4RjdceEEwXHhGQlx4QzRceEUwfjROXHhBQVx4MTlceEYzXHhDRjhuXHgxNzhceEI3ZFJceDBESFx4MDNpe1x4OUN8XHhBN1x4MUNceEVBZ1x4OTMlXHgxNFx4MTJceEZCXHg4NFx4RjhceDlBXHhFNDdceEIxbzRceEYzXHhCRSFceDE4XHg4RVx4MDZceDBGXHhGNlx4OTNceDlBd315XHg4RiM4XHhDOVx4QjNGXHgxRHBnUlx4OEVLXHg4NVx4QkRiXHhDM2l0XHg4OFx4ODVofFx4QzN0XHg5MyRceDhBMVx4MUFceEVCXHhGNylceDhFTFx4REI+XHhEMFx4RkFeXHg5N34mJFx4ODdceEMyXHg5NnNceEY0XHgwOEVceDExXHg5Mlx4MEFeXHg5NyJceENDXHg5OFx4MTBceDE4XHhDMFg1LV5ceDkyXHgwNkBceEU4XHhCQzBceEJGWVx4RDdceDEyXHg5RWFceDA4XHgwN1x4MERceDlFXHgxRlx4MEVdLVx4RkFceEQxfVx4RDMnXHhFN1x4ODlceDgwK1x4QkQ8XHhFRVx4RjV6WntaXFx4ODZLXHhCM1x4ODRceENBXHhCM1x4QTlceEVBXHhBQlx4ODFceEUzXHhEQlx4RDR+V1x4QThceEFDN1x4RDFceEZCN1x4RDVceEMzXHg5QnJJWlx4Q0RceDk3XHhGRVx4QjVceEJCXHhEM3pceDg5dFx4RDdVRExceDFGXHgwNlx4OThceDg1XHhGMlRceEQzXHhDQ1x4MDVtV1x4MTFceDgyLFx4RjZceDhDMVx4RDlceDA5XHg3Rlx4ODZceEIwQ1x4QTdceEI4XHhFQzBceEJBXHhEMFx4QjJXXHgwQ1x4OTVceENEXHhFOVx4RTRrXHhEOFx4OUNFXHgxQlx4RkJceEMyXHgxM1x4Q0JceDkxXHg4Q1x4RjZceEY3XHhCQS1ceEE2XHgxRFx4OUZceDhFXHhCNFx4QzJceEU1XHgwMCdceEY4XHg4Mlx4OTZceEUwXHgxMlZceEEzUllaNlx4OTNceEQ5XHg4Nlx4RER8U3dceEMzXHhCMlx4QTdceDhFWCY9XHhBQVx4QjJceEM0VkNWXHhCMlx4OTFceDA0ZkZgXHg5RTlceEU3XHhCMElceEY4Jlx4RjVceDg5XHhCNlx4QzhLZlx4Q0FceEFBXHgwQ2lceEZDeFx4Q0MjXHhFM2JceEVGJlx4MTVceEI2WFx4MENjRUxCQEtceEI5N1x4OEUpIFx4OTUhXHhGQVx4MTB+RkFceEFDXHg4NVx4RjJceDA1XHhCQVx4MENceEU1clhceEVFIDtceEIwM1x4REFceDAxXHhGOVx4MEZceEYzXHgxN1x4RDZceFx4OTFceEMybzUvXHhDNVx4MTdceENGXHg4QydceEVBXHhGN1x4MEJdXHhENFx4OTIvQlx4RkRceEUxVVx4RTBaT1x4MUZceDE3XHhFM1x4QjBceEM3T1x4MTlceDhBXHg4OS5FXHhDQ0VceEI2XHg5N3RiXHhCQWwqXHgxOVx4RkNceEVEWHlceEM1TVx4QzVceDkyXHhGMm1ceEY5XHhGMjpceDg2eDZceEY5XHhGRmonXHg4QlRceDA3XHg5MERyMzBceEExdlx4OTBceDEzelx4ODZceEI4dFx4QjNceDE2XHhCRXJceEZGXHhEQUFceDg2XHhCNXVzXHhCMlx4RDRceDEyXHgxNnJceEVGRVx4QzlceDk4O1x4QUVceDgyXHhBN29qXHg5MFx4RDFrIlx4Qzh4XHhDQVx4MTdceEMwXHhGN1x4RkVwR2lceDlCXHhBMmpceDlDXHgxQVx4RkNbXHhCOGdcN1x4RjhceENFXHhCQVx4Qzk3XHhBMlx4Q0R4Qlx4MThceEYzXHhCMk0qRURBbm5dVVx4RTNceEJGS1x4OThDOF43XHhERjk+OFx4QURDXHhFNVhceEY0M1x4RjYmJT8zXHhCQlx4QTFceDlDXHhDNzhcX1x4ODlceDlGXHhDNjZceEE5TVx4RjhXXHgxN1x4MTEoXHhDRlx4MERceEM5XHhEQVx4QzlceEE3XHhBNUVyXHg5RllceEYyUVx4MURnXHhBRlx4RThMTlx4QUZceDBBXHgwN3tceENEXHg5QTpceEI4XHgwOFx4QkJceEQxXHg5Mlx4OUJfXHg5Nlx4MDVHLFNceEM2XHgxN1x4Q0VrXHhBN1x4RTVceDAyXHhENVx4MDNQXHgxNlx4RDZEXHhCNlx4MTZceEM1XHgwQjFZV1x4MDhceENEZ1x4QUNceENCXHgwQzVceDEySE1ceEY3IitceEVGXHhCNTc4KVx4MENceEQ1XHhDRVx4RjNceDhCXHhFRlx4MEVWPVx4RTZIfWpceDdGXHgxM1x4OTJceEVDXHgxQnNceDA3XHhCRXpceDBFXHg5NEZceEMwXHg5NiBceDBFQlx4ODdceDlFXHgxNitfNVx4QTElXHhCQmZceEUwQFx4QUZceDlDXHgwMFx4RDRUXHhGM1x4OEFnXHgxRlx4OTVVXHgwRS9ceEZDQFx4Q0V4XHhENURceEIwXHhFQlx4MDdceDk3XHhGOVx4QzMrXHhGMFx4ODdwXHgxMVx4OEZceERFXHhDM1x4QjdceDg2XHg5Q31ERylceENDXHgwMlx4RTFceEQyXHgxQ1x4OTJceEJBYVx4MThRL1x4MEFceEIxXHhBQVZceEYzXHhGMnFceEJBLHtBXHg5NX5mXHg5Mlx4Q0JceEMxXHg5NWxceEQ4XHhENFx4QjBgXHhDNVx4MEM8XHhCM1RceDgxXHg4RVx4QzApXHhCQ1x4QkZceEVCXHhDN1x4RTRceDg2PVx4MDVceEFDaHpceEZFXHgxM1x4RjRQXHhEQVJceEFDXHhENFx4REUpZ1x4QjZzXHhDOEZceEQ5XHg4OFx4QUJceDkwXHgxRlx4MTJceDk2XHhENVx4QThceDE1KVx4Q0VceDFFYVx4QTU0XHhBNVx4OEREOVx4Q0ZceEQ4XHgwMFx4MThMO1x4QzBhJVx4RjBUXHhDMVx4QkRmUFx4MEJceEZDfUxOUDI0KURceDhCN1x4ODVceEE2XHgwQlx4RUM0XHhGMz1ceEEyR1x4MDRceEQ5XHg4Nlx4QjJzRVx4QzR+XHhDN3JUXHg4QyJceEZBXHhGNntceEY5XHgwOVx4MEFceEI5WjdceDg4XHhGN1x4Q0ZceEY2XHg5OFx4QUFceEE1XHhENVx4QjEiXHgwNlx4QzA5IVx4QjlceENCbzVceEY0XHhGRFx4OEZ9fTpceDkwXHg4Rlx4RkZgXHhDNl1mWkJ8flx4MERceDBDXHg4NVpTXHhDQ1x4RjlceEMyXHhDRlx4RUVceDkxKFx4ODZwI1x4QjBceDg0Ty9ceEIxXHhERntceDExXHhFMVx4RDZceDE0XHgwNStAXHgxMFx4QzR3Zlx4QkVceDA4U1x4QTc2XHgwN1x4QTNceDEzXHg4Q1x4QkIvXHhBMSZceEMzTVx4MUVceEQ1XHhCMj5ceERGXHhGQVx4RTllXHhGQlx4QjZIXHgwMVx4OEUkXHhCQ1x4RDhceEM5WVx4RDZceDAzXHhFNlNceDdGXHhCMz1PLmdHXHhCNFx4OEZceDBGXHhDQlx4RDNceDg0N1x4QUFceEI2XHhGOU1iXHgwM10wXHgxN1x4QjRceDFBXHhBN1x4QzU8XHhCREhULjFceEQ2dUVceEFBXHgwQ1x4OTlceDgyXHhEOVx4RjV6XHhGNFx4MDdceENDXHhFNTtCXHgwQShjTydceDEweFx4RkJXXHg4OVx4RjldUFx4MTZceEY2XHhCNlx4MTRWXHhENFx4QzVceDAxXHg4Rlx4QkFceEFBXHhDMlx4RkJUXHhDRj5ceEU4eVx4OUVCaFx4RDRceDk0L1x4QkYuXHg4Q1x4RERceEVCXHhENlx4OUNpXHgxMn02XHhGOVx4OUUyXHhFNFx4ODhceEY3XHhDQlx4QkJceEU1XHg5OFx4MDRceEI5XHgwNjRDXHgwQipceEJEaFx4RThyQlx4MTdceEM5XHgwRCBPXHhFNFx4MUNceEQ0XHhCOFx4QjFceDBFXHhFOVx4RUN7Olx4ODhceEVBd0JceDFDXHg4OFx4RDgpXHhEQVx4RDNceDdGXHhFM1x4RkNceEM1eW5kd0l0XHg4M1x4OTI3O1x4OUZCXHhFN1x4RUFaYFx4QURceEVDNVx4OENceDExXHgwMlx4MEJYMVx4MUJceDA0RFZ5XHgxMFx4QTNrLVx4QzFceDE4XHgxQ1x4RTFceEEzXHgwMVx4MTVceENEbVx4RDhceEMyYzVCKVx4ODdceEEwXHhFRVx4QTZceEUzbWJBXHhBNVx4RTRceDE3RClceEVFUlx4QTJceEU0XHhBRlx4QzhceEIzRlx4MTBceEI0KFx4MEJHXHhERV1ceEQyXHhEOVx4MUJnXHhGRGVceDhEdlx4QkMwXHg4NltceEFCXHhGNlx4QUZceEUyXHgwNncxXHhFMlx4Qzl9XHhENlx4RTNceEI4XHhDOVx4RjRceENFXHhDQThceEQ4XHg4Rlx4ODVceEM4XHhDNStceEU5XHg5Q1x4QUUjXHgxQSlceDE5XHhEMlx4Q0JceEJGXHhENVx4Qzc2Njg+QFx4ODhceDk5XHhFQ1x4OUUxXHhDMWZceDA4QFx4RjJceDBFXHhDNlx4RjdceEYwX1x4N0ZceDhDXHhEN1x4MEE5IGNceEYxLEQ0LkRceEM2b1x4RDZceEIzXHhBRFx4RTlceDk3aiJNdHlceDk4eSBceDBFXHhDRVx4QTE2XHhEOVx4RjRUXHhBNlx4QzBceEQwIVx4Q0FceEZFXHhGN1x4REUtU1x4RUZ0XHhFNlx4QkVdXHhBNGVmeFx4N0ZceDkzUD5gXHhEOVZceEZDXHhBRVx4QTNceENCXHhERlx4QjNceDAyXHhGOFx4QTRceDAzXHhDQ3tCXHhDNVx4ODQxZ1x4RkEjckorXHhDOGxceEIwcjpceDlEXHhFOFx4QkNceEVFXHg5Q29DIlx4QzdceEZGSENkJi8wclx4OTVDXHhFRlx4ODd6RG1ceERBXVx4RTJwXHg5QWpceEYzS1x4RjFlSFx4MTZceEZGXHg5Ml9ceENCeVx4MTdceEFBNlx4MDN8XHhCQzNceEEwXHhCM1x4OTNceDEwXHhBRVx4Q0NceEFFXHhDN1x4MUQgXHhCM1x4QUNNXHg4Rlx4MDZ6Nlx4MTBceEUyXHhGNlx4MTcmWFx4QkMtXHhDMjRceEZCXHg5M1x4MDg4Im1ceEZGVVx4RUJceEUyXHhDOSVceEFFXHhDOStceDhCXHhEMFx4MDRceDhEYXhceEREXHhGRlx4MENceEE5dVx4RkRTXHhDRFx4MUQ6XHg4NVx4QjNceDlGNiMwXHhDOVx4OTJceDBFXHhFQVx4RUJdXHhBOVx4QUYsXHhBN1x4RENceEI1XHhFRFx4QTVceEVGXHhGRVx4RDBceEMxbFx4QzdQXHgxRFx4Q0RceDk3OmdceDAwSzRceEM0ciU+cFx4QTV3XFx4RkZceEQyXVx4RDVceEZBXHgxQUc4XHg4Q05ceDlDXHhENlx4OTZMXHgwRlx4RTVceEMwXHgxNVx4Q0RceDE5XHg5Nk1KXHg4M2xceDBEXHhEOHpUXHhFOCdceDA4JkhceDhCXHg5MCY+XHgxQ35ceDlDUlhHXHhBRVx4MUFceDkxXHgwRFx4MEJceENGXHhEQ1x4MDlceEI0XHhENlx4QkJceEQ2XHhBMVB2XHhFM1x4OEVceDA1cGFceEQxSlx4REFceDgwJ0YnXHhEMVx4RERceDgwJkphXHhFOXBceDA2T3JceEVCXHg4M1x4RDJLIFx4OEUmXHg4RVx4QTFceEYwXHhDRVx4MTFceEVGXHhDNlx4RDkoXHg5QilceERCXHhCM3BDXHg4Rlx4OTMoXHhGQS5ceEVGNnZceDFBXHhDQlx4MTh2XHgwMVx4MUZzXHgxNVx4QjhceDg5WGdceDAzXHg4NEZceDAxZlx4QzlceEZBXHg4Nlx4QUNceDA5XHhFNFx4RjlyXHhGQlx4QzAiXHgxRFx4MDVceEIwIGx4XHgxNiBFXHgwOD9ceDA4XHhBQlx4RkNceEIxXHhCMz9ceEJCXHg4MnNceDA0Jlx4ODFceDhEIVIsXHgxQzdZdXssKl5ceEU1XHhDQ25ceDBFfFx4ODlceDgyXHhDMlx4RjJLXHgxMWdceEYwXHgxQXVceDEzXHhDMFx4OTVceENEXHhERlx4QUFceDEwXHg5Q1x4QTAzVVx4MDVceEExXHg4RFx4QzJceDAweVx4RUJSdFx4RDltXHhGQU0kY1x4MTRceEVCLWUjV1RceEU0bF9ceDEwIlx4REZ2QFx4Q0JceDgwXHg4OFx4RjdceEFERk5+XHgxRFx4RjFceEE1XHg4NTJceDE1XHhFQlx4Qjc8SFx4MUVceEU0XHg4NVx4RDBoXHhBNVx4MENceEM3XHgxMlx4QzNcXHhBQXdceEMwYkYiXHhEN1x4QjNceEIyfFJWXHhEN1x4RjIsXHhDQVx4MUMjUlx4N0ZbMlx4ODlceEJDXHhENFx4OTVceDEzXHhBM1x4MDMvXHgxRFx4OENceEE3XHhCN1x4QTZceDA2XHhDQ0VrWFx4ODNceDFBXHhGMVx4RTFceDExXHg5RVx4MUJWWFx4ODFceEFEXHhGNFx4OTQjXHgwOVx4ODhceENGLlx4OTFaXHhEM1x4OTVceEM3MlZUd1x4MUZceEJEXHgxOFx4OUZnR1lceEFEM1x4MDlceEMwRlx4QTVceEE3XHhEM1x4REV1XHhCRVx4RTRceEQ2XHhCOSdnXHhCRThceEVCNE1yW1x4RUZceEYwSUtceEY1XHhERixceDA4XHg5MFx4MDJceEY0XHhGQ1x4QzRceDEyaVx4ODdceEFEXHhEOVx4QkFXXHhEN1ZceERDRFx4RDhBXHhFMFx4QTZceDkzXHhDOTVceEZELFlKXHhENlx4RUJceEFGXHhDNVx4RThceEI4XHhGNFx4QzdceDE3XHhFQWlceENDXHg5M1x4RTZceDA0XHhFNlx4QUNWXHgxOVx4MEN2XHhGRVx4QjBceDlEa0xceEU3XHg5Mz02XHhEOWw9PFx4MDhEXHhBNVx4RjFceDAwdENceEM2ImdceEY1XHgxOVx4REY9Zi5ceEU1XHhDRFx4OTNceEI4XHgwOFx4RjlceDhCXHg4QS5ceDAyXHg4ODhceEVBXHhFNFx4MTRceEUwXHg4Qlx4Q0FceDBEXHhGQlx4OUQ8d1x4QkVceEI2XHhDN1x4RTklXHhCM1x4QzZceEEyXHgxRlx4OTJceEFCXHhEMVx4Q0FceEI1XHhDRFx4RTFceDkxXHhBMzNceEJCXHhFNVx4RDFceEZEXHhGOVx4MDFceDhBXHgwQzVceEJFTFx4QTZceEQ0XHg5MEhceDBEXHhDNlx4QUVcXHhBRXNdXHhCM1x4QTFDXS0rUzZceEI1XHhCQ1x4MUJceEYxLi5ceDA5fVx4RDBceERCXHhDQ1x4QzI4XHhGN1x4ODhceEM5XHhGQUtnXHg5OVx4MUNceEJDXHg5QVx4MTJceDEyXHhBOFJ9XHgxNVx4ODBceEZDY3tceEQ2ZFx4OTVceDk1YFx4MDlnTlx4QUVceDE2XHhCN2hceDFDXHgxNE5ceDk2XHhCNVx4MDFceDk0fTZceEMyXHhEOVx4RjdceERFXHhCQVx4OUFceEZEXHhEMVx4QzhceDk1RVx4REJceEJEXHgwRjxceDAzOFx4ODZceDg2RVx4RTFceEVGflx4RDRHXHhEN1x4ODBceEMwXHhBNFx4OENIXHhGMVx4MDBFSStceEI1XHgwOFx4QTdceDAzXHhEN155Vlx4RDRceDFGXHhCN1x4QjBceEMxXHhENVx4RDFceEUxR1x4REZceDA5Qlx4MENvXHgwM1x4QzdceDk3NFx4ODl1YVhwS1x4OURceDdGXHhERGspXHhFM1x4QzBceEMxXHhCQlx4OENceEM2XHg4M1x4REJceDAxclx4QUJKXHhBMmRHXHhCOVx4RjZceEUwXHhEOFx4RTdceDg1XHhBMnVPXHgwQ1x4MTdceEFGXHhCQ1x4OUJceERGPlx4QzNeXHg4OUl9XHg5RDFoIVx4RUVzO1x4RTN2J05ceDlFXHg5RjxceEI5XHgxQzhzXHhGRkJceENFXHhCMVx4OUJceEUxXVdceDhDXHg4NVx4OURceEQxMnNceEExXHhCM1x4RkFVM2JuXHhFQjwoXCRyXHhEMEJceDEwTlx4OEFceDFFXHhCRFx4RkRceEQ5Z1x4MTFceEE4XHhFMlx4RDNceEQzXHg4MUhceEJDXHhBNGdceEY4XHhDOVx4RTBceDk5XHhDN1x4RUFceDA3XHhGQ1x4MEFceDk4XHhEMFx4Q0JzXHhBQ1BceDg5a1x4RTBceEFEcHhceEQ3XHhGM1x4QzUrckZceDgxXHhCQlx4OTRYXHhDNlx4QThceDBBcFx4OUZceDgxXHgwNVx4Q0JfYlx4OUZPXHhEOVx4RjFnS1x4RjBceEUzXHhFQ1x4QTdceEVEXHhCRlx4RTJceDhDXHhERlx4OTFodyRceEQ1QFx4RkRceDE3XHg4N1x4MTBceEYzXHhGOVx4RTJceEVEbzNgUFx4OUMgMFx4OTVceEJCT24kXHhEQVx4QjNceEY3cXlceDg4YUFEXHg4QStceDBBWFx4QjZceDlCXHgxRVx4QkJceDBEXHhBNktceEUxXHhFQlx4MTVceEU5Rlx4RjdceEE0Q3xceEI0XHhBN1x4RjZceEEzXHhGMVx4MTVceEQ4KjJceDlEXHgxMlx4QjZceEU0XHg5RVFceEE0XHg4NHFgXHhGMHVceEFGXHhCODlceDFERVx4OUVceERCXHgwQlx4MUVceEZDXHhFQlx4RjNceEQzYlx4QkRMKlx4MTZceDhDXHhCN1VceEUxXHgxRVx4RjhceDA3X1x4RUVoYlx4MUVceEIxXHg3Rlx4QTBceEMwXHg4Rlx4MDJceEMwXHgwQmpceERBXHhENkxceDg0I3JceEQ0V11ceDk4MVx4MTNceEQyXHg5Mlx4RTdceEUxXHg5RTZceDA4flx4QzlceEYzfiFceEIwOVBceEFBXHhGOVkgOTlceERGUSVceDFGXHhFMU1RMSInXHg4MFx4QTRceENCflx4Q0FFQFx4QzlceDk2XHgxNkNnajxceDhEXHhCRS1ceDA0aGdceEM1XHhDRlx4RDFzXHhEQVx4MDdceDE0XHg5M1x4OEZceEM3XHhDMkRyMFx4RUZceEIwXHhDQm5ceDFFKCw+XHg4MkwmXHg5MFx4MDFceERBXHhFQ0lceEQxXHhEMUFceDk4XHhEQVx4RDZceDhBXHhCQ1ZGXHhERFx4OTVYXHhGNFx4OEJceERFXHhGQ1x4QjFceDgwMFx4OUR9ajhceDg0XHgwOFx4MDNceEM5I1x4QTNMXHg5Mlx4QUZgXHhGNWJceDBENFx4MURnIikvXHgwNCBBXHgxNFx4RkMsXHhDNFx4Q0NceEIzXHg5OX1ceDFEfVlceDAzcDpKXHg5Rlx4MTRceENFXHg3RlNceEZBU1x4MENceDE3XHgxNFx4RjJceDAxXHhGM1x4MEJceEVGXHhGRFx4QTFceEU0OFx4QTlIXHg4N1x4QjVceDkwXHgxOFx4MEZceDg5XHhGQ0NceDA4XHhFQVx4MDZceEVEXHg5OFx4OEVceEUyXHhCQlx4MTVhXHhGRVx4QjlceDhDXHg4RFx4ODZwXHhFRChceDlBXHhEMlx4RjgnXHhENVx4RkU2XHgwOH1ceDkwcl1ceDBFOlx4MDhceDEzalx4ODRceEU2XHg4OFx4RUNceDk4XHg5OFx4RDhceEQ1XHhGOVx4RDcrTFx4RENceEQ1XHhGNElceEM1JVx4QzImXHhCNH1ceDEyXHgwNlx4REJQXHgwMFx4QTNSXHg4N1x4QTVceDE0TX1ceDE4XHgwN1x4REN9XHhEOFx4RTZceDFDXHg5QVx4MDJceDBFXHhBNFx4MDBceDhBXHhDQVx4RjdTXHhFNFx4OEVceEU2XHhGQktceEZFXHhBQVx4QjRceEY5XHgxRFx4QUFdXHhDMFx4MUFceEY0Llx4QkFgXHhGOUJceEQ1XHhDRGV7XHgwRlx4Q0JceDBCXHg4QVx4OTdceENCXHhCNFx4MThceENEcVx4MUIiXHhDMjFceEJCXHgwNVx4RDdceDFFbVx4OTY+XHhCNlx4QUJceEVDXHg5MVx4RURceEU1Slx4MTVceEE2XHhBQ1x4RjhceDkwXHhGQWAlXHhCQ0lceDBDXHhCMVx4QTIvXHhFRFx4OUJceDk5XHg4NDRceDlDXHhBOX1ceEJBXHgwRidceEM5Plx4QTlceEUzXHhGN1x4QTRceEY1NVx4OTB4XHhEMFx4ODhceEQwXHhBRn1ceDBGXHhCOVx4OEMwXHhFQTxceDExXHhCRlx4ODRhSVx4MTZceDg2V1x4MThxOjAiXHhGOFx4OUJAXHhDN1x4RjhceEE1XHg4OFNceERFPlx4OTIsXHhBOVx4OTZceEZGXHgwNi1ceDEyXHhDQlx4RDhceEFFT3hgY1x4MDcrXHhDRVx4RjFrXHhFNW1ceEJEXHhDNlx4QUZ9XHhFRidceDhFUlx4RjNceEJFXHhGQVx4QzIrXHhDRj9ceEU3T1x4RUFceDAwXHhFRVx4QjJVXHhDQ2hceEM5XHhDOFx4MDRceEI2XHg4MF9ceEYyXHhFN1x4MTVceDE2XHg5NSFceDhCVFx4MThceDBDYFZceEFGfWErc1x4RUNceEZDJlx4QzNPXHg5Nlx4MDlceDEzMWJceEVCXHhCQlZceEJGXHhGMjJceDhCXHg5OWJ4VEdceDE3XHhERXZxXHgxQVx4QzRceEI3XHhDRFx4OEVceEQ0SFx4QURceERGXHgwQ1x4Q0VceEMxcWJceERDXHhBRlx4OTQ+WVx4RUFceEIxXHhFNzM+JHpceDE5XHgwNzBceEVDalx4MTdiUEpceEI4XHhEMVx4MUF1XHhCNVx4MEZceEQ4XHg4OCtceEE1L1x4Q0VceEYwblx4RUVceEFBOWBceDE4XGtceEY5Q1x4OEFceDhBXHhCMlx4MEJceEJGSEdceDEzKFx4QjZAXHg4M0BceEVCXHgxOFx4OTYzI1VceDlEXHhBN1x4Q0MkXHgwRFx4REZ6dlx4QzZceDExQyVceDg5XHgwOT9ceDg1eDx+KShceDE5N1x4MURceEFDXHhFN1x4MDg+OFx4MUZ5QVx4MUEwXHhDRFx4RTk4XHhBMVx4QThceDlDXHhFRlx4OTBceEJGXHgwRFx4MTdceDE1XHg4Nlx4RTVceEU3XHhFMlx4Q0ErXHhDQlx4ODhceEY2XHgxQj88XHhCOShceEM4THxceEJFT0NceEQ3XHhGMVx4RjhKXHgwQTJgK1x4MDhceEJBdVx4MTkxXHhFMVx4REU2XHhBRFx4QjUtXHg5NzlceEUzaydceEYwY1x4OTBceDBBXHhEMjhgXHgxRVx4ODFceEY1WVx4RUVceEY2XHhDQVVoS11ceDE4XHhFOVx4OUFceEREWFx4OTRceEIyXHhGMlpceEUxXHgxOFx4OTIyXHgxMVx4OTJceERGXHhENFx4REQ3XHhBQXVceEE2XHhCNFx4QjNceDlBZ1x4QUZceEFCXHhGMVx4ODVceDdGXHhDNVx4MURceEI5eVx4MTBceEJFXHhCRmpQLFx4QjFceEIwOX5ceEY2c3BceDFCXHhCQlx4RDYnXHhBMFx4ODJceDg1bFx4RThHXHhFM097XHhDNlx4QTVceEVBXHhBMFx4QzU+XHgwNyovXHhGN1x4MDJOXHg4N1x4RjZcXHgwRjhtTlx4MDRceENGXHhFQ1VceDA0I1x4ODRlK1x4QUJcXHhFNXIzXHg5MGZceDk5XHhGRlx4OUEgXHgwMlx4QzZceEI2XHg4MVMxXHgxRnQ2bFx4OEJceDk1XHhCMlk5XHhFRFlceDBGIGZceEUzSlx4RkZceEQwc1x4QzBceEI0XHhGN0tmXHg4QVx4MTBceERDXHhGQytceDA3XHhEQ1x4RERceEY0bV5ceEJEd1x4QzZceEM0Xlx4QzQ9XHhCQVx4MTZceEREPlx4MTRgXHhCRiVceEU3XHhGN0tceEZGSlx4RUVceDE5Xlx4QjRceEFGQFx4MTJceEM3XHhFMDgoZ1x4OUZceEM0RVx4REQrUlx4QTZceEJFOjg8QiZ1MVx4ODZceDlCXHhENFx4MDRceDA3XHgxOFx4RjZceEU1dFx4MEN4XHhFN3hceDE5MVx4RkFceENGXHhFNSlceEQ4XHhCQVx4RjdceDEwXHgxRFx4RUZvXHgxQVx4Qjh+XHgxMXpceEYyXHhBQ1x4RTJceDE4MFx4RUZceDk3XHhCMlZceENCW3RceDBELy1ceENELFx4QjJceDg0XHhBQy5ceEUxXHgxQlx4RDVceEFFXHg4MFx4OERceEEwXHg4OFx4ODRceDA5XHhDRFx4OTl8QFx4RkRceEQxIVx4QjJceEE1XHhCM09ceDlFc1x4Q0VkXHgwN2R5XHg4Qlx4ODZOVlx4RDFceEFBXHg4Nlx4RjRjXHgwNlx4RDFceDhCXHhFNDtceDEzXHgwRVx4Q0VceERCXHhCM1x4REFceEFDKyRceEQ1XHhGQTdceDBCXHhCOUdSXHhFNlx4OTNceEQ4XHgwMCtEXHhEMmQ5XHhBM1x4QTNFXHg5MSJCVytrXHhGNCJrYV5ceEYzXHhFNFx4RThceEVDI3gjPFx4RDlceDg2XHg5RFx4N0ZceDExXHhEMU9JTVx4QzZceEZGXHgxMlx4QzhceENEXHhCMVx4OUZBMVx4ODBPJTFceDFGJVx4RTRVXHhFQVx4ODNqTlx4QTFxXHgwN0ZceEIyXHgwQS9IXHhCNlx4QTJiXHhBNGJMTVEjXHhCQlx4OUJceEMwTlx4QUVceDlDXHg5MFx4RjNceDAwQ1x4QjUvXHhDMlx4RDMvXHg4Rlx4ODdceEY0XHg4MV1ceEIyVWdceDE2XHhDQTosXHhCQVx4RkZceEI5OGR6XHhBM1x4RkNceDhDXHg4MVx4RDBfX1x4ODNceERBXHhENVx4REZceDA0XHgxMHdceDhDQVx4QjFceEE4XHgxRjhceERCXHgwRlx4RjUyXHg4NmhceDA4XHg5MVx4ODVKXHhFNGdHZCZceERFXHhCQ1RceDA5XHhFMFx4RDVceDhEd1x4MEFceEQxcVx4RkNLXHhDNm5ceEVEXHg5MFx4RjNrO3FceEJCXHgxM1x4RTJceDA2XHhDRFx4QjlceDFBP31ceEMxXHhCOE8nNTxceDhEXHhCRFx4RjJESVx4OERceEQ5XHg4NVx4MTBceDE3eFx4QUZfMFx4ODhceEI0YW1pXHhGMUhlXHgwNlx4RkZceDg4LVx4OTNceDE3e1x4OEJceEU0ZXQ3XHhBRlx4RUJceDk1XHhFN1x4QjdceDkyXHg5QVx4OUE1XHhDMj9ceDg1flx4OEZceEUyXHgwRFx4MDB0XHhBRVx4ODZceEJDXHg4RkhGKVx4QzhceDkwXHgwOSVceDk2XHhCMmxceEYxXHhFNFx4MTlceEY1XHhDOFx4RDNceDhCXHg5Q1x4RDZ3XHhERlx4OUFceEYwXHhFMlx4MUJceDFGXHhGNlx4QkNceERDXHhFQlx4Q0ZMXHhCN1x4QzZKXHg4N1x4OEZceEMwXHg5Qlx4MDZceEU5Nlx4QUJceEZBXHg5OVx4REJceEJBXHhCQiB4XHg5MFx4OTJceEVBelx4QkUjWFx4MTVcXHhBRVx4RjV9L1x4QkJceDExXHhENlx4QTVceEMyVj5ceDhDXHg4RVx4MUR3XHgxRlx4Q0RceDBDXHg4Ml9ceDAxRVx4RkYrXHhDQlx4QzRceERFXHhCRFx4QjBsa1x4RUFEXHgxNlx4RThceEY3XHhFNHM3elx4MUNceDg5XHhFRlx4QzktKzhceDAyUFx4ODFNXHgwMlx4MUZceEI4XHhGRlx4QkJQXHgxNFx4QUJceEI1SFx4QjJceEFCXHhDMVx4MEMlXHhBQ1xceEQ2XHhDNVx4QUNceEU2XHhFQT5ceEI5XHg5MVx4ODZceEMyflx4QzNLVSRceDk5XHhENkFceDk4XHg5Q0JceDFDYlx4MDhceDkwXHg4RG8oXHhBN1x4RjBceDkyXHhGOCFceEI4XHgxQVx4MDJceEI5XHg4OCZZXVx4RkFceEU4XHhGNlx4RDlceEJCMXVceEE4XHhGNk9fM1x4RTdceDk2R1x4OTBceDg3XHg5N1x4RjlLXHg5RVx4OTFceEI3Wlx4RDBceDdGcVx4QzZceEMxXHhEMyNceDFFcFx4N0YsXHhFQlx4OTMjbV1ceDhDIVx4MTRceEFFQVx4QUJhM1x4RjY9XHhCQkJoflx4RjVceDlBXHg4NVx4MTB8XHg4NFx4QjJceDAxXHg5QlZceEY4WVx4RjlceEM0XHg4RVx4REM3XHg3Rlx4QkVceEVDc1x4QUZceDg0YjpceENBNCYlaVx4QUMuXHhCRVx4RkZsXHgwQVx4QjdceDFBXHg4M3pceEY2N1x4REZceEY5YHxceEE2XHhENFx4RDNceEREXHhDMlx4RkZceENDJzBceDEzRlx4OEFsXHhBQTNceEIySlx4RDhUKnZceDEwQ1x4RTJ9Mlx4QzFceDE5XHhCOXtKfVx4RTRceEExZFx4MENceENFXHhBQTZ6VVx4ODEuXHgwOVx4RURpXHhDMlx4QTJTXHhEMElceEMwNyI9XHhFQ1x4QTFOXHhBN1x4RjNceEMyXHgwMi9ceDA5eGNceEU1XHhFMVx4QTdceDBGfVx4MDBceEQyXHhBQlx4OUZceEM1XHgxNDpceDEwXHhEM1x4MDZceDAxb1x4RTlLXHg4MHV5XHgwNXtceEM2XHhFNlx4RDJceEZGXHhCOFx4QjFceDFDXHgwOWxceEY4T1x4OUZqXHg4N1lceDE2XHgxQVx4OURceEM5XHgxQnxzIVx4QjFceEVDXHhENFx4QkNceDBGXHhCN1x4ODBceDA4XHhCQmxceEIzXHhEODVceDlFXHhERlx4RDBceEIwfjFceEIyXHhGN1x4OTBceENGUFpceDBGVlx4ODE3QVx4QzR8dlx4OTExXHg4MVx4MEVceEVBLFdceDFEXHhDRD9ceEVFXHg5RFx4OThOXHhEQ1x4OTQpLWtceDEzd1x4MER4XHgwOFx4OURceDE3XHhEQSFceEY2XHg5QVx4RkNtOVx4QjVceDA4KyVbXHhCQ1x4RkRceEY0XHgxNlx4RjhceDhDXHgwNFx4OEMmRFx4MTlceEQ1XHg5Q1x4RkRceDFFaWUlXHhGMVx4RURceEMyXHhFQVx4MTlceEUwXHhDRFx4MTJceEQyXHg5QVx4RDhQUCFceEM0XHhCRTdceEU2XHhENVx4QkNUXHg3Rlx4RERceDFFXHhGQVx4RDRceEQyeylceDdGXHhDRlx4Q0FceEMySDRceEI5XHgwN1x4MTNceEY1Tlx4MTFceDFDOFx4QkNUQy4lWlx4RkYiXHgxQj9ceEREa1FceEMzXHgxOFx4Rjdfelx4RTJceEE3XHhCN1B8eFx4RjU/XHhDNSxceDlGb1x4RkRceEVDJlx4RjZceEJEMFx4QkZceDAxXHhEQVx4ODZceDdGP1x4QjJceEJGXHhDN2BVVnQkXHg5NFx4MDVceEQ5XHgwNkFceDA0RFx4MTRceDFCXHgxNGRWXHgwMVx4MDggWT1ceDhBXHgwMVBceDhGXHg5NVx4QUJceENGXHhERVx4RTBceEQyZFx4ODFceEI0M1x4OTBceDkwXHhERlx4MTVDNFx4REZceEQyaVBceEFEXHhCQVx4QkNzXHhDMVx4RTBceEVBXHhBNWRceDA0XHgxQ11ANn5ceDk0XHhEN3pceDA3WXFceEJGREFceDk3XHhFN1x4QjBUXHg5Q1x4QkJzMCx2XHg5RVx4OUZlMFx4RDdceDhDXHgwN1x4MEFceEYxJlx4RDZEXHhFMFx4RERceEUyXHhCNlx4QkVceERCXHhCQ1x4QzV2XHgwOFNceDg5Wlx4ODVceEUye1x4RkRceDlFXHgxNFx4MTVceEQyVlEpeVx4QkVaOVx4RDNceEYwXHg5MzM0XHgxM1x4RkZceDA1KFx4Q0FceERCSVx4ODVceEI5KFx4QzhceEREXHgxMFx4ODVceEM2XHgxQlx4MEVceEE5XHhDQlx4QzNtXHhGRVx4RjA7XHhCODg2XHhDRmVceEM1XHg4Rm1mXHhCQyFceEQxLnxceDgwXHhEOFx4MUVceDE4XHhCRSkhLC9ceEUwXHgwQlx4QTlceEZEXHg4ND0gXHhCNTAtXHg5MVx4ODFceDg0U3VceDA1TVplXHhDNVx4QUFceEQxXHgxOTIrc1x4RDVceDAxXHhDQUhceDhEclx4RkFceEIzX1x4QzFwJVx4RDBceDdGN1x4ODNbXHhDQi0uXHhBRSJceDE5R3VceEMzXHg5NVx4QzJyVSNceEU4Y1x4MTVceDBCXHhGOTNdXHgwODZceDAyRl9ceDA0XHhDQVx4QjRceEY4VllceEEwJVx4ODlKXHgxMlx4ODdceEQ4Xlx4RTNceDg3XHhENlx4MEJceEQ0QiNceDgwXHgxRDNceDBDXHhEQVx4OTJceEIzWl43XHgwM1x4QkZceEI4SVx4MTVceEY1XHhBOFx4MURceDg5XHhBMVVceEIwZFx4OERceEEyQTsiXHhDNVx4QUFceEE1XHhCQlx4REErXHhBMT1QXHhCOFx4QTJceEZBXHhEOHhceDk1XHhDMVx4OTJceDBCXHhFNFx4RTAnXHg5NGVceEQyXHhGQlx4OTlceDlGOTUsOFx4ODJ+XHhEOFx4QjZceEJFIlx4QTZceEU0XHhBRFx4RjZceEMxXHhCMVx4ODJceEJDXHhEMWR2XHgwNlx4ODNceENBUFx4QTVFXHhEMVx4MUZceDBCXHgxQldceDg0Nlx4QjVOXHgxNlx4Q0NceENDXHgwMSxceEUwXHg5M1x4QzVfXHhDNWhceERCdVx4RDdkOFx4Q0ZceEY2SVx4QzBceEFGXHhFNFx4QTVqXHhBRVx4MDNceDFCXHhDMWpceEY3dUJceEJGXHhCQUhceDhBeVx4MUVceEREXHhDNVx4QkNceEU0XHgwN1x4QkNceEU3alx4MERceEI1XHhDMVx4MDdceEU0XHhEM1x4MUJwXHhDOVx4RkNKXHhCOGtceENDXHhCQVA8XHg4MFx4QTdceEE0XHhFM1x4QTBceDBGXHhFN1x4QzNceERBXHgxMFx4RDZkXHg5Q1x4MDRpXHhGQlx4MUVceEM1OmxceDk4XHhFODpceEVDclx4RTB+XHgxQlx4OTVceDk3SVx4OUMyXHhCNlx4MTVceEE2XHhGRVx4QzlceDhCIlx4RkRceDBBLCRceDgxXHg4N1x4MDMpXHhFMlpceDlCXHhBOTtceDFCXHgxNDpceEQ4XHgwMlx4RjFceEFDXHhGMVx4RkJceDBEXHhBMFx4RUZceDFEXHhDMGxceDBFelx4QzE4XHhCNkBceEQzXHhFQ1x4RDFDXHg4QVx4ODNFXHg3Rlx4RkJcXHhBNFx4RUZceEU4Qlx4RENnPFZceDlBLzVceDEwXHg4N1x4Q0ZceDgwXHgwNVx4QUZkXHg4QVx4MTFceEZFXHhBOVx4RUF7XHhDOVx4OUVceDk5XHhFMVx4OEQ5XHhDMFx4RDlgVFx4RDdceEM0N2lceDAzXHhBQVx4QURVWFx4MEUuXHgwM3Q4ZVx4QzFceEYwXHhDQlx4OTchLCtceDA2XHgxMVx4OTkgXHg5Rlx4MTNceEJFO15rXHgxMFx4QjZYXHg4NVx4Q0RLXHhBMFx4REVceEY4XHhGQmFceEI0XHgxOS9ceEU5Plx4OTFQXHg5N1x4RThceEU0XHhBQkBceEE5XHg4OVx4MDNceERCXHg5OSVceENDWFx4MEJceDhCXHhCOFx4RUZceERGXHgwN1x4OTJceEY3XHgxNFx4QjdceEU3YSFceDhBXHhFQjZ7XHhGNT1ceEUzI35ceEY4ZFx4ODkkXHhBRFx4OTZceERDXHg3RmdceEI2P1x4ODZhVFx4QkJceDk1N1x4ODlceDkxXHhEOFx4RkFceDBBTVx4QkFceEMxXHhDRFx4OENceEJFXHgxNVVaXHg5NVx4QkVceDA3ZklceENGXHgwMFx4RjFceEJBXHhGNlx4MDNceEM2XHhEQlx4RkU4XHgwNVx4RjF+XFx4QzZceDFFXHhBMTlceDgwXHhEMFx4MDRceDk3e1x4OUZceEY0XHg5MFx4RjhceEE0XHhDM3hceDA5XHhCRFx4RTlceEJCckZNXHg5Rlx4OTIiXHhDNFx4RDFceENBXHhEQWhceEIzdlx4RURkXHg4RVx4QzRceDg4Wlx4MDBceEMzJ19ceENEXHhDRjxceDA2XHg4MVx4RDE3Mlx4QzFceEZCP1x4RkUuSlx4QTFceDg5Zlx4QkRceDlCXHhFMDQ4XHhDMVx4QjlceDlBaFx4QTlmMlx4RDZdXHhFRFx4OEFceDkxXHhDQVx4OUQxLlx4QzRceEZGWVx4QUVceEFGXHhGQWlceEM3XHgxMFx4ODdBXHhCM1x4RDRceEZGXHhBQVx4RjhceEY1Llx4MDdceDgxXHg4N1x4QzBceEYwXHg5OSlceERGXHhBQVhceEYyXHg5QVx4MDYnbVx4RDNceDFFXHhCMFx4RDRceDBBWVx4OUEuXHhCNFx4MTAnXHhERlx4Q0JKdlx4RERceEM0OWRceDlCZFx4OUNceEUzXHg4RVx4RTNqXHgxRXdqXHgwN1x4RDU8WFx4RjRceEE5XHg4MXRceEFDXHg4NVx4MUZceEI5XHgxQVx4QjdceEJEXHgwRVx4MDVceEM1JV5gLiVceDE0XHgwNlx4MDFceEI4XHg5Q1x4OEJGXHhCM3x8XHhFNlx4OEFceEY0XHhFRkhceDg5YFx4RjhceEZFXHhBMVx4OThceDFCXHhBNFx4OUMtXHhGMlx4Q0VceDhGXHg4N1x4ODg8XHhFMVQ6NVx4RDBceEFBTlx4MTFceEExM0hceDFCXHg5Qlx4QzZceEU2XHhCRDpceEQxXHhBQVx4QUZceDEwfjhWXHhFMlx4MUVceDg1XHhDQlx4RjVceDBGXHg5Qlx4QjNceENDXHgwMjUyXHhBRUdceDA4KnNZXHhFRlx4Q0FceDhCJis9XHhFRTtWXHhGODRZPVx4RDZceENGXHhFMVx4RDNceENDXHhBMSpceEE3XHhGOVx4RjlceEE1dlx4QTJOXHhCRFx4QjdceDFCXHhCRFx4QTFceEUzXFx4OTRceDA3XHhBNlx4ODJceEExXHgxN3xsXHhFOTFCU1x4QjFceDE5XHhFRTVceEY0XHgxNVx4RTY6dVx4RkVceEM5XHhBMFx4MUVBeVx4RDUrXHhGN1x4QjBceEQwXHg5M1x4RDJceDBBSFx4QTRceEYyWk9ceDhDXVx4RTlceDlFXHg5RVx4QUVceEVDPlpceDgwRVx4RTQ4eCQ/XHgxNlx4RkVceEFBLFx4Q0VceDk3RDdceEVGXHg5M11ceEQxVFx4RTFjXHgxRkJceDAwXHhBM1x4QURceENCXHg5NVx4MUZyXHg5NCVceDE0KzJ5cFx4MDFceEEzV05ZXHhFREFceEEzNlx4QzBceDk2ZGJceEVDV1x4RTNceDA4XHgwOFx4ODRceEM1XHgxQmkjXHg4MTBNXlx4QTFceDg2VVx4QkI8YGJceEFGXHg4NXZ1XHhGM1x4MDlceDg3U1x4QzdceEU3XHhDNFtceEMxXHgxOW5ceDk2XHhFRlx4RDVceEE2XHgxNFx4ODhgLVx4RkZceDlCPTBceEMzJFx4QzBIXHhBQzdceDBFXHgwNVx4RUVceEZEXHhBMnhceEY3dlx4RDFceEM0N2V4Z1x4MTNHXHgwRVx4QjBceEQ5W1x4MDdceEYwK1x4MEJceDBGXHhBOFx4RkJceENGXVx4OUJceEVEXHg5QzxqXHgwMnFceEFGalx4MUFbXVx4QjNceEI1blx4Rjc+XHg5NWBceDBCXHhDMFx4QzFYXHhGOFVceEUyXHhENVx4OUExJDZceEQ5XHhBQ1x4RDJceDhGUmxceDlBXHgxRENTXHhCOVx4RTFceDgzXHhFNlx4QjcmXHg4Mlx4RjJ0XHhENlx4OEVceEZFXHhGNFx4QTZHXHgwQlx4OTVceEMwXHhCOFNbXHhBRFx4QjZceEM0QXpceEZBXHhCOFx4ODJceEIzdz1ceDFFNVx4Qjk3XHhFQVx4QjJGXHhCNHBceDAxbVx4QkFqXHdceDE2QVx4MUJceEU0WFx4MURceEFEXHhEOFx4QTElXHhFOVVeXHhBNVx4QkJJXHhDNVx4RUVceDg4XHhFOFx4ODJceEVFXHhFQk5tXHg5RSRceDEyXHhFNSlceDEyNU1ceEU0QFx4ODJceENGXHhCOFx4OEFGXHhGMlx4MDd1UlJceEQycChceDlDXHg4QVx4OEFNKVx4OTlceDFDKDUuNVx4ODVceDk2XHgxOVx4QjFPXHhERENceDFGXHhDNFx4MERceEQzXHg5Ri1ceERDezNceEU4XHhFQ1x4MTdceEI5XHg5Rlx4MDlceEJBXHgwRW9ceDkxPVx4QkNceDg3XHhERFx4RkNceEU3cVx4ODZhXHhEOD5ceEM0XHgwMlx4ODE9XHhBN1x4RkNceDBDXHg5QXhYXHhGQntpXHhBQlx4QzFpZlx4QUNWXHgwN1x4QTNceDBBdlx4Q0JmXHhGNlx4RUVceDhFXHg5NFpceDdGXHg5RldceDA4XHgxNCpceEZBVVx4OEFceDE4Ulx4QzNceDA1XHhERmdhXHhGRlx4QTNceDlGRlx4ODZceDE3THdceDBGXHhFQlx4ODhIXHg5MFx4QThDXHgwRlx4QjVceDFCXHhCQzZmXHg5RFx4QTNDXHhGOG5ceEVDXHgwQVx4QjZMbVx4QjZceDk1XHhEOVx4QjZceEMxJVx4QkRceEZEXHhCRVx4RkZceEYyLGVceDAxXHhCMzdMXHg5Rk1xcVJceDg4XHgwNzNceEEyXHhERDlRXHg5MlZhZ2ZceDEzQVx4OTlceEM4XHhBMStuXHhDQWZceEYyXHhENC9ceDhCXHhCQ0BceDFCUFx4QzNceEYzXHg5N1x4OTNceENDbmVceEU3Ilx4MDZceEI3XHhFNVx4MTBceDlBSyRceEVBXHhDOTNceDA2XHhEMFx4RkVuXHhGQVx4QUNceEQ5XHhFMXc/XHhBRlx4QTFceEQ5WFx4RjdceDk1TF5ceDAzLnNceDA0Mk9YXHhBOVx4OTU+XHhGNlx4RUVfXHg5RHtceEU4XHg4NFx4N0ZceEVBXHhFMVx4RTBYXHgxMFx4RDJceEFEUFx4RjBceEE2XHhBQWVceDA2a1x4QjN7NTBceDkwXHhEQkhCXHgwQm1ceEIzXHg5RlVceERGVlx4RjVqXHhCMFx4REFLXHhDNlx4REZceEU4XHhBQ1x4RjY8XHg4MHl3XHhDQ1x4MUVnXHhGQ1x4RTBceEI0anlSXHhCQ1JceEVFfkRceEUyXHhDMVx4QjdceENBfD5ceEYzXHg4QVlceEU2XHhFRUhceEE3XHhDOGxfcVx4OTlceEMwXHgwQlx4MDkrXHhBRVx4RThrXHg5RWJLNVx4RERceDhFXHhDM1x4QjJWcF9ceDg2XHg4Q25ceEUzXHhBRVx4MDBceEQwOVx4QzFXXHgxRVx4OTVceDgxXHgwNHpceEIzXHhDQ1x4N0Y6ZV9ceDkyYlpceEFDXHgxOVx4OTcxXHg5Qi9ceDg3LyBceENFXHhFNFx4Q0ZceEEwXHhFQVx4RUJvXHg5Qlx4Q0Q7XHgwQ3FceDlCSVx4MTZvY31FaCVceEI3XHg5QVpceDExVVx4RjI/XHhGMDJceEVBXHhEQmRcI1x4QkFceDExLFx4RUNceEZEXHhEOVx4MUUzXVx4QjZceEIwPnZceEFCXHhFOVx4ODVceDE5XHg4Rlx4QkFceERGSHZceEU1UFx4RDUyXHhEQ1x4MURMXHhBN1x4MUFFOlx4Q0VceDE5XHhCNlBceEQzXHgwNW01XHhGOXJceEMxXHhBNlx4RUVceEJDUFx4RkJoblx4QzhhXHhFN1x4OUFceDk1XHhBNUZceEU2XHhCNVx4OERceEZEQ1x4QjhceDk0XHg4NVx4QTVceEJBImdceERDXHhBMzt6XHg5Q1x4RDRceDhEXHhFOTRceEQwXHgwQnlceDgyXHhERVx4RjcoXHhEMVx4MDNceDhEPmFceEU4XHhCQVx4MERceEIzXHhBN1x4RURceDlDXHhCRlx4QUVceEE2XHhEQTlceEJCXHg4NzhceEI2KVx4RjhceEYyXHc6THpceDkyPFx4RURceEJFbFx4N0ZPXHg3Rlx4MDl2XHhGOFx4RDhceDdGXHhBMDstXHhEMDFceERCXHhCNlx4MUZceDg2XHhFMlx4QTJEelx4ODBlVlx4RUNceEEwXHhGQlx4RUJceENBLFx4ODhceEUyXHgwMVx4N0ZceEU3XHhEQmNceEE1XHhCOEhceEJEXHhEREJceDgyXHhCRVx4REVceEZDL3dceEVDXHhERFx4RkRceEVDXHhCQVx4QjdceEZCelx4QTFceDhGXHhEQ1x4MUNceDBGXHgxM31ceEFCXHhBMT9ceEZFXHhBRFx4MUZPXHhFMlx4ODVceEI2blx4MEZrXHgxNDFceEM3XHhFRFx4RjZceDE2PFx4RTciN1x4OTdceEIwXHhFRWBceEUyXHgxMmNhXHgxMFx4QUNceEE5XHg4N1x4MDdceDgwXHgwMlx4RkJ9XHhFRlx4RTJceEJDS1x4RkFceEU0XHg5Q1x4QzJQXHg4NWNceEI2TEVjXHg5MU96XHhDMFx4MEZxXHhBN3AqRkUgXHhCRFx4OERceEY1XHhCNFx4QUYnbFx4QkZvUVx4MDNceEI2XHhGNlxceDA0XHg4MVx4QkRceEJEXHg3RktceDhDXHg4QzF7XHg5QmFceEEzXHhFMlx4QUNOXHhDRFx4OTZceDhFXHg4QTkrOlx4MDlceDFBXHg4NEZceEZBXHgwQ1x4RThceEE5XHg5RiBceEUxXHg5RiFceEQ1XHg4Nlx4RDBceDhGd0pceEQ1XHhFRFx4OEVceEYwXHhEQ1x4QURceDgzXHg5MCxceEFGRFx4MTJJXHhBQVx4MTVceDgyXHhCNFx4QTRceEJBXHhDMVVceEZGbHo5JFx4RDJceEExfFx4RjVvXHhFOVx4QjhceDg2XHhDQmpceEQyXHhFMSFvXHhBMTlvPCVceEQwW1x4QTlceEIwXHhBMFx4QTBnITNZXHg5N1x4QTVceEI0XHg4MVx4QjRpT1x4MTlceDk5YVx4ODEsXHhDN1x4QzR8XHhCN1x4ODhceENCXHhFQVx4QUZKXHg4RXVceEZGXHhGRFx4MDNkXHg3Rm5CRXhceDFEXHhENlx4ODVxXHgxMlx4OUNceEExN1x4MURPXHg5NFx4Q0ZceDdGXHhEM1x4QTRceEQ4XHgwQ3pceDg3aFx4MDhceENFSDxpXHg4N1x4MEMkXHg3RjNceDE2XHgxN1x4MDdceDA5XHg4RVx4QzZGQ1x4RTRceDBFfFx4QzRdXHg4NURceDhEXHg5Mlx4MUNceEYxXHhCNllCXHhDNEkrWVx4QUEiXHhENFx4RDhlelx4REEiXHgwOVx4QjJceDhBYVx4Q0VceEMwXHg4NFx4RURceDBBXHg4OFx4REJceEM5XHhDMFx4QTdceDEzXHhFQ35ceEY5XHhBRFx4MUE4XHhDRVx4QjZaXHg5MVx4ODJceDlGZW9ceDg5XHg5OF9ceDlGc3hceDEzQlx4RTlceEUyXHg4Nlx4OTFceEYzXHhGM0xceEY4XHgwRlx4MEFceEEwXFx4MTZUXHhGRlx4RDFceDEyXHhCM1x4ODVceEVEV3NceEEwNSJceEFCXHhFRVx4RjgvXHgxQ1x4RTJceEUyXHhCN1x4RDNceDFEXHg4RVx4OTJceEVDXHgwQXxceEI5XHhFQ1x4RUYrXHhDMyM7cFx4RjlceEEwXHhCMVx4RDlceEYzXHhGQlx4OEQ9XHg4MkMlXHg3Rlx4MEZ7XFx4QkFceEY4XHgxRlx4N0ZceEU0XHg4M1x4RjNceEY0XHhGOVhCXHhCMFx4MTdtdHJceEUyXHhERjBrUEFceDA0XHgxMlx4MDlceDhDXHhFNVx4QjJceEYwXHg5N2NceEZGXHhDMFx4MDFceDAzXHhDQ1x4ODFzXHg5OClceEU5XHg4NCtceEUxXHhFQVx4RjJceEE0XHhDRlx4QzFceEYwXHhDQVx4RTYxb1x4MDAwflx4MTFceEU3XHgxN0tceDk0XHhFMVx4QTlceEJDb1x4QUZceDE0XHhCRkdPXHhCRFRceDhEXHhEN1x4MENceDhCXHg4Q1x4OTM/clx4QzFceDA4XHhDMyVceDE5XHg4Nlx4REJceEM1Xlx4RjVrXHhGQ1x4OUFceEM4IVx4QzlceEZGXHhDOVx4QzJceDhDXHg4RFx4RjFceDEyXHgwN1x4QkFceDBEXHhGNlx4RUZceENBJ1x4QkVeXHhCMzpceDlCXHgwMmFceENGWFx4MDQnXHg4RnRceDE3dTFceEE4XHhCQ1x4MEFceEU5XHhEM1x4QjBFOFx4QzRceDk3XHg4NFx4QTZceDk2XHhGMiRceEM5XHhCMlx4QzJ+XHhFMWlceEE1NTstXHg4RFx4RkVceDg4XHgwQlx4ODRceDg2XHhGNVx4OURceERBXHhEQlx4MUJceEU0XHhBMVx4RjRGXHgxQVx4MUVceEQyXHgwRm5ceDhEXHhGNlx4RTZcXHg5Mlx4MDU0XHhCQmJceEY3XHhDQVx4OUZ0XHhBMFx4ODlceEQ1ZVx4OUM1OFx4ODZceDE4YFx4MDhceEM5XHhCRFx4MUZceDE2XHg4QSZceENCXHgxRmgxb1BUXHgwRFx4OUVceEFGe1x4QzVceEE0XHhDOVx4QTBXXHg4Q0gzNFx4RDNEXHhFN1x4QjIteTRceEUyKlx4MDlceEU2SVx4RUZhXHhDOD5ZXHgwMlx4RkVceEM2PVx4Q0VAXHgwM1x4OTI2XHhCQ1x4MDVhXHgwMjdjXHhGNlx4RkVceEIybVx4RUFceDBDXHgwNTJceEI0XHhCRFx4MDJceERFXHhBNTtCXHhCQ1x4MUVlJVx4MUNlXHhBN1x4Q0NceDBFXHg4Mlx4MTVceEFDbCxvdVx4MDNceDhBXHhGM1x4OEFceENCc1x4ODIgXHhERmwvUFx4RjFceEE5XHg5M1x4QzFceENEO1x4OTVceDE5XHg5MVx4MUJHXHg4MFx4QjZceDA2XHhGOWtceDkxXHhFNVx4QkYwXHhCMFx4QkRceEY1XHhBM2BceDlCXHg5Qlx4RjJceEE2XHhFOFx4RDNceEU0XHhCMVx4Q0ZceDBFXHhDN1x4QjhceEIwXHg5NVx4QjQrXHg5QndceEFCXHhCNVx4RDYncUlceEQ2MFx4ODVpXHg4NCNceEE3XHhFMVx4QTVceDA3R3hceDFGc1x4RjVceDAxez5ceEYyXVx4ODNceDFDXHhGODZceEQzXHhEM1x4MEFkSX1ceEY3RSFceEEwXHhEN2tceDE0XHhGQVx4RkVceEY2XHhDOVx4MURceDg2XHg5MVx4RUVceDhGP1x4RDUnXHgxRjNceEVGPW9ceEM3XHhFQlx4RTVceEE5XHgwNVx4Q0ZceEUwXHhEOVx4RDk6OHRceDEwXHhFNWl6XHgwMlx4RDBceEI1Z1x4REVceDkyXHg5M2AoXHhFRFx4RTFceEU2PFx4RjJrT1BceEZGXHhBOVx4QURceEQ1XHhBNlx4QkMjXHhEOFx4MTBjXHhEMlx4RENceEI2XHhDMl1ceEIwXHhBRFx4MDlceEZDJCc1V1x4OTJceEJGXHhDQSNceDE0OFx4MUVceEY3XHhGNFx4RDcoe1x4MDJceEM1I1x4RDdsbT0lcGIiWlx4RUMgXHhEQVx4QTh2XHhCNVo6XHhBQlx4MTJceDk4Klx4RDJceEYzbCVceEM5XHhCMSJceEU5XHhEQVx4OTRceEZGJlx4OTQ8N1x4RjNceDdGXHg4Rlx4RDF2cFx4ODQwXHhFRVx4RTNceDA0blx4Q0Q0XHgxRVx4MTRceEQ1XHhGN1x4ODNceEVDOlx4RjRLXHg4OStceEQ2UV5ceEFEJlNceDE0XHgwNXRdXHhEQXBceEU0Tlx4ODdceEM4XHhCMVx4REFDXHgwOVx4MEFceEQxXHg5RFx4OTBceEU5XHhEMj5mXHg4QVx4RDBceDA0XHhDNlx4MDZceEUzXHhGM1x4QUJceEE5XHhCMmtceERDXHgwNFx4RDNceDhCL1x4Q0Q1UktceEY5Ylx4OENceEU0XHhFMi9ceEE0XHhCQ25sXHg4MVx4RTBceEFFXHg4OG1OXHgwOVx4MTZceDkzXHhEQ1x4QjZxKXpceEMyTVx4RjdIRlx4QkVzXHgwQlx4QjBceEEyYFx4QUNceDk4XHhBMC5ZTlx4ODdceERCOVx4MTFceDk3U1x4RkZceDE4XHgxRlx4QkFceEQxXVx4Q0VceDBDdT1ceEM4d1x4OTZceEI3XHhDNFx4QzVZY0lceEJEXHhFQ2xbVVx4MDVjS1x4RjVceEI1XHgxN2N5XHgxQTRceDhGXHgwNFx4RTcgeilgXHhDQyolXHhEOVx4RjhceEI4XHg5M00wXHhGOFx4MDNceEU5XHgxNCpceEM3TVx4QzBceDhEfFx4QjhIXHg5N1VceDFCemRceEI0XHhDMW9ceEMxZlx4ODEnXHhBMF9uXHg5NVx4QzhceDFEXHg5Rlx4QzJ6dVx4QTRceDhCXHgxMkVLXHhDM1x4MTVceEExQVx4QzVceDk1XHg5Mlx4QjktdDBhXHhDMVx4Q0FceDAxXHhEOFRceDE0Slx4MTQiXHhGNVx4MUFSZH5ceEJDelx4RUNceDg5JVx4OTEoP1x4OUF6XHhFNlx4MERceDhFXHhCQlx4MDQxXHg4Mlx4QkZceEFGXHhDQlx4MDdzXHg5RVx4OTlNXHhCRVx4RDYgMTBoXHgwQWNIXHhEOFFceEQxa1x4ODF2XHgxRlJQXHhFRVx4RERceDk4XHhBRlx4QkJceEQ5XHgwMVx4QjdceEJDXHhERFx4MTdceDhEbFx4OTJ5XHhERW9+XHgxM3lcXCMnMUZvXHhBMlx4OUVceEVEKFx4MEJHXHhDNFx4RUNceEMyPlx4MDY5elx4QzZceEJCOCFceEI1XHg4OGFceDBGXHhGOVx4MTRceDAxXHg5OFx4RDJ5XHhBM1x4RThOXHg5NlVceEU1XHhFNkdceDhFdlx4Q0ZceEJGXHhCOGxceEQyXHgwMFx4QjJceEFGXS07XHhDNFx4RjBjXHhBNFx4RkNceEE0dVx4MTNceEQzO1x4RjRceEJBXHhGNFx4MTRmLVhceEZCcFx4MEMnXHhBQ1x4RkJ2XHg5Rlx4ODdgXHhENlx4MTZceEM1XHg5MFx4MEVceEFDJVx4OUFceDk3XHg5NEZceDFDNVx4RkY/XHhFN1x4MUVceDhGJXFceEQ4M1x4QzEyXHgwNVx4MDFceEMxXHhEQ1x4RkNceDlDXHhDNVx4RTVceDlDXHgxOXdceDlCXHgxMlx4QUJceDlEaVx4RENceEJDbFx4RjNceEFBXHhGRVx4OERceEQ1P1x4REZceDFEXHgwM1x4REEzXHgwM1pceDlFIlR5LVx4MEJceEQ4XHhGMlx4ODlceEZCXHhDQVx4RDNNXHhBNlx4RUJNXHg5NFx4OUUoXHhERG5eJyBceEQyPlx4OTV+dVx4QTlceDhBOVx4QkVuXHgwNlx4MUJ8XHhGQ2ZceDBCQFx4QjhceDAzXHgxNVx4RjQrbFx4OEFceEE1XHg5NFx4MDgtWlRvXHg5MFx4RTZceEEwXHgwN1x4RDlceDFDZCMlXHgxOFx4Q0IuXHhDMj5ceDk2XHg5NVxceEEwXHhGM1x4RDhceDEwPVx4RTRGXHhBOFx4MEZceEVFXHhEMy0gaFx4OUFceEQyXHg5Mlx4OTNceDFGXHgxQy9ceEM5XHhGMVx4RjZIY3VceEEwXHhEMD5ceEFGMntceDlEdFx4QzhceDhBXHhENjNceEYyT1x4RjYnXHg5OVx4MThRXHhCQlx4RjYpXHg5RSJceEU1XHgwNlx4QjVTXHg4OVx4MDNceDgzJFx4OUJceDg0fVx4OUVceDdGXHhEMCpceEQyXHgxNVx4RTBceEJDXHhFQ1x4RjZceEQ1XHhGNVx4RjIhXHhEQVx4RDJceEYwXHhGMVx4MDRceEZFXHgxOFx4RTZYXHhGRj1BTVx4RDlceDA0XHhDRmdceEY2XHhFM1pceEEwXHg4NmYiXHhBN1x4REY/XHgwN1x4ODhceDFDXHhFRVx4RUFceEE0XHhBMidceDE5XHhEQlx4MDNceEE4ZFx4RTJceEJDXHhBOVx4ODFceENBNlx4QzNceDBBXHhENCtnfUtceDFDXHhGQVx4RUVceEM3My9ceEJFV1x4ODhceEEzXHgwRVx4OURceDlGelx4QUNceEFBXHg5M3xceEJBZ1x4OTgtM1x4MUJceDE5XHhDRU9ceEQyXHhFRkVceEM1XHg4M1x4OURceEE4XHhDRVx4MEVceEI1Y3VceEU2XHhEOUFceDE3XHhENVx4RTd6STFceDg5XHg5MVx4RDRceDAyXHhERFBER1x4OTVRVE1ceEFGXHhCQVx4QjZceENDZVx4MENceEU5XHhFMjZceDgyXHhDQjlceDA5e1x4ODgoXHg5NFx4OTB0XHhGNFx4MDJceDk0XHhCNFx4QzFceDBCXHg3RiU7c3hceDAzXHgxNFx4MDFNXHhGNVx4OEJceDlEXHhCNVx4QkJMJVx4OUMjXHg4MGxceEYwVFx4RTYkNFx4MTdceERBXHhENSVceEYxXHg5NFx4MTZceEM0TFRceDhDYVx4RkNceEFCIlx4QzNceENDXHhBOX4vXHg5MkxceEYwXHgwQiRceEU1IjplS1x4RTlceEY3XHhGQ1BceEFCXHhDNDNceDhFXHg5QVx4QTJceEIxXHhGRFx4QkVIXHgxMlx4RjRMXHhCNlx4QTlceEMxXFx4MDBceDE0XHg4MVx4MUJceDhBOnZVbFx4MTZceENEXHhFQjdUXHgwOVx4OENceEFBXHhCOG5ceEIzZlFcXHgwOTtceENBXHg5Nlx4MEE/XHg5Rlx4RTJSQ1x4QjdceDFELC1ceDE0XHgxN1x4MDBceDE5XHhCQTMtXHhDRTM9XHhEOVx4MTJceEQyXHg4NUJRXHhBRlx4MEJceDlETVx4REZMXHhGQVx4RTlceEUzXHhERlx4QjhceEI0SDFceEVGUyRceDg2NDFceDEzXHg4NThYXHgxMVx4ODlceEY2XHhFQ2dceERGXHhDMlx4RDhOXHhFQVx4RkRceEI3XHhDMVx4RUZceEE2XHgwOFAxXHhDMkxlPFx4RDIuInFceDA5XHhENVx4REJceEJFWXJKVCYscFx4QzJceDA0XHgwNjhceEY2fWFceDExXF99XHhFNGNceEU4XHhDRFx4MDNceDE4SFx4QkFceDg5XHg5OVx4QTdceDE1P2FceDAxXHhDQ1x4OUZceEM5Wlx4OTJ6XHg3RmpceEE0ejlceEE4aiYkOFRBXHgxQVx4MDNceEZGXHhFOCt0XHg4MVx4MTlceDA5J1x4RTleXHhDOVx4MUUgXHhCM19ceEZEXHgwOShceDhGXHg4MFx4OTZceEE1XHhDNmxceEZCXHg4Qlx4MTJceEExXHhENi1ceDlEL1x4QTMxXHhGNVx4OTVtU1YuXHgxNFx4Q0Vbe1x4RUJceDhGXHhGMVx4RUVgXHhBRVx4MDBceDBCIU9ceEM1XHgxRid+fDhKXHgxMlx4RkNceEU5XHhBM1x4Q0VceERDXHhFRTtceDAwXHhGOVx4ODVceDk5XHgxOFx4N0ZgMlx4MUZnQn1YOFx4RTJnXHg5MFx4OEVceDlEXHgwN3NkXHhDNjZ+XHhCRFx4RjlLXHgwMV5ceDFDXHhGMVx4QUJceEFFXHgxMVQ3Zlx4MTJceEM2XHhCM1x4RURzXHhGMlx4MDFceEZFOFx4QTlceDg2XHhEOSVJXHg5MGxceDg5XHhFMlx4QTRceDFGXHgxNFx4RTRceEUzfCBceEM2Ilx4RUZceEUxXHhCQlx4MURceEFCXHhFOUFceDdGXHhDMFx4MUU0XHg5Q1x4REIlXHhGRFx4RDFceEY3XHhCRkAuXHg5OT9ceEFGXHhEQVx4RThVfFx4REZceDhDXHg5Mlx4OThceEY5cE97L1x4QjlceDE1Z1x4MUJceDgxc1x4ODFceEFGXHhDQlx4ODlceDgwXHgxNyI6T15ceEUzXHg5NCVceDE5XHhDOFx4RjYvNUdceEIyXHhEQ1x4MDZceEJFUmVceEM0XHgwN1JceDk1XHgwMyBceEYxXHgwQVx4RDM3XHhBRVx4REJceDgxXHhENFx4MTVceEMzYVx4OUJceEUxXHhDN1x4ODBFXHhEOFx4QkF4MVdtXHhFNlx4RDdceDg5XHg5Mlx4QTkkXHgxOFx4REVceDE4VSJceEMyNkc0XHgwNjw7XHhGM1x4QTMvXHg5QmI4XHhEMUJceEQyXHhDQVx4MTFUXHhGNlp3XHhFQ1x4OURceEU2XHhBMFx4OEVceDE4XHg5N1x4MURceEE4YVx4QjlceDE4fS9ceDAzXHhGQVx4QUVNXHhEMlx4RjJIVVx4REFceEYzXHgwQlx4REZceDEwXHhCQUA4XHgwOFxceDFBXHhGQlx4MDNceERDX1x4MDRgO1x4MDlceEU2XHhGN1FceEE3XHg4NVx4MTFuQVx4OUJceEFFXHg4OGlceEExXHhEOG5ceEY3XHg4OFx4QjhceDAzaVx4RDl3fUVceDBDXHhDMFx4ODZceEM4XHhGMUZ9XHhGOVx4OTksXHhDQVx4MUNceEVFdVx4RDNZIVx4MEJceDA0XHhDM1x4RkFnXHhGMlx4OTY7XHg5Nlx4RDBceEM0XHhDRVx4QUNceDg0XHhGQmx+PFlceEU1XHgxNVVDXHg3Rlx4QjhceEZGSypceDk1ZmFceDEwXHg4NCxceDhGXHhBNC1ceEQwd1pceDBGXHhEOFx4QzhceEU4YmBoXHhDM3VceDhDXHgxREpceERCXHgxNUNceEExXHgxRlx4ODRceDk5UVx4OEVceEU3XHg3Rlx4Qjh5XHhGRFx4QkRAXHhFRlx4N0ZzP3koXHhBRG4zXHhDNlo0XHhDNX5ceDg2Ym53XHhCRlx4RDdceDBEfVx4OEVKXHhFNlx4MURoXHhFOVx4RDAjXHgwOFVceDEzXHgxOVx4OTBceDgyblx4OUZceDAzbG5ceEFCWFx4QTNtXHgwNyVceEZDXHgwN1x4MTZSXHhEQ1x4QzIkV1x4Q0JceDFFTzRceENGTVx4ODJceEQxb1x4MDVceERCcC1kb1x4OUVceEFBXHg4RVx4Q0JceEMzMFx4QjZceDk3NFx4RjBceDA2XHhGMl90XHhFN0ZceDkxe0RceENCUlx4REVceEQ1XHhCMFx4REJceDE2RFx4QThWXHhCQ1x4OUFceEEyXHhDNlx4OTIzJVx4MEVceEE4P1x4OENceEY1Olx4OUZceEYwXHhBMVx4QjFceDgzXHhDNmpceDExXHg5OWJceDgyXHhBMCV4XHhDOFx4RTlceEI5XHg4N1x4QjBceDBFYVx4OTNceEMya1x4Rjl9XHhGRVx4Q0ZceDBFXHhCQ1x4RDdceEIzXHg4MVg9XHg4Qlx4MENceDE5XHgxMFx4ODRceDdGXHhFQVx4REV0XHg4RlhsXHhBMlx4MDYhPFx4QTlceDgxcVx4QUNceEI2XVx4RDlceDA0XHhDRiFceEYwdFx4QjBceDgxVWxRRVx4QzlqXHhBRFx4QjlceEJCXHhGRFx4OTQoXHgwM1x4RjFceERDXHg4N0RceEI2XHhFQlx4OUNceEJGXHg5OFx4OURceDFBXHgwNVx4OUZceDE1XHhCOWNbXHgxQ1x4RER5XHhCNlx4QkRceEZGXHhGMy9ceEY1XHhENzNceDFBXHhGMWFceEUxXHhDN1x4RDFEYlx4MUJceDFDJVx4RDdceDBDXHhCMVx4MDlceDBGXHhDRFx4ODBYR1x4QThceENGXHgxMjZceEI5XHhBMVx4OUJceEM4Plx4REZ0MlJceEI1alx4OEFsa1tceDEyeGlceEFCYlx4QzVtXHhBQlx4Q0JceDk1XHhBNlx4QTlAci4iZVx4ODB2XHg4NVx4MEZPXHg5N3dceDlFXHhGMlx4ODlceEUyT1x4RjdhMFx4OEVJSC9ceEUxXHhDQ0RceEU2T1x4OUJ+XHhENFx4RTdceDAzW1x4QTZceEMzbk5ceEQ5XHhBMlx4RUZceEQzIVx4RTFceEQzXHhFMFFceEIxXHg3RkZvNG5ceENBKyhceEUyXHgxRm14XHhCRlx4RDhceDk3SFx4RTZceDg0fm9ceEI2XHhFQlx4QkRceEVDXHhENFx4QUFceDFFZlx4QzZceEUxXHg5Nlx4RTdOXHhBOFx4REFceDA2XHhBNlx4RDQwXHhERC5ceDlDXHg4MmRceEQ4U2dkXHhCQlx4MUVceDlDbmFceEZEXHgwMXJ3MCFceDFGXHgwRlx4QzhceEY1XVx4RTJceEJEXHgwNypceEEzU1x4RjBceEZETXV7XHhGNnRceEM2XHgxOFx4QjBceEU4XHgwNFx4MUYnXHhFQVx4QzRceDAzR1x4MDJceEZEXHhFMlx4MDJceEY0XHhDMlx4QzMwXHhCRTtkalx4QUFceEQyXHhDOVhceEEyXHhEQXdWXHhCMUs3XHg5NFx4MTFceERGXHgxRVx4RThjXHhBNlx4RjFceDk1XHg5MVx4RjB7XHg4N1hceEFCXHhCM1x4QjJceDBGQ1BceEI0XHhDM1x4MTVceDA5XHgxMFx4RkRceEE4SG5ceDFCZlx4RTZceEVFYUZgXzNlXHgwMFx4MUJceEMxXHhEMFx4MUQsaiBceEE0XHhFQ1x4MUZceDkyXHhBOVx4OUJ6XHg5OT5ceDFFXHg5NFx4QzJablx4QTdceEVBW1x4OENceEE4elx4QkIhV1x4MEZKXHhBQVx4OEFceDk5N1x4RjFcXHhERG5ceDE3XHg5NmBceEUwXHhENC5ceDFBU1x4Q0RIXHhGRlx4Q0ZIXHhCNFx4QTVbXHhCNUFceEIwKSZAXHhEOVx4QTZceEE3dFx4OUJceEU1XHhEQzdaXHhBMSJceDhBXHg5MVx4OTFceEJBXHhGNFx4ODQ5PT5vXHhBMjQgXHhFQ1x4Q0JceEExXHhEMUBFSzpsXHhGN1x4OERceDEwXHhDMVx3XHhCMVx4MDk3MGclXHhBRFx4Q0JceDA1XHhGNGxceEUxXHhCRlx4RTlceENCLm1ceDhBblx4RkNceENFSFx4ODhceENGZGlceDA2aFx4QzlceDk1XHhCME1ceDFDXHhDNmVceDE3XHg5RVx4MTVjKVx4QzFceDk4XHhCQVx4MDJ4Ilx4RjFzXHhGNVx4QzNceDA1Z1x4RER7XHhCQ1x4RDY6I11aXHgwMlx4RThceEVDcGM/TVx4RTEnXHgwNGxceDFBPFx4QjUxOVx4RjZceEJFXHhGQ1x4MDgwVFx4QjFceEY3XHhGNzlceERFXHhFOVx4QUJceENGJVx4MTlceDg1IFx4RkRceEY2XHgxNnxceEUyTlx4RDhoXHhDNlx4ODliXHgwN3ZceEY5XHg4NSZsM1x4MDVceEE0XHgxQlx4QjRrLyx0XHhDNFx4QjR7b0BceEE5RHdceDg4XHhCRlx4QzBRXHg4MCZceEFDXHg4Mlx4QTdHXHgxQlx4MDNVXHgwNlx4Q0RceDAwM1x4QTUjXHgxQlx4QTJceDA5PEdceEU2XHgxMVhceEI5Vlx4RkRceDFDXHg5MVx4RjdmXHhBMVx4OEZceEUwXHhCMVdceEI5RVx4OUQiXHhFRlx4RTlceEMzXHgwRlx4QkRceEMxXHgwNVx4MENceDlEXHhCQlx4MEFceEI0XHgxNlx4OTFceEM3XHhBMGl8PFx4QTdkXHhDRVx4OEZceDFDXHhFM2s0K1x4MDRceDEwKi1ceEFBXHhFQVdceEUwflx4ODhceEFEXHhEQ1x4MUVceEZBXHg4NVx4QjhceEY5XHhCQVx4RkZceEJCXHg4NVx4QTZbXHg4MFx4MTdceEVFXHg5OFx4RkNceEREXHhEOVRceEVGXHhERFx4RDFceDBGeVx4RjIySyxceDlBXHhDMVx4QjdceDhGd1x4RkJceDhFM1x4RUNceEI4WHIlXHgwOU1ceEYwUVx4MEJceEQxXHhERT5ceDg5XHg4RipceEUxP1x4OTFIXHhEQzpceEQwWSxceEFGWlx4RDdceEY0XHhDM2VceERDUFx4QjdUXHhEN1x4RjhlXHhCOVx4MURceEMwXHgxQVx4RTRceDEzfVx4QjJIXHgwNVN4MFx4RTVPXHhDRDJ5XHg5Mk9vXHhDNlx4RDZceDk4aUtoXHhDMlx4MEZmXHhDMFx4QUEkXHhBOVx4OTZceENEXHhEOVx4QjJFalx4MDJceENBXHg5OVx4MTNceEVEXHgwQVx4ODZceDBFXHgxOFx4RTdceEYyIVx4OEJpXHhEMVx4QUFceDlDdlx4RERefn5ceEQxXHhERlx4OTdceEQzXHgwN1x4MUVceEI3XHg5OVx4RjVzYFx4RDRceEJFXHhDNFx4MDMqXHg5Mlx4RDJIa1x4QjBceEZBXHhERGpceDkwXHg5MFx4MDJceEFBO1x4QjJceEI2XHhGNVx4OTZmKlx4RkVceENDXHhFQlx4MTRceEE3XHgxRVx4RTRceEUzXHhBQ1x4RUZceDg5XHhEMVx4OTdceEQ2Q1x4MDBceEREXHhGOVx4RTdFLy1ceDkxY25yO1x4MDZ6XHgwQ1x4ODhceDA0XHhFMVx4QTNceEE4PVx4RDBceDA5XHg5M1x4ODgiXHhGRWxceEJDeVx4ODlceEQ5XHhGOFx4QkE8Jkt3XHhCOVx4QkU+XHhEOFVceDFCXHhENiFFU1x4QjVRXHhDQ1x4MTRceEE0XHhENy9fXHhBRW5ceEUyXHhEM0NceEVGOFx4OUVceEIxXHhGMlx4QUMkXHhGNnJceEJBXHhFMFx4RjRnXHgxRVx4RURceDlGXHg5QVx4RTdceENCXHhGNVx4RDFceDhEXHgwQlx4QzVPXHhCRT9ceEY4XHhEMjVhXHg5QVx4QzJBXHhDNlx4QTVHXHhCRlx4OTlceEIxY1x4QTcudlx4RkJceEU4LnVceDEzXHhBQmgzaVx4QjBfXHhDNkZceDFCJ1x4MEJceEFDXHhCNWRrXHhCMVhceDk2cGhceEIyXHhBN1x4QUFbblx4REFceEZDUDQ6XHhEQixceERFXHhFMXt8XHgwMFx4Qzhkb1pceEI1Vlx4QTdceEMzXHhEQlx4QUQxXHgwNlx4OUFceDE3XHhDNVx4MDJceDExYWZceEVGalx4OUVBZVx4Q0NceEZEXHhFRFx4RTNPXHhBNHFceENGXHhEQlx4MDJceERDXHhDOFx4QkFRXHhBNVx4RTdceDAxXHhBN3AlKlx4RjVceEE2XHhGNHxZalx4N0ZceEU2XHhCRClEXHgxRnpceEZEXHhBRVx4OTlceEM1XHhFQnNceDFGXHhFQmhiXHg4QVx4RDRceEQ0SnF+LGVDXHhGRFx4REZceDBFXHhDQyNgZlx4Q0RceEE4XHhFQ3xceDkxRCJKM2hYXHhDNCBceDE3XHhDM1tceDFDe1x4QkY6XHhEM1x4MDVceEYzXHhDQlx4QUNWXHhBNFx4OUN8J1x4MEZhXHhFNFx4RThceDlGXHgxRlx4REZqX1UsXHhGOVVceEEwXHhBM1x4MERceDkxXHg5QVx4MDA5Ulx4QUEgXHg5NkItblx4ODJceEM2LFx4MUZceEU4XCBceENGXHgxNDJceDFGXHhFQVx4QjRceEQzXHg3Rlx4OEViNWhceERFXHhBOVx4QTM5IVx4ODloXHhBRnIkXHgwNFx4QjdceDk2XHg4Qlx4OUJceDEyXHhEQlx4QjNfXHhDOXopUFx4RDZceDEyZlx4RTRceDBGXHgwQ1x4RTF5XHg4MFx4QzZceEREPFx4MDdVXHhFM1x4MDNceDA0Y1x4RjBceEQ3aFNceEY5QVx4RTVceDAyXHhFRVx4RDFzWFx4QjZjXHg3RiBceEExIF1ceEZFcFx4QzNceEQybFx4QzFqXHgwN1x4QzJhJFx4ODdceEZDbVx4QjhceDk1VX1ceEUzXHgwMFx4QjlnN1x4QUNnZlx4QzNceEJBXHhCOTBceEI5WVx4QjRsXHgwMUxqXHg4MS1ceEVGXHgwRlx4QzAqXHhCOTtNXHg4OWZceDg5XHg5OFx4Q0VceDAyXHhBNHhceDAyXHhGNFx4MTBceEIwXHgxNlx4MENtXHhCNl5ceDAzXHgxMTYkXVxceEZFXHg5RVx4QUFqXHgxRVx4QzdCXHgxRlx4QzFCVFx4MUNceEIwXHhGMk5ceEIzXHhDOUpAXHhEMFx4QjV8XElceDgyXHhENlx4RjB5XHgwNVx4QzZ8cS9ceDlCXHhEN1QyXHhCQmtIaFx4OEJceEIyXHhEM0xeXHg4Q1x4RjNceDAzNHhceEFGXHhBMT14XHgwNlx4OTVceDlDXHhDQ1x4MTU4bFx4QTFceDA1XHg5QXhHSlx4Q0YhXHhBMyt5XHhCRCFceEIzflx4REMmc1x4RDVceEY2XHhGOVx4OTBceDA1XHhBRFx4OEVceEJEXHg4RXdceEQyWlx4QjdceDEzXHhDQU5wOFx4ODIyXHhGMVx4ODBceEZCXHhEMFx4MTNceDg2XHgxOVx4RjNceDlFXHhCM1x4Q0M2XHhGRVx4OUFceDEzSlx4MEFrXHhCMzFceDhDXHhGOVZceEVEU1x4QjR4XHgxOSk2Q1x4QTNceEIyXHhBNlx4QTkkXHhEQlx4ODdnR1x4RUFceEQ0XHhGMD1XXHhENVx4OEJceDhEd2FfXHhBODRceDg3PFx4Q0UtSC9ceDk1XHhBMlx4QzZceEY4XHhGMlx4RDg0XHg4OVx4RDc3XHhBQ1x4QTl1XHhBRFx4ODFLXHg5N1x4MDUpXHgxQlx4QTZceERFXHhCMFx4RUZRelx4QTR+XHhEOVx4ODNceEFEXHhGQTAiZ0NceDFCXHhFMFx4QzlceDk3XHhDRlx4RTZceDE4XHhENDtceEZFXHg4N1ZceDg1S19ceEVFXHgwMHJBIkJceENGXHhGNFx4QTlceDk0XHg4NGpceEU0XHg4N1x4QzNceDE0e2tceEIwXHhFOXYoXHhCNVx4MTFceEFGXHg4NjpceEJFXHhEMlx4QjJceEE5XHhBNSRceDg4U1x4RDJceDlEXHhGOFx4RDBceDkyYE1ceEZBXHhGM1x4N0ZdKCUsXHgwQmgjXHhFQ1x4QzNceDhCaFVceEY4XHhDN1FBd0ImVFx4Q0RjMWd5XHhBQyFceEQ4XHg4N1x4RUNceDk4YVx4QUF7XHg4MVx4OTNMXHhFMnRkaixceDgwXHhCN1x4QkVceENEXHhEMmorXHhCMVx4QkFceDA1XHgwNFx4RENceEJDbVx4RjVceEJDQFtceEJEXHg5MFx4OUVceEEzXHhCOFx4MTl1Ilx4Q0ZceEU2XHg5N2p7QlBceDE4XHhCQVx4RTJceEEzXHhEOVx4OERceEM3bTNceENDPG9ceEZGXHgwMidceEQ4XHhDNWokaWFQb1lceDAycipceEI4My5ceEE5S1x4OEZceEYzXHhFOVx4OTlcN1x4RTNceERDXHhEMVx4Q0NbfVFmclx4MEJceDBBb1x4OEFceEM3PFx4RjRceEUxSFx4OENceDE2XHg4Q1x4MENceDEyYlx4MDlceDg0XHg4OGNceDk3JVx4ODdceDFGXHhDRC1BXHgxRVx4OUFceEZEXHhGQmlkfVx4QUVceEI5XHhDNVx4OThceERCLVx4RDNceEFBXHhDRjI3XHhGMVx4MDRceEZGMFx4RThDXHgwOFdVMTFVOlx4RERceDg0XHg4RCZ6XHhDN1x4OUNceEY2S0lceEFCXHgwQmVceEVBXHgxMFx4REJceDBFNFx4OTZrJVx4RTZceEM1XHgwNFRMXHg5MFtceEY1XHhFRVx4MUJceEM3cntceEE2clx4QURceDFGXHhCN25ceDBGemVceEFBXHgwOFx4RTdEZz9ceEIxPnQ5cjZBIVx4QkRceDdGXHgwQVx4QjInPFx4MTdceEMwXHgwRFx4OURdWFx4MDNceEYzXHhFRDtceEE0XHhBMjx2LTVdXHg4Q21BXHhGRSRceDg4XHgwOS1nXHgxMSFceEU0XHgwQlx4QkJceEM2XHhGMlx4RkJceDgyXHhBRVx4N0ZceEE0XHg4Qlx4QTRceEJCXHhBNVx4MEFceDg5TGNceEEwXHhFN1x4RUNceEQ2Klx4ODh2cjdceEYwXHgxM1x4QjZceDdGXHhFM1x4RjFceEU4bUJCTVx4RDhceEY1XHg4MVx4OURceDgyXHhFRlx4RDM3XHgxOVx4Q0FceEMzXHgwOFx4OThceEZBMS1MK2FceEQwXHhFQTpceEI5XHhGMGQiXHg5NVx4RjNceENFXHhBMVx4QjVSXHgwQmlceEM2XHhCM1x4MUJceDhGXHhBRG1ceEYzblx4QTdceEEzXHg4RVx4QzRPWUhceEU5XHhDRFx4OTEoXHg5NFx4Q0RceENFOlx4OUNceEU2XHgxQythXHg4OVx4OUE0RVx4QTU6PFx4QUNceEVFXHhEQlI4clx4RjVceERDXHgwQyxVXHhFQylceDk4Klx4RTMibFtceERFYVx4MDhceDE2XHg5Mlx4QkVgKnJceEYzXHhEMFx4RUFTXHgwNFx4Q0VceEE1XHhCNVx4QUJceEVFXHhDMlx4ODZvXHhGQ1x4Q0VtN1x4Q0FceEI1WXZceEFFdyZceEY4XHgwMlx4RDdceEVBPVhceEZCXHhBMVx4QjBceEM4X1x4QzVceEUyXHg4M1x4MDZceEREJ1x4QkJUXHgxN1x4QkVceDhBXHhBOE1ceDk3XHgwNnJceDg4XHhERDBVXHhDQVx4QTVjXHgxQ1x4MThceEVCXHhFN3pceEVDXHg4MUFceDlBXHhERVx4QUVcXHhDOVx4OUJceDlBXHhEM1x4RjlceDhEXHhFRlx4OEN5XHgwQVx4QURceDhEQilceDBDM1x4RkRceDk3J1x4RDdceEUzLFx4MENceEU5XHgwNlx4MUZAXHgxNH5hXHgxMFx4QjVceEQzXHhGNFx4QjFceDk1XHg4MVpxXHhBRFx4MENceEEzXHgxMFErRC9ceERCXHhDQlx4RkFEaVx4RUZceEIwNVx4MTd2XHhENlx4QzNceDhFVFx4OUNceEVDZVx4OTdceDg5XHhBMlx4QjVceEMxaVx4RUJceEU4XHhFMFx4RThCXHg4OVx4RDdPXHhEM1x4MDNceEVFXHhEMVx4RkVceEU2R1x4RjVceEYyXHhCMFx4OTB5fFx4RkRHXHgxMlx4QkVceEVDXHhBMFhceEREXHg4Mlx4MTJCXHhDOVx4QjZceEE3XHhBMlx4QTltXHgxNFx4RTI9XHhFN1x4RUFceDk2Ulx4MUVceEI3eHRwXHg5M1x4MDNceEZDXHhFMVx4RTlceEIzXHgwOFx4RUJceDBCXHhDQ05ceEFEXHhEMi9ceDFBXHgwQVx4Qzd+XHhGRFx4MDFVXHhGMFx4MUNceEVEXHgxNlx4RDRceENCW01cXHhGNlx4RjBceEFFXHg5RUFceDkyXHhBQ1x4QTdceEVDbVx4MEFceDE4XHgwMXVceEUxXHg4MVx4OUFceDk4XHhEQ1x4RDVceDkzZy9ceEEwXHhBRFx4RDlceDFGXHhFQl1ceDkzXHhERFx4RTdceEQwXHhCOVx4ODZceDBFXHhDRFx4RUJqXHhBMlx4MTlceENEYlx4RTk7XHhDRiZceEQ2XHhGN1x4RkQ0PS5ceEM0XHhERFx4QTdceEJDXHg5Rlx4ODMrQFx4MTd+XHgxRWVceDk0XHhCNFx4RUFceEM0XFx4REVceENGXHhBNFx4RDZceEVEY3tceDk1XHgwOHZceEEyQVFceEU5OVx4OUJceEJEPiIhXHgxNzlceEM2XHg5Q1x4MEJjV1x4ODZFXHhBOVx4QjlceEM0KUtceDgza1x4MTlxXHhEOENceEY2XHhDMlx4QkRceEZEa1x4RTBceEE4aVx4RDFceDlEXHg5QjtceDgyXHhDMm5ceDk0XHhBMyxceENBXHhDNTh5XHhDRlx4OTVOJ1x4QUJceEE2aF5ceEJDJVx4REZceEIyXHgwMVx4RTZceEVDXHhGQ1x4Q0VvP1x4MTAkXHg5QVx4QkZceDg3XHhBMlx4ODcqXHhDQlx4OEFBXHgwNFx4RURYLlx4QjVceDA3XHgxRCdceEVFXHhDQlx4RjlceDEwXHhCQVxceDlGXHhCNVx4RjJceEJGXHhFQ1x4RDdceEQxXHg5My9ceEU1XHg5Rlx4QjBceEREQ1x4QzY7Ylx4RTNceDBGdSxceDlBXHhBQ0hYXHgxQlx4RDZceEVBXHhBNFx4RjhceDAwXHg5NXpceDlCXHhEMFx4RjNRXHhEM3ZceDA5aVx4MTZFcz1ceDE4Ylx4MERceEZDXHg4NjhceEFBPlx4Q0FceEUxXHhCN1x4RkI6XHhERFx4MEJFXHhCMi1ceDlBSlx4MTRceDhEXHgxRUJceERCXHhCRlx4RjVceEQ1XHhFNlx4QThceDBBXHhBQ08uVVx4MTVceEJDTmhLXHhEOFx4RTlceERDXHg5NFx4RjFceEQ1fTlBQ1x4RDFzXHhDMmNceEM0XHgwNFx4RkVjXHhEMVx4ODFceDg4XHgxNFx4RkQkX1x4MURceEIzXHhFNVx4Q0VceDk2XHhCOFx4OTdceDFCXHhCRFx4RDFceERGXHg5QiRceEJDa1x4RERGXHg5Mlx4QUM7QXpceENCXHgwM1x4QkJceEU5XHgxMlx4MUZceEE5XHhCMlx4Q0JceEY0ZWZceEY0PUlceDhDXHgxNlx4QUI4XHhBQlx4RjlceERFQlx4RURceEE4XHhCM1x4QzBceDA0XHhCRlx4RjRKXHhDOFdCRlx4RDFceEVBXHhCNFx4REJbXHhDRTFceDAzclx4Q0JceEI4XHgxM0d6aFx4OUFxR1x4Q0Y/XHhCMTxceDBGP1x4MENceEZBa1RceERDXHg4QSknYFx4QjRceEJDXHhGMCdPXHhERTRceEQxOlx4RkZceDk2XHgxOVx4RkRceEQ2XHgwOFx4QTlceDEzXHhEMzpAXHhBNzVceEQzRCNzalx4MENJXHhFRVx4QTJEXHg4MVx4ODlceDg1XHhDQlx4Q0RTXHhGRFx4QkJceDFEfVx4RTUrXHhFQVx4Q0ZceDA5aiRceEVCXHhFQlx4RDhceDg4XHhCRVx4OTFceDBGXHhGQ1x4MDFLKVs8XHhBMyNceEQ5XHg4OVx4MEFXXHhDQi9ceEE1XHhGQlx4RDNKXHgwOVx4OTgxXHg5RVx4MEFceDBBXHhDQ1FceDFBXHg3Rlx4MUNceDlCXHgxMlx4QUZceEFCSlx4RThceEEwN1x4ODM2SVx8QV1ceEEyXHg5RDZPXHhFMU5ceDdGNFx4OTEpXHhEQlM2LyVceDBBXHhEQ1FceEY0c1x4QTBceEUxXHhFOXBceERERFx4MTBceEU5XHhEQkZceEMzaVx4Q0QrXHhGRlx4REZkXHg5OVx4QjguXHgxQ1x4QTExUFx4RjR3XHg3Rlx4ODMnLFhceEY5XHhCOVx4QUEpXHhFOSpceEM5XHgwNVx4RUZceDA5XHg5M3tceEM3XHgxNVx4QUVceDE0XHhDNlpceEI2XHg5OHUrXHg4NCJceDlFXHgwOFx4RTkrXHhENVx4MDk1YnFceENFXHhFNTY+Wlx4QkJceDhGXyJceEQ2KFx4OTdkXHhBM1x4Q0NceDlDXHhEOVx4OUZceEY4XHhGM1x4MDBceDAwXHhBQltceEY2ekVceEM4dFx4RjFceEJEXHgwMVx4REQkXHhEMlx4RUJceDhEXHg4Mk5IMFx4RjNceEUwNTBceEYzQidceEJFLSVceDlCXHhBN1ctXHg5RVx4OTRceDkzeVNceDhFXHhBQlx4MTQwXHg3Ri51XHhFN1x4OTZceDk5XHg4MkBceEQwOVx4ODhceEYzXHhCRlx4OUJceEQ2XHgwNHdcXj1ceERBclx4RUN6XHhBOFx4QjRceDhBOVx4RTlceDAzXHg5QV5rXHhDRlx4QzhceEEyXlx4QzVceDkzeVx4OTJceDFEXFx4MTlceEMwXHgxN1x4QTl1XHhFMlx4ODhZOFx4RkJceEJGXHg4Rlx4OUZceDg3Y1x4Q0RceEY3XHhDMjxceDgzWFx4MUFmK1x4REVceDlFXHhDQ1x4OEFfXlx4QTRuQFx4RTBceEQ2JC9wXHhDQlx4QkVceEVGZkxceEEzekVceDhDXHhBQlx4MDRceEExXFx4ODlceEVFXHhFMVx4ODMwS1x4RDE+XHg5NVx4Qzl5NFx4MUVceEY4dSJxQFx4RjlceEYwXHhBQlx4MTdceEFCVVx4MThceEY0LFx4QjEiXlx4RTdceEQ2aFx4QTNceDE2V1x4MURceEZGXHg4MFx4RUJceDg3XHhCQVx4MTVceDFEXHhBN1x4QkNdLFx4MDBceDA3XHgwMCwuXHhDRmxceDlEXHhDMlx4QjVceDg4XHhDREVoQlx4RTJhaFx4MDZceEIyb1x4QjVnXHhFNlVceEIxXHg4Mlx4RUVceDkyPVx4OTRceEQzXHgwNDNKfVx4Q0VceDhBXHgwN3lceEQ5XHgwM1x4RkNceEYwXHhCOFx4MUJceEZFXHgwNVx4QkJpXHhERWpSXHhFMlx4MDBYXHg5QVx4ODlueUFceEY0QVx4REZceEY0XHhEQlx4MDZceEZGXHgwM1x4Q0YuXHhFRHklXHhFRT40XHg4NFx4QTRceEIwPVx4RUJceENEXHg4MClceDk1fFx4RTVceDE0XHhFQ1x4Q0RceDE2Zlx4MEEzXHgwRVx4MEFceEE1XHhGMlx4QjFceEI5XHhCQVx4MUMlI11ceENBK1x4MDlceDhGfVx4REJceEI2NFx4RjhceEVBXHgwQys8LiVPU1x4QUNceDg4XHg5MFx4RjVdXHhDN1x4RjErKFx4RDJhXHgxNzw7cVx4MTZceDg4XHg5NylceENBXHhEN3ZceDhFXHgwNzZFXHhEMUJceEI4Ulx4ODdceDk1XHhCQlx4ODVceDA0XHgxOFptKlx4QTltXHhBMVx4RjdWXHg5Rlx4ODhceEM0XHhBMSdceEQ0XHhBRlx4RDRjXHhEMk1zXHgxRFx4RDJceEQ3Q1x4QThceEM4XHhFN0dceEFDXHgwQihCXHgxOVx4ODRceDEwXHg4M1x4REFvXHhDOVx4OTZFXHhCNlx4RkVOXHhCOVx4QzlceEFBMFx4MEZceEEzXHhGMVx4Q0FceDFEXHhFN1x4RDM4XHhDRFx4RDJceEYyJWxceDFEJyJceENCViNceDg1XHgwRlx4RjlceDA4XHhEQlx4OThceEQ3RDpceEIyXHgxNVx4REZceEMzXHhDNlx4QzdOXHg5OFx4OTVpXHg5Mlx4QTlceERBZFx4OUF0cVx4OTRceDBFaF9yXHgxNFx4QjY5XHhGMGY1Nlx4REVceDAxPlx4MDVoXHhBQnJceDFBXHg5Rlx4Q0NceEFBanNceERBXHgwRihceDkzXHgxMDsnXHg5Qlx4OTJJXHhEQixMXHhDQVx4RER4fVx4OTJceDk2Iz9ceDE4XHhCRVx4MDlceEI3XHg4OW9ceDkwXHhCMVx4RERRXHhENVx4RkZceDAwXHhFRlx4MUIoXHg5NVx4Q0MzJUhoXHgxQ35ceEIyXHhEOFx4QTlceDBBXHhEQUpceEUyXHg4Q1x4QjJ9UVx4RjA+XHhEQ1x4ODJceDdGXHhBQlx4QzdceDkwRVx4MDdceENEXHhEOERceEMxXHhEQVx4QURcM1x4MDRceDlCTVx4QjhceEY2XHgxMVx4RkJceEVCXHhCNFx4QkJ6TkMuXHhEQlx4RTNceEQ5ZGAgXHg4MFtceDEwVUFNXHhEQ1x4Q0JceDE3Mlx4QUFceEExXHhGRklceDAyXHhEQn4xRERceDBFM1x4QTBceDk4XHhFNFx4QTEvXHhBM1RceEE2XHhBMlx4RkRceDk0IVx4RTlceEJCXHhGOSBceDg2XHhGQVx4OTU+YFklXHg4QUxeVFx4RkJceDhFT1x4MUMyNVx4RTRceDE0QFx4QzhceEUzXHhFMFx4QkRFIFx4MDFceDgxT1x4OTFceDA1XHg5Qlx4OUNYXHgwMiFceDA5ZHpceDAzXHgxQVx4QkRceERDW1x4QjJceEJBKVx4ODQ6XHgxMVx4RTJceEI1XHhFMFx4QUFceDA3XHhBMlx4OTZ8XHgwOE1ca3AtbVx4MDdceENGfVx4MERceEM2XHgwMyJ6clx4QUNceEFCXHhGREZceEJCWDJceERGXHgxQjxceEE0XHg5N1x4QUNTXHhEQ0BceDA0XHgwQjRceERGWVx4RTdceEY4M1x4RjhceENCXHhBQVx4MTRceEU0XHg5NFx4OTJKXHgxOTxTXHhFRFx4RkRceEM0aFx4QUUwKVx4MENSXHg4OVFceDE0XHhGMVx4QUF3SVx4QUJaXHgwMEVceEQ0XFx4RDY5ZHBceENEXHhBMy01XHhENFx4MTJaXHgxQj5ceENDXHhGMVx4QThgXHgwRVx4ODdceDlCIVx4QkZceDhEVFx4RkZvXHhGN1x4RUFSO1x4OEVceEU2PVx4QzVIXHg5MVx4ODNceDFEXHg5N2ArXHhENFx4MEJ5JFZceEQzXHg5MFx4REJceDFCXHhDQytceENCXHhCQ1x4MTdceEVCRVx4QkVceDk0XHg4OFx4REFceDFBalx4MDZceEY1XHhFRlx4RTJceEUxM1x4QzMqXHg5OG1ceEYxXHg5RWU2XHgwM1x4Q0RceENEKFx4RUZceDAzXHhDNV45XHgwMzBceEExQGdceDhGO3gyXlx4QzYrM1x4ODRceDlCXHhFMFx4MTlceEREXHhCQlx4RTFceDBGXHhERlx4MTZcOFx4OTRceEU4XHhBQVx4MUVceDBEalx4QTlrXHhCRlx4OUR7Y1x4MTE8XHhDRVx4QTNceEM4XHhDOT8tXHg4Rj5ceDhFSlx4OUNceEE5Y1x4RkVceEVCXHhDRlx4OERceDE2XHhFRlJIT1x4RjFceDg0XHhENlx4MUFceEMyd1x4QkVceEM5fkVceDlFXHhDRFRceEYwXHgxRUZQXHhFNFx4MDVzXHhDNFx4QzF3O3lLXHgxMlx4OTNceDkyXHhBRFVceDEwXHgwMVx4QzZceEZCXHhCNFx4OEZceEEyRVx4ODlceDlBXHhFNiBHM35ceDBFdldceDE3XHgwN1x4OUJPXHhGRiosXHhDQ1x4RENceEU4XHgwMlx4MDBceEQ5XHgwNFx4OTIkTFx4RjJceDlCXHg5QUUtXHhGNVx4MDlRXHg4Nlx4MTlceDA2XHg4Qlx4MUNceEU5aVx4QTZLXHhCNWBUMVx4Q0JhXHhCNF5iWFx4QzdceDg5a1x4MTRceEI3bVtceERGXHhCQTM1XHhDQVx4REJceEM2XHg4MX5ceDgxXHhFNlx4RDdceDA0JVx4MENDXHhCQSRQU1x4ODFsZ1x4OTNceDE4XHhGQ1x4QzhceEE5XHgxOVx4QUVIXHhCMFx4QjlceDEwTFx4MUNceEY5XHg3Rlx4MDNceEVDXHhCNVx4QTJceEFGQlx4MEZsXHg5NDM/XHhDN1x4OThceERDXHhFMFx4ODFceDg1XHhERWBceDEzVlx4OTVceEE2WVx4RTF8cVx4OEFceDAwT1x4QUFbdlx4Q0E5XHg3Rlx4QzdceDg4XHhCNlx4MTRceEU4cWNceDBCc3Z5XHhEMkJ4VzhceEMyXHhDOUlceEU0XHg4NTxceDBBXHgxRVx4QTVceEUzXHhGNDBceEYzKVRceDgyQFx4MTY3XHhGRHZceEQyXHhFRFx4QjB3XHg4OFx4MEYkOVx4MERceEFDXHhBRDp4Vlx4MDJceEYxXHhDN1x4REZceEY3WVx4RTZceDAwXHhFNlx4RjclXHhCNWVceEY2XHhBMVx4N0ZceENCXHhFMVIxXHhFQlx4MUFceDg0XHgwM1x4OUVceEFBXHg5NkBId1x4RUZdZ1x4RDZ8Y1x4RjRceEREalx4OUZceDA2TVx4OUVDXHhCOVx4RTRceEI1MmRceENFXHhERFx4RUZceEU0JjFceEI2TVx4QUFceEY5XHg4MVx4RjNceEY4XHhDMj9NXHg3Rlx4MUFceEREJjFceDE2XHhFMz42XHhEMFx4ODVhXHhDRHtceDg3c1x4Q0NceDA0bThceDA2XHgxRitceEExXHhENDJceDA5LFx4OTgrJ1x4RjB2XHhFNWpWXHgwN0pCXHhFMTJceEI1XHhDNFx4MTQvXHgwOFx4RjBceEU5SWJceEQzd1x4REVceDA0XHg5Qlx4RUVceDk3XHgxMFx4QjRceDgyY3tFXHgxMkdceEU0XHg5Q3xceDBBXFx4MDdkTklceEM3XHhERVx4OEJceDlEOHZceDk3XHg5NVx4RjNceEE3elx4MUFXXHhFQ1x4MENceEJFXHg4Mlx4MUVceENFXHhCRXp4REdceEVGSVx4RURceDgyNlx4RTJceDAwXHgxQlx4QzVceDlGXHhGRlx4QTFceDA4XHgxNFx4RkRceDBBXHg5MFx4QkZceDA1XHhCNFx4QjU4X1x4QTAtNy5ceEU1ZmprTVx4MThceDlFTWNceDlDXHg5OVx4OUZceEM2XHhGOVx4OEEmQUt9XHhERVx4MDFceERELVx4OTVceEFBXHhCRlx4RDFceEM1SFx4OTVceDlEXHg4Qlx4MEFceDhGN0w4XHg5Nlx4MTNnZmtrXT9ceDE1XHhBOFNceEY0XHgwQVx4QjBceEVGXHg4Mlx4OThRXHg4M1tceEZEXHg5Qlx4MEJ9XHhFNC9ceEJFXHhCQ1tceEFGXHgwNyEqcVx4OTVEXHhBOV5ceERCXHgwN1x4OUZTXHgxN2tceEI4cHk4Ilx4RkZceDk5SFx4MTFceERGXHhBN1x4OTh6ZVx4RENVXHhCNlx4QTdbXHhDMFx4RjQ4XHhBN21ceEIxXHgxQ0lceEJDRFx4QkJceDE1XHg4RVx4QUFceEM0XHhBRFpHXHgwMVx4MERceEEzXHhDNVx4QzlmXHhDOHpceEM3XHhGOVx4QzVceEY0eVx4QkZ7XHhCQVx4MUFceDAwOTx0XHgxNVx4OTBceEY2ZC1ceDk2XHhFMnlceDBDIlx4MEJceDkzREtceEQxXHhFOVx4QTFceEUyKnM1Zlx4OTRceDgxXHg5MElsflx4OEJceDA3XHhBRVx4RDcuXHhBMVx4QTZceEE2XHhFRHFceEM0XHg5Qlx4RDdxXHg5MFx4RTV3XHgwRlx4RTBceEIzXHgwOFx4REUiXHg5Qlx4MThceEFGXHhGRFx4QTFOPnNceEZFflx4QzFceEVDXHhEQ1x4RDNCeixdXHhGM1x4ODBceDAwXHg5OFx4QUNtXHg5RFx4MTczWVx4RkZceEY4KFx4QUNceDA1RVx4RUMrXHhCRVx4RThceEQ0ZFx4RTlceEVDWVx4OURceEJDXHhGM1x4QTE+dlx4MTBceDgwZFx4QkRceEIxXHhFNFx4MUZSXHgwOFx4ODlceEY2XHg4OWdjXHg5Nlx4ODlzR1x4OURAXHgxOURceEI2XHhDMiZCdlx4RDZceDFFZVx4RkNXXHg5MD1ceDFBXHhBRVx4MDhceERCXHgwNlx4MTJceEFEXHhBQX1yWD01XHg5N1x4QzJceEM0YFx4OTZceEQyclx4QkRceEJGXHhFRlx4RjZGLVx4MDcqXHg5OHdceDEwXHhGNDhceEYzXHhCNH1PXHhERFx4QzFceDE1XHhENFx4QkRceEU3ezFceEFFVFx4MEFxXHhCMFx4QkJdXHhDRUtceDdGXHgxMXBceEU1XHg5MFx4MDJceDg4XHhEMXUhXHgxQ21ceEM3XHhEOHYnXHgwNjs2XHhEM1x4RTFmVVx4RTY+XHgwRFx4Q0NceDgzXHhCQ1x4RkZceDhCXHg4NFNceDg2XHhDQVx4QzlyU1x4Qzg2XHhBRFx4RjYgRVx4MUVceEFCXHg5QlpceEI3XHhDN1x4OTBceDAwXHhFQyBceDgzZ1x4QzdceEZEXHhFMFx4ODlceDlBXHgwRlx4OTRceEJEXHhEM1x4RkJnXHhDOGZceEI2ZFx4QzlROVx4RENmSVx4MTFceEE5Ulx4REJceEIzXHhEQVx4RjM8XHhBQ1x4OTFceEYwXHhGM1x4MENceEZGPlx4QTUkXHg4NVx4RkRceEMyYilzXHhFQVx4QzFceDFCXHg4Mlx4QTNDXHhDM1x4RkV+XHhGOFx4ODBceERGWlx4REZceEQ1Qlx4RTVceDlEXHhFM1FoXHhFNWhceEE0clx4MTRceEZGXHg3Rlx4ODI6XHhFNFx4ODFceDhGXHhEOFx4REVceEFCXHhDRFx4OUNceDBGXHgwMVx4QTBLXHhCMUZceEVDR1x4Q0JceEU0XHhBN1x4QzEoXHhGMVx4OTRceEYxXHg5MVx4QzBceEFCXHg5Qlx4QTUwJCtceEIyTFx4RENhMWZ9XHhFM1lceEE2TFx4MENceEVCXHhDMFx4Q0QhXHhBRlx4QjViMFx4RTJINVx4QzlceEQzXHgxQVx4RTlceEEzXTVNXHhERlx4MTFSXHhCQ1x4MEVceEI1JFx4QzhceDA0XHg4Nlx4RThceDA4XHhDQWZceEZBT11ceDk4XHhGNVx4MDZceDlCXHhFRWZceDFFYFx4OUJBXHg5Rlx4QjhceEY1Ylx4RThHXHhCM1x4QjRceDgwXHgwQlx4ODMvYlx4RjlceDFGXHgwNnEpXHg5RVx4OTQwY1x4OUVceEM5IVx4Q0NceDlBa11ceEQwXHhBNkVceDFCfSpceEMzXHhBOFx4QjMkXHhCQXBBTCElXHg4MzVceDAzfm1GXHhBMlx4QzRceDExXHhGRlx4QjlceEY0XHhBMXBceDBDXHhBNlx4RDltO1x4OEY1XHg4MFx4MTdcZFx4MTlMXHhFQVx4MDlceDlEa1x4RTZceEE0XHgwRSZceERBNEQuXHhGM0RceEU2MFx4MUVceDAzRVx4MTVceDExcDhceEJELlx4QjVceEJBUFx4MERceDhDXHhBRHtceDEyXHhGNVx4MEFceENGXHg5RFx4Q0VceEUze0VceEREZFx4QjNceEZGck9ceDAwXHhEMlx4OEZceEQzXHhFMSpceEY0XHhCN2dbQ1x4RDVceDE0XHhGN1x4REJceERFXHhGNlx4MTVceDg2XHg4NVx4RTdceERCXHhGN1x4RDVRXHgwQT9ceDA2XHhBNCQoQVx4REJceEExXHgxMVx4OERceEU0UVx4RUUwW1x4RTFJPD9GXHgwRmxceDk1XHhGOVx4MDZ9XHg5Q1x4OTAiXHhGQVx4QkJceDgxXHhCMnlceEUzXHhGRGpceDExXHhEQlx4RDVceEVCXHgxQiJlZ2RceEJFQ1x4REVceEIyX1x4QUNceDFCcVx4RDJceEZBXHhENVx4MTRceEFGIVx4MDA/XHgwRlx4QThceDkxXHhEQkpceEMzU3lceEZBVFx4MEVceDg4XHhCNVx4QzI4cTlceDE5eFx4QkU2XHhDMlx4RjFgS1x4ODBceENFIDNceEQxXHhCMlBpXHhDMVx4QTdMJlNgXHhGRFx4OUJceDFELVx4RDJKXHg5Nlx4RURceEQ2eHhmXHhBQjw6XHhGN3BCXHg5QVx4QUY/XHgxMHRceEU1YylceDBFQVx4RjdceEI2XHgwQ09ceDk3XHhGRk0+VFx4QTR3XHgwRlx4OURceEFFdFx4RDY8XHgxQlx4RTNceEE0JVx4MURceDEzXHhBMlx4RkVceDgyeFx4QjNceEZFcVx4OEZceENDXHgwRFx4QjF6XHg4QVx4OURceEQxXHhCQ1x4ODAzXHgxOFlceEY4Ylx4MTBceEFBfFx4RTMxelx4RjJyXHhFNlx4MEZAXHg5NFx4OTk8XHgxQmtceEE4XHhEQkFceEZEXHhCRFx4Q0RvXHg5Qlx4OUIhXHg4RFx4QjZceDEwXHhDNlx4ODNceEM1VVx4REEzXHhFNlx4MTFOelx4Q0VceENCQFx4QzBrXHhCN1x4QjRceEY0e1x4RjlceDAyXHhCRGFceEY5Jlx4RkEsTlx4Q0QzYFx4ODlxOVx4MTk9XHg5OSJAXHgwMlx4QjF+XHhBNFx4OUZceEExJmtceDE1Ylx4QTZceEIyXHhENVx4ODNceDAyXHhFOHRceEIyXHg5Q1x4RjdceEJFXHhGMihGXHg5NFx4MTRceENCXHhGMFx4MDdceDA5Olx4MTh+OztceERDWFx4Q0FceDlDXHg5OT1ceDk5XHgxMlx4QTFtT1x4REQqXHhCM1x4OTFVXHg4OSRceDdGXHhDMThceEQ4XHg5Q1x4RkZIXHhGOFx4QTZceDFGXHg5RVx4QjVceERFK3tceDhGXHhDRlNceDhEXHg5MVx4MTh3XHg5ODlceERFXHg4OFx4QzcvXHg5NkM+XHg5QVx4ODJCXHhGN1x4MEVceEFCZXxceERCJ1x4RDRceEM4XHgwOFx4QzczXHgwMlx4MDNceEIzXHg5MVx4RDJceEMzXHhFRThTc1RceDk5WFx4RDRceENCSExceEEyKFx4ODVceERBXHg4NGFnUnxkXHhBOVx4RUJceDhFXHgwRVx4Q0VceEQyXHgxNmRceENDT1tceEIxXHhENkxceDlDXHhCNlx4MTNceEMzXHg4NFx4RDNceDgzXHhCQlx4QTBAXHhGMVx4MTVceDlCXHg4Mlx4OTlceDk2LFZZVlx4OTI/XHhCMlx4QzVOUFx4RjRceDg0NVx4MDN7XHhFOFx4RjctXHhBOEVceDkyXHgwRFx4QUFhW1ZceDEwXHhFRElceERGX1x4QTZAI1A9XHgxMlx4QTdceDk2XHgxRlx4RDVceDgzUGZceDAwa1x4RTlbXHgwOV1AXHgwNkhceDk0XHg4Q1x4RURceDgwWjtceDAyXHg5OFx4MTVBTFx4OTI7e1x4RjdCd1x4RkE7XHhGQVlceDhFfVx4QzB5XHhCRlx4OTFceDFGXHhDNFNuYVx4MDZSXHhBRlx4MUZceERCJDElXHg5Rlx4ODNceDExXHhGRVx4ODQvN1x4MDdceEJBIVx4OTlceEFFXHhCRFx4RTZceEVETEFEXHhEQlx4Qzg1XHhCNFx4ODJceDhGIS9ceDExLFx4Q0NBPlx4QTIvXHhFRVx4RTdceEU2XHg5N1x4RjhDfVx4MTNceEFEa1x4MDhceEZBelx4RjJceEQwXHgxQUBXV1tceEM0XHg4N1x4RjYsXHhBOFx4QTNceEZGXHhERlJceDAyVGNceEM1XHhBRVx4QUZceDBCY2NyVHdceDgzXHhDMlx4MUFLcE1ceEJEXHg5NmhiSUpceEFGXHhBRjNceEE1N1x4RDVvXHg5MFx4OUZceDk1XHhCRGBceDlGQlx4RDNceDEzXHg4Rlx4RThceERDXHhBMlx4MTZceEI5XHhEQ2c/XHgxNFx4QTRceDlEdEYkUEFGXHgwRlx4RTNceEJGTVx4RjQ6XHhCQ1NceEY3XHhGMFx4MUVceDhDXHhBOVx4QkVOXHg5N1x4Q0VceDAwXHhGQnAuQlx4RTFPXHhDNWhmXHhBMFx4RDRceEM0XHhBRD1CXHg4Qlx4OUFceEVCXHgwRFx4OTJceEI0XHg4Rlx4OURRXHhDQ1x4RkVceDhEXHhDRFx4MENoXHgwRjxceEYxXHg4RUA6dHhceDk4XHg4NyFceEQ1XHhDQlx4Q0U4XHg4N1x4QTJceEZDclx4OThceDFEdDRceEUwXHhGRlx4RkZceEUxXHgwRFFceENCXHg4NFx4RkJceDFCclx4RThbJlx4RDBceEQ2XHhFMGxceEVDI1x4OEJceEQ4XHgwMlx4ODBceDBEXHhENFx4MEUjIG0oXHhBRlx4RUVuXHg5MS1ceEIzMFx4RTNceEZBIlx4QUEjXHg4Q0dceDA2XHgxOFx4MTcqXHgxMFx4RjhceDEzLlx4MEJceEYxXHhFQS1ceDkzWlx4REFceEIyXHhFN1x4MTVceEJBXHhGN1x4Q0FCXHhFRlx4RUNceDg0XHgwN1x4QzRkXHgxQlx4QTdceDAxZFx4REFTfVx4Q0RceEM0XHhFM1x4RENsXHhBQVx4Qjk1NVx4Q0ZQWWRiaGVMYntceEVEO3xceDkxRntceEJGXHg4NnVceEU3XHhDMFx4RDRceEJBXHg5NVx4ODhceDAzSVx4Qjk3XHg5Q1x4QThceEVEXHg5NCo9XHhBRHRceEU2S1x4RDVceDFGXVx4RTkiXHhFOGtceDAzXHhENlx4RTZ0XHhGQ1x4QUJceERDXHg4NVx4MDgiXHhBQlx4OUFceEJFXHhDQ1x4ODNceEIyO1x4MEFceEM5XHhGQjBceEU5XHhFMHk5XHg4OVx4MDlceEJDalx4QURceDE5XHgxQmhceDE4XHhDNVx4QkZWXHhBRFx4QzVceEMySmdceEI0PFx4RTEgXHhEM0lceERBXHhCQ1x4QjJyV1x4RDlceDhDLFx4RjZceEY3XHgwRVx4MTdceDhCXHhFOFx4Q0QzIlx4OTcjb1hceDkxXHg4OVtceEEyLFx4OUJceEY0XnRceDEyXHg4QzUhVlx4MEVoIFx4MEFceDlDXHhGOVx4QzEnbFx4MDBkKlx4MTNtXHhERVx4RTN1XHgxM1x4MUI8XHhFOCxceDhES1x4QUNceDFETFx4MUJrXHgxQVx4Q0ZceDlFXHhENVx4QzlceEM3XHhBRSVceDg5XHgxQlx4QzJceDAxKlx4QjZceEM5XHhFOVorUlx4QTFkXHhCN1x4MTdceENFXHgxOHp9XHg4RVJtXHgwOFx4MDBceDBCTlpceEQ5bFx4Qjk9TVx4MDlQXHg4MVx4N0ZKXHhGOFx4RDdralx4RjFHMC9ceEYzLVx4OThceDlCNVx4REJcXHhDQWRceDlBXHhEMFx4RUZceDlCXHgwMlx4MEJDSFx4MUYgXHgxOT1MXHhGMGtHP1x4QjhceEQyV1x4MUU8Zlx4RkZceEE3XHg4NVx4Q0JceEQ2d1x4RjRceENFXHgwMFx4QUNceEFDXHgxMVx4QTdYMlx4MDBceEE2KVx4OTdkXHhENVx4QUJceDg3XHhBM0NceEU0SFx4Q0ZceEI4cF1ceEZFNFx4OTdvXHhEN1x4Q0FceDk1elx4QTNceEQ0XHhCNlx4MTUxXHhENlx4Q0VceDBCOG1ceEY5OFx4RjlceDlCeURceDhDXHg5Mlx4RjJceEZEXHhERCJceEFGNlx4MDVceDhBVWhceDlBUFx4QkRceEVCXHg4NVx4QjZnYnxceDgxXHhDM1x4RDlceDA4XHgxOFx4REF+TitceERFXHhDQVx4RDhdOVx4OTZRXHhEN1x4ODBceENFZyB2XHhCNlx4MTJceEZCIlx4MDdceDgyQ0NceDEwWnRceDhCXHhGMj9ceDg3Plx4QkUhXHhCMVx4OUZceDBGXHhDRVx4RDBceDk3Jlx4RDNceENFXHhGNlx4RTNjXHhCOEVceDBEXHhENjNeXHhEMCZYWlx4RjV4cExceDE1TVx4N0ZceEM5XHg5OFx4QkJwXHhDMFx4QUVRXHg5RnlibTJceDhFXHhBNjs4XHhEQiQ3XHhCM28hXVx4OUFceDBFRFxceEFBXHhBN1x4OEZoKFx4RTY0MzxtXHgwN1x4Rjh8Y1x4QzdceDg0XHhFMlx4MDJ8XHg4NipceEI4XHgxM3NceDBDXHgxOFx4MDczXHhGMFx4RTZceDkyXHhBNUo0flx4MDdceDhEXHhGMFx4QzBceEM5XHgwMDx3J1x4QTJceDhGXHhGRFx4QUZceEYwXHhGMVx4QkRkPFx4RjlceDBCXHhFNyF+XHhFMWxceDAzdFpceEIzXHhFRVx4QzlceEIxXHgxOFx4MUZceEVFXHgwMlx4ODc6XHhCQU5ceEY3TVx4OUFceEZGXHhCQiJMXHg5OVx4RUZceEMxXHgxNl5ceDAxXHhBOSVceDgzXHgxMlx4QzVEXHg5Qlx4QzYkXHg5Qlx4MDNceDhDM1x4RDZceEY2XHhENXpLWVx4RUE/Plx4REJHdFx4OTh5eS81XHhFM1pceEIxNVx4QzhceEZCXHhFN1x4RUFceDlEXHhDNlx4RjNceDFGIlVceDdGalx4QkRceEZFXHhFNldceDEyXHgwNj0hXHgxRExceDk0XHgwNlx4QUFceDk2XHg5Rlx4MDUxKFx4MTdceDBGYFx4OTVhXHgwRlx4RkZceEU1U1x4RDAgclx4QTFceDlGXVx4MDFceEI5XHhDQVx4RTFceDEwXHg5MFx4QjA5XHg5MmVRXHgxNnFQNjlceEZDXHgxMDNceEMzXHhCM1x4RUVceDk2eVx4RTBceEIwXHhBRVR9XHg5OFx4OTVceDFBXHg4M1x4QzBceEUwXHhGOVx4RjJceDg1XHgwRFx4ODVceDk4fXFVXHg5RCVzNlx4QThceEEzeVx4OEZPXHg4RFx4RDYgRWtceEEyR1x4RjlJIGA2XHhEQkZceEIwTlx4RURceDA5XHg4Q1x4OUZceEE2XHgxRmhceDgyIlx4RjZceDA4XHhERitceDk4XHhDNHNceDAxXHhEOFx4RkNEWVx4QTJceENDXHhENFx4RkJceERGXHg4N2NceDgyXHg4OGxmXHg5RTRceEUwXHhBNWAnXHhENWhceEYyXHhBN2QkXHhEOFx4RjdceDlBe1JceEFFOlx4Q0FCXHhBRn5ceDlDXHhEQlx4RTlceEY4XHhGRT1ceENFXHg4NU9ceEYwXHhGNVx4QThceEU3Xlx4ODlceDBEcWRceEQwcnovXHhEQ1x4RUVceEZBSlx4REFiMGNceDlFNG55XHgwMGRceDA3K1x4RUNceEE5QkBceEJDXHg4Qlx4MEZceDA1bkJceDA0XHhFOVZceEM5Mlx4ODZceEQ5eVFceEY5XHhCRUdceEQyXHhFRFx4QjMzXHgwQUlcXHgxRVx4QkR8XHhDMFx4QTdceDkzcDhceEJEXHhBNlx4RjBceEU3XHgxNlx4Q0VceDE4XHg5M1x4RDlBXHg4OVx4OUJUXHhGNjImXHg5RVx4QzZceDgzXHgwRCtNJFx4MDRceEREXHhBMVx4RjdceEUxXHhCNntlXHhBQU16blx4ODZceEQ3XHhGMCtceEFEOHZceEI4XHhGQnpceEZFXHgwQ1x4RDVxXHg5MFx4QzBceERDQVx4RjVceEM0XHhCNVJceDE2dVx4OUVceDk2alx4ODg9XHgwMlx4OUNceDAyXHhCOCFceEYxXHg3Rlx4OEVjXHhGRlx4RTZnTD5hMFx4RTg8XHhBRnFceEMyXHhEM0teclx4RDlkSVx4MUVceDA0RnVNXVx4RTJceEZDJFx4QzlceDE4Ylx4RTBceEMxXHhCQlx4OThCXHhBQlJceEYxXHgwMmRRXHgxNSx0XHhCRCJYXHhBM0VceERBXHgxOElceDkwXHhBOTgjelx4RTlceEU3XHhBRVx4MUFceEE1XHhERlx4MTAzXHg5OFhQXHhDMVx4RTlUXHhDNlx4MUJceEI0XHhCNVx4RDBceDgxXHhGOFx4MUFceDk0LVx4REJceDg1XHhBQlxceDkzUDpceEU2XHhGODpcUVx4QzdceEJFXHg4N1x4MUVceDE4XHhEQzxceEQ1XHhEOFx4REFceENEdVhceDhCXHhFM1x4RTRceENEXHgwODVIXHhBN1x4OTlceEY3Ilx4RTlceEU2XHhFMXsvQ1x4MTJceEFBW1x4MEVceEU4XHg5RVx4MThceEEzUnpPalx4MEM8dVBceEMzXHg5NUJceDBGWVJceEY5XHgxNlx4MENfXHgwQjtceDlFPlx4OERceEM2JVx4QjhceEQ4XHhGRFx4MTJceEFCXHhERVx4REZceEJEXHhERVx4QTRoXHhFRUBceDAwXHhCMVx4ODAqXHhGMFI/XHgxQ1x4Q0FceERCVVx4MTVceEMxW1x4ODFrUFx4QTRceDlDMFx4RTlOb1x4OTI6XHgwRC5ceEY1XHhGQVx4QkI8XHhDN1xceDBCKlx4OUFCN1x4RjlceDBEXHg3Rlx4QkJceEUzSVx4MDRceEQ0XHg4Mlx4RjBceDA3I0htTDJPclx4MUVceEFEXHg5Q1x4RjdSKFx4QjVceDA4XHgxNn0xXHhDMlx4RTBYO1x4OUVoXHgwMFx4QjFceDg0XHhERXQuXHhFRnVceEZFXHhEMlx4RURGXHhCMDNceEJFXHg4NFx4RDNceDhCXHhERFx4QjFceDhBXHhGNFx4QjFpXHhEQ1x4RjBceEUwXHhBNDxvXHhERFx4OTAudlNVXHhDRVx4RUFAQl9tXHhEMVx4QTJ+XHgxRFx4QkVceEE2XHhCNytceEU3VFx4QTQqYlx4QTJoLlx4MUIlXHhCNVx4MTFceEVCXHhEOVx4RTFceEU4XHhDN2YpXHhEOFx4RUN8Jlx4MUNhQGZ1XHgwRFx4ODNceEM1XHhDM1x4MThceEY2Z1x4OTMwQjtUXHhGOVx4Q0JAKH5sXHhFMVx4RDRceEY2XHgxNVx4MTVceEQxXHhCM1x4RjA2NFx4ODY2XHg5QXhceDFDXHhCNFx4RTlceDEwXHhCOCBceEZCfSNceEZEXHhDM1x4ODNceEU2XHg4MFx4RTJceEREYHZceEMyXHhFMXhceDg3XHhEOGVceDg3RVx4QTY1T1x4ODNceEEyXHg3Rlx4QUVceDk2XHgxMVx4MDhceEQxXHg5NVx4RERceEJEXHhCOFx4ODNceEQ5XHhDRFx4QjRceEUwNiZceEVFOFx4QjQpXHhFQS1cXHhDNFx4MEZceEYzXHhGRlx4MERtTFx4QkNceEU4Wlx4QzBceDE5XHg5MVx4QjNceEMwXHhFOFx4QkVfXHgxRClceDlGXHgxNlx4MDZceEM4XHg5Qlx4OTlnT1x4RkZuXHgwNlxeJVx4MDNceDA0XHhDNFx4QjZceEFGXHhEMVx4RThceDBEXHhDNlx4QTRbcTtceDE5XHgxOVx4RkRceDEyXHgwRlx4RTAjXHhFMlx4RTFceEFDaFx4RDZceDgyYSlceEU1XHhGNFx4QzdYXHhBNFx4OEJceEIyXHhBNSNrXHgwOFx4ODVSXHg5NFx4RTRiY1RtbFx4RTkhXlx4RDkkaVx4OTB1eFx4RjdceEE1XHhDNFx4RDFceERFXHhCOGtceDhDfVx4QzNceEQ4ZzxceDlDXHhEN1x4OENceDFFIFx4QTBceEZEXHg5Qlx4ODhceEY3a1x4RkFceEQ0XHg5OFx4QjV2amtceEFFXHg4NVx4RDNceEVDc1x4RTZSXHhENCpceEZDXHg4RVx4OTFceDA1L1x4MUJceEU5XHhDRVx4QjlceDAxXHg4Q1x4RUJhR1x4REZceDg2XHgwMlNceEEzXHhCQlx4Qjl+XHgwRlx4RTVceDk1XHhGRlx4RDNceDhGd1x4RDA+XHhBQjdceERFNmBceDBDXHhDRVx4RjhceEFCWEhIXHhFRlx4RUR2XHhEOFx4RjFUXHhDNlx4QTM2XHhFMkxceEI0XHg4M1x4ODZceEMyXHhBQ1x4OTJKXHg4Nlx4MDdceEM4XHg4RFx4RDRceEQyVSlceEY3XHgxNEdceEIwXHg4QTtceDgwXHgwN1x4RkZceDhDXHhBQVx4Rjc0IydceDk2XHhGOVx4QzUqcVx4ODAyL1x4ODdceEIzXHhDM2xceEUxXHhFQ1x4OTFvXHhCNTpceDlGXHhGOVx4ODJ8XHg5MVx4QUZVXHhGMlx4MTc/XHhGQlx4ODJceDE1R1x4QjN0P0JceEU5XHhENCJceDBBXHhFRVx4RjNceEI3KFRceDBDR1x4QTJceDhGXHhDMlx4RDJJKVx4Q0JceEI5XHgxQydceEMwXHg4OVx4RThIXHhCMEtSXHhERmMzXHhEOFx4OERceEU5XHhCQ3ZceERCR15xXHhDQiZceEVBXHg5RVx4QzJSODFceEQzXHhCQ1x4RTVceEY5XHg5M1x4QTZndSknXHhGRlx4REVceEE4XHhGNklceENGXHg4OFx4RTBGQzVceDhFXHhFOFx4QjRceEVCVFx4MTRceEIzXHgwQUYxXHhCMztceEYzXHg4RCAsXHhCMCtceDA0XHhDRlx4MEJLXHhDNlx4QkFvOF1VXHhDNVx4ODlceDk1XHg5NVx4RkNceEI2PHNceEM2XHg4MjlceDA3NHFceEMzXHhDOE9ceEVDNVx4QTNceEZDXHhCRlx4OERrfFx4QjJceDFDXHhFNFxPXHhEOWdceEE3Ulx4RDdEXHg5QVx4REZceERGXHgxRVx4QUZceDk3XHg5QVx4RjlceEQ0fnxRXHhGQ1x4ODJceERGLFx4RDBceDA2QFx4OUVYXHg5Nlx4QkFceEY2LVx4RjBceERBXHg5MFx4OUJceEYyXHhCMlx4RDRceDAyXHhBRlx4ODVceDgyJ1x4REFceERDM1x4OTE1XHhBNlx4MDRceDA5XHg5MFx4MDd7XHhFOVRceEE4QXZceEJGVFx4QkVceDE4XHgwRlx4QTg1Ylx4QkZceDFGblx4QkQjeFx4N0ZceEZFc1x4QzVceDk4XHgwQ0VceDhDKVx4RTVceDlGMVx4OTBceEVBXHhGMFx4QURceEU0IFx4REEkXHg5Mlx4RkVceEI3XHhGM1x4QjdZXHg5MX4kRm1ceDg2Qlx4QTNceEIyXHg4OFx4Q0ZceEU4XHhCMiRceEI1NVx4RjlceERFXHhENzRceDk5XHhgXHhGNyFDVlx4ODVceEVDXHhBNjVGXHhDNlx4REZ+dlx4RjdceEYzXHhBMlx4ODlceDBBXHgwRFx4RUJUXHg4Nlx4RUQxLlx4MDM3dVx4RkV+XHhGQ1x4Q0FceDBCXHhDOWhceEYzK1x4OUJceDkzXHhBQz5ceEMwXHhBRlx4OURXTFx4ODNceEIwXHgwRFx4QUZceDk0XHhBQ1VceEFGXHg5NVx4QkJceDkxXHg4OFx4MDZBRVx4MDk1XHg5NGx1Tlx4RTJceEVFXHg5MFx4QTJceEVGXHhERlRceDlBXHhENlx4REZceEQyOFx4RDBceEY4XHhCQVJceEZGXHhCN1x4OUJbXHhERFx4QjlceEU0KVx4OTFceDg1U1x4QjIlWElceDAzdilceEU2NEhceDEyXHhFODZceEVGXHgxMVx4MDhceEY3XHgwQipEMjpceENDXHhBQlx4ODI3XHgwMVx4QkRceEIzXHg5Q0skXHhCNlx4QzhuXHhBNk5ceDE0XHhDOFx4ODhCXHhBOVx4QzRceEM1XHhBOFx4QTJceEEyXHhDQVVceDA4JFx4QjJceDEwXHhCM1x4QkNaXHgwNChceDA3XHg5Qlx4Q0FceDkwXHgxOVx4OEJceEJGXHhEMjI2XHg4QkFceENFXHhEQT9bZlx4OUVceENBPFx4N0ZdXHgwMVx4RUVceDhCXHhDRXBceEM2XHgwMkVceEExKDBceEIxXHhCRlx4RTdceEUyXHg4QVx4QzdUXHg4RVx4ODJceEFBXHhFQ1x4Q0ZceEEwXHhBOCpuXHgxM1x4OURceDFCRTpceDA3Xlx4QUJlT1x4RUZceEVGflx4OUNceEYyI1x4QUZceDg5XHhBRFx4OTBceDk0eFx4ODRMXHgxRVx4RTNceDAxdkBceDhBXHhBQVx4RDRTSlx4RDZceEM3XHhCM1x4RkFceDkyXHhGMXZceEJCXHg5QiY7XHgxQnVKXHhBNlx4MTVceEQ0XHg3Rlx4RDFceEVBXHhGNVx4OURdXHhDQlx4RDhceDAxT1x4QTctXHg5Nlx4QzhQXHhBMVx4OENoXHgxQmRwXHhGNVx4MTNceDlEXHgxRVx4QzFiXHg5MFRceEZFXHgxRlx4RDZceEZGPVx4QUZDXHg5NVx4OUVceEUyKFx4QzBvXHgwRVx4MTI0XHhEMVx4QTYnT1x4ODVceEU3XHg5QV1ceDE4XHgwRE1ceEE0XHhCM25ceEQ1XHhCNnlceDg3S1x4RDVceDkzM1x4RjJceEFDIVx4Q0JceENEXHg5OVx4ODI+XHhEQzRceDkwXHhFOXh9XHhEN1x4QzNceEVFXHg5MztceERGXHhDMlZceEE3XHg5OT4lSkxceEJFXHhCQVx4MDRceEM5Mj5yXHhCNlx4Q0FceDg3IjJoXHg5Rlx4QzdceEU4XHhEQ1x4QkFceEFGXHhBM1x4MDVceDEwUEFceEJFKFx4MDlSXHhGM1x4MUQ1XHhBRFx4MDNceERCXHhDNFx4RDdceEE5XHgwQ19ceEM2XHhBQVx4MTZ0XHhFQydceDgyXHhDNSFVXFx4OTRceERBXHgwQnZceERDXHgxMEBceEUzVFx4MTVceEFFXVx4QzhceDE0XHg5OVdlXHgwOVx4ODNceEI5XHg4MmRceDkyXHhFOUNhXHgwMG5gXHhGQlRceEVFXHhDM1x4ODFceEQwXHg4Qlx4OERceEM5Ilx4QTFceDlCK0lpXHg5RVx4QzhceDA4XHhDNVx4RkVzXHhFRE5cXHhEMlx4MTM1dVx4RDJceEQ2XHhGOVx4MDNceEQ1XHhDMVx4QUZceDg3XHgxQlx4RDdceEI5Vi5nU1pceERES1x4MDdceEIzXHg4QyZceEFCK1x4MTBceDkxXHhCN1x4RjdzXHgxRkNceEMwXHhGQ0k7XHhDRDpceDlDXHgxMVZeelx4OEYiXHhDNlM7XHhBMFx4MURceDBGXHhDMlx4QzdceEFDXHgwOFx4MDhceEQzXHgwM1x4QUVEJlx4OTc2XHhGMlx4QzBceEFEY1JceEI3XHhEMFx4Q0I6XHhDNVFceDBGPlx4MTNceDBFXHhGOHJceDg1XHhFMjVrXHhEOFx4MURceEZFXHhDQlx4QzJceDhCXSlHXHhCOV0yVVx4OURIXHhERVx4RDdceEM2Z1x4ODZNJ1x4RjNceDFDU1x4ODNceDFFY1x4RjFceEE1XHhDMlx4OTJceDlGXHhBOWZZXHgxQVx4OEVceERCXHhGRVx4OUZceDhEKVx4OEFLXHhBNFx4MERceDg1XHhBQlx4RTh9XHgwM1x4REN4XHg5MSV1XHhFNjpOXHhCMVx4QzhceDA4XHgxMStWPlx4MEJceDg1XHgxRlx4RDc/RUZceEE4XHg5MmFceEFBXHhFMnByXHg5OVx4Q0FceEYzNFx4RDdceEJCdWVabFx4QzZceERFXHhEMVx4MTVceDgyXHg4MHthXHhBRERceDg1XHg4N1x4Q0RceDkyXHhFMVx4RDZ6XHg5Mlx4RTVceEI0XHhDRFx4OUNPXHgwQ04mXHhEMlx4MUVceENGXHhFOUA9NFx4OTZceEM0XHhGM1x4QzRROVx4MEJceDAxXHgwQ35ceEFBazR+XHhDOFx4ODJceEI1RENLR2FceDlEPVx4OEFceEU0O1x4MTlceEIyXHhGNmRRXHhGRFx4MDVTelx4QzE+XHhENDpceEE5XHhEQlx4OUZCXHhCRVx4RjdceEEzXHg4MGxceDFGYVx4QTFceEM3M1x4QzdceEEwXHgxOVx4RUVceDEyXHhERVx4RjhceEQwcVx4QjBceDk5XHg4RFx4QkZceDhCN1x4MTZceDg0XHg4MVx4ODBceEI3XHg4RF1ceEQ1TSJdYlx4ODVceENDXHgwN0kgXHhEMlx4ODlceDBFJVx4OTFceENBXHhCM1x4RkVceEVCMlx4RjdZXHg4Mlx4QTNFZ1t0XHhENlx4Q0JceEQ3Llx4RThceDk3Rlx4OThceEQ5XHhDNlx4OEVceEJBeFx4OUYtXHhCRlx4OTZceEE5XHhFRTJULzRceDhGXHg5RWNceEI1XHhCMVx4OUJceEUwXHgxOVx4QTJceEVBXHhCQjtceDA3d1x4ODdceDlFXHhDMVx4OEFceDEwV31CXHg4RSw8XHgxNiVfXHg4QVx4MTchXHgxQlx4RDRbXHg4OFx4RERnXHgwQ1x4QkNceEU2XHgxMFx4RTJUXHg5M1x4QTJceEVDXHhCQXhceEZGXHhEMjRceEEwXHgxM1x4OURceDlEXHhCOVx4QUY5XHgxRlx4RERceEVDXHhFN3hceEYxXHhERlx4RDQoXHg5M1x4QkVceEExXHgwRW9ceEI3XHg4MVx4MTFceDk1XHg5QVx4MDZjJFx4OEIyXHhGQ1x4QkJceEM2Zj9ceDE4XHhGQlx4RDhceEYyYlx4OThceENDXHg4NVx4OTlceEU1b3Jfb1x4QzFWXHgwMVx4MDNceEI5alx4RUFceEVGXHhDRFx4RkN7M1x4MUJceDk3XHgwRlx4RTNRXHhBMj5ceEI2XHhBOVx4OENceDk3blx4RUFceEQxXHhGNlx4RURceDg5XHg4Rlx4Rjl6YVx4RkEpVVx4RkNceEJFXHg5QVx4ODZceDFGIlx4QjNceEQ4XHgwRVx4MEJceEU2PFx4RTFceDhFXHg5NVx4QUJceEMxXVx4RDB1XHgxNFx4QTNceEYxU1x4RkQ3fFx4QTNMXHhBN1hceDgyb1x4REFceDE4XHhBN1x4QzRceEIyXHg5RFx4RjBceDBEXHhCNT5ceEE0dDdceEYzWVx4RTkrTVhceEVDXHhDQyZGXHhGOFtceDAxXHhGMHZceEM3YlNceEUwaTh9XHgxQlx4RDhsXHgwNFY7XHhFN3ZlTXZxXHhCRVx4QTlceEJEXHhFNFx4OTJ2RkkjXHhFM04sYntLXHgwM1x4OTFceEUyXHhFRlx4OUFPXHhBNSwzcFx4ODhceDAxXHgwRjNceEVEfltceEE2XHgwMHRceDhDXHhFOFx4QjVceDE2XHhCNlx4MTdceEJBXHhFNGhceDkyXHhDQ1x4OTVceEM0XHhEMlx4QThceDEycCJWI1x4QUVceDhGXHhBOVx4Q0ZPXHhCRjNjXHhCMlx4OTBceEI2Ilx4RTVdIlx4MDk2Jlx4QThceEM5dFx4MTJceDBBXHg4QTpwXHg3Rlx4MUVceEQ4Q25ceDkxOkBceEFBQFx4MURceDlCXHg4RVx4QTVceEM0XHg4OVx4OTlceEE3KlRceEMxVEptXHhBN1x4RTlqXHgwOFx4ODFDXHhGRVx4RTdceDg5XHhDRVx4OEY6OzhceEIxZFx4QzdCXHhFMGJceDE5Y1x4MTNceDFEXHg5QjBceEI5XHgwRFx4RUVceDhGXHhDNj9ceEI5XHhCNSRaXHgwM1x4MTBceDFDd2tlXHhCNFx4REN6elx4ODFceDg1XHg5M1BceDA2K1x4OUFoXHhENlx4ODdceEM1XHhGQVx4OTMuXHgxRlx4RDhQXHhEQnBceEZBXHhDMWFceEVFXHhBNlx4OTVceEYzTFx4ODdMWChceEUxK29ceEU2XHgwN1x4ODBceEZDXHhFRVx4REN4XHhCQlx4QjRceDA2XHhFMFx4Q0NceEFCXHhBRlx4RTVuXHhBRVx4OEYkXHhCMlx4QTNceDAxXHhERXZceEQzXHgwQlx4QkVceENCXHhCMUxceEM1IFx4QjJceERBRGFceEZFXHhCN1x4MTgwPWFpXHgxMVx4RjJceERCVXFEXHg5OXVceEVCXHhBNStfXHhEOFFnWG5ceDE4IXlceDBBXHgxN1x4MTNceENBXHgwMH1NXHgwOFx4ODcqXHgwQVx4MUNoXHg4MVx4QjhceEMyR1x4ODFceDhEXHg5RVx4OUZceENCNFx4RjZceEY3XHhCRSlceEM4SFx4QkRJXHgwNFx4OUNRdVx4OTBMXHgxQVx4MEJPXHhGRD9ceDE2XHg4Q0AqXHhBNiU8XHhEN1x4MUJceENFRjpceDhDcVx4RDg6XHg5OVx4QTN9XHhEQ1x4MDc4I1tceEMzXHg5NjxceEU2KSdceEFFXHhFNGRvXlx4MTV3XHhDOVx4QzNceDFDW1x4RkFDXHgxQm9ceDE3XHg4QSxceDlEXHhFMSFceEY5XHgxQ3pceEZBV0dceEUzXHgxQlx4MDJ7XHg3Rlx4QTUlJVx4MUVceEJBRFx4RkJceENFXHgxNVx4MUZcV1x4Rjk8XHhDMiBceEU1Qlx4MDZfXHhBNVx4QkJceDA4RFx4MDctU1x4RkVkXHhFRVx4QTd5XHhDMlx4RjdwXHgxOFx4RjFceDFGXHgxQlx4QTdceDExXHg4MVpceEUyXHhFQ1x4MTFceEEyOFx4MTRceEUyXHhCRVxceENCXHgwNFx4QzBceEE0XHg4OFx4RDZUdVx4QUVceDA3N1x4RURpXHhFM3hceDdGRlx4RUU/XHg5Q3UgS1x4RDhceEZDXHhCRjBceDAwXHhFRlx4QzdceDk2XHhGQzI3eVx4QkI1Wlx4QjhaXHhBN1x4MDRlXHhFNVx4MDhceDg0XHgxNVx4OTkzYCRJZXt0Plx4QTQxXHhBRVx4OEQkXHhGMStceEM4b1x4RjlceEU3QFx4QUNuUVx4QzAjXHg4N2xceDFGZ1x4ODVceDE3UFx4ODhceDhBXHg4OVx4MURAXHhEMFx4MTJaT1tceEIyXHhFNzVceDA5XHhFQSxceEIyXHhGMlx4ODhceEZCLjJwQzlceDEyJVx4OEVceEM5XHgwOFpceEIzXHgxQlx4RjVceEI2XHhEQ1x4QzdceEYxXHhDNjdceEMwJnZceDhDQFx4RUY4XHhGOFx4RkZDbEpceEI0XHg4QVx4MTV9a1x4RjdceEZBXHhEOVx4RTRceDlCbnNceDBDXHg5Rlx4MUVceDFFXHg5N1x4MDlceEI0Jlx4ODNceEI2c1x4RUFceDk4XHgxOVx4QkFceEUwXHhGQ1x4QkZDXHg5RkRceDA5XHhGNVx4OTJceEU4XHgwQyJceERCXHg5RitceEI1Z1x4OTFceDFBXHhGOFx4Q0VceEU3XHhDMlx4QkQ4c1x4RjNKXHhFODRceEUyXHhFM1x4RkNCI1hceEZGXHhBOGpceDEzXHhBNVx4RDU+XHg4RCFceEE2XHg5Q1x4RDVceDA4WiIoXHhBQlx4QTlceDk3TVx4QzROXHg5Nlx4QzNeXHhFNlx4MDVhSEtceENGblx4ODRpXHgwRlx4REFgXHhBQk1ceEE1b1x4Q0FceEYzXHhEQlx4RjV+SlRceENBXHhFODljXHhFN1tceDFGXHhGQVx4OThlXHhFMFklXHhFNlx4QzlceDk3XHhERFx4MUJceDA1aXFceEEyS1x4RjE8OThceEFCcVx4MDJceEFGXHg5NFx4MTJceDg0U3lceEZGXHgxQ25BXHhENysvNFx4RDZDXHgwM1JceEM5XHgwMXtceENBXHgwNzBceEFCXHhFMzF7eVx4MTZceEUwXHhFMFx4QzFceENGXHhCRTNceDE2XHhGNTBceDE1XHhFQlx4MDZceEQwXHgxRGVlXHgwNFx4OEQkclx4OUZceEY3XHhCQmtZXHg5Mlx4RjBceEM2XHhBREdceEEzXHhCMk5ceEIxXHg5QW5ceERGXHhERlVsXHhERlx4OUN1XHgxMytceDA2XHhEOVx4QUE7XHgwQmlceEJFXHhDQVx4QjJceDA3XHhFOVx4MUZtWFVEJ1x4MDlfXHhFN1x4RDVpXHhDMlx4RDhGJ1x4MEI5XHhDNlx4ODdceEQ3XHgwNVx4RTBYWmtceEUxQ0BFUFx4RTVceENBXHgxN3ZceDA1XHhERjtceEU2XHhEM1x4OTVceDgwPFx4RjElXHhFMFx4RjM8XHhDN1x4QURRQlx4MERuXHhGMVx4RUJceDg0Z1RceEQ0XHhFMiMzXHhDOUxceDgxMVx4ODdceDAyXHgwRVx4RDdceEJBXHhEMFx4MERceEFGJFx4QTBceDgzXHg4NXxceERDblx4QjJSXHhERlx4RUNceEI1XHhDRFRpXHhBM2pceDEzXHgwOTMoXHhBNlx4QTRceEJFXHhDQlx4RTNceEVCXHhFNFx4QjJceEIxKVx4QjRTXHg4RiJEXHg4NkNceEYyIlx4RTVceEVGXHhGN1x4OThceEVCZlx4OENwXHg5Rlx4QkZceEIyXHgxQVJceDk4R1x4QjRceENFfTR2fSpceDkxXHhGRn5ceEFFblx4MDgpcHVceEM5XHgxNFx4MEZ6XHg4MG9ceERGUVx4QjlceEJGOmp2XHhBRDQ4XHgwRFx4OTcjXHgwMVx4MUZBXHg5MVx4QTlyXHhCQlx4OThceEYxcVx4RkNceEFBd1x4RUNceDhCLFgnIVx4QTBceDFCX1x4OEZKXHg5NFx4QjIuXHhFOFx4QzkkVlx4ODVceDlDI1x4OTZrXHhGNVx4QUNceEM0XHhDOFx4ODVtXHg5Qlx4QzY6N0ZceDE0XHhFNUdceEE4Vlx4QjM/XHhBNFx4RDklXHg4QSRceERBTVx4QzNceEI5XHg5Nlx4MDNceENCXHhCMFx4QkNceEExLCFceEY1XHhEQVx4MEI5XHhDNkVceDBFXHhBN1x4RDJpXHg5Nlx4RjlceDBGXHhDNFx4RERceERCXHg5MyZceEM1XHhCM1x4OTVceEEwOlx4QzNceDgzaVx4ODFceDkzXHhDRVx4RkFceEZFeVx4OTNceEY1XHhBN1x4ODlIXHhFM1x4RjNVMFx4QTFceDhCeFx4OURgXHg5OVx4QURceEZGNUdceDlDXHhDNlx4OURceDkyXHhCNXlceEI1XHhDQXJceEMxXHhGM1x4MDBceDA4QFx4QUJdOi9ceEE1XHhGQ1x4OTJceDkyPlx4RkZceDk3X3l4W31ceDA0biFceDhCXHhBNVx4QzVceEVDaVx4MDFceDA1XHhCNVx4QTdceEExXHhBRjhceEMwKlx4RDBwXHgwOFx4RENTXHhGNVx4QjBjXHg5Mlx4MDNceEY5aVx4N0ZDXHhGM1x4RDlceEJGL35ceDFFXHgwRFx4QjBceDE0XHgxQ1x4RkI3XHg5OFx4QkZceDg4XHhFQ1lxQFx4MEQ1IFx4RDBceEM1XHhGRCtceEVBXHg5Qlx4MDRrXHg5OVx4RDNceEQ0XHgwRFx4RUFceDE5Jlx4RjI9UVx4OUFceDA5R1x4QzZceEVCK1x4RkJceEYwQlx4RDNceEYzXHhBOFx4QTNceENDXHg5N2dSIFx4QkFceENGJ1x4MUZceDExXHhFMlx4OUZceDhEXHgwRlx4ODdceEU1XHgwQzUrXHg4OX5ceDg0XHhFNlx4Q0RnXHhFN1x4OTdceEZFeVx4RUFceDhBPVx4N0ZceEQ1XHg4MG1ceEM1XHg5RVx4MUJceEMyXHgwQVx4OTlsXHhFMlxnbFx4RTVceERGU1FceERGZlNuZFx4MTlceEIwXHg4RVx4OTlceERDXHhFNVx4MENceEQwXHg5Q3xceEQ1XHgxNFx4MEVceEM4XHhCQVx4MDlceDEzXHhFNFx4RkZYXHgwRissXHhCMFx4REVceDBDXHgwMlx4QkZfKlx4ODNceDE0XHg4Qlx4REFWXHhENk5ceEJGKlJceENCXHgxRFx4MDY5XHhFM3NceEQyXHg5Q1x4MDhceENFSVx4QkNPXHhENTNfXHgwNVx4ODAuXHhBNT1ceEY5XHhGMlx4RDYrP1x4MDJceDg3clx4MEU2XHhFM3ZceENCXHhBNE1ceEExOFx4QTJtXHgxN1x4MTRceDk4YltceEIwXHhCM01PJ1x4QTlceEM5XHg4NVx4OUJceDBFIVx4MENceENBXHgxNFx4ODNceEMwXHgxRlx4RThceEM0TVx4MEVSJFx4OThceDFGXHg4M3dVXHg5REVceEYwXHg4M1x4QjRJPD1ceDkzXHhDRFx4RjBceEYzXHgxQXBceEEyZFx4Q0JceEFEXHhFMlx4MDM7TFx4RTBceEMyXHhFOVx4RDNceEZEXHg4RVx4OEZceEJGXHhEOTtTWFx4RjBceEFFXHhCNlx4QjlceEIyVjdceEIzXlx4RjRceEMxVlx4RkJceDBDXHhEOFpqXHhEQTk8XHgxQVx4OEVceEYwWDA6XHgwN1x4OEVceENDI1x4OEFceEQxVFx4RDVceEU2XHgwQzZceEExRj1ceENDLVx4RkVceDgyXHg5QVx4MDM6Nl06bmlceEQ5KmlZXHhCNlx4Q0FceEE3XHhCOGNceENGXHhGOXJceDhDXHg4Nlx4OUVceEIyXHg5QSxceEEwXHg5OTZceEYyXHgxMlx4QkMkXHhFQ1x4RjAyPVx4RUFceEQ4K1x4QTVXXHg4Mlx4Qzg1Xlx4OEZceEJCOVx4RTNFXHhGQVx4MTFiXHg3RnxTXHg4OVx4Q0JceDAwIlx4Q0ZceDlCaSNceDhCQlx4QjhbXHgwNVx4QjBceDkxXHhCMVx4OTZceDk3XHg4N1x4OTNceDhBXHgwM2RceEVEZlx4MTZceDE1XHgxN1x4OUVceEUxXHg4Rlx4MUZMXHgwNVx4QzlwXHgwM1x4REZceEVBOktceERCXHhFRX58NWlceDgyXHhCMVx4ODVNXHhGM1x4RDhrOlx4RDNFXHhDMFx4OEYzXHg4Nlx4OTJceEE2XHhFMlx4OEVbXHgxRUBceDAwXHhGMFx4OTVceEQ0XHhCQn5hSlx4OTJceEREPlx4OEMwXHgwRnRceDE4RFx4MUNBW1x4RDB9XHg4MFx4Q0ZceEY2XHhFMjhceEM0bVx4REFceEYxU1x4RURceEExXHg4OFx4RkJceDBDSFx4RDNceDhCXlx4QzVceDg5XHhERlx4RTVQXXhceEJFXHhFRlx4RDFyOzdxVVx4REZceDA1a1x4RUJceDg5XHhDOFx4RjF7JEpceEI1Jlx4OTV6bVx4MDdMeVx4ODB3YUZjXHhGM1x4QUJceEIyXHhBNFx4OTlceDFFXHhEQlx4QzlceDE3XHhDOFx4QkVceEQ3Tlx4ODlceEYzXHg5Q1x4MDNceEI0Ulx4RDVceENEUFx4RTJceEE2XHhFMFx4OUNceDBCUFx4QkJ8Xlx4ODNceDE1ZV1IeFx4RjZGXHhGRDpKYFx4OTJceDE4XHg5NFx4MENceEMzXHhBRlx4RTBceDlDK1x4RjJaXHhDNFx4ODZHXHhFMnpceEFGXHgxRFx4RDFceDFGOFx4RjRceEI2XHgxRVx4OTlceDg1XHhBMlx4QkY6XHhFNFx4OTNceDFBXHhGQVx4MEZceEQ5XHgxNFx4MDRceDA0XHg5RFx4QjNAN3ZfJVx4QTRceDg0aFx4MDlceDhDP1x4REQyO2E2XHhGRFx4QUZceEU2XHhGOVx4QTViXHhFNFx4OTk4VFx4MDdceERBIFx4OEJceDE4XHhDRVx4MDJceEMzXHg4Qlx4RkNceDhCXHgxND9ceDFGXHhCNlx4OEJpelx4RTdceEJEXHg5OVx4OUZyXHgwRVx4RUJceEIyV1x4MDdceDEzXHhGNVx4ODVzXHhENVx4ODIuXHhBNS5ceEEyXHhGM1x4REYhXHg4RlZceEIzXHhBM1x4RTlceEZGeDdAXHgxQ1x4RjBceDg4XHg4Qlx4QjdUXHhCRFx4RDhceEE4XHhFNlx4MEFceEVDXHg4Qlx4OTR7K1x4RkZceEVFXHhGM1x4MDZOR1x4RTlceEU1XHhCOFx4QzdceDkyXHhCOFx4RUJYU1x4QzFceEVGXHhGQlx4Q0FceEFCXHgxNyVceENDQlx4OEFceENCRnZceDgyXHhGODdceDkyUVx4QUUsZ01ceDBDMmtceEM5XHhCMVx4QzVceDE5XHgwMFx4MTRceEFEXHhDRVx4MDZceEM4XHhFRkxceEE4YWxceEZBXHhFQTtZXHhBMVx4REZceDk1XHhDQVx4RDNceDk5XHhDRVx4RDRceDAzXHgwMV10dTMgR35ceDg0XHhCRFx4Rjh7XHhENCRceEZDQFx4RkRNVVx4MTNvXHg4QmhceEJGXHhCNFx4RUNceEY4N3VceEUyXHg5Qlx4MDZVXHhCMFx4QzknXHhCM1x4REVceEY4XHhEMFx4RjJceEJGKjQuXHg4NFx4RUFceDk5XHhBMFx4QTkjXHgxNFx4RjlceDlGXHhBRFx4RTVceDEyXHg3Rlx4MENceDBFXHgxQk5iZDtceDg0b1x4RTJceEZDVlx4MEJdXHg5NWRceDAwXHhERVx4OURceDEyJjRceEQ3XHhFQVx4RDdceEVFXHhDNzlceEY2XHhCQVx4MTBceDg5UVx4OTlcN1x4QzBceDhGXHgxRVx4ODJHQ1x4RjJceEFGXHg4OFx4MDRceDhCMXdceDEwJFx4QzZceDEwXHgxMXxoVFx4ODkrRyRceDk2S1x4QURceDlBXHgwRFx4MDZceDE4XHg4MFx4RkJceDA3XHhCQllceEI2RlFceENCXHhDNlx4QUJceDA2VFdcXHhGQXxceDgxXHhGQ1x4OTBceEUzXHhENVx4MTFceDBBXHhBRFx4RUNceEZES1x4QkJceDlCXHhCMlx4RDchbSRceEIwTlx4OTZceEY1c1x4MDNceDk3XHgwN1x4QjdceDlFXHg4NzV+NCBceEJGQ1x4QUZ7XHhFRVx4OUJceDFCXHgxMVx4MDUkXHgwRFx4OEVlIlVceDFGXHg5MFx4MDdceEY0XHhEQytSXHhCNFx4ODJceEY5XHgxOVx4MUUkXHhCMFx4OEJzXHg5Q1x4N0ZceDAxSlx4MEZceEJGXHhBQVx4OEJBcFx4QUVceEVFdHpJXHg4Mlx4QjRceDk0IFx4QkVjXHg4N3s1KFx4MDk0XHhFNlx4RDFUXHhGRWtUaVx4RUYmXHhEQi0gL1x4MDZzXj9jXHhCRVxEXHhGOVx4QzI1Qlx4QjRceENEXHhDQzN9XHgxNCVceEM3XHhEQ1RBXHhDMFx4QkZceEZBXHg5N1x4MUQ4XHgxNVx4QzJceENDXHhERlx4RDRceDkwXHhFNDpceEM0UVx4RTl2XHg5Ml5ceEI5aHxceDhDLFx4RTV7XHhGRVx4RDlceENCXHg4Nlx4REFceDBDXHhBQVx4RkJceEVCXHhFQXVceEU1XHhDMT1GOFx4N0ZIXHgwOVx4QzZceEZGXHhGM1x4RDVwXHg4RFx4ODJceDFDXHhENTdceEY1XHg5N0pceDgxXHhGN1x4MDVceEIxK1k9XHgxMEVceEFFU1x4QUZceDlFXHhFRVx4RjZceEQyXHhGQ1x4RDZzXHhBNW5ceDlBXHgxMGtceDlBXHg5Rlx4RUNGXHg5RTVYXHg5NVx4MDlAXHg4Nlx4RDRceEZGXHhBQVx4RENceEIyXHgxMmxceDA4XHhENVx4QjNhXHg5M3FceDFCXHg4MTRceEREd0d1XHhEQVx4ODU2XHg4OFdceDAzXHhFN3lceDg5XHg5OVx4OThceEEwaVx4QkVyXHhDRVx4OUVpXHg4Q1x4REJceEEzTFx4QURceDhGXHhFMFx4MTg9XHhBNnVceDAwXHgxQXlceEJGYVx4MTFceEQxbSFceERDOFx4RTZceDBCJFx4RDZceEMwXHhBQVx4MUFceEI3XHhGNVx4RTRcTVhceDFCXHhGQXBceDE0XHgxRVx4ODNhTiNmWlx4QjRceEJCXHgxRlx4MEMgXHgxMjdfXHhEQVx4RjJceEQyXHhCOVx4RjlpXHg4MFx4RTNceEE5J1x4OEFceENGTlx4ODBceDA2XFx4QUJqXHhEMVx4RThOey9ceDkzXHhBMVx4RjRceEYxXHhBMVx4RTdSXHhFRjtceDgwXHg4RFx4Q0ZceEU0QSZzY1x4RjdceEQzXHhBQlx4MERjJFx4QTNceEYzXHhBMVx4ODAoZVBdXHhCM1x4MUJceDlFXHhBRT1vXFdQXHhFOXFceDhCXHgwRVx4RkJNXHgwQThceEY0XHhGNVx4RkRceEI4XHhDNVx4QkZceDA3Nlx4ODdVXHhDNVx4OENyXHhEMjlceERFfFx4QTVcX1x4QTVZXHpceEUzL1x4MEJceEM4XHhCRj58XHgwOFx4QkJceDhEXHhGNVx4OEMwXHhBMUw6XHg5MS1ceEQ2XHg4OFx4RkNceENDXHg4RVx4RDRceEIyXHgwRFx4MEJceEQzOlx4QUV5XHhFMVx4RUVTXVx4RjY5ZHNceDhGXHhDRlhceEMzZ1x4RkFceENCXHhCM1x4QkJceDg1XHg4Nlx4ODBceEE3KjFceENBa1x4REZceEU2XHhBQVx4QkNceEVCOkJceENCTlx4Q0FceDlCXHhEOVx4RThceDkwXHg4MG9ceDk2O1x4REJuXHhDQlx4QkFceEY2XHhEQ1x4RjBceEI3XHhFNVx4RkNcXHhFQj1ceEFFXHhDQ1x4QUVceDg1YVx4Q0FceDlGXHg5Q1x4RDVLXHg4Qlx4MTFzXHgwOFx4RUZceEE0XHhCQlx4RUJceEJEVihgXHhDNFx4RTlRXHhFNU9ceEQ1XHg5Qjh4XHhDRVs/XHgwMlx4MDJceEFBX1x4REJceEUwb1x4MEFceDhGXHhDNFx4MEJceEU2XHg4OVx4REZ8XHgxRG9ceDgwXHgwMjJceEJDXHg5Nlx4RTVceEJBXHhERFx4RDBceDFEXHhDNF5VZlx4MTk2XHg4RFx4QTdbfVx4QjFbXHhCMVx4RjUwXHhBRERceEZEbTBceEI2XHhERVx4OThceENDXHhBRlx4Q0ZOXHhGNlx4MUNceEU2fSBceDk0IVx4Qzl0TFx4MDJRXHgwOVx4RDZOeTJceEUwXHg5RGlceEE4XHhEMVx4RkNceDE4RVx4MTdceEY0XHg4NDtceDA2XHhBMlx4MDhceEY0aFx4REFceDgzXHhDNVx4MDd5XHgxQ2FceDlDXHhBOFdceEE3XHgxRVx4OTJceEYwXHhERnVceEEzX1x4MEVceEE5XHhBNVx4ODlceEEzXHhFM1x4QUVceDg0ZXhceEU4PVx4RTZcLVx4RjUxXHg5NVx4RThuXHhCQTFBXHhFNFx4RkJceDFEPFx4OEYhXHhBN1x4ODBceDA3N1x4RUFceENCXHg5MFx4MUY6XHg5QShHSFx4MDlceEUyXHhFNFx4MTVceERGa1x4MEMmXHgwMVx4OTlEXHhGQ1x4MTZceDEwXHhBMkVceEM5W1x4MERlXHhDQm8+XFx4QjZ9XHgwOVx4QzB8e0IvXHg3Rlx4RjlceDlFXlx4MUFceEYzXHgwNVx4ODRceEUyVnNceEU1PTFceEUwXHgxMFx4OTBceDE4XHg4Qlx4MTNceEM5XHhBMlx4ODIiXHhGQVx4MURceDlGe1x4MEZceEJEXHg5QWZceDAzXHhEMFx4RDNNXHhCRFx4QjBLXHhENVx4Q0RTXHhGNFx4RDJceENDKVx4MUFceDE1XHhCM2tceEQ0XHg4RlJZJ1x4ODFoXHhDNFx4OTd+XHhDNVx4MTlceEY2P1x4QzBceEM5XHhEQjRceEU3XHgwMlx4MTUpXHhEQiEjeWVceDgyWVx4QTJceDE0QFx4RkFceDg2XHhDMlx4MUFceDkzXHhCMUBceEMxXHg5OWBceEVFXHg4Mlx4RTNNXHgwRVJceDFFXHhERVx4RTVuXHgxQ1x4MTQkXHhCOVx4OTVceEZEXHhGM1x4MURceENFXHhGM1x4RURHYFx4MUNceEU4Ylx4RjFceEM2XHgxN1x4MEFceEMzXHg4OVx4QkQpUVx4MUN+eFx4OUJceDFCXHgxQ1BceDFDXVx4RjVxXHg5MGlceEQwZ0hceEYwXHhFQjs+XHhFMDdceENDXHhCMVx4QTIobCRNXHgwMCdceDE0eTBjYlx4QTVceEJCXHhBRVdceEI5XHhEOVx4OERceDhFXHhFQ1x4QUJceDE4XHhCRnpceEYzK1x4MUVceDE2XHhCNVx4MDlceDA2XHhGOVx4RkRceDg3QVx4RDNceDhDXHg4OGRMXHhCRlx4REJceDFBSGxceDA3XHgxMVx4OTlceDhGS1x4QkVceEVFXHhGM1x4MTFceENEUlx4RUZceEY4YktNXHhCMWdlXHhBOFx4MDFceDkyXHhENFx4QjNUXVx4MDE5XHhFMnxjOlx4MTZceDE1XHgwNDwyXHg4M1x4RjNceDk0WjBceDg1SVx4RDlceEJDPVx4QTB0XHgwRVx4OEZceEYyXHhDNFx4MDYkP1x4MTNceDgwflx4RjBfXHhENVx4QjhmXHhFOC5ceDg2bFx4QjhceEYzS0dceEZCSmxceEYyXHg5Qlx4QjNceDExbmt8XUVceEY5e1x4MDlceEM3XHgxMjFceEFFI1x4Q0FceDg4XHg4OVx4RjFceDkxXHhBRitceEJBXHhBQllceDk5XHhDRlNceEExQFx4MTc4JVx4RDklXHg4MFx4RjM8LkVHbGhceEYwN1x4OTdceEJBXHhDMlx4OEFceDA1XHhGQlx4RTRceEVDXHg4RFx4MUZceEM2XHhCM1x4MUZceEREXHg4NV85XHhFQVx4MTlceEJGaU5ceEU0XHhGQXJceEI5TVx4QjJceENEJVx4REY+XHgwNVx4QTFceDhCXHhFNVx4MDlTclx4QkZceEVGU1x4QUU0XHhFOG9ceEJEXHhEMjxceDFFXHg4N1x4ODdceDgzXHhDM1x4QUZceEREXHg4Mlx4MTJceEYyeVx4MTN9XHhDQlhceEMxfG81L1x4RDJceEVCXHgwNGpceEJEOFx4QzNceEIzXHhGMHFceEVEIFx4RjhnU0dceDAxcytceEEyXHgxQ1x4QTBNIlx4RkNceEJFeFpceEMyXHgxOC4oVlx4QkFceDFDKFx4Q0NceDFFe1x4QkRkNlx4QzZ7XHgxN1x4QkNPXHhGRFx4RjdceDkxNj1ceEY1QlJIXHhERVx4RDZceEY2fWouXHgxNHB7Om5ceEI0XHhEMFx4OEEpTWdSXHgxNlx4MDRZXHgwNHsrIlx4QjJceDk2XHg4Qlx4OTJceEI4XHhBMHdceEZDXHhCN1x4MEVceEUwXHhDOXNBSW5ceDlDXHhFMlRceDlGXHhDNlx4RDFceDE5XHhEMyhceEJDXHg4MXRceEY1K1x4RkNceEQ2Y1x4QTY0XHhGMG9ceEM2UFx4OUFceEE5YFx4QjRNXHgxN1x4QTJceDBCbVx4RDRkd1x4OTJceDEzKnxFZDpOOFx4RDlceDg1XHhGNFx4MTJ0XHgwNlx4MDR8XHhDREJceEZEXHhEOWdxXHhCNlx4MUVceEQyOlx4QzNceEQ1YmcuXHhCRTJceDFEcVx4RTVceEZDN2VceDg0XHgxRVx4MDZceEZCMFx4MDFceDE3XHhBRVx4QjQ3XHgwQVx4REFceEUwTSlceEMyXHhFQ1x4RjhceDlGXHgxRVx4RDlceEZCX1x4QkRmbElsXHgxOG5ceEZCXHgwNGdceEJBXHhGRVx4QURNXHg4Mlx4ODJceEE0LDpceDA2XHhGMlx4RjZceEFFVFx4RkNkXHhBNHhceEFELEBGNVx4MENceEY2XHg4Mlx4RkFceDBFXHhERVx4RjZceERFXHhGQyZceDBGXHgwQU9uXHhCMlx4RkFiXHgwMVx4OTNIK1x4MTUhXHg4Qlx4MTRceEE2XHgwNW9WXHhDOVx4MTghXHg5RG5ONFNceDhDOVx4RDhceEY2XHhGRVx4QjJgXHhDQVx4MTRVWiRceDhFXHgwMVx4RjRGXHhBM1x4QTZceERFXHhCOVx4MTRceDk3XHhCMGtceEM1VkJceEEyXHhDOGdceDAwXHhDM1x4OTdceEZCWVx4RTduXHhCMlx4OUVCXHg4OFx4REZceDA3ZmNceDE2XHgwOFx4MTlceDA3WVx4ODlGXHhEOVx4MTM8XT9ceDg3XXViPCZceEEwXHgwRlx4MTUyXHhCOVx4RjdceEFFXHhFMnguXHgwNlx4RjdceENDXHgxRFx4OEFQZUBceDk4XHhBOFx4MTNceENDc1x4RDYqXHhGQVx4QjNceDE2XHhENTxvMFx4QTBOXHg4N1x4MDNceEYyR1x4OUJjXHhDOVx4QThHXHhFRlJYXHg4OVx4REJceEZGXHhGRiNceEREXHgwQVx4QTBFXHgwRVx4OTh2XHhFNlx4RERnOFhceDFGJlx4RDJceEYxRlx4QTJDQFx4QTdceENFS2BceEMwXHhCQn00VFx4REZceDg5XHg5Q1x4RDNceEM1XHgwRipaPFRceEIzXHhFQlx4RkZceDAyXHg4MFx4RUJceDBGXHgxQlx4MUFceERCJFx4QURceEI5XHgwOFx4QzVKXHhENFx4ODZceENDXHhBQSAtMFx4RDRceDBFXVx4RTZ+WFx4ODdceDA4XHhDMFx4QUVNXHhCMlx4RTUnXHhEOFx4QzFceEE4bSVceDEwQ1x4RjVceDhFaFx4MTBqXHgwMHdceDkxXHhENVx4OUFceEIyXHgxNGNceDE3KVx4ODhceDE5eFx4OUJceDBCXHhGMVx4MDJceDEzXHhGNVx4QzBceDk1WVx4Q0F3XHhDMlx4RkFceDkxOFx4MTNHXHhGQ1x4QUVceEYwamFQXlx4RURceDBDXHhFRFx4QTVceEY0XHhCRUoyXHgwMFx4REFceDk4KCg9bzQzXHhENWtceEM2XHhGNSpceDlBXHhCN1x4QzBceEUwb1x4OTVceEJGXHgxNlx4ODFfXHhGRixceERFeWdBXHhERD1ceEFGXHg4N0U2XHhFNmJceDkyXHhFNilLXHg5RVx4OERceERFaVx4ODVceEFEMCs/K1x4QTczXHhDRVx4MTdceDFBXHgxNFx4Q0YqJlx4OTZXU1x4RURceDk0XHg5Q0pHXHhERDVceDkzPlx4OUVceDBBXHgxRFx4RUF4OkxceEY4XHg5NFx4RjZceDgxXlx4RDZceDhFXHhDQ1x4RUVceDBDPV9sXHhCN1JaXHhFMVx4RTJceEM4XHg4N09YXHg5QzhceDhFXHg4QVx4Q0ZceDEyXHgwQ1x4QzlNd2ZceDk5MFx4QTFceENBUFx4OEZceDk5XHg5OFx4RTNceDA3RSJceDFCXHhGQ1x4QjdceEZCXHg4NFx4RjVceDdGXHg5MFx4MENceEJEXHgxRVx4QzJyXHhBRSZceDFCXHhDOSVVXHhCNVx4QjFceENBfHZceEUzXHg5MUtceENEXHhEOVx4RjJceDk5XHhGOFx4RkRceDk3XHhFRFx4ODhceEMxXHhEM1x4QjFceEZEXHhENVx4QzNceEQ5Y1x4QzZceDhDOlx4RDU/fVVceDk4XHg4NWlceEI5XHhFMlx4MDFceEM5XHgwQV9ceDhEJURceENENVx4RjdceDg2XHg4OVx4OURceDFBXHgxNSRceDlEXHg4RFx4MUNceEJGPFx4RjVceEZBJE9ceEU2XHg4N1x4MTRceEQ0XHhGM1x4ODBZXHg5Ml9ceEQ1WFxceEFEelx4REFVXHgwN1kpXHhGOVx4MDBceEI3XHgxNjYsWztceDlBXHg5N1x4MEZLXHhEMUNCXHg5RFx4RDVceDEzZ1x4QjhceEVGXHhGMFx4Qzk/MVx4RkF9clx4RkREXHgxMHBceEQzXHhDNGZceEEyMGg9V1x4QzlceEMyXHhEQlx4Q0NyS1x4MTdceEFGPVx4QjldXHhFMlx4MEZceDBDQkNceEE5YFx4RTBJXHhDMEBceDBGXHgwNVx4QzUnclx4OUE1PFx4RTFceEFGS1x4RUZceENFSlx4QTZceDBBXHgxRGNceENGXHg5OFx4QjlceENCXHgxNVx4QjlceEJDZTVceDk3Xlx4OTI1IFx4OUQgI1x4RUVxUHVWXHhFRFx4QkRqNkVceEEwUWBceDgzXHhCNFx4QURceEE3RlJceEMyXHhFRVx4OThceEU4LjxIaGFceDFGZFx4MDRceDg1YiZceDg5W1x4OThzMlx4MUJceEQ2XHhGN1x4RUVceEREXHg4MHpyLVx4QTFsU1x4QUJceDE5XHhBMFx4ODRceEQ2TnhUXHhEQVx4MDlAXHg5NVx4OTdceENGY1x4ODA1XHg5QVx4QTNceDFEOVx4QjFceEZEdyZzaVx4MThceEY0XHg4NWNceEIyXHhEQ1x4OUFgOVx4RERceEIxXHhERFx4RTRceEMyXHhDMFxceEYwQ1x4MDhceDBGXHhDRVx4QjYlTUlceDlFXHhDRFtkXHg5Q1x4OTN0XHgwNlx4OUNceDE2eEBceDhCRVhceEJEZFx4QUVceDkzXHg5RFx4RURceEJCXHhBNFx4MTUvXHhFMSk+Ulx4QjkycVx4OTdceEQ0JVx4REZceEQ3XHgxMFRceEQ0XHhFQltgXHhCOVx4Q0RceEU0XHhFRVx4RDhccVx4OEFceEM0R1x4ODJceDdGXHgwMVx4ODJceEI0XHhFRlx4RUQrXHgwOCxDaFx4OTUuI1x4Qjluelx4QjhceEVCIFx4QTBFXHhFNFx4QjNANlx4QzJceDhBXHhCRlx4QzlceEY1M1x4RTBceENGXHhCQVx4RERceDAxQFx4MDJ5XHgxOFFceEUxXHg4MUheLlx4MDVceDhCPVx4Qzl0XHhGRDRzXHhFMlx4QjhvXHg4QW1ceDA2TmJceDAwXHhBNFx4QzJceDAwPlx4QTR5XHhDQlx4QTZceEExXlx4ODYuXHgxNlx4OENceEFEXHg4MCBceEMwXHg4NilceDA1XHhFMzlceDE3fGdceEY4XHhGMmBceDBBXHhERlx4QUZARVx4MTZceEJDXHgwOVx4MUJceEVFXHhERVx4Q0RceEI0Zlx4RDhqXHhBQXNfXHhFM25ceEU5WFx4OUZceEY3Olx4RTlceEEyMVx4QUJceEQ1XHhFN1x4MTldXHgxOVx4QzNHXHg4RFx4QkZceEIwRFx4RUFceEE0YmVceDk0XHhEQjpceEU5XHhBNHVceEYwXHhDNlx4RjVceERBXHhCM3VceEZGZkRceDFCXHhGOTdDaDBceEFCXHgxRFx4OEJTXHhCNlx4Q0ZceEJCXHgwMi1ceDE3XHhBOFx4MUE6XHgxQ1x4Qjh7alx4OEZceEM2XHg4Rlx4Q0ZceERFSVx4OUFceDhFUFx4OThceDBGXHgxQlx4QjNGXHhDOFx4RThceEM2XHhCOFx4MDVceDkxXHhEMV9ceEY0XHhFNlx4OTZceEJCblx4MUJXXHhEM1x4Q0U5OVBceDgxXHgxQjVLVlx4RDU6Ilx4RTBceEVBXHhBN2lceEM1XHhFNFx4QTdfXHhCOUVceEUyIlx4MTNceEVEU1x4RjRceDk5SVx4ODZceEIyWFx4QjNceEVFdz5ceEU0XHgxOFx4RTBceDg0XHhBNXRRXHgxOVx4RjBceEVBXHhEMFx4REJceENCWjBceDE3TFx4OEJceEQ3M1x4OTMpXHhFM1x4QzZceEIxXHhDN1x4RkFUXHhGQlx4REVceEI0PFx4MTZceDFFXHhCOVx4QjdceERBXHhCN1x4QkJKXHhEQ1ZcfVhceEI5XHgxMlx4QjAiYGVceEEyXHhFMFx4Q0VceEJEblx4RTV8XHhENjpceDA5XjFceDk3XHhERlx4RkVTXHhDQ0QhYVx4RDlEIFx4MEZgXlx4QkJceEVFcFx4QzlceEJBNlx4MDRceDBGXHgxOXNceDFGXHg5Q1x4OUJUXHg5NScrXHhCM1x4MDczXHhBMDhceDk0KFx4MUJceEIyXHg5OVx4MUZceEFFQ1x4OTFDXHhBNUJceEZBRlx4ODhceEYxblx4MERceDBFXHgxNVx4QjYwXHg4RTE9dlx4MDdceEQ2XHhGMEkmIlx4OTFceEMwXHgxN3hceEJCSVx4MDJSXHhFRFx4ODBceDg2XHhFMGkiJVx4Q0QrXHhGRVx4QzZceDgyXHhGNFx4MUVceEE0XHhBQlx4ODFqXHg5Q1x4OTJTXHgxQlx4MTlceDg2MFx4QjZceDFCKzNceDAyXHhCMmpceDgxIlx4MDhtXHhENlx4RTlJXHgxN1x4OThceEI5InxceDhDXHg4QVx4MTJFIEpceEIyS1x4MEZceEVBXHg5OCsuXHhBRFx4MTh+XHhGM29uXHhBOFx4OTNMXHg4QnlVXHhBRVx4MDdceEJBU0dIXHg4OVx4MTVceEI4XHg4NFx4OTVFXHhCMVx4QjZceERCXHhCOFx4QjlceEEyXHhDNElceEI4XHgxNyxceDE5XHgxOFx4MURceDlBXHhDQlx4QjNceDk3U1x4RTZceDg1XHhENFx4RDR2Z1x4RjlfXHhFNlx4OTQ8XHg4RDNceDEwXHg5M1xceEFBXHhDRGRceEJCR1x4RTEzUFx4QTJoXHg4MFx4Qzc7IFx4OUFceEUzXHgwNFx4MDhceEE4XHhCQVx4RDdceDBEXHhCNVx4QjB1K1x4QzNceENCXHg5MylceEQzXHhBM1x4QUEzXHhBM1x4QTVJXHhBNGRceEQyaTFwXHhGMlx4REFceEYyXHhGMjRceEY5XHhEMydceEU3XHg4Mlx4REZceEE5XHg4NVx4QjkwKVx4RUNceEVFXHg5NVx4MUJceEFEXHhCMDosXHgxMFx4RTdxXHgxOFx4QjNceEU2JVx4QTJceDE2Ulx4OTlUXHg4MTFceDA4XHhFNFx4QkNmXHhCN3hceDlEXHhGN3hceEQ3XHhFODtAXHhGMGxceEQ0XHhGNFxceDk0XHgxMy1ceDlGP1x4OUVeXHgwMmpceEUyXHgxQ3JceEQ5XHgxNVx4Q0NceEEzXHgxRVx4REQkXHhDN2tceDlDflx4RUZceEY4XHhGQ1x4RThceENBXHhDNXNceEJBXHhCNWlceENCXHhCMWR5T1x4RDZceDlCXHhERlx4OENceDk0XHhGRFx4QzRceENEXHhDOFx4QzE1LVx4RThceEExXHhBOVx4RjlceEUwO1x4ODlceEU5XHhBMVx4ODFceDk5XHhFRlx4QTV+XHhFNVx4QjNKXHhGQjlceDlEXHhGMFx4MTBceEVGXHg5Mlx4QUZceEY2c2FceEE5XHg5OFx4RjdXe1x4QUZceDlGQFx4REZceEIwMlx4QjdTXHhGRDAqXHgxNnxceDlBWTdceEY2XHhERGNceEVFXHhBM1x4QTJceERFLklbeVx4QTBceEZGO1x4ODJceDg3Mlx4OTRceEE3XHhFM3xceEQwLTpAdFx4MUQuXHhCM1x4MEF6L1x4OTRceDgwXHhGNnhceENGLVx4REVnXHhCQlZceEMwXHhFMlx4RDZ2XHgxN2pceERDXHgwNm1ceEY1XHhBOFx4MTdVZlx4QkNceEFDdFc+XHgxRFx4RDNceEQ4OVx4MTI3XHgxQm9ceDhFXHhFNVx4QzMsXHhBQVx4OTUpXHhBNGZQXHhCN29ceEE0VkRJUjQ5XHhGQVx4Q0JceDEyXHhCOTFceENBRlFceEJDXHhEM1x4REJceEM3d1x4RkE2QSR8TTE/SiFceEI1Mlx4MUNdXHhBMT0gT1x4RUNceDhFcFx4RDNceEM1XHg4Rlx4QUVceEJEXHhBOXtceDAwPFFAXHgxQ2lceEYyXHhBRVx4QTNceEI3PFx4OEVvXHhCM1x4REUxQXFceDAyXHg4Ml9ceEM0XHgwOWMjXHhBMlx4QUVNelx4MTdlTVx4QjFceEFDXHhFRllfXHgwMHtceDhFXHhFM1x4MDVceDhGUi12YVIhXHhBQVx4MDJceDBGXHg5RVx4QjZceEYySFx4ODc4XHhFQmdqXHhBNFx4RkU2Qlx4Q0VceEJFXHhGOFx4Q0ZceEI2XHg5Nlx4QjdceEVDc1x4RjNceDA0XHg5QVx4ODNceEExNFx4RkNceEI2X0pceEI3b1lceEUzdHFceEI3XHgwNkFceDE3YVx4RjhceEM0KUBceEVDTlx4MUNceDkxIFx4QzJENFx4QzJceDkxXHg4RFx4QjRceEU2QyN7XHgwN1x4N0ZceDgzXHhDNlx4REI8JFx4OTFceEIybVx4OUJtZkolXHhENidceDFDXHhFRlx4Q0RceERGV1x4QzJceEE1R1x4RERceEM3XHhFNWZceDExXHhENlx4RERceDE3XHg5Q1x4MEZceDE1aVx4OEFceEU4XHhCQ1x4OThXXHhCRnhceDk1XHgwQ1x4QTVKXHhEQlx4RjlceENBQFx4OUFceDg3XHhFRFx4OUJceEZGXHg4QkwzXHhGNlx4QjY5XHhBRGtceEY0XHgxOFx4RjUlXHhBMFx4RjhceEMwXHhERlx4RkIuXHhDQlx4RDNceEMzXHhBNkhceDFCalx4OTNceEYzQVx4QjR1XHhFRFx4MURceEQzR1x4RDA6Wlx4QTM7XHhDMkxceEYxajdceEU5XHhBNFx4RTdceDBCUlx4Q0YhdFx4QjBceEMzXHhFMFx4MTlceEM5S1x4ODUkXHhCN2B7XHhDQ1x4MDNceEQxXHhBMjJceEMwXHhFNXhceEVBXHhGRFx4ODFLXHhDM1x4MThxXHhDMXMoXHhBNyxoI1x4Q0RceDA2XHhFRkVceEU2XHhBN0lceEYwXHg4NFx4QTRnalx4QjZceEM1XHhGNVx4QjR1e1x4OTNceEUxUlx4QzRceEI2UVx4MDBceEExXHhDNGomXHgxMFx4QUJceDhGXHhBNlx4MTJceEYxXHhGQlx4RjBceDlFIVx4OTRceDk4XHhDRVx4Q0EoXHhBQVx4MDZJXHhCOSlceEZEXHhBQ1x4RDgmXHhENlx4RENceDEwa1x4MURceDk3XHgwNFx4QzlceEU2e25ceDE3QVx4OURceEFFXHhFRVx4QzVceDgzXHg5MCJceEUxXHhBQ10ualx4MDBceEUwaVx4RERXXHg4RFx4MTFceEQyRFx4RDN2XHg5MVx4MTNceEQyXHhDNjtoXHg4MFx4OEUyXHgxMFx4RUFceDk2XHgwOFx4RkRceEEyXHgwQVx4Q0NceDBDK1dceEE1MVx4MDVceDk4XHg5RWZSXHhGQ1x4RTJceEY4XHhCMmxceDlEXHhBNlB+XHg4RSY1XHhCN2lceDBFXHg4QS9pbnpceERGXHhGRlx4QURtXHhGOVx4QTQ2XHhDOVx4OTNceEU0bUJceEFBXHg4MFx4MDR0XHhGOVx4QTNceEM1XHgwMVx4OENceEQ1QERRXHhDRlx4OUNceEU5XHhBRn5ceEZCXHhGRCpceEYwXHhBNDclXHgwNFx4ODBceEY5XHg4MFx4RkJkXHgwMG5ceEZEXHhDQVx4QkJceDk2Slx4QzNceEIxXHgwQ1x4RjhceDhFXHhDMFx4RjEwKT1kXHhGMUhceDEzVlx4OTZceEYzX1x4REJceDk4N1FiUFx4RDZceEJCXHhFRFx4RkJceEFEbHpceEZFXHhCM1x4MTRdVVx4ODEwNFx4QkJCXHhEOVVceEZGXHgwQX5ceEFFXHhGMTVceEI5XHhDNVx4RTZceEIyXHhCQlx4QURceEY1XHg5RlpceDg0XHhGM1x4MDNgXHhFRW1ia1x4QzU7O3VpXHg4Nlx4RTJnXHhEM1x4RkFceEUzXHhCMlx4MUFceDgwXlx4QzFZXHhBQlx4QjVceDgyXHhCQSFEXHhFQVx4MDhceEIxXlx4Rjg/XHgwQlQiXHhFNG99XHg4QVx4MDFceDA4RE5ceDEyXHhDN1x4OTJceEI3XHhFOFx4QzlceDgyXHhEQzVTXHg4NFx4MTJceENEXHhBRVx4QzlceEJBXHgwN1x4RDMhRixceDhGXHhERFx4OUNWXHhBQWBpXHhDNFx4OURNXHhDNVx4MDhhcWpceEVFXHhENFx4QjdsXHhCOVx4ODFceEM2PVx4OEZceDlBLFx4QzVceEMyTWlceEI4XHhDQXRHXHg5RVx4MTNceDE4XHhFMFx4OTdtXHgwNlx4ODlmTlRDXHhDQlx4RTJceEIwXHhGRVhceEQwXHg4RDkrXHhGN1x4ODZeP1x4QTFceEU3P1x4OTR9eVx4MDJceDAzJ1x4REEzL2VceEU2XHhBQi9ceDA3QlRceDFGcVx4RURAXHhENVx4QUFceDAxM1dceEZBOlx4RDdceDdGXHgxMFx4QkQlXHhBQ1whXHhFQ1x4QkJceDAyXHg4NVx4RkJiIEZceEIwPlx4OUJiXHhFNlx4MEFceDA4IV19XHhBMlx4MUNceEYzUlx4RURceDFGXHhCNVx4OTI6XHhCRVx4RTZceDExXHhFNDRceEEzPWVceEExOFx4RDMqXHgxMX1ceEM4Q1x4RkNceEYwXHhGOVx4Q0ZkQ1x4MTVceERFT1x4QzcrXHgxQ1x4QzNtImEvXHhDMVx4QkNtPFx4RUNceEQ1XHhFOSxceDE5M1x4RjlceDk5XHgxRVx4MENEXHhFRS5yXHg4NVx4RDMhXHg4MF1ceEMyXHhGQ1x4QTNceEZBWVx4MEVceDk2XHgxRCVceERDXSJceDA5Jlx4OTlceEIzXHgxNFx4OTJceDBFbVx4MTBceDhGRFx4RkIqfSgtXHgxMFx4QTFceEMwXHhGN1x4RDBceEEyXHhBN0Y2XHgwQ1x4ODdBXHgwRVx4MEVceEREXHg5QS5ceENFXHhEOUdceEMwXHhDOVx4QjhgXHgxMFx4MEZceERCXHhEQTVceDg5XHhGM1x4QjhceEMwMFx4MTR9XHg4Nlx4MURceEE3XHg5QVVceEE1XHhGMFx4OTQpXHhGMzdhXHg4MVx4MTVcXHg5OVx4ODhSXHhBRFx4QTlceDE0XHgwRVxceEIyXHhBQVx4Q0ZceEY1XHhCRFx4MENke1x4OUYoXHg4OFx4QzE4XHhENFx4RDBceEJBOVx4MDlUXHhCRFx4RENceDlGXHg4NFx4Qjd5ODVceEVFXHhCRVx4RkNceEEyXHhGMFx4QjBceEI1XHhFQVx4OThNIV5BfFx4QURceEU3XHhFOEp1XHhCRlx4ODJceDBFXHgxNlx4RENceERFXHhGQWVceEIwXHg5OCJceDkyXHhDQihceDk4XHg4RFx4OTReXHhGMlx4OTkwNFx4RENceEIwTlRceEExPi1qb1x4MUVceEVDXHhDMlx4MDRceDBCIFx4MTNceDEzeFx4RkVceEQ0TFx4QzhqXHhBQmlceEVGXHhGMVx4RDBrK1x4QTJ4XHhFMW5ceEZFXHg4MDFceEJCXHgwOFx4ODMsWVx4QkNceEJDXHgwMHlceEY0XHg4MVx4MTlceEJFeVx4ODJXXHgwNlx4REV1XHg5OC07XHhFQlx4OTJUKVx4RkNceDg3XHg5NWtceEUzWjZceDhCXHhFRlx4RDBceEQ1XHhCMFx4QzVceDgzQ1x4MTR1MVx4RTNceEI2XHg4NVVceEU2XHhCMFx4RUVceEEwXHhCOFx4MTlceEU5J1x4OTInflJidlx4MUVceEFCdVx4OTlceDk5Wlx4RTMlXHhEQVx4MTMgXHgxN1x4QzdceDE1XHhENVx4QzhHdFx4RjlJXHgwN1x4QjJceEU1XHhBOFx4Q0Mhd1RceEJGXHgxNlx4OTVceDlELFx4RUR0Llx4RDQ3XHhGOVx4QTNceDk3XHgwRFx4MURceEI4XHhDQVx4OUFJRVx4ODZceDEyRVx4RDVceEQ4bWpOXHhERFx4RDkpXHhFQ1x4MDZceDBGXHhGNFx4Q0FceERCJFx4RTFtXHhDQ1x4MUEzXHhDMFx4MDBQXHgxOGxkXHhDMjRZb1x4MEFceEMyXHhGRVx4MDNceDk4XHhFNSJceEY5OVx4RTEtXHhBRlx4MENceEM3L0ZceEVDXHg5Rlx4ODZceDFBXHhBMlx4Q0RceDhDXHhBQ1x4RkJGSFB4Ulx4RUR7Jlx4REN8XXlVXHhFQXpceERGbCpTXHgwN10xXHhEQVx4RUZDZVx4OUNMXHhBQVx4OTlDUVx4QUQ4XHhDRVx4MTFceEEyXHhEQVx4Qjl0XHhGNGpceEIxZ1x4OUZceDlDXHhCNlx4REFceEFEXHhFMnddXHg4NmVceEMzXHg4NVx4OUE2XHgwNFx4MEFceEQwXHg4NGxceDk1XHhBQlx4ODYuXHgxOVx4RTcueDBceERGc1x4QTcvXHgwQX5OXHhGMVx4MTlceEI2XHhDQVx4MUNceDE4XHg5Rlx4QzZlIVx4QkFceEM0XHhCQ1x4RUFceDFBXHg4QVx4QzJtXHhBRlx4RjhceEMyKVx4ODFceDg3RmVceENDXHgxMVx4MTZceEMzXHhDN1x4RTJceDBGOSFPXHg5MWtceDBBXHhFM1ZceDhCZEUtXHhDNVx4MDdceEVEXHhCQXlceDhBXHhBNlx4QTcyVlx4ODBceDBDXHhDM1x4RkQwXHhDNVpceEUwXHhERFx4RTUrXHhDQ1x4MTUsXHhEQ1lKQD9SXHg4OEFceEQzXHgxNltceEEwJVx4QzAtXHgwMlx4MTJceDk1XHhDMVx4OUYqXHg4MFx4QjZceEMxQyRffCJceEU5Vlx4OEJNXHgwMlx4ODJrXHhEOFx4MDlceEFDXHhDN1x4QUJceDAzXHgwRVx4RjBceDFEXHg5MFx4RDFceEMwXHg5Q1x4MEJceDE5XHg4NT4lXHg5MFx4RjJXPlx4ODZceEY3XHhFMlx4RTJceDA5XHgwRlx4QTNceDg3XHhCRlx4RURceEEzXHgwRVx4RjNceEM0XHg4N1x4REFceDhCXHgwNFx4RTFceEU3XHhGNipceEU2XHgwMkhceDhFXHg5N1JceEM2XVBceDEwXHhBMVx4OTdEW1RceEVFR1x4RDlceEQxXHgxRSRDO1x4MDZceEM0XHhFOFx4RkFceEE4RFx4QzlceEY0XHhCQlx4Q0RceEUzXHhENVx4QkVDXHgwQ1x4Rjd7UCtceEZFfVx4Qjh5ajNceEE2XHhCRSlceEJDXHg5MVx4MUJceDBGXHhBMmU9XHhEM3tceEVFXHgwMFx4MUJceDE4b1x4RUJceEUyXHhFNUJceENGN2tbXHhEOGVceEFGXHhCRVx4ODlceEJBXFx4QjFTXHhEM1x4RDZVXHhBMFx4QkE3XHg5MVx4QjlceDBGXHhGOVx4REIsaVx4QUVceEFFXHhFRlx4RUNceEU2XHgwOTxoXHhEOVx4RDhceEIwe0xsXHhFOX1ceEEzXlx4OTVyXHhGM1x4OEZAXHgwRVx4RkFceDExXHhCMUAmXHhEQlx4MTJceEIwXHhBRVx4QjQzXHhCODdceDAwXHg5MT9ceEI1XHgxNFx4QzdceDhBXHhGRVx4RUJHXHgwOVx4MTElXHhGRVx4OTRceEQzXHg5MHRceEI5XHhGRlx4RDNceDFBIlx4MDVceDEwR1x4MTd5akxceENFXHhFRFx4MDRceEY1XHg5RVx4OTRceEJGXn4lXHhGQTN2XHg5RFx4ODMyXHhFQTdhMGdceEU2aVFceDk3I3IiQVx4OTFceEZGXHgxNEVceEQyXHhFNVx4OTFceEYyRWw1XHgwOWpqXHhGQVx4N0ZceDhCelx4QkQ1XHg4QjsmXHgwNlx4OTFceDhCYy5ceERBTlx4MDlceDg3bGdceEIzXHhCRlZceEU5flx4QUIxXHgxNVs9XHhGNVx4QTBceEQ0XHhBRFx4MTZceDBGXHhERFx4MEJceENFXHgwQ1x4RDlceEU2XHhBQ1x4OTBceEY0XHg4Q1x4MENceEMzXHgwMVx4MDgoXHhEOVx4QUNceERCXHhGMkd7XHgxQ1x4MDhceDk2XHg5QVx4MTZceEI1XHgxNmckUlx4Q0JeXHhBQktceEY5flx4OTlceEI0XHhGOVx4QUNoXHg4OURceDlBXHg4M1BQXHgwQXxlXHhBRHhDXHhCNy1yXHhCOVx4QzNceEQ5XHg4Rlx4QjhceEM3O1x4OENceDg2XHg5OFx4RDZceEIzXHhCNVpceEU3Olx4RUR5XHgxOSA7a1x4MENceDhEXHhBNFx4OTFceEJCXHhGNUlceENCXHgwMVx4OUNoPVx4MENceDg1XHgxRFx4MDBxJ01ceDFCXHhCMFx4RkJceEY1XHhBMVx4QTBceEUyXHhCMVx4QUFceEREJVNceERDXHgwRVx4RjNceEQ2Mlx4ODYoXHhDNitceDk4JnNceDhGZENIXHg5RVx4ODB3XHg4OVx4RTlEXHgxNVFrXHgwRVx4OUZceEEwXHhEQVx4MDFab1x4MUNceDlGSyRxXHgxNlx4RjlceDA2XHg5Rl5ceDFEXHg5RFx4OTBceEFCTGIhXHgwM2UiXHgxMVx4ODVceDFDXHhGQlx4RUQ/XHhEMnBceEE2SFx4QURceDgyXHhFQ1x4QzlbZHFceEU4XHhDQlx4RjRceDlCJVx4QzFceEM0XHg4MT5ceEI2XHhFNVx4QjFceDk3XHhBNlRceDgwXHgxOX14YFx4RTZceDg1XHg5N1x4MTlJXHhDOVx4MERcXHhEQ1x4MTJFWmxceDFDUVx4QkFceEEwUFx4QzZrXHg4Rlx4ODdceEJDXHg5N1xceEZEXHhGNFx4OURceEREXHhCNCxceDE1XHhEOTtceENGZ1x4RjFceEQ2RVx4MDNceEVCXHgwRSRceEVCXHg4OFx4RTdeXHg4MFx4RTZgXHhFMC1ceEEzaH1ceDE4eFx4ODFceDBETF1ceEU2XHgwRXBceDkxTlx4OTlceEQ0XHhGRVx4OTRceEREXHhDN00xXHhFNFx4QURceDEzXHhFNj1kXHhGNVx4QzVceDFBXHhGNlx4OTRceEEwXHgxRlx4ODZceDk0XHhGRSdceDdGXTtuZlx4QURceEUxWlhceDg0XHhCRWpceEUwXHgxQ0MxXHgwMVtceDk3XHg4Mlx4OTYtXHgwQnJceENCXHgxMGRceEMwN11gXHhEN1x4Q0NTXHgxN1x4RjBceEFDb2JceEY3JGxceEMxXHhBMVx4OEZceEI5XHhBOVx4RTNceEI0XHhBMFx4MUJceEQ1XHg5Mlx4RDF7XHhDOUdceEQ4c1NceEZGXHgwNC9SVFx4RTlceDE5MlM9XHg5OFx4MEFceEM2XHhGMFx4QzRceEUxPUYrdlx4QjZceDk2XHhERVx4QTBceDgyXHg4QVx4QkJceEU1XHg5REJceDBCWXBceEJGXHgxQjAsXHg4MFx4RjFceEI5TyFFJDshXHgwMFx4Q0IsKlx4QzNceEJGV1x4RTdceDExXHgxRjVceEUzXHhFRVx4RjFceDhEXHhCOFx4MUVceEYzXHhGNEVceDlEXHg5Q1x4MTBceEE4XHhGRFx4MUNqSlZceEE3XHgxNGFgXHhEOVx4RkRceDkxXHg4NmNceDBFXHhBRlx4RjdFXHhDRlx4Q0VzUVx4Rjk3XHhFQVx4RjM/Vlx4OUNceDkwZVx4QTlceEMxXHg4OVx4MDRceDg5XHhBNC5OXHhFOVx4N0Y9XHhBQVx4RUFceDk4XHhBOCZceEZFXHhGQ2ZdXHgxRCpceEMwXFx4RDFceENGXHhCRiMxMFx4RTVceEMwXHhGRSZceDFEXHg4MVx4RDVEXHg5OVtEXHhFQ21XZzBceEFDXHhDOFpceEE0XHg4NVx4MUZceDBBTFx4MDNceDk2K1x4ODZceDFDN1x4MUNrUVx4MThceEQ1XHg4Rlx4QURiXHhDN2ggXHhBMFx4RDJceEJDKlx4QTlceDgwXHhBQVx4MUZceERCOkBceEIxXHhDMFx4QUZceEQ2XHhBQ1x4MDBceDAwXHg5N0dceEZBXHhFMDZceEE1X1x4OTBceEI5XHhGNVx4RDNceDFGXHhDRlx4MThRRnlceEVEXHhDRXBceEIwXHgwNFx4QzNceDhDfVx4RUJceEE4XHg4Rlx4ODJceEIzI1x4OUMtXHhFRV9KQVx4RDNceERCRm9JXHhGMz1ceEM0QVx4OTgpUFx4RkZceDhGXHhCNmtceDE5XHhCQy9ceEJFZUBceDBDTFx4RTFceERGYTVceEUwXHhCNlx4QUNceEY4XHg5Qlx4QUZCXHgwQz5ceDFDXHhBOFx4QjJceEMzXHhBM1VceDlEXHhBRlx4MDZceDk2XHhDQVx4RTZceDg5ekNceDFGSlx4RUVceDhCWk1FXHhDOFx4OThceEYyWVx4OThceEVCLlx4ODNceENFXHhGMGtceDhCQ0A0elx4QzBkXHg5MFx4OTZceEQ0XHhBMlx4OERceEI0KC5zXHhFMlx4OUZceEJGPFJceEVEXHhGNTksRT1WO1x4RjlceEQ0XHhFNzNceDBGXHg5NiNceDlDQ1x4ODFceEI1XHgwMVx4MEZZXHhFMVx4OTktPVx4RDNceEY4Ilx4QUJceDlFJVx4QTdceEI5dFx4MDI6XHg5NVtRXHhDNzNceDAyXHg5Mlx4REQ5UVx4OTNRV3FnXHhGMVx4MEFceEY1XHhEQlBceDA4YiVceEI2XHg4RVx4RUFwUlx4QUVJO1x4MDRceEU0XHhBRVx4REYtXHhDOFx4QjJceEJGdkdbXHg4OXxceEE0T1x4MUJqXHhCQU5ceDlGOlx4RTJUXHhCRlgwXHhGQ3lUXHg4OFx4QTA9XHhEMFx4RTRceEU3XHhCNG4gXHhGRHRceDAzXHhBQ1x4OERceDgwXHhENE9KXHhCNHJceDkwelx4RkN2XHg4Q1x4RUVceDA0UUpceEM1XHg5OFx4MTlceERGQ1x4RjFceEM1XHhDOFx4MEZceEQyelx4QUZceDg5XHg4Rlx4RkRceDBCe1x4Q0FNZC9ceDhDXHhCNFx4OTFceEVDXHg4MFx4ODBceEVDXHg4QVx4OTNceEE0XHgwRlx4OUZceEJEY1x4RDdceEIwRHVBbVx4RjEkXHhCOFx4RTlceDkxXHhCMEZceEM1XHg4RndceDgxXHg5Q0Q9XHg5M1x4OTFceEFBXHg5QWdceDk3XHhGMCBceDk3XHhGRFx4RTdceEU4WHtceEE4Ulx4QkN5XHhGQiN8OSJKXHhCOVx4QjVKXHg4MjxKPkNhXHgxMXF8XHhFRlx4QjdceDA1XHhGNG5ceEM1XHhBRUFceEU5XHhFRVx4OTBDXHhFMVx4RUVceDhFXHhFNVhceDE3XHg4QnpceEEzZ0xceDk2K3ciXHhGQUlQXHhCQlx4Q0FceDA5XHg5MFx4OUNceEQ0XHhEQVx4ODlceEJBJ1x4ODZceEJEXHhGNzpceEE2XHhFQn0wXHhCQ1E6XHhBNU9xOHpceDk1XHhCRlp3flx4OTJceEU3YlxceDg2XHhFNlx4QkF+XHg4OElceDA0XHgxOVx4OUZceERBXHhFNVx4ODlceDA4T1x4OTdceDFBQUJceEExXHhFMCpceDg1XHg4OVx4RkZceDkzXHg5NVx4QTZceEZCXHhCRkR1XHg4OGBceEY3KHhNXHhBRFx4Q0VdXHhCRFx4QjlnXHhDN1x4RDJceEJFXHhCQVF+XHhEOFx4MDlceEU3XHhFQlx4MDBceEZCXHgxM1x4Q0VHTlx4RURceEFCXHg5N29eXHhDNEdceDAzKFx4ODlceENDOldceEE5XHgxQSdceDk1XHg4RTpcIFx4ODlceEQ3XHgxRSBceERCR3dceDlBXHg5OCgkXHhCRFx4RUVceDk5XHhCN1x4QjRceDgyMlx4RjkuXHhDN1x4OUY3XHhBQWBceDA2XHhBQVx4QzBQZEBceDlFXHhGRD01XHgwMDZOXHhGRnxceEZDXHhCMVx4RjE/XHhENnc1a1x4MEZ5fV5kXHhCM1x4QkR6XHg5QVx4OEFceDgyOXhceDkzXHhFMVx4REQqXHhBQ1x4QjdceEVBR1x4REUiXHgxM1x4RUFceEEyXHhDOFx4QjIrUFx4QUVlXHhCMVx4QkZOXHhBMFdceEFCXHhFRFx4QTMsOEtdUFJceEYyIThceEVBXHhCNjlceEEzXHgxMVx4ODctXHg4M1x4N0ZHelx4MTNceEJCXHhFRVx4ODZceEM0XHgwRFx4OTBceDE2IFx4QkJ+ZVx4REJceEEzXHhCM1x4MTYtXHhFMFx4QUZQXHg4OWFceDBBd1x4OTBceEQ4XHhCQ1x4OUJceEJGXHgwRVx4RUVceEQ1XHgxNj5ceEM1XHhGNlx4REVPcVx4RjZwL31ceEUwTlx4RTZceDlDIVx4QTJceEFFXHgwNFx4OEZceEJFXHg5Rlx4MDBpXHgxMnVnJkNceERBXHg4MVx4Rjl7XHhEOFx4Q0M8XHhDQVx4RDVnXHhERlx4MDFceEUyWFx4RkQ6XHgxRUZceDA2XHg4Rlx4RTV6LX5ceEQ3XHg5Rlx4RDRPXHgwMVx4QjM3YVx4QjNceDgyPm14XHgwN1x4RkFceDA3XHhEM1x4RjZceEIwQFx4QzdDXHg5NVx4RkZceEVCXHg4OFx4OURceDk5XHhERVx4RkVQM192XHgxN1x4QUVceEU3XHgxQVx4QUNceEQ3LFx4QUZfXHgxNFx4ODNIS1x4MDlceEUxXHgwNyFceDgwZFx4RTBceEY4J1x4RjQlMFlceEE3cVx4MDFceDBGMFx4RkJceEZBaWdceDgwXHg4NVx4QkZceDFDXHg5OVx4RjBceEJBUm9ceDFFV3tceEQzXHg5NFx4QTRSQC46YCFceDgzXHhFNFx4ODVceDBCXHg4OFx4RTRpfmNceDA2XHgxNFx4OTF6XHg4Rlx4MUVKXHg4MzVceEIxcVx4MDRceEE5XHg4MllceEZFPlx4QkUyXHg4MDddL2NceEFEbFx4OEVHXHhFRFx4Q0NceEE5XHhCQ3pWfVx4OUNceEQxXHgxMFx4RjgtW2I2Sk9ceEI5aVx4QzB7XHhFQlx4RTI4XHgwOVx4OUMwXHg4MVx4OTRceDg5SHhceDFCQFx4OTFFXHhBNVx4RTlceEZFXHg4Q1pceDk4XHhDOWJceDBGXHg5OD9iZEk8XHhEQklceEFFXHhDNlx4QTFceEQ1XHhEM1x4QkVceEIxXHhFOFx4QjlceEU2cWZNU1x4OUUnXFx4QUZceEZFZVx4OUFceEFBS3B8JVx4RTlceEYwPVx4OUFceEUzXHhBNFx4RjFceERDXHhBMlx4RTI6XHhDOVx4RTFceDk0XHgwRlx4MTdtZlx4QTNJOX5ceDk0XHhBRXlceEY5XHhDMzBceDFDXHgxMFx4QUNceEUwXHhDRVx4OENceDA3XHg5Nlx4ODZceEZBMDxceDlCPFx4MEZBUlx4MThSXHhGQlx4RTZceEE4XHg5M1x4QzlceDkxXHhENUZceDk5XHg5RVNceDAyXHg5MFx4MEJceEJDXHhCN1x4RTRuXHgwRlx4RjlceEQzXHg5QjpceEZGXHhGMExceEQxXHgxMlx4RDZceEVDXHgwNHxrXHgxMGJceDk0dEpceERBXHg4MFx4Q0ZhXHhGQlx4MDlceDlGXHhFODdceEEyXHgwQVx4QTFceDhGXHhDRGJceDA4P1x4ODEsXHhGNlx4MEZceDA5XHhDM1x4QzNceEE3PFx4MDhceEYzXHg4Mlx4QzBceDE4XHg5NVx4ODMgXHgwQlx4Rjk3XHhEMFx4RUJ5XHg4MWZLXHgwRExceDFFJFx4RjRceERFXHhGMlx4QzJceEYxaD1ceEFBXHgwRTB1XHgxRDZceEM3VCFceDg2XHhBMVtGdVdceDEzXHhFMFx4MUJceEEzb0pMXHgxM1x4RUNceEM0XHgxMy9ceDFGXHhGQXg4XHhGQlx4ODE2IVx4QkRUXHhBRFx4MDA0XHg5NzVceENCOFx4RjJCL1x4Q0ZceEY1Tlx4RDlceDFFXHhCMFx4OUVqXHgxQ0ZceDA5J1x4RTlceEE3YFx4QzFceDE1XHg5MVx4QzJceDFDXHhERjdceDFCXHhDMmRceEIxXHhDRiJceDEzfVx4MEFceEFGXHhDOVx4RkInXHhEM0lURVx4MDFceEY2XHgxNFx4MUQiXHhDNlx4QTBceEVCXHhERF57OFx4MTlZXHg4M1x4RDFceDhEXHg5MFx4RjVceEY2R1x4MUIpXHhBQjNceDA3alx4RDQhXHhCNjhceEM0XHhGNVx4QTVceEIzXHhEMXdAdlx4MENceEY2Ml5BXHhFQlx4REZIXHgxOVx4RDhceDg1XHhFOFx4MTlceEJCXHhEMzJKXHg4NVRceEM2XHhBNFx4N0ZceEEzU1x4OUFceDExXHhCQlx4RjFceDEzXHhCN3RceDg1XHhCMFx4OUJceEVCXHhGQ1x4QTVceDlFXHhENlx4RTFceDhDXHg4MFx4QjVOXHg5RVx4RTZceDk0R1x4QjBceDEwXHhDMFx4MThPc0EqOGdceEFBXHhCNFx4MDlceEU1XHg5M1VceEVFXHhFNm1ceEZEXHhGM3xceERBXHhCMVx4Q0RceEUwXHhCOFx4RkNceDAzXHhGRFx4MEFMb1x4RjlceDFFcFtceEY4NDs/XHhBREtQXHhDMX5kRjFNXHg5QjRceERFXHhDNzhceEI5PzJceEM1N2FceEREXHhCM3JceDhBXHgxN1x4ODV2XHhFQ0FceDE1OVRJW29DXHhFM1x4QzBceDhFXHhCQzdceERGXHgwMlx4QUFceDFEdFx4RjdceEI0XHhENz1ceEE2XHhEQTlkXHhBMlx4OUFceEQwXHhEMFx4MTVWYVx4RjBceDE0XHgwRTxceEY5XHg4Qlx4Qzk5XHgxNVx4OEJceDFGXHgwRlx4QTZceEMwOzZceEM1XHg5RDJceDBCIVx4RDBceEY4TVx4QzMsXHhBOVx4MDFceDFFLDRceDk2XHhDNlx4RDhceENCXHgwNipceEY4XHgxQVx4REVceEU0W3VceENBXHhFMjpceDk0J1x4OTRceDExOlx4OEJceDk3L1x4RkRceDhDXHhDRFx4RDQ6XHhEQ1JQXHhGM1FceDBDUnszVnZSXHhEQkRceEQ0XHg4OVJceDg2P1x4RDFceEE4XHgwMVx4QkY/JmlceEQxXHg5OFx4RDJSJUVceEFFXHg5M1x4QTZceEZEXHg4NCtceDhDXHg5QV1ceEM4YVx4OEVceDAzXFx4Qjg9Mlx4MEU6XHgwM1x4REJeXHhCQjluXHg4NVx4ODVceEE2XHhDQXRceDE3XHgwOFx4MEFceENFXHhDNFx4RkRceDlGXHhGRVx4MUFceEZFejFnTVx4QzFceEVDS1x4QzRceDFFXHhGNFx4REZpXHhGN1x4QjE3cHF+XHg5Rlx4Q0F2LFx4MDlceDA2XHhBOC9ceEE3XHhFOVx4Q0ZXNSZceEFBJVx4Q0R5XHhENVx4QzUwXHg5NFx4REI8XHhFRFx4RTlceEUyNlx4QzNceEY5XHgxMFx4MDlHXHgxQVx4RjNceEM1XHgwM1x4OTRceEFBXHhBQ1x4QjRceEM3X3lceDlGLFx4RkJceDlDTGVceEQzTFx4OTUlXHhERlx4RTlceEYwXHhDRFx4MEVceERCXVx4OERwXHg4MVgsXHhERF9SXHhCQ1x4OUZ6XHhEM19ceEQ3XHg5RmVceDk1XHg3RnN5N1JceEZCXHhCMlx4RDdceEU2XHg4NSkkP1x4QzNaXHg5NFx4MDZkXHhENTVceDBCbWhtXHhCQlx4OTVceDhESmJ0Zlx4OENsXHhFOVx4QkFceDkweVx4RTBceDlDXHg5N1lceDlEcUtceEM3XHhDNFx4MTJceEE2XHgwNlx4RDRceEU0XHgxM1x4OTM3XHgxOC9JPUVceDEwR1x4OUFceEFEWUIiXHhENGNceEM1XHgxRF4iXHhGMkM8XHg4MVx4OERceEU5Zlx4RDc7XHgxN2Rle1lceDE5XHhEOEFzeUpceEJBI1x4OUVceDE2XHhCQlx4QTdceEZDR1x4OUJmaFx4RkNceEFBXHg4Qlx4QTFceDgyXHhBRVx4RjBceDEyXHg4OFx4RUJceDE4XHgwN1x4MTZceEQzQlx4REZceEZERlx4ODFceDFBXHhGOSVceDFCXHhFRFx4RURceEI5XHhFNFx4ODhceEM1XHg5MVx4ODZSeE9ceDBFe1x4OTJceEVBXHhDQ1x4Q0ZceDk3XHgwNFx4RTNceDA4XHhGRFVceEI2XHhCRlx4MThceDAzb1x4RUV9XHgxMVx4RkNrcFx4OTNceEE5Il9ceDE4XHhEQVx4RTZmZmpceDkwdlx4MUQkRi1ceEIyLGxxN01pXHg5Nlx4MTJceDhFXHgwNVx4RjAyN1x4QTNceEM4XHhDRVx4QUFceDkxWVx4ODVceEQ0XHg4MUpkXHhCRlx4RDM9XHhFM1x4RDNceEQweGRceEM5XHhDQlx4RjUlXHhGMlx4QTlUJ1x4RjE+XHhCOVx4RDZceEIyPFx4RDdceEVFXHhGRlx4MTNceDg0bHlceEMwJzQzXHhBRVx4RTEzZlx4MEZceDFEXHg4NTRceEJCXVx4MURkXHg4NT5ceDBEXHhFRlx4RENceEFGXHhCNkU+XHg4Mlx4RTlceEE0Rlx4ODNceDg4XHhFNH5NL3BcXHgxNDBceEExSCdYXHgwQVx4QjdceDBFJ1x4QjhceDlCXHgwNVx4OTRceEEzKVx4MUVceDhFPFx4MTRceEMxXHhCMlx4RkFceDlEYG5ceEMxJlx4QUVceDhEIVtceENFXHg5MVx4RkFceDlDXHhDMVx4RkRceDhFXHhBNT5ceEJBXHhENVx4REYxJ2wrajRceEQ4ay9ceEE4RW5gXHhCOVx4RDJNXHhBNDF4XHhFM2wzXHgxQ1x4MDlceDA5JCdceEU3UVx4MDhceEY2XHg5RFx4MDFceDBCbWlPXHhDQ1x4Q0VceEREMFx4QjkrXHg4NGBbblx4QTQ8c1x4QUJ3c1x4RThmOFx4QjFceEJCXHhERFx4RjZceEJBIyxceEQyXHhEM1x4QzlceDBFXHhDMFx4RENceEExXHhDNmhceEVGXHhERTtNQURceEZEM184clx4N0ZCc2onYFx4RURceEUwXHg5QVx4RkRceDk5XHhEQVx4Q0VceDE2W3lFXHhBOFx4QTVceEREXHhCQlx4QkVceEQ2ZFx4OTBceDFCXHhBMX1ceEVEcThceDhCXHhGNFRceEJCblx4OTZceEVCXHhBMFx4MDFceEE1XHhCN1x4Q0I3M1x4RjVceEYxXHgxRT5ceEVCXHgwRiNRXHhBRVx4MTh6XHhCNkRceDhBXHgwMFx4ODhOXHhDMzdceDFGXHhEN1x4ODdceEVFS1x4RTIiN0NceEQxXHgwN1x4Q0YxOy8vIXhceDlBXHgxRVhUXHhCM1x4QjRceEEyY1x4MTUsXHhBRlx4QTVceEM0XHhCQWJceEE4XHhFQVx4MTgnXHgwQlx4RDhceDFDXHhFMDYxXHgwMicuXHhBNyVceEFEXHhCQ1x4RUNGcFx4MUJceDBEMFx4MUJceDE4Z1x4QjlceDgxKVx4MDZceERFXHgxOVx4MUE4Tlx4MDJceEM0eW5ceDkzXHhCRVx4ODBceDg0XHg3RlBJOVx4MENCSVx4ODczXHg5RFx4OEFuXHhDMVx4RjZceDhEXHhGN19ceDE5XHhFNHBceDgzXHhGRFx4REZceEE4ZWpceDA5XHg4RSJceDFCXHhDN1x4REJceEVFSz1ceEVDXHgwOF1IXHhDMlx4OTBceEQzXHhDMFx4RDFceDlBXHhEQlx4QTZFXHgwQVx4MDlceEMxXHhDMlx4QkVceEQyXHhCQ29ceDA5OFx4ODRceDA0XHg5MVx4RkVsXHhFNVx4RjV7NVx4N0ZSXHgwMHBLXHhGNiopIilceEQ1XHgwOFx4OUJceDBGXHhGRFx4ODYoXHhEOCp2XHhBMyg9ZFx4RjlAXHhDRVFPXHhCOVx4RDJceDBDfFx4RDFceEUyXHhDNGxMXHhCRkRceDBDXHgxMypceEZEXHgwMVx4OEM2bXtceEU1XHg4RWN2XHhBM2ImXHhCQlx4QTNceDhBXHg5M1x4MUUoXHgxMlx4QzMrXHgwQ2xceDA1XHhFMVx4QkZNXHhCQlx4QTFcO1x4RDZceDE2N0hceDBCXHg5OTJ+XHhGNVx4Q0ZceEYxXHg5RGA9elx4Q0M8KnJceDkzXHg4Rlx4MURceDlCXHgxOFx4MUJbXFx4QTVJXHhEMy9FXHgwRVx4OEFceEMyTntceEUyfVVceDBBXHhDOVx4RTVceEMwblx4OTRceEE1XHhGOVx4Q0ZceDlFXHhDRVx4MTZceEQwXHhBNVx4QURIc1x4RkR2XHhBMEJceEZDNEB1XHhBM1x4ODhmXHhFRVx4QkREMVx4QkQxPlx4OEZfe1x4ODdceDEzXHhBOXpceDkyVVx4MEVaXHg5RVx4QUFcXHhFMlx4RThceEYwXHhGQ1d7ZVtceEJDXHg4QVx4QjhceDlGXHgxMSBceDFELVx4MEJceDA5XHgwNFx4OTdceEQwXHhGMlx4QzA5XHgxMVx4OTdQNFx4OTdceDk3XHhCMzpceDk1XHgxOUlceEM3XHg4NFx4RjFceDE2XHgxNFx4QzJceEJGXHhCOFx4ODNceENDMCJzXHgwRFx4RDZceEYwXHg4RFx4MTRceEFDdTVceDhCXHhGMFx4OTRMXHhGQkdceEQ4XFx4OTdceEQ5XHhBQlx4RTNceDA4bi4jXHhCNlx4QjJvamBceDlDXHgwNn4iXHhCOWAyXHhFRnlceEQ5XHhERGRceEY0XHhGMFx4RDhceEVBXHhBNndceDhCXHhEQ1x4MENceEVEXHg5OVx4Q0FHXHhGNVx4RTQtcVx4RTlceDhDQVx4MTlceEQwXHhEMlx4RThceDFDaVx4QUZceEFCXHhDNVx4RDBceEMxXHhFQlx4OEZTXHhERlx4MDlceEM5XHhBOVx4RThOJVx4QURceEE4XHg5OH5GXHg4N1x4RDNceEM5I1x4QTdoXHg4QltBM2VSXHhDRVx4QjRceENCXHhDOGtceEM0XHhFRVx4Q0ZJXHhDNlx4QzRkXHg5N0ltWTtceEEwc1x4OURceEI4XHhFM1x4REFceDE1XHhEMVx4RDNceEIwXHg5QnRceDg4YUJceEI2XHgxRVwpXHhBRWdxXHhGRlx4MUJceENEXHhBNlx4QTlceEI3XHgxRCJceEZCXHgxMlx4RjcxXHgxM1x4ODhceEIxXHhGMFx4QUFCXHgwMlx4REVQXHhFNlx4QTJceDhGXHhEMlx4OEFceDFGK1x4MEV3XHg5Rlx4RjM7TVx4OTR2XHhBQlx4QUFceDkwXlx4REZceEJFXHgxNkdceDhDXHg4RiBceEI0XHhDQVx4MEZ8XHhDQUsmXHhGMS08TVx4OTBceEIxXHhBOVZceDBCY2xceENDXHhEMEoiPllceEQ1YVx4OTlXK1x4OTlceEE3LFx4QTlceEM4XHhCMkhtXHg4RFx4OTVceDE2XHgxRVx4MDRvcFx4OURceEYzLVx4QTBceEE1XU9ceEZFbTxSXHhBNltkXHhCQ3w6XHhDQlx4MTJiXHhGRFx4RDRceEVDdFx4RTlceEQ1XHhBRGlceDk3UFx4QjhhXHhEMlx4ODRceENEJVx4RDBceEUxXHgxNFx4REJceDkyXHhERlx4QzlceDk3Qz1IKTxceDgwRGNceEE2SFx4MURceDkyXHg4QXRceEFFc1x4QTlSXHg3RilceEZBXHhDMlx4QTZceEI1XHhBQy9ceEFFXHhFQ1x4MTgsXHgxOVx4QzBceDg2JidlfGYlZVx4RDBceEU2XHhCMTZceEQxalx4MEZ0XHg4RW1ceEIxM1x4QTVceEJEXHgxM0FceDkxPDlceEY3YHRceDkyXHhBQlx4QzB3XHhFRVx4MUR0O1x4RkVceEIxXHg5Q21ceEJCeVx4OEY0bFx4REVceENEXHgwNVx4REFceDBCXHhGQl4kXHgwQ1x4ODZceDBBM1x4ODgxXHgxQVx4QTZUXHhGOTRceDlFXHhBMVx4MDFceDg3XHhGRiYwXHgxMFx4MDN5XHgxNVx4QzdceEFGXHhENy4iJlx4RTZceEZBXHhEMVEtXHhCQyQubStceDA0XHhBNlx4QUI/XHhCQ1x4QzYlMVVceEIzXHhCNVx4MTFceEI0Nlx4RDdtXHg5OStceEJDekhfXHgxN0xAXHhGM1x4MTBUXHhDNEY7Tlx4OURBXHgxNVx4MTRceDlDXHgwQkJceDk1MFx4ODRceEUzXHhEOFx4MEJceEUzN1x4QUFceEM3XHhFQlx4OTlceDBGQFx4RkJceDlCXHg5RUlceEQxXHhGNXNXI1x4QzdceDhDXHg5MFx4REJceEVDXHhBMlx4RENceDExci9ceERGXHhFQUosXHhFOVx4RkJceEMzP1x4QTNceDBBXHhCMUJceEE0XHhBOVx4OEVceDlCXHhENlx4QkZwXHhBRWRceEFEXHhBRHFceEIyXHgwRVx4RkFceENFRVx4QTdceDk3XHhFOFx4QTNceEMyXHgxOFx4MTBgXHhBNFx4QTlzQlx4RkVceEZDXHg5MnA7XHhCNGUpXHhCOFx4RTdceEI4XHgwNHRceENDXHhEM1x4Q0EzXHgwMlx4MENsV3RceDk5XHgwNlx4QkFceDhFXHg4NFx4OTVceEMxXHg5OFx4RDdceEUwXHhEQVx4QTRceEFCXHhGMFtceEYxXHhBOU1ceDg3XHgxN3JsXHhENlx4QzdceDlBMH44XHgwOVx4OEVceEIyMlx4QTNkXHhENFx4ODJ0U1x4QTRHXHhENiJNXHg4NzZceEJFVVx4RDE/Slx4QzdceDkwOEFceEFBXHg4Nlx4OTNpUVx4QzMrXHg4REFceEREXHgxN1x4Q0N2XHhERFx4RjNceEJCXHhCRVx4RUZPXHg4RVx4OUZceEI4flx4QjZceDA5XHgwMVpceEI2XHg4MzRceDkxXHhCMVx4MEVceEIzVEBceEM2Qlx4RDlceDhBXHg4MVx4RTVyXHhFM1x4ODhceDFFXHhDRVx4QjVceEVDXHhDQ0ZceENBdlx4RkVceEUyXHgxMVFceEQ0Rlx4OTRceDlDXHhCQ1x4MURceDhDXHg4Mj4zXHgwMlx4RjJEXHg5Mlx4RjRIXHg5RVx4RTFceERGXHhDOFx4RDZkXHhFQ05ceDlGXHg5QndceDEwVFx4MThceDA3P1x4QkZceEMwXHg5M1x4QjQzXHhFM1x4Q0UgXHhEQUZceEQ3Zlx4Q0VceERDXHgwOFx4QTdceEMwXHgxQlx4Q0NceDhGKlx4REV8XHgxOS9ceERBXHhCNFx4QjhnPFx4QTRceDE5XHhERFx4Q0VceDFEOnlceEUwaFx4MUN9fmZceDkwXHhEQVx4RkVceDFFXHhBNlx4RTdceENCXHhBMVx4RTlUXHhBM1x4QUFceDAwXHhDM1x4MTVceDlGXHhEQVx4MUJceEI4XHhDN2xrNVx4Q0NceEU0XHhDMVx4RjQnMVx4RTRceEM0N1x4MDRceEQyXHg4ODtYXHgxNFx4ODhceEY3XHgxMiIvNVx4MUZceEE5XHhENWFceDg4XHgwN1x4RjJiTU12Llx4RDNceDEzXHgxNlx4MERceEM1XHgwQzVceDg2XHg5OVx4MTlceEIwXHhCQjwqWkUkdiwpS1x4QjNceDExXHhBOFx4OTdceEY0XHhEMHBceEJFXHg4OGFceEZFTlx4Q0JceEQ3XHg4MFx4RTJceEJBXnQgXHg4MnkhXXJceEQ4XHgwMVx4RjFceEM0XHhFNEZceENGXHhCNT5ceDgwd2FceDBFSixceEM2NSYgXHgxOEEiXHgwOVx4RjRceDlBXHhENFx4RENceEQ3XHhCM0p2XHgxN1x4Q0VceDE5XHhFN1x4OTdceEZFV2hceDA4a1x4MDVceEI1XHgwMllBXHgxRVx4RDVQOkF+XHhGMylceDEwXHg4NnBceEY3fFNceEMyXHg5QyJceEFCc1x4ODRceDA5XHgwQ1x4OENceDBFN1x4MEFrX1x4QkM9R1x4QjFceDkxKHBIXHhCQVRceEExXHg5Qlx4RkFceDdGXHgwODIhKDdceEVGQFx4QTA3XHhGNlx4RjZUaUdceDEwXHg5Q1x4MTVceEVDXHhDM1x4QUJceDE5XHhFNlx4RUNUXHg4MVx4MUVhR1x4RDRceEJGXHhBQVx4QjFceEIyXHgwRS1ceEZCPT9ceEMzXHhEMFx4MTZceEY0SzdceEVCXHhDOTZceEEzXHg5MFx4QTNceEY3XHg5RE1ceDhEXHgxQlx4OTRceDAya0BceEQ1XHgwM1x4QTBceEQ3NHpZXHgwN2NceEQ2dVx4QTdceEY2XHg4NFx4QzlceDk1XHg4Q1x4RERceERFXHgxMlx4ODdceEFEXHgwOVx4RUJceDk1XHhGRlx4OTQxRlx4RjNYcVx4RDNceEZCflx4ODRceEUzXHhDOXpceEEybVx4REVceENBXHgxQjNceEU1InpceEMyXHhEMVhceEVEXHhCNlU+XHgxMFx4QzhceDFEXHhBNVx4RTRsVFx4ODlFXHhFOFx4OTJceDg3XHg3Rlx4REQgXHhEMlx4QTJceDFCXHhFRFx4OEVceEI3XHg4QVx4OTJOXHhBRFtceEJEXHhFN1x4MEMiXHgwN1x4RkZyXHhBM2pceDlDRyw5XHg4Q1x4QjlceDBGXHhCMStceDFBXHgwNVx4RDdceDAyPVx4RTBceEZDZUBjeGZceENGa1x4RThceEQxXHhENVx4QkZgXHhBQj5DT1x4QkJ2UGc7Slx4MTlceEE2XHhFRGJceDgzXHhGMWRyJVx4RTY8XHhBQlx4MEM7XHhFNE5ceDFELGxceEI1XHgwNlx4QkZceDlFXHhBNlx4RkJ9Zk5ceEM3XHg4N1x4OThxKVx4RDBceDhEXHhBNUFceDA3XHgwQyZceEM4XHhBOVx4ODNceEU3M1x4RjBhXHhGRC5ceDgxXHhFQlx4QjN1XHhFOHBceEEwXHhEMmRceEFCXHhEOSJceEU3XHgxMEI2XHg5Mlx4RDZceERCbzVceDE2XHhBMVx4OThceDhCdlx4OEFtZ1x4ODlceDE5cFx4REVpXHg4MFx4MERceENBXHhFRlx4N0ZceDAycFx4RjBceEUwXHgxOFx4QzZIXHhEMVx4OENceDlBXHg4MFx4MDZceDAwJDVceDgxXHhEQVx4RkNceDdGXHg5Rlx4QjNceDAydC9JZzhceEFDXHhEM0NceEU0XHhFQ3tceDFDe1x4RTRceDAyOlx4RDBlS3lceEU5XHgxQStceDFBXHhBM1x4QjhceEM3Vlx4RkRceEI5XHhFMFx4MUVceEZEVjFceEVBXHhEOFx4OTNPXHgwNVx4RjRceERBXVx4REFceEI1XHhEOWBceDlEY1x4QTVceEU3XHg4Nlx4OTZPXHhFQSJceEY2Olx4MEJlXHhGMFx4RTM0XHgwQ1x4QzlceDA1OFx4QUY4JVx4MTB6MiRceDgyXHhCRl81Ulx4OTBceDk5U1x4QTZceDFBXHhCRVx4MTZ+QVx4ODMuSFx4QzBnLFx4RDRceDk2XHgwMlx4RTF9XHg5Nlx4MDZMJVx4QzYyJ1x4RjJceDA5XHgxMChceDFGXHg4OSBceDhCJVx4MTFRXHgwM1x4RTlceEI1Q1x4RkVceDkxXHhGOFx4QTdnR1x4MUZceDExXHhCOVx4QjhceDg2Pk5ceEE1XHhEMlx4QUNRbHJceEI3dVx4QjJceEY0XHhFRFx4QkRceEQ0XHhBMj4qclFudFx4RUZceDhGXypceEZBQlx4QzlceDFGXHhCMStEXHhDQylqXHgwN1x4RDFceEU0Tlx4MDlceEZDXHgxN1x4RTdceDAwM3VceDhBXHhFQ04lXHhEQjZceDFBXHhFMFx4QzRvKFx4QkRceDE0XHhEQVx4RDdceEM2XHgwNCdpTWVZXHhCQVx4RkZceDg0XHhGNlx4Q0VceDAzXFx4OUEqXHhBMXtceDFET1FceDg0ZXVceEQzLFx4MTRceEU3RVx4RTV4XHhCMmlceEMzXHhFOVgyXHhFN1x4QjNceERCXHg5OExceEE0XHhDREpceDA3XHgwRExDXHhFOVx4QkZceENGXHgwOG1ceEI4YFx4QURceDFFcyFceEE4XHg5Qlx4OEROXHhBMFx4RjlceEU2M1x4RkZceEE5XHhDN1x4MTA/XHhDMlx4ODhceEI1Zlx4QjVceDg2XHg4Mlx4MUFceDFDXyFceEEyOEFceEE4R1x4RURceEUwVVx4RTNceDlEXHhFMVx4OTJceDg0XHgxOFx4QUR3W1s3ZVx4QjVJXHg5N1x4MDRceEY3O3VceEY4O1x4OTkwXHhCMDpceEIyMEdceEVEXHhGMV9ceEIxV0lceDEzXHhBQlx4QzJceEJFXHhFQlx4MEVceEY1XHgwOClceDg3clx4QzBceEE2bj5ceEZBaHNceDhFXHhEOFx4RjdceDE4L1x4ODFceEMyIFx4RTBmJ1x4RjZIXHhGQk9ceEM1XHgxRFdMXHgxM1x4RkRceDlDXHhFOFx4MENceDFGXHg4MHtFXHhBMFx4RTlceDk2XHhFQ0xLOilceEE1XHhFRDpceEQyXHhENVx4MTE7XHgwOV1ceEE5XHgxNlx4Q0RceEVBXHgwNlBceEJEXHhBOGpceEFEXHhEOFx4MUMxXHgxRlx4RjYpPlxceEU0XHg4N1x4QjJ9XHhBNlx4MDJceEI1KEh1XHhCRV1ceDhBI1x4MEFceDg1XHhFNVx4OTJceEVDXHg4Q1x4MUZceEFGXHhDQVx4RDR1XHhGQmxwXHhBOVx4MDZceDk3ZVx4OTlceEEyXHhDNVx4OEFceEI1cVx4RUVcXHgxNVx4REJceDg4XHhFODhceDhBTVx4RjFzXHgxM1x4QUVceEU0XHhEQlx4RDBceEM3I1x4QTNceDAzMVx4MTQpXHgwQVx4QkZbXHhGRVx4RDUoXHhFRVx4MUZiXHhGRkomXHgxOVx4RjhQXHhFRmZlXHhEMiFceDgwV1x4OEV6TFx4REJceEUxXVx4QUUgM2UqXHhGRDdceDAzXHhBQVx4QjMxXHg4M1x4MDhceEEwXHhDMk9ceEIzXHhFOGdceEFFXHhFRlx4REQ4W3xceDg5XHgwRGxnXHhCOVx4REVceEE5K1x4OThceEFDWlx4MDFceEY1XHhBMVx4ODlceDgzXHgwN1x4ODhceEFBXHhEOVx4RUY1ZCFHXHg5Qlx4ODhBRlp1XHhDM1x4RjdwXHgwOFx4RUMtXHhCNVx4MDJceEREXHg4RVx4QTlceEE0TVx4MTdceEY5JVx4MTF2XHhFNFx4RjBceDEyXHg5QVx4RkRceEVFUlx4OUFceEM0PFx4REQoXHhGMVx4RDZceEEyN3JceDBGXHhBN1x4MDhceEREXHhEQVx4RDlJXHhCOVx4QjdwXHhBMlx4RUJceEEwXHhERTdceEI5XHg4RTFceDBBTXEkXk5ceEY3J1x4OTRzMnpceERFUEZceEU4XHgxOV5ceENEbFx4REVceEUxXHg5Rlx4RUYyXHhCRFx4MDdceEM1XHhGMlx4RDUjeVx4QjBceEM4XHgwMFx4RUQtXHhCQVx4RkZceEU2MmIgQVx4RjBceDgyXHhEMVx4MDY/Ni9ceDkzXHg4NE5ceDFFXHhGN1x4RTNceDlFXHhGQnRceDkwIFx4QTNxVlx4RjBzXHhGNVx4QkVceEQxXHgwRlx4QzZceEY0MS5ceDAwXHg5RVx4OTRceEQxXHhEQX5ceEM0fVx4ODJceEI5XHg4NS5ceEQzXHhGRlx4QkFceERBXHhGMWQiXHgwM2VceDgzXHhDRlx4RENceEY5XHhBQVx4MENceEIxXHhEOUZceDkyXHhDNFZUXHhEMVx4OUJANlx4Q0JceEJGXHgxRTJRTndAXHhENk9ceDEyXHhBNVx4QTNceEJCXHhFNFx4RjBceEE1XHhFRVx4QUFceDBBXHhGNUNceDEyXHhEQ1x4MTFceDFFXHhGM1x4MTlceDkwXHhBMFx4OUFUXHhEQk5ceDgyXHg5RFx4QzFeXHhGOFx4OUZceEE4XHhDRlx4MDMtXHhDRiVAXHgwRnpceDBGLFx4RTBceDk0RFx4QzlceDA1ZFx4RTVceDFFPj1ceEIyTFx4QTg6XHhBN343XHhGOFx4OTdceDEyXHhCOU9ceDhEXHhDNFx4OTZceDk4SVx4MTFceDlBXHhDN0JceDk4UTZceEY2Olx4OUNceEM4XHhGODBXe1x4RTlBO1x4OTdceENDXHgxMytceEEwXHhENFx4QTFceEI3fHlceEE5XHhBMF5ceDgwXHhCMjxceEJDXHhDRXpceEIzXHgwMFx4RTBceDA1d1g+XHgxN1x4OTFceEY1XHhEM2RceEJGXHgxOVx4OEFceEY4XHhDNEFtKFx4RDk/XHhGMlx4RDhceEUzXHgwM1x4OUFceEMzRlx4QjR5U2M8a1x4QUZ1OGtceEQ0S1x4QkRceEY0KFx4MEJceEE5VFx4MTh2XHhEOVx4RjZNfVx4OTNceEUzXHhDRVx4REFceEY3XHhERVx4QTVwXHhFOVx4ODFceDE4ckdceDgzIFx4MThceEY1XHgxRFx4RkRceDA5TVx4REVceDAxXHhBNnBceERFXHgxMlx4QTZce1pceEM2XHgwODtceERCN1x4RUFeXHgwMVx4QjBceDg1XHhGRFx4QjFceDFFXHg4NU4kXHhBN1x4ODhceEIyPFx4QUZceDhBV1x4RTlkXHhGQ3pceEI4VVx4MTYuXHhCRVx4Qzk3XHhCQlx4QTFceDhCInlBXHgxQ1x4OEMleyBceEQyXHhGNlx4RUFceEVDXHhDRFx4QzRceENEXHgwRWNceDBFXHhEQ1x4MTZ7S1x4OTBceDkxXHgwNTFceDhBUFx4RDVtXHg5OTtceEI2cFx4MTZceEUzSSpceEM3XHhDMUdceEZGXHg4OH1hbFx4MDRceENBXHhEOFNcQVx4RkFceENBVlx4QjRceEE3XHhCQlx4RjUnXHg5MC1ceDhFXHhDOFx4MTYsXHhGMExBXHg5NFhceENBV1x4RDR0XHg4RjNceERCXHhDNX5ceEEwPlx4RURceEVDXHhBQ1x4QkF4eVx4RDhceEQ2XHhEOVx4MDFceDE4XHgwM1x4MUZlXHhCMgSNAS0KK2MIzvaNAS0GYlx4MThceDFDa1x4Q0FyXHg5NSdceEZGN1x4RDJceEMyeFx4RDVDXHhFRlx4OUFceEEwKyJceEI2alx4MEZjW1x4QkVxXHg5RVx4QTFceEVGRVx4MTVceENDXHhCNilceEFFXHgwMG5ceEY3XHhGQ1x4RjNceEY5OFx4QTdxXHhCMFx4ODFceEFFXHg4NVx4RUFceEZCXHhDRVx4N0ZoSFx4QjZceEI4XHhDRm4nXHg4RVx4QkFceDE1XHhFNXJceDFBXHg5N35ceEQ3XHgwOVx4RTdceDEzXHhFRVx4RDBwd1x4QjZceDBFXHgwMFx4RDJceDEyXHhGRm8gIFx4OENceDFBXHhBNFx4RkUmXHhDN2tceDAzXHhFRFx4RTlceDgwXHhBQixdXHhFRVx4QzlceEMweFx4Q0RceDhBXHhFOGpceDFEb1x4MDZceEZBLFx4ODFceEMwQlx4RDRceEJBXHg4N1x4OEJYXHhDMit0O1x4OTlceEMyXHhEOSlFLVx4QUZceEFDXHhCOFx4MTQ0MVx4RjVpXHhFNkJceEM4XHg5RFx4QTJrXHhDQ1x4REFceDEzXHg4N1x4MEVceEE3Mn5rXHgwOFx4QTdceEY1MFx4RTM0XHhBOFx4MDBceDhEXHhCQnNoXHg5N1x4N0ZacVx4MUFceDEzXHhDRXRHXHhDOVxceDFCXHhDNktceDlEXHgwMVx4RTBceDhDXHg4Rlx4QjRceEIwZlx4RTZsJ1x4QTNceDFGXHgxMVx4OThceEJEXHgwQVx4MDBceDgzVWdceEQySXlbJ29ceEUxXHgxN01ceDk5XHg4RFx4QzJceDFGc1x4OTJrLjh4XHhFRTNtXHhDOFx4MDhceEEwXHhGMFx4QTlceEE3XHg4RVx4RTJceEMyXHhGMlx4MDNceDExXHg4MVx4RkFceDFCXHgxNlx4QkZidlx4QUNceEEwXHhGNVx4MTZceDFDMFx4MUVceEJCeFx4OEJ2MHxceERFVkpceEQ5XHhGRlx4REFceDgwSlx4RjMzXHg4MVx4RTAyXHgwM1x4OENceDdGXHg5QVx4MTJbXHgwQlx4RkMpNlx4RDJceDg1XHg3Rlx4MTRceDA5XHhFNlx4MTNTXHhGQVx4RjZrXHg5Rk9ceDg5NyshXHhDQnBceERFXlx4MEJVPFx4RUQsRFx4RjhceEI3XVx4QzNceEY4XHgxOFx4MERceDA3RVx4ODNceDA2XHgxMk9wXHhEN2JceEE1XHhGNlx4MTNceDk3R3dSXHg5MUBceDk3XHhGQ1x4QUZceEYwa1x4RjguXHhGQVx4QkNceDE3XHg5M3RceEUwXHgwOFx4RjIsXHgxQlx4RkFJXHgxQl5ceEExYVNceEQxbDRwcHJHXHhERndceEY2IVx4RjBceEFGXHgwQ1x4MDhGXHgxMFx4RkRceDg5XHhFOVx4RjVceEUwXHhBNlx4RkRceDg0Xk1yX1x4QjhceDFDXHgxN1x4Q0QoXHhEMlx4QTc7XHhDN2xceDhBXHhBMFx4OTBceEI0XHg4Qlx4MDFceERCXHhFMHBFXHgxOFx4MDU5XHgwNEtceDExXHhDMCtKXHhGMFNgXHg5OG1RXHgxQ1x4MDRceENEXHhEMFx4OUJceDg4XHhFRSNceDgxXHhBRlx4OUZceDkxOVx4RUJceEFFRVx4MTBceDk2dmokY1x4OERceEQyXHhCN1x4OTRceEFBXHg4MVx4RTFceDhEXHhFNVx4RDZgXHhFMkcyXHgwMFx4Q0JceEREXHgxRVx4Qzg+R1x4RDdceENEXHg4M1x4QjFBXHg5N1x4OEQvJlx4RkVceDE1XHhEQWBceEU1OVx4MUVceDAzTVx4ODJceDkwbVx4QTZceEI5XHg5Nlx4RkEsXHg5Qlx4MDBceDA2IVszXHhCN1x4RURceDk2Olx4MTlceDk2XHg5MDo7eH51XHhFRlx4QUFceEQwTVx4QTVaTlx4QjBVLVx4RjJceEFDXHhCOHNceEI2XHg4RVx4RjlCXHg4NVx4MDNceDhEXHhBRVx4ODZ4M1AtXHg4QVx4MURceEY5XHgxOFx4QjhceEQ3XHhBRlBceEIzdlx4ODREXHgxNVx4QkRceDA0XHgwNVx4OUJceERGe1x4RTFceDlBJ09ceEI4XHgxNjtIXHg5Mj4pU1x4Q0M5XzdceEVFXHhGRFx4QzNceDEyXHhBMHRJXHg4Qlx4RTVceERDS3VjXHgxNklceDlCXHgxRlx4MDhWXHg3Rn1DXHhBNWFceEZFXHhGMUpceDA5XHg5NEI+XHg5QVx4MTcvMlx4ODBceEEzaDRceDBCXHhGMVx4Q0JceDk2O1x4RjFceDlEXHhCMlx4QkVMXHhEMGEkV1x4ODQ2bUpceEIyXHgxOVx4MUM8XHhEMVx4MTYqP1x4MDNceEY5XHg5OFx4Q0F8XHgxMyBELVx4QUNceDkyXHg5Qlx4MEM4XHhFMlx4REJceENGXHhCNFx4RjRceDFDXHhFRVpceDE1XHgwNVx4OEJceENDXHhBNlx4RkFcXHhFQVx4MTBceEZEbVx4QkZceEE4UlBceDA2XHgxQThceDFCXHg4RFx4MEVceEQ3Ulx4RTJceDE5XHhCQ0BceEQyXHhBQSNceDlGXHgwMlx4QjlceDExXHhGRVx4Q0U4XHhGNVx4QkFceEUwXHhBQTRceEJDXHg4MFx4QUNceEI5XHg4N1x4RUVBc11ceEFERlx4MEVceDlGXHgxNSpceEE2XHg4Q1x4RDBceEYzSVx4OTcjXHhGOHB9PVx4QThceERGXHhBQ1x4QzMmXHhEM1x4MENceDBCXHhBOVx4MUJwXHhGNFx4QURdXHg5MXZQS3QgXHhCMFQlXHhEN1x4QUREXHg5MjdQXHhERXttXHhCNFx4QjJceEQ0XHg4MFx4QjZceDkxXHhGOVx4ODRRdFx4MDdceDAzJlx4QUMnXHhDNFx4MDlceEE2XHgwRFx4QjJceERBaFx4OUZceEE1dlx4QzRceDBFXHhCQVx4QzhceEQ0XHg5M2N4XHhBNFx4OEFceEE5T1x4OUR2XHhFMlx4RkRceEZFY0lceDE4XHhCM1x4RERnM0FceEY0Xlx4QjJceEZEYlx4MENceDhBTlx4QTZceEFFXHhBRlx4Q0NceEU0Wlx4QURceENDXHhDRFx4RjVceEZCRSpyXHhGMS5ceEMyXHhCQVx4OURzXHhCRFx4QTRbXHhFMFx4RENceDFFXHhGMitceEUzclx4RjBceEUyXHhCQVx4MThmXHhDNC5CXHhCRFx4MUVrXHhCRVx4QjlceDE3XHhDMFJceEYxXHhGOTVceDhEXHg4RVx4OTRbXHhCNVx4OThgXHhCOVx4Q0RvXHgwMHRQXHhGRFx4QzlIXHg4MDxmZDxceEE1XHhBM1x4ODFceDgxXHhFQ1x4RkVceDA0XHhGNypvXHgxOVx4QkRceEE2XHhCOVx4RkVEXHgxM1x4OUVpXHhBQ1x4MTRceEE3XHg4NFx4QjRceDFEI1x1X11kXHgxRlx4QThceDFEXHhCRWFdWlx4RUNceEE4alx4RDRceEQ3XHg4OVx4QkFceEVBXHg5N1x4RjRgXHg5MFx4OUVceERFZVx4Q0M5XHhCRVx4RjZceDBFQ1x4MDdceEQ0XHhBQkpceEY2XHhEMFx4N0ZceDAzXHhBNVx4Q0JceDFDXHhGOFx4MDBceEEyXHhDM1x4QTFceEY0XHhGQVx4RkNceEY3XHhEOFx4QUVceEE3UVx4RUJceDlDdyImXHhENFx4OEVceDE2S1x4ODRceDEzU1x4ODBFXHhFM1x4Qjg2XHgwRGBceEUwcFx4QkVceDAyXHhFQ0VKMHpceEZBXHhCQlx4QjRceEE5QVBceERGXHgwN1x4QjVmc1x4OURceERCW1x4RTRceDk1XHhBRmhceEU0XHhBMCJceEJGXHgwQlx4QzFceEJBXHhDRlx4MEZYXHg4OFx4QTBycFx4RDZceEEzXHhFNUVceEFFXHhBQlx4RkFceEE2XHhDN1x4RDJceEY0XHhERFN0XHhDMVx4MDApXHhDRFx4OTFceEYxXHgxQ1x4ODZxXHg4Nnd+XHg5Qlx4Q0FceDBDXHg4MFx4RkJceEY5XHhEQ3hceEExXHhBRVx4RTc4XHhEMXhceEQwXHgwRVx4Q0VceEVCXHhENVEvXHhDRFx4Q0FceEY3Vl9ceEY5XHhERVx4MDBceENDXHg5Mlx4RDJrXHgwMVx4RTR5MVx4OTFceEYxXHhBRUxceDFCXHgwNThceENCXHg4Q1x4RDNceDkxXHhGNVx4QTFceDg2L1x4RkReIFx4RjJceDhDXHhGMDRceDdGdFx4RTJceENCSWFceEVGZlx4QzJceDBCXHg4QVx4RUVVQFx4RDNceDAzXHg4OFx4ODRceERFXHhFQ1FNXHgwMFx4MEZcXHhEQlx4RTRceEVFXHhBQ1x4OUFceEJBa0VceDFCPTY+XHg5OFx4ODJceEFFXHhENWFceEVFICR+L0FceDFGXHhFNH5ceEM4XHgxMlx4RTRceEQ2XHgxQ1x4QTZceEIwTVx4QTkyXHhDRlx4MUNceERGXHhCOVx4MUVceDE4XHhCOVx4OUNceEUwPVx4MUMsXHhEQlx4QTFceEM2UFx4RUJceEE5XHgwNFx4MTR6XihceDA0XHhBMkFceEUwXHhEOFx4ODAlXHhGRVx4QTlfXHhBOFx4RjhceDFFXHhFOVx4QzNceDkxXHhFQlx4MDU8XHhEMlx4RkVwe1x4OTc+XHgxQ3ZceEYzNGZceDg1Ylx4QjB6OFx4OTBIXHhGNlx4QjRKKDNceEE4XHhCRlx4MTFceDBEXHhBNFx4Q0RceEEwXHhBMVx4Qzg3XHgxQ1x4QjRceDBFOVx4RjZceEZBXHhENlx4OUMxSVx4MEJceEUwOn4hXHhFM25ceEUwTiBUZiZjXHhCQVBceDlBXHhEMlx4QzhxXHhCN3ZceENDSDNceENCcFx4RDJceEMzXHhFRFJceDAyMFx4OUVceEVFY1x4RTNceDk5XHg5NzlceDBGXHhDN1x4RDdceEIwYFx4QjVceDhDXHhCRUhceEQ1XHhGQ21ceDA4XHgwMFx4QzZKXHhGNVxceEIyXHg4OHZceEJCXHhDMztceDhDXHhCMFx4MUNocFx4RjFceDlDXHg4NW9ceEJBXHhBM1x4MTZceEQ4XHhBQlx4OThceERET2RceEE5XHgxNDRceDA2Mlx4OEJ9cVx4QjRceDExLD5pXHgwN29ceEJBSlx4OTciMFx4QjRceDlCXHhGQyZceDAxXHg4Rlx4OEJceEUwanNwXHhERVx4QTRceEFBXHhCMFx4RkZceEMwXHhEQVx4QUNceDgzIGVceEI3XHg5M0tceDBFJHZceEIxXHhFMFx4OEIhSi0qb3RceDhCeFx4MTJ9cUJceEY2XHgxNWdceERFKFx4Q0ZceEQxXHg5OVx4N0ZceERBXHg4MFx4ODY5XHg4RVx4MTRceDBDMlx4MEJceDhBXHg4RFx4OTBceEVGXHg5Qlx4QjhceEFCb1x4ODgvXHhBMzZceEYwXHgwNDRceEFBXHhDNVx4OERceEZGXHg5OFx4QzhceERDRFtCYFx4OTRceEY4XHhEMydPXHhCMlx4REVceEEzXHhDRVVceEYwYSVceEQ1XHgxMSZceDE5fVlceEU1dFx4MUN5XHhDMFx4QzhceDdGXHhGMVx4OTkoXHhEQiBxblx4MEVvXHhGM1x4QzNceDBGNFQwW1x4MDRceDhCXHhEQ0lceEU1clx4OUZceEQ0JFx4RkVkXHgwQlx4QjhceDFBXHgwOF5ceEM3XHg4NXRMXHgxMjRxXHhCOFx4RkU2XHg5OFlceDlEXHg5NFx4OTAnMlx4ODZceDAxWFx4MUNceENDXHg4Mlx4MTBceEM3N1x4MEEgXHhERVx4QjdceDBDXHhFQ0FceEI0XHhFMyUlZFx4QUV8XHhGQ1x4QkVrXHhBMVx4RThceEQ1XHhDQVhceDFBXHg4RH1hXHg4OFx4RjJceEI0XHg5M1x4QjcoPVx4ODRceDlCXHhCQWM0XHg4Mlx4REYnXHhGRFx4OThqXHgxOUdceDhCXHhDNVx4RUQyXHhCRlx4MTFAP1NceEY3aGJceEFBMEshXHhBRFx4MEInXHhBOSxceEZFYFx4MThceEU5XHhGNmRceEYxXHg3Rlx4QUNceDBBXHhDMlx4RTAzZkJceDAzXHhFMFcqXHgxM1xceDkzXHg4M1x4RjA2XHgwMz10XHhFNVx4QzldVFx4QzNceDk5XHhFNFx4QzkzXHhCM1x4RTUyXHhCMlx4QkQ+UVx4QzktXHhFQlx4QzRceDFGXHhGOFx4QzQnPVx4RkZ8I2pceEI4XHgxQlx4MDFceEZFdzVceDEyXHgxMWtceEY1Klx4QTVceEExXHg4QiJiXHhEMy1ceEMwXHhBMzF+aDFceDEwXHg4Mlx4Q0NceDkxZFx4QzgtXHhBQ1x4RUUjXHg5Rlx4RTJYPk9ceEM2c2tGIFx4QUQ9XHhDRm9ceENGJ3dceDlCcyBceEQ4XHgxOFx4MTBceDE5Mlx4MDhceEFCXHhBM1x4QTZceEMySVx4RkVfQVx4RTdceDA3XHhGQlx4MDZceDE2XHhGMFx4QkNceEM3XHhDRFx4QTlceEYxXHhBRVx4OUFceDg1XHhBNWJceDg5XHhCOVx4REFceDFGbVx4MTJceEM5XHgxQ3RceEUzXHhDQVx4QzFceDE1NixceDEwdVx4RjlSXHhDNFx4RkFceDg5XHhBQ1x4RTdceEU5S1x4MUUyXHgwMFx4ODlceDBBX1x4MUQyXHhFQVx4QjkhZFx4QTE2XHg5MVx4OTVceENETVx4QkZpXHgxN1x4OUNceEE0XHhGOE1ceDlEXHg4Qlx4ODFceDFEXHhCOV9ceEI4bVx4RkIxXHgxNVx4OENceEMybFx4MDIjfChceDFFcVx4RDBceDg5c1x4QUFceDE3WVx4MEJceERBT1x4RURfZjl3VXdceEJCflx4QjZceEYzXHg4Q0FceEY3XHhCQn1ceEM4XHgxMCdceEY1XHgwNCdceDE0Vlx4MTYlXHhFNFx4QjVceDFBXHhCMVx4OTI6XHgxQkU8XHg4RDJceEJGXHhFRlx4QjZceDBCK1x4MEZceEQ2XHhBN1x4QkVceDhERVx4MTdceEUwXHgwRFx4MTI6XHgwOFx4OTdceEM2XHhBN1JceEQ4XHhEQ1x4RENceEY1MFx4QTJceENFXHgwRlx4Q0Etc1x4QzclJ1x4QkZceEQyXHhEQ1x4RDFceEMyJVx4QkZceDBCUVx4MEVceEJDXHg4Nlx4RDNceENBXHgxRVtceERGXHg4N1x4OTNceDA1XHg5RFx4RTkrN1x4RkFfJVx4RjRceEI1XHhFQVpceEMxXHhDNlx4Q0NWXHhBQU9ceDBBXHhCNVx4RjdceDA1IzxhXHhEQ1x4RTM/a1x4MTRceEU2Tlx4QzVceEZFXHgxMWZceEQxZURceDA2XHhCOVx4QjdNXHhGQ1x4MDVBXHhGNVx4RUFaXHhGNFx4RjVceENFI1x4RDVceEFEXHhGMlx4ODhceEU2MFx4OTZceDg3XHhEMVx4QTZceDAxc1x4QzdceEZBYFx4RjgsXHhDMVx4OEVceERDXHhGQ1x4MDFuUVx4QzVceDBGXHg5Mlx4OUNceEI5NnMhXHhGNVx4QjRceEM3a1x4ODZceDA0XHhCMEtUblx4QjA7YVYiXHhEQj5ceEE2XHgwQ1x4QTRMWkpceEFDXHhEQVx4QzFceEIxXFx4OEFceDg3VVx4OENceEIwc1x4OUZceDg0XHhENkJceDlFXHhCOFx4MTFuZHFaXHhBRWxceEM2XHhERlx4QjVceEFGNDFPXHg4N1x4QUZ+XVNceDFGXHhCNkhceEJBXHhDM1x4RTNoXHhCQ1x4QjdceEYzXHg4RFx4QkJceDAxLVdceEY0XHhCM1x4RTVceEEzLVx4OUEnXHgxQm5ceDE3e1x4RjMzLVx4OUZ7eXRzSFx4Qjg2XHg4MFx4QjVceEU0XHhCQX1ceDgyfFx4OTVceDAzXHgxRFx4MDlceDhFV1x4QzBDOVx4ODEwXHg5MVx4QkZceEJEXHhGOFx4QkZceEYyXHhBNGZceDlFXHgxN1dceDFCXHhCQlx4OEVceDBEXHhDQmRceEUwXHgxQVx4MDRbXHhENFx4QTNceDg3XHgwOERceEFCXHhENVx4RkRwLFx4OTZceEE0XHg4Mlx4Q0RDXHhGRlx4RTVceEU1VFx4QTVnXHhFMFx4MDRceEM4aSJqSVx4QTVceEYyXHg5OS5YTlx4OTZceENGXHhERFx4RkZceEVFXHhGNV9ceEJEXHg5OFx4QzFceENESFx4OTFbXHhGMi5zXHhDOFx4QTRceEVFb0dEXHhFRlx4RjBqVDRceERCXHg4M1x4RTZceEZCXHhCMWZceEU3XHgxNVx4RDEpXHhGNlx4OUJceEU3cClceDBCKlx4RTZceEI3QVx4QkZNXHhDOURceEY3VFx4QThceEIzXHhGOSNceEU5XHg5MFx4RUJceEM0KFx4RDVceEFGXHgxOVx4MDBceEQzXHgwQXNceEMyXHg4Mlx4OUJceDlDXHhDQVx4QkJceEE3O1x4QjJQXHhCMlx4MENceEUxXHgwQVx4RkVceEQ3XHhCNkZJXHhDRFx4MURceEJDXHgwN0VceDBEXHhCQlx4QTNceDlEXHgxMlx4QzNceDk1XHhDMFx4RTNceDAxXHg4RExceDA0P1x4QzlrXHg5OVx4ODdceEJCXHgwRXtOXHhEOFx4RTZceEE0XHg5MFx4MERZO1x4RjAhXHg4MURceEJGXHg4Mi5ceEZDXHg5NFx4MDZceEI0XHg5RVx4RkNceEZBJlx4RUJAV1dceDEzXHg4MFx4OEFceEQ0L35ceDgzNlx4RDZceDBGbFx4QTdceEQwaVx4OEUnXHhBNlx4QThceDk1XHhDRXtceDk3TVx4ODRceENBKlx4ODFceEVGXHhFMFx4QjBceDE4NmhceENDKVx4MEE+XHhFRlx4RUVceDk4XHhEM1Zgblx4RjFceEU5XHhCRlx4QjhpcFx4QkJceDExfkJceDA3SFx4MDJceDk4Xn5ceDhCQFx4RDc2XHhEMXFceEU5XHhCM1x4RUVaXHhENFx4Q0J6XHg4OFx4RUFceENFXHhGRDVceDE0XHhEM1x4MDZceEM2e1x4MUU9XHhCMVxceDA5SiRceDBDXHhFQVx4RUZceEU4c2skZ1x4MTlceDFFXHhDOVkgXHgxQWtceEUxXHg4RFx4RjE8XHg5Nlx4QjB7QVx4OENceEU5XHhDRTcgdEVceEExXHgwMyNceEREXHgwN2NceDBCc1x4MTVceDFBXHg5NFx4MTlceDlFXHhFRlx4RUFceDkxXHhFMC1ceDFGRFx4QzZZblx4RjZeWlVceDFCXHhCNnJxXHhCOVx4Q0U7XHg5M1IsXHhCMCpceDk0XHhGRVx4RUJceDE4T1x4MTlceEZEXHhGRlx4RDBceEU1T1x4RTMyTk9ceEQ3XHhGRVx4QkZceEY5XHhDRjhsXHhBRFx4MDZceDlGXHg4QikqMlx4MUVceDkyXHgxMzkqXHhBRnZceEIzXHhENlx4Q0VceEY3XHhBOVx4MDJceEJDXHhGRHZsTjJ0JVx4RUF8XHgxNVx4RDF8XHg5NFx4QkFceDE2XHhGRGhceDg3Slx4MTFceDExXHgwMFx4RTEuXHg4NmZceEYxXHg4Q1x4REYjVFx4RkQuVFx4REJceEFEXHg5Rlx4Q0FceEI0XHhERFx4QjRceDFDXHhFOFx4QUNceERBXHhEQyE6XHhBQkwlXHhGN1x4REJceEQxXHgxNFx4QTVceEY0XHg4Nlx4QTBceEM4cVx4OTZIMVx4RTNfXHgwMFx4Q0NFXHhEM2k6XHhGOGxceDkxXHhBRjhceEJBXHhGRTdceDlEXHgwNFx4MUJUXHgwRlx4QjBdRVx4REVceEM0XHhCRFx4RjZceERFXHhFNFx4MTBceDg4XHg5MFx4QUJceEM4XHg4QVx4OERceEFEXHgwM1x4OUJceEIxXHhFOVx4RUVceDFDfjlceEVBXHhBMFx4MDJceDlDXHhBNlx4RkJceEFDLSFceEIyOFx4QkRceDAwXHhFRSVceDE5Nlx4QzllbFx4ODNceENEblx4RjNceEEyUFx4QzhceEQyXHgwRixLXHg5Q1dceEY1XHhDQ01ceDhFXHgwM1x4QjJceEMzKVx4ODRceDBEaFFtXHhGQ1x4RTFceEE4XHhDREh6XHhFRlx4RkVceENDcj9ceEQ5XHgwMlx4Q0NceERGP1x4MDEjJ1x4MDlceDgyXHg4MydGXHhCQnNceEE3XHhDOVx4ODQjXHhEM1x4OTJHXHhCNVx4MEVceDAxJUAhXHg4QVx4RTNceDA1XHhENHA5fklVQ1x4MEVceEM2XHg4NFx4RjJceEVCXHhDNlx4RTVceEI5alx4OEZceDgxXHhCRiUxYSRceDk5XHgwNlx4RThceDg5XHhGNz9iXHhDMlxceDlGfVg8XHg5OFx4OTZceDA2IFBiQEIvXHhDMlx4QjdceDk1XHg5NCFceDgyX0RDXHg4MFx4RDVceDlEXHg5N1x4OTlJWnxceERBXHhDOSBceDFGM1ZnXHhDQjJceEZFXHhFQ3I1XHg3Rlx4RTZceDA0XHhBQ1pceDdGXHgxMVx4QUZceDE5Ylx4ODRBXHgxMDM4R1x4QUZceEJCT1x4OUFjXHg4OFx4QUElXHgwM1x4RDlceEUyXHhEMlx4MThceENFXHhEOFx4RTluXHhENlx4OTdfXHhFN34uXHg5MVx4RDdceDgxXHhENFx4RkZceDk1XHg5NFx4ODdceEU1Kj1bXHgxQVx4MEQqI1x4ODhceDBFYm1ceEQ1XHhGNWNceDhDXHhCQVx4RTRceDgyXHhBOWFceEM4KkhceEY2R1x4RjBceEM3TFx4RDE8WFx4MDU1XHgwNVx4OUZceEQ5NyNceEM2XHhGMFx4QUYyI11ceDA0XHg5Q1x4RDlceDhGXHgwN20uXHgwQ1x4QkFPXHhBNVx4MTlPdFVceDhDMi5ceDBGXHhBNFx4RjZceDBCIVx4OEFwXHhDQlx4ODFGOSheXHhBMVk6XHhERXNwXHhGMF1ceDk4XHhFNU58XnNceEEyWl1ceDBBXHgxNiZceEFBKlx4ODJqXHhFRFx4MDhceEI4dlx4QTNceDg0Plx4OUNeXHhGOVx4QUNceDEweVx4MTVceDA0MkNceEZDXHhDQXtceERBNlx4OUFceDE3XHg5Mlx4MThceDBDXHhBQlx4QjlAXHhFQVx4MDdceEMxcFx4MTN9XHgwN0xceEFCXHhGRlx4RDZceDhCXHgwOFx4QjZceEYwOlx4Q0VceEVBXHg4MVx4RTJceDlBQlx4QjAnXHg5MFx4QUZceEI4XHhEMXpceEJGTFx4OUJMXHgwOVx4QkJceDBGXHhDOVx4OUZceERBXHhENChceENEYlx4QTM4bFx4RjFceEU0XHhFN1x4ODlGXHhERH1ceEU2OVx4QjFWXHhBQjNceDlEelx4MTgkXHgwM3FceDg2XHg5Nlx4QjJceDhFXHg5Qz9ceDk5eFx4RjBceDkwXHhGM1x4Q0ZceEExLVx4ODNceDgxV1RzXHhEOW9ceDAzXHhGOFx4OEV3XHhFMlx4OEQwXHg3Rlx4MDVceEFBcFx4MTYwXHhERCRmNlx4RDlceEQxdlx4RDdceDFCT1x4MTlceDFBXHhEMVdeXHhBNHRceEREWlx4OTVKSlx4RTJZV1x4OEZTXHhDQVZFVlx4QjJceDkzP1x4QTRceDhFPVx4QzNceDEyXHhENFx4RTcqa2QkXHg4RFx4RUVceEQ5XHhEOVx4QzZceDE3XHgwRlx4RjFceEFCXHhBMlx4QUNceDgxL1x4MDVceEJFXHg5NDNoXHhEMmxpMFx4QUFceEY2XHgwOVx4OTlceDFDJ1VceDgzXHhCOVx4QTNceDA4XHgxQVx4QzdtXHg5RVx4OENceDkxZVx4OEFceENFXHhDM1x4MURceEQyXHg5QUxceDAwXHgwRnFceDFDXHhGRlx4REFceDk5XHgwRlx4MDFceDA0XHg4N1x4OUZ+XHg4RCJceERDXHgxRlx4RjI5XHgwMXNceEJDXHg5MHk/JmJHfFx4ODcsXHgwMVx4MEJhXHgxQVBceEZCXHhCMFx4QTJceENDeVx4QUV4XHg5NFx4RDVJWVx4MEJceDg5PmVceDg1XHhCN1x4OEVxaltceENDXHhCRVx4MTZceEE5YWlceEQ0XHhEMGtceDEwXHhDRFx4ODUjXHhDMVx4QTgsXHg5NFx4QUZceEZDP1x4OThceDEyXHhCOTpceDA2XHhGRmxceEM4XHg5QW8oXHgwQVx4QTAnUVx4QURceDEwXHgxMlx4Q0JceEQ4XHhEQlx4ODVceDBGXHhBMWFceEExJ1x4QzZceEFCXHg5Mlx4QjNceDg4XHhGNlx4ODdceDkwXHg5N1x4OEIpXHhCMjd6PkNQXHhEOUVceEVFXHhEOVx4QzR+XHhFNFx4REFceEJDXHhBQzxceEJCe1x4QTBbU1x4RTgrXHgwRlx4QkRceEJEXHhDOVx4Q0NceEFGbUpceDA0Jlx4OUJceDg4XHg5MFx4ODB6XHhBNFx4RTZceDlDOVx4MTRZXHhFNVx4RUVAXHhCRlx4QjBYUlx4ODhceEY5KVx4QTlceDEwXGo6XHhERlx4RUJceDdGXHg4RVx4QUNceDgyXHhFM2l2XHhCQlx4REYzXHhFQ1x4QTJceEQ5XHhENCh7XHhFQVx4RkVceEYzXHhENVx4MDhceEZDXHg5NFx4MEZQXHhERCRceDBCXHhCQ1x4MTNmXHhGNSRkXHg4Mlx4QjNceEYxXHhGMVx4MDVceDFEXHg5Mlx4QzdceEIyR1x4ODNceENGXHhGOVx4ODVceDFCJlx4RTZceEQ5XHhFQVx4MUFPXHgwM2lceEJFdFx4RjJhXHhERnJYXHhEOFx4RkVceEVGXHg5Nlx4OTlceEE2XHhFNVx4QTN3XHg5OVx4QzhceDk2XHg5Mlx4QUFGNXxceEZFXHgxQlx4OTRceEZFXHhEOXxceEI0X1x4RTVceEM1Ilx4QUJceEZFIFx4OTdceEM3XHhENFx4MDZceDEyaVx4RkZceDBCXHgxQlx4RDBceEM0XHhGRV58IFx4REQkYk9zXHgwRnJceDlEXHhCRi9ceDExXHgxMVx4RUJceEE2fCN8XHhBOVx4RjghXHhBNFx4OUNzXHhFQUlceDkwblx4QzhhXHgxQXR9XHhBQ2RceEExXHhFNlx4MERkXHhFRH1GXHhGM2hceEE1XHhDNCJceEExXHhEN1x4QjYjXHg4MWVceEE1fWBGXHhBNSFGXHgwQVx4QzJceEFDTCNceEU0O0JceDE0TjJiXHhDMlAnXHhGRCVceEQxIWBceEYzXHhCMHxceEJFXHhFMSxceEE5XHhCQmpceDgzK1x4QjBRXHhDQzpceDAyXHgwOWJceEMxXHgwNy9ceEUzXHhEMCtsXHg4MHRceEE3XHhCRE13LSpceENFLlVceDFFXHhGNnJceEQ1XHg5RFx4QTMhXHhDOUtceEIyXHg5QiE3cVx4QTNceEVFXHgwRlx4RTZceDdGXHgxRFx4QURceEZDYVx4QzJceEJBXHhFNlErfVx4MUNceEFEXHhGOWZceEJBXHg4Nlx4MTFceDlCXHhFOVx4OUNceEUwXHgwNmMnXHg5MEtceEQ4XHhCOFx4OUNceDkxXHgwNTNceEI0a2RlXHgwNlx4MEVceEY4XHhFNCtceEM0XHhDQWZceEFCSVx4QTVceEQ4YVx4MTZceEY4Z0B3U1x4RTNceDBDXHhGNzc1c1x4MThceEMzXHhDNFx4MDFceEMyXHg5MFx4MEV9XHhEMF1ceEM5XHhEOSxceEVGUlx4MTdceDFBXHhEOVx4N0ZceENFM1x4OUJceDk0fVx4RjZceEQ2TyJceDgwXHhCOVx4OUFceDk2XHgwN1x4QkZceEE0XHgwRlx4ODAnXHhGOVx4QTNceEJBXHhENHdceEIwXHhCNFx4OURceEJFTHBceDAzXHhBRFdceDA5XHgwM1x4RTRceDFEXHhDMFx4MDdYJkFceDBEXHhDM1x4QzhIXHgxNVNnXHhBOFx4RkRtXHhBNFx4QTlceEVBfnhceEFGTldceENDXHhBNlx4MDEvMyZceENFXHgwQlx4OUJ0PyZUJlx4QjlceDk5Ylx4QzhceEM5OidceEYwSVx4REV3IVx4N0ZWXHgwREVceDk1XHhBQj5aXHg5NTdjXHgwOVx4RTRceEExXHhCNFx4OTdceDFGXHhERlx4MDExXHhCN2FceDE0XHhGOERceEJEXHg4QUJceEE3XHhBMlx4RUNceEM3XHhEM1x4RjJMXHhGMSVceDlDXHhDQ1x4RjEoUlx4RThceEE5XHgxRlx4QjlceDkwXHgxMCpceDg1clx4RjljXHhBMFROXHhFMFx4ODBceDE0Plx4RTdceEE3XHhDMVx4RTUseTNceDA0LXcpXHgxMlx4QTRceEJFXFx4RUNceEM5eGJceEFDXHhFOVx4ODZceENBJlx4QkRceDA3XHg4Rlx4QzJceDgyVFx4OUFceEI3XHhCNFx4RjN6XHhFOVx4MDFceEI4TyFceEY1XHhCN1x4REInUFx4QTJceDlCMVx4RTQ4LVx4OUJceEFBXHhCOTtceEY2XHhFRlx4Rjk1UU06SjJceDA2KyRceEU2XHhCRERceEVGXHhCRlx4RERceEE0Nlx4REZceENDXHhDMDJceEM3Qlx4RURceEMxXHhGMVx4QzJceEMyXHg5M1x4QkM3XHg4MFx4RDJ+V2tgamBceDg0XHhGMVx4MTFceDEwYVx4OUJceEFBXHhBMUVceEM0XHhBRlx4MTRceEFGXHhDMXN3XHhFOUMmazFceEY2W1x4MENceENGXHgwRlx4Q0N7Zlx4QUVceENFXHhFOFx4Q0ZceDkyRVx4Q0NceDA5XHhDMlx4ODNceEVEa1x4OTRMXHg5MVx4QjJceDE1XHhFRVx4OEJHWVx4OTcmXHhDQlx4QjFceENGXHhBMFx4QjFceDg4RTRcQ1x4MDFIXHg3Rlx4MTdceDgwW1x4RDFceEIwO0ZceEM4XHgwMjJAXHhCRVx4QzVlXHg4Q3tceEFBXHgwMlx4QkNceENDXHhDRVx4QTRceEIxdlx4Q0VceEY2XHg4Nlx4ODl+WlxceEQ3dWRceEJDZ1lceDlDP0VceDBCIFx4RTc/Tlx4RjdceEUxXHhERHtceDBFXHhCRSEqfVx4QTM4XHhCQXBceDAyVFx4OTRiXHhCQ1x4QjUiXHhCN1x4MTNceEYyXHhCMVx4QzBceDAyIzFceDlBWFx4QUYwO302XHhGQlx4QzFceEEzXHhENFx4QUZceDhGXHhGMVx4OUFceDlBSVx4Q0E4XHgxN1hceDA5XHg5NFx4QUFceEUzXHhDQ1x4OTNceEU1XHg5NyRceDhEUmZceEM4XHgxMWdceEI3XHhEMFx4OTJSXHgwOHE5XHg4RCNceEVDVjlceDk5XHhCM1x4RTBlXHhCMFx4MTFceEIzXHhFN3ZKXHhDQlx4RjNmXHhDQ1x4QTRceDdGXHgwRjBceEUzXHg4RmpceDlCXHhGMFx4QjAyXHhFRlx4OTRceDAxXHgxN1x4QzcxXHgwNX5xXHhFQlx4RjdceDhGXHhDM1x4OTdEXHhBMyZceDg0XHhDRkMqOVx4MTFlXHhDM1x4MTdceDkzQ1x4ODNceDg3QHV1Qlx4Q0FeXHhGODVceEU2XHg5OFx4RDFDY1FceEVGQ3VceEMwXHgwM1x4MDFceDg5XHg5QT1ceEE4XHhDOFx4RkJ0JyVceEE3XHg3Rlx4QkJxaEFceDlBXHgwNXtceEU2SWNceDhEXHgwOFx4MEZceDlDXHgwNFx4REFceEQ0NFx4QzZceEVDXHhGRVx4OEZceEFCXHhFQlx4QTFceEI3XHhBOFx4OEFVeVx4RUZceDEzXHgwMlx4MTlceDg3X1x4MUFceENFXHgwQVx4RTd9XHhDOVx4ODZceDBFXHg4OWFceEVBXHg5RnFceEUwXHhENEVceEI0XHhBNVx4MDlmXHhDN1x4MEJceDA3Qlx4QTZceEE4XHhFN1lEXHg5RFx4QjMjXHg5NFx4QkQ4XHg4RFx4QUJceEY2XHhCMFx4MEJgXHgwMlx4RkJmXHhCMztceEFDTFx4OERceEE4XHgxQ1x4RTFgXHg5Rlx4RjdceDg0NFx4Q0ZRXHhEQ1x4ODdceERCXHhBRjFgXHhGRUZIQEJceEJEXHhENGBceEEzYGFceEYxRTUpXHhDOFx4RkRceEEwXHg5QVx4QTNdXHgxQlx4QUVceEQ5XHhBNWBBXHhFOHNceEE0XHgxNVx4REJceDhFXHgwOVJNXHhDMGB3XHg4Nlx4RkJceEY5XHg5Rlx4MUFceENCXHhGN1x4OERSXHhGRiQwQlx4MUVaXVlqPVx4QzUrXHhFQlx4OUVsXHhBQ1x4RTFtXHhFRDZceEM0XHhENVx4RDZceEJFXHgwOFx4RDhceEI0XHgwN0ZceEEyXHhFOFx4OEF+XHg4Q0VBXHg5OWBcXHg4MzxceDg2XHg4NHxrXHgwQ1x4OURceDlBXHgxM1x4RURceEY0XHg5Q1x4MTlWWFx4RjZceDk4XHhDNCVuXHhCRFx4ODciXHhDN1x4MUVceDkwe0p5XHgxQ1x4OTNceEZEXHhCMlx4Q0FceDk2XHgxMFx4RjZEXHgxRlx4RURceDg1XHgxRFx4QjlWXHhFM1x4QTdceDlGPFx4QTNceEI3XHhBRVx4REZceDdGXHgxRFx4RjFceEMyXHgwNDtceEI2XHhGN19AXHgwQ1x4QThOXHgwRVx4RjlceENBXHg4Nlx4RkNVXHg5Rlx4Q0EhL1x4OUNxXHg4QltceDE0VWFUXHg3Rlx4MDZ+XHhCNldceDFBbFx4QjNceEQwXHhFNFx4QzRceDA5XHhDRFx4OUZLSFx4MUZceDAyXHhEMlx4RjZceEU1dTNvXHhCNlx4QTlMIkBoXHhBMkZWXHhEMVx4RTdceEYxXHgxRlx4RjBYXHhGMVx4RjQ0ZClceDhGZFx4RURLXHhDMlx4QzRceEM2XHgwMlx4QzlceDk2IFx4ODNceEQxXHhDQTdeXHg5RVx4Q0RceDE0XHg5M3JceEMzO0BceEU4XHgxOFx4MDZceEU1XHhBQlx4RkVceDFEXHg5OUdceEE0VlBceEYxU1x4QkJOXHhENE5ceENCXHg4NFx4Qzl0XHgxREpceEU2XHhGOX5ceEE3OWBceDgxXHhFQ1x4MEZceEI1XHhEMVx4ODBVXHhDMVx4QjRbXHhDNlx4Q0ZZUVpceEZDXHhGOVx4OUIgP1x4QTlceDBDXHgwRFx4RDdceEQ0XHhGRFcpYlx4QTRceDk4TmJceDEwO1x4QzZceEVBXHgwQXVvL1x4OURceEE2Olx4QkZceEY0XHhFRSRceEFFQDdHRFx4RjBceEVFXHhENlx4QjRceDhBXHhCMVx4QkZwXHg3Rlx4RkNceEIxXHhBQ0RceEY4XHhDRFx4RDRDXHhEMFx4OERZXHgxNylceEQ2XHhDNVQsXHhCQWhgXHg5MmBceEI5UFx4MDFceENFXHgxQihceEZCXHg4MVx4MTFceEY2OzxceEQxXHhFMTssXHhFNlx4RENceERDXHg5RkJceDg2Rlx4RjJceDlDXHg5QVx4QTFdXHg5Q1x4QjRceEJCNzlceEY5UzpceEU5b1x4RkNceEM3XHhERE9ceEREVmhceEQwXHhEMlx4QUNceENEPlx4RjZceEJFXHhCRCxceEVDXHhFRFx4RThoXHhCRlx4RjQjXHhFNUtceDgyXHg4Qlx4MERceEIwW1x4MDVceEFCbFx4RUIlXHhGMWFlXHhBQlx4RTkuXHhCNVx4MDdceEEwXHgxNVx4QUZceEUxaFx4OTQrQlx4MTY6XHhDOVx4QjhwTFx4RjdceDg5XHgwOCtCXHhENi0wK2pceEJEXHg4MVx4RURceEY4XHhFNy5ceDhFaGtceDA2XHhBMVx4ODlYXHhBRFNceEI2XHhCN1x4ODhceEFDeyVceEJFPVx4OUVceDBBXHhBQkNceENBXHhDNDRceEYxXHhFM0lceDgwZVFceEU3XHhDM1dceDk5XHhGNlBceDE3XHhENFx4OERceDdGXHhFQUVceEZCSndxKUZceDFCT3g2J1x4RDIwXHhCRlx4RTlceEZDXHhERlx4MDVceDg0XHhEQnVceDk2Tlx4OTRceDg4VVx4MTBceEE1XHhEM1x4ODZceDgzZFx4RDJceDlGXHhDQ1x4MDFceDkzQ1x4QUJceEFGXHhFOChceDk2XHhFNFx4QjM7XHhBM1x4RDFPJjBjNFx4MEQuKlx4QjBRXHhBRCRceDAyb2h8XHhFQ1x4QjZAeFx4OTFceENGbFx4RTljXHhBN1x4OEN4XHhBRFx4RTN9XHhCN1x4OTJceDdGXHg5Qlx4RDRceDA2V1x4QTN9XHhFQUlceDBCO1x4RTMmXmhceDAxJ1x4RTFceDg2JWpceDg0XHhCOVx4RjFceEVEXHg5M1x4MENHXHhDQVx4OEFceEI0PVx4OUFceEEzXHhDMlx4RDRaXHhGOFx4ODZceDk5XHgxMVx4RThceDE5J1x4QkJOXHhGQVx4RUJceEQyXHhBNFx4QkZpVVx4QTRceEYzd1BceDhBXHhBMDAiXHg5QVx4MDJceEM0XHhGNVJceEUyXHhEOVx4QUVXXHg5MEpceEVCXHhGQVx4QjNoXHhFQlx4MDJ2XHg5NGd4XHgxQ2tceEUxXHhBQ1x4RkJceEU4XHgwOFx4OUU7bVx4Q0UgXHg5MFx4ODlqPVx4OEZceDg2XHhGOUxceEJCTHtceDlEPkJceEFCXHhDMlx4MTRceEFCXHhCQ3N3XHg5MSo8TFx4QzIsXHhFOWQvXHg5MFx4Q0RceDgxXHhDNVx4Q0J+R1x4RjBdb3pceDk3XHgwNlx4N0ZceEI2cVx4MDFceEE4XHg4MjJceEEyQ1x4MTJceDk4XHgwQ1x4MTNceEYyXHhEQWNceENFXHhBOVx4QzVjXHg5RVx4QUE0XHhGM1UsXHhEMlx4RDV1XHgxNVx4MDE4XHhBMVtceDBEXHhGN1x4QUJhXHhEQVx4RTRceEZBXHgxMVx4MTZMa1x4MEZceDgyOlx4Q0ZceDFDXHg5N1x4REVceDA2XHgxOFx4OUNceEEwXHhCMVx4ODRceDFEXHg5Qk8oXHhDNVx4RTVceENBL1x4QzhceDg4XHhGOVx4QzMpXHg5M0xceEZCXHg5NjhceDE5WVx4RUQoXHgxNlx4RDAvXHhBMEBceDg4XHgxQlx4RDdceDg3Olx4MUFceDAzPSJbXHg5MVx4RjJ5Rlx4Q0NceERFXHhCNHlceENEXHhBOD1DSVx4OTlceDlBXHhGN1x4QTlXYF0oL1x4RUVPXHhBMntaXHgxN21PXHhDN1x4OUNceDlCXHhERkRceDgyXHhCQlx4QzhceEFFXHhCRlx4QUFceEQ0XHhBN1x4MTh2XHhGOC8vXHhGQlx4RkVpW1x4QTRYXHhFRkVtKFx4OThceEFCJilceEFGPGdmXHhFMT9YXHgxMiIoXHhGQ1xceEVDXHhCMk9ceERDXHg4QTRgXHhENFx4MENceDEwXHg4NVVmPFVlXHhDQVx4ODVnUFx4QzRceDhDXHhFMzBhXHg5Mlx4MTlceDE0XHhGNlx4ODBceEY5XHhCMidceEE0XHgxN1x4Q0VceEIxaFx4MDNsbVhceEYwXHhDMFx4RTI2Ilx4RjZqXHhDRFx4QzZceEVBXHhDOFx4OTQ5XHhGQVx4MUJwXHhENVx4Q0NceDAydCBceEQ5UV1bUlx4QkNceEVCXHhDRFx4QjU2ZV8kJ2BceENGalx4MTVceDEzXHhDQ0BceENEeFx4OTVceDgxLFdceDk4XHhCMVx4OTJceDkxXHhEMEVceENDXHhBNlx4RDNEWlx4RUJceEQwXHhGN1x4MTQnXHhGQ1x4OTBceEE5PFx4Q0RhXHgwRVx4RDF9XHhGQlx4QkIvRj1ceEYyXHgwMVx4MURceEFFXHhFNypuXHgwOFx4REJceEE4XHg4QWZNQVx4MUFWOVx4Q0JceDhGXHg5OVx4MTRceEFEZ1x4RkNceEJCe1x4MEZceEE4XHhDRFx4ODlceEFEXHgwNFx4OTArXHhENiNceEI2XHhGQ1x4MTVNJ1x4ODRceDhBXHgwQVx4RTlhXHgwRVx4Q0NceEQ5R1x4MTQoXHhDNlx4QzBceEY5XHgxNyciXHgxMVx4QjBceDE0XHg4N1x4QkF8bmRceEJDXHhDMVx4QTdceEE5K1x4MTI8elx4OTZTXHg5OVx4OUFceEExJFx4QURceEY4OjpTWFx4RDlceEM5XHg3Rlx4OUVceEMyXHg5RVx4RjNceEZEXHhFN1x4MEZceEI2XHhGNlFjXHhEN1x4MDRNQlx4MDlceEE2XHhCMFx4ODNaXHhBMFx4MEFceDEwc0t6XHhFOFx4MDFceDk4JFx4QUZceDk1Vmw+XHhBMVx4OTFceEY5XHg5Rlx4RDhceERBXHg4RVx4QzFWLHRsZERudD9uXHhDOFx4RUVrfHQ7SSpceERCXHhEQ2BceDhDXHhERlx4RDJceEFBXHhGOFx4RjBceEVDXHgwNlx4QkNceEE2XHhBNFx4QUFzUlx4MDNceDg0XHg4Q1xtXHhFQnNceDE1S1x4RENiXHhDOTtcUlx4RURceDlGej5ceDgweG5ceDkzXHhGNVx4RTFceEI5XHgwQ1x4REJxS1x4MUUuZFx4ODVceDE4XHhGODNceDFBXHgxNCJDXHg4RE1ceEE1WFx4OUNceENFKlx4QzhceEExXHg5OHp5XHhBMVIoXHg5NiorXHhDQmQlXHhFQVx4Q0NceEU0XHhFN1x4RERceEY4Xlx4MThzXHhCMFdMXHhFRlx4OUVceEI5XHgxRVx4OEI7XHhFQzZceEY0XHgwNT1ceEM5XHhFRFx4OURceEQ0XHhEQVx4OTVceEY0XHg3Rlx4MTlqNVx4Q0ZceDBGXHhCNlx4RjRceEFDSFx4OTVceEVCK2tbXHhCNlAvJFx4MENceEYwXHhDMWhceEQ3Tlx4QzNpXHhGOWtceDBCMFVEezBRXHg4MVx4QzV2XHg5QVxceDlFXHhDRFx4OTNceEM0PVx4MTJceDg3XHg4OVx4Q0M4WFx4MUFrXHhFQyVceERGP1x4RUZgW0RceDk2YVx4OENceDk1XHhDOVx4QjlceEREXHhCNVx4OUFceDA3SyV8XHhEQVx4QkRceDlFXHgxRFx4RkZCKFx4OEQ8MVx4ODJceDA0XHhFMlx4MDU/XHhGMVx4QzYvXHhEMFx4ODJceEMxeiNceDg2Olx4REFceEVFeVx4RkFceEVBe1x4MUNceDg3XHhDMGk9LVkqXHhGRFx4RkFoXHhGOFx4MDVceDAzXHgwNlx4OUNceEEzXHhDMVx4ODlAQlx4ODRJXHhENlx4MTVceEQxP2ZceDEyXHhFM1x4RkRQXHhBND84XHhGRiNceEY4ZFx4RUM+WmtceEU1XHhFNVx4MEJceEM4XHg4MVx4QzFqXHhEMVx4RTU3XHhCRlx4RUFceEQxXHhGMTZceDlGc2BceDE0Vlx4RUIxXHgwRVx4RUVceEM2XHhDMlx4RDBceDdGPXVLYVx4MDFceDlBKVx4QzVceEVFXHhBM1x4MDFceDkzV3JceEM4XHhENy9ceDk3PVx4MTRTR1x4OThceENGXHhBNVx4MEF+XHhCM1x4QThceEE2XHhCMVx4QzkgXHg5Mlx4QkZceEIzK1x4MDlceDhEXHhBNjZceEE4SVx4RENceEYwT1x4N0Yge1x4OTFceDg3XHhCMVx4QTVceDA5aFx4MUJrXHhFOVx4RTlceEJCXHg5MGRceEZEJ0tceDg5XHhENitceEU0XHg4Qlx4RTJceEVFXHg4MVx4RTZceERFN1IzVVx4Qzg2VWhVXHhFRVFceDBCXHhFRkBceDlEXHhENVx4OUFceEYxXHgxNVx4MEU0XHhBOVJceEQyNVx4RDRceEZDXHgwOFx4MUVLOFx4RkJceDkwXHhEREdceDA4XHhDM1RceEVBXHhGNDdceDE2XHhDQlx4REZceEE4XHhCOVx4RjdsXHgxRj5ceEU1XHg4N1x4OThceEQ5XHhCQ3dNRFlqXHhFMVx4RTNceDhFZV85VkJvXHhCRmZceDhGXHhCOVx4RThIXHg4Qlx4N0ZceDdGXHgwQlx4ODJuc1x4QUFceEMwLFx4QUNceDBGXHhDN1x4MDVceEEzXHhGMVx4OTdceDBEXHhFRFx4OTlceDg1XHhGOFx4RDNceEE4XHg4REFceEQzOHdceEQ4XHg5NVx4ODBaXHhFMVx4RDBceEJBXHhBNFx4Q0RceDhCXHg5N1x4Q0VceEY1XHhBQX42XHhCMVx4MDIqXHgwQ1BceEUxXHhCRFx4RDVceEM3V1x4MDBSblx4RTBBKDsyUVx4OEVceEJFXHhGRlx4OTUtXHg4Qlx4MDdceEY1XHgwRlx4RDVceDhFa1x4RDhqXHg5N1x4Q0EzXHhDMlx4ODlaLX47XHg5OFx4Q0JceEM1XHhBQ1x4QzBceDkyXHhFQzVceDlDXHhEOVx4MTdceEYwXHgwOVZQbVx4RUU9XHgxNFx4QzZ4XHgxNyQ+XHhFMCBceEM5XHg4N2FceDlEXHhGQzU7Llx4QTFceEVFXHgwQnZceEJFXHhGQ1x4QURceDkxUFx4OURceERFXHhCN1x4RjNceEM3blwvXHhGNGtceEYyZVx4RjMsXHg4OVx4RjdceENEPFx4RDlceERDXHhCRmdmXHhCNFx4RDRceDFDaFx4QzVGNlNyXHg5M1x4MDVceENFXHg5MyBceDBEXHgxOTVvXHhFMFx4RTFceEE3WShceEYyXHhGOSJceDA1Zlx4RkVceDlBXHg4NCpceEQ0flx4RTlTXHg4OVx4QjdceEQwXHgxRFx4QzZ1XHhCOFBaXHgwQlx4MDlrXHhENlx4QzNceEM5XHhEMXk2XHg5MCxceEVGXHhBNFx4MDhceDBBbUclTkRceDgwXHg4RnhUWVx4MUQoXHhFNXhceEU3XHg4Nlx4Q0FceDFDV1x4ODZceEM2LFx4QzZceEQ4QVx4RjVceDg4XHg4MVx4RjFBXHhBMTZKXHg5MF5ceDg5XHhFRWROM1x4ODJceDE2aVx4RUVceEE5XHhFNlx4RjdceEU2XHhFNWxceEJEc1xceDFGQVx4OTdceEY5Ik4zXHhGRjxbZiBceEZEKiZceEY2JlJceDFFXHhDRT9ceEU2PThceDlCXHhEMlx4QTBceEMzXHgxOVx4MDBceEUwXHg3Rlx4QzJlaCpceEYycjNceEUzXHhBRmtceEE5LGBceERGRXlceEI2TU5rXHgwOHU+XHhBOVx4OEJCXHhFQnBceEMzXHgxRFx4RjRceENBb1x4RTFceENFYlx4QjhceEIyMDlceDAzd1x4REFceEI3Slx4QUZceEIwXHhGNHlceEU1XHhCOFx4MUFceDA5XHhGQ1x4QkNceEM2Olx4QTMuXHgxMVx4MTFceDlDSHM1dlx4QzdceDgycVFeKnlceEE3NVx4OEVceDkzQWFceEFCXHhDOVx4RTlceDBEXHg4Rlx4QkVQOFx4QTdCXHhERmY+Klx4RTRFXHhGQ1ddXHhFQlx4ODc5XHgwQ1x4OTdceDBBXHhBNFx4MTNMXHgwMVx4RDZUPlx4QTdwYVx4OEQrXHgwOFx4QjByXHhFQVx4RDFceEJFVlx4OUI9XHhBRlx4ODNceEVEXHhDQnlceDhDXHhGNVx4RDRceDk5XHhCRFx4OEZceEVEdFx4OERceEE1XHhGMnNceEI0ZDFkXHhBNFx4OTJceEFCXHhDNlx4ODlceENDKFx4ODZmYlx4RjlceDgyXHhGOVx4QzdceEJCWjVceDkwJlx4QkJ8XHhGN1x4MEUuXHhFMilceDhBXHhCQSFceEZGQFx4QzVaXHg4OFx4Q0VJXHhEN0NceDFEXHhFNEd9XHgxNT5ceDEyPVx4MDhceDBFN1x4RTdceEJCXHhEQlx4QzhceDExXHg5N1x4QTFceDBGPVx4ODZceEE5RVx4QzBceEM0XHg4RFx4REJjflx4MUZceDFDXHhFNFx4OUEwXHhCOVpceEM5XHhCNFx4RjQ6XHhDMlx4QzIuXHgxMkBCXHhDNVx4RDBtXHhEOFx4RTBxXHg5MFx4MEInSVxHXHhBMlx4QUEqXHgxN1x4QjhPXHgxQ1x4RkJceDAxSVNdXHg5M1x4QjlceEIxO1x4QURceDFCXHgwN1x4RDFceEVFXHhCMEZ4TXhceDk4XHhFOSEnXHg5N1x4MTZceDE3dygyXHhGMFx4OTU0XHhFOVx4MDJceDk1dFx4MENVVFx4Q0ZceDExalx4Q0RceDg4Vlx4QUVceDA2Llx4MEFceDE5XHhDRlFceDhGXHgwRlx4OEN6XHhBNVx4QTNceEZCL3xceDg1XHhGQlx4MDlceEU1XHhGMlx4MEVceEYwXHhDMWhceEE0XHhDQ1x4QzZceEFDXHhGNVx4REFtXHhCNFx4MDBceDA0XHg5MVx4QTRGXHhCMVx4OUZceEJBXHgwQ1x4RkZceEREXHg4QVx4Q0FceERCc1x4MUVRXHhENVx4OUIjXHhERlx4MTJceDg1XHgxNlx4MDBceDg5XHhBN1x4RDVceEM4Plx4RUZceEMwXHhGOFx4RkRvXHhFQ0p1OVx4MTFceEJEXHg5MHRceDBEXHg4QS1ceDAzRSlkTGdceEM2JVFceDlGXHhCQlx4OUR+MFx4QjVceDk1XHhGMFx4Qjd+IVx4QTFceEVDXHhFRlx4OUErXHhDN1x4QkRceDkwQlx4QTVjXHgwOFx4MDhceEZCXHhGNVx4OThceEU1XHhGMVx4RkVceEZDXHgxMX5IXHhEM1x4MTZ7XHhEQVx4RTVVJmRceEM5O1x4RTUoXHhFNTlaU1x4RDJwYVx4Q0NceEI1bCdUXHhFN3RceENGXHhGM2tceEIwXHgxQlx4OThceEFBXHg4RFx4QzlZXHhEOFx4RjFceDk3XHhGMChLOWhdcVx4QUFceEVBIHJceEFEO2BceEQwXVx4OTFceERCXHhFNElceEVFXHhDQi5IXHhGN1x4RDR1XHhCMlx4REQ8NmFRXHhCRVx4RjRceEUxIlx4Q0JceDhDXHg5OFx4MDNceEI1XHhDRFx4MENceDA1XHg5OFx4QkZceEMyXHhDNlx4OTFceDBCXHhEOFx4QTl6XHhENVx4MEEwXHhCN1x4QzlceEVDXHgwRFx4ODR0XHhCRUlceEU2XHhFRVx4QUZXQWlcXHhENlx4QzNceEI5XHg5NVx4RDBceEQzfFx4MEVceEJBO1x4MDlweFlvXHg5Qlx4MUZceEVGXHhBRFx4QzlceDFDRVx4QUVqIkpHXHhENUdceDkwXHg4QVx4ODVceEFDXHhFRlx4ODU0XHgxRFx4RThYXHhGMFx4MTNceDlFXHhGNlZCTFx4OTZceDk2XHgxNlx4Q0FceDAzNEBceEJBXHhGNVx4MEZceERBaXlxXHgwM1x4RDBceEFGXHhEN1JceEQwXHhENVx4MDFceENGXHg5M1x4OUJUYVx4OTRceEUzXHhDNzVceEJFXHgwRlx4QkZJXHhDQVx4Q0JceDFGXHhCM0FeM1x4QTJceDE4XHhENVx4MTlKXHhEQ3d1XHhCRHNceEFCNVx4MEJceEY0XHhGQk5ceEMzXHg4QyVceDBDbFx4MUE5XHhERVEnWFx4OTNceENGXHhEQ3x+XHhDNlx4RkU0XHg5OFx4ODRceEQzXHgxNVx4MEJceEY0XHhEQUFceDgxXHg4QVx4MTBceEE5XHhBQidceDA1XHhGNlx4REUiU1x4ODRceDk1OUtPXHhCNFx4RUNceEIxeFx4ODg2XHgxNlx4MDVaSlx4OTlceDE1XHhFQlx4OUZ4XHhCN1x4RDlceDE5T1x4RTJoYlx4MTZhNmpdXHgwNDNceEUwVH5ceDgyXHhFRlx4OEFceEFCXHg4MFx4MEMxXHg5OUlceEZBUzBPIlx4QjZceDg4XHhGRDhceEZDXHgxRlx4OUJceDg2XHhFOVx4ODNceENCT1x4QjFceDA5XHhEQlx4ODhceDk1eypceEU4Vlx4RDJcXHg5NXFceEQzXHgwQmxceEVGMC9ceEVEclx4REE+XHhBNVx4QzhceENCfWs8XHgxQlx4RkNceEEyXHhDRFx4Q0VceDk4RVx4MTVceDE5XHgxQVx4QTlceEE2XHhDRGxceDkxXHhEMFx4MUFceERDXHhBM1x4OUFceEU4X1x4RjV7XHg5NFwmSFx4ODlceEIyYFx4REZhXHhERmRceEIyNChceDhFXHgwRVx4QTdAXHgwMDFceEYydVx4OUVceDk3XHhBMVx4ODBceEMwRzNceEVDeFx4MTZMdCJyXHgwRVx4RjFceEIyOD9ceEE4XHhEOWRceDhGXHg4QVx4QkFvXHgwNiVceDFFUFx4RTlceEI3XHhGRVx4RTdceEZCXHgxMFx4MTAvXHgwQ1x4REFceDAwfFx4RkVWVSRceDhDXHhBOVx4QzhceEMyXHhDNVx4QUVceEY5blx4ODJceEI4SVtceDhCXHhCQlx4QzFceDgyIX06M1x4MDZceDg5VUtceEIyXHhDRHlZXHg5Qlx4Q0FceDg2XHg5RFx4QTZbTFx4ODlceDAxXHhCQlx4QjFbXHhFRFx4MDJceEQ1XHhBOFx4QUYlXHhGM1x4RUFceENFXHgxOGxceEM0XHgxQmJceENFXHhEQ1x4REM8e09fXHg4MkJceDAyXHhGRVx4QTNceDEwXHhBRlx4MTZrXHhGQj5ceEU4XHhGNFBhXHg5NVx4QzVyXHhDQ3t0YDRceDlEXHhBQ3RceEU0XHhGRiNZcVx4RkVceEQ3Y1x4REJGQlx4MThceEVCXHhBRlx4Q0VXK1x4RDBceEM4XHhDNERZT1x4ODVceDE0KVx4OEZceDE4XHhGM1x4QzZjT1x4QUFceEEwb2hceEM4XHg5RVx4OEZceEJFXHg5M1x4RjJceDk5clx4MDVceEJEXHg5MVx4OUZceEJCY1x4QzJceEYxRTVceEMycFx4Q0VceEZFXHg4Rlx4QTJceEM2XHhEN1x4RjVfOlx4QkFceDhCXHhGMlx4RDJceEEyME1ceEZCZ29rW1x4ODFQbVx4OENceEVGXHhGRntceDA5c3NceEQxXHhBRlx4OENOXHhCM0JceDg3Olx4RTFceEUzMVx4Q0JceEIwXHhGRUNceEJEXHgxNFx4QzdceENCXHhFM1x4RTJgXHhGMlx4RUVceDlGXHhCRlx4OEFceDk0XHgwNmwuXHg5NVx4RTlceDhCXHg5QXJceEUzVVx4Q0NRXHgxOVx4QjdbXHg5OUwxXHhGRFx4RDJcXHgwRllceEYxXHg4MFx4MTdmXHgwRFx4OTR5Y1x4RkRcXHhGQ1x4RTdceEUyMFx4RENceDg4XHg4RFx4RjVceEJFXHhGMyRceEY1XHgwRVx4OEZceEE3TURceEM1fVx4RjJceEQwSVx4RUFceEREXHg5Q1x4OTFceEY0XHhCQ2JceDFCRDR7XHhFN11ceEI1QkFceENGXHgxNFx4OTBceDA2XHg4NFx4MDFceDAzXHhDQlx4ODhceDEzXHg4M1x4MTlIXHhFQmlPXHhCQ1x4QTdceDlCXHhEN1x4OTI2KTRgRmBuQ1FceEZEXHhCNjhceDhFXHhCM1x4ODBceDE5XHgxQlx4RjVqbVx4RjQvXHhEOFFceEM1XHgxRVx4OUJceEZBQVx4RDdceEU2ZFx4QzNceEZEXHg4Qlx4QTlceDhBV1x4QkFceEE2VXVceEY3bSBjV1x4QUVbXHgwOFx4RUJceEYwXlx4RkRceEVBd1x4RDBceDk5dlx4RjBcXHhBNVx4QThjalx4MTVceEVBbVx4MTZceEJEXHhEN1hceDBDXHhCM1x4Q0FceDg5XHhBMFx4QUZPeGBceEEyXHhCQytceEU5XHg5Nlx4QzFceEQ2XHg4M2RsPlx4ODZuXHg3RlFceDkyKlx4OUJceEZCXHhDMCVEXHgwOF9ceEU1XHhFM1x4OTRcXHhGQlx4QTRsXHgwMlx4RUUqe1x4OEJceDE1XHg5QzFceEMycFx4MDBceEM0XHhDMzFceEQ1XHgwMFx4MDlceEY4XHgxRFx4QjNceEZFXHhENWBceEMyXHgwNFx4REVceEExXHg4MlZ+XHhGRlx4RDBceEZFXE9ceEIxXHhFMVx4OENceEE1XHgwOFx4MTdceDkwXHhGOFx4RDdceERGXHhGRVx4RjltXHhERVx4QzFceERGXHhGMVx4ODZJXHhCNUBceEQyXHg5M19ceEQ1LFx4QzVceEJBXHg4NFx4REJceDFGXHgxNlx4OUYxXHg3Rlx4REVnXHhBNVx4RkY0XHgxMSx8Ulx4QzZcXHhDOVx4MDhceEU4QFx4QUZceDAxXHhBQyxceDlGVExILnxceEJDXHg4N1x4QUVSKiJmXHhEN1x4QjhceEQ4XHhENlx4MTgiJmRceEQ2XHhCNlx4QUZceERCWFx4QUJceEEzaiFceEJGKVx4QzBceDA1PVx4QjBuXHgxOSpceEQ3Q1x4RTRhXHg4MjA7IVx4RTdceDk3XHg4Mlx4ODhceDk4XHgwM1x4REZceDlCXHhGRVx4QzJceDEzXHgxOS5ceDkwXHhCRHNceDlCV0V6XHhCOVx4MENceENGXHhDQVx4RkFfXHhFQUE8XHhCQik4XHhEQ1x4QTVUXHgxNFx4ODdceEJDRWxceEQ2XHhEMVx4RkRYXHhEQmxceENGXHhBMiBceEVDXHhDM1x4RUFceDlEXHhFM1x4QzZceEQ1XHg4N0RceDA5XHgxQVx4OTNdYlx4MUMyXHhDOVx4OERceDg2dVx4ODRceEQyeVx4QzFcaFx4MTNceDgxXHhGQ1x4RjJCV1x4QTgwMVx4RURceEE0XHhFRVx4ODRyeVx4QkVceEM3XHgxOV4+NVx4RjZceEFGXHhGMVx4Q0FcZFx4RkFgXHhEND1OXHhBQ1x4RDRzXHg4OS54XHhEQVx4RTlceDA3XHhCMVJceDFFXHhCMlx4OUZKXHhDNTZhe3soXHgxNmZBXHg4RVx4RjFceEZCXHhFRFx4QzFceEM4UFx4ODBceDE1bVx4QjlceEFCXHg5Qlx4RjdzPTJceDEyXHhDNFx4OEVceDgyVUZceDhCXHhEOTtlXHhENlx4Q0VceEI4XHhFNFx4MDMzXHhCNVx4RjlceEY3XHg5Q1x4RjdceEY2XHhFMVx4MDl3XHhFNlx4RUNceEFGQFx4ODk5JUUmXHhBMFx4OUFceEUwXHhCRlx4QjRceDBCXHg5N0B1MXZceDgwXHhERWZceEE4XHhBNStsJlx4OTZceEI1XHhDM1x4RjlceENBXHhFQ1x4RDlFXHhEOFx4MENceENBXHg4N3hceEYwXHg5MzhNXHhCMVx4OTBXJSJceERBXHhEOHZ9XHhEQVxYY1RceEEzXHgxN1x4RjlceDdGemlceEJBXHhEQWo8XHhGN1x4RkJceDAzXHgwRVx4QzJceEFGS0tgXHhBMFpceEEwVVx4MDBceEQyZ1x4MENceERFXHg5MVx4MDBceDhGXHgwN1x4OUVoXHhEMmBceDg1d1x4MDZceEE5QDhceENBXHhBM3xceDBFXHhCMlx4RkZceERFWVx4QzUzXHhCOTJceDExXVx4QjFceEQ2Plx4RTR9XHg5RVIyXHgwNFx4RjlceDBCXHg4MSJceEUwJVx4OThceEE2clx4RjlceDkyXHhDNVx4RjVceEJFflx4OURceEQ4XHhDQ1x4ODNceEFGXHhEMFx4ODlceEFGXHhDMFx4QUNceEU4LWVceEM4XHhGNFx4OEVpP1x4QTFKXHg4NkNceEU0bCc0O1x4ODAoXHgxMlx4OUZceEQ0XHgwNXEgXHhFQ1x4MTZiXHhBMjxceERBXHhCNCYgJChceDlEXHhGN1x4QUMzW2JccSZKXHhENFx4RURceEI4XHhDN1x4MDNceDBBZ1x4QkRjXHg4Rlx4MEJceEE0NEU2XHhEMzAgXHgxN1x4MDdceEUyXHhGQlx4RTJceDExXHgxRFx4RDR8XHhCQVx4RTRceEYzXFx4OUZyXHhBRVx4Q0ZceEQwIVJceDgwT1x4RTdceEUwb1x4RkZceEJCXHhDQTNceDFGXHgwN1x4MDIiRzdceDkyXHhBQm1ceEQ4XHhBMFx4N0ZceDlFXHhCQVx4ODJceEM2XHg4Mlx4OERceEFFYDtceDgyXHhCOFx4RUZceDk5OVx4RDhceEM5KUdceEI0XHg4NlVDXHhENFx4RDE+XHhCMFx4RDRYMVx4MDZceDFGXHhFMFx4QzlceDg1XHg4RFx4ODIhXHhERVx4QzdceEIxNlx4OTBceERCXHhFQlRceEEzLUVceDhENVx4QkVceEQyXHg4Mlx4QTNceEYxO1tceEJDXHhCQUdceEFETVlceEZBXHhEQlx4MDVceEI2cy9ceDhBXHhGNlx4RERceEEzXHgwQlx4QUVceEMzXHg5RVx4RjdcXHhFMVdceEQzXHgxM1x4RkVceDA2XHhENlx4MTlceEY5IFx4QzdceEQyXHg5RXBceEE0Wlx4RjZceEJBXHhFMFVceEYyXHg4MFx4RUFceERFXHhENVx4RTU8XHhGOVx4MTRceEZGXHhGOSNceEE2XHhEMFx4RTlceEQ0XHg4Qlx4MDdceEUxXHhGMVx4QUQrb1x4QkVsXHhCOSNceEI1XHhDNFx4QjdcXHhGM044XHhFN0ZceEYwXHg4MGVceEQ4UipceEU0XHgwNVx4RThuXFx4OTZceEM2XHhFMlx4MTJceDgwI2ZceDhEXHhCMlx4MTZaXHgxN1x4RkUqXHg4NVx4QjdceEQxJDF6XHg5Nlx4MEFceEVDXHhDMTpceDlDP1x4MDVceEM5XHg5Q1x4RTVCXHhFMVx4QkFceEVELFx4QjRceEVGXHhGQ1x4MDRceEY5XHgxNm5ceEUxT1x4RTBTXHgxQl98XHg5M1x4OTNeOTVceERCY1x4RTJ6MVx4RkJceEJGXHg5NFx4MDRceEIyXHgwMVx4MDdceDk5XHhEQlx4QURceENEIm9ceDBCeFx4OUZceEM0XHhCOVx4QTVLXHhDNVx4QkRceEI4b1x4RDBceDA4XFlqX1x4OTVceERFalx4QzdceDEyVlx4RjlaXHhDOEEqXHhDN1RceEE5XHgwOFx4MTRceEMzXHhCNlx4RkZceEU2XHhBOVx4MDNdc1x4Q0NoQU1ceDgzXHgwMVx4QkNcTlZceEE4J1x4QzBceDlEXHgxQ1x4MThhXHgxNDpceENCW1x4ODRJXHg4MSFceDhGXHhBND40XHhBODZceERDXHhEMnFceEFDXHg4M1xceDBEXHg5N0lceEQ2XVx4OERceEU4XHg5NjBzVmNKXHg4NVhceEVBXHg4NVx4Q0FceEQyYlx4Q0NceERFXHg5QVx4QTFfXHg5M05ceEZGXHhCMy9ceEMyblx4OTNceDkwIVx4MTZceDBFXHhCNUlceEE4XHgwQ1x4QzlceDA5XHgwRVlceEVFXHg5NDt8XHhCQVx4MDVceDFCSFx4RDlFO1x4REFqalx4ODQ6XHg4QjhceDFCSlx4MEUjXHgwRF5ceEZEdlx4RkEyXHhFMVx4RDZceEREXHhDQTY2XHhCQWZaM1x4OTVceEU2RXZceEVCXHgxNVx4RTZceDFCSDRceEE4QFx4ODFceDg5XHhDQ1x4RDVceEJFXHgwRFx4MEFNXHhCOFx4ODZceEVGXHhCRG5XXHg4OFx4MUFFXHg4RVx4ODFceDdGXHgwQiNceERBXHhEQlQwXHhFNm0lXHgxNlx4MEZceEZGXHhBM1x4MTJbYWs1XHhDMi1ceEU1I1x4MUJceDk1XHhGOERceEVFcD5ceENCXHgxNld+XHhEOFx4Q0U7XHg5Rlx4RUF7LFx4QTZceEQzblx4OTNzXHhDQ1x4OUQzXHgwQ1x4QkFceEQwXHhFNFx4MDZ0XHgwMlNceEYwfVx4RDlxJ1JceDlBXHhGRVx4QzRdYFx4MURceDhCXHhEQW5XXndceDE4XHhEOVx4OUJZS1x4RjdOTSRceDlDd1x4RTM0KVx4OThceENDXHg5RFx4QTdceENBXHhGNVx4OUNwXHhCMVx4ODRRXHg4Nlx4OUVkXHhCN2RTXHg5Rlx4ODJceEI3OiRxXHhEQVx4ODhscVx4RTBRXHhGRVx4QjduXHg4OF1ceEYyXHhDNjZceEVDQlx4OENhbWZceEM3fFx4ODNceDA3U1x4MTlceEM1XHhDN1x4MDJceEUwPlx4RUQkXFx4MDdceEFFXHhCNShceEU4XHg4Mlp7XHgwMXRceDE3XHgwQ1x4Q0FceEM2XHg5M1x4MTdoXHhFOFhceEJCXHgxMD9ceDhDXHg4Rlx4QzQlXHhFQ3hEXHhGM1x4MUVceDBBXHgxNFx4OTZceEJCXHhGRFx4OTVceDAzXHg4RVx4RTVceEE1JGxceERFXHg5NVx4RjdceEZBM1EjXHhDN1x4QzVceEJCXHhGN1x4OTdnXHhDN35ceDAyXHgwOTNceDhCR1x4QUJcKGInXHhFRVx4OUFvJSNceEU2XHhBQlx4QURceDhCXHhCNFx4ODUqXHhFQ1x4RUFceEFFXHhBMlx4MUJceEY4XHg5RFx4REZceDk2XHhEOFx4QzJSXHgxN1x4MTFceERCXHhDNz0nLlx4MTlceEY2XHgxQ1VTXHhDRVx4MDFceEVBXHhCNmZ1XHhCNlx4OENceEMzXHgxMVx4Q0FceEFCUFx4QzJceEI4WlhceEREXHhCOFx4RDFBXHhCNVx4QTlceDBBXHhFNFx4OUFceDBEQFx4ODJRflx4RkMzXHhBMlx4MEUgXHhDRVx4QzJceDhDXHg4M1x4RkRceEYyXHgwQlx4OEJ7XHgwN1x4MThceEMxXHhFNFwvXHhBOFx4QTdceEY5PVx4MDhceEQ0TVx4QkNkcHVceERGUlx4MDBZXHgwRkBceENGXHhCOVx4OTNSZVx4RTlceENEXHgwRVx4RTcuXHhGM1x4RDE9XHhDNnBiXHgwNDZTVCxPOEZRXHhCQlx4QkJceDlCYFx4OTlceEI3XHg4NSZceDhDQFx4QkVceEEzXHhEOFx4MEJceEE3Ilx4RDFLXHhEMVx4MUZceEIyXHg5N1x4QjFLXHgxN1x4OUNfXHgxRnJGXlx4OEFceEM1XHgwRlx4RTdceDE4PFx4MDE/dlx4MDFceEExb0FceEE0XHhCMFx4OURzP1x4ODA7UVlceEVGXHg3Rlx4RkNceDFCXHhEOVx4RDdceDk3XHhDRlx4MDZceDAyZS1ceENDWSBceEZFXHhGQ1x4QzJwXHhGMFlceEFGXHg5N1x4QjVceEYyW1x4RjNceEZCXHhBRGhceDFEXHgxQVx4RTRceDAwXHhGMVx4MTc/XHg4NFx4RDc/XHg5OVA0XHgwMFx4RTBceDk0XHhENVx4RkRKXHhDMGlceEM5XHhGNVx4MTFFelx4QzBOaTtceEU0SVpceEY3XHg4M1x4OUVZXHhCMi1ceEQ4JVx4RTJceEQxXHhBMVx4Qjc+XHgxM1x4MDNceEM0QCNceEIyXHhCOFx4MEJceDgzXHhFRlx4MTRceEUzPDxvaSZceEFBdFx4MTdceDhGXHhFNlx4QUFceEU4NVx4QjZQXHg5Q1x4RkRmI1tceEIxXHgxN1x4ODIsXHhFRVx4QkRceEQ0XHhDRVx4ODJceEMwXHg4OVx4RTVLXHgxQ1x4QjdceEE2Plx4OURBQlx4MThceEQ5aFx4ODhwXHgxRFx4RDdceDkzXHhCNlx4QUZceEM2XHhDMVx4MDNceEM4Z1x4MTBte1x4MTg6J1x4QkFjXHhGQS5ceEM2WUJgXHgwNlx4QkZoXHhCNTpceEU0XHhCNiRceEJCXHgxMlx4QjNceEM4XHhDNFx4MTdMXHg5Q1x4QzlceEJCXHg5QnJpXHhBQVx4MEVceEUyQ1x4OEVceDlFMVx4MDVceEVFRVx4OUFgXHg4MFx4MUFAXHhDQzBpXHhCRVx4OUFceDlBKiZceDhCXHgwRVx4Q0NvX31gK1x4MTFceDFEXHgxQUMgXHhEOFx4RDNlXHhFNlx4QzdceEVBXHgxOTNAXHgwRiZceDhBXHhENVx4RUVceDE0bmZceEVDXHhFQlx4QTBceDE3XHg4N1x4QzBceEJGXHgxRllceEY2XHgxOVx4RjhceEM1JmNceEJCXHg5RXBRKFx4MUU9XHhEQlx4RjFceEExSVVceEZBY1x4MDEoXHhFRjB2Zlx4OTdceEI0XHhEOFxjYVx4Q0RceENGXHg4MVx4ODc0XHg4RkNceDg3Zj5VXHgwNXVceDk2XHhCQU5yXHhBNyA9RVx4RTNceEE2XHhGMFx4ODRlXHhFOFx4MDBceDk1XHg5QVx4RjhceEI5PVx4REVceENFcFx4QUR0XHhEMVx4MURceEI4XHgxQVx4OEJ2XHhGOFx4RjVrN001XHhDN1x4QzNceEMwT1x4QTdtcFx4QzhceEZDXHgwRFx4QkZceEJBXHhCRVx4ODRceEYwQVRceEEwXHg4QVx4QUJceDE1cC4veHpGJnVceEE0XHhGRFx4OUZceEIyXHg5MFx4RjlceDFGY1x4QUFtXHhEM05ceEVGN1x4MEFBSlx4QzNceEIyXHhGNVx4Q0RceEVCXHhDMlx4MUJceDk1XHhGN1x4MTh7XHhEMXhceEI0XHhDM309XHg5OFx4RjdceDE1XHhGMTB8XHhFQ1x4RTJceDkxXHg5OFx4QURceEYyXHg5OFx4OEJ5cFx4MDhceEQxXHhDMFx4RDVceDdGXHhBOSZceEMzXHhBNy1sZlx4QkJceEI3XHhEM1x4MERceDE1TVx4MTRLZlx4OURAXHhDQylceERGXHhDNlx4QkVceDA2XHg5MFx4REZceEM3W1x4RDVceEQ4QFx4QzVceDg2XHhCRlx4RUVceEIyXHhERFx4RjRceDk1XHhBMiJVXHhGN1x4N0ZceDlGJlx4QzR0XFx4RjUvXHg4N1x4QkFceEE5XHhFMi5ceDFBMndceEU2XHg4QVx4ODV3XHhGRntceDgyXHhDMlx4Qjd1Qlx4MDBceEQ5Qlx4REJceERBXHhGOFc2XHhGOFx4MTRceEI1XHgxRFx4QTNRZjtceDg2XHhCQ1x4QzNceDg4Ylx4RTNOXHhDRVx4QzQsXHhGNlx4OTRceEJEUlx4RkZceEU1XHhBMjVceEQyXHhERlFceDEzTVx4MDR5WFx4QTRceDExXHhERV1ceDE1VVx4RURceEYxbFx4REZceDhDXHhGMVx4QUNceENDclx4RERIXHg5RVx4RjJceEU1WVx4OUZceEUyXHhFN1x4ODdceEZGXHg5RVx4QUZceERDXHhBNDRceDFCXHhDOFx4RUFgXHgwRDVEXHg4MixceDgwXHg5Nlx4OTBceEJCbSxceDE5XHhDNXdNdFx4RkVceEY3XHhFOFx4QkQhXHhFMn0uXHhEMUBceEZDK1x4Q0JceEFCXHgwOShOXHhDQUhceEIwXHhFRlx4QUNceEYyXHhBN1x4RTVoXHhCMTtceEI3Slx4RDJceEQxSnZqXHhDRlx4RTVceEE2XHhCRlx4QTZceDk0XHhDQkl5XHgwMFx4OTlceDhGcCxceEQ2XHgxNVx4OEVceDgwXHhENlx4OUFFXHg4NCZceEIwOCkwYlx4QTM0XHhBN1x4ODMgXHhBM05ceENGXHg4OFx4QTdYXHg5QVx4QTZceDlGV1x4RTVceDhDKFx4QkNUWFxceEE5XHgxQz1ceDlEXHhFMlx4OTNceDg3XHg5M1x4MUJceEI3Jm8+XHhDNlx4Q0JceDg4dlx4REJgXHhFM1x4RUNUVFx4ODBGNlx4QzlceEMyXHhGOCNceEJDXHgxM1x4QUFme3VceDkzV0dMXHgxRVx4OERceEVCXHgwQ1x4QTB6b1x4QkJceDhCXHhCNlx4ODZceEVFLlx4QUMvXHhEMlx4OUFceEYwX1x4RUZceDEyXHg5MVx4RjFUXHg5N01PXHhBRClceDBEXHgxRFx4QjVceEYyJlx4OTBceEVFdlx4MTlwXHhENlx4MUJWblx4MDRceDFFMDlceEJBYUd+ZFx4OTcjXHhBNi5ceEE4XHgwOUJtX1xiXHhENlx4MTJceEM3XHg4RFx4OUNceDlFXHhEM1x4MEFjXHg5QVRceDg4Ry4/W1x4RTJceDE0XHhCMlhceEY0XHgxOFJceEI3XHhENVx4ODZceEI3XHg3RiVceDEyXHhGRFx4QTNceEMxPDhceDE1XHhERVx4OUNceDA5OC9ceEY2b1x4QjI+XHhCQ1x4OENQXHhGNS9sT2VceEE1XHgwQlx4QkR3XHhFN1x4RDZceENGXHhBMVA+cFV4SFx4RkJceDlFX1x4RDJdXHhBRVx4MENceDA5OGBceDlCXHg5Rlx4REFAOlx4RjQielx4REEtZFx4RTRBXHhDQlx4MUR0XHhGRFx4ODB1PFx4Q0JHXHhCNVx4RjYzeVx4RDJceENEXHhFNFx4QThiXHhDQ11TSFx4RjgkXHg4RDhceDFDXHhDQlx4MEVceDk5XHgxN1x4ODRdXHg5MVx4RjcjXHhCOVx4RjBBXHhDOVx4OEJlYlx4RjNceEZDLlx4RTdceDlEdlx4OUFceDk5XHhENVlMXHhEMVx4QjNceEJGXHhFRVx4RDkwXHhGN1x4ODFceEVFXHg4QTk3blx4RTRceEYza1VceDE4XHhFQlx4RjdceDgzNFx4OEZxXHhCQSpceEMyXHgxNlQ6XHhCNCNceEY1XHhFMlx4RDRceDAxK1x4RkFceEEzSVx4OTFceENEbzlceEZCKVx4Q0JceENDXHhEN1x4RDBHTlx4RjhceEU0XHgxN1x4RjBceDk5Q31ceDFFXHg5M088XHgwQ1x4ODBceEUyXFx4MDAtIlx4QzRceEI5W1x4RUZceEYzXHhBN3szXHhGM1x4QjJceDBCXFx4RkV8XHgxNlx4MTJceEIwXHgxQTJ2XHhCRVx4RDhceEM1XHhFM1x4MUJceDBCXHgwOU1ceEFBXHhDRlx4QzlceEUyflx4QTVOXHhEQlx4MURceEQxXHg3RlZceEIwJlx4QzNceDEzdlx4MTdceEFBXHhDRShceDBFXHg5N1x4REM/XHhBRFx4OTlceDAwUlx4MDNceEVDXHhCM1RAelx4QkVceEVBI1RceEEzKSpceEU3SVxceDk3XHhBNG9ceDk3XHg4Q1x4RkFceDEzXHg4MVx4RjZceDgxXHhEMFx4REQ0XHg5QzA1XHgxQ1B5XHhCNlx4QjJceDE2XHg5M1x4OTVceDlBXHhFMFx4OUNceEI4XHhDN1x4RTBceEIzXHhFNSlceEExXHhGRFBceDkzXHhCMTRyQVx4RThceEUyXHgxQlx4QkFceEZBT1x4RUJ3JDVwXHhDQmdceEUzXHhGRVx4OTdceEJBXHgxQk1mUlx4QURNV3ZceEJDXHgxMVx4QTdyXHhGOFx4RTdceEEwVntceEEwSVx4ODF4XHhFRjlceDhEXHg4Rlx4RTQ3aVx4QzlceDFCflx4RjNceEJBXHhEMVx4MDJceEU4aihceERCVFx4QjBQXHg5NDVceEJGfVx4RERceEI5XHhDNVx4QjRSO1x4QkJceDkyXHhERHpceDkwXHhCOVx4ODJwXHg4Rlx4RDVceEZDWltceDEwXHgwM05CIVx4RjJceDA2XHhCM1x4MDRceDE1XHhCNlx4MUJceDA3eVx4N0ZceDAwXHhDN1x4RDdXXHg4NHZceERDZVx4RTFbXHhGOFx4QTlceEMyXHg4N1xceEY3XHhERDpceEVFV1x4RDB1XHhFOC9ceDkyLX1ceDhBLFx4MEMhOFx4RDBceEVCLjNceEI4XHgxNFx4QTVoY3hceDlCXHg5RFx4QURceDgzXHg5OEwoY1x4QjVceDE1XHgxQnZceEY4flx4ODdKd1x4QjNceDlCRlx4RjElXHhGOVVSXHhBOFx4RDI3XHhFMTFceEM5XHg4NClceEFFXHg4RFx4OERJfC9ceDAyXHg4Q1x4MTkpXHgwOXlceEVGXHhGN1x4RTFceEQwXHhCNlx4OTQkXHg4NmBceEMyXHhERlx4QzBceDBCXHg5NFx4N0ZceDBDXHg4OVx4OTk2L1x4QzRceDgyXmBceDg4XHg5RXZQcFx4QUQoXHAwXHhGQVZceDk3MUlceERGeFFceDg5XHhFRXFceDExXHhFMFpfXHgxQ1x4MDktXHg5NywiXHhCMEIrfFx4ODRceDBFXHgxNmFceEZEXHg4Q1x4ODdceEE0XHhDMjtceEQ3XHgwQlx4MTJceEM3XHg4MFx4RjREI1AgXHhFRlx4QTY5XHhCQ1x4Q0JGJVx4RkFIXHhCM1x4RDRceEJBXHhENVx4QjNceDgwVkBceEYxXHhFNG9ceEI1XHgxNlx4QkFceEY0XHhDQlx4Q0JceDBEXHhFNVx4QjNfXHhFRVxhaj5ceEQyIDZceDBEe1x4QTJceEZGXHgxNDg2XHg4N1x4RDg7XHhGRlx4RTIwXHhGMVx4QzUhTEVceEE1T1x4ODBceEM4XHhEMVx4RDNceEJEXHg4M1x4OTVceERFXHhEMVx4MTNceDAzW1x4QTguXHg5Nlx4MUNceDg4XHhFMlx4ODRceEVEXHhBNFtceEM5XHgwQVx4OTdCXHg5Q31ceEE1bkMqXHhENitceDhDYVx4OUVceEQ5XHhFMWghXHgwOW9zXHhBMVx4MEUqXHhENVx4QTdceDA3XHhDNlxceEUwXHg5NFx4RjElXHhEOVx4N0ZceDFFSVx4MTFceDk3S1x4REJceEQyPmhceDFFWnZceDg1XHhEM29ceDg0XHhGQlx4RDJceEUzXHgwRCtceEYwXHgwNFx4RERceEVCLVx4ODRceEQ2XHhFQ3snSlx4QURceDgxXHhDOFx4MUIlX1x4Q0RaU1x4QTlceEJEXHhDNW4qXHhDMVx4MTdeXHhCQSBceDhGXHg5N35ceEQ0XHhGQS5ceEFGVFx4QTdceDAwMVx4MTZIcFx4RkVceDhDXHgwN1x4OENceEU5XHhGOXdceDAzOlx4QUFceDA1Ulx4RkFRXHg5OFx4RkZqXHgwMVx4RUNceEQ5XHg5Q1x4QkZceERDXHhGNlx4RjhceERFXHhBMkFceEQwT1x4QTJceEIyXHhEOEZceEEwXHhGM294XHhCNFx4RTdceDBCaVx4Q0JceDBGXHhFQ1x4RTVceEE0XHhBMGhceEJCXHhGMlx4RDIwXHhBM2NSR1x4ODhceEYzXHhFMVx4QTZceDk2XHg4NU9ceEQzXHhGRVx4REFceEI4LVx4RTRceEQzXHhBOFx4MDZceDFBfmtceEY2XHhCRVx4MThceDBFXHg5QjhiXHhCNG5UUlx4MDBceERBXHgwNFx4RERceENGXHhDQVx4N0ZceEEyLlx4OTNceDkwXHhFMSRceDhDXHhCQlx4Qjk5XHhDNlx4QjFceERBXHgxMVx4QTA7XHg5OVx4RTVBXHhDOW9ceEFCLlx4OEVceEQxXHgwN1x4OURceDhBNFx4QTRceEU2XHgxM1x4QUVceEQwXHhCQTdceDk0P1x4MThceEJCXHhGM3dkXHg5RG5ceEVGXHgwQlx4QjBceDBEalx4RUNhQltdXHhFMlx4RUVceEUwXHgxQlx4OUFceEUzXHhFMCQrXHhFM1x4RUI6XHhBQlx4MDVycDEsXFx4QTZceENDXHgxRVx4RDdceEM5XHgwQSBoXHhFN1x4QkJ4J1x4MTFceEVBXHgxNy1ceDgxRmhceDdGXHhENFx4RUF9XHgxOGpceEQyXHhGQVx4RjhTZVx4QjhceEJBblx4OTVceEExeFx4QTU7XHhDMCpceEQzSlx4QTJOXHgwRVx4RjZceEExXHhGRlx4QTR7U1x4Q0ZceEEwRD9ceDhEXHhCNT9vJz5iXHgwRFx4OTRceDk4XHg5RFx4MDRceEE3XHhFRFx4MUZceEEyXHg3RlNceERFXHhDNFx4RDRceEMzMEVceEI2a1x4REZceENCXHhBNHZceEI4XHhFQlx4RUJceEZDXHg4NFx4MTJ5N1x4RTNEXHhGNVx4OUFceEJBJVx4RUZceEVEXHhFQ1x4QkJceENCXHgwQlx4RjNceEQ2PVx4MEJ6XHg5RGFceEY3XHg5MVx4MDhceEQ3cFx4RTNceENEXHgxRFx4RUIlXHhDNnRceEM2XHg5RVx4OUNoXHg5OFx4ODA4flx4OTRceEFFXHhDNy9ZKkZceDE4NURceEFDXHhCRG0+XHhEQVx4MEVmXHg5NzFAXHhERWQgXypceEVBXHhGOFx4RjVceEJCXHgwQ0ZYfnVceEM1XHhCQ3xceDFDdFcsYVNceEJBVFx4QTQhXHhFNVx4RjFPXHhFOFx4QTAwZ1x4RURceEJDSVx4ODVcXHhCM1x4MDVxXHhBOVx4REVceEUzPHhceEI4J1x4QkQ1flx4QkFceEZEXHhERFx4OTNceEM3XHhGRlJRXHgxM1x4REJceEM4XHhDQVx4RjQ1XHhBQVx4QTVceEZFY3NceEU1XHhFOFx4MDlceDkyXHhBNlx4MUZmXHhFOFx4RjFceDlCXHhENlFceDk5Nlx4MDB0e1x4MDZ9XHhGOWdceEJBXHhGNClceEEydlx4RjBceDBCXHhFNlx4QUF0XHgwQ1x4QjBdXHhGMFx4ODNceDlGXHhDOVx4RTRceERGJVx4RDJceEIzXHgwNVx4MEEpXHg5Rlx4QTlceENGIjIxaVx4REZlaFx4OTFceDEzXHgxRXVceEYyPVx4QjdceDk4VkhceEFEXHhENVx4ODlceEEwXHhEQm1zWFx4RUVceDgyIFx4QUVLXHhGMFx4RTRceEM5XHhFRi1ceDFGXHhGRFx4RjBnXHhDNTttXHg4M1x4QTlceDE2c1x4QUVceDBDWE00XHhCRFx4QkJ3ZVx4RTBceERBeGxceDg2XHhBMVx4RkEhXnBceDk4XHhCM1x4OENceDA4XHhGN1x4MEJ6XHhBRVVceDg0XHhFNmpceEZEXHg4OFZceEJGXHhGNlx4MUQ/XHhCRkxceEREXHhFRFx4ODdrW3lceERDblx4RjlceDE0YFx4OTNceDlDXHhFQj9JXHhCRFZDXHgwNFx4RkJceEUzXHgxRU1ceDgzXHhGOWcsZylceDBDUlx4QjI8XHhDM1x4Q0JdXHhENVx4MTBmXHg5N1x4OTJqX1ZceEZCalx4MERceEVBXHhEQVx4RDJceEFFXHgxRW42XHg4Q1x4QTN8XHg4NFx4RkNceEI3YCdceEU2XHgwMUJceEQ4XHg4NHJceEVGXHgwQXFceEZGXHgxN0I/Ylx4OUZmXHhGM1x4ODNceERBXHgwRlx4RUZYXHhFNUlceEYyXHgwQzlceEExclx4MEFceDlCXHhEMFx4RUFceEFGXHgwQlx4OUZceDBCXHgwRkBkXHhDRlx4OUE2XHhCQndceEQ2XHhDRFx4MTU8flx4MEFkXHgwQlx4QzhceDEwXHhBOXZceDhBXHhGQVx4OTZceEM3L1x4QjZceDgzIVx4RTNceDE0RVx4QjNceDlDXHhERFx4RjBceEREXHhCNFx4Rjh4XHg5RVx4REJceENEXHgxMTtTXHg5RCElXHhDMFx4QzBceDE1VFx4MEEwXHgwMVx4RjRKXl5tXHg4NypceEFDXHg4RFx4RjZceEM2cVx4ODZceEZEXHg5OVx4QzVceDA1MFx4QzZceEIzXHgwRFx4N0ZceEVGXHg5Qlx4MUJGQUBceEVCXHgxRlx4QUNceDE5fFNceDA0XHhBNFx4ODRceENBX1x4MTFceENFXHhFRFx4RkRVXHhBNlx4MDlceEQwXHg5OWhceEE1XHg5QlE7XHgwNERceEY5XHg5M1x4OTZceDlDb0x+XHhGNVx4MUJceDg2XHg5NSRaXHhFOVx4QTBceDEyXHhFRVx4MDhceEM3cVx4OTRceDkxXHhEMFx4QTJceDE0XHg5OFx4QTFceDFGXHhDOFx4RDNceEU3XHg5MFx4Q0ZceEZEXHg5RFx4QURceEZGXHg5M1x4ODInXHg5Mlx4OEUvXHhERFx4QjZceEI1QFx4MDBFWFx4QkNceEI5XHhFOFx4QUQuXHhENVx4RTVceDExXHg5RFx4OEVceEFDalx4QjFbXHhERVx4OUNceDgwXHgwMlx4OUZQXHhBOWItWFx4OTZceEQ0W1x4RTZceEE1aVx4Q0RfeFx4OUZceEZDXHhBMWRceEREbFx4MTVceEE3Xlx4QkZceEZFXHhFRlx4QTV3XHg5OFx4MTNceDhGdl1ceDE0XHhDRFx4MEJceDA3XHgxMXBceDk3UVx4MEZIXHhBRWhceDlCeUhceEJCXHg5NW1ceDhFXHgwM1x4RTBdenZceEIyXHhFOWlceEQxYy9ceEE1XHhGNVx4MEIjXHg4RVx4QjE8WiZoXHg3Rlx4OTFceEJCUDxWXHhCNFx4RkNKXHg4Q1x4ODJceDkzXHhGRSBceEQ0XHhEQlx4MTAmfVx4QzctXHhGQVx4QjhJd1x4RDdceDFFXHgxM1x4ODZZLzE+XHg4RGdceEQ1Ylx4RjVDXHhCRlx4RUY8XHgxRFx4QURceENCXHhDMVx4OTJceEVBXHhBMVx4RkJceEQ0J2RjXHgxMFx4OEJnXHhDNFx4OEN3XHhCM3ZzXHhCMFY4XHhEQVx4RDZceDhBXHg5M1dceEVEU1x4QjhTXHg4N1x4QTRceEVEXHhDN1x4RDVceDAyXHhEOVx4QzlceEI1XHhBRi5NNFx4OENrXHhEQmdac1x4RUNceDBBXHgxN1x4QkFceEUwXHg4QiRceDg0S1x4QTgsNVx4MDBceDAwXHhGQUNQYlY3XHgwQiBceEU4MUNRXHhCQ1x4QzZceEFBXHgxQmdceDkwU0tceDk0XHhFOFx4QTZDXHgxNlx4OUNceDgwXHg5N1x4OTFAJlx4MDBceEQ0XHgwNHBceDk1XHhDMFx4RTZceDFDXHhGQ1x4OUVceEU3XHgwQ1x4QUNyXHhBOFx4OTg0XHg5Qlx4QTRKXHg5RCNceEREbD43bFx4MTc3flx4QTY5JkxceDBGXHhFNz9ceEVBalx4ODFceDkyXHg5NFx4RDEvXHgxMExceEFDPVx4RDNceDA3XHg4MyEzXHhFMVx4OThceEFBWlx4RDVLXHhFODtTXHhFQSlceERFXHgwRTBceDE2XHg5Rlx4ODFnI15AXHhBQlx4RkFHXHg4Q1x4QjdceEE3XHhBN1x4OTVceEIxcVx4Q0YsXHhCOVNceEQwMDNceDgyXHg4OVVPNFx4ODVceERDXHhCRlx4MEYnXHhCNlx4MUNceEQwIU1sXHg4N1x4MTNceDk4XHgwOXQ5XHg3Rm9ceDBBXHgxOSc8LVx4RjhceEZDZTpGLHFceEJFNVx4MENceDkyXHhBRElceEJFXHhGM1x4RDQ+XHgxOVx4MUJceDBCXHgxQ3tceERDXHhFQUVceEQ2XHgwQlx4RTd0OVVnKVx4RTNceEVEXHg5NlBkbFx4QkJdXHgwODNceDA2XHhCOFNceDFCXHgxMlx4ODg3b11ceEQxYVx4OTVceEJFXHhCQ1x4RkNceDhCKVx4MUZceDhFUVx4RURceDBCXHgwMVx4RTVceDlEXHhCOFx4RUNceDk2XVBceENEdlx4REIsMjRceDE0JVx4RUZDXHhFMjJceDFFXHg4NVBceDk2Klx4QTJTXHhBMVx4OTVceDhDXHgxRFpmXHg5MFx4RDNceEU2XHg5OVx4QzhceDE2XHg5QW1XXHhEQ0dceDlCXHgwRFx4MDc5XHhCOVx4REE+XHhDMFx4QTg4XHg5RHhceEVCXHhGMzdceDkxXHg4MHRceERCXHhGMFx4OThKXHhGMVx4QzlceEE0MylceEZDXHg4RCNceEQ0Ylx4RDRxXHg5M1x4RTlceEM2XHhFRFx4ODQxXHg5OVkyXHhFMlx4OUZceEIwXVx4QjlceEM3XHg5RS05XHgwRT5ceDlGXHhCQihceENESlx4OUJceEU3XHhGQyBceDkzXHhBNlx4MDJceEZBXHgxMXdceDkyXHhCRCFceEFFXHgxRVx4RDBcXHhGOXdceEQwaFx4QTVceEVDXHhEOWpceEI2XHhFRlx4QkFceENCXHhBNUVceDFEXHgxQlx4QzlceEE2XHgwQjtceERFJVx4RkRmXHhFM1x4RUJceEZEXHg4OUpMXHg5OFx4MEJceDgxXHg5MFx4OTZceEFEXHg5OVx4QkZceEIxXHhFM3BceDk5XHhGNFx4QzhceDgwXHg5MXxceDE2XHg5NVx4QTRceERBXHhBN1x4Q0VceDAxbFx4MTBWXHhBRG9ceEM2XHhGNFx4QzRceEVDXHhDMlx4MTNuR1x4QUFceEU3PVx4ODBceEQzXHg5MFRceENEXHhBQ1x4ODBceDAxXHhFNlx4QTI/XHhBOFx4QkE6XHhDOVx4ODlgXHhDNVx4Q0NsXHhGN1x4RTFceEQ0XHhBOV9ceEJBX1x4ODh8XHgwQ1x4MTVceEE3XHhDQ1x4QzhgXHgxNEBceDA4U1x4RUJ5U1x4RDJQXHhENlx4ODNceEFBXHg5QVx4ODJIelx4QzViXHgxMDpceDBCV1x4RDNnXHg4MVx4MTZceEU3blx4QjhceEUyPlx4OUJwXHg5Rlx4QURceDA3XHhFMll+XHhFQjg3XHg4OE4nXHhFMlx4QjlGSkhceDkyXHgxOClGYVx4MDNceDlDXHg5MFx4RDhceDgyIVx4RDMpXHhGND9yXHgxQlx4OTF+ZV08VUokXHgxNXU6XHg5NEpIXHgwM1x4QjlceDgzQ1x4OUVaYFx4ODJceERDclx4QTRceDA4Xlx4QTFceDhEXHgwMllceDFCSlx4QjhceDk3XHgwMVx4MEJceEEzIVx4MUVlaFx4QjBTVVl1ZDVceEZCXHhEOFx4REJ9XFx4ODBPa1x4OUZceEY5N1x4ODBceDFDRlx4OUZsXHhDRFx4ODZceEY2XHhCMCZceENEXHgwMydceEUxXVx4QjRpXHhDNndceDFGXHgwRUI+XHhGMFx4QUM2XHhGMVx4MTcxXHhDN2Y/Wlx4RTBceDkyJlx4OTlceEJCXHhDOFx4RTFceDFBOmVjSCc8Lz5ceEJBJlx4RjNceDhGXHhEQkdceEE2XHgxN1x4QjhjXHgwRlx4OTdceEM1XHg4NThceDlBaVx4QkJceERCVUg+YEsrXHhBMEM5Zz9ceERDXHhCRUNwJF1tXHhDNFx4OEY5KVx4OERYXHhGRlx4MDhdXHhGMDdHXHhDQipceDg3XHg5OVx4ODZceEUxXHhENypceDBEXHgwNXA+XHhCNShceDg3KFx4OTFSXHhDNFx4MUZceDFDXHhGMGFceENBXHgwRUdceDExXHhGRFx4ODNYXHgxN1x4RjZceEM0XHhDN1x4RkNdXHgxREhpXHg4QU5ceEZEXHhFNVc4XHhFMWxceDg3aVx4RDgxXHhDRVhceDA1M3pceDg1XHg4OTdceEVGY1x4RkRceDk5K1x4OEVceEZCXHhFNFx4ODVceEU1XHhBMj9LXHhFRC5ceDk2XHgxOFx4Q0JceEU2XHhGNEpceEQzXHhFNVx4QjdceEM3XHhEM1x4MEEmXHhBQ3dceERFIFx4MDNceDAxXHgxOVx4MENceEYwKlx4OTVTXHg4QiJrXHhBOVx4RkNceDlGeVx4MDNcXHhFQlx4ODZceERBa2RceDgxXHg4Qlx4MUZceEFCXHhDRVx4MDZceEFGXHg5QlNANz1ceEE1NVx4ODlRXHgwQ1x4QzFKIlBceDhFXHhFQVx4MUVceDgwXHhCMkBceEIxXHhENlx4OEJceDAzR1x4ODZceDg4XHg4RGBceEY1c0MwXHhDNE95XHhDN3xceENFNFx4QTE5XHg4QmtceDE5XHhDMFx4RTZceDlCXHhERklceEFDXHgwNEtceEExXHhBQi5ceDExXHhCRFx4QUNceERFQ1FhXHg4MmFoXHhDNlx4Q0EoXHg4RVx4MDFceEIzXHgwNVx4ODhwWFx4RjRceDBCQVx4QTFRWFx4RkVceEYxZ3JceDkwXHhCRlx4QzZhXHg5OVx4RjVceDhBXHgwNVx4OTdceDEzXHhGNFx4Q0NldVx4QTFgXHhGMVx4QTBceDExXHhBQVx4MTRceEM4XHgxRTo+XHhCM3ZceDgwOltkXHgwNVx4QzVceEMwblx4QzRceDE1WzlceDg3MFx4QjRceEIwd1x4QjBPXHhDOFx4QUUxXHhBM1lceEFEXHg4MFx4RDVceDgzWlx4MTUhXHhGMFpceEYzXHhBN0hceEVBXHg4OVx4QzdceEU2NFx4OEFeOVx4RjBceDFDXHgwREpceEQybVx4MTFceDFFXHhBN0pgXHgxQVx4QkRceEEwXHhBOEh0XHgwRVx4OEZceERCXHg4NURxXHhFRFx4ODFOXHgxNlx4REVceDE1XHg4N1x4QzZIXHg4M1x4QTBceEQ5XHhCNlx4QjInXHhCOFx4MDZ3OktceEIzXHgwNFx4QzNceEFFXHgwM1x4RjRceDA4XHgwNVx4MTlFSlx4QUVceEQ2XHg4QTpceDhGIlx4QzY9XHgxMVx4OUJceEIxXHhEMl06XHhGRFx4QUVceEZCXHhEQSBceEYwPVx4QzBceEU5XHgxRmNyXHhEN1x4RjNMXHhENEZceEE1XHhGMFx4OTdYXHhBOXZceEE5XHgwQVx4MDJFU21ceDFFLVx4OTVpXHg5NVx4RDJceDAzQlx4RDFceEUzXHhEQkRLXHhBN1x4RUZceEIxVlx4QTFrc1x4RkJceEIwXHhEM3dceEE5XHgwNVx4RkVceEM2XHhEMlA3XHgxNlx4QzRAXHgxOGpceEIzXHgwNlJaNlx4RjRUV1x4QzNceEFCLFx4MEJceENBXHhBQlx4MERceEI5dlx4QUInXHhGMXxceENDXHhGRlx4MUNceEM5XHhGQz5ceEQ4V15ceDk0XHg5MFx4QTNceEQ5XHgwM1pceEVDPGBceEZCaGhceEVFXHg4N3xceEQzXHhBOFx4QjRBTFx4OThceDk1XHgxQVx4RTVceDFBXHg4MFx4QUFqXHhFMFx4RTU/XHhDRV9ceDkyQ1x4QjkqXHhCOFx4QjJ8XHg5MVx4RjNceEZEXHhBNFx4RDFceEMyXHhBRlx4REJceDA1XHhGM1x4MEUsTVx4QkZceEFDXHhGNWNceEUzWyY8XHg5MjhiXHhFQzk5XHgwNGNceDE3XHhCRVx4MERceEE1TVx4QUJceDkxV1x4Qjk4XHhEMidGXHg5M1x4OUNceEIwXHhCOVx4MTJceDAzQlx4RURnXHhDNlx4OEFceEYxXHhEMVx4Q0JceEE3KWlceERFXHgwRlx4OEI5YFx4RTRceDgzflx4RUZceEJDN1x4MDBOS1RceDA4RURceDk0Xlx4MTNceDkwXHgwNnpceDFDblBceEVFQiBRXHg4MFx4MTVceDhEXHhFM1x4QkVEXHhBRmdceEU1XHhDOF1ceEJDXHg4Nlx4RkRceDFFXHgxN1x4QUJceENFXHhCQ3tXXHhBMGAuXHhFOVx4RjVceDA3XHg4NUd8XHhBN1ptXHgxNVx4MDlceDA0XHhERlx4MDZceEY0XHhFNjZceEJBXHhBN1x4RTFaXHg4NVx4MEZ7PFx4QTE2XHhENVx4RjdceEQ5XHhDQ1x4QjYobFx4RjhceEQ2XHhFN1x4RUZceEVEJFx4RTJceEVDXHhGOChceEEwV1x4QTBtJ1x4Q0FceERDe1x4QTNceEFFXHhDMFx4QUZceDgxXHhBRlx4OTU/XHhFRFx4Qjh5clFceEM1XHhBNVx4RkRceEFEb1BceDkxXHhEN2FYMlx4RkFceDA3VVx4RkJWXHhEMig+XHg5QVx4RTVceDBEXHgwNFx4QzNTYk9ceDFDXHhFMVx4QkNlXHhBNFx4RTRvflx4Q0VceDBEXHhEMlx4OENceDA4XHgxNih5WVx4OTNceEU2XHgwNFx4QzN3XHhDQlx4RThceDBEXHgwOCxZTzxceEI1UVx4MUFUXHg4Qlx4QzFceDAxS1x4QjFceDg2UVNceEZDPnJceEJCXHhEQnNceDFGenRceEUwUVx4QjNYXHhCOFx4RERceDgzXHhDNlFceEY3Z1x4MDRceEEzXHhCMlx4RjNceDlCXHhDOW9ceEE3XHhBRjdceDkxXHhDNlx4MUZceEI3XHhEQVhceEFBcVx4MUZsIVx4Q0FIXHhFQVFceDBDXHg4MFx4QzUxY1x4OEUyXHhFMy5iXHhENGdKXHg5OVx4RjdceEREPFx4QkZceEMxXHhBRUVGXHg5RVx4RjJceDAwIkNceEI2XHg4Nlx4RDZceDk2XHg5OVx4MDFceDdGXHhGNlx4MENceEQ4cHFceDA3flx4REVfXHhGMm5MOFx4MTJvXlx4OTlceEFDXHhFQ1x4ODFJJSllXHhDRFx4QjlIXHg4OVx4ODBceDgzXHgwQlx4RjlceDBCXHhFRFx4QTRceEY3XHg5RiVQXHg4QkdceDgzXHgxOVx4RkJceEE1XHg5MDlceEM1XHgxMmtceEY3XHg5Qlx4OUFceEU3fFx4MTloXHhDN1x4QzNceEQ2XHg4NFx4ODNsXHgxRiVceEVCXHhBOFx4MDdceDFDdlx4MUZceDA1R1x4QkNdO1x4OERceDBFcFx4QTEqXHgxMFx4RDdnXHhEOF8tXHhFMmkuSVx4OTZceEVGXHhCQ1x4Q0RceEI2OTBceDk1XHg4M3JceEY1XHgxM1x4OTlceEI2XHhCNF1HXHhBQlx4MEVHcCtceDlFXHhENlx4RkNceEU0XHhERFx4QjNZXSRgXHg4NGNceEY0XHgxQVx4OThceDE4XHhEOD9ceEQ1XHhCQlx4QjFceERDXHhDQ1x4RURceDA0XHg5N31ceDFFOSpceDA2XHgxNHhceDE2NVx4RTJRW1x4OEFceDBCXHgxNFx4OEJceEMwUlx4QTY2M1x4QjZceEM1XHg5N2pceDA4XHhCN1x4OURceEQydVx4RUJceDlGXHhERVx4RTZceDkwPlx4MENOXHg5Q1x4ODQxXHhFNkJceEVGd1ZceEQzXHhEMk9ceDA3RFx4MTBceDA4XHhDQkJceEM4NFx4RERsXHhBMVx4MTdceDBDXHhGNm9ceDkyXHhGNlx4QTh4fFx4QjRceDBGNFx4RDNceEJGN1x4MUFceDkzXHhFM1x4Qzk/XHg5ODtceEQ5JC1ceEMyXHg4NFwmXHhDMHZceEM0XHhCQXRceEQ4XHg5MmJceEQyOlEmXHhFQTJceDhCQlx4Q0JceEMzXHg4OUdceDk2Ulx4QTBceEU4Qlx4OUN4XHhDQ1x4RjdwXFx4QkNceEQ0aVx4QTNceDBEXHgxRFtceDBGPFx4QzJceEMwTC9ceDAwXHhGQz1qXHhENlx4QTlceEMycFx4REFceEUxXHhEQVx4RUZceEMxKlx4QTZceEEyRzptcFx4ODhceEU5aVx4MTdceDhFXHg4Ql9ceEIzXHg5MVx4RjVceEJDXHg4RGxOXHhFRXpceDE1XHhDN1x4QUJceERGXHhCRVx4QkFceDkxQVx4Rjd0XHhCNlx4ODFceEVCXHhCMVx4RjlGT1x4RkRceEMyXHgxMlx4QUZceDk4XHg5Mn1ceEUwW11ceDhDUFx4RUJceDk5ZSdceEI4Olx4RDhceERGPFx4MERceEQ3XHg5M1x4OTlceDEyXHhDRVx4QTllR0FwXHhCMVx4RDJceEVEXHhEN1x4MDRceDk0XHhGM1x4MDIvXHhBRUxceDBGXHhCNFx4QjJhKmpZXHg5MyFceDE1OVx4OEIjNFx4MDdceDAzVFx4RTUmXHhFQlx4RTFUUVx4Q0FceEIzXHgxN1x4OUZceDk0cl87QDQ5XHhEQmpceEUwXHgwOVx4MTBceEJGOlx4REJceEZGXHg5Rlx4MDVceEUwXHhGRS5ceDk1XHhDOVx4OUVceEQxNlx4RTZceEQ4XHg4MVx4RjNceEI5XHgxOFx4ODJceENFfE9ceEIwXHhBOVx4Q0ZceEM2XHhDMFx4RTNceDAyO1x4RkFceDBFXHhFNnc3XHhGNVx4RjFceENGcFx4MTBWXHg4QVx4MDVceDlBXHg4MTVceDFDXHhEMCRlXHgwM2xceEFGXHhFQzg/XHhBNlx4QTlkXHhFQlx4MDBceDk5Wlx4RDlgI1x4REEhXHhBQTdceDgwXHhDRlx4RDBceEE1XHg5Qlx4REJceEUxXHgxMVldXHgwRlx4RDJceDAxdyNIR1x4ODBceDk1XHhGQVx4QTBceDFGJVx4QzlceEU3Jlx4RUJceEZDXHhGNVx4RDdgXHhFMyZceDAxXHhFOVx4RUIsXHg4REZceEE5K1x4QUNDWVx4OEJceEEyXHg4N25ceEExXHhEQVx4QTNceDA1fH5ceEUxXHhFNVx4MUVceEExTSlYXHhCOW82XHhDMFx4MDdceEM3eFYuUUA5XHhCRFx4QzVceEQyUmlceDgxKlx4REVceDE0eFx4RjNJUCxceEM1cFx4QThceDBEXHhFRVx4QjdceDg1XHhEOVFceEMwXHhEN1x4OUZgOWlceEFCXHgwNl5DXHhGNigtXHhERThceEMwXHhFOFx4MTQ0d1x4MUFceEFDXHhGRFx4OEFceEMwXHhCRVx4RTlceEZCKnNceEYyXHhDMCtceEE2XHhFNVx4MDhceEZCXlx4ODhceEFCJzZbRFx4OTVceDBDXlx4OTNceDgxXHhGNnFJRlx4MENJJ1x4RTlceEMxXHg4ODNceEFEXHgxNlx4OEJceDk0XHgxQlx4RTdvXHg5Q0VceDA0U19YNFx4RjhceEFGKVx4RTlJV1x4QkJxXVx4RjRceEU4XHhGMlx4RTRceDhDNlx4RjZceEU1XHhDOVx4QTFceERDX1x4QTQ/XHg5QzQkXHhDNVx4OERceDFCNWdceEI2YGosXHhEMlx4MUNceEZCfVx4OTEjOl9ceDlFXHgxMlx4RUJceEU4XHhFMENceDE5SVx4MTFceENGJFZceEYzbFx4QTdceEFBXHhFQ1x4OTVceEQ2XHgwMFx4MTFceEVFXHhGMlx4MDJceEEwXHhGQ1x4MURceDA1XHhCQTJceDhDXHhDRVx4Q0RceDk3XHhGN1x4QjRceEYyXHhBRnpOeVx4MTdceEJEXHhCODQ/dytbXHhCQkVceDdGR1x4QzNlXHhCN0VceEQ0eWFceEZGXHgwNFx4OUZceDlEXHg5NVx4OUNjQlx4MDJhOzx6XHhBMVx4RDBceENEXHgwMUhzXHgwMFx4RjlgXHhGN3lceEFFXHg4OGR3XHgwMTddXHhGNFx4Q0JuI1x4RjZDXHhCRlx4RTlceEFGXHg5NnogXHgwMlx4RDNceDE0XHhCQ1x4OTNceEUzXHg5Q1x4QTVceEU3d1VceEVBM15ceDA5XHg5RFx4MTdceDFESVx4RkZceEY4XHhENlx4QUJceDEzSVVceDEwXHgwMFx4MENceDAyXHhGRlx4RjJ2XHhFNDxdXHgxQykiXHgwRSFceEQ4XHhEN34pdVx4MUNceEZBXHg4Qj5ceEQwMlx4RjZqXHhBNFx4Q0ZceEM4eFx4RThceDFDXHhEQ0tceEZBPFx4Q0ZceDg5XHhGRFpceDBEXHgxNk5ceEQ2XHhGMjR5XHhCQVx4ODkqXHg4NFx4RUVuSFx4Q0RceEJGT1x4RkMkeVx4RUNceEE0XHhDQVx4QTlceDlBXHhFQi9ceEI4KVx4ODFceERBSCFhXHhCM28kXHhBMVx4QkJUXHhCNVx4QjBceEFDXHhENH1ceENBQXVceEI3XHgwRlx4MDJceDlFXHhFRTtceEM0MzFTXHhENVx4RURceDA0ZFx4RDNceEVGXHhBNFx4MDJceEVEUFx4ODRceDEzXHgwMGFceEM1XHhFN3RceDExXHgxQ1x4MDJceDAzXHhEN1x4QjRwYkNPQFx4RkQkXHg4MkkjLlx4QzYvXHg5Nlx4QkNceEY5Ulx4QzVceDFEZGNceDk1XHhBQVx4MDNceEUwalx4ODNceENGalx4QkMlI1x4QjhceEE5XHhEMlBceDk5aldceEUyXHgxNFx4QzhVNF5KXHg5MVx4MTV5XHhCMlx4MDhceDE4VVx4RkFceERGbSwmXHhDQlx4QzJceERFXHg4M2FceEI0Ilx4QkQ9emdceEQ0XHgxQ1x4OTh1XHg4NFx4Q0VceEZEXHg4RHZceEZGXHgwMSlceDAyJXlceEI2XHhBNHo2XHgwNVx4QUEkQkdceEExXHhEMWlceEI3XHg5Q1x4RURceDE4aVx4QTJceEVDY3B9XHhENy9ceEJCXHhDMjxbXHhCMk4yZVx4OEJceERGXHhFOEU6XHhGOVx4RENCXHhERGtceDhFXHgxQlx4QkVceDhBXHhCM1x4QjhuIFx4QzRceEYzXHhFOFx4MENpXHhDMFx4MDdceDk5XHhGQlx4RDVeXHgxNyM8Slx4OTJceERGXHhCNFx4RjVFXHhFQVx4RDdceEY5Xlx4ODRceEY1XHg4NTtceDAyXHhBRVx4REYsamxceDBDXHgxQlx4RjdceDA2XHgxNFx4RTdceEFFXHhCNSBceDk2QWUoXHgwM1x4RTJSTmdceEQwXHhCQ3ZceEM4aVx4Rjd7XHhDNylceDkxTlx4ODMzXHhFNlx4OEJKXHhFQz9ceEU3XHg4MVx4QTZUXHg5MSxfXHhDN3ZceEU2XHhGRCJceEFBflx4QzZceENGXHg5RVx4QjIqdFx4OTFZLlx4QkNceDFEXHgxNVx4OTlceEVGXHhBNlx4ODFceEY3XHgwQWhceEVFXHhERlx4OUY/XHgwMlx4RUNQXHgwRU1yXHhEQVx4RjBceEY2XHgwNVx4OTJceEFFXHhFQmBceDk0XHhGMlx4RDNceDE2XHhDRTMiXHhFRVx4MDdceDA2XHg5QSxceEVDZFx4OTBdXHg5OU5ceEFFLXJceENDQ3hlXHg4RUdGXHhBQlx4RTRMXHg4OFx4RDNceDBDXHhFNT0rXHhDMFx4MDNceEM4ImVBXHg4OFx4Q0QsXHg4MlRceEQ3Y1x4MDZceDBEXHhBMVx4MUY2XHhBQ2FFJVx4QUNkIlx4QTNceEMxXHg4MFx4RTVGRXhceDBGXHhEQjUqXHgwRVVceDlFeFx4QjdceDk2XHg4N1x4MDJceEU2bFx4MUNceEQ2XHhBM2VceEE3XHhBMlx4RDFceDBBXHhERStceDFDXHhEQiA/XHhDMCJceEM4InBceDk2XHhCQXsjQlx4MTlceDFFXkhceEI0WVx4OEI4XHg4OVx4MEZceENGXHgwODFceEFEWkNceDgzXHgxM1x4MUFTXHhCNVx4ODhceDE1XHhEM1x4Q0VceEQ4Jlx4RkVceDE3ZVx4QkE0OFx4RDQjXHg5Nlx4MEMsOFx4MEZceEE0XHhDQ1x4QURceEUyXHgwRT5ceEI2XHhFMC1SSHRceEI1JVx4RDl9U1x4MERzXHhCQl1ceEFFXHhDNVx4MUZceEE5XHgxMFx4OEVceDExV2ItTlx4OERceDk0XHhBRmVceEU1XHhDMnpHXHg5M1x4QzFceDk3XHhGNXhceEI4XHgxMEFceERDd1x4QTNceDhCW1x4MERceEQwXHhFN1x4RjIwXHgwRFx4OUZ0XHhGNFx4ODZceEQ5W25ceDgzXHhCM1x4QzdceEREXHhFMTpceDAyXy5qNzNceEJBXHhFQkxceDkzOlx4MTFceDhBXHhCMFx4ODY6I1x4RjNceEY0XHhBQVx4QjlwXHgwQVx4RURceEM1aFx4MDRceDBDXHgxMFx4RTZ6XHg5MjhceENFZ1x4RkRceEQyXVx4MDJ9XHg5N1x4MUUjXHhGNVx4QjlceEI3XHgxM1x4RERceDlBXHhGRFx4MDRceEQ1XHhCRXdFXHhDOFx4RUNceDE0Nn1ceEQ5Zlx4QURceDAzXHgxNlx4RDVlflFUXHhDQlx4RTNceERGXHg5RFx4RjRJXVx4QjZIe1x4QTJYXHg4MVRceDBCP1x4RkNPbVx4MDZRXHhFNlx4RkJceDlEXHgwQlx4QTksXHhEQzBceDFEXHgwOFx4MDZceDgzXHhCOFx4RkNceEQ2R2NceDBCN1x4OTlBXHhFOVx4RUVceERBXHg5NkFceDExXHhFOFx4RkVAV1x4REZceDlGXHhCQlx4RkR0MVx4REJzaHtceEU4XHhCNklceEVCXHhGQlVceDFCXHg5M1x4RjM2XHhFNVx4Q0ItXHgxMFx4RThceERBRFx4Q0NceEM1XHhCRkslXHhFOVp2XHhBRFx4MDhceEUxb1x4Q0JceDgzXHhGMlx4Q0Z9aFx4QTB3XHhFOEdceDdGT1x4QTNceDEzM1x4MTlceEYyXHhBQ1x4Q0EkYFx4QjRceDhBXHhBQ1x4MTExXHgwOXdceDA3XHhFOFx4Q0RceENFO1x4QTIxNFx4QzdceDE3XHhCNVx4MTQkXHgwNVx4MDFceDhBXHhFNHxDXHhDMyxceEI0VXpUXHhFM1x4REZceDA3XHhCRlx4ODBceEUwXHhDMlx4MUFceEM5XHgwMjlceEJDXHhFQlx4OTRceDBBXHhEMlx4OTVceEE2eVx4RER9XHhDMFx4QkJQJSZuOlx4RjdNR0FceDkxeVx4MENZXHgwNVx4Q0IhKFlxXHgxRG5ceDgxXHhEOFEyXHg4RFx4RDVpXHhCMXRceEZFUlx4QjVceEM3XHgwNlx4QzdceEZEVlx4ODlYVVpceENGY1x4MERceEJDXHhENlx4REMpb1x4REVPXHgxMVx4RkVceDA4OFBceENCX3ZceDdGXHhGOD04XHhEMlx4QUZceDgwYDlceEE0XHg4OVx4QTBceEQxXHhENkRceDE5XHg4QVx4RUV1XHhBREdceDBFMlx4OURceDhEXHg4Nlx4RDNwXHhFNkZceDBBXHhFM1x4RTgoXHhDMFx4ODVceERFZFx4REMqXHgxNThceEVEXHhGRVx4OEJceDg5XHgxRERceDg3XHhCRlx4QTIgYDhceEQ1d2pqXHg5N1x4RjJceDg0dlx4RjVceEYyXHhENVx4MEFceDA0XHhGNFx4RkYjaGVceDlFXHgxQypvbVx4MUVceDkwaT1ceEM3N0FceDg4XHg5MFx4MDdiWVRceERCXHhGQVx4MEZceEY3XHgxNVx4Q0VceEYwbFx4QkNxXHhENCp1XHhFM0NceEM1VVx4QTdceEY0XHhGOFx4OTJceDlEXHhFOFx4QkZceDBGXHhCNVx4ODRceENEVlx4Q0ZceEE5XHgwQVx4MDhceEVEPVx4ODJceEFCXHg5NSlceERDXHhFRFx4RjlceEVDXHhEMVx4QzNceDg2WldceEZCXHhDNVx4QjJceDEyPFx4RTJJQlx4QkVceDk4T1x4RkNceEExcVx4RDJceEJGXHg4QVhceDFBNTBceDBCMlx4QTgmXHg5Rk13aFx4ODBceDlBXHg4MkJceENDXHhDQylceENFXHhBNidceDkyXHhGM01ceDk4XHg5MlJJXHhFRVx4RjJceEMwNVx4ODUmemJceDA0XHhGOFx4MDJceEVGXHhFRThzQFx4OUZceEU5XHhFOEd8P1x4Q0RceDkwXHhDOXpceEREIENRXHhCNVs7XHhFME8zXHhCM01ceDA5dVhceEVFbkU8XHg3Rlx4RTRceEZCalx4MUFceEQwXHhCRVx4OTBmXHhCNFx4RUF9O1x4MTchXHhFNFx4RjZceDlDXHhBNVx4OUFceDgxXHhDOVx4QkZceEFDXHhCOFx4QkJceDkxL1x4REVYY1x4OTlXXHhCOFdceERFXHgxNiIkXHhFOVx4RTEmLVx4MTVceDg0XHhGQVx4Q0FHXHhDMlx4QjhceEJCXHgxM1x4MUZceEMxVVx4QzlceDEyYlx4OTFLXHg4Rlx4QzVceEEwXHhEOFx4OUVceDEyXHgxN0RtTlx4RERceEZEXHg5Mlx4QjZceDE4ZVx4ODFjJlx4RUJceEM0SFx4OERPb1x4QjFyPHtceEVFXHhBRFx4QjNceDkyeF5ceEMzXHhGQlx4RDVceEExXHhDOFx4RTBhXHhBM1ZceEI4XHg5OVx4QkZceEM2XHhGOTlceEQwXHg4MVx4MDVceDFBXHhFOVx4MUNIVlx4OEJceDg4XHhBQjdceEQ3M1x4QTdceEEyXHhFRlx4OTVceEE5L1x4RDhceEY5XHhBMXpceERCXHgxMVx4RkNceEU5XHhBRlx4OTZ5UVx4RkNyclx4RjRceEI3XHhFRFx4REVbQlx4MDVuXHg4QVx4RTVceEQ5LUhceDEwXHg4MVx4MTJceEUyXHhFRU1ceDE3W1x4RDdgXHhEMkYoXHhCNlx4OEZyXHhERFdceEE0XHhFNFpYXHg5OVx4ODUgXmRceDgzXHgxN3pceEFFUSEpOlhceEZGXHg5QjVdXHhDRFx4MDgoXHhGNVx4RTFceDBBXHgxQVx4OUZceDA5XHg3RnBceDBCP1x4OTZtXHhBRVx4MEZceDEyXHgxRVx4RUJceEJEK2x4XHhDRidceEY4XHhDQlx4OERceDlGaEg9XHhFNGBceEQ2XHg4NFx4RkRceEExXHhFM2BsS1x4RERceDgzXHgwNlx4RDNEXHhFNFx4RjZ+XHg4RVx4RDVceEM4XHgwOVx4ODF+XHg4N1x4MDJceDA5XHg4N3lceDBCXHhDQ1x4RTVgXHhBNlx4RDBKXHhGQVx4QzhHXHhCNVZ7XHhGQlx4ODNceEFBQiRTXHhCMXVNXHg5NHA+dlx4Q0VLXHhDOFx4OTZceDFFLnFceEEwZFx4RkVceDg1XHg4Mlx4QjFceEY0XHhDNFx4QUZceEYyXHhBNlx4MUFceDExLFx4QThHXHhFRVx4Q0I+XHgwMlx4REFceDlCXHgwNlx4OUFceEQ1XHhENFx4RTZceDFCU1x4ODUmfVx4OTBceDE5XHhENVx4REZbWlx4REZceEVDXHhDMFx4Q0R8XHhFQV1OXHhDQVx4MUZFXHhEMm5ceDhDXHhFMVx4OTlceEIyWVx4RTAvXHhDMlx4QURceEM3XHhBN1x4QUNceENCXHhFRFx4RUFceDBEJXZiNFVceDFCXHgxMSpceEY1XHhEOFx4OENceEZGXHhFQlx4ODlceDlBY1x4OEFceDlBXHg5QV5MXHg4Mlx4RUVceEJBVlx4QzRceDAycWoxXHgxOGRceEU2XHhDNVx4OENxfHp4XHhCN1x4MDBceDE1XHgwN1x4RDhwXHgwMFx4RTFceDE2d1x4RjA3Olx4QzdceDgwY1x4QTAyXHgwOCRceDBBIVx4Q0JdXHhBQ1x4QjJceDdGXHg5Mlx4OTdceDA3XHg4Rlx4QTleXHhEMVBceEI0XHgwQmd6LFx4RDNceDE4XHhDOFx4MUM5XHhBQVx4RTNeXHhCOFx4OEFceDAzXHg5Q21JYUtKRVx4Q0FceENFXHhBQlx4OEVceEEzQlx4MEM8XTVceEY0W1x4RUNceEVGXHhCOFx4MTdceDE2XHgwOVx4OTJ0XHhDQVx4RjQ7XHg5MFx4RkNceEZDeDhceDAzXHhENFx4QjlceDA0XHgxOEQ1eV4nXHhFNVx4MDhDXHhGNVx4MEYiXHg4RUg5XHhFNFx4QzFceEEwP2lceDFGXHhFRFx4RDZceEU2IFx4MDNqNlx4MTBceENFXHgwNVx4RDFceEMxXHhBQVx4QzNceEVBMixceEJGXHhBNVx4RDJceEEyXHg3Rlx4RDFoaFx4OUZceEVEXHg4RVx4RDRceDgxXHhDM1x4REEzKFx4RkZNKGhceDA3XHhENU5RIlx4QkRceEQxZ1x4QkZSXHgwMVx4QTVceEE4XHg4N2hceDhBWHRceDE3XHg4NChceDg2XHhBMVpceEZCXHhDNyVHQVx4OUFceEI1XHhGQVx4MDMiXHg4Q1F3XHg4N1x4MUI1XHg5ODNceEM2VSJqXHhDQlx4MUJceDlDXHhBNlx4MTdYXHhFNVx4OTk4XHgxMVx4MUFceEZGYTxceDA3XHhFOVx4REJceDhCXHhDMVs0XHhEMFx4MTNceEExSlx4QzdceEY3XHhGOFx4RkVceEMzXHhDMFx4RDdceEM0PyhceDk2XHhBMlx4RTBceEY2fV1ceEIyXHgxRVx4ODRceERDXHg4MmdceDEzfFx4RUNKXHhDOFx4RkIsXHgwRjEiXHhCOW5VXHhCRFx4OTRceEMxXn5ceEE4cFx4OTJceEE5XHhCMShceEVFXHhGMFx4OENyXHhCRUpceDhCXHhDRm9ceDBFXHhEMVx4RThceDFBdFx4RDVceEIyXHhBQ1x4OTgsXHhEOFx4QjRceEFFXHhBNFx4QjRceDE0XHgxMi1ceEExU1x4RkJceEI5XHgwNVx4REQnXHhCMW1ceEJBXHhBNjtuXHhDMlx4ODhSelx4ODAhXHhEMihceDlDe0dceEE2XHhDMWlceDgwXHgwRVx4MTNceEQ1SFx4RkVceEEzXHhGNFx4QjdceEVFRFx4RTZ5XHhFQmZya25ceEUwOGxdXHhBRSY7elx4RDZsXHhCMT5ceDk3XHhDNVx4RURceDhBXHgwM1x4RkRceDk2XHhENVx4QTRceEVCXHhCRVx4ODBceDk1XHgxMVx4RkZceEVFQFx4OThnXHgwMVx4OTBJflx4RTdceEI1XHhDRlx4QzBceEREXHhDRVx4MTJceDE5ZzM9X19ceEU2XHhFNFtceEZFXHg5MFx4MTdceEI2S1x4RjdzXHhBMldceDFGQ3A5b1x4MEVceENDbVx4OUVceEI5IFZceENELlx4QUZceEMxXHhGOGFceDgyPXxceEQwXHhGQ1x4RTlceDFFUVx4REJceEQ4XHhERlx4RjZceDg2XHhBNVx4MTBceENCO1x4QjRceEVCQlx4MDBceERFXHgwN1NceEIzXHhBMCxceDBEXHhBOFlUKFx4QjUlXHhGRVx4RDBceDgyRFx4RTRceEE5PFx4MDFceEIwXHg5MFx4MTFceENFfFx4RTFxXHgxNVx4OTVceDFGXHhBNFx4RTZXXHhGOFx4RTFzXHhGN2xceEJEP1x4RDhpXHg4QVx4MDlceDBEWVx4MUUlXVx4ODM9XHg5NFY+biBceEZEei1RVFx4ODhceEE5XHhBRjNceEZDXHhBOVx4MERceDdGXHg4RFx4QUM2XVBIPlx4MDMhXHg5Rlx4Q0V4XHg4MFx4MTVOMVx4QzdceDBEOlx4OUNceDkxXHg4MVx4QzZRXHg5RFx4RTIiSFx4ODNceDFCXHgxMlx4QzVceDg5XHhCNm9ceEZEfWlceEJGXHgxMThceEZEXHhGRlx4Q0RmUVx4MUVceEE2XHhENiFceDBCcFx4QkVceEYxKVx4OTRceEE3XHg4QVx4QzRceEEyOFx4REVceEI5XHhEMlx4OEFceDFGV1x4RkFceEFEXHgxQ0FceEQzXHg4MVx4RDJceEQ0XHhEOFx4QzZPXHhCRS4sIFx4RUJceEJGXHhENVx4RjY/XHhBMlx4QjFceEJBXHgxQlx4MURceDg2XHhBQlBXXHhBM1x4QjJwXHhERjpceEM0XHgxMj9rXHhEQzVceEU0XHgwQ1x4QzRceDk3XHhEMD9HXHhCRCglfGdceEIxXHgxQlx4RjRceEFBXHg5QypceEQwXHgwMyhYOkR0bndceEQxJVV9XHhEOVx4ODBuN1x4RkI6XHhCRVx4MTQlcVx4QUZkXHhGNCoiXHg5QngpXHhCRVx4QURceDAwe1x4RjJceDBBWk9ceEMwXHg3Rlx4RUFceEExXHgwRDtceEQ0XHhBQlx4MDJceDgzXHhBNlx4MDVceEFEXHhDQVx4Q0FceEZGXHhDNVx4MDNaXHg5Mlx4OUN4J1x4MURceEYyOlx4RTNceEY3XHhCOXZHXHgxQzBceEREXHhFRCVceEI1QFx4QjlceDA2NVlceDlCXHhDOVx4RENceEYwXHhBRiVceEFDXHhBMSVceDE2MjdceDlGXHhFQyFceDgwdFx4RjdceDFEWFx4Q0JceEU2XHhCOFx4QzFceEIwXHgxMlx4OTdceERBSlx4QzNceEFFXHhCQ0VceDBFXHg4Q1x4RDJceDkzXHhBRVx4ODRceEZCXHhDOFVceEUwXHhFN0ROXHgxN1x4MUJceEI5XHg4Q1x4QTZceDhDXHhGQVx4RkNyXHgxM0BceEZGXHhEMFx4RkNceEJBJFx4QzJceDgzXHhGMkRceEMzXHhGRmdpXHhBNlx4QzI0Jlx4Rjh+XHhDM1x4QkVceEJBXHhCRk8xP3R8OlpceEVFXHhBMlx4MUNceDFGXHhCQ3tceEI4X1x4REFceDk1TFx4RkZceEM5XHhENFx4OUFceDk4XHgxQUNfXHhBM1NkXHhBNlx4QzdceEIwXHgxRi9ceDBFdFx4RDdceENFXHhENlx4MUZtX1x4QzdceEQzXHg5Rlx4QThceDlFXHhDMVx4RTE3NVx4QzhceENEXHg4QmRceDFDXHhGMlx4RkJceDlEXHhBMlx4RjdceEEwXHg4MUhXIVx4OTV3XHhDRFx4RDBceDE2XHhBQSFZaCBceENCXHhDOVx4RUJceDhCXHhBQ09ceDE3VzZceEE2XHg5RFRuXHgxN1x4MENceDBDTVx4QUFceEQ2dVx4QkEmSGhceEM4MFx4RkZFZVx4RUJjJVx4QjNGXHgwNWFceEE3XHg4Qlx4QzhceDE1XHg5Nlx4RDF9Q1x4RURceDkwPVx4MTQ8MVA4QVx4OUYiXHhCQVZceERDXHhGQVx4RENceDAwP1x4QjlceDg4L1x4MEJceDAzXHhCRGRceEZCXHhEOGZceEREXHgwMVx4QjhceERFV2BceEJGXHhBMzxTXHhCMydceDA2XHg4Rlx4MDFceEUxXHhCNyQ3XHgwQlx4QjRceEE4ZFx4OTRceERBUFx4Q0VceEVGXHhBRVx4RDl6XHhGMDkqL1x4MERceEM1XHhFNVFceDg0XHg4Rlx4QzI2XHhFQlx4ODRceDAwXHhCNVx4RDd4XHhCQVx4RUNceEE3XHhEN2VceEM3XHhCNkFceEVGXHg5NFx4OUMuRF1ceDFFXHhGQlx4MDVceDk0LVx4QzRceEJEOlx4RTlceEY2XHgxOFx4QzNceEMzKFx4MDBceENCXHg5OCBceEQwLDZceEQwWixceDAwXHhBNlFceEY3OWFceEQxflx4QTBceDg2aVx4MDhceDhGd1x4RTRceEVGXHhFNFx4RkVceDk4XHhDOFx4MDArXHgwQlx4MTBceEE2XHhFQzVKclA9Olx4QTlMNFx4RUFceDk0XHhERn5ceDk3XHhFOVxceDBES1x4RjZ+MUlceEVGXHhENVx4OUZceEQzXHg4N1x4QzFceDBCXHhBMlx4ODVceDlEXHg4MF5ceEM5a1x4RDRceDA2XHg4QV9ceDhCXHg4N0xceEY0XHhCMW5ceEIwLVx4MDVceDlCXHgxRFx4QjJ2PGVceEI1SS9SXHg5RDw8QFNceDhEXHg5Qlx4RTB4OFx4OEFceEEzXTVUVFx4ODJEXHg4RnBceEZDVHYvXHhBQlx4Q0JceEE3XHgwNlx4REFceDBBXHg5NFx4RUZceEI4XHg4RFx4MTNceEUyeVx4RjRceDExXHgwQ1x4QzQ8ZFx4OTRceDFCW1x4RDJ0O1x4RDhQXHhFOFRWXHg5M00hXHhEMFx4RDR3XHgwQz9ceDE2XHhGRnZkNFx4RkVceEM1PVVceEQ3XHgxMW1BJFRceDlGXHg5Mlx4QzgmXHhFQVx4MUFceDlCXHg4Rlx4REZceEY4XHgwQ1x4MTNceEVGLlx4QkZceEI5XHhGMUZceEI4XHgxMFx4RDFceEQzKEFceEU3XHhFRVx4ODFceEYxSFx4QjBceEJFXHhDOFx4N0ZYP3dgXHgxQlAmX1x4RTVceEY0XHhDMFx4RUNceDFEXHhDQ1x4OUJgXHhCRmRUXHg5M296Zlx4OTFceEUxfFx4REZceEE2XHhFMlx4RUZceEYxXHg4OVBceDFEXHhCMlx4OENnXHg5M1x4MThdSVx4MDJ4SVx4MTVceEVDXHhGMVx4RkFceDFEXHhFMFx4QjNceDg4XHhFOVx4MTBPXHhFMlx4OTVceEVGN2lceEFBXHhFOT9FXHhDOXklXHhEQ1x4QTMzYFx4MTRceEY2JixDXHhCMFRJXHhERlx4RDFceDFFXHhBM11ceDA0XHg4Q1x4RUVceEYxajVceEY5XHhFRVx4RkJceDA0XHhFQlx4RjRZXHhDMFx4QUVceEIwXHhEQlx4QzJ1XHgxNkVceEM2XHhFMlx4N0YhXHg5RFx4RDVceDE5XHhGMFx4QTNGXHg5Q1x4QzhceDkzX1FceENDW1ZceEVBYzdUXHg5M1x4RTQwXHhEMVx4MUIoXHgxOFx4RTUqXHhFQTpceEVEXHhBQVRBWSVceEI0XHgwOXJyYk1AXHhGRlx4MUZceEE1XHgxOVx4ODcpXHhBM1x4RjVceEE4al5ceDFDdiFceEQwXHhGMVx4RENceEQ0Tlx4RjNceDhFXHhERiNceDlFcDt+XHhGNlx4QzhceEY5XHhFOVx4MUVceERCXHgxNlx4MDlceEQ3XHgwQUlceDA5XHhFM1x4RTA+XHhCMVx4RTJceDBDXHhERFx4Q0FLaVx4ODNceEMzXHhDRHZHXHgwNH5ceEVBXHg4MURBXHg4Nlx4REZceDE3XHhGNmlceEVBXHhCMlx4RUVYXHgwRU5ceERBfFx4QjdceEU0P2BlXHhBN1x4RDNceEZEXHhFQ1x4Q0QwXHhERi5ceDBGe1x4RDZceEEzL0pceDE2LFx4OENceEI5XHhGRFx4REF+X1x4MDRceERBXHhGRVx4RTNceDBBKFx4ODhvXHhBQjBQb301XHg5NiZceEMzXHhCNk5ceEU4a1x4RUYqXHhEMlx4OTFceDk0XHg4MVx4RjJceDkxXHhEMVx4ODFpXHhEOVx4ODZceEM3XHg4M1x4RkVceDkyXHg3RnNceEIxXHgxNnBceEVFOVx4QjFceEJBWVx4MERceEJFMlx4QTJceDAxX1x4QjJceEYxXHgxRVx4Q0Q1bFx4RUZgXHg4MFx4MDBceDA5XHhGOVx4Rjl4XHgwRjZceDgyXHgwQVx4MDhceEFDXHhGNVx4RkVVW1x4Q0EvXHhGOFx4QjBceDBGV1x4QzhceEFBWVx4RjdkSGdceEYwXHhFOFx4ODF3XHgwRWBceDlCXHgwRFx4MEZceDgwXHhDRVx4OUNceEY2Wlx4QjZceDkzMVx4QzFceEM1XHhDOVx4QjNmSVx4OURfVT9EXHg5Ni1ceDg1XHhEQ1x4MTNceEMzTlx4MTRceDg2NFx4RjJceDFCXHhGRVx4QUM0XHhBRFx4OTNhXHhBMkFceDBFXHgwMFx4QjZceEIyUFx4ODBceEY4eCdceDgwXHgwQ1x4QUVkXHg4RGRceERGXHgxMlx4MTlceEIyOUVceEYyXHhGNmJceERCXHg4OFx4QjhceEU5XHhCRFx4ODBceDgxXHhCOTgyXHgxNlx4RUZbXHgxOVx4QjFceEExJVROY1x4QUEtNFx4QkJceEJEXHhEMHV9XHhDN3FceEEyXHhDNFx4MTlceEU1elZceDA4U1x4MUFceEZDXHhBNFx4MDhceDlFXHhFM29ceEIycVx4RkNkXHgxOShGXHg3Rlx4OTExQ3VceEVGXlx4QUNceEE4XHg4Mlx4RTdHXHg5QVx4QUFceEQ5UUNceDkxXHgwNFx4Q0NceERCXHg5RFx4OUJiXHg5Nlx4MTg8XHhEMFx4OUNceEI1J1x4Q0I5cExMN2JceDBCQ1x4RjdTYlx4OTVceENDY1x4RTdceDBBU1x4MTVceDlFMU9iXHg5MDRDXHhGMFx4MUZKXHhEOVx4RTdceDhEfS1ceDdGXHhENy1ceEJCXHgwQVx4MTdceEY1Vlx4QTQsfV9ceEJBXHhEMFx4MDNWXHhGMVx4RTNceEY1XHhCRVx4OEVceEVBXHg5NVx4MUVceEI1XHg5Q1x4RkFceEIzIFx4ODZ5XHhCOURceEE4RVx4OUVceEEzXHhBNShceEYzXHhFM1x4OTlwXHg4MVx4Q0FceDA0XHg5NVx4MUJceEQ1XHhERihceEFEXHhDRVx4RkZceEI4XHg5Rlx4RjhceEU2U1x4MUNceEY5Tlx4RjJceEE2XHhDRVx4REZ1XHhBME1ceENGeUFceEIyXHgxOVx4MDRceEIxbVx4RUZqXHhFQTtnXHg5Q1x4RTJceDE0XHg5Mj93XHhFOVx4OEIvXHhCMFx4ODlceEIyXHhBQlx4RDdlN1x4QTJceEYwXHhEN1x4OTU0XHg5NGEidVx4MURceERGXHgxNlx4MDRceDk3XHgxQ19pXHgwM1x4Q0NceDkzXHhDNVx4QzltXHg4NUpceEE0JFx4MTRceDgwRFx4OTk1NVx4ODlceDE1XHhGOVx4REN8alx4RDBceDFGXHg5N1t4NVx4RUFceDE1XHg5NGszXHhENVx4OTRUOlpceDEwXHhDMjw0XHhDN1x4RERLOiFceDlBXHg5Q1x4RDF4XHhBOVx4RkVceEY4XHhEQVx4MDVceDEwXHg5Rlx4MTFceEE1V1F8XHhCRlx4Q0FceDA2Plx4RUZceEM0XHg4Rn1ceDlFXHhENT9ZRVAkXHhFMVx4QzRceDExNVx4RDNceDA1XHg5MVx4RkRceDk4TVx4QUNhXHg5RlBceDA0XHg5Nlx4RTVKXHgxQVx4MURceDg1XHgwQWlceDBBXHhDNkN7WVx4RjdceENDXHhBNlx4RTk4XHhBOFx4MTBceEFGXHgxNlx4MEVceEYya1x4MTVceEMyYjZceEJCXHgwNVx4MURGXHhBNzJAT1x4Q0ZceDBDXHhBNCpceEUxXHgwMFx4MTN2XHgxRFx4OUVceEQ1XHhCRlx4RkJceEJEXHg5RVx4QjIuXHgxOFx4QzlceDkxXHg5Q1EtbVx4QURceEU4fEBceEVEYlx4MENceEZBXHgwQ1x4RDRceEJCXHhDM1x4QkJceDg0XHgxM3JMdiJFXHhFMFx4ODJLXHhEQlx4RUEoXHgxOVx4QUZceEJGXHg4Q1x4QzlceERBeVx4RjBceEEzXHhFMFx4OTVceDBCXHhGNVx4MTJceEY1MVx4RDlceEI4NWJceENEXHhDNFx4OTkncVx4RjlceDk4XHhGOFx4RUNKIHlceDgzOlx4ODcqXHgwOVx4QThceEU4alx4RkRceDk2alx4MUVceDFCVVx4RUJpXHhGMjJceEJCXHg5NEMkXHg4QVx4MTdyXHg4NFx4QjYkbFJceEVEXHhGQll7b1x4ODVceEIyXHg4QVx4OEV0dlx4RDNceEFGXHhEMl5aXHhDOFx4QjNceDg1XHhCOVx4RTVceEY1XHg5M1x4OUJceENFXHhCRiAjXHhBMlx4OEZceEExXHhCN1dceENGXHg4MWNceEQ2XHgxQVx4RjFceDA5Ilx4ODNkPFx4QTYkXHg4NFx4MTJceEFGXHhCRCNceEI4XHgxMFx4QzZceEVGXHhENSksXHg5Mlx4RDZceEFGXHhDNkEqdlx4Q0MlXHhEM1x4QjRceDBEVlx4QjBceEJEXHhERFx4QkJrXHgxQ1JnSlcmXHhDQTpceEY0KiRceEEwXHhGOVx4ODFceDEzLlx4RTFceEQ5XHhEOVx4QjlceDE1XHhGRThceEIwXHhEOFx4QTJoTVx4MDkgXHg5Nlx4QUNceDFEX0E1XHhCOVx4MDVceDBFXHhFQidceEE5XHhCMlx4RTJceDlFc1x4OThceEM2clx4RTBceERCXlQhXHhDOXtYXHhDNVx4QzZceEE4XHhBNlx4QjlceDA4c1x4MUZceDkzXHhGQylceEQyYFx4MTZceDk4XHhFN1x4QjF5XHg5NkRceENCeVx4RDlceEI3cVx4QkJceEU4XHhGOSohT1x4QTRceDgzXHhENUhceEE4bktceDg4XHhDQ1x4RjhceDk4XHgwNk9ceEI2Zlx4RDNceDkxXHgxMFx4RUR1VFx4RThceDgzdFx4MTgsXHgxQVx4RTNwXHhCRlx4QkJqa1x4OEZceDAxL0tceEQ1LiVceEIyXHhERVx4QTBceEVCRHZ5bCB8XHhERWw+OlU1QDBceDA0RCFceEJBXHgwNVx4QzFceDg4XHhCRVx4OEZceEFCXHhBNlx4REFceEUydFx4QTBXXHhBREFceEM1XHg4NSpceEQ1SVx4MEJceEQ2XHgwOFx4MTZceEM4XHgwQ1x4QTJceEFDXHhBMjxceEY1XHg5Nlx4QTlceEYwJkxceDhCXHhGRFx4QUFceDg3PVx4MEQ6XHg4NVx4QkNceEZBOlx4MDZceEJEXHhGMVx4QjhceDExXHhCQlx4RkFrXHhFRlx4QUJIeVx4RDMtXHg5QVx4OEFOUVVceDE0XHhDMVx4OTRceEYxXHgxRTdceDEyMFx4OTBceEU0Jlx4MERDXHgwRGhceEVEUE5ceEVCXHg4QVx4ODRceEQzXHg5MXRceDkzXHgwQX1zXHhCNzonJlx4MUVceDA3XHgxQVx4QkNkfT9gXHgwM1x4RDlceEY1ZFx4MEVFXHhDOVx4QkM+XHgwRlx4RTBceEU0XHg4QVx4OTk7aC80XHhDM1x4MUJVXHgxNVx4RDVxXHg5NGtceDg1Z1x4Q0JceENFXHgwMUx4XHhCMU1DPC1ceDkzKlx4RjhceEUxQVx4MUZceDA4XHhGMlx4RkZVXHhDNFx4RjM0b1x4MENXXHhCQjVceEVFXHhCNlx4REVYXHg5Qi9nXHg5MVx4OUVceEQ4XHg5NH5ceEJDXXBceEE3XHgwRFx4QTdceDlDMVx4RTd1Rlx4MDlceEIzXHhEOFx4OEFvXHhGNEBsXHgwMFx4RURceDBCVFx4ODBBXHgwOFx4RDVkXHhFN1x4QUVceEY2Zmtse1x4OTRceEQ1XHgwQVx4REZceEFDUlx4OUFceDBGdXB9XHg4MVx4RjBceEI3XHhCQi1kXHhBMlx4QzlceEI4XHgxOVx4ODBceEQ0XHg4M1x4ODc6ZVx4RTFceEJBXHg5NVx4REZceEM2XUZceEJCXHhERlx4MDNhXHgwMGtceDkyXHgwM1x4MTNbVFx4MTRceEYweTlceEMxXHgxQ1x4MDBceEZEXHhDNlJceEZDXHg4RFx4RTNceEIzXHg4OVx4QUJWPFx4RDVkXHgwOSRceEQ0Y1x4RDFceEI1XHhGRlx4OEVceEYwMV1YXHhDM2RceDdGXHhCMVx4RTRPXHhDN35ceDE1XHg5Qlx4QTB2cX5lXHhGMVx4MDFsIVx4QkJceDEwXHhEMVx4REJceDFDW1x4QTJceDg1S1x4RUJceDEyUFx4RjEhXHgxRVx4QTI4XHhCN3VceENCXHhFMFx4MDdPIlx4OTBceDgyXHgxMlx4QjBceEYwXHgwQihceDk3XHhBQzlceDk3c1x4OUFRXHg4QksqXHhFQlx4ODJceDAxOCZceEI0XHhGOCgjXHhCQm5SXHhGMlx4RTZceDBBXHhCMFx4QjZceEI0XHhFOVx4RUQhXHhEOFx4MTZceDFBXHhDNklceDAxXHhFQ1x4OUVceENEXHhCMi16XHhGRlx4QzFldlx4OTNceENDTFx4RjdceDhBN1x4ODErXHhGQTNceEI5QVx4OUNTUmRSXHhGNVx4QTNceEI2XHgxMkxceEREVixceEIwZllpXHhFNVx4RTBceEIyXHhBNlx4MUQxXHhBOVx4QUZOXHhCOVx4RThCTnJceEQ4UnZceDAwXHhGNTl6XHhBNE97XHgwMVx4OUZkXHhEOE9ceEIzXHhENFx4QTRHWUV1XHgxQ0hceDFGXHhDQlx4MDNceDk2TVx4MDheXHhBQ1x4RjFceEFCXHg5Q1x4QjhLTGNceEZBUlx4RDEwXHhGRlx4MTQkK1x4Q0RfUFx4QzNceEY0Rl1ceEIyXHhEQlx4QUNceENGR0JceDkxXHg4QjpceEI5XHg5NStVXHg4RFx4MDJceENBYVx4QTNceEI4XHhEQ1x4Q0QxXHg3RitceEY4XHhBN1ZzXHhCQlx4OEJPXHhFRVx4RjhceENGXHhBOVx4QTAxSVtceDBGXHgwRjI2XHhDMlx4RjNnXHgwQ0xceDk5Jlx4RjBceEM4MClceDBFXHgxOVx4RkFceDFGXHhGQlx4QTdceDk0XHhGNT9ceDkzXHhCQzVQXHhBNHpceEY2XHhCOVx4MTJceERCXHgwREg4XHgwRlx4OURceDg3XHhDMiJceENGXHhGNFx4QkJceDk1flx4QUNceDkzXHg4Q1x4RjhceDA5XHhDRDdlWVx4QTlceDAzXHhBRFx4QzlceERCXHgwMUdUY1x4RjNceDA3XHg5QVx4ODFceDAyXHg5MVx4OUVceDBFXHg4OVx4QjZceEJFXHhENFx4OURceEVBVFJceDlBKlx4ODFceEJDXHg5MFx4RDUzXHhEQlx4ODFceDk3XHg5Nlx4MDlJaVx4QjlceEJDflZceEExdW1sKFx4QTVPXHg5Rlx4REExXHhDQk1ceDA5XHhDNyZceDgzcVx4REVceDEyXHg4NmVceDE2I1x4MUJceEI5XHg4OVx4RjZceENEXHhFRlx4QzRceEY3XHhCMDZceDE3XHhCMVx4RTBceEZCXHhFQmlceDlGMjBceDA4SXJRXHhDNlx4OTFceEY1XHhBRjJceDg3XHhFRFx4QkFceDg1XHhGNE1ceEMyVFx4QzhceEE1WFx4QUZceEE2fVx4QUJ4XHhGQyVceDkwXHhDMFx4OUFRSSBmXHhBOW8kXHhFN1x4QTdceDdGXHhFOFZceEIzXHhCM31ceDE5fX5ceEQwXHhCRVx4QTVDSEVceEYwXCpceDEwd1x4RTdceEFGXHg4RFx4QUJceEQ3Q1x4RDBceEVGXHhGMX1ceEEzMlx4QjIxXHg4RFx4QURceEZGXHg4RStceEVDXHgxOHxceEVCb1x4QjQ7XHgwRlx4QzlceDBDeVx4QTJceDE3XHg4Q1x4ODhceEE3XHhCNFx4OEVceDg1XHg5Q1NMI1VceEQyXHhEQVx4OEZceDk4XHg4MVx4RDN1XHhCQVx4MUNceDE2XHg4Rlx4QUNceDFCXHhGNFNCRUJceEQ2dFx4MTdceEM1XHgwRjVceEQxXHhBM15ceEEyXHg4NVx4QkZceEZCJlx4RTZceEQ0XHg4N1x4OEFceEFFXHhFM1x4QTFWYFx4QjJceEUzZFx4RTItMG55XHhEQ1x4RjlceDk3KFx4RkJceEZEWmh8Klx4RTRhOFx4MDBfXHhFN1x4RDQiXHhGNFx4OTRceDk3XHhCMnNMXHhGMnZceEVDXHhGNVtceEM1Wlx4QjJIXVx4OTBceEY4bH5ceEEwXHhBMzRceEE5XHg4N1x4RUNzXHhCRSxiXHgxOG1ceEQyXHhFRFx4RERceDAxXHgxQlx4RDhceEY3XHhFOVx4OTBceDg0XHhDMVx4REI+XHg5Q1x4ODRceEMxXHg4QVx4RDlceDkyXHhCM0lceEE1eVx4ODBeXHhDNStceEQ3XHhDN1x4Qzl1XHhGOVx4OEFceDgyXHgxQlx4MThuXHg4RFx4QjlceDA0XHhBNlx4MENceEI0XHg4Q0ZceEFBIFx4QThceEEwXHhBRCUxXHg4Mj9ceDAxXHhCN1x4RkVTXHhDRFx4ODJceERFQVx4OEVbXHhGODc1NVx4Rjl4XHhCQzBceEE2YVx4RDhceEM4aXhceENDXHhEQSxGXHg4OVx4ODFXdmA6ay5ceDg0XHgwN1RceEI3XHhDQ1x4QURceDg2XHhCRVx4MDZceENDXHhENVx4QzBceDFDXHhGQlx4RTJceDA0Ylx4RDNceDkyIVx4QjRceEUxL1x4QTluXHg5RVx4ODNWIVhMfC5ET1x4RTJceEFFXHgwQmB5XHhBRlx4MDJceDlEXHgwRFx4MDRceDk4XHhDNVx4QjNVXHhDNVx4MTRceEM0XHgxQVx4OERceEM0XHhFRVx4REV6XHgwN1x4RUJceEJGR1x4QjhYKCtceDk5XHgwQlx4MEVceDE3XHhBOW5ceEZGMyovXHhBOFxceDlGTUpceDA5clx4QUUrcFx4QTRceEE4XHg4M3lceDk1W1x4QTVceDlEXHg4QnRceEI5QktceEFGPnZceENEUlx4RjZsLVx4QTdceDBGQlx4MEFzXHhBNVx4REVyXHhFRVx4RjBjXHhCQ1x4MDVceEVFXHhGM1x4Q0J9T1x4RDhRe1YhXHhDRVZceEU3UVx4RENceDAwXHhCN1x4RjFceDhEXHgwMyVoXHhEOVx4ODBceERCXHhEOVx4OEI8XHhCQlx4RkZceEQwI1x4RDJceEI3P2NceDkyXHhEOFx4QkRceEZDXHhENVx4RjcnRGBceEQ1XHhGNFx4RjFceDg5XHhCOVx4OUMyXHgxNVx4OTBceDk5XHhDOFx4Q0NhXHg5NH1ceDBDJTNBXHhBOFx4ODNWXHhBRUhgXHhCMlx4REMuXHgwNlx4OUJceEM4Rlx4QjNceEMyXHg4NVx4ODlceEVEXHgxNjtceDkwXHhBMFx4QTEoXHhGNDJceENEVEN3XHg4NFx4QzBceEU5XHg4RFx4RjFceEI3XHhENlx4OThceERBXHg4QlQjXHg5NGBceEIwXHhBMFx4MEEuW21ceEY4XHgwMUciXHhCM2VceEJEXHhEQjZceDgwXHhEQlx4RENceDhCMCxceEZEXHhFN1x4Q0ZceDlCXHg4RVx4RDJceDhBSzdceEU5XHhFRVx4MTJceEQ2Rlx4Q0ZceEU4Slx4MUVceDA4XHhFQ1x4QzUqXHhFOFx4MDNAOFx4RjlceDEzXHgwMFx4MUFceENBXHhCMHBRIlx4Q0NceEIwXHhERlx4RjlceDlFXHhDMGdceEIxXHg4OFx4OTJTXHhFOGVNXHhCOUlceDEwXHhEQVx4QzBceEJFbFx4MThceDk1XHgxMzFceEQxXHhGRFx4MTVceDlCd1x4QTBceDBCNVM5N1x4RjZQXHhCM1x4QzhceDhGXHg5NCtTXHgwQ29ceDkwXHhBOXBceEQ3XHhEOVx4MDhceDA5b1x4QjRceDE0Xlx4MDNceDA5XHhBRFx4RTVceDE2XHg4RFx4RTVceDFDMFx4RTFceENEXHhBN1x4MER0bVx4QzZceEEyXHhCNFx4QjBceEU0X1x4MTNceDkyXHhBQlx4RDhmKnAmN1x4RkRmXHg4RCREWEVceENGXHg5Nlx4QzZceEUxXHgwQjdceENEMFx4RDUsblx4MDVceDlDXHhEMVx4OUVceEZGPFx4QjZceEUxXHgxOVZrS25ceERFfiAqdXY2clx4QTlvIGlceDE5MFx4ODlceDg2U1x4QzZceEIxXHgwQUNceEFFXHhGNlx4RTdFXHgxQ3h9XHg5M1x4RTRceDFFUVx4QzJYWVx4REFceDhGXHhGRlx4MUFceEZFQlx4MURceENEXHhBOVx4MURceEE3XHhFOFx4RjJceERCXHg4NFx4QzJceDgyXHhCQlx4QkZiXHhFMSZceERDXHgwQ1x4MEFceDk5XHhEQ1x4RjUpXHhEOFx4OTNceDlEXlx4QkVXd1x4QkJceEQyXHhCRFx4MDRceEVDXHhGOFx4N0ZceDA0XHhFOTktXHhFM0JceEQ0XHhDQlx4RDBrXHhFQjtceEIza1x4OEZceEY1eidceEM5WVx4RTlceEJGU1x4RTR7dFx4OTlfXHhDM1xceDAwXHhCNFx4RDBceEY0XHhENVx4REJfXHhBNDV2XHgwNjhceEQ0XHgxM1x4QjdtXHhGRVx4Q0VceEVFXHhDRFx4MThgXHhBNlx4QzdceDEwLlx4QzFmXHhBQ3RZXHg4QTZceDhFUzJceEM0a0NceDA0XHg4RShceEQzXHhBRklceEE0elx4ODJceDBEXHhGRGF0XHg5QiFceEY0XHg4Nlx4OThceENGXHhFNlx4QkZceDhGXHgwNVx4QkFceEVBXHgxM1x4MDZceEQ2XHhEMyJBVEVceENFI1x4QTFrXHg5RUd9QVR3XHg5MVx4Qzc8YEhceENGXHhGNFx4MERceDgxJlx4QTFceEFDXHhEMVRceERGelx4RkNceDlFXHhDOFx4OTBceDgzSnZceENDXHgxQlx4QjlceEExXHhBOTxceEUzOlx4RTFceEM2Rlx4MTZceEE5XHhFQVx4QjgqTVx4MUEyUlx4QTRceEM4XHg4NVx4OTZRXHg5RGxDXHg3Rlx4ODN8XHhGMVx4ODNceDkxXHgxRFx4MDJvbVx4QzhceEVBTShceEM1XHhENVx4RDRceEFBXHgxRVx4REZceEQyXHhDMVx4RjEyclFceDlDZjdceDk5XHhBQSZceEIxXHhBOUpceDAzXHhBMW9ceENEXHg3RnZceEZCXHhGMFx4Q0VhXHhGNVx4RUFzXHhCRXdceDFFXHgwQlx4ODlceDlEY1x4Q0NceEY4XHgwQ1x4OURceEI0XHgwQVx4RUZceERCXHhBOSZceDlEXHhBNUNZXHhCNzRceEVGXHgxRF1ceDgzXHhBNFx4RjNJXHhCMjpceEFBKFx4OURceEMwXHhCMjhceEZESlx4RkFceDlCXHhGMVx4QjVceEFDXHhDM1x4MTRceDk3fFx4OEZceDgwXHhBQlx4QURceDkycVx4MEI1XHgwOEpceDFCXHg4RiBceEVDXHgxQlx4MTdceEUxXHhDMlx4RkVceEM0XHhENSdceEY5VS1ceEU0XHg5OD1ceDFDflx4ODlceEVDXHhFQVYxXHhBQ0BceEQ1XHgxOFx4ODhCM1x4MDZ7eVx4QkNXXHhGNFx4RjN2XHg5Nlx4RDVceEREXHhCRVx4ODlceDhBNyY9XHg4NVx4OTdceEQ4e1x4QTZvXHhBM3VceDk4aGlXLFx4MUJceEQwXHgxQiVceEJEXHgxQXN1XHgxMFx4RUJceDFFUlx4QTRceDkzMkdceDkzS3xceDhBXHg4OVx4RjNceEE2XVx4QjRqXHg3Rlx4Q0RceDgzZUVceEY4XHgxNFx4RDlGXHgxNVx4QUJRflx4RkVceENGXHgxMlx4RkFceEYwXHgxOVx4RTlceDk2XHgxNVxLXHgwMlx4OUJ6NFx4QjAiXHhERlx4QUVceDg4anZceEJBXHhCMVx4RDFceEVEXHhBNVx4ODZceENBaFx4ODBceEFCXHhFMnEjaVx4MEVceEI2XHhGQlx4ODFmXHhEM1x4MDJceEI2RTFceDE1KFx4RTU0XHhGOVx4REFceDFDXHg5Rlx4ODlceDlFXHhCQlx4RjlceEI1XyNceDhFXHgxQzVceEVGXHhBRVx4MTlceEIxXHhFN1x4RDF0cVx4OEJceDAxXHhCMVx4QjFceDA5XHgxRFx4QTNYNlx4Q0ZceEQ4XHhCQlx4OThceDlFXHhBQVx4RjNceENEXHhCQipceERDM19sXHg5NFx4RkNceDEzM09mXHhFRFx4RjVceEVGZlx4Rjd7XHhDQlx4QkItXHgwMmQnYVxpXHg5M1x4RDcnXHgwMVx4ODFceEMySlx4MUNceEFCXHhCRFx4MENceDA4XHgwMEB1PW1ceEQ5XHg5Mlx4QkZceEREYlx4RTlceEFEXHhFNFx4RTFceEU1XHhCMlx1XHg5QSZQMFx4QkRceEQxXHhGNk9ceEZGdipceEJFa2pXXHhCNyVHXHhEQVx4OEZVXHhENFJceDlGZ1x4ODBceDk5XHg5Q1x4MTZceEIzXHhCMFx4RjgsWFx4MTJceEVGYk0sXHgwMlcqMDhMWElceEJCTm1ceEFEXHg5NVx4QkFceDFFXHhCOFx4OEFceEM0XHgxRlx4OTEhXHhGNFx4RTVceEZGNVx4QUZceEIwXHgwNlx4QTNceEI5KzxceDgyXHgwNVx4OUN3XHgxOUlceEE3XHhGM1x4QjlAW1x4MDggMSZceEZFLlx4QjZceEU2d2xceEYwPlx4RjhceEEwQ211XHhFQlx4OUZceEI2XHgxRD1ceERGKVx4RjFceEJGSywieFx4MEVceEVCXHhGN1x4RDhceEEwc1x4RUNceEJFVFx4MDZceEM0XHhGNlx4MEZceEQyXHgwNVx4RUZceDBFXHhBMk9ceDk3XHhBM1xceDg5S15ceDhBXHhCM1x4MUZceDEzXHhEMlx4QzdceDBCXHgwRVx4QkE5XHgwRFx4REVceENCXHhBQ3xceDlBblx4OENceEU1a1x4RDJceEI2XHgwNlx4QjlceDk2aVx4MDdceDg1XHgxM1x4RURceEY5IVx4QkRceDg4XHgwNFx4QjVceEZGXHgxM1x4MUJdXHhDRG9AOTpceDkzXHhERlx4RThGJFx4ODdceEIyXHhFMDA/XHhGMTJceEY0XHhGNVx4QkVceDhBXHg5QVx4RDRqXHg4Qlx4RjhQXHgxOE9eXHg5OVlGdFx4QTFceEYxXHhFQVx4RUNceEI1XHg4M1x4RjZ8XHhGRVx4QTVceEE5XHg5MUJceEU3elx4MDdceEM2XHhGOC1ceDk5XHhCN1x4OUZceDk4XHhGMlx4QjZ3XHg5M2JoJSdceEJGXHg5Q1x4QkJceEQ1XHhERlx4MEVceDEzXHhCRFx4OTBceEY4XHg5QVx4RDRUXHhBN1x4RDFceDFCUEZceDkyXHhGN1x4QzUkXHhDQVx4MDJ6XHgwOFx4RTIvXHg4N1x4RDkoJ1x4MTBceEQ3PjhceEE1byRceERCV1x4Q0VceEZCQVx4MTlceEZFZ1x4MDgyYlx4MURceDEzK1x4MEVceDFBXHg5M1x4RjRceEU4XHhCRVx4QkQnXHgwOFx4OEVceDk3XHhDRS5ceDk5XHhFMFx4QTg2XHhBNUpceDBBXHg4NFx4QzVceDk5X1x4QTJmJVx4RjJceDk0XHhFMU9ceEI5VWB+XHhGRllBXHgwM1x4MUVrXHhDNVdceEQxXHhGRVx4REJHV1x4MTZrXHgwN1x4QjBceEFDXHgwQSpceDFDXHgxNlx4MTBceDA2XHhCOVx4MTJZY1x4Q0R+XHg5M1x4QjVceEVCWFx4Rjc5XHgwM1x4QzlceDAyXHhEQVx4ODBceEMxXHg4QXxceEE0QFx4QUZceEU3QVdvXHgxNTZceDExXHhBQlx4QjhceDgwXHg4M1x4QjJceEZCKnFMXHhDNkNceDg0QFx4QTVceEUzXHhFRlx4QkE3XHg4NV9ceDFEXHhERFx4OTUzXHg4Q1x4MDRceEREXHhEMFx4QUZceEQxTVx4QjdceEZFXHhBMj9ceERDUVx4QTJXXHhCOEpLXHhGRFx4OEFceENGeF4uKVZyXHhFOVx4ODJceEEyWFx4MTZceDgyXHhCMlx4Q0E1XHgxNlx4RjZkXHg5N1x4RDduXHhFMlpKblx4N0ZdXHhGMFx4RUM3XHhGOSxceDBGbFx4OTFceENFXHgxQSQ4XHg5OTpceEFGPVx4RjZceDA5X1x4ODFceDA2WkEyXHg4N1x4MDZceEU3XHhFOVx4RTlceDg2TVVceEMyXHhGMVx4QUJceEQwM3BEV1x4RURceEFGXHhCQ1x4RjNceEI2clx4QkZceEJEXHhCMFx4RkZceEVGXHgwQXVceDgzXHhBNVx4QzVjXHhBMVx4QUE4LXZiflx4RUNeKj1ceDkzJyBceEREXHgwQ1x4RDl2XHhDRCNyXHg4Qlx4RTZbXHgwRGckbWVceEI4XHgwM0VceEUwXHhCQ1x4QTVIS1JYXHhCQlx4QThceEQwXHg5RlFrXHhDRFx4OEF2V1x4QkVMXHg5Q1x4ODRceDlGJ1x4MDhqL1x4RERceDhDbjYvXHgwQVx4RkFceEM5XHhCMCBceDhEVFx4RUUhXHhGM1x4RDFceDFEQlx4OTJTXHhFNFx4QkJeQGxceEQxXHhCNFx4QkVceDFFXHhBQlx4RDJceDgyXHhDMlx4ODJceEU3RVx4Q0VceDEyXHhGOFx4RURceDA5XHhEMVx4RkNceDBGXHhFQzVceEUyXHhGN1x4RDlceDk0XHhEQVx4MUVceEY3Llx4MTlceEU2Z1x4RTc2XHg5OFx4ODRceDlEXHhFMlZceEQ0XHg5NVx4QTFceDA4XHhDN1x4QzNceDAyXHg4M3wpKCx2XHhCMVx4RkE8XHgwMkVceDgwblx4Q0RlPFx4RUJceDg4XHhGN1x4QTJceENGQVx4MThceEZDbFx4Q0NceDFGXHhGNURCXHgwNlx4QkVceEJDXHhFMytceENDXHg5MitzXHg5MiJceEU1XHhBQSNceEZGb1x4QkRceEFEXHg4MnFceDhFXHhGRlx4RTE1XHhCRVx4QzBGQ1x4MEZceDEwXHhDMCFceEM4XHhCNVx4QTJceDBGXHg4RFx4MDdceDhCXHhBN1x4RkNQXHhBNFRceEVBXHg3RitDXHhENDZceEJCZSxceDlDXHhCMSBceDEzXHgxQVx4MDE1ZFx4OTQjMXtceERBO1x4MDE5XVx4MThceEY4XHhGND9ceEVCXHhCNlx4ODFxXHhGRDlceDBESlx4OTZTXHhDNVx4QkJceEMyXHhBRVx4RkVceEQxV1x4RTZceEI2XHg4Nlx4ODh5XHg5Mlx4MERceEZELFx4RDBceDg2R1x4QkZceEE0ayJHXHhCRUxceEU5blx4MEZceEQ3XHg4Mlx4RThDXHgwRnNceERGTFx4QkJTMFx4QURceDhDXHgwMUlceDA4XHhCRVx4Q0NceDgyIlx4MTdTIXpceDEzXHgwRjNFXHg4NC0vRi9ceEFFXHhENlx4MDFceDAwXHhCNlx4REItamVceEM3XHg4N3tceEJFXHg5MFx4REFceDk0LVx4RDNceEI3XHhFQ1x4Qzk0XHg4OWpOdFx4OERceDlGXHgxMGthXHhGQVx4RENceDg4UVx4Q0FceDFGXHhEQlx4QjV8XHhFRShceDk2Nlx4QTM1XHg4ODFiXHhDOUl0IWVceDA2XHhFOFp+Ylx4ODF3XHhDQVx4RDI6XHhCRVx4RTdceEY4Z0lceEU0XHN7eFx4QzBceEREa1x4RDBceDk4XHhGNlx4OUJceDFBSFx4QkJdXHgxQlx4Q0MnXHhCQlx4MUNkXHhGRVx4OERaUWJceEVBXHg3Rlx4QURKXHhEN1x4MENceDdGXHgxOTBceEJDXHhGRUtceEI4I1x4MTNceEU2XHg4Nlx4QkFVUlx4QjlceDBCXHhEOVpceEZDJlx4ODdceEMze1x4RTZadlx4MDBMXHg5RFx4RTZceEFDXFx4RER9KFx4OTZceEREXHhFNVx4OTg/XHgwN1x4OEVceEM0XHhERFx4QzdceEZGdlx4QkFceENGR1pceDAyXHg5Mlx4OENfXHg5Mlx4QUFEXHg5M1x4QTJceEVBXHgwQ1x4MTdceDlGXHgxQXtceEQwXHhDRVx4MDBceEI4dlx4RTNceDAzXHgwNShTKUJHJXRceERCNkNceEEwXHhBQVx4MEE9XHhDNVx4QTdceEQ4SydceDE2XHhGNzs/XHhEMHNceEMyXHg5Qlx4RTVwMFx4OUVceEY2XHhDNERceEJBXHhBMlx4RUJceDAxMklceEMzIlx4QTFceERBNlx4ODJzXHhEQkxceDhGXHhERVx4REM4XHhBQThceEM5XHg4OFx4MEFceEZBZlx4ODknXHhGMFx4QkYjXHhDMlx4RUJceEQ3XHgwMVx4QUVceDk3XHhCQnxceEU3XHhEQWswXHhGND9ceEUxXHhCQlx4MURceDBBXHg4OFx4MUQsVXd3XHg4OVx4RjhceDE3O1x4QzBceDE2XHg5QyxceDhEXHhFNVx4QjcgXHhCRlx4RDZceDk0Xlx4RDFhXHhCNi5JXHhGN1x4RjRiXHgxOFx4OUQlJU1ceEM5eVx4REZVXHg4OFx4MTZTXHg5RFx4QjNceEUwXHg5Qlx4ODNceDAwXHhGQlx4QjBceDFERT9ceEVDXHg5NFx4QTJceEUxXHhENFx4QzUvXHgxMVx4MUNceDFBXHhGQlx4MTRceEExXHgwOC5WXHg5RVx4RTAwcSdceDg3akpceDExXHhBN01ceENFK1x4QjhceEREXHg4RHRceEYyXHhERFx4RkFceDk0I1x4QkVceDgzXHhDNVx4MTN9QTlceDk3XHhGRmBceDE4XHgxN1x4ODklXHg4NVx4REJlWVx4MEM2XHgwRTZceEE5J1x4QkRceEFDMFx4ODFceEE1W1x4RUZceDhFPlx4OTJXXHgwMVx4RjAsXHhFRVx4QTBceDFENlx4ODYxXHhDMW5ceEVGXHgxNFx4RDFceEJEZ1x4ODA4QFx4RThceDExXHhBN1x4QTEgWGJgXHhDOFx4MUVceDkwLlpceEY5XHgxM1x4Q0FhXHhGOEtceEMxSFNceDE4ZFx4MEFkX1x4RDQlIlx4RjhceDA2O1x4QjBceDgyXFx4QzdceEQ4XHhEMG5OU1ZceEJCXHhBQ1x4RENceDFDJ3FceDEzXHhCMlx4RDZceDg1IWZceEU3Slx4MTdceEM1Mlx4QTBceDE3K1x4ODNceDAwXHhBNlx4RDZXKFx4ODJ+TCpceEMweFx4RTBceEQxXHhGODRceEU4aCxeW1x4OEZceEZBXHg5NFx4RTNFNjtEbFx4QUVceEU0Llx4OTY8U1x4QzlceEE4XFBceEM1XHhGM1x4MDJceEEwbzFDXHhGNlx4OTFeVlx4QkVceEZEXHhENlx4ODZceDFFXHhEQjhHXHhGRlx4RjVceDg2XHhBRVx4RUF3XHhFQi1KYlx4QjZBXHhGRVx4QTEkXHg4Q1x4QkRYXHgwMnBceEY0XHhBM3hceEQ2KH5wXHhGMlx4OThceEM2XHhBNVx4QUVceEQxc1x4OTk3N1x4MDIhYjJceEEwVVx4RkNceDkyXHhFRVx4MDNceDhFXHg4NFx4QUVceENFXHgwQjJceDgzL1x4QzNSXHg4N2Q8JkNceDFDendceEY0aFx4QjZ6XHhCQVx4RERnJVx4QURceEY5XHgwMVx4RUVceDkwQ1x4OUFceEVBXHhCQVx4QzNceEVBXHhBOTRceEQxQVx4REFceDE2Vlx4QUZceDAyXHgxMVx4OEFceEIwOlx4OTZceEMzXHgwNlx4OTZceEI4Q1x4RkFgXHhEMEdNRC9KXHgxNFx4QUIjQFx4QjVceEM1XHhFN1x4RDFceEI5XHhDMHU8XHhDNVx4RjlceEUxXHhBQ3NoS3xOIVx4RjJceEFFXHg5QVx4QzZuXHhBOFx4QjZceDlDZmNceEEzXHhDN1x4MUVSXHgxNVx4RThQXHhCM1x4RkNceEU3XHhDMDNuXHhFRXdceDdGV1x4RDBceEQ2R15ceEU2XHhCQ1x4QTdceDFGXlx4OUJceEM3XHgwMFFRUD1ceEZGXHhCNlx4MTdceDBEXHhFNVx4RDNceDhDXHhCMFx4OTdceDAxXHhBNlx4RjBWXHgxM1x4QkNVSVx4RDhceDhDbWMhXHhCM1x4MURceEQxN2dceEIxXHg5NF1ceEYyNlwgM0pceDg1fn5CXHhGRVx4RDVOX1x4QkIxXHhDRVx4QUMrXHhFOXhceEQ2TFx4RkRceEVBOVx4RURceEE0JFx4QjlceEU4c1x4MEFceDA2XHhBOVx4MUNceEM1XHhERVx4MDZceEQzXHg5OEVceEFBXHhBOVx4REJceEVGOlx4OUNceENEXHhDQVx4RDRceEM4XHhFQ1x4MEZceDA2XHhGNlx4ODdceEM5JFx4MDNceDE0XHhERlx4QTRtRlx4MDRceEY0b1x4OUZceEE0XHg5NmJceDAzalx4MTB+KlNceDA0XHhDNlxceDFFJFx4OTlceDExXHg4Myw7XHhDN1x4OUNceDBEXHgwM1NceERGdFx4REJceDE2XHg5MVx4MTFlXHhBMVx4QjNceERDN2wnXHgwOUNpXHg4RVx4RTB6XHg4NEhceDAxK1x4QTlceDAyXHgwRVx4MTlceEQ2dlx4RTJFXHhGNS1ceEQ5XHgxQlx4MDdlXHgxN2JwXHhDMHBceDExXHgwQVx4Q0RQXHhCRlx4OTdceEJBXHhBN1x4RERceEU2XHhCM1x4RDRaa1x4OUEtW1x4QURceDdGXHgwMU5ceEVDWVx4QTRceEMxXHg5MVx4QzZceEUxXHg4Q1x4RkVceEVDXmxceEJCXHhFOFx4MDVceDA5Ln5ceEM3XHhCNlx4RTNceDA2XHgwQn1ceDAyJVx4QzF+XHgwNlx4RjBsXHhGRlx4Q0NceDFEXHg3RkpceEFCXHg5NVx4OERceDdGXHg5MVx4OTBceEE4Xlx4MENceERFLVx4OEVceEU5XHgwQVx4QzFceDEyXHg4OD9ceDk1XHhEQXhceDk3M1x4QjVceEQ0UklceEIwXHg5NEZkJX1ceEQwXHgwMVx4MEQ7XHhDMVx4QzFBLVx4MTUvXHhBRFx4MDJceEU4XHhBQzBjXHg4OWk9KTlceEEzXHhCNlx4RUJceEZBYlx4QzlceENGXHhCQSNceDA5XHgwQklhXHgxNVx4RjZceEY0XHgxMi0kYVhceERETFx4RDdceEFGXHhDMFx4OUFceDA2XHhGRlx4OENceDg0XHgwRmNkXHhCRVx4QjZceEE1XHhGNlx4QzNceDE2XHhFMVx4OUFceEJDXHhDMFx4OUFqXHhEOVx4RTR4QFx4QzNceDFCWGdceDAzXHhCMlx4OEFyXHhEOFx4RDZceEQ1ej5ceDlEeTtfX1x4QTVceEU3XHg3Rlx4ODRceDk0ZFx4MDVceDg0XHhEQlx4QzRceDEyXHhGOVx4QzRceEJFLVx4RkRceEMzXHhBREQwXHgwRVx4RDRceEVBXHg5Rlx4RUI+XHhCM1x4QjQhXHg5NyxceDlCXHgxN1x4QTBceEYyXHhCMFx4ODhceDFCXHhBNVx4RURceDE2XHhDN1x4OUJceEU4Olx4RjhceEY1XHhFM1x4OTJceDA1fixceEEwXHg3RjNceEJER2RceDk4XHg4NUlceEMzXHhEMlx4MEZWWGxceDAxXHhEQzY6XHhFRVx4ODRceDEzXHhEQlx4RTNceDEzXHgwNVx4MUVceDlBXHg5Rlx4MUVKXHgxQVx4QkJceDlBPFx4MDRyXHhBNUo+XHgxNFx4REZceDhESlx4RTBceEVEKndceDA2XHhENiBceEQyXHgxRXBceEEzXHg5NVx4RkJPXHg4NSIsXHhGQ1x4ODNceDE2a1x4QTRceDBGXHhCRVx4RkFceEQ4Slx4OTFYXHg4Rlx4RDVceEQ4XHhEN1x4RTNceEQzXHgwMEtceEY3XHhEN1x4MDQlXHhGQkJceDgyXHg5M1x4RjBceDhDQV19XHg5MCxceEQyXHg5MydceDBFXHhFRVx4RURceEJCL1x4MUZceDgxXHhEQ2ZceDgxXHhGM1x4RkRTSFx4RkVmflx4OUFvXHg5NFx4RDBceEYwXHhENVx4RkNceEMyXHhCOXUgK1x4QTZGXHgxOFx4ODFlXHhGOFx4RjNceEQxKlx4QkNceDhEPFx4QzksLFx4Q0JsXHg4QX1ceERDXHhDNnlEVVx4MUFceEMxc3ZceEFEVVx4RURceEE4XHhCMT9FXHhFNlx4RjdNclx4QjdpXHhDNVx4RjFceDFDXHhCQlx4QTZceERDLntceDlER1x4RTZceEI0XHgxQlx4QkRceENDXHg4RVx4MEZceEVDXHhGQVx4MDljMlx4QThQXHhCNUFceEU5Qlx4QjJceENDXHg5Rlx4ODRceDkxJV9ceDBCXHhDMFx4OENceEMyXHgwQ1x4MTIwX1x4QjIhaVx4OENceEJEVVx4MUY5XHg4MVx4ODFceEU0XHg5RFx4RjVceEVGXHhCM1x4MThmXHg5M2VceDFFVUdNXHgxM1x4OEZceEVGXHhENGhceDBDYlx4MEJceDlBXHhENFx4QTZBXHg5OFx4OEJceEM5XHhEMlx4REItXHg4Qlx4RUFceDdGXHhBNVx4RjhceEQ1KVx4OEFWXHhGRFx4RDJsXHhEMiwpXHhDMSRceEZFMzpceEJEZDNxXHhBOVx4RDdceEY1XHhEMHxWLFx4MDk5XHhEOFx4RTN7XHg5N1x4RURQVVx4QjRwXHg4MVx4OEFFUFx4RDk+XHhCOFx4QjJCXHhBOG9ceEU3XHhCNlx4QTRceEFGS0pceERBZ1x4QzF4dlx4OUJceEVEJSNceEEyVXh1JTY7Jlx4MERceEVFXHgwNElceEVDXHhBQ1pAXHg5OFx4MUVceEI5XHhDQ3tceEU1TFx4RTlDXHhCNFx4OTBceEI3Il1ceDA2YFx4OUFceEYyXHhGOFx4MUNfbFx4Q0RceEVCXHhGMVx4RUNceERCSFx4RkRceDg0TT0vXHgwNVx4MUNceDBDXHhEMT1cXHhCMjVceEFEXHhGNHU3XHgxQSlceDg2XHg5Qyw4fVx4REZceDhCbjhceEVCXHhCN1x4REJGXHhDMlx4MDBceEQ2XHhBRVwgXHhDQVx4Q0NHLFx4OTBceERERzZceDBCPGNceEIyalx4MDBceDlFXHhDODhUXHg4QVx4MEQ3XHg5RVx4QzFceEM5JHBceEREXHg4NkZceEY2XHgxRVx4MUUxNjJceEVCXHhGNlx4ODdceEI1eFx4MEVceEZCXHgwOFx4RjNceDBBXHhDQlx4RkI6XHhCRFtVXHg5OEhmXHg4MVx4MUE4XHg5OHxceDk3XHgxM09BMipceEJBXHg5MCNIXHhDMVx4MDRceEZGa1x4ODhceEFEXURceEY5WE1ceDEzXHhENlx4MDRceDg4XHhBN1x4MDlceEJEXHhEOGhceEI1XHhBOWxceEZGQlx4QTJceEFCXHhDQlx4OEFceDE2XHhEMzxceDBFXHhGMVx4QUZceEZGXHgxQVx4RDBceEFDXHgwNTBceENEMVx4MDJceDA4XHhGOFx4REVceEIyXHhCNlx4OUZceDE4XHhCMmErJG4wXHhDQXtceEQ0XHgxRT4+XHhFN1x4RTklTFx4RUFceENEUlx4RUIoKGNdXHg5RFx4QkJceDA1XHhGNVx4RDZceENGXHhDRmIrWlx4RjVceDE0NFx4Q0RceEQxXHhBQVx4RkZceEIybWBceERBPVx4QzlceEY4XHhDMiFzXHhFMFx4QjExXHhFN1x4QzNceEVGXHhCRGh1XHg4RmwhTVx4MEFceDAxKTJceDAyXHg5Rlx4OThceEYxXHg5Mlx4QzMrXHg4Q1x4QUNceEVCXHhENVx4QTBceDhBfFJceEQyU1x4QUFceDA1T1x4OENdXHhCQ31ceDBEXHhENlx4MThceDg3XHhGQVx4REVceEE1XHg5RG5ceDgzS1x4RjRceEU4XHg5NmMtZUhGN1x4MTdceEEzXHgwRVx4RTFceEJDXHg4Qlx4QjlceEFBXHgxMVx4RjJceDA4XHhGMFx4REVceDBEPVx4MDRceDk5XHgxQSpceENDeSk7XHhEN1x4OENceEIxXHhCOVx4REZceEIxXHg5Q1x4MEUkXHhBNEVqfFx4RUJceERDXHgwQVx4QzFceDk4VFx4RTBJXHhDNEM6Llx4MEFceDAzXHgwM1x4RERaXHg5M1x4MDIoXHhCQWBceEYwSlNceEE0XHhFN2VceEQ0cFx4MDVceEI2IDxceDFEXHg3Rlx4RDZhXHg4QVx4OTJ6X1x4RDRIXHhGNlx4OENNXHgwN1BceDlBXHhGRFRceEI5MVx3XHgwRVx4MTBceEU5Mlx4QkFceDFBJnJceEQ4W1x4OEVceEJEcnpBMlx4OUZ7XHhBOXFceEIyXHhDQVx4QzY+KmlceDBGLVx4OUV4aFx4OENceDkzXHgwNlx4RjQhZ1x4OTlceDEwXHhCOVx4OEVceDgwJGZceEI3XHgwM1x4N0ZceEM0XHhGQmdceEM0XHhFNVx4RkZ4LHJNXHgwMFx4QjkhY1x4Q0MrKzdceDlEXHhFRCZceDFGK1x4RjBceEFBXHhGRlx4MDNceENEMERceEU2Vzd4I1x4RkZ2XHg5NnQtXHgwNVx4RTlceEIyXHg3RkU5XHg4OFx4MENceEQ3XHgwRmNceEM5XHhFQlx4ODdwT1x4RDhceEZEXHhENFx4RUFceDkxXHhFNFx4MTFceEU5XHhDOVx4QTloNVtceEEyP1x4RUFnPlx4QTdceEEzQCpLdVx4MUVceDA1XHhEOGNQXHgxNVx4RUEgXHgwMVx4RjFceEYzXHhGNFx4QjNceEZFXHhGM1x4RDNceEJCdSBHXHhCRnhceDgxXHgwNVx4RUVceEU1WyZceEI2XHhENnhceDk5dVx4QTJceEYwLFx4MUJceDgzXHg4NFd8XHg4RFx4RjVkXHg5NlNceDAzXHhDQlx4QkZceDg2XHhFQVx4RUFceEM3XHgwOVx4ODRERyRceDFEIVx4RDMwXHhCN0lceEY1XHgwQlx4OTVceEEyJGNceDA4XHgwRlx4Q0FaXHg4Nlx4RjVceEFCXHhGMTkuXHg4M2RceDk3UFx4RUFceDAxXHhCNFx4QkY7XHg4RFx4OTFrXHgwMlx4OTByXHhEOG9HI1x4OUJceDg3XHhBNlx4QTdEXHgxMi5ceEUxMFx4OTJMXHg5M1x4QjdceERDXHhENFx4QjBceDkzXHhDNlx4MUYlXHhBM1x4OERiL1x4OTJceEZFX1lceDBFXHg4RShceEVCX1x4QTBceDhGdlx4MUZceDkyXHhEM1pPXHhCQ2VceDkyN3RceENFXHhFRFx4RkRceEVEXHhGRVx4MERceDdGIlhceEMxXHgxQ1x4QkNceEZBXHhERi5ceEU2XHg5Mlx4QjBceDk3XHhFNFx4QTlceEVCXHhDODlceEMwXHhENWUrXHhEM1x4QkFhXHhGNVx4QUNceEJGXHgxOT97RShceEQ2XHhBOFx4RTkkXHhFNlx4RjFceEJBXHgwQz9xLFx4MDFceERFO2RceEQ1XHhGQ1x4Q0FLXHhFNFx4OEQ6XHgxNVx4QTlceDFGXHg4N1x4QzdceDk0XHhDMVx4REJceENDKFx4OTlceEIxXHg5ODxceEU3KWcucVx4QjVceDhDXHhGRFx4RDEmXHhBMDxceDk3XHg5QkxkYFx4ODhceEIxLEVceDdGXVx4RjIrJ0RceEMwXHhCQ1x4OUFceDk4XHhBNFx4QjhceEFEXHhBM1x4MDJceDk4XHhGMFx4RjBceEVBXHhERk5DXHhFMlx4QzhceEIyeFx4QzdceEU5XHhDM1x4MURceEI0XHgwQVx4QTdceDBBXHgwRX1fc3RceDhFXHhGMVx4MDRceEQzXHhGMVx4MEZceEYzJFx4ODVceDk3XHhFRE5ceEEwdVdceEFFSVx4QUVceDA1XHhBNixceEUyXHhGMFx4QkJ6XHg5N1x4MEVuU1x4RTVceEM0MVx4QTV2XHhDQklceEQyXHg4Mlx4MURceEIyXHhBN1x4RDNceDBBXHhEMVx4OEVceEU4XHhDNjVceEY4XHhCMDxceDBEKGNCXHg5Mlx4QkQuXHhEQmVceEVDXHhFRVx4QzNceEZCXHg4MVx4Q0YwXHhCRD9ceDhFXHhBRFx4QUNceEQ5XHhENEZceDA1XHhDOVx4ODNceEUxXHhGMlx4MDRceEE2XHhGQ1x4OERceDAxXHhENjFceDgzXHgwOFx4RkRceDk3XHgwOFx4RjVceEQxXHhBNS1mPExceDhBXHhGMm9xcVx4QzVceEY0XHg5MFx4MDZceEVDUFx4RENceDBEXHgxQ2w2XHg5Qlx4RjJceDk5Xlx4MTVceDk2XHhDQVx4OUVceEVCXHg5Nlx4REFceEJESlx4ODFceEVEXHg4Qn1KXHhCRlx4RkQ7XHhENVx4QTBOXHhFMVx4MUF5T1x4QjVceENGXHhEM284XHgxM1NtVlx4QjlIXHhGRVx4QjhqXHg4RFx4MDhfXHhEOFx4MTQrXHhFOVx4ODVceEUzKFx4QkJceERFXHhFQlx4RDdceENEd1hceEI2XHgwNlx4QzVceEMyQVx4RjhbXHg5M1x4ODk3XnBceEZBXHg5MTp9XHhBMlx4RUZceDg4XFx4QzBceDBCVUhceDhEXHhCNVx4RkNceERDXHhGOTpceDlBQFx4RjJceDg2ZVx4QkJceERBSnkpXHhERFx4RjlceDg4SFx4ODhBXHhCRVBPe0lceEZCXHhCM1x4QzZceDAzXHgwMlx4MEJceEJFSFx4MERzXHhBOFx4Q0JceERFXHhDNypceDE3XHg3RntceDFDSmBceDFDXHhBQlx4QTZceENGXHhEMz5ceEJCL1x4RjNceDhBSTtceEJFXHhBNFx4QjNceEJGRlx4RjhmXHhFQXxRXHgxNUpcXHhFRjxceDdGXHhGQVx4QzMjO1x4RkFceEIxXHhDMFx4OEFceEI5XHg3RjJceDkyXHgxQVJceEQzXHhFOXEwYFx4N0YjXHhFRFx4MTVceDAwO1x4QTdodFx4QkVceDAyXHg4MldAQTVkXHhCMGpceEU1XHhDRE1ceDFCXHg4NldxXHhERlBceEQwXHhCMVx4OUFceEE3dFBvNFx4RkZMXHg5QmxceDE5XHwxXHg5QVx4Q0NceENCXHhBM1x4MTN8XHhEM1cpVlx4QkNceEMwXHgxRUtceEREXHg5Nlx4MDkzXHhCMVx4OTFceEY4XHhCQVx4OEZceEVGXHhENEFceEJBXHhCOUxceDhDXHhBNVx4OUNceENEL1x4QjE6XHhBRlx4MUVJWFx4ODdceENGXHhFM2hceDE0XHgxRFx4RTJceDk2XHhDMFx4MDUlXHhDRiVceDE0XHhBMlx4MEFceDA5XHgxRlx4MTZceDhGeFx4MDVceEQyXHhEMVx4OTdceDhFXHg4M1x4QzhDXVNceDk4bmVceEZCXHg4OVx4Q0RceDAyUVx4REJceEE3XHgwNiErXHhGQVdRc1x4QzZceEREXHgwMEpceEY1Y1x4QzglXHhCQyNceDk4XHg4M0JceDgwXHg4MVx4QUJceDhEXHhGQzdceEREUjdceENBbkNpMClzPFx4QzRceDkzZVx4RThceDk2KmFceEE3XHhCQVFceEJDXHhCQ1x4RDVceDBGXHgxRVx4RDZWXHgwNywqTDwyXHhBMCtceDExXHhGMTZ1XHgwOSFceEM0XHhEMVx4MTRceDBDXHhBMlx4MTkvXHg4N1x4QjRceENFJ1x4QTU7XHhEM1x4RkZ7LkdkXVx4QkJceEVBXHhDN0dCIVx4REN0XHhDOS5ceEFEXHgxOFx4QjFFXHgwMlx4RkFceERFXHgxOVx4MTBceEYzXHhEMzYgXHhDRFx4MTRGXHhFQlx4QjBfXHhDM1x4OTFceERDK1x4MTlsXHhGM1x4QzdFXHhCOVx4QjJRXHg5MFx4MTVceDAyXHgwQTVceDgzaGZyXHhBN0cwXHhEQUBceDExXHhEMlx4QzB0Jlx4QzJVXHgwRkMvUlx4QUNceDlBXHhGRFx4RDJLJ1JceEU3dj5ceDlCYlx4OThydlx4MTJMXHgwQ1pceDhEIWtceDkyXHhDMVx4RDhceDFCXHhCM1x4Q0VceEZDXHhFQSx4XHhFMVx4QTlXXHhFMi9ceEE1JFx4MTJceDFBXHhDNnJceEIzXHg5Mlw+XHg5OFx4RUNceEVDXHhDN1x4REFceDBFXHg5MVx4ODZceDEwXHhFMFx4RUFceDEzXHg4MTMpXHhCRVx4OTdTXHhDM2o9XHhCMVx4RDVxRlx4ODZrY1x4QjMzXHhCM2NceEJCXHhGMldOW1x4OERceEFGc25PXHg5Q1x4QzlceDhFXHg5QVx4QjUzelx4RDltcVx4QkVbXHhGRVx4QkInXHhBRFx4QTZceDg1KVx4QUEnflx4ODc5XHhGQ1x4QUJceDlFXHhCRjEzXHg5My4gPEVceDA4XHgwOFx4MEVceDA4XHhFOF9ceENBQFx4MDdceDk3XHhENC1ceDEzXHhFOFx4QjNceEJDXHhEQ1x4QzFceDlCZlx4QTBceEU4XHhGRVx4QTNwXHhGQzR8XHg4MFx4RUZceERCXHg4OUIoXHg4NHs7d3chQU5jWy5ceEI5XHgwRFx4QThceEI0XHhGRVx4QkNceEZCXHgwNFx4RjZMXHhFMlx4QzR1XHhGOFx4MEFHNlx4OTVWXHhGMFx4RUZceDAyY1x4ODRceDg4XHg5RU81NGZEdVx4OUN0XHg3RlpceEI0VFx4Q0RceEFEXHhCM1x4RkRceEUwXHhEMzFceDkzXHhGM1x4RUJceEU1YUZceDhFXHgwNVx4QTVzXHhDMnVceDA5XHhFRHhceEU2XHhBQmRceEQ4XHhCNFx4MTFceDA0XHg5NyJceENEXHhCRm9FXGBceEFDIjBceEZCaDlceEI4MVx4QjhceEU3XHhDMCs3ZVx4QTd+WFx4QzFVXHhDNlx4OUZceEI5XHhDRVx4MDhceENBaVx4MDJgXHgxOFx4ODJceDFCXHgxMlx4ODVceEI4XHg4Q1x4ODZceEM5RVx4MTZceERCWThaRVx4MUFceDg2XHgwOVx4QURceDhCTV1ceEY4XHhFNlx4QTBceERCZilceEJGXHhDNVx4RkRceEU2J1x4Q0NceEUxXHgxQnV5eFx4REYqfFx4QUJceDk4XHgxN1x4QURceEY4eVx4OEJceEU2XHg5NHBbXHgwRlUxXHhCOCtceDAyOlx4MTlaXHg5Nlx4MUUsaFx4Q0RceDg1XHgxM11gRVlceEYxflx4ODhceEM2XHhBOFx4MEVceEYxXHhFOFx4OTdceEE3MFx4N0ZceDg5XHg5OFx4RDBceDk3XHhGNFx4RERceEI0XHhCQlx4RkFceDhFXHhGQVx4MDFceENDTVx4RjFceDhCXHhCMFx4RjhceDA3LFx4RkNceDgwXHhGRFx4RjluXHhDM1x4MUNceEU4XHg5Qlx4MUJxXHhFQj9ceEM3XHgxN3szQUpceEZFUj9ceDkwNDdPXHgxRFx4RTlceDgyXHhGNVx4OTBceEM1LFx4MTlceDBEPlx4RDV4XHhGQ1x4RTBceDE1XHhFRHBceEZBemRceDk0XHgwQyZceEVCXHhGNFx4RTVceDAxTGdceEQ2XHhDRVx4QjlceDg2XHgxQlx4RjIiXHhBRFx4QjhceDkwXHhFN1x4MEZceDhCXHhFODhceEE1OkluXHhCNlx4MEZceEQ0XHhGOFx4QzdceEEyXHhEMFdceENGXHhBQ1x4MURceEQxXHhEMlx4MThceDE5XHg4QVx4OEVceEI0XHhCOFx4RDNceEM3XHg4Nz9ceEQxNlx4QjVmXHgwOFx4RjNcI2hceEFFXHhERVx4QkRceEU4XHgxQj94XHgxNFx4OUQgXHhBRlxVXHhENFx4ODN5XHgxQVx4QkFceDlDXHg5Rlx4QjVtXHhEMlx4MUNceDA1XHhCMEBceDA5ImdceEFGXHhDQVx4REVceDhDXHhGOVx4OUFceDA5Xiokelx4RDQyXHhCOVx4OTlceEVBXHhERDZyXHg5MVx4RkNxXHhBODRceEU1XHg5RUFceEI3XHgxRm15Ulx4QTJceEVEXHg4RVx4OTggXHhFRlx4QjBceENDNHRiflx4MThceDg4XHhDQTFceERCLltWSlx4RTgmXHgxOVx4OUFceEY2ME9ceERCN3IjXHhEMGBceDA3XHhFN1x4MURceDA0V0VceEFCYFx4ODN9RVx4QUNSXHgwOFx4OTVceEU0XHhCNFx4RDFceDhDXHgwMCFceEQ4XHgxNVx4REEqXHhCNlx4MDVceEQyXHgwM1x4RUZceEIzTFx4Q0JceERGXHhCME5ceDg3XHg4OVx4RTRIXHg4OXJceDkyXHg4NFBceEM3XHgwOFx4REFceDE3XHhBOVx4REJceDE3fFx4MTBceDAxc1x4RENceEQxXmtceDAwXHhDNVx4RUJibVx4MDRceEVDXHhGRlx4RDBceDBEXHhGQjNbXHgwN0tceEY2RVx4MDlceDkzXHgwODlPXHhFNDhceEIwXHgxMVx4MDlceENCXHhDOVx4REFeLVx4QUJceDAzXHhCOV5ceEUyXHgwNlx4QjlceEJCWlx4MTBPXHg4NVx4RjZceDdGXHhCMkdceENGIXpceEU5XHgxM1x4QjNqXHhCQVBceDBBYEhceEUwXHgwOFx4QUU9XHhGMjNceDgyXHgxNXNceEZBU1x4OUZceEM2IFx4MDNceEMxXHJ6XHhDQWoyZ1x4MEVceDFEXHhBQVx4QzItXHg5QUo6OixMXHhBRVx4OTBceEY2UFJceDE3XHhCMFx4RERceEM5XHg5NyBceEI1XHg3RmBceEM1XHgwRkxWXHg5Qlx4RkZceEU0SVx4RkZceDk3VVx4OURfXHhGOFB1XHgwM1x4QURceEYwXHg4Qlx4Q0JIVlx4REZceDA4Zlx4N0ZceDA4XHhEMWRceEVFXHhCNlx4ODVceEJERVx4OTNceEVGXHgwOFx4RTJnXHhBNVx4RTQhXHgxQlx4RjEiYFx4MDA3R1x4QkJ4XHg5OFx4OTdhXHg5NFx4RThceEE3XHhBQ1x4QzFceENEXHhDN1x4QkVceEU1YFh2XHgxNFx4QjhtNXZceDkyZzlceDlGXHhENVx4OUVceEFCXHhEMFx4MURceEY0XHg4OVx4QzZceDg1XHgxOWhZelx4RjBceERERlx4ODNceEM1Ilx4RTExYWNCdlx4RDdceDE1XHg5RFx4Q0FceDBEQDZycnZceDk2XHg4QVx4OUZceDg5XHgxRCBceDkzXHgwNi53XHhFOHBlMFRceDkzXHg4NCF+XHg4NVx4MTVOXHhGQVx4OUVceDg3XHhDRVx4QTVceEYyXHg3Rlx4RjhceEU1XHg4OVx4OTlceEZFXHhGM1x4MURBXHgxQlx4RkJceEY5Xlx4OUZceEUxXHgxQVx4MUJceEFFRktceEI3XHhEQS9ceEM4XHhBMFx4MDQ7UVxrXHhFQlx4OUN9NnpceEIzXHhBNVx4QUJceDgyXVx4QzJceDlFQ1x4QTNceDg2XHhDMVx4MDJiXHhDQ1x4RERceENCXHhDOFx4QTBuVlx4MERsVVx4QjFceDkxRWFceEEzXHg5Rlx4QjAhI0NceDA3XHgxN1x4Q0NceDkzXHg4Mlx4ODY8XHg4OVx4MURxXHhFMCNceENCN1x4QjBQXHhFRFx4REElXHhBOVx4OUVceEE4XHgwQydceDhBIlx4RDVceEYxXHg4ODckXHg5MVx4OTdvXHg5Nlx4QkRceDA1QStceEQ4XHg5QVx4Q0VceEYyXHgwRS00R2ciZHZceEU0XHhGOXNceEQ4XHhCRjUtXHhGN1x4OUIjXHgwRFx4RDZzXHhEOVx4RThceENFXHgwRlx4OTU1XHhFMFx4REIkXHgwM0MmXHhGMlx4ODdceDFGWlx4MDM2XHhGMXxceEEzXHhEMDxoUVx4QzEwPFlceEE4bVx4QzglXHhBRFx4Q0JuMVx4RENkXHg4Nlx4RDFRXHg5REJ7cEpceEI3XHgwNVx4RkN1XHgxRlx4QzBceDBGXHg5Rlx4MThceEFDXHhGNVx4QTlceDg0XHgxQ3xceDk3XHhGMVx4RTc4JFx4RjVVXHhGMVx4RDhceEVFdlx4RTBceDhFXHg4RVBceDg3XHgwQlx4RDNceEQ1YzpceEY0XHhERFd1JjNtQVx4QkEoIllTXHhFQTB+dFx4OEFvXHhCOFx4Q0ZceDBCXHg5QXhceDBBOFx4RDg7Q1x4RUJceEJCXHg5MFx4MTMvXHg5NTdceENFXHhEQS5ceEU1N1x4MDAsNlx4RDZceEIyXHgwNVx4OURceEVDXHhDNThceDhGXHgwNVx4OThceENDXHgwQVx4MDlceDlDM1x4ODhjLSBceEY3XHgwOFx4OTRGXHg5N1x4QjFceDE2YjpceEU5Olx4QTVceDA1aVx4RUZceEY1XHhCQVx4MTRceEExXHg5OVx4MTJceDEzXHhCNWRceDhGXHhCNEFceEY3XHhGN1x4RDJceEE3XHhFNlx4MENUdlx4RjFceDBFUlx4RTJceEYxNVx4RDEkIT97XHhGMkFceEIyXHhEN1hceDEwXHhCNFx4OUZceDlFXHhFOFx4ODJceDg1T1x4QzdceEQ2XHhGNE4+UFx4RUNyRmlceDlBWVhceEM2XHg4NVx4QUNtXHhDN1x4ODQ/XHhBMlx4QzVceEQ0XHhBMFx4MDFceDA0XHhGM1x4RDJceDk0XHgxRVx4Q0NceEEzXHhGMTBvXHhENDFceDEyXHhCOFx4RDRAXHgxN1RceEUxXHgxNFx4QjVceEFGXHhBMUVueidTXHhFN1x4RERFRVx4QTZ+QzxceEEwLXt1XHg4Rlx4QUVceDhCXHg4MFx4RTNceDE1XHhERlx4Q0FceDBCXHhCMlx4REZceDhFdFx4OEJDXHg5Q19cdUc2eFx4QTBceEI0LVFceDE1XHhDRU4gZ1x4RTlceDg1YV5ceEZGXHhEOFRceEU4XHhCMFpceEM2XHgwNGdceEE1bVx4MUZcXHhDNFx4QUIqVFx4MDlhXHhENyRceEVGXHhBM1x4RjFceEEydHBceDk0XHhCOVx4RjFceEZCXHhEMHNqOURceEVEXHgwN1x4MEEjeVx4QkM5P1x4QjNceEFGXHhFQ0tnSFx4MDZceEYydlx4QkZOXHhFNlx4RjNceENBXHhCRGF4XHg3RjNceDE3XHgxQlt8XHhGRVx4OTZLXHhEOVx4OTdceDEwWVx4RTlceEE3Rj8nXHhCRFx4MUJceDA0XHgwQVx4QkJceEE3XHg5Qk9ceEQ2XHgxQ1x4MUNceEZBRTsoXHg4MzhPXHgwRktlXHhGRFx4MERceEYzQ1x4MTFceDg5XHgwQihceEU3XHg4NWsuPDRceEMyclx4MDltSXpceDhDNFx4RUZceDA2Plx4REVceEFDRFx4RkNceEVFXHhDNmNceEJBXHg4Nlx4RkRceDEzXHgxN29Adlx4QTFxSFx4MThceDA3Rlx4QkJRXHgxMXdceDAzXHhGMVx4ODNceDk0XHhCOD9GXHg4RDBceDk4XHhEN1x4RjhceDgyXHhBQ1x4QzVceEI4XHhGRVx4MThceENFfFx4QkZceDlGQ19TXHhDOEVceEFCMlx4REJiXHg3Rlx4RTZceERGXHgwN1x4QjdEN1x4ODFceEU4XHhENzBceDhCdlx4MDdceEI0XHhEMlx4RkNceEU0MFx4MDVceEJBXHhDRlx4QzZceEIxdlx4QTV9XHg4OFx4RUJceDlBXHhGRlx4MDJsXHg4MCNceEE1LFx4RDdceDA2XHhENjwrXHgxMkdceEQ2UntceDgzXHhFQVx4RkQ+PV9QMVx4QTQ8XFx4OTVceDE5XHhEMVx4MUFceDBGXHhERFx4RTZceDAzXHgxMFx4RUI6XHg4OFx4MTBceEU2XHhBM1x4RkJceEI5alx4MEFUKjpceEI4flx4RjRceEI2YDNceEE3XHhBOFx4RkZceDE5XHhDN3krXHgwQ3xceDAzXHg5MVx4QzZBXHhCRCtceEM0XHhDNTVceDgxXHhEQ1x4QTQ4dHB6XHg5M1x4OThceDAwKUFlXHhGRCBceDgxXHhFN1x4ODFxd0lceDgwbVZzXHhDM1x4RkRceERFXHhGOVx4QzlceEJENyhceEEzXHhFMlx4QzVKXHgwMVx4RjFceEQzXHhCM1x4RkRceEMySVx4MEFJXHhDNjl3XHhCQ1x4RjYyXHhCRFx4QjYhelx4QTVceDE4IlpceDkyLFx4MUM0XHhFN1x4RUNceEJBXHg5N1x4QTNceEQyXHhFOVx4RDFceDFBWDBceEYzREM8XHg5MENceEY5KFx4QTI0XHhBOCBHXHg5N1x4ODZceEE2XHhBM3RTR0Z4XHg5N2FceEExXHhCRVx4QTRxJnhceEQybjAmLURceDg2eFx4RThceEM2ZDF+Plx4MUVceDA0XHhGNVx4QUNceDlGXHgxNVx4RkNceEVFXHhFQVx4MDZFXHhCQlx4OTNceEZCXHhBQlx4RjBceEFFU1x4OTZceEE0KUZceEREXHhBOTlceDhBPlx4MDhceEZDMlx4MTduXHhDQVpceEVFIVx4RTdceDBCXHhCNWJceEQ4XHg4RFx4REYxXHhCMVx4RUFceDExXHhBNVx4QTlzXHhBRUhrXHhBMT1ceDgyW1x4MTY1Olx4Qjd2XHg4N2NceERBT1x4MUZceEVEXHhGMFx4QjVhOFx4MUJOXHgxMFx4OTlceDk3P3JceEVEXHhGNkVceDhCXHhEQlx4QTFceEMwXHhDQVx4QjlceEUwXHg4Q1x4MDlsXHhFN1x4QzhceDkzXHgwNlx4OUNjXHhEQlx4QjFceDAwXHhCRFx4QjlCXHhCMVx4ODVceEM2Ilx4QjJceDA4X2NJQ1x4ODEvXHhFNFx4OTlceDE2XHhGM1x4QzVceEFGfCssXHgwMzdceEI1I2BceDk3XHgxRlx4RkRceDkxXHhDOFx4RDdceDFDWVx4QjVjRXJceERCXHhDNU5ceEVESEFceENFXHhCOEdceEI1XHgwMFtSUVx4RUJceEJCIFZceDA5N25ceEQyXHg4Rlx4QzNuZ1x4QUFceDE4XHhEM2dHXHg4OFx4RTFceEIzXHgxQmB8XHhBMFx4RUVceEUwXHg5NVx4RUFceEY3Tlx4RDZceERERVszO1x4QzUxXHg5RVx4QzMwXHhEN1x4REZhYlx4QTdceEREXHhENnVceERFXHhEQzZkblx4MUVoSFx4OENceENGXHhBRVx4MURceEU5VFx4RTVceDFCQlx4MDRceEQ0XHhENlx4MUFceDA5Slx4RkYgIW5ceEUxXHhDRVx4RDEoXFx4QzIsXHgxREtceEU3XHgxMlx4QzdceEVCXVx4RDdtXHg4NFx4Q0ZceDlEXHg4Q1x4RjFceEVGYDBceDFGXHhFMVx4QjVceEFBXHg4QVx4RjBceDkxXHhGMFx4OTBceEI4clx4RUE7XHg5Rlx4QTgkXHhEMlx4RjNceDlGXHgxOFx4RTdceERFIVJceDg5XHg5NVx4ODZceDE1XHhDN1x4MUNceEMzUlx4MTk6TDlceEVDSl9ceEUxXHhGOVx4OTlceEM4XHgxMVx4MDlceDg4XHgxN1x4RjU0cVx4RjJceDhDXHgxMlx4QTI5XHgwM1x4RUVIaFx4RkI1XHg4Q1x4RTJSXHhEQVx4RjJceDlEXHgwOFx4RDVUXHgwRFx4RjMrXHhERlx4OURiXHhFQ29ceEI2XHhFQVx4QjhceENDXHg5QmF4OTpceEI0XHhGQlx4QTdceEEyXHgxRmVceEY3I1BceDAzXHhGM1x4MTkrcVx4ODFceEY0XHgwOHNceEMzXHgwMFx4RTNceEZEdVx4QjVceEIwXHhCQixceDBEXHhBQVs+V1x4ODJceDg5elx4MTNceDA2XHhBNlx4Q0IgNFx4MEZwV1x4ODNCXHg5NVx4QkVceEZEXHhENFVceEM2XylceENEXHhCOVx4QUJceDBBXHhBMiJceEE4XHgxRlx4MEJVI1x4MDApXHhBMCFceENEXHhBMyhFXHhBNnJceDkwJFVceDhFXHhFRFx4QjlceDExXFx4MDRceDAxbzVcNFx4Q0RceEIzXHg5Nlx4QjRceDkxXHhBQ1x4MEZceEU0XHhCNDVceEI0MFx4OTdSXHhCRVx4ODhceEUxXHg5QSNDb1x4OERTXHg5QVx4MUZkXHg5Nlx4RUVceEYxXHhBRlx4QTlceEExXHg4Qlx4RDdceDg3XHhCN1dceEZFXHhGMVx4RjY1XHhBRVx4QkJceEE5XHhBRFx4MENceDE4XHhGNlx4QTdceDAzXHgxM1x4QjVceDFFXHhFRVx4OTgmXlx4OTlceDlDXHgwNFx4ODdceDEzXHhBMCNceDFETlx4RkMwXHg4NVx4REN+XHgxMmJceDAzXHhBNjdceDFDXHhDMVx4QTF4XHg4RkBceDg0XHgwMlx4QzZceEQ1XHhCOFx4MTdceEY5XHg5Rlx4RjhceDk3XHhCNWtceEI4bVx4ODZtW1x4RDFceDk4XHhEMlx4Q0JfZVx4RjhqRklceEY3d1x4QzJceEVCXHhCNEFceDA2XHgwQlx4QTRceDgyXHhBRTVceENFXHhEMUpcXHg5OFgxXHgxM1x4OTdceEYwXHhBMWRceEI2XHgwMVx4QjlceEY1XHg4MVx4ODBceDlGXHhDM1x4OTlceEVEXHhFRVx4RjRceEVEOVx4MUVJXHhEOVx4MUFaXHhBNFx4OThceDEyXHhGMWt4XGg0XHhGOG1ceEJEXHhBMitceERFN2hceDgwZ1x4MTZ3XHhFRFx4MEJceEY1Lz1ceEZFXHhFQlx4RTg5d1x4QUVwXHhFQlx4RUJceDg0alx4MDZceDk2b1x4RURceEJCZFx4OTg4IzVceDE0ejhceDFFRVx4MUFceDk1XHgwOVx4RUFceDgyXHg4QkRceEE1XHhCRi9ceEU2XHhBQUl4TytceEIwMUtceEYxXHhEOVx4ODFceENGXHhEOWpceDA3aVx4RDJceEU2T1x4QUFYXHhFN1x4RThceEQ4XHgxM1x4OUZAaFx4RjRceEQ3XHhBQ1x4ODVQXHg5Q1x4QjV1SFx4OTBceEVCXHhCMlx4OUZceDE2XHhDN1x4ODlceEMzXHg4M2xceEY2XHhDMSVceERDXHg5Nlx4RURceEYxXHgxQVx4OTlceENCXHhBQSVceEU3aEZceDFEXHhDOVx4ODhceDFBaVhceEE0XHhFMFx4RDN5XHhCRlx4OTZsXHhEMypceEFFXHhDQlx4RTlceENCXHhFOFx4QzJuXHhGQ1x4QUJceDk4IzBVXVx4RTJ3XHhFQkdceEY4W1x4QzhceDFDN1x4OUZceDkwLD9ceDgyXHhCMFx4QURceEQwXHgwMFx4MDdceDA0Y1x4OTE2RUNceEQ2a1x4REFceDgxXHhBOFx4QkRceEU2XHhBMVx4MENFWFx4QjB3XHgwOVx4Q0JceDE1dkJAXHgxQjFceEVBXHhBOFx4MDhrJ1x4MUNceDE5XHhEQTlceDBGKjFceDA1WnI2XHhEOVx4QTNceDBDXHhBOVx4QjFceEFEXlx4MDVpYzpceDk3XHgxODRceDE0J1JceDE0XHhFOWtceEE5XHgwNFx4RDdSIFx4OTBceEJERFx4QzdceEI5XHhFOFx4OTg/XHg4NzRceDE2XHhDN3ZceEM4XHhEMFx4MTVceDg3XHhCMFx4MDYpUVx4QTZceDlCXHhFQlx4RDVBXHgxQmlceEVBXHhGOFx4OUJceEEyXHhBRVx4OThceEY2cT1ceDg5Plx4OEFgXHhDOFx4QTRceDlFXHg5MVx4ODRceEJFTFx4MDFceEM2XHhEMkguQz1ceEZBXHhGRlx4QzZuXHg4NFx4RkRceEYwXHhBN1x4MEYoXHhERFx4MTZceEY0XHg5NjFceDA4XHhBRlx4QjlceEEwXHhGRDhceEE0flx4OTIrXHgwRFx4OTFceDk4IVx4QzdceEQwXHg5QjYgXHg4RVx4OTJbcFx4QzNpXHhGNVx4MDhceEIxXHhBQ1x4MDRceEIxblx4REJceDAwWzZceDgyW1x4RTJ2XHgwNlx4QTZvZlx4MThceEMzeSRjNVx4RThceDk3XHhEMVx4MTNceEQ4XHg4Qlx4RDNceEMwXHhCN1x4QkNSXHhFOVx4OTFceDAzXHgwNVx4QzBWKD1ceDg5XHg4MFx4N0YwXHg5N1x4QzliXHhEQSJceDE4XHg4Q2VceDhCXHhGNEBceDBFX1x4MDZceEY1JFx4RUZceEZBXHhBRFx4QTNceEZCXHhBOGVrZFx4RjBceEI4Ylx4RjllXHg4MjkpS1x4RTJceEUyO1x4QjdKdnhceERGXHhDRVx4Q0FceDg5XHhFQVx4QzRceDg5XHhBQT1ceEI0XHhCNlx4QkZceEQ5QVx4OTFceDBCT0xhXHhBRElceEI5Y1x4MERceDFGXHgwQndceEMwXHhBOVx4MTFceDE0I1x4REJceEU4XHhDMVx4MTFceDA2TVx4MDhceEVDXHgxNlx4MDZceEFDXHg5RF9ceEY0Z1x4QjRceEFEXHhFRVx4ODFceDA4XHgwOTRhPnlDXHhGMVx4OEYgXHg4Qlx4RTNceEFFXHhDNlx4MUNceDBGR1x4ODdceEZBXHhCRnxceEMwXUlceDkwNVx4MTFceEYyMlx4QTdceENDXHgxOFx4OEJceEIwV1x4RkFGMlx4QjZceEE1Yj9ceEQzXHhGOVx4QjdceDEwWFx4RTdceEI5Klx4Qzd3cFx4QkN1XHhBNlpceDA1XHhERlx4QjVceDA1T1x4QjlFXHg5M2FaXHgwNEc9XHhEMlx4RDZdXHgxMFx4RkJceEY2XHhGQ1x4QzBxXHhFMXZceDlBXHhDOHxceEYzYFx4OTBceEU5XHgxNlx4QzJceEQ5XHhGRnZceDAzXHhBQkRFXHhGQVx4QzhceEE3MFx4MTRceENCXHhCOVx4ODFceEE1XHg4OFx4RjBBXHhCMlx4OUZceENFUyBceEExXHhEMFx4ODVjXHhGM1x4MTMwXHhGQSxceEY1XHhCM0g7Tlx4RkQmXHgwMFx4RjdceEY3alx4MThceDhCI1x4RTNceEYxK1x4QjZcXHhGRiJceENGJlx4MENceEE4XHhGRFx4QzVnXHhERVx4MThceDlEPHZceEMzXHg4NyhceDA4XHhFRE5ceEI4XHhENFx4QUVceDE3XHhGNFx4QjJceEU1XHhFMiNceEE5Zlx4OTBceDEwXHhFRUMyVzlceEVCXHhCOFx4QjlceEE1UWlceDFGXHhEMVx4ODY/XHhENFx4ODVceEM2XHg5RnUqXHhDNyJceERFXHhGOVx4REZceDlBXHgwMH1ceDg3JjdjdFx4QjJceEUzXHhEQTcgOmdceDhGdyBELlx4MTFceEM1XHhEOFx4OTZWXHgxM29ceEY1X1x4MTlceENEXHhFOXhceERCXHhGQlx4OURceEZGO1x4RjJceEFDSlx4QTZxXHgxQWg/XHhDRFx4MTVgPlBceENCXHgxNCUxMkZDfW1ceEM1LVx4OTM4XHhFRVx4RkRceEIzXHhENVx4OUJceEM5XHhFRlx4MDFceEY1XHhBQS9ceEJCQVx4QTJLXHg5NkdceEFBXHhEQlx4RUFceDBEQ1x4OEVceEQzXHg4NVx4MDhceEJBc1x4RjRkXHgxMFx4QzR7JDhceDBBOlx4RjFceENEaVx4QjNceDhDXHhBMiBceEIwP0wmXHhCOUwkYWtceDEwXHhGRlx4RDEkOVx4OEJ8XHgwQk5ceERCIlx4QUNceEZGXHhCOU9ceEIxXHhBN1x4RTRceEI1V1x4RkVceDExQFx4ODd4a1x4MUVceDkzP1x4ODJceEIxeFx4QTNyXHg4RFx4QkFceDAzXHgxRVRceEU3PVx4RTFceEQwXHg4Qlx4QjN0XHgwNChDXHhDQVx4QUJJRS5LIFx4QjJceEM0XHhGNHRRXHhGQVx4QkJceENBXHhCNlx4MThceEY1XHhBQmR9XHgwOG5ceEM5XHhGQVx4MTFceDlEWVx4RTdceEI0Ylx4MDE8XHhDMVx4MThceEJCXHgwRVx4OTVceDhGXHhENk5kXHgwQ1x4ODRceEEwXHg5QVx4QkMmUklceDBBXHhCMVx4RjhceDhGW05ceDkwXHhFMlx4Rjh9XHhERlxceEE0XHg4Mlx4OTY8XHgxNU5ceDgwXHhBOFx4MTlceEQxSHNYXHg5MFx4Q0FceEQ4XHhDNHYxXHhGQlx4MDBceDExXHhEQWVNaU5ceEE4Slx4QTBTXHhDRlx4MDBJXHhERVx4QkIiXHhGRlx4QTNpXHhGRVx4MTRceEI2KnleXHgxMm5ceDg2TVx4OEJceENCXHhFMlx4RkZsXHg5N3dceDdGXHhFQVx4OTRceDk4XHhCOFx4MERPXHg5MT9YZHRlXHhERFxceEYyXHgxNFx4RUJceDEwXHhFQlx4OEUoJ1x4QzRceEYzXHg5Nlx4OEJceDA4XHhDQlRceEZCXHg4MjZceEY3XHhFQ1ZceEFCJVx4QTIyMFx4QjI8XHhFOSdceDExbVx4QzdceENCKVx4QjlceDFEXHhGMnZmXHhDOFx4RDhceDFFIVx4REVceDFBM1x4OERceDkxXHhGQVx4QzhceEE0XHgxOFx4RDdLKlNMXHhCQnNNXHg4NjNceENCXHhENzVOXHhGQSxceDExXHg5M2ZmXHgwRUFceEIwXHhBQ2JceDlFJ0t5alx4MDVMXHg4RFx4RTNceENCXHhERVx4QTdceEFDXHg5NVx4REJceEQwJlx4QzFceEJFXHhENFx4OEFceDlFJFx4QTVceDgwaHVceENBXHhCRlx4MENceEVCb2hceDE2IihceEExS1x4RDZceDkxXHhFRFx4QURceDg1XHhCOVx4MDFceEYyXHhGNlx4RUVceEU5XHg5MVx4Q0MtNVx4OUVceDlFXHgxRFx4QzR3XHg4OVx4RTdceEUxXHhENFx4MUZceEUxNDtceEI0XHhCQlx4MDFzXHgwRFx4OUNceEMyXHgxQ3JceERFXHhFMFx4QjM+XHhEN1x4MTZceEMxa0lceEEyN1x4QkNceDFDRVx4QUVceEI4Ylx4RTNceEQ3XHhBQVx4QUJfXHhCRUpceEIwXHgxNFx4OUZceDgzXHhEQVx4OURceDE5XHgwMVx4RDZceDEzb1x4QzdceDFBXHhCMVtfNVx4MTN2clx4RjhceDAwIm9ceERGXHhGNVx4QTlceDFEXHg5NjNceDg2XHhGRlx4QzVceDhBXHhENFNtXHhGN2A4Rlx4OTAjXHg3RllEXHgxQ1tceDgyXHhCMVx4RjlceEUyPFx4OERceEU2XHhBRSJceEQxXHg4NyVceEJDcFx4RUVceEZDflx4ODFceEY0I1x4RThceEFFXHhGMVx4ODM2XHg5MFx4Rjl9XHhDOFJceDg0XHhGN1x4QzVceDlCXHgxMlx4MDImalx4Q0NceDlDXHg5N1x4RDNceEVCalx4MEQjelx4QTFceEExXHhENytceERDXHhENFx4MDVfXHhCQ1x4OTI6OExceEIyXHgxM0VtXHgxOFx4MDJceDgxXHgxQiklXHhDOFx4RTVceENDXHhCMnY1XHhDRFx4Qzh5XHgwRVx4QjlceDkxSCguandceDk2XHhBOVx4REI4XHhGNFx4RjRceDgxXHg5MVx4RDRceDk3UmxceERGbUsrXFx4RjFceEJCXHgwRFx4MTVceDE0XHhDOVx4REZceENEXHg5Nk5ceEE3M1x4RTdceDEwXHgwQWRceEIxXHhBRFhceDBEXHg4MFx4QkEzXHhERVx4RTV1Y1x4ODFKLFx4MTknX///m8XvCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5QbGF0Zm9ybSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5QbGF0Zm9ybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWYyMTVkCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLlBsYXRmb3JtCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK29yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkhhZG9vcFBsYXRmb3JtCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL1Rlc3RUYXNrQ29udGV4dC5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9UZXN0VGFza0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhkZWQzCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9UZXN0VGFza0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5GbG9hdFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkludFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkxvbmdXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5UZXh0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFRhc2tDb250ZXh0IGV4dGVuZHMgVGVzdENhc2UgeworICAKKyAgcHVibGljIHZvaWQgdGVzdFRhc2tDb250ZXh0KCkgeworICAgIFRhc2tDb250ZXh0IGNvbnRleHQgPSBuZXcgVGFza0NvbnRleHQobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgCisgICAgY29udGV4dC5zZXRJbnB1dEtleUNsYXNzKEludFdyaXRhYmxlLmNsYXNzKTsKKyAgICBhc3NlcnRFcXVhbHMoSW50V3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBjb250ZXh0LmdldElucHV0S2V5Q2xhc3MoKS5nZXROYW1lKCkpOworIAorICAgIGNvbnRleHQuc2V0SW5wdXRWYWx1ZUNsYXNzKFRleHQuY2xhc3MpOworICAgIGFzc2VydEVxdWFscyhUZXh0LmNsYXNzLmdldE5hbWUoKSwgY29udGV4dC5nZXRJbnB1dFZhbHVlQ2xhc3MoKS5nZXROYW1lKCkpOyAKKyAgIAorICAgIGNvbnRleHQuc2V0T3V0cHV0S2V5Q2xhc3MoTG9uZ1dyaXRhYmxlLmNsYXNzKTsKKyAgICBhc3NlcnRFcXVhbHMoTG9uZ1dyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgY29udGV4dC5nZXRPdXRwdXRLZXlDbGFzcygpLmdldE5hbWUoKSk7IAorCisgICAgY29udGV4dC5zZXRPdXRwdXRWYWx1ZUNsYXNzKEZsb2F0V3JpdGFibGUuY2xhc3MpOworICAgIGFzc2VydEVxdWFscyhGbG9hdFdyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgY29udGV4dC5nZXRPdXRwdXRWYWx1ZUNsYXNzKCkuZ2V0TmFtZSgpKTsgCisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL1Rlc3RCdWZmZXJQdXNoUHVsbC5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvVGVzdEJ1ZmZlclB1c2hQdWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjMzJjMAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL1Rlc3RCdWZmZXJQdXNoUHVsbC5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uRGF0YUlucHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5SYXdLZXlWYWx1ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5SZWNvcmRXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJlcG9ydGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkRhdGFSZWNlaXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVEYXRhU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLk5hdGl2ZURhdGFUYXJnZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suaGFuZGxlcnMuQnVmZmVyUHVsbGVlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmhhbmRsZXJzLkJ1ZmZlclB1bGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5oYW5kbGVycy5CdWZmZXJQdXNoZWU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suaGFuZGxlcnMuQnVmZmVyUHVzaGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmhhbmRsZXJzLklEYXRhTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlRlc3RJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0SW5wdXQuS1Y7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5SZWFkV3JpdGVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5Qcm9ncmVzczsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCitwdWJsaWMgY2xhc3MgVGVzdEJ1ZmZlclB1c2hQdWxsIHsKKworICBwdWJsaWMgc3RhdGljIGludCBCVUZGRVJfTEVOR1RIID0gMTAwOyAvLyAxMDAgYnl0ZXMKKyAgcHVibGljIHN0YXRpYyBpbnQgSU5QVVRfS1ZfQ09VTlQgPSAxMDAwOworICBwcml2YXRlIEtWPEJ5dGVzV3JpdGFibGUsIEJ5dGVzV3JpdGFibGU+W10gZGF0YUlucHV0OworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgdGhpcy5kYXRhSW5wdXQgPSBUZXN0SW5wdXQuZ2V0TWFwSW5wdXRzKElOUFVUX0tWX0NPVU5UKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQdXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtCVUZGRVJfTEVOR1RIXTsKKworICAgIGZpbmFsIElucHV0QnVmZmVyIGlucHV0ID0gbmV3IElucHV0QnVmZmVyKGJ1ZmYpOworCisgICAgZmluYWwgT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBPdXRwdXRCdWZmZXIoYnVmZik7CisKKyAgICBmaW5hbCBDbGFzczxCeXRlc1dyaXRhYmxlPiBpS0NsYXNzID0gQnl0ZXNXcml0YWJsZS5jbGFzczsKKyAgICBmaW5hbCBDbGFzczxCeXRlc1dyaXRhYmxlPiBpVkNsYXNzID0gQnl0ZXNXcml0YWJsZS5jbGFzczsKKworICAgIGZpbmFsIFJlY29yZFdyaXRlckZvclB1c2ggd3JpdGVyID0gbmV3IFJlY29yZFdyaXRlckZvclB1c2goKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKEJ5dGVzV3JpdGFibGUga2V5LCBCeXRlc1dyaXRhYmxlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBLViBleHBlY3QgPSBkYXRhSW5wdXRbY291bnQrK107CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0LmtleS50b1N0cmluZygpLCBrZXkudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0LnZhbHVlLnRvU3RyaW5nKCksIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBCdWZmZXJQdXNoZWUgcHVzaGVlID0gbmV3IEJ1ZmZlclB1c2hlZShpS0NsYXNzLCBpVkNsYXNzLCB3cml0ZXIpOworCisgICAgZmluYWwgUHVzaFRhcmdldCBoYW5kbGVyID0gbmV3IFB1c2hUYXJnZXQob3V0KSB7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc2VuZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgb3V0cHV0TGVuZ3RoID0gb3V0Lmxlbmd0aCgpOworICAgICAgICBpbnB1dC5yZXdpbmQoMCwgb3V0cHV0TGVuZ3RoKTsKKyAgICAgICAgb3V0LnJld2luZCgpOworICAgICAgICBwdXNoZWUuY29sbGVjdChpbnB1dCk7CisgICAgICB9CisgICAgfTsKKworICAgIGZpbmFsIEJ1ZmZlclB1c2hlciBwdXNoZXIgPSBuZXcgQnVmZmVyUHVzaGVyKGlLQ2xhc3MsIGlWQ2xhc3MsIGhhbmRsZXIpOworCisgICAgd3JpdGVyLnJlc2V0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlBVVF9LVl9DT1VOVDsgaSsrKSB7CisgICAgICBwdXNoZXIuY29sbGVjdChkYXRhSW5wdXRbaV0ua2V5LCBkYXRhSW5wdXRbaV0udmFsdWUpOworICAgIH0KKyAgICBwdXNoZXIuY2xvc2UoKTsKKyAgICBwdXNoZWUuY2xvc2UoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtCVUZGRVJfTEVOR1RIXTsKKworICAgIGZpbmFsIElucHV0QnVmZmVyIGlucHV0ID0gbmV3IElucHV0QnVmZmVyKGJ1ZmYpOworCisgICAgZmluYWwgT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBPdXRwdXRCdWZmZXIoYnVmZik7CisKKyAgICBmaW5hbCBDbGFzczxCeXRlc1dyaXRhYmxlPiBpS0NsYXNzID0gQnl0ZXNXcml0YWJsZS5jbGFzczsKKyAgICBmaW5hbCBDbGFzczxCeXRlc1dyaXRhYmxlPiBpVkNsYXNzID0gQnl0ZXNXcml0YWJsZS5jbGFzczsKKworICAgIGZpbmFsIE5hdGl2ZUhhbmRsZXJGb3JQdWxsIGhhbmRsZXIgPSBuZXcgTmF0aXZlSGFuZGxlckZvclB1bGwoaW5wdXQsIG91dCk7CisKKyAgICBmaW5hbCBLZXlWYWx1ZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgS2V5VmFsdWVJdGVyYXRvcigpOworICAgIGZpbmFsIEJ1ZmZlclB1bGxlZSBwdWxsZWUgPSBuZXcgQnVmZmVyUHVsbGVlKGlLQ2xhc3MsIGlWQ2xhc3MsIGl0ZXIsIGhhbmRsZXIpOworICAgIGhhbmRsZXIuc2V0RGF0YUxvYWRlcihwdWxsZWUpOworCisgICAgZmluYWwgQnVmZmVyUHVsbGVyIHB1bGxlciA9IG5ldyBCdWZmZXJQdWxsZXIoaGFuZGxlcik7CisgICAgaGFuZGxlci5zZXREYXRhUmVjZWl2ZXIocHVsbGVyKTsKKworICAgIGludCBjb3VudCA9IDA7CisKKyAgICB3aGlsZSAocHVsbGVyLm5leHQoKSkgeworICAgICAgZmluYWwgRGF0YUlucHV0QnVmZmVyIGtleSA9IHB1bGxlci5nZXRLZXkoKTsKKyAgICAgIGZpbmFsIERhdGFJbnB1dEJ1ZmZlciB2YWx1ZSA9IHB1bGxlci5nZXRWYWx1ZSgpOworCisgICAgICBmaW5hbCBCeXRlc1dyaXRhYmxlIGtleUJ5dGVzID0gbmV3IEJ5dGVzV3JpdGFibGUoKTsKKyAgICAgIGZpbmFsIEJ5dGVzV3JpdGFibGUgdmFsdWVCeXRlcyA9IG5ldyBCeXRlc1dyaXRhYmxlKCk7CisKKyAgICAgIGtleUJ5dGVzLnJlYWRGaWVsZHMoa2V5KTsKKyAgICAgIHZhbHVlQnl0ZXMucmVhZEZpZWxkcyh2YWx1ZSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGF0YUlucHV0W2NvdW50XS5rZXkudG9TdHJpbmcoKSwga2V5Qnl0ZXMudG9TdHJpbmcoKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRhdGFJbnB1dFtjb3VudF0udmFsdWUudG9TdHJpbmcoKSwgdmFsdWVCeXRlcy50b1N0cmluZygpKTsKKworICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgICBwdWxsZXIuY2xvc2UoKTsKKyAgICBwdWxsZWUuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdXNoVGFyZ2V0IGltcGxlbWVudHMgTmF0aXZlRGF0YVRhcmdldCB7CisgICAgT3V0cHV0QnVmZmVyIG91dDsKKworICAgIFB1c2hUYXJnZXQoT3V0cHV0QnVmZmVyIG91dCkgeworICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hTZW5kRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBzZW5kRGF0YSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPdXRwdXRCdWZmZXIgZ2V0T3V0cHV0QnVmZmVyKCkgeworICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVjb3JkV3JpdGVyRm9yUHVzaCBpbXBsZW1lbnRzIFJlY29yZFdyaXRlcjxCeXRlc1dyaXRhYmxlLCBCeXRlc1dyaXRhYmxlPiB7CisKKyAgICBwcm90ZWN0ZWQgaW50IGNvdW50ID0gMDsKKworICAgIFJlY29yZFdyaXRlckZvclB1c2goKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoQnl0ZXNXcml0YWJsZSBrZXksIEJ5dGVzV3JpdGFibGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKFJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgY291bnQgPSAwOworICAgIH0KKyAgfTsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hdGl2ZUhhbmRsZXJGb3JQdWxsIGltcGxlbWVudHMgTmF0aXZlRGF0YVNvdXJjZSwgTmF0aXZlRGF0YVRhcmdldCB7CisKKyAgICBJbnB1dEJ1ZmZlciBpbjsKKyAgICBwcml2YXRlIGZpbmFsIE91dHB1dEJ1ZmZlciBvdXQ7CisKKyAgICBwcml2YXRlIElEYXRhTG9hZGVyIGRhdGFMb2FkZXI7CisgICAgcHJpdmF0ZSBEYXRhUmVjZWl2ZXIgZGF0YVJlY2VpdmVyOworCisgICAgcHVibGljIE5hdGl2ZUhhbmRsZXJGb3JQdWxsKElucHV0QnVmZmVyIGlucHV0LCBPdXRwdXRCdWZmZXIgb3V0KSB7CisgICAgICB0aGlzLmluID0gaW5wdXQ7CisgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRCdWZmZXIgZ2V0SW5wdXRCdWZmZXIoKSB7CisgICAgICByZXR1cm4gaW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVJlY2VpdmVyKERhdGFSZWNlaXZlciBoYW5kbGVyKSB7CisgICAgICB0aGlzLmRhdGFSZWNlaXZlciA9IGhhbmRsZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbG9hZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgaW50IHNpemUgPSBkYXRhTG9hZGVyLmxvYWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhTG9hZGVyKElEYXRhTG9hZGVyIGRhdGFMb2FkZXIpIHsKKyAgICAgIHRoaXMuZGF0YUxvYWRlciA9IGRhdGFMb2FkZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgaW50IGxlbiA9IG91dC5sZW5ndGgoKTsKKyAgICAgIG91dC5yZXdpbmQoKTsKKyAgICAgIGluLnJld2luZCgwLCBsZW4pOworICAgICAgZGF0YVJlY2VpdmVyLnJlY2VpdmVEYXRhKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoU2VuZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZGF0YVJlY2VpdmVyLnJlY2VpdmVEYXRhKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE91dHB1dEJ1ZmZlciBnZXRPdXRwdXRCdWZmZXIoKSB7CisgICAgICByZXR1cm4gdGhpcy5vdXQ7CisgICAgfQorICB9CisKKyAgcHVibGljIGNsYXNzIEtleVZhbHVlSXRlcmF0b3IgaW1wbGVtZW50cyBSYXdLZXlWYWx1ZUl0ZXJhdG9yIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIEJ5dGVzV3JpdGFibGUga2V5OworICAgIEJ5dGVzV3JpdGFibGUgdmFsdWU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0YUlucHV0QnVmZmVyIGdldEtleSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gY29udmVydChrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRhSW5wdXRCdWZmZXIgZ2V0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIGNvbnZlcnQodmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgRGF0YUlucHV0QnVmZmVyIGNvbnZlcnQoQnl0ZXNXcml0YWJsZSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIGIud3JpdGUobmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KSk7CisgICAgICBmaW5hbCBieXRlW10gYXJyYXkgPSBvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgIGZpbmFsIERhdGFJbnB1dEJ1ZmZlciByZXN1bHQgPSBuZXcgRGF0YUlucHV0QnVmZmVyKCk7CisgICAgICByZXN1bHQucmVzZXQoYXJyYXksIGFycmF5Lmxlbmd0aCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKGNvdW50IDwgSU5QVVRfS1ZfQ09VTlQpIHsKKyAgICAgICAga2V5ID0gZGF0YUlucHV0W2NvdW50XS5rZXk7CisgICAgICAgIHZhbHVlID0gZGF0YUlucHV0W2NvdW50XS5rZXk7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvZ3Jlc3MgZ2V0UHJvZ3Jlc3MoKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH07Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9UZXN0Qnl0ZUJ1ZmZlclJlYWRXcml0ZS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvVGVzdEJ5dGVCdWZmZXJSZWFkV3JpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZmZGNiCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvVGVzdEJ5dGVCdWZmZXJSZWFkV3JpdGUuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5TaG9ydHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suTmF0aXZlRGF0YVRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitwdWJsaWMgY2xhc3MgVGVzdEJ5dGVCdWZmZXJSZWFkV3JpdGUgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlWzEwMDAwXTsKKworICAgIElucHV0QnVmZmVyIGlucHV0ID0gbmV3IElucHV0QnVmZmVyKGJ1ZmYpOworICAgIE1vY2tEYXRhVGFyZ2V0IHRhcmdldCA9IG5ldyBNb2NrRGF0YVRhcmdldChidWZmKTsKKyAgICBCeXRlQnVmZmVyRGF0YVdyaXRlciB3cml0ZXIgPSBuZXcgQnl0ZUJ1ZmZlckRhdGFXcml0ZXIodGFyZ2V0KTsKKyAgICAKKyAgICB3cml0ZXIud3JpdGUoMSk7CisgICAgd3JpdGVyLndyaXRlKG5ldyBieXRlW10gezIsIDJ9LCAwLCAyKTsKKyAgICB3cml0ZXIud3JpdGVCb29sZWFuKHRydWUpOworICAgIHdyaXRlci53cml0ZUJ5dGUoNCk7CisgICAgd3JpdGVyLndyaXRlU2hvcnQoNSk7CisgICAgd3JpdGVyLndyaXRlQ2hhcig2KTsKKyAgICB3cml0ZXIud3JpdGVJbnQoNyk7CisgICAgd3JpdGVyLndyaXRlTG9uZyg4KTsKKyAgICB3cml0ZXIud3JpdGVGbG9hdCg5KTsKKyAgICB3cml0ZXIud3JpdGVEb3VibGUoMTApOworICAgIHdyaXRlci53cml0ZUJ5dGVzKCJnb29kYm95Iik7CisgICAgd3JpdGVyLndyaXRlQ2hhcnMoImhlbGxvIik7CisgICAgd3JpdGVyLndyaXRlVVRGKCJuYXRpdmUgdGFzayIpOworCisgICAgaW50IGxlbmd0aCA9IHRhcmdldC5nZXRPdXRwdXRCdWZmZXIoKS5sZW5ndGgoKTsKKyAgICBpbnB1dC5yZXdpbmQoMCwgbGVuZ3RoKTsKKyAgICBCeXRlQnVmZmVyRGF0YVJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlckRhdGFSZWFkZXIoaW5wdXQpOworICAgIAorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgcmVhZGVyLnJlYWQoKSk7CisgICAgYnl0ZVtdIHR3byA9IG5ldyBieXRlWzJdOworICAgIHJlYWRlci5yZWFkKHR3byk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodHdvWzBdID09IHR3b1sxXSAmJiB0d29bMF0gPT0gMik7CisgICAgCisgICAgCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIucmVhZEJvb2xlYW4oKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0LCByZWFkZXIucmVhZEJ5dGUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1LCByZWFkZXIucmVhZFNob3J0KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNiwgcmVhZGVyLnJlYWRDaGFyKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNywgcmVhZGVyLnJlYWRJbnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg4LCByZWFkZXIucmVhZExvbmcoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUocmVhZGVyLnJlYWRGbG9hdCgpIC0gOSA8IDAuMDAwMSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUocmVhZGVyLnJlYWREb3VibGUoKSAtIDEwIDwgMC4wMDAxKTsKKyAgICAKKyAgICBieXRlW10gZ29vZGJveSA9IG5ldyBieXRlWyJnb29kYm95Ii5sZW5ndGgoKV07CisgICAgcmVhZGVyLnJlYWQoZ29vZGJveSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ29vZGJveSIsIHRvU3RyaW5nKGdvb2Rib3kpKTsKKyAgICAKKyAgICBjaGFyW10gaGVsbG8gPSBuZXcgY2hhclsiaGVsbG8iLmxlbmd0aCgpXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlbGxvLmxlbmd0aDsgaSsrKSB7CisgICAgICBoZWxsb1tpXSA9IHJlYWRlci5yZWFkQ2hhcigpOworICAgIH0KKyAgICAKKyAgICBTdHJpbmcgaGVsbG9TdHJpbmcgPSBuZXcgU3RyaW5nKGhlbGxvKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIGhlbGxvU3RyaW5nKTsKKyAgICAKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJuYXRpdmUgdGFzayIsIHJlYWRlci5yZWFkVVRGKCkpOworICAgIAorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgaW5wdXQucmVtYWluaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhhdCBVbmljb2RlIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgYmFzaWMgbXVsdGlsaW5ndWFsIHBsYW5lLAorICAgKiBzdWNoIGFzIHRoaXMgY2F0IGZhY2UsIGFyZSBwcm9wZXJseSBlbmNvZGVkLgorICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENhdEZhY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMTBdOworICAgIE1vY2tEYXRhVGFyZ2V0IHRhcmdldCA9IG5ldyBNb2NrRGF0YVRhcmdldChidWZmKTsKKyAgICBCeXRlQnVmZmVyRGF0YVdyaXRlciB3cml0ZXIgPSBuZXcgQnl0ZUJ1ZmZlckRhdGFXcml0ZXIodGFyZ2V0KTsKKyAgICBTdHJpbmcgY2F0RmFjZSA9ICJcdUQ4M0RcdURFMzgiOworICAgIHdyaXRlci53cml0ZVVURihjYXRGYWNlKTsKKworICAgIC8vIENoZWNrIHRoYXQgb3VyIG93biBkZWNvZGVyIGNhbiByZWFkIGl0CisgICAgSW5wdXRCdWZmZXIgaW5wdXQgPSBuZXcgSW5wdXRCdWZmZXIoYnVmZik7CisgICAgaW5wdXQucmV3aW5kKDAsIGJ1ZmYubGVuZ3RoKTsKKyAgICBCeXRlQnVmZmVyRGF0YVJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlckRhdGFSZWFkZXIoaW5wdXQpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY2F0RmFjZSwgcmVhZGVyLnJlYWRVVEYoKSk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBzdGFuZGFyZCBKYXZhIG9uZSBjYW4gcmVhZCBpdCB0b28KKyAgICBTdHJpbmcgZnJvbUphdmEgPSBuZXcgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmYpKS5yZWFkVVRGKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjYXRGYWNlLCBmcm9tSmF2YSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRPZlNwYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlWzEwXTsKKyAgICBNb2NrRGF0YVRhcmdldCB0YXJnZXQgPSBuZXcgTW9ja0RhdGFUYXJnZXQoYnVmZik7CisgICAgQnl0ZUJ1ZmZlckRhdGFXcml0ZXIgd3JpdGVyID0gbmV3IEJ5dGVCdWZmZXJEYXRhV3JpdGVyKHRhcmdldCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgd3JpdGVyLmhhc1VuRmx1c2hlZERhdGEoKSk7IAorICAgIAorICAgIHdyaXRlci53cml0ZSgxKTsKKyAgICB3cml0ZXIud3JpdGUobmV3IGJ5dGVbXSB7MiwgMn0sIDAsIDIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgd3JpdGVyLmhhc1VuRmx1c2hlZERhdGEoKSk7IAorICAgIAorICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgd3JpdGVyLnNob3J0T2ZTcGFjZSgxMDApKTsKKyAgfQorCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlWzEwXTsKKyAgICBNb2NrRGF0YVRhcmdldCB0YXJnZXQgPSBNb2NraXRvLnNweShuZXcgTW9ja0RhdGFUYXJnZXQoYnVmZikpOworCisgICAgQnl0ZUJ1ZmZlckRhdGFXcml0ZXIgd3JpdGVyID0gbmV3IEJ5dGVCdWZmZXJEYXRhV3JpdGVyKHRhcmdldCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgd3JpdGVyLmhhc1VuRmx1c2hlZERhdGEoKSk7IAorICAgIAorICAgIHdyaXRlci53cml0ZSgxKTsKKyAgICB3cml0ZXIud3JpdGUobmV3IGJ5dGVbMTAwXSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUsIHdyaXRlci5oYXNVbkZsdXNoZWREYXRhKCkpOyAKKyAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICBNb2NraXRvLnZlcmlmeSh0YXJnZXQsIE1vY2tpdG8udGltZXMoMTEpKS5zZW5kRGF0YSgpOworICAgIE1vY2tpdG8udmVyaWZ5KHRhcmdldCkuZmluaXNoU2VuZERhdGEoKTsKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGJ5dGVbXSBzdHIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhzdHIsIDAsIHN0ci5sZW5ndGgsICJVVEYtOCIpOworICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrRGF0YVRhcmdldCBpbXBsZW1lbnRzIE5hdGl2ZURhdGFUYXJnZXQgeworCisgICAgcHJpdmF0ZSBPdXRwdXRCdWZmZXIgb3V0OworCisgICAgTW9ja0RhdGFUYXJnZXQoYnl0ZVtdIGJ1ZmZlcikgeworICAgICAgdGhpcy5vdXQgPSBuZXcgT3V0cHV0QnVmZmVyKGJ1ZmZlcik7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmREYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hTZW5kRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE91dHB1dEJ1ZmZlciBnZXRPdXRwdXRCdWZmZXIoKSB7CisgICAgICByZXR1cm4gb3V0OworICAgIH0gICAgCisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL1Rlc3RJbnB1dEJ1ZmZlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvVGVzdElucHV0QnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViNjQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svYnVmZmVyL1Rlc3RJbnB1dEJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKKworcHVibGljIGNsYXNzIFRlc3RJbnB1dEJ1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdElucHV0QnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgc2l6ZSA9IDEwMDsKKyAgICBmaW5hbCBJbnB1dEJ1ZmZlciBpbnB1dDEgPSBuZXcgSW5wdXRCdWZmZXIoQnVmZmVyVHlwZS5ESVJFQ1RfQlVGRkVSLCBzaXplKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGlucHV0MS5nZXRUeXBlKCksIEJ1ZmZlclR5cGUuRElSRUNUX0JVRkZFUik7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbnB1dDEucG9zaXRpb24oKSA9PSAwKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbnB1dDEubGVuZ3RoKCkgPT0gMCk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5wdXQxLnJlbWFpbmluZygpID09IDApOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGlucHV0MS5jYXBhY2l0eSgpID09IHNpemUpOworCisgICAgZmluYWwgSW5wdXRCdWZmZXIgaW5wdXQyID0gbmV3IElucHV0QnVmZmVyKEJ1ZmZlclR5cGUuSEVBUF9CVUZGRVIsIHNpemUpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5wdXQyLmdldFR5cGUoKSwgQnVmZmVyVHlwZS5IRUFQX0JVRkZFUik7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbnB1dDIucG9zaXRpb24oKSA9PSAwKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbnB1dDIubGVuZ3RoKCkgPT0gMCk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5wdXQyLnJlbWFpbmluZygpID09IDApOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGlucHV0Mi5jYXBhY2l0eSgpID09IHNpemUpOworCisgICAgZmluYWwgSW5wdXRCdWZmZXIgaW5wdXQzID0gbmV3IElucHV0QnVmZmVyKG5ldyBieXRlW3NpemVdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGlucHV0My5nZXRUeXBlKCksIEJ1ZmZlclR5cGUuSEVBUF9CVUZGRVIpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5wdXQzLnBvc2l0aW9uKCkgPT0gMCk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5wdXQzLmxlbmd0aCgpID09IDApOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGlucHV0My5yZW1haW5pbmcoKSA9PSAwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGlucHV0My5jYXBhY2l0eSgpLCBzaXplKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvVGVzdE91dHB1dEJ1ZmZlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9idWZmZXIvVGVzdE91dHB1dEJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzI1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2J1ZmZlci9UZXN0T3V0cHV0QnVmZmVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0T3V0cHV0QnVmZmVyIGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0QnVmZmVyKCkgeworICAgIGZpbmFsIGludCBzaXplID0gMTAwOworICAgIGZpbmFsIE91dHB1dEJ1ZmZlciBvdXRwdXQxID0gbmV3IE91dHB1dEJ1ZmZlcihCdWZmZXJUeXBlLkRJUkVDVF9CVUZGRVIsIHNpemUpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob3V0cHV0MS5nZXRUeXBlKCksIEJ1ZmZlclR5cGUuRElSRUNUX0JVRkZFUik7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvdXRwdXQxLmxlbmd0aCgpID09IDApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob3V0cHV0MS5saW1pdCgpLCBzaXplKTsKKworICAgIGZpbmFsIE91dHB1dEJ1ZmZlciBvdXRwdXQyID0gbmV3IE91dHB1dEJ1ZmZlcihCdWZmZXJUeXBlLkhFQVBfQlVGRkVSLCBzaXplKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dHB1dDIuZ2V0VHlwZSgpLCBCdWZmZXJUeXBlLkhFQVBfQlVGRkVSKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG91dHB1dDIubGVuZ3RoKCkgPT0gMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhvdXRwdXQyLmxpbWl0KCksIHNpemUpOworCisgICAgZmluYWwgT3V0cHV0QnVmZmVyIG91dHB1dDMgPSBuZXcgT3V0cHV0QnVmZmVyKG5ldyBieXRlW3NpemVdKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dHB1dDMuZ2V0VHlwZSgpLCBCdWZmZXJUeXBlLkhFQVBfQlVGRkVSKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG91dHB1dDMubGVuZ3RoKCkgPT0gMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhvdXRwdXQzLmxpbWl0KCksIHNpemUpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9Db21iaW5lclRlc3QuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svY29tYmluZXJ0ZXN0L0NvbWJpbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNmUyODYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9Db21iaW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmNvbWJpbmVydGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5JbnRXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5UZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLk5hdGl2ZVJ1bnRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suY29tYmluZXJ0ZXN0LldvcmRDb3VudC5JbnRTdW1SZWR1Y2VyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmNvbWJpbmVydGVzdC5Xb3JkQ291bnQuVG9rZW5pemVyTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmt2dGVzdC5UZXN0SW5wdXRGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlJlc3VsdFZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlNjZW5hcmlvQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Db3VudGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5pbnB1dC5GaWxlSW5wdXRGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5pbnB1dC5TZXF1ZW5jZUZpbGVJbnB1dEZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLm91dHB1dC5GaWxlT3V0cHV0Rm9ybWF0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLnV0aWwuTmF0aXZlQ29kZUxvYWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tYmluZXJUZXN0IHsKKyAgcHJpdmF0ZSBGaWxlU3lzdGVtIGZzOworICBwcml2YXRlIFN0cmluZyBpbnB1dHBhdGg7CisgIHByaXZhdGUgU3RyaW5nIG5hdGl2ZW91dHB1dHBhdGg7CisgIHByaXZhdGUgU3RyaW5nIGhhZG9vcG91dHB1dHBhdGg7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFdvcmRDb3VudENvbWJpbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ29uZmlndXJhdGlvbiBuYXRpdmVDb25mID0gU2NlbmFyaW9Db25maWd1cmF0aW9uLmdldE5hdGl2ZUNvbmZpZ3VyYXRpb24oKTsKKyAgICBuYXRpdmVDb25mLmFkZFJlc291cmNlKFRlc3RDb25zdGFudHMuQ09NQklORVJfQ09ORl9QQVRIKTsKKyAgICBmaW5hbCBKb2IgbmF0aXZlam9iID0gZ2V0Sm9iKCJuYXRpdmV3b3JkY291bnQiLCBuYXRpdmVDb25mLCBpbnB1dHBhdGgsIG5hdGl2ZW91dHB1dHBhdGgpOworCisgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb21tb25Db25mID0gU2NlbmFyaW9Db25maWd1cmF0aW9uLmdldE5vcm1hbENvbmZpZ3VyYXRpb24oKTsKKyAgICBjb21tb25Db25mLmFkZFJlc291cmNlKFRlc3RDb25zdGFudHMuQ09NQklORVJfQ09ORl9QQVRIKTsKKyAgICBmaW5hbCBKb2Igbm9ybWFsam9iID0gZ2V0Sm9iKCJub3JtYWx3b3JkY291bnQiLCBjb21tb25Db25mLCBpbnB1dHBhdGgsIGhhZG9vcG91dHB1dHBhdGgpOworCisgICAgYXNzZXJ0VHJ1ZShuYXRpdmVqb2Iud2FpdEZvckNvbXBsZXRpb24odHJ1ZSkpOworICAgIGFzc2VydFRydWUobm9ybWFsam9iLndhaXRGb3JDb21wbGV0aW9uKHRydWUpKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzdWx0VmVyaWZpZXIudmVyaWZ5KG5hdGl2ZW91dHB1dHBhdGgsIGhhZG9vcG91dHB1dHBhdGgpKTsKKyAgICBSZXN1bHRWZXJpZmllci52ZXJpZnlDb3VudGVycyhub3JtYWxqb2IsIG5hdGl2ZWpvYiwgdHJ1ZSk7CisgIH0KKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHN0YXJ0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVDb2RlTG9hZGVyLmlzTmF0aXZlQ29kZUxvYWRlZCgpKTsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVSdW50aW1lLmlzTmF0aXZlTGlicmFyeUxvYWRlZCgpKTsKKyAgICBmaW5hbCBTY2VuYXJpb0NvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBTY2VuYXJpb0NvbmZpZ3VyYXRpb24oKTsKKyAgICBjb25mLmFkZGNvbWJpbmVyQ29uZigpOworCisgICAgdGhpcy5mcyA9IEZpbGVTeXN0ZW0uZ2V0KGNvbmYpOworCisgICAgdGhpcy5pbnB1dHBhdGggPSBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9JTlBVVERJUiArICIvd29yZGNvdW50IjsKKworICAgIGlmICghZnMuZXhpc3RzKG5ldyBQYXRoKGlucHV0cGF0aCkpKSB7CisgICAgICBuZXcgVGVzdElucHV0RmlsZSgKKyAgICAgICAgICBjb25mLmdldEludChUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NQklORVJfV09SRENPVU5UX0ZJTEVTSVpFLCAxMDAwMDAwKSwKKyAgICAgICAgICBUZXh0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICBUZXh0LmNsYXNzLmdldE5hbWUoKSwgY29uZikuY3JlYXRlU2VxdWVuY2VUZXN0RmlsZShpbnB1dHBhdGgsIDEsIChieXRlKSgnYScpKTsKKyAgICB9CisKKyAgICB0aGlzLm5hdGl2ZW91dHB1dHBhdGggPSBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9OQVRJVkVfT1VUUFVURElSICsKKyAgICAgICIvbmF0aXZld29yZGNvdW50IjsKKyAgICB0aGlzLmhhZG9vcG91dHB1dHBhdGggPSBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9OT1JNQUxfT1VUUFVURElSICsKKyAgICAgICIvbm9ybWFsd29yZGNvdW50IjsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhblVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5nZXQobmV3IFNjZW5hcmlvQ29uZmlndXJhdGlvbigpKTsKKyAgICBmcy5kZWxldGUobmV3IFBhdGgoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTUJJTkVSX1RFU1RfRElSKSwgdHJ1ZSk7CisgICAgZnMuY2xvc2UoKTsKKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgSm9iIGdldEpvYihTdHJpbmcgam9ibmFtZSwgQ29uZmlndXJhdGlvbiBpbnB1dENvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRwYXRoLCBTdHJpbmcgb3V0cHV0cGF0aCkKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKGlucHV0Q29uZik7CisgICAgY29uZi5zZXQoImZpbGVvdXRwdXRwYXRoIiwgb3V0cHV0cGF0aCk7CisgICAgZmluYWwgRmlsZVN5c3RlbSBmcyA9IEZpbGVTeXN0ZW0uZ2V0KGNvbmYpOworICAgIGlmIChmcy5leGlzdHMobmV3IFBhdGgob3V0cHV0cGF0aCkpKSB7CisgICAgICBmcy5kZWxldGUobmV3IFBhdGgob3V0cHV0cGF0aCksIHRydWUpOworICAgIH0KKyAgICBmcy5jbG9zZSgpOworICAgIGZpbmFsIEpvYiBqb2IgPSBKb2IuZ2V0SW5zdGFuY2UoY29uZiwgam9ibmFtZSk7CisgICAgam9iLnNldEphckJ5Q2xhc3MoV29yZENvdW50LmNsYXNzKTsKKyAgICBqb2Iuc2V0TWFwcGVyQ2xhc3MoVG9rZW5pemVyTWFwcGVyLmNsYXNzKTsKKyAgICBqb2Iuc2V0Q29tYmluZXJDbGFzcyhJbnRTdW1SZWR1Y2VyLmNsYXNzKTsKKyAgICBqb2Iuc2V0UmVkdWNlckNsYXNzKEludFN1bVJlZHVjZXIuY2xhc3MpOworICAgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhUZXh0LmNsYXNzKTsKKyAgICBqb2Iuc2V0T3V0cHV0VmFsdWVDbGFzcyhJbnRXcml0YWJsZS5jbGFzcyk7CisgICAgam9iLnNldElucHV0Rm9ybWF0Q2xhc3MoU2VxdWVuY2VGaWxlSW5wdXRGb3JtYXQuY2xhc3MpOworICAgIEZpbGVJbnB1dEZvcm1hdC5hZGRJbnB1dFBhdGgoam9iLCBuZXcgUGF0aChpbnB1dHBhdGgpKTsKKyAgICBGaWxlT3V0cHV0Rm9ybWF0LnNldE91dHB1dFBhdGgoam9iLCBuZXcgUGF0aChvdXRwdXRwYXRoKSk7CisgICAgcmV0dXJuIGpvYjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9jb21iaW5lcnRlc3QvTGFyZ2VLVkNvbWJpbmVyVGVzdC5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9jb21iaW5lcnRlc3QvTGFyZ2VLVkNvbWJpbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZWVjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9MYXJnZUtWQ29tYmluZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5jb21iaW5lcnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVSdW50aW1lOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmt2dGVzdC5UZXN0SW5wdXRGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlJlc3VsdFZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlNjZW5hcmlvQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Db3VudGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tDb3VudGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLnV0aWwuTmF0aXZlQ29kZUxvYWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgTGFyZ2VLVkNvbWJpbmVyVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhMYXJnZUtWQ29tYmluZXJUZXN0LmNsYXNzKTsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHN0YXJ0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVDb2RlTG9hZGVyLmlzTmF0aXZlQ29kZUxvYWRlZCgpKTsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVSdW50aW1lLmlzTmF0aXZlTGlicmFyeUxvYWRlZCgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMYXJnZVZhbHVlQ29tYmluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb25maWd1cmF0aW9uIG5vcm1hbENvbmYgPSBTY2VuYXJpb0NvbmZpZ3VyYXRpb24uZ2V0Tm9ybWFsQ29uZmlndXJhdGlvbigpOworICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbmF0aXZlQ29uZiA9IFNjZW5hcmlvQ29uZmlndXJhdGlvbi5nZXROYXRpdmVDb25maWd1cmF0aW9uKCk7CisgICAgbm9ybWFsQ29uZi5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLkNPTUJJTkVSX0NPTkZfUEFUSCk7CisgICAgbmF0aXZlQ29uZi5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLkNPTUJJTkVSX0NPTkZfUEFUSCk7CisgICAgZmluYWwgaW50IGRlYWZ1bHRfS1ZTaXplX01heGltdW0gPSAxIDw8IDIyOyAvLyA0TQorICAgIGZpbmFsIGludCBLVlNpemVfTWF4aW11bSA9IG5vcm1hbENvbmYuZ2V0SW50KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUFYX0xBUkdFS1ZfVEVTVCwKKyAgICAgICAgZGVhZnVsdF9LVlNpemVfTWF4aW11bSk7CisgICAgZmluYWwgU3RyaW5nIGlucHV0UGF0aCA9IFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01CSU5FUl9URVNUX0lOUFVURElSICsgIi9sYXJnZUtWIjsKKyAgICBmaW5hbCBTdHJpbmcgbmF0aXZlT3V0cHV0UGF0aCA9IFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01CSU5FUl9URVNUX05BVElWRV9PVVRQVVRESVIKKyAgICAgICsgIi9uYXRpdmVMYXJnZUtWIjsKKyAgICBmaW5hbCBTdHJpbmcgaGFkb29wT3V0cHV0UGF0aCA9IFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01CSU5FUl9URVNUX05PUk1BTF9PVVRQVVRESVIKKyAgICAgICsgIi9ub3JtYWxMYXJnZUtWIjsKKyAgICBmaW5hbCBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5nZXQobm9ybWFsQ29uZik7CisgICAgZm9yIChpbnQgaSA9IDY1NTM2OyBpIDw9IEtWU2l6ZV9NYXhpbXVtOyBpICo9IDQpIHsKKworICAgICAgaW50IG1heCA9IGk7CisgICAgICBpbnQgbWluID0gTWF0aC5tYXgoaSAvIDQsIG1heCAtIDEwKTsKKworICAgICAgTE9HLmluZm8oIj09PUtWIFNpemUgVGVzdDogbWluIHNpemU6ICIgKyBtaW4gKyAiLCBtYXggc2l6ZTogIiArIG1heCk7CisKKyAgICAgIG5vcm1hbENvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUlOLCBTdHJpbmcudmFsdWVPZihtaW4pKTsKKyAgICAgIG5vcm1hbENvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUFYLCBTdHJpbmcudmFsdWVPZihtYXgpKTsKKyAgICAgIG5hdGl2ZUNvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUlOLCBTdHJpbmcudmFsdWVPZihtaW4pKTsKKyAgICAgIG5hdGl2ZUNvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUFYLCBTdHJpbmcudmFsdWVPZihtYXgpKTsKKyAgICAgIGZzLmRlbGV0ZShuZXcgUGF0aChpbnB1dFBhdGgpLCB0cnVlKTsKKyAgICAgIG5ldyBUZXN0SW5wdXRGaWxlKG5vcm1hbENvbmYuZ2V0SW50KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01CSU5FUl9XT1JEQ09VTlRfRklMRVNJWkUsCisgICAgICAgIDEwMDAwMDApLCBJbnRXcml0YWJsZS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgIFRleHQuY2xhc3MuZ2V0TmFtZSgpLCBub3JtYWxDb25mKS5jcmVhdGVTZXF1ZW5jZVRlc3RGaWxlKGlucHV0UGF0aCwgMSk7CisKKyAgICAgIGZpbmFsIEpvYiBub3JtYWxqb2IgPSBDb21iaW5lclRlc3QuZ2V0Sm9iKCJub3JtYWx3b3JkY291bnQiLCBub3JtYWxDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQYXRoLCBoYWRvb3BPdXRwdXRQYXRoKTsKKyAgICAgIGZpbmFsIEpvYiBuYXRpdmVqb2IgPSBDb21iaW5lclRlc3QuZ2V0Sm9iKCJuYXRpdmV3b3JkY291bnQiLCBuYXRpdmVDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQYXRoLCBuYXRpdmVPdXRwdXRQYXRoKTsKKworICAgICAgYXNzZXJ0VHJ1ZShuYXRpdmVqb2Iud2FpdEZvckNvbXBsZXRpb24odHJ1ZSkpOworCisgICAgICBhc3NlcnRUcnVlKG5vcm1hbGpvYi53YWl0Rm9yQ29tcGxldGlvbih0cnVlKSk7CisKKyAgICAgIGZpbmFsIGJvb2xlYW4gY29tcGFyZVJldCA9IFJlc3VsdFZlcmlmaWVyLnZlcmlmeShuYXRpdmVPdXRwdXRQYXRoLCBoYWRvb3BPdXRwdXRQYXRoKTsKKworICAgICAgZmluYWwgU3RyaW5nIHJlYXNvbiA9ICJMYXJnZUtWQ29tYmluZXJUZXN0IGZhaWxlZCB3aXRoLCBtaW4gc2l6ZTogIiArIG1pbiArCisgICAgICAgICIsIG1heCBzaXplOiAiICsgbWF4ICsgIiwgbm9ybWFsIG91dDogIiArIGhhZG9vcE91dHB1dFBhdGggKworICAgICAgICAiLCBuYXRpdmUgT3V0OiAiICsgbmF0aXZlT3V0cHV0UGF0aDsKKworICAgICAgYXNzZXJ0RXF1YWxzKHJlYXNvbiwgdHJ1ZSwgY29tcGFyZVJldCk7CisgICAgICBSZXN1bHRWZXJpZmllci52ZXJpZnlDb3VudGVycyhub3JtYWxqb2IsIG5hdGl2ZWpvYiwgdHJ1ZSk7CisgICAgfQorICAgIGZzLmNsb3NlKCk7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW5VcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgRmlsZVN5c3RlbSBmcyA9IEZpbGVTeXN0ZW0uZ2V0KG5ldyBTY2VuYXJpb0NvbmZpZ3VyYXRpb24oKSk7CisgICAgZnMuZGVsZXRlKG5ldyBQYXRoKFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01CSU5FUl9URVNUX0RJUiksIHRydWUpOworICAgIGZzLmNsb3NlKCk7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9PbGRBUElDb21iaW5lclRlc3QuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svY29tYmluZXJ0ZXN0L09sZEFQSUNvbWJpbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTRiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9PbGRBUElDb21iaW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmNvbWJpbmVydGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuRmlsZUlucHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5GaWxlT3V0cHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmY7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlJ1bm5pbmdKb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlNlcXVlbmNlRmlsZUlucHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5UZXh0T3V0cHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLk5hdGl2ZVJ1bnRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sua3Z0ZXN0LlRlc3RJbnB1dEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuUmVzdWx0VmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuU2NlbmFyaW9Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlRlc3RDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLkNvdW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tDb3VudGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLnV0aWwuTmF0aXZlQ29kZUxvYWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgT2xkQVBJQ29tYmluZXJUZXN0IHsKKyAgcHJpdmF0ZSBGaWxlU3lzdGVtIGZzOworICBwcml2YXRlIFN0cmluZyBpbnB1dHBhdGg7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFdvcmRDb3VudENvbWJpbmVyV2l0aE9sZEFQSSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbmF0aXZlQ29uZiA9IFNjZW5hcmlvQ29uZmlndXJhdGlvbi5nZXROYXRpdmVDb25maWd1cmF0aW9uKCk7CisgICAgbmF0aXZlQ29uZi5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLkNPTUJJTkVSX0NPTkZfUEFUSCk7CisgICAgZmluYWwgU3RyaW5nIG5hdGl2ZW91dHB1dCA9IFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19PTERBUElfQ09NQklORVJfVEVTVF9OQVRJVkVfT1VUUFVUUEFUSDsKKyAgICBmaW5hbCBKb2JDb25mIG5hdGl2ZUpvYiA9IGdldE9sZEFQSUpvYmNvbmYobmF0aXZlQ29uZiwgIm5hdGl2ZUNvbWJpbmVyV2l0aE9sZEFQSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cGF0aCwgbmF0aXZlb3V0cHV0KTsKKyAgICBSdW5uaW5nSm9iIG5hdGl2ZVJ1bm5pbmcgPSBKb2JDbGllbnQucnVuSm9iKG5hdGl2ZUpvYik7CisKKyAgICBDb3VudGVyIG5hdGl2ZVJlZHVjZUdyb3VwcyA9IG5hdGl2ZVJ1bm5pbmcuZ2V0Q291bnRlcnMoKS5maW5kQ291bnRlcigKKyAgICAgIFRhc2tDb3VudGVyLlJFRFVDRV9JTlBVVF9SRUNPUkRTKTsKKworICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbm9ybWFsQ29uZiA9IFNjZW5hcmlvQ29uZmlndXJhdGlvbi5nZXROb3JtYWxDb25maWd1cmF0aW9uKCk7CisgICAgbm9ybWFsQ29uZi5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLkNPTUJJTkVSX0NPTkZfUEFUSCk7CisgICAgZmluYWwgU3RyaW5nIG5vcm1hbG91dHB1dCA9IFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19PTERBUElfQ09NQklORVJfVEVTVF9OT1JNQUxfT1VUUFVUUEFUSDsKKyAgICBmaW5hbCBKb2JDb25mIG5vcm1hbEpvYiA9IGdldE9sZEFQSUpvYmNvbmYobm9ybWFsQ29uZiwgIm5vcm1hbENvbWJpbmVyV2l0aE9sZEFQSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cGF0aCwgbm9ybWFsb3V0cHV0KTsKKworICAgIFJ1bm5pbmdKb2Igbm9ybWFsUnVubmluZyA9IEpvYkNsaWVudC5ydW5Kb2Iobm9ybWFsSm9iKTsKKyAgICBDb3VudGVyIG5vcm1hbFJlZHVjZUdyb3VwcyA9IG5vcm1hbFJ1bm5pbmcuZ2V0Q291bnRlcnMoKS5maW5kQ291bnRlcigKKyAgICAgIFRhc2tDb3VudGVyLlJFRFVDRV9JTlBVVF9SRUNPUkRTKTsKKworICAgIGZpbmFsIGJvb2xlYW4gY29tcGFyZVJldCA9IFJlc3VsdFZlcmlmaWVyLnZlcmlmeShuYXRpdmVvdXRwdXQsIG5vcm1hbG91dHB1dCk7CisgICAgYXNzZXJ0RXF1YWxzKCJmaWxlIGNvbXBhcmUgcmVzdWx0OiBpZiB0aGV5IGFyZSB0aGUgc2FtZSAsdGhlbiByZXR1cm4gdHJ1ZSIsIHRydWUsIGNvbXBhcmVSZXQpOworCisgICAgYXNzZXJ0RXF1YWxzKCJUaGUgaW5wdXQgcmVkdWNlIHJlY29yZCBjb3VudCBtdXN0IGJlIHNhbWUiLAorICAgICAgICAgICAgICAgICBuYXRpdmVSZWR1Y2VHcm91cHMuZ2V0VmFsdWUoKSwgbm9ybWFsUmVkdWNlR3JvdXBzLmdldFZhbHVlKCkpOworICB9CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzdGFydFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQXNzdW1lLmFzc3VtZVRydWUoTmF0aXZlQ29kZUxvYWRlci5pc05hdGl2ZUNvZGVMb2FkZWQoKSk7CisgICAgQXNzdW1lLmFzc3VtZVRydWUoTmF0aXZlUnVudGltZS5pc05hdGl2ZUxpYnJhcnlMb2FkZWQoKSk7CisgICAgZmluYWwgU2NlbmFyaW9Db25maWd1cmF0aW9uIGNvbmYgPSBuZXcgU2NlbmFyaW9Db25maWd1cmF0aW9uKCk7CisgICAgY29uZi5hZGRjb21iaW5lckNvbmYoKTsKKyAgICB0aGlzLmZzID0gRmlsZVN5c3RlbS5nZXQoY29uZik7CisgICAgdGhpcy5pbnB1dHBhdGggPSBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9JTlBVVERJUiArICIvd29yZGNvdW50IjsKKworICAgIGlmICghZnMuZXhpc3RzKG5ldyBQYXRoKGlucHV0cGF0aCkpKSB7CisgICAgICBuZXcgVGVzdElucHV0RmlsZShjb25mLmdldEludChUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NQklORVJfV09SRENPVU5UX0ZJTEVTSVpFLCAxMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRleHQuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgIFRleHQuY2xhc3MuZ2V0TmFtZSgpLCBjb25mKS5jcmVhdGVTZXF1ZW5jZVRlc3RGaWxlKGlucHV0cGF0aCwgMSwgKGJ5dGUpKCdhJykpOworICAgIH0KKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhblVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5nZXQobmV3IFNjZW5hcmlvQ29uZmlndXJhdGlvbigpKTsKKyAgICBmcy5kZWxldGUobmV3IFBhdGgoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTUJJTkVSX1RFU1RfRElSKSwgdHJ1ZSk7CisgICAgZnMuY2xvc2UoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEpvYkNvbmYgZ2V0T2xkQVBJSm9iY29uZihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlucHV0LCBTdHJpbmcgb3V0cHV0KQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgSm9iQ29uZiBqb2JDb25mID0gbmV3IEpvYkNvbmYoY29uZmlndXJhdGlvbik7CisgICAgZmluYWwgRmlsZVN5c3RlbSBmcyA9IEZpbGVTeXN0ZW0uZ2V0KGNvbmZpZ3VyYXRpb24pOworICAgIGlmIChmcy5leGlzdHMobmV3IFBhdGgob3V0cHV0KSkpIHsKKyAgICAgIGZzLmRlbGV0ZShuZXcgUGF0aChvdXRwdXQpLCB0cnVlKTsKKyAgICB9CisgICAgZnMuY2xvc2UoKTsKKyAgICBqb2JDb25mLnNldEpvYk5hbWUobmFtZSk7CisgICAgam9iQ29uZi5zZXRPdXRwdXRLZXlDbGFzcyhUZXh0LmNsYXNzKTsKKyAgICBqb2JDb25mLnNldE91dHB1dFZhbHVlQ2xhc3MoSW50V3JpdGFibGUuY2xhc3MpOworICAgIGpvYkNvbmYuc2V0TWFwcGVyQ2xhc3MoV29yZENvdW50V2l0aE9sZEFQSS5Ub2tlbml6ZXJNYXBwZXJXaXRoT2xkQVBJLmNsYXNzKTsKKyAgICBqb2JDb25mLnNldENvbWJpbmVyQ2xhc3MoV29yZENvdW50V2l0aE9sZEFQSS5JbnRTdW1SZWR1Y2VyV2l0aE9sZEFQSS5jbGFzcyk7CisgICAgam9iQ29uZi5zZXRSZWR1Y2VyQ2xhc3MoV29yZENvdW50V2l0aE9sZEFQSS5JbnRTdW1SZWR1Y2VyV2l0aE9sZEFQSS5jbGFzcyk7CisKKyAgICBqb2JDb25mLnNldElucHV0Rm9ybWF0KFNlcXVlbmNlRmlsZUlucHV0Rm9ybWF0LmNsYXNzKTsKKyAgICBqb2JDb25mLnNldE91dHB1dEZvcm1hdChUZXh0T3V0cHV0Rm9ybWF0LmNsYXNzKTsKKworICAgIEZpbGVJbnB1dEZvcm1hdC5zZXRJbnB1dFBhdGhzKGpvYkNvbmYsIG5ldyBQYXRoKGlucHV0KSk7CisgICAgRmlsZU91dHB1dEZvcm1hdC5zZXRPdXRwdXRQYXRoKGpvYkNvbmYsIG5ldyBQYXRoKG91dHB1dCkpOworICAgIHJldHVybiBqb2JDb25mOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9Xb3JkQ291bnQuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svY29tYmluZXJ0ZXN0L1dvcmRDb3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjI4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9Xb3JkQ291bnQuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suY29tYmluZXJ0ZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5NUkpvYkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWR1Y2VyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIuaW5wdXQuRmlsZUlucHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIub3V0cHV0LkZpbGVPdXRwdXRGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5HZW5lcmljT3B0aW9uc1BhcnNlcjsKKworcHVibGljIGNsYXNzIFdvcmRDb3VudCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdvcmRDb3VudC5jbGFzcyk7CisgIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuaXplck1hcHBlciBleHRlbmRzIE1hcHBlcjxPYmplY3QsIFRleHQsIFRleHQsIEludFdyaXRhYmxlPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRXcml0YWJsZSBvbmUgPSBuZXcgSW50V3JpdGFibGUoMSk7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXh0IHdvcmQgPSBuZXcgVGV4dCgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWFwKE9iamVjdCBrZXksIFRleHQgdmFsdWUsIENvbnRleHQgY29udGV4dCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgZmluYWwgU3RyaW5nVG9rZW5pemVyIGl0ciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUudG9TdHJpbmcoKSk7CisgICAgICB3aGlsZSAoaXRyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICB3b3JkLnNldChpdHIubmV4dFRva2VuKCkpOworICAgICAgICBjb250ZXh0LndyaXRlKHdvcmQsIG9uZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRTdW1SZWR1Y2VyIGV4dGVuZHMgUmVkdWNlcjxUZXh0LCBJbnRXcml0YWJsZSwgVGV4dCwgSW50V3JpdGFibGU+IHsKKyAgICBwcml2YXRlIGZpbmFsIEludFdyaXRhYmxlIHJlc3VsdCA9IG5ldyBJbnRXcml0YWJsZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVkdWNlKFRleHQga2V5LCBJdGVyYWJsZTxJbnRXcml0YWJsZT4gdmFsdWVzLCBDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICBpbnQgc3VtID0gMDsKKyAgICAgIGZvciAoZmluYWwgSW50V3JpdGFibGUgdmFsIDogdmFsdWVzKSB7CisgICAgICAgIHN1bSArPSB2YWwuZ2V0KCk7CisgICAgICB9CisgICAgICByZXN1bHQuc2V0KHN1bSk7CisgICAgICBjb250ZXh0LndyaXRlKGtleSwgcmVzdWx0KTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgIGZpbmFsIFN0cmluZ1tdIG90aGVyQXJncyA9IG5ldyBHZW5lcmljT3B0aW9uc1BhcnNlcihjb25mLCBhcmdzKS5nZXRSZW1haW5pbmdBcmdzKCk7CisgICAgaWYgKG90aGVyQXJncy5sZW5ndGggIT0gMikgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogd29yZGNvdW50IDxpbj4gPG91dD4iKTsKKyAgICAgIFN5c3RlbS5leGl0KDIpOworICAgIH0KKyAgICBmaW5hbCBKb2Igam9iID0gSm9iLmdldEluc3RhbmNlKGNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLmdldChNUkpvYkNvbmZpZy5KT0JfTkFNRSwgIndvcmQgY291bnQiKSk7CisgICAgam9iLnNldEphckJ5Q2xhc3MoV29yZENvdW50LmNsYXNzKTsKKyAgICBqb2Iuc2V0TWFwcGVyQ2xhc3MoVG9rZW5pemVyTWFwcGVyLmNsYXNzKTsKKyAgICBqb2Iuc2V0Q29tYmluZXJDbGFzcyhJbnRTdW1SZWR1Y2VyLmNsYXNzKTsKKyAgICBqb2Iuc2V0UmVkdWNlckNsYXNzKEludFN1bVJlZHVjZXIuY2xhc3MpOworICAgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhUZXh0LmNsYXNzKTsKKyAgICBqb2Iuc2V0T3V0cHV0VmFsdWVDbGFzcyhJbnRXcml0YWJsZS5jbGFzcyk7CisgICAgRmlsZUlucHV0Rm9ybWF0LmFkZElucHV0UGF0aChqb2IsIG5ldyBQYXRoKG90aGVyQXJnc1swXSkpOworICAgIEZpbGVPdXRwdXRGb3JtYXQuc2V0T3V0cHV0UGF0aChqb2IsIG5ldyBQYXRoKG90aGVyQXJnc1sxXSkpOworICAgIFN5c3RlbS5leGl0KGpvYi53YWl0Rm9yQ29tcGxldGlvbih0cnVlKSA/IDAgOiAxKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9jb21iaW5lcnRlc3QvV29yZENvdW50V2l0aE9sZEFQSS5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9jb21iaW5lcnRlc3QvV29yZENvdW50V2l0aE9sZEFQSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTQ3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbWJpbmVydGVzdC9Xb3JkQ291bnRXaXRoT2xkQVBJLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmNvbWJpbmVydGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5JbnRXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5UZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5NYXBSZWR1Y2VCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLk91dHB1dENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVkdWNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBXb3JkQ291bnRXaXRoT2xkQVBJIHsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuaXplck1hcHBlcldpdGhPbGRBUEkgZXh0ZW5kcyBNYXBSZWR1Y2VCYXNlIGltcGxlbWVudHMKKyAgTWFwcGVyPE9iamVjdCwgVGV4dCwgVGV4dCwgSW50V3JpdGFibGU+IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRXcml0YWJsZSBvbmUgPSBuZXcgSW50V3JpdGFibGUoMSk7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXh0IHdvcmQgPSBuZXcgVGV4dCgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWFwKE9iamVjdCBrZXksIFRleHQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIE91dHB1dENvbGxlY3RvcjxUZXh0LCBJbnRXcml0YWJsZT4gb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBSZXBvcnRlciByZXBvcnRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciBpdHIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgd2hpbGUgKGl0ci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgd29yZC5zZXQoaXRyLm5leHRUb2tlbigpKTsKKyAgICAgICAgb3V0cHV0LmNvbGxlY3Qod29yZCwgb25lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEludFN1bVJlZHVjZXJXaXRoT2xkQVBJIGV4dGVuZHMgTWFwUmVkdWNlQmFzZSBpbXBsZW1lbnRzCisgIFJlZHVjZXI8VGV4dCwgSW50V3JpdGFibGUsIFRleHQsIEludFdyaXRhYmxlPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBJbnRXcml0YWJsZSByZXN1bHQgPSBuZXcgSW50V3JpdGFibGUoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZHVjZShUZXh0IGtleSwgSXRlcmF0b3I8SW50V3JpdGFibGU+IHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29sbGVjdG9yPFRleHQsIEludFdyaXRhYmxlPiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgIFJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaW50IHN1bSA9IDA7CisgICAgICB3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgeworICAgICAgICBzdW0gKz0gdmFsdWVzLm5leHQoKS5nZXQoKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5zZXQoc3VtKTsKKyAgICAgIG91dHB1dC5jb2xsZWN0KGtleSwgcmVzdWx0KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svY29tcHJlc3N0ZXN0L0NvbXByZXNzTWFwcGVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbXByZXNzdGVzdC9Db21wcmVzc01hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGU5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbXByZXNzdGVzdC9Db21wcmVzc01hcHBlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5jb21wcmVzc3Rlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5UZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlNjZW5hcmlvQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5pbnB1dC5GaWxlSW5wdXRGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5pbnB1dC5TZXF1ZW5jZUZpbGVJbnB1dEZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLm91dHB1dC5GaWxlT3V0cHV0Rm9ybWF0OworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3NNYXBwZXIgeworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGV4dENvbXByZXNzTWFwcGVyIGV4dGVuZHMgTWFwcGVyPFRleHQsIFRleHQsIFRleHQsIFRleHQ+IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG1hcChUZXh0IGtleSwgVGV4dCB2YWx1ZSwgQ29udGV4dCBjb250ZXh0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgY29udGV4dC53cml0ZShrZXksIHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIEpvYiBnZXRDb21wcmVzc0pvYihTdHJpbmcgam9ibmFtZSwgQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRwYXRoLCBTdHJpbmcgb3V0cHV0cGF0aCkKKyAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBKb2Igam9iID0gSm9iLmdldEluc3RhbmNlKGNvbmYsIGpvYm5hbWUgKyAiLUNvbXByZXNzTWFwcGVySm9iIik7CisgICAgam9iLnNldEphckJ5Q2xhc3MoQ29tcHJlc3NNYXBwZXIuY2xhc3MpOworICAgIGpvYi5zZXRNYXBwZXJDbGFzcyhUZXh0Q29tcHJlc3NNYXBwZXIuY2xhc3MpOworICAgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhUZXh0LmNsYXNzKTsKKyAgICBqb2Iuc2V0TWFwT3V0cHV0VmFsdWVDbGFzcyhUZXh0LmNsYXNzKTsKKyAgICAvLyBpZiBvdXRwdXQgZmlsZSBleGlzdHMgLGRlbGV0ZSBpdAorICAgIGZpbmFsIEZpbGVTeXN0ZW0gaGRmcyA9IEZpbGVTeXN0ZW0uZ2V0KG5ldyBTY2VuYXJpb0NvbmZpZ3VyYXRpb24oKSk7CisgICAgaWYgKGhkZnMuZXhpc3RzKG5ldyBQYXRoKG91dHB1dHBhdGgpKSkgeworICAgICAgaGRmcy5kZWxldGUobmV3IFBhdGgob3V0cHV0cGF0aCksIHRydWUpOworICAgIH0KKyAgICBoZGZzLmNsb3NlKCk7CisgICAgam9iLnNldElucHV0Rm9ybWF0Q2xhc3MoU2VxdWVuY2VGaWxlSW5wdXRGb3JtYXQuY2xhc3MpOworICAgIEZpbGVJbnB1dEZvcm1hdC5hZGRJbnB1dFBhdGgoam9iLCBuZXcgUGF0aChpbnB1dHBhdGgpKTsKKyAgICBGaWxlT3V0cHV0Rm9ybWF0LnNldE91dHB1dFBhdGgoam9iLCBuZXcgUGF0aChvdXRwdXRwYXRoKSk7CisgICAgcmV0dXJuIGpvYjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9jb21wcmVzc3Rlc3QvQ29tcHJlc3NUZXN0LmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2NvbXByZXNzdGVzdC9Db21wcmVzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM5ZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9jb21wcmVzc3Rlc3QvQ29tcHJlc3NUZXN0LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5jb21wcmVzc3Rlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVSdW50aW1lOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmt2dGVzdC5UZXN0SW5wdXRGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlJlc3VsdFZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlNjZW5hcmlvQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk1SSm9iQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLnV0aWwuTmF0aXZlQ29kZUxvYWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3NUZXN0IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0aW9uIG5hdGl2ZUNvbmYgPSBTY2VuYXJpb0NvbmZpZ3VyYXRpb24uZ2V0TmF0aXZlQ29uZmlndXJhdGlvbigpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0aW9uIGhhZG9vcENvbmYgPSBTY2VuYXJpb0NvbmZpZ3VyYXRpb24uZ2V0Tm9ybWFsQ29uZmlndXJhdGlvbigpOworCisgIHN0YXRpYyB7CisgICAgbmF0aXZlQ29uZi5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLkNPTVBSRVNTX1RFU1RfQ09ORl9QQVRIKTsKKyAgICBoYWRvb3BDb25mLmFkZFJlc291cmNlKFRlc3RDb25zdGFudHMuQ09NUFJFU1NfVEVTVF9DT05GX1BBVEgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNuYXBweUNvbXByZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIHNuYXBweUNvZGVjID0gIm9yZy5hcGFjaGUuaGFkb29wLmlvLmNvbXByZXNzLlNuYXBweUNvZGVjIjsKKworICAgIG5hdGl2ZUNvbmYuc2V0KE1SSm9iQ29uZmlnLk1BUF9PVVRQVVRfQ09NUFJFU1NfQ09ERUMsIHNuYXBweUNvZGVjKTsKKyAgICBmaW5hbCBTdHJpbmcgbmF0aXZlT3V0cHV0UGF0aCA9CisgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9OQVRJVkVfT1VUUFVURElSICsgIi9zbmFwcHkiOworICAgIGZpbmFsIEpvYiBqb2IgPSBDb21wcmVzc01hcHBlci5nZXRDb21wcmVzc0pvYigibmF0aXZlc25hcHB5IiwgbmF0aXZlQ29uZiwKKyAgICAgIFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01QUkVTU19URVNUX0lOUFVURElSLCBuYXRpdmVPdXRwdXRQYXRoKTsKKyAgICBhc3NlcnRUcnVlKGpvYi53YWl0Rm9yQ29tcGxldGlvbih0cnVlKSk7CisKKyAgICBoYWRvb3BDb25mLnNldChNUkpvYkNvbmZpZy5NQVBfT1VUUFVUX0NPTVBSRVNTX0NPREVDLCBzbmFwcHlDb2RlYyk7CisgICAgZmluYWwgU3RyaW5nIGhhZG9vcE91dHB1dFBhdGggPQorICAgICAgVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfTk9STUFMX09VVFBVVERJUiArICIvc25hcHB5IjsKKyAgICBmaW5hbCBKb2IgaGFkb29wam9iID0gQ29tcHJlc3NNYXBwZXIuZ2V0Q29tcHJlc3NKb2IoImhhZG9vcHNuYXBweSIsIGhhZG9vcENvbmYsCisgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9JTlBVVERJUiwgaGFkb29wT3V0cHV0UGF0aCk7CisgICAgYXNzZXJ0VHJ1ZShoYWRvb3Bqb2Iud2FpdEZvckNvbXBsZXRpb24odHJ1ZSkpOworCisgICAgZmluYWwgYm9vbGVhbiBjb21wYXJlUmV0ID0gUmVzdWx0VmVyaWZpZXIudmVyaWZ5KG5hdGl2ZU91dHB1dFBhdGgsIGhhZG9vcE91dHB1dFBhdGgpOworICAgIGFzc2VydEVxdWFscygiZmlsZSBjb21wYXJlIHJlc3VsdDogaWYgdGhleSBhcmUgdGhlIHNhbWUgLHRoZW4gcmV0dXJuIHRydWUiLCB0cnVlLCBjb21wYXJlUmV0KTsKKyAgICBSZXN1bHRWZXJpZmllci52ZXJpZnlDb3VudGVycyhoYWRvb3Bqb2IsIGpvYik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R3ppcENvbXByZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIGd6aXBDb2RlYyA9ICJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5HemlwQ29kZWMiOworCisgICAgbmF0aXZlQ29uZi5zZXQoTVJKb2JDb25maWcuTUFQX09VVFBVVF9DT01QUkVTU19DT0RFQywgZ3ppcENvZGVjKTsKKyAgICBmaW5hbCBTdHJpbmcgbmF0aXZlT3V0cHV0UGF0aCA9CisgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9OQVRJVkVfT1VUUFVURElSICsgIi9nemlwIjsKKyAgICBmaW5hbCBKb2Igam9iID0gQ29tcHJlc3NNYXBwZXIuZ2V0Q29tcHJlc3NKb2IoIm5hdGl2ZWd6aXAiLCBuYXRpdmVDb25mLAorICAgICAgVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfSU5QVVRESVIsIG5hdGl2ZU91dHB1dFBhdGgpOworICAgIGFzc2VydFRydWUoam9iLndhaXRGb3JDb21wbGV0aW9uKHRydWUpKTsKKworICAgIGhhZG9vcENvbmYuc2V0KE1SSm9iQ29uZmlnLk1BUF9PVVRQVVRfQ09NUFJFU1NfQ09ERUMsIGd6aXBDb2RlYyk7CisgICAgZmluYWwgU3RyaW5nIGhhZG9vcE91dHB1dFBhdGggPQorICAgICAgVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfTk9STUFMX09VVFBVVERJUiArICIvZ3ppcCI7CisgICAgZmluYWwgSm9iIGhhZG9vcGpvYiA9IENvbXByZXNzTWFwcGVyLmdldENvbXByZXNzSm9iKCJoYWRvb3BnemlwIiwgaGFkb29wQ29uZiwKKyAgICAgIFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01QUkVTU19URVNUX0lOUFVURElSLCBoYWRvb3BPdXRwdXRQYXRoKTsKKyAgICBhc3NlcnRUcnVlKGhhZG9vcGpvYi53YWl0Rm9yQ29tcGxldGlvbih0cnVlKSk7CisKKyAgICBmaW5hbCBib29sZWFuIGNvbXBhcmVSZXQgPSBSZXN1bHRWZXJpZmllci52ZXJpZnkobmF0aXZlT3V0cHV0UGF0aCwgaGFkb29wT3V0cHV0UGF0aCk7CisgICAgYXNzZXJ0RXF1YWxzKCJmaWxlIGNvbXBhcmUgcmVzdWx0OiBpZiB0aGV5IGFyZSB0aGUgc2FtZSAsdGhlbiByZXR1cm4gdHJ1ZSIsIHRydWUsIGNvbXBhcmVSZXQpOworICAgIFJlc3VsdFZlcmlmaWVyLnZlcmlmeUNvdW50ZXJzKGhhZG9vcGpvYiwgam9iKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMejRDb21wcmVzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBsejRDb2RlYyA9ICJvcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5MejRDb2RlYyI7CisKKyAgICBuYXRpdmVDb25mLnNldChNUkpvYkNvbmZpZy5NQVBfT1VUUFVUX0NPTVBSRVNTX0NPREVDLCBsejRDb2RlYyk7CisgICAgZmluYWwgU3RyaW5nIG5hdGl2ZU91dHB1dFBhdGggPQorICAgICAgVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfTkFUSVZFX09VVFBVVERJUiArICIvbHo0IjsKKyAgICBmaW5hbCBKb2IgbmF0aXZlSm9iID0gQ29tcHJlc3NNYXBwZXIuZ2V0Q29tcHJlc3NKb2IoIm5hdGl2ZWx6NCIsIG5hdGl2ZUNvbmYsCisgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9JTlBVVERJUiwgbmF0aXZlT3V0cHV0UGF0aCk7CisgICAgYXNzZXJ0VHJ1ZShuYXRpdmVKb2Iud2FpdEZvckNvbXBsZXRpb24odHJ1ZSkpOworCisgICAgaGFkb29wQ29uZi5zZXQoTVJKb2JDb25maWcuTUFQX09VVFBVVF9DT01QUkVTU19DT0RFQywgbHo0Q29kZWMpOworICAgIGZpbmFsIFN0cmluZyBoYWRvb3BPdXRwdXRQYXRoID0KKyAgICAgIFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT01QUkVTU19URVNUX05PUk1BTF9PVVRQVVRESVIgKyAiL2x6NCI7CisgICAgZmluYWwgSm9iIGhhZG9vcEpvYiA9IENvbXByZXNzTWFwcGVyLmdldENvbXByZXNzSm9iKCJoYWRvb3BsejQiLCBoYWRvb3BDb25mLAorICAgICAgVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfSU5QVVRESVIsIGhhZG9vcE91dHB1dFBhdGgpOworICAgIGFzc2VydFRydWUoaGFkb29wSm9iLndhaXRGb3JDb21wbGV0aW9uKHRydWUpKTsKKyAgICBmaW5hbCBib29sZWFuIGNvbXBhcmVSZXQgPSBSZXN1bHRWZXJpZmllci52ZXJpZnkobmF0aXZlT3V0cHV0UGF0aCwgaGFkb29wT3V0cHV0UGF0aCk7CisgICAgYXNzZXJ0RXF1YWxzKCJmaWxlIGNvbXBhcmUgcmVzdWx0OiBpZiB0aGV5IGFyZSB0aGUgc2FtZSAsdGhlbiByZXR1cm4gdHJ1ZSIsIHRydWUsIGNvbXBhcmVSZXQpOworICAgIFJlc3VsdFZlcmlmaWVyLnZlcmlmeUNvdW50ZXJzKGhhZG9vcEpvYiwgbmF0aXZlSm9iKTsKKyAgfQorCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc3RhcnRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEFzc3VtZS5hc3N1bWVUcnVlKE5hdGl2ZUNvZGVMb2FkZXIuaXNOYXRpdmVDb2RlTG9hZGVkKCkpOworICAgIEFzc3VtZS5hc3N1bWVUcnVlKE5hdGl2ZVJ1bnRpbWUuaXNOYXRpdmVMaWJyYXJ5TG9hZGVkKCkpOworICAgIGZpbmFsIFNjZW5hcmlvQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IFNjZW5hcmlvQ29uZmlndXJhdGlvbigpOworICAgIGZpbmFsIEZpbGVTeXN0ZW0gZnMgPSBGaWxlU3lzdGVtLmdldChjb25mKTsKKyAgICBmaW5hbCBQYXRoIHBhdGggPSBuZXcgUGF0aChUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9JTlBVVERJUik7CisgICAgZnMuZGVsZXRlKHBhdGgsIHRydWUpOworICAgIGlmICghZnMuZXhpc3RzKHBhdGgpKSB7CisgICAgICBuZXcgVGVzdElucHV0RmlsZShoYWRvb3BDb25mLmdldEludCgKKyAgICAgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NUFJFU1NfRklMRVNJWkUsIDEwMDAwMCksCisgICAgICAgICAgVGV4dC5jbGFzcy5nZXROYW1lKCksIFRleHQuY2xhc3MuZ2V0TmFtZSgpLCBjb25mKQorICAgICAgLmNyZWF0ZVNlcXVlbmNlVGVzdEZpbGUoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfSU5QVVRESVIpOworICAgIH0KKyAgICBmcy5jbG9zZSgpOworICB9CisKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIEZpbGVTeXN0ZW0gZnMgPSBGaWxlU3lzdGVtLmdldChuZXcgU2NlbmFyaW9Db25maWd1cmF0aW9uKCkpOworICAgIGZzLmRlbGV0ZShuZXcgUGF0aChUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9ESVIpLCB0cnVlKTsKKyAgICBmcy5jbG9zZSgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svaGFuZGxlcnMvVGVzdENvbWJpbmVIYW5kbGVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL1Rlc3RDb21iaW5lSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDk5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL1Rlc3RDb21iaW5lSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5oYW5kbGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGFzay5Db21iaW5lclJ1bm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5Db21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLklOYXRpdmVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5CdWZmZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5JbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTWF0Y2hlcnM7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiwgImRlcHJlY2F0aW9uIiB9KQorcHVibGljIGNsYXNzIFRlc3RDb21iaW5lSGFuZGxlciB7CisKKyAgcHJpdmF0ZSBDb21iaW5lckhhbmRsZXIgaGFuZGxlcjsKKyAgcHJpdmF0ZSBJTmF0aXZlSGFuZGxlciBuYXRpdmVIYW5kbGVyOworICBwcml2YXRlIEJ1ZmZlclB1c2hlciBwdXNoZXI7CisgIHByaXZhdGUgQnVmZmVyUHVsbGVyIHB1bGxlcjsKKyAgcHJpdmF0ZSBDb21iaW5lclJ1bm5lciBjb21iaW5lclJ1bm5lcjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLm5hdGl2ZUhhbmRsZXIgPSBNb2NraXRvLm1vY2soSU5hdGl2ZUhhbmRsZXIuY2xhc3MpOworICAgIHRoaXMucHVzaGVyID0gTW9ja2l0by5tb2NrKEJ1ZmZlclB1c2hlci5jbGFzcyk7CisgICAgdGhpcy5wdWxsZXIgPSAgTW9ja2l0by5tb2NrKEJ1ZmZlclB1bGxlci5jbGFzcyk7CisgICAgdGhpcy5jb21iaW5lclJ1bm5lciA9ICBNb2NraXRvLm1vY2soQ29tYmluZXJSdW5uZXIuY2xhc3MpOworCisgICAgTW9ja2l0by53aGVuKG5hdGl2ZUhhbmRsZXIuZ2V0SW5wdXRCdWZmZXIoKSkudGhlblJldHVybigKKyAgICAgIG5ldyBJbnB1dEJ1ZmZlcihCdWZmZXJUeXBlLkhFQVBfQlVGRkVSLCAxMDApKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDb21tYW5kRGlzcGF0Y2hlclNldHRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMuaGFuZGxlciA9IG5ldyBDb21iaW5lckhhbmRsZXIobmF0aXZlSGFuZGxlciwgY29tYmluZXJSdW5uZXIsIHB1bGxlciwgcHVzaGVyKTsKKyAgICBNb2NraXRvLnZlcmlmeShuYXRpdmVIYW5kbGVyLCBNb2NraXRvLnRpbWVzKDEpKS5zZXRDb21tYW5kRGlzcGF0Y2hlcihNYXRjaGVycy5lcShoYW5kbGVyKSk7CisgICAgTW9ja2l0by52ZXJpZnkobmF0aXZlSGFuZGxlciwgTW9ja2l0by50aW1lcygxKSkuc2V0RGF0YVJlY2VpdmVyKE1hdGNoZXJzLmVxKHB1bGxlcikpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENvbWJpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0aGlzLmhhbmRsZXIgPSBuZXcgQ29tYmluZXJIYW5kbGVyKG5hdGl2ZUhhbmRsZXIsIGNvbWJpbmVyUnVubmVyLCBwdWxsZXIsIHB1c2hlcik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhudWxsLCBoYW5kbGVyLm9uQ2FsbChDb21iaW5lckhhbmRsZXIuQ09NQklORSwgbnVsbCkpOworICAgIGhhbmRsZXIuY2xvc2UoKTsKKyAgICBoYW5kbGVyLmNsb3NlKCk7CisKKyAgICBNb2NraXRvLnZlcmlmeShjb21iaW5lclJ1bm5lciwgTW9ja2l0by50aW1lcygxKSkKKyAgICAgIC5jb21iaW5lKE1hdGNoZXJzLmVxKHB1bGxlciksIE1hdGNoZXJzLmVxKHB1c2hlcikpOworCisgICAgTW9ja2l0by52ZXJpZnkocHVzaGVyLCBNb2NraXRvLnRpbWVzKDEpKS5jbG9zZSgpOworICAgIE1vY2tpdG8udmVyaWZ5KHB1bGxlciwgTW9ja2l0by50aW1lcygxKSkuY2xvc2UoKTsKKyAgICBNb2NraXRvLnZlcmlmeShuYXRpdmVIYW5kbGVyLCBNb2NraXRvLnRpbWVzKDEpKS5jbG9zZSgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE9uQ2FsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5oYW5kbGVyID0gbmV3IENvbWJpbmVySGFuZGxlcihuYXRpdmVIYW5kbGVyLCBjb21iaW5lclJ1bm5lciwgcHVsbGVyLCBwdXNoZXIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobnVsbCwgaGFuZGxlci5vbkNhbGwobmV3IENvbW1hbmQoLTEpLCBudWxsKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svaGFuZGxlcnMvVGVzdE5hdGl2ZUNvbGxlY3Rvck9ubHlIYW5kbGVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL1Rlc3ROYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOGJmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2hhbmRsZXJzL1Rlc3ROYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suaGFuZGxlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suSUNvbWJpbmVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLklOYXRpdmVIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLlRhc2tDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5CdWZmZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmJ1ZmZlci5JbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWwuT3V0cHV0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLlJlYWRXcml0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1hdGNoZXJzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIsICJkZXByZWNhdGlvbiIgfSkKK3B1YmxpYyBjbGFzcyBUZXN0TmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIgeworCisgIHByaXZhdGUgTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIgaGFuZGxlcjsKKyAgcHJpdmF0ZSBJTmF0aXZlSGFuZGxlciBuYXRpdmVIYW5kbGVyOworICBwcml2YXRlIEJ1ZmZlclB1c2hlciBwdXNoZXI7CisgIHByaXZhdGUgSUNvbWJpbmVIYW5kbGVyIGNvbWJpbmVyOworICBwcml2YXRlIFRhc2tDb250ZXh0IHRhc2tDb250ZXh0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRElSID0gVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX1RFU1RfRElSICsgIi9sb2NhbCI7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5uYXRpdmVIYW5kbGVyID0gTW9ja2l0by5tb2NrKElOYXRpdmVIYW5kbGVyLmNsYXNzKTsKKyAgICB0aGlzLnB1c2hlciA9IE1vY2tpdG8ubW9jayhCdWZmZXJQdXNoZXIuY2xhc3MpOworICAgIHRoaXMuY29tYmluZXIgPSBNb2NraXRvLm1vY2soSUNvbWJpbmVIYW5kbGVyLmNsYXNzKTsKKyAgICBKb2JDb25mIGpvYkNvbmYgPSBuZXcgSm9iQ29uZigpOworICAgIGpvYkNvbmYuc2V0KE91dHB1dFV0aWwuTkFUSVZFX1RBU0tfT1VUUFVUX01BTkFHRVIsCisgICAgICAgICJvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLkxvY2FsSm9iT3V0cHV0RmlsZXMiKTsKKyAgICBqb2JDb25mLnNldCgibWFwcmVkLmxvY2FsLmRpciIsIExPQ0FMX0RJUik7CisgICAgdGhpcy50YXNrQ29udGV4dCA9IG5ldyBUYXNrQ29udGV4dChqb2JDb25mLAorICAgICAgICBCeXRlc1dyaXRhYmxlLmNsYXNzLCBCeXRlc1dyaXRhYmxlLmNsYXNzLAorICAgICAgICBCeXRlc1dyaXRhYmxlLmNsYXNzLAorICAgICAgICBCeXRlc1dyaXRhYmxlLmNsYXNzLAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKTsKKworICAgIE1vY2tpdG8ud2hlbihuYXRpdmVIYW5kbGVyLmdldElucHV0QnVmZmVyKCkpLnRoZW5SZXR1cm4oCisgICAgICBuZXcgSW5wdXRCdWZmZXIoQnVmZmVyVHlwZS5IRUFQX0JVRkZFUiwgMTAwKSk7CisgIH0KKworICBAQWZ0ZXIKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGVTeXN0ZW0uZ2V0TG9jYWwobmV3IENvbmZpZ3VyYXRpb24oKSkuZGVsZXRlKG5ldyBQYXRoKExPQ0FMX0RJUikpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENvbGxlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMuaGFuZGxlciA9IG5ldyBOYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlcih0YXNrQ29udGV4dCwgbmF0aXZlSGFuZGxlciwgcHVzaGVyLCBjb21iaW5lcik7CisgICAgaGFuZGxlci5jb2xsZWN0KG5ldyBCeXRlc1dyaXRhYmxlKCksIG5ldyBCeXRlc1dyaXRhYmxlKCksIDEwMCk7CisgICAgaGFuZGxlci5jbG9zZSgpOworICAgIGhhbmRsZXIuY2xvc2UoKTsKKworICAgIE1vY2tpdG8udmVyaWZ5KHB1c2hlciwgTW9ja2l0by50aW1lcygxKSkuY29sbGVjdChNYXRjaGVycy5hbnkoQnl0ZXNXcml0YWJsZS5jbGFzcyksCisgICAgICAgIE1hdGNoZXJzLmFueShCeXRlc1dyaXRhYmxlLmNsYXNzKSwgTWF0Y2hlcnMuYW55SW50KCkpOworCisgICAgTW9ja2l0by52ZXJpZnkocHVzaGVyLCBNb2NraXRvLnRpbWVzKDEpKS5jbG9zZSgpOworICAgIE1vY2tpdG8udmVyaWZ5KGNvbWJpbmVyLCBNb2NraXRvLnRpbWVzKDEpKS5jbG9zZSgpOworICAgIE1vY2tpdG8udmVyaWZ5KG5hdGl2ZUhhbmRsZXIsIE1vY2tpdG8udGltZXMoMSkpLmNsb3NlKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tYmluZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMuaGFuZGxlciA9IG5ldyBOYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlcih0YXNrQ29udGV4dCwgbmF0aXZlSGFuZGxlciwgcHVzaGVyLCBjb21iaW5lcik7CisgICAgTW9ja2l0by53aGVuKGNvbWJpbmVyLmdldElkKCkpLnRoZW5SZXR1cm4oMTAwTCk7CisgICAgZmluYWwgUmVhZFdyaXRlQnVmZmVyIHJlc3VsdCA9IGhhbmRsZXIub25DYWxsKAorICAgICAgTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIuR0VUX0NPTUJJTkVfSEFORExFUiwgbnVsbCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDBMLCByZXN1bHQucmVhZExvbmcoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0T25DYWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLmhhbmRsZXIgPSBuZXcgTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIodGFza0NvbnRleHQsIG5hdGl2ZUhhbmRsZXIsIHB1c2hlciwgY29tYmluZXIpOworICAgIGJvb2xlYW4gdGhyb3duID0gZmFsc2U7CisgICAgdHJ5IHsKKyAgICAgIGhhbmRsZXIub25DYWxsKG5ldyBDb21tYW5kKC0xKSwgbnVsbCk7CisgICAgfSBjYXRjaChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvd24gPSB0cnVlOworICAgIH0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiZXhjZXB0aW9uIHRocm93biIsIHRocm93bik7CisKKyAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRPdXRwdXRQYXRoID0gTE9DQUxfRElSICsgIi9vdXRwdXQvZmlsZS5vdXQiOworICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZE91dHB1dEluZGV4UGF0aCA9IExPQ0FMX0RJUiArICIvb3V0cHV0L2ZpbGUub3V0LmluZGV4IjsKKyAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRTcGlsbFBhdGggPSBMT0NBTF9ESVIgKyAiL291dHB1dC9zcGlsbDAub3V0IjsKKworICAgIGZpbmFsIFN0cmluZyBvdXRwdXRQYXRoID0gaGFuZGxlci5vbkNhbGwoCisgICAgICBOYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlci5HRVRfT1VUUFVUX1BBVEgsIG51bGwpLnJlYWRTdHJpbmcoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3V0cHV0UGF0aCwgb3V0cHV0UGF0aCk7CisKKyAgICBmaW5hbCBTdHJpbmcgb3V0cHV0SW5kZXhQYXRoID0gaGFuZGxlci5vbkNhbGwoCisgICAgICBOYXRpdmVDb2xsZWN0b3JPbmx5SGFuZGxlci5HRVRfT1VUUFVUX0lOREVYX1BBVEgsIG51bGwpLnJlYWRTdHJpbmcoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3V0cHV0SW5kZXhQYXRoLCBvdXRwdXRJbmRleFBhdGgpOworCisgICAgZmluYWwgU3RyaW5nIHNwaWxsUGF0aCA9IGhhbmRsZXIub25DYWxsKAorICAgICAgTmF0aXZlQ29sbGVjdG9yT25seUhhbmRsZXIuR0VUX1NQSUxMX1BBVEgsIG51bGwpLnJlYWRTdHJpbmcoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3BpbGxQYXRoLCBzcGlsbFBhdGgpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2t2dGVzdC9IYXNoU3VtUmVkdWNlci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9rdnRlc3QvSGFzaFN1bVJlZHVjZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcyZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9rdnRlc3QvSGFzaFN1bVJlZHVjZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sua3Z0ZXN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkludFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLldyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWR1Y2VyOworCitwdWJsaWMgY2xhc3MgSGFzaFN1bVJlZHVjZXI8S1RZUEUsIFZUWVBFPiBleHRlbmRzIFJlZHVjZXI8S1RZUEUsIFZUWVBFLCBLVFlQRSwgSW50V3JpdGFibGU+IHsKKworICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3MpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWR1Y2UoS1RZUEUga2V5LCBJdGVyYWJsZTxWVFlQRT4gdmFsdWVzLCBDb250ZXh0IGNvbnRleHQpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgaW50IGhhc2hTdW0gPSAwOworICAgIGZvciAoZmluYWwgVlRZUEUgdmFsIDogdmFsdWVzKSB7CisgICAgICBpZiAodmFsIGluc3RhbmNlb2YgV3JpdGFibGUpIHsKKyAgICAgICAgb3MucmVzZXQoKTsKKyAgICAgICAgKChXcml0YWJsZSkgdmFsKS53cml0ZShkb3MpOworICAgICAgICBmaW5hbCBpbnQgaGFzaCA9IEFycmF5cy5oYXNoQ29kZShvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgaGFzaFN1bSArPSBoYXNoOworICAgICAgfQorICAgIH0KKworICAgIGNvbnRleHQud3JpdGUoa2V5LCBuZXcgSW50V3JpdGFibGUoaGFzaFN1bSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2t2dGVzdC9LVkpvYi5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9rdnRlc3QvS1ZKb2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQ1MTVmCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9rdnRlc3QvS1ZKb2IuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmt2dGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RvcHdhdGNoOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLkJ5dGVzRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Kb2I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVkdWNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0LkZpbGVJbnB1dEZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0LlNlcXVlbmNlRmlsZUlucHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIub3V0cHV0LkZpbGVPdXRwdXRGb3JtYXQ7CisKK3B1YmxpYyBjbGFzcyBLVkpvYiB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUUEFUSCA9ICJuYXRpdmV0YXNrLmt2dGVzdC5pbnB1dGZpbGUucGF0aCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVFBBVEggPSAibmF0aXZldGFzay5rdnRlc3Qub3V0cHV0ZmlsZS5wYXRoIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEtWSm9iLmNsYXNzKTsKKyAgSm9iIGpvYiA9IG51bGw7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWx1ZU1hcHBlcjxLVFlQRSwgVlRZUEU+IGV4dGVuZHMgTWFwcGVyPEtUWVBFLCBWVFlQRSwgS1RZUEUsIFZUWVBFPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWFwKEtUWVBFIGtleSwgVlRZUEUgdmFsdWUsIENvbnRleHQgY29udGV4dCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgY29udGV4dC53cml0ZShrZXksIHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEtWTVJlZHVjZXI8S1RZUEUsIFZUWVBFPiBleHRlbmRzIFJlZHVjZXI8S1RZUEUsIFZUWVBFLCBLVFlQRSwgVlRZUEU+IHsKKyAgICBwdWJsaWMgdm9pZCByZWR1Y2UoS1RZUEUga2V5LCBWVFlQRSB2YWx1ZSwgQ29udGV4dCBjb250ZXh0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICBjb250ZXh0LndyaXRlKGtleSwgdmFsdWUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS1ZSZWR1Y2VyPEtUWVBFLCBWVFlQRT4gZXh0ZW5kcyBSZWR1Y2VyPEtUWVBFLCBWVFlQRSwgS1RZUEUsIFZUWVBFPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQorICAgIHB1YmxpYyB2b2lkIHJlZHVjZShLVFlQRSBrZXksIEl0ZXJhYmxlPFZUWVBFPiB2YWx1ZXMsIENvbnRleHQgY29udGV4dCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgbG9uZyByZXN1bHRsb25nID0gMDsvLyA4IGJ5dGVzIG1hdGNoIEJ5dGVzRmFjdG9yeS5mcm9tQnl0ZXMgZnVuY3Rpb24KKyAgICAgIGZpbmFsIENSQzMyIGNyYzMyID0gbmV3IENSQzMyKCk7CisgICAgICBmb3IgKGZpbmFsIFZUWVBFIHZhbCA6IHZhbHVlcykgeworICAgICAgICBjcmMzMi5yZXNldCgpOworICAgICAgICBjcmMzMi51cGRhdGUoQnl0ZXNGYWN0b3J5LnRvQnl0ZXModmFsKSk7CisgICAgICAgIHJlc3VsdGxvbmcgKz0gY3JjMzIuZ2V0VmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIFZUWVBFIFYgPSBudWxsOworICAgICAgY29udGV4dC53cml0ZShrZXksIChWVFlQRSkgQnl0ZXNGYWN0b3J5Lm5ld09iamVjdChMb25ncy50b0J5dGVBcnJheShyZXN1bHRsb25nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVi5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBLVkpvYihTdHJpbmcgam9ibmFtZSwgQ29uZmlndXJhdGlvbiBjb25mLAorICAgICAgICAgICAgICAgQ2xhc3M8Pz4ga2V5Y2xhc3MsIENsYXNzPD8+IHZhbHVlY2xhc3MsCisgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRwYXRoLCBTdHJpbmcgb3V0cHV0cGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgam9iID0gSm9iLmdldEluc3RhbmNlKGNvbmYsIGpvYm5hbWUpOworICAgIGpvYi5zZXRKYXJCeUNsYXNzKEtWSm9iLmNsYXNzKTsKKyAgICBqb2Iuc2V0TWFwcGVyQ2xhc3MoS1ZKb2IuVmFsdWVNYXBwZXIuY2xhc3MpOworICAgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhrZXljbGFzcyk7CisgICAgam9iLnNldE1hcE91dHB1dFZhbHVlQ2xhc3ModmFsdWVjbGFzcyk7CisgICAgCisgICAgaWYgKGNvbmYuZ2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlRFU1RfQ1JFQVRFRklMRSkuZXF1YWxzKCJ0cnVlIikpIHsKKyAgICAgIGZpbmFsIEZpbGVTeXN0ZW0gZnMgPSBGaWxlU3lzdGVtLmdldChjb25mKTsKKyAgICAgIGZzLmRlbGV0ZShuZXcgUGF0aChpbnB1dHBhdGgpLCB0cnVlKTsKKyAgICAgIGZzLmNsb3NlKCk7CisgICAgICBmaW5hbCBUZXN0SW5wdXRGaWxlIHRlc3RmaWxlID0gbmV3IFRlc3RJbnB1dEZpbGUoSW50ZWdlci52YWx1ZU9mKGNvbmYuZ2V0KAorICAgICAgICAgIFRlc3RDb25zdGFudHMuRklMRVNJWkVfS0VZLCAiMTAwMCIpKSwKKyAgICAgICAgICBrZXljbGFzcy5nZXROYW1lKCksIHZhbHVlY2xhc3MuZ2V0TmFtZSgpLCBjb25mKTsKKyAgICAgIFN0b3B3YXRjaCBzdyA9IG5ldyBTdG9wd2F0Y2goKS5zdGFydCgpOworICAgICAgdGVzdGZpbGUuY3JlYXRlU2VxdWVuY2VUZXN0RmlsZShpbnB1dHBhdGgpOworICAgICAgTE9HLmluZm8oIkNyZWF0ZWQgdGVzdCBmaWxlICIgKyBpbnB1dHBhdGggKyAiIGluICIgKyBzdy5lbGFwc2VkTWlsbGlzKCkgKyAibXMiKTsKKyAgICB9CisgICAgam9iLnNldElucHV0Rm9ybWF0Q2xhc3MoU2VxdWVuY2VGaWxlSW5wdXRGb3JtYXQuY2xhc3MpOworICAgIEZpbGVJbnB1dEZvcm1hdC5hZGRJbnB1dFBhdGgoam9iLCBuZXcgUGF0aChpbnB1dHBhdGgpKTsKKyAgICBGaWxlT3V0cHV0Rm9ybWF0LnNldE91dHB1dFBhdGgoam9iLCBuZXcgUGF0aChvdXRwdXRwYXRoKSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBydW5Kb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gam9iLndhaXRGb3JDb21wbGV0aW9uKHRydWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2t2dGVzdC9LVlRlc3QuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2sva3Z0ZXN0L0tWVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjU4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2t2dGVzdC9LVlRlc3QuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmt2dGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTG9uZ1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLk5hdGl2ZVJ1bnRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuUmVzdWx0VmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuU2NlbmFyaW9Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlRlc3RDb25zdGFudHM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AudXRpbC5OYXRpdmVDb2RlTG9hZGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgS1ZUZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEtWVGVzdC5jbGFzcyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbiBuYXRpdmVrdnRlc3Rjb25mID0gU2NlbmFyaW9Db25maWd1cmF0aW9uLmdldE5hdGl2ZUNvbmZpZ3VyYXRpb24oKTsKKyAgcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbiBoYWRvb3BrdnRlc3Rjb25mID0gU2NlbmFyaW9Db25maWd1cmF0aW9uLmdldE5vcm1hbENvbmZpZ3VyYXRpb24oKTsKKyAgc3RhdGljIHsKKyAgICBuYXRpdmVrdnRlc3Rjb25mLmFkZFJlc291cmNlKFRlc3RDb25zdGFudHMuS1ZURVNUX0NPTkZfUEFUSCk7CisgICAgaGFkb29wa3Z0ZXN0Y29uZi5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLktWVEVTVF9DT05GX1BBVEgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDbGFzczw/Pj4gcGFyc2VDbGFzc05hbWVzKFN0cmluZyBzcGVjKSB7CisgICAgTGlzdDxDbGFzczw/Pj4gcmV0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBJdGVyYWJsZTxTdHJpbmc+IGNsYXNzTmFtZXMgPSBTcGxpdHRlci5vbignOycpLnRyaW1SZXN1bHRzKCkKKyAgICAgICAgLm9taXRFbXB0eVN0cmluZ3MoKS5zcGxpdChzcGVjKTsKKyAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBjbGFzc05hbWVzKSB7CisgICAgICB0cnkgeworICAgICAgICByZXQuYWRkKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKSk7CisgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKioKKyAgICogUGFyYW1ldGVyaXplIHRoZSB0ZXN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIHZhbHVlIHR5cGVzLgorICAgKi8KKyAgQFBhcmFtZXRlcnMobmFtZSA9ICJrZXk6ezB9XG52YWx1ZTp7MX0iKQorICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzPD8+W10+IGRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBQYXJzZSB0aGUgY29uZmlnLgorICAgIGZpbmFsIFN0cmluZyB2YWx1ZUNsYXNzZXNTdHIgPSBuYXRpdmVrdnRlc3Rjb25mCisgICAgICAgIC5nZXQoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0tWVEVTVF9WQUxVRUNMQVNTRVMpOworICAgIExPRy5pbmZvKCJQYXJhbWV0ZXJpemluZyB3aXRoIHZhbHVlIGNsYXNzZXM6ICIgKyB2YWx1ZUNsYXNzZXNTdHIpOworICAgIExpc3Q8Q2xhc3M8Pz4+IHZhbHVlQ2xhc3NlcyA9IHBhcnNlQ2xhc3NOYW1lcyh2YWx1ZUNsYXNzZXNTdHIpOworICAgIAorICAgIGZpbmFsIFN0cmluZyBrZXlDbGFzc2VzU3RyID0gbmF0aXZla3Z0ZXN0Y29uZi5nZXQoCisgICAgICAgIFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlRFU1RfS0VZQ0xBU1NFUyk7CisgICAgTE9HLmluZm8oIlBhcmFtZXRlcml6aW5nIHdpdGgga2V5IGNsYXNzZXM6ICIgKyBrZXlDbGFzc2VzU3RyKTsKKyAgICBMaXN0PENsYXNzPD8+PiBrZXlDbGFzc2VzID0gcGFyc2VDbGFzc05hbWVzKGtleUNsYXNzZXNTdHIpOworCisgICAgLy8gR2VuZXJhdGUgYW4gZW50cnkgZm9yIGVhY2gga2V5IHR5cGUuCisgICAgTGlzdDxDbGFzczw/PltdPiBwYWlycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoQ2xhc3M8Pz4ga2V5Q2xhc3MgOiBrZXlDbGFzc2VzKSB7CisgICAgICBwYWlycy5hZGQobmV3IENsYXNzPD8+W117IGtleUNsYXNzLCBMb25nV3JpdGFibGUuY2xhc3MgfSk7CisgICAgfQorICAgIC8vIC4uLmFuZCBmb3IgZWFjaCB2YWx1ZSB0eXBlLgorICAgIGZvciAoQ2xhc3M8Pz4gdmFsdWVDbGFzcyA6IHZhbHVlQ2xhc3NlcykgeworICAgICAgcGFpcnMuYWRkKG5ldyBDbGFzczw/PltdeyBMb25nV3JpdGFibGUuY2xhc3MsIHZhbHVlQ2xhc3MgfSk7CisgICAgfQorICAgIHJldHVybiBwYWlyczsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4ga2V5Y2xhc3M7CisgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gdmFsdWVjbGFzczsKKworICBwdWJsaWMgS1ZUZXN0KENsYXNzPD8+IGtleWNsYXNzLCBDbGFzczw/PiB2YWx1ZWNsYXNzKSB7CisgICAgdGhpcy5rZXljbGFzcyA9IGtleWNsYXNzOworICAgIHRoaXMudmFsdWVjbGFzcyA9IHZhbHVlY2xhc3M7CisgIH0KKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHN0YXJ0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVDb2RlTG9hZGVyLmlzTmF0aXZlQ29kZUxvYWRlZCgpKTsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVSdW50aW1lLmlzTmF0aXZlTGlicmFyeUxvYWRlZCgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RLVkNvbXBhYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgRmlsZVN5c3RlbSBmcyA9IEZpbGVTeXN0ZW0uZ2V0KG5hdGl2ZWt2dGVzdGNvbmYpOworICAgIGZpbmFsIFN0cmluZyBqb2JOYW1lID0gIlRlc3Q6IiArIGtleWNsYXNzLmdldFNpbXBsZU5hbWUoKSArICItLSIKKyAgICAgICAgKyB2YWx1ZWNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBmaW5hbCBTdHJpbmcgaW5wdXRQYXRoID0gVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0tWVEVTVF9JTlBVVERJUiArICIvIgorICAgICAgICArIGtleWNsYXNzLmdldE5hbWUoKSArICIvIiArIHZhbHVlY2xhc3MuZ2V0TmFtZSgpOworICAgIGZpbmFsIFN0cmluZyBuYXRpdmVPdXRwdXRQYXRoID0gVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0tWVEVTVF9OQVRJVkVfT1VUUFVURElSCisgICAgICAgICsgIi8iICsga2V5Y2xhc3MuZ2V0TmFtZSgpICsgIi8iICsgdmFsdWVjbGFzcy5nZXROYW1lKCk7CisgICAgLy8gaWYgb3V0cHV0IGZpbGUgZXhpc3RzICx0aGVuIGRlbGV0ZSBpdAorICAgIGZzLmRlbGV0ZShuZXcgUGF0aChuYXRpdmVPdXRwdXRQYXRoKSwgdHJ1ZSk7CisgICAgbmF0aXZla3Z0ZXN0Y29uZi5zZXQoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0tWVEVTVF9DUkVBVEVGSUxFLCAidHJ1ZSIpOworICAgIGZpbmFsIEtWSm9iIG5hdGl2ZUpvYiA9IG5ldyBLVkpvYihqb2JOYW1lLCBuYXRpdmVrdnRlc3Rjb25mLCBrZXljbGFzcywKKyAgICAgICAgdmFsdWVjbGFzcywgaW5wdXRQYXRoLCBuYXRpdmVPdXRwdXRQYXRoKTsKKyAgICBhc3NlcnRUcnVlKCJqb2Igc2hvdWxkIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSIsIG5hdGl2ZUpvYi5ydW5Kb2IoKSk7CisKKyAgICBmaW5hbCBTdHJpbmcgbm9ybWFsT3V0cHV0UGF0aCA9IFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlRFU1RfTk9STUFMX09VVFBVVERJUgorICAgICAgICArICIvIiArIGtleWNsYXNzLmdldE5hbWUoKSArICIvIiArIHZhbHVlY2xhc3MuZ2V0TmFtZSgpOworICAgIC8vIGlmIG91dHB1dCBmaWxlIGV4aXN0cyAsdGhlbiBkZWxldGUgaXQKKyAgICBmcy5kZWxldGUobmV3IFBhdGgobm9ybWFsT3V0cHV0UGF0aCksIHRydWUpOworICAgIGhhZG9vcGt2dGVzdGNvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlRFU1RfQ1JFQVRFRklMRSwgImZhbHNlIik7CisgICAgZmluYWwgS1ZKb2Igbm9ybWFsSm9iID0gbmV3IEtWSm9iKGpvYk5hbWUsIGhhZG9vcGt2dGVzdGNvbmYsIGtleWNsYXNzLAorICAgICAgICB2YWx1ZWNsYXNzLCBpbnB1dFBhdGgsIG5vcm1hbE91dHB1dFBhdGgpOworICAgIGFzc2VydFRydWUoImpvYiBzaG91bGQgY29tcGxldGUgc3VjY2Vzc2Z1bGx5Iiwgbm9ybWFsSm9iLnJ1bkpvYigpKTsKKworICAgIGZpbmFsIGJvb2xlYW4gY29tcGFyZVJldCA9IFJlc3VsdFZlcmlmaWVyLnZlcmlmeShub3JtYWxPdXRwdXRQYXRoLAorICAgICAgICBuYXRpdmVPdXRwdXRQYXRoKTsKKyAgICBhc3NlcnRFcXVhbHMoImpvYiBvdXRwdXQgbm90IHRoZSBzYW1lIiwgdHJ1ZSwgY29tcGFyZVJldCk7CisgICAgUmVzdWx0VmVyaWZpZXIudmVyaWZ5Q291bnRlcnMobm9ybWFsSm9iLmpvYiwgbmF0aXZlSm9iLmpvYik7CisgICAgZnMuY2xvc2UoKTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhblVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5nZXQobmV3IFNjZW5hcmlvQ29uZmlndXJhdGlvbigpKTsKKyAgICBmcy5kZWxldGUobmV3IFBhdGgoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX0tWVEVTVF9ESVIpLCB0cnVlKTsKKyAgICBmcy5jbG9zZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2t2dGVzdC9MYXJnZUtWVGVzdC5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9rdnRlc3QvTGFyZ2VLVlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE2MTllCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9rdnRlc3QvTGFyZ2VLVlRlc3QuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmt2dGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5OYXRpdmVSdW50aW1lOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlJlc3VsdFZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlNjZW5hcmlvQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLnV0aWwuTmF0aXZlQ29kZUxvYWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBMYXJnZUtWVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhMYXJnZUtWVGVzdC5jbGFzcyk7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzdGFydFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQXNzdW1lLmFzc3VtZVRydWUoTmF0aXZlQ29kZUxvYWRlci5pc05hdGl2ZUNvZGVMb2FkZWQoKSk7CisgICAgQXNzdW1lLmFzc3VtZVRydWUoTmF0aXZlUnVudGltZS5pc05hdGl2ZUxpYnJhcnlMb2FkZWQoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uIG5hdGl2ZUNvbmYgPSBTY2VuYXJpb0NvbmZpZ3VyYXRpb24uZ2V0TmF0aXZlQ29uZmlndXJhdGlvbigpOworICBwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uIG5vcm1hbENvbmYgPSBTY2VuYXJpb0NvbmZpZ3VyYXRpb24uZ2V0Tm9ybWFsQ29uZmlndXJhdGlvbigpOworICBzdGF0aWMgeworICAgIG5hdGl2ZUNvbmYuYWRkUmVzb3VyY2UoVGVzdENvbnN0YW50cy5LVlRFU1RfQ09ORl9QQVRIKTsKKyAgICBuYXRpdmVDb25mLnNldChUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfS1ZURVNUX0NSRUFURUZJTEUsICJ0cnVlIik7CisgICAgbm9ybWFsQ29uZi5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLktWVEVTVF9DT05GX1BBVEgpOworICAgIG5vcm1hbENvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlRFU1RfQ1JFQVRFRklMRSwgImZhbHNlIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0S2V5U2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJ1bktWU2l6ZVRlc3RzKFRleHQuY2xhc3MsIEludFdyaXRhYmxlLmNsYXNzKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBydW5LVlNpemVUZXN0cyhJbnRXcml0YWJsZS5jbGFzcywgVGV4dC5jbGFzcyk7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW5VcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgRmlsZVN5c3RlbSBmcyA9IEZpbGVTeXN0ZW0uZ2V0KG5ldyBTY2VuYXJpb0NvbmZpZ3VyYXRpb24oKSk7CisgICAgZnMuZGVsZXRlKG5ldyBQYXRoKFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlRFU1RfRElSKSwgdHJ1ZSk7CisgICAgZnMuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJ1bktWU2l6ZVRlc3RzKENsYXNzPD8+IGtleUNsYXNzLCBDbGFzczw/PiB2YWx1ZUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpZiAoIWtleUNsYXNzLmVxdWFscyhUZXh0LmNsYXNzKSAmJiAhdmFsdWVDbGFzcy5lcXVhbHMoVGV4dC5jbGFzcykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmluYWwgaW50IGRlYWZ1bHRLVlNpemVNYXhpbXVtID0gMSA8PCAyMjsgLy8gNE0KKyAgICBmaW5hbCBpbnQga3ZTaXplTWF4aW11bSA9IG5vcm1hbENvbmYuZ2V0SW50KAorICAgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfS1ZTSVpFX01BWF9MQVJHRUtWX1RFU1QsCisgICAgICAgIGRlYWZ1bHRLVlNpemVNYXhpbXVtKTsKKyAgICBmaW5hbCBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5nZXQobm9ybWFsQ29uZik7CisKKyAgICBmb3IgKGludCBpID0gNjU1MzY7IGkgPD0ga3ZTaXplTWF4aW11bTsgaSAqPSA0KSB7CisgICAgICBpbnQgbWluID0gaSAvIDQ7CisgICAgICBpbnQgbWF4ID0gaTsKKyAgICAgIG5hdGl2ZUNvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUlOLCBTdHJpbmcudmFsdWVPZihtaW4pKTsKKyAgICAgIG5hdGl2ZUNvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUFYLCBTdHJpbmcudmFsdWVPZihtYXgpKTsKKyAgICAgIG5vcm1hbENvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUlOLCBTdHJpbmcudmFsdWVPZihtaW4pKTsKKyAgICAgIG5vcm1hbENvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUFYLCBTdHJpbmcudmFsdWVPZihtYXgpKTsKKworICAgICAgTE9HLmluZm8oIj09PUtWIFNpemUgVGVzdDogbWluIHNpemU6ICIgKyBtaW4gKyAiLCBtYXggc2l6ZTogIiArIG1heAorICAgICAgICAgICsgIiwga2V5Q2xhc3M6ICIgKyBrZXlDbGFzcy5nZXROYW1lKCkgKyAiLCB2YWx1ZUNsYXNzOiAiCisgICAgICAgICAgKyB2YWx1ZUNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgIGZpbmFsIFN0cmluZyBpbnB1dFBhdGggPSBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfS1ZURVNUX0lOUFVURElSCisgICAgICAgICAgKyAiL0xhcmdlS1YvIiArIGtleUNsYXNzLmdldE5hbWUoKSArICIvIiArIHZhbHVlQ2xhc3MuZ2V0TmFtZSgpOworCisgICAgICBmaW5hbCBTdHJpbmcgbmF0aXZlT3V0cHV0UGF0aCA9IFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlRFU1RfTkFUSVZFX09VVFBVVERJUgorICAgICAgICAgICsgIi9MYXJnZUtWLyIgKyBrZXlDbGFzcy5nZXROYW1lKCkgKyAiLyIgKyB2YWx1ZUNsYXNzLmdldE5hbWUoKTsKKyAgICAgIC8vIGlmIG91dHB1dCBmaWxlIGV4aXN0cyAsdGhlbiBkZWxldGUgaXQKKyAgICAgIGZzLmRlbGV0ZShuZXcgUGF0aChuYXRpdmVPdXRwdXRQYXRoKSwgdHJ1ZSk7CisgICAgICBmaW5hbCBLVkpvYiBuYXRpdmVKb2IgPSBuZXcgS1ZKb2IoIlRlc3QgTGFyZ2UgVmFsdWUgU2l6ZToiCisgICAgICAgICAgKyBTdHJpbmcudmFsdWVPZihpKSwgbmF0aXZlQ29uZiwga2V5Q2xhc3MsIHZhbHVlQ2xhc3MsIGlucHV0UGF0aCwKKyAgICAgICAgICBuYXRpdmVPdXRwdXRQYXRoKTsKKyAgICAgIGFzc2VydFRydWUoImpvYiBzaG91bGQgY29tcGxldGUgc3VjY2Vzc2Z1bGx5IiwgbmF0aXZlSm9iLnJ1bkpvYigpKTsKKworICAgICAgZmluYWwgU3RyaW5nIG5vcm1hbE91dHB1dFBhdGggPSBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfS1ZURVNUX05PUk1BTF9PVVRQVVRESVIKKyAgICAgICAgICArICIvTGFyZ2VLVi8iICsga2V5Q2xhc3MuZ2V0TmFtZSgpICsgIi8iICsgdmFsdWVDbGFzcy5nZXROYW1lKCk7CisgICAgICAvLyBpZiBvdXRwdXQgZmlsZSBleGlzdHMgLHRoZW4gZGVsZXRlIGl0CisgICAgICBmcy5kZWxldGUobmV3IFBhdGgobm9ybWFsT3V0cHV0UGF0aCksIHRydWUpOworICAgICAgZmluYWwgS1ZKb2Igbm9ybWFsSm9iID0gbmV3IEtWSm9iKCJUZXN0IExhcmdlIEtleSBTaXplOiIgKyBTdHJpbmcudmFsdWVPZihpKSwKKyAgICAgICAgICBub3JtYWxDb25mLCBrZXlDbGFzcywgdmFsdWVDbGFzcywgaW5wdXRQYXRoLCBub3JtYWxPdXRwdXRQYXRoKTsKKyAgICAgIGFzc2VydFRydWUoImpvYiBzaG91bGQgY29tcGxldGUgc3VjY2Vzc2Z1bGx5Iiwgbm9ybWFsSm9iLnJ1bkpvYigpKTsKKworICAgICAgZmluYWwgYm9vbGVhbiBjb21wYXJlUmV0ID0gUmVzdWx0VmVyaWZpZXIudmVyaWZ5KG5vcm1hbE91dHB1dFBhdGgsCisgICAgICAgICAgbmF0aXZlT3V0cHV0UGF0aCk7CisgICAgICBmaW5hbCBTdHJpbmcgcmVhc29uID0gImtleXR5cGU6ICIgKyBrZXlDbGFzcy5nZXROYW1lKCkgKyAiLCB2YWx1ZXR5cGU6ICIKKyAgICAgICAgICArIHZhbHVlQ2xhc3MuZ2V0TmFtZSgpICsgIiwgZmFpbGVkIHdpdGggIgorICAgICAgICAgICsgKGtleUNsYXNzLmVxdWFscyhUZXh0LmNsYXNzKSA/ICJrZXkiIDogInZhbHVlIikgKyAiLCBtaW4gc2l6ZTogIiArIG1pbgorICAgICAgICAgICsgIiwgbWF4IHNpemU6ICIgKyBtYXggKyAiLCBub3JtYWwgb3V0OiAiICsgbm9ybWFsT3V0cHV0UGF0aAorICAgICAgICAgICsgIiwgbmF0aXZlIE91dDogIiArIG5hdGl2ZU91dHB1dFBhdGg7CisgICAgICBhc3NlcnRFcXVhbHMocmVhc29uLCB0cnVlLCBjb21wYXJlUmV0KTsKKyAgICAgIFJlc3VsdFZlcmlmaWVyLnZlcmlmeUNvdW50ZXJzKG5vcm1hbEpvYi5qb2IsIG5hdGl2ZUpvYi5qb2IpOworICAgIH0KKyAgICBmcy5jbG9zZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2t2dGVzdC9UZXN0SW5wdXRGaWxlLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL2t2dGVzdC9UZXN0SW5wdXRGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYjY3YQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2sva3Z0ZXN0L1Rlc3RJbnB1dEZpbGUuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLmt2dGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQm9vbGVhbldyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Eb3VibGVXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5GbG9hdFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTG9uZ1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLlNlcXVlbmNlRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5WSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVkxvbmdXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5CeXRlc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuU2NlbmFyaW9Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlRlc3RDb25zdGFudHM7CisKKworcHVibGljIGNsYXNzIFRlc3RJbnB1dEZpbGUgeworCXByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0SW5wdXRGaWxlLmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEtWU2l6ZVNjb3BlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdE1pbk51bSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERlZmF1bHRNYXhOdW0gPSA2NDsKKworICAgIHB1YmxpYyBpbnQgbWluQnl0ZXNOdW07CisgICAgcHVibGljIGludCBtYXhCeXRlc051bTsKKworICAgIHB1YmxpYyBLVlNpemVTY29wZSgpIHsKKyAgICAgIHRoaXMubWluQnl0ZXNOdW0gPSBEZWZhdWx0TWluTnVtOworICAgICAgdGhpcy5tYXhCeXRlc051bSA9IERlZmF1bHRNYXhOdW07CisgICAgfQorCisgICAgcHVibGljIEtWU2l6ZVNjb3BlKGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgIHRoaXMubWluQnl0ZXNOdW0gPSBtaW47CisgICAgICB0aGlzLm1heEJ5dGVzTnVtID0gbWF4OworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBLVlNpemVTY29wZT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBLVlNpemVTY29wZT4oKTsKKworICBwcml2YXRlIGJ5dGVbXSBkYXRhYnVmID0gbnVsbDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5Q2xzTmFtZSwgdmFsdWVDbHNOYW1lOworICBwcml2YXRlIGludCBmaWxlc2l6ZSA9IDA7CisgIHByaXZhdGUgaW50IGtleU1heEJ5dGVzTnVtLCBrZXlNaW5CeXRlc051bTsKKyAgcHJpdmF0ZSBpbnQgdmFsdWVNYXhCeXRlc051bSwgdmFsdWVNaW5CeXRlc051bTsKKyAgcHJpdmF0ZSBTZXF1ZW5jZUZpbGUuV3JpdGVyIHdyaXRlciA9IG51bGw7CisgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBQlVGU0laRSA9IDEgPDwgMjI7IC8vIDRNCisKKyAgcHJpdmF0ZSBlbnVtIFN0YXRlIHsKKyAgICBLRVksIFZBTFVFCisgIH07CisgIAorICBzdGF0aWMgeworICAgIG1hcC5wdXQoQm9vbGVhbldyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgbmV3IEtWU2l6ZVNjb3BlKDEsIDEpKTsKKyAgICBtYXAucHV0KERvdWJsZVdyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgbmV3IEtWU2l6ZVNjb3BlKDgsIDgpKTsKKyAgICBtYXAucHV0KEZsb2F0V3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgS1ZTaXplU2NvcGUoNCwgNCkpOworICAgIG1hcC5wdXQoVkxvbmdXcml0YWJsZS5jbGFzcy5nZXROYW1lKCksIG5ldyBLVlNpemVTY29wZSg4LCA4KSk7CisgICAgbWFwLnB1dChCeXRlV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgS1ZTaXplU2NvcGUoMSwgMSkpOworICAgIG1hcC5wdXQoTG9uZ1dyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSwgbmV3IEtWU2l6ZVNjb3BlKDgsIDgpKTsKKyAgICBtYXAucHV0KFZJbnRXcml0YWJsZS5jbGFzcy5nZXROYW1lKCksIG5ldyBLVlNpemVTY29wZSg0LCA0KSk7CisgICAgbWFwLnB1dChJbnRXcml0YWJsZS5jbGFzcy5nZXROYW1lKCksIG5ldyBLVlNpemVTY29wZSg0LCA0KSk7CisgIH0KKyAgCisgIHB1YmxpYyBUZXN0SW5wdXRGaWxlKGludCBmaWxlc2l6ZSwgU3RyaW5nIGtleXR5cGUsIFN0cmluZyB2YWx1ZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGhpcy5maWxlc2l6ZSA9IGZpbGVzaXplOworICAgIHRoaXMuZGF0YWJ1ZiA9IG5ldyBieXRlW0RBVEFCVUZTSVpFXTsKKyAgICB0aGlzLmtleUNsc05hbWUgPSBrZXl0eXBlOworICAgIHRoaXMudmFsdWVDbHNOYW1lID0gdmFsdWV0eXBlOworICAgIGZpbmFsIGludCBkZWZhdWx0TWluQnl0ZXMgPSBjb25mLmdldEludChUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfS1ZTSVpFX01JTiwgMSk7CisgICAgZmluYWwgaW50IGRlZmF1bHRNYXhCeXRlcyA9IGNvbmYuZ2V0SW50KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19LVlNJWkVfTUFYLCA2NCk7CisKKyAgICBpZiAobWFwLmdldChrZXl0eXBlKSAhPSBudWxsKSB7CisgICAgICBrZXlNaW5CeXRlc051bSA9IG1hcC5nZXQoa2V5dHlwZSkubWluQnl0ZXNOdW07CisgICAgICBrZXlNYXhCeXRlc051bSA9IG1hcC5nZXQoa2V5dHlwZSkubWF4Qnl0ZXNOdW07CisgICAgfSBlbHNlIHsKKyAgICAgIGtleU1pbkJ5dGVzTnVtID0gZGVmYXVsdE1pbkJ5dGVzOworICAgICAga2V5TWF4Qnl0ZXNOdW0gPSBkZWZhdWx0TWF4Qnl0ZXM7CisgICAgfQorCisgICAgaWYgKG1hcC5nZXQodmFsdWV0eXBlKSAhPSBudWxsKSB7CisgICAgICB2YWx1ZU1pbkJ5dGVzTnVtID0gbWFwLmdldCh2YWx1ZXR5cGUpLm1pbkJ5dGVzTnVtOworICAgICAgdmFsdWVNYXhCeXRlc051bSA9IG1hcC5nZXQodmFsdWV0eXBlKS5tYXhCeXRlc051bTsKKyAgICB9IGVsc2UgeworICAgICAgdmFsdWVNaW5CeXRlc051bSA9IGRlZmF1bHRNaW5CeXRlczsKKyAgICAgIHZhbHVlTWF4Qnl0ZXNOdW0gPSBkZWZhdWx0TWF4Qnl0ZXM7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgY3JlYXRlU2VxdWVuY2VUZXN0RmlsZShTdHJpbmcgZmlsZXBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgIGludCBGVUxMX0JZVEVfU1BBQ0UgPSAyNTY7CisgICAgY3JlYXRlU2VxdWVuY2VUZXN0RmlsZShmaWxlcGF0aCwgRlVMTF9CWVRFX1NQQUNFKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNyZWF0ZVNlcXVlbmNlVGVzdEZpbGUoU3RyaW5nIGZpbGVwYXRoLCBpbnQgYmFzZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgY3JlYXRlU2VxdWVuY2VUZXN0RmlsZShmaWxlcGF0aCwgYmFzZSwgKGJ5dGUpMCk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNyZWF0ZVNlcXVlbmNlVGVzdEZpbGUoU3RyaW5nIGZpbGVwYXRoLCBpbnQgYmFzZSwgIGJ5dGUgc3RhcnQpIHRocm93cyBFeGNlcHRpb24geworICAgIExPRy5pbmZvKCJjcmVhdGluZyBmaWxlICIgKyBmaWxlcGF0aCArICIoIiArIGZpbGVzaXplICsgIiBieXRlcykiKTsKKyAgICBMT0cuaW5mbyhrZXlDbHNOYW1lICsgIiAiICsgdmFsdWVDbHNOYW1lKTsKKyAgICBDbGFzczw/PiB0bXBrZXljbHMsIHRtcHZhbHVlY2xzOworICAgIHRyeSB7CisgICAgICB0bXBrZXljbHMgPSBDbGFzcy5mb3JOYW1lKGtleUNsc05hbWUpOworICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigia2V5IGNsYXNzIG5vdCBmb3VuZDogIiwgZSk7CisgICAgfQorICAgIHRyeSB7CisgICAgICB0bXB2YWx1ZWNscyA9IENsYXNzLmZvck5hbWUodmFsdWVDbHNOYW1lKTsKKyAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImtleSBjbGFzcyBub3QgZm91bmQ6ICIsIGUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgZmluYWwgUGF0aCBvdXRwdXRmaWxlcGF0aCA9IG5ldyBQYXRoKGZpbGVwYXRoKTsKKyAgICAgIGZpbmFsIFNjZW5hcmlvQ29uZmlndXJhdGlvbiBjb25mPSBuZXcgU2NlbmFyaW9Db25maWd1cmF0aW9uKCk7CisgICAgICB3cml0ZXIgPSBTZXF1ZW5jZUZpbGUuY3JlYXRlV3JpdGVyKAorICAgICAgICBjb25mLAorICAgICAgICBTZXF1ZW5jZUZpbGUuV3JpdGVyLmZpbGUob3V0cHV0ZmlsZXBhdGgpLAorICAgICAgICBTZXF1ZW5jZUZpbGUuV3JpdGVyLmtleUNsYXNzKHRtcGtleWNscyksCisgICAgICAgIFNlcXVlbmNlRmlsZS5Xcml0ZXIudmFsdWVDbGFzcyh0bXB2YWx1ZWNscykpOworICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIGludCB0bXBmaWxlc2l6ZSA9IHRoaXMuZmlsZXNpemU7CisgICAgd2hpbGUgKHRtcGZpbGVzaXplID4gREFUQUJVRlNJWkUpIHsKKyAgICAgIG5leHRSYW5kb21CeXRlcyhkYXRhYnVmLCBiYXNlLCBzdGFydCk7CisgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGZsdXNoQnVmKERBVEFCVUZTSVpFKTsKKyAgICAgIHRtcGZpbGVzaXplIC09IHNpemU7CisgICAgfQorICAgIG5leHRSYW5kb21CeXRlcyhkYXRhYnVmLCBiYXNlLCBzdGFydCk7CisgICAgZmx1c2hCdWYodG1wZmlsZXNpemUpOworCisgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICBJT1V0aWxzLmNsb3NlU3RyZWFtKHdyaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm5vIHdyaXRlciB0byBjcmVhdGUgc2VxdWVuY2VUZXN0RmlsZSEiKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBuZXh0UmFuZG9tQnl0ZXMoYnl0ZVtdIGJ1ZiwgaW50IGJhc2UpIHsKKyAgICBuZXh0UmFuZG9tQnl0ZXMoYnVmLCBiYXNlLCAoYnl0ZSkwKTsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIG5leHRSYW5kb21CeXRlcyhieXRlW10gYnVmLCBpbnQgYmFzZSwgYnl0ZSBzdGFydCkgeworICAgIHIubmV4dEJ5dGVzKGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJ1ZltpXSA9IChieXRlKSAoKGJ1ZltpXSAmIDB4RkYpICUgYmFzZSArIHN0YXJ0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGludCBmbHVzaEJ1ZihpbnQgYnVmbGVuKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKKyAgICBpbnQga2V5Ynl0ZXNudW0gPSAwOworICAgIGludCB2YWx1ZWJ5dGVzbnVtID0gMDsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKworICAgIFdyaXRhYmxlIGtleVdyaXRhYmxlID0gQnl0ZXNGYWN0b3J5Lm5ld09iamVjdChudWxsLCBrZXlDbHNOYW1lKTsKKyAgICBXcml0YWJsZSB2YWxXcml0YWJsZSA9IEJ5dGVzRmFjdG9yeS5uZXdPYmplY3QobnVsbCwgdmFsdWVDbHNOYW1lKTsKKworICAgIHdoaWxlIChvZmZzZXQgPCBidWZsZW4pIHsKKyAgICAgIGZpbmFsIGludCByZW1haW5zID0gYnVmbGVuIC0gb2Zmc2V0OworICAgICAga2V5Ynl0ZXNudW0gPSBrZXlNYXhCeXRlc051bTsKKyAgICAgIGlmIChrZXlNYXhCeXRlc051bSAhPSBrZXlNaW5CeXRlc051bSkgeworICAgICAgICBrZXlieXRlc251bSA9IGtleU1pbkJ5dGVzTnVtICsgci5uZXh0SW50KGtleU1heEJ5dGVzTnVtIC0ga2V5TWluQnl0ZXNOdW0pOworICAgICAgfQorCisgICAgICB2YWx1ZWJ5dGVzbnVtID0gdmFsdWVNYXhCeXRlc051bTsKKyAgICAgIGlmICh2YWx1ZU1heEJ5dGVzTnVtICE9IHZhbHVlTWluQnl0ZXNOdW0pIHsKKyAgICAgICAgdmFsdWVieXRlc251bSA9IHZhbHVlTWluQnl0ZXNOdW0gKyByLm5leHRJbnQodmFsdWVNYXhCeXRlc051bSAtIHZhbHVlTWluQnl0ZXNOdW0pOworICAgICAgfQorCisgICAgICBpZiAoa2V5Ynl0ZXNudW0gKyB2YWx1ZWJ5dGVzbnVtID4gcmVtYWlucykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZmluYWwgYnl0ZVtdIGtleSA9IG5ldyBieXRlW2tleWJ5dGVzbnVtXTsKKyAgICAgIGZpbmFsIGJ5dGVbXSB2YWx1ZSA9IG5ldyBieXRlW3ZhbHVlYnl0ZXNudW1dOworCisgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGFidWYsIG9mZnNldCwga2V5LCAwLCBrZXlieXRlc251bSk7CisgICAgICBvZmZzZXQgKz0ga2V5Ynl0ZXNudW07CisKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YWJ1Ziwgb2Zmc2V0LCB2YWx1ZSwgMCwgdmFsdWVieXRlc251bSk7CisgICAgICBvZmZzZXQgKz0gdmFsdWVieXRlc251bTsKKworICAgICAgQnl0ZXNGYWN0b3J5LnVwZGF0ZU9iamVjdChrZXlXcml0YWJsZSwga2V5KTsKKyAgICAgIEJ5dGVzRmFjdG9yeS51cGRhdGVPYmplY3QodmFsV3JpdGFibGUsIHZhbHVlKTsKKyAgICAgCisgICAgICB0cnkgeworICAgICAgICB3cml0ZXIuYXBwZW5kKGtleVdyaXRhYmxlLCB2YWxXcml0YWJsZSk7CisgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInNlcXVlbmNlIGZpbGUgY3JlYXRlIGZhaWxlZCIsIGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworICB9CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svbm9uc29ydHRlc3QvTm9uU29ydFRlc3QuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svbm9uc29ydHRlc3QvTm9uU29ydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWUxZWFlCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9ub25zb3J0dGVzdC9Ob25Tb3J0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2subm9uc29ydHRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkludFdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkxvbmdXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5UZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLk5hdGl2ZVJ1bnRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sua3Z0ZXN0LlRlc3RJbnB1dEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuUmVzdWx0VmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuU2NlbmFyaW9Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLlRlc3RDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLkpvYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0LkZpbGVJbnB1dEZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0LlNlcXVlbmNlRmlsZUlucHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5saWIub3V0cHV0LkZpbGVPdXRwdXRGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5vdXRwdXQuVGV4dE91dHB1dEZvcm1hdDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLk5hdGl2ZUNvZGVMb2FkZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgTm9uU29ydFRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG5vblNvcnRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29uZmlndXJhdGlvbiBuYXRpdmVDb25mID0gU2NlbmFyaW9Db25maWd1cmF0aW9uLmdldE5hdGl2ZUNvbmZpZ3VyYXRpb24oKTsKKyAgICBuYXRpdmVDb25mLmFkZFJlc291cmNlKFRlc3RDb25zdGFudHMuTk9OU09SVF9URVNUX0NPTkYpOworICAgIG5hdGl2ZUNvbmYuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19NQVBfT1VUUFVUX1NPUlQsICJmYWxzZSIpOworICAgIGZpbmFsIEpvYiBuYXRpdmVOb25Tb3J0ID0gZ2V0Sm9iKG5hdGl2ZUNvbmYsICJOYXRpdmVOb25Tb3J0IiwKKyAgICAgIFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19OT05TT1JUX1RFU1RfSU5QVVRESVIsCisgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfTk9OU09SVF9URVNUX05BVElWRV9PVVRQVVQpOworICAgIGFzc2VydFRydWUobmF0aXZlTm9uU29ydC53YWl0Rm9yQ29tcGxldGlvbih0cnVlKSk7CisKKyAgICBDb25maWd1cmF0aW9uIG5vcm1hbENvbmYgPSBTY2VuYXJpb0NvbmZpZ3VyYXRpb24uZ2V0Tm9ybWFsQ29uZmlndXJhdGlvbigpOworICAgIG5vcm1hbENvbmYuYWRkUmVzb3VyY2UoVGVzdENvbnN0YW50cy5OT05TT1JUX1RFU1RfQ09ORik7CisgICAgZmluYWwgSm9iIGhhZG9vcFdpdGhTb3J0ID0gZ2V0Sm9iKG5vcm1hbENvbmYsICJOb3JtYWxKb2IiLAorICAgICAgVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX05PTlNPUlRfVEVTVF9JTlBVVERJUiwKKyAgICAgIFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19OT05TT1JUX1RFU1RfTk9STUFMX09VVFBVVCk7CisgICAgYXNzZXJ0VHJ1ZShoYWRvb3BXaXRoU29ydC53YWl0Rm9yQ29tcGxldGlvbih0cnVlKSk7CisKKyAgICBmaW5hbCBib29sZWFuIGNvbXBhcmVSZXQgPSBSZXN1bHRWZXJpZmllci52ZXJpZnkoCisgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfTk9OU09SVF9URVNUX05BVElWRV9PVVRQVVQsCisgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfTk9OU09SVF9URVNUX05PUk1BTF9PVVRQVVQpOworICAgIGFzc2VydEVxdWFscygiZmlsZSBjb21wYXJlIHJlc3VsdDogaWYgdGhleSBhcmUgdGhlIHNhbWUgLHRoZW4gcmV0dXJuIHRydWUiLCB0cnVlLCBjb21wYXJlUmV0KTsKKyAgICBSZXN1bHRWZXJpZmllci52ZXJpZnlDb3VudGVycyhoYWRvb3BXaXRoU29ydCwgbmF0aXZlTm9uU29ydCk7CisgIH0KKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHN0YXJ0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVDb2RlTG9hZGVyLmlzTmF0aXZlQ29kZUxvYWRlZCgpKTsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZShOYXRpdmVSdW50aW1lLmlzTmF0aXZlTGlicmFyeUxvYWRlZCgpKTsKKyAgICBmaW5hbCBTY2VuYXJpb0NvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBTY2VuYXJpb0NvbmZpZ3VyYXRpb24oKTsKKyAgICBjb25mLmFkZE5vblNvcnRUZXN0Q29uZigpOworICAgIGZpbmFsIEZpbGVTeXN0ZW0gZnMgPSBGaWxlU3lzdGVtLmdldChjb25mKTsKKyAgICBmaW5hbCBQYXRoIHBhdGggPSBuZXcgUGF0aChUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfTk9OU09SVF9URVNUX0lOUFVURElSKTsKKyAgICBpZiAoIWZzLmV4aXN0cyhwYXRoKSkgeworICAgICAgaW50IGZpbGVzaXplID0gY29uZi5nZXRJbnQoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX05PTlNPUlRURVNUX0ZJTEVTSVpFLCAxMDAwMDAwMCk7CisgICAgICBuZXcgVGVzdElucHV0RmlsZShmaWxlc2l6ZSwgVGV4dC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgVGV4dC5jbGFzcy5nZXROYW1lKCksIGNvbmYpLmNyZWF0ZVNlcXVlbmNlVGVzdEZpbGUocGF0aC50b1N0cmluZygpKTsKKyAgICB9CisgICAgZnMuY2xvc2UoKTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhblVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5nZXQobmV3IFNjZW5hcmlvQ29uZmlndXJhdGlvbigpKTsKKyAgICBmcy5kZWxldGUobmV3IFBhdGgoVGVzdENvbnN0YW50cy5OQVRJVkVUQVNLX05PTlNPUlRfVEVTVF9ESVIpLCB0cnVlKTsKKyAgICBmcy5jbG9zZSgpOworICB9CisKKworICBwcml2YXRlIEpvYiBnZXRKb2IoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgam9iTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnB1dHBhdGgsIFN0cmluZyBvdXRwdXRwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIEZpbGVTeXN0ZW0gZnMgPSBGaWxlU3lzdGVtLmdldChjb25mKTsKKyAgICBpZiAoZnMuZXhpc3RzKG5ldyBQYXRoKG91dHB1dHBhdGgpKSkgeworICAgICAgZnMuZGVsZXRlKG5ldyBQYXRoKG91dHB1dHBhdGgpLCB0cnVlKTsKKyAgICB9CisgICAgZnMuY2xvc2UoKTsKKyAgICBmaW5hbCBKb2Igam9iID0gSm9iLmdldEluc3RhbmNlKGNvbmYsIGpvYk5hbWUpOworICAgIGpvYi5zZXRKYXJCeUNsYXNzKE5vblNvcnRUZXN0TVIuY2xhc3MpOworICAgIGpvYi5zZXRNYXBwZXJDbGFzcyhOb25Tb3J0VGVzdE1SLk1hcC5jbGFzcyk7CisgICAgam9iLnNldFJlZHVjZXJDbGFzcyhOb25Tb3J0VGVzdE1SLktleUhhc2hTdW1SZWR1Y2UuY2xhc3MpOworICAgIGpvYi5zZXRPdXRwdXRLZXlDbGFzcyhUZXh0LmNsYXNzKTsKKyAgICBqb2Iuc2V0TWFwT3V0cHV0VmFsdWVDbGFzcyhJbnRXcml0YWJsZS5jbGFzcyk7CisgICAgam9iLnNldE91dHB1dFZhbHVlQ2xhc3MoTG9uZ1dyaXRhYmxlLmNsYXNzKTsKKyAgICBqb2Iuc2V0SW5wdXRGb3JtYXRDbGFzcyhTZXF1ZW5jZUZpbGVJbnB1dEZvcm1hdC5jbGFzcyk7CisgICAgam9iLnNldE91dHB1dEZvcm1hdENsYXNzKFRleHRPdXRwdXRGb3JtYXQuY2xhc3MpOworICAgIEZpbGVJbnB1dEZvcm1hdC5hZGRJbnB1dFBhdGgoam9iLCBuZXcgUGF0aChpbnB1dHBhdGgpKTsKKyAgICBGaWxlT3V0cHV0Rm9ybWF0LnNldE91dHB1dFBhdGgoam9iLCBuZXcgUGF0aChvdXRwdXRwYXRoKSk7CisgICAgcmV0dXJuIGpvYjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL25vbnNvcnR0ZXN0L05vblNvcnRUZXN0TVIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svbm9uc29ydHRlc3QvTm9uU29ydFRlc3RNUi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTJlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL25vbnNvcnR0ZXN0L05vblNvcnRUZXN0TVIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2subm9uc29ydHRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5JbnRXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Mb25nV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWR1Y2VyOworCitwdWJsaWMgY2xhc3MgTm9uU29ydFRlc3RNUiB7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXAgZXh0ZW5kcyBNYXBwZXI8T2JqZWN0LCBUZXh0LCBUZXh0LCBJbnRXcml0YWJsZT4geworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEludFdyaXRhYmxlIG9uZSA9IG5ldyBJbnRXcml0YWJsZSgxKTsKKyAgICBwcml2YXRlIGZpbmFsIFRleHQgd29yZCA9IG5ldyBUZXh0KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtYXAoT2JqZWN0IGtleSwgVGV4dCB2YWx1ZSwgQ29udGV4dCBjb250ZXh0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lKTsKKyAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgIHdvcmQuc2V0KHRva2VuaXplci5uZXh0VG9rZW4oKSk7CisgICAgICAgIGNvbnRleHQud3JpdGUod29yZCwgb25lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEtleUhhc2hTdW1SZWR1Y2UgZXh0ZW5kcyBSZWR1Y2VyPFRleHQsIEludFdyaXRhYmxlLCBUZXh0LCBMb25nV3JpdGFibGU+IHsKKyAgICBsb25nIHN1bSA9IDA7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVkdWNlKFRleHQga2V5LCBJdGVyYWJsZTxJbnRXcml0YWJsZT4gdmFsdWVzLCBDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICBmb3IgKGZpbmFsIEludFdyaXRhYmxlIHZhbCA6IHZhbHVlcykgeworICAgICAgICBvcy5yZXNldCgpOworICAgICAgICBrZXkud3JpdGUoZG9zKTsKKyAgICAgICAgZmluYWwgaW50IGhhc2ggPSBBcnJheXMuaGFzaENvZGUob3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIHN1bSArPSBoYXNoOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgIGNvbnRleHQud3JpdGUobmV3IFRleHQoIk5vblNvcnRUZXN0IiksIG5ldyBMb25nV3JpdGFibGUoc3VtKSk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvVGVzdEtWU2VyaWFsaXplci5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9UZXN0S1ZTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1YjEwMAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svc2VyZGUvVGVzdEtWU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suc2VyZGU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZXNXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suYnVmZmVyLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5idWZmZXIuRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5UZXN0SW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWwuVGVzdElucHV0LktWOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWwuU2l6ZWRXcml0YWJsZTsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLm1vY2tpdG8uTWF0Y2hlcnM7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQorcHVibGljIGNsYXNzIFRlc3RLVlNlcmlhbGl6ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgaW50IGlucHV0QXJyYXlTaXplID0gMTAwMDsgLy8gMTAwMCBieXRlc1dyaWFibGUgZWxlbWVudHMKKyAgaW50IGJ1ZmZlclNpemUgPSAxMDA7IC8vIGJ5dGVzCisgIHByaXZhdGUgS1Y8Qnl0ZXNXcml0YWJsZSwgQnl0ZXNXcml0YWJsZT5bXSBpbnB1dEFycmF5OworCisgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgIHByaXZhdGUgU2l6ZWRXcml0YWJsZSBrZXk7CisgIHByaXZhdGUgU2l6ZWRXcml0YWJsZSB2YWx1ZTsKKyAgcHJpdmF0ZSBLVlNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKworICBAT3ZlcnJpZGUKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5pbnB1dEFycmF5ID0gVGVzdElucHV0LmdldE1hcElucHV0cyhpbnB1dEFycmF5U2l6ZSk7CisgICAgdGhpcy5rZXkgPSBuZXcgU2l6ZWRXcml0YWJsZShCeXRlc1dyaXRhYmxlLmNsYXNzKTsKKyAgICB0aGlzLnZhbHVlID0gbmV3IFNpemVkV3JpdGFibGUoQnl0ZXNXcml0YWJsZS5jbGFzcyk7CisKKyAgICB0aGlzLnNlcmlhbGl6ZXIgPSBuZXcgS1ZTZXJpYWxpemVyKEJ5dGVzV3JpdGFibGUuY2xhc3MsIEJ5dGVzV3JpdGFibGUuY2xhc3MpOworCisgICAga2V5LnJlc2V0KGlucHV0QXJyYXlbNF0ua2V5KTsKKyAgICB2YWx1ZS5yZXNldChpbnB1dEFycmF5WzRdLnZhbHVlKTsKKyAgICBzZXJpYWxpemVyLnVwZGF0ZUxlbmd0aChrZXksIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVMZW5ndGgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIE1vY2tpdG8ubW9jayhEYXRhT3V0cHV0U3RyZWFtLmNsYXNzKTsKKworICAgIGludCBrdkxlbmd0aCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dEFycmF5U2l6ZTsgaSsrKSB7CisgICAgICBrZXkucmVzZXQoaW5wdXRBcnJheVtpXS5rZXkpOworICAgICAgdmFsdWUucmVzZXQoaW5wdXRBcnJheVtpXS52YWx1ZSk7CisgICAgICBzZXJpYWxpemVyLnVwZGF0ZUxlbmd0aChrZXksIHZhbHVlKTsKKworICAgICAgLy8gdmVyaWZ5IHdoZXRoZXIgdGhlIHNpemUgaW5jcmVhc2UKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGtleS5sZW5ndGggKyB2YWx1ZS5sZW5ndGggPiBrdkxlbmd0aCk7CisgICAgICBrdkxlbmd0aCA9IGtleS5sZW5ndGggKyB2YWx1ZS5sZW5ndGg7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZUtWKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBEYXRhT3V0cHV0U3RyZWFtIGRhdGFPdXQgPSBNb2NraXRvLm1vY2soRGF0YU91dHB1dFN0cmVhbS5jbGFzcyk7CisKKyAgICBNb2NraXRvLndoZW4oZGF0YU91dC5oYXNVbkZsdXNoZWREYXRhKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgTW9ja2l0by53aGVuKGRhdGFPdXQuc2hvcnRPZlNwYWNlKGtleS5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU0laRU9GX0tWX0xFTkdUSCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgZmluYWwgaW50IHdyaXR0ZW4gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZUtWKGRhdGFPdXQsIGtleSwgdmFsdWUpOworCisgICAgLy8gZmx1c2ggb25jZSwgd3JpdGUgNCBpbnQsIGFuZCAyIGJ5dGUgYXJyYXkKKyAgICBNb2NraXRvLnZlcmlmeShkYXRhT3V0LCBNb2NraXRvLnRpbWVzKDEpKS5mbHVzaCgpOworICAgIE1vY2tpdG8udmVyaWZ5KGRhdGFPdXQsIE1vY2tpdG8udGltZXMoNCkpLndyaXRlSW50KE1hdGNoZXJzLmFueUludCgpKTsKKyAgICBNb2NraXRvLnZlcmlmeShkYXRhT3V0LCBNb2NraXRvLnRpbWVzKDIpKS53cml0ZShNYXRjaGVycy5hbnkoYnl0ZVtdLmNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVycy5hbnlJbnQoKSwgTWF0Y2hlcnMuYW55SW50KCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh3cml0dGVuLCBrZXkubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgQ29uc3RhbnRzLlNJWkVPRl9LVl9MRU5HVEgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZU5vRmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIERhdGFPdXRwdXRTdHJlYW0gZGF0YU91dCA9IE1vY2tpdG8ubW9jayhEYXRhT3V0cHV0U3RyZWFtLmNsYXNzKTsKKworICAgIC8vIHN1cHBvc2UgdGhlcmUgYXJlIGVub3VnaCBzcGFjZQorICAgIE1vY2tpdG8ud2hlbihkYXRhT3V0Lmhhc1VuRmx1c2hlZERhdGEoKSkudGhlblJldHVybih0cnVlKTsKKyAgICBNb2NraXRvLndoZW4oZGF0YU91dC5zaG9ydE9mU3BhY2UoTWF0Y2hlcnMuYW55SW50KCkpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICBmaW5hbCBpbnQgd3JpdHRlbiA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplS1YoZGF0YU91dCwga2V5LCB2YWx1ZSk7CisKKyAgICAvLyBmbHVzaCAwLCB3cml0ZSA0IGludCwgYW5kIDIgYnl0ZSBhcnJheQorICAgIE1vY2tpdG8udmVyaWZ5KGRhdGFPdXQsIE1vY2tpdG8udGltZXMoMCkpLmZsdXNoKCk7CisgICAgTW9ja2l0by52ZXJpZnkoZGF0YU91dCwgTW9ja2l0by50aW1lcyg0KSkud3JpdGVJbnQoTWF0Y2hlcnMuYW55SW50KCkpOworICAgIE1vY2tpdG8udmVyaWZ5KGRhdGFPdXQsIE1vY2tpdG8udGltZXMoMikpLndyaXRlKE1hdGNoZXJzLmFueShieXRlW10uY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoZXJzLmFueUludCgpLCBNYXRjaGVycy5hbnlJbnQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdyaXR0ZW4sIGtleS5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyBDb25zdGFudHMuU0laRU9GX0tWX0xFTkdUSCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplUGFydGl0aW9uS1YoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIERhdGFPdXRwdXRTdHJlYW0gZGF0YU91dCA9IE1vY2tpdG8ubW9jayhEYXRhT3V0cHV0U3RyZWFtLmNsYXNzKTsKKworICAgIE1vY2tpdG8ud2hlbihkYXRhT3V0Lmhhc1VuRmx1c2hlZERhdGEoKSkudGhlblJldHVybih0cnVlKTsKKyAgICBNb2NraXRvLndoZW4oCisgICAgICAgIGRhdGFPdXQKKyAgICAgICAgLnNob3J0T2ZTcGFjZShrZXkubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU0laRU9GX0tWX0xFTkdUSCArIENvbnN0YW50cy5TSVpFT0ZfUEFSVElUSU9OX0xFTkdUSCkpCisgICAgICAgIC50aGVuUmV0dXJuKHRydWUpOworICAgIGZpbmFsIGludCB3cml0dGVuID0gc2VyaWFsaXplci5zZXJpYWxpemVQYXJ0aXRpb25LVihkYXRhT3V0LCAxMDAsIGtleSwgdmFsdWUpOworCisgICAgLy8gZmx1c2ggb25jZSwgd3JpdGUgNCBpbnQsIGFuZCAyIGJ5dGUgYXJyYXkKKyAgICBNb2NraXRvLnZlcmlmeShkYXRhT3V0LCBNb2NraXRvLnRpbWVzKDEpKS5mbHVzaCgpOworICAgIE1vY2tpdG8udmVyaWZ5KGRhdGFPdXQsIE1vY2tpdG8udGltZXMoNSkpLndyaXRlSW50KE1hdGNoZXJzLmFueUludCgpKTsKKyAgICBNb2NraXRvLnZlcmlmeShkYXRhT3V0LCBNb2NraXRvLnRpbWVzKDIpKS53cml0ZShNYXRjaGVycy5hbnkoYnl0ZVtdLmNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVycy5hbnlJbnQoKSwgTWF0Y2hlcnMuYW55SW50KCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh3cml0dGVuLCBrZXkubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgQ29uc3RhbnRzLlNJWkVPRl9LVl9MRU5HVEgKKyAgICAgICAgKyBDb25zdGFudHMuU0laRU9GX1BBUlRJVElPTl9MRU5HVEgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplck5vRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgRGF0YUlucHV0U3RyZWFtIGluID0gTW9ja2l0by5tb2NrKERhdGFJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgTW9ja2l0by53aGVuKGluLmhhc1VuUmVhZERhdGEoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBzZXJpYWxpemVyLmRlc2VyaWFsaXplS1YoaW4sIGtleSwgdmFsdWUpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIERhdGFJbnB1dFN0cmVhbSBpbiA9IE1vY2tpdG8ubW9jayhEYXRhSW5wdXRTdHJlYW0uY2xhc3MpOworICAgIE1vY2tpdG8ud2hlbihpbi5oYXNVblJlYWREYXRhKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoc2VyaWFsaXplci5kZXNlcmlhbGl6ZUtWKGluLCBrZXksIHZhbHVlKSA+IDApOworCisgICAgTW9ja2l0by52ZXJpZnkoaW4sIE1vY2tpdG8udGltZXMoNCkpLnJlYWRJbnQoKTsKKyAgICBNb2NraXRvLnZlcmlmeShpbiwgTW9ja2l0by50aW1lcygyKSkucmVhZEZ1bGx5KE1hdGNoZXJzLmFueShieXRlW10uY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcnMuYW55SW50KCksIE1hdGNoZXJzLmFueUludCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9UZXN0TmF0aXZlU2VyaWFsaXphdGlvbi5qYXZhIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay9zZXJkZS9UZXN0TmF0aXZlU2VyaWFsaXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjZjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3NlcmRlL1Rlc3ROYXRpdmVTZXJpYWxpemF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay5zZXJkZTsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suSU5hdGl2ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiIH0pCitwdWJsaWMgY2xhc3MgVGVzdE5hdGl2ZVNlcmlhbGl6YXRpb24geworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJBbmRHZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIE5hdGl2ZVNlcmlhbGl6YXRpb24gc2VyaWFsaXphdGlvbiA9IE5hdGl2ZVNlcmlhbGl6YXRpb24uZ2V0SW5zdGFuY2UoKTsKKyAgICBzZXJpYWxpemF0aW9uLnJlc2V0KCk7CisKKyAgICBzZXJpYWxpemF0aW9uLnJlZ2lzdGVyKFdyaXRhYmxlS2V5LmNsYXNzLmdldE5hbWUoKSwgQ29tcGFyYWJsZUtleVNlcmlhbGl6ZXIuY2xhc3MpOworCisgICAgSU5hdGl2ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IHNlcmlhbGl6YXRpb24uZ2V0U2VyaWFsaXplcihXcml0YWJsZUtleS5jbGFzcyk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDb21wYXJhYmxlS2V5U2VyaWFsaXplci5jbGFzcy5nZXROYW1lKCksIHNlcmlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCisgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6YXRpb24uZ2V0U2VyaWFsaXplcihXcml0YWJsZVZhbHVlLmNsYXNzKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRTZXJpYWxpemVyLmNsYXNzLmdldE5hbWUoKSwgc2VyaWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICBib29sZWFuIGlvRXhjZXB0aW9uVGhyb3duID0gZmFsc2U7CisgICAgdHJ5IHsKKyAgICAgIHNlcmlhbGl6ZXIgPSBzZXJpYWxpemF0aW9uLmdldFNlcmlhbGl6ZXIoTm9uV3JpdGFibGVWYWx1ZS5jbGFzcyk7CisgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgaW9FeGNlcHRpb25UaHJvd24gPSB0cnVlOworICAgIH0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpb0V4Y2VwdGlvblRocm93bik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFdyaXRhYmxlS2V5IGltcGxlbWVudHMgV3JpdGFibGUgeworICAgIHByaXZhdGUgaW50IHZhbHVlOworCisgICAgcHVibGljIFdyaXRhYmxlS2V5KGludCBhKSB7CisgICAgICB0aGlzLnZhbHVlID0gYTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKyAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IHYpIHsKKyAgICAgIHRoaXMudmFsdWUgPSB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKERhdGFPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZEZpZWxkcyhEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBXcml0YWJsZVZhbHVlIGltcGxlbWVudHMgV3JpdGFibGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoRGF0YU91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZEZpZWxkcyhEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25Xcml0YWJsZVZhbHVlIHsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGFyYWJsZUtleVNlcmlhbGl6ZXIKKyAgICBpbXBsZW1lbnRzIElOYXRpdmVDb21wYXJhYmxlLCBJTmF0aXZlU2VyaWFsaXplcjxXcml0YWJsZUtleT4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoV3JpdGFibGVLZXkgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiB3LmdldExlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0YWJsZUtleSB3LCBEYXRhT3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIG91dC53cml0ZUludCh3LmdldFZhbHVlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKERhdGFJbnB1dCBpbiwgaW50IGxlbmd0aCwgV3JpdGFibGVLZXkgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHcuc2V0VmFsdWUoaW4ucmVhZEludCgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvQnl0ZXNGYWN0b3J5LmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3Rlc3R1dGlsL0J5dGVzRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjQ4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3Rlc3R1dGlsL0J5dGVzRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkxvbmdzOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQm9vbGVhbldyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkRvdWJsZVdyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkZsb2F0V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTG9uZ1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLlRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVVRGODsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5WSW50V3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVkxvbmdXcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLkJ5dGVzVXRpbDsKKworQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKK3B1YmxpYyBjbGFzcyBCeXRlc0ZhY3RvcnkgeworICBwdWJsaWMgc3RhdGljIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVPYmplY3QoV3JpdGFibGUgb2JqLCBieXRlW10gc2VlZCkgeworICAgIGlmIChvYmogaW5zdGFuY2VvZiBJbnRXcml0YWJsZSkgeworICAgICAgKChJbnRXcml0YWJsZSlvYmopLnNldChJbnRzLmZyb21CeXRlQXJyYXkoc2VlZCkpOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRmxvYXRXcml0YWJsZSkgeworICAgICAgKChGbG9hdFdyaXRhYmxlKW9iaikuc2V0KHIubmV4dEZsb2F0KCkpOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRG91YmxlV3JpdGFibGUpIHsKKyAgICAgICgoRG91YmxlV3JpdGFibGUpb2JqKS5zZXQoci5uZXh0RG91YmxlKCkpOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTG9uZ1dyaXRhYmxlKSB7CisgICAgICAoKExvbmdXcml0YWJsZSlvYmopLnNldChMb25ncy5mcm9tQnl0ZUFycmF5KHNlZWQpKTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFZJbnRXcml0YWJsZSkgeworICAgICAgKChWSW50V3JpdGFibGUpb2JqKS5zZXQoSW50cy5mcm9tQnl0ZUFycmF5KHNlZWQpKTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFZMb25nV3JpdGFibGUpIHsKKyAgICAgICgoVkxvbmdXcml0YWJsZSlvYmopLnNldChMb25ncy5mcm9tQnl0ZUFycmF5KHNlZWQpKTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW5Xcml0YWJsZSkgeworICAgICAgKChCb29sZWFuV3JpdGFibGUpb2JqKS5zZXQoc2VlZFswXSAlIDIgPT0gMSA/IHRydWUgOiBmYWxzZSk7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICAoKFRleHQpb2JqKS5zZXQoQnl0ZXNVdGlsLnRvU3RyaW5nQmluYXJ5KHNlZWQpKTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJ5dGVXcml0YWJsZSkgeworICAgICAgKChCeXRlV3JpdGFibGUpb2JqKS5zZXQoc2VlZC5sZW5ndGggPiAwID8gc2VlZFswXSA6IDApOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQnl0ZXNXcml0YWJsZSkgeworICAgICAgKChCeXRlc1dyaXRhYmxlKW9iaikuc2V0KHNlZWQsIDAsIHNlZWQubGVuZ3RoKTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFVURjgpIHsKKyAgICAgICgoVVRGOClvYmopLnNldChCeXRlc1V0aWwudG9TdHJpbmdCaW5hcnkoc2VlZCkpOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTW9ja1ZhbHVlQ2xhc3MpIHsKKyAgICAgICgoTW9ja1ZhbHVlQ2xhc3Mpb2JqKS5zZXQoc2VlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gd3JpdGFibGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGUgbmV3T2JqZWN0KGJ5dGVbXSBzZWVkLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgV3JpdGFibGUgcmV0OworICAgIHRyeSB7CisgICAgICBDbGFzczw/PiBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChXcml0YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSk7CisgICAgICByZXQgPSAoV3JpdGFibGUpY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICAgIGlmIChzZWVkICE9IG51bGwpIHsKKyAgICAgIHVwZGF0ZU9iamVjdChyZXQsIHNlZWQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcHVibGljIHN0YXRpYyA8VlRZUEU+IGJ5dGVbXSBmcm9tQnl0ZXMoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIDxWVFlQRT4gYnl0ZVtdIHRvQnl0ZXMoVlRZUEUgb2JqKSB7CisgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyhJbnRXcml0YWJsZS5jbGFzcy5nZXROYW1lKCkpKSB7CisgICAgICByZXR1cm4gSW50cy50b0J5dGVBcnJheSgoKEludFdyaXRhYmxlKSBvYmopLmdldCgpKTsKKyAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5lcXVhbHMoRmxvYXRXcml0YWJsZS5jbGFzcy5nZXROYW1lKCkpKSB7CisgICAgICByZXR1cm4gQnl0ZXNVdGlsLnRvQnl0ZXMoKChGbG9hdFdyaXRhYmxlKSBvYmopLmdldCgpKTsKKyAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5lcXVhbHMoRG91YmxlV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpKSkgeworICAgICAgcmV0dXJuIEJ5dGVzVXRpbC50b0J5dGVzKCgoRG91YmxlV3JpdGFibGUpIG9iaikuZ2V0KCkpOworICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lLmVxdWFscyhMb25nV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpKSkgeworICAgICAgcmV0dXJuIExvbmdzLnRvQnl0ZUFycmF5KCgoTG9uZ1dyaXRhYmxlKSBvYmopLmdldCgpKTsKKyAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5lcXVhbHMoVkludFdyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSkpIHsKKyAgICAgIHJldHVybiBJbnRzLnRvQnl0ZUFycmF5KCgoVkludFdyaXRhYmxlKSBvYmopLmdldCgpKTsKKyAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5lcXVhbHMoVkxvbmdXcml0YWJsZS5jbGFzcy5nZXROYW1lKCkpKSB7CisgICAgICByZXR1cm4gTG9uZ3MudG9CeXRlQXJyYXkoKChWTG9uZ1dyaXRhYmxlKSBvYmopLmdldCgpKTsKKyAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5lcXVhbHMoQm9vbGVhbldyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSkpIHsKKyAgICAgIHJldHVybiBCeXRlc1V0aWwudG9CeXRlcygoKEJvb2xlYW5Xcml0YWJsZSkgb2JqKS5nZXQoKSk7CisgICAgfSBlbHNlIGlmIChjbGFzc05hbWUuZXF1YWxzKFRleHQuY2xhc3MuZ2V0TmFtZSgpKSkgeworICAgICAgcmV0dXJuICgoVGV4dClvYmopLmNvcHlCeXRlcygpOworICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lLmVxdWFscyhCeXRlV3JpdGFibGUuY2xhc3MuZ2V0TmFtZSgpKSkgeworICAgICAgcmV0dXJuIEludHMudG9CeXRlQXJyYXkoKGludCkgKChCeXRlV3JpdGFibGUpIG9iaikuZ2V0KCkpOworICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lLmVxdWFscyhCeXRlc1dyaXRhYmxlLmNsYXNzLmdldE5hbWUoKSkpIHsKKyAgICAgIC8vIFRPRE86IGNvcHlCeXRlcyBpbnN0ZWFkPworICAgICAgcmV0dXJuICgoQnl0ZXNXcml0YWJsZSkgb2JqKS5nZXRCeXRlcygpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3Rlc3R1dGlsL0VuZm9yY2VOYXRpdmVPdXRwdXRDb2xsZWN0b3JEZWxlZ2F0b3IuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvRW5mb3JjZU5hdGl2ZU91dHB1dENvbGxlY3RvckRlbGVnYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTIyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3Rlc3R1dGlsL0VuZm9yY2VOYXRpdmVPdXRwdXRDb2xsZWN0b3JEZWxlZ2F0b3IuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2suTmF0aXZlTWFwT3V0cHV0Q29sbGVjdG9yRGVsZWdhdG9yOworCitwdWJsaWMgY2xhc3MgRW5mb3JjZU5hdGl2ZU91dHB1dENvbGxlY3RvckRlbGVnYXRvcjxLLCBWPgorICBleHRlbmRzIE5hdGl2ZU1hcE91dHB1dENvbGxlY3RvckRlbGVnYXRvcjxLLCBWPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhFbmZvcmNlTmF0aXZlT3V0cHV0Q29sbGVjdG9yRGVsZWdhdG9yLmNsYXNzKTsKKyAgcHJpdmF0ZSBib29sZWFuIG5hdGl2ZXRhc2tsb2FkZWQgPSBmYWxzZTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpCisgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgc3VwZXIuaW5pdChjb250ZXh0KTsKKyAgICAgIG5hdGl2ZXRhc2tsb2FkZWQgPSB0cnVlOworICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICBuYXRpdmV0YXNrbG9hZGVkID0gZmFsc2U7CisgICAgICBMT0cuZXJyb3IoImxvYWQgbmF0aXZldGFzayBsaWIgZmFpbGVkLCBOYXRpdmUtVGFzayBEZWxlZ2F0aW9uIGlzIGRpc2FibGVkIiwgZSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvbGxlY3QoSyBrZXksIFYgdmFsdWUsIGludCBwYXJ0aXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIGlmICh0aGlzLm5hdGl2ZXRhc2tsb2FkZWQpIHsKKyAgICAgIHN1cGVyLmNvbGxlY3Qoa2V5LCB2YWx1ZSwgcGFydGl0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvTW9ja1ZhbHVlQ2xhc3MuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvTW9ja1ZhbHVlQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDc2YTJkCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay90ZXN0dXRpbC9Nb2NrVmFsdWVDbGFzcy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbDsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Mb25nV3JpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5Xcml0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLkJ5dGVzVXRpbDsKKworcHVibGljIGNsYXNzIE1vY2tWYWx1ZUNsYXNzIGltcGxlbWVudHMgV3JpdGFibGUgeworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9BUlJBWV9MRU5HVEggPSAxNjsKKyAgcHJpdmF0ZSBpbnQgYSA9IDA7CisgIHByaXZhdGUgYnl0ZVtdIGFycmF5OworICBwcml2YXRlIGZpbmFsIExvbmdXcml0YWJsZSBsb25nV3JpdGFibGU7CisgIHByaXZhdGUgZmluYWwgVGV4dCB0eHQ7CisgIHByaXZhdGUgZmluYWwgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgcHVibGljIE1vY2tWYWx1ZUNsYXNzKCkgeworICAgIGEgPSByYW5kLm5leHRJbnQoKTsKKyAgICBhcnJheSA9IG5ldyBieXRlW0RFRkFVTFRfQVJSQVlfTEVOR1RIXTsKKyAgICByYW5kLm5leHRCeXRlcyhhcnJheSk7CisgICAgbG9uZ1dyaXRhYmxlID0gbmV3IExvbmdXcml0YWJsZShyYW5kLm5leHRMb25nKCkpOworICAgIHR4dCA9IG5ldyBUZXh0KEJ5dGVzVXRpbC50b1N0cmluZ0JpbmFyeShhcnJheSkpOworICB9CisKKyAgcHVibGljIE1vY2tWYWx1ZUNsYXNzKGJ5dGVbXSBzZWVkKSB7CisgICAgYSA9IHNlZWQubGVuZ3RoOworICAgIGFycmF5ID0gbmV3IGJ5dGVbc2VlZC5sZW5ndGhdOworICAgIFN5c3RlbS5hcnJheWNvcHkoc2VlZCwgMCwgYXJyYXksIDAsIHNlZWQubGVuZ3RoKTsKKyAgICBsb25nV3JpdGFibGUgPSBuZXcgTG9uZ1dyaXRhYmxlKGEpOworICAgIHR4dCA9IG5ldyBUZXh0KEJ5dGVzVXRpbC50b1N0cmluZ0JpbmFyeShhcnJheSkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0KGJ5dGVbXSBzZWVkKSB7CisgICAgYSA9IHNlZWQubGVuZ3RoOworICAgIGFycmF5ID0gbmV3IGJ5dGVbc2VlZC5sZW5ndGhdOworICAgIFN5c3RlbS5hcnJheWNvcHkoc2VlZCwgMCwgYXJyYXksIDAsIHNlZWQubGVuZ3RoKTsKKyAgICBsb25nV3JpdGFibGUuc2V0KGEpOworICAgIHR4dC5zZXQoQnl0ZXNVdGlsLnRvU3RyaW5nQmluYXJ5KGFycmF5KSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoRGF0YU91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgb3V0LndyaXRlSW50KGEpOworICAgIG91dC53cml0ZUludChhcnJheS5sZW5ndGgpOworICAgIG91dC53cml0ZShhcnJheSk7CisgICAgbG9uZ1dyaXRhYmxlLndyaXRlKG91dCk7CisgICAgdHh0LndyaXRlKG91dCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkcyhEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYSA9IGluLnJlYWRJbnQoKTsKKyAgICBmaW5hbCBpbnQgbGVuZ3RoID0gaW4ucmVhZEludCgpOworICAgIGFycmF5ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICBpbi5yZWFkRnVsbHkoYXJyYXkpOworICAgIGxvbmdXcml0YWJsZS5yZWFkRmllbGRzKGluKTsKKyAgICB0eHQucmVhZEZpZWxkcyhpbik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvUmVzdWx0VmVyaWZpZXIuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvUmVzdWx0VmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ5NjkxCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay90ZXN0dXRpbC9SZXN1bHRWZXJpZmllci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudGVzdHV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRlNEYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Db3VudGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSm9iOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQ291bnRlcjsKKworcHVibGljIGNsYXNzIFJlc3VsdFZlcmlmaWVyIHsKKyAgLyoqCisgICAqIHZlcmlmeSB0aGUgcmVzdWx0CisgICAqIAorICAgKiBAcGFyYW0gc2FtcGxlIHRoZSBwYXRoIHRvIGNvcnJlY3QgcmVzdWx0cworICAgKiBAcGFyYW0gc291cmNlIHRoZSBwYXRoIHRvIHRoZSByZXN1bHRzIGZyb20gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmlmeShTdHJpbmcgc2FtcGxlLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGU0RhdGFJbnB1dFN0cmVhbSBzb3VyY2VpbiA9IG51bGw7CisgICAgRlNEYXRhSW5wdXRTdHJlYW0gc2FtcGxlaW4gPSBudWxsOworCisgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICBmaW5hbCBGaWxlU3lzdGVtIGZzID0gRmlsZVN5c3RlbS5nZXQoY29uZik7CisgICAgZmluYWwgUGF0aCBoZGZzc291cmNlID0gbmV3IFBhdGgoc291cmNlKTsKKyAgICBmaW5hbCBQYXRoW10gc291cmNlcGF0aHMgPSBGaWxlVXRpbC5zdGF0MlBhdGhzKGZzLmxpc3RTdGF0dXMoaGRmc3NvdXJjZSkpOworCisgICAgZmluYWwgUGF0aCBoZGZzc2FtcGxlID0gbmV3IFBhdGgoc2FtcGxlKTsKKyAgICBmaW5hbCBQYXRoW10gc2FtcGxlcGF0aHMgPSBGaWxlVXRpbC5zdGF0MlBhdGhzKGZzLmxpc3RTdGF0dXMoaGRmc3NhbXBsZSkpOworICAgIGlmIChzb3VyY2VwYXRocyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJzb3VyY2UgZmlsZSBjYW4gbm90IGJlIGZvdW5kIik7CisgICAgfQorICAgIGlmIChzYW1wbGVwYXRocyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJzYW1wbGUgZmlsZSBjYW4gbm90IGJlIGZvdW5kIik7CisgICAgfQorICAgIGlmIChzb3VyY2VwYXRocy5sZW5ndGggIT0gc2FtcGxlcGF0aHMubGVuZ3RoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlcGF0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGZpbmFsIFBhdGggc291cmNlcGF0aCA9IHNvdXJjZXBhdGhzW2ldOworICAgICAgLy8gb3AgcmVzdWx0IGZpbGUgc3RhcnQgd2l0aCAicGFydC1yIiBsaWtlIHBhcnQtci0wMDAwMAorCisgICAgICBpZiAoIXNvdXJjZXBhdGguZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInBhcnQtciIpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgUGF0aCBzYW1wbGVwYXRoID0gbnVsbDsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2FtcGxlcGF0aHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgaWYgKHNhbXBsZXBhdGhzW2ldLmdldE5hbWUoKS5lcXVhbHMoc291cmNlcGF0aC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgc2FtcGxlcGF0aCA9IHNhbXBsZXBhdGhzW2ldOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc2FtcGxlcGF0aCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImNvdW5kIG5vdCBmaW5kIGZpbGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcGF0aHNbMF0uZ2V0UGFyZW50KCkgKyAiLyIgKyBzb3VyY2VwYXRoLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAsIGFzIHNvdXJjZXBhdGhzIGhhcyBzdWNoIGZpbGUiKTsKKyAgICAgIH0KKworICAgICAgLy8gY29tcGFyZQorICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGZzLmV4aXN0cyhzb3VyY2VwYXRoKSAmJiBmcy5leGlzdHMoc2FtcGxlcGF0aCkpIHsKKyAgICAgICAgICBzb3VyY2VpbiA9IGZzLm9wZW4oc291cmNlcGF0aCk7CisgICAgICAgICAgc2FtcGxlaW4gPSBmcy5vcGVuKHNhbXBsZXBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmVzdWx0IGZpbGUgbm90IGZvdW5kOiIgKyBzb3VyY2VwYXRoICsgIiBvciAiICsgc2FtcGxlcGF0aCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ1JDMzIgc291cmNlY3JjLCBzYW1wbGVjcmM7CisgICAgICAgIHNhbXBsZWNyYyA9IG5ldyBDUkMzMigpOworICAgICAgICBzb3VyY2VjcmMgPSBuZXcgQ1JDMzIoKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmluID0gbmV3IGJ5dGVbMSA8PCAxNl07CisgICAgICAgIGludCByZWFkbnVtID0gMDsKKyAgICAgICAgaW50IHRvdGFsUmVhZCA9IDA7CisgICAgICAgIHdoaWxlIChzYW1wbGVpbi5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICByZWFkbnVtID0gc2FtcGxlaW4ucmVhZChidWZpbik7CisgICAgICAgICAgdG90YWxSZWFkICs9IHJlYWRudW07CisgICAgICAgICAgc2FtcGxlY3JjLnVwZGF0ZShidWZpbiwgMCwgcmVhZG51bSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCA9PSB0b3RhbFJlYWQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJzb3VyY2UgIiArIHNhbXBsZSArICIgaXMgZW1wdHkgZmlsZSIpOworICAgICAgICB9CisKKyAgICAgICAgdG90YWxSZWFkID0gMDsKKyAgICAgICAgd2hpbGUgKHNvdXJjZWluLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgIHJlYWRudW0gPSBzb3VyY2Vpbi5yZWFkKGJ1ZmluKTsKKyAgICAgICAgICB0b3RhbFJlYWQgKz0gcmVhZG51bTsKKyAgICAgICAgICBzb3VyY2VjcmMudXBkYXRlKGJ1ZmluLCAwLCByZWFkbnVtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA9PSB0b3RhbFJlYWQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJzb3VyY2UgIiArIHNhbXBsZSArICIgaXMgZW1wdHkgZmlsZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhbXBsZWNyYy5nZXRWYWx1ZSgpID09IHNvdXJjZWNyYy5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ2ZXJpZnkgZXhjZXB0aW9uIDoiLCBlKTsKKyAgICAgIH0gZmluYWxseSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoc2FtcGxlaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgc2FtcGxlaW4uY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvdXJjZWluICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZWluLmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUNvdW50ZXJzKEpvYiBub3JtYWxKb2IsIEpvYiBuYXRpdmVKb2IsIGJvb2xlYW4gaGFzQ29tYmluZXIpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIENvdW50ZXJzIG5vcm1hbENvdW50ZXJzID0gbm9ybWFsSm9iLmdldENvdW50ZXJzKCk7CisgICAgQ291bnRlcnMgbmF0aXZlQ291bnRlcnMgPSBuYXRpdmVKb2IuZ2V0Q291bnRlcnMoKTsKKyAgICBhc3NlcnRFcXVhbHMoIkNvdW50ZXIgTUFQX09VVFBVVF9SRUNPUkRTIHNob3VsZCBiZSBlcXVhbCIsCisgICAgICAgIG5vcm1hbENvdW50ZXJzLmZpbmRDb3VudGVyKFRhc2tDb3VudGVyLk1BUF9PVVRQVVRfUkVDT1JEUykuZ2V0VmFsdWUoKSwKKyAgICAgICAgbmF0aXZlQ291bnRlcnMuZmluZENvdW50ZXIoVGFza0NvdW50ZXIuTUFQX09VVFBVVF9SRUNPUkRTKS5nZXRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkNvdW50ZXIgUkVEVUNFX0lOUFVUX0dST1VQUyBzaG91bGQgYmUgZXF1YWwiLAorICAgICAgICBub3JtYWxDb3VudGVycy5maW5kQ291bnRlcihUYXNrQ291bnRlci5SRURVQ0VfSU5QVVRfR1JPVVBTKS5nZXRWYWx1ZSgpLAorICAgICAgICBuYXRpdmVDb3VudGVycy5maW5kQ291bnRlcihUYXNrQ291bnRlci5SRURVQ0VfSU5QVVRfR1JPVVBTKS5nZXRWYWx1ZSgpKTsKKyAgICBpZiAoIWhhc0NvbWJpbmVyKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIkNvdW50ZXIgUkVEVUNFX0lOUFVUX1JFQ09SRFMgc2hvdWxkIGJlIGVxdWFsIiwKKyAgICAgICAgICBub3JtYWxDb3VudGVycy5maW5kQ291bnRlcihUYXNrQ291bnRlci5SRURVQ0VfSU5QVVRfUkVDT1JEUykuZ2V0VmFsdWUoKSwKKyAgICAgICAgICBuYXRpdmVDb3VudGVycy5maW5kQ291bnRlcihUYXNrQ291bnRlci5SRURVQ0VfSU5QVVRfUkVDT1JEUykuZ2V0VmFsdWUoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUNvdW50ZXJzKEpvYiBub3JtYWxKb2IsIEpvYiBuYXRpdmVKb2IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdmVyaWZ5Q291bnRlcnMobm9ybWFsSm9iLCBuYXRpdmVKb2IsIGZhbHNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay90ZXN0dXRpbC9TY2VuYXJpb0NvbmZpZ3VyYXRpb24uamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvU2NlbmFyaW9Db25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjNDczZAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvU2NlbmFyaW9Db25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgU2NlbmFyaW9Db25maWd1cmF0aW9uIGV4dGVuZHMgQ29uZmlndXJhdGlvbiB7CisgIHB1YmxpYyBTY2VuYXJpb0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLmFkZFJlc291cmNlKFRlc3RDb25zdGFudHMuQ09NTU9OX0NPTkZfUEFUSCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRjb21iaW5lckNvbmYoKSB7CisgICAgdGhpcy5hZGRSZXNvdXJjZShUZXN0Q29uc3RhbnRzLkNPTUJJTkVSX0NPTkZfUEFUSCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRLVlRlc3RDb25mKCkgeworICAgIHRoaXMuYWRkUmVzb3VyY2UoVGVzdENvbnN0YW50cy5LVlRFU1RfQ09ORl9QQVRIKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgYWRkTm9uU29ydFRlc3RDb25mKCkgeworICAgIHRoaXMuYWRkUmVzb3VyY2UoVGVzdENvbnN0YW50cy5OT05TT1JUX1RFU1RfQ09ORik7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGROYXRpdmVDb25mKCkgeworICAgIHRoaXMuc2V0KFRlc3RDb25zdGFudHMuTkFUSVZFVEFTS19DT0xMRUNUT1JfREVMRUdBVE9SLAorICAgICAgICBUZXN0Q29uc3RhbnRzLk5BVElWRVRBU0tfQ09MTEVDVE9SX0RFTEVHQVRPUl9DTEFTUyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb24gZ2V0Tm9ybWFsQ29uZmlndXJhdGlvbigpIHsKKyAgICBDb25maWd1cmF0aW9uIG5vcm1hbENvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgIG5vcm1hbENvbmYuYWRkUmVzb3VyY2UoImNvbW1vbl9jb25mLnhtbCIpOworICAgIG5vcm1hbENvbmYuYWRkUmVzb3VyY2UoIm5vcm1hbF9jb25mLnhtbCIpOworICAgIHJldHVybiBub3JtYWxDb25mOworICB9CisKKyAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uIGdldE5hdGl2ZUNvbmZpZ3VyYXRpb24oKSB7CisgICAgQ29uZmlndXJhdGlvbiBuYXRpdmVDb25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICBuYXRpdmVDb25mLmFkZFJlc291cmNlKCJjb21tb25fY29uZi54bWwiKTsKKyAgICBuYXRpdmVDb25mLmFkZFJlc291cmNlKCJuYXRpdmVfY29uZi54bWwiKTsKKyAgICByZXR1cm4gbmF0aXZlQ29uZjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay90ZXN0dXRpbC9UZXN0Q29uc3RhbnRzLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3Rlc3R1dGlsL1Rlc3RDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVhMTE3Ci0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay90ZXN0dXRpbC9UZXN0Q29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsOworCitwdWJsaWMgY2xhc3MgVGVzdENvbnN0YW50cyB7CisgIC8vIGNvbmYgcGF0aAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fQ09ORl9QQVRIID0gImNvbW1vbl9jb25mLnhtbCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJJTkVSX0NPTkZfUEFUSCA9ICJ0ZXN0LWNvbWJpbmVyLWNvbmYueG1sIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1ZURVNUX0NPTkZfUEFUSCA9ICJrdnRlc3QtY29uZi54bWwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05TT1JUX1RFU1RfQ09ORiA9ICJ0ZXN0LW5vbnNvcnQtY29uZi54bWwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19URVNUX0NPTkZfUEFUSCA9ICJ0ZXN0LWNvbXByZXNzLWNvbmYueG1sIjsKKworICAvLyBjb21tb24gY29uc3RhbnRzCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfVEVTVF9ESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QuYnVpbGQuZGF0YSIsICJ0YXJnZXQvdGVzdC9kYXRhIik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfQ09MTEVDVE9SX0RFTEVHQVRPUiA9ICJtYXByZWR1Y2UubWFwLm91dHB1dC5jb2xsZWN0b3IuZGVsZWdhdG9yLmNsYXNzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19DT0xMRUNUT1JfREVMRUdBVE9SX0NMQVNTID0gIm9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLkVuZm9yY2VOYXRpdmVPdXRwdXRDb2xsZWN0b3JEZWxlZ2F0b3IiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0tWU0laRV9NSU4gPSAibmF0aXZldGFzay5rdnNpemUubWluIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19LVlNJWkVfTUFYID0gIm5hdGl2ZXRhc2sua3ZzaXplLm1heCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfS1ZTSVpFX01BWF9MQVJHRUtWX1RFU1QgPSAibmF0aXZldGFzay5rdnNpemUubWF4Lmxhcmdla3YiOworCisgIC8vIGt2IHRlc3QKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRVNJWkVfS0VZID0gImt2dGVzdC5maWxlLnNpemUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0tWVEVTVF9ESVIgPSBOQVRJVkVUQVNLX1RFU1RfRElSICsgIi9rdnRlc3QiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0tWVEVTVF9JTlBVVERJUiA9IE5BVElWRVRBU0tfS1ZURVNUX0RJUiArICIvaW5wdXQiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0tWVEVTVF9OQVRJVkVfT1VUUFVURElSID0gTkFUSVZFVEFTS19LVlRFU1RfRElSICsgIi9vdXRwdXQvbmF0aXZlIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19LVlRFU1RfTk9STUFMX09VVFBVVERJUiA9IE5BVElWRVRBU0tfS1ZURVNUX0RJUiArICIvb3V0cHV0L25vcm1hbCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfS1ZURVNUX0NSRUFURUZJTEUgPSAibmF0aXZldGFzay5rdnRlc3QuY3JlYXRlZmlsZSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfS1ZURVNUX0ZJTEVfUkVDT1JETlVNID0gIm5hdGl2ZXRhc2sua3Z0ZXN0LmZpbGUucmVjb3JkbnVtIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19LVlRFU1RfS0VZQ0xBU1NFUyA9ICJuYXRpdmV0YXNrLmt2dGVzdC5rZXljbGFzc2VzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19LVlRFU1RfVkFMVUVDTEFTU0VTID0gIm5hdGl2ZXRhc2sua3Z0ZXN0LnZhbHVlY2xhc3NlcyI7CisKKyAgLy8gY29tcHJlc3MgdGVzdAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0NPTVBSRVNTX0ZJTEVTSVpFID0gIm5hdGl2ZXRhc2suY29tcHJlc3MuZmlsZXNpemUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfRElSID0gTkFUSVZFVEFTS19URVNUX0RJUiArICIvY29tcHJlc3N0ZXN0IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19DT01QUkVTU19URVNUX0lOUFVURElSID0gTkFUSVZFVEFTS19DT01QUkVTU19URVNUX0RJUiArICIvaW5wdXQiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfTkFUSVZFX09VVFBVVERJUiA9IE5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9ESVIgKyAiL291dHB1dC9uYXRpdmUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX0NPTVBSRVNTX1RFU1RfTk9STUFMX09VVFBVVERJUiA9IE5BVElWRVRBU0tfQ09NUFJFU1NfVEVTVF9ESVIgKyAiL291dHB1dC9ub3JtYWwiOworCisgIC8vIGNvbWJpbmVyIHRlc3QKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19DT01CSU5FUl9URVNUX0RJUiA9IE5BVElWRVRBU0tfVEVTVF9ESVIgKyAiL2NvbWJpbmVydGVzdCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9JTlBVVERJUiA9IE5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9ESVIgKyAiL2lucHV0IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19DT01CSU5FUl9URVNUX05BVElWRV9PVVRQVVRESVIgPSBOQVRJVkVUQVNLX0NPTUJJTkVSX1RFU1RfRElSICsgIi9vdXRwdXQvbmF0aXZlIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19DT01CSU5FUl9URVNUX05PUk1BTF9PVVRQVVRESVIgPSBOQVRJVkVUQVNLX0NPTUJJTkVSX1RFU1RfRElSICsgIi9vdXRwdXQvbm9ybWFsIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19PTERBUElfQ09NQklORVJfVEVTVF9OQVRJVkVfT1VUUFVUUEFUSCA9IE5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9ESVIgKyAiL29sZGFwaS9vdXRwdXQvbmF0aXZlIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19PTERBUElfQ09NQklORVJfVEVTVF9OT1JNQUxfT1VUUFVUUEFUSCA9IE5BVElWRVRBU0tfQ09NQklORVJfVEVTVF9ESVIgKyAiL29sZGFwaS9vdXRwdXQvbm9ybWFsIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFVEFTS19DT01CSU5FUl9XT1JEQ09VTlRfRklMRVNJWkUgPSAibmF0aXZldGFzay5jb21iaW5lci53b3JkY291bnQuZmlsZXNpemUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX05PTlNPUlRURVNUX0ZJTEVTSVpFID0gIm5hdGl2ZXRhc2subm9uc29ydHRlc3QuZmlsZXNpemUiOworCisgIC8vIG5vbnNvcnQgdGVzdAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX01BUF9PVVRQVVRfU09SVCA9ICJtYXByZWR1Y2Uuc29ydC5hdm9pZGFuY2UiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX05PTlNPUlRfVEVTVF9ESVIgPSBOQVRJVkVUQVNLX1RFU1RfRElSICsgIi9ub25zb3J0dGVzdCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfTk9OU09SVF9URVNUX0lOUFVURElSID0gTkFUSVZFVEFTS19OT05TT1JUX1RFU1RfRElSICsgIi9pbnB1dCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRVRBU0tfTk9OU09SVF9URVNUX05BVElWRV9PVVRQVVQgPSBOQVRJVkVUQVNLX05PTlNPUlRfVEVTVF9ESVIgKyAiL291dHB1dC9uYXRpdmUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVUQVNLX05PTlNPUlRfVEVTVF9OT1JNQUxfT1VUUFVUID0gTkFUSVZFVEFTS19OT05TT1JUX1RFU1RfRElSICsgIi9vdXRwdXQvbm9ybWFsIjsKKworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay90ZXN0dXRpbC9UZXN0SW5wdXQuamF2YSBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvVGVzdElucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmYjFlZgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdGVzdHV0aWwvVGVzdElucHV0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVzV3JpdGFibGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKK3B1YmxpYyBjbGFzcyBUZXN0SW5wdXQgeworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS1Y8SywgVj4geworICAgIHB1YmxpYyBLIGtleTsKKyAgICBwdWJsaWMgViB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2hhcltdIENIQVJfU0VUID0gbmV3IGNoYXJbXSB7CisgICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsCisgICAgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsCisgICAgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsCisgICAgJ3onLCAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcqJywgJy8nIH07CisKKyAgcHVibGljIHN0YXRpYyBLVltdIGdldE1hcElucHV0cyhpbnQgc2l6ZSkgeworCisgICAgZmluYWwgS1ZbXSBkYXRhSW5wdXQgPSBuZXcgS1Zbc2l6ZV07CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgZGF0YUlucHV0W2ldID0gZ2V0U2luZ2xlTWFwSW5wdXQoaSk7CisgICAgfQorICAgIHJldHVybiBkYXRhSW5wdXQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBLViBnZXRTaW5nbGVNYXBJbnB1dChpbnQgaSkgeworICAgIGZpbmFsIGNoYXIgY2hhcmFjdGVyID0gQ0hBUl9TRVRbaSAlIENIQVJfU0VULmxlbmd0aF07CisgICAgZmluYWwgYnl0ZSBiID0gKGJ5dGUpIGNoYXJhY3RlcjsKKworICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2ldOworICAgIEFycmF5cy5maWxsKGJ5dGVzLCBiKTsKKyAgICBmaW5hbCBCeXRlc1dyaXRhYmxlIHJlc3VsdCA9IG5ldyBCeXRlc1dyaXRhYmxlKGJ5dGVzKTsKKyAgICBmaW5hbCBLViBrdiA9IG5ldyBLVigpOworICAgIGt2LmtleSA9IHJlc3VsdDsKKyAgICBrdi52YWx1ZSA9IHJlc3VsdDsKKyAgICByZXR1cm4ga3Y7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlscy9UZXN0Qnl0ZXNVdGlsLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWxzL1Rlc3RCeXRlc1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFmYTQzCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlscy9UZXN0Qnl0ZXNVdGlsLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWxzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5CeXRlc1V0aWw7CisKK3B1YmxpYyBjbGFzcyBUZXN0Qnl0ZXNVdGlsIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXNJbnRDb252ZXJzaW9uKCkgeworICAgIGZpbmFsIGludCBhID0gMTAwMDsKKyAgICBmaW5hbCBieXRlW10gaW50Qnl0ZXMgPSBJbnRzLnRvQnl0ZUFycmF5KGEpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBCeXRlc1V0aWwudG9JbnQoaW50Qnl0ZXMsIDApKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc0xvbmdDb252ZXJzaW9uKCkgeworICAgIGZpbmFsIGxvbmcgbCA9IDEwMDAwMDBMOworICAgIGZpbmFsIGJ5dGVbXSBsb25nQnl0ZXMgPSBMb25ncy50b0J5dGVBcnJheShsKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobCwgQnl0ZXNVdGlsLnRvTG9uZyhsb25nQnl0ZXMsIDApKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc0Zsb2F0Q29udmVyc2lvbigpIHsKKyAgICBmaW5hbCBmbG9hdCBmID0gMy4xNGY7CisgICAgZmluYWwgYnl0ZVtdIGZsb2F0Qnl0ZXMgPSBCeXRlc1V0aWwudG9CeXRlcyhmKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZiwgQnl0ZXNVdGlsLnRvRmxvYXQoZmxvYXRCeXRlcyksIDAuMGYpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVzRG91YmxlQ29udmVyc2lvbigpIHsKKyAgICBmaW5hbCBkb3VibGUgZCA9IDMuMTQ7CisgICAgZmluYWwgYnl0ZVtdIGRvdWJsZUJ5dGVzID0gQnl0ZXNVdGlsLnRvQnl0ZXMoZCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGQsIEJ5dGVzVXRpbC50b0RvdWJsZShkb3VibGVCeXRlcyksIDAuMCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdCaW5hcnkoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiXFx4MDFcXHgwMkFCQyIsCisgICAgICAgIEJ5dGVzVXRpbC50b1N0cmluZ0JpbmFyeShuZXcgYnl0ZVtdIHsgMSwgMiwgNjUsIDY2LCA2NyB9KSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiXFx4MTBcXHgxMSIsCisgICAgICAgIEJ5dGVzVXRpbC50b1N0cmluZ0JpbmFyeShuZXcgYnl0ZVtdIHsgMTYsIDE3IH0pKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlscy9UZXN0UmVhZFdyaXRlQnVmZmVyLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWxzL1Rlc3RSZWFkV3JpdGVCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE4MDkyCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2hhZG9vcC9tYXByZWQvbmF0aXZldGFzay91dGlscy9UZXN0UmVhZFdyaXRlQnVmZmVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWxzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbC5SZWFkV3JpdGVCdWZmZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKKworcHVibGljIGNsYXNzIFRlc3RSZWFkV3JpdGVCdWZmZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXSB7ICcwJywgJ2EnLCAnYicsICdjJywgJ2QnLCAnOScgfTsKKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlQnVmZmVyKCkgeworCisgICAgZmluYWwgUmVhZFdyaXRlQnVmZmVyIGJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCdWZmZXIoKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShidWZmZXIuZ2V0QnVmZigpID09IG51bGwpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhidWZmZXIuZ2V0V3JpdGVQb2ludCgpLCAwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGJ1ZmZlci5nZXRSZWFkUG9pbnQoKSwgMCk7CisKKyAgICBidWZmZXIud3JpdGVJbnQoMyk7CisKKyAgICBidWZmZXIud3JpdGVTdHJpbmcoImdvb2Rib3kiKTsKKworICAgIGJ1ZmZlci53cml0ZUxvbmcoMTBMKTsKKyAgICBidWZmZXIud3JpdGVCeXRlcyhieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICBidWZmZXIud3JpdGVMb25nKDEwMEwpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhidWZmZXIuZ2V0V3JpdGVQb2ludCgpLCA0MSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhidWZmZXIuZ2V0UmVhZFBvaW50KCksIDApOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGJ1ZmZlci5nZXRCdWZmKCkubGVuZ3RoID49IDQxKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYnVmZmVyLnJlYWRJbnQoKSwgMyk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhidWZmZXIucmVhZFN0cmluZygpLCAiZ29vZGJveSIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYnVmZmVyLnJlYWRMb25nKCksIDEwTCk7CisKKyAgICBmaW5hbCBieXRlW10gcmVhZCA9IGJ1ZmZlci5yZWFkQnl0ZXMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGJ5dGVzW2ldLCByZWFkW2ldKTsKKyAgICB9CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMEwsIGJ1ZmZlci5yZWFkTG9uZygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxLCBidWZmZXIuZ2V0UmVhZFBvaW50KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWxzL1Rlc3RTaXplZFdyaXRhYmxlLmphdmEgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvaGFkb29wL21hcHJlZC9uYXRpdmV0YXNrL3V0aWxzL1Rlc3RTaXplZFdyaXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4MmVmZgotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9oYWRvb3AvbWFwcmVkL25hdGl2ZXRhc2svdXRpbHMvVGVzdFNpemVkV3JpdGFibGUuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sudXRpbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnV0aWwuU2l6ZWRXcml0YWJsZTsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCitwdWJsaWMgY2xhc3MgVGVzdFNpemVkV3JpdGFibGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdFNpemVkV3JpdGFibGUoKSB7CisgICAgZmluYWwgU2l6ZWRXcml0YWJsZSB3ID0gbmV3IFNpemVkV3JpdGFibGUoQnl0ZXNXcml0YWJsZS5jbGFzcyk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUody5sZW5ndGggPT0gU2l6ZWRXcml0YWJsZS5JTlZBTElEX0xFTkdUSCk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHcudiA9PSBudWxsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbW1vbl9jb25mLnhtbCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy9jb21tb25fY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1NzRkNQotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy9jb21tb25fY29uZi54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSJjb25maWd1cmF0aW9uLnhzbCI/PgorCis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb25maWd1cmF0aW9uPgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+bWFwcmVkLmpvYi50cmFja2VyPC9uYW1lPgorICAgIDx2YWx1ZT5sb2NhbDwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5rZWVwLmZhaWxlZC50YXNrLmZpbGVzPC9uYW1lPgorICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPmtlZXAudGFzay5maWxlcy5wYXR0ZXJuPC9uYW1lPgorICAgIDx2YWx1ZT4uKl9tXzwvdmFsdWU+CisgICAgPGRlc2NyaXB0aW9uPktlZXAgYWxsIGZpbGVzIGZyb20gdGFza3Mgd2hvc2UgdGFzayBuYW1lcyBtYXRjaCB0aGUgZ2l2ZW4KKyAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbi4gRGVmYXVsdHMgdG8gbm9uZS48L2Rlc2NyaXB0aW9uPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+bmF0aXZldGFzay5rdnNpemUubWF4Lmxhcmdla3Y8L25hbWU+CisgICAgPHZhbHVlPjEwNDg1NzY8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+bmF0aXZlLnByb2Nlc3Nvci5idWZmZXIua2I8L25hbWU+CisgICAgPHZhbHVlPjEyODwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5uYXRpdmV0YXNrLm91dHB1dC5tYW5hZ2VyPC9uYW1lPgorICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay51dGlsLkxvY2FsSm9iT3V0cHV0RmlsZXM8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvcmVzb3VyY2VzL2t2dGVzdC1jb25mLnhtbCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy9rdnRlc3QtY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2MjZkMwotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy9rdnRlc3QtY29uZi54bWwKQEAgLTAsMCArMSw4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSJjb25maWd1cmF0aW9uLnhzbCI/PgorCis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb25maWd1cmF0aW9uPgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+a3Z0ZXN0LmZpbGUuc2l6ZTwvbmFtZT4KKyAgICA8dmFsdWU+MTA0ODU3NjA8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+bWFwcmVkdWNlLnJlZHVjZS5jbGFzczwvbmFtZT4KKyAgICA8dmFsdWU+b3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sua3Z0ZXN0Lkhhc2hTdW1SZWR1Y2VyPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPm1hcHJlZC5vdXRwdXQudmFsdWUuY2xhc3M8L25hbWU+CisgICAgPHZhbHVlPm9yZy5hcGFjaGUuaGFkb29wLmlvLkludFdyaXRhYmxlPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPm5hdGl2ZXRhc2sua3Z0ZXN0LmtleWNsYXNzZXM8L25hbWU+CisgICAgPHZhbHVlPgorICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZXNXcml0YWJsZTsKKyAgICAgIG9yZy5hcGFjaGUuaGFkb29wLmlvLkJvb2xlYW5Xcml0YWJsZTsKKyAgICAgIG9yZy5hcGFjaGUuaGFkb29wLmlvLkJ5dGVXcml0YWJsZTsKKyAgICAgIG9yZy5hcGFjaGUuaGFkb29wLmlvLkRvdWJsZVdyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uRmxvYXRXcml0YWJsZTsKKyAgICAgIG9yZy5hcGFjaGUuaGFkb29wLmlvLkludFdyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uTG9uZ1dyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVGV4dDsKKyAgICAgIG9yZy5hcGFjaGUuaGFkb29wLmlvLlZJbnRXcml0YWJsZTsKKyAgICAgIG9yZy5hcGFjaGUuaGFkb29wLmlvLlZMb25nV3JpdGFibGU7CisgICAgPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPm5hdGl2ZXRhc2sua3Z0ZXN0LnZhbHVlY2xhc3NlczwvbmFtZT4KKyAgICA8dmFsdWU+CisgICAgICBvcmcuYXBhY2hlLmhhZG9vcC5pby5CeXRlc1dyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQm9vbGVhbldyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uQnl0ZVdyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uRG91YmxlV3JpdGFibGU7CisgICAgICBvcmcuYXBhY2hlLmhhZG9vcC5pby5GbG9hdFdyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uSW50V3JpdGFibGU7CisgICAgICBvcmcuYXBhY2hlLmhhZG9vcC5pby5Mb25nV3JpdGFibGU7CisgICAgICBvcmcuYXBhY2hlLmhhZG9vcC5pby5UZXh0OworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVkludFdyaXRhYmxlOworICAgICAgb3JnLmFwYWNoZS5oYWRvb3AuaW8uVkxvbmdXcml0YWJsZTsKKyAgICAgIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5uYXRpdmV0YXNrLnRlc3R1dGlsLk1vY2tWYWx1ZUNsYXNzOworICAgIDwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5tYXByZWQub3V0cHV0LmNvbXByZXNzPC9uYW1lPgorICAgIDx2YWx1ZT5mYWxzZTwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5tYXByZWQub3V0cHV0LmNvbXByZXNzaW9uLnR5cGU8L25hbWU+CisgICAgPHZhbHVlPkJMT0NLPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPm1hcHJlZC5jb21wcmVzcy5tYXAub3V0cHV0PC9uYW1lPgorICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPm1hcHJlZC5tYXAub3V0cHV0LmNvbXByZXNzaW9uLmNvZGVjPC9uYW1lPgorICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmhhZG9vcC5pby5jb21wcmVzcy5TbmFwcHlDb2RlYzwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5oYWRvb3AubmF0aXZlLmxpYjwvbmFtZT4KKyAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgIDwvcHJvcGVydHk+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWI2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgbG9nNGogY29uZmlndXJhdGlvbiB1c2VkIGR1cmluZyBidWlsZCBhbmQgdW5pdCB0ZXN0cworCitsb2c0ai5yb290TG9nZ2VyPWluZm8sc3Rkb3V0Citsb2c0ai50aHJlc2hob2xkPUFMTAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWN7Mn0gKCVGOiVNKCVMKSkgLSAlbSVuCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvbmF0aXZlX2NvbmYueG1sIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvcmVzb3VyY2VzL25hdGl2ZV9jb25mLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDBkMDFmCi0tLSAvZGV2L251bGwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvcmVzb3VyY2VzL25hdGl2ZV9jb25mLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9ImNvbmZpZ3VyYXRpb24ueHNsIj8+CisKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbmZpZ3VyYXRpb24+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5tYXByZWR1Y2Uuam9iLm1hcC5vdXRwdXQuY29sbGVjdG9yLmNsYXNzPC9uYW1lPgorICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQubmF0aXZldGFzay50ZXN0dXRpbC5FbmZvcmNlTmF0aXZlT3V0cHV0Q29sbGVjdG9yRGVsZWdhdG9yPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPmlvLnNvcnQubWI8L25hbWU+CisgICAgPHZhbHVlPjU8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYWxfY29uZi54bWwgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWFsX2NvbmYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmRkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWFsX2NvbmYueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCIgaHJlZj0iY29uZmlndXJhdGlvbi54c2wiPz4KKworPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29uZmlndXJhdGlvbj4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPmlvLnNvcnQubWI8L25hbWU+CisgICAgPHZhbHVlPjMwPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1jb21iaW5lci1jb25mLnhtbCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWNvbWJpbmVyLWNvbmYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOWVlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1jb21iaW5lci1jb25mLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9ImNvbmZpZ3VyYXRpb24ueHNsIj8+CisKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbmZpZ3VyYXRpb24+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5uYXRpdmV0YXNrLmNvbWJpbmVyLndvcmRjb3VudC5maWxlc2l6ZTwvbmFtZT4KKyAgICA8dmFsdWU+MjA5NzE1MjA8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+bWFwcmVkLmpvYi50cmFja2VyPC9uYW1lPgorICAgIDx2YWx1ZT5sb2NhbDwvdmFsdWU+CisgIDwvcHJvcGVydHk+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1jb21wcmVzcy1jb25mLnhtbCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LWNvbXByZXNzLWNvbmYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDZjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC1jb21wcmVzcy1jb25mLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9ImNvbmZpZ3VyYXRpb24ueHNsIj8+CisKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbmZpZ3VyYXRpb24+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5tYXByZWQub3V0cHV0LmNvbXByZXNzPC9uYW1lPgorICAgIDx2YWx1ZT5mYWxzZTwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5tYXByZWQub3V0cHV0LnZhbHVlLmNsYXNzPC9uYW1lPgorICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmhhZG9vcC5pby5JbnRXcml0YWJsZTwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5uYXRpdmV0YXNrLmNvbXByZXNzLmZpbGVzaXplPC9uYW1lPgorICAgIDx2YWx1ZT4xMDAwMDA8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+bWFwcmVkdWNlLnJlZHVjZS5jbGFzczwvbmFtZT4KKyAgICA8dmFsdWU+b3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLm5hdGl2ZXRhc2sua3Z0ZXN0Lkhhc2hTdW1SZWR1Y2VyPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPm1hcHJlZC5jb21wcmVzcy5tYXAub3V0cHV0PC9uYW1lPgorICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5PgorICAgIDxuYW1lPm1hcHJlZC5vdXRwdXQuY29tcHJlc3Npb24udHlwZTwvbmFtZT4KKyAgICA8dmFsdWU+QkxPQ0s8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+aGFkb29wLm5hdGl2ZS5saWI8L25hbWU+CisgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgorICA8L3Byb3BlcnR5PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50LW5hdGl2ZXRhc2svc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Qtbm9uc29ydC1jb25mLnhtbCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LW5vbnNvcnQtY29uZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1uYXRpdmV0YXNrL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LW5vbnNvcnQtY29uZi54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSJjb25maWd1cmF0aW9uLnhzbCI/PgorCis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb25maWd1cmF0aW9uPgorICA8cHJvcGVydHk+CisgICAgPG5hbWU+bmF0aXZldGFzay5ub25zb3J0dGVzdC5maWxlc2l6ZTwvbmFtZT4KKyAgICA8dmFsdWU+NDE5NDMwNDwvdmFsdWU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eT4KKyAgICA8bmFtZT5tYXByZWQuam9iLnRyYWNrZXI8L25hbWU+CisgICAgPHZhbHVlPmxvY2FsPC92YWx1ZT4KKyAgPC9wcm9wZXJ0eT4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC9wb20ueG1sIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L3BvbS54bWwKaW5kZXggNzJiOWNkNC4uNWExNjgyMCAxMDA2NDQKLS0tIGEvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L3BvbS54bWwKKysrIGIvaGFkb29wLW1hcHJlZHVjZS1wcm9qZWN0L2hhZG9vcC1tYXByZWR1Y2UtY2xpZW50L3BvbS54bWwKQEAgLTE4Nyw1ICsxODcsNiBAQAogICAgIDxtb2R1bGU+aGFkb29wLW1hcHJlZHVjZS1jbGllbnQtam9iY2xpZW50PC9tb2R1bGU+CiAgICAgPG1vZHVsZT5oYWRvb3AtbWFwcmVkdWNlLWNsaWVudC1oczwvbW9kdWxlPgogICAgIDxtb2R1bGU+aGFkb29wLW1hcHJlZHVjZS1jbGllbnQtaHMtcGx1Z2luczwvbW9kdWxlPgorICAgIDxtb2R1bGU+aGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzazwvbW9kdWxlPgogICA8L21vZHVsZXM+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9oYWRvb3AtbWFwcmVkdWNlLXByb2plY3QvcG9tLnhtbCBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9wb20ueG1sCmluZGV4IDc3MmEyYTMuLjVjZWU1MzQgMTAwNjQ0Ci0tLSBhL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9wb20ueG1sCisrKyBiL2hhZG9vcC1tYXByZWR1Y2UtcHJvamVjdC9wb20ueG1sCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPGV4Y2x1ZGVzPgogICAgICAgICAgICAgPGV4Y2x1ZGU+LmVjbGlwc2UudGVtcGxhdGVzLzwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPkNIQU5HRVMudHh0PC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+Q0hBTkdFUy4qdHh0PC9leGNsdWRlPgogICAgICAgICAgICAgPGV4Y2x1ZGU+bGliL2pkaWZmLyoqPC9leGNsdWRlPgogICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KQEAgLTIzNiw2ICsyMzYsMzQgQEAKICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5kaXN0PC9pZD4KKyAgICAgICAgICAgICAgICA8cGhhc2U+cHJlcGFyZS1wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDxlY2hvIGZpbGU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2Rpc3QtY29weW5hdGl2ZWxpYnMuc2giPgorICAgICAgICAgICAgICAgICAgICAgIExJQl9ESVI9IiR7bXIuYmFzZWRpcn0vaGFkb29wLW1hcHJlZHVjZS1jbGllbnQvaGFkb29wLW1hcHJlZHVjZS1jbGllbnQtbmF0aXZldGFzay90YXJnZXQvbmF0aXZlL3RhcmdldC91c3IvbG9jYWwvbGliIgorICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWQgJCR7TElCX0RJUn0gXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRBUkdFVF9ESVI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn0vbGliL25hdGl2ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1rZGlyIC1wICQke1RBUkdFVF9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgICBjcCAtUiAkJHtMSUJfRElSfS9saWIqICQke1RBUkdFVF9ESVJ9CisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgPC9lY2hvPgorICAgICAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJzaCIgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLi9kaXN0LWNvcHluYXRpdmVsaWJzLnNoIi8+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgICAgIDwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5Pgo=